用途
该技能使用 nmap 检测目标主机上的开放端口,并收集服务版本与操作系统信息。它执行分阶段扫描:从快速的热门端口扫描开始,再到详细的服务版本探测和操作系统指纹识别,并将结果保存为结构化格式。
重要提示:该技能必须仅在已获得明确书面授权的系统上使用。未经授权的端口扫描在多数司法管辖区属于违法行为,且违反服务条款。
适用场景
- 在渗透测试范围内建立服务清单
- 检测不必要暴露的服务
- 验证服务版本以映射 CVE
- 定期审计网络防御态势
前提条件
安装 nmap:
# Ubuntu/Debian
sudo apt-get install -y nmap
# CentOS/RHEL
sudo yum install -y nmap
- 需要目标系统的书面授权。
- 操作系统检测和部分扫描技术需要 root/sudo 权限。
- 环境变量 SECSKILL_TARGET:目标 IP、IP 范围或主机名。
输入
| 变量 | 是否必填 | 说明 |
|---|---|---|
| SECSKILL_TARGET | 必填 | 扫描目标(IP、CIDR、主机名) |
| SECSKILL_OUTPUT_DIR | 可选 | 结果输出目录(默认:./output) |
| SECSKILL_SCAN_SPEED | 可选 | nmap 速度模板 T1-T5(默认:T3) |
| SECSKILL_TOP_PORTS | 可选 | 快速扫描中检查的热门端口数量(默认:1000) |
工作流程
步骤 1:确认授权并准备环境
export TARGET="${SECSKILL_TARGET:?Set the SECSKILL_TARGET environment variable}"
export OUTDIR="${SECSKILL_OUTPUT_DIR:-./output}"
export SPEED="${SECSKILL_SCAN_SPEED:-T3}"
export TOP_PORTS="${SECSKILL_TOP_PORTS:-1000}"
mkdir -p "$OUTDIR"
echo "================================================================"
echo " WARNING: This scan must only be performed on authorized targets."
echo " Unauthorized scanning is illegal and carries legal liability."
echo "================================================================"
echo "[*] Scan target: $TARGET"
echo "[*] Output path: $OUTDIR"
SAFE_NAME=$(echo "$TARGET" | tr '/:' '__')
步骤 2:快速热门端口扫描
echo "[*] Step 1: Starting fast scan of top $TOP_PORTS ports..."
nmap -$SPEED \
--top-ports "$TOP_PORTS" \
-oN "$OUTDIR/quick_scan_${SAFE_NAME}.txt" \
-oX "$OUTDIR/quick_scan_${SAFE_NAME}.xml" \
"$TARGET" 2>/dev/null
echo "[+] Fast scan complete"
echo "[*] Discovered open ports:"
grep "^[0-9].*open" "$OUTDIR/quick_scan_${SAFE_NAME}.txt" | tee /tmp/open_ports.txt
OPEN_COUNT=$(wc -l < /tmp/open_ports.txt)
echo "[+] Open port count: $OPEN_COUNT"
步骤 3:详细服务版本扫描
# Extract open ports only for detailed scan
OPEN_PORTS=$(grep "^[0-9].*open" "$OUTDIR/quick_scan_${SAFE_NAME}.txt" \
| awk -F'/' '{print $1}' | tr '\n' ',' | sed 's/,$//')
if [ -z "$OPEN_PORTS" ]; then
echo "[-] No open ports found. Exiting scan."
exit 0
fi
echo "[*] Step 2: Detailed service version scan (ports: $OPEN_PORTS)..."
nmap -$SPEED \
-p "$OPEN_PORTS" \
-sV \
--version-intensity 7 \
-sC \
-oN "$OUTDIR/service_scan_${SAFE_NAME}.txt" \
-oX "$OUTDIR/service_scan_${SAFE_NAME}.xml" \
"$TARGET" 2>/dev/null
echo "[+] Service version scan complete"
步骤 4:操作系统检测(需要 root)
echo "[*] Step 3: Attempting OS detection..."
if [ "$(id -u)" -eq 0 ]; then
nmap -$SPEED \
-p "$OPEN_PORTS" \
-O \
--osscan-guess \
-oN "$OUTDIR/os_scan_${SAFE_NAME}.txt" \
"$TARGET" 2>/dev/null
OS_INFO=$(grep -iE "OS details:|Aggressive OS guesses:" "$OUTDIR/os_scan_${SAFE_NAME}.txt" | head -3)
echo "[+] OS detection results:"
echo "${OS_INFO:-(OS detection failed - more open ports may be required)}"
else
echo "[-] OS detection skipped (root required). Re-run with sudo to enable."
fi
步骤 5:UDP 关键服务扫描(可选,需要 root)
if [ "$(id -u)" -eq 0 ]; then
echo "[*] Step 4: UDP key service scan (DNS/SNMP/NTP etc.)..."
nmap -$SPEED \
-sU \
-p 53,67,68,69,123,161,162,500,514,1900 \
-oN "$OUTDIR/udp_scan_${SAFE_NAME}.txt" \
"$TARGET" 2>/dev/null
echo "[+] UDP scan complete"
else
echo "[-] UDP scan skipped (root required)"
fi
步骤 6:结果汇总
echo ""
echo "===== Port Scan Results Summary ====="
echo "Target : $TARGET"
echo "Open port count: $OPEN_COUNT"
echo ""
echo "[ Service list ]"
grep "^[0-9].*open" "$OUTDIR/service_scan_${SAFE_NAME}.txt" 2>/dev/null \
|| grep "^[0-9].*open" "$OUTDIR/quick_scan_${SAFE_NAME}.txt"
echo ""
echo "Output files:"
echo " - $OUTDIR/quick_scan_${SAFE_NAME}.txt"
echo " - $OUTDIR/service_scan_${SAFE_NAME}.txt"
echo " - $OUTDIR/service_scan_${SAFE_NAME}.xml (structured data)"
echo "====================================="
完成标志
- 快速扫描和服务版本扫描结果文件已创建
- 结构化 XML 结果文件已保存
- 已打印开放端口列表和服务信息
失败模式
| 症状 | 原因 | 解决方法 |
|---|---|---|
| nmap: command not found | 未安装 | 运行 apt-get install nmap |
| 所有端口被过滤 | 防火墙或 IPS 拦截 | 添加 -Pn 参数,尝试不同的扫描技术 |
| 扫描非常慢 | 网络延迟或 T1/T2 速度 | 使用 SECSKILL_SCAN_SPEED=T4 提升速度 |
| 操作系统检测失败 | 开放端口不足或无权限 | 使用 sudo 运行,扫描更多端口后重试 |
| 连接被拒绝 | 目标离线或被过滤 | 使用 -Pn 跳过 ping |
注意事项
- 法律警告:未经授权的端口扫描可能面临刑事起诉。务必获得书面授权。
- -T4 或 -T5 很可能触发 IDS/IPS 告警。隐蔽测试请使用 -T1 或 -T2。
- XML 输出可与 nuclei-scan 技能和漏洞管理平台集成。
- NSE 脚本(-sC)也会执行一些基础漏洞检查(例如 SMB 签名、SSL 证书信息)。