在本地存在漏洞的 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 回复(因 0 字节套接字接收触发缓冲区管理不当和 UDP 重试)
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 回复,空(因 0 字节套接字接收触发 TCP 重试)
TCP 回复,有效的头/问题部分(强制将下一个回复存储到栈分配的缓冲区中)
TCP 回复,大于 2048 字节(溢出栈分配的缓冲区)
示例:
user@localhost:/# curl http://attack5
*** stack smashing detected ***: curl terminated
Segmentation fault (core dumped)