Mustacchio - WriteUp (Easy)
Introducción
Les presento esta máquina de la plataforma TryHackMe llamada Mustacchio en las cuales tocamos la vulnerabilidad XXE (XML Entity Injection), enumeracion y escalación de privilegios. Para ponernos en contexto, una vulnerabilidad XXE, es una vulnerabilidad de seguridad en la que un atacante puede utilizar una entrada XML maliciosa para acceder a recursos del sistema que normalmente no estarían disponibles, como archivos locales o servicios de red. Esta vulnerabilidad puede ser explotada en aplicaciones que utilizan XML para procesar entradas, como aplicaciones web o servicios web.
Reconocimiento
Lo primero que haremos es la fase de reconocimiento, para descubrir puertos abiertos en la máquina, utilizaremos
nmap
con los siguientes parámetros para agilizar el escaneo:
- -p- : Con esto le indicamos que nos escanee los 65535 puertos de la máquina
- –open : Este parámetro indica que solo queremos ver los puertos que están abiertos
- –min-rate 5000 : Con este parámetro le indicamos que queremos enviar paquetes no mas lentos que 5000
- -sS : Este parámetro hace alusión al TCP SYN Port Scan, que es un escaneo bastante sigiloso a la par que rápido
- -n : Este parámetro es para que no aplique resoluciones DNS
- -Pn : Este parámetro es para que no nos aplique descubrimiento de host a través del protocolo de resolución de direcciones ARP
1
sudo nmap -p- --open --min-rate 5000 -sS -n -Pn <IpMachine>
Como podemos observar, nos ha reportado los puertos que están abiertos en la máquina, que son el puerto 22, el puerto 80, y el puerto 8765 los servicios a los que corresponden estos puertos son:
- Puerto 22: Corresponde al servicio SSH
- Puerto 80: Nos indica que hay un servicio web corriendo por detrás
- Puerto 8765: Nos dice indica que es un servicio ultraseek-html
Lo que haremos ahora es lanzar un conjunto de scripts por defecto a estos puertos, y también para descubrir los servicios y versiones de estos, para esto utilizaremos los siguientes parámetros:
- -p22,80,8765 : Utilizamos este parámetro de esta manera, ya que solo nos interesa escanear esos puertos que fueron reportados
- -sC : Este parámetro hace alusión a un conjunto de scripts vulnerables que tiene nmap por defecto
- -sV : Este parámetro hace alusión a descubrir las versiones de los servicios expuesto
Al estar el puerto 80 reportado lo que haré es ver que hay en aquella web, y al ingresar nos reporta esta página:
Observando la página no encontré nada interesante, así que lo que hare ahora es fuzzear para ver si puedo encontrar directorios
ocultos dentro de la web. Para esto utiliaré dirsearch
, pero existen otras herramientas bastantes útiles como fuff, wfuzz o
gobuster. Dirsearch nos ha reportado algunos sitios que pueden ser de nuestro interés:
Me llamó bastante la atención el directorio Custom, así que decidí revisar su contenido. En la primera carpeta llamada css/ no
encontré nada que pudiese ayudarme, así que decidí revisar la carpeta js/ para ver su contenido y encontré un archivo llamado
"users.bak"
así que lo descargué (solo hay que hacer click en el nombre):
Estando en nuestro terminal, nos traemos el archivo descargado a nuestra carpeta de trabajo de la siguiente manera:
(básicamente le especificamos la ruta desde donde nos queremos traer el archivo, y luego con el punto (.)
hacemos alusión al
directorio donde nos encontramos)
Como podemos notar, este archivo llamado users.bak tiene de extensión ".bak"
, así que lo que haremos es ver que tipo de archivo es
y para esto, utilizaremos el comando file
. Y como podemos ver, el archivo corresponde a SQLite 3.x
Ahora que sabemos que podemos ver el contenido de aquel archivo, en nuestra consola podemos imprimir el texto de un archivo SQlite3, al hacer esto, estaremos
interactuando con el archivo, y podemos dumpear el archivo para ver su contenido de la siguiente manera:
(si no tienes instalado SQlite3, puedes hacerlo de la siguiente manera: sudo apt install sqlite3)
Lo que haremos es aplicar fuera bruta a este hash para poder descubrir la password del usuario admin, y para esto utilizaremos John The Ripper, nos crearemos un archivo llamado hash y pondremos el hash que nos encontramos dentro de users.bak : 1868e36a6d2b17d4c2745f1659433a54d4bc5f4b y podemos ver que nos ha reportado la password: bulldog19 Lo que yo siempre recomiendo es crear un archivo llamado credentials.txt para guardar las credenciales que encontremos. (Aunque pueden nombrarlo como ustedes prefieran).
1
2
3
4
5
nano hash --> 1868e36a6d2b17d4c2745f1659433a54d4bc5f4b
john --wordlist=/usr/share/wordlists/rockyou.txt hash
nano credentials.txt --> user: admin password: bulldog19
Una vez tenemos las credenciales, iremos a la web y especificaremos el puerto 8765 donde podemos ver que nos redirige a un panel de administrador, como nosotros tenemos las credenciales de admin, lo que haremos es colocarlas en este panel:
Luego de que accedamos con las credenciales de admin nos lanza a esta web, y en el recuadro de en medio nos dice que podemos añadir un comentario, en este caso el comentario que añadí fue hola:
Me llamó bastante la atención y decidí interceptar la petición con Burpsuit
para ver lo que estaba sucediendo. Hay algo muy curioso, ya que al enviar el
comentario de “hola” nos aparece xml=hola
La petición que interceptamos la enviamos al repeater, y luego con Send
enviamos la petición. Si analizamos el código nos daremos cuenta que hay una ruta
especificada, y esa ruta tiene un archivo llamado dontforget.bak y si vemos más abajo, hay un comentario que dice: Barry, you can now SSH in using your key!
esto nos puede decir algo muy interesante:
Al momento de colocar la ruta en la URL, nos descarga el archivo llamado dontforget.bak
:
Si analizamos el archivo descargado, se puede observar que tiene la misma extensión del archivo user.bak, pero de todas maneras debemos volver a ver que tipo de archivo es:
El archivo nos proporciona una estructura XML que se puede utilizar para poder modificar la petición desde Burpsuite:
Al tener la estructura XML propocionada, podemos copiarla y pegarla en la web donde pedía añadir un comentario, para esto utilizaremos Burpsuite para interceptar la petición:
Cuando se intercepte la petición con Burpsuite, en la estructura XML se incluirá DOCTYPE
, author y especificarle la ruta que se quiere observar (se puede borrar el
comentario para que se vea mas limpio), al enviar la petición, podemos ver que la respuesta dada representa al /etc/passwd
, que es la ruta que especificamos:
Ejemplo:
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE author [<!ENTITY read SYSTEM 'file:///etc/passwd'>]>
<comment>
<name>Joe Hamd</name>
<author>&read;</author>
<com>
</com>
</comment>
Como sabemos que estamos apuntando a archivos dentro de la máquina, podemos saber con una pista clave anteriormente vista, y es que barry puede utilizar SSH,
así que ahora podemos apuntar directamente al id_rsa
de barry, y el resultado que nos arroja es su llave privada de SSH:
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE author [<!ENTITY read SYSTEM 'file:///home/barry/.ssh/id_rsa'>]>
<comment>
<name>Joe Hamd</name>
<author>&read;</author>
<com>
</com>
</comment>
Copiamos la llave de barry, crearemos un archivo llamado id_rsa donde pondremos la llave privada de barry, con chmod le daremos permisos 600, con ssh2john
convertimos el id_rsa en un hash para luego crackearlo con JohnTheRipper:
1
2
3
ssh2john id_rsa > hash
john --wordlist=/usr/share/wordlists/rockyou.txt hash
Al momento de obtener la contraseña, lo que haremos es conectarnos a través de SSH utilizando la clave privada que es el id_rsa que obtuvimos y lo utilizaremos
para la autenticación, con el parámetro -i le indicamos el id_rsa, luego nos pedirá la contraseña que crackeamos con john
, la colocamos y ya estaremos dentro:
Cuando estemos dentro, listamos los archivos que estén en el directorio actual, y encontraremos la primera flag de este CTF:
Lo que haré yo en este caso, será enumerar los permisos SUID, y encontré algo bastante interesante, llamado live_log
dentro del directorio de joe:
Como sabemos que el archivo live_log está dentro del directorio de joe, lo que haremos es ver sus permisos, y como sabemos que tenemos permisos de lectura, ejecutaremos un strings junto con este archivo. Al leerlo, nos encontraremos con la sorpresa de que se está ejecutando un comando, el cual lo que hace, es seguir el contenido de un archivo de registro, y a su vez mostrar nueva información que se agregue al final del archivo:
Ya que sabemos que se ejecuta con privilegios de root, lo que haremos para explotarlo es lo siguiente: crearemos un archivo que se llame tail, a este archivo le
pasamos un /bin/bash, lo que hará es que cuando se ejecute este archivo llamado tail, nos entregue una shell, luego le daremos todos los privilegios a este archivo,
y luego la ruta la exportaremos al PATH
:
Luego nos vamos a la carpeta de joe, y ejecutamos el archivo live_log
, y automáticamente nos convertiremos en usuario root, luego nos dirigimos a la carpeta
root y leemos la última flag de este CTF:
Máquina muy divertida la verdad, otra manera de poder explotarla pudo haber sido utilizando PwnKit, pero no siempre es lo ideal. Espero les haya gustado!.
PD: Si ven distintas máquinas dentro de todo este CTF, es que tuve problemas con algunas de las máquinas, pero finalmente ya está todo solucionado.