Malware complejo: metamorfismo, polimorfismo y EPO | Teoria y ejemplos practicos

En esta entrada intentare presentar los metodos mas sofisticados que usa el malware para evitar su deteccion por parte de las compañias de antivirus, comenzara con una amplia introduccion teorica sobre polimorfismo, metamorfismo y la tecnica EPO; posteriormente ejemplificare la teoria con practicas y analizaremos los resultados para sacar conclusiones.

Antes de nada decir que no es un tutorial sobre indeteccion de malware, (esto va dirigido sobre todo a los leechers de hackforums y similares), si no que se tratara la informacion de una manera objetiva para  la concienciacion y formacion en materia de ciber-defensa de los lectores. Ni que decir tiene que no es el objetivo hacer apologia a la infeccion con malware.

Tambien aclarar que a medida que avance la entrada se convertira en algo bastante tecnico, no sera un texto divulgativo.

Una vez aclarado esto vamos a empezar por el malware Polimorfico.

1. Malware complejo: Polimorfismo

El polimorfismo en malware no es algo nuevo, tiene una gran trayectoria desde que en 1989 el desarrollador Mark Washburn crease el malware conocido como 1260 o V2PX, como prueba de concepto para demostrar  las carencias de las firmas en base a strings. Mas tarde este POC evolucionaria a un nuevo virus conocido como V2P2.

Pero antes de entrar con ejemplos concretos, lo primero es saber que quiere decir que un virus sea polimorfico, para aclarar este concepto citare un parrafo del libro Viruses revealed de  David harley, Robert Slade y Urs Gattiker (libro que recomiendo 100%, de lo mejor que he leido en relacion a este tema):

«Another word that inspires panic in the press is polymorphism, a concept poorly understood by instant experts and generally overestimated in its long-term impact on the malware problem in general. A polymorphic (“many shaped”) virus attempts to make detection of its presence more difficult by changing its “shape” from one infection to another. (The mechanisms for achieving such shape-shifting will be considered later.) This is often mistaken (not only by the press, but by writers of low-grade books on security and/or viruses) as meaning that the virus becomes a different virus or virus variant at each infection. This is not the case. A polymorphic remains the same virus but cannot be detected by looking for a characteristic scan string within the possibly infected file (or other infectable object). The code remains essentially the same, but the expression is different, so that the same program is represented by a different sequence of bytes. This by no means indicates, however, that polymorphic viruses are undetectable, though the first examples contributed to the disappearance of a number of early anti-virus products published by vendors who couldn’t handle the problem. It does mean, of course, that the anti-virus programmer has to think beyond grep-like scanning of infectable objects using pattern matching with regular expressions.»

Ahora en Español y tirando de Wikipedia (que en este caso da una definicion bastante acertada):

«En relación a los virus informáticos un código polimórfico o polimorfismo es aquel que se sirve de un motor polimórfico para mutarse a sí mismo mientras mantiene su algoritmo original intacto. Esta técnica es utilizada comúnmente por virus informáticos y gusanos para ocultar su presencia.»

Bien, una vez tenemos el concepto de polimorfismo claro, vamos a seguir con los ejemplos, historicos.

Tras la publicacion del 1260 y posteriormente el V2P2, otros investigadores desarrollaron herramientas para el desarrollo de malware polimorfico, un ejemplo de ello fue la creacion por parte de «Dark Avenger» de un motor polimorfico, que permitia la generacion de virus polimorficos.

Otro ejemplo, que quizas sea uno de los malwares mas conocidos, por su propagacion exponencial y su altisima tasa de infeccion, fue el VBS/LoveLetter, que obtuvo un ratio de infeccion de 50 millones de equipos en el año 2000. Programado en VisualBasicScript y propagado a traves de email, este malware fue una autentica obra de arte, algo nunca visto, llegando a infectar equipos del pentagono, la CIA, el parlamento britanico y numerosas multinacionales, ademas de millones de ordenadores particulares.Este caso se trata en profundidad en el libro anteriormente mencionado, en el capitulo 14.

Una vez que tenemos claro el concepto de polimorfismo y hemos visto algunos ejemplos  podemos pasar al siguiente punto.

2. Malware complejo: Metamorfismo

