Un par de semanas atrás lanzamos el Desafío ESET #35, con el objetivo de entregar una entrada gratuita para ekoparty, la reconocida conferencia de seguridad que tiene lugar cada año en Argentina, a quien encontrara primero el flag.

Agradecemos la participación e interés de los lectores asiduos de WeLiveSecurity y las diferentes soluciones que nos presentaron para resolver el desafío. Felicitamos especialmente a DavicoRM, Mariano Marino, Apuromafo CLS, bransh, tirogatomulo y Javier Eduardo Rivera Alejo por sus respuestas correctas y completas, aunque lamentamos que varios de ellos no puedan asistir a la ekoparty a pesar de haber ganado su entrada.

A continuación, presentaremos otra posible respuesta que muestra la forma de llegar a la bandera.

1. Obtención de la URL para la descarga del ejecutable

La consigna del Desafío inicia con la descarga del archivo llamado downloader.docm, donde se encuentra la información necesaria para acceder al archivo ejecutable. Este documento posee una macro con la información para formar el enlace de descarga del archivo binario.

Ya sea que la macro sea extraída mediante alguna herramienta o accediendo de forma manual, se observa que aparecen distintas funciones de cifrado, que en realidad solo contienen parte de la URL codificada con diversos sistemas de numeración posicional.

Cada una de las funciones esconde parte de la ruta para la descarga del archivo ejecutable. La decodificación de cada segmento se muestra a continuación.

Hexadecimal a ASCII:

70 69 7a 2e 35 33 5f 54 45 53 45 5f 30 31 46 41 53 33 44
piz.53_TESE_01FAS3D

Binario a ASCII:

00101111 00111000 00110000 00101111 00110111 00110001 00110000 00110010
/80/7102

Base64 a ASCII:

L3NkYW9scHUvdG5ldG5vYy1wdw==
/sdaolpu/tnetnoc-pw

Decimal a ASCII:

47 109 111 99 46 121 116 105 114 117 99 101 115 101 118 105 108 101 119 46 119 119 119
/moc.ytirucesevilew.www

URL Encoded a ASCII:

%2F%2F%3Asptth
//:sptth

La URL se forma uniendo de manera inversa al orden de las funciones mostradas en la macro. Por lo tanto, el resultado es el siguiente:

piz.53_TESE_01FAS3D/80/7102/sdaolpu/tnetnoc-pw/moc.ytirucesevilew.www//:sptth

Mediante la función StringReverse se puede obtener el primer dato de interés, la URL de descarga:

https://web-assets.esetstatic.com/wls/2017/08/D3SAF10_ESET_35.zip

2. Obtención de la contraseña para descomprimir el ejecutable

El archivo en cuestión puede ser descargado a través de la URL obtenida. Sin embargo, se encuentra protegido por una contraseña. Dicha contraseña se encuentra oculta en el pie de página del documento; el formato del texto impide observarla de forma directa, pero con una búsqueda minuciosa es posible encontrarla.

Otra forma de encontrarla es a través de la extracción de los archivos XML asociados al documento.

Si se realiza esta operación, es posible identificar la contraseña codificada con el sistema Base64:

aW5mZWN0ZWQzNQo=

La decodificación que corresponde a la cadena:

infected35

Con estos datos es posible acceder al binario. En este punto es necesario comenzar a aplicar los conocimientos en ingeniería inversa para obtener la bandera.

3. Desofuscación del archivo ejecutable e ingeniería inversa

El archivo ejecutable muestra una ventana como la que se presenta a continuación, donde se recibe la bandera:

El programa se encarga de validar la entrada y, si corresponde con la cadena solicitada, envía el mensaje de acceso garantizado; en caso contrario, muestra el mensaje para seguir intentando.

En este punto se debe aplicar la ingeniería inversa; al revisar las propiedades del ejecutable se observa que se encuentra ofuscado con la versión 1.0.0 de la herramienta ConfuserEx, por lo que antes de analizar el código fuente es conveniente desofuscarlo.

Esta publicación de mi compañero Matías Porolli para analizar malware en .NET que se encuentra ofuscado ayuda a entender mejor la forma de proseguir con el análisis de nuestro archivo ejecutable. Con una herramienta como dnSpy es posible obtener parte del código sin los métodos de ofuscación mencionados.

El programa funciona a partir de una función que valida la longitud de la cadena (15 caracteres). Posteriormente, una cadena se extrae a partir de un arreglo de caracteres:

!#$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]_abcdefghijklmnopqrstuvwxyz{|}~

La extracción se lleva a cabo a partir de la posición de los caracteres definidos en otro arreglo:

85,79,75,29,84,78,89,83,29,84,75,69,76,86,27

Lo anterior da como resultado la cadena:

ztp@ys~x@ypjq{>

Esta cadena no es la bandera, ya que la primera función se encarga de validar el resultado a través de la comparación en memoria con la función XOR, tal como se muestra en el siguiente fragmento de código:

Finalmente, al aplicar el método XOR a la cadena extraída es posible obtener la clave que garantiza el acceso, como lo muestra la siguiente imagen:

De esta forma, la bandera de acceso está definida por la cadena:

eko_flag_found!

Esperamos que hayas disfrutado de nuestro breve desafío. ¡Felicidades a los ganadores y nos vemos próximamente en ekoparty!