现在某些路由器有从旧路由器自动学习宽带账户密码功能,
目前大部分宽带拨号使用的PPP认证类型还是基于明文的PAP验证,只要伪装成PPPoE服务器,完成握手过程,就能获得路由器上的宽带账户与密码。
PPPoE
PPPoE是在以太网中实现PPP的数据链路层协议,数据帧结构如图
- Len/Type字段标识PPPoE的连接阶段
- Ver字段恒为0x01
- Type字段恒为0x01
- Code字段表明帧的类型
- SessionID字段标识当前会话,由服务端在PADS阶段生成
- Length字段表明接下来Payload的长度
- Payload在发现阶段携带额外数据,比如服务器名;在PPP会话携带PPP内容
PPPoE发现阶段
PADI
当路由器上电后,路由器会以一定的间隔广播PADI包
code为0x09,Session ID为0x00
PADO
服务器接受到广播包后,获得路由器MAC地址,并向路由器发送PADO包
code为0x07,Session ID为0x00
PADR
路由器接受到来自服务器的PADO后,获得服务器MAC地址,并向服务器发送PADR包
code为0x19,Session ID为0x00
PADS
服务器收到PADR后,随机生成一个Session ID,放入PADS包发给路由器
code为0x65,Session ID为随机生成数字
到此PPPoE发现阶段结束
PPPoE会话阶段
LCP Configuration Request
告知对方最大接收单元(MRU),认证协议,一个标识连接的MagicNumber
LCP Configuration Ack
表示支持对方的认证协议,返回的Options应该与对方发过来的一致
PAP Authentication Protocol
Authentication-Request
此报文将会明文携带拨号账户与密码,在Peer-ID和Password字段中提取即可
结束会话
由于我们已经拿到账户密码,后续会话保持就不需要了
我们直接发送PAP Authentication-NAK告知对方密码错误~~(得了便宜还卖乖~~
然后发送LCP Termination Request结束LCP会话
##相关工具
我用Golang写了一个工具实现以上过程以获取账户密码,请合法使用:
https://github.com/ZHLHZHU/PPPoE_Account