Perspectivas en competiciones CTF (I)

Esta entrada corre a cargo de @tunelko, analista de seguridad miembro de @DefConUA y apasionado jugador de competiciones CTF.


Disclaimer: Este artículo es simplemente la opinión de su autor a través de la experiencia en años de competición. No intenta establecer base de ningún tipo en modo alguno.

A lo largo de estos años hemos ido leyendo cada vez más y más acerca de las llamadas competiciones de seguridad informática o “Capture The Flag” en el sector. He tenido la suerte de participar en algunas competiciones CTF, tanto nacionales como internacionales, en equipo o de forma individual, y en las más variadas formas que uno pueda imaginar. Si lees este blog, ya habrás visto algún artículo relacionado con el tema, así que supongo que ya sabrás en qué consiste eso de los CTF, ¿verdad? :)

De forma muy resumida podemos decir que son competiciones entre personas o equipos para conseguir superar un número determinado de pruebas técnicas de diversas disciplinas. Aquí os dejo un enlace donde podéis ampliar toda esta información inicial.​

Quería redactar estos artículos pensando cómo no escribir lo mismo que otros ya han escrito, pero sin dejar de pensar que habrá personas que desconozcan por completo este tema. A la vez, quería hacerlo desde un punto de vista crítico y hablar sobre el panorama actual de este tipo de competiciones en relación a lo que se realiza a nivel nacional en España. Y por último, me interesaba aportar un punto de vista distinto para comunicar lo necesario que puede llegar a ser un CTF si lo utilizamos, por ejemplo, para realizar procesos de selección o de formación. Uno puede conocer el nivel técnico de un jugador analizando cómo se ha intentado resolver una prueba, y el jugador a su vez puede optar por un puesto de trabajo aunque no haya resuelto completamente el “puzzle”. Interesante para ambas partes, ¿No?

Los CTF internacionales se suelen organizar integrados en los propios eventos de seguridad.

Hay una fase de clasificación y una participación posterior en la final del CTF dentro del propio evento. Desgraciadamente en España, salvo honrosas excepciones, esto no es así. Quiero pensar que organizar un congreso de seguridad lleva el suficiente tiempo como para no poder montar algo que requiere centrar toda la atención en varios puntos: que sea atractivo para el jugador y calibrado desde el que lo organiza, que se realice pensando en la infraestructura y, por si esto fuera poco, hay que regalar algo al ganador.

Como mencionaba antes, las competiciones foráneas suelen dividirse en fases de clasificación donde los equipos viajan a los países organizadores (si logran clasificarse para la final) y los costes del viaje son abonados, o bien por el propio equipo a través de patrocinadores locales, o bien por los propios patrocinadores del evento. Suele ser un mecanismo habitual para incentivar a jugadores que en muchas ocasiones están a miles de kilómetros de distancia.

Organizar un CTF, kit de supervivencia básico.

Desde mi punto de vista para poder organizar un CTF no hay que reinventar la rueda ni romperse mucho la cabeza, de verdad, sobre todo si es la primera vez. Sólo hacen falta algunas pautas de sentido común, paciencia e infraestructura que lo soporte. Ah, y pruebas ;)

Infraestructura necesaria.

Antes de poder definir lo que nos conviene a nivel de máquinas debemos pensar el número de potenciales participantes. Si no lo sabemos o nos cuesta mucho predecirlo deberíamos tener clara la separación de la plataforma de retos de los propios retos. Por un lado tener el “scoreboard” y las descripciones de las pruebas y por otro las propias pruebas. Una configuración más o menos suficiente sin más información que el número de pruebas que hagamos, podría ser la siguiente.

  • 1 VM “Monitor” general y servicios. 1 x 1 Core, 20Gb. y 512 Mb Ram.

  • 1 VM “Front-End” para la plataforma. 1 x 4 Core, 50 Gb. y 8Gb Ram.

  • 1 VM “Dedicada” a pruebas web. 1 x 4 Core, 50 Gb. y 8Gb Ram.

  • 1 VM “Dedicada” a pruebas exploiting. 1 x 4 Core, 50 Gb. y 8Gb Ram.

