30 septiembre 2013

'CRYPTERS': practicando la técnica dsplit/Avfucker

Tal y como ya adelanté, en este artículo vamos a poner en práctica lo que hemos aprendido hasta el momento sobre la evasión de Antivirus, en adelante AVs. En el último post de esta serie sobre 'Crypters', vimos los fundamentos teóricos de la técnica 'dsplit/AVfucker'. En este post voy a tratar de ilustrar esta técnica con un ejemplo práctico, valiéndome de un caso muy sencillo de aplicación de esta técnica.

Herramientas


Existen diversas herramientas que permiten aplicar la técnica 'dsplit/AVfucker', concretamente voy a utilizar una que es bastante cómoda, tiene muchas funcionalidades y es bastante rápida, pero si buscáis encontraréis otras por los foros relacionados con el tema. En concreto voy a utilizar 'UdTools Offset Locator 2.0'. También necesitaremos un anotador, así que voy a utilizar 'Antrax-Labs Offset Anotator' (by The Swash). Adicionalmente, utilizaré un 'Hex Workshop 6.7' como editor hexadecimal y 'OllyDbg' como disassembler (desensamblador).

Crypter

Para 'modear' un 'stub' hay que disponder del 'crypter' (tanto el 'builder' como el 'stub'). Es importante conseguir uno que sea 'original', es decir, que no haya sido 'retocado'. Trabajar un ejecutable previamente 'modeado' es siempre más complicado. Para este ejemplo voy a utilizar 'Simple Crypter 2010' (by DuNeD@i).

AV

Voy a utilizar para este ejemplo una 'firma' bastante sencilla del AV de origen Checo Avast (avast!). Ese, con esa voz tan sexy que siempre nos recuerda: "La base de datos de virus, ha sido actualizada". Lo primero que haremos, será configurar adecuadamente el AV para el proceso de 'modding'. Para ello, desactivaremos todos los 'escudos' en tiempo real y desactivaremos la opción de envío de muestras (En el caso de Avast hay que desactivar la opción 'Participa en la comunidad avast!')

Entorno de trabajo


Lo primero de todo es mantener una buena organización del entorno de trabajo. Para ello, vamos a trabajar en una carpeta en la crearemos varias 'sub-carpetas'. Una se llamará 'original' y en ella guardaremos el 'Crypter Original'. En otra carpeta guardaremos nuestro 'Anotador' y por último las dos más importantes, a las que se llamaremos 'offsets1' y 'offsets2', que funcionarán como carpetas de resultados en las que se almacenarán los diferentes archivos generados meadiante la aplicación de la técnica 'dsplit' y 'AVfucker'. En breve veremos el propósito de cada una de estas carpetas. Para comenzar a 'modear' necesitamos aplicar el 'crypter' a nuestro ejecutable de prueba, el 'anotador'. Para ello abriremos el 'builder' (llamado crypterx.exe en este crypter), y seleccionaremos el 'anotador'. Pulsaremos el botón 'Crypt' y se abrirá una ventana del explorador de archivos para indicar el nombre y ubicación del ejecutable. En este ejemplo lo llamaré 'modme.exe'.



Hey Ho Let's Go!


Dsplit

Ya tenemos todo lo necesario para aplicar 'dsplit' así que vamos allá. Abrimos 'UDTools Offset Locator 2.0' y arrastramos (o seleccionamos) el ejecutable 'modme.exe' al primer campo del formulario 'Archivo & Directorio'. En el segundo campo, arrastraremos el directorio 'offsets1'. A continuación, en la sección 'Método' seleccionamos 'DSplit'. En la sección 'offsets' veremos que los valores que se aparecen corresponden a el offset inicial: 1.000 (comienzo del ejecutable sin la cabecera PE) y el offset final del archivo (último byte del ejecutable), en ese caso 45.062. En la sección 'bytes', aparece por defecto el valor 1.000, que es el bloque de 'bytes' que vamos a usar en la primera iteración del proceso 'dsplit'. Si por algún motivo, nuestro archivo a 'modear' fuese mucho mayor, podríamos comenzar por bloques de '10.000' bytes, pero lo habitual es comenzar por 1.000 para que el número de archivos a generar y sobre todo a 'escanear' por el AV sea manejable. En general suele ser una buena idea seleccionar la opción 'Borrar todos los archivos del directorio seleccionado', de este modo, en cada ejecución lo primero que se llevará a cabo es el borrado del directorio seleccionado, por ahora 'offsets1'. Bien, pues ya solo queda pulsar el botón 'Iniciar' y se generarán en el directorio 'offset1' los archivos de tamaño incremental (1.000 bytes adicionales cada uno) desde el offset 1.000 hasta el offset '46.000'. 

El nombre de cada archivo, se corresponde con el offset en el que número de bytes añadidos al archivo, y del tamaño del bloque utilizado. Así pues tendremos: 1000_1000.exe, 2000_1000.exe, ..., 46000_1000.exe. 

A continuación, 'escanearemos' con el AV Avast la carpeta 'offsets1'. Pulsaremos botón derecho sobre la carpeta y seleccionaremos 'Analizar offsets1'. A continuación, nos aparecerá una ventana emergente de resumen del scan que indicará 'AMENAZA DETECTADA' y pulsaremos sobre el botón 'MOSTRAR RESULTADOS'. Nos aparecerá el detalle del análisis para cada fichero del directorio 'offsets1'. La firma que detecta es la misma en todos los archivos, en concreto: 'Win32:Malware-gen'. Si nos fijamos, veremos que no aparece ninguna detección de la firma hasta un offset concreto, en este caso el offset 11.000. A partir de ahí todos los demás offsets son detectados. Por tanto, sabemos que en el entorno del offset 10.000 el AV reconoce código malicioso y salta la detección de la firma. 

Vamos a precisar el offset concreto. Para ello, continuaremos con el proceso 'dsplit' en el entorno del offset 10.000. Volvemos a la aplicación 'UDTools Offset Locator 2.0' e introducimos el offset inicial 9.000 y el el offset final 11.000. Esto lo hacemos para evitar problemas con las zonas frontera. A continuación seleccionamos el valor de 'bytes' a 100, reduciendo un orden de magnitud respecto del valor anterior que era 1.000. De este modo, vamos precisando en cada iteración un poco más. Pulsamos el botón 'Iniciar' y se generan los archivos en 'offsets1'. Todos los archivos del proceso anterior se habrán borrado si la opción 'Borrar todos los archivos del directorio seleccionado' estaba marcada. 

Repetiremos el proceso de 'escaneo' mediante la opción 'Analizar offsets1' que nos aparecerá al pulsar el botón derecho sobre la carpeta. Una vez 'escaneada' la carpeta y desplegado el cuadro de 'MOSTRAR RESULTADOS' veremos que el primer offset detectado es 10.600. Una vez más volveremos a la aplicación 'UDTools Offset Locator 2.0' y seleccionaremos el rango 1.500 a 1.700 como offsets incial y final y reduciremos los 'bytes' de incremento a 10. Volveremos a 'escanear' y esta vez veremos que el primer offset detectado es 10.560. 

Una última iteración entre 10.550 y 10.570 con un incremento de 1 byte, nos indicará que el offset exacto en el que se detecta código malicioso es 10.552. Es decir, hasta el byte anterior el AV no ha sido capaz de detectar la firma, sin embargo, a partir del byte 10.552 ya la detecta. Parece lógico pensar que los bytes que definen la firma han de estar exactamente en el entorno de 10.552 pero no es así. La técnica 'dsplit' nos indica que en ese 'pedazo' de archivo seleccionado de 10.552 bytes el AV es capaz de detectar la firma. Mediante la técnica 'AVfucker' vamos tratar de localizar los bytes que conforman la firma. Para poder aplicar la técnica 'AVfucker' lo primero que haremos es copiar el archivo 10552_1.exe de la carpeta 'offsets1' a la carpeta de trabajo.

AVfucker