Para explicar este concepto citare una buena descripcion por parte de Kapersky Labs:

«Un virus metamórfico es aquel que  puede transformarse según su capacidad de traducir, editar y reescribir su propio código. Se le considera el virus informático más infeccioso y, si no se detecta rápidamente, puede producir graves daños en un sistema. Además, se reescribe y reprograma a sí mismo cada vez que infecta un sistema informático. Debido a su complejidad, para la creación de virus metamórficos es necesario contar con conocimientos amplios en programación.»

El ejemplo historico mas conocido es el «Black baron SMEG» . SMEG por sus siglas en ingles «Simulated Metamorphic Encryption enGine» o «Motor de encriptacion metamorfica simulada» (o motor de cifrado metamorfico simulado, ya que «encriptar» no se recoge en la RAE) . Volviendo al ejemplo anteriormente expuesto, se destacan dos variantes del Black baron,  SMEG.Pathogen y SMEG.Queeg. Ambas con funcionamientos muy similares, archivos del tipo DOS que infectaban archivos de tipo .exe, generalmente un maximo de 32 por equipo para dificultar su estudio. En versiones posteriores, estas dos subvariantes de SMEG solo infectaban archivos de 17:00 a 18:00 los lunes, comportamiento tipico de una bomba logica

Una vez sabemos que es el metamorfismo y el polimorfismo, pasamos a ver sus diferencias, porque a priori pueden parecerse mucho en concepto, pero esto no es asi.

3. Diferencia entre polimorfismo y metamorfismo

Bien, ahora pasare a mostrar unos codigos basicos con un ejemplo muy didactico, para ello usare un lenguaje de scripting llamado Autoit.

Polimorfismo.

Para este ejemplo usare algo muy muy basico, sustitucion de variables por strings, en este caso para mostrar un Msgbox;

3e3dd4cb3ef6d76dea2ad3ae245c73c8

afe199e2802f4d5ab75cf5be3ec37914

Como vemos el ejemplo es facil de entender, en lugar de escribir el comando msgbox(0, «Ejemplo de polimorfismo», «sadfud»), sustituimos las letras de «sadfud» por variables, algo muy facil de entender por cualquier persona y mas por un analista, pero que inexplicablemente a algunos antivirus se les resiste este metodo. El polimorfismo se trata de rizar el rizo para al final ejecutar el codigo original, cuantas mas vueltas demos, mejor para el malware y mas complicado para las soluciones de seguridad.

Para el caso del metamorfismo la cosa ya se complica, el malware metamorfico tiene un ligero parecido con las bombas logicas. Basicamente lo que hara el malware metamorfico sera modificar su comportamiento segun el entorno en el que se encuentre, para el ejemplo usare otro script en autoit que detectara si la ejecuccion se ha realizado dentro de una sandbox y en funcion del resultado ejecutara una cosa u otra:

506587c595af6192b93db12b51e406371

Buscar un ejemplo para un codigo metamorfico es muy dificil, ya que hay que entrar en casos concretos, otro ejemplo explicado con palabras podria ser:

Si el sistema operativo es windows7 haz X

Si el sistema operativo es windows10 haz Y

Las posibilidades tanto para polimorfismo como para metamorfismo son infinitas, es todo una cuestion de imaginacion e ingenio.

Pasemos a la siguiente tecnica que no es tan conocida.

4. Malware avanzado: EPO

La tecnica EPO conocida como «Entry Point Ocultation» tiene algo en comun con las bombas logicas, el malware se activa si se cumple una circunstancia concreta, pero a su vez tiene una gran diferencia, la condicion depende de la interacion del usuario, no del entorno.

Basicamente imaginemos un escenario en el cual nosotros tenemos un binario, lo ejecutamos, lo usamos y aparentemente no pasa nada. Puede ser que simplemente no hayamos activado la funcion que arranca el malware. Por ejemplo, imaginemos que tenemos un payload harcodeado dentro de un software legitimo, este payload solo se ejecuta al darle a la cruz de cerrar. De ahi el nombre, realmente no sabemos cuando se va a ejecutar, y cuando lo hace no sabemos como ni por que, ¿por que al cerrarlo y no al abrirlo, por que al pulsar determinado boton?

