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.

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.

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:

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:

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:

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:

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

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:

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:

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:

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:

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.

Una vez descifrados, son descomprimidos y ejecutados.

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

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.
Publicar comentario