|
1 | 1 | import os |
2 | 2 | import sqlite3 |
3 | 3 | from SecAutoBan import SecAutoBan |
4 | | -from scapy.all import sniff, send |
| 4 | +from scapy.all import sniff, sendp, Ether |
5 | 5 | from scapy.layers.inet6 import IPv6 |
6 | 6 | from scapy.layers.inet import TCP, IP |
7 | 7 | from multiprocessing.pool import ThreadPool |
|
10 | 10 | def get_ip(p): |
11 | 11 | src_ip = "" |
12 | 12 | dst_ip = "" |
| 13 | + is_ipv4 = True |
13 | 14 | if p.haslayer(IP): |
14 | 15 | src_ip = p[IP].src |
15 | 16 | dst_ip = p[IP].dst |
16 | 17 | if p.haslayer(IPv6): |
| 18 | + is_ipv4 = False |
17 | 19 | src_ip = p[IPv6].src |
18 | 20 | dst_ip = p[IPv6].dst |
19 | | - return src_ip, dst_ip |
| 21 | + return src_ip, dst_ip, is_ipv4 |
20 | 22 |
|
21 | 23 |
|
22 | 24 | def send_reset(iface): |
23 | 25 | 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 |
39 | 51 | return f |
40 | 52 |
|
41 | 53 |
|
42 | 54 | def is_filter(): |
43 | 55 | def f(p): |
44 | | - if not p.haslayer(TCP): |
| 56 | + if p[TCP].flags & 0x04: |
45 | 57 | 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) |
49 | 59 | return src_ip in ban_ip_list or dst_ip in ban_ip_list |
50 | 60 | return f |
51 | 61 |
|
@@ -99,6 +109,7 @@ def run_sniff(): |
99 | 109 | sniff( |
100 | 110 | iface=sniff_iface, |
101 | 111 | prn=send_reset(reset_iface), |
| 112 | + filter="tcp", |
102 | 113 | lfilter=is_filter(), |
103 | 114 | store=False |
104 | 115 | ) |
|
0 commit comments