En la campo 'archivo' del formulario de la aplicación 'UDTools Offset Locator 2.0' teníamos nuestro archivo 'modme.exe', que es con el que hemos estado trabajando hasta el momento. Ahora arrastraremos el archivo 10552_1.exe a dicho formulario, ya que es sobre este archivo sobre el que vamos a aplicar la técnica 'AVfucker'. En el formulario 'directorio' no vamos a hacer cambios y mantendremos la carpeta 'offsets1'. En la sección 'Método' seleccionaremos 'Av-Fuck'. Veremos que ahora el offset inicial es 1000 y el offset final 10552, mientras que el rango de 'bytes' vuelve a ser 1000. La diferencia fundamental entre 'dsplit' y 'AVfucker' es que con 'dsplit' solo recortamos el ejecutable en secciones, mientras que con 'AVfucker' lo que hacemos es 'tapar' o 'rellenar' secciones del ejecutable con un valor determinado. Por tanto, en la aplicación 'UDTools Offset Locator 2.0' debemos indicar con que valor queremos 'rellenar'. podemos escribir el valor hexadecimal que queramos, siendo los valores '00' ó '90' los más usados generalmente. También podemos usar el botón 'A' para rellenar el campo con un valor aleatorio. El valor a escoger puede depender de varios factores, en general, '90' (instrucción NOP en ensamblador) es un buen valor de 'relleno' para comenzar. Pulsamos 'Iniciar' y se generan en 'offsets1' 10 archivos con sus respectivas zonas de 1000 bytes rellenos del byte '90'.

Ahora vamos a escanear 'offsets1' mediante el AV. Nos indicará 'AMENAZA DETECTADA' y si pulsamos 'MOSTRAR RESULTADOS' veremos que hay 9 offsets detectados. Ahora, lo que haremos, a diferencia del método 'dsplit' es eliminar los archivos cuyos offsets han sido detectados. Podemos indicar 'Aplicar esta acción a todos: Eliminar' y pulsar 'Aplicar'. Esto dejará en el directorio los archivos cuyos offsets 'indetectan' la firma. En este caso, solo queda uno, el archivo con offset 10.000. A continuación, desde 'UDTools Offset Locator 2.0' pulsaremos el botón 'Mostrar Offsets' y se mostrarán los diferentes offsets 'indetectados'. Si hacemos doble-clic sobre un rango concreto éste se agregará a la herramienta, y automáticamente se reducirá el rango de bytes para la siguiente interacción. En este caso, hay un único rango de 'indetección' por el momento, offset inicial 10.000, offset final 11.000 y bytes se reduce a 100. Si pulsamos de nuevo iniciar, aparece un aviso de que el offset 11.000 es mayor que el tamaño del archivo, si pulsamos aceptar se rellenará como offset final el valor correcto (10.552) y nos permite continuar. Pulsamos de nuevo 'Iniciar' y se generan los archivos en 'offsets1' que pasamos a escanear. Curiosamente, no nos detecta amenaza en ninguno de los archivos. Esto es no es habitual, pero en ocasiones ocurre que hay un rango muy grande de offsets que 'indetectan' la firma. Lo que podemos hacer ahora, es elegir uno de los archivos, por el ejemplo el primero de los offsets 'indetectados' y continuar reduciendo el rango de bytes hasta llegar a 1 byte. En realidad podemos trabajar con todo el rango, pero al ser tan grande vamos a generar muchos ficheros, especialmente al llegar a valores de un byte. Es preferible hacerlo por bloques. Por tanto, rellenamos con el valor 10.000 el offset inicial y 10.100 el offset final y reducimos a 10 el rango de bytes. Analizamos con el AV el resultado y nos detecta los offsets iniciales, pero deja 'indetectados' desde el 10.040 al 10.100. Reducimos a un byte y repetimos. Escaneamos y observamos que los 60 offsets 'indetectan' la firma.

