NMAP:网络探索和安全审计手册 Chapter9 优化扫描

本章包括以下配方:

  • 跳过阶段以加快扫描速度

  • 选择正确的定时模板

  • 调整定时参数

  • 调整性能参数

  • 使用 Dnmap 在多个客户端之间分配扫描

引言

我最喜欢 Nmap 的一点是它的可定制性。如果配置得当,Nmap 可以在一次运行中扫描从单个目标到数百万个 IP 地址。然而,我们需要小心谨慎,需要了解可能影响性能的配置选项和扫描阶段,但最重要的是,要事先真正想清楚我们的扫描目标。我们需要反向 DNS 查找的信息吗?我们是否知道所有目标都在线?网络是否拥堵?目标响应速度够快吗?诸如此类的问题都会增加扫描时间。

因此,优化扫描非常重要,如果我们要处理许多目标,优化扫描可以节省我们的时间。本章首先介绍了不同的扫描阶段、时间安排和性能选项。除非我们对扫描过程中的幕后工作有充分的了解,否则就无法完全优化我们的扫描。定时模板设计用于常见场景,但我们希望更进一步,在扫描过程中为每台主机节省额外的几秒钟。请记住,这不仅能提高性能,还能提高准确性。也许那些被标记为离线的目标只是对发送的探测响应太慢而已。

在本章的最后,我们还介绍了一个名为 Dnmap 的非官方工具,它可以帮助我们在多个客户端之间分配 Nmap 扫描,从而节省时间并利用额外的带宽和 CPU 资源。准备深入了解 Nmap 的内部结构以及时间和性能参数!

跳过阶段以加快扫描速度

Nmap 扫描可以分阶段进行。在处理许多主机时,我们可以跳过那些返回我们不需要的信息或我们已经掌握的信息的测试或阶段,从而节省时间。通过仔细选择扫描标记,我们可以显著提高扫描性能。

本食谱将解释扫描时的幕后过程,以及如何跳过某些阶段以加快扫描速度。

How to do it...

  1. 要执行全端口扫描,并将定时模板设置为攻击性,且不使用 DNS 反向解析 (-n) 或 ping (-Pn),请使用以下命令:

    # nmap -T4 -n -Pn -p- 74.207.244.221 
    
  2. 在报告末尾注明扫描时间:

     Nmap scan report for 74.207.244.221
     Host is up (0.11s latency).
     Not shown: 65532 closed ports
     PORT STATE SERVICE
     22/tcp open ssh
     80/tcp open http
     9929/tcpopen nping-echo
     Nmap done: 1 IP address (1 host up) scanned in 60.84 seconds
    
  3. 现在,比较一下如果我们不跳过任何测试所得到的运行时间:

    # nmap -p- scanme.nmap.org
     Nmap scan report for scanme.nmap.org (74.207.244.221)
     Host is up (0.11s latency).
     Not shown: 65532 closed ports
     PORT STATE SERVICE
     22/tcp open ssh
     80/tcp open http
     9929/tcpopen nping-echo
     Nmap done: 1 IP address (1 host up) scanned in 77.45 seconds
    

    虽然时间上的差异不是很大,但当你与许多主机一起工作时,时间上的差异就会增加。我建议你考虑一下你的目标和你需要的信息,以考虑跳过我们接下来要介绍的一些扫描阶段的可能性。

How it works...

