原创文章,转载请注明出处。
PPPoE 协议是什么
- Point to Point Protocol over Ethernet (点对点协议)
- 只要记住你平时拨号上网用的是这个协议就行啦(ADSL)
PPPoE 协议工作原理
- PPPoE发现阶段(Discovery)
- 主机广播发起分组(PADI)
- 有效发现提供包分组(PADO)
- 有效发现请求分组(PADR)
- 有效发现会话确认(PADS)
- PPPoE会话阶段(Session)
- LCP协议请求确认配置(LCP-Config-Req)
- LCP协议确认配置(LCP-Config-Ack)
- PAP或CHAP验证账号密码
- 开始进行网络传输
上面可以看到,如果我们在会话阶段的第3步动点手脚,就可以截取到拨号的账号密码
截取原理
- 由于PPPoE发现阶段(PADI)发送的是广播包(MAC地址为FFFFFF),我们的网络距离肯定是比ISP的PPPoE服务器近的,所以我们可以比ISP先收到PADI包
- 收到PADI包后我们可以伪装为一个正常的PPPoE服务器开始和客户端交互
- 伪装PADO,PADS,LCP-Config-Ack后。客户端就认为我们是一个有效的PPPoE服务器,开始进行PAP或CHAP验证
- 由于CHAP验证不是明文,所以我们要让客户端认证方式变为PAP(LCP-Config-Ack阶段申明只支持PAP)
- 等到PAP会话开始时,就可以正常收到拨号账号密码,我们只需要返回密码错误就可以啦
使用Python的Scapy实现
- 安装Scapy
pip install scapy
- 安装scapy依赖包,Windows平台请戳我
- 监听网络请求
scapy.sniff
- 处理PPPoE包 (过滤type 为
0x8863
和0x8863
的 数据包)