
Un repository di esecutori di Windows Shellcode e utilità di supporto. Le applicazioni caricano ed eseguono Shellcode utilizzando varie chiamate API o tecniche.
go-shellcode è un repository di runner di Shellcode per Windows e utility di supporto. Le applicazioni caricano ed eseguono Shellcode utilizzando varie chiamate API o tecniche.
I runner di Shellcode disponibili includono:
Questa applicazione sfrutta la funzione Windows CreateFiber di Kernel32.dll per eseguire shellcode all'interno del processo di questa applicazione. È utile quando si vuole evitare l'iniezione in processi remoti e si vuole evitare di chiamare CreateThread. Questa applicazione NON utilizza funzioni del pacchetto golang.org/x/sys/windows. La differenza più significativa è che questa applicazione carica da sé tutte le DLL e le Procedure necessarie e utilizza la funzione Call() della procedura.
NOTA: Non ho ancora trovato un modo per far uscire il processo e sarà necessario terminarlo manualmente.
L'applicazione può essere compilata con il seguente comando su un host Windows dalla directory root del progetto:
set GOOS=windows GOARCH=amd64;go build -o CreateFiber.exe .\cmd\CreateFiber\main.go
Questa applicazione sfrutta la funzione Windows CreateProcess di Kernel32.dll. Il processo viene creato in uno stato sospeso, l'AddressOfEntryPoint nella struttura IMAGE_OPTIONAL_HEADER viene aggiornato per eseguire shellcode nel processo figlio, e poi il processo viene ripreso. Questo è un tipo di process hollowing ma il PE esistente NON viene smappato e il ThreadContext NON viene aggiornato. L'architettura dello shellcode fornito (es. x86 o x64) deve corrispondere all'architettura del processo figlio.
L'applicazione può essere compilata con il seguente comando su un host Windows dalla directory root del progetto:
set GOOS=windows GOARCH=amd64;go build -o CreateProcess.exe .\cmd\CreateProcess\main.go
Questa applicazione sfrutta la funzione Windows CreateProcess di Kernel32.dll. Il processo viene creato in uno stato sospeso, l'AddressOfEntryPoint nella struttura IMAGE_OPTIONAL_HEADER viene aggiornato per eseguire shellcode nel processo figlio, e poi il processo viene ripreso. Questo è un tipo di process hollowing ma il PE esistente NON viene smappato e il ThreadContext NON viene aggiornato. L'architettura dello shellcode fornito (es. x86 o x64) deve corrispondere all'architettura del processo figlio.
Questa applicazione si differenzia da CreateProcess perché raccoglie tutti i dati scritti su STDOUT o STDERR nel processo figlio e li restituisce al processo padre. I dati vengono raccolti utilizzando la funzione CreatePipe per creare una pipe anonima tramite cui il processo padre e quello figlio comunicano. Ciò è utile quando si utilizzano strumenti come Donut per eseguire un assembly .NET in un processo figlio come shellcode e recuperare l'output del programma eseguito. Il seguente comando può essere utilizzato per generare shellcode indipendente dalla posizione per eseguire Seatbelt con 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'applicazione può essere compilata con il seguente comando su un host Windows dalla directory root del progetto:
set GOOS=windows GOARCH=amd64;go build -o CreateProcessWithPipe.exe .\cmd\CreateProcessWithPipe\main.go
Questa applicazione sfrutta la funzione Windows CreateRemoteThread di Kernel32.dll per eseguire shellcode in un processo remoto. L'applicazione richiede che il processo di destinazione in cui iniettare sia già in esecuzione. L'identificativo del processo (PID) di destinazione può essere fornito in fase di esecuzione per i test utilizzando il flag -pid della riga di comando. Per l'uso operativo, codificare il PID nella seguente riga di codice sostituendo 0 con il PID di destinazione:
pid := flag.Int("pid", 0, "Process ID to inject shellcode into")
Questa applicazione utilizza funzioni del pacchetto golang.org/x/sys/windows, ove possibile, come windows.OpenProcess(). L'applicazione può essere compilata con il seguente comando su un host Windows dalla directory root del progetto:
set GOOS=windows GOARCH=amd64;go build -o CreateRemoteThread.exe .\cmd\CreateRemoteThread\main.go
Questa applicazione sfrutta la funzione Windows CreateRemoteThread di Kernel32.dll per eseguire shellcode in un processo remoto. L'applicazione richiede che il processo di destinazione in cui iniettare sia già in esecuzione. L'identificativo del processo (PID) di destinazione può essere fornito in fase di esecuzione per i test utilizzando il flag -pid della riga di comando. Per l'uso operativo, codificare il PID nella seguente riga di codice sostituendo 0 con il PID di destinazione:
pid := flag.Int("pid", 0, "Process ID to inject shellcode into")
Questa applicazione NON utilizza funzioni del pacchetto golang.org/x/sys/windows. La differenza più significativa è che questa applicazione carica da sé tutte le DLL e le Procedure necessarie e utilizza la funzione Call() della procedura. L'applicazione può essere compilata con il seguente comando su un host Windows dalla directory root del progetto:
set GOOS=windows GOARCH=amd64;go build -o CreateRemoteThreadNative.exe .\cmd\CreateRemoteThreadNative\main.go
Questa applicazione sfrutta la funzione Windows CreateThread di Kernel32.dll per eseguire shellcode all'interno del processo di questa applicazione. È utile quando si vuole evitare l'iniezione in processi remoti. Questa applicazione utilizza funzioni del pacchetto golang.org/x/sys/windows, ove possibile, come windows.VirtualAlloc(). L'applicazione può essere compilata con il seguente comando su un host Windows dalla directory root del progetto:
set GOOS=windows GOARCH=amd64;go build -o CreateThread.exe .\cmd\CreateThread\main.go