3.4 Nmap中的各种端口扫描技术
Nmap中提供了大量的技术来实现对端口状态的检测,由于TCP技术相对UDP技术要复杂一些,所以TCP的检测手段也比UDP要多一些。第2章已经详细地介绍过TCP的工作方式,可以利用TCP的三次握手机制,产生多种扫描技术。例如最为典型的是SYN和Connect两种扫描方式。
3.4.1 SYN扫描
SYN扫描是最为流行的一种扫描方式,同时它也是Nmap所采用的默认扫描方式。这种扫描方式速度极快,可以在一秒钟扫描上千个端口,SYN扫描也不容易被网络中的安全设备所发现。
你也可以在扫描的时候输入参数-sS选项。其实只要你是以root或者administrator权限工作的,扫描的形式都是SYN的。首先Nmap会向目标主机的一个端口发送请求连接的SYN数据包,而目标计算机在接收到这个SYN数据包之后会以SYN/ACK进行应答,Nmap在收到SYN/ACK后会发送RST包请求断开连接而不是ACK应答。这样,三次握手就没有完成,无法建立正常的TCP连接,因此,这次扫描就不会被记录到系统日志中。这种扫描技术一般不会在目标主机上留下扫描痕迹。
在对一个端口进行TCP SYN扫描时,结果将会是表3-2中open、closed和filtered三者之一。
表3-2 对目标进行SYN扫描时目标主机的应答与对应端口的状态
使用SYN扫描端口语法如下。
nmap -sS [target]
例如对目标192.168.153.131扫描,命令如下。
nmap -sS 192.168.153.131
扫描的结果如下。
Starting Nmap 7.30 ( https://nmap.org ) at 2016-11-21 14:43 ? D1ú±ê×? ê±? ? Nmap scan report for bogon (192.168.153.131) Host is up (0.000030s latency). Not shown: 996 closed ports PORT STATE SERVICE 21/tcp open ftp 25/tcp open smtp 139/tcp open netbios-ssn 445/tcp open microsoft-dsMAC Address: 00:0C:29:90:DF:C3 (VMware) Nmap done: 1 IP address (1 host up) scanned in 3.08 seconds
3.4.2 Connect扫描
使用Connect扫描端口的语法如下。
nmap -sT [target]
这种扫描方式其实和SYN扫描很像,只是这种扫描方式完成了TCP的三次握手。这种扫描方式无须root或者administrator权限。
例如对目标192.168.153.131扫描,命令如下。
nmap -sT 192.168.153.131
扫描的结果如下。
Starting Nmap 7.30 ( https://nmap.org ) at 2016-11-21 14:51 Nmap scan report for bogon (192.168.153.131) Host is up (1.00s latency). Not shown: 996 closed ports PORT STATE SERVICE 21/tcp open ftp 25/tcp open smtp 53/tcp open domain 445/tcp open microsoft-ds MAC Address: 00:0C:29:90:DF:C3 (VMware) Nmap done: 1 IP address (1 host up) scanned in 225.37 seconds
3.4.3 UDP扫描
在使用UDP扫描(使用-sU选项)对一个端口进行UDP扫描时,结果是表3-3所示的open、closed和filtered三者之一。
表3-3 对目标进行UDP扫描时目标的应答与对应端口的状态
要注意UDP扫描的速度是相当慢的。使用Connect扫描端口的语法如下。
nmap -sU [target]
例如对目标192.168.153.131的端口进行UDP扫描,命令如下。
nmap -sU 192.168.153.131
扫描的结果如下。
Starting Nmap 7.30 ( https://nmap.org ) at 2016-11-21 15:00 Nmap scan report for bogon (192.168.153.131) Host is up (0.000080s latency).
Not shown: 987 closed ports PORT STATE SERVICE 42/udp open|filtered nameserver 53/udp open domain 68/udp open|filtered dhcpc 135/udp open msrpc 137/udp open netbios-ns 138/udp open|filtered netbios-dgm 445/udp open|filtered microsoft-ds 500/udp open|filtered isakmp 1028/udp open|filtered ms-lsa 1031/udp open|filtered iad2 1034/udp open activesync-notify 1035/udp open mxxrlogin 3456/udp open|filtered IISrpc-or-vat MAC Address: 00:0C:29:90:DF:C3 (VMware) Nmap done: 1 IP address (1 host up) scanned in 3.74 seconds
在扫描过程中可能会产生一些状态为filtered的端口,这些端口的真实状态可能是open,也有可能是closed。要从这些状态为filtered的端口中找到那些其实是open的端口,需要进一步的测试。与TCP不同,UDP程序的服务通常不会对Nmap所发送的空数据包做出回应,UDP程序需要使用它们自己的格式,例如,一个SNMP请求数据包的格式就与DHCP或者DNS的请求包的格式完全不同。如果保证能向所有常见的UDP服务发送合适的数据包,Nmap需要一个很大的数据库来存储这些格式,Nmap将这些数据包的格式存储在Nmap-service-probes中。可以使用-sV或者-A(这两个参数会在后面内容中提到), Nmap将会向每个open|filtered的端口发送UDP probe,如果目标端口对任何一个probe有了反应,状态都会被修改为open。
3.4.4 TCP FIN扫描
TCP FIN扫描方法向目标端口发送一个FIN数据包。按照RFC 793的规定(http://www. ietf.org/rfc/rfc0793.txt),对于所有关闭的端口,目标系统应该返回RST标志。
使用TCP FIN扫描端口的语法如下。
nmap -sF [target]
例如对目标192.168.153.131进行扫描,命令如下。
nmap -sF 192.168.153.131
3.4.5 NULL扫描
TCP NULL扫描方法是向目标端口发送一个不包含任何标志的数据包。按照RFC 793的规定,对于所有关闭的端口,目标系统应该返回RST标志。
使用TCP NULL扫描端口的语法如下。
nmap -sN [target]
例如对目标192.168.153.131进行扫描,命令如下。
nmap -sN 192.168.153.131
3.4.6 Xmas Tree扫描
TCP Xmas Tree扫描方法是向目标端口发送一个含有FIN、URG和PUSH标志的数据包。按照RFC 793的规定,对于所有关闭的端口,目标系统应该返回RST标志。
使用TCP Xmas Tree扫描端口的语法如下。
nmap -sX [target]
例如对目标192.168.153.131进行扫描,命令如下。
nmap -sX 192.168.153.131
3.4.7 idle扫描
这种扫描方式在思路上十分巧妙,在整个扫描过程中,扫描者无须向目标主机发送任何数据包,怎么样,是不是光听着就觉得十分神奇?不过,不向目标主机发送数据包并不是指不发送数据包,在这种扫描方式中,需要一个“第三方”,它扮演了一个被利用的无辜角色,因为这个第三方对我们的扫描也是一无所知,所以我们的扫描是隐蔽的。
下面介绍这种扫描的原理。
步骤1:检测第三方的IP ID值并记录下来。
步骤2:在本机上伪造一个源地址为第三方主机的数据包,并将数据包发送给目标主机端口,根据目标端口状态的不同,目标主机可能会导致第三方主机的IP ID值增加。
步骤3:再回来检查第三方主机的IP ID值。比较这两次的值。
这时,第三方主机的IP ID值应该是增加了1到2,如果只是增加了1,那么说明第三方主机在这期间并没有向外发送数据包,这种情况就认为目标主机的端口是关闭的。如果增加了2,就表明第三方主机在这期间向外部发送了数据包,这样就说明目标主机的端口是开放的。
在这个过程中,因为需要伪造一个源地址为第三方的数据包,所以必须要求扫描工具具有伪造数据包的能力,Nmap已经有了decoy scanning(-D)的功能,可以帮助使用者隐藏自己的身份。要知道任何发往目标主机的数据包都有可能被目标主机的日志记录下来,而通过idle扫描方式,目标主机日志中记录下来的是第三方的地址。
idle扫描的另一个优势在于可以绕开网络中的一些安全机制,如路由器中的访问控制列表技术(ACL),某些单位的内部网络限制只允许指定IP地址对其内部进行访问。有些时候,一些工作人员为了方便,经常会在防火墙或者路由器上设置例外,允许他们从家中对单位的网络进行访问。如果没有做好安全保障,这其实是一种相当危险的做法。
idle扫描的缺点也同样明显,通常一个SYN扫描所需要花费的时间只是几秒,而idle扫描的扫描时间要远远多于这个时间,另一点就是很多时候,宽带提供商并不会允许你向外发送伪造的数据包。还有最为重要的一点是,idle扫描要求你必须能找到一个正在工作的第三方主机。
这其实是一个并不简单的问题,首先这台第三方主机产生IP ID的方法必须是整体增加的,而不是根据每个通信自行开始的,最好是空闲的,因为大量的无关流量将会导致结果极为混乱。当然主机与第三方主机的延迟小也是理想的情况。
那么如何查看一台主机是否适合作为一台第三方主机呢?方法一是,在对一台主机进行扫描的时候,执行一个端口扫描以及操作系统检测,启动详细模式(-v),操作系统就会检测IP ID增长方法,如果返回值为“IP ID Sequence Generation: Incremental”,这是一个好消息。但还需要确定一下,因为很多系统其实为每一个通信开启了一个IP ID,另外,如果这台主机和外界进行大量的通信,这种方法也是不适用的。
方法二是运行ipidseq NSE脚本。关于脚本的问题,后面会详细描述。
好了,当找到一台第三方主机后,一切就都简单了。例如使用sI参数指定kiosk.adobe. com作为第三方主机,然后对http://www.riaa.com进行扫描。扫描结果如下。
Nmap -Pn -p- -sI kiosk.adobe.com www.riaa.com Nmap done: 1 IP address (1 host up) scanned in 2594.47 seconds Starting Nmap ( http://Nmap.org ) Idlescan using zombie kiosk.adobe.com (192.150.13.111:80); Class: Incremental Nmap scan report for 208.225.90.120 (The 65522 ports scanned but not shown below are in state: closed) Port State Service 21/tcp open ftp 25/tcp open smtp 80/tcp open http 111/tcp open sunrpc 135/tcp open loc-srv 443/tcp open https 1027/tcp open IIS 1030/tcp open iad1 2306/tcp open unknown 5631/tcp open pcanywheredata 7937/tcp open unknown 7938/tcp open unknown 36890/tcp open unknown Nmap done: 1 IP address (1 host up) scanned in 2594.47 seconds