
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