
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
Autor: @Cerbersec
O CobaltWhispers é um aggressor script que utiliza uma coleção de Beacon Object Files para Cobalt Strike para realizar injeção de processo, persistência e muito mais, aproveitando syscalls diretos para contornar EDR/AV.
O CobaltWhispers é alimentado por SysWhispers2 e InlineWhispers2
O CobaltWhispers é baseado no StayKit e no trabalho de Hasherezade e Forrest Orr.
O CobaltWhispers foi criado como parte de um estágio na Red Team da NVISO Security. Os posts de blog associados podem ser encontrados aqui (process-injection) e aqui (kernel karnage).
O CobaltWhispers requer várias ferramentas para compilar:
apt install mingw-w64apt install makeCada projeto requer 3 arquivos gerados por SysWhispers2 / InlineWhispers2 para funcionar:
Esses arquivos podem ser gerados de acordo com a documentação do InlineWhispers2, porém este não é o método ideal porque muito código não utilizado será incluído:
git clone https://github.com/Sh0ckFR/InlineWhispers2 && cd InlineWhispers2
cd SysWhispers2/ && python3 syswhispers.py --preset all -o syscalls_all && cd ..
python3 InlineWhispers2.py
Em vez disso, use o SysWhispers2 para gerar os arquivos de saída apenas para as APIs necessárias e, em seguida, forneça-os manualmente (ou por script) ao InlineWhispers2, que os converterá para o formato adequado. Consulte o makefile incluído para obter informações adicionais ou use os arquivos incluídos por sua conta e risco.
| Tipo de Payload | Alvo | Confiabilidade (0-5) | Elevado | Observações |
|---|---|---|---|---|
| - | - | 5 | Não | Herda permissões do processo pai |
Cria um novo processo suspenso com o Code Integrity Guard (CIG) habilitado para bloquear binários assinados que não sejam da Microsoft. Falsifica o processo pai especificado. O PID é retornado.
Processo pai: O nome do processo a ser definido como pai
Local do executável: Caminho completo para o executável em disco usado para criar o novo processo
| Tipo de Payload | Alvo | Confiabilidade (0-5) | Elevado | Observações |
|---|---|---|---|---|
| Shellcode/Raw | PID | 5 | Não | - |
Injeta um payload em um processo remoto usando NtCreateThreadEx
PID do processo: O ID do processo remoto
Local do payload: Local do payload em forma binária no disco (Condicional | Opcional)
Payload b64: Shellcode bruto em formato de string codificada em base64 (Condicional | Opcional)
Listener: Listener para o qual gerar o payload (Condicional)
Um listener deve ser especificado para gerar um payload Beacon. Se um payload manual for desejado, ele deve ser fornecido por meio de um caminho para o binário bruto em disco ou shellcode codificado em Base64.
| Tipo de Payload | Alvo | Confiabilidade (0-5) | Elevado | Observações |
|---|---|---|---|---|
| Shellcode/Raw | PID | 2 | Não | Pode potencialmente causar crash no processo alvo |
Injeta um payload em um processo remoto usando NtQueueApcThread
PID do processo: O ID do processo remoto
Threads: Número de threads para adicionar uma chamada APC
Local do payload: Local do payload em forma binária no disco (Condicional | Opcional)
Payload b64: Shellcode bruto em formato de string codificada em base64 (Condicional | Opcional)
Listener: Listener para o qual gerar o payload (Condicional)
Um listener deve ser especificado para gerar um payload Beacon. Se um payload manual for desejado, ele deve ser fornecido por meio de um caminho para o binário bruto em disco ou shellcode codificado em Base64.
| Tipo de Payload | Alvo | Confiabilidade (0-5) | Elevado | Observações |
|---|---|---|---|---|
| Shellcode/Raw | Processo substituto | 5 | Não | - |
Injeta um payload em um processo substituto usando NtMapViewOfSection
Processo pai: O nome do processo a ser definido como pai
Local do executável: O local do executável em disco a ser usado para criar um novo processo
Local do payload: Local do payload em forma binária no disco (Condicional | Opcional)
Payload b64: Shellcode bruto em formato de string codificada em base64 (Condicional | Opcional)
Listener: Listener para o qual gerar o payload (Condicional)
Um listener deve ser especificado para gerar um payload Beacon. Se um payload manual for desejado, ele deve ser fornecido por meio de um caminho para o binário bruto em disco ou shellcode codificado em Base64.
| Tipo de Payload | Alvo | Confiabilidade (0-5) | Elevado | Observações |
|---|---|---|---|---|
| PE | Processo substituto | 5 | Não | Requer payload PE x64 |
Injeta um payload em um processo substituto usando seções transacionadas e exibições mapeadas. O ponto de entrada remoto e o PEB são atualizados, sem seções de memória anômalas ou permissões de memória anormais. Consulte aqui para obter mais informações.
Processo pai: O nome do processo a ser definido como pai
Local do executável: O local do executável em disco a ser usado para criar um novo processo
Local do payload: Local do payload PE x64 em disco (Condicional | Opcional)
Payload b64: Payload PE x64 em formato de string codificada em base64 (Condicional | Opcional)
Listener: Listener para o qual gerar o payload (Condicional)
Um listener deve ser especificado para gerar um payload Beacon. Se um payload manual for desejado, ele deve ser fornecido por meio de um caminho para o PE x64 em disco ou PE x64 codificado em Base64.
ATUALMENTE NÃO IMPLEMENTADO
| Tipo de Payload | Alvo | Confiabilidade (0-5) | Elevado | Observações |
|---|---|---|---|---|
| Position Independent Shellcode (PIC) | Processo substituto | 5 | Sim | Permissões elevadas são necessárias para abrir DLLs do sistema com permissões de gravação |
Injeta um payload em um processo substituto usando seções transacionadas em combinação com DLL hollowing. Consulte aqui para obter mais informações.
Processo pai: O nome do processo a ser definido como pai
Local do executável: O local do executável em disco a ser usado para criar um novo processo
Local do payload: Local do payload em forma binária no disco (Condicional | Opcional)
Payload b64: Shellcode bruto em formato de string codificada em base64 (Condicional | Opcional)
Listener: Listener para o qual gerar o payload (Condicional)
Um listener deve ser especificado para gerar um payload Beacon. Se um payload manual for desejado, ele deve ser fornecido por meio de um caminho para o binário bruto em disco ou shellcode codificado em Base64.
Cria ou modifica uma chave de registro no local especificado.
Nome da chave: Nome do valor
Comando: Comando a ser executado quando o registro for usado
Chave de registro: Local onde a chave de registro será criada
Oculto: Antepõe um byte nulo ao nome da chave; gera erros no regedit
Limpeza: Remove a chave criada
A limpeza requer o nome da chave e a chave de registro (local).
Cria ou modifica uma chave de registro no local especificado.
Nome da chave: Nome do valor
Comando: Comando a ser executado quando o registro for usado
Chave de registro: Local onde a chave de registro será criada
Oculto: Antepõe um byte nulo ao nome da chave; gera erros no regedit
Limpeza: Remove a chave criada
A limpeza requer o nome da chave e a chave de registro (local).
UserInit: Define automaticamente 'Nome da chave' e 'Chave de registro'.
Cria ou modifica uma chave de registro no local especificado.
Nome da chave: Nome do valor
Comando: Comando a ser executado quando o registro for usado
Chave de registro: Local onde a chave de registro será criada
Oculto: Antepõe um byte nulo ao nome da chave; gera erros no regedit
Limpeza: Remove a chave criada
A limpeza requer o nome da chave e a chave de registro (local).
Cria ou modifica uma chave de registro no local especificado.
Nome da chave: Nome do valor
Comando: Comando a ser executado quando o registro for usado
Chave de registro: Local onde a chave de registro será criada
Oculto: Antepõe um byte nulo ao nome da chave; gera erros no regedit
Limpeza: Remove a chave criada
A limpeza requer o nome da chave e a chave de registro (local).
UserInitMprLogonScript: Define automaticamente 'Nome da chave'e 'Chave de registro'.
Sequestra o manipulador COM de uma tarefa agendada. Cria uma chave de registro em HKCU:\Software\Classes\CLSID\\InprocServer32 que aponta para uma DLL.
ID da classe: O CLSID que corresponde ao CLSID do manipulador COM da tarefa
Caminho da DLL: Caminho para a DLL que será carregada
Limpeza: Remove a chave criada
| Confiabilidade (0-5) | Elevado | Observações |
|---|---|---|
| 4 | Sim | Pode potencialmente causar BSOD no sistema alvo |
Carrega um driver assinado vulnerável com leitura/gravação arbitrária de memória do kernel (NalDrv/iqvm64.sys). Altera o sinalizador g_CiEnabled do ntoskrnl.exe ou g_CiOptions da CI.dll para desabilitar o Driver Signature Enforcement (DSE).
Carrega um driver não assinado (Interceptor/Interceptor.sys) e, em seguida, restaura os valores do sinalizador DSE. Tanto o driver assinado quanto o driver não assinado são gravados em disco.
| Driver | Checksum MD5 |
|---|---|
| iqvm64.sys | 1898ceda3247213c084f43637ef163b3 |
| Interceptor.sys | 508c8943359717cfa0c77b61ebea2118 |
Local do driver vulnerável: Local do driver assinado vulnerável em forma binária no disco
Local do driver malicioso: Local do driver não assinado malicioso em forma binária no disco
Nome do driver vulnerável: nome usado para criar a chave de registro '\Registry\Machine\System\CurrentControlSet\Services\'
Nome do dispositivo do driver vulnerável: nome usado para contatar o driver '\DosDevices\'
Nome do driver malicioso: nome usado para criar a chave de registro '\Registry\Machine\System\CurrentControlSet\Services\'
Nome do dispositivo do driver malicioso: nome usado para contatar o driver '\DosDevices\'
Caminho de destino: caminho temporário para gravar os arquivos dos drivers vulnerável e malicioso
| Confiabilidade (0-5) | Elevado | Observações |
|---|---|---|
| 5 | Sim | - |
Descarrega um driver no alvo usando a chave de registro fornecida e exclui o binário do disco no caminho especificado.
Chave de registro do driver: chave de registro usada para descarregar o driver '\Registry\Machine\System\CurrentControlSet\Services\'
Caminho de instalação do driver: local do driver em disco
| Confiabilidade (0-5) | Elevado | Observações |
|---|---|---|
| 4 | Não | Pode potencialmente causar BSOD no sistema alvo |
Informações: Consultar o driver Interceptor
Hook: Hookar as funções principais do driver alvo (IRP)
Unhook: Restaurar as funções principais do driver alvo
Patch: Aplicar patch nos callbacks do kernel alvo
Restore: Restaurar os callbacks do kernel alvo
Fornecedores: exibir fornecedores suportados
Módulos: consultar todos os drivers carregados
Módulos com hook: exibir todos os drivers com hook
Callbacks: consultar todos os callbacks registrados
Índice: hookar um driver por índice (veja: informações - módulos)
Nome: hookar um driver por nome do dispositivo (\Device\Name)
Valores: lista de índices separados por vírgula (condicional)
Nome: nome do dispositivo do driver alvo (condicional)
Valores é obrigatório quando 'Índice' é selecionado. Nome é obrigatório quando 'Nome' é selecionado.
Índice: remover hook de um driver por índice (veja: informações - módulos com hook)
Todos: remover hooks de todos os drivers com hook
Valores: lista de índices separados por vírgula (condicional)
Valores é obrigatório quando 'Índice' é selecionado.
Fornecedor: aplicar patch em todos os callbacks associados ao(s) módulo(s) do fornecedor
Módulo: aplicar patch em todos os callbacks associados ao(s) módulo(s)
Processo: aplicar patch em callbacks de processo
Thread: aplicar patch em callbacks de thread
Imagem: aplicar patch em callbacks de imagem
Registro: aplicar patch em callbacks de registro
Objeto processo: aplicar patch em callbacks de objeto de processo
Objeto thread: aplicar patch em callbacks de objeto de thread
Valores: lista de índices separados por vírgula (veja: informações - callbacks) (condicional)
Nome: lista de nomes de módulos separados por vírgula ou nome de um único fornecedor (veja: informações - fornecedores) (condicional)
Valores é obrigatório quando 'processo', 'thread', 'imagem', 'registro', 'objeto processo' ou 'objeto thread' é selecionado. Nome é obrigatório quando 'fornecedor' ou 'módulo' é selecionado.
Fornecedor: restaurar todos os callbacks associados ao(s) módulo(s) do fornecedor
Módulo: restaurar todos os callbacks associados ao(s) módulo(s)
Processo: restaurar callbacks de processo
Thread: restaurar callbacks de thread
Imagem: restaurar callbacks de imagem
Registro: restaurar callbacks de registro
Objeto processo: restaurar callbacks de objeto de processo
Objeto thread: restaurar callbacks de objeto de thread
Todos: restaurar todos os callbacks
Valores: lista de índices separados por vírgula (veja: informações - callbacks) (condicional)
Nome: lista de nomes de módulos separados por vírgula ou nome de um único fornecedor (veja: informações - fornecedores) (condicional)
Valores é obrigatório quando 'processo', 'thread', 'imagem', 'registro', 'objeto processo' ou 'objeto thread' é selecionado. Nome é obrigatório quando 'fornecedor' ou 'módulo' é selecionado.