在进行 TCP 端口扫描时,我注意到在一些评估中,Nmap 将报告几乎每个端口都为机器打开。
例如nmap -sS -PN -T4 target -p0-65535
,超过 20,000 个端口将返回为打开状态。在进一步调查中,这些端口中的大多数都没有打开,甚至没有被过滤。
是什么导致 Nmap 认为端口打开,是否有不同类型的扫描可以解决这个问题并给出更准确的结果?
在进行 TCP 端口扫描时,我注意到在一些评估中,Nmap 将报告几乎每个端口都为机器打开。
例如nmap -sS -PN -T4 target -p0-65535
,超过 20,000 个端口将返回为打开状态。在进一步调查中,这些端口中的大多数都没有打开,甚至没有被过滤。
是什么导致 Nmap 认为端口打开,是否有不同类型的扫描可以解决这个问题并给出更准确的结果?
您很可能遇到了配置良好的 IDS/IPS 设备。
snort可以使用sfPortscan过滤器轻松检测正在进行的端口扫描(-sS 实际上是“正在进行的端口扫描”签名),除了记录您的攻击之外,它还可以配置为执行主动响应。这些响应可以像向您发送 RST 一样简单,也可以像“ react ”规则一样丰富。“react”响应的默认行为是响应HTTP 403 Forbidden
消息,但他们也可以将其配置为发送所需的任意数据。反应行为也不限于端口 80 请求。无论端口号如何, snort 都会发送回复。
为了测试这个理论,在对目标进行端口扫描时,从进行扫描的同一台机器上,尝试使用浏览器或 netcat 打开该目标上的任何旧端口。如果您从非 HTTP 端口收到 HTTP 403 Forbidden 响应,则很可能发生了这种情况。
我猜 nmap 不会解释响应,它只报告套接字连接已建立,因此它将它作为开放端口报告给您。但是,您可以--packet-trace
在 nmap 上设置选项以查看实际返回的内容,而不是猜测。
您可以在此处阅读 snort 手册。
你有几个选择。我的第一个想法是可能有一个中间系统通过 SYN/ACK 数据包响应禁止(防火墙)端口。如果是这种情况,您可能能够通过响应的 TTL 来区分真正打开的端口。如果您保存了扫描的XML 输出(-oX
或-oA
),则可以检查该//port/state/@reason_ttl
属性。这类似于“走火”的技术。您可以在此处找到一些相关信息:Firewalking with nmap。
另一种选择是使用不同的扫描类型。Nmap 的 SYN 扫描(-sS
或以 root 身份扫描时的默认值)可以通过 TCP 选项、MSS 和窗口大小来检测,因此 IDS/IPS 可能会对此做出响应。请尝试改用 TCP 连接扫描 ( -sT
)。其他扫描类型(ACK、FIN、Maimon 等)可用于过滤您的结果;他们不会自己显示打开的端口,但他们可以将这些“开放”端口中的一些标记为防火墙,或者至少显示它们的行为不同。不过在这里要小心,因为它们会发送非常明显的“坏”数据包,并且依赖于现代操作系统中不常见的行为。
最后,您可以使用 Nmap 的服务版本检测( -sV
) 来识别“开放”端口后面的服务。误报很可能会在打开连接后很快超时或发送 RST 以关闭连接。这会大大减慢您的扫描速度,但有时准确很重要。我建议从 开始--version-intensity 0
,它将简单地进行横幅抓取,并且可能会标记到被扫描的特定端口的任何探针,而不是默认的,它执行此操作和最多 8 个其他测试。
有一种混淆技术,服务器模拟几乎所有要打开的端口,理想情况下模拟大多数这些端口上的有效服务签名。
例如, Portspoof实现了这种方法并处理了 8000 多个服务签名。
我也有同样的事情发生在我身上。是 Snort 造成的。将-f
和--badsum
开关添加到 nmap 允许我绕过 IDS/IPS。完整的命令如下:
nmap -sS -p 1-65535 -f --badsum -vv -Pn -oA target_nmap target