Evasión avanzada en Windows: inhabilitación de AMSI y ETW a través de PowerShell

Resumen ejecutivo

En este análisis se revisan técnicas avanzadas utilizadas por código malicioso para evadir AMSI y ETW en Windows, mediante PowerShell así como técnicas de memory patching, con el objetivo de eludir soluciones de antivirus y EDR.

Así también, es muy interesante observar como un solo archivo .bat puede auto contener 3 scripts en PowerShell, un PE malicioso y, adicional, implementar cifrado AES para mantener oculta la carga útil, así como diferentes técnicas de ofuscación y evasión de la funcionalidad de AMSI y ETW.

Introducción

¿Qué es AMSI y ETW?

AMSI (Antimalware Scan Interface) es una interfaz nativa de Windows implementada en la biblioteca dinámica amsi.dll, diseñada para mejorar la protección antivirus del usuario final. Funciona como un intermediario entre distintos consumidores, como PowerShell, Windows Script Host (wscript.exe y cscript.exe), JavaScript, VBScript y *macros de Office VBA, y el proveedor de seguridad.

Esta interfaz permite enviar el contenido de los scripts ya desofuscados y descifrados, antes de ser ejecutados, al proveedor local de antivirus, para su análisis, y este a su vez regresará el resultado del análisis, permitiendo o denegando su ejecución según sea el caso.

Evasión de AMSI y ETW en Windows mediante PowerShell
Diagrama de AMSI

ETW (Event Tracing for Windows) es un mecanismo nativo de Windows diseñado para el seguimiento y registro de múltiples eventos generados por aplicaciones y controladores. Las soluciones EDR utilizan este mecanismo para identificar comportamiento malicioso mediante el análisis de los flujos reportados por ETW.

Evasión de AMSI y ETW en Windows mediante PowerShell
Diagrama de ETW

Una vez explicado brevemente estos componentes así como su funcionamiento, vamos a revisar un par de técnicas que implementa la muestra que analizamos en esta publicación. Para mayor detalle de estos componentes de Windows, se puede revisar la documentación oficial de Microsoft:

https://learn.microsoft.com/en-us/windows/win32/amsi/antimalware-scan-interface-portal

https://learn.microsoft.com/en-us/windows-hardware/test/wpt/event-tracing-for-windows

Muestra para analizar

Técnicas utilizadas para evadir AMSI y ETW en Windows

Para poder mostrar las técnicas de evasión de AV/EDR en una pieza de código malicioso real, vamos a tomar una muestra de la familia de malware Remcos, esta tiene múltiples fases de ejecución y despliegue, todas integradas inicialmente en un archivo .bat, este es un Fileless malware ya que carga los scripts y archivos directamente a memoria una vez que se ejecuta por primera vez el script.

Ejecución inicial

El archivo .bat contiene un comando en PowerShell que se encuentra ofuscado, este comando está dividido en múltiples variables y cadenas, luego, en la línea 191 estas cadenas se unen para formar y ejecutar el comando de Powershell:

Evasión de AMSI y ETW en Windows mediante PowerShell
Comando ofuscado

El comando realiza, entre otras tareas:

  • Valida que una copia del archivo .bat se encuentre en directorio del usuario
  • Lee todas las líneas del archivo .bat en busca de 2 cadenas específicas, una inicia con ::: y la otra con ::
  • La primera cadena ::: contiene otro script codificado en Base64, lo carga a memoria y lo ejecuta
  • La segunda cadena :: contiene un archivo comprimido que está cifrado con algoritmo AES
  • Define 3 funciones, una para descifrar AES, otra para desempaquetar archivos y la tercera para cargar en memoria y ejecutar una carga útil.

Una vez desofuscado el comando obtendremos lo siguiente:

Búsqueda del script para ejecutar la evasión

La cadena en Base64 que comienza con ::: (estos símbolos serán omitidos, solo son identificadores para el script pueda localizar la cadena) contiene otro script en PowerShell, este script realiza 2 funciones principalmente:

  • Realiza un bypass a AMSI
  • Realiza un bypass a ETW

¿Cómo evadir AMSI y ETW en Windows mediante PowerShell?

Primero, en el script se definen un par de funciones que servirán para identificar las direcciones de la funciones y, ejecutar la técnica de delegate:

inhabilitación de AMSI y ETW mediante PowerShell
Funciones para obtener dirección y delegar

Luego, para poder obtener acceso a las funciones del sistema, el malware carga System.Windows.Forms.UnsafeNativeMethods, después identifica las funciones que requiere, estas funciones están codificadas en hexadecimal, una estrategia más para evitar ser detectado por el uso de funciones sospechosas:

Uso de UnsafeNativeMethods

