Headless
Última actualización
¿Te fue útil?
Última actualización
¿Te fue útil?
Headless
es una máquina Linux de dificultad fácil que cuenta con un servidor Python Werkzeug
que aloja un sitio web. El sitio web tiene un formulario de soporte al cliente, que se ha descubierto que es vulnerable a Cross-Site Scripting (XSS) ciego a través del encabezado User-Agent
. Esta vulnerabilidad se aprovecha para robar una cookie de administrador, que luego se utiliza para acceder al panel de control del administrador. La página es vulnerable a la inyección de comandos, lo que lleva a un shell inverso en el equipo. Al enumerar el correo del usuario se revela un script que no utiliza rutas absolutas, que se aprovecha para obtener un shell como root.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Headless. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentran abierta una página web en el puerto 5000.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Revisamos que se trata de una nueva página web que contiene un formulario de contacto. Interceptaremos esta solicitud con FoxyProxy+BurpSuite para verificar el funcionamiento de esta solicitud al enviar el formulario.
En el resultado obtenido en BurpSuite, nos encontramos la manera en la que se tramitan los datos. No encontramos nada inusual de momento, verificaremos más adelante si podemos realizar algo con esto.
Haremos una enumeración de directorios en el sitio web, nos encontramos a través del resultado de gobuster
un nuevo directorio llamado dashboard
.
Este mensaje de error, parece muy parecidos a los predeterminadas de Flask
.
Revisando nuevamente en la página web donde nos proporcionan un formulario, verificamos que disponemos de una Cookie de sesión.
También verificamos que al acceder a http://10.10.11.8:5000/dashboard, el atributo de HttpOnly
se encuentra en False
, por lo cual podríamos intentar realizar un ataque de Cookie Hijacking
para robar una cookie de sesión.
Al probar de enviar en el formulario, en uno de los campos, las etiquetas de <script>
, el propio servidor al parecer lo detecta como intento de hacking y nos bloquea la dirección IP. En el resultado por parte del servidor, al parecer lo que también se muestra es la solicitud que hemos enviado, en la cual aparecen nuestra información.
Por lo tanto, podríamos intentar probar de inyectar en las cabeceras código HTML/JS y verificar si al enviar la solicitud el servidor en el output que nos mostraban aparecían. Efectivamente, en este caso, al modificar nuestro User-Agent
en el output del servidor se interpretaron las etiquetas HTML indicadas.
Por lo tanto, lo que probaremos es de realizar un Cookie Hijacking
para robar la cookie de sesión de algún usuario que se encuentre revisando nuestra solicitud, en el caso de que lo haya...
Nos levantaremos un servidor web en nuestro equipo.
En el campo de User-Agent
estableceremos la siguiente inyección XSS para que nos envíe la cookie del usuario.
Al pasar un tiempo, verificamos que recibimos una cookie diferente a la nuestra, por lo que parece ser que un usuario ha revisado nuestro formulario y hemos logrado obtener su cookie.
Al descodificar esta cookie obtenida, verificamos que el usuario del que se trata es del usuario admin
.
Verificamos que al refrescar el sitio web, logramos acceder al panel de Administración. Interceptaremos la solicitud que se realiza al generar el reporte cuando le damos al botón de Generate Report
.
En el resultado interceptado, probamos de modificar los valores del campodate
y se nos generaba el reporte pero no nos lograba mostrar ningún tipo de información interesante.
En este caso, probamos de enviarle un valor aleatorio y verificamos que por parte del servidor, aparece que se ha generado correctamente el reporte.
Si pensamos en lo que está haciendo el servidor, es probable que esté tomando la fecha y buscando información sobre lo que estaba sucediendo en el informe en esa fecha. Si puede hacerlo desde Python, eso está bien. Pero si necesita ejecutar algunos comandos del sistema, es posible que esté tomando nuestra entrada y construyendo el comando a partir de ella, y luego llamando algo como subprocess.run o os.system con esa cadena.
Para comprobarlo, intentaremos agregar ; id al final de la fecha. Comprobamos que hemos logrado ejecutar comandos en el panel.
Por lo tanto, al lograr obtener un RCE, el siguiente paso será lograr establecernos una conexión al sistema.
Desde nuestra máquina atacante, nos pondremos en escucha con nc
.
Ejecutarems el sigueinte comando para establecernos una Reverse Shell.
Verificamos que logramos obtener acceso al servidor y visualizar la flag de user.txt.
Revisando si el usuario dvir
que disponemos actualmente, disponía de algún permiso de sudoers
, nos encontramos que si dispone de este privilegio sobre el binario /usr/bin/check
.
Revisando este binario, nos encontramos con el siguiente script.
El script syscheck
realiza las siguientes funciones:
Verifica si el script se ejecuta con privilegios de root. Si no es así, termina con un error.
Obtiene y muestra la fecha y hora de la última modificación del kernel en /boot
.
Muestra el espacio disponible en disco en la partición raíz (/
).
Muestra el promedio de carga del sistema (load average).
Verifica si el servicio de base de datos (representado por initdb.sh
) está en ejecución. Si no lo está, lo inicia; si ya está en marcha, muestra un mensaje indicando que el servicio está activo.
Primero de todo, revisaremos si el archivo initdb.sh
existe en alguna ruta del sistema. Verificamos que no existe este archivo, por lo tanto, podríamos aprovecharnos de este script prara crear un archivo initdb.sh
que haga una acción que queramos, dado que el script indicaba que si el script no estaba iniciado, lo ejecutaría.
En este caso, optamos por darle permisos de SUID
al /bin/bash para convertirnos en usuarioroot
. Creamos un archivo llamado initdb.sh
que realizaría un cambio en el binario /bin/bash
para darle permisos de SUID
. Al ejecutar el binario con permisos de sudo
, verificamos que se ha ejecutado el script y el binario de /bin/bash
tiene permisos de SUID
.
Dado que el usuario root
es el propietario de /bin/bash
y ahora este último tiene permisos de SUID
, abusaremos de esto para convertirnos en usuario root
y visualizar la flag root.txt.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Accederemos a y verificaremos que nos encontramos con el siguiente sitio web, el cual probaremos de acceder a la opción de "For questions".
Al probar de acceder a , nos encontramos con un mensaje de Unauthorized
.
Regresaremos a la página de y modificaremos la cookie actual, por la cookie robada del usuario admin