
Ein Repository von Windows Shellcode-Runnern und unterstützenden Hilfsprogrammen. Die Anwendungen laden und führen Shellcode mithilfe verschiedener API-Aufrufe oder Techniken aus.
go-shellcode ist ein Repository mit Windows-Shellcode-Runnern und zugehörigen Hilfsprogrammen. Die Anwendungen laden und führen Shellcode mithilfe verschiedener API-Aufrufe oder Techniken aus.
Die verfügbaren Shellcode-Runner umfassen:
Diese Anwendung nutzt die Windows-Funktion CreateFiber aus der Kernel32.dll, um Shellcode im eigenen Prozess auszuführen. Dies ist nützlich, wenn Sie die Injektion in einen entfernten Prozess vermeiden und CreateThread nicht aufrufen möchten. Diese Anwendung verwendet KEINE Funktionen aus dem Paket golang.org/x/sys/windows. Der wesentlichste Unterschied besteht darin, dass diese Anwendung alle notwendigen DLLs und Prozeduren selbst lädt und die Call()-Funktion der Prozedur verwendet.
HINWEIS: Ich habe noch keinen Weg gefunden, den Prozess sauber zu beenden; Sie müssen ihn manuell terminieren.
Die Anwendung kann auf einem Windows-Host mit folgendem Befehl aus dem Stammverzeichnis des Projekts kompiliert werden:
set GOOS=windows GOARCH=amd64;go build -o CreateFiber.exe .\cmd\CreateFiber\main.go
Diese Anwendung nutzt die Windows-Funktion CreateProcess aus Kernel32.dll. Der Prozess wird im angehaltenen Zustand erstellt, der AddressOfEntryPoint in der IMAGE_OPTIONAL_HEADER-Struktur wird aktualisiert, um Shellcode im Kindprozess auszuführen, und dann wird der Prozess fortgesetzt. Dies ist eine Art von Process Hollowing, aber das vorhandene PE wird NICHT aus dem Speicher entfernt und der ThreadContext wird NICHT aktualisiert. Die Architektur des bereitgestellten Shellcodes (also x86 oder x64) muss mit der Architektur des Kindprozesses übereinstimmen.
Die Anwendung kann auf einem Windows-Host mit folgendem Befehl aus dem Stammverzeichnis des Projekts kompiliert werden:
set GOOS=windows GOARCH=amd64;go build -o CreateProcess.exe .\cmd\CreateProcess\main.go
Diese Anwendung nutzt die Windows-Funktion CreateProcess aus Kernel32.dll. Der Prozess wird im angehaltenen Zustand erstellt, der AddressOfEntryPoint in der IMAGE_OPTIONAL_HEADER-Struktur wird aktualisiert, um Shellcode im Kindprozess auszuführen, und dann wird der Prozess fortgesetzt. Dies ist eine Art von Process Hollowing, aber das vorhandene PE wird NICHT aus dem Speicher entfernt und der ThreadContext wird NICHT aktualisiert. Die Architektur des bereitgestellten Shellcodes (also x86 oder x64) muss mit der Architektur des Kindprozesses übereinstimmen.
Diese Anwendung unterscheidet sich von CreateProcess dadurch, dass sie alle Daten sammelt, die im Kindprozess auf STDOUT oder STDERR geschrieben werden, und sie an den Elternprozess zurückgibt. Die Daten werden gesammelt, indem die CreatePipe-Funktion verwendet wird, um eine anonyme Pipe zu erstellen, über die der Eltern- und der Kindprozess kommunizieren. Dies ist nützlich, wenn Sie Tools wie Donut verwenden, um eine .NET-Assembly in einem Kindprozess als Shellcode auszuführen und die Ausgabe des ausgeführten Programms abzurufen. Mit dem folgenden Befehl kann positionsunabhängiger Shellcode erzeugt werden, um Seatbelt mit Donut v0.9.3 auszuführen:
.\donut.exe -o donut_v0.9.3_Seatbelt.bin -x 2 -c Seatbelt.Program -m Main -p "ARPTable" Seatbelt.exe
Die Anwendung kann auf einem Windows-Host mit folgendem Befehl aus dem Stammverzeichnis des Projekts kompiliert werden:
set GOOS=windows GOARCH=amd64;go build -o CreateProcessWithPipe.exe .\cmd\CreateProcessWithPipe\main.go
Diese Anwendung nutzt die Windows-Funktion CreateRemoteThread aus Kernel32.dll, um Shellcode in einem entfernten Prozess auszuführen. Die Anwendung erfordert, dass der Zielprozess, in den injiziert werden soll, bereits läuft. Die Prozess-ID (PID) des Ziels kann zur Laufzeit mit der Befehlszeilenoption -pid für Tests angegeben werden. Für den operativen Einsatz codieren Sie die PID in der folgenden Codezeile hart, indem Sie die 0 durch Ihre Ziel-PID ersetzen:
pid := flag.Int("pid", 0, "Process ID to inject shellcode into")
Diese Anwendung nutzt – wo möglich – Funktionen aus dem Paket golang.org/x/sys/windows, wie z. B. die windows.OpenProcess()-Funktion. Die Anwendung kann auf einem Windows-Host mit folgendem Befehl aus dem Stammverzeichnis des Projekts kompiliert werden:
set GOOS=windows GOARCH=amd64;go build -o CreateRemoteThread.exe .\cmd\CreateRemoteThread\main.go
Diese Anwendung nutzt die Windows-Funktion CreateRemoteThread aus Kernel32.dll, um Shellcode in einem entfernten Prozess auszuführen. Die Anwendung erfordert, dass der Zielprozess, in den injiziert werden soll, bereits läuft. Die Prozess-ID (PID) des Ziels kann zur Laufzeit mit der Befehlszeilenoption -pid für Tests angegeben werden. Für den operativen Einsatz codieren Sie die PID in der folgenden Codezeile hart, indem Sie die 0 durch Ihre Ziel-PID ersetzen:
pid := flag.Int("pid", 0, "Process ID to inject shellcode into")
Diese Anwendung verwendet KEINE Funktionen aus dem Paket golang.org/x/sys/windows. Der wesentlichste Unterschied besteht darin, dass diese Anwendung alle notwendigen DLLs und Prozeduren selbst lädt und die Call()-Funktion der Prozedur verwendet. Die Anwendung kann auf einem Windows-Host mit folgendem Befehl aus dem Stammverzeichnis des Projekts kompiliert werden:
set GOOS=windows GOARCH=amd64;go build -o CreateRemoteThreadNative.exe .\cmd\CreateRemoteThreadNative\main.go
Diese Anwendung nutzt die Windows-Funktion CreateThread aus Kernel32.dll, um Shellcode im eigenen Prozess auszuführen. Dies ist nützlich, wenn Sie die Injektion in einen entfernten Prozess vermeiden möchten. Diese Anwendung nutzt – wo möglich – Funktionen aus dem Paket golang.org/x/sys/windows, wie z. B. die windows.VirtualAlloc()-Funktion. Die Anwendung kann auf einem Windows-Host mit folgendem Befehl aus dem Stammverzeichnis des Projekts kompiliert werden:
set GOOS=windows GOARCH=amd64;go build -o CreateThread.exe .\cmd\CreateThread\main.go
Diese Anwendung nutzt die Windows-Funktion CreateThread aus der Kernel32.dll, um Shellcode im eigenen Prozess auszuführen. Dies ist nützlich, wenn Sie die Injektion in einen entfernten Prozess vermeiden möchten. Diese Anwendung verwendet KEINE Funktionen aus dem Paket golang.org/x/sys/windows. Der wesentlichste Unterschied besteht darin, dass diese Anwendung alle notwendigen DLLs und Prozeduren selbst lädt und die Call()-Funktion der Prozedur verwendet. Die Anwendung kann auf einem Windows-Host mit folgendem Befehl aus dem Stammverzeichnis des Projekts kompiliert werden:
set GOOS=windows GOARCH=amd64;go build -o CreateThreadNative.exe .\cmd\CreateThreadNative\main.go
Die Anwendung nutzt die Windows-Funktion CreateProcess, um einen Prozess im angehaltenen Zustand zu erstellen. Sobald der Kindprozess angehalten ist, wird die Windows-Funktion QueueUserAPC verwendet, um dem Kindprozess eine UserAPC hinzuzufügen, die auf den allozierten Shellcode verweist. Als Nächstes wird ResumeThread aufgerufen, was wiederum die undokumentierte Funktion NtTestAlert aufruft, die die erstellte UserAPC und damit den Shellcode ausführt. Dies ist nützlich, weil der Shellcode ausgeführt wird, bevor AV/EDR Funktionen hooken können, um eine Erkennung zu unterstützen. Referenz: New 'Early Bird' Code Injection Technique Discovered. Die Anwendung kann auf einem Windows-Host mit folgendem Befehl aus dem Stammverzeichnis des Projekts kompiliert werden:
export GOOS=windows GOARCH=amd64;go build -o goEarlyBird.exe cmd\EarlyBird\main.go
Diese Anwendung nutzt die Windows-Funktion EtwpCreateEtwThread aus ntdll.dll, um Shellcode im eigenen Prozess auszuführen. Ursprüngliche Arbeit von TheWover. Dies ist nützlich, wenn Sie die Injektion in einen entfernten Prozess vermeiden möchten. Diese Anwendung verwendet KEINE Funktionen aus dem Paket golang.org/x/sys/windows. Der wesentlichste Unterschied besteht darin, dass diese Anwendung alle notwendigen DLLs und Prozeduren selbst lädt und die Call()-Funktion der Prozedur verwendet. Die Anwendung kann auf einem Windows-Host mit folgendem Befehl aus dem Stammverzeichnis des Projekts kompiliert werden:
set GOOS=windows GOARCH=amd64;go build -o EtwpCreateEtwThread.exe .\cmd\EtwpCreateEtwThread\main.go
Diese Anwendung verwendet die undokumentierte Funktion NtQueueApcThreadEx, um eine „Special User APC" im aktuellen Thread des aktuellen Prozesses zu erstellen und Shellcode auszuführen. Da der Shellcode im aktuellen Prozess geladen und ausgeführt wird, ist dies „lokal". Dieselbe Technik kann auch für einen entfernten Prozess verwendet werden. HINWEIS: Dies funktioniert nur unter Windows 7 oder höher. Referenz: APC Series: User APC API.
export GOOS=windows GOARCH=amd64;go build -o goNtQueueApcThreadEx-Local.exe cmd\NtQueueApcThreadEx-Local\main.go
Diese Anwendung nutzt die Windows-Funktion RtlCreateUserThread aus ntdll.dll, um Shellcode in einem entfernten Prozess auszuführen. Die Anwendung erfordert, dass der Zielprozess, in den injiziert werden soll, bereits läuft. Die Prozess-ID (PID) des Ziels kann zur Laufzeit mit der Befehlszeilenoption -pid für Tests angegeben werden. Für den operativen Einsatz codieren Sie die PID in der folgenden Codezeile hart, indem Sie die 0 durch Ihre Ziel-PID ersetzen:
pid := flag.Int("pid", 0, "Process ID to inject shellcode into")
Diese Anwendung verwendet KEINE Funktionen aus dem Paket golang.org/x/sys/windows. Der wesentlichste Unterschied besteht darin, dass diese Anwendung alle notwendigen DLLs und Prozeduren selbst lädt und die Call()-Funktion der Prozedur verwendet. Die Anwendung kann auf einem Windows-Host mit folgendem Befehl aus dem Stammverzeichnis des Projekts kompiliert werden:
set GOOS=windows GOARCH=amd64;go build -o RtlCreateUserThread.exe .\cmd\RtlCreateUserThread\main.go
Diese Anwendung führt Shellcode im aktuell laufenden Prozess aus, indem sie einen Syscall auf den Einstiegspunkt des Shellcodes macht. Diese Anwendung verwendet KEINE Funktionen aus dem Paket golang.org/x/sys/windows. Die Anwendung kann auf einem Windows-Host mit folgendem Befehl aus dem Stammverzeichnis des Projekts kompiliert werden:
set GOOS=windows GOARCH=amd64;go build -o Syscall.exe .\cmd\Syscall\main.go
Diese Anwendung nutzt die Windows-Funktion UuidFromStringA, um Shellcode in eine Speicheradresse zu laden, und ruft dann die Funktion EnumSystemLocalesA auf, um den Shellcode auszuführen. Diese Methode zum Laden und Ausführen von Shellcode wurde von nccgroup's RIFT: Analysing a Lazarus Shellcode Execution Method abgeleitet. Bei dieser Anwendung wird der Speicher auf dem Heap alloziert; VirtualAlloc wird nicht verwendet. Die Anwendung kann auf einem Windows-Host mit folgendem Befehl aus dem Stammverzeichnis des Projekts kompiliert werden:
set GOOS=windows GOARCH=amd64;go build -o UuidFromString.exe .\cmd\UuidFromString\main.go
Diese Anwendung dient zur Transformation von Shellcode-Binärdateien. Das Programm setzt voraus, dass die Eingabedatei eine Binärdatei (.bin) ist, die die Hex-Bytes des Shellcodes enthält. ShellcodeUtils kann Ihre Eingabedatei einfach Base64-kodieren oder mittels XOR, RC4 oder AES256-GCM verschlüsseln. Die Tools können auch zum Entschlüsseln von Dateien verwendet werden.
Hilfemenü von ShellcodeUtils:
-base64
Base64 encode the output. Can be used with or without encryption
-i string
Input file path of binary file
-key string
Encryption key
-mode string
Mode of operation to perform on the input file [encrypt,decrypt] (default "encrypt")
-nonce string
Nonce, in hex, used to decrypt an AES256 input file. Only used during decryption
-o string
Output file path
-salt string
Salt, in hex, used to generate an AES256 32-byte key through Argon2. Only used during decryption
-type string
The type of encryption to use [xor, aes256, rc4, null]
-v Enable verbose output
Beispiel für eine reine Base64-Kodierung der Eingabedatei und Speicherung als Textdatei:
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
Beispiel für die XOR-Verschlüsselung der Eingabedatei mit einem Schlüssel Sh3!1z UND anschließender Base64-Kodierung der Ausgabe:
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
Beispiel für die AES256-GCM-Verschlüsselung der Eingabedatei mit einem Passwort Sh3!1z OHNE Base64-Kodierung der Ausgabe:
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 erfordert einen 32-Byte-Schlüssel. Dieses Programm verwendet den Argon2-ID-Algorithmus, um aus dem mit dem Parameter -key angegebenen Passwort unter Verwendung eines zufällig generierten Salts einen 32-Byte-Schlüssel abzuleiten. Sie benötigen dasselbe Passwort und den Salt, die mit dem Argon2-Algorithmus verwendet wurden, sowie dieselbe Nonce, die mit dem AES256-Algorithmus verwendet wurde, um die Datei erfolgreich zu entschlüsseln. Alternativ könnte die Entschlüsselungsfunktion so aktualisiert werden, dass sie direkt den 32-Byte-Argon2-Schlüssel anstelle des Passworts und des Salts verwendet.
HINWEIS: Es liegt im Ermessen des Bedieners, ob er den generierten Argon2-Schlüssel oder das Passwort und den Salt, die zur Schlüsselgenerierung verwendet wurden, verwendet.
Beispiel für die AES256-Entschlüsselung der Eingabedatei:
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
Die Anwendung kann auf einem Windows-Host mit folgendem Befehl aus dem Stammverzeichnis des Projekts kompiliert werden:
set GOOS=windows GOARCH=amd64;go build -o ShellcodeUtils.exe .\cmd\ShellcodeUtils\main.go