mcpField
P
port-mass-scan

port-mass-scan

github.com/uphiagoセキュリティ1.3k40 回インストール8 週間前に更新
リポジトリ

port-mass-scan について

認可済みのセキュリティ評価向けポートスキャンスキルです。単一ホストには RustScan、大規模な IP 範囲には Masscan を使い、ポート検出、サービス識別、バナー取得、スキャン分割を案内します。制約と認可範囲にも触れます。

主な機能

  1. 01RustScan による単一ホストのスキャン
  2. 02Masscan による大規模 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、大規模な IP 範囲には Masscan を使用する高速ポートスキャン手法です。RustScan は 1000 ポートのスキャンで Nmap より 400 倍高速です(3~10 秒対 5~10 分)。Masscan は、Nmap では対応できない /8 および /16 の範囲を処理できます。以下の ISP および政府ネットワークの例は、署名済みの RoE に基づく、許可を得たインフラ評価でのものです。

使用するタイミング

  • 対象の IP 範囲を対象とする署名済みの RoE がある、許可を得たレッドチームのエンゲージメント。
  • Nmap によるサービス列挙の前に、単一ホストのポートをすばやく検出する場合。
  • subdomain-enumeration の後に、解決された IP をスキャンして HTTP 以外のサービスを調べる場合。
  • 明示的な書面による許可なしに ISP 全体や /8 をスキャンすることは、ほとんどの法域で違法です。このスキルは、正当な許可を得たエンゲージメントを目的としており、大量スキャンを目的とするものではありません。

前提条件

  • masscan、rustscan、nmap がインストールされた terminal。
  • Masscan の場合:root アクセス(raw socket を使用)、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~10 秒
/24 範囲、一般的なポートMasscanmasscan -p1-1000 --rate=10000 -iL /24.txt2~5 分
/16 範囲、Web ポートMasscanmasscan -p80,443,8080,8443 --rate=50000 -iL /16.txt10~30 分
/8 のカメラ探索Masscanmasscan -p554,80,8010 --rate=100000 -iL /8.txt数時間
バナー取得(1 IP)Masscanmasscan -p1-65535 --banners --source-ip ETH0_IP IP1~5 分
パフォーマンス比較(実測、5000 件以上のスキャン)
ツール1000 ポート(1 ホスト)/24(各ホスト 1000 ポート)/8(Web ポート)精度
Nmap5~10 分約 30 分不可能(日単位)99%
RustScan3~10 秒15~30 秒約 2 分98%(その後 Nmap -sV)
Masscan15~20 秒2~5 分30~60 分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 — バナー取得(サービス識別)
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
シャーディング — 複数のマシンに分散
# 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 権限が必要です。 raw socket を使用します。root として実行するか、sudo を使用してください。
  • レートが 100k を超えると IDS/IPS が作動する可能性があります。 ステルス性を保つには --rate=50000 以下を使用してください。適切な --rate を設定して、-T4 相当の速度にしてください。
  • バナー取得は接続を切断します。 --source-ip を指定しない場合、Masscan は TCP ハンドシェイクを最後まで完了させる必要があり、その結果、接続が切断されます。サービスを確実に検出するには、2 段階の方法(Masscan でポートを検出 → Nmap でサービスを調査)を使用してください。
  • UDP スキャンは実験的です。 Masscan の UDP サポートは限定的です。UDP には Nmap -sU を使用してください。
  • Ctrl+C で自動保存されます。 Masscan は割り込み時に進捗を保存します。--resume paused.conf で再開してください。
  • --excludefile は不可欠です。 自身へのスキャンを避けるため、必ず自分の IP と RFC 1918 の範囲を除外してください。

検証

  • RustScan:オープンポートは、サービスのバージョンを確認するために Nmap -sV で検証する必要があります。
  • Masscan:結果を重複排除する必要があります(Masscan は再送により、同じポートを複数回報告することがあります)。
  • バナー取得:Masscan のバナーと Nmap のプローブで、サービスのバージョンが一致する必要があります。
  • すべてのオープン TCP ポートについて、対応するサービスを特定する必要があります(「unknown」ポートがないこと)。

コメント