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 |
发异常标志位,绕过部分防火墙 | 绕过非严格状态检测的防火墙 |
-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
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 |
弱口令、未授权访问 |
-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 |
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 主动信息收集知识体系
下面这张图是我自己整理的主动信息收集流程,你可以把它当作一个检查清单。
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。记住,渗透测试是艺术,不是蛮力。