
ワンショットAPI攻撃ツール - 指定されたルートからAPI URLを見つけ、自動攻撃をシミュレートします
Pythonで書かれたフルパイプラインのブラックボックスAPIセキュリティスキャナー。エンドポイントの列挙、パラメータの特定、HTTPメソッドのプローブ、認証/認可ロジックのテスト、および標準的なOWASP API Top 10攻撃シミュレーション(BOLA、Broken Auth、BFLA、Mass Assignment、Rate Limiting、SSRF、Security Misconfigurationなど)を実行し、さらにOWASPカテゴリに依存しないクラッシュ/500エラーを追跡するRESTlerスタイルの信頼性ファザーも備えています。
すべてのコアスクリプトは**stdlib-only(標準ライブラリのみ)**で動作するように設計されています。外部ツールやライブラリがシステムに存在しない場合、apiharvesterは自動的に純粋なPython実装にフォールバックし、すぐに実行できることを保証します。
apiharvester/ — メインのPythonパッケージディレクトリ。python3 -m apiharvesterとして実行します。scripts/check_requirements.sh — バイナリとペイロードの前提条件を検証します。scripts/install_requirements.sh — 必要なSecListsペイロードファイルをダウンロードし、オプションでバイナリをインストールします(go installおよびpip経由)。apiharvester.py — スキャナーのスタンドアロン単一ファイル版。api_deep_discovery.py — Katanaヘッドレスブラウザコードを使用した動的クローラーで、動的なSPA/XHRエンドポイントを発見します。api_intelligence_engine.py — パイプラインアグリゲーターおよびパッシブ脆弱性分類器。apisec.py — 代替の単一ファイルセキュリティスキャナー版。requirements.txt — Python依存関係リスト(主にオプションのPythonベースアクセラレーター用)。payloads/ — 偵察用のワードリストとペイロードファイル:
params.txt — APIエンドポイントテスト用の25,889個のパラメータ名候補directories.txt — 62,281個の一般的なAPIパスパターンとディレクトリ名subdomains.txt — API発見用の5,000個のサブドメインバリアントkiterunner/ — エンドポイント列挙を高速化するKiterunnerルートスキーマファイル要件の確認: 読み取り専用スクリプトを実行して、コアツール/ペイロードが利用可能か確認します:
./scripts/check_requirements.sh
オプションツールとペイロードファイルのインストール: インストールスクリプトを実行して、SecListsのトップワードリスト、Kiterunnerルートスキーマを自動取得し、ツールアクセラレーターをインストールします:
./scripts/install_requirements.sh
Pythonパッケージのインストール:
pip3 install -r requirements.txt
対象ドメインに対してスキャナーを直接実行します:
python3 -m apiharvester example.com \
--auth "Bearer eyJ..." \
--auth2 "Bearer eyJ_lowpriv..." \
--threads 20 \
--html report.html \
--json findings.jsonl
target (位置引数): スキャンするFQDNドメイン。--auth: 認証済みチェック用の高権限アクセストークン(例: 有効なユーザーセッション)。--auth2: BOLA / BFLA / クロスアカウント権限昇格テスト用の低権限アクセストークン。--threads: スレッドプールサイズ(デフォルト: 20)。--timeout: HTTPリクエストのタイムアウト秒数(デフォルト: 10)。--burst: レート制限検証用の高速リクエスト数(デフォルト: 20)。--json: JSONL形式のレポート(行区切りのJSON検出結果)を保存します。--html: インタラクティブなHTMLダッシュボードレポートを保存します。--output-dir: デフォルトの出力ディレクトリパスを上書きします(例: ./scans/example.com)。--skip-recon: 偵察フェーズをスキップし、以前の実行で得た既存の出力ファイルを使用します。--recon-dir: 既存の偵察出力ディレクトリを読み込み、攻撃フェーズのみを実行します。--attacks-only: 攻撃フェーズのみを実行します(--skip-reconを暗黙的に含みます)。--attacks: 実行する攻撃のカンマ区切りリスト。デフォルト: すべて。利用可能:
bola,broken_auth,mass_assignment,rate_limit,bfla,business_logic,
ssrf,misconfiguration,inventory,sspp,injection,reliability,secrets
OWASP API Top 10 (API1–API10:2023):
bola) — Broken Object-Level Authorization。オブジェクトIDエンドポイントをIDファジング(0、1、2、99、"admin"、"test"、UUIDバリアントなど)と差分認証トークンでテストします。broken_auth) — 未認証エンドポイントの発見、JWT弱シークレットクラッキング、alg=noneバイパス、クレーム改ざん、kidインジェクション、さらにOPTIONS/HEADメソッドバイパス。mass_assignment) — PUT/PATCHボディへの権限昇格フィールドインジェクション(role、is_admin、verified、balanceなど)。rate_limit) — 20件以上の高速リクエストを送信し、429 Retry-Afterではなく200を返すエンドポイントをフラグします。bfla) — Broken Function-Level Authorization。機密パス(/admin、/roles、/impersonateなど)を低権限トークンの有無でテストします。business_logic) — ワークフロー/状態機械の違反(例: 支払い後の注文更新)。ssrf) — URLパラメータとリクエストボディを介したサーバーサイドリクエストフォージェリをテストします。misconfiguration) — CORS(アクティブ: 信頼できないOriginを送信)、セキュリティヘッダーの欠落、詳細なエラー、サーバーバナーの漏洩。inventory) — 文書化されていないエンドポイント、放棄されたエンドポイント、露出した管理インターフェース。sspp) — Unsafe Server-Side Post Processing(テンプレートインジェクション、XPathインジェクションなど)。ボーナス攻撃:
injection) — SQLインジェクション、XSS、コマンドインジェクション(エラーベース + 時間ベースブラインド)。reliability) — RESTlerスタイルのファジング: 境界/不正入力テストで5xxクラッシュとサーバー信頼性バグを発見します(OWASPカテゴリに依存しません)。secrets) — レスポンスボディ内の漏洩した認証情報のパターンマッチング: AWS Access Keys、Google API Keys、Slack Tokens、Stripe Keys、GitHub Tokens、Private Key Blocks、JWTs、および一般的なシークレット代入(api_key=...、password=...など)。認証済み + 低権限トークンを使用したフルスキャン(BOLA/BFLAに最適):
python3 -m apiharvester api.example.com \
--auth "Bearer high_priv_token_here" \
--auth2 "Bearer low_priv_token_here" \
--html report.html \
--json findings.jsonl
クイック偵察のみ(エンドポイントを発見、攻撃なし):
python3 -m apiharvester example.com --skip-recon --attacks ""
(または、一部の攻撃フェーズをスキップするには--authを指定しないだけです。)
保存された偵察データに対して攻撃のみを再実行(高速イテレーション):
python3 -m apiharvester example.com --recon-dir output/example.com_20260715_140233 --attacks-only
特定の攻撃のみを実行(例: BOLA + Secrets):
python3 -m apiharvester example.com --attacks bola,secrets
TLS証明書エラーをバイパス(企業プロキシ、ステージング環境):
# apiharvester uses a permissive TLS context by default — no extra flags needed
# All HTTPS endpoints work even with self-signed/intercepted certs
python3 -m apiharvester https://staging-api.example.com
すべてのスキャンは、攻撃フェーズが実行される前に、偵察成果物を構造化された出力ディレクトリに書き込みます。デフォルトでは次のとおりです:
output/{target}_{YYYYMMDD_HHMMSS}/
例: output/example.com_20260715_140233/。固定された予測可能なパスが必要な場合(スクリプト/CIに便利)は、--output-dir /path/to/dirで場所を上書きできます。
| ファイル | 内容 |
|---|---|
fqdn.txt | 発見されたすべてのサブドメイン(1行に1つ) |
fqdn_resolved.txt | 解決されたIPを持つサブドメイン — domain\tip1,ip2 |
fqdn_active.txt | 稼働中のHTTP(S)ホスト(完全なURL) |
fqdnwithendpoint.txt | 発見されたすべてのエンドポイントURL |
withparam.txt | 発見されたクエリパラメータを持つエンドポイント(完全なURLとして) |
paramvalue.txt | 観測されたパラメータ値を持つエンドポイント(ライブプロービングから) |
withtoken.txt | --auth/--auth2で提供された認証トークン/JWT、およびレスポンスから収集されたもの |
objectshape.txt | エンドポイントごとのレスポンスJSONフィールド名 — url\tfield1,field2 |
waf_results.jsonl | 検出されたWAF/キャッチオール/JSチャレンジを持つホストごとに1つのJSONオブジェクト |
endpoint_methods.jsonl | 許可されたHTTPメソッドをリストするエンドポイントごとに1つのJSONオブジェクト |
swagger_specs/*.json | 発見されたOpenAPI/Swaggerスペック(ホストごとに1ファイル) |
すべてプレーンテキスト(1行に1エントリ)またはJSONLなので、grep、jq、パイプがきれいに機能します。
既存の偵察データに対して攻撃フェーズのみを再実行し、サブドメイン発見/クロールなどをスキップします:
python3 -m apiharvester example.com --recon-dir output/example.com_20260715_140233 --attacks-only
--attacks-onlyは--skip-reconを暗黙的に含み、fqdn_active.txt、fqdnwithendpoint.txt、withparam.txt、withtoken.txt、swagger_specs/、waf_results.jsonlをスキャンコンテキストに読み戻します。
偵察ファイルを他のツールに渡す:
# httpx re-probe
httpx -l output/example.com_*/fqdn_active.txt
# nuclei against discovered endpoints
nuclei -l output/example.com_*/fqdnwithendpoint.txt
# ffuf using discovered params as a wordlist seed
cut -d'?' -f2 output/example.com_*/withparam.txt | tr '&' '\n' | cut -d= -f1 | sort -u
# jq over per-host WAF results
jq -r 'select(.waf_vendor != "none") | .domain' output/example.com_*/waf_results.jsonl
すべてのファイルが行区切りのプレーンテキストまたはJSONLであるため、出力ディレクトリは、grep、jq、httpx、nuclei、ffuf、またはパイプライン内のその他のツールに渡すことができるポータブルな偵察データセットとしても機能します — apiharvester専用のパーサーは不要です。
apiharvesterは、包括的なAPI発見とテストのために、SecListsとKiterunnerの高品質なワードリストとルートスキーマを使用します:
params.txt (25,889エントリ) — 一般的なAPIパラメータ名(例: api_key、user_id、token)。パラメータ発見フェーズで潜在的な入力ポイントを特定するために使用されます。
directories.txt (62,281エントリ) — APIエンドポイントパスとディレクトリパターン(例: /api/v1/、/admin/、/internal/)。パス列挙とSoft-404検出に使用されます。
subdomains.txt (5,000エントリ) — サブドメインプレフィックスとバリアント(例: api、api-v2、staging-api)。サブドメイン全体で追加のAPIサーフェスを特定するために使用されます。
kiterunner/ — 迅速なルート発見と検証のためのKiterunner形式のOpenAPIルートスキーマ。外部スキーマが利用可能な場合にエンドポイントマッピングを高速化します。