NMAP:网络探测和安全审计手册 Chapter2 网络探测

本章包括以下内容:

  • 使用 TCP SYN ping 扫描发现主机
  • 通过 TCP ACK ping 扫描发现主机
  • 通过 UDP ping 扫描发现主机
  • 通过 ICMP ping 扫描发现主机
  • 通过 SCTP INIT ping 扫描发现主机
  • 通过 IP 协议 ping 扫描发现主机
  • 通过 ARP ping 扫描发现主机
  • 执行高级 ping 扫描
  • 通过广播 ping 发现主机
  • 扫描 IPv6 地址
  • 使用广播 NSE 脚本收集网络信息
  • 通过代理进行扫描
  • 欺骗扫描的源 IP

1、引言

在信息安全行业,Nmap 是事实上的网络探测工具,其 IPv6 扫描和高级优化选项等尖端功能将所有其他扫描仪远远甩在身后。它支持多种不同的 ping 和端口扫描技术,可相应地发现主机和服务。

受防火墙或入侵防御系统等数据包过滤系统保护的主机,在扫描时可能会因为用于阻止某些类型网络数据包的规则而返回不正确的结果。在这种情况下,Nmap 真的大显身手,因为用户可以轻松尝试不同的扫描技术(或它们的组合)来绕过这些网络限制。此外,它还支持一些有用的选项,使我们的扫描流量不那么可疑。如果我们想执行非常全面的扫描,就必须了解这些不同的扫描技术以及如何将它们结合起来。

系统管理员将了解不同扫描技术的内部工作原理,并希望了解加固流量过滤规则的重要性,从而使网络更加安全。

本章介绍了支持的 ping 扫描技术--TCP SYN、TCP ACK、UDP、IP、ICMP 和广播。本章还介绍了其他有用的技巧,包括如何强制 DNS 解析、随机化主机顺序、添加随机数据和扫描 IPv6 地址。

不要忘记同时访问 https://nmap.org/book/man-host-discovery.html 上的主机发现参考指南。

2、使用 TCP SYN ping 扫描发现主机

Ping 扫描用于检测网络中的实时主机。Nmap 的默认 ping 扫描 (-sP) 发送 TCP SYN、TCP ACK 和 ICMP 数据包,以确定主机是否响应,但如果防火墙阻止这些请求,它将被视为离线。幸运的是,Nmap 支持一种名为 TCP SYN ping 扫描的扫描技术,它可以非常方便地探测不同的端口,试图确定主机是否在线,或者至少有更宽松的过滤规则。

本食谱将介绍 TCP SYN ping 扫描及其相关选项。

如何做...

打开终端,输入以下命令

# nmap -sn -PS <target>

您应该能看到使用 TCP SYN ping 扫描在目标范围内找到的主机列表:

# nmap -sn -PS 192.1.1/24
 Nmap scan report for 192.168.0.1
 Host is up (0.060s latency).
 Nmap scan report for 192.168.0.2
 Host is up (0.0059s latency).
 Nmap scan report for 192.168.0.3
 Host is up (0.063s latency).
 Nmap scan report for 192.168.0.5
 Host is up (0.062s latency).
 Nmap scan report for 192.168.0.7
 Host is up (0.063s latency).
 Nmap scan report for 192.168.0.22
 Host is up (0.039s latency).
 Nmap scan report for 192.168.0.59
 Host is up (0.00056s latency).
 Nmap scan report for 192.168.0.60
 Host is up (0.00014s latency).
 Nmap done: 256 IP addresses (8 hosts up) scanned in 8.51 seconds

工作原理...

-sn选项告诉Nmap跳过端口扫描阶段,只执行主机发现。-PS标志告诉Nmap使用TCP SYN ping扫描。这种 ping 扫描的工作方式如下:

  1. Nmap 向 80 端口发送一个 TCP SYN 数据包。
  2. 如果端口已关闭,主机会响应一个 RST 数据包。
  3. 如果端口是开放的,主机会响应一个 TCP SYN/ACK 数据包,表示可以建立连接。
  4. 随后,发送一个 RST 数据包以重置此连接。

192.168.1.1/24 中的 CIDR /24 用于表示我们要扫描本地网络中的所有 256 个 IP。

还有更多...

TCP SYN ping 扫描可以非常有效地确定网络上的主机是否存活。虽然 Nmap 默认会发送更多探测,但它是可配置的。现在是时候学习更多关于使用 TCP SYN ping 扫描发现主机的知识了。

有权限与无权限 TCP SYN ping 扫描

以不能发送原始数据包的非特权用户身份运行 TCP SYN ping 扫描,Nmap 会使用 connect() 系统调用来发送 TCP SYN 数据包。在这种情况下,当函数成功返回时,Nmap 会区分 SYN/ACK 数据包,当收到 ECONNREFUSED 错误信息时,Nmap 会区分 RST 数据包。

防火墙和流量过滤

很多系统都受到某种流量过滤的保护,因此经常尝试不同的 ping 扫描技术非常重要。在下面的示例中,我们将在线扫描一台主机,该主机被标记为离线,但实际上,它只是在某个流量过滤系统后面,该系统不允许 TCP ACK 或 ICMP 请求:

# nmap -sn 0xdeadbeefcafe.com
 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 4.68 seconds
 # nmap -sn -PS 0xdeadbeefcafe.com
 Nmap scan report for 0xdeadbeefcafe.com (52.20.139.72)
 Host is up (0.062s latency).
 rDNS record for 52.20.139.72: ec2-52-20-139-72.compute-
 1.amazonaws.com
 Nmap done: 1 IP address (1 host up) scanned in 0.10 seconds

在 TCP SYN ping 扫描期间,Nmap 使用 SYN/ACK 和 RST 响应来确定主机是否响应。值得注意的是,有些防火墙会配置为丢弃 RST 数据包。在这种情况下,除非我们将探测发送到开放端口,否则 TCP SYN ping 扫描将失败:

# nmap -sn -PS80 <target>

使用 -PS(端口列表或范围)可以设置端口列表如下:

# nmap -sn -PS80,21,53 <target>
# nmap -sn -PS1-1000 <target>
# nmap -sn -PS80,100-1000 <target>

3、使用 TCP ACK ping 扫描发现主机

与 TCP SYN ping 扫描类似,TCP ACK ping 扫描用于确定主机是否正在响应。它可用于检测阻止 SYN 数据包或 ICMP echo 请求的主机,但很可能会被跟踪连接状态的现代防火墙阻止,因为它会发送与不存在的连接相关的假 TCP ACK 数据包。

下面的说明介绍了如何执行 TCP ACK ping 扫描及其相关选项。

如何做...

打开终端,输入以下命令

# nmap -sn -PA <target> 

结果是对发送的 TCP ACK 数据包做出响应的主机列表,因此是在线的:

# nmap -sn -PA 192.168.0.1/24
 Nmap scan report for 192.168.0.1
 Host is up (0.060s latency).
 Nmap scan report for 192.168.0.60
 Host is up (0.00014s latency).
 Nmap done: 256 IP addresses (2 hosts up) scanned in 6.11 seconds

工作原理...

-sn选项告诉Nmap跳过端口扫描阶段,只执行主机发现。而 -PA 标志则告诉 Nmap 使用 TCP ACK ping 扫描。TCP ACK ping 扫描的工作方式如下:

  • Nmap 发送一个空 TCP 数据包,并将 ACK 标志设置为 80 端口(默认端口,但也可以指定其他端口列表)。
  • 如果主机处于脱机状态,则不应响应此请求。否则,它将返回一个 RST 数据包,并被视为在线。之所以会发送 RST 数据包,是因为发送的 TCP ACK 数据包与现有的有效连接无关。

还有更多...

TCP ACK ping 扫描默认使用端口 80,但也可以配置此行为。这种扫描技术也需要权限来创建原始数据包。现在,我们将进一步了解扫描限制和配置选项。

有权限与无权限 TCP ACK ping 扫描

TCP ACK ping 扫描需要以特权用户身份运行。否则会使用 connect() 系统调用发送空 TCP SYN 数据包。因此,TCP ACK ping 扫描不会以非特权用户身份使用前面讨论过的 TCP ACK 技术,而会执行 TCP SYN ping 扫描。

在 TCP ACK ping 扫描中选择端口

此外,您还可以通过在 -PA 标志后列出端口来选择使用此技术探测的端口:

# nmap -sn -PA21,22,80 <target>
# nmap -sn -PA80-150 <target>
# nmap -sn -PA22,1000-65535 <target>

4、使用 UDP ping 扫描发现主机

Ping 扫描用于确定主机是否有响应,是否可以认为主机在线。UDP ping 扫描的优点是可以检测到防火墙后的系统,因为防火墙有严格的 TCP 过滤,但 UDP 却暴露在外。

接下来的食谱将介绍如何使用 Nmap 及其相关选项执行 UDP ping 扫描。

如何做...

打开终端,输入以下命令

# nmap -sn -PU <target> 

Nmap 将使用 UDP ping 扫描来确定目标是否可以到达:

# nmap -sn -PU scanme.nmap.org
 Nmap scan report for scanme.nmap.org (45.33.32.156)
 Host is up (0.13s latency).
 Other addresses for scanme.nmap.org (not scanned):
 2600:3c01::f03c:91ff:fe18:bb2f
 Nmap done: 1 IP address (1 host up) scanned in 7.92 seconds

工作原理...

-sn选项告诉Nmap跳过端口扫描阶段,但执行主机发现。结合 -PU 标志,Nmap 使用 UDP ping 扫描。UDP ping 扫描使用的技术如下:

  1. Nmap 向 40125 端口发送一个空 UDP 数据包。
  2. 如果主机在线,它应该返回一个 ICMP 端口不可达错误。
  3. 如果主机离线,可能会返回各种 ICMP 错误信息。

还有更多...

不响应空 UDP 数据包的服务在被探测时会产生误报。这些服务将直接忽略 UDP 数据包,主机将被错误地标记为离线。因此,我们必须选择关闭的端口,以获得更好的结果。

在 UDP ping 扫描中选择端口

要指定要探测的端口,请在 -PU 标志后添加这些端口,如下所示:

# nmap -sn -PU1337,11111 scanme.nmap.org
# nmap -sn -PU1337 scanme.nmap.org
# nmap -sn -PU1337-1339 scanme.nmap.org

5、使用 ICMP Ping 扫描发现主机

Ping 扫描用于确定主机是否在线。ICMP echo request 消息是专门为这项任务设计的,自然,ping 扫描使用这些数据包来可靠地检测主机的状态。

下面的说明介绍了如何使用 Nmap 执行 ICMP ping 扫描,以及不同类型的 ICMP 报文的标志。

如何做...

要发出 ICMP echo 请求,请打开终端并输入以下命令:

# nmap -sn -PE <target> 

如果主机作出回应,您应该会看到类似下面的内容:

# nmap -sn -PE scanme.nmap.org
 Nmap scan report for scanme.nmap.org (74.207.244.221)
 Host is up (0.089s latency).
 Nmap done: 1 IP address (1 host up) scanned in 13.25 seconds

工作原理...

参数 -sn -PE scanme.nmap.org 告诉 Nmap 向主机 scanme.nmap.org 发送一个 ICMP echo 请求包。如果我们收到该探测的 ICMP echo 回复,就可以确定主机在线。通过设置 --packet-trace 选项,我们可以轻松查看幕后的情况:

 SENT (0.0775s) ICMP 192.168.1.102 > 74.207.244.221 Echo request
 (type=8/code=0) ttl=56 id=58419 iplen=28
 RCVD (0.1671s) ICMP 74.207.244.221 > 192.168.1.102 Echo reply
 (type=0/code=0) ttl=53 id=24879 iplen=28
 Nmap scan report for scanme.nmap.org (74.207.244.221)
 Host is up (0.090s latency).
 Nmap done: 1 IP address (1 host up) scanned in 0.23 seconds

还有更多...

ICMP ping 扫描支持多种 ICMP 信息。尽管远程 ICMP 流量通常会被阻止,但这种技术对本地网络非常有效。有关 ICMP ping 扫描配置选项的更多信息,请参阅下一节。

本地网络与远程网络

不幸的是,ICMP 已经存在了很长时间,系统管理员通常会阻止远程 ICMP 数据包。不过,它仍然是监控本地网络的有用 ping 技术。

ICMP 类型

Nmap 支持 ICMP 时间戳回复 (-PP) 和地址标记回复 (-PM)。这些变体可以绕过配置错误的防火墙,因为防火墙只阻止 ICMP echo 请求:

$ nmap -sn -PP <target> 
$ nmap -sn -PM <target> 

6、使用 SCTP INIT ping 扫描发现主机

通过发送 SCTP INIT 数据包并查找 ABORT 或 INIT ACK 响应,可以使用 SCTP 数据包确定主机是否在线。Nmap 将这种有效的技术命名为 SCTP INIT ping 扫描。

下面的方法描述了如何从 Nmap 启动 SCTP INIT ping 扫描。

如何做...

打开终端,使用 -PY 选项:

# nmap -sn -PY <target> 

输出格式与其他类型的 ping 扫描相同:

# nmap -sn -PY scanme.nmap.org
 Nmap scan report for scanme.nmap.org (45.33.32.156)
 Host is up (0.15s latency).
 Other addresses for scanme.nmap.org (not scanned):
 2600:3c01::f03c:91ff:fe18:bb2f
 Nmap done: 1 IP address (1 host up) scanned in 4.31 seconds

工作原理...

参数 -sn -PY scanme.nmap.org 告诉 Nmap 对主机 scanme.nmap.org 发送 SCTP INIT ping 扫描,以确定它是否在线。Nmap 尝试通过发送 SCTP INIT 数据包来启动与服务的连接,并寻找 ABORT 或 SCTP ACK 消息,表明服务已相应关闭或打开。其中任何一条信息都会表明主机是在线的。让我们设置 --packet-trace 选项,查看所有发送的数据包:

 SENT (0.0194s) SCTP 192.168.0.14:41354 > 45.33.32.156:80 ttl=50
 id=7028 iplen=52
 RCVD (0.1604s) SCTP 45.33.32.156:80 > 192.168.0.14:41354 ttl=49 id=0
 iplen=36
 NSOCK INFO [0.1610s] nsock_iod_new2(): nsock_iod_new (IOD #1)
 NSOCK INFO [0.1610s] nsock_connect_udp(): UDP connection requested
 to 127.0.1.1:53 (IOD #1) EID 8
 NSOCK INFO [0.1610s] nsock_read(): Read request from IOD #1
 [127.0.1.1:53] (timeout: -1ms) EID 18
 NSOCK INFO [0.1610s] nsock_write(): Write request for 43 bytes to
 IOD #1 EID 27 [127.0.1.1:53]
 NSOCK INFO [0.1610s] nsock_trace_handler_callback(): Callback:
 CONNECT SUCCESS for EID 8 [127.0.1.1:53]
 NSOCK INFO [0.1610s] nsock_trace_handler_callback(): Callback: WRITE
 SUCCESS for EID 27 [127.0.1.1:53]
 NSOCK INFO [0.1850s] nsock_trace_handler_callback(): Callback: READ
 SUCCESS for EID 18 [127.0.1.1:53] (316 bytes)
 NSOCK INFO [0.1850s] nsock_read(): Read request from IOD #1
 [127.0.1.1:53] (timeout: -1ms) EID 34
 NSOCK INFO [0.1850s] nsock_iod_delete(): nsock_iod_delete (IOD #1)
 NSOCK INFO [0.1850s] nevent_delete(): nevent_delete on event #34
 (type READ)
 Nmap scan report for scanme.nmap.org (45.33.32.156)
 Host is up (0.14s latency).
 Other addresses for scanme.nmap.org (not scanned):
 2600:3c01::f03c:91ff:fe18:bb2f
 Nmap done: 1 IP address (1 host up) scanned in 0.19 seconds

前两行清楚地显示了用于确定主机是否在线的 SCTP 信息:

SENT (0.0194s) SCTP 192.168.0.14:41354 > 45.33.32.156:80 ttl=50
 id=7028 iplen=52
 RCVD (0.1604s) SCTP 45.33.32.156:80 > 192.168.0.14:41354 ttl=49 id=0
 iplen=36

还有更多...

SCTPINIT 扫描可以通过一些 Nmap 选项进行配置。让我们回顾一下这种 ping 扫描技术的其他方面。

非特权 SCTP INIT ping 扫描

SCTP INIT ping 扫描需要在 Unix 系统中以特权用户身份运行。这种扫描技术没有像 ACK ping 扫描那样的后备技术;如果没有权限,它将无法运行。

在 SCTP INIT ping 扫描中选择端口

您可以通过在 - PY 标志后列出端口来选择使用此技术进行探测的端口:

# nmap -sn -PY21,22,80 <target> 
# nmap -sn -PY80-81 <target> 
# nmap -sn -PY22,1000-1005 <target> 

7、使用 IP 协议 ping 扫描发现主机

Nmap 支持一种名为 IP 协议 ping 扫描的有趣扫描技术。它试图通过使用不同协议的 IP 数据包来确定主机是否在线。

下面的方法描述了如何执行 IP 协议 ping 扫描。

如何做...

打开终端并输入以下命令:

# nmap -sn -PO <target> 

如果主机对任何请求都作出了响应,则应看到类似下面的内容:

# nmap -sn -PO scanme.nmap.org
 Nmap scan report for scanme.nmap.org (45.33.32.156)
 Host is up (0.18s latency).
 Other addresses for scanme.nmap.org (not scanned):
 2600:3c01::f03c:91ff:fe18:bb2f
 Nmap done: 1 IP address (1 host up) scanned in 0.40 seconds

工作原理...

参数 -sn -PO scanme.nmap.org 命令 Nmap 对主机 scanme.nmap.org 执行 IP 协议 ping 扫描。

默认情况下,ping 扫描将使用 IGMP、IP-in-IP 和 ICMP 协议来确定主机是否在线。使用 --packet-trace 会显示幕后发生的更多细节:

# nmap -sn -PO --packet-trace scanme.nmap.org
 SENT (5.0337s) ICMP [192.168.0.5 > 45.33.32.156 Echo request
 (type=8/code=0) id=33907 seq=0] IP [ttl=47 id=28320 iplen=28 ]
 SENT (5.0338s) IGMP (2) 192.168.0.5 > 45.33.32.156: ttl=37 id=41324
 iplen=28
 SENT (5.0340s) IP (4) 192.168.0.5 > 45.33.32.156: ttl=42 id=42854
 iplen=20
 RCVD (5.2153s) ICMP [45.33.32.156 > 192.168.0.5 Echo reply
 (type=0/code=0) id=33907 seq=0] IP [ttl=49 id=39869 iplen=28 ]
 NSOCK INFO [5.2160s] nsock_iod_new2(): nsock_iod_new (IOD #1)
 NSOCK INFO [5.2160s] nsock_connect_udp(): UDP connection requested
 to 127.0.1.1:53 (IOD #1) EID 8
 NSOCK INFO [5.2160s] nsock_read(): Read request from IOD #1
 [127.0.1.1:53] (timeout: -1ms) EID 18
 NSOCK INFO [5.2160s] nsock_write(): Write request for 43 bytes to
 IOD #1 EID 27 [127.0.1.1:53]
 NSOCK INFO [5.2160s] nsock_trace_handler_callback(): Callback:
 CONNECT SUCCESS for EID 8 [127.0.1.1:53]
 NSOCK INFO [5.2160s] nsock_trace_handler_callback(): Callback: WRITE
 SUCCESS for EID 27 [127.0.1.1:53]
 NSOCK INFO [5.3930s] nsock_trace_handler_callback(): Callback: READ
 SUCCESS for EID 18 [127.0.1.1:53] (288 bytes)
 NSOCK INFO [5.3930s] nsock_read(): Read request from IOD #1
 [127.0.1.1:53] (timeout: -1ms) EID 34
 NSOCK INFO [5.3930s] nsock_iod_delete(): nsock_iod_delete (IOD #1)
 NSOCK INFO [5.3930s] nevent_delete(): nevent_delete on event #34
 (type READ)
 Nmap scan report for scanme.nmap.org (45.33.32.156)
  Host is up (0.18s latency).
 Other addresses for scanme.nmap.org (not scanned):
 2600:3c01::f03c:91ff:fe18:bb2f
 Nmap done: 1 IP address (1 host up) scanned in 5.39 seconds

注意以 SENT 关键字开头的三行,分别显示 ICMP、IGMP 和 IP-in-IP 数据包:

 SENT (5.0337s) ICMP [192.168.0.5 > 45.33.32.156 Echo request 
 (type=8/code=0) id=33907 seq=0] IP [ttl=47 id=28320 iplen=28 ]
 SENT (5.0338s) IGMP (2) 192.168.0.5 > 45.33.32.156: ttl=37 id=41324 iplen=28 
 SENT (5.0340s) IP (4) 192.168.0.5 > 45.33.32.156: ttl=42 id=42854  iplen=20

在这三项中,只有 ICMP 有响应。不过,这足以说明这台主机是在线的:

 RCVD (5.2153s) ICMP [45.33.32.156 > 192.168.0.5 Echo reply  (type=0/code=0) id=33907 seq=0] IP [ttl=49 id=39869 iplen=28 ] 

还有更多...

IP 协议 ping 扫描是一种有趣的技术,可以通过几个 Nmap 选项进行配置。让我们回顾一下如何更改使用的协议、添加额外的随机数据以及支持哪些协议。

设置备用 IP 协议

您还可以通过在选项 -PO 后列出要使用的 IP 协议来设置这些协议。例如,要使用 ICMP(协议号 1)、IGMP(协议号 2)和 UDP(协议号 17)协议,可使用以下命令:

# nmap -sn -PO1,2,17 scanme.nmap.org 

为 IP 数据包生成随机数据

使用此技术发送的所有数据包都是空的。请记住,您可以使用 --data-length 选项为这些数据包生成随机数据:

# nmap -sn -PO --data-length 100 scanme.nmap.org 

支持的 IP 协议及其有效载荷

使用时设置其所有协议标头的协议如下:

  • TCP:协议编号 6
  • UDP: 协议编号 17
  • ICMP:协议号 1
  • IGMP:协议号 2
  • IP-in-IP:协议编号 4
  • SCTP:协议号 132

对于任何其他 IP 协议,将发送一个仅包含 IP 头的数据包。

8、使用 ARP ping 扫描发现主机

ARP ping 扫描是检测局域网中主机的最有效方法。这使其成为扫描本地以太网网络时的首选技术,即使指定了其他 ping 选项,Nmap 也会使用它。Nmap 使用自己的算法来优化这种扫描技术。下面的配方介绍了启动 ARP ping 扫描的过程及其可用选项。

如何做...

打开您喜欢的终端,输入以下命令:

# nmap -sn -PR <target> 

您将看到响应 ARP 请求的主机列表:

# nmap -sn -PR 192.168.0.1/24
 Nmap scan report for 192.168.0.1
 Host is up (0.0039s latency).
 MAC Address: F4:B7:E2:0A:DA:18 (Hon Hai Precision Ind.)
 Nmap scan report for 192.168.0.2
 Host is up (0.0037s latency).
 MAC Address: 00:18:F5:0F:AD:01 (Shenzhen Streaming Video Technology
 Company Limited)
 Nmap scan report for 192.168.0.3
 Host is up (0.00010s latency).
 MAC Address: 9C:2A:70:10:84:BF (Hon Hai Precision Ind.)
 Nmap scan report for 192.168.0.6
 Host is up (0.0034s latency).
 MAC Address: 50:1A:C5:90:20:23 (Microsoft)
 Nmap scan report for 192.168.0.7
 Host is up (0.00015s latency).
 MAC Address: 00:0C:29:EC:38:A9 (VMware)
 Nmap scan report for 192.168.0.8
 Host is up (0.027s latency).
 MAC Address: 78:31:C1:C1:9C:0A (Apple)
 Nmap scan report for 192.168.0.5
 Host is up.
 Nmap done: 256 IP addresses (7 hosts up) scanned in 1.91 seconds

工作原理...

参数 -sn -PR 192.168.1.1/24 使 Nmap 对该专用网络中的所有 256 个 IP(CIDR /24)进行 ARP ping 扫描。

ARP ping 扫描的工作原理非常简单:

  • 向目标发送 ARP 请求
  • 如果主机回复了 ARP 请求,就说明它是在线的。

要发送 ARP 请求,需要使用以下命令:

# nmap -sn -PR --packet-trace 192.168.1.254 

该命令的结果如下:

 SENT (0.0734s) ARP who-has 192.168.1.254 tell 192.168.1.102
 RCVD (0.0842s) ARP reply 192.168.1.254 is-at 5C:4C:A9:F2:DC:7C
 NSOCK (0.1120s) UDP connection requested to 192.168.1.254:53 (IOD
 #1) EID 8
 NSOCK (0.1120s) Read request from IOD #1 [192.168.1.254:53]
 (timeout: -1ms) EID 18
 NSOCK (0.1120s) Write request for 44 bytes to IOD #1 EID 27
 [192.168.1.254:53]: .............254.1.168.192.in-addr.arpa.....
 NSOCK (0.1120s) Callback: CONNECT SUCCESS for EID 8
 [192.168.1.254:53]
 NSOCK (0.1120s) Callback: WRITE SUCCESS for EID 27
 [192.168.1.254:53]
 NSOCK (0.2030s) Callback: READ SUCCESS for EID 18 [192.168.1.254:53]
 (44 bytes): .............254.1.168.192.in-addr.arpa.....
 NSOCK (0.2030s) Read request from IOD #1 [192.168.1.254:53]
 (timeout: -1ms) EID 34
 Nmap scan report for 192.168.1.254
 Host is up (0.011s latency).
 MAC Address: 5C:4C:A9:F2:DC:7C (Huawei Device Co.)
 Nmap done: 1 IP address (1 host up) scanned in 0.22 seconds

注意扫描输出开头的 ARP 请求:

 SENT (0.0734s) ARP who-has 192.168.1.254 tell 192.168.1.102 
 RCVD (0.0842s) ARP reply 192.168.1.254 is-at 5C:4C:A9:F2:DC:7C 

ARP 回复显示主机 192.168.1.254 在线,其 MAC 地址为 5C:4C:A9:F2:DC:7C。

还有更多...

每次 Nmap 扫描一个私有地址时,都不可避免地需要发出一个 ARP 请求,因为在发送任何探测之前,我们需要目标的目的地。由于 ARP 回复显示主机在线,因此在这一步之后实际上不需要做进一步的测试。这就是为什么每次在私有局域网网络中执行 ping 扫描时,无论传递了什么参数,Nmap 都会自动使用这种技术的原因:

# nmap -sn -PS --packet-trace 192.168.1.254
 SENT (0.0609s) ARP who-has 192.168.1.254 tell 192.168.1.102
 RCVD (0.0628s) ARP reply 192.168.1.254 is-at 5C:4C:A9:F2:DC:7C
 NSOCK (0.1370s) UDP connection requested to 192.168.1.254:53 (IOD
 #1) EID 8
 NSOCK (0.1370s) Read request from IOD #1 [192.168.1.254:53]
 (timeout: -1ms) EID 18
 NSOCK (0.1370s) Write request for 44 bytes to IOD #1 EID 27
 [192.168.1.254:53]: 1............254.1.168.192.in-addr.arpa.....
 NSOCK (0.1370s) Callback: CONNECT SUCCESS for EID 8
 [192.168.1.254:53]
 NSOCK (0.1370s) Callback: WRITE SUCCESS for EID 27
 [192.168.1.254:53]
 NSOCK (0.1630s) Callback: READ SUCCESS for EID 18 [192.168.1.254:53]
 (44 bytes): 1............254.1.168.192.in-addr.arpa.....
 NSOCK (0.1630s) Read request from IOD #1 [192.168.1.254:53]
 (timeout: -1ms) EID 34
 Nmap scan report for 192.168.1.254
 Host is up (0.0019s latency).
 MAC Address: 5C:4C:A9:F2:DC:7C (Huawei Device Co.)
 Nmap done: 1 IP address (1 host up) scanned in 0.18 seconds

要强制 Nmap 在扫描专用地址时不执行 ARP ping 扫描,请使用选项 --send-ip。这将产生类似下面的输出:

# nmap -sn -PS --packet-trace --send-ip 192.168.1.254
 SENT (0.0574s) TCP 192.168.1.102:63897 > 192.168.1.254:80 S ttl=53
 id=435 iplen=44 seq=128225976 win=1024 <mss 1460>
 RCVD (0.0592s) TCP 192.168.1.254:80 > 192.168.1.102:63897 SA ttl=254
 id=3229 iplen=44 seq=4067819520 win=1536 <mss 768>
 NSOCK (0.1360s) UDP connection requested to 192.168.1.254:53 (IOD
 #1) EID 8
 NSOCK (0.1360s) Read request from IOD #1 [192.168.1.254:53]
 (timeout: -1ms) EID 18
 NSOCK (0.1360s) Write request for 44 bytes to IOD #1 EID 27
 [192.168.1.254:53]: d~...........254.1.168.192.in-addr.arpa.....
 NSOCK (0.1360s) Callback: CONNECT SUCCESS for EID 8
 [192.168.1.254:53]
 NSOCK (0.1360s) Callback: WRITE SUCCESS for EID 27
 [192.168.1.254:53]
 NSOCK (0.1610s) Callback: READ SUCCESS for EID 18 [192.168.1.254:53]
 (44 bytes): d~...........254.1.168.192.in-addr.arpa.....
 NSOCK (0.1610s) Read request from IOD #1 [192.168.1.254:53]
 (timeout: -1ms) EID 34
 Nmap scan report for 192.168.1.254
 Host is up (0.0019s latency).
 MAC Address: 5C:4C:A9:F2:DC:7C (Huawei Device Co.)
 Nmap done: 1 IP address (1 host up) scanned in 0.17 seconds

MAC 地址欺骗

MAC 欺骗可以让我们伪造连接来源,有助于躲避 IDS 系统。在执行 ARP ping 扫描时,可以欺骗你的 MAC 地址。使用 --spoof-mac 设置新的 MAC 地址:

# nmap -sn -PR --spoof-mac <mac address> <target> 

IPv6 扫描

如果使用 ARP 扫描选项 -PR 来扫描 IPv6 地址,Nmap 将使用 ICMPv6 邻居发现(相当于 ARP)。

9、执行高级 ping 扫描

在本章中,您已经学习了 Nmap 支持的所有不同的 ping 扫描技术。我们一直在不同的场景中独立使用这些技术,但 Nmap 的优势之一是能够将它们结合起来。通过扩大发送到网络的探测集,发现扫描可以产生更好的结果,但这取决于我们如何优化组合扫描技术和探测端口。下面的食谱将介绍启动高级 ping 扫描的过程。

如何做...

打开终端并输入以下命令:

# nmap -sn --send-ip -PS21,22,23,25,80,445,443,3389,8080 -PA80,443,8080 -PO1,2,4,6 -PU631,161,137,123 <target> 

您将看到对任何探测做出响应的主机列表:

# nmap --send-ip -sn -PS21,22,23,25,80,445,443,3389,8080 -PA80,443,8080 -PO1,2,4,6 -PU631,161,137,123 192.168.1.1/24 
 Nmap scan report for 192.168.1.67 
 Host is up (0.093s latency). 
 MAC Address: 78:31:C1:C1:9C:0A (Apple) 
 Nmap scan report for 192.168.1.69 
 Host is up (0.041s latency). 
 MAC Address: 9C:2A:70:10:84:BF (Hon Hai Precision Ind.) 
 Nmap scan report for 192.168.1.254 
 Host is up (0.0077s latency). 
 MAC Address: 7C:B1:5D:4D:09:68 (Huawei Technologies) 
 Nmap scan report for 192.168.1.70 
 Host is up. 
 Nmap done: 256 IP addresses (4 hosts up) scanned in 98.43 seconds 

结果将因您选择的探测器而异,如果我们希望做到隐蔽,那么在对新目标启动 ping 发现扫描之前仔细考虑是很重要的。

工作原理...

在 nmap --send-ip -sn -PS21,22,23,25,80,445,443,3389,8080 -PA80,443,8080 -PO1,2,4,6 -PU631,161,137,123 192.168.1.1/24 命令中,我们同时设置了多个 ping 扫描探针,从而提高了扫描效果。

让我们简要回顾一下上次扫描中使用的选项(您可以随时查阅本章中之前讨论过的任何 ping 扫描技术):

-PS<端口>:对指定端口进行 SYN ping 扫描。 -PA<端口>:对指定的端口进行 ACK ping 扫描

  • PO<IP 协议>:使用 IP 协议 ping 扫描指定的协议
  • PU<端口>:针对指定端口使用 UDP ping 扫描。

当使用 LAN 网络时,我们使用参数 --send-ip 来覆盖 Nmap 使用 ARP ping 扫描的行为。

还有更多...

以前面的命令为起点,为您的环境定制探针。这不仅有助于提高扫描性能,还能减少误报/正报。考虑一下目标。更多的探针可以获得更好的结果,但如果我们想要隐蔽,它们可能不是最佳选择。例如,如果是基于 Windows 的网络,可以尝试包括常用的 SMB 端口。

Ping 探测器的有效性

David Fifield 和 Fyodor 对 Ping 探针的有效性进行了研究。这是一本非常有趣的读物,可以让您了解探针集的良好起点。您可以在此 URL 找到他们的研究笔记和结果:

https://www.bamsoftware.com/wiki/Nmap/EffectivenessOfPingProbes

10、利用广播 ping 扫描发现主机

广播 ping 会向本地广播地址发送 ICMP 回显请求,即使不是一直有效,也是在不向其他主机发送探针的情况下发现网络中主机的好方法。

本食谱介绍如何使用 Nmap NSE 通过广播 ping 发现新主机。

如何做...

打开终端,键入以下命令

# nmap --script broadcast-ping 

您应该可以看到对广播 ping 作出回应的主机列表:

 Pre-scan script results: 
 | broadcast-ping: 
 | IP: 192.168.0.8 MAC: 78:31:c1:c1:9c:0a 
 |_ Use --script-args=newtargets to add the results as targets 
 WARNING: No targets were specified, so 0 hosts scanned. 
 Nmap done: 0 IP addresses (0 hosts up) scanned in 3.37 seconds 

工作原理...

广播 ping 的工作原理是向本地广播地址 255.255.255.255 发送 ICMP echo 请求,然后等待主机回复 ICMP echo。它产生的输出类似于下面的内容:

# nmap --script broadcast-ping --packet-trace
 NSOCK INFO [0.1740s] nsock_iod_new2(): nsock_iod_new (IOD #1)
 NSOCK INFO [0.1740s] nsock_pcap_open(): PCAP requested on device
 'ens33' with berkeley filter 'dst host 192.168.0.5 and
 icmp[icmptype]==icmp-echoreply' (promisc=0 snaplen=104 to_ms=200)
 (IOD #1)
 NSOCK INFO [0.1740s] nsock_pcap_open(): PCAP created successfully on
 device 'ens33' (pcap_desc=5 bsd_hack=0 to_valid=1 l3_offset=14) (IOD
 #1)
 NSOCK INFO [0.1750s] nsock_pcap_read_packet(): Pcap read request
 from IOD #1 EID 13
 NSOCK INFO [0.3710s] nsock_trace_handler_callback(): Callback: READ-
 PCAP SUCCESS for EID 13
 NSOCK INFO [0.3710s] nsock_pcap_read_packet(): Pcap read request
 from IOD #1 EID 21
 NSOCK INFO [0.3710s] nsock_trace_handler_callback(): Callback: READ-
 PCAP SUCCESS for EID 21
 NSOCK INFO [0.3710s] nsock_pcap_read_packet(): Pcap read request
 from IOD #1 EID 29
 NSOCK INFO [3.3710s] nsock_trace_handler_callback(): Callback: READ-
 PCAP TIMEOUT for EID 29
 NSE: > | CLOSE
 NSOCK INFO [3.3720s] nsock_iod_delete(): nsock_iod_delete (IOD #1)
 Pre-scan script results:
 | broadcast-ping:
 | IP: 192.168.0.8 MAC: 78:31:c1:c1:9c:0a
 | IP: 192.168.0.54 MAC: 80:d2:1d:31:48:d0
 |_ Use --script-args=newtargets to add the results as targets
 WARNING: No targets were specified, so 0 hosts scanned.
 Nmap done: 0 IP addresses (0 hosts up) scanned in 3.38 seconds
 

还有更多...

广播脚本非常有趣,允许我们在不定义特定目标的情况下运行 Nmap 扫描。Nmap 还可以在扫描期间通过 NSE 添加目标。让我们回顾一下 Nmap 用于广播脚本的一些有用选项。

广播 ping 选项

要增加 ICMP echo 请求的数量,使用脚本参数 broadcast-ping.num_probes:

# nmap --script broadcast-ping --script-args broadcast-ping.num_probes=5 

在扫描大型网络时,使用 -- script-args broadcast-ping.timeout=

# nmap --script broadcast-ping --script-args broadcast-ping.timeout=10000 

您可以使用 broadcast-ping.interface 指定网络接口。如果不指定接口,broadcast-ping 将使用所有具有 IPv4 地址的接口发送探测:

# nmap --script broadcast-ping --script-args broadcast-ping.interface=wlan3 

目标库

参数 --script-args=newtarget 会强制 Nmap 使用这些新发现的主机作为目标:

# nmap --script broadcast-ping --script-args=newtargets
 Pre-scan script results:
 | broadcast-ping:
 | IP: 192.168.1.105 MAC: 08:00:27:16:4f:71
 |_ IP: 192.168.1.106 MAC: 40:25:c2:3f:c7:24
 Nmap scan report for 192.168.1.105
 Host is up (0.00022s latency).
 Not shown: 997 closed ports
 PORT STATE SERVICE
 22/tcp open ssh
 80/tcp open http
 111/tcp open rpcbind
 MAC Address: 08:00:27:16:4F:71 (Cadmus Computer Systems)
 Nmap scan report for 192.168.1.106
 Host is up (0.49s latency).
 Not shown: 999 closed ports
 PORT STATE SERVICE
 80/tcp open http
 MAC Address: 40:25:C2:3F:C7:24 (Intel Corporate)
 Nmap done: 2 IP addresses (2 hosts up) scanned in 7.25 seconds

请注意,我们没有指定目标,但参数 newtargets 还是将 IP 192.168.1.106 和 192.168.1.105 加入了扫描队列。

参数 max-newtargets 设置了添加到扫描队列的主机最大数量:

# nmap --script broadcast-ping --script-args max-newtargets=3 

11、扫描 IPv6 地址

Nmap 最重要的更新之一是支持 IPv6。所有端口扫描和主机发现技术都可以使用 IPv6 地址,包括操作系统检测,甚至还有一些新的有趣的发现技术可以解决暴力扫描 IPv6 地址空间的问题。

本食谱介绍如何使用 Nmap 扫描 IPv6 地址。

如何做...

打开终端,键入所需的 Nmap 命令,并附加 -6 选项:

# nmap -6 <target> 
# nmap -6 scanme.nmap.org 
 Nmap scan report for scanme.nmap.org 
 (2600:3c01::f03c:91ff:fe18:bb2f) 
 Host is up (0.065s latency). 
 Other addresses for scanme.nmap.org (not scanned): 45.33.32.156 
 Not shown: 997 closed ports 
 PORT STATE SERVICE 
 22/tcp open ssh 
 80/tcp open http 
 31337/tcp open Elite 
 Nmap done: 1 IP address (1 host up) scanned in 1.20 seconds 

工作原理...

-6选项启用IPv6扫描,这是Nmap最新版本中最重要的更新之一。TCP 端口扫描,包括原始数据包扫描、服务检测、操作系统检测、Nmap 脚本引擎脚本,以及名为 IPv6 邻居发现的新 ping 扫描技术,现在都支持 IPv6 模式。

请务必在开始时添加 -6 选项,让 Nsock 尽早知道你将使用 IPv6。

将使用 IPv6。

# nmap -6 -sT <target> 
# nmap -6 -O <target> 
# nmap -6 -A <target> 

还有更多...

除了直接集成到 Nmap 的 IPv6 支持外,还有一些 NSE 脚本使用了发现技术。让我们进一步了解 Nmap 中的 IPv6 扫描。

IPv6 指纹

在内部,服务指纹数据库的格式与 IPv4 数据库不同。如果你需要创建新的 IPv6 指纹,你可以在 https://nmap.org/book/osdetect-ipv6-methods.html 找到有关其结构的所有详细信息。

发现新的 IPv6 目标

由于暴力破解 IPv6 地址空间是不切实际的,因此在扫描未知地址空间时,我们必须使用不同的技术来克服这一问题。

NSE 脚本 targets-ipv6-multicast-mld 使用多播监听器发现(MLD)请求来查找局域网中的新 IPv6 主机:

# nmap -6 --script targets-ipv6-multicast-mld --script-args interface=en0
 Pre-scan script results:
 | targets-ipv6-multicast-mld:
 | IP: fe80::c1cc:1d6b:5e79:d690 MAC: 50:1a:c5:90:20:23 IFACE: en0
 | IP: fe80::c057:f6a4:8ae1:70e6 MAC: 9c:2a:70:10:84:bf IFACE: en0
 | IP: fe80::82d2:1dff:fe2c:2055 MAC: 80:d2:1d:2c:20:55 IFACE: en0
 |_ IP: fe80::f6b7:e2ff:fe0a:da18 MAC: f4:b7:e2:0a:da:18 IFACE: en0

NSE 脚本 targets-ipv6-multicast-slaac 中实施的另一项技术是使用 ICMPv6 路由器广告请求来触发无状态地址自动配置(SLAAC),以发现 IPv6 主机:

#nmap -6 --script targets-ipv6-multicast-slaac --script-args interface=en0 -sn
 Pre-scan script results:
 | targets-ipv6-multicast-slaac:
 | IP: fe80::62f1:89ff:fe24:6af7 MAC: 60:f1:89:24:6a:f7 IFACE: en0
 | IP: fe80::fda9:bc5b:ceb1:e785 MAC: 60:f1:89:24:6a:f7 IFACE: en0
 | IP: fe80::15f5:623:af0d:3a7b MAC: 80:d2:1d:2c:20:55 IFACE: en0
 | IP: fe80::c057:f6a4:8ae1:70e6 MAC: 9c:2a:70:10:84:bf IFACE: en0
 | IP: fe80::fda7:e7f0:7e20:e754 MAC: 9c:2a:70:10:84:bf IFACE: en0
 |_ IP: fe80::82d2:1dff:fe2c:2055 MAC: 80:d2:1d:2c:20:55 IFACE: en0

NSE 脚本 targets-ipv6-multicast-echo 向所有节点的链路本地组播地址 (ff02::1) 发出 ICMPv6 Echo 请求:

# nmap -6 --script targets-ipv6-multicast-echo --script-args
'newtargets,interface=eth0' -sL
 Pre-scan script results:
 | targets-ipv6-multicast-echo:
 | IP: 2001:0db8:0000:0000:0000:0000:0000:0001 MAC: 11:22:33:44:55:66 IFACE: eth0
 |_ Use --script-args=newtargets to add the results as targets

另一个有趣的 IPv6 多播脚本是 targets-ipv6-multicast-invalid-dst,它使用带有无效扩展头的 ICMPv6 请求发送到全节点链路本地多播地址(ff02::1):

# nmap -6 --script=targets-ipv6-multicast-invalid-dst.nse --script-args
'newtargets,interface=eth0' -sn
 Pre-scan script results:
 | targets-ipv6-multicast-invalid-dst:
 | IP: 2001:0db8:0000:0000:0000:0000:0000:0001 MAC: 11:22:33:44:55:66 IFACE: eth0
 |_ Use --script-args=newtargets to add the results as targets

12、利用广播脚本收集网络信息

广播请求通常用于以极少的数据包揭示协议和主机的详细信息。NSE 广播脚本可执行检测 dropbox 监听器、嗅探主机、发现 DHCP、MS SQL 或 NCP 服务器等任务。

本食谱介绍如何使用 NSE 广播脚本从网络中收集有趣的信息。

如何做...

打开终端,输入以下命令:

# nmap --script broadcast -e <interface> 

请注意,广播脚本可以在不设置特定目标的情况下运行。所有找到信息的 NSE 脚本都将包含在扫描结果中:

# nmap --script broadcast -e eth0
 Pre-scan script results:
 | broadcast-dhcp-discover:
 | Response 1 of 1:
 | IP Offered: 192.168.0.13
 | Subnet Mask: 255.255.255.0
 | Router: 192.168.0.1
 | Server Identifier: 192.168.0.1
 |_ Domain Name Server: 200.79.231.5, 200.79.231.6
 | broadcast-igmp-discovery:
 | 192.168.0.3
 | Interface: ens33
 | Version: 2
 | Group: 224.0.0.251
 | Description: mDNS
 | 192.168.0.3
 | Interface: ens33
 | Version: 2
 | Group: 239.255.255.250
 | Description: Organization-Local Scope (rfc2365)
 |_ Use the newtargets script-arg to add the results as targets
 | broadcast-listener:
 | ether
 | ARP Request
 | sender ip sender mac target ip
 | 192.168.0.3 78:31:C1:C1:9C:0A 192.168.0.6
 | udp
 | Spotify
 | ip
 | 192.168.0.3
 | SSDP
 | ip uri
 | 192.168.0.2 urn:schemas-upnp-org:device:InternetGatewayDevice:1
 | 192.168.0.3 urn:dial-multiscreen-org:service:dial:1
 | DHCP
 | srv ip cli ip mask gwdns vendor
 | 192.168.0.1 192.168.0.13 255.255.255.0 192.168.0.1 200.79.231.5, 200.79.231.6 -
 |_ 192.168.0.1 192.168.0.5 255.255.255.0 192.168.0.1 200.79.231.5, 200.79.231.6 -
 | broadcast-ping:
 | IP: 192.168.0.3 MAC: 78:31:c1:c1:9c:0a
 |_ Use --script-args=newtargets to add the results as targets
 | broadcast-upnp-info:
 | 192.168.0.2
 | Server: Linux/3.0.8, UPnP/1.0, Portable SDK for UPnP devices/1.6.14
 |_ Location: http://192.168.0.2:49152/description.xml
 | eap-info:
 | Available authentication methods with identity="anonymous" on interface ens33
 | unknown EAP-TLS
 | unknown EAP-TTLS
 | unknown PEAP
 |_ unknown EAP-MSCHAP-V2
 | ipv6-multicast-mld-list:
 | fe80::7a31:c1ff:fec1:9c0a:
 | device: ens33
 | mac: 78:31:c1:c1:9c:0a
 | multicast_ips:
 | ff02::2:ff84:d3a6 (Node Information Queries)
 | ff02::1:ffc1:9c0a (NDP Solicited-node)
 | fe80::f6b7:e2ff:fe0a:da18:
 | device: ens33
 | mac: f4:b7:e2:0a:da:18
 | multicast_ips:
 | ff02::1:ff0a:da18 (NDP Solicited-node)
 | fe80::62f1:89ff:fe24:6af7:
 | device: ens33
 | mac: 60:f1:89:24:6a:f7
 | multicast_ips:
 |_ ff02::1:ff24:6af7 (NDP Solicited-node)
 | targets-ipv6-multicast-mld:
 | IP: fe80::62f1:89ff:fe24:6af7 MAC: 60:f1:89:24:6a:f7 IFACE: ens33
 | IP: fe80::7a31:c1ff:fec1:9c0a MAC: 78:31:c1:c1:9c:0a IFACE: ens33
 | IP: fe80::f6b7:e2ff:fe0a:da18 MAC: f4:b7:e2:0a:da:18 IFACE: ens33
 |
 |_ Use --script-args=newtargets to add the results as targets
 | targets-sniffer: Sniffed 18 address(es).
 | 224.0.0.1
 | 224.0.0.251
 | 239.255.255.253
 | 239.255.255.250
 | 224.0.0.9
 | fe80::68f3:f91b:c57c:b9a0
 | c0a8:5:ff02::
 | 0:1:3a00:8001::fe00:420b
 | 192.168.0.1
 | 0:1:8000:e62e:5:6:4e6d:6170
 | 224.0.0.13
 | 192.168.0.2
 | 127.0.1.1
 | fe80::f6b7:e2ff:fe0a:da18
 | 192.168.0.3
 | fe80::62f1:89ff:fe24:6af7
 | 224.0.23.12
 |_fe80::7a31:c1ff:fec1:9c0a
 WARNING: No targets were specified, so 0 hosts scanned.
 Nmap done: 0 IP addresses (0 hosts up) scanned in 40.24 seconds

工作原理...

参数 --script broadcast 命令 Nmap 初始化广播类别中的所有 NSE 脚本。该类别包含使用广播请求的脚本,这意味着不直接向目标发送探测,而是向广播地址发送探测。

在写这篇文章的时候,有 44 种不同的广播脚本可用。让我们看看 Nmap 官方文档中的一些脚本描述:

  • broadcast-avahi-dos: 该脚本尝试使用 DNS 服务发现协议发现本地网络中的主机,并向每个主机发送一个 NULL UDP 数据包,以测试其是否存在 Avahi NULL UDP 数据包拒绝服务漏洞 (CVE-2011-1002)。
  • broadcast-db2-discover: 该脚本试图通过向 523/udp 端口发送广播请求来发现网络上的 DB2 服务器。
  • broadcast-dhcp-discover: 该脚本向广播地址 (255.255.255.255) 发送 DHCP 请求并报告结果。在发送请求时,它会使用静态 MAC 地址 (DE:AD:CO:DE:CA:FE),以防止范围耗尽。
  • broadcast-dns-service-discovery: 该脚本尝试使用 DNS 服务发现协议来发现主机的服务。它会发送多播 DNS-SD 查询,并收集所有响应。
  • broadcast-dropbox-listener: 该脚本会监听 https://www.dropbox.com/?landing=cntl 客户端每 20 秒一次的局域网同步信息广播,然后打印所有发现的客户端 IP 地址、端口号、版本号、显示名称等。
  • broadcast-listener: 该脚本会嗅探网络中传入的广播通信,并尝试解码接收到的数据包。它支持 CDP、HSRP、Spotify、Dropbox、DHCP、ARP 等协议。更多信息,请参见 https://github.com/nmap/nmap/blob/master/nselib/data/packetdecode rs.lua。
  • broadcast-ms-sql-discover: 该脚本可发现同一广播域中的 Microsoft SQL 服务器。
  • broadcast-netbios-master-browser: 此脚本试图发现主浏览器及其管理的域。
  • broadcast-novell-locate: 该脚本尝试使用服务定位协议来发现 Novell NetWare 核心协议 (NCP) 服务器。
  • broadcast-ping: 该脚本使用原始以太网数据包向选定接口发送广播 ping,并输出响应主机的 IP 和 MAC 地址,或(如有要求)将其添加为目标。运行该脚本需要 Unix 的 Root 权限,因为它使用的是原始套接字。大多数操作系统不响应广播-ping 探测,但可以通过配置来响应。
  • broadcast-rip-discover: 该脚本可发现局域网中运行 RIPv2 的设备和路由信息。它通过发送 RIPv2 请求命令并收集所有响应请求的设备的响应来实现。
  • broadcast-upnp-info: 该脚本通过发送组播查询,然后收集、解析并显示所有响应,尝试从 UPnP 服务中提取系统信息。
  • broadcast-wsdd-discover: 该脚本使用多播查询发现支持网络服务动态发现(WS-Discovery)协议的设备。它还会尝试查找任何已发布的 Windows Communication Framework (WCF) 网络服务(.NET 4.0 或更高版本)。
  • lltd-discovery: 该脚本使用 Microsoft LLTD 协议发现本地网络上的主机。
  • targets-ipv6-multicast-echo: 该脚本向所有节点的链路本地组播地址(ff02::1)发送 ICMPv6 echo 请求数据包,以发现局域网中的响应主机,而无需单独 ping 每个 IPv6 地址。
  • target-ipv6-multicast-invalid-dst: 该脚本会发送一个扩展头无效的 ICMPv6 数据包 向全节点、链路本地组播地址 (ff02::1) 发送带有无效扩展头的 ICMPv6 数据包,以发现局域网中的(部分)可用主机。这样做是可行的,因为有些主机会用 ICMPv6 参数问题数据包来回应这个探测。
  • target-ipv6-multicast-slaac:该脚本通过触发 SLAAC 来执行 IPv6 主机发现。
  • targets-sniffer: 该脚本会嗅探本地网络相当长的时间(默认为 10 秒),并打印发现的地址。如果设置了脚本参数 newtargets,则会将发现的地址添加到扫描队列中。

考虑到每个脚本都有一组可用参数,有时需要对其进行调整。例如,target-sniffer 只嗅探网络 10 秒钟,对于大型网络来说可能不够:

# nmap --script broadcast --script-args targets-sniffer.timeout 30 

如您所见,广播类别中有一些非常漂亮的 NSE 脚本,值得一试。您可以在 https://nmap.org/nsedoc/categories/broadcast.html 上了解更多有关它们的信息以及广播脚本的具体参数。

还有更多...

尽管我们在本章中不会深入研究 NSE,但记住 Nmap 脚本引擎的以下方面是很重要的。

脚本选择

请记住,NSE 脚本可以按类别、表达式或文件夹选择。因此,我们可以调用除名为 target-* 的脚本之外的所有广播脚本,如下所示:

# nmap --script "broadcast and not targets-*" 

目标库

参数 --script-args=newtarget 会强制 Nmap 使用这些新发现的主机作为目标:

# nmap --script broadcast-ping --script-args newtargets
 Pre-scan script results:
 | broadcast-ping:
 | IP: 192.168.1.105 MAC: 08:00:27:16:4f:71
 |_ IP: 192.168.1.106 MAC: 40:25:c2:3f:c7:24
 Nmap scan report for 192.168.1.105
 Host is up (0.00022s latency).
 Not shown: 997 closed ports
 PORT STATE SERVICE
 22/tcp open ssh
 80/tcp open http
 111/tcp open rpcbind
 MAC Address: 08:00:27:16:4F:71 (Cadmus Computer Systems)
 Nmap scan report for 192.168.1.106
 Host is up (0.49s latency).
 Not shown: 999 closed ports
 PORT STATE SERVICE
 80/tcp open http
 MAC Address: 40:25:C2:3F:C7:24 (Intel Corporate)
 Nmap done: 2 IP addresses (2 hosts up) scanned in 7.25 seconds

请注意,我们没有指定目标,但参数 newtargets 还是将 IP 192.168.1.106 和 192.168.1.105 加入了扫描队列。参数 max-newtargets 设置了添加到扫描队列的主机最大数量:

# nmap --script broadcast-ping --script-args max-newtargets=3 

13、通过代理进行扫描

最近版本中新增的一个重要功能是 HTTP 和 SOCKS4 代理支持。通过代理扫描,我们可以掩盖源 IP 地址,但应考虑会带来的额外延迟。

本食谱将告诉你如何通过代理进行隧道扫描。

如何做...

打开终端,输入以下命令:

# nmap -sV -Pn -n --proxies <comma separated list of proxies> <target> 

该功能在 Nsock 中实现,并非所有 Nmap 功能都支持。您需要小心谨慎,避免意外泄露您的源 IP 地址。例如,要通过 TOR 扫描主机,我们可以这样做:

# nmap -sV -Pn -n --proxies socks4://127.0.0.1:9050 scanme.nmap.org
 Nmap scan report for scanme.nmap.org (45.33.32.156)
 Host is up (0.13s latency).
 Other addresses for scanme.nmap.org (not scanned):
 2600:3c01::f03c:91ff:fe18:bb2f
 PORT STATE SERVICE VERSION
 80/tcp open http Apache httpd 2.4.7 ((Ubuntu))
 Service detection performed. Please report any incorrect results at
 https://nmap.org/submit/ .
 Nmap done: 1 IP address (1 host up) scanned in 9.58 seconds

遗憾的是,输出结果中并没有明确显示路由成功的信息。如果你认为路由没有达到预期效果,可以尝试使用 --packet-trace 选项。你会看到代理连接正在进行。

工作原理...

参数 --proxies 命令 Nmap 通过给定的代理列表代理所有 TCP 连接。此功能在 Nsock 中实现,并非所有 Nmap 功能都支持。您需要小心避免意外泄露您的源 IP 地址,因为 ping 和端口扫描以及操作系统检测不会通过代理隧道连接。例如,请注意在第一次连接中,Nmap 在尝试确定端口是否开放时是如何忽略代理的。之后,所有 NSE 连接都会通过代理:

# nmap -Pn -n --proxies socks4://127.0.0.1:9050 0xdeadbeefcafe.com -p80 --
script +http-title --packet-trace
 SENT (12.5420s) TCP 192.168.0.7:57493 > 52.20.139.72:80 S ttl=40
 id=17769 iplen=44 seq=3295579933 win=1024 <mss 1460>
 RCVD (12.6032s) TCP 52.20.139.72:80 > 192.168.0.7:57493 SA ttl=42
 id=0 iplen=44 seq=2389752706 win=26883 <mss 8961>
 NSOCK INFO [0.1700s] nsock_iod_new2(): nsock_iod_new (IOD #1)
 NSOCK INFO [12.7340s] nsock_connect_tcp(): TCP connection requested
 to 52.20.139.72:80 (IOD #1) EID 8
 NSOCK INFO [12.7340s] nsock_trace_handler_callback(): Callback:
 CONNECT SUCCESS for EID 8 [127.0.0.1:9050]
 NSOCK INFO [12.7340s] nsock_write(): Write request for 9 bytes to
 IOD #1 EID 19 [127.0.0.1:9050]
 NSOCK INFO [12.7340s] nsock_readbytes(): Read request for 8 bytes
 from IOD #1 [127.0.0.1:9050] EID 26
 NSOCK INFO [12.7340s] nsock_trace_handler_callback(): Callback:
 WRITE SUCCESS for EID 19 [127.0.0.1:9050]
 NSOCK INFO [13.0530s] nsock_trace_handler_callback(): Callback: READ
 SUCCESS for EID 26 [127.0.0.1:9050] (8 bytes): .Z......
 NSOCK INFO [13.0530s] forward_event(): Forwarding event upstream:
 TCP connect SUCCESS (IOD #1) EID 26
 NSE: TCP 127.0.0.1:37151 > 127.0.0.1:9050 | CONNECT
 NSE: TCP 127.0.0.1:37151 > 127.0.0.1:9050 | 00000000: 47 45 54 20 2f
 20 48 54 54 50 2f 31 2e 31 0d 0a GET / HTTP/1.1
 NSOCK INFO [13.0530s] nsock_write(): Write request for 156 bytes to
 IOD #1 EID 35 [127.0.0.1:9050]
 NSOCK INFO [13.0530s] nsock_trace_handler_callback(): Callback:
 WRITE SUCCESS for EID 35 [127.0.0.1:9050]
 NSE: TCP 127.0.0.1:37151 > 127.0.0.1:9050 | SEND
 NSOCK INFO [13.0530s] nsock_read(): Read request from IOD #1
 [127.0.0.1:9050] (timeout: 7000ms) EID 42
 NSOCK INFO [13.3750s] nsock_trace_handler_callback(): Callback: READ
  SUCCESS for EID 42 [127.0.0.1:9050] (195 bytes)
 NSE: TCP 127.0.0.1:37151 < 127.0.0.1:9050 | 00000000: 48 54 54 50 2f
 31 2e 31 20 32 30 30 20 4f 4b 0d HTTP/1.1 200 OK
 NSE: TCP 127.0.0.1:37151 > 127.0.0.1:9050 | CLOSE
 NSOCK INFO [13.3750s] nsock_iod_delete(): nsock_iod_delete (IOD #1)
 Nmap scan report for 0xdeadbeefcafe.com (52.20.139.72)
 Host is up (0.061s latency).
 PORT STATE SERVICE
 80/tcp open http
 |_http-title: Site doesn't have a title (text/html).
 Nmap done: 1 IP address (1 host up) scanned in 13.38 seconds
 

还有更多...

此功能仅支持 HTTP 和 SOCKS4 代理。暂不支持身份验证。

代理链

代理链工具 (http://proxycha ins.sourceforge.net/)是通过代理中继我们的扫描的另一种选择。如果您在使用官方功能时遇到问题,请查看该工具,但不要忘记创建一份错误报告来描述您的问题。

14、欺骗扫描的源 IP

空闲扫描是一种非常强大的技术,Nmap 利用具有可预测 IP ID 序列号的空闲主机来欺骗端口扫描的源 IP。

本食谱说明了如何找到僵尸主机,并在使用Nmap扫描远程主机时利用它们欺骗你的IP地址。

做好准备

要启动空闲扫描,我们需要一台僵尸主机。僵尸主机是一台具有可预测 IP ID 序列号的机器,它将被用作欺骗 IP 地址。好的候选主机必须不与其他主机通信,以保持正确的 IP ID 序列号,避免误报。

要查找具有递增 IP ID 序列的主机,可以使用如下的 ipidseq 脚本:

#nmap -p80 --script ipidseq <your ip>/24 
#nmap -p80 --script ipidseq -iR 1000 

可能的候选结果将在脚本的输出部分返回递增:

 Host is up (0.28s latency). 
 PORT STATE SERVICE 
 80/tcp open http 
 Host script results: 
 |_ipidseq: Incremental! 

如何做...

  1. 要启动空闲扫描,请打开终端并键入以下命令:

    #nmap -Pn -sI <zombie host> <target> 
    
  2. 输出结果类似于下面的内容:

    Idle scan using zombie 93.88.107.55 (93.88.107.55:80); Class: Incremental 
    Nmap scan report for meil.0xdeadbeefcafe.com (106.187.35.219) 
    Host is up (0.67s latency). 
    Not shown: 98 closed|filtered ports 
    PORT STATE SERVICE 
    465/tcp open smtps 
    993/tcp open imaps 
    993/tcp open imaps 
    
  3. 如果僵尸主机符合前面讨论过的要求,闲置扫描应该可以正常工作。如果有什么地方没有达到预期效果,返回的错误信息应该能让你知道出了什么问题:

    Idle scan zombie XXX.XXX.XX.XX (XXX.XXX.XX.XX) port 80 cannot be used because it has not   returned any of our probes -- perhaps it is down or firewalled. 
    QUITTING! 
    Idle scan zombie 0xdeadbeefcafe.com (50.116.1.121) port 80 cannot 
    be used because IP ID sequencability class is: All zeros. 
    Try another proxy. 
    QUITTING! 
    

工作原理...

空闲扫描最初是由 Salvatore Sanfilipo(hping 的作者)于 1998 年创建的。它是一种巧妙而隐蔽的扫描技术,通过伪造数据包和分析空闲主机(通常称为僵尸主机)的 IP ID 序列号来欺骗源 IP。

使用 -sI 标记可以告诉 Nmap 使用 作为源 IP 启动空闲端口扫描。空闲扫描的工作方式如下:

  1. Nmap 确定僵尸主机的 IP ID 序列。
  2. Nmap 向目标发送一个伪造的 SYN 数据包,就好像它是由僵尸主机发送的一样。
  3. 如果端口开放,目标发送 SYN/ACK 数据包,并向僵尸主机增加其 IP ID 序列号。
  4. Nmap 分析僵尸主机 IP ID 序列号的增量,查看是否收到目标主机的 SYN/ACK 数据包,并确定端口状态。

还有更多...

只有正确选择目标,空闲扫描技术才能发挥作用。让我们回顾一下与 IP ID 序列号有关的一些重要概念,看看如何选择最佳僵尸主机。

明智选择僵尸主机

与僵尸计算机通信的其他主机会增加其 IP ID 序列号,从而导致扫描中出现误报。因此,只有当僵尸主机处于空闲状态时,这种技术才会起作用。因此,做出正确的选择至关重要。

同样重要的是,你必须查明 ISP 是否主动过滤欺骗数据包。如今,许多 ISP 都会阻止甚至修改欺骗数据包,将欺骗地址替换为真实 IP 地址,从而使该技术失去作用,因为目标会收到你的真实地址。不幸的是,Nmap 无法检测到这种情况,这可能会让您认为您在扫描主机时没有留下任何痕迹,而实际上您的所有数据包都在发送您的真实源 IP 地址。

IP ID 序列号

IP 头中的 ID 字段主要用于跟踪数据包以进行重新组装,但由于许多系统以不同的方式执行此编号,因此安全爱好者利用它来对这些系统进行指纹识别、分析和收集信息。

家用路由器、打印机、IP 网络摄像头和底层设备通常使用增量 IP ID 序列号,是用作僵尸主机的最佳选择。此外,它们在大部分时间都处于闲置状态,这也是闲置扫描的一个重要要求。要查明主机是否有增量 IP ID 序列,有两种选择:

  • 使用操作系统检测的 "冗长 "模式,如下所示:

    #nmap -sV -v -O <target> 
    
  • 使用 Kriss Katterjon 的 NSE 脚本 ipidseq 如下:

    $nmap -p80 --script ipidseq <target>