第3章 主动信息收集:Nmap端口扫描与服务版本探测

端口扫描?说白了就是敲门。你想知道目标开了哪些门、每个门后面跑着什么服务。

Nmap 是这行当里的老大哥。我入行时学的第一个工具就是它,十多年过去了,它依然能打。今天咱们就把端口扫描和服务版本探测这块掰开揉碎。

Nmap端口扫描与服务探测流程 指定目标IP 选择扫描类型 -sS / -sT / -sU / -sA 端口范围 -p 1-65535 服务版本探测 -sV NSE脚本扫描 --script 输出分析结果 避坑提示: 不要对未授权目标扫全端口 UDP扫描非常慢请耐心等 版本探测会增加网络流量 记得检查防火墙规则 我的经验: 先用 -sn 快速判断存活主机 再扫常见端口 1-1000 最后才全端口 + 版本探测

3.1 端口扫描的核心思路

端口就是操作系统里的数字标签。每个网络服务都会绑定一个端口,等着别人来连。你想想看,如果不知道目标开了哪些端口,后面的渗透无从下手。

Nmap 通过向目标端口发送精心构造的包,根据回包来判断端口状态:

端口状态含义典型场景
open端口开放,有应用在监听发现Web服务、数据库等
closed端口关闭,无应用监听目标系统已拒绝连接
filtered被防火墙或ACL过滤包被丢弃,无响应
unfiltered能访问但状态不确定ACK扫描常见
open|filtered开放或被过滤UDP扫描时常见

我在实战里踩过坑:有一次扫描内网服务器,死活只看到几个端口,后来发现是因为防火墙只放行了特定源的ICMP。所以光看nmap输出不一定准,要多验证。

3.2 常用扫描类型与选型建议

Nmap 提供了十几种扫描方式。我平时常用的就这几样:

  • -sS (TCP SYN Scan): 半开扫描,速度最快,隐蔽性较好。也是我的首选。原理是发SYN包,收到SYN+ACK就判定开放,然后发RST断开。
  • -sT (TCP Connect Scan): 完整三次握手。如果你没有root权限,Nmap会自动降级成这个。慢很多,但兼容性好。
  • -sU (UDP Scan): 扫描UDP端口。我说实话,这个很慢,因为UDP无状态,通常要等超时。我个人习惯先扫TCP,如果发现关键应用再针对性扫UDP。
  • -sA (ACK Scan): 用来绕过防火墙判断规则。无法直接判断端口是否开放,但可以看是否被过滤。

3.3 扫描速度与性能控制

千万别上来就用默认参数扫全端口,尤其是目标在国内的生产环境。我曾经有一次忘了加 -T 参数,结果把客户的人脸识别系统扫挂了……原因就是发包太猛。

Nmap 内置了6个时间模板(-T0~T5),从 Paranoid 到 Insane:

模板名称每秒发包数推荐场景
-T0Paranoid极低IDS/IPS严格的环境
-T1Sneaky低避免触发告警
-T2Polite中等一般内网渗透
-T3Normal默认学习测试
-T4Aggressive较高快速扫描
-T5Insane极高仅用于演示环境

建议对生产环境用 -T2 或 -T3,加上 --max-retries 1 减少重试次数:

nmap -sS -T2 --max-retries 1 -p 1-10000 192.168.1.1

3.4 服务版本探测 -sV

端口开放了,但它里面跑的是什么服务?版本号多少?这就是 -sV 的活儿。

Nmap 会连接目标端口,发送探测包,然后比对返回的banner特征库。特征库在 nmap-service-probes 文件里,定期更新就行。

我举个实际例子,扫描一台Windows Server:

nmap -sV -p 445 192.168.1.100

输出大概长这样:

PORT    STATE SERVICE     VERSION
445/tcp open  microsoft-ds Microsoft Windows Server 2019 Datacenter 1809

版本探测不是万能的。有些自定义服务或加了WAF的应用会隐藏版本信息。遇到这种情况,我一般配合 --script banner 手动触发banner抓取。

3.5 NSE脚本引擎

Nmap 最强大的功能之一就是脚本引擎(NSE)。它用Lua编写,能扩展扫描能力。

常用的脚本分类:

  • auth: 认证绕过、弱口令检测
  • dos: DoS测试(慎用!)
  • exploit: 利用已知漏洞
  • fuzzer: 模糊测试
  • vuln: 漏洞检测

比如检测SMB永恒之蓝:

nmap --script smb-vuln-ms17-010 -p 445 192.168.1.100

我习惯先扫开放端口,再用脚本深入。不要一上来就跑所有脚本,慢不说还容易出事。有一次我扫一个内网打印机,跑了个 --script default,结果打印机直接死机……

3.6 实战中的命令行组合

以下是我平时用的几种典型组合,供你参考:

  1. 快速存活检测:
    nmap -sn 192.168.1.0/24
  2. 常见端口扫描 + 版本探测:
    nmap -sS -sV -T4 --top-ports 100 192.168.1.1
  3. 全端口扫描 + 详细输出:
    nmap -sS -sV -p- -T2 -oA fullscan 10.0.0.5
  4. UDP扫描(特定端口):
    nmap -sU -p 53,161,123 10.0.0.5

小技巧: 用 -oX 输出XML格式,方便导入漏洞扫描器或做自动化处理。我常在渗透测试报告里直接用nmap的XML转成表格。

警告: 千万不要在未授权的情况下对公网IP进行全端口扫描,可能会触发云厂商的DDoS告警。我曾经在AWS上扫自己的测试实例,结果安全组自动封了我24小时。

3.7 常见避坑清单

做主动信息收集这些年,我把踩过的坑总结了一下,大概就这几条:

  • 防火墙干扰: 有些防火墙会随机丢弃SYN包,导致Nmap误判。解决办法:换用 -sA 或 -sW 扫描,或者用不同源IP测试。
  • 端口号偏移: 有些服务监听在非标准端口(比如Apache跑在8080),一开始只扫默认端口会漏掉。建议先扫top 1000。
  • 误判开放: 部分设备会主动回应所有SYN包(比如某些UPS设备),导致误报。需要二次确认。
  • 带宽占用: 全端口扫描会产生大量流量,尤其是在慢速网络环境下。建议限制速率:--max-rate 100。

嗯,今天就到这儿。掌握了Nmap的端口扫描和版本探测,你就算迈进了主动信息收集的大门。把这些命令练熟,后面章节我们再聊更深入的服务识别和指纹收集。