基于ICMP发现活跃主机

一,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地址即可。

         代码部分:

        

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表示只测试改主机的状态

        代码如下:

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())

        执行结果如下: 

        

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值