
Репозиторий раннеров Windows Shellcode и вспомогательных утилит. Приложения загружают и выполняют Shellcode с использованием различных вызовов API или техник.
go-shellcode — это репозиторий, содержащий загрузчики шелл-кода для Windows и вспомогательные утилиты. Приложения загружают и выполняют шелл-код с использованием различных вызовов API или техник.
Доступные загрузчики шелл-кода:
Это приложение использует функцию Windows CreateFiber из библиотеки Kernel32.dll для выполнения шелл-кода в процессе этого приложения. Это полезно, когда нужно избежать внедрения в удаленный процесс и вызова CreateThread. Приложение НЕ использует функции из пакета golang.org/x/sys/windows. Наиболее существенное отличие заключается в том, что это приложение само загружает все необходимые DLL и процедуры и использует функцию Call() процедуры.
ПРИМЕЧАНИЕ: Я не нашел способа завершить процесс, и вам придется завершить его вручную.
Приложение можно скомпилировать следующей командой на хосте Windows из корневого каталога проекта:
set GOOS=windows GOARCH=amd64;go build -o CreateFiber.exe .\cmd\CreateFiber\main.go
Это приложение использует функцию Windows CreateProcess из Kernel32.dll. Процесс создается в приостановленном состоянии, AddressOfEntryPoint в структуре IMAGE_OPTIONAL_HEADER обновляется для выполнения шелл-кода в дочернем процессе, после чего процесс возобновляется. Это разновидность полого процесса (process hollowing), но существующий PE НЕ отображается из памяти, а ThreadContext НЕ обновляется. Архитектура предоставленного шелл-кода (т.е. x86 или x64) должна соответствовать архитектуре дочернего процесса.
Приложение можно скомпилировать следующей командой на хосте Windows из корневого каталога проекта:
set GOOS=windows GOARCH=amd64;go build -o CreateProcess.exe .\cmd\CreateProcess\main.go
Это приложение использует функцию Windows CreateProcess из Kernel32.dll. Процесс создается в приостановленном состоянии, AddressOfEntryPoint в структуре IMAGE_OPTIONAL_HEADER обновляется для выполнения шелл-кода в дочернем процессе, после чего процесс возобновляется. Это разновидность полого процесса (process hollowing), но существующий PE НЕ отображается из памяти, а ThreadContext НЕ обновляется. Архитектура предоставленного шелл-кода (т.е. x86 или x64) должна соответствовать архитектуре дочернего процесса.
Это приложение отличается от CreateProcess тем, что оно собирает все данные, записанные в STDOUT или STDERR дочернего процесса, и возвращает их родительскому процессу. Данные собираются с помощью функции CreatePipe для создания анонимного канала, по которому взаимодействуют родительский и дочерний процессы. Это полезно при использовании таких инструментов, как Donut, для выполнения .NET-сборки в дочернем процессе в виде шелл-кода и получения вывода выполненной программы. Следующая команда может быть использована для генерации позиционно-независимого шелл-кода для запуска Seatbelt с помощью Donut v0.9.3:
.\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
Это приложение использует функцию Windows CreateRemoteThread из Kernel32.dll для выполнения шелл-кода в удаленном процессе. Приложение требует, чтобы целевой процесс для внедрения уже был запущен. Идентификатор целевого процесса (PID) может быть указан во время выполнения для тестирования с помощью флага командной строки -pid. Захардкодьте PID в следующей строке кода для оперативного использования, заменив 0 на целевой 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
Это приложение использует функцию Windows CreateRemoteThread из Kernel32.dll для выполнения шелл-кода в удаленном процессе. Приложение требует, чтобы целевой процесс для внедрения уже был запущен. Идентификатор целевого процесса (PID) может быть указан во время выполнения для тестирования с помощью флага командной строки -pid. Захардкодьте PID в следующей строке кода для оперативного использования, заменив 0 на целевой 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
Это приложение использует функцию Windows CreateThread из Kernel32.dll для выполнения шелл-кода в процессе этого приложения. Это полезно, когда нужно избежать внедрения в удаленный процесс. Приложение использует функции из пакета golang.org/x/sys/windows, где это возможно, например, windows.VirtualAlloc(). Приложение можно скомпилировать следующей командой на хосте Windows из корневого каталога проекта:
set GOOS=windows GOARCH=amd64;go build -o CreateThread.exe .\cmd\CreateThread\main.go
Это приложение использует функцию Windows CreateThread из Kernel32.dll для выполнения шелл-кода в процессе этого приложения. Это полезно, когда нужно избежать внедрения в удаленный процесс. Это приложение НЕ использует функции из пакета 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 смогут перехватить функции для поддержки обнаружения. Ссылка: New 'Early Bird' Code Injection Technique Discovered. Приложение можно скомпилировать следующей командой на хосте Windows из корневого каталога проекта:
export GOOS=windows GOARCH=amd64;go build -o goEarlyBird.exe cmd\EarlyBird\main.go
Это приложение использует функцию Windows EtwpCreateEtwThread из ntdll.dll для выполнения шелл-кода в процессе этого приложения. Оригинальная работа от TheWover. Это полезно, когда нужно избежать внедрения в удаленный процесс. Это приложение НЕ использует функции из пакета golang.org/x/sys/windows. Наиболее существенное отличие заключается в том, что это приложение само загружает все необходимые DLL и процедуры и использует функцию Call() процедуры. Приложение можно скомпилировать следующей командой на хосте Windows из корневого каталога проекта:
set GOOS=windows GOARCH=amd64;go build -o EtwpCreateEtwThread.exe .\cmd\EtwpCreateEtwThread\main.go
Это приложение использует недокументированную функцию NtQueueApcThreadEx для создания "Специального APC пользователя" в текущем потоке текущего процесса для выполнения шелл-кода. Поскольку шелл-код загружается и выполняется в текущем процессе, он является "локальным". Этот же метод может быть использован и для удаленного процесса. ПРИМЕЧАНИЕ: Работает только в Windows 7 и более поздних версиях. Ссылка: APC Series: User APC API.
export GOOS=windows GOARCH=amd64;go build -o goNtQueueApcThreadEx-Local.exe cmd\NtQueueApcThreadEx-Local\main.go
Это приложение использует функцию Windows RtlCreateUserThread из ntdll.dll для выполнения шелл-кода в удаленном процессе. Приложение требует, чтобы целевой процесс для внедрения уже был запущен. Идентификатор целевого процесса (PID) может быть указан во время выполнения для тестирования с помощью флага командной строки -pid. Захардкодьте PID в следующей строке кода для оперативного использования, заменив 0 на целевой 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 RtlCreateUserThread.exe .\cmd\RtlCreateUserThread\main.go
Это приложение выполняет шелл-код в текущем запущенном процессе, выполняя системный вызов (syscall) на точку входа шелл-кода. Это приложение НЕ использует функции из пакета golang.org/x/sys/windows. Приложение можно скомпилировать следующей командой на хосте Windows из корневого каталога проекта:
set GOOS=windows GOARCH=amd64;go build -o Syscall.exe .\cmd\Syscall\main.go
Это приложение использует функцию Windows UuidFromStringA для загрузки шелл-кода по адресу памяти, а затем вызывает функцию EnumSystemLocalesA для выполнения шелл-кода. Этот метод загрузки и выполнения шелл-кода был взят из статьи nccgroup RIFT: Analysing a Lazarus Shellcode Execution Method. В этом приложении память выделяется в куче, и оно не использует VirtualAlloc. Приложение можно скомпилировать следующей командой на хосте Windows из корневого каталога проекта:
set GOOS=windows GOARCH=amd64;go build -o UuidFromString.exe .\cmd\UuidFromString\main.go
Это приложение используется для преобразования двоичных файлов шелл-кода. Программа требует, чтобы входной файл был двоичным файлом (.bin), содержащим шестнадцатеричные байты шелл-кода. ShellcodeUtils может просто кодировать входной файл в base64 или шифровать его с помощью XOR, RC4 или AES256-GCM. Инструменты также могут использоваться для расшифровки файлов.
Меню справки 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
Пример только кодирования base64 входного файла и сохранения его в текстовый файл:
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
Пример шифрования XOR входного файла с ключом Sh3!1z И кодированием base64 вывода:
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
Пример шифрования AES256-GCM входного файла с паролем Sh3!1z БЕЗ кодирования base64:
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 требует 32-байтовый ключ. Эта программа использует алгоритм Argon2 ID для получения 32-байтового ключа из пароля, указанного с помощью параметра ввода -key, используя случайно сгенерированную соль. Для успешной расшифровки файла потребуются тот же входной пароль, соль, использованная в алгоритме Argon2, и тот же nonce, использованный в алгоритме AES256. В качестве альтернативы, функция расшифровки может быть обновлена для использования только 32-байтового ключа Argon2 вместо входного пароля и соли.
ПРИМЕЧАНИЕ: Оператор решает, использовать ли сгенерированный ключ Argon2 или пароль и соль, которые используются для генерации пароля.
Пример расшифровки AES256 входного файла:
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
Приложение можно скомпилировать следующей командой на хосте Windows из корневого каталога проекта:
set GOOS=windows GOARCH=amd64;go build -o ShellcodeUtils.exe .\cmd\ShellcodeUtils\main.go