> 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/medium/environment.md).

# Environment

## Información de la máquina

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

`Environment` es una máquina Linux de dificultad media. El acceso inicial implica la explotación de [CVE-2024-52301](https://nvd.nist.gov/vuln/detail/CVE-2024-52301), que permite manipular el entorno mediante el parámetro `--env`, omitiendo así la funcionalidad de inicio de sesión. Desde el panel de administración, se explota [CVE-2024-2154](https://nvd.nist.gov/vuln/detail/CVE-2024-2154) para cargar una webshell `PHP` incrustada en una imagen de perfil, lo que permite al jugador acceder mediante la ejecución de comandos. En el sistema comprometido, se pueden encontrar claves `GPG` expuestas junto con una copia de seguridad cifrada. Los datos descifrados contienen contraseñas de usuario válidas, lo que permite el acceso `SSH`. La escalada de privilegios se logra mediante el uso de permisos de sudo. El usuario puede ejecutar un script con privilegios elevados. Aunque el script en sí es inofensivo, la variable de entorno `BASH_ENV` se conserva al aumentar los privilegios, lo que permite la ejecución de comandos arbitrarios como root.

***

## Reconocimiento

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

<figure><img src="/files/Fv6dRo8QBHWYWNqVtmg0" 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 80 **(HTTP)** están abiertos. Ahora realizamos un escaneo más detallado:

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

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

Con `-p22,80`, le indicamos que **solo** escanee los puertos **22 (SSH)** y 8**0** (HTTP).

**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**.

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

## Enumeración de directorios con feroxbuster

El proceso de enumeración de directorios identificó endpoints de interés:(`/mailing`), posiblemente vinculado a gestión o envío de mensajes; un endpoint de autenticación (`/login`), utilizado como punto de entrada para credenciales de usuarios; y un endpoint de carga de archivos (`/upload`), entre otros.

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

**Directorio raíz (`/`)**: Se visualiza el contenido inicial de la aplicación, que sirve como punto de entrada principal para la navegación y análisis.

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

**Ruta `/login`**: Corresponde al formulario de autenticación de usuarios, donde se gestionan las credenciales para el acceso a la aplicación.

<figure><img src="/files/9XJDLSir6KQlnHXrxULs" alt=""><figcaption></figcaption></figure>

Devuelve una página específica (posiblemente relacionada con pruebas de disponibilidad o funcionalidad interna), lo que indica la existencia de endpoints adicionales no documentados.

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

**Ruta `/upload`**: Al intentar acceder, la aplicación responde con un error que expone información sensible. Concretamente, se revelan la versión del intérprete **PHP** y del framework **Laravel**, lo que proporciona datos de huella tecnológica útiles para identificar posibles vulnerabilidades asociadas a esas versiones.

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

## CVE-2024-52301 -> --env variable

**CVE-2024-52301** es una vulnerabilidad de *argument injection* en el framework **Laravel**: cuando `register_argc_argv` en PHP está activado, un atacante puede inyectar valores de `argv` a través de la cadena de consulta (query string) y forzar que Laravel use un *environment* distinto (p. ej. `--env`) durante el procesamiento de la petición. Esto permite manipular la detección del entorno de ejecución de la app.

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

Repositorios y PoC/escáneres públicos muestran que la explotación se basa en pasar fragmentos `argv` en la query string (p. ej. `argv[0]=--env` / `argv[1]=value` o la sintaxis `--env=value`) para que la lógica de detección del framework lo interprete como parámetros CLI.

{% embed url="<https://github.com/Nyamort/CVE-2024-52301>" %}

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

La petición a `/login` transmite `_token`, `email`, `password`, `remember`. Si se envía la petición sin `email` y `password` la app responde con `500 Internal Server Error`. Los errores se muestran en la página (stack trace / mensajes), y además en `/upload` ya habíamos visto que el servidor revela la versión de **PHP** y **Laravel**.

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

La aplicación devuelve **mensajes de error y stack traces en respuestas HTTP** visibles desde el navegador, lo cual expone información sensible sobre la implementación y el flujo de procesamiento.&#x20;

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

## Login Bypass

Al inyectar un valor no booleano en un parámetro esperado como `True`/`False`

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

La aplicación devolvía un error distinto que revelaba la presencia de un *entorno* denominado **preprod**.&#x20;

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

Aprovechando esto se forzó que la aplicación cargase el *environment* `preprod`

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

&#x20;Como resultado, conseguimos eludir el flujo de autenticación y acceder a `/management/dashboard`.

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

## File Upload -> CVE-2024-21546 -> RCE -> Shell www-data

Observamos una funcionalidad de *upload* en la sección de perfil.

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

Interceptamos la petición HTTP con BurpSuite añadiendo una imagen cualquiera

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

La respuesta/metadata del servidor revela la ruta de almacenamiento absoluta o la URL pública del fichero subido. (Dato informativo, no esencial para la explotación).

<figure><img src="/files/1MKtnwAkYof6F08T2D8t" alt=""><figcaption></figcaption></figure>

Forzando una condición de fallo en el upload (payload malformado/tipo no permitido) se obtiene un mensaje de error detallado desde el servidor.

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

El mensaje/stacktrace identifica la librería `unisharp/laravel-filemanager` como componente responsable del manejo de ficheros.

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

Al buscar la librería con bases de vulnerabilidades se identifica la vulnerabilidad registrada como CVE (disponible en bases públicas); se trata de una inyección/ejecución remota de código relacionada con la validación incorrecta del tipo MIME y la manipulación del nombre de archivo.

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

Este script en Python disponibles públicamente que automatizan el proceso de explotación

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

Clonamos el repositorio

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

Se parametriza el script  y se levanta un listener con netcat para aceptar la reverse shell cuando ésta se conecte.

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

La ejecución del payload proporciona una shell remota con los privilegios del proceso web (habitualmente `www-data`), confirmando ejecución remota de código con el contexto del servidor web.

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

## Shell hish -> Decrypt gpg file

Hemos obtenido acceso inicial limitado al usuario `www-data` y logrado localizar el archivo `user.txt.` El siguiente paso consiste en escalar privilegios para obtener un shell con privilegios de `root`.

<figure><img src="/files/2rbliPSfbRQ9ycwdnHEQ" alt=""><figcaption></figcaption></figure>

Se identifica un archivo cifrado (`.gpg`) en `/home/hish/backup`. Al intentar descifrarlo desde el contexto del usuario actual, el proceso falla debido a restricciones de permisos de acceso al directorio `.gnupg` del propietario.

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

Creamos un directorio temporal en `/tmp` y copiamos de manera recursiva el directorio `.gnupg` del usuario `hish`, que contiene la clave privada y configuración de GPG. Posteriormente, utilizamos `gpg -d --home /tmp/<directorio>` para especificar un *home* alternativo y descifrar el archivo `.gpg`, extrayendo así las credenciales almacenadas de `hish`

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

Con las credenciales obtenidas (usuario `hish` y su contraseña), se establece una sesión SSH hacia el host `Environment.htb`, obteniendo un shell con los privilegios del usuario `hish`

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

## Root Access

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

Cuando Bash se inicia, decide qué archivos de configuración leer en función de cómo fue invocado:

* **Shell interactivo** (cuando abres una terminal): Bash carga archivos como `~/.bashrc` o `~/.bash_profile` para configurar tu entorno.
* **Shell no interactivo** (cuando se ejecuta un script o se llama a `bash -c`): Bash normalmente no carga esos archivos de configuración.
  * Sin embargo, si la variable de entorno **`BASH_ENV`** está definida, Bash toma su valor como la ruta de un archivo y lo ejecuta antes de correr el script.
  * Esto equivale a decir: *“si existe `BASH_ENV`, antes de ejecutar nada, ejecuta el contenido de ese archivo”*.
* Importante: Bash no busca ese archivo en las rutas del `PATH`, sino que debe estar indicado de manera explícita (con ruta relativa o absoluta).
* Si el shell no interactivo además se abre con la opción `--login`, entonces Bash intenta cargar los mismos archivos que cargaría un shell de inicio de sesión (`/etc/profile`, `~/.bash_profile`, etc.), independientemente de `BASH_ENV`.

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

Tenemos acceso como root

<figure><img src="/files/08xwCsBLFgHbHAcNecHG" alt=""><figcaption></figcaption></figure>

Podemos ver la flag final.

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

***

## Conclusión

La máquina **Environment** representa un escenario de dificultad media que permite practicar técnicas completas de post-explotación en un entorno Linux. El acceso inicial se logra mediante la explotación de **CVE-2024-52301**, una vulnerabilidad de *argument injection* que permite manipular el entorno de ejecución de la aplicación Laravel y eludir la autenticación estándar. Posteriormente, mediante **CVE-2024-21546**, se explota la funcionalidad de subida de archivos para inyectar una webshell PHP en el perfil de usuario, lo que permite ejecutar comandos arbitrarios con los privilegios del proceso web (`www-data`).

Durante la fase de post-explotación, se identificaron archivos GPG cifrados que contenían credenciales de usuarios. Aprovechando la capacidad de GPG de especificar un *home* alternativo, se pudo descifrar la copia de seguridad y obtener la contraseña del usuario `hish`. Con estas credenciales, se estableció una conexión SSH, avanzando la escalada de privilegios hacia un usuario con mayores permisos.

Finalmente, la escalada a **root** se realizó explotando la persistencia de la variable de entorno `BASH_ENV` en un script ejecutable con privilegios de sudo. Esto permitió ejecutar comandos arbitrarios como `root`, culminando con la obtención de la flag final.
