Nmap端口扫描速率提升方法

标签:Nmap   扫描工具   扫描速率优化    2278人阅读 评论(0)
分类:

0 问题背景


我想要使用Nmap获得全网NTP服务器的IP。为了检测我用的Nmap扫描命令的性能,首先对某/22网段进行扫描,使用的命令如下:Nmap -sU --open -pU:123 *.*.*.0/22 -oX myscan.xml。 结果扫描出了5个NTP服务器,Nmap done: 1024 IP addresses (186 hosts up) scanned in 328.55 seconds表明扫描一个/22网段使用了5.5分钟完成,全网扫描则需44年......


  • 问题:扫描时间很长。

  • 尝试解决:1、抓包分析;2、查看官方文档


1 抓包分析


通过wireshark抓包分析在上面那个端口扫描命令下Nmap的扫描策略。


1.1 pcap包分析

对某个非存活主机(IP)的探测过程如下图所示:


非存活IP的扫描步骤


官方文档的Host Discovery章节介绍了这一过程:


If no host discovery options are given, Nmap sends an ICMP echo request, a TCP SYN packet to port 443, a TCP ACK packet to port 80, and an ICMP timestamp request. These defaults are equivalent to the -PE -PS443 -PA80 -PP options.


意思是如果你没有给出任何主机发现选项,那么就会向目标主机发送 ICMP echo request, a TCP SYN packet to port 443, a TCP ACK packet to port 80, and an ICMP timestamp request这四个探测包来判断主机是否存活。如果对这四个探测包都没有回应,那么判断这个主机没有存活。


从图中可以看出,Nmap实际上发送了8个包,每种探测手段都有一个超时重传包。


如果主机回复了探测包,那么可以判断这个主机是存活状态,最后会发送NTP探测包。如下面两张图所示:


回复ICMP echo

443端口返回ACK包


根据没有开启123端口的数据包情况,可以看到大部分端口探测的超时重传策略是2000ms的超时时间以及1次重传。


端口探测的超时重传策略


1.2 结论


从上面的分析来看,为了探测123端口是否开启,Nmap首先依次通过4种方式来探测一个主机是否存活,判断存活后才会发送数据包确认123端口是否开启。由此可知大部分资源和时间都耗费在了主机探测上,所以个人觉得对互联网级别的1-3个端口探测不需要首先进行主机存活探测,应该直接向主机对应端口发送探测包。 影响扫描时间的应该还有在端口探测时超时重传时间和次数,通过改变这两个值应该可以减少探测时间。


2 官方网站对提高速率有帮助的选项


2.1 -Pn选项


从官方文档的Examples的页面上发现如下例子:


Example: nmap -v -iR 100000 -Pn -p 80 Asks Nmap to choose 100,000 hosts at random and scan them for web servers (port 80). Host enumeration is disabled with -Pn since first sending a couple probes to determine whether a host is up is wasteful when you are only probing one port on each target host anyway.


这里的重点是后半句加粗部分,意思是说你如果只探测一个端口,就需要使用-Pn这个选项来跳过主机发现这一个步骤,因为为了探测目标主机上的一个端口而提前发送多个探测包来确定主机是否启动是浪费的。


-Pn这个选项的官方简介如下:

-Pn:Treat all hosts as online -- skip host discovery. 也就是说加了-Pn就可以跳过主机发现过程。


使用nmap -sU --open -Pn -pU:123 *.*.*.0/22 -oX myscan.xml命令扫描。


抓包分析发现扫描没有主机发现过程了,全部都是直接对端口123进行扫描。


对端口123的扫描


2.2 性能选项


我查看了官方文档的性能章节,发现其中有两个官方提到可以用来提高扫描速率的选项。下面分别简要介绍这两个选项。


2.2.1 --min-rtt-timeout , --max-rtt-timeout , --initial-rtt-timeout :调整扫描超时时间


在放弃或重新发送探测之前,Nmap会等待探测响应一段时间,即超时时间,这个时间是根据以前的探测的响应时间计算的,确切的计算公式可以参考官方端口扫描算法章节。超时时间可以通过设置--*-rtt-timeout来规定它可以达到的最大值,最小值还有它的初始值。在默认情况下,它从一个较高的初始值开始,并且在没有收到任何回复包之前持续这个值;如果网络延迟很大,超时时间可能会增长到几秒钟。所以将max-rtt-timeout和initial-rtt-timeout设置成较低的数值可以极大地提高扫描速率。max-rtt-timeout设置一般在100ms到1000ms之间。


2.2.2 --max-retries :指定重新发送扫描包的最大次数


当Nmap没有收到扫描端口的响应时会通过重新发送扫描包再次尝试。如果Nmap检测到较差的网络可靠性时,它可能会在放弃一个端口之前尝试多次。虽然这有利于准确性,但也延长了扫描时间,所以可以通过限制最大重传次数来加速扫描,即指定--max-retries的值。如果将--max-retries设置为0即表示没有重传,这样子会降低准确性,但是会提升扫描时间。


2.2.(2.5) 性能设置组合


官方设置了-T4/-T5两个性能设置组合来提高扫描速率(-T1/-T2/-T3也是性能设置组合,但是不会提高速率,具体可参考性能章节),这两个性能设置组合使用了上面介绍的两个选项,官方对于-T4/-T5的介绍如下:


