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

# Expose

## Información de la máquina

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

En esta ocasión vamos a resolver **Expose**, una máquina de dificultad fácil en TryHackMe.\
Como siempre, comenzaremos con una fase de reconocimiento para identificar los servicios expuestos en el sistema objetivo, seguido de técnicas de enumeración web, explotación mediante inyección SQL, vulnerabilidad de inclusión local de archivos (LFI), escalada de privilegios mediante subida de archivos y finalmente, una escalada a root aprovechando un binario con SUID.

***

## Reconocimiento

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

<figure><img src="/files/40Lj53UOoPTm0agFqxrd" 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 **`allPorts` .**

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

**1.** `-p<ports>` **→ Escaneo de puertos específicos**

Con `-p<ports>`, le indicamos que **solo** escanee los puertos que le indicamos

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

**Cuando visitamos la página, lo primero que observamos es lo siguiente:**

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

## Fuzzing web

Comenzamos haciendo un escaneo de directorios ocultos con **Gobuster**. Encontramos dos directorios interesantes:

* `/admin`
* `/admin_101`

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

Esta es la página que vemos cuando accedemos a admin

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

Esta es la página que aparece al acceder a `/admin_101`. En ella ya viene un correo electrónico pre-rellenado.

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

## SQLi admin\_101 login

Probamos con fuerza bruta y contraseñas comunes en el login, pero no conseguimos acceso.\
Como siguiente paso, capturamos la petición de inicio de sesión con **BurpSuite**, guardamos la petición en formato `.req` y la analizamos con **sqlmap** para comprobar si es vulnerable a SQL Injection.

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

**Guardamos la petición en un archivo y se la pasamos a sqlmap.**

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

**sqlmap detecta que el parámetro `email` es vulnerable a SQLi.**

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

Nos muestra las bases de datos existentes, entre las que destaca una llamada expose.

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

Consultamos las tablas dentro de expose y encontramos:

* `user`
* `config`

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

Volcamos el contenido de la tabla `user` y obtenemos un usuario y contraseña para el login de `/admin_101`.

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

También extraemos la información de la tabla `config`.

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

De ahí obtenemos dos posibles directorios. En uno de ellos nos aparece una contraseña:

* **easytohack**\
  En el otro, nos indica que solo es accesible por un usuario cuyo nombre empieza por **z**.

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

Probamos a iniciar sesión en `/admin_101` con las credenciales obtenidas, pero no encontramos nada relevante.

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

## LFI in parameter file in /file1010111/index.php

Accedemos a la ruta **/file1010111/index.php**. Nos solicita una contraseña, pero ya la conocemos, así que accedemos sin problemas. La página menciona que hay un parámetro importante.

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

Al revisar el código fuente, encontramos una pista que sugiere probar los parámetros `file` o `view`.

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

Realizamos pruebas de Local File Inclusion (LFI) y logramos listar el contenido de `/etc/passwd`.

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

Encontramos un usuario llamado **zeamkish**, que coincide con la pista anterior sobre un usuario que empieza por **z**. Por ello, decidimos visitar el otro directorio que encontramos.

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

## Access upload-cv00101011

Accedemos con el usuario **zeamkish** que acabamos de descubrir.

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

## File Upload to RCE

En esta página podemos subir archivos. Capturamos la petición con **BurpSuite**.

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

Subimos una imagen y observamos que el archivo se guarda en el directorio /upload\_thm\_1001.

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

Modificamos el contenido de la imagen para incluir código PHP malicioso (webshell) y cambiamos la extensión del archivo para que se acepte. La subida es exitosa.

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

**Al acceder a este archivo, obtenemos ejecución remota de comandos (RCE).**

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

## Access via Web

Ahora establecemos una **reverse shell** usando el oneliner clásico.

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

Ponemos un listener en netcat y obtenemos acceso interactivo.

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

Al revisar el directorio `/home/zeamkish`, encontramos un archivo con las credenciales para acceder por **SSH**.

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

## Access zeamkish

Utilizamos las credenciales encontradas y accedemos vía SSH como **zeamkish**.

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

Aquí ya podemos ver la primera flag.

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

## Privilege escalation -> SUID find binary

Enumerando el sistema, buscamos binarios con permisos **SUID**.

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

Encontramos el binario find, que no suele ser de los más típicos con este permiso.

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

Consultamos en **GTFOBins** y confirmamos que podemos escalar privilegios con `find` gracias a su configuración SUID.

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

Ejecutamos el comando correspondiente y conseguimos acceso como **root**.\
Podemos leer la flag final.

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

***

## Conclusión

En esta máquina, hemos seguido un flujo clásico en entornos CTF pero con técnicas que perfectamente se pueden ver en entornos reales:

* **Reconocimiento de servicios con Nmap**, para descubrir servicios ocultos.
* **Enumeración web con fuzzing**, lo que nos permitió descubrir directorios sensibles.
* **Explotación de SQLi**, que nos facilitó credenciales y rutas adicionales.
* **LFI para enumerar usuarios del sistema**, ganando así más contexto.
* **Subida de archivo malicioso para obtener RCE**, logrando una shell reversa.
* **Escalada de privilegios vía binario SUID find**, explotando un mal ajuste de permisos.
