Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
InlineExecute-Assembly — 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. | Kitploit
Herramientas/GitHubGitHub/anthemtotheego/inlineexecute-assembly
Post-ExplotaciónRed Teaming
GitHubanthemtotheego/inlineexecute-assembly

InlineExecute-Assembly

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.

Ver Repositorio
7661401hace 5 añosRevisado por Kitploit

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

InlineExecute-Assembly

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.

Referencias del tema

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.

  • HostingCLR - aquí - Lógica de ejecución de ensamblados/CLR
  • Dotnet-Loader-Shellcode - (por @modexpblog) - aquí - Investigación excelente en general, incluidas interfaces COM para ejecutar .NET en C -> Real MVP
  • Donut - (por @TheRealWover y @modexpblog) - aquí - Encabezado de interfaces COM
  • Memory Patching AMSI Bypass - (por @_RastaMouse) - aquí - Investigación sobre parches de memoria AMSI
  • Metasploit-Execute-Assembly - (por @b4rtik) - aquí - Parches AMSI modificados y función de búsqueda de versión .NET utilizada
  • ExecuteAssembly - (por @med0x2e)- aquí - Script aggressor modificado
  • Hiding Your .NET ETW - (por @xpn) - aquí - Gran investigación sobre ETW
  • ETW BOF - (por @ajpc500)- aquí - Parches ETW modificados
  • ExecuteAssembly_Mailslot - (por @N4k3dTurtl3)- aquí - Uso de mailslots para redirección de consola modificado
  • @freefirex2 - Fue tan amable de compartir algunos buenos detalles internos y trampas de los BOF.

Comenzando

  1. Copie la carpeta inlineExecute-Assembly con todo su contenido a un sistema al que planea conectarse mediante la aplicación GUI de Cobalt Strike.
  2. Cargue el script Aggressor inlineExecute-Assembly.cna
  3. Ejecute inlineExecute-Assembly --dotnetassembly /ruta/al/ensamblado.exe para la ejecución más básica (consulte los casos de uso a continuación para ejemplos específicos de banderas)

Compile el suyo propio

Ejecute el siguiente comando dentro del directorio src mediante el x64 Native Tools Command Prompt para VS 2019

root@kitploit:~
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

root@kitploit:~
cl.exe /c inlineExecute-Assembly.c /GS- /FoinlineExecute-Assemblyx86.o

Banderas

root@kitploit:~
--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))

Caso de uso

Ejecutar ensamblado .NET

Sintaxis

root@kitploit:~
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe

Caso de uso

Ejecutar ensamblado .NET con argumentos

Sintaxis

root@kitploit:~
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker

Caso de uso

Ejecutar ensamblado .NET con argumentos y deshabilitar AMSI

Sintaxis

root@kitploit:~
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker --amsi

Caso de uso

Ejecutar ensamblado .NET con argumentos y deshabilitar ETW

Sintaxis

root@kitploit:~
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker --etw

Caso de uso

Ejecutar ensamblado .NET con argumentos y redirigir la salida mediante mailslots en lugar de la named pipe predeterminada

Sintaxis

root@kitploit:~
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --mailslot

Caso de uso

Ejecutar ensamblado .NET con argumentos y cambiar el nombre predeterminado de la named pipe establecido en el script aggressor

Sintaxis

root@kitploit:~
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --pipe forRealLegit

Caso de uso

Ejecutar ensamblado .NET y cambiar el dominio de aplicación predeterminado establecido en el script aggressor

Sintaxis

root@kitploit:~
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --appdomain forRealLegit

Caso de uso

Ejecutar ensamblado .NET con punto de entrada Main() en lugar del predeterminado Main(string[] args)

Sintaxis

root@kitploit:~
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/simpleMain.exe --main

Caso de uso

Ir a tope

Sintaxis

root@kitploit:~
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker --amsi --etw --appdomain forRealLegit --mailslot forRealLegit

Advertencias

  1. Aunque he intentado que esto sea lo más estable posible, no hay garantías de que nunca ocurra un fallo y los beacons mueran. No tenemos el lujo adicional de fork and run, donde si algo sale mal nuestro beacon sobrevive. Este es el compromiso con los BOF. Dicho esto, no puedo enfatizar lo importante que es probar sus ensamblados de antemano para asegurarse de que funcionarán correctamente con la herramienta.
  2. Dado que el BOF se ejecuta en el proceso y toma el control del beacon mientras se ejecuta, esto debe tenerse en cuenta antes de usarlo para ensamblados de larga duración. Si elige ejecutar algo que tomará mucho tiempo para obtener resultados, su beacon no estará activo para ejecutar más comandos hasta que los resultados lleguen y su ensamblado termine de ejecutarse. Esto tampoco sigue el sleep set. Por ejemplo, si su sleep está configurado en 10 minutos y ejecuta el BOF, obtendrá resultados tan pronto como el BOF termine de ejecutarse.
  3. A menos que se realicen modificaciones en herramientas que cargan PE en memoria (por ejemplo, SafetyKatz), lo más probable es que maten su beacon. Muchas de estas herramientas funcionan bien con execute assembly porque pueden enviar su salida de consola desde el proceso sacrificial antes de salir. Cuando salen a través de nuestro BOF en proceso, matan nuestro proceso, lo que mata nuestro beacon. Estos se pueden modificar para que funcionen, pero recomendaría ejecutar este tipo de ensamblados mediante execute assembly, ya que podrían cargarse en su proceso otras cosas no seguras para opsec que no se eliminan.
  4. Si su ensamblado utiliza Environment.Exit, será necesario eliminarlo, ya que matará el proceso y el beacon.
  5. Las named pipes y los mailslots deben ser únicos. Si no recibe datos de vuelta y su beacon aún está vivo, lo más probable es que necesite seleccionar un nombre de named pipe o mailslot diferente.

Detección

Algunas estrategias de detección y mitigación que podrían usarse:

  1. Usa PAGE_EXECUTE_READWRITE al realizar parches de memoria AMSI y ETW. Esto se hizo a propósito y debería ser una señal de alerta, ya que muy pocos programas tienen rangos de memoria con la protección de memoria PAGE_EXECUTE_READWRITE.
  2. El nombre predeterminado de la named pipe creada es totesLegit. Esto se hizo a propósito y se podrían usar detecciones de firmas para señalarlo.
  3. El nombre predeterminado del mailslot creado es totesLegit. Esto se hizo a propósito y se podrían usar detecciones de firmas para señalarlo.
  4. El nombre predeterminado del AppDomain cargado es totesLegit. Esto se hizo a propósito y se podrían usar detecciones de firmas para señalarlo.
  5. Buenos consejos para detectar el uso malicioso de .NET (por @bohops) aquí, (por F-Secure) aquí, y aquí
  6. Buscar la carga de CLR .NET en procesos sospechosos, como procesos no administrados que nunca deberían tener el CLR cargado.
  7. Seguimiento de eventos aquí
  8. Buscar otros IOC conocidos de Cobalt Strike Beacon o IOC de comunicación/salida C2.
Descargar herramienta