关于 port-mass-scan
面向授权安全测试的端口扫描技能,使用 RustScan 扫描单个主机,使用 Masscan 扫描大型 IP 网段。内容涵盖端口发现、服务识别、横幅抓取和扫描分片,并说明限制与授权范围要求。
主要功能
- 01使用 RustScan 扫描单个主机
- 02使用 Masscan 扫描大型 IP 网段
- 03将发现的端口交由 Nmap 检测
- 04抓取服务横幅
- 05在多台机器间拆分扫描
适用场景
- 01发现授权单个主机上的开放端口
- 02在服务枚举前扫描获准的网络范围
- 03将大型授权扫描分配到多台机器
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ uphiago/ recon-skills --skill port-mass-scan安装后在 Claude Code 中输入/port-mass-scan确认已加载。
详细介绍
端口大规模扫描技能
使用 RustScan 对单台主机进行高速端口扫描,并使用 Masscan 扫描大型 IP 范围的方法。对于 1000 个端口的扫描,RustScan 的速度比 Nmap 快 400 倍(3-10s 对比 5-10min)。Masscan 可处理 Nmap 无法扫描的 /8 和 /16 范围。以下 ISP 和政府网络示例均来自已签署 RoE 的授权基础设施评估。
适用场景
- 已签署 RoE 且涵盖目标 IP 范围的授权红队行动。
- 在使用 Nmap 枚举服务前,快速发现单台主机的开放端口。
- 执行
subdomain-enumeration后,扫描已解析的 IP,查找非 HTTP 服务。 - 在大多数司法管辖区,未经明确书面授权扫描整个 ISP 或 /8 范围均属违法。本技能用于合法授权的行动,而非大规模扫描。
前提条件
- 已安装 masscan、rustscan 和 nmap 的
terminal。 - 使用 Masscan:需要 root 权限(使用原始套接字)和 libpcap。
- 使用 RustScan:必须安装 nmap(用于传递服务枚举任务)。
运行方法
# Single host — RustScan (3-10 seconds for 1000 ports)
rustscan -a TARGET -r 1-65535 -- -sV
# /24 range — Masscan (2-5 minutes)
masscan -p1-65535 --rate=10000 -iL targets.txt -oJ scan.json
# /8 range — Masscan with banner grab (hours)
masscan -p80,443,8080,8443,22,3306,6379 --rate=50000 --banners -iL /8_range.txt -oJ scan.json
快速参考
| 场景 | 工具 | 命令 | 耗时 |
|---|---|---|---|
| 单台主机,所有端口 | RustScan | rustscan -a IP -r 1-65535 | 3-10s |
| /24 范围,常用端口 | Masscan | masscan -p1-1000 --rate=10000 -iL /24.txt | 2-5 min |
| /16 范围,Web 端口 | Masscan | masscan -p80,443,8080,8443 --rate=50000 -iL /16.txt | 10-30 min |
| /8 摄像头搜索 | Masscan | masscan -p554,80,8010 --rate=100000 -iL /8.txt | 数小时 |
| 抓取 Banner(1 个 IP) | Masscan | masscan -p1-65535 --banners --source-ip ETH0_IP IP | 1-5 min |
性能对比(基于 5000 多次扫描的实测数据)
| 工具 | 1000 个端口(1 台主机) | /24(每个 IP 扫描 1000 个端口) | /8(Web 端口) | 准确率 |
|---|---|---|---|---|
| Nmap | 5-10 min | ~30 min | 不可能(数天) | 99% |
| RustScan | 3-10s | 15-30s | ~2 min | 98%(然后使用 Nmap -sV) |
| Masscan | 15-20s | 2-5 min | 30-60 min | 99%(TCP) |
流程
RustScan — 快速发现单台主机的开放端口
TARGET="$1"
OUTDIR="$OUTDIR/ports"
mkdir -p "$OUTDIR"
echo "[*] RustScan: all 65535 ports on $TARGET"
# Fast scan + auto Nmap service detection
rustscan -a "$TARGET" -r 1-65535 -b 500 --accessible -- -sV -oN "$OUTDIR/${TARGET}_rustscan.nmap"
echo "[*] Open ports:"
grep 'open' "$OUTDIR/${TARGET}_rustscan.nmap" || echo " None"
# For WAF/IDS evasion: slower batch size
rustscan -a "$TARGET" -r 1-65535 -b 100 -t 1500 -- -sV
Masscan — 扫描大型范围
RANGE_FILE="$1" # One IP or CIDR per line
OUTDIR="$OUTDIR/ports"
mkdir -p "$OUTDIR"
# Step 1: Fast common ports scan
echo "[*] Masscan: common ports on $(wc -l < "$RANGE_FILE") targets"
masscan -p80,443,22,3306,6379,27017,8080,8443,554,21,25,5432,3389 \
--rate=10000 -iL "$RANGE_FILE" -oJ "$OUTDIR/masscan_common.json" --wait=10
# Step 2: Full port scan on targets with hits
grep -Eo '"ip":"[^"]+"' "$OUTDIR/masscan_common.json" | sort -u | \
sed 's/"ip":"//;s/"//' > "$OUTDIR/hits.txt"
echo "[*] Full scan on $(wc -l < "$OUTDIR/hits.txt") targets with open ports"
masscan -p1-65535 --rate=5000 -iL "$OUTDIR/hits.txt" \
-oJ "$OUTDIR/masscan_full.json" --wait=30
Masscan — 抓取 Banner(识别服务)
TARGET="$1"
OUTDIR="$OUTDIR/ports"
# Banner grabbing requires a separate IP for the TCP handshake
SOURCE_IP=$(hostname -I | awk '{print $1}')
echo "[*] Masscan banner grab from source IP: $SOURCE_IP"
masscan -p1-10000 --rate=5000 --banners --source-ip "$SOURCE_IP" \
"$TARGET" -oJ "$OUTDIR/${TARGET}_banners.json"
# Alternative: two-phase (Masscan ports → Nmap services)
masscan -p1-65535 --rate=10000 "$TARGET" -oG "$OUTDIR/${TARGET}_grepable.txt" --wait=10
OPEN_PORTS=$(grep -Eo 'Host: \S+ \(\)\s+Ports:\s+\K[^#]+' "$OUTDIR/${TARGET}_grepable.txt" | \
grep -Eo '\d+/open' | cut -d/ -f1 | tr '\n' ',' | sed 's/,$//')
if [[ -n "$OPEN_PORTS" ]]; then
echo "[*] Nmap service detection on ports: $OPEN_PORTS"
nmap -sV -p "$OPEN_PORTS" "$TARGET" -oN "$OUTDIR/${TARGET}_services.nmap"
fi
Masscan — 搜索 IP 摄像头(RTSP 端口 554)
# Scan Brazilian ISP ranges for cameras (from Vivo, Claro, Oi)
echo "[*] Camera hunt on Claro 3G/4G ranges"
masscan -p554,80,8010,8011 --rate=50000 \
--range [REDACTED_IP]-[REDACTED_IP] -oJ cameras_claro.json
echo "[*] Camera hunt on Vivo ranges"
masscan -p554,80,8010,8011 --rate=50000 \
--range [REDACTED_IP]-[REDACTED_IP] -oJ cameras_vivo.json
# Post-process: probe discovered cameras for snapshots
grep -Eo '"ip":"[^"]+"' cameras_*.json | sed 's/"ip":"//;s/"//' | sort -u | \
while read ip; do
# Axis camera snapshot
code=$(curl -sk -o /dev/null -w "%{http_code}" --max-time 3 --connect-timeout 3 "http://$ip:8010/axis-cgi/jpg/image.cgi")
[[ "$code" == "200" ]] && echo "[CAMERA] Axis: $ip:8010"
# Generic RTSP
code=$(curl -sk -o /dev/null -w "%{http_code}" --max-time 3 --connect-timeout 3 "http://$ip:554/")
[[ "$code" != "000" ]] && echo "[RTSP] $ip:554"
sleep 0.3
done
分片 — 分配给 N 台机器
# On machine 1 (shard 1/4):
masscan -p1-65535 --rate=50000 --shard 1/4 -iL /8_range.txt -oJ shard1.json
# On machine 2 (shard 2/4):
masscan -p1-65535 --rate=50000 --shard 2/4 -iL /8_range.txt -oJ shard2.json
# On machine 3 (shard 3/4):
masscan -p1-65535 --rate=50000 --shard 3/4 -iL /8_range.txt -oJ shard3.json
# On machine 4 (shard 4/4):
masscan -p1-65535 --rate=50000 --shard 4/4 -iL /8_range.txt -oJ shard4.json
# Merge results
cat shard*.json | jq -s '.[]' > merged.json
注意事项
- **Masscan 需要 root 权限。**它使用原始套接字。请以 root 身份运行,或使用
sudo。 - **速率超过 100k 可能触发 IDS/IPS。**为保持隐蔽,请使用
--rate=50000或更低的速率。可通过设置合适的--rate来实现相当于-T4的效果。 - **抓取 Banner 会断开连接。**如果不指定
--source-ip,Masscan 必须完成完整的 TCP 握手,这会导致连接断开。为可靠地检测服务,请采用两阶段方法(Masscan 扫描端口 → Nmap 检测服务)。 - **UDP 扫描仍处于实验阶段。**Masscan 对 UDP 的支持有限。UDP 扫描请使用 Nmap
-sU。 - **Ctrl+C 会自动保存。**Masscan 会在中断时保存进度。使用
--resume paused.conf恢复扫描。 - **
--excludefile至关重要。**务必排除自己的 IP 和 RFC 1918 范围,以免扫描到自身。
验证
- RustScan:必须使用 Nmap
-sV确认开放端口对应的服务版本。 - Masscan:必须对结果去重(Masscan 可能因重传而多次报告同一端口)。
- Banner 抓取:Masscan Banner 和 Nmap 探测得到的服务版本必须一致。
- 所有开放的 TCP 端口都必须识别出对应服务(不能有“未知”端口)。
评论
支持 Markdown