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

# Alert

## Información de la máquina

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

Alert es una máquina Linux de nivel fácil con un sitio web para subir, ver y compartir archivos Markdown. El sitio es vulnerable a `secuencias de comandos entre sitios (XSS)`, que se explota para acceder a una página interna vulnerable a lectura arbitraria de archivos y se utiliza para obtener acceso a un `hash de contraseña`. Posteriormente, se descifra el hash para revelar las credenciales utilizadas para obtener acceso SSH al objetivo. La enumeración de los procesos que se ejecutan en el sistema muestra un archivo `PHP` que se ejecuta regularmente, con privilegios excesivos para el grupo de administración al que pertenece nuestro usuario, lo que nos permite sobrescribirlo para la ejecución de código como root.

***

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

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

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/KQaozvPGorQgEOKGpWwL" 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/YD9DJ1WcXEVvkwwNn2j2" 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**.

Cambiaremos el /etc/host ya que se aplica una redirección al dominio `strutted.htb` .

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

## Enumeración web

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

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

Al parecer se produce una redirección a <http://alert.htb/index.php?page=alert>.

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

Esta es la página web de la máquina. Vemos una subida de archivos markdown, una página de contacto y otras dos que contienen información de como se usa la página.

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

Esta es la página de contacto.&#x20;

Antes de nada, buscaremos directorios y subdominios disponibles con GoBuster.

{% hint style="success" %}
Gobuster es una herramienta de software escrita en el lenguaje de programación Go para encontrar directorios y archivos ocultos en sitios web, lo hace realizando ataques de fuerza bruta.
{% endhint %}

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

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

Encontramos una página `messages` que no se puede ver directamente en la página y un subdominio `statistics.alert.htb`

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

Esta es la página de messages y vemos que no se muestra nada. Ahora probaría a subir un archivo markdown para ver como se comporta la página:

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

Añadimos este contenido de prueba.

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

Subimos el archivo, y vemos que se nos interpreta el código y lo muestra. Ahora, si subimos un archivo .md igual pero en vez de poner código en formato markdown probamos a poner código JavaScript:

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

Si subimos el archivo igual que el anterior, vemos que se interpreta.

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

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

Si podemos enviar un enlace al archivo que subimos y existe una página de contacto, podemos deducir que alguien revisa esos archivos. Si enviamos un archivo JavaScript malicioso y le proporcionamos el enlace al administrador, y este lo abre, podríamos explotar un posible XSS.

{% hint style="success" %}
XSS es un tipo de ataque informático que permite a un actor de amenazas ejecutar código malicioso en el navegador de otro usuario.
{% endhint %}

***

## Get credentials via XXS

Usaremos un archivo JS malicioso que apunte a nuestra IP.&#x20;

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

Vemos que recibimos una petición de nosotros mismos al archivo pwned.js

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

De tal forma que, ahora probaremos a mandarle el enlace al administrados por el formulario de Contact Us. Como teniamos una página que habiamos encontrado llamada messages y no veiamos nada nosotros, probaremos a ver si el administrador tiene algo diferente a nosotros, de tal forma:

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

Enviaremos una solicitud a la página de mensajes y luego nos enviaremos una petición a nosotros mismo de la respuesta en base64. Si subimos el archivo y el enlace se lo pasamos al administrador:

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

Recibimos una cadena en base64. Si la decodificamos a texto plano obtenemos la siguiente información:

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

Vemos que hay un archivo .txt con un parámetro ?file.

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

No podemos ver el archivo directamente, pero si existe en la máquina víctima, podemos intentar acceder a otro archivo y observar si obtenemos una respuesta. Repetiremos el mismo proceso de enviar el archivo al administrador, pero esta vez apuntando a otro, como en mi caso, el `/etc/passwd`.

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

Cambiamos el pwned.js

<figure><img src="/files/64mHkYGBuytPcp4kuqxt" alt=""><figcaption></figcaption></figure>

Vemos que obtenemos una cadena muy larga en base64.

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

<figure><img src="/files/85IlQS67qccLZLh9UmUB" alt=""><figcaption></figcaption></figure>

Vemos que se muestra el contenido de `/etc/passwd`. Si intentamos acceder a la ruta de `id_rsa` para usarla como clave SSH, no funcionará. Sin embargo, sabemos que se está utilizando Apache en la máquina, por lo que podemos buscar su archivo de configuración en `/etc/apache2/sites-available/000-default.conf`. De esta forma:

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

Modificamos de nuevo el archivo.

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

Obtenemos la cadena en base64 y la decodificamos:

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

Nos muestra un subdominio que ya obtuvimos antes y una ruta con autenticación de usuarios, por lo que haremos los mismo pasos:

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

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

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

## Password cracking & Initial access Albert

Vemos que obtenemos una contraseña encriptada, por lo que usaremos hashcat para descifrarla

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

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

USER: `albert`, PASS: `manchesterunited`

Probaremos a meternos con SSH con las credenciales obtenidas:

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

Hemos conseguido ingresar a la máquina como el usuario albert y podemos ver la primera flag.

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

Ahora toca escalar privilegios y tener control total de la máquina.

## Root access via misconfigured privileges in directory

Enumerando el sistema, vemos que el usuario tiene un grupo asignado llamado `management`

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

Si buscamos archivos que tengan este grupo obtenemos un archivo de configuración php y una ruta que parece otro proyecto distinto al que hemos visto.

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

Si vemos los puertos que hay abiertos en la máquina, obtenemos un nuevo puerto, el 8080

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

Por lo que usaremos PortForwarding para que el puerto 8080 de la máquina sea el puerto 8080 de la mía

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

De tal forma que esto es lo que vemos:

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

Si vemos la ruta website-monitor, vemos que hay un directorio monitors y que tenemos permisos de escritura en el archivo.

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

Esto es lo que contiene el directorio de la página

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

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

Este es el archivo alert.htb. Por lo que si esto se ejecuta como root y tengo permisos de escritura en el directorio monitors, puedo crear un archivo que ejecute un comando para añadirle privilegios SUID a la bash de tal forma que:

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

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

Vemos que el archivo creado existe en la máquina.

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

Tenemos ya privilegios en la Bash. Ahora solo falta entrar como root:

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

Buscamos la flag final y la obtenemos 🚀.

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

***

## Conclusión

La máquina **Alert** demuestra cómo una cadena de vulnerabilidades puede explotarse progresivamente para lograr una escalada de privilegios completa en un sistema Linux.

El punto de entrada es una vulnerabilidad **XSS**, que permite acceder a una página interna con **lectura arbitraria de archivos**. A partir de esta brecha, se obtiene un **hash de contraseña**, que una vez descifrado, brinda acceso **SSH** al sistema.

Finalmente, la explotación de un **archivo PHP con permisos excesivos** permite la ejecución de código como **root**, otorgando control total sobre la máquina.