Si miramos la zona con detenimiento y la ayuda de un editor hexadecimal, Hex Workshop en este caso, parece que se corresponde con algunas cadenas de texto. Para asegurarnos, examinamos también la zona con OllyDbg. Podemos probar a ir cambiando algunos de estos valores a ver si encontramos algún offset que mantenga funcional el ejecutable. Hay que tener en cuenta que hemos trabajado con un archivo recortado obtenido del proceso 'dsplit', por tanto, no es posible hacer pruebas sobre dicho archivo. Tendremos que hacer las pruebas de dichas modificaciones sobre el archivo ejecutable original al que habíamos llamado 'modme.exe'. Si hacemos una copia del mismo podemos probar a alterar manualmente algunos de los offsets para ver si nos deja 'funcional' el archivo, aunque también podemos continuar con el proceso 'avfuck' para localizar algún archivo funcional. 


Si estuviésemos ante una zona de código con instrucciones, lo más práctico sería aplicar técnicas como RIT o XOR para alterar las instrucciones de forma que se partiese la firma pero no se viese alterado el resultado del ejecutable. En este caso, como se trata de cadenas de bytes, es más práctico buscar alguna alteración de las mismas que no dañe el ejecutable. 

Lo que vamos a hacer es aplicar la técnica 'avfucker' sobre el archivo 'modme.exe' en lugar de trabajar sobre el archivo obtenido mediante 'dsplit' (10552_1.exe) y dejar los archivos resultantes en la carpeta 'offsets2'. Para ello arrastraremos el archivo 'modme.exe' y la carpeta 'offsets2' a los correspondientes campos de la herramienta y seleccionaremos el rango de offsets previo: 10.040-10.100. Pondremos el rango de bytes a 1 y seleccionaremos el relleno con '90'. Una vez tengamos los archivos en la carpeta 'offsets2' deberíamos eliminar de la misma aquellos cuyos offsets no 'indetectan' la firma. Hasta ahora, este proceso de eliminación lo hemos hecho mediante el 'escaneo' con el AV, pero hay que tener en cuenta que si hubiese alguna segunda firma el el archivo, el AV la detectaría y nos eliminaría todos los ficheros. Por lo tanto, lo que tenemos que hacer es eliminar de 'offsets2' los archivos que previamente hemos eliminado mediante la detección del AV de la carpeta 'offsets1'. En este caso concreto, todos los archivos del rango comprendidos entre el offset 10.040 y 10.100 están 'indetectados', y por ende la comparación de 'offsets1' y 'offsets2' quedará igual y no se eliminará ningún archivo, pero por regla general, esté proceso eliminará archivos de 'offsets2'. La herramienta 'UDTools Offset Locator 2.0' dispone de un botón en el menú superior que permite hacer está eliminación. Como en este caso no hay eliminación, probaremos a ejecutar cada uno de los archivos que se han generado en la carpeta 'offsets2'. Si alguno de ellos es funcional habremos roto la firma.


En nuestro ejemplo hay numerosos offsets en dicho rango que al ser rellenados con el byte '90' dejan funcional el ejecutable y por tanto 'indetectan' la firma.


Además no existe una segunda firma del AV para este archivo, sin embargo, en muchos casos, al conseguir tapar la primera firma, hay que continuar con el proceso 'dsplit' para localizar un segundo bloque de detección y volver aplicar AVfucker para localizar los offsets de las firmas adicionales.

Aplicar modificación al stub

Hay que tener en cuenta que hemos trabajado con el archivo 'modme.exe' para poder verificar su funcionamiento, pero en realidad lo que necesitamos es aplicar los cambios realizados al 'stub'. Para ello podemos hacer un copia del 'strub.exe' original y repetir los cambios realizados sobre 'modme.exe' también sobre el 'stub', o bien podemos extraer el 'stub' del archivo 'modme.exe'. Mediante un editor hexadecimal podemos llevar a cabo fácilmente esta operación. Simplemente es necesario conocer el tamaño del 'stub' original y seleccionar desde el primer byte hasta el tamaño final del 'stub' y guardar los bytes seleccionados a un nuevo archivo.

Como ya comenté al inicio, éste es un caso básico de eliminación de una firma de AV que sirve para ilustrar la técnica 'dsplit/avfucker' de una manera sencilla. Evidentemente hay multitud de firmas muchísimo más complejas que ésta, pero este ejemplo confirma la debilidad de algunas de las firmas que establecen los AVs.

Artículo cortesía de Abraham Pasamar

12 comments :

h3ku dijo...

Muchas gracias, tenia unas ganas tremendas de esta entrada.
Podéis poner los archivos usados?
Básicamente el modme.exe y el crypter base, que hay mucho "regalo" suelto.

Gracias.

Anonimo dijo...

Con unas buenas prácticas de navegación los antivirus son totalmente innecesarios. Las defensas perimetrales y un sistema configurado pensando en la seguridad son lo único fundamental por el tema de ataques que albergan inteligencia humana detrás.

it dijo...

Genial articulo, lo probe y logré quitar la firma basada en texto,en 5 minutos para AVAST.
Esto hace crecer mas mi desconfianza hacia los antivirus, como ya saben no es una solución que pueda asegurarte mucha seguridad.

Roberto Blanco dijo...

La verdad Genial artículo, sólo quisiera saber si me pueden sacar de una duda. Durante los artículos se habló de que un crypter cifra el payload con algoritmos como rc4 o xor, no obstante, me gustaría saber si para ello también puede utilizarse algoritmos como AES, blowfish, entre otros. Mi pensamiento con respecto a esto, es que por la cantidad de procesamiento que requieren y por la cantidad de código que utiliza, es posible generar sin fin de firmas para los AV. Esas son mis teorías, por lo que quisiera saber si alguien pudiera decirme la razón de usar casi siempre rc4 o xor.

Abraham Pasamar dijo...

Los AV no son innecesarios, obviamente las buenas prácticas de navegación sonimportantes, pero delegar toda la defensa en ellas no es buena idea. Con los AV te proteges de todos el malware conocido (y un poco del no-conocido pero similar al conocido). Con defensas perimetrales te proteges de muchas conexiones sospechosas y con unas buenas prácticas evitas de navegación correr riesgos ya que te expones menos a los problemas. Aun con todo, te la pueden colar, a ti y a todos.

Abraham Pasamar dijo...

como he comentado en otra respuesta, los AV nunca están de más. Lo importante es entender las limitaciones que tienen.

Abraham Pasamar dijo...

Se pueden usar otros algoritmos de cifrado, pero por comodidad mucha gente implementa XOR o RC4 si bien, eso hace que las firmas los detecten con facilidad. Otros algoritmos están menos "quemados" y tienen menos detecciones. Lo mejor es no usar ninguna librería y utilizar un algoritmo propio.

Joaquin dijo...

Publicate el proximo!!! Estan muy buenos estos mini tutos!!!!! :)

María García dijo...

¡Uff! Qué duro tras la pausa volver a meterse con esto. Está muy bien: es como un curso a distancia y encima gratis. Y muy bien explicado. Ahora además he entendido por qué decía el macarrilla del otro post aquello de "me quemas todos los stubs" o algo así.
Gracias otra vez.

Sherab Giovannini dijo...

Buenas,

Una de las razones por la cual el algoritmo sea un simple xor, o RC4, TEA. Es por la velocidad de cifrado / descrifrado. Algoritmos como AES te exigen por un lado hacer uso de la cryptoapi (si quieres hacer un cifrado robusto) y por otro lado una cierta penalización de rendimiento vs los anteriores.

Anonim dijo...

Hola Abraham muy buenos artículos, enhorabuena!!!

En el párrafo "Repetiremos el proceso de 'escaneo' mediante la opción 'Analizar offsets1' que nos aparecerá al pulsar el botón derecho sobre la carpeta. Una vez 'escaneada' la carpeta y desplegado el cuadro de 'MOSTRAR RESULTADOS' veremos que el primer offset detectado es 10.600. Una vez más volveremos a la aplicación 'UDTools Offset Locator 2.0' y seleccionaremos el rango 1.500 a 1.700 como offsets incial y final y reduciremos los 'bytes' de incremento a 10. Volveremos a 'escanear' y esta vez veremos que el primer offset detectado es 10.560. "

El rango 1.500 a 1.7000, seria 10.500 a 10.700, verdad?

Saludos!!!

Z++ dijo...

Excelente, estoy iniciándome esto del moding, alguien por aca tiene algún libro de "cabecera" que recomienden para arrancar? Muchas gracias por el material.