02 septiembre 2013

'Crypters': Localizando firmas de los Antivirus

En el último post de esta serie sobre 'Crypters' introdujimos el concepto de 'modding', que es una técnica cuyo objetivo consiste en modificar un 'stub' para hacerlo 'indetectable' a los 'AVs' y de este modo poder cifrar cualquier 'malware' de manera que éste pueda ejecutarse sin temor a la detección de los AVs.

Recordemos que un 'crypter' está formado por dos elementos, el 'builder' y el 'stub', aunque en muchas ocasiones al 'builder' se le denomina simplemente 'crypter', y recordemos también que lo que se 'modea' es el 'stub', no el 'builder' ni el 'malware'. Del 'malware' no nos hemos de preocupar, dado que éste será cifrado por el 'builder' y nunca estará descifrado en el disco duro, solo en memoria. Y tampoco hemos de preocuparnos por el 'builder', ya que es simplemente una herramienta para 'crear' el nuevo ejecutable formado por el 'stub' y el 'malware cifrado'. En definitiva, lo que se 'modea' es el 'stub' y el primer paso para llevar a cabo el 'modding' es localizar las firmas de los AVs.

Para 'modear' un 'stub' lo que se suele hacer es utilizar el 'builder' y crear un ejecutable de prueba para 'modear', de forma que en realidad se 'modea' el conjunto del 'stub' y el 'anotador' cifrado. Recordemos que el 'anotador' es un simple ejecutable cuya misión es verificar su correcta ejecución (como una simple ventana de alerta). Mediante este archivo de prueba para 'modear' es posible verificar de forma cómoda si los archivos resultantes de las diferente pruebas de modificación del ejecutable son funcionales. En definitiva, es mucho más práctico 'modear' este archivo de prueba, y que además el 'stub' no se puede ejecutar de forma aislada, ya que genera un error en ejecución al no localizar el 'ejecutable' cifrado.


Técnica DSPLIT/AVFUCKER

Ésta es una técnica muy extendida para la localización y modificación de firmas de los AV's. En realidad son dos técnicas, una es 'dsplit' y otra 'AVfucker', pero suelen utilizarse siempre de forma combinada.

Existen diferentes herramientas que permiten llevar a cabo la aplicación de estas técnicas, pero en este post voy a tratar de explicar el proceso a nivel conceptual en lugar de basarme en la herramienta. Así que debéis armaos de paciencia, pues este post va a ser duro. En el próximo post, explicaré un caso práctico de la aplicación de la técnica 'dsplit/AVfucker' mediante el uso de herramientas.


Técnica DSPLIT

Partiendo de un archivo ejecutable, la técnica 'dsplit' consiste en generar N archivos intermedios de forma incremental, es decir, cada uno de esos archivos es igual al anterior más unos cuantos bytes. Para poner un ejemplo visual, pensemos en un pan de molde. El primer archivo sería la primera rebana, el segundo archivo sería el conjunto de la primera y segunda rebanadas, el tercero tres rebanadas y así sucesivamente hasta completar el pan completo.

Los 'stubs' suelen tener un tamaño de unos cuantos miles de bytes, así que la técnica 'dsplit' suele comenzar por 'rebanadas' de 1.000 bytes. Una vez se dispone de estos N archivos de 1.000 bytes, se escanean con el AV con el que hayamos decido comenzar. Es decir con el AV cuya firma queramos localizar. La idea es que a partir de un determinado archivo aparecerán detecciones del AVs. Ahora hay que afinar y ver a partir de qué 'byte' exactamente hay detección. Por ejemplo, si en el archivo con 6.000 bytes no hay detección y en el de 7.000 bytes y siguientes ya hay detección, tendremos que ir buscando en esa frontera entre 6.000 y 7.000 hasta localizar el el punto exacto en el que se produce la detección. Lo que se hace es reducir el rango inicial 1.000 bytes a incrementos de 100 bytes, y se aplican entre los offsets 6.000 y el 7.000 y se vuelve a escanear. De nuevo, hay que localizar el archivo a partir del cual se produce la detección y se continúa con la iteración, pasando por rangos de 10 bytes y de 1 byte, hasta localizar el offset exacto, el byte exacto, en el que se produce la primera detección. Una vez localizado, estaremos ante el fragmento más pequeño del archivo ejecutable en el que el AV es capaz de identificar código malicioso. Todavía no sabemos donde está la firma, sino que estamos ante una zona, en la que sabemos que seguro que hay una firma, o mejor dicho, estamos ante un fragmento de código en el que hay uno o varios elementos que hacen que el AV identifique ese código como malicioso.


Técnica AVFUCKER

A partir de este momento, se aplica la técnica 'AVfucker' sobre el archivo obtenido mediante la técnica 'dsplit'. El objetivo de la técnica AVfucker es  generar N archivos de igual tamaño, cada uno de ellos con un bloque de bytes 'tapado'. Donde 'tapado' quiere decir que los bytes originales son sobrescritos por un valor escogido (un byte del valor que queramos: '00h', '20h', '90h', etc.). Si pensamos en en el pan de molde en el proceso 'AVfucker' tendremos N archivos de igual número de rebanadas (el pan completo), y a cada uno de ellos le faltará una rebanada. Al primero le faltará la primera, al segundo la segunda, etc. Lo que se busca con esta técnica es encontrar una o varias zonas del archivo de forma que al 'taparlas' la detección del AVs desaparezca.