El coste de todo esto durante un fin de semana podrían ser aproximadamente 20 € en un proveedor más o menos asequible.

Enfoque y diseño de las pruebas.

Vamos a partir de la base que tenemos una competición “Jeopardy” y las categorías están bien definidas. Podrían ser web, crypto, exploiting, reversing, forensics y misc. ¿Cómo diseñar una buena prueba? Quiero proponeros algunas pautas, a ver qué os parecen.

Hay casi infinitos enfoques en el diseño de una prueba, pero yo optaría por proporcionar al jugador el código que se ejecuta en el servidor. Quizá para jugadores avanzados esto va a ser el camino directo a resolverla, pero implica un mayor aprendizaje para el jugador más novato.

Otro aspecto a tener en cuenta es el número de pasos que debemos seguir para completar con éxito una prueba. Algunos diseños de pruebas, sobre todo web, requieren de varias habilidades distintas para superarla. Aquí, como en todo hay gustos. El concepto “paso a paso” requiere de un gran planteamiento. Liar al jugador en caminos diferentes solo puede llevar a los jugadores más novatos a la frustración. Además, el equilibrio y la dificultad de cada paso quizá sea lo más difícil de alcanzar y sea el valor más subjetivo. Si el primer paso ha sido el más difícil y el último es una “chorrada” hay muchas posibilidades de que nuestra curva de aprendizaje se vea afectada, resultado de un diseño incorrecto.

Desde el punto de vista del organizador aislar bien los entornos ahorra muchos quebraderos de cabeza durante la competición. ¿Cuántos organizadores han preferido estar bajo tierra en un momento dado por un fallo en el cálculo de sus pruebas y/o infraestructuras? Debemos tener estricta y únicamente lo necesario para que el participante resuelva la prueba. Poner cada reto web en un puerto diferente o crear instancias “dockerizadas” para pruebas de exploiting. Esto permite monitorizar el entorno de cada prueba de forma independiente y evita volverse loco al hacer el análisis posterior de la competición.

Elección de la plataforma.

En github podéis encontrar numerosas plataformas cuyas características son parecidas. Lo interesante es adaptarlas a cada competición agregando nuestras mejoras al código. En la sección de enlaces os pongo algunas de ellas.

Para acabar, quería dejaros un “mini reto web”, por si tuvierais poco en los enlaces proporcionados ;)

Mini-reto

En próximos capítulos …

Cómo afrontar un CTF. Estrategias de optimización del tiempo y coordinación en equipo. Herramientas específicas para utilizar en competiciones. Solución al reto.

Algunos enlaces interesantes

1. Ranking y sitio oficial para información de competiciones de todo el mundo.

2. Plataformas CTF

3. ‘Dockerized exploits’. Docker multinivel usado en un CTF real.

4. Varios sitios de entrenamientos CTF

Para cualquier cuestión, no dudéis en dejar un comentario en el post o bien enviarme un correo a tunelko [en] gmail [punto] com.

Comments

  1. Como recién llegado a esto de los CTF tengo que destacar lo de que puede llegar a ser frustante al principio, sobre todo si juegas solo. Pero doy el consejo que me aplico a mi mismo, no hay que tirar la toalla, que en eso consisten los retos! Lo importante es ir aprendiendo y disfrutar del camino, ya habrá tiempo para estar entre los mejores ;)

    Por otra parte gracias @tunelko por escribir este articulo, los CTFs en España necesitan promoción y difusión. No somos pocos los que jugamos pero estamos a mucha distancia de otros paises en cuanto a representación en estas competiciones.

    Un saludo.

  2. Efectivamente lo más importante es intentar resolver aquellos retos que, a priori, puedan parecer más difíciles. En este proceso uno aprende mucho más que resolviendo aquellos que están a nuestro alcance. Gracias Mago por tu comentario ;).

    Saludos!
    @tunelko

  3. Reto resuelto.

    ¿Dónde se debe enviar la solución?

    Saludos.

  4. Enhorabuena! En principio no hay que enviarla pero si quieres envíamela al email publicado en el artículo y la menciono en la próxima entrega ;)

    Saludos !
    @tunelko