如何采用FPGA实现PPPoE的第一种攻击,也就是获取对方账号密码的攻击。本文针对FPGA实现的第一种攻击进行详细的介绍。FPGA实现方式具有非常好的硬件加速性能,窃取账号密码的成功率也会更高。因为,较之前Python实现方式而言,在收到网络上某台计算机发送的PADI广播包后,FPGA实现的伪装的服务器具有相当大的概率会抢在真正的服务器之前向该计算机发送欺骗帧(让对方将自己的账号密码以明文的形式反馈回来)。本文的目的一方面提醒网络安全的重要性,另一方面让大家意识到硬件加速力的重要性。试想,如果采用FPGA发起上文中提到的第三种DDOS攻击,估计瞬间就会造成整个网络的瘫痪。提升网络安全意识,从一点一滴做起。
一开始,我们先回顾一下之前使用Python实现的软件攻击的过程。
Python实现的软件攻击回顾
对于PPPOE认证上网的过程如下图所示,分为发现阶段和会话阶段,发现阶段分为PADI,PADO,PADR,PADS。
其中窃取账号密码的问题就出现在第一步PADI。PPPOE客户端进行连接时,在PADI阶段会发送一个广播包,寻找局域网中的PPPOE服务器,从而完成认证。
这时候我们需要做的是伪装成PPPOE服务器,回复请求信息,抢先和客户端通信,并强制客户端使用明文传输方式,从而获取账号和密码。下面我们通过wireshark抓一下数据包,更加直观的观察一下寻找PPPOE服务器的过程。点击宽带连接,使用Wireshark监听,会发现广播包,这时候pppoe服务器会进行回复。
攻击场景:在本机电脑上开启PPPOE欺骗程序,开始进行监听,并在局域网中的其他电脑上进行宽带连接,观察欺骗效果。如下图所示,已经成功欺骗出了账号和密码。
窃取账号的部分代码内容如下:
FPGA实现攻击必须完成的任务
PPPOE的认证过程分两个阶段
发现阶段:客户机寻找并确定可用的服务器,得到会话ID
会话阶段:在发现阶段所确定的参数基础上,依次完成链路控制协商、认证和NCP协商
由于会话阶段的认证步骤中进行用户密码传输,故FPGA伪装至少完成:
1.发现阶段
2.会话阶段的链路控制协商
发现阶段帧结构
发现阶段伪装要做到两点,一是识别并记录客户机的PADI、PADR帧信息;二是发送对应的PADO、PADS帧
发现阶段:PADI帧的识别与PADO帧的发送
PADI帧识别特征
•帧类型域:0x8863(发现阶段)
•PPPOE帧代码域:0x09(PADI帧)
PADO帧发送
•目的MAC地址:客户机地址(PADI帧中源MAC地址)
•帧类型域:0x8863(发现阶段)
•PPPOE帧代码域:0x07(PADO帧)
•静载荷域:在收到的PADI帧的净载荷后加上AC-NAME
发现阶段:PADR帧的识别与PADS帧的发送
PADR帧识别特征
•帧类型域:0x8863(发现阶段)
•PPPOE帧代码域:0x19(PADR帧)
PADS帧发送
•目的MAC地址:客户机地址(PADR帧中源MAC地址)
•帧类型域:0x8863(发现阶段)
•PPPOE帧代码域:0x65(PADS帧)
•会话ID:可统一设为不为0的固定值
•净载荷域:与收到PADR帧的净载荷相同
会话阶段帧结构
会话阶段要做到:
1.发送认证协议参数为0xc023(PAP协议)的Config-Request报文
2.识别客户机发送的Config-Request报文并回应Config-Ack报文
会话阶段:Request帧的发送
LCP Configuration Request帧
•目的MAC地址:客户机地址(PADR帧中源MAC地址)
•帧类型域:0x8864(会话阶段)
•PPPOE帧代码域:0x00(会话数据)
•会话ID:可统一设为不为0的固定值
•点对点协议:0xc021(LCP协议)
•PPP LCP帧代码域:0x01(Request帧)
•认证协议:0xc023(PAP协议)
会话阶段:Ack帧的发送
LCP Configuration Ack帧
•目的MAC地址:客户机地址(Request帧中源MAC地址)
•帧类型域:0x8864(会话阶段)
•PPPOE帧代码域:0x00(会话数据)
•会话ID:可统一设为不为0的固定值
•点对点协议:0xc021(LCP协议)
•PPP LCP帧代码域:0x02(Ack帧)
•其余数据均与接收的Request帧保持一致即可
FPGA实现
1、u_pppoeattack_v1模块
•解析识别0口接收到的PPPOED、PPP帧
•记录特定帧的帧信息(源MAC地址、控制信息用寄存器保存,载荷用FIFO保存)
•根据接收的帧类型确定回复帧类型
•根据记录的信息和回复帧类型向0口发送对应帧
(1)解析识别0口接收到的PPPOED、PPP帧
首先获取接收帧不同结构位置下的数据
(2)解析识别0口接收到的PPPOED、PPP帧
其次要根据获取数据判断接收帧类型,并在回复帧之前确定好回复帧类型
(3)解析识别0口接收到的PPPOED、PPP帧
记录特定帧的帧信息
载荷用FIFO保存
2、u_pppoeattack_authen_forward模块
•解析识别0口接收到的PPP_PAP帧、1口接收到的以太网帧
•记录1口以太网帧的帧信息(源MAC地址用寄存器保存)
•记录PPP_PAP帧的帧信息(载荷域的账号密码用FIFO保存)
•接收到PAP帧后向1口发送包含账号密码的自定义帧
(1)解析识别0口接收到的PPP_PAP帧、1口接收到的以太网帧与u_pppoeattack_v1模块操作相同
效果