Retos CTF, Flags y Codificación
La diversión de resolver un reto CTF
El corazón de cualquier Capture The Flag (CTF) es el proceso de resolución. Ya sea mediante lógica, ingeniería inversa de un script de JavaScript, explotando un desbordamiento de memoria o descifrando un algoritmo de ofuscación como un ROT-3, la satisfacción reside en el "¡Eureka!".
Sin embargo, en el mundo de la seguridad informática, llegar a la solución es solo la mitad del camino.
La otra mitad es demostrar que tienes la solución correcta mediante el envío del flag correcto.
¿Qué es un FLAG y por qué usamos "md5sum"?
Un FLAG es la evidencia de que has superado el desafío.
En muchas plataformas, este no es una simple palabra, sino un hash criptográfico (frecuentemente MD5).
¿Por qué se usa MD5?
- Integridad: Un hash MD5 convierte cualquier entrada (una contraseña, una frase o un archivo) en una cadena única de 32 caracteres hexadecimales.
- Efecto Avalancha: Si cambias una sola letra o incluso un espacio invisible, el hash resultante será totalmente distinto.
- Estandarización: Permite que la plataforma verifique tu respuesta sin necesidad de almacenar la frase original en texto claro.
El enemigo invisible: Problemas de codificación
Acabamos de entrar en el terreno pantanoso de la codificación de caracteres (Encoding).
Aquí es donde muchos competidores se frustran.
En mi caso, veo que tras resolver el reto, obtengo la frase de victoria: La validación c******************ad (oculto parte para proteger el reto), pero al generar el hash, veo que no coincide con la que indica la plataforma como solución.
El reto de ProtAAPP CTF para la RootedCON probablemente fue diseñado en un entorno antiguo o el servidor web procesó la cadena como ISO-8859-1 antes de generar el hash.
En otras plataformas te encontrarás simplemente con el problema de el flag se rechaza o no te puntua el reto como resuelto.
¿Por qué ocurre esto?
Simplemente es por cómo el ordenador interpreta caracteres especiales como las tildes (ó) o las eñes (ñ).
- UTF-8: Es el estándar actual. Una letra como la "ó" ocupa 2 bytes.
- ISO-8859-1 (Latin-1): Es un estándar antiguo. Esa misma "ó" ocupa solo 1 byte.
Si la plataforma espera el hash de la frase en formato antiguo y tú lo envías en formato moderno, los hashes no coincidirán aunque la frase sea "la misma".
La necesidad de una solución (hash) de prueba
Para evitar perder horas en un bucle de errores, es vital disponer de una solución de referencia.
Si el reto te indica que la respuesta es una frase y te da un flag de ejemplo, úsalos para testear tu entorno:
- Genera el hash de la frase en tu terminal.
- Compara si tu hash coincide con el del flag de ejemplo.
- Si no coinciden, no es que tu lógica esté mal, es que tu codificación es distinta.
Estaba divirtiendome realizando el reto de ProtAAPP CTF para la RootedCON y en un momento determinado he detectado que el flag generado desde mi equipo no era igual al que mostraba como solución el equipo de ProtAAPP.
Observo lo siguiente:
| Formato | Cómo se ve la "ó" (Hex) | Resultado MD5 |
|---|---|---|
| UTF-8 | c3 b3 |
e8c296114f*****fba75d0b700cea056 (El que me salía a mi) |
| ISO-8859-1 | f3 |
b3d021218f*****6e0fbb7cb64ebb408 (El del flag) |
Nota: Oculto parte del hash para no descubrir ninguna solución.
Solución técnica en Linux: El poder de iconv
Si trabajas en Linux, tu terminal probablemente use UTF-8 por defecto.
En este punto se suele producir el clásico "Choque de Estándares".
Tu sistema Linux moderno utiliza UTF-8, donde la letra ó es un carácter "multibyte" (ocupa más espacio).
Sin embargo, el creador del reto ha procesado y codificado la respuesta usando ISO-8859-1 (también llamado Latin-1), donde la ó es un solo byte.
Si necesitas generar un flag que requiera codificación antigua (como Latin-1), no necesitas cambiar la configuración de tu sistema, simplemente basta con usar la herramienta iconv.
El comando maestro:
Para convertir el flujo de texto antes de pasarlo al calculador de hashes, crealo de la siguiente forma:
printf "Tu frase con tildes" | iconv -f UTF-8 -t ISO-8859-1 | md5sum
printf: Envía la cadena exacta sin saltos de línea accidentales.iconv -f UTF-8 -t ISO-8859-1: Toma la entrada en formato moderno (From UTF-8) y la transforma al formato esperado (To ISO-8859-1).md5sum: Calcula el hash final sobre los bytes correctos.
Usamos iconv, para "viajar en el tiempo" a una codificación antigua, y por fin los bytes han encajado perfectamente para generar el hash solicitado del flag.
Conclusión
En ciberseguridad, los detalles son los que marcan la diferencia entre un exploit exitoso y un fallo estrepitoso.
Entender la codificación de caracteres te ahorrará frustraciones y te convertirá en un analista mucho más preciso.
Por qué es importante para un Auditor de Seguridad
El detalle de la codificación de una ó no es solo una curiosidad de CTF.
En auditorías reales, las discrepancias de codificación entre un navegador y una base de datos pueden:
- Provocar Bypass de WAFs: Los firewalls a veces no entienden caracteres multibyte y dejan pasar ataques.
- Corromper Firmas Digitales: Si el emisor firma en UTF-8 y el receptor valida en Latin-1, la firma fallará siempre.