关于 nmap
nmap 是面向网络侦察与端口扫描的操作指南技能,提供扫描流程、参数选择、结果解析和输出管理建议,适用于授权的安全测试。其默认流程先发现所有开放端口,再对开放端口进行服务检测。
主要功能
- 01提供两阶段端口与服务扫描流程
- 02涵盖多种扫描类型与参数
- 03指导解析端口、服务和脚本结果
- 04将结果保存为三种输出格式
- 05说明扫描范围、时序与授权注意事项
适用场景
- 01对获准的单台主机或网段进行侦察
- 02发现开放端口并识别服务版本
- 03检查 IoT 设备相关网络服务
- 04整理扫描结果供后续分析
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ brownfinesecurity/ iothackbot --skill nmap安装后在 Claude Code 中输入/nmap确认已加载。
详细介绍
Nmap 扫描 - 专业网络侦察
你正在协助用户使用 nmap 进行专业网络侦察和端口扫描。本技能提供各种扫描类型、输出格式和结果分析方面的指导。
输出目录
目录结构
nmap-output/
├── nmap-portscan.nmap # Initial fast port discovery
├── nmap-portscan.xml
├── nmap-portscan.gnmap
├── nmap-services.nmap # Detailed service detection on open ports
├── nmap-services.xml
└── nmap-services.gnmap
重要:始终将 nmap 输出保存到有组织的目录结构中。默认使用 ./nmap-output/,或指定自定义目录。
默认扫描策略
重要:除非用户明确要求使用其他扫描类型,否则始终采用以下两阶段方法:
阶段 1:快速端口发现(Root SYN 扫描)
sudo nmap -p- <target> -oA <output-dir>/nmap-portscan
- 为什么使用 sudo:以 root 身份运行可启用快速 SYN 扫描(隐式使用 -sS)
- 为什么使用 -p-:快速扫描全部 65535 个端口
- 耗时:SYN 扫描通常需要 1-3 分钟
- 输出:所有开放端口的列表
主机宕机检测: 如果扫描输出包含“Note: Host seems down”,请自动使用以下参数重试:
sudo nmap -p- -Pn <target> -oA <output-dir>/nmap-portscan
-Pn:跳过主机发现,将主机视为在线- 在防火墙阻止 ping 探测时使用
阶段 2:针对性服务检测
阶段 1 完成后,解析开放端口并运行:
nmap -p <OPEN_PORT_LIST> -sV -sC <target> -oA <output-dir>/nmap-services
-p <OPEN_PORT_LIST>:仅扫描发现为开放状态的端口(例如,-p 23,80,443,554,8000)-sV:检测服务版本-sC:运行默认 NSE 脚本以进行额外枚举- 耗时:通常为 1-3 分钟,因为只扫描已知的开放端口
为什么采用这种策略?
- 速度:快速 SYN 扫描可在 1-3 分钟内找到所有开放端口
- 全面性:覆盖全部 65535 个端口,而不只是前 1000 个
- 效率:仅对确认开放的端口进行服务检测
- 准确性:两阶段方法可减少假阴性
解析开放端口
阶段 1 完成后,使用以下方式提取开放端口:
# Extract open ports from .gnmap file
grep "Ports:" <output-dir>/nmap-portscan.gnmap | sed 's/.*Ports: //' | tr ',' '\n' | grep '/open/' | cut -d'/' -f1 | tr -d ' ' | tr '\n' ',' | sed 's/,$//'
也可以从 .nmap 文件中解析(与 STATE 列精确匹配,因此会排除 open|filtered 端口):
awk '$2=="open"{split($1,p,"/"); ports=ports sep p[1]; sep=","} END{print ports}' <output-dir>/nmap-portscan.nmap
实施工作流
调用 nmap-scan 技能时:
-
创建输出目录
OUTPUT_DIR="./nmap-output" mkdir -p "$OUTPUT_DIR" -
运行阶段 1:快速端口发现
sudo nmap -p- <target> -oA "$OUTPUT_DIR/nmap-portscan" -
检查是否出现“Host seems down”错误
if grep -q "Host seems down" "$OUTPUT_DIR/nmap-portscan.nmap"; then echo "Host appears down, retrying with -Pn flag..." sudo nmap -p- -Pn <target> -oA "$OUTPUT_DIR/nmap-portscan" fi -
从结果中解析开放端口
OPEN_PORTS=$(awk '$2=="open"{split($1,p,"/"); ports=ports sep p[1]; sep=","} END{print ports}' "$OUTPUT_DIR/nmap-portscan.nmap") -
运行阶段 2:检测开放端口上的服务
if [ -n "$OPEN_PORTS" ]; then nmap -p "$OPEN_PORTS" -sV -sC <target> -oA "$OUTPUT_DIR/nmap-services" else echo "No open ports found, skipping service detection." fi -
报告结果位置
echo "Scan complete. Results saved to: $OUTPUT_DIR"
扫描类型
快速扫描(前 1000 个端口)
用于初步侦察、时间有限时,或仅在用户明确要求快速扫描而非默认两阶段策略时使用:
nmap -sV -sC <target> -oA <output-prefix>
-sV:检测服务版本-sC:运行默认 NSE 脚本-oA:以所有格式输出(普通、XML、grepable)- 扫描最常见的前 1000 个端口
- 典型耗时:1-3 分钟
- 局限性:可能会漏掉运行在非标准端口上的服务
全面扫描(所有端口)
需要检查所有端口时,用于进行全面评估:
nmap -sV -sC -p- <target> -oA <output-prefix>
-p-:扫描全部 65535 个端口- 耗时明显更长(视目标而定,为 5-30 分钟以上)
- 仅在需要全面覆盖时使用
隐蔽 SYN 扫描
尝试避免被检测时使用(需要 root/sudo):
sudo nmap -sS -sV -sC <target> -oA <output-prefix>
-sS:隐蔽 SYN 扫描(不完成 TCP 握手)- 被目标记录的可能性较低
- 需要 root 权限
UDP 扫描
需要枚举 UDP 服务时使用:
sudo nmap -sU --top-ports 100 <target> -oA <output-prefix>
-sU:UDP 扫描--top-ports 100:扫描前 100 个 UDP 端口(UDP 扫描速度较慢)- 常见 UDP 服务:DNS (53)、SNMP (161)、DHCP (67/68)
- 速度很慢 - 使用 top-ports 限制扫描范围
激进扫描
用于最大限度地收集信息(噪声较大):
nmap -A -T4 <target> -oA <output-prefix>
-A:启用操作系统检测、版本检测、脚本扫描和 traceroute-T4:激进计时模板(速度更快,但更容易被检测到)- 噪声很大 - 会被 IDS/IPS 检测到
- 仅在获得授权后使用
漏洞扫描
用于检查已知漏洞:
nmap -sV --script vuln <target> -oA <output-prefix>
--script vuln:运行 NSE 漏洞检测脚本- 检查常见 CVE 和配置错误
- 可能产生较大噪声并触发警报
OS 检测
用于识别操作系统:
sudo nmap -O <target> -oA <output-prefix>
-O:启用 OS 检测- 需要 root 权限
- 使用 TCP/IP 协议栈指纹识别
扫描工作流
默认工作流(两阶段策略)
按照上文“默认扫描策略”和“实施工作流”部分,运行阶段 1(端口发现)和阶段 2(服务检测)。然后进行分析:
阶段 3:分析
- 查看服务检测结果,确定:
- 正在运行哪些服务?
- 检测到哪些版本?
- 是否存在值得关注的服务(Web、SSH、数据库、IoT 协议)?
- NSE 脚本是否发现任何问题?
其他目标扫描(可选)
根据服务检测结果,运行专用扫描:
如果发现 Web 服务(80、443、8080 等):
nmap -p 80,443,8080,8443 --script http-* <target> -oA <output-dir>/nmap-web
如果发现 SSH:
nmap -p 22 --script ssh-* <target> -oA <output-dir>/nmap-ssh
如果发现 RTSP(554):
nmap -p 554 --script rtsp-* <target> -oA <output-dir>/nmap-rtsp
如果怀疑存在 ONVIF/摄像头:
nmap -p 80,554,8000,8080 --script http-methods,http-headers <target> -oA <output-dir>/nmap-onvif
输出管理
输出格式
始终使用 -oA <prefix> 生成全部三种格式:
.nmap- 面向用户的普通格式.xml- 用于解析/导入工具的 XML 格式.gnmap- 用于命令行处理的可 grep 格式
时间与性能
时间模板
使用 -T<0-5> 控制扫描速度:
-T0(Paranoid):极慢,用于规避 IDS-T1(Sneaky):非常慢,用于规避 IDS-T2(Polite):较慢,占用带宽较少-T3(Normal):默认,速度均衡-T4(Aggressive):快速,推荐用于现代网络-T5(Insane):非常快,可能遗漏结果
默认:使用 -T3 或省略(默认值为 T3)
快速扫描:在速度很重要且网络能够承受时使用 -T4
隐蔽扫描:使用 -T1 或 -T2 规避检测
超时注意事项
- 阶段 1 端口发现(sudo nmap -p-):超时设为 180-300 秒(3-5 分钟)
- 阶段 2 服务检测(nmap -p -sV -sC):超时设为 120-180 秒(2-3 分钟)
- UDP 扫描:超时设为 600 秒以上(非常慢)
网络范围
单台主机
nmap <ip-address>
CIDR 表示法
nmap 192.168.1.0/24
IP 范围
nmap 192.168.1.1-254
多台主机
nmap 192.168.1.1 192.168.1.10 192.168.1.100
排除主机
nmap 192.168.1.0/24 --exclude 192.168.1.1,192.168.1.254
NSE 脚本
常见脚本类别
# Authentication scripts
nmap --script auth <target>
# Brute force scripts
nmap --script brute <target>
# Default safe scripts
nmap -sC <target> # equivalent to --script default
# Discovery scripts
nmap --script discovery <target>
# Vulnerability scripts
nmap --script vuln <target>
# All HTTP scripts
nmap --script "http-*" <target>
IoT 专用脚本
# RTSP enumeration
nmap -p 554 --script rtsp-methods,rtsp-url-brute <target>
# UPnP discovery
nmap -p 1900 --script upnp-info <target>
# MQTT discovery
nmap -p 1883,8883 --script mqtt-subscribe <target>
# Modbus enumeration
nmap -p 502 --script modbus-discover <target>
结果分析
要提取的关键信息
-
开放端口和服务
- 开放了哪些端口?
- 正在运行哪些服务?
- 检测到哪些版本?
-
服务指纹
- 版本检测是否发现了过时的软件?
- 检测到的版本是否存在已知漏洞?
-
NSE 脚本结果
- 是否存在身份验证问题?
- 是否存在信息泄露?
- 是否存在配置错误?
-
操作系统
- 正在运行什么 OS?
- OS 版本是什么?
解析 Nmap 输出
提取开放端口:
grep "^[0-9]" nmap-output.nmap | grep "open"
提取服务版本:
grep -E "^[0-9]+/tcp.*open" nmap-output.nmap
检查 NSE 输出中的漏洞:
grep -i "vuln\|cve\|exploit" nmap-output.nmap
常见 IoT 服务端口
扫描 IoT 设备时,请特别注意:
| 端口 | 服务 | 描述 |
|---|---|---|
| 21 | FTP | 文件传输(通常配置不当) |
| 22 | SSH | 远程管理 |
| 23 | Telnet | 不安全的远程访问 |
| 80 | HTTP | Web 界面 |
| 443 | HTTPS | 安全 Web 界面 |
| 554 | RTSP | 视频流传输 |
| 1883 | MQTT | IoT 消息传递协议 |
| 3702 | WS-Discovery | ONVIF 设备发现 |
| 5000 | UPnP | 通用即插即用 |
| 8000 | HTTP Alt | 替代 HTTP 端口 |
| 8080 | HTTP Proxy | 替代 HTTP 端口 |
| 8883 | MQTT/TLS | 安全 MQTT |
最佳实践
1. 始终保存输出
运行 nmap 时,务必保存输出:
# GOOD
nmap -p <ports> -sV -sC <target> -oA output/nmap-services
# BAD
nmap -sV -sC <target>
2. 始终使用两阶段策略
除非用户明确要求使用其他扫描类型,否则请使用默认的两阶段策略(参见“默认扫描策略”部分)。
3. 使用恰当的计时设置
根据需求选择计时设置:
# Pentest with authorization: Fast
nmap -sV -sC -T4 <target>
# Red team/stealth: Slow
nmap -sV -sC -T2 <target>
4. 记录扫描参数
始终记录:
- 使用了哪种扫描类型?
- 扫描是在何时(日期/时间)执行的?
- 扫描结果是什么?
- 是否存在任何异常或错误?
5. 遵守授权
- 仅扫描你获准扫描的系统
- 遵守范围限制
- 留意扫描对生产系统的影响
- 选择合适的时间,避免造成 DoS
与 IoT 测试工作流集成
用于 IoT 渗透测试
- 运行默认的两阶段扫描(端口发现 + 服务检测)
- 如果根据开放端口怀疑存在 ONVIF,则运行 wsdiscovery
- 如果摄像头的 80/554 端口开放,则运行 onvifscan
- 如果发现 Web 界面,则运行针对性的 HTTP 脚本
输出目录用法
始终将结果保存到结构清晰的输出目录(默认为 ./nmap-output/)。完整命令序列请参阅 Implementation Workflow 部分。
故障排除
扫描耗时过长
- 使用
-T4加快扫描 - 限制端口范围:使用
-p 1-1000代替-p- - 使用
--top-ports 100代替扫描所有端口
没有结果 / 被防火墙拦截
- 尝试不同的扫描类型:
-sS、-sT、-sA - 使用
-Pn跳过主机发现 - 尝试使用
-f发送分片数据包 - 考虑使用
--source-port 53或其他受信任端口
需要 Root/Sudo 权限
以下扫描类型需要 Root 权限:
-sS(SYN 扫描)-sU(UDP 扫描)-O(操作系统检测)- 原始数据包功能
权限被拒绝错误
如果看到“Permission denied”或“Operation not permitted”:
# Run with sudo
sudo nmap <options> <target>
工作流示例
工作流 1:标准单目标扫描(默认)
TARGET="192.168.1.100"
OUTPUT_DIR="./nmap-output"
mkdir -p "$OUTPUT_DIR"
# Phase 1: Fast port discovery
sudo nmap -p- $TARGET -oA "$OUTPUT_DIR/nmap-portscan"
# Check for "Host seems down"
if grep -q "Host seems down" "$OUTPUT_DIR/nmap-portscan.nmap"; then
sudo nmap -p- -Pn $TARGET -oA "$OUTPUT_DIR/nmap-portscan"
fi
# Parse open ports
OPEN_PORTS=$(awk '$2=="open"{split($1,p,"/"); ports=ports sep p[1]; sep=","} END{print ports}' "$OUTPUT_DIR/nmap-portscan.nmap")
# Phase 2: Service detection
if [ -n "$OPEN_PORTS" ]; then
nmap -p "$OPEN_PORTS" -sV -sC $TARGET -oA "$OUTPUT_DIR/nmap-services"
fi
工作流 2:IoT 摄像头测试
运行工作流 1 中的默认两阶段扫描,然后添加摄像头专属检查:
TARGET="192.168.1.100"
OUTPUT_DIR="./nmap-output"
# If ONVIF camera detected, check HTTP methods
nmap -p 80 --script http-methods $TARGET -oA "$OUTPUT_DIR/nmap-http"
# Check RTSP service
nmap -p 554 --script rtsp-methods $TARGET -oA "$OUTPUT_DIR/nmap-rtsp"
工作流 3:额外的 UDP/操作系统检测
OUTPUT_DIR="./nmap-output"
# After completing default two-phase scan, optionally add:
# UDP scan (top ports)
sudo nmap -sU --top-ports 100 <target> -oA "$OUTPUT_DIR/nmap-udp"
# OS detection
sudo nmap -O <target> -oA "$OUTPUT_DIR/nmap-os"
# Vulnerability scan
nmap -sV --script vuln <target> -oA "$OUTPUT_DIR/nmap-vuln"
向用户询问的问题
开始扫描前,请确认:
- 目标:IP 地址或网络范围是什么?
- 范围:单台主机还是网络范围?
- 扫描类型:使用默认的两阶段策略,还是用户有特定要求?
- 授权:你是否获准扫描此目标?
- 特别关注项:初步扫描后,是否有需要重点检查的特定服务或端口?
注意:默认情况下,输出会保存到 ./nmap-output/。
成功标准
成功的 nmap 扫描应满足以下条件:
- 第一阶段端口发现已完成且无错误
- 第二阶段已对所有开放端口完成服务检测
- 结果以所有格式(-oA)保存到输出目录
- 已识别开放端口及其服务版本
- NSE 脚本已成功执行
- 结果已记录并可供分析
- 提供清晰的摘要,显示:
- 发现的开放端口数量
- 检测到的关键服务
- 输出文件的位置