大多数了解网络扫描器的人,应该都听说过 Nmap 这个名字。如果要评选最优秀的扫描工具,或者最顶尖的黑客利器,Nmap 绝对榜上有名。

Nmap 是一款免费、开源的扫描工具,拥有卓越的网络资产扫描能力。除了常见的端口扫描,Nmap 还支持操作系统识别、服务识别。通过其内置的探针和指纹库,可以准确识别绝大多数操作系统和应用服务指纹。

此外,Nmap 支持高度可扩展的脚本功能,内置了大量社区贡献的脚本,且通过 Lua 编写插件极为方便。因此,很多扫描器都会集成 Nmap 的扫描功能。

下面结合实际工作,分享一些在使用 Nmap 扫描时遇到的坑和注意点:


1. 默认开启 Ping 扫描的问题

Nmap 默认会先进行 Ping 扫描以发现活跃主机,但如果目标主机禁用了 Ping(ICMP)响应,那么后续的端口扫描将无法进行。

这是一个非常常见的问题,很多人在使用 Nmap 时,会加上 -Pn 参数,关闭 Ping 探测,强制对目标进行端口扫描。

但是在集成 Nmap 到扫描器或自动化工具时,有时候又必须依赖 Ping 来做主机发现,这时就会遇到矛盾,需要根据具体场景灵活处理。


2. 关于 tcp-wrapper 的处理

如果你在 Nmap 输出结果中看到“tcp-wrapper”服务,很可能是遇到了这种情况:

Nmap 与目标主机完成 TCP 三次握手后,如果目标主机立即发送一个 FIN 包主动断开连接,Nmap 会认为该主机被 tcp-wrapper 防护,随即结束扫描。

这段逻辑的源码(nmap-v7.93)位于 service_scan.cc 文件中:

static void servicescan_read_handler(nsock_pool nsp, nsock_event nse, void *mydata) {
    // ... ...
    if (svc->tcpwrap_possible && probe->isNullProbe() && readstrlen == 0 && svc->probe_timemsused(probe) < probe->tcpwrappedms) {
      // TODO:  Perhaps should do further verification before making this assumption
      end_svcprobe(nsp, PROBESTATE_FINISHED_TCPWRAPPED, SG, svc, nsi);
    } else {
      // Perhaps this service didn't like the particular probe text.
      // We'll try the next one
      startNextProbe(nsp, nsi, SG, svc, true);
    }
    // ... ...
}

可以看到,这里并没有做更细致的处理。


3. 遇到“全部端口开放”的防火墙

在使用 Nmap 做扫描时,经常碰到一种防火墙策略:对任意端口都返回开放状态,但进一步的服务识别却会一直卡住。

下面是一段用 Python+Scapy 模拟这种情况的代码示例:

from scapy.all import *
import os

os.system("iptables -A OUTPUT -p tcp -o enp1s0 --sport 50000:65535 --tcp-flags RST RST -j DROP")
def packet(pkt):
    if pkt[TCP].flags == 2:
        print('SYN packet detected port : ' + str(pkt[TCP].sport) + ' from IP Src : ' + pkt[IP].src)
        send(IP(dst=pkt[IP].src, src=pkt[IP].dst)/TCP(dport=pkt[TCP].sport, sport=pkt[TCP].dport,ack=pkt[TCP].seq + 1, flags='SA'))
sniff(iface="enp1s0", prn=packet, filter="tcp[0xd]&18=2",count=100)
os.system("iptables -D OUTPUT -p tcp -o enp1s0 --sport 1:65535 --tcp-flags RST RST -j DROP")

在遇到这类情况时,需要识别并标记为防火墙,然后在后续扫描逻辑中做特殊处理,避免长时间卡顿。 总之,Nmap 功能强大但并非完美,结合实际网络环境灵活调整参数和处理异常,才能更高效地完成资产扫描工作。