Nmap 服务识别与脚本扫描
Nmap (Network Mapper) 是渗透测试中最核心的侦察工具。RustScan 负责快速发现开放端口,Nmap 则负责对这些端口做服务版本识别、脚本探测和 OS 检测。几乎所有靶场打靶的第二步都是 Nmap。
安装
Kali Linux
Kali 默认已预装,无需额外安装。
Debian / Ubuntu
sudo apt update && sudo apt install -y nmap
macOS
brew install nmap
Windows
从 官方下载页 下载安装包,或使用 winget:
winget install Insecure.Nmap
核心参数速查
主机发现
| 参数 | 说明 | 示例 |
|---|---|---|
-sn | 仅 Ping 扫描,不扫端口 | nmap -sn 192.168.1.0/24 |
-Pn | 跳过主机发现,直接扫端口 | nmap -Pn 192.168.1.108 |
-PS <ports> | TCP SYN Ping | -PS 22,80,443 |
-PA <ports> | TCP ACK Ping | -PA 80 |
-PU <ports> | UDP Ping | -PU 53 |
靶场打靶场景下,目标 IP 已知且防火墙可能过滤 ICMP,建议始终使用
-Pn。
扫描类型
| 参数 | 说明 | 需要 root | 备注 |
|---|---|---|---|
-sS | SYN 半开扫描(默认) | ✅ | 最常用,速度快,隐蔽性好 |
-sT | TCP Connect 全连接扫描 | ❌ | 非 root 时的默认方式 |
-sU | UDP 扫描 | ✅ | 速度慢,但不可忽略(DNS/SNMP/TFTP) |
-sV | 服务版本识别 | ❌ | 必备,识别具体服务和版本号 |
-sC | 运行默认 NSE 脚本 | ❌ | 等同于 --script=default |
-A | 激进扫描 | ✅ | 等同于 -sV -sC -O --traceroute |
-sN / -sF / -sX | NULL/FIN/Xmas 扫描 | ✅ | 绕过简单防火墙 |
端口指定
| 参数 | 说明 | 示例 |
|---|---|---|
-p <ports> | 指定端口 | -p 22,80,443 |
-p <range> | 端口范围 | -p 1-1000 |
-p- | 全端口 1-65535 | -p- |
--top-ports <n> | 最常见的 n 个端口 | --top-ports 100 |
-F | 快速模式(前 100 端口) | -F |
输出格式
| 参数 | 说明 | 示例 |
|---|---|---|
-oN <file> | 标准文本输出 | -oN scan.txt |
-oX <file> | XML 输出 | -oX scan.xml |
-oG <file> | Greppable 输出 | -oG scan.grep |
-oA <basename> | 同时输出以上三种格式 | -oA scan |
建议始终使用
-oN保存结果,方便复盘和写 writeup。
性能控制
| 参数 | 说明 |
|---|---|
-T0 到 -T5 | 时间模板,0 最慢(偏执),5 最快(疯狂) |
--min-rate <n> | 最小发包速率 |
--max-retries <n> | 最大重试次数 |
-v / -vv | 增加输出详细度 |
常用扫描模式
1. 靶场标准扫描(最常用)
配合 RustScan 发现的端口列表,做服务版本识别 + 默认脚本:
nmap -Pn -sV -sC -p 21,22,80,443,8080 192.168.1.108 -oN nmap_initial.txt
2. 全端口扫描
不使用 RustScan 时的替代方案(速度较慢):
nmap -Pn -p- --min-rate 5000 192.168.1.108 -oN nmap_allports.txt
发现端口后再做精细扫描:
nmap -Pn -sV -sC -p <发现的端口> 192.168.1.108 -oN nmap_detail.txt
3. UDP 扫描
不要忽略 UDP,DNS (53)、SNMP (161)、TFTP (69) 等服务只跑在 UDP 上:
nmap -Pn -sU --top-ports 20 192.168.1.108 -oN nmap_udp.txt
UDP 扫描天然比 TCP 慢很多,建议用
--top-ports限制范围。
4. 激进扫描
一条命令拿到尽可能多的信息(版本、脚本、OS、traceroute):
nmap -Pn -A -p 22,80,445 192.168.1.108 -oN nmap_aggressive.txt
5. 子网存活主机发现
nmap -sn 192.168.1.0/24
或在 ICMP 被过滤时使用 ARP 扫描:
sudo nmap -sn -PR 192.168.1.0/24
NSE 脚本引擎
Nmap 内置数百个 Lua 脚本,按类别组织。脚本位于 /usr/share/nmap/scripts/。
脚本类别
| 类别 | 用途 | 示例 |
|---|---|---|
default | 默认安全脚本(-sC 触发) | http-title, ssh-hostkey |
vuln | 漏洞检测 | smb-vuln-ms17-010 |
safe | 不会对目标造成影响的脚本 | ssl-cert |
auth | 认证相关(弱口令等) | ftp-anon, ssh-auth-methods |
brute | 暴力破解 | http-brute, ssh-brute |
discovery | 信息收集 | http-enum, smb-os-discovery |
常用脚本命令
# 运行默认脚本
nmap -sC -p 80 target
# 运行特定脚本
nmap --script http-enum -p 80 target
# 运行某个类别的所有脚本
nmap --script vuln -p 445 target
# 组合多个脚本或类别
nmap --script "vuln and safe" -p 445 target
# 传递脚本参数
nmap --script http-brute --script-args http-brute.path=/admin -p 80 target
渗透测试高频脚本
| 场景 | 脚本 | 命令 |
|---|---|---|
| HTTP 目录枚举 | http-enum | nmap --script http-enum -p 80 target |
| HTTP 标题 | http-title | nmap --script http-title -p 80,8080,8443 target |
| SMB 漏洞检测 | smb-vuln-* | nmap --script smb-vuln* -p 445 target |
| SMB 共享枚举 | smb-enum-shares | nmap --script smb-enum-shares -p 445 target |
| FTP 匿名登录 | ftp-anon | nmap --script ftp-anon -p 21 target |
| SSL 证书信息 | ssl-cert | nmap --script ssl-cert -p 443 target |
| DNS 域传送 | dns-zone-transfer | nmap --script dns-zone-transfer -p 53 target |
| MySQL 信息 | mysql-info | nmap --script mysql-info -p 3306 target |
| 全漏洞扫描 | vuln | nmap --script vuln -p 445 target |
--script vuln扫描耗时较长且流量大,优先对已发现的关键端口执行,避免搭配-p-全端口使用。仅在授权靶场或确认范围内运行。
查找和搜索脚本
# 列出所有脚本
ls /usr/share/nmap/scripts/
# 按关键词搜索
ls /usr/share/nmap/scripts/ | grep smb
# 查看脚本帮助
nmap --script-help http-enum
OS 检测
sudo nmap -O -p 22,80 192.168.1.108
需要至少一个开放端口和一个关闭端口才能准确判断。如果结果不确定,可以加 --osscan-guess 强制猜测:
sudo nmap -O --osscan-guess 192.168.1.108
OS 检测需要 root 权限(发送原始数据包)。
输出与结果处理
保存结果(推荐 -oA)
nmap -Pn -sV -sC -p 22,80,445 target -oA nmap_target
生成三个文件:nmap_target.nmap、nmap_target.xml、nmap_target.gnmap。
从 Greppable 输出提取信息
# 提取所有开放端口
grep -oP '\d+/open' nmap_target.gnmap | cut -d/ -f1 | sort -un | tr '\n' ','
# 筛选有特定服务的主机
grep "80/open/tcp" nmap_target.gnmap
XML 转 HTML 报告
xsltproc nmap_target.xml -o nmap_report.html
防火墙 / IDS 绕过技巧
以下技巧仅用于授权测试和理解扫描行为,不应用于未授权的网络。在靶场环境中通常不需要这些技巧,但了解它们有助于理解真实场景下的扫描检测机制。
| 技巧 | 参数 | 说明 |
|---|---|---|
| 分片 | -f | 将探测包分成 8 字节片段 |
| MTU 自定义 | --mtu 24 | 自定义分片大小(8 的倍数) |
| 诱饵 | -D RND:5 | 混入 5 个随机假源 IP |
| 指定源端口 | --source-port 53 | 伪装成 DNS 流量 |
| 慢速扫描 | -T0 或 -T1 | 降低扫描速度以躲避检测 |
| 数据填充 | --data-length 50 | 在探测包中附加随机数据 |
靶场实战速查
根据 RustScan 发现的服务,快速选择 Nmap 后续动作:
| 发现的服务 | 下一步命令 |
|---|---|
| FTP (21) | nmap --script ftp-anon,ftp-vsftpd-backdoor -p 21 target |
| SSH (22) | nmap --script ssh-auth-methods -p 22 target |
| SMTP (25) | nmap --script smtp-commands,smtp-enum-users -p 25 target |
| DNS (53) | nmap --script dns-zone-transfer --script-args dns-zone-transfer.domain=target.com -p 53 target |
| HTTP (80/8080) | nmap --script http-enum,http-title,http-methods -p 80 target |
| SMB (139/445) | nmap --script smb-enum-shares,smb-enum-users,smb-vuln* -p 445 target |
| MySQL (3306) | nmap --script mysql-info,mysql-enum -p 3306 target |
| RDP (3389) | nmap --script rdp-enum-encryption -p 3389 target |
与 RustScan 配合的标准流程
1. RustScan 全端口快扫 → rustscan -a target -g
2. Nmap 服务识别 + 默认脚本 → nmap -Pn -sV -sC -p <ports> target -oN initial.txt
3. 针对关键服务跑专项脚本 → nmap --script smb-vuln* -p 445 target
4. 有需要时补充 UDP 扫描 → nmap -Pn -sU --top-ports 20 target
相关知识
- RustScan 端口扫描 — 快速发现开放端口,与 Nmap 配合使用