诸神之眼:Nmap网络安全审计技术揭秘
上QQ阅读APP看书,第一时间看更新

2.4 基于ICMP协议的活跃主机发现技术

2.4.1 ICMP协议解析

ICMP协议也位于TCP/IP协议族中的网络层,它的目的是在IP主机、路由器之间传递控制消息。没有任何系统是完美的,互联网也一样。互联网也经常会出现各种错误,为了发现和处理这些错误,ICMP(Internet Control Message Protocol,互联网控制报文协议)应运而生。同样这种协议也可以用来实现活跃主机发现。有了之前ARP主机发现技术的经验之后,再来了解一下ICMP协议是如何进行活跃主机发现的。相比起ARP简单明了的工作模式,ICMP则要复杂很多,但ICMP同样是互联网中不可或缺的协议。表2-1中给出了ICMP报文的种类。

表2-1 ICMP报文的种类

从表2-1可以看出,ICMP的报文可以分成两类:差错和查询。查询报文是用一对请求和应答定义的。也就是说,主机A为了获得一些信息,可以向主机B发送ICMP数据包,主机B在收到这个数据包之后,会给出应答。这一点正好符合我们进行活跃主机扫描的要求。所以这里的ICMP活跃主机发现技术使用的就是查询报文。

ICMP中适合使用的查询报文包括如下3类。

1.响应请求和应答

用来测试发送与接收两端链路及目标主机TCP/IP协议是否正常,只要收到就是正常。我们日常使用最多的是ping命令,利用响应请求和应答,主机A向一个主机B发送一个ICMP报文,如果途中没有异常(例如被路由器丢弃、目标不回应ICMP或传输失败),则主机B返回ICMP报文,说明主机B处于活跃主机。

2.时间戳请求和应答

ICMP时间戳请求允许系统向另一个系统查询当前的时间。返回的建议值是自午夜开始计算的毫秒数,即协调世界时(Coordinated Universal Time, UTC)(早期的参考手册认为UTC是格林尼治时间)。如果想知道B主机是否在线,还可以向B主机发送一个ICMP时间戳请求,如果得到应答的话就可以视为B主机在线。当然,其实数据包内容并不重要,重要的是是否收到了回应。

3.地址掩码请求和应答

ICMP地址掩码请求由源主机发送,用于无盘系统在引导过程中获取自己的子网掩码。这里很多人可能会觉得我们的系统大多数时候都不是无盘系统,是不是这个技术就没有用了呢?

虽然RFC规定,除非系统是地址掩码的授权代理,否则它不能发送地址掩码应答(为了成为授权代理,它必须进行特殊配置,以发送这些应答)。但是,大多数主机在收到请求时都发送一个应答。如果想知道B主机是否在线,还可以向B主机发送一个ICMP掩码地址请求,如果得到应答的话就可以视为B主机在线。

在ICMP主机发现技术中,可以利用的就是上述3种查询报文。

2.4.2 使用ICMP协议进行主机发现

这里的ICMP协议可以使用3种类型的查询报文来进行主机发现的任务,下面分别进行介绍。

1.通过ICMP响应请求和应答进行主机发现

发送ICMP响应请求,如果得到目标主机发回的ICMP响应,则说明该主机处于活跃状态。这个查询报文可以通过最常使用的ping命令来发送。很多人都有过这样的经历,在检查网络中的某个设备是否在线的时候,经常会通过在命令行中输入ping <目标IP地址>的方式来查看目标是否在线。读到这里,有些人可能会有这样一个疑惑,既然有了这么高效的ping工具,为什么还要去研究这么多主机在线发现技术呢?

这主要是由于ping工具在过去被滥用了,因此很多用于防护主机的防火墙设备都隔绝ICMP数据包通过。这样就造成了明明可以和一台设备通信,但是ping的结果却始终显示为得不到响应。

使用Nmap的选项-PE就可以实现ICMP协议的主机发现。这个过程实质上和ping是一样的。

    命令语法:Nmap  -PE[目标]

执行如下命令。

    Nmap -sn -PE 60.2.22.35