Una vez escaneados los archivos resultantes con el AV, eliminaremos aquellos que estén detectados y observaremos los offsets que quedan 'indetectados'. Del mismo modo que el proceso 'dsplit', para cada zona de offsets 'indetectados', iremos reduciendo el tamaño de los bloques 'tapados' hasta llegar a bloques de un solo 'byte'. Una vez escaneados los archivos, y eliminados los archivos detectados, tendremos una serie de archivos que nos indicarán que si se tapa dicho 'byte' se está 'alterando' la firma y por tanto se evita la detección del AV.

Para llevar el control de los ficheros generados con estas técnicas, lo que se suele hacer es nombrar a los ficheros resultantes con el offset correspondiente al corte, en el caso de 'dsplit', o a la sección de 'tapados' en el caso de 'AVfuker'. Las herramientas realizan este proceso de forma automática.

Por ejemplo, si tras el proceso 'AVfucker' nos quedan 4 archivos 'indetectados' llamados 7124_1.exe, 7125_1.exe, 7129_1.exe y 7130_1.exe quiere decir que hay 4 bytes, cuyos offsets, en este caso no consecutivos, son 7124, 7125, 7129 y 7130. 

¿Es esa la firma? Depende. Ahora toca analizar qué hay en esos bytes. En muchos casos, puede tratarse de unos bytes que corresponden a una o varias instrucciones del ejecutable o a un string (cadena de texto). En cuyo caso la respuesta es sí, esa es la firma. En otras ocasiones, puede tratarse de referencias o saltos a direcciones de memoria de funciones o directamente recaer en la tabla de importaciones. En estos casos, en realidad estamos ante un tipo de firma 'compleja', normalmente una firma 'heurística'. Y el resultado de 'AVfucker' debería interpretarse con cierta cautela, siendo la experiencia y conocimiento del 'modder' la que lo llevará a buscar una u otra solución para evadir la firma.

En el caso de que la firma sea una cadena de texto, es probable que solo alterando la cadena se consiga eliminar totalmente la firma. Este sería el caso más sencillo, pero es real, dichas firmas existen. No voy a señalar a ningún AVs en particular, pero obviamente un AVs que pone una firma en un string es, cuando menos, muy ingenuo. 

Supongamos que estamos ante un caso de una firma en un 'string' que conteine por ejemplo el texto "MyStub". Si alterando esa cadena la firma queda 'rota' y por tanto el archivo indetectado, deberemos comprobar  además si el archivo es funcional. Recordemos que 'AVfucker' ha sido aplicado sobre un fichero que había sido obtenido previamente con el proceso 'dsplit' y que, por tanto, no es funcional, es una sección del ejecutable original. La cuestión es que debemos modificar el byte que hemos observado que 'rompe' la firma en el archivo funcional previo al 'dsplit', es decir, en el archivo ejecutable de prueba. Esta tarea se lleva a cabo normalmente mediante cualquier editor hexadecimal. Si una vez hemos alterado dicho byte, el archivo es funcional, perfecto, hemos sacado la firma. Hay que tener en cuenta que la modificación la hacemos sobre el archivo de funcional de prueba, formado por el 'stub' y el 'anotador' cifrado. Cada vez que se haga una modificación sobre este archivo de prueba, deberemos hacerla en paralelo sobre una copia del 'stub' o bien, una vez realizadas todas las modificaciones al ejecutable del prueba, tendremos que extraerle el 'stub'.

Una vez hecho esto, deberemos volver a escanear el archivo con el mismo AV que hemos hecho todo el proceso y puede que siga detectando el archivo. ¿Por qué razón? porque existe una segunda firma en otra sección del archivo. Es necesario volver a aplicar 'dsplit' y otra vez 'AVfucker' para localizar esa segunda firma.

En principio, cuando se localiza la firma mediante 'dsplit/AVfucker', lo lógico, como he comentado, es estudiar la sección de dicha firma y proceder en consecuencia mediante diferentes técnicas, que tiene por objetivo 'partir' la firma alterando las secciones sobre las que recae la misma sin 'romper' el ejecutable. Un adecuado entendimiento formato ejecutable 'PE (Portable Executable)' es fundamental para lograr dicho objetivo. Sin embargo, sin demasiado conocimiento del formato PE, es posible igualmente, en ciertos casos y empleando la técnica 'AVfucker', eliminar algunas firmas del ejecutable. Una vez que el proceso 'dsplit/AVfucker' ha finalizado, puede aplicarse 'AVfucker' sobre el ejecutable  de prueba en los offsets que 'indetectaban' al hacer 'AVfucker' sobre el archivo procedente del proceso 'dsplit'. Una vez se dispone de dichos archivos se va probando la ejecución de todos y cada uno de ellos para ver si alguno de ellos es funcional. Esto es un proceso tipo 'brute force' pero funciona en muchos casos. Hay que tener en cuenta que quizá no quede ningún archivo funcional, pero recordemos que en 'AVfucker' hay que elegir un valor para generear los 'tapados'. Supongamos que hemos elegido el valor '00' para tapar los bytes originales y no ha quedado ningún ejecutable funcional. Siempre podemos optar por probar las 255 combinaciones posibles para cada uno de los offsets que indetectan y ver si alguno es funcional. Son 255, y no 256, porque obviamente hay una combinación, la del valor de 'byte' original, que seguro que es funcional, pero esa es detectada por el AV.

