Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!
BokuLoader — Um Reflective Loader de prova de conceito do Cobalt Strike que visa recriar, integrar e melhorar os recursos de evasão do Cobalt Strike! | Kitploit
O carregador reflexivo embutido do Cobalt Strike é robusto, lidando com todos os recursos de evasão de PE Malleable que o Cobalt Strike oferece. A principal desvantagem de usar um UDRL personalizado é que os recursos de evasão Malleable PE podem ou não ser suportados imediatamente.
O objetivo do projeto público BokuLoader é auxiliar equipes vermelhas na criação de seu próprio UDRL interno do Cobalt Strike. O projeto visa suportar todos os recursos de evasão de PE Malleable do CS que valem a pena. Alguns recursos de evasão aproveitam a integração com o CS, outros foram recriados completamente e alguns não são suportados.
Antes de usar este projeto, de qualquer forma, você deve testar adequadamente se os recursos de evasão estão funcionando conforme esperado. Entre o código C e o script Aggressor, a compilação com diferentes versões de sistemas operacionais, compiladores e Java pode retornar resultados diferentes.
Recursos de Evasão
Recursos de Evasão Específicos do BokuLoader
Spoofing de pilha de chamadas reflexivo via frames sintéticos.
Código de carregador reflexivo personalizado ASM/C
Chamadas de sistema NT indiretas via técnicas HellsGate e HalosGate
Todas as alterações de proteção de memória para todas as opções de alocação são feitas via chamada de sistema indireta para NtProtectVirtualMemory
obfuscate "true" com implementação de script Aggressor UDRL personalizado.
NOHEADERCOPY
O carregador não copiará os cabeçalhos da DLL beacon bruta para a DLL beacon virtual. Os primeiros 0x1000 bytes serão nulos.
XGetProcAddress para resolução de símbolos
Não usa Kernel32.GetProcAddress
xLoadLibrary para resolver o endereço base da DLL e carregamento de DLL
Para DLLs carregadas, obtém o endereço base da DLL de TEB->PEB->PEB_LDR_DATA->InMemoryOrderModuleList
Não usa Kernel32.LoadLibraryA
Cifra de César para ofuscação de strings
Tamanho 100k do UDRL
Os nomes de DLL de importação e strings de nome de entrada de importação são sobrescritas na DLL beacon virtual.
Beacons HTTP/S suportados via implementação do BokuLoader. SMB/TCP atualmente não é suportado para obfuscate true. Detalhes na issue. Aceitando ajuda se puder consertar :)
entry_point
RVA como número decimal
Suportado via implementação do BokuLoader
cleanup
true
Suportado via integração CS
userwx
true/false
Suportado via implementação do BokuLoader
sleep_mask
(true/false) ou (Sleepmask Kit+true)
Suportado. Ao usar o padrão "sleepmask true" (sem sleepmask kit) defina "userwx true". Ao usar o sleepmask kit que suporta memória RX beacon.text (src47/Ekko) defina "sleepmask true" && "userwx false".
magic_mz_x64
string de 4 caracteres
Suportado via integração CS
magic_pe
string de 2 caracteres
Suportado via integração CS
transform-x64 prepend
string hex escapada
Modificação do script Aggressor BokuLoader.cna
transform-x64 strrep
string string
Modificação do script Aggressor BokuLoader.cna
stomppe
true/false
Não suportado. O BokuLoader não copia os cabeçalhos da DLL beacon. Os primeiros 0x1000 bytes da DLL beacon virtual são 0x00
checksum
número
Experimental. Modificação do script Aggressor BokuLoader.cna
O BokuLoader altera algumas strings comumente detectadas para novos valores codificados. Essas strings podem ser usadas para assinar o BokuLoader:
String Original do Cobalt Strike
String do BokuLoader no Cobalt Strike
ReflectiveLoader
BokuLoader
Microsoft Base Cryptographic Provider v1.0
12367321236742382543232341241261363163151d
(admin)
(tomin)
beacon
bacons
Alocadores de Memória
Sobrescrita de Módulo DLL
A função Kernel32.LoadLibraryExA é chamada para mapear a DLL do disco
O 3º argumento de Kernel32.LoadLibraryExA é DONT_RESOLVE_DLL_REFERENCES (0x00000001)
o sistema não chama DllMain
Não resolve endereços na entrada LDR do PEB conforme detalhado por MDSec aqui
Detectável escaneando a memória do processo com a ferramenta pe-sieve
Alocação de Heap
Memória executável RX ou RWX existirá no heap se o sleepmask kit não for usado.
Alocador Mapeado
As funções Kernel32.CreateFileMappingA e Kernel32.MapViewOfFile são chamadas para alocar memória para a DLL beacon virtual.
Detecção de Sleepmask
Se o sleepmask kit for usado, existem métodos de detecção para esta alocação de memória independente conforme detalhado por MDSec aqui
Chamadas de Sistema Indiretas
O BokuLoader chama as seguintes system calls NT para configurar a memória do beacon executável carregado: NtAllocateVirtualMemory, NtProtectVirtualMemory
Elas são chamadas indiretamente da memória executável do BokuLoader.
Definir hooks em modo de usuário em ntdll.dll não detectará essas system calls.
Pode ser possível registrar kernelcallbacks usando um driver de kernel para monitorar as system calls acima e detectar seu uso.
O próprio BokuLoader conterá as instruções de montagem mov eax, r11d; mov r11, r10; mov r10, rcx; jmp r11 dentro de sua memória executável.
Cabeçalho da DLL Beacon Virtual
Os primeiros 0x1000 bytes da DLL beacon virtual são zeros.
Código Fonte Disponível
O código fonte do BokuLoader é fornecido dentro do repositório e pode ser usado para criar assinaturas de memória.
Se você tiver orientações adicionais de detecção, sinta-se à vontade para contribuir enviando um pull request.