
Weaponização em Rust para Engajamentos de Red Team.
Meus experimentos em armazenar Rust para desenvolvimento de implantes e operações ofensivas em geral.
mingw, embora algumas bibliotecas não possam ser compiladas com sucesso em outros SOs.Este repositório não fornece binários, você terá que compilá-los você mesmo.
Instale o Rust
Simplesmente baixe o binário e instale.
Este repositório foi compilado no Windows 10, então eu recomendo manter-se nele. Como mencionado, binários OpenSSL terão problemas de dependência que exigirão a instalação de OpenSSL e perl.
Para o cliente/servidor TCP SSL, recomendo build estático devido às dependências nos hosts onde você executará os binários.
Para criar um projeto, execute:
cargo new <nome>
Isso criará automaticamente as pastas do projeto estruturadas com:```bash
project
├── Cargo.toml
└── src
└── main.rs
Cargo.toml é o arquivo que contém as dependências e a configuração para a compilação.
main.rs é o arquivo principal que será compilado junto com quaisquer diretórios potenciais que contenham bibliotecas.
Para compilar o projeto, vá até o diretório do projeto e execute:
`cargo build`
Isto usará sua toolchain padrão.
Se quiser compilar a versão final "release", execute:
`cargo build --release`
Para binários estáticos, no terminal antes do comando de compilação execute:
`"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"`
`set RUSTFLAGS=-C target-feature=+crt-static`
Caso não seja fácil para você ler meu código da forma como está escrito,
você também pode usar o comando abaixo dentro do diretório do projeto para formatá-lo de uma maneira melhor:
`cargo fmt`
Certos exemplos podem não compilar e causar algum erro, pois podem exigir uma versão nightly
do Rust com as funcionalidades mais recentes. Para instalá-la, basta fazer:
`rustup default nightly`
O lugar mais fácil para encontrar as dependências ou [Crates](https://crates.io/) como são chamadas.
## Compilação Cruzada
A compilação cruzada requer seguir as instruções [aqui](https://rust-lang.github.io/rustup/cross-compilation.html).
Instalando diferentes toolchains, você pode compilar de forma cruzada com o comando abaixo:
`cargo build --target <toolchain>`
Para ver as toolchains instaladas no seu sistema, faça:
`rustup toolchain list`
Para verificar todas as toolchains disponíveis que você pode instalar no seu sistema, faça:
`rustup target list`
Para instalar uma nova toolchain, faça:
`rustup target add <toolchain_name>`
## Otimizando executáveis para tamanho
Este [repositório](https://github.com/johnthagen/min-sized-rust) contém muitas opções de configuração e ideias sobre como reduzir o tamanho do arquivo.
Binários estáticos costumam ser bastante grandes.
## Armadilhas nas quais me vi caindo
Cuidado com bytes \0, não os esqueça para strings na memória; passei muito tempo nisso, mas o windbg sempre ajudou a resolver.
## Bibliotecas interessantes do Rust
- WINAPI
- [WINAPI2](https://github.com/MauriceKayser/rs-winapi2)
- Windows - Esta é a oficial da Microsoft com a qual não brinquei muito
## OPSEC
- Embora Rust tenha boas vantagens, é bastante difícil se acostumar com ele e não é muito intuitivo.
- A geração de shellcode é outro problema devido ao LLVM. Encontrei algumas maneiras de abordar isso.
[Donut](https://github.com/TheWover/donut) às vezes gera shellcode que funciona, mas dependendo de como o projeto é feito, pode não funcionar.
Em geral, para geração de shellcode, as ferramentas que são feitas devem ser feitas para hospedar todo o código no segmento .text,
o que leva a este incrível [repositório](https://github.com/b1tg/rust-windows-shellcode).
Há um exemplo de shellcode neste projeto que pode mostrar como estruturar seu código para uma geração de shellcode bem-sucedida.
Além disso, este projeto também possui um gerador de shellcode que captura o segmento .text de um binário e
despeja o shellcode após executar alguns patches.
Este projeto captura o binário de um local específico, então fiz um fork que recebe o caminho do binário como argumento [aqui](https://github.com/trickster0/rust-windows-shellcode-custom).
- Mesmo se você remover todos os símbolos de depuração, Rust ainda pode manter referências ao seu diretório home no binário. A única maneira que encontrei para remover isso é passar a seguinte flag: `--remap-path-prefix {seu diretório home}={algum identificador aleatório}`. Você pode usar variáveis bash para obter seu diretório home e gerar um placeholder aleatório: `--remap-path-prefix "$HOME"="$RANDOM"`. (Por [Yamakadi](https://github.com/yamakadi))
- Embora para o acima exista outra maneira de remover informações sobre o diretório home, adicionando no topo do Cargo.toml
`cargo-features = ["strip"]` .
Como o Rust, por padrão, deixa muitas coisas como strings no binário, geralmente uso este [cargo.toml](../master/cargo.toml) para evitá-las e também reduzir o tamanho
com o comando de compilação
`cargo build --release -Z build-std=std,panic_abort -Z build-std-features=panic_immediate_abort --target x86_64-pc-windows-msvc`
- [Yamakadi] também apontou que, dependendo das bibliotecas importadas, a remoção nem sempre é consistente para ocultar o diretório home, então uma combinação da solução dele para remapear o caminho e usar o cargo acima funcionaria melhor. Tente estar ciente e verifique seus binários antes de executá-los em seus engajamentos para possíveis strings que não são removidas adequadamente.
## Outros projetos que fiz em Rust
- [UDPlant](https://github.com/trickster0/UDPlant) - Basicamente um reverse shell UDP
- [EDR Detector](https://github.com/trickster0/EDR_Detector) - Detecta os EDRs do sistema instalado de acordo com os arquivos .sys instalados
- [Lenum](https://github.com/trickster0/Lenum) - Uma ferramenta simples de enumeração Unix
## Projetos em Rust que podem ser úteis
- [houdini](https://github.com/yamakadi/houdini) - Ajuda a tornar seu executável auto-excluível
| Arquivo | Descrição |
|---|
| Allocate_With_Syscalls | Utiliza funções NTDLL diretamente com a biblioteca ntapi |
| Create_DLL | Cria DLL e exibe uma msgbox, Rust não suporta isso totalmente, então as coisas podem ficar estranhas, já que DLLs Rust não têm uma função main |
| DeviceIoControl | Abre handle do driver e executa DeviceIoControl |
| EnableDebugPrivileges | Habilita SeDebugPrivilege no processo atual |
| Shellcode_Local_inject | Executa shellcode diretamente no processo local através de ponteiro |
| Execute_With_CMD | Executa cmd passando um comando via Rust |
| ImportedFunctionCall | Importa minidump do dbghelp e executa |
| Kernel_Driver_Exploit | Exploit de driver de kernel para um buffer overflow simples |
| Named_Pipe_Client | Cliente de Pipe Nomeado |
| Named_Pipe_Server | Servidor de Pipe Nomeado |
| PEB_Walk | Resolve e invoca APIs do Windows dinamicamente |
| Process_Injection_CreateThread | Injeção de processo em processo em execução com CreateThread |
| Process_Injection_CreateRemoteThread | Injeção de processo em processo remoto com CreateRemoteThread |
| Process_Injection_Self_EnumSystemGeoID | Auto-injetor que usa a chamada de API EnumSystemsGeoID para executar shellcode. |
| Unhooking | Chamadas de desvinculação |
| asm_syscall | Obtenção do endereço PEB via asm |
| base64_system_enum | Codificação/decodificação de strings Base64 |
| http-https-requests | Requisições HTTP/S ignorando verificação de certificado para GET/POST |
| patch_etw | Patch no ETW |
| ppid_spoof | Spoof do processo pai para processo criado |
| tcp_ssl_client | Cliente TCP com SSL que ignora verificação de certificado (Requer openssl e perl instalados para compilação) |
| tcp_ssl_server | Servidor TCP, com parâmetro de porta (Requer openssl e perl instalados para compilação) |
| wmi_execute | Executa consulta WMI para obter os AVs/EDRs no host |
| Windows.h+ Bindings | Este arquivo contém estruturas do Windows.h mais LDR, PEB, etc. personalizados e não documentados oficialmente pela Microsoft. Adicione no topo do seu arquivo include!("../bindings.rs"); |
| UUID_Shellcode_Execution | Planta shellcode de um array UUID no espaço heap e usa o callback EnumSystemLocalesA para executar o shellcode. |
| AMSI Bypass | Bypass do AMSI no Processo Local |
| Injection_AES_Loader | Injeção NtTestAlert com descriptografia AES |
| Litcrypt_String_Encryption | Usando o crate Litcrypt para criptografar strings literais em repouso e em memória para derrotar AV estático. |
| Api Hooking | Hooking de API usando a biblioteca detour |
| memfd_create | Executa payloads da memória usando a técnica memfd_create (Para Linux) |
| RC4_Encryption | Shellcode descriptografado com RC4 |
| Steal Token | Roubo de Token de Processo |
| Keyboard Hooking | Keylogging por hooking do teclado com SetWindowsHookEx |
| memN0ps arsenal: shellcode_runner_classic-rs | Runner/injetor clássico de shellcode usando ntapi |
| memN0ps arsenal: dll_injector_classic-rs | Injeção clássica de DLL usando windows-sys |
| memN0ps arsenal: module_stomping-rs | Module Stomping / Module Overloading / DLL Hollowing usando windows-sys |
| memN0ps arsenal: obfuscate_shellcode-rs | Obfuscador simples de shellcode XOR e AES |
| memN0ps arsenal: process_hollowing-rs | Process Hollowing usando ntapi |
| memN0ps arsenal: rdi-rs | Injeção reflexiva de DLL usando windows-sys |
| memN0ps: eagle-rs | Rootkit Rusty: Driver de kernel do Windows em Rust para Red Teamers usando winapi e ntapi |
| memN0ps: psyscalls-rs | Biblioteca Rusty de syscalls paralelas usando winapi |
| memN0ps: mmapper-rs | Mapeador manual Rusty usando winapi |
| memN0ps: srdi-rs | Injeção reflexiva de shellcode DLL Rusty usando windows-sys |
| memN0ps: mordor-rs - freshycalls_syswhispers | Biblioteca Rusty FreshyCalls / SysWhispers1 / SysWhispers2 / SysWhispers3 usando windows-sys |
| memN0ps: mordor-rs - hells_halos_tartarus_gate | Biblioteca Rusty Hell's Gate / Halo's Gate / Tartarus' Gate usando windows-sys |
| memN0ps: pemadness-rs | Biblioteca Rusty de parsing de Portable Executable (Biblioteca de Parsing PE) usando windows-sys |
| memN0ps: mimiRust | Mimikatz feito em Rust por @ThottySploit. O autor original deletou sua conta no GitHub, então foi enviado para uso da comunidade. |
| memN0ps e trickster0: ekko-rs | Rusty Ekko - Ofuscação de sono em Rust usando windows-sys. |