
Windows Shellcode 실행기 및 지원 유틸리티의 저장소입니다. 이 애플리케이션들은 다양한 API 호출 또는 기법을 사용하여 Shellcode를 로드하고 실행합니다.
go-shellcode는 Windows 셸코드 실행 도구(runner)와 보조 유틸리티의 저장소입니다. 이 애플리케이션들은 다양한 API 호출 또는 기법을 사용하여 셸코드를 로드하고 실행합니다.
사용 가능한 셸코드 실행 도구는 다음과 같습니다:
이 애플리케이션은 Kernel32.dll의 Windows CreateFiber 함수를 활용하여 현재 애플리케이션의 프로세스 내에서 셸코드를 실행합니다. 원격 프로세스 인젝션을 피하고 CreateThread 호출을 피하려는 경우 유용합니다. 이 애플리케이션은 golang.org/x/sys/windows 패키지의 함수를 사용하지 않습니다. 가장 큰 차이점은 필요한 모든 DLL과 프로시저를 자체적으로 로드하고 프로시저의 Call() 함수를 사용한다는 점입니다.
참고: 프로세스를 종료하는 방법을 찾지 못했으며, 수동으로 종료해야 합니다.
이 애플리케이션은 Windows 호스트에서 프로젝트 루트 디렉터리에서 다음 명령으로 컴파일할 수 있습니다:
set GOOS=windows GOARCH=amd64;go build -o CreateFiber.exe .\cmd\CreateFiber\main.go
이 애플리케이션은 Kernel32.dll의 Windows CreateProcess 함수를 활용합니다. 프로세스는 일시 중단(suspended) 상태로 생성되고, IMAGE_OPTIONAL_HEADER 구조체의 AddressOfEntryPoint가 자식 프로세스에서 셸코드를 실행하도록 업데이트된 후 프로세스가 재개됩니다. 이는 프로세스 할로잉(process hollowing)의 한 유형이지만 기존 PE는 매핑 해제되지 않으며 ThreadContext는 업데이트되지 않습니다. 제공된 셸코드 아키텍처(x86 또는 x64)는 자식 프로세스의 아키텍처와 일치해야 합니다.
이 애플리케이션은 Windows 호스트에서 프로젝트 루트 디렉터리에서 다음 명령으로 컴파일할 수 있습니다:
set GOOS=windows GOARCH=amd64;go build -o CreateProcess.exe .\cmd\CreateProcess\main.go
이 애플리케이션은 Kernel32.dll의 Windows CreateProcess 함수를 활용합니다. 프로세스는 일시 중단(suspended) 상태로 생성되고, IMAGE_OPTIONAL_HEADER 구조체의 AddressOfEntryPoint가 자식 프로세스에서 셸코드를 실행하도록 업데이트된 후 프로세스가 재개됩니다. 이는 프로세스 할로잉(process hollowing)의 한 유형이지만 기존 PE는 매핑 해제되지 않으며 ThreadContext는 업데이트되지 않습니다. 제공된 셸코드 아키텍처(x86 또는 x64)는 자식 프로세스의 아키텍처와 일치해야 합니다.
이 애플리케이션은 CreateProcess와 다른 점은 자식 프로세스에서 STDOUT 또는 STDERR로 작성된 모든 데이터를 수집하여 부모 프로세스로 반환한다는 것입니다. 데이터는 CreatePipe 함수를 사용하여 익명 파이프를 생성하여 부모와 자식 프로세스가 통신하도록 함으로써 수집됩니다. 이는 Donut과 같은 도구를 사용하여 .NET 어셈블리를 자식 프로세스에서 셸코드로 실행하고 실행된 프로그램의 출력을 검색할 때 유용합니다. 다음 명령을 사용하여 Donut v0.9.3으로 Seatbelt를 실행하는 위치 독립적 셸코드를 생성할 수 있습니다:
.\donut.exe -o donut_v0.9.3_Seatbelt.bin -x 2 -c Seatbelt.Program -m Main -p "ARPTable" Seatbelt.exe
이 애플리케이션은 Windows 호스트에서 프로젝트 루트 디렉터리에서 다음 명령으로 컴파일할 수 있습니다:
set GOOS=windows GOARCH=amd64;go build -o CreateProcessWithPipe.exe .\cmd\CreateProcessWithPipe\main.go
이 애플리케이션은 Kernel32.dll의 Windows CreateRemoteThread 함수를 활용하여 원격 프로세스에서 셸코드를 실행합니다. 이 애플리케이션은 주입할 대상 프로세스가 이미 실행 중이어야 합니다. 테스트를 위해 -pid 명령줄 플래그를 사용하여 대상 프로세스 ID(PID)를 런타임에 제공할 수 있습니다. 운영 목적으로는 다음 코드 줄에서 0을 대상 PID로 바꿔 PID를 하드코딩하십시오:
pid := flag.Int("pid", 0, "Process ID to inject shellcode into")
이 애플리케이션은 가능한 경우 golang.org/x/sys/windows 패키지의 함수(예: windows.OpenProcess())를 활용합니다. 이 애플리케이션은 Windows 호스트에서 프로젝트 루트 디렉터리에서 다음 명령으로 컴파일할 수 있습니다:
set GOOS=windows GOARCH=amd64;go build -o CreateRemoteThread.exe .\cmd\CreateRemoteThread\main.go
이 애플리케이션은 Kernel32.dll의 Windows CreateRemoteThread 함수를 활용하여 원격 프로세스에서 셸코드를 실행합니다. 이 애플리케이션은 주입할 대상 프로세스가 이미 실행 중이어야 합니다. 테스트를 위해 -pid 명령줄 플래그를 사용하여 대상 프로세스 ID(PID)를 런타임에 제공할 수 있습니다. 운영 목적으로는 다음 코드 줄에서 0을 대상 PID로 바꿔 PID를 하드코딩하십시오:
pid := flag.Int("pid", 0, "Process ID to inject shellcode into")
이 애플리케이션은 golang.org/x/sys/windows 패키지의 함수를 사용하지 않습니다. 가장 큰 차이점은 필요한 모든 DLL과 프로시저를 자체적으로 로드하고 프로시저의 Call() 함수를 사용한다는 점입니다. 이 애플리케이션은 Windows 호스트에서 프로젝트 루트 디렉터리에서 다음 명령으로 컴파일할 수 있습니다:
set GOOS=windows GOARCH=amd64;go build -o CreateRemoteThreadNative.exe .\cmd\CreateRemoteThreadNative\main.go
이 애플리케이션은 Kernel32.dll의 Windows CreateThread 함수를 활용하여 현재 애플리케이션의 프로세스 내에서 셸코드를 실행합니다. 원격 프로세스 인젝션을 피하려는 경우 유용합니다. 이 애플리케이션은 가능한 경우 golang.org/x/sys/windows 패키지의 함수(예: windows.VirtualAlloc())를 활용합니다. 이 애플리케이션은 Windows 호스트에서 프로젝트 루트 디렉터리에서 다음 명령으로 컴파일할 수 있습니다:
set GOOS=windows GOARCH=amd64;go build -o CreateThread.exe .\cmd\CreateThread\main.go
이 애플리케이션은 Kernel32.dll의 Windows CreateThread 함수를 활용하여 현재 애플리케이션의 프로세스 내에서 셸코드를 실행합니다. 원격 프로세스 인젝션을 피하려는 경우 유용합니다. 이 애플리케이션은 golang.org/x/sys/windows 패키지의 함수를 사용하지 않습니다. 가장 큰 차이점은 필요한 모든 DLL과 프로시저를 자체적으로 로드하고 프로시저의 Call() 함수를 사용한다는 점입니다. 이 애플리케이션은 Windows 호스트에서 프로젝트 루트 디렉터리에서 다음 명령으로 컴파일할 수 있습니다:
set GOOS=windows GOARCH=amd64;go build -o CreateThreadNative.exe .\cmd\CreateThreadNative\main.go
이 애플리케이션은 Windows CreateProcess 함수를 사용하여 프로세스를 일시 중단 상태로 만듭니다. 자식 프로세스가 일시 중단되면 Windows QueueUserAPC 함수를 사용하여 할당된 셸코드를 가리키는 UserAPC를 자식 프로세스에 추가합니다. 그런 다음 ResumeThread가 호출되고, 이어서 문서화되지 않은 NtTestAlert 함수가 호출되어 생성된 UserAPC를 실행하고 결과적으로 셸코드를 실행합니다. 이는 AV/EDR이 감지를 지원하기 위해 함수를 후킹(hook)하기 전에 셸코드가 실행되므로 유용합니다. 참고: New 'Early Bird' Code Injection Technique Discovered. 이 애플리케이션은 Windows 호스트에서 프로젝트 루트 디렉터리에서 다음 명령으로 컴파일할 수 있습니다:
export GOOS=windows GOARCH=amd64;go build -o goEarlyBird.exe cmd\EarlyBird\main.go
이 애플리케이션은 ntdll.dll의 Windows EtwpCreateEtwThread 함수를 활용하여 현재 애플리케이션의 프로세스 내에서 셸코드를 실행합니다. 원본 작업은 TheWover입니다. 원격 프로세스 인젝션을 피하려는 경우 유용합니다. 이 애플리케이션은 golang.org/x/sys/windows 패키지의 함수를 사용하지 않습니다. 가장 큰 차이점은 필요한 모든 DLL과 프로시저를 자체적으로 로드하고 프로시저의 Call() 함수를 사용한다는 점입니다. 이 애플리케이션은 Windows 호스트에서 프로젝트 루트 디렉터리에서 다음 명령으로 컴파일할 수 있습니다:
set GOOS=windows GOARCH=amd64;go build -o EtwpCreateEtwThread.exe .\cmd\EtwpCreateEtwThread\main.go
이 애플리케이션은 문서화되지 않은 NtQueueApcThreadEx를 사용하여 현재 프로세스의 현재 스레드에 "Special User APC"를 생성하여 셸코드를 실행합니다. 셸코드가 현재 프로세스에 로드되고 실행되므로 "로컬"입니다. 동일한 기술을 원격 프로세스에도 사용할 수 있습니다. 참고: 이는 Windows 7 이상에서만 작동합니다. 참고: APC Series: User APC API.