
Cobalt Strike BOF para ejecución de ensamblados .NET en proceso con omisión de AMSI/ETW, AppDomain personalizado y redirección de salida por named pipe/mailslot.
InlineExecute-Assembly es una prueba de concepto de archivo de objeto de baliza (BOF) que permite a los profesionales de seguridad realizar la ejecución de ensamblados .NET en proceso como alternativa al módulo tradicional de fork and run execute-assembly de Cobalt Strike. InlineExecute-Assembly ejecutará cualquier ensamblado con el punto de entrada Main(string[] args) o Main(). Esto debería permitir ejecutar la mayoría de las herramientas publicadas sin necesidad de modificaciones previas.
El BOF determinará automáticamente qué Common Language Runtime (CLR) se necesita cargar en el proceso para su ensamblado (v2.0.50727 o v4.0.30319) antes de la ejecución y, en la mayoría de los casos, debería finalizar correctamente si surge algún problema. El BOF también admite varias banderas que permiten al operador dictar varios comportamientos antes de la ejecución de .NET, que incluyen: deshabilitar AMSI mediante parches en memoria, deshabilitar y restaurar ETW mediante parches en memoria, personalización del nombre del dominio de aplicación CLR a crear, si se debe crear y dirigir la salida de consola de su ensamblado a una named pipe o mailslot, y permite al operador cambiar el punto de entrada predeterminado de Main(string[] args) a Main(). Más detalles sobre el uso, casos de uso y posibles detecciones se pueden encontrar a continuación y en https://securityintelligence.com/posts/net-execution-inlineexecute-assembly/.
Por último, la ventaja de ejecutar nuestros ensamblados .NET en el mismo proceso que nuestro beacon implant es que evitamos el comportamiento predeterminado del módulo execute-assembly de Cobalt Strike, que crea un nuevo proceso para luego cargar/inyectar el CLR/ensamblado .NET. Sin embargo, aún existen otras consideraciones de opsec, por ejemplo, ¿el proceso en el que estamos ejecutando normalmente carga el CLR? ¿O el ensamblado .NET que estamos ejecutando tiene alguna firma conocida? Por lo tanto, la desventaja es que si algo se detecta y se mata, por ejemplo por AMSI, también se mata su beacon.
Esta herramienta no existiría sin poder apoyarse en investigaciones, herramientas y código realmente excelentes ya publicados por miembros de la comunidad de seguridad. Muchas gracias. Por último, si cree que alguien ha quedado fuera a continuación, por favor hágamelo saber y me aseguraré de agregarlo.
Ejecute el siguiente comando dentro del directorio src mediante el x64 Native Tools Command Prompt para VS 2019
cl.exe /c inlineExecute-Assembly.c /GS- /FoinlineExecute-Assemblyx64.o
Ejecute el siguiente comando dentro del directorio src mediante el x86 Native Tools Command Prompt para VS 2019
cl.exe /c inlineExecute-Assembly.c /GS- /FoinlineExecute-Assemblyx86.o
--dotnetassembly Ruta del directorio a su ensamblado **obligatorio**
--assemblyargs Argumentos del ensamblado a pasar
--appdomain Cambiar el nombre predeterminado del AppDomain enviado (el valor predeterminado es totesLegit y se establece mediante el script aggressor incluido) *El dominio siempre se descarga*
--amsi Intenta deshabilitar AMSI mediante parches en memoria (si tiene éxito, AMSI se deshabilitará durante toda la vida del proceso)
--etw Intenta deshabilitar ETW mediante parches en memoria (si tiene éxito, ETW se deshabilitará durante toda la vida del proceso a menos que se revierta)
--revertetw Intenta deshabilitar ETW mediante parches en memoria y luego lo vuelve a parchear a su estado original
--pipe Cambiar el nombre predeterminado de la named pipe (el valor predeterminado es totesLegit y se establece mediante el script aggressor incluido)
--mailslot Cambia a usar mailslots para redirigir la salida de consola. Cambia el nombre predeterminado del mailslot (si se deja en blanco, el valor predeterminado es totesLegit y se establece mediante el script aggressor incluido)
--main Cambia el punto de entrada a Main() (el valor predeterminado es Main(string[] args))
Ejecutar ensamblado .NET
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe
Ejecutar ensamblado .NET con argumentos
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker
Ejecutar ensamblado .NET con argumentos y deshabilitar AMSI
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker --amsi
Ejecutar ensamblado .NET con argumentos y deshabilitar ETW
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker --etw
Ejecutar ensamblado .NET con argumentos y redirigir la salida mediante mailslots en lugar de la named pipe predeterminada
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --mailslot
Ejecutar ensamblado .NET con argumentos y cambiar el nombre predeterminado de la named pipe establecido en el script aggressor
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --pipe forRealLegit
Ejecutar ensamblado .NET y cambiar el dominio de aplicación predeterminado establecido en el script aggressor
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --appdomain forRealLegit
Ejecutar ensamblado .NET con punto de entrada Main() en lugar del predeterminado Main(string[] args)
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/simpleMain.exe --main
Ir a tope
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker --amsi --etw --appdomain forRealLegit --mailslot forRealLegit
Algunas estrategias de detección y mitigación que podrían usarse: