
Cargador de Shellcode mediante Syscall (Trabajo en Progreso)
# Shhhloader
Shhhloader es un cargador de shellcode en desarrollo. Toma shellcode sin procesar como entrada y compila un stub en C++ que realiza varias cosas para intentar evadir AV/EDR. El constructor Python incluido funcionará en cualquier sistema Linux que tenga Mingw-w64 instalado.
**Edición 25/1/24: Shhhloader ahora es compatible con la variante 7 de [PoolParty](https://github.com/SafeBreach-Labs/PoolParty)! También se agregó una opción que combinará PoolParty con Module Stomping para evitar que el shellcode ejecutado resida en memoria no respaldada. Vea a continuación un video que demuestra este nuevo método de inyección contra Defender ATP:**
<details>
<summary>Ver Video</summary>
<video controls src="https://github.com/icyguider/Shhhloader/assets/79864975/db5da0c5-8589-4abc-9292-fe028031c88d"></video>
</details>
```
┳┻|
┻┳|
┳┻|
┻┳|
┳┻| _
┻┳| •.•) - Shhhhh, AV might hear us!
┳┻|⊂ノ
┻┳|
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
```
**Características:**
* 10 métodos diferentes de ejecución de shellcode (PoolParty, PoolPartyModuleStomping, ThreadlessInject, ModuleStomping, QueueUserAPC, ProcessHollow, EnumDisplayMonitors, RemoteThreadContext, RemoteThreadSuspended, CurrentThread)
* Suplantación de PPID
* Bloquear DLLs de terceros
* Desenganchar NTDLL mediante KnownDLLs
* SysWhispers2, SysWhispers3 y GetSyscallStub
* Hashing de API para SW2 y SW3
* Cifrado de cadenas en tiempo de compilación
* Soporte para Obfuscator-LLVM (OLLVM)
* Generación automática de proxy DLL
* Integración con el framework Havoc C2
* Aleatorización de nombres de syscall
* Almacenar shellcode como arreglo de palabras en inglés
* Codificación XOR con generación dinámica de claves
* Evasión de sandbox mediante DLL cargada, dominio, usuario, nombre de host y enumeración del sistema
Vea a continuación un video PoC del método ThreadlessInject utilizado para inyectar un beacon de Havoc en IE sin generar alertas y con eventos mínimos en Microsoft Defender for Endpoint (MDE) EDR (Grabado el 3/4/2023):
<details>
<summary>Ver Video</summary>
<video controls src="https://github.com/icyguider/Shhhloader/assets/79864975/27b8805f-88f6-442f-aa62-da0bf8919fc3"></video>
</details>
Vea el siguiente video que demuestra la técnica de inyección Module Stomping ejecutada mediante DLL Proxying (Grabado el 9/8/2022):
<details>
<summary>Ver Video</summary>
<video controls src="https://github.com/icyguider/Shhhloader/assets/79864975/a692e7ae-c9af-453e-8c6b-7132c9d75444"></video>
</details>
Shhhloader también se ha integrado en el [framework Havoc C2](https://github.com/HavocFramework/Havoc) mediante un módulo de [@jakobfriedl](https://github.com/jakobfriedl). Vea a continuación un video que demuestra el módulo:
<details>
<summary>Ver Video</summary>
<video controls src="https://github.com/icyguider/Shhhloader/assets/79864975/e1b7db2b-6c8e-44b4-8996-7d98a5fe8386"></video>
</details>
**Problemas conocidos/Notas:**
* Los métodos de inyección PoolParty actualmente están configurados para inyectar en un proceso existente. Por lo tanto, debe usar el flag `-p` para proporcionar el nombre de un proceso que sepa o sospeche que ya se está ejecutando en el sistema objetivo.
* Los métodos de inyección PoolParty no funcionarán con archivos de shellcode grandes como sliver (~11MB).
* El método de ejecución de shellcode ThreadlessInject actualmente debe inyectarse en un proceso no suspendido. Esto se hace automáticamente si se proporciona la opción "-cp". Espero encontrar una forma de hacerlo funcionar con procesos suspendidos pronto.
* El módulo de Havoc C2 actualmente se cuelga al especificar un Listener en lugar de un archivo de shellcode sin procesar. Esto se solucionará pronto, con suerte.
* Windows Defender detectará la mayoría de los archivos generados por esta herramienta, así que no abra un issue diciendo "DETECTADO!!!". Experimente con las nuevas opciones y características hasta obtener algo que funcione; se agregaron por una razón :). Ejecutar el archivo generado en memoria también es una buena manera de evadir estas detecciones.
* Obfuscator-LLVM (OLLVM) no es compatible con SW2 y SW3 debido a cómo maneja clang el ensamblado en línea. Actualmente no hay planes para hacerlos compatibles; se han agregado verificaciones para evitar que el usuario intente usar estas características juntas.
* Hay **muchísimos** errores en mi código. Pruebe todo de antemano antes de usarlo para algo importante y, POR FAVOR, proporcione la mayor cantidad de información posible al abrir un issue. (¡GRACIAS!)
**Actualizaciones planificadas:**
* Opción de syscall mediante Breakpoint de Hardware (HWBP)
* Crear procesos usando syscall en lugar de la función estándar de WinAPI
* Integrar ThreadlessInject con otras técnicas de inyección de shellcode (Ej. ModuleStomping)
* Refactorizar el código para que sea más modular y legible
* Corregir errores en el módulo de Havoc C2
* Corregir innumerables errores aprendiendo a programar mejor ;)
**OPCIONAL:** Para usar el flag [Obfuscator-LLVM](https://github.com/heroims/obfuscator), debe tenerlo instalado en su sistema junto con [wclang](https://github.com/tpoechtrager/wclang). Encuentro que esto es un poco molesto, pero debería poder hacerlo con un poco de perseverancia. Aquí hay un paso a paso que usé para instalar la rama llvm-13.x de OLLVM en mi sistema Kali Linux:
<details>
<summary>Ver Detalles</summary>
```
# 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/
```
</details>
Probablemente haya una mejor manera de hacer esto, pero esto es lo que funcionó para mí. Si tiene problemas, siga intentando y asegúrese de poder ejecutar `x86_64-w64-mingw32-clang++ -v` y que contenga "Obfuscator-LLVM" o "heroims" en la salida. Desafortunadamente no tengo tiempo para ayudar a individuos que puedan necesitar más ayuda, pero puede intentar leer [este issue](https://github.com/icyguider/Nimcrypt2/issues/6) en mi repositorio de Nimcrypt2, donde un par de usuarios descubrieron cómo hacerlo en sus sistemas.
**Saludos y créditos:**
* [@Jackson_T](https://twitter.com/Jackson_T) por su increíble proyecto SysWhispers: https://github.com/jthuraisamy/SysWhispers
* [@FalconForceTeam](https://twitter.com/falconforceteam) por su herramienta de generación de syscall que admite SysWhispers2: https://github.com/FalconForceTeam/SysWhispers2BOF
* [@snovvcrash](https://twitter.com/snovvcrash) por su proyecto DInjector, que utilicé como plantilla para muchas de las técnicas de inyección incluidas: https://github.com/snovvcrash/DInjector
* [@Cerbersec](https://twitter.com/cerbersec) por su proyecto Ares, cuyo código utilicé para la suplantación de PPID, bloqueo de DLLs de terceros y evasión de sandbox: https://github.com/Cerbersec/Ares
* [@spotheplanet](https://twitter.com/spotheplanet) por su publicación de blog sobre la recuperación de stubs de syscall de ntdll desde el disco en tiempo de ejecución: https://www.ired.team/offensive-security/defense-evasion/retrieving-ntdll-syscall-stubs-at-run-time
* [@_RastaMouse](https://twitter.com/_RastaMouse) por su código y artículo sobre Module Stomping, que porté a C++: https://offensivedefence.co.uk/posts/module-stomping/
* [@s4ntiago_p](https://twitter.com/s4ntiago_p) por su proyecto NanoDump y en particular el script [randomize_sw2_seed.py](https://github.com/helpsystems/nanodump/blob/main/scripts/randomize_sw2_seed.py): https://github.com/helpsystems/nanodump
* [@skadro-official](https://github.com/skadro-official) por su proyecto skCrypter que esta herramienta utiliza para el cifrado de cadenas en tiempo de compilación: https://github.com/skadro-official/skCrypter
* [@_EthicalChaos_](https://twitter.com/_EthicalChaos_) por su proyecto ThreadlessInject: https://github.com/CCob/ThreadlessInject
* [0xLegacyy](https://twitter.com/0xLegacyy) por su versión BOF de ThreadlessInject: https://github.com/iilegacyyii/ThreadlessInject-BOF
* [@D1rkMtr](https://twitter.com/D1rkMtr) por su proyecto de colección de desenganche de ntdll: https://github.com/TheD1rkMtr/ntdlll-unhooking-collection
* [@KlezVirus](https://twitter.com/KlezVirus) por su proyecto SysWhispers3: https://github.com/klezVirus/SysWhispers3
* [@jakobfriedl](https://github.com/jakobfriedl) por crear un módulo de Havoc C2 para Shhhloader
* [@_0xDeku](https://twitter.com/_0xDeku) por su investigación y código sobre inyección de procesos mediante grupos de subprocesos de Windows (PoolParty): https://github.com/SafeBreach-Labs/PoolParty
* [@0xEr3bus](https://twitter.com/0xEr3bus) por su PoolParty BOF que se utilizó como referencia: https://github.com/0xEr3bus/PoolPartyBof