
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 les fonctions du package . 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.
golang.org/x/sys/windowsREMARQUE : 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
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 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 CreateThreadNative.exe .\cmd\CreateThreadNative\main.go
L'application exploite la fonction Windows CreateProcess pour créer un processus en état suspendu. Une fois le processus enfant suspendu, la fonction Windows QueueUserAPC est utilisée pour ajouter une UserAPC au processus enfant qui pointe vers le shellcode alloué. Ensuite, ResumeThread est appelée, ce qui appelle à son tour la fonction non documentée NtTestAlert qui exécutera la UserAPC créée et donc le shellcode. Cela est utile car le shellcode s'exécutera avant qu'AV/EDR ne puisse accrocher des fonctions pour la détection. Référence : New 'Early Bird' Code Injection Technique Discovered. L'application peut être compilée avec la commande suivante sur un hôte Windows depuis le répertoire racine du projet :
export GOOS=windows GOARCH=amd64;go build -o goEarlyBird.exe cmd\EarlyBird\main.go
Cette application exploite la fonction Windows EtwpCreateEtwThread de ntdll.dll pour exécuter du shellcode dans le processus de cette application. Travail original de TheWover. Cela est utile lorsque vous souhaitez éviter l'injection de processus distant. 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 EtwpCreateEtwThread.exe .\cmd\EtwpCreateEtwThread\main.go
Cette application utilise la fonction non documentée NtQueueApcThreadEx pour créer une "Special User APC" dans le thread actuel du processus actuel afin d'exécuter du shellcode. Étant donné que le shellcode est chargé et exécuté dans le processus actuel, il est "local". Cette même technique peut être utilisée pour un processus distant. REMARQUE : Cela ne fonctionnera que sur Windows 7 ou ultérieur. Référence : APC Series: User APC API.
export GOOS=windows GOARCH=amd64;go build -o goNtQueueApcThreadEx-Local.exe cmd\NtQueueApcThreadEx-Local\main.go
Cette application exploite la fonction Windows RtlCreateUserThread de ntdll.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 RtlCreateUserThread.exe .\cmd\RtlCreateUserThread\main.go
Cette application exécute du Shellcode dans le processus en cours en effectuant un appel système (syscall) sur le point d'entrée du Shellcode. Cette application N'UTILISE PAS les fonctions du package golang.org/x/sys/windows. 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 Syscall.exe .\cmd\Syscall\main.go
Cette application exploite la fonction Windows UuidFromStringA pour charger du shellcode vers une adresse mémoire, puis appelle la fonction EnumSystemLocalesA pour exécuter le shellcode. Cette méthode de chargement et d'exécution de shellcode est dérivée de l'article de nccgroup : RIFT: Analysing a Lazarus Shellcode Execution Method. Pour cette application, la mémoire est allouée sur le tas et elle n'utilise pas 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 UuidFromString.exe .\cmd\UuidFromString\main.go
Cette application est utilisée pour transformer des fichiers binaires de shellcode. Le programme nécessite que le fichier d'entrée soit un fichier binaire (.bin) contenant les octets hexadécimaux du shellcode. ShellcodeUtils peut simplement encoder en base64 votre fichier d'entrée ou le chiffrer avec XOR, RC4 ou AES256-GCM. Les outils peuvent également être utilisés pour déchiffrer des fichiers.
Menu d'aide de ShellcodeUtils :
-base64
Encoder la sortie en Base64. Peut être utilisé avec ou sans chiffrement
-i string
Chemin du fichier binaire d'entrée
-key string
Clé de chiffrement
-mode string
Mode d'opération à effectuer sur le fichier d'entrée [encrypt,decrypt] (par défaut "encrypt")
-nonce string
Nonce, en hexadécimal, utilisé pour déchiffrer un fichier AES256. Utilisé uniquement lors du déchiffrement
-o string
Chemin du fichier de sortie
-salt string
Sel, en hexadécimal, utilisé pour générer une clé AES256 de 32 octets via Argon2. Utilisé uniquement lors du déchiffrement
-type string
Le type de chiffrement à utiliser [xor, aes256, rc4, null]
-v Activer la sortie verbeuse
Exemple de simple encodage Base64 du fichier d'entrée et sauvegarde dans un fichier texte :
PS C:\Users\bob> .\ShellcodeUtils.exe -i C:\Users\bob\calc.bin -o C:\Users\bob\calc.b64.txt -base64 -v
[-]Output directory: C:\Users\bob\
[-]Output file name: calc.b64.txt
[-]File contents (hex): 505152535657556a605a6863616c6354594883ec2865488b32488b7618488b761048ad488b30488b7e3003573c8b5c17288b741f204801fe8b541f240fb72c178d5202ad813c0757696e4575ef8b741f1c4801fe8b34ae4801f799ffd74883c4305d5f5e5b5a5958c3
[-]No encryption type provided, continuing on...
[+]Output (string):
UFFSU1ZXVWpgWmhjYWxjVFlIg+woZUiLMkiLdhhIi3YQSK1IizBIi34wA1c8i1wXKIt0HyBIAf6LVB8kD7csF41SAq2BPAdXaW5Fde+LdB8cSAH+izSuSAH3mf/XSIPEMF1fXltaWVjD
[+] encrypt input and wrote 140 bytes to: C:\Users\bob\calc.b64.txt
Exemple de chiffrement XOR du fichier d'entrée avec une clé Sh3!1z ET encodage Base64 de la sortie :
PS C:\Users\bob> .\ShellcodeUtils.exe -i C:\Users\bob\calc.bin -o C:\Users\bob\calc.xor.b64.txt -mode encrypt -type xor -key Sh3!1z -v
[-]Output directory: C:\Users\bob\
[-]Output file name: calc.xor.b64.txt
[-]File contents (hex): 505152535657556a605a6863616c6354594883ec2865488b32488b7618488b761048ad488b30488b7e3003573c8b5c17288b741f204801fe8b541f240fb72c178d5202ad813c0757696e4575ef8b741f1c4801fe8b34ae4801f799ffd74883c4305d5f5e5b5a5958c3
[-]XOR encrypting input file with key: Sh3!1z
[+]Output (hex):
03396172672d0602537b5919320450756832d0841b4479f16120b8572932d81e23699c32d8587baa4f4a503f0faa6d6d7be3473e11325296b8752e5e5cdf1f36bc2851c5b21d362d3a067654def127772f693084d85c9d69308dca97e469b2be63356c7f6a200a30f0
[+]xor encrypt input and wrote 105 bytes to: C:\Users\bob\calc.xor.b64.txt
Exemple de chiffrement AES256-GCM du fichier d'entrée avec un mot de passe Sh3!1z SANS encodage Base64 de la sortie :
PS C:\Users\bob> .\ShellcodeUtils.exe -i C:\Users\bob\calc.bin -o C:\Users\bob\calc.aes.bin -mode encrypt -type aes256 -key Sh3!1z -v
[-]Output directory: C:\Users\bob\
[-]Output file name: calc.aes.bin
[-]File contents (hex): 505152535657556a605a6863616c6354594883ec2865488b32488b7618488b761048ad488b30488b7e3003573c8b5c17288b741f204801fe8b541f240fb72c178d5202ad813c0757696e4575ef8b741f1c4801fe8b34ae4801f799ffd74883c4305d5f5e5b5a5958c3
[-]AES256 encrypting input file
[+]Argon2 salt (hex): db6126d3ac640f8aaa67cda74b8cf1d2c54513db7bf4fbe3422d1b276af1367e
[+]AES256 key (32-bytes) derived from input password Sh3!1z (hex): 096a40f1aef38dd9b5d63284acc19727c4420dd98f21ea052112bef63eb7d94a
[+]AES256 nonce (hex): 13802153c4b2fb6a3e545ff4
[+]Output (hex):
44a974233e37b460dc2181b16846f265e8e3a07959abf9c8760f7d0ac8029575e67571ea5b313bc8b011739db57c690ec156a4b0bba4e4d632c35c1490aeaac24f5ae05e90934adf57798ee3c702a3c27073fe976fbcc6ee5db355da186c1add58913e41a8c5716a0fcfc27371f0cae906e50e680366496a00
[+]aes256 encrypt input and wrote 121 bytes to: C:\Users\bob\calc.aes.bin
AES256 nécessite une clé de 32 octets. Ce programme utilise l'algorithme Argon2 ID pour dériver une clé de 32 octets à partir du mot de passe fourni avec le paramètre -key, en utilisant un sel généré aléatoirement. Vous aurez besoin du même mot de passe d'entrée et du sel utilisé avec l'algorithme Argon2, ainsi que du même nonce utilisé avec l'algorithme AES256, pour déchiffrer le fichier avec succès. Alternativement, la fonction de déchiffrement pourrait être mise à jour pour utiliser directement la clé Argon2 de 32 octets au lieu du mot de passe d'entrée et du sel.
REMARQUE : Il appartient à l'opérateur de décider d'utiliser simplement la clé Argon2 générée ou le mot de passe et le sel utilisés pour générer le mot de passe.
Exemple de déchiffrement AES256 du fichier d'entrée :
PS C:\Users\bob> .\ShellcodeUtils.exe -i C:\Users\bob\calc.aes.bin -o C:\Users\bob\calc.aes.decrypted.bin -mode decrypt -type aes256 -key Sh3!1z -nonce 13802153c4b2fb6a3e545ff4 -salt db6126d3ac640f8aaa67cda74b8cf1d2c54513db7bf4fbe3422d1b276af1367e -v
[-]Output directory: C:\Users\bob\
[-]Output file name: calc.aes.decrypted.bin
[-]File contents (hex): 44a974233e37b460dc2181b16846f265e8e3a07959abf9c8760f7d0ac8029575e67571ea5b313bc8b011739db57c690ec156a4b0bba4e4d632c35c1490aeaac24f5ae05e90934adf57798ee3c702a3c27073fe976fbcc6ee5db355da186c1add58913e41a8c5716a0fcfc27371f0cae906e50e680366496a00
[-]AES256 decrypting input file
[-]Argon2 salt (hex): db6126d3ac640f8aaa67cda74b8cf1d2c54513db7bf4fbe3422d1b276af1367e
[-]AES256 key (hex): 096a40f1aef38dd9b5d63284acc19727c4420dd98f21ea052112bef63eb7d94a
[-]AES256 nonce (hex): 13802153c4b2fb6a3e545ff4
[+]Output (hex):
505152535657556a605a6863616c6354594883ec2865488b32488b7618488b761048ad488b30488b7e3003573c8b5c17288b741f204801fe8b541f240fb72c178d5202ad813c0757696e4575ef8b741f1c4801fe8b34ae4801f799ffd74883c4305d5f5e5b5a5958c3
[+]aes256 decrypt input and wrote 105 bytes to: C:\Users\bob\calc.aes.decrypted.bin
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 ShellcodeUtils.exe .\cmd\ShellcodeUtils\main.go