Bien, yo creoq ue la forma mas clara de explicar esto es con un ejemplo.

Partimos del escenario en que hemos creadoo un payload con metasploit y tenemos el shellcode limpio:

El primer paso seria insertar nuestro shellcode en una zona dentro del software legitimo, donde queramos, sin alterar su funcionamiento. para el ejemplo usare un software comercial del que evidentemente no dire el nombre, pero se puede hacer con cualquiera.

Abrimos el binario en OLLY y buscamos una zona con sitio para meter el shellcode

cad9831282cc1e067a68d5681398630c

Copiamos el shellcode en modo binario

9cd084823f795bc57537fd1cd576f52b

1c23c6508799a95624e5305d9e11099a

Ahora tenemos que decidir la condicion que se debe dar para que el shellcode sea ejecutado, lo hare cuando se cierre el software legitimo, por tanto la referencia que debemos buscar (cntrl+N) es «ExitProcess»

09533be490645702eb16acea3c1b7fb6

Una vez la tenemos con la tecla Enter, nos da las referencias de llamada a la funcion, solo debemos redireccionar con el comando JMP (offset de inicio del shellcode), y se ejecutara el payload, al final del shellcode de nuevo un jmp(referencia de exitprocess original) para que el software original siga siendo totalmente funcional.

Como vemos esta tecnica ayuda a que el malware pasa desapercibido, pero no por mucho tiempo, cualquier analista que abra con IDA o cualquier otra herramienta del estilo, vera o deberia ver que hay un payload incrustado en medio del codigo.

Una pega de este metodo es que si el payload es detectado, el software modificado tendra esa deteccion, pero si no lo esta, pasara muy desapercibido hasta que sea cazado.

Bien, una vez tenemos los ejemplos de EPO y metamorfismo; y los conceptos de polimorfismo claros vamos a pasar con los ejemplos practicos para evaluar la eficacia del polimorfismo.

5. Poniendo a prueba el malware polimorfico

Este es el punto al que realmente queria llegar, pero no vale de nada sin haber leido la parrafada anterior y lo que es mas importante: haber entendido los conceptos expuestos.

Si has saltado hasta aqui directamente, te vas a perder, ademas de que esta costosa entrada habra quedado en tu memoria como un simple tutorial o guia de desarrollo malware polimorfico, y por encima de todo quiero evitar eso.

Dicho esto, a partir de aqui se mostraran metodologias de trabajo del malware polimorfico, con diferentes lenguajes de programacion, todos de scripting que es donde mejor se ve y donde tiene mas peso el malware.

Estos lenguajes seran para empezar con algo simple batch, posteriormente VisualBasicScript, y terminaremos con un analisis profundo de malware polimorfico en Autoit.

5.1 Polimorfismo basico en archivos batch

Este tema ya lo trate en esta entrada, pero aqui se llevara a cabo un analisis estadistico, viendo el nivel de diferencia o la tasa de polimorfismo que podemos alcanzar en difetentes archivos, con diferentes metodos.

Vamos a ello.

Para estos ejemplos voy a usar una tool que desarrolle hace bastante tiempo con el objetivo de identificar patrones o trucos en cuestiones de modding para la indeteccion de malware. Esta herramienta comparara bit a bit dos archivos, mostrando los cambios realizados.

De nuevo usare el mismo script que en la anterior entrada y la misma tool.

El scan del script original es el siguiente

6ae79a57743d37a786b8c228e5259e0f

Para empezar comparare ese script con uno generado con un motor polimorfico que lo que va a hacer es generar una variable aleatoria para cada letra minuscula  y sutituirla en el texto. Ejemplo:

set kgxsqwm=a
set pqdbren=b
set yjfhlil=c
set hlpxqnf=d
set taeehog=e
set uhlfkzu=f
set rtbjcpp=g
set mxpirhb=h
set dlveneg=i
set apdxstg=j
set sgmgxoj=k
set amepvto=l
set vzzyxlv=m
set paklefi=n
set cwkyvft=o
set ptcjoef=p
set vqspkla=q
set lneutiz=r
set mdtejui=s
set tnthaax=t
set xzusnjj=u
set qdnymdh=v
set fnpgabm=w
set zztsauu=x
set hllstzi=y
set wmfquxs=z

