
Un dépôt de chargeurs de shellcode Windows et d'utilitaires annexes. Les applications chargent et exécutent du shellcode en utilisant divers appels API ou techniques.
go-shellcode est un dépôt de chargeurs de Shellcode Windows et d'utilitaires associés. Les applications chargent et exécutent du Shellcode en utilisant divers appels API ou techniques.
Les chargeurs de Shellcode disponibles incluent :
Cette application exploite la fonction Windows CreateFiber de la Kernel32.dll pour exécuter du shellcode dans le processus de cette application. Cela est utile lorsque vous souhaitez éviter l'injection de processus distant et éviter d'appeler CreateThread. Cette application N'UTILISE PAS les fonctions du package golang.org/x/sys/windows. La différence la plus significative est que cette application charge elle-même toutes les DLL et procédures nécessaires et utilise la fonction Call() de la procédure.
REMARQUE : Je n'ai pas trouvé le moyen de faire sortir le processus et vous devrez le terminer manuellement.
L'application peut être compilée avec la commande suivante sur un hôte Windows depuis le répertoire racine du projet :
set GOOS=windows GOARCH=amd64;go build -o CreateFiber.exe .\cmd\CreateFiber\main.go
Cette application exploite la fonction Windows CreateProcess de Kernel32.dll. Le processus est créé en état suspendu, le AddressOfEntryPoint dans la structure IMAGE_OPTIONAL_HEADER est mis à jour pour exécuter le shellcode dans le processus enfant, puis le processus est repris. Il s'agit d'un type de process hollowing mais le PE existant N'EST PAS désaffecté et le ThreadContext N'EST PAS mis à jour. L'architecture du shellcode fourni (c'est-à-dire x86 ou x64) doit correspondre à l'architecture du processus enfant.
L'application peut être compilée avec la commande suivante sur un hôte Windows depuis le répertoire racine du projet :
set GOOS=windows GOARCH=amd64;go build -o CreateProcess.exe .\cmd\CreateProcess\main.go
Cette application exploite la fonction Windows CreateProcess de Kernel32.dll. Le processus est créé en état suspendu, le AddressOfEntryPoint dans la structure IMAGE_OPTIONAL_HEADER est mis à jour pour exécuter le shellcode dans le processus enfant, puis le processus est repris. Il s'agit d'un type de process hollowing mais le PE existant N'EST PAS désaffecté et le ThreadContext N'EST PAS mis à jour. L'architecture du shellcode fourni (c'est-à-dire x86 ou x64) doit correspondre à l'architecture du processus enfant.
Cette application diffère de CreateProcess car elle collecte toutes les données écrites sur STDOUT ou STDERR dans le processus enfant et les renvoie au processus parent. Les données sont collectées en utilisant la fonction CreatePipe pour créer un pipe anonyme via lequel le processus parent et le processus enfant communiquent. Cela est utile lors de l'utilisation d'outils comme Donut pour exécuter un assembly .NET dans un processus enfant sous forme de shellcode et pour récupérer la sortie du programme exécuté. La commande suivante peut être utilisée pour générer un shellcode indépendant de la position afin d'exécuter Seatbelt avec Donut v0.9.3 :
.\donut.exe -o donut_v0.9.3_Seatbelt.bin -x 2 -c Seatbelt.Program -m Main -p "ARPTable" Seatbelt.exe
L'application peut être compilée avec la commande suivante sur un hôte Windows depuis le répertoire racine du projet :
set GOOS=windows GOARCH=amd64;go build -o CreateProcessWithPipe.exe .\cmd\CreateProcessWithPipe\main.go
Cette application exploite la fonction Windows CreateRemoteThread de Kernel32.dll pour exécuter du shellcode dans un processus distant. L'application nécessite que le processus cible dans lequel injecter soit déjà en cours d'exécution. L'identifiant du processus (PID) cible peut être fourni à l'exécution pour les tests en utilisant le drapeau -pid en ligne de commande. Pour une utilisation opérationnelle, codez en dur le PID dans la ligne de code suivante en remplaçant le 0 par votre PID cible :
pid := flag.Int("pid", 0, "Process ID to inject shellcode into")
Cette application utilise les fonctions du package golang.org/x/sys/windows, lorsque c'est possible, comme la windows.OpenProcess(). L'application peut être compilée avec la commande suivante sur un hôte Windows depuis le répertoire racine du projet :
set GOOS=windows GOARCH=amd64;go build -o CreateRemoteThread.exe .\cmd\CreateRemoteThread\main.go
Cette application exploite la fonction Windows CreateRemoteThread de Kernel32.dll pour exécuter du shellcode dans un processus distant. L'application nécessite que le processus cible dans lequel injecter soit déjà en cours d'exécution. L'identifiant du processus (PID) cible peut être fourni à l'exécution pour les tests en utilisant le drapeau -pid en ligne de commande. Pour une utilisation opérationnelle, codez en dur le PID dans la ligne de code suivante en remplaçant le 0 par votre PID cible :
pid := flag.Int("pid", 0, "Process ID to inject shellcode into")
Cette application N'UTILISE PAS les fonctions du package golang.org/x/sys/windows. La différence la plus significative est que cette application charge elle-même toutes les DLL et procédures nécessaires et utilise la fonction Call() de la procédure. L'application peut être compilée avec la commande suivante sur un hôte Windows depuis le répertoire racine du projet :
set GOOS=windows GOARCH=amd64;go build -o CreateRemoteThreadNative.exe .\cmd\CreateRemoteThreadNative\main.go
Cette application exploite la fonction Windows CreateThread de Kernel32.dll pour exécuter du shellcode dans le processus de cette application. Cela est utile lorsque vous souhaitez éviter l'injection de processus distant. Cette application utilise les fonctions du package golang.org/x/sys/windows, lorsque c'est possible, comme la windows.VirtualAlloc(). L'application peut être compilée avec la commande suivante sur un hôte Windows depuis le répertoire racine du projet :
set GOOS=windows GOARCH=amd64;go build -o CreateThread.exe .\cmd\CreateThread\main.go