
CobaltWhispers é um script de agressor que utiliza uma coleção de Beacon Object Files (BOF) para Cobalt Strike, a fim de realizar injeção de processos, persistência e muito mais, aproveitando syscalls diretos (SysWhispers2) para contornar 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.