Por lo tanto la primera linea que es @echo off quedaria asi
@%taeehog%%yjfhlil%%mxpirhb%%cwkyvft% %cwkyvft%%uhlfkzu%%uhlfkzu%

Como vemos es un metodo de polimorfismo muy basico, evidentemente cada variable se genera diferente cada vez, eso es lo que hace que sea un motor polimorfico, y que no estemos hablando de simplemente codigo ofuscado.

Pues con este metodo conseguimos bajar el ratio de deteccion a 1

e137f78a1a451b2cd6972c36912a37c7

Creo que con este pequeño ejemplo ya se puede percibir algo de la potencia que puede tener un motor polimorfico y de lo peligroso que es si cae en las manos equivocadas.

Al ser un motor polimorfico, cada vez que generamos una nueva muestra esta tiene un % de diferencia respecto al script original y a las otras muestras. Y aqui esta lo importante, y donde reside la peligrosidad del malware polimorfico, vamos a verlo con datos.

Compararemos primero la muestra original con la ofuscada a ver hasta que punto son diferentes. La parte roja representa las zonas diferentes y la azul las zonas que coinciden

En este caso el resultado es el siguiente:

43fd13d2e28904988668b4e2eb279365

La muestra creada por el motor polimorfico en base de la muestra original es un 100% diferente. En este caso al ser un metodo de ofuscacion muy basico no seria problema para un analista, pero es un dato muy bueno, ya veremos luego mas en detalle esto.

Ahora vamos a comparar dos muestras generadas con el motor polimorfico

c26baa0e07d4a57957db1e42488c08de

El resultado nos indica que las dos muestras generadas a partir del motor polimorfico son un 98% diferentes. ¿Pero que implica esto? Bien, esto en materia de ciber-seguridad desde el punto de vista de un analista de malware, es un quebradero de cabeza, solo tiene un 2% donde colocar esa deteccion para detectar todas las muestras generadas en base a este motor polimorfico. Pero claro, los motores no tienen solo 1 parametro, de echo, podemos volver a ofuscar con exactamente el mismo procedimiento otra vez el ofuscado, osea, iteramos 2 veces.

Ahora si comparamos la nueva muestra, configurada con la misma opcion , pero iterada 2 veces, con la muestra iterada solo 1 obtenemos un 100% de diferencia. Aqui el analista no tiene nada que hacer, solo puede remitirse a manualmente des-ofuscar el codigo e intentar llegar al original.

Al iterar dos veces conseguimos que la declaracion de la iteracion 1ª de las variables quede asi

c9b2619a01be74c80d5990fd883e9c07

Des-ofuscar eso no seria dificil, seria simplemente laborioso pero hemos dicho que hay mas parametros, vamos a probar otro combinado con la primera opcion iterada 2 veces.

Nos queda esto: http://pastebin.com/8tPYMYx5 Que evidentemente no hay ahi analista que valga y aunque pueda no parecerlo, funciona.

Que comparando al archivo original a esta ultima muestra nos vuelve a dar 100% de poliformismo

ede7bee64fc39e109a146e6b6d791589

Y con la muestra de la opcion 1 iterada dos veces mas de lo mismo

ede7bee64fc39e109a146e6b6d791589

Como vemos, con un motor polimorfico podemos partir de una muestra de malware muy detectada a generar infinitas muestras, todas diferentes y funcionales, algo peligrosisimo y muy complicado de detectar.

Pero al igual que digo eso, tambien digo que no es tan facil, por ejemplo con el ultimo metodo, el de cambiar la codificacion de los caracteres, pasando dos veces la misma muestra por el motor polimorfico, esas dos nuevas muestras son iguales casi en su totalidad

d68c009607167bf4f8e6a2384d0e4a54

Esto pasa por que son .bat, archivos por lotes y se ven como texto, pero al final nos meteremos con binarios Autoit, y la cosa se complicara aun mas.

Una vez visto el ejemplo facil, que mucha gente podria programar sin emplear demasiado tiempo, y que por tanto vamos asumiendo lo que un motor polimorfico supone (o eso espero) vamos a pasar a visual basic script, muy utilizado en malware, en botnets, como Safeloader, o Gorynich (diamond fox)

