Antimalware Scan Interface es un sistema que Microsoft creó para proteger contra scripts maliciosos en PowerShell. En este artículo demostraré cómo funciona un método para evitar este mecanismo. Ejecutaremos el script de PowerShell como un proceso en depuración, lo que abre algunas posibilidades interesantes.
En un nivel alto, AMSI conecta cada comando o script en tiempo de ejecución y lo pasa al software antivirus local para su inspección. Además, se admite casi cualquier antivirus, no solo el Defender estándar.
AMSI puede funcionar:
- PowerShell;
- Host de secuencias de comandos de Windows (
wscript
ycscript
); - JavaScript y VBScript;
- VBA-macrosami.
El problema con esta implementación es que amsi.dll
(en el que se implementa toda la lógica AMSI) se encuentra en el espacio de direcciones del proceso actual. Como resultado, los atacantes tienen la oportunidad de manipular esta biblioteca como quieran. Ya se han inventado muchas formas de evitarlo, incluidas amsiInitFailed, enganches y parches. Hoy discutiremos otra solución: ejecutar el proceso de PowerShell en modo de depuración.
Convertirse en un depurador
Recientemente descubrí una función API interesante. DebugActiveProcess()
, lo que permite que nuestro proceso se convierta en un depurador de otro proceso. Su prototipo es muy simple, sólo necesita pasar el PID del proceso que desea depurar.
BOOL DebugActiveProcess(
[in] DWORD dwProcessId
);
Lamentablemente, no es posible depurar ningún proceso. Una llamada exitosa a esta función ocurrirá solo si se cumple al menos una de las siguientes condiciones:
- nuestro token de proceso tiene
SeDebugPrivilege
; - podemos solicitar un identificador para el proceso que se está depurando con una máscara
PROCESS_ALL_ACCESS
.
Parecería que los requisitos son más que serios, pero nada nos impide iniciar el trámite. powershell.exe
como niño, y nuestro proceso padre seguramente podrá solicitar una máscara para el proceso hijo PROCESS_ALL_ACCESS
.
¿Qué nos dará el estado del depurador? La única ventaja es la capacidad de procesar eventos de depuración, incluidos LOAD_DLL_DEBUG_EVENT
. El evento se genera tan pronto como se intenta cargar una DLL en el espacio de direcciones del proceso que se está depurando. Además, la estructura se rellenará. LOAD_DLL_DEBUG_INFO
, que contiene la dirección base de la biblioteca que se va a cargar. Y con la dirección base ya puedes hacer muchas cosas…
Sugiero pasar a la práctica. En primer lugar, no podemos iniciar un proceso a ciegas y luego no está claro cuándo adjuntarle un depurador, por lo que existe la posibilidad de perder el momento de carga. amsi.dll
en el proceso. Por lo tanto el proceso debe iniciarse con la bandera. CREATE_SUSPENDED
. En segundo lugar, debido al hecho de que no procesamos eventos de depuración de ninguna manera, la aplicación puede fallar. Por lo tanto, después de parchear AMSI, debes dejar de ser un depurador lo antes posible.
Para crear un proceso escribí una función separada StartProcessSuspended()
.
DWORD StartProcessSuspended(LPWSTR ProcName, HANDLE& hThread, HANDLE& hProc) {
STARTUPINFO si = { 0 };
PROCESS_INFORMATION pi = { 0 };
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOWNORMAL;
if (!CreateProcess(ProcName, NULL, NULL, NULL, FALSE, CREATE_SUSPENDED | CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi)) {
DWORD err = GetLastError();
std::cout << h("[-] Cant Create Suspended Process : ") << err << " " << GetWinapiErrorDescription(err) << std::endl;
return -1;
}
hThread = pi.hThread;
hProc = pi.hProcess;
#ifdef DEBUG
std::cout << h("[+] Process Created Successfully") << std::endl;
#endif
return pi.dwProcessId;
}
Aquí se indica una bandera adicional CREATE_NEW_CONSOLE
. Es necesario para que powershell.exe se inicie como una nueva consola. Es como si lo lanzáramos manualmente haciendo doble clic en el archivo ejecutable. La función devuelve el PID del proceso creado y también inicializa identificadores que apuntan al hilo principal del proceso y al proceso mismo.
2023-11-21 12:20:22
#Depurador #malvado #Explorando #una #nueva #forma #evitar #AMSI #Windows #Hacker,