25 mar 2013

Técnicas de evasión de antivirus (Parte III)

Buenas a todos, hoy continuaremos hablando de técnicas de evasión de antivirus hablando de las APIs de Windows “peligrosas” de utilizar si queremos dificultar la vida a los motores de los antivirus. Para el ejemplo de hoy nos olvidaremos de .Net por un rato y haremos uso del clásico lenguaje ANSI C, mucho más popular a la hora de desarrollar malware.

Cuando desarrolláis un malware (asumiremos que con fines éticos) habréis experimentado que muchos antivirus en un análisis estático del malware cazan el uso de ciertas funciones de la API de Windows, que ya tienen en su listado de “cantosas”. Un claro ejemplo es URLDownloadToFileA, que permite descargar un archivo en el PC, es muy utilizada por los malware de tipo “Dropper”.

Pues bien, existen alternativas para seguir utilizando este tipo de funciones, y evitar ser detectados en un análisis estático. Una de ellas, y que es muy utilizada en el mundo del exploiting, es el uso de las funciones LoadLibrary() y GetProcAddress(). En resumen, lo que nos interesará es que el nombre de la función URLDownloadToFileA no aparezca en el binario del malware y para ello, podremos cifrar el texto con el nombre de la función, haciendo uso de algún algoritmo de cifrado tipo Caesar, Xor o similares. De manera que en el binario solo aparecerá el texto cifrado. A continuación el malware debería descifrar el texto y llamar a LoadLibrary, pasándole el texto descifrado, de manera que cargue la librería de manera dinámica en memoria. Una vez cargada, simplemente deberemos llamar a GetProcAddress() para averiguar la dirección de memoria donde ha sido cargada nuestra función para comenzar a utilizarla.

La teoría es sencilla ¿no? Vamos a practicarla.

La siguiente función nos permitirá descargar un archivo, indicándole la URL donde se encuentra, y la ruta destino donde será almacenado en la máquina. Como vemos, carga dinámicamente la libería urlmon.dll, llamando a la función URLDownloadToFileA:

char downloadFile(char* URL, char* FilePath){Udtf _Udtf = (Udtf)GetProcAddress(LoadLibrary("urlmon.dll"),"URLDownloadToFileA");return _Udtf(0,URL,FilePath,0,0);}
Si analizamos el exe resultante con peframe, veremos que no aparece URLDownloadToFileA entre las APIs utilizadas. 

Esto es debido a que la estamos cargando dinámicamente en memoria. Pero aún así, si un antivirus analiza el binario, puede encontrar el texto en claro “URLDownloadToFileA”. Como vemos a continuación si abrimos el exe con un editor hexadecimal:

 

Una solución sencilla sería cifrar el texto como os indicábamos:

char downloadFile(char* URL, char* FilePath, char* DLLCifrada, char* FuncionCifrada){Udtf _Udtf = (Udtf)GetProcAddress(LoadLibrary(descifrar(DLLCifrada),  descifrar(FuncionCifrada));return _Udtf(0,URL,FilePath,0,0);}

De esta manera evitaremos que los antivirus detecten el uso de URLDownloadToFileA, a menos que sean capaces de analizar malware en memoria, cosa que a día de hoy muy pocos antivirus hacen, por el coste computacional que ello conlleva. De todas maneras si analizáis el binario con DrWeb, un antivirus que sí que es capaz de analizar a nivel de memoria, veréis que se come nuestro juguete.

Saludos!

 

1 comentario:

  1. [...] Una de las cadenas más populares en Flu Project, Tecnicas de evasión de AVs. En esta ocasión hablamos de la tercera parte de la serie. [...]

    ResponderEliminar