Entrada

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.

Friendly2 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

Friendly2 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

Friendly2 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 archivo targeted. 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:

Friendly2 Web Friendly 2

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

Friendly2 Fuzzing Web Friendly 2

Si accedemos a la misma, nos encontramos con la siguiente sección del sitio.

Friendly2 Web Friendly 2

Inspecionando el código fuente del archivo html, podemos observar un comentario particular, el cual nos revela el nombre de un archivo php.

Friendly2 Código fuente Web Friendly 2 /tools/index.html

Al ingresar al archivo php podemos observar el siguiente html:

Friendly2 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

Friendly2 Fuzzing Web Friendly 2

Teniendo encuenta que el script php carga archivos de forma dinámica, intentemos leer ficheros del sistema aplicando un Directory Path Traversal.

Friendly2 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.

Friendly2 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.

Friendly2 Friendly 2 - ssh passphrase

Podemos usar ssh2john junto con john para crackear la passphrase.

Friendly2 Friendly 2 - ssh2john - john

Passphrase: celtic

Ahora si, nos conectamos a la máquina victima como el usuario gh0st usando su clave privada.

Friendly2 Friendly 2 - gh0st

Leemos el flag de user.txt.

Friendly2 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).

Friendly2 sudo -l

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.

Friendly2 /opt/security.sh

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

Friendly2 /tmp/tr

Antes de llevar a cabo el ataque, ejecutemos el script original.

Friendly2 /opt/security.sh

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.

Friendly2 /opt/security.sh

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.

Friendly2 /bin/bash

De esta forma, deberiamos poder leer el flag de root.txt, pero no aún falta. Debemos buscar otro archivo bajo un directorio llamado ....

Friendly2 root.txt

Para lo cual, podemos hacer uso del comando find.

Friendly2 cat /…/ebbg.txt

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.

Friendly2 /…/ebbg.txt

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!

Esta entrada está licenciada bajo CC BY 4.0 por el autor.