Skip to content

Commit d36e0f9

Browse files
committed
update
1 parent 502ac2f commit d36e0f9

File tree

1 file changed

+32
-21
lines changed

1 file changed

+32
-21
lines changed

device/block/tcp_reset/tcp_reset.py

Lines changed: 32 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import os
22
import sqlite3
33
from SecAutoBan import SecAutoBan
4-
from scapy.all import sniff, send
4+
from scapy.all import sniff, sendp, Ether
55
from scapy.layers.inet6 import IPv6
66
from scapy.layers.inet import TCP, IP
77
from multiprocessing.pool import ThreadPool
@@ -10,42 +10,52 @@
1010
def get_ip(p):
1111
src_ip = ""
1212
dst_ip = ""
13+
is_ipv4 = True
1314
if p.haslayer(IP):
1415
src_ip = p[IP].src
1516
dst_ip = p[IP].dst
1617
if p.haslayer(IPv6):
18+
is_ipv4 = False
1719
src_ip = p[IPv6].src
1820
dst_ip = p[IPv6].dst
19-
return src_ip, dst_ip
21+
return src_ip, dst_ip, is_ipv4
2022

2123

2224
def send_reset(iface):
2325
def f(p):
24-
src_ip, dst_ip = get_ip(p)
25-
src_port = p[TCP].sport
26-
dst_port = p[TCP].dport
27-
ack = p[TCP].ack
28-
try:
29-
if p.haslayer(IP):
30-
p = IP(src=dst_ip, dst=src_ip) / TCP(sport=dst_port, dport=src_port, flags="R", window=2052, seq=ack)
31-
send(p, verbose=0, iface=iface)
32-
return
33-
if p.haslayer(IPv6):
34-
p = IPv6(src=dst_ip, dst=src_ip) / TCP(sport=dst_port, dport=src_port, flags="R", window=2052, seq=ack)
35-
send(p, verbose=0, iface=iface)
36-
return
37-
except Exception as e:
38-
pass
26+
src_ip, dst_ip, is_ipv4 = get_ip(p)
27+
tcp = p[TCP]
28+
sec_auto_ban.print("Block IP: " + src_ip + ":" + str(tcp.sport) + " --> " + dst_ip + ":" + str(tcp.dport))
29+
seglen = len(tcp.payload)
30+
if tcp.flags & 0x01:
31+
seglen += 1
32+
if tcp.flags & 0x02:
33+
seglen += 1
34+
if tcp.flags & 0x10:
35+
seq = tcp.ack
36+
flags = "R"
37+
rst_l4_kwargs = {"seq": seq}
38+
else:
39+
ack = (tcp.seq + seglen) & 0xFFFFFFFF
40+
flags = "RA"
41+
rst_l4_kwargs = {"ack": ack}
42+
eth = p[Ether]
43+
if is_ipv4:
44+
ip_layer = IP(src=dst_ip, dst=src_ip)
45+
else:
46+
ip_layer = IPv6(src=dst_ip, dst=src_ip)
47+
tcp_layer = TCP(sport=tcp.dport, dport=tcp.sport, flags=flags, **rst_l4_kwargs)
48+
rst_pkt = Ether(src=eth.dst, dst=eth.src) / ip_layer / tcp_layer
49+
sendp(rst_pkt, iface=iface, verbose=0)
50+
return None
3951
return f
4052

4153

4254
def is_filter():
4355
def f(p):
44-
if not p.haslayer(TCP):
56+
if p[TCP].flags & 0x04:
4557
return False
46-
if "S" in p[TCP].flags:
47-
return
48-
src_ip, dst_ip = get_ip(p)
58+
src_ip, dst_ip , _ = get_ip(p)
4959
return src_ip in ban_ip_list or dst_ip in ban_ip_list
5060
return f
5161

@@ -99,6 +109,7 @@ def run_sniff():
99109
sniff(
100110
iface=sniff_iface,
101111
prn=send_reset(reset_iface),
112+
filter="tcp",
102113
lfilter=is_filter(),
103114
store=False
104115
)

0 commit comments

Comments
 (0)