
Syscall Shellcode Loader (En cours de développement)
Shhhloader est un chargeur de shellcode en cours de développement. Il prend du shellcode brut en entrée et compile une souche C++ qui effectue diverses opérations pour tenter de contourner les antivirus/EDR. Le générateur Python inclus fonctionnera sur tout système Linux disposant de Mingw-w64 installé.
Édition du 25/01/24 : Shhhloader prend désormais en charge la variante 7 de PoolParty ! Une option a également été ajoutée pour combiner PoolParty avec Module Stomping afin d'empêcher le shellcode exécuté de résider dans une mémoire non adossée. Voir ci-dessous une vidéo démontrant cette nouvelle méthode d'injection contre Defender ATP :
┳┻|
┻┳|
┳┻|
┻┳|
┳┻| _
┻┳| •.•) - Chut, l'AV pourrait nous entendre !
┳┻|⊂ノ
┻┳|
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
ICYGUIDER'S CUSTOM SYSCALL SHELLCODE LOADER
positional arguments:
file File containing raw shellcode
options:
-h, --help show this help message and exit
-p explorer.exe, --process explorer.exe
Process to inject into (Default: explorer.exe)
-m QueueUserAPC, --method QueueUserAPC
Method for shellcode execution (Options: PoolPartyModuleStomping, PoolParty, ThreadlessInject, ModuleStomping, QueueUserAPC,
ProcessHollow, EnumDisplayMonitors, RemoteThreadContext, RemoteThreadSuspended, CurrentThread) (Default: QueueUserAPC)
-u, --unhook Unhook NTDLL in current process
-w, --word-encode Save shellcode in stub as array of English words
-nr, --no-randomize Disable syscall name randomization
-ns, --no-sandbox Disable sandbox checks
-l, --llvm-obfuscator
Use Obfuscator-LLVM to compile stub
-v, --verbose Enable debugging messages upon execution
-sc GetSyscallStub, --syscall GetSyscallStub
Syscall execution method (Options: SysWhispers2, SysWhispers3, GetSyscallStub, None) (Default: GetSyscallStub)
-d, --dll Generate a DLL instead of EXE
-dp apphelp.dll, --dll-proxy apphelp.dll
Create Proxy DLL using supplied legitimate DLL (File must exist in current dir)
-s domain, --sandbox domain
Sandbox evasion technique (Options: sleep, domain, hostname, username, dll) (Default: sleep)
-sa testlab.local, --sandbox-arg testlab.local
Argument for sandbox evasion technique (Ex: WIN10CO-DESKTOP, testlab.local)
-o a.exe, --outfile a.exe
Name of compiled file
PPID Spoofing:
-pp explorer.exe, --ppid explorer.exe
Parent process to use for PPID Spoofing (Default: explorer.exe)
-ppv, --ppid-priv Enable spoofing for privileged parent process (Disabled by default)
-np, --no-ppid-spoof Disable PPID spoofing
ThreadlessInject:
-cp, --create-process
Create process instead of injecting into existing one
-td ntdll.dll, --target-dll ntdll.dll
Target DLL containing export function to overwrite
-ef NtClose, --export-function NtClose
Export function to overwrite
Fonctionnalités :
Voir ci-dessous une vidéo de preuve de concept de la méthode ThreadlessInject utilisée pour injecter un beacon Havoc dans IE sans générer d'alertes et avec un minimum d'événements dans Microsoft Defender for Endpoint (MDE) EDR (Enregistrée le 03/04/2023) :
Voir la vidéo ci-dessous démontrant la technique d'injection Module Stomping exécutée via un proxy DLL (Enregistrée le 09/08/2022) :
Shhhloader a également été intégré au framework Havoc C2 via un module par @jakobfriedl. Voir ci-dessous une vidéo démontrant le module :
Problèmes connus / Remarques :
-p pour fournir le nom d'un processus que vous savez ou soupçonnez être déjà en cours d'exécution sur le système cible.-cp est fournie. J'espère trouver un moyen de la faire fonctionner avec des processus suspendus bientôt.Mises à jour prévues :
OPTIONNEL : Pour utiliser l'option Obfuscator-LLVM, vous devez l'avoir installé sur votre système ainsi que wclang. J'ai trouvé cela un peu pénible, mais vous devriez y arriver avec un peu de persévérance. Voici un guide étape par étape que j'ai utilisé pour installer la branche llvm-13.x d'OLLVM sur mon système Kali Linux :
# Clone and Run 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 and Compile 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
# ONCE COMPILED, BACKUP ORIGINAL CLANG BINARIES
mv /usr/bin/clang /usr/bin/clang13.0.1
mv /usr/bin/clang++ /usr/bin/clang++13.0.1
# Then in OLLVM build/bin dir, copy the newly build clang bins
cp bin/clang /usr/bin/clang
cp bin/clang++ /usr/bin/clang++
# Then install 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
# Then backup original lib files
cp -R /lib/llvm-13/lib/clang/13.0.1/include/ /lib/llvm-13/lib/clang/13.0.1/include_backup/
# Finally in the OLLVM build/bin/lib/clang/13.0.1/ dir, copy the include folder
cd ../build/lib/clang/13.0.1/
cp -R include/ /lib/llvm-13/lib/clang/13.0.1/
Il existe probablement une meilleure méthode, mais c'est celle qui a fonctionné pour moi. Si vous rencontrez des problèmes, continuez d'essayer et assurez-vous de pouvoir exécuter x86_64-w64-mingw32-clang++ -v et qu'il contienne soit « Obfuscator-LLVM » soit « heroims » dans la sortie. Malheureusement, je n'ai pas le temps d'aider individuellement les personnes qui auraient besoin de plus d'aide, mais vous pouvez essayer de lire ce ticket sur mon dépôt Nimcrypt2 où quelques utilisateurs ont réussi à le faire fonctionner sur leurs systèmes.
Salutations & Crédits :