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

2.3 基于ARP协议的活跃主机发现技术

2.3.1 ARP协议解析

ARP协议位于TCP/IP协议族中的网络层,这个协议的目的主要是解决逻辑地址和物理地址的转换关系。网络上的通信要使用到两个地址:物理地址和逻辑地址。同一网段中的通信一般使用物理地址,不同网段之间的通信一般使用逻辑地址。这一点可能你已经知道了,但是为什么要这样做呢?只有一个地址不是会更简单一些吗?

还是先来看现实生活中的一个例子。一个小男孩想送给远在另一个城市的好朋友一份礼物,那么他所需要做的就是将礼物包装好,将好朋友家的地址写在包装袋上,然后将包装袋交给快递,接下来快递公司就会将这份礼物送到好朋友的家中。

如果这个小男孩还想送给住在一起的妈妈一份礼物呢?他怎么做,还要交给快递员吗?显然这样太麻烦了,他只需要拿着这份礼物,走进妈妈的房间,然后将礼物放下就行了。

可以将这里面的小男孩和他的好朋友理解为处在不同网段的两台主机,而小男孩和生活在一起的妈妈就像同一网段的两台主机。世界上所有的网络都可以按照这个方式进行分割,和你处在同一网段的主机是一部分,和你处在不同网段的主机是另一部分。

如果按照上面介绍的例子,那么是不是在设计软件的时候,就要同时考虑两种情况,在和不同网段通信的时候,使用逻辑地址,否则使用物理地址呢?结果显然并非如此,在设计各种应用的时候,仅仅使用了逻辑地址就可以完成所有的任务。那么处于同一网段的通信又是如何完成的呢?

在同一网段中,所有的主机都会连接到一个叫作交换机(曾经是集线器,现在已经很少用了)的设备上,交换机上有很多接口,每个接口与一个主机通过网线相连。交换机中有一个内容寻址寄存器,这个寄存器中存储了每个接口所连接的主机的物理地址表。它会使用这张表来确定应该向哪一个接口发送数据包。但是如果目标的物理地址是未知的话,这个地址就需要通过额外的通信进行解析了。

例如,一台逻辑地址为192.168.0.1的主机A想与逻辑地址为192.168.0.2的主机B进行通信,但是主机A又不知道主机B的物理地址,这时就需要一个可以将逻辑地址解析为物理地址的协议,这个协议名为地址解析协议(ARP),它在RFC826中进行了定义。

在上面例子的情景中,按照ARP的规定,主机A就会发出一个ARP请求,内容大概就是“注意了,我的逻辑地址是192.168.0.1,我的物理地址是22:22:22:22:22:22,逻辑地址为192.168.0.2的主机在吗?我需要和你进行通信,请告诉我你的物理地址,收到请回答!”,这个数据包是以广播的形式发送给网段中所有设备的,不过只有主机B会给出回应,他的回应包大概就是“嗨,我就是那个逻辑地址为192.168.0.2的主机,我的物理地址是33:33:33:33:33:33”。主机A在收到这个数据包之后,就知道了主机B的物理地址。完成这个过程后,主机A和主机B就可以开始通信了。

好了,你有没有发现ARP和我们之前虚拟的TEST协议有什么相同之处呢?按照ARP规定,当主机B收到来自主机A的ARP请求的时候,主机B就应当向主机A发回一个回应。那么好了,实际上我们的第一个活跃主机发现技术已经产生了。

基于ARP协议的活跃主机发现技术的原理是:如果想要知道处在同一网段的IP地址为*.*.*.*的主机是否为活跃主机,只需要构造一个ARP请求数据包,并广播出去,如果得到了回应,则说明该主机为活跃主机。

这种发现技术的优点在于准确度高,任何处于同一网段的设备都没有办法防御这种技术,因为如果不遵守ARP,那么将意味着无法通信。缺点在于这种发现技术不能对处于不同网段的目标主机进行扫描。好的,接下来看看Nmap是如何利用这种技术实现活跃主机发现的。

2.3.2 在Nmap中使用ARP协议进行主机发现

当目标主机与我们处于同一网段的时候,使用ARP协议扫描技术就是最佳的选择。不仅速度最快,扫描结果也是最为精准的。这是因为没有任何安全措施会阻止正常的ARP请求。

使用Nmap的选项-PR就可以实现ARP协议的主机发现。

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

