Continuamos con los write-up de Hack The Box y esta vez llega el turno de la máquina TheNotebook una máquina bastante entretenida que requiere de bastante investigación sobre todo en la parte de la escalada de privilegios. Sin duda que nos aportará bastante cosas nuevas por aprender y profundizar.
OS | RELEASE | DIFFICULTY | IP ADDRESS | AUTHOR |
---|---|---|---|---|
LINUX | 06/MAR/21 | MEDIUM | 10.10.10.230 | mostwanted002 |
Resumen:
- Enumeración de puertos y servicios con Nmap
- Análisis de la aplicación web y registro
- Manipulación del JWT (JSON Web Token)
- Acceso a funcionalidad privilegiada y subida de fichero
- Reconocimiento en post-explotación
- Obtención de usuario / Captura del fichero user.txt
- Escalada de privilegios / Captura de fichero root.txt
Enumeración:
Como de costumbre arrancamos con un escaneo vía Nmap:
nmap -sS -sV -Pn thenotebook.htb
Inicialmente centraremos nuestra mira sobre el aplicativo web ofrecido en el puerto 80.
Siguiendo la sugerencia del mensaje que se presenta en la web, usaremos el apartado de Register para generarnos una cuenta:
Al hacerlo obtendremos acceso a la plataforma.
Ahora centraremos nuestro análisis en el valor de la cookie «auth«. Notemos que se trata de un JWT (JSON Web Token), por tanto los recursos online jwt.io y jwt.one, serán nuestros aliados.
A través de jwt.io lograremos entender el contenido de nuestro token:
Ahora usaremos el otro recurso (jwt.one), para cambiar algunos valores y por ende generar un nuevo token que nos permita conseguir el acceso privilegiado al aplicativo web.
Cambiaremos los apartados Header y Payload, en concreto los valores de los campos kid y admin_cap respectivamente. En donde para el primero modificaremos de localhost por nuestra IP de atacante y un puerto de nuestra elección, mientras que para el campo admin_cap, pasaremos de false a true.
Destacar en este punto que obviamente como paso complementario tendremos que generarnos una clave SSH y compartirlo bajo el nombre de privKey.key:
ssh-keygen -t rsa -b 4096 -m PEM -f privKey.key
python -m SimpleHTTPServer 4422
Para firmar el token y que quede operativo utilizaremos el contenido de la clave privKey.key. A continuación un extracto del mismo:
Si todo está correcto en este punto, de jwt.io obtendremos además del token generado, la verificación de la firma.
Ahora tan solo es llevar este token generado a la aplicación web y sustituirlo por el anterior. Observemos en la siguiente captura como llegamos a obtener acceso a una nueva funcionalidad, ésta del administrador (gracias al token creado y la clave privKey.key compartida desde nuestro equipo de atacante):
Bien pues al dirigirnos a esta nueva funcionalidad descubierta obtendremos acceso a 2 secciones, la vista de todas la notas registradas por los usuarios (View Notes) y la posibilidad de subir ficheros (Upload File). Después de revisarlas, nos decantaremos por la segunda.
Desde esta sección podremos subir una Reverse Shell en php. El contenido de mi fichero es bastante simple (para otras opciones ver las referencias):
Ahora tras darle al botón de View obtendremos nuestra Reverse Shell:
Obtención de usuario:
Ya con el primer acceso conseguido sobre el objetivo haremos algo de reconocimiento, en primer lugar echaremos un vistazo a los usuarios. Aquí identificamos que tendremos que hacernos primero con el usuario noah antes de llegar al root.
Revisando algunos directorios identificamos el siguiente registro que parece interesante de analizar:
Dado los permisos sobre este fichero comprimido, nos lo llevaremos a una ruta sobre la que tengamos posibilidad de descomprimirlo y «husmear» su contenido.
Interesante será hacernos con el fichero id_rsa aparentemente del usuario noah.
Nos lo llevamos al equipo de atacante y procedemos a comprobar su valides para el acceso vía SSH.
De esta manera obtendremos la flag del usuario.
Escalada de privilegios:
En esta máquina la escalada de privilegios fue bastante entretenida, el vector de ataque lo obtendremos al revisar el sudo -l:
Dada la versión implementada de Docker y las características de la misma se identifica que el CVE-2019-5736 le afecta y por tanto será nuestro vector:
Para el aprovechamiento de esta vulnerabilidad podemos usar la siguiente PoC (Prueba de Concepto): https://github.com/Frichetten/CVE-2019-5736-PoC
Descargamos el fichero main.go, lo editamos insertando nuestro payload para conseguir una Reverse Shell como root.
wget https://raw.githubusercontent.com/Frichetten/CVE-2019-5736-PoC/master/main.go
Antes de enviar nuestro exploit al objetivo armaremos nuestro fichero (main) de la siguiente manera:
go build main.go
A continuación la secuencia de comandos ejecutados a través de distintas terminales que nos permiten en resumidas cuentas, acceder a la instancia de Docker, preparar el exploit traspasado, ejecutarlo, intentar el acceso nuevamente a la misma instancia de Docker y finalmente la obtención de la Reverse Shell a través de Ncat.
De esta manera podremos hacernos con la flag del root.
La escalada de privilegios estuvo bastante entretenida, la parte de Docker resultó desafiante. Ahora vamos a por más.
Referencias:
- https://jwt.io/
- https://jwt.one/
- https://www.attachmate.com/es-es/documentation/reflection-desktop-v16/rdesktop-guide/data/ssh-keygen_command_rf.htm
- https://ironhackers.es/herramientas/reverse-shell-cheat-sheet/
- https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Reverse%20Shell%20Cheatsheet.md
- https://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet
- https://www.mundiserver.com/documentacion/descomprimir-tar-tar-gz-tgz-gz-zip-otras-linux/
- https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-5736
- https://github.com/Frichetten/CVE-2019-5736-PoC