2.6 基于UDP协议的活跃主机发现技术
2.6.1 UDP协议解析
UDP协议也是一个位于传输层的协议。它完成的工作与TCP是相同的,但是由于UDP协议是非面向连接的,对UDP端口的探测也就不可能像TCP端口的探测那样依赖于连接建立过程(不能使用telnet这种TCP协议类型命令),这也使得UDP端口扫描的可靠性不高。因此,虽然UDP协议较之TCP协议显得简单,但是对UDP端口的扫描却是相当困难的。
当一个UDP端口收到一个UDP数据包时,如果它是关闭的,就会给源端发回一个ICMP端口不可达数据包;如果它是开放的,就会忽略这个数据包,也就是将它丢弃而不返回任何信息。
这样做的优点就是可以完成对UDP端口的探测,而缺点为扫描结果的可靠性比较低。因为当发出一个UDP数据包而没有收到任何的应答时,有可能因为这个UDP端口是开放的,也有可能是因为这个数据包在传输过程中丢失了。另外,扫描的速度很慢。原因是在RFC1812中对ICMP错误报文的生成速度做出了限制。例如Linux就将ICMP报文的生成速度限制为每4秒产生80个,当超出这个限制的时候,还要暂停1/4秒。
2.6.2 使用UDP协议进行主机发现
使用Nmap的选项-PU就可以实现UDP协议的主机发现。
命令语法:Nmap -PU[目标]
使用这种方式对60.2.22.35进行一次使用UDP协议的扫描行动。
Nmap -sn -PU 60.2.22.35
扫描的结果如下。
Starting Nmap 7.12 ( https://Nmap.org ) at 2016-09-16 12:45 Nmap scan report for 60.2.22.35 Host is up (0.020s latency). Nmap done: 1 IP address (1 host up) scanned in 1.83 seconds
在这种扫描方式中,Nmap向60.2.22.35发送了一个UDP类型的数据包,这个数据包的格式如下。
Frame 3105: 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 User Datagram Protocol, Src Port: 49497 (49497), Dst Port: 40125 (40125) ① Source Port: 49497 Destination Port: 40125 Length: 8 Checksum: 0x8ef5 [validation disabled] [Stream index: 32]
①表示发送的数据包使用的协议为UDP,目标端口为40125。在目标收到这个数据包之后,由于40125端口是关闭的,就会向Nmap所在主机发送一个ICMP端口不可达数据包。
Frame 3115: 70 bytes on wire (560 bits), 70 bytes captured (560 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: 3 (Destination unreachable) Code: 3 (Port unreachable) Checksum: 0x0fe8 [correct] Unused: 00000000 Internet Protocol Version 4, Src: 192.168.0.4, Dst: 60.2.22.35 User Datagram Protocol, Src Port: 49497 (49497), Dst Port: 40125 (40125) Source Port: 49497 Destination Port: 40125 Length: 8 Checksum: 0x8ef5 [validation disabled] [Stream index: 32]
Nmap收到这个数据包之后,就可以判断目标主机为活跃主机了。针对UDP的扫描成功,端口的选择也很重要,但是与TCP不同,TCP需要扫描目标主机开放的端口,而UDP需要扫描的是目标主机关闭的端口。在扫描的过程中,需要避开那些常用的UDP协议端口,例如DNS(端口53)、SNMP(161)。因此在扫描的时候,最合适的做法就是选择一个值比较大的端口,例如35462。