> 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/tryhackme/easy/red.md).

# Red

## Información de la máquina

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

La máquina **Red** pertenece a la plataforma **TryHackMe (THM)** y tiene un nivel de dificultad **Easy**.\
El reto nos permite practicar distintas fases de un pentesting real, comenzando con vulnerabilidades web y culminando en la explotación de un binario vulnerable a nivel de sistema.

Durante el proceso se abordan técnicas de **LFI (Local File Inclusion) con filtros de PHP**, análisis de archivos sensibles en el sistema (`.bash_history` y `.reminder`), el uso de herramientas de fuerza bruta como **Hashcat** y **Hydra** para autenticación en SSH, así como la manipulación de procesos en ejecución para obtener shells interactivas. Finalmente, se explota la vulnerabilidad **CVE-2021-4034 (PwnKit)** en `pkexec` para alcanzar privilegios de administrador (root).

***

## Reconocimiento

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

<figure><img src="/files/A3Z2K5f8W1L0CPz4j67n" 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 65535 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 2 puertos abiertos, puerto 22(SSH) y puerto 80(HTTP). Ahora realizamos un escaneo más avanzado sobre estos 2 puertos

<figure><img src="/files/q4KAs8Lheau4Qln8RFok" 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 **80 (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**.

Esta es la página web que se presenta inicialmente

<figure><img src="/files/5bpKfvwDHCv5n5iH1uUD" alt=""><figcaption></figcaption></figure>

## LFI base64 filter

Comencé probando la técnica clásica de Local File Inclusion (LFI) utilizando rutas relativas con `../../../`, pero esta aproximación no arrojó ningún resultado útil.

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

Tras varios intentos, identifiqué que la aplicación permitía el uso de filtros internos de PHP, en particular el filtro que convierte el contenido en **base64**.

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

Este filtro codifica el archivo solicitado en base64, lo que nos permite extraer su contenido de manera legible tras decodificarlo.

```bash
vuln.php?page=php://filter/convert.base64-encode/resource=/etc/passwd
```

<figure><img src="/files/517C2h4UCb47sJPpIqvd" alt=""><figcaption></figcaption></figure>

Para validar su funcionamiento utilicé `curl`, concatenando la salida con `base64 -d` para decodificarla. De esta manera, confirmamos que el LFI es funcional y que podemos leer archivos del sistema.\
Al revisar `/etc/hosts`, encontramos referencias a dos usuarios locales: **Red** y **Blue**.

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

## .bash\_history & .reminder in User Blue

Al continuar revisando archivos del sistema, localizamos el historial de comandos del usuario **Blue** (`.bash_history`). Dentro de él aparecían varias instrucciones relevantes que hacían referencia a un archivo oculto llamado **.reminder**.

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

Al inspeccionar el archivo **.reminder**, observamos que contenía una **contraseña en texto claro**, posiblemente utilizada por este usuario para autenticarse en distintos servicios.

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

## Auth Blue

Para autenticarnos como el usuario **Blue**, replicamos los pasos observados en su `.bash_history`. Esto incluía crear un archivo llamado **.reminder** que contenía la contraseña previamente identificada.

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

Posteriormente, utilizando **Hashcat**, generamos una lista de posibles combinaciones derivadas de la contraseña encontrada, lo que nos permitió obtener variaciones dinámicas de la misma.

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

El siguiente paso fue emplear **Hydra** contra el servicio **SSH**, usando al usuario *Blue* junto con el diccionario generado por Hashcat.\
La contraseña resultó ser **dinámica**, es decir, cambia de forma periódica en el tiempo.

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

Una vez obtenida la contraseña válida, conseguimos autenticarnos con éxito como el usuario **Blue** a través de SSH.

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

Tras acceder a la sesión, fue posible visualizar la **primera flag del reto**.

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

## Auth Red

Durante la enumeración del sistema ejecutamos `ps -faux`, con lo que pudimos listar los procesos activos y sus respectivos usuarios.

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

En la salida observamos que el usuario **red** estaba ejecutando una **bash** redirigida a través del puerto **9001**, asociada al dominio `redrules.thm`.

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

Para interceptar esa conexión, añadimos una entrada personalizada en `/etc/hosts`, apuntando el dominio `redrules.thm` hacia nuestra propia dirección IP.

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

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

Tras configurar la escucha en el puerto **9001** y esperar la conexión entrante, conseguimos obtener una **shell interactiva** como el usuario **red**.

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

Dentro de esta sesión, fue posible acceder a la **segunda flag** del reto.

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

## Auth Root -> pkexec 0.105 version (CVE-2021-4034)

En una segunda fase de enumeración, detectamos la presencia de un directorio **.git** en el directorio personal del usuario **red**.

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

Dentro de este repositorio se incluía una copia del binario **pkexec**.

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

Al revisar la versión del binario, confirmamos que correspondía a **pkexec 0.105**.

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

Investigando esta versión en bases públicas de vulnerabilidades, encontramos que está asociada al **CVE-2021-4034 (PwnKit)**, un exploit de escalada de privilegios en `pkexec`.

{% embed url="<https://ine.com/blog/exploiting-pwnkit-cve-2021-4034-techniques-and-defensive-measures>" %}

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

Localizamos en GitHub un exploit funcional para esta vulnerabilidad.

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

Clonamos el repositorio que contenía el código del exploit.

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

Renombramos el archivo para simplificar su uso.

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

Fue necesario modificar en el exploit la ruta hacia `pkexec`, ya que en la máquina víctima no coincidía con la ruta predeterminada del script.

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

Transferimos el exploit a la máquina víctima montando un servidor HTTP con `python3 -m http.server` en nuestro host y descargándolo mediante `wget`.

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

Al ejecutar el exploit, obtuvimos una **shell como root**, logrando la escalada de privilegios.

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

Con los privilegios de administrador, finalmente accedimos a la **flag final**.

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

***

## Conclusión

La máquina **Red (THM)** demuestra cómo una vulnerabilidad aparentemente pequeña —un **LFI filtrado en base64**— puede convertirse en la puerta de entrada para el compromiso total del sistema.\
El recorrido pasa por varias fases clave:

* **Explotación inicial** mediante LFI y decodificación de archivos en base64.
* **Acceso a credenciales** en archivos de usuario (`.bash_history` y `.reminder`).
* **Autenticación en SSH** con credenciales dinámicas obtenidas por fuerza bruta.
* **Aprovechamiento de procesos expuestos** para obtener acceso al usuario Red.
* **Escalada de privilegios** mediante el exploit público del **CVE-2021-4034 (PwnKit)**.

En conjunto, la máquina enseña buenas prácticas de enumeración, la importancia de revisar archivos de configuración e historiales de comandos, y el riesgo de contar con binarios vulnerables en el sistema.\
Al finalizar, se logra el acceso completo como **root**, confirmando todas las flags y concluyendo con éxito el laboratorio.