Nmap 扫描分为几个阶段。其中一些需要设置参数才能运行,但其他一些,如反向 DNS 解析,默认情况下会执行。让我们回顾一下可以跳过的阶段及其相应的 Nmap 标志:

  • 目标枚举:在此阶段,Nmap 分析目标列表。这一阶段不能完全跳过,但您可以只使用 IP 地址作为目标来节省 DNS 前向查找。

  • 主机发现:这是 Nmap 确定目标是否在线并在网络中的阶段。默认情况下,Nmap 发送 ICMP echo 请求和一些附加探测,但它支持多种主机发现技术,甚至可以将它们结合起来。要跳过主机发现阶段(不 ping),请使用 -Pn 标志。通过比较两次扫描的数据包轨迹,我们可以很容易地看出跳过了哪些探测:

    $ nmap -Pn -p80 -n --packet-trace scanme.nmap.org
     SENT (0.0864s) TCP 106.187.53.215:62670 > 74.207.244.221:80 S 
     ttl=46 id=4184 iplen=44 seq=3846739633 win=1024 <mss 1460>
     RCVD (0.1957s) TCP 74.207.244.221:80 > 106.187.53.215:62670 SA 
     ttl=56 id=0 iplen=44 seq=2588014713 win=14600 <mss 1460>
     Nmap scan report for scanme.nmap.org (74.207.244.221)
     Host is up (0.11s latency).
     PORT STATE SERVICE
     80/tcp open http
     Nmap done: 1 IP address (1 host up) scanned in 0.22 seconds
    

    要在不跳过主机发现的情况下进行扫描,我们使用以下命令:

    $ nmap -p80 -n --packet-trace scanme.nmap.org
     SENT (0.1099s) ICMP 106.187.53.215 > 74.207.244.221 Echo request
     (type=8/code=0) ttl=59 id=12270 iplen=28
     SENT (0.1101s) TCP 106.187.53.215:43199 > 74.207.244.221:443 S 
     ttl=59 id=38710 iplen=44 seq=1913383349 win=1024 <mss 1460>
     SENT (0.1101s) TCP 106.187.53.215:43199 > 74.207.244.221:80 A 
     ttl=44 id=10665 iplen=40 seq=0 win=1024
     SENT (0.1102s) ICMP 106.187.53.215 > 74.207.244.221 Timestamp 
     request (type=13/code=0) ttl=51 id=42939 iplen=40
     RCVD (0.2120s) ICMP 74.207.244.221 > 106.187.53.215 Echo reply 
     (type=0/code=0) ttl=56 id=2147 iplen=28
     SENT (0.2731s) TCP 106.187.53.215:43199 > 74.207.244.221:80 S 
     ttl=51 id=34952 iplen=44 seq=2609466214 win=1024 <mss 1460>
     RCVD (0.3822s) TCP 74.207.244.221:80 > 106.187.53.215:43199 SA 
     ttl=56 id=0 iplen=44 seq=4191686720 win=14600 <mss 1460>
     Nmap scan report for scanme.nmap.org (74.207.244.221)
     Host is up (0.10s latency).
     PORT STATE SERVICE
     80/tcp open http
     Nmap done: 1 IP address (1 host up) scanned in 0.41 seconds
    
  • 反向 DNS 解析:主机名通常会自行显示附加信息,Nmap 使用反向 DNS 查找来获取这些信息。在扫描参数中添加参数 -n 可以跳过这一步。让我们看看使用和不使用反向 DNS 解析的两次扫描产生的流量。首先,在命令中添加 -n 跳过 DNS 反向解析:

    $ nmap -n -Pn -p80 --packet-trace scanme.nmap.org
     SENT (0.1832s) TCP 106.187.53.215:45748 > 74.207.244.221:80 S 
     ttl=37 id=33309 iplen=44 seq=2623325197 win=1024 <mss 1460>
     RCVD (0.2877s) TCP 74.207.244.221:80 > 106.187.53.215:45748 SA 
     ttl=56 id=0 iplen=44 seq=3220507551 win=14600 <mss 1460>
     Nmap scan report for scanme.nmap.org (74.207.244.221)
     Host is up (0.10s latency).
     PORT STATE SERVICE
     80/tcpopen http
     Nmap done: 1 IP address (1 host up) scanned in 0.32 seconds
    

    如果我们尝试同样的命令,但不跳过 DNS 反向解析,结果如下:

     NSOCK (0.0600s) UDP connection requested to 106.187.36.20:53
     (IOD #1) EID 8
     NSOCK (0.0600s) Read request from IOD #1 [106.187.36.20:53] 
     (timeout: -1ms) EID
     18
     NSOCK (0.0600s) UDP connection requested to 106.187.35.20:53
     (IOD #2) EID 24
    [ 253 ]
    Optimizing Scans
     NSOCK (0.0600s) Read request from IOD #2 [106.187.35.20:53] 
     (timeout: -1ms) EID
     34
     NSOCK (0.0600s) UDP connection requested to 106.187.34.20:53
     (IOD #3) EID 40
     NSOCK (0.0600s) Read request from IOD #3 [106.187.34.20:53] 
     (timeout: -1ms) EID
     50
     NSOCK (0.0600s) Write request for 45 bytes to IOD #1 EID 59 
     [106.187.36.20:53]:
     =............221.244.207.74.in-addr.arpa.....
     NSOCK (0.0600s) Callback: CONNECT SUCCESS for EID 8 
     [106.187.36.20:53]
     NSOCK (0.0600s) Callback: WRITE SUCCESS for EID 59 
     [106.187.36.20:53]
     NSOCK (0.0600s) Callback: CONNECT SUCCESS for EID 24 
     [106.187.35.20:53]
     NSOCK (0.0600s) Callback: CONNECT SUCCESS for EID 40 
     [106.187.34.20:53]
     NSOCK (0.0620s) Callback: READ SUCCESS for EID 18
     [106.187.36.20:53] (174 bytes)
     NSOCK (0.0620s) Read request from IOD #1 [106.187.36.20:53] 
     (timeout: -1ms) EID
     66
     NSOCK (0.0620s) nsi_delete() (IOD #1)
     NSOCK (0.0620s) msevent_cancel() on event #66 (type READ)
     NSOCK (0.0620s) nsi_delete() (IOD #2)
     NSOCK (0.0620s) msevent_cancel() on event #34 (type READ)
     NSOCK (0.0620s) nsi_delete() (IOD #3)
     NSOCK (0.0620s) msevent_cancel() on event #50 (type READ)
     SENT (0.0910s) TCP 106.187.53.215:46089 > 74.207.244.221:80 S
     ttl=42 id=23960 ip
     len=44 seq=1992555555 win=1024 <mss 1460>
     RCVD (0.1932s) TCP 74.207.244.221:80 > 106.187.53.215:46089 SA
     ttl=56 id=0 iplen
     =44 seq=4229796359 win=14600 <mss 1460>
     Nmap scan report for scanme.nmap.org (74.207.244.221)
     Host is up (0.10s latency).
     PORT STATE SERVICE
     80/tcpopen http
     Nmap done: 1 IP address (1 host up) scanned in 0.22 seconds
    
  • 端口扫描:在此阶段,Nmap 确定端口的状态。默认情况下,它会根据用户权限使用 SYN/TCP 连接扫描,但也支持其他几种端口扫描技术。虽然这可能不是很明显,但 Nmap 可以在不进行端口扫描的情况下对目标执行一些不同的操作,如解析目标的 DNS 名称或检查目标是否在线。因此,可以使用参数 -sn 跳过这一阶段:

    $ nmap -sn -R --packet-trace 74.207.244.221
     SENT (0.0363s) ICMP 106.187.53.215 > 74.207.244.221 Echo request
     (type=8/code=0) ttl=56 id=36390 iplen=28
     SENT (0.0364s) TCP 106.187.53.215:53376 > 74.207.244.221:443 S 
     ttl=39 id=22228 iplen=44 seq=155734416 win=1024 <mss 1460>
     SENT (0.0365s) TCP 106.187.53.215:53376 > 74.207.244.221:80 A 
     ttl=46 id=36835 iplen=40 seq=0 win=1024
     SENT (0.0366s) ICMP 106.187.53.215 > 74.207.244.221 Timestamp 
     request (type=13/code=0) ttl=50 id=2630 iplen=40
     RCVD (0.1377s) TCP 74.207.244.221:443 > 106.187.53.215:53376 RA
     ttl=56 id=0 iplen=40 seq=0 win=0
     NSOCK (0.1660s) UDP connection requested to 106.187.36.20:53
     (IOD #1) EID 8
     NSOCK (0.1660s) Read request from IOD #1 [106.187.36.20:53] 
     (timeout: -1ms) EID 18
     NSOCK (0.1660s) UDP connection requested to 106.187.35.20:53
     (IOD #2) EID 24
     NSOCK (0.1660s) Read request from IOD #2 [106.187.35.20:53] 
     (timeout: -1ms) EID 34
     NSOCK (0.1660s) UDP connection requested to 106.187.34.20:53
     (IOD #3) EID 40
     NSOCK (0.1660s) Read request from IOD #3 [106.187.34.20:53] 
     (timeout: -1ms) EID 50
     NSOCK (0.1660s) Write request for 45 bytes to IOD #1 EID 59 
     [106.187.36.20:53]: [............221.244.207.74.
     in-addr.arpa.....
     NSOCK (0.1660s) Callback: CONNECT SUCCESS for EID 8 
     [106.187.36.20:53]
     NSOCK (0.1660s) Callback: WRITE SUCCESS for EID 59 
     [106.187.36.20:53]
     NSOCK (0.1660s) Callback: CONNECT SUCCESS for EID 24 
     [106.187.35.20:53]
     NSOCK (0.1660s) Callback: CONNECT SUCCESS for EID 40 
     [106.187.34.20:53]
     NSOCK (0.1660s) Callback: READ SUCCESS for EID 18 
     [106.187.36.20:53] (174 bytes)
     NSOCK (0.1660s) Read request from IOD #1 [106.187.36.20:53] 
     (timeout: -1ms) EID 66
     NSOCK (0.1660s) nsi_delete() (IOD #1)
     NSOCK (0.1660s) msevent_cancel() on event #66 (type READ)
     NSOCK (0.1660s) nsi_delete() (IOD #2)
     NSOCK (0.1660s) msevent_cancel() on event #34 (type READ)
     NSOCK (0.1660s) nsi_delete() (IOD #3)
     NSOCK (0.1660s) msevent_cancel() on event #50 (type READ)
     Nmap scan report for scanme.nmap.org (74.207.244.221)
     Host is up (0.10s latency).
     Nmap done: 1 IP address (1 host up) scanned in 0.17 seconds
    

在上一个示例中,我们可以看到执行了 ICMP echo 请求和 DNS 反向查询(我们使用选项 -R 强制 DNS 查询),但没有进行端口扫描。

There's more...

我建议您也运行几次测试扫描来测量不同 DNS 服务器的速度。我发现 ISP 往往拥有最慢的 DNS 服务器,但你可以通过指定参数 --dns-servers 让 Nmap 使用不同的 DNS 服务器。例如,要使用 Google 的 DNS 服务器,请使用以下命令:

# nmap -R --dns-servers 8.8.8.8,8.8.4.4 -O scanme.nmap.org 

您可以通过比较扫描时间来测试 DNS 服务器的速度。下面的命令告诉 Nmap 不要 ping 或扫描端口,只执行 DNS 反向查找:

$ nmap -R -Pn -sn 74.207.244.221 
 Nmap scan report for scanme.nmap.org (74.207.244.221) 
 Host is up. 
 Nmap done: 1 IP address (1 host up) scanned in 1.01 seconds 

要进一步定制扫描,了解 Nmap 的扫描阶段很重要。有关详细信息,请参阅附录 F "参考资料和其他阅读"。

选择正确的计时模板

Nmap 包含六个模板,设置不同的定时和性能参数,以便根据网络条件优化扫描。尽管 Nmap 会自动调整其中一些值,还是建议您设置正确的定时模板,以便告诉 Nmap 网络连接的速度和目标的响应时间。

下面的食谱将教你了解 Nmap 的定时模板以及如何选择最合适的模板。

How to do it...

打开终端,键入以下命令来使用攻击性定时模板 (-T4)。同时使用调试 (-d) 查看 Nmap 选项 -T4 的设置:

# nmap -T4 -d 192.168.4.20
 --------------- Timing report ---------------
 hostgroups: min 1, max 100000
 rtt-timeouts: init 500, min 100, max 1250
 max-scan-delay: TCP 10, UDP 1000, SCTP 10
 parallelism: min 0, max 0
 max-retries: 6, host-timeout: 0
 min-rate: 0, max-rate: 0
 ---------------------------------------------
 <Scan output removed for clarity>

您可以使用 0 到 5 之间的整数。

How it works...

选项 -T 用于设置 Nmap 的定时模板。Nmap 提供六个定时模板,帮助用户调整定时和性能参数。可用的定时模板及其初始配置值如下:

  • Paranoid(-0): 该模板有助于避免检测系统,但速度非常慢,因为每次只扫描一个端口,而且两次探测之间的超时时间为 5 分钟:

    --------------- Timing report ---------------
     hostgroups: min 1, max 100000
     rtt-timeouts: init 300000, min 100, max 300000
     max-scan-delay: TCP 1000, UDP 1000, SCTP 1000
    [ 257 ]
    Optimizing Scans
     parallelism: min 0, max 1
     max-retries: 10, host-timeout: 0
     min-rate: 0, max-rate: 0
    ---------------------------------------------
    
  • Sneaky (-1):这种模板对于躲避检测系统很有用,但速度仍然很慢:

    --------------- Timing report ---------------
     hostgroups: min 1, max 100000
     rtt-timeouts: init 15000, min 100, max 15000
     max-scan-delay: TCP 1000, UDP 1000, SCTP 1000
     parallelism: min 0, max 1
     max-retries: 10, host-timeout: 0
     min-rate: 0, max-rate: 0
    ---------------------------------------------
    
  • Polite (-2): 该模板用于不干扰目标系统的扫描,是一种非常保守和安全的设置:

    --------------- Timing report ---------------
     hostgroups: min 1, max 100000
     rtt-timeouts: init 1000, min 100, max 10000
     max-scan-delay: TCP 1000, UDP 1000, SCTP 1000
     parallelism: min 0, max 1
     max-retries: 10, host-timeout: 0
     min-rate: 0, max-rate: 0
    ---------------------------------------------
    
  • Normal (-3):这是 Nmap 的默认计时模板,在未设置参数 -T 时使用:

    --------------- Timing report ---------------
     hostgroups: min 1, max 100000
     rtt-timeouts: init 1000, min 100, max 10000
     max-scan-delay: TCP 1000, UDP 1000, SCTP 1000
     parallelism: min 0, max 0
     max-retries: 10, host-timeout: 0
     min-rate: 0, max-rate: 0
    --------------------------------------------
    
  • Aggressive (-4): 这是宽带和以太网连接的推荐计时模板:

    --------------- Timing report ---------------
     hostgroups: min 1, max 100000
     rtt-timeouts: init 500, min 100, max 1250
     max-scan-delay: TCP 10, UDP 1000, SCTP 10
     parallelism: min 0, max 0
     max-retries: 6, host-timeout: 0
     min-rate: 0, max-rate: 0
     ---------------------------------------------
    
  • Insane (-5): 这种计时模板牺牲了准确性,以换取速度:

    --------------- Timing report ---------------
     hostgroups: min 1, max 100000
     rtt-timeouts: init 250, min 50, max 300
     max-scan-delay: TCP 5, UDP 1000, SCTP 5
     parallelism: min 0, max 0
     max-retries: 2, host-timeout: 900000
     min-rate: 0, max-rate: 0
     ---------------------------------------------
    

There's more...

Nmap 的交互模式允许用户按键动态更改运行时变量,如 verbose、debugging 和 packet tracing。虽然在开发邮件列表中讨论过几次在交互模式中加入定时和性能选项,但到目前为止还没有实现。不过,2012 年 6 月提交的非官方补丁允许动态更改最小和最大数据包速率值(--max-rate 和 --min-rate)。如果您想试用,请访问 http://seclists.org/nmap-dev/2012/q2/883。

调整定时参数

Nmap 不仅能在扫描时根据不同的网络和目标条件进行自我调整,还能使用定时选项对其进行微调,以提高性能。Nmap 会自动计算数据包往返、超时和延迟值,但这些值也可以通过特定设置手动设置。

下面的配方描述了 Nmap 支持的定时参数。

How to do it...

输入以下命令调整初始往返超时、探测之间的延迟以及每个扫描主机的超时:

# nmap -T4 --scan-delay 1s --initial-rtt-timeout 150ms --host-timeout 15m -
d scanme.nmap.org
 --------------- Timing report ---------------
 hostgroups: min 1, max 100000
 rtt-timeouts: init 150, min 100, max 1250
 max-scan-delay: TCP 1000, UDP 1000, SCTP 1000
 parallelism: min 0, max 0
 max-retries: 6, host-timeout: 900000
 min-rate: 0, max-rate: 0
 ---------------------------------------------

How it works...

Nmap 支持可以自定义的不同定时参数。然而,错误设置这些值很可能会损害而不是提高性能。让我们仔细研究每个定时参数并了解其 Nmap 选项参数名称。

往返时间(RTT)值被Nmap用来判断何时放弃或重传探测响应。Nmap 通过分析以前的响应来估计这个值,但你可以用参数 --initial-rtt-timeout 来设置初始 RTT 超时,如下命令所示:

# nmap -A -p- --initial-rtt-timeout 150ms <target> 

此外,您还可以使用--min-rtt-timeout 和 --max-rtt-timeout,分别设置最小和最大 RTT 超时值,如以下命令所示:

nmap -A -p- --min-rtt-timeout 200ms --max-rtt-timeout 600ms <target> 

我们可以在 Nmap 中控制的另一个非常重要的设置是探测之间的等待时间。使用参数 --scan-delay 和 --max-scan-delay 分别设置探测之间的等待时间和允许等待的最长时间,如以下命令所示:

# nmap -A --max-scan-delay 10s scanme.nmap.org 
# nmap -A --scan-delay 1s scanme.nmap.org 

请注意,前面显示的参数在避免检测机制时非常有用。注意不要将 --max-scan-delay 设置得太低,因为它很可能会漏掉已打开的端口。

There's more...

如果希望 Nmap 在一定时间后放弃某个主机,可以设置参数 --host-timeout:

# nmap -sV -A -p- --host-timeout 5m <target> 

用 Nping 估算往返时间

要使用 nping 估算目标与您之间的往返时间,可以使用以下命令:

# nping -c30 <target> 

这将使 nping 发送 30 个 ICMP echo 请求数据包,完成后将显示获得的平均、最小和最大 RTT 值:

# nping -c30 scanme.nmap.org
 ...
 SENT (29.3569s) ICMP 50.116.1.121 > 74.207.244.221 Echo request
 (type=8/code=0) ttl=64 id=27550 iplen=28
 RCVD (29.3576s) ICMP 74.207.244.221 > 50.116.1.121 Echo reply
 (type=0/code=0) ttl=63 id=7572 iplen=28
 Max rtt: 10.170ms | Min rtt: 0.316ms | Avgrtt: 0.851ms
 Raw packets sent: 30 (840B) | Rcvd: 30 (840B) | Lost: 0 (0.00%)
 Tx time: 29.09096s | Tx bytes/s: 28.87 | Txpkts/s: 1.03
 Rx time: 30.09258s | Rx bytes/s: 27.91 | Rx pkts/s: 1.00
 Nping done: 1 IP address pinged in 30.47 seconds

Examine the round trip times and use the maximum to set the correct --initial-rtt-timeout and --max-rtt-timeout values. The official documentation recommends using double the maximum RTT value for the --initial-rtt-timeout, and as high as four times the maximum round time value for the -max-rtt-timeout.

Displaying the timing settings

Enable debugging to make Nmap inform you about the timing settings before scanning:

$ nmap -d <target>
 --------------- Timing report ---------------
 hostgroups: min 1, max 100000
 rtt-timeouts: init 1000, min 100, max 10000
 max-scan-delay: TCP 1000, UDP 1000, SCTP 1000
 parallelism: min 0, max 0
 max-retries: 10, host-timeout: 0
 min-rate: 0, max-rate: 0
 ---------------------------------------------

To further customize your scans, it is important that you understand the scan phases of Nmap. See Appendix F, References and Additional Reading, for more information.

调整性能参数

Nmap 不仅能在扫描时根据不同的网络和目标条件进行自我调整,还支持几个影响 Nmap 行为的参数,如并发扫描的主机数量、重试次数和允许的探测次数。学习如何正确调整这些参数可以减少大量扫描时间。

下面的食谱解释了可以调整以提高性能的 Nmap 参数。

How to do it...

输入以下命令,根据目标条件调整数值:

$ nmap --min-hostgroup 100 --max-hostgroup 500 --max-retries 2 <target> 

How it works...

前面显示的命令告诉 Nmap 扫描和报告的主机分组不能少于 100 个(--min-hostgroup 100),也不能多于 500 个(--max-hostgroup 500)。它还告诉 Nmap 在放弃任何端口前只重试两次(--max-retries 2):

# nmap --min-hostgroup 100 --max-hostgroup 500 --max-retries 2 <target> 

需要注意的是,错误设置这些值很可能会损害性能或准确性,而不是提高性能或准确性。Nmap 在端口扫描阶段会发送很多探测,这是因为没有响应的含义不明确;可能是数据包丢失了,可能是服务被过滤了,也可能是服务没有打开。默认情况下,Nmap 会根据网络条件调整重试次数,但你可以用参数 -- max-retries 来设置这个值。通过增加重试次数,我们可以提高 Nmap 的准确性,但要记住这会牺牲速度:

$ nmap --max-retries 10 <target> 

参数 --min-hostgroup 和 --max-hostgroup 可控制同时探测的主机数量。请记住,报告也是根据该值生成的,因此请根据希望查看扫描结果的频率来调整该值。较大的组是提高性能的最佳选择,但在网络速度较慢的情况下,你可能更喜欢较小的主机组:

# nmap -A -p- --min-hostgroup 100 --max-hostgroup 500 <target> 

还有一个非常重要的参数,可以用来限制 Nmap 每秒发送的数据包数量。需要小心使用参数 --min-rate 和 --max-rate,以避免不良影响。如果没有这些参数,Nmap 会自动设置这些速率:

# nmap -A -p- --min-rate 50 --max-rate 100 <target> 

最后,参数 --min-parallelism 和 --max-parallelism 可用来控制主机组的探测次数。设置这些参数后,Nmap 将不再动态调整数值:

# nmap -A --max-parallelism 1 <target> 
# nmap -A --min-parallelism 10 --max-parallelism 250 <target>

There's more...

如果希望 Nmap 在一定时间后放弃某个主机,可以设置参数 --host-timeout,如下命令所示:

# nmap -sV -A -p- --host-timeout 5m <target> 

Nmap 的交互模式允许用户按键动态更改运行时变量,如 verbose、debugging 和 packet tracing。虽然在开发邮件列表中讨论过几次在交互模式中加入定时和性能选项,但迄今为止尚未实施。不过,2012 年 6 月提交的非官方补丁允许动态更改最小和最大数据包速率值(--max-rate 和 --min-rate)。如果您想试用,请访问 http://seclists.org/nmap-dev/2012/q2/883。

要进一步自定义扫描,了解 Nmap 的扫描阶段很重要。更多信息,请参阅附录 F《参考资料和其他阅读》。

使用 Dnmap 在多个客户端之间分配扫描

Dnmap 是将 Nmap 扫描分布到不同客户端的优秀项目。当时间成为限制因素时,额外的可用资源(CPU 和带宽)允许我们更快地扫描更多目标。虽然也有其他专为提高速度而设计的端口扫描器,但 Dnmap 的优势在于拥有可用的 Nmap 脚本引擎脚本库。

下面的配方将向您展示如何使用 Dnmap 执行分布式端口扫描。

准备工作

从 SourceForge 官方软件仓库 https://sourceforge.net/projects/dnmap/files/ 下载最新版本的 Dnmap。

Dnmap 依赖于 Python 的 twisted 库。如果您使用的是基于 Debian 的系统,可以使用以下命令安装它:

#apt-get install libssl-dev python-twisted 

值得一提的是,Nmap 并非自包含在 Dnmap 中;我们必须在每个客户端上单独安装它。有关安装 Nmap 的说明,请参阅第 1 章 "Nmap 基础 "中的 "从源代码编译 Nmap"。

How to do it...

  1. 使用您最喜欢的文本编辑器创建用于存储 Nmap 命令的文件。每个命令必须用新行分隔:

    #cat cmds.txt 
     nmap -sU -p1-10000 -sV scanme.nmap.org
     nmap -sU -p10000-20000 -sV scanme.nmap.org
     nmap -sU -p20000-30000 -sV scanme.nmap.org
     nmap -sU -p40000-50000 -sV scanme.nmap.org
     nmap -sU -p50001-60000 -sV scanme.nmap.org
    
  2. 启动 dnmap_server.py:

    #python dnmap_server.py -f cmds.txt 
    

    1697698865652

  3. 在客户端上运行以下命令。只需运行带有 ID 和服务器 IP 地址的客户端即可:

    #python dnmap_client.py -a <handle> -s <server ip> 
    #python dnmap_client.py -a bot_1 -s 192.168.1.100 
    

    一旦连接到服务器,客户端就应开始处理待处理的 Nmap 扫描:

    1697698890095

How it works...

Dnmap 是由来自 Mateslab (http://mateslab.com.ar/) 的 Sebastian Garcíael Draco 发布的一组 Python 脚本,用于使用服务器-客户端连接模式分发 Nmap 扫描。它的工作方式非常简单。命令存储在一个文件中,由服务器读取。dnmap_server.py 脚本处理所有传入连接,并将命令分配给客户端。每个客户端一次只执行一条 Nmap 命令:

1697699017523

There's more...

此外,还可以使用参数 -d[1-5]提高服务器的调试级别:

#python dnmap_server.py -f cmds.txt -d 5 

服务器通过在文件末尾重新插入命令来处理断开连接。Dnmap 会创建一个名为 .dnmap-trace 文件的文件,以跟踪当前的进度状态。如果服务器本身失去连接,客户端会自动无限期地尝试重新连接,直到服务器恢复联机。

Dnmap 统计数据

Dnmap 服务器返回以下统计数据:

  • Number of commands executed :执行命令的数量

  • Last time online :最后在线时间

  • Uptime :正常运行时间

  • Version :版本

  • Commands per minute and its average :每分钟指令数及其平均值

  • User permissions :用户权限

  • Status :状态

1697699098432

全网扫描

虽然 Nmap 并不是为全网扫描而设计的,但正如我们在本食谱中所展示的,它可以用于全网扫描。Nmap 的一大优势是收集了大量 NSE 脚本。不过,如果您打算开始全网扫描,还可以使用其他工具,如 masscan (https://github.com/robertdavidgraham/masscan) 或 Zmap (https://zmap.io/),因为它们是专门为此目的而设计的,而且根据您要做的事情,它们的扫描速度会快很多。