
Sickle - Payload Development Kit

Sickle é uma ferramenta que desenvolvi originalmente para me ajudar a ser mais eficaz, tanto no desenvolvimento quanto na compreensão de shellcode. No entanto, ao longo do seu desenvolvimento e uso, ela evoluiu para um kit de desenvolvimento de payloads. Embora os módulos atuais sejam voltados principalmente para assembly, esta ferramenta não se limita a shellcode.
Atualmente, o Sickle pode auxiliar no seguinte:
O Sickle suporta geração de shellcode por meio do Keystone Engine. Por ser um recurso adicionado recentemente, o suporte a payloads é limitado. No entanto, o objetivo é adicionar um reverse shell básico para cada arquitetura e plataforma.

O Sickle inclui um módulo de "diffing" inicialmente projetado para analisar stubs de shellcode. O modo "asm" original realiza diffs de desmontagem linear tanto no nível da linguagem assembly quanto no nível dos opcodes, separadamente.

Além disso, o Sickle oferece vários modos para realizar diffs, tornando-o útil além do desenvolvimento de shellcode.

Uma tarefa comum que você pode realizar com frequência é testar seu shellcode. Esse processo normalmente envolve as seguintes etapas:
Embora essas etapas possam parecer simples, elas podem se tornar demoradas quando repetidas. O Sickle simplifica o processo ao envolver automaticamente o shellcode para testes rápidos, e o módulo "run" atualmente suporta sistemas Windows e Unix.

O Sickle também pode converter um arquivo binário em opcodes extraídos (shellcode) e, em seguida, traduzi-los em instruções de máquina (assembly). Observe que esse processo funciona apenas com arquivos binários brutos e atualmente realiza a desmontagem de forma linear por meio do Capstone.

No exemplo mostrado acima, o módulo "disassemble" desmonta um reverse shell projetado por Stephen Fewer para assembly.
A extração de shellcode foi o primeiro módulo, ou melhor, a funcionalidade principal do Sickle, pois os opcodes são interpretados de forma diferente dependendo do wrapper utilizado. O JavaScript, por exemplo, não armazena e interpreta shellcode da mesma forma que um programa em C faria.

Talvez a maior inspiração para isso tenha sido o msfvenom.
Embora menos comum em exploits de 64 bits, pode haver casos em que um exploit restrinja o uso de determinados caracteres. É aí que o módulo "pinpoint" se destaca, pois identifica e realça diretamente as instruções de assembly responsáveis pelo(s) caractere(s) inválido(s) identificado(s).