执行的结果如下。

    Starting Nmap 7.12 ( https://Nmap.org ) at 2016-08-14 21:34
    Nmap scan report for 60.2.22.35
    Host is up (0.13s latency).
    Nmap done: 1 IP address (1 host up) scanned in 1.86 seconds

这个过程很简单,以发送和接收到的数据包来查看一下。这个过程是Nmap(192.168.0.4)向目标(60.2.22.35)发送了一个ICMP echo请求的数据包,注意结果中Type字段的值为8。

    Frame 35: 42 bytes on wire (336 bits), 42 bytes captured (336 bits) on interface 0
    Ethernet II, Src: 08:10:76:6a:ad:30 (08:10:76:6a:ad:30), Dst: D-LinkIn_b3:87:a9
    (d8:fe:e3:b3:87:a9)
    Internet Protocol Version 4, Src: 192.168.0.4, Dst: 60.2.22.35
    Internet Control Message Protocol
    Type: 8 (Echo (ping) request)
        Code: 0
        Checksum: 0x1da6 [correct]
        Identifier (BE): 55897 (0xda59)
        Identifier (LE): 23002 (0x59da)
        Sequence number (BE): 0 (0x0000)
        Sequence number (LE): 0 (0x0000)
        [RespoNSE frame: 36]

如果对方主机在线,而且没有防火墙隔离通信,将会收到目标主机发回的如下格式的ICMP echo响应数据包,注意其中的Type字段的值为0。

    Frame 36: 42 bytes on wire (336 bits), 42 bytes captured (336 bits) on interface 0
    Ethernet II, Src: D-LinkIn_b3:87:a9 (d8:fe:e3:b3:87:a9), Dst: 08:10:76:6a:ad:30
      (08:10:76:6a:ad:30)
    Internet Protocol Version 4, Src: 60.2.22.35, Dst: 192.168.0.4
    Internet Control Message Protocol
    Type: 0 (Echo (ping) reply)
        Code: 0
        Checksum: 0x25a6 [correct]
        Identifier (BE): 55897 (0xda59)
        Identifier (LE): 23002 (0x59da)
        Sequence number (BE): 0 (0x0000)
        Sequence number (LE): 0 (0x0000)
        [Request frame: 35]
        [RespoNSE time: 125.571 ms]

2.通过ICMP时间戳请求和应答进行主机发现

可惜的是,前面介绍的ping方式已经被很多网络所禁止,因此必须另觅它法。比如利用之前提到过的时间戳。

使用Nmap的选项-PP就可以实现ICMP协议的时间戳主机发现。

命令语法:Nmap -PP[目标]

执行如下命令。

    Nmap -sn -PP 60.2.22.35

执行的结果如下。

    Starting Nmap 7.12 ( https://Nmap.org ) at 2016-08-14 22:15
    Nmap scan report for 60.2.22.35
    Host is up (0.13s latency).
    Nmap done: 1 IP address (1 host up) scanned in 2.09 seconds

此时发送的数据包与之前的基本相似,只是Type字段的值换成了13(时间戳请求)。

    Frame 255: 54 bytes on wire (432 bits), 54 bytes captured (432 bits) on interface 0
    Ethernet II, Src: 08:10:76:6a:ad:30 (08:10:76:6a:ad:30), Dst: D-LinkIn_b3:87:a9
    (d8:fe:e3:b3:87:a9)
    Internet Protocol Version 4, Src: 192.168.0.4, Dst: 60.2.22.35
    Internet Control Message Protocol
      Type: 13 (Timestamp request)
        Code: 0
        Checksum: 0x554c [correct]
        Identifier (BE): 40371 (0x9db3)
        Identifier (LE): 45981 (0xb39d)
        Sequence number (BE): 0 (0x0000)
        Sequence number (LE): 0 (0x0000)
    Originate timestamp: 0 (0 seconds after midnight UTC)
    Receive timestamp: 0 (0 seconds after midnight UTC)
      Transmit timestamp: 0 (0 seconds after midnight UTC)

目标主机在获得这个数据包之后,会给出一个Type字段值为14的响应数据包。

    Frame 258: 54 bytes on wire (432 bits), 54 bytes captured (432 bits) on interface 0
    Ethernet II, Src: D-LinkIn_b3:87:a9 (d8:fe:e3:b3:87:a9), Dst: 08:10:76:6a:ad:30
      (08:10:76:6a:ad:30)
    Internet Protocol Version 4, Src: 60.2.22.35, Dst: 192.168.0.4
    Internet Control Message Protocol
    Type: 14 (Timestamp reply)
        Code: 0
        Checksum: 0x9344 [correct]
        Identifier (BE): 40371 (0x9db3)
        Identifier (LE): 45981 (0xb39d)
        Sequence number (BE): 0 (0x0000)
        Sequence number (LE): 0 (0x0000)
    Originate timestamp: 0 (0 seconds after midnight UTC)
    Receive timestamp: 79748035 (22 hours, 9 minutes, 8.035 seconds after midnight UTC)
    Transmit timestamp: 79748035 (22 hours, 9 minutes, 8.035 seconds after midnight UTC)

利用这种方式就可以检测出目标设备是否为活跃主机。

3.通过ICMP地址掩码请求和应答进行主机发现

使用Nmap的选项-PM可以实现ICMP协议的地址掩码主机发现。

    命令语法:Nmap  -PM[目标]

执行如下命令。

    nmap -PM 211.81.200.8

此时发送的数据包与之前的基本相似,只是Type字段的值换成了17(地址掩码请求)。

    Frame 4: 46 bytes on wire (368 bits), 46 bytes captured (368 bits) on interface 0
    Ethernet II, Src: 08:10:76:6a:ad:30 (08:10:76:6a:ad:30), Dst: D-LinkIn_b3:87:a9
    (d8:fe:e3:b3:87:a9)
    Internet Protocol Version 4, Src: 192.168.0.4, Dst: 60.2.22.35
    Internet Control Message Protocol
      Type: 17 (Address mask request)
        Code: 0
        Checksum: 0x9f10 [correct]
        Identifier (BE): 20463 (0x4fef)
        Identifier (LE): 61263 (0xef4f)
        Sequence number (BE): 0 (0x0000)
        Sequence number (LE): 0 (0x0000)
        Address Mask: 0.0.0.0

虽然这个协议主要使用在无盘系统中,但是也有一些系统在收到这个请求后会发送一个应答。需要注意的是,这种方法在实际中很少使用。

ICMP协议中包含了很多种方法,但是这些基于ICMP协议的扫描方式往往也是安全机制防御的重点,因此经常得不到准确的结果。