使用Scapy框架进行PPPOE拨号密码截取

原创文章,转载请注明出处。

PPPoE 协议是什么

  • Point to Point Protocol over Ethernet (点对点协议)
  • 只要记住你平时拨号上网用的是这个协议就行啦(ADSL)

PPPoE 协议工作原理

  1. PPPoE发现阶段(Discovery)
    • 主机广播发起分组(PADI)
    • 有效发现提供包分组(PADO)
    • 有效发现请求分组(PADR)
    • 有效发现会话确认(PADS)
  2. PPPoE会话阶段(Session)
    • LCP协议请求确认配置(LCP-Config-Req)
    • LCP协议确认配置(LCP-Config-Ack)
    • PAP或CHAP验证账号密码
    • 开始进行网络传输

上面可以看到,如果我们在会话阶段的第3步动点手脚,就可以截取到拨号的账号密码

截取原理

  1. 由于PPPoE发现阶段(PADI)发送的是广播包(MAC地址为FFFFFF),我们的网络距离肯定是比ISP的PPPoE服务器近的,所以我们可以比ISP先收到PADI包
  2. 收到PADI包后我们可以伪装为一个正常的PPPoE服务器开始和客户端交互
  3. 伪装PADO,PADS,LCP-Config-Ack后。客户端就认为我们是一个有效的PPPoE服务器,开始进行PAP或CHAP验证
  4. 由于CHAP验证不是明文,所以我们要让客户端认证方式变为PAP(LCP-Config-Ack阶段申明只支持PAP)
  5. 等到PAP会话开始时,就可以正常收到拨号账号密码,我们只需要返回密码错误就可以啦

使用Python的Scapy实现

  • 安装Scapy pip install scapy
  • 安装scapy依赖包,Windows平台请戳我
  • 监听网络请求 scapy.sniff
  • 处理PPPoE包 (过滤type 为 0x88630x8863 的 数据包)

完整代码戳我

参考文献

原文地址:https://www.cnblogs.com/Karblue/p/5223240.html