
Combinación BOF de KillDefender y Backstab
28/6/2022: Microsoft ha lanzado un parche que impide abrir un identificador del token de MsMpEng.exe, por lo que la parte KillDefender de esta herramienta ya no funciona. Backstab debería seguir funcionando. No estoy seguro del ID del parche, puede que funcione en sistemas antiguos sin parche. Verificado en Win10 21H2 y Win11.
Este es un archivo Beacon Object File que combina implementaciones de Backstab de Yaxser y KillDefender de pwn1sher para su uso con Cobalt Strike.

KDStab es una herramienta de post-explotación para derrotar a Windows Defender (en teoría podría funcionar para otras soluciones, pero no se ha probado), de modo que otras herramientas post-explotación puedan usarse con menos miedo a ser detectadas. Se basa en Backstab y KillDefender para lograrlo, ambos son invocados cuando corresponde mediante el comando kdstab de Cobalt Strike.
KDStab se ha probado con éxito en Windows 10 x64, Windows 11 y Server 2019.
KDStab requiere acceso de Administrador o Sistema.
Funciones principales:
Enumerar la integridad de un proceso
Despojar a un proceso de sus privilegios y establecer su integridad como No confiable
Matar un proceso protegido por PPL
Listar los identificadores de un proceso protegido por PPL
Cerrar un identificador específico de un proceso protegido por PPL
Verificar el nivel de integridad de un proceso

Despojar a un proceso de sus privilegios y establecer su token como No confiable

Resultado del comando /STRIP

Matar un proceso protegido por PPL

Me topé con KillDefender de pwn1sher poco después de su lanzamiento y me pareció impresionante; además de dejar inútil a MsMpEng.exe (Defender), deja el proceso en ejecución, lo cual parece deseable desde el punto de vista de OPSEC (además del hecho de que el comportamiento predeterminado del servicio WinDefend es reiniciar MsMpEng.exe ante una falla, algo que será útil más adelante).
Aunque cegar a Defender es increíble para un compromiso, como profesionales somos responsables de restaurar los activos del cliente al estado en que los encontramos; además, en realidad no queremos dejar sus sistemas expuestos a otros actores porque matamos (Kill) a Defender.
El problema es que es difícil "restaurar" MsMpEng.exe a su estado de funcionamiento. KillDefender funciona despojando al proceso objetivo de sus privilegios (SeDebugPrivilege, etc.) y estableciendo la integridad de su token como no confiable. No se puede simplemente "re-elevar" el token a Sistema y restaurar los privilegios; hay que matar el proceso e iniciar una instancia nueva. Por supuesto, MsMpEng.exe también es un proceso PsProtectedSignerAntimalware-Light, por lo que incluso como Sistema no podemos simplemente finalizar el proceso. Frustrantemente, el grupo TrustedInstaller fue eliminado de MsMpEng.exe recientemente (puedes encontrar otras investigaciones al respecto), lo que hace ineficaz esa técnica para matar realmente el proceso de MsMpEng.exe (o el servicio WinDefend) que se ha utilizado durante muchos años. Dado esto, la única opción aparentemente viable es reiniciar la máquina, lo que podría causar problemas a un cliente si hablamos de servidores y controladores de dominio.
Armado con este problema, comencé a buscar y rápidamente encontré Backstab de Yaxser. Backstab puede matar procesos protegidos por PPL aprovechando el controlador de ProcExp; se trata de un controlador firmado por Microsoft de Sysinternals que juega a nuestro favor. Backstab realiza algunas acciones que no son OPSEC seguras; coloca el controlador en disco y crea claves de registro. Sin embargo, si Defender ya está ciego... :).
Me propuse portar ambas herramientas al formato BOF para que puedan usarse a través de un Beacon de Cobalt Strike sin necesidad de colocarlas en disco (el binario original de Backstab era bloqueado por Defender en tiempo de ejecución).
Soy nuevo tanto en C/C++ como en escribir BOFs y aprendí mucho durante el proceso. Encontrarás algunas inconsistencias en el código (como que Backstab_bof está escrito y compilado en Linux usando gcc y KillDefender_bof está escrito y compilado en Visual Studio) debido a que aprendí durante el proceso de creación, pero he realizado bastantes pruebas para asegurar la funcionalidad y también construí muchas barreras en el script aggressor para garantizar un uso adecuado y la entrada correcta a los BOFs. Espero que encuentres útil esta herramienta.
Se realizaron algunos cambios notables en el código fuente de las herramientas y se tomaron ciertas decisiones de programación que se mencionarán aquí:
El controlador ProcExp ya no se almacena/carga como recurso, es una matriz de bytes hardcodeada en backstab_src/resource.c
Había varias fugas de memoria en el código original de Backstab que encontré y resolví
El POC de KillDefender falla cuando el usuario no es Sistema; agregué un fragmento para enumerar el usuario en ejecución y obtener sistema mediante la suplantación del token de Winlogon si es necesario.
KillDefender fue modificado para permitir a los usuarios especificar a qué proceso apuntar; además, se agregó un modo "Check" para enumerar el nivel de integridad de un proceso (que puede confirmar que un proceso fue despojado exitosamente de sus privilegios e integridad).
Backstab utiliza suficientes API y llamadas C diferentes que Cobalt Strike no pudo resolver todas las resoluciones dinámicas de funciones; ¡trustedsec al rescate! Implementé su resolución dinámica de funciones para complementar la de CS, de modo que todas las API necesarias pudieran ser llamadas.
El Backstab original tiene varias sentencias switch/case que causaron problemas durante el port, por lo que fueron reemplazadas con sentencias if/else. Además, prácticamente todas las variables globales fueron eliminadas por razones similares.
Sé que es extraño que una herramienta haya sido escrita para Visual Studio y la otra para GCC; esto es una consecuencia de mi lucha por portarlas exitosamente y haber tenido muchos dolores de crecimiento en el camino. Las herramientas futuras deberían beneficiarse de muchas de las lecciones que aprendí en este camino.
Tanto KillDefender_bof como Backstab_bof existen como repositorios independientes. NOTA: EL CÓDIGO ES DIFERENTE ENTRE LOS REPOSITORIOS INDEPENDIENTES Y ESTA HERRAMIENTA. Esto se hizo para hacerlos más flexibles y poder integrarlos en un solo paquete.
No he intentado compilar ninguna de las herramientas para x86; si realmente necesitas una versión para eso, te dejo que lo resuelvas.
Para compilar Backstab_bof usando gcc:
x86_64-w64-mingw32-gcc -o backstab.x64.o -Os -c main.c -DBOF -D_UNICODE
¡Asegúrate de haber actualizado tu mingw a la última versión! Tuve problemas donde mi versión tenía archivos de encabezado desactualizados, sin embargo, los archivos de encabezado de la última versión son correctos.
Para compilar KillDefender_bof usando el símbolo del sistema nativo x64:
cl.exe /c /GS- /TP killdefender_bof.cpp /FoKillDefender.x64.o