19
19
# 会话 id,可自定义
20
20
SESSION_ID = 0x0005
21
21
22
+ # LCP Options Type
23
+ TYPE_MAX_RECEIVE_UNIT = 0x01
24
+ TYPE_MAGIC_NUM = 0x05
25
+
22
26
23
27
# 获取一个随机的 mac 地址
24
28
def get_mac_address ():
@@ -48,7 +52,6 @@ class PPPoEServer(object):
48
52
49
53
def __init__ (self ):
50
54
self .ipaddr_bytes = get_host_ip_bytes ()
51
- self .clientMap = {}
52
55
self .magic_num = b'\x25 \x5f \xc5 \xcb '
53
56
self .username = None
54
57
self .password = None
@@ -74,7 +77,7 @@ def filterData(self, pkt):
74
77
0x8864 :{
75
78
"proto" :{
76
79
# LCP 链路处理
77
- 0xc021 : self .send_lcp ,
80
+ 0xc021 : self .handle_lcp ,
78
81
# PAP 协议处理
79
82
0xc023 : self .handle_pap ,
80
83
# IPCP 协议处理
@@ -91,48 +94,37 @@ def filterData(self, pkt):
91
94
handle_func (pkt )
92
95
93
96
#处理 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 ):
100
98
# 处理 LCP-Configuration-Req 请求
101
99
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 包" )
107
104
self .send_lcp_reject_packet (pkt )
108
- print ("发送LCP -Config-Req包 " )
105
+ print ("发送 LCP -Config-Req 包 " )
109
106
self .send_lcp_req_packet (pkt )
110
- # 后面的 LCP-Configuration-Req 请求均返回 Ack 响应包
111
107
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 包" )
115
109
self .send_lcp_ack_packet (pkt )
116
-
117
110
# 处理 LCP-Configuration-Rej 请求
118
111
elif bytes (pkt .payload )[8 ] == 0x04 :
119
- print ("处理Rej请求,发送LCP-Config-Req包" )
112
+ print ("收到 LCP-Config-Rej" )
113
+ print ("发送 LCP-Config-Req 包" )
120
114
self .send_lcp_req_packet (pkt )
121
-
122
115
# 处理 LCP-Configuration-Ack 请求
123
116
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" )
126
118
else :
127
119
pass
128
120
129
121
# IPCP 协议处理
130
122
def handle_ipcp (self , pkt ):
131
123
payload = bytes (pkt .payload )
132
- # req 请求处理
124
+ # 处理 IPCP-Configuration-Req 请求
133
125
if payload [8 ] == 0x01 :
134
126
# 当 Req 请求的 options 有 ip dns 之外的字段,发送 rej
135
- if len (payload [ 12 :]) != 18 :
127
+ if len (pkt . payload . options ) > 3 :
136
128
self .send_ipcp_rej_packet (pkt )
137
129
# 当 Req 请求的 ip 以 0 开头时(0.0.0.0),发送 nak 开始分配 ip
138
130
elif payload [14 ] == 0x00 :
@@ -151,26 +143,6 @@ def send_ipcp_rej_packet(self, pkt):
151
143
_payload = struct .pack ('!BBH' , code , identifier , length ) + options
152
144
_pkt = Ether (src = pkt .dst , dst = pkt .src , type = 0x8864 ) / PPPoED (version = 1 , type = 1 , code = 0x00 , sessionid = SESSION_ID ) / PPP (proto = 0x8021 ) / _payload
153
145
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 )
174
146
175
147
# 发送 IPCP-Configuration-Nak 准备分配 ip
176
148
def send_ipcp_nak_packet (self , pkt ):
@@ -205,11 +177,11 @@ def handle_pap(self, pkt):
205
177
self .username = _userName .decode ('utf-8' )
206
178
self .password = _passWord .decode ('utf-8' )
207
179
print ("账户: %s\n 密码: %s" % (self .username , self .password ))
180
+ # 拒绝认证
208
181
#self.send_pap_authreject(pkt)
209
182
#self.send_lcp_end_packet(pkt)
183
+ # 通过认证
210
184
self .send_pap_authack (pkt )
211
- if pkt .src in self .clientMap :
212
- del self .clientMap [pkt .src ]
213
185
214
186
print ("欺骗完毕...." )
215
187
@@ -246,11 +218,16 @@ def send_lcp_reject_packet(self, pkt):
246
218
_pkt = Ether (src = pkt .dst , dst = pkt .src , type = 0x8864 ) / PPPoED (version = 1 , type = 1 , code = 0x00 , sessionid = SESSION_ID ) / PPP (proto = 0xc021 ) / _payload
247
219
scapy .sendp (_pkt )
248
220
249
- #发送lcp -config-req回执包
221
+ #发送 lcp -config-req 请求
250
222
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
254
231
_pkt = Ether (src = pkt .dst , dst = pkt .src , type = 0x8864 ) / PPPoED (version = 1 , type = 1 , code = 0x00 , sessionid = SESSION_ID ) / PPP (proto = 0xc021 ) / _payload
255
232
scapy .sendp (_pkt )
256
233
0 commit comments