Mediante la técnica de delegate, apunta a las bibliotecas amsi.dll y kernel32.dll así como a las respectivas funciones AmsiInitialize y VirtualProtect.

inhabilitación de AMSI y ETW mediante PowerShell
Uso de función Delegate

Una vez que se ha realizado el delegate, se realiza el cambio de permisos del segmento de memoria para poder aplicar un memory patching, es decir, cambia de modo lectura, a lectura y escritura, y modifica los opcodes de la función de AMSI:

Aplicación de Memory patch

El memory patch que se aplica es 0xb8,0x0,0x00,0x00,0x00,0xC3, esto se traduce en los opcodes:

1 mov eax, 0

2 ret

Al inyectar estos opcodes al inicio de la función AmsiScanBuffer, esta terminará de inmediato, regresará un 0 que se traducirá en un AMSI_RESULT_CLEAN, lo que provocará que la función siempre devolverá como resultado que el código “analizado” es seguro sin haber sido analizado en realidad.

Una vez que se ha aplicado el memory patch, el script intentará restaurar los permisos de solo lectura al segmento de memoria que ha sido modificado:

Restauración de permisos

De esta manera, el script ha modificado el comportamiento de la función AMSI, evitando que se realicen los escaneos de los siguientes comandos y este siempre reportará no haber identificado código malicioso.

Memory patch para evadir ETW en Windows

Del mismo modo que en el caso de AMSI, obtendrá la dirección de la función EtwEventWrite, definida en ntdll.dll, habilitará permisos de escritura y aplicará el memory patch, en el caso de x64 aplica un 0xC3, para x86 aplicará 0xb8,0xff,0x55:

inhabilitación de AMSI y ETW mediante PowerShell
Memory patch a ETW

Una vez aplicado el memory patch que tiene el mismo propósito que el revisado AMSI, es decir, entrar a la función y, sin realizar ninguna acción, regresará el control a quién la ha invocado con un opcode ret (return), al final, intentará restaurar los permisos de solo lectura:

Restauración de permisos

Descifrado de la carga útil

Ya que el script ha aplicado los memory patch a las funciones para evitar la detección, procede a realizar el descifrado de 2 archivos, estos están contenidos en la línea que inicia con :: dentro del .bat.

Búsqueda de carga útil

Una vez descifrados, son descomprimidos y ejecutados.

inhabilitación de AMSI y ETW mediante PowerShell
Ejecución de carga útil

Carga útil utilizada para evadir AMSI y ETW en Windows

Continuamos con en análisis de la carga útil, podemos observar que, utiliza las mismas técnicas para evitar la detección en el sistema, aplicará el memory patch a la función en ETW:

  • Carga la biblioteca ntdll.dll
  • Obtiene la dirección EtwEventWrite
  • Selecciona el memory patch de acuerdo a la arquitectura identificada
  • Cambia permisos para modificar la memoria
  • Aplica el memory patch
  • Restaura permisos
inhabilitación de AMSI y ETW mediante PowerShell
Memory patch a ETW desde PE

Esto tendrá el mismo efecto que en el caso anterior, es decir, la función queda inhabilitada y simplemente regresa el control sin haber realizado ninguna acción.

Ahora, el malware podrá realizar las actividades para las que ha sido diseñado sin ser identificado por la solución de antivirus e incluso del EDR que pudiera estar instalado.

Conclusiones

Este análisis demuestra que evadir AMSI y ETW en Windows es viable cuando se compromete la integridad de las funciones en tiempo de ejecución. La efectividad de las funcionalidades de AMSI y ETW dependen de la integridad de las funciones en tiempo de ejecución, al aplicar un memory patch mediante PowerShell o cualquier otro medio, así como el uso de técnicas de Delegate, el código malicioso logrará pasar desapercibido en el sistema.

Este análisis también nos permite concluir que un enfoque más adecuado para proteger los equipos de cómputo contra código malicioso puede ser una estrategia de defensa en profundidad, considerando otras herramientas, así como configuraciones seguras, el robustecimiento de sistemas operativos, aplicar el mínimo privilegio a usuarios y procesos, implementar estrategias de concienciación de los usuarios entre otros controles que pueden ayudar a disminuir el riesgo de compromisos de seguridad.

Autor

  • Eduardo Salmerón

    Eduardo Salmerón es Ingeniero en Computación por la FES Aragón y cuenta con una sólida formación en ciberseguridad, iniciada con un diplomado en Seguridad de la Información en la UNAM, complementado con cursos en Pruebas de Intrusión y Respuesta a Incidentes. Está certificado como ECIH (Certified Incident Handler). Con más de 10 años de experiencia, ha trabajado como consultor en sectores como el financiero, energético, turismo y retail. Actualmente se desarrolla como Cyber Threat Research en Silent4Business.

Publicar comentario

LinkedIn
Share
×