
CobaltWhispers is an aggressor script that utilizes a collection of Beacon Object Files (BOF) for Cobalt Strike to perform process injection, persistence and more, leveraging direct syscalls (SysWhispers2) to bypass EDR/AV
Author: @Cerbersec
CobaltWhispers es un script Aggressor que utiliza una colección de Beacon Object Files para Cobalt Strike para realizar inyección de procesos, persistencia y más, aprovechando syscalls directas para evadir EDR/AV.
CobaltWhispers está impulsado por SysWhispers2 y InlineWhispers2
CobaltWhispers está basado en StayKit y en el trabajo de Hasherezade y Forrest Orr.
CobaltWhispers fue creado como parte de unas prácticas en el Red Team de NVISO Security. Las publicaciones de blog asociadas se pueden encontrar aquí (inyección de procesos) y aquí (kernel karnage).
CobaltWhispers requiere varias herramientas para compilar:
apt install mingw-w64apt install makeCada proyecto requiere 3 archivos generados por SysWhispers2 / InlineWhispers2 para funcionar:
Estos archivos se pueden generar según la documentación de InlineWhispers2, sin embargo, este no es el método óptimo porque se incluirá mucho código no utilizado:
git clone https://github.com/Sh0ckFR/InlineWhispers2 && cd InlineWhispers2
cd SysWhispers2/ && python3 syswhispers.py --preset all -o syscalls_all && cd ..
python3 InlineWhispers2.py
En su lugar, use SysWhispers2 para generar los archivos de salida solo para las API necesarias, luego suminístrelos manualmente (o mediante un script) a InlineWhispers2, que los convertirá al formato adecuado. Consulte el makefile incluido para obtener información adicional o use los archivos incluidos bajo su propio riesgo.
| Tipo de payload | Objetivo | Fiabilidad (0-5) | Elevado | Observaciones |
|---|---|---|---|---|
| - | - | 5 | No | Hereda los permisos del proceso padre |
Crea un nuevo proceso suspendido con Code Integrity Guard (CIG) habilitado para bloquear binarios firmados que no son de Microsoft. Suplanta el proceso padre especificado. Se devuelve el PID.
Proceso padre: El nombre del proceso a establecer como padre
Ubicación del ejecutable: Ruta completa al ejecutable en disco utilizado para crear el nuevo proceso
| Tipo de payload | Objetivo | Fiabilidad (0-5) | Elevado | Observaciones |
|---|---|---|---|---|
| Shellcode/Raw | PID | 5 | No | - |
Inyecta un payload en un proceso remoto usando NtCreateThreadEx
PID del proceso: El ID de proceso del proceso remoto
Ubicación del payload: Ubicación del payload en formato binario en disco (Condicional | Opcional)
Payload b64: Shellcode crudo en formato de cadena codificada en base64 (Condicional | Opcional)
Listener: Listener para generar el payload (Condicional)
Se debe especificar un listener para generar un payload de Beacon. Si se desea un payload manual, debe proporcionarse mediante una ruta al binario crudo en disco o shellcode codificado en Base64.
| Tipo de payload | Objetivo | Fiabilidad (0-5) | Elevado | Observaciones |
|---|---|---|---|---|
| Shellcode/Raw | PID | 2 | No | Puede potencialmente bloquear el proceso objetivo |
Inyecta un payload en un proceso remoto usando NtQueueApcThread
PID del proceso: El ID de proceso del proceso remoto
Hilos: Número de hilos a los que añadir una llamada APC
Ubicación del payload: Ubicación del payload en formato binario en disco (Condicional | Opcional)
Payload b64: Shellcode crudo en formato de cadena codificada en base64 (Condicional | Opcional)
Listener: Listener para generar el payload (Condicional)
Se debe especificar un listener para generar un payload de Beacon. Si se desea un payload manual, debe proporcionarse mediante una ruta al binario crudo en disco o shellcode codificado en Base64.
| Tipo de payload | Objetivo | Fiabilidad (0-5) | Elevado | Observaciones |
|---|---|---|---|---|
| Shellcode/Raw | Proceso sustituto | 5 | No | - |
Inyecta un payload en un proceso sustituto usando NtMapViewOfSection
Proceso padre: El nombre del proceso a establecer como padre
Ubicación del ejecutable: La ubicación del ejecutable en disco que se usará para crear un nuevo proceso
Ubicación del payload: Ubicación del payload en formato binario en disco (Condicional | Opcional)
Payload b64: Shellcode crudo en formato de cadena codificada en base64 (Condicional | Opcional)
Listener: Listener para generar el payload (Condicional)
Se debe especificar un listener para generar un payload de Beacon. Si se desea un payload manual, debe proporcionarse mediante una ruta al binario crudo en disco o shellcode codificado en Base64.
| Tipo de payload | Objetivo | Fiabilidad (0-5) | Elevado | Observaciones |
|---|---|---|---|---|
| PE | Proceso sustituto | 5 | No | Requiere payload PE x64 |
Inyecta un payload en un proceso sustituto usando secciones transaccionadas y vistas asignadas. Se actualizan el punto de entrada remoto y el PEB; no hay secciones de memoria anómalas ni permisos de memoria anómalos. Consulte aquí para más información.
Proceso padre: El nombre del proceso a establecer como padre
Ubicación del ejecutable: La ubicación del ejecutable en disco que se usará para crear un nuevo proceso
Ubicación del payload: Ubicación del payload PE x64 en disco (Condicional | Opcional)
Payload b64: Payload PE x64 en formato de cadena codificada en base64 (Condicional | Opcional)
Listener: Listener para generar el payload (Condicional)
Se debe especificar un listener para generar un payload de Beacon. Si se desea un payload manual, debe proporcionarse mediante una ruta al PE x64 en disco o un PE x64 codificado en Base64.
ACTUALMENTE NO IMPLEMENTADO
| Tipo de payload | Objetivo | Fiabilidad (0-5) | Elevado | Observaciones |
|---|---|---|---|---|
| Shellcode de posición independiente (PIC) | Proceso sustituto | 5 | Sí | Se requieren permisos elevados para abrir DLL del sistema con permisos de escritura |
Inyecta un payload en un proceso sustituto usando secciones transaccionadas en combinación con DLL hollowing. Consulte aquí para más información.
Proceso padre: El nombre del proceso a establecer como padre
Ubicación del ejecutable: La ubicación del ejecutable en disco que se usará para crear un nuevo proceso
Ubicación del payload: Ubicación del payload en formato binario en disco (Condicional | Opcional)
Payload b64: Shellcode crudo en formato de cadena codificada en base64 (Condicional | Opcional)
Listener: Listener para generar el payload (Condicional)
Se debe especificar un listener para generar un payload de Beacon. Si se desea un payload manual, debe proporcionarse mediante una ruta al binario crudo en disco o shellcode codificado en Base64.
Crea o modifica una clave de registro en la ubicación especificada.
Nombre de clave: Nombre del valor
Comando: Comando que se ejecutará cuando se use el registro
Clave de registro: Ubicación donde se creará la clave de registro
Oculto: Antepondrá un byte nulo al nombre de la clave; provoca errores en regedit
Limpieza: Elimina la clave creada
La limpieza requiere el nombre de la clave y la clave de registro (ubicación).
Crea o modifica una clave de registro en la ubicación especificada.
Nombre de clave: Nombre del valor
Comando: Comando que se ejecutará cuando se use el registro
Clave de registro: Ubicación donde se creará la clave de registro
Oculto: Antepondrá un byte nulo al nombre de la clave; provoca errores en regedit
Limpieza: Elimina la clave creada
La limpieza requiere el nombre de la clave y la clave de registro (ubicación).
UserInit: Establece automáticamente 'Nombre de clave' y 'Clave de registro'.
Crea o modifica una clave de registro en la ubicación especificada.
Nombre de clave: Nombre del valor
Comando: Comando que se ejecutará cuando se use el registro
Clave de registro: Ubicación donde se creará la clave de registro
Oculto: Antepondrá un byte nulo al nombre de la clave; provoca errores en regedit
Limpieza: Elimina la clave creada
La limpieza requiere el nombre de la clave y la clave de registro (ubicación).
Crea o modifica una clave de registro en la ubicación especificada.
Nombre de clave: Nombre del valor
Comando: Comando que se ejecutará cuando se use el registro
Clave de registro: Ubicación donde se creará la clave de registro
Oculto: Antepondrá un byte nulo al nombre de la clave; provoca errores en regedit
Limpieza: Elimina la clave creada
La limpieza requiere el nombre de la clave y la clave de registro (ubicación).
UserInitMprLogonScript: Establece automáticamente 'Nombre de clave' y 'Clave de registro'.
Secuestra el manejador COM de una tarea programada. Crea una clave de registro en HKCU:\Software\Classes\CLSID\\InprocServer32 que apunta a un DLL.
ID de clase: El CLSID que corresponde al CLSID del manejador COM de la tarea
Ruta del DLL: Ruta al DLL que se va a cargar
Limpieza: Elimina la clave creada
| Fiabilidad (0-5) | Elevado | Observaciones |
|---|---|---|
| 4 | Sí | Puede potencialmente provocar BSOD en el sistema objetivo |
Carga un controlador firmado vulnerable con lectura/escritura arbitraria de memoria del kernel (NalDrv/iqvm64.sys). Cambia el flag g_CiEnabled de ntoskrnl.exe o el flag g_CiOptions de CI.dll para deshabilitar el cumplimiento de firma de controladores (DSE).
Carga un controlador no firmado (Interceptor/Interceptor.sys) y luego restaura los valores de los flags de DSE. Tanto el controlador firmado como el no firmado se escriben en disco.
| Controlador | Checksum MD5 |
|---|---|
| iqvm64.sys | 1898ceda3247213c084f43637ef163b3 |
| Interceptor.sys | 508c8943359717cfa0c77b61ebea2118 |
Ubicación del controlador vulnerable: Ubicación del controlador firmado vulnerable en formato binario en disco
Ubicación del controlador malicioso: Ubicación del controlador no firmado malicioso en formato binario en disco
Nombre del controlador vulnerable: nombre utilizado para crear la clave de registro '\Registry\Machine\System\CurrentControlSet\Services\'
Nombre del dispositivo del controlador vulnerable: nombre utilizado para contactar con el controlador '\DosDevices\'
Nombre del controlador malicioso: nombre utilizado para crear la clave de registro '\Registry\Machine\System\CurrentControlSet\Services\'
Nombre del dispositivo del controlador malicioso: nombre utilizado para contactar con el controlador '\DosDevices\'
Ruta de destino: ruta temporal para escribir los archivos de los controladores vulnerable y malicioso
| Fiabilidad (0-5) | Elevado | Observaciones |
|---|---|---|
| 5 | Sí | - |
Descarga un controlador en el objetivo utilizando la clave de registro proporcionada y elimina el binario del disco en la ruta especificada.
Clave de registro del controlador: clave de registro utilizada para descargar el controlador '\Registry\Machine\System\CurrentControlSet\Services\'
Ruta de instalación del controlador: ubicación del controlador en disco
| Fiabilidad (0-5) | Elevado | Observaciones |
|---|---|---|
| 4 | No | Puede potencialmente provocar BSOD en el sistema objetivo |
Información: Consultar el controlador Interceptor
Hook: Enganchar las funciones principales del controlador objetivo (IRP)
Unhook: Restaurar las funciones principales del controlador objetivo
Patch: Parchear los callbacks del kernel objetivo
Restore: Restaurar los callbacks del kernel objetivo
Proveedores: mostrar los proveedores compatibles
Módulos: consultar todos los controladores cargados
Módulos enganchados: mostrar todos los controladores enganchados
Callbacks: consultar todos los callbacks registrados
Índice: engancha un controlador por índice (ver: información - módulos)
Nombre: engancha un controlador por nombre de dispositivo (\Device\Name)
Valores: lista de índices separados por comas (condicional)
Nombre: nombre de dispositivo del controlador objetivo (condicional)
Los valores son obligatorios cuando se selecciona 'Índice'. El nombre es obligatorio cuando se selecciona 'Nombre'.
Índice: desengancha un controlador por índice (ver: información - módulos enganchados)
Todos: desengancha todos los controladores enganchados
Valores: lista de índices separados por comas (condicional)
Los valores son obligatorios cuando se selecciona 'Índice'.
Proveedor: parchea todos los callbacks asociados con el/los módulo(s) del proveedor
Módulo: parchea todos los callbacks asociados con el/los módulo(s)
Proceso: parchea callback(s) de proceso
Hilo: parchea callback(s) de hilo
Imagen: parchea callback(s) de imagen
Registro: parchea callback(s) de registro
Proceso de objeto: parchea callback(s) de proceso de objeto
Hilo de objeto: parchea callback(s) de hilo de objeto
Valores: lista de índices separados por comas (ver: información - callbacks) (condicional)
Nombre: lista de nombres de módulos separados por comas o un único nombre de proveedor (ver: información - proveedores) (condicional)
Los valores son obligatorios cuando se selecciona 'proceso', 'hilo', 'imagen', 'registro', 'proceso de objeto' u 'hilo de objeto'. El nombre es obligatorio cuando se selecciona 'proveedor' o 'módulo'.
Proveedor: restaura todos los callbacks asociados con el/los módulo(s) del proveedor
Módulo: restaura todos los callbacks asociados con el/los módulo(s)
Proceso: restaura callback(s) de proceso
Hilo: restaura callback(s) de hilo
Imagen: restaura callback(s) de imagen
Registro: restaura callback(s) de registro
Proceso de objeto: restaura callback(s) de proceso de objeto
Hilo de objeto: restaura callback(s) de hilo de objeto
Todos: restaura todos los callbacks
Valores: lista de índices separados por comas (ver: información - callbacks) (condicional)
Nombre: lista de nombres de módulos separados por comas o un único nombre de proveedor (ver: información - proveedores) (condicional)
Los valores son obligatorios cuando se selecciona 'proceso', 'hilo', 'imagen', 'registro', 'proceso de objeto' u 'hilo de objeto'. El nombre es obligatorio cuando se selecciona 'proveedor' o 'módulo'.