La semana pasada compartimos con ustedes el Desafío ESET #31, que tiene como premio una entrada para la conferencia de seguridad ekoparty para las tres primeras personas que lo resuelvan. En este caso, solo tenemos un ganador, Emiliano Del Castillo, que podrá asistir al evento mientras las demás entradas quedan vacantes.

Ahora, veamos cuál era la solución.

Cómo se podía resolver el Desafío ESET #31

El desafío era obtener el flag enviado por el bot al panel de control, y para eso compartimos con ustedes un archivo ZIP que contenía en su interior una captura de tráfico. Además habíamos compartido la función con la que se “cifraba” la información, una pista que los podría ayudar a identificar el algoritmo utilizado por el malware.

Cuando abrían el archivo RetoESET_Ekoparty.pcapng, y comenzaban a analizar el tráfico, hay un servidor al que se lo contacta varias veces durante la captura, www.ekochallenge.com (con la dirección IP 172.16.1.106). Si nos fijamos, cada contacto que la máquina tenía con el servidor es diferente:

Capturas Tráfico

La primera pista para ver cómo esto funciona está en la respuesta del servidor:

Pista codificada

Si prestamos un poco de atención, pareciera que dentro del tag <body> de la respuesta del panel de control hay información. Estos datos están en hexadecimal, por lo que si intentamos decodificarlo podríamos obtener alguna ayuda sobre cómo continuar resolviendo el desafío. Para hacer esta tarea podemos usar una o dos líneas de Python para hacer algo como lo siguiente:

Pistas_python

Cuando ejecutamos nuestro script, obtenemos la siguiente string:

Decodificando_Pistas

Las pistas ocultas en la respuesta del servidor nos dicen que el algoritmo de cifrado que utiliza es el RC4 y que el flag contiene “flag_challente_eko_ESET_”. En esta altura, lo que hay que hacer es tomar una comunicación del bot con el panel de control e implementar este algoritmo para recuperar la clave.

Una de las tantas posibles maneras de codificar este algoritmo es con la función que compartimos al publicar el desafío:

Cifrado

Ahora lo que restaría sería utilizar el lenguaje de programación o herramienta que más nos guste para este cometido y decodificar una de las comunicaciones para obtener el flag. Para extraer la información de la captura de red tenemos diferentes opciones a seguir. Sabemos cuál es la información que hay que decodificar porque es lo que se envió desde la máquina afectada:

EnvioInformaciónBot

Si creamos un filtro por todos los POST que se realizaron podemos ver que hay:

Info-posts

Lo que debemos hacer en este punto es asegurarnos de extraer la información correctamente, con todos los datos y guardarlos en un archivo:

Exportselectedpackets

Ahora que ya sabemos cuál es la información que debemos decodificar y ya tenemos la key, lo que podemos hacer es utilizar un lenguaje de programación que nos guste y decodificar los valores para llegar a la solución. Por ejemplo si lo queremos hacer con Python, con un par de líneas podemos solucionarlo:

python script

Ahora si ejecutamos el script vamos a ver que imprime por pantalla la información:

Flag

Ahí encontramos que el flag a buscar era: flag_challenge_eko_ESET_yoquieroiralaekoconunaentradaquemeregaleESET y así llegar a la solución del desafío.

Felicitaciones a Emiliano, la única persona que logró resolver correctamente el desafío y asistirá a la undécima edición de ekoparty. Las demás entras quedaron vacantes... aunque si prestan atención en nuestra cuenta de Twitter, quizás tengan suerte.