2.10 主机发现技术的分析
“临河而羡鱼,不如归家织网。”在我们惊叹Nmap的强大功能之时,不如动手研究它的内在机制。也许你就是下一个风靡世界的网络软件的开发者。
Nmap中提供了--packet-trace选项,通过它就可以观察Nmap发出了哪些数据包,收到了哪些数据包,有了这个研究方法,可以更深入地理解Nmap的运行原理。
使用SCTP的-PY选项对目标主机60.2.22.35和192.168.0.1进行扫描。
首先扫描60.2.22.35。
Nmap -sn -PY 60.2.22.35
扫描的结果如下。
Starting Nmap 7.12 ( https://Nmap.org ) at 2016-09-17 12:51
Note: Host seems down. If it is really up, but blocking our ping probes, try -Pn Nmap done: 1 IP address (0 hosts up) scanned in 3.77 seconds
这个结果显示60.2.22.35的主机并非活跃主机,但是通过之前的扫描可以知道这台主机其实处于活跃状态,得到这样的结果是因为目标主机并不支持SCTP协议。接下来使用同样的选项来扫描192.168.0.1。
Nmap -sn -PY 192.168.0.1
扫描的结果如下。
Starting Nmap 7.12 ( https://Nmap.org ) at 2016-09-17 12:52 Nmap scan report for 192.168.0.1 Host is up (0.0040s latency). MAC Address: D8:FE:E3:B3:87:A9 (D-Link International) Nmap done: 1 IP address (1 host up) scanned in 1.77 seconds
扫描的结果是该主机为活跃状态,但是奇怪的是这台主机也没有安装SCTP协议,但是结果却和上面的完全不同。这里使用--packet-trace选项来追踪Nmap发送的数据包。
Starting Nmap 7.12 ( https://Nmap.org ) at 2016-09-17 13:01 SENT (0.4940s) SCTP 192.168.0.5:40896 > 60.2.22.35:80 ttl=51 id=6676 iplen=52 SENT (1.4970s) SCTP 192.168.0.5:40897 > 60.2.22.35:80 ttl=50 id=26673 iplen=52 Note: Host seems down. If it is really up, but blocking our ping probes, try -Pn Nmap done: 1 IP address (0 hosts up) scanned in 3.71 seconds
从这里可以看到,在对60.2.22.35进行扫描时,Nmap发送了SCTP数据包,但是没有收到目标的应答包,因此Nmap判断目标主机状态为down,即非活跃主机。
Starting Nmap 7.12 ( https://Nmap.org ) at 2016-09-17 12:58 SENT (0.4930s) ARP who-has 192.168.0.1 tell 192.168.0.5 RCVD (0.4930s) ARP reply 192.168.0.1 is-at D8:FE:E3:B3:87:A9 Nmap scan report for 192.168.0.1 Host is up (0.00s latency). MAC Address: D8:FE:E3:B3:87:A9 (D-Link International) Nmap done: 1 IP address (1 host up) scanned in 1.72 seconds
在对192.168.0.1扫描时,虽然也使用了-PY选项,但是根本没有发送SCTP数据包,而是使用了ARP格式的请求。
这其实是由于Nmap的设计思路,Nmap会首先判断目标主机与Nmap所在主机是否在同一网段,如果相同的话,则直接使用ARP扫描模式。
Starting Nmap 7.12 ( https://Nmap.org ) at 2016-09-17 13:18 SENT (0.5060s) ICMP [192.168.0.5 > 60.2.22.35 Echo request (type=8/code=0) id=4058 seq=0] IP [ttl=53 id=43312 iplen=28 ] SENT (0.5160s) TCP 192.168.0.5:38315 > 60.2.22.35:443 S ttl=49 id=52394 iplen=44 seq=586499036 win=1024 <mss 1460> SENT (0.5160s) TCP 192.168.0.5:38315 > 60.2.22.35:80 A ttl=40 id=40789 iplen=40 seq=0 win=1024 SENT (0.5160s) ICMP [192.168.0.5 > 60.2.22.35 Timestamp request (type=13/
code=0) id=42851 seq=0 orig=0 recv=0 trans=0] IP [ttl=57 id=42214 iplen=40 ] RCVD (0.5260s) ICMP [60.2.22.35 > 192.168.0.5 Echo reply (type=0/code=0) id=4058 seq=0] IP [ttl=52 id=63979 iplen=28 ] 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.75 seconds
通过上面结果可以很清楚地看到,在没有任何指定的情况下Nmap会向目标发送两个ICMP数据包,分别为Echo request和Timestamp request,这两个ICMP数据包的目标端口分别为443、80。
这里面使用--packet-trace分析了两个问题。
▯ Nmap在进行主机发现的时候,无论你指定了何种方式,Nmap都会先判断一下目标主机与自己是否在同一子网中,如果在同一子网中,Nmap直接使用ARP协议扫描的方式,而不会使用你所指定的方式。
▯ 当不指定扫描方式的时候,Nmap其实发送了4个数据包。