
Syscall Shellcode Loader (Trabalho em Andamento)
Shhhloader é um carregador de shellcode em desenvolvimento. Ele recebe shellcode bruto como entrada e compila um stub em C++ que realiza várias ações para tentar contornar AV/EDR. O construtor Python incluído funciona em qualquer sistema Linux com Mingw-w64 instalado.
Edição de 25/01/24: Shhhloader agora suporta a variante 7 do PoolParty! Foi adicionada também uma opção que combina PoolParty com Module Stomping para evitar que o shellcode executado resida em memória não backed. Veja abaixo um vídeo demonstrando este novo método de injeção contra o Defender ATP:
┳┻|
┻┳|
┳┻|
┻┳|
┳┻| _
┻┳| •.•) - Shhhhh, AV pode nos ouvir!
┳┻|⊂ノ
┻┳|
usage: Shhhloader.py [-h] [-p explorer.exe] [-m QueueUserAPC] [-u] [-w] [-nr] [-ns] [-l] [-v] [-sc GetSyscallStub] [-d] [-dp apphelp.dll] [-s domain]
[-sa testlab.local] [-o a.exe] [-pp explorer.exe] [-ppv] [-np] [-cp] [-td ntdll.dll] [-ef NtClose]
file
CARREGADOR DE SHELLCODE COM SYSCALL PERSONALIZADO DO ICYGUIDER
positional arguments:
file Arquivo contendo shellcode bruto
options:
-h, --help mostra esta mensagem de ajuda e sai
-p explorer.exe, --process explorer.exe
Processo para injetar (Padrão: explorer.exe)
-m QueueUserAPC, --method QueueUserAPC
Método para execução do shellcode (Opções: PoolPartyModuleStomping, PoolParty, ThreadlessInject, ModuleStomping, QueueUserAPC,
ProcessHollow, EnumDisplayMonitors, RemoteThreadContext, RemoteThreadSuspended, CurrentThread) (Padrão: QueueUserAPC)
-u, --unhook Desenganchar NTDLL no processo atual
-w, --word-encode Salvar shellcode no stub como um array de palavras em inglês
-nr, --no-randomize Desabilitar aleatorização de nomes de syscall
-ns, --no-sandbox Desabilitar verificações de sandbox
-l, --llvm-obfuscator
Usar Obfuscator-LLVM para compilar o stub
-v, --verbose Habilitar mensagens de depuração durante a execução
-sc GetSyscallStub, --syscall GetSyscallStub
Método de execução de syscall (Opções: SysWhispers2, SysWhispers3, GetSyscallStub, None) (Padrão: GetSyscallStub)
-d, --dll Gerar uma DLL em vez de EXE
-dp apphelp.dll, --dll-proxy apphelp.dll
Criar DLL Proxy usando uma DLL legítima fornecida (O arquivo deve existir no diretório atual)
-s domain, --sandbox domain
Técnica de evasão de sandbox (Opções: sleep, domain, hostname, username, dll) (Padrão: sleep)
-sa testlab.local, --sandbox-arg testlab.local
Argumento para técnica de evasão de sandbox (Ex: WIN10CO-DESKTOP, testlab.local)
-o a.exe, --outfile a.exe
Nome do arquivo compilado
PPID Spoofing:
-pp explorer.exe, --ppid explorer.exe
Processo pai a ser usado para PPID Spoofing (Padrão: explorer.exe)
-ppv, --ppid-priv Habilitar falsificação para processo pai privilegiado (Desabilitado por padrão)
-np, --no-ppid-spoof Desabilitar falsificação de PPID
ThreadlessInject:
-cp, --create-process
Criar processo em vez de injetar em um existente
-td ntdll.dll, --target-dll ntdll.dll
DLL alvo contendo função de exportação a ser sobrescrita
-ef NtClose, --export-function NtClose
Função de exportação a ser sobrescrita
Funcionalidades:
Veja abaixo um vídeo PoC do método ThreadlessInject sendo usado para injetar um beacon Havoc no IE sem gerar alertas e com eventos mínimos no Microsoft Defender for Endpoint (MDE) EDR (Gravado em 03/04/2023):
Veja o vídeo abaixo demonstrando a técnica de injeção Module Stomping executada via DLL Proxying (Gravado em 09/08/2022):
O Shhhloader também foi integrado ao Havoc C2 Framework através de um módulo criado por @jakobfriedl. Veja abaixo um vídeo demonstrando o módulo:
Problemas Conhecidos/Notas:
-p para fornecer o nome de um processo que você sabe ou suspeita estar em execução no sistema alvo.Atualizações Planejadas:
OPCIONAL: Para usar a flag Obfuscator-LLVM, você precisa tê-lo instalado no seu sistema junto com wclang. Achei isso um pouco trabalhoso, mas você deve conseguir com um pouco de perseverança. Aqui está um passo a passo que usei para instalar o branch llvm-13.x do OLLVM no meu sistema Kali Linux:
# Clone e Execute CMake
git clone -b llvm-13.x https://github.com/heroims/obfuscator.git
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_NEW_PASS_MANAGER=OFF ../obfuscator/llvm/
# Configure CMake e Compile o OLLVM
export clang_build_dir=$(cd ../; pwd)/obfuscator/clang
sed -i 's/LLVM_TOOL_CLANG_BUILD:BOOL=OFF/LLVM_TOOL_CLANG_BUILD:BOOL=ON/g' CMakeCache.txt
sed -i "s|LLVM_EXTERNAL_CLANG_SOURCE_DIR:PATH=|LLVM_EXTERNAL_CLANG_SOURCE_DIR:PATH=$clang_build_dir|g" CMakeCache.txt
make -j7
# APÓS COMPILAR, FAÇA BACKUP DOS BINÁRIOS ORIGINAIS DO CLANG
mv /usr/bin/clang /usr/bin/clang13.0.1
mv /usr/bin/clang++ /usr/bin/clang++13.0.1
# Então, no diretório OLLVM build/bin, copie os novos bins do clang
cp bin/clang /usr/bin/clang
cp bin/clang++ /usr/bin/clang++
# Depois instale o wclang
cd ..
git clone https://github.com/tpoechtrager/wclang.git
cd wclang/
cmake -DCMAKE_INSTALL_PREFIX=_prefix_ .
make
make install
export wclang_path=$(pwd)/_prefix_/bin
echo "export PATH=$wclang_path:$PATH" >> ~/.bashrc
export PATH=$wclang_path:$PATH
# Então faça backup dos arquivos lib originais
cp -R /lib/llvm-13/lib/clang/13.0.1/include/ /lib/llvm-13/lib/clang/13.0.1/include_backup/
# Finalmente, no diretório OLLVM build/bin/lib/clang/13.0.1/, copie a pasta include
cd ../build/lib/clang/13.0.1/
cp -R include/ /lib/llvm-13/lib/clang/13.0.1/
Provavelmente existe uma maneira melhor de fazer isso, mas foi o que funcionou para mim. Se tiver problemas, continue tentando e certifique-se de que você consegue executar x86_64-w64-mingw32-clang++ -v e que ele contém "Obfuscator-LLVM" ou "heroims" na saída. Infelizmente não tenho tempo para ajudar indivíduos que precisam de mais ajuda, mas você pode tentar ler esta issue no meu repositório Nimcrypt2, onde alguns usuários descobriram como fazer isso em seus sistemas.
Saudações e Créditos: