Friendly 2
¡Hola, hacker! ¡Bienvenido a un nuevo post!
En este artículo, abordaremos la resolución de la máquina Friendly 2 de la plataforma HackMyVM. En primer lugar, identificaremos y aprovecharemos una vulnerabilidad de LFI (Local File Inclusion) en un parámetro de la URL, lo cual nos permitirá aplicar una técnica de Directory Path Traversal para leer archivos del sistema. Entre los archivos a los que ganaremos acceso se encuentra el fichero id_rsa
del usuario gh0st
, el cual será empleado para establecer conexión vía SSH al sistema. Finalmente, para escalar nuestros privilegios, nos valdremos de en una configuración inadecuada de sudo
, específicamente en la presencia de la opción SETENV
, posibilitando la ejecución de Path Hijacking y culminando en una exitosa escalada de privilegios.
Reconocimiento
Comenzamos lanzando una traza ICMP a la máquina objetivo para comprobar que tengamos conectividad.
Reconocimento usando el comando ping
Vemos que responde al envío de nuestro paquete, verificando de esta manera que tenemos conectividad. Por otra parte, confirmamos que estamos frente a una máquina Linux basandonos en el TTL (Time To Live).
Enumeración
Descubrimiento de puertos abiertos
Realizamos un escaneo con nmap para descubrir que puertos TCP se encuentran abiertos en la máquina víctima.
1
nmap -sS -p- --open --min-rate 5000 -Pn -n 20.20.20.8 -vvv -oG scanPorts
Descubrimiento de puertos abiertos
Parámetros utilizados:
-sS
: Realiza un TCP SYN Scan para escanear de manera sigilosa, es decir, que no completa las conexiones TCP con los puertos de la máquina víctima.-p-
: Indica que debe escanear todos los puertos (es igual a-p 1-65535
).--open
: Solo considerar puertos abiertos.--min-rate 5000
: Establece el número mínimo de paquetes que nmap enviará por segundo.-Pn
: Desactiva el descubrimiento de host por medio de ping.-vvv
: Activa el modo verbose para que nos muestre resultados a medida que los encuentra.-oG
: Determina el formato del archivo en el cual se guardan los resultados obtenidos. En este caso, es un formato grepeable, el cual almacena todo en una sola línea. De esta forma, es más sencillo procesar y obtener los puertos abiertos por medio de expresiones regulares, en conjunto con otras utilidades como pueden ser grep, awk, sed, entre otras.
Enumeración de versión y servicio
Lanzamos una serie de script básicos de enumeración propios de nmap, para conocer la versión y servicio que esta corriendo bajo los puertos abiertos.
1
nmap -sCV -p22,80 -vvv -oN targeted 20.20.20.8
Descubrimiento de versión y servicio con nmap
Parámetros utilizados:
-sCV
Es la combinación de los parámetros-sC
y-sV
. El primero determina que se utilizarán una serie de scripts básiscos de enumeración propios de nmap, para conocer el servicio que esta corriendo en dichos puertos. Por su parte, el segundo parámetro permite conocer más acerca de la versión de ese servicio.-p-
: Indica que debe escanear todos los puertos (es igual a-p 1-65535
)-oN
: Determina el formato del archivo en el cual se guardan los resultados obtenidos, junto con el nombre del archivotargeted
. En este caso, utiliza el formato por defecto de nmap.-vvv
: Activa el modo verbose para que nos muestre resultados a medida que los encuentra. `
Explotación
Si ingresamos desde nuestro navegador al puerto 80 de la máquina víctima, nos encontramos con el siguiente sitio web:
Haciendo un poco de fuzzing, descubrimos una ruta llamada tools
.
1
ffuf -c -u http://20.20.20.8/FUZZ -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 20
Si accedemos a la misma, nos encontramos con la siguiente sección del sitio.
Inspecionando el código fuente del archivo html
, podemos observar un comentario particular, el cual nos revela el nombre de un archivo php
.
Código fuente Web Friendly 2 /tools/index.html
Al ingresar al archivo php
podemos observar el siguiente html:
Web Friendly 2 /tools/check_if_exist.php?doc=keyboard.html
Al parecer, se estan cargando de forma dinámica archivos html indicando su nombre a través del parámetro doc
.
Podemos comprobar esto haciendo un poco de fuzzing.
1
ffuf -fw 1 -c -u http://20.20.20.8//tools/check_if_exist.php?doc=FUZZ -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 20 -e .html
Teniendo encuenta que el script php
carga archivos de forma dinámica, intentemos leer ficheros del sistema aplicando un Directory Path Traversal.
Web Friendly 2 - Path traversal /etc/passwd
Efectivamente, pudimos leer el archivo /etc/passwd
y encontramos un usuario gh0st
.
Ahora que conocemos el nombre de un usuario, intentos leer la clave privada id_rsa
bajo el directorio /home/gh0st/.ssh/id_rsa
.
Web Friendly 2 - Path traversal /home/gh0st/.ssh/id_rsa
Genial!, logramos leer la clave privada del usuario gh0st
.
Usuario - gh0st
Copiamos la clave privada en un archivo de nuestra máquina atacante, en este caso, llamado id_rsa
y le otorgamos permisos 600
.
Pero aún falta algo. Al momento de conectarnos nos solicita una passphrase.
Podemos usar ssh2john
junto con john
para crackear la passphrase.
Passphrase: celtic
Ahora si, nos conectamos a la máquina victima como el usuario gh0st
usando su clave privada.
Leemos el flag de user.txt
.
Escalada de privilegios
Si hacemos una enumeración básica del sistema, podemos observar que el usuario gh0st
puede ejecutar con sudo
un shell script, donde la particularidad de la ejecución se da porque no se solicita contraseña (NOPASSWD) y se permite alterar variables de entorno (SETENV).
Al analizar el script, notamos que se utilizan algunos comandos ejecutándolos de manera relativa. Esto significa que podemos aprovechar esta situación, dado que poseemos la capacidad de asignar o modificar las variables de entorno, llevando a cabo lo que comúnmente se conoce como un ataque de Path Hijacking.
En primer lugar, nos movemos a un directorio en el cual podamos escribir, por ejemplo /tmp
. Luego, creamos un script llamado en este caso tr
, el cual remplazara al comando tr
original. Este pequeño script, se encarga de asignar permisos SUID al binario bash
.
1
2
#!/bin/bash
chmod u+s /bin/bash
Antes de llevar a cabo el ataque, ejecutemos el script original.
Vemos que se ejecuta de forma normal.
Ahora, ejecutemos el script asignando la variable de entorno PATH, para indicarle que debe buscar en primer lugar en el directorio /tmp
.
Si miramos los permisos del binario /bin/bash
, podemos observar que el bit SUID esta activo, por lo tanto, ya podemos escalar nuestros privilegios a root
.
De esta forma, deberiamos poder leer el flag de root.txt
, pero no aún falta. Debemos buscar otro archivo bajo un directorio llamado ...
.
Para lo cual, podemos hacer uso del comando find
.
Todavia falta un paso más y es decifrar la cadena proporcionada.
Si recordamos el script del cual nos aprovechamos para escalar nuestros privilegios, podemos notar que se esta aplicando un cifrado ROT13 a la cadena de entrada. Por lo que podemos descifrar la cadena usando ROT13 y obtener la flag.
De esta manera, concluimos la resolución de la máquina Friendly 2.
Espero que los conceptos hayan quedado claros. Si has llegado hasta este punto y aún tienes dudas, te recomiendo volver a realizar la máquina.
Gracias por tu lectura!
Happy Hacking!