例如对192.168.1.1利用ARP协议进行一次扫描,执行如下的代码。

    Nmap  -sn  -PR 192.168.1.1

得到的结果如下。

    Starting Nmap 7.12 ( https://Nmap.org ) at 2016-08-13 11:29
    Nmap scan report for 192.168.0.1
    Host is up (0.0030s latency).                                                   ①
    MAC Address: D8:FE:E3:B3:87:A9 (D-Link International).                          ②
    Nmap done: 1 IP address (1 host up) scanned in 1.82 seconds

上例中对IP地址为192.168.1.1的设备是否为活跃主机进行了检测,从结果中可以看到,①中的“Host is up”这说明设备为活跃主机,而②中给出了192.168.1.1设备的物理地址(D8:FE:E3:B3:87:A9)。

这种技术的工作原理其实非常简单,只需要两个步骤。

步骤1:将一个内容为“who-has 192.168.0.1 tell 192.168.0.4”的ARP请求(详细内容如下)发送给目标。

    Frame 3221: 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: Broadcast
    (ff:ff:ff:ff:ff:ff)
        Destination: Broadcast (ff:ff:ff:ff:ff:ff)
        Source: 08:10:76:6a:ad:30 (08:10:76:6a:ad:30)
      Type: ARP (0x0806)                                                             ①
    Address Resolution Protocol (request)
        Hardware type: Ethernet (1)
        Protocol type: IPv4 (0x0800)
        Hardware size: 6
        Protocol size: 4
      Opcode: request (1)                                                            ②
        Sender MAC address: 08:10:76:6a:ad:30 (08:10:76:6a:ad:30)
        Sender IP address: 192.168.0.4
        Target MAC address: 00:00:00_00:00:00 (00:00:00:00:00:00)
        Target IP address: 192.168.0.1

上面给出了这个ARP请求数据包的完整格式。通过以太网帧头(Ethernet II)的Destination字段可以看出,这是一个广播数据包,这个数据包的源地址Source字段为08:10:76:6a:ad:30。目的地址Destination为ff:ff:ff:ff:ff:ff,这是一个广播地址,整个网段中的全部主机都会接收到这个ARP请求数据包。

在Address Resolution Protocol部分,①中的“Type: ARP (0x0806)”表示这是一个ARP数据包,②中的“Opcode: request (1)”表示这是一个请求类型的数据包。这个包头中列出了扫描方的逻辑地址“Sender IP address: 192.168.0.4”和物理地址“Sender MAC address: 08:10:76:6a:ad:30”,以及被扫描方的逻辑地址192.168.0.1,但是此时被扫描方的MAC地址还是未知的,所以这里的目的地址字段为“Target MAC address:00:00:00_00:00:00”。

步骤2:如果目标主机给出了一个相应的ARP回应“ARP reply 192.168.0.1 is-at D8:FE:E3:B3:87:A9”(详细内容如下)的话,那么说明它是活跃主机。

    Frame 3222: 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)
        Destination: 08:10:76:6a:ad:30 (08:10:76:6a:ad:30)
        Source: D-LinkIn_b3:87:a9 (d8:fe:e3:b3:87:a9)
    Type: ARP (0x0806)                                                              ①
    Address Resolution Protocol (reply)
        Hardware type: Ethernet (1)
        Protocol type: IPv4 (0x0800)
        Hardware size: 6
        Protocol size: 4
    Opcode: reply (2)                                                               ②
        Sender MAC address: D-LinkIn_b3:87:a9 (d8:fe:e3:b3:87:a9)
        Sender IP address: 192.168.0.1
        Target MAC address: 08:10:76:6a:ad:30 (08:10:76:6a:ad:30)
        Target IP address: 192.168.0.4

在这个ARP响应数据包中,以太网帧头(Ethernet II)的Destination部分的值就是之前ARP请求数据包中的Source地址。这两个数据包的格式是一样的。

在Address Resolution Protocol部分,①中的“Type: ARP (0x0806)”表示这是一个ARP数据包,②中的Opcode字段的值为reply (2),可以看到这是一个ARP响应包,原来ARP请求包中的发送方的物理地址和逻辑地址现在变成了这个ARP响应包中目的的物理地址和逻辑地址,也就是说ARP请求包和ARP响应包中的地址信息是颠倒的。

如果在发出了ARP请求数据包之后,却迟迟得不到ARP响应数据包的话,就可以认为该IP地址所在的设备不是活跃主机。