Originalmente, esta ferramenta começou como um único script grande. No entanto, à medida que evoluiu, precisei reaprender o código a cada atualização. Para resolver isso, o Sickle agora segue uma abordagem modular, permitindo que novas funcionalidades sejam adicionadas com tempo mínimo gasto reaprendendo o design da ferramenta.
$ sickle-pdk -l
Shellcode Ring Description
--------- ---- -----------
windows/x64/virtualalloc_exec_tcp 3 A lightweight stager that connects to a handler via TCP over IPv4 to receive and execute shellcode
windows/x64/egghunter 3 Egghunter based on Hell's Gate and NtProtectVirtualMemory
windows/x64/virtualalloc_exec_https 3 A lightweight stager that connects to a handler over HTTPS to receive and execute shellcode
windows/x64/exec 3 Executes a command on the target host
windows/x64/reflective_pe_loader 3 Stageless Reflective PE Loader that takes an x64 binary and executes it in memory
windows/x64/shell_reverse_tcp 3 Reverse Shell via TCP over IPv4 that provides an interactive cmd.exe session
windows/aarch64/shell_reverse_tcp 3 Reverse Shell via TCP over IPv4 that provides an interactive cmd.exe session
windows/x86/shell_reverse_tcp 3 Reverse shell via TCP over IPv4 that provides an interactive cmd.exe session
windows/x64/kernel_token_stealer 0 Token stealing shellcode for privilege escalation
windows/x64/kernel_sysret 0 Generic method of returning from kernel space to user space
windows/x64/kernel_ace_edit 0 SID entry modifier for process injection
windows/x86/kernel_token_stealer 0 Token stealing shellcode for privilege escalation
linux/x64/memfd_reflective_elf_tcp 3 Staged Reflective ELF Loader via TCP over IPV4 which executes an ELF from a remote server
linux/aarch64/memfd_reflective_elf_tcp 3 Staged Reflective ELF Loader via TCP over IPv4 which executes an ELF from a remote server handler
linux/aarch64/shell_reverse_tcp 3 Reverse Shell via TCP over IPv4 that provides an interactive /bin/sh session
linux/x86/execve 3 Executes a shell session such as /bin/sh
linux/x86/shell_reverse_tcp 3 Reverse shell via TCP over IPV4 that provides an interactive /bin/sh session
Architectures
-------------
aarch64
x64
x86
Modules Description
------- -----------
disassemble Simple linear disassembler for multiple architectures
handler Module for handling payload distribution and session management
asm_shell Interactive assembler and disassembler
diff Bytecode diffing module for comparing two binaries (or shellcode)
pinpoint Highlights opcodes within a disassembly to identify instructions responsible for bad characters
run Wrapper used for executing bytecode (shellcode)
format Converts bytecode into a respective format (activated anytime '-f' is used)
badchar Produces a set of all potential invalid characters for validation purposes
Format Description
------ -----------
perl Format bytecode for Perl
python Format bytecode for Python
hex_space Format bytecode in hex, seperated by a space
nasm Format bytecode for NASM
java Format bytecode for Java
javascript Format bytecode for Javascript (Blob to send via XHR)
escaped Format bytecode for one-liner hex escape paste
rust Format bytecode for a Rust application
uint8array Format bytecode for Javascript as a Uint8Array directly
bash Format bytecode for bash script (UNIX)
powershell Format bytecode for Powershell
cs Format bytecode for C#
dword Format bytecode in dword
c Format bytecode for a C application
raw Format bytecode to be written to stdout in raw form
ruby Format bytecode for Ruby
num Format bytecode in num format
hex Format bytecode in hex
python3 Format bytecode for Python3
Essa abordagem permite que cada módulo gere documentação detalhada sobre sua funcionalidade.
$ sickle-pdk -m run -i
Usage information for run
Name: Shellcode Runner
Module: run
Architecture: Multi
Platform: Multi
Ring: 3
Author(s):
wetw0rk
Tested against:
Linux
Windows
Module Description:
Executes bytecode from a binary file (-r) or a payload module (-p) under the context
of the currently running operating system and architecture. Meaning if you are
running on AARCH64 bytecode will be interpreted as such and if you're on x64 it will
interpret it as x64 respectively.
Example:
/usr/local/bin/sickle-pdk -m run -r shellcode
Essa abordagem também inclui documentação para stubs de shellcode.
$ sickle-pdk -p windows/x64/egghunter -i
Usage information for windows/x64/egghunter
Name: Windows (x64) Hell's Gate based Egghunter
Module: windows/x64/egghunter
Architecture: x64
Platform: windows
Ring: 3
Author(s):
hvictor
Tested against:
Windows 11 (10.0.26100 N/A Build 26100)
Argument Information:
Name Description Optional
---- ----------- --------
TAG Egg (provide 4 bytes) yes
Module Description:
This egghunter iterates virtual memory addresses and before searching for the egg, it
performs a NtProtectVirtualMemory system call. This system call is similar to
VirtualProtect, and is parameterized to set the memory to be scanned to READ, WRITE,
EXECUTE. This way, when the egg is found, the shellcode after it is guaranteed to be
executable.
Example:
/usr/local/bin/sickle-pdk -p windows/x64/egghunter TAG=w00t