
Mailcow CVE-2022-31138 RCE
RCE ed escalation dei privilegi a Domain Admin per Mailcow. Il POC per CVE-2022-31245 può essere modificato per funzionare con questa vulnerabilità.
Segnalata e corretta: 2022-06
Tipo: Code Injection (CWE-94), RCE, Domain Takeover
Versioni interessate: almeno 2019 - 2022-06a
Esiste una falla in tutte le versioni recenti di Mailcow in cui un utente normale del sistema può sfruttare la funzione “Sync Job” per ottenere una shell tramite l'iniezione di codice Perl nel campo regex arbitrario in imapsync. Usando questo exploit, un attaccante può poi facilmente spostarsi sul database ed elevare i propri privilegi al ruolo di “Domain Admin” in Mailcow.
Questo exploit include la persistenza per impostazione predefinita poiché i Sync Job vengono eseguiti con un timer.
Questo exploit compromette l'intera istanza di Mailcow. Testato e funzionante sull'ultima release al 2022-06a.
Quasi tutte le espressioni regex in imapsync vengono valutate usando la funzione eval, il che è estremamente pericoloso quando i parametri sono forniti dall'input dell'utente. Ad esempio, ecco come --regexmess viene analizzato in imapsync (riga 14213):
sub regexmess
{
my ( $string ) = @_ ;
foreach my $regexmess ( @regexmess ) {
$sync->{ debug } and myprint( "eval \$string =~ $regexmess\n" ) ;
my $ret = eval "\$string =~ $regexmess ; 1" ;
In Mailcow $regexmess è fornito come input dell'utente.
I seguenti flag di imapsync (potrebbero essercene altri) possono essere usati per ottenere l'esecuzione di codice:
--regexmess
--skipmess
--regexflag
--delete2foldersonly
--delete2foldersbutnot
--regextrans2
La vulnerabilità può essere riprodotta seguendo i passaggi seguenti.
Ottenere una 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
Dove il campo "Custom Parameters" è il campo importante. PERL_CODE può essere codice Perl arbitrario.Esempio di payload per Custom Parameters:
--debug --nosslcheck --regexmess=`touch\x{0020}test.txt`
PERL_CODE non può contenere spazi, virgolette o barre; usa \x{0020} al posto dello spazio. Usa ` per eseguire comandi shell.
Escalation dei privilegi:
Segui gli stessi passaggi di CVE-2022-31245.