5.2 Polimorfismo intermedio en archivos VBS

Como he dicho antes el malware en vbs, esta de moda, ¿la razon? se ejecuta a traves de wscript y por tanto tiene unas ventajas en cuanto a indeteccion inmensas.

Para las pruebas de este motor polimorfico usaremos un payload de houdini worm, un malware bastante popular, es del tipo loader, ligero, facil de indetectar y estable.

Como podemos ver esta mas que firmado por los antivirus

 

383c78318d0020ee7834b790879550f71

*Los AVs que no lo detectan no se en que mundo viviran, en fin

Con este motor polimorfico que manejaremos ahora, ya nos metemos en temas mas serios, con mas de 30 configuraciones posibles, vamos a ir porbando a ver que nos ofrece

Vamos a probar primero una opcion que colocara el delimitador que le digamos entre cada caracter, hara una serie de modificaciones que almacenara en variables aleatorias para mas tarde ejecutar el codigo eliminando este caracter y reordenando todo el codigo. Escaneamos:

dfcdb064d5323e8fa79d1c4388f01dff

Aqui ya los antivirus son basicamente inutiles, aguanta el Kapersky pero no por mucho tiempo.

Vamos a la parte central de esto, ver como de diferente es esta muestra del original

a447e0b5078870bc88a18f888984769f

Pues ahi esta el resultado, totalmente diferentes.. Con solo una opcion en el motor polimorfico no solo conseguimos que la mayoria de antivirus ni lo huelan, en este caso es MUY GRAVE por que al ser un vbs los procedimientos heuristicos no lo van a detectar, privilegios que tiene que te ejecutes como un componente de microsoft.

Vamos a volver a generar otra muestra, esta vez cambiando el delimitador.

5fd574f32bc4f00d43816e40bcf1e8942

Pues otra muestra diferente, puede parecer lo mismo que antes, pero es que el potencial en cuanto a malware que tiene vbs  no lo tienen los archivos por lotes, y que las defensas heuristicas y proactivas no controlen el wscript lo hace peligrosisimo

Ahora vamos a rizar mas el rizo aun, lo configuramos para que trocee el codigo en X partes, ademas de almacenar cada caracter en el espacio de un array para luego mediante una funcion recursiva deeshacer todo eso al momento de ejecuccion, por si fuera poco cifraremos el resultado del primer caso con Rot-N (igual que el cifrado del cesar)

De nuevo conseguimos un 100% de variacion en la muestra

5fd574f32bc4f00d43816e40bcf1e8941

Podra parecer que estoy copiando siempre la misma imagen, pero no, es asi, el polimorfismo es lo que tiene, que es muy eficaz.

Ahora no ofuscamos nada, simplemente añadimos basura

fc2d08281be037bf406291f5515e453a2

Como vemos nos cambia la deteccion, pero solo hemos probado 3 combinaciones, tiene mas de 30 posibles este motor, pueden parecer muchas pero aun queda el motor mas potente.

5.3 Polimorfismo avanzado en Autoit

Y es que, si hay un lenguaje preferido para desarrollar malware, ese es Autoit, por su facilidad, su indeteccion, sus macros, su versatilidad, su compatibilidad en los equipos…

Y aqui es donde me voy a extender mas, al analizar autoit, como funciona, usaremos un motor polimorfico con al rededor de 50 opciones, lo que nos ofrece una potencia que jamas habia visto, esto que vais a ver a continuacion es una autentica obra de arte, y no lo digo por que haya participado en el desarrollo, si no de forma objetivo, es de momento, para mi y para mucha gente el motor polimorfico perfecto. El proyecto en principio es un ofuscador, ya que autoit es un lenguaje que se decompila igual de facil que se compila, y a nadie le gusta que le roben el codigo, pero en esta entrada vremos como  se puede aplicar como motor polimorfico con unos resultados muy buenos.

Aclarar que Autoit pese a en sus terminos no permitir el desarrollo de malware es muy utilizado, y muchos antivirus, firman los binarios simplemente por ser autoit, por ejemplo K7, pero luego veremos eso.

Autoit se programa en archivos .au3, que mas tarde se pueden convertir a exe , pero tambiena .a3x, que seria la parte sin el interprete, y son esos ficheros. a3x los que vamos a analizar.