-T4 does the equivalent of --max-rtt-timeout 1250ms --min-rtt-timeout 100ms --initial-rtt-timeout 500ms --max-retries 6 and sets the maximum TCP scan delay to 10 milliseconds. -T5 does the equivalent of --max-rtt-timeout 300ms --min-rtt-timeout 50ms --initial-rtt-timeout 250ms --max-retries 2 --host-timeout 15m --script-timeout 10m as well as setting the maximum TCP scan delay to 5 ms.


-T4选项可以在一个相当快且可靠的网络上开启,可以加快扫描速度。-T5需要在一个非常快的网络上开启,极大提升扫描速度,但是会降低准确性。


开启-T4选项,使用nmap -sU --open -Pn -T4 -pU:123 *.*.*.0/22 -oX myscan.xml命令扫描。结果是Nmap done: 1024 IP addresses (1024 hosts up) scanned in 161.85 seconds,扫描时间从5.5分钟降低到了2.7分钟。


在没有设置最大超时时间的时候,对123端口扫描的重传时间大部分是2000ms,设置-T4选项之后,大部分超时时间都是500ms,但是没有超过1250ms的超时时间,如下图所示。和没有开启-T4选项是一样,重传次数仍然是两次,并且在这个/22网络里仍然扫描出了5个NTP服务器,正确率没有下降。


-T4的重传时间-1

-T4的重传时间-2


我在官方文档里还看到两个和并行扫描相关的选项,调整这两个值也可以使得扫描速度更快。下面介绍一下这两个选项。


2.2.3 --min-hostgroup ; --max-hostgroup :调整并行扫描组的大小


官方介绍:Nmap通过将目标IP划分成多个主机组,然后在同一时间对一个组进行扫描来实现并行扫描多个主机。主机组的大小越大,扫描速度越快。Nmap的默认分组大小是从5个逐渐增加到1024个。--min-hostgroup是用来设置最小主机组大小的,Nmap不会使组的大小低于这个值,所以可以通过将--min-hostgroup设置一个较大的值来增加并行扫描主机的个数从而提升扫描速率。官方表明对于一个有很多端口的扫描,这个值超过512不会有太大帮助,而对于仅扫描少量端口号的情况,主机组大小为2048或更多可能会有帮助。(这个选项对端口扫描和版本扫描有用,对主机发现阶段没有用。)


我用nmap -sU --open -T4 -Pn --min-hostgroup 256 -pU:123 *.*.0.0/22这个命令进行对某/22网段主机的123端口进行扫描,通过分析扫描数据包我发现即使将--min-hostgroup设置成了256,同一时间探测的主机还是在10-50个之间波动。如果主机组大小不是同一时间探测的主机数量,那这个选项的具体作用是什么?他提升扫描速率是如何做到的?有知道的同学可以在评论区告知一下,谢谢。


2.2.4 --min-parallelism ; --max-parallelism :调整扫描并行数量


官方介绍:这些选项用于控制主机组的探测报文数量。默认状态下Nmap会基于网络性能计算理想的扫描并行数量,并且这个值经常改变。如果报文被丢弃,Nmap会减少探测报文数量。随着网络性能改善,探测报文数量会缓慢增加。扫描并行数量根据网络情况不同可以从1增长至几百。最常见的应用是将--min-parallelism的值设置为大于1的数值,以加快性能不佳的主机或网络的扫描速率。这个选项具有风险,如果过高则影响准确度,同时也会降低Nmap基于网络条件动态控制并行度的能力。这个值设为10较为合适, 这个值的调整往往作为最后的手段。


我用nmap -sU --open -T4 -Pn --min-parallelism 100 -pU:123 123 *.*.0.0/22这个命令进行对某/22网段主机的123端口进行扫描,通过分析扫描数据包发现同一时间发送的探测包变成了100个,这个情况符合我的认知。并且设置这个选项后整体扫描时间变成了1.5分钟:Nmap done: 1024 IP addresses (1024 hosts up) scanned in 91.40 seconds,仍然扫描到了5个NTP服务器,没有降低正确率。

官方文档的性能章节中还有其他可以调整扫描速率的选项,感兴趣可以仔细研究。


3 总结


通过-Pn、--max-rtt-timeout、--initial-rtt-timeout、--max-retries、--min-parallelism的设置使得扫描时间从5.5分钟提升到了1.5分钟。但是这个时间仍然不能满足我的需求,全网扫描某个端口还是应该求助于Masscan或者Zmap这两个工具。Nmap比较适合于对一个主机详细信息的扫描,并且--max-rtt-timeout、--initial-rtt-timeout、--max-retries、--min-parallelism这四个选项的设置对于提升扫描速度是普遍适用并且有帮助的,而--min-hostgroup这个选项虽然官方说其能够提升速率,但我没有从探测数据包中看出官方描述的功能。


查看评论

暂无评论

发表评论
  • 评论内容:
      
首页
团队介绍
发展历史
组织结构
MESA大事记
新闻中心
通知
组内动态
科研成果
专利
论文
项目
获奖
软著
人才培养
MESA毕业生
MESA在读生
MESA员工
招贤纳士
走进MESA
学长分享
招聘通知
招生宣传
知识库
文章
地址:北京市朝阳区华严北里甲22号楼五层 | 邮编:100029
邮箱:nelist@iie.ac.cn
京ICP备15019404号-1