
Mailcow CVE-2022-31138 RCE
RCE e escalada de privilégios de Domain Admin para Mailcow. O POC para CVE-2022-31245 pode ser modificado para funcionar com esta vulnerabilidade.
Reportado e corrigido: 2022-06
Tipo: Injeção de Código (CWE-94), RCE, Domain Takeover
Versões afetadas: pelo menos 2019 - 2022-06a
Existe uma falha em todas as versões recentes do Mailcow em que um usuário comum do sistema pode explorar o recurso “Sync Job” para obter um shell usando injeção de código perl em um campo de regex arbitrário no imapsync. Usando esse exploit, um atacante pode facilmente pivotar para o banco de dados e escalar privilégios para o papel de “Domain Admin” no Mailcow.
Este exploit inclui persistência por padrão, já que os Sync Jobs são executados em um temporizador.
Este exploit compromete toda a instância do Mailcow. Testado e funcionando na versão mais recente, 2022-06a.
Quase todas as expressões regex no imapsync são avaliadas usando a função eval, o que é altamente inseguro quando os parâmetros são fornecidos pela entrada do usuário. Como exemplo, veja como --regexmess é analisado no imapsync (linha 14213):
sub regexmess
{
my ( $string ) = @_ ;
foreach my $regexmess ( @regexmess ) {
$sync->{ debug } and myprint( "eval \$string =~ $regexmess\n" ) ;
my $ret = eval "\$string =~ $regexmess ; 1" ;
No Mailcow, $regexmess é fornecido como entrada do usuário.
As seguintes flags do imapsync (podem haver mais) podem ser usadas para obter execução de código:
--regexmess
--skipmess
--regexflag
--delete2foldersonly
--delete2foldersbutnot
--regextrans2
Usando as etapas abaixo, a vulnerabilidade pode ser reproduzida.
Obtendo shell:
hostname=MAILCOW_IP, Port=IMAP_PORT, Username=CURRENT_USER, Password=CURRENT_PASS, Encryption=PLAIN, Interval=1, Active=Check, Custom Parameters=--debug --nosslcheck --regexmess=PERL_CODE
Onde o campo "Custom Parameters" é o campo importante. PERL_CODE pode ser qualquer código perl.Exemplo de payload para Custom Parameters:
--debug --nosslcheck --regexmess=`touch\x{0020}test.txt`
PERL_CODE não pode conter espaços, aspas ou barras, use \x{0020} em vez de espaço. Use ` para executar comandos do shell.
Escalada de Privilégios:
Siga os mesmos passos descritos em CVE-2022-31245.