mcpField
P
port-mass-scan

port-mass-scan

github.com/uphiago安全1.3k40 次安装8 周前更新
代码仓库

关于 port-mass-scan

面向授权安全测试的端口扫描技能,使用 RustScan 扫描单个主机,使用 Masscan 扫描大型 IP 网段。内容涵盖端口发现、服务识别、横幅抓取和扫描分片,并说明限制与授权范围要求。

主要功能

  1. 01使用 RustScan 扫描单个主机
  2. 02使用 Masscan 扫描大型 IP 网段
  3. 03将发现的端口交由 Nmap 检测
  4. 04抓取服务横幅
  5. 05在多台机器间拆分扫描

适用场景

  1. 01发现授权单个主机上的开放端口
  2. 02在服务枚举前扫描获准的网络范围
  3. 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

快速参考

场景工具命令耗时
单台主机,所有端口RustScanrustscan -a IP -r 1-655353-10s
/24 范围,常用端口Masscanmasscan -p1-1000 --rate=10000 -iL /24.txt2-5 min
/16 范围,Web 端口Masscanmasscan -p80,443,8080,8443 --rate=50000 -iL /16.txt10-30 min
/8 摄像头搜索Masscanmasscan -p554,80,8010 --rate=100000 -iL /8.txt数小时
抓取 Banner(1 个 IP)Masscanmasscan -p1-65535 --banners --source-ip ETH0_IP IP1-5 min
性能对比(基于 5000 多次扫描的实测数据)
工具1000 个端口(1 台主机)/24(每个 IP 扫描 1000 个端口)/8(Web 端口)准确率
Nmap5-10 min~30 min不可能(数天)99%
RustScan3-10s15-30s~2 min98%(然后使用 Nmap -sV)
Masscan15-20s2-5 min30-60 min99%(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