转载:http://www.kaotop.com/it/320216.html
一,ICMP协议简介
ICMP位于TCP/IP协议簇中的网络层,它的目的是用在ip主机,路由器之间传递控制消息的。简单的来说就是检查网络通路。
ICMP中提供了多种报文,这些报文可以分成两个大类:查询报文和差错报文。其中查询报文是有一个请求和一个应答构成的。只需向目标主机发送一个请求数据包,根据目标主机是否产生回应即可判断目标主机是否存活。
其中ARP的查询报文有四种,分别是响应请求与应答,时间戳请求与应答,地址掩码请求与应答,路由器询问与应答,后三种在实际应用中成功率较低,所以主要来考虑使用第一种来实现程序功能。也是计算机中自带ping命令所实现的功能。
ICMP请求数据包格式:
ip层内容
源IP地址:192.168.1.2
目的IP地址:192.168.1.3
ICMP层内容
Type:8 (表示请求)
ICMP响应数据包格式:
ip层内容
源IP地址:192.168.1.3
目的IP地址:192.168.1.2
ICMP层内容
Type:0 (表示应答)
二,程序执行流程
第一步:给目标主机发送一个ICMP请求
第二步:是否收到目标主机应答
三,程序编写
使用scapy库来完成ICMP请求,首先先看看ICMP的数据包内容
其中的参数都会默认进行填写,而type = 8 代表请求数据包。由于ICMP包中没有ip地址参数,而我们扫描中则需要指定目标ip地址,所以还要用到IP数据包。
IP数据包内容:
其中dst是目标ip地址,src是源ip地址,src和其他参数一样会由程序自行填补,这里只需要知名目标ip地址即可。
代码部分:
12345678 | from scapy.all import sr,IP,ICMP target = "192.168.5.2" ans,unans = sr((IP(dst=target)/ICMP()),timeout = 2) for snd,rcv in ans: print (rcv.sprintf( "%IP.src%is alive" )) |
执行结果如下:
也可以使用nmap模块来完成程序
nmap命令格式如下:
nmap -PE -sn [目标IP],-PE表示使用ICMP协议,-sn表示只测试改主机的状态
代码如下:
123456789101112 | import nmap target = "192.168.5.2" nm = nmap.PortScanner() nm.scan(target,arguments= '-PE -sn' ) for host in nm.all_hosts(): print ( '-' *15) print ( 'Host:%s(%s)' % (host,nm[host].hostname())) print ( 'State: %s' % nm[host].state()) |
执行结果如下: