关于UDP端口扫描概述

发布于:2025-04-02 ⋅ 阅读:(29) ⋅ 点赞:(0)

尽管互联网上大多数流行服务都基于 TCP 协议运行,但 UDP 服务也广泛部署。DNS、SNMP 和 DHCP(注册端口 53、161/162 和 67/68)是最常见的服务之一。

由于 UDP 扫描通常比 TCP 扫描更慢、更困难,一些安全审计人员可能会忽略这些端口。这是一个错误,因为可利用的 UDP 服务非常普遍,攻击者也不会忽视整个协议。幸运的是,Nmap 可以帮助清查 UDP 端口。

通过 -sU 选项激活 UDP 扫描。它可以与 TCP 扫描类型(如 SYN 扫描 -sS)结合使用,在同一次运行中检查两种协议。

UDP 扫描通过向每个目标端口发送 UDP 数据包来工作。对于大多数端口,这个数据包将是空的(没有负载),但对于一些更常见的端口,会发送特定于协议的负载。根据响应(或没有响应),端口被分配到四种状态之一,如下表所示。

表 1.1. Nmap 如何解释 UDP 探测响应

探测响应 分配状态
来自目标端口的任何 UDP 响应(不寻常) open(开放)
没有收到响应(即使经过重传) open|filtered(开放或被过滤)
ICMP 端口不可达错误(类型 3,代码 3) closed(关闭)
其他 ICMP 不可达错误(类型 3,代码 1、2、9、10 或 13) filtered(被过滤)

这个表格中最令人好奇的元素可能是 open|filtered 状态。它是 UDP 扫描最大挑战的症状:开放端口很少响应空探测。那些 Nmap 有特定协议负载的端口更有可能收到响应并被标记为 open,但对于其余端口,目标 TCP/IP 栈只是将空数据包传递给监听应用程序,后者通常会立即丢弃它作为无效数据。如果所有其他状态的端口都会响应,那么可以通过排除法推断出开放端口。不幸的是,防火墙和过滤设备也已知会在没有响应的情况下丢弃数据包。因此,当 Nmap 在多次尝试后没有收到响应时,它无法确定端口是 open 还是 filtered

在 Nmap刚 发布时,过滤设备比较少见,以至于 Nmap 可以(并且确实)假设端口是 open。现在随着互联网更好的进行防护,所以 Nmap 在 2004 年(版本 3.70)改变为将无响应的 UDP 端口报告为 open|filtered

 nmap -sU -v 192.168.1.123
 ​
 Starting Nmap ( https://nmap.org )
 Nmap scan report for 192.168.1.123
 (The 997 ports scanned but not shown below are in state: closed)
 PORT    STATE         SERVICE
 53/udp  open|filtered domain
 67/udp  open|filtered dhcpserver
 111/udp open|filtered rpcbind
 MAC Address: 00:02:E3:14:11:02 (Lite-on Communications)
 ​
 Nmap done: 1 IP address (1 host up) scanned in 999.25 seconds

扫描展示了 open|filtered 模糊问题以及另一个问题:UDP 扫描可能很慢。

Nmap 提供了绕过这两个问题的方法,如下两节所述。

区分开放和被过滤的 UDP 端口

案例中,除了三个 open|filtered 端口外,其他所有端口都是 closed。因此,扫描成功地将可能开放的端口缩小到少数几个。情况并非总是如此。如下展示了针对192.168.1.223的 UDP 扫描。

 krad# nmap -sU -T4 192.168.1.223
 ​
 Starting Nmap ( https://nmap.org )
 All 1000 scanned ports on 192.168.1.223 are open|filtered
 ​
 Nmap done: 1 IP address (1 host up) scanned in 5.50 seconds

在这种情况下,扫描并未缩小开放端口的范围。所有 1000 个端口都是 open|filtered。需要新的策略。

表 1.1,“Nmap 如何解释 UDP 探测响应” 显示 open|filtered 状态发生在 Nmap 向特定端口发送 UDP 探测后未收到任何响应时。它还显示,当 Nmap 收到 open|filtered 端口的响应时,状态将更改为 open。原因这些服务很少响应是因为 Nmap 发送的空数据包被认为是无效的。不幸的是,UDP 服务通常定义自己的数据包结构,而不是遵循 Nmap 可以始终发送的某种通用格式。一个 SNMP 数据包与 SunRPC、DHCP 或 DNS 请求数据包完全不同。

为了向每个流行的 UDP 服务发送正确的数据包,Nmap 需要一个大型数据库来定义探测格式。幸运的是,Nmap 有 nmap-service-probes,这是服务和版本检测子系统的一部分,将在第 7 章,“服务和应用程序版本检测” 中描述。

当通过 -sV(或 -A)启用版本扫描时,它将向每个 open|filtered 端口(以及已知的 open 端口)发送 UDP 探测。如果任何探测从 open|filtered 端口收到响应,状态将更改为 open。在 192.168.1.123扫描中添加 -sV 的结果如下所示。

 krad# nmap -sUV -F 192.168.1.123
 ​
 Starting Nmap ( https://nmap.org )
 Nmap scan report for 192.168.1.123
 Not shown: 997 closed ports
 PORT    STATE         SERVICE    VERSION
 53/udp  open          domain     ISC BIND 9.2.1
 67/udp  open|filtered dhcpserver
 111/udp open          rpcbind    2 (rpc #100000)
 MAC Address: 00:02:E3:14:11:02 (Lite-on Communications)
 ​
 Nmap done: 1 IP address (1 host up) scanned in 1037.57 seconds

这个新的扫描显示端口 111 和 53 肯定是开放的。系统并不完美——端口 67 仍然是 open|filtered

我们可以推测,端口是开放的,但 Nmap 没有适用于 DHCP 的有效版本探测。

另一个棘手的服务是 SNMP,它通常只有在提供正确的Community(社区字符串)时才会响应。许多设备配置了社区字符串 public,但并非全部。虽然这些结果并不完美,但能够确定两个测试端口中的两个的真实状态仍然很有帮助。

而对于192.168.11.230,使用版本检测改进 UDP 扫描结果:

 nmap -sUV -T4 192.168.11.230
 ​
 Starting Nmap ( https://nmap.org )
 Nmap scan report for 192.168.11.230
 Not shown: 999 open|filtered ports
 PORT   STATE SERVICE VERSION
 53/udp open  domain  ISC BIND 9.3.4
 ​
 Nmap done: 1 IP address (1 host up) scanned in 3691.89 seconds

提示信息:

之前端口扫描192.168.11.230花费了5秒,使用版本检测改进UDP扫描花费了1个小时。Nmap 版本 5.10BETA1 及更高版本有一个负载系统,如果选择进行端口扫描或主机发现,它会向 30 多个知名的 UDP 端口发送正确的服务协议请求。虽然它不如版本检测全面,但它会迅速识别192.168.11.230中的开放端口 53。

提高 UDP 扫描速度

UDP 扫描的另一个主要挑战是提高其速度。开放和被过滤端口很少发送响应,导致 Nmap 超时并进行重传,以确保数据包未丢失。关闭端口往往是一个更大的问题,它们通常会发送 ICMP 端口不可达错误。但与 TCP 中关闭端口对 SYN 或 connect 扫描发送 RST 数据包不同,许多主机默认对 ICMP 端口不可达消息进行速率限制。Linux 和 Solaris 在这方面尤为严格。例如,192.168.1.123上的 Linux 2.4.20 内核将目的地不可达消息限制为每秒一个(在 net/ipv4/icmp.c 中)。这解释了为什么示例 5.4 中的扫描如此缓慢。

Nmap 检测到速率限制并相应地降低速度,以避免发送网络无法处理的无用数据包。然而,对于 Linux 风格的每秒一个数据包限制,扫描 65,536 个端口需要超过 18 小时。以下是一些提高 UDP 扫描性能的建议。此外,第 6 章“优化 Nmap 性能”中还提供了更详细的讨论和一般性建议

  • 增加主机并行性

如果 Nmap 从单个目标主机每秒仅收到一个端口不可达错误,它可以通过同时扫描多个主机(例如 100 个)来每秒接收 100 个响应。通过向 --min-hostgroup 传递大值(例如 100)来实现这一点。

  • 先扫描常见端口

非常少的 UDP 端口号被广泛使用。使用 -F 选项扫描最常见的 100 个 UDP 端口将快速完成。你可以在后台启动对网络的多天 65K 端口扫描,同时处理这些结果。

在版本检测扫描中添加 --version-intensity 0

如前所述,版本检测(-sV)通常需要区分开放和被过滤的 UDP 端口。版本检测相对缓慢,因为它涉及向每个 openopen|filtered 端口发送大量特定于应用程序协议的探测。指定 --version-intensity 0 可以指示 Nmap 仅尝试最有可能对特定端口号有效的探测。它通过使用 nmap-service-probes 文件中的数据来实现这一点。这种选项的性能影响是显著的,如本节后面的示例所示。

  • 从防火墙内部扫描

与 TCP 一样,包过滤器会显著减慢扫描速度。许多现代防火墙使设置包速率限制变得容易。如果可以通过从防火墙内部而不是跨防火墙发起扫描来绕过此问题,请这样做。

  • 使用 --host-timeout 跳过慢速主机

受到 ICMP 速率限制的主机可能比那些对每个探测都快速响应的主机需要多个数量级的时间来扫描。指定最大扫描时间(例如 15m 表示 15 分钟)会导致 Nmap 在超出该时间后放弃扫描单个主机。这使你可以快速扫描所有响应迅速的主机。你可以在后台处理这些慢速主机。

  • Use -v and chill out

启用冗长输出(-v)后,Nmap 会提供每个主机的预计扫描完成时间。无需密切监视它。去睡一觉,去你最喜欢的酒吧,看书,完成其他工作,或者以其他方式娱乐自己,同时让 Nmap 不知疲倦地为你扫描。

一个完美的提高 UDP 扫描速度的例子是示例 如下,我们再次运行了该扫描。这次添加了 -F --version-intensity 0 选项,将一个小时的扫描时间缩短至 13 秒!然而,同样的关键信息(53 端口上的 ISC Bind 守护进程)被检测到。

 nmap -sUV -T4 -F --version-intensity 0 192.168.11.230
 ​
 Starting Nmap ( https://nmap.org )
 Nmap scan report for 192.168.11.230
 Not shown: 99 open|filtered ports
 PORT   STATE SERVICE VERSION
 53/udp open  domain  ISC BIND 9.3.4
 ​
 Nmap done: 1 IP address (1 host up) scanned in 12.92 seconds

网站公告

今日签到

点亮在社区的每一天
去签到