4. 信息收集(下):主动信息收集

上一章我们聊了被动信息收集,说白了就是「偷偷看,不碰目标」。这一章正好反过来——主动信息收集,就是我们要直接跟目标系统「打招呼」,看它怎么回应。你想想看,你去敲一扇门,门开了,你就能看到里面大概什么样;门没开,你也能从门缝里听到点动静。Nmap 就是干这个的。

我个人习惯,每次做渗透测试,第一件事就是打开 Nmap。不是因为它多牛,而是因为它快、准、狠。今天我们就把它掰开揉碎了讲清楚。

4.1 Nmap 端口扫描:你家的门都开着吗?

端口是什么?你可以把它想象成房子的大门。80 是客厅门,22 是后门,443 是车库门。Nmap 就是那个挨个敲门的人。

4.1.1 扫描模式对比

扫描类型 命令示例 特点 适用场景
TCP Connect 扫描 nmap -sT target 完整三次握手,速度慢但稳定 普通用户权限,无特殊限制
SYN 半开扫描 nmap -sS target 只发 SYN,收 SYN/ACK 就 RST 默认模式,速度快,隐蔽性较好
UDP 扫描 nmap -sU target 发 UDP 包,等 ICMP 不可达 检测 DNS、SNMP 等 UDP 服务
FIN/Null/Xmas 扫描 nmap -sF / -sN / -sX 发异常标志位,绕过部分防火墙 绕过非严格状态检测的防火墙
我的经验: 实战中我 90% 的情况只用 -sS。有一次遇到一个 WAF,SYN 扫描全被拦截,换成 -sT 反而通了。嗯,别死板,多试几种。

4.1.2 实战扫描示例

假设我们要扫描一个内网目标 192.168.1.100,看看它开了哪些门。

# 快速扫描常见端口
nmap -sS -T4 192.168.1.100

# 扫描全端口(1-65535),但慢
nmap -sS -p- 192.168.1.100

# 指定端口范围
nmap -sS -p 22,80,443,3306,8080 192.168.1.100

# 扫描并检测版本
nmap -sV -p 80,443 192.168.1.100
注意: 全端口扫描很慢。我曾经对一个 C 段做全端口扫描,跑了 6 个小时。建议先用常见端口列表扫一轮,再针对性地扫全端口。

4.2 服务识别:门后面是什么?

知道端口开了,还不够。你得知道门后面站的是谁——是 Apache 还是 Nginx?是 OpenSSH 还是 Dropbear?

Nmap 的 -sV 参数就是干这个的。它会发送特定的探测包,根据返回的 banner 信息判断服务类型和版本。

4.2.1 服务识别命令

# 基础版本探测
nmap -sV 192.168.1.100

# 激进版本探测(更准,但更慢)
nmap -sV --version-intensity 9 192.168.1.100

# 轻量版本探测
nmap -sV --version-intensity 2 192.168.1.100

关键点: 版本号是漏洞利用的钥匙。知道 Apache 2.4.49,你就能直接搜到对应的 CVE。我遇到过很多次,目标开了 8080 端口,版本探测显示是 Tomcat 8.5.0,直接拿 CVE-2017-12617 打进去了。

4.2.2 常见服务指纹特征

服务 默认端口 Banner 特征 常见漏洞
Apache HTTP 80 Apache/2.4.41 (Unix) 路径遍历、解析漏洞
Nginx 80 nginx/1.18.0 CRLF 注入、目录穿越
OpenSSH 22 SSH-2.0-OpenSSH_7.9 弱口令、漏洞利用
MySQL 3306 mysql_native_password 弱口令、未授权访问
避坑指南: 我曾经遇到一个目标,Nmap 报的是 Apache 2.4.6,但实际是 Nginx 反代。为什么?因为 Nmap 只看到了反代层的 banner。这时候要用 -sV --script=http-title 或者直接 curl 看响应头。

4.3 操作系统指纹识别:你是什么系统?

知道服务版本还不够,你还要知道目标跑的是什么操作系统。Windows 和 Linux 的漏洞利用方式完全不同。

Nmap 通过 -O 参数做 OS 指纹识别。原理是发送一系列特殊的 TCP 包,分析目标返回的 IP 头 TTL、窗口大小、TCP 选项等特征,然后跟数据库比对。

4.3.1 OS 识别命令

# 基础 OS 识别
nmap -O 192.168.1.100

# 结合端口扫描和版本探测
nmap -sS -sV -O 192.168.1.100

# 激进 OS 识别(更准)
nmap -O --osscan-guess 192.168.1.100

4.3.2 常见 OS 指纹特征

操作系统 TTL 默认值 窗口大小 TCP 选项特征
Windows 10/11 128 65535 支持 SACK、WScale
Linux (Kernel 5.x) 64 29200 支持 SACK、WScale、Timestamp
macOS 64 65535 支持 SACK、WScale
Cisco IOS 255 4128 不支持 SACK
注意: OS 识别不是 100% 准确的。防火墙、负载均衡器、VPN 都会修改 TTL 值。我遇到过一台机器,Nmap 报的是 Linux,但实际上是 Windows 跑了 WSL。别全信,要交叉验证。

4.4 Nmap 脚本引擎:自动化漏洞探测

Nmap 最强大的功能之一就是 NSE(Nmap Scripting Engine)。它内置了数百个脚本,可以自动做漏洞探测、暴力破解、服务枚举等。

4.4.1 常用脚本分类

脚本类别 示例脚本 功能
安全检测 http-vuln-cve2017-5638 检测 Struts2 漏洞
暴力破解 ssh-brute SSH 弱口令爆破
服务枚举 dns-zone-transfer DNS 区域传输检测
信息泄露 http-git 检测 .git 目录泄露
# 使用默认脚本扫描
nmap -sC 192.168.1.100

# 指定脚本
nmap --script=http-vuln-cve2017-5638 192.168.1.100

# 使用多个脚本
nmap --script=http-vuln*,ssh-brute 192.168.1.100
我的习惯: 每次扫描我都会加 -sC,它相当于 --script=default,能自动跑最常用的脚本。有一次扫描一个内网 Web 服务器,-sC 直接发现了 http-git 脚本报的 .git 泄露,我直接下载源码,找到了数据库密码。

4.5 主动信息收集知识体系

下面这张图是我自己整理的主动信息收集流程,你可以把它当作一个检查清单。

主动信息收集流程 主动信息收集流程 目标 IP/域名 端口扫描(-sS / -sT / -sU) 服务识别(-sV) OS 指纹识别(-O) NSE 脚本扫描(-sC / --script) 输出结果(-oN / -oX / -oG) 提示:每次扫描都保存结果,方便后续分析和报告编写

4.6 实战综合命令

最后,给你一个我常用的「一条龙」命令,覆盖端口扫描、服务识别、OS 识别和脚本扫描:

nmap -sS -sV -O -sC -T4 -p 1-10000 -oA scan_result 192.168.1.100

参数说明:

  • -sS:SYN 半开扫描
  • -sV:版本探测
  • -O:OS 识别
  • -sC:默认脚本扫描
  • -T4:时间模板,速度适中
  • -p 1-10000:扫描前 10000 个端口
  • -oA scan_result:输出所有格式(nmap、xml、grepable)

核心总结: 主动信息收集不是一次性的。先扫常见端口,再扫全端口;先做版本探测,再做脚本扫描。每一步的结果都可能影响下一步的方向。我见过太多人上来就扫全端口,结果被防火墙封了 IP。记住,渗透测试是艺术,不是蛮力。