Lab Overview
Kaminsky DNS 攻击,是一种远程的 DNS 缓存污染攻击。
Lab Environment Setup (Task 1)
本次实验需要用到四台机器,一台用于 Victim,一台用于 DNS Server,两台用于 Attacker。
环境配置和 Local DNS Attack 是一模一样的,区别只是在于这次实验不能嗅探包了。
The Attack Tasks
正确的 DNS 查询过程是如下所示的:
How Kaminsky attack works
当 Apollo 等待来自 example.com 名称服务器的 DNS 答复时,攻击者可以假装答复来自 example.com 的名称服务器,向 Apollo 发送伪造的答复。如果伪造的回复先到达,Apollo 就会 接受它。攻击就会成功。
当攻击者和域名服务器缓存污染攻击不在同一个局域网上时,缓存中毒攻击就变得更加困难。困难的主要原因是 DNS 响应包中的事务 ID 必须与查询包中的事务 ID 相匹配。由 于查询中的事务 ID 通常是随机生成的,而不会看到查询数据包,因此攻击者很难知道正确的 ID。
然而,除非我们轻易的猜测出正确的 ID,否则,一旦正确的响应到达就会被 Apollo 缓存,攻击者就必须等待缓存超时,等待时间可以是几个小时,也可以是几天。
卡明斯基想出了一个优雅的技巧来对抗上述的缓存,从而可以使得攻击者能够持续的攻击域名上的 DNS 服务器。
- 攻击者在 example.com 中向 Apollo 查询一个不存在的域名,比如 fake.example.com。
- 由于在 Apollo 的 DNS 缓存中不存在,Apollo 将向 example.com 域的 name-server 发送一 个 DNS 查询。
- 在 Apollo 等待回复的同时,攻击者向 Apollo 发送大量伪造的 DNS 响应流,每个都尝试不同的事务 ID, 希望其中一个是正确的。在响应中,攻击者不仅为 fake.example. com 提供了一个 IP 解析,还包含一个 “Authoritative Nameservers” 记录,指示 ns.attacker32.com 作为 example.com 域的 nameserver。
- 即使这一次没有猜测出来,下一次攻击将查询不同的名称,如 fake2.example.com,Apollo 必须发送另一个查询,这给了攻击者另一个机会。
- 如果攻击成功,Apollo 的缓存中,example.com 的名称服务器将会被 ns.attacker32.com 取代。
Task 2: Construct DNS request
在这个任务中,我们要触发 DNS 服务器发送 DNS 查询,这样就有欺骗 DNS 应答。
from scapy.all import * |
如上代码,发送 DNS 请求,查询 fake1.example.com。可以看到,数据包被发送给了 DNS 服务器,服务器也向根 DNS 发起了查询。然后有一些乱七八糟的东西,大概就是递归查询的过程。
我们可以看到,最终查询到了最终的 DNS 服务器,得到了结果就是没有这个域名。
Task 3: Spoof DNS Replies
代码如下,其中源 IP 应该是 example.com 的名称服务器,经过查询可以知道是如下的两个 IP。
from scapy.all import * |
使用 Wireshark 捕获,可以发现,确实发送了一个响应包。不过这个响应包 id 肯定不对,我们只是用来进行测试,发包是没有问题的。
Task 4: Launch the Kaminsky Attack
现在我们可以把所有的东西放在一起进行卡明斯基袭击了。在攻击中,我们需要发送许多伪造的 DNS 回复,希望其中一个回复命中正确的交易号码,并比合法的回复更快到达。如果使用 Scapy,那么速度确实太慢了;如果使用 C 语言,那么构造伪造的 DNS 响应包太麻烦了。
我们使用混合方式,首先使用 Scapy 来生成一个 DNS 数据包模板,它存储在一个文件中。然后我们将这个模板加载到一个 C 程序中,对一些字段做一些小的修改,然后发送数据包 。
- 生成 DNS 请求数据包
from scapy.all import * |
- 生成 DNS 响应数据包(其中源 IP 地址是正确的名称服务器,即下面截图中的 a.iana-servers.net )
from scapy.all import * |
- 使用 C 语言,短时间构造大量的响应包。请求包我们需要修改域名前五个字符,响应包我们需要修改域名前五个字符和 ID。使用二进制查看器就可以知道这些字段在二进制文件中的偏移,如 vscode 插件 Hex editor。
|
执行过程中查看结果如下,执行一段时间后,攻击成功。
Task 5: Result Verification
结果验证,后续我们查询 www.example.com,将会向 ns.attacker32.com 询问。在 User 处验证如下,攻击成功,达到了目的。