port-mass-scan について
認可済みのセキュリティ評価向けポートスキャンスキルです。単一ホストには RustScan、大規模な IP 範囲には Masscan を使い、ポート検出、サービス識別、バナー取得、スキャン分割を案内します。制約と認可範囲にも触れます。
主な機能
- 01RustScan による単一ホストのスキャン
- 02Masscan による大規模 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、大規模な 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
クイックリファレンス
| シナリオ | ツール | コマンド | 所要時間 |
|---|---|---|---|
| 単一ホスト、全ポート | RustScan | rustscan -a IP -r 1-65535 | 3~10 秒 |
| /24 範囲、一般的なポート | Masscan | masscan -p1-1000 --rate=10000 -iL /24.txt | 2~5 分 |
| /16 範囲、Web ポート | Masscan | masscan -p80,443,8080,8443 --rate=50000 -iL /16.txt | 10~30 分 |
| /8 のカメラ探索 | Masscan | masscan -p554,80,8010 --rate=100000 -iL /8.txt | 数時間 |
| バナー取得(1 IP) | Masscan | masscan -p1-65535 --banners --source-ip ETH0_IP IP | 1~5 分 |
パフォーマンス比較(実測、5000 件以上のスキャン)
| ツール | 1000 ポート(1 ホスト) | /24(各ホスト 1000 ポート) | /8(Web ポート) | 精度 |
|---|---|---|---|---|
| Nmap | 5~10 分 | 約 30 分 | 不可能(日単位) | 99% |
| RustScan | 3~10 秒 | 15~30 秒 | 約 2 分 | 98%(その後 Nmap -sV) |
| Masscan | 15~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」ポートがないこと)。
コメント
Markdown 対応