Y hasta aquí esta maratoniana sesión de la técnica 'dsplit/AVfucker'. La próxima entrega será más práctica.

------------------------------

Artículo cortesía de Abraham Pasamar

12 comments :

Oca dijo...

Buenas,
Muy bueno el post. Lo que no me convence es lo de reemplazar la firma por un byte al azar, me parece poco técnico. Por qué puede que funcione, pero que en determinadas ocasiones falle.


Lo suyo sería analizar que hay en ese offset, y si es código ensamblador, modificar por instrucciones equivalentes o moverlas a otro sitio como se hace en el método RIT.

Un saludo.

Anónimo dijo...

Esta información está más que obsoleta, los antivirus pueden llegar a guardar hasta 5 firmas de una misma muestra, y si además hablamos de evitar la detección heurística, a ver si puedes hacer lo mismo con cada antivirus.

Abraham Pasamar dijo...

Completamente de acuerdo, es un método muy 'rupestre', lo suyo es hacer lo que dices, ya lo comento así en el artículo. En cualquier caso, comento que hay gente que utiliza ese método tipo 'bruteforce' ya que no disponen de suficiente conocimiento técnico y lo hacen así. Y lo curioso es que en muchos casos, y tras grandes dosis de paciencia y tiempo invertido, les funciona.

Abraham Pasamar dijo...

Ésta es una técnica que se está utilizando y sigue siendo efectiva, especialmente para localizar las firmas, no para "evadirlas" como ya digo en post. Las heurísticas son más complicadas, pero en cualquier caso esta técnica sigue aportando información para saber dónde recae la firma, de si hay más firmas ocultas, etc. Por supuesto existen más técnicas que pretendo explicar en próximos posts.

Code dijo...

GENIAL!!!

Anonimus dijo...

Yo ya ni uso Antivirus, con "Comodo Firewall" + "Defense +" ya no me entran bichos.

Abraham Pasamar dijo...

Está muy bien reforzar la seguridad de tu escritorio con defensas perimetrales, en cualquier caso, el AV te ayuda a detectar muchas "bichos" que se han podido colar en la máquina. En principio está claro que solo los "bichos" conocidos o los detectados por heurística. Está claro que si el "crypter" o el propio "malware" está FUD no van a detectar nada. Pero vivir sin ellos es vivir al límite. Es como las vacunas, no puedes no vacunarte de algunas enfermedades por conocidas que sean y por improbable que sea contagiarte a día de hoy. Y además aunque te vacunes de la gripe, si la nueva cepa es una mutación genéticamente diferente (FUD :) te infectas igual. Por cierto, ojo con los USB en esa infraestructura que describes.

SandBoxFucker dijo...

Eso es lo que tu crees, que no te salte el firewall no significa que estés limpio, no es por fastidiarte pero esto es así, como bien dice Abraham en su comentario: si el "crypter" o el propio "malware" está FUD no van a detectar nada. No digo que comodo sea malo, sólo que te veo muy confiado en un software que no protege 100%

giovanni perez rubalcaba dijo...

Me parece genial el tutorial, lo cierto es que los que nos dedicamos al modding (pasado) (indetectables.n..) jeje esto lo tuvimos que aprender de otros compañeros de una forma más práctica, no con un manual tan explicado, y como bien dice FOca digo Oca jeje sabiendo la dirección donde cae el offset sería cuestión de utilizar el método RIT metiéndonos de lleno con un dissambler.

code-disaster.blogspot.com dijo...

Me parece genial el tutorial, lo cierto es que los que nos dedicamos al modding (pasado) (indetectables.n..) jeje esto lo tuvimos que aprender de otros compañeros de una forma más práctica, no con un manual tan explicado, y como bien dice FOca digo Oca jeje sabiendo la dirección donde cae el offset sería cuestión de utilizar el método RIT metiéndonos de lleno con un dissambler.

María García dijo...

Es curioso que no es el primero al que oigo/leo decir que no usa antivirus. Lo mismo me ha dicho gente con bastante nivel técnico. En mi opinión, cuanta más protección mejor. Aunque los antivirus solo detecten una pequeña parte de los "bichos" (y, según avance esta serie sobre los crypters, iremos comprendiendo mejor por qué).


Por cierto: el artículo genial, como siempre. Qué bien te explicas y qué ejemplos más bien traídos. Deberían hacerte miembro fijo de la plantilla (yo, por pedir... je, je).


Un saludo

Ciberbob dijo...

Para cuando el próximo? Recién los pillé, pero me quede con las ganas de seguir leyendo.
Muy bueno el post!