Lo primero presentar las opciones que nos ofrece la herramienta:

eccbb11fa480b0e99c93eb6445d5f96d

Aclarar que la interfaz grafica es de la primera version y faltan algunas cosas, para las pruebas se usara la 5 version. Disponible en: github

Quiero hacer hincapie en que el proyecto se desarrolla como una herramienta para proteger codigo, que ninguno de los involucrados en el proyecto nos hacemos responsables del uso que se le de a la misma.

Para las pruebas usaremos un script con algunas detecciones

f7598f88c46ed79137ef0bf2c42ebd37

Bueno, algunas detecciones, no muchas, pero aqui lo que importa es el motor polimorfico, en este caso un ofuscador utilizado como motor polimorfico.

Dado que son muchas opciones y es imposible probar todas las combinaciones, probaremos con las que vienen por defecto

Y a ver que resultados nos vuelca

Tenemos 6 muestras

Original en .a3x y .exe

Ofuscado1 y ofuscado2 .a3x y .exe

Ambos ofuscados con los mismos parametros

Ofuscado1.exe

6f0d83e820cf49270126f064dd14e24b

Ofuscado2.exe

0436f977f50fe87b65351b97c64216b8

Vemos que pese a ser ofuscados con la misma configuración, los resultados cambian, vamos a ver en que medida cambian los archivos

EXE

Original – ofuscado1

b4d997a171ac31abc0c61be2a6b4c1dd

mas del 99% de diferencia, un resultado muy bueno, la parte en la que coinciden es el interprete, lo veremos luego

Original – Ofuscado2

d2dacc2a12411de5ff3ddce76cf0ba87

Ofuscado1 – Ofuscado2

En esta ocasion mismo resultado, pero parece que la generación de bloques fue mayor, el tamaño aumenta y la localización del interprete se desplaza

Vale, antes de seguir un inciso, la diferencia entre .a3x y .exe es que al compialr a exe Autoit mete todos los includes, todas las funciones, aunque no se use, y eso crea ejecutables de mucho mayor peso, eso nos entorpece a la hora de intentar analizar el polimorfismo entre estos dos archivos, demasiado código que no queremos, basura, por eso tenemos que comparar los archivos con extensión a3x

A3X

original – Ofuscado1

288468f468a1271584735fa33256eba5

Aquí al no tener toda esa basura idéntica en ambos, nos da el resultado que vale, un archivo totalmente diferente

original . Ofuscado2

5d2a82ad3bb831d75f72cf95394cfc0a

Un resultado perfecto también, como era de esperar

Ahora viene lo interesante, y donde se demuestra la potencia de este motor, mismos parámetros:

d339620bdea7e43e25a381b6cb8c2e37

muestras completamente diferentes

6. Conclusion

El objetivo de esta entrada era mostrar el funcionamiento de las técnicas de evasión  mas avanzadas que usa el malware a dia de hoy, no es nada nuevo, pero se ha perfeccionado hasta tal punto, que los antivirus son inútiles. Imaginemos un ransomware, lo pasan por un motor polimorfico, generan 2000 muestras, todas diferentes, todas indetectables y las distribuyen. ¿Quien para eso? Nadie, simplemente seria imposible, queda visto que los antivirus no son aptos, algunos están invirtiendo en detecciones por heuristica, como nod32 con el HIPS, pero no es suficiente, están muy por detrás.

Yo me suelo preguntar muchas veces lo mismo, si yo puedo hacer esto, que no haran los cibercriminales, que no podrá hacer una persona con estudios oficiales de programación.

Y bueno tras mas de 5 horas escribiendo la entrada, solo me queda despedirme hasta la próxima, no sin antes decir que si alguien quiere o tiene interés en las herramientas utilizadas lo valorare, algunas como la ultima son open source, y cualquier persona es bienvenida al proyecto, siempre recordando que es una prueba de concepto contra la ingeniería inversa y para proteger la propiedad intelectual, el proyecto en principio se mantendrá hasta el 25 de septiembre que se acaben las vacaciones :_(

 

 

 

 

 

 

4 comentarios en “Malware complejo: metamorfismo, polimorfismo y EPO | Teoria y ejemplos practicos

Deja un comentario