第3章 主动信息收集:Nmap端口扫描与服务版本探测
端口扫描?说白了就是敲门。你想知道目标开了哪些门、每个门后面跑着什么服务。
Nmap 是这行当里的老大哥。我入行时学的第一个工具就是它,十多年过去了,它依然能打。今天咱们就把端口扫描和服务版本探测这块掰开揉碎。
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:
| 模板 | 名称 | 每秒发包数 | 推荐场景 |
|---|---|---|---|
| -T0 | Paranoid | 极低 | IDS/IPS严格的环境 |
| -T1 | Sneaky | 低 | 避免触发告警 |
| -T2 | Polite | 中等 | 一般内网渗透 |
| -T3 | Normal | 默认 | 学习测试 |
| -T4 | Aggressive | 较高 | 快速扫描 |
| -T5 | Insane | 极高 | 仅用于演示环境 |
建议对生产环境用 -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 实战中的命令行组合
以下是我平时用的几种典型组合,供你参考:
- 快速存活检测:
nmap -sn 192.168.1.0/24 - 常见端口扫描 + 版本探测:
nmap -sS -sV -T4 --top-ports 100 192.168.1.1 - 全端口扫描 + 详细输出:
nmap -sS -sV -p- -T2 -oA fullscan 10.0.0.5 - 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的端口扫描和版本探测,你就算迈进了主动信息收集的大门。把这些命令练熟,后面章节我们再聊更深入的服务识别和指纹收集。