
Armement en Rust pour les engagements d'équipe rouge.
Mes expérimentations dans l’armement de Rust pour le développement d’implantations et les opérations offensives générales.
mingw, même si certaines bibliothèques ne peuvent pas être compilées avec succès sur d’autres OS.Ce dépôt ne fournit pas de binaires, vous devrez les compiler vous-même.
Installer Rust
Téléchargez simplement le binaire et installez-le.
Ce dépôt a été compilé sous Windows 10, je recommande donc de s’y tenir. Comme mentionné, les binaires OpenSSL auront des problèmes de dépendances qui nécessiteront l’installation d’OpenSSL et de perl.
Pour le client/serveur TCP SSL, je recommande une compilation statique en raison des dépendances sur les hôtes où vous exécuterez les binaires.
Pour créer un projet, exécutez :
cargo new <nom>
Cela créera automatiquement les dossiers structurés du projet avec :```bash
project
├── Cargo.toml
└── src
└── main.rs
Cargo.toml est le fichier qui contient les dépendances et la configuration pour la compilation.
main.rs est le fichier principal qui sera compilé avec les éventuels répertoires contenant des bibliothèques.
Pour compiler le projet, allez dans le répertoire du projet et exécutez :
`cargo build`
Cela utilisera votre chaîne d'outils par défaut.
Si vous voulez construire la version finale "release", exécutez :
`cargo build --release`
Pour les binaires statiques, avant la commande de compilation dans le terminal, exécutez :
`"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"`
`set RUSTFLAGS=-C target-feature=+crt-static`
Si vous trouvez qu'il n'est pas facile de lire mon code tel qu'il est écrit,
vous pouvez également utiliser la commande ci-dessous dans le répertoire du projet pour le formater d'une meilleure manière
`cargo fmt`
Certains exemples peuvent ne pas compiler et donner une erreur, car ils peuvent nécessiter une version
nightly de Rust avec les fonctionnalités les plus récentes. Pour l'installer, faites simplement :
`rustup default nightly`
L'endroit le plus simple pour trouver les dépendances ou [Crates](https://crates.io/) comme on les appelle.
## Compilation croisée
La compilation croisée nécessite de suivre les instructions [ici](https://rust-lang.github.io/rustup/cross-compilation.html)
En installant différentes chaînes d'outils, vous pouvez compiler de manière croisée avec la commande ci-dessous
`cargo build --target <toolchain>`
Pour voir les chaînes d'outils installées sur votre système, faites :
`rustup toolchain list`
Pour vérifier toutes les chaînes d'outils disponibles que vous pouvez installer sur votre système, faites :
`rustup target list`
Pour installer une nouvelle chaîne d'outils, faites :
`rustup target add <toolchain_name>`
## Optimisation des exécutables pour la taille
Ce [repo](https://github.com/johnthagen/min-sized-rust) contient de nombreuses options de configuration et des idées pour réduire la taille du fichier.
Les binaires statiques sont généralement assez volumineux.
## Pièges dans lesquels je suis tombé
Attention aux octets \0, ne les oubliez pas pour les chaînes en mémoire, j'ai passé beaucoup de temps dessus mais windbg m'a toujours aidé à les résoudre.
## Bibliothèques Rust intéressantes
- WINAPI
- [WINAPI2](https://github.com/MauriceKayser/rs-winapi2)
- Windows - C'est celle officielle de Microsoft avec laquelle je n'ai pas beaucoup joué
## OPSEC
- Même si Rust a de bons avantages, il est assez difficile de s'y habituer et ce n'est pas très intuitif.
- La génération de shellcode est un autre problème à cause de LLVM. J'ai trouvé quelques façons de l'aborder.
[Donut](https://github.com/TheWover/donut) génère parfois du shellcode qui fonctionne, mais selon la façon dont le projet est fait, cela peut ne pas marcher.
En général, pour la génération de shellcode, les outils créés doivent être conçus pour héberger tout le code dans le segment .text,
ce qui mène à cet incroyable [repo](https://github.com/b1tg/rust-windows-shellcode).
Il y a un exemple de shellcode dans ce projet qui peut vous montrer comment structurer votre code pour une génération réussie de shellcode.
De plus, ce projet dispose également d'un générateur de shellcode qui récupère le segment .text d'un binaire et
déverse le shellcode après avoir exécuté quelques correctifs.
Ce projet récupère le binaire à partir d'un emplacement spécifique, j'ai donc fait un fork qui reçoit le chemin du binaire comme argument [ici](https://github.com/trickster0/rust-windows-shellcode-custom).
- Même si vous supprimez tous les symboles de débogage, Rust peut toujours conserver des références à votre répertoire personnel dans le binaire. La seule façon que j'ai trouvée pour les supprimer est de passer le drapeau suivant : `--remap-path-prefix {votre répertoire personnel}={un identifiant aléatoire}`. Vous pouvez utiliser des variables bash pour obtenir votre répertoire personnel et générer un espace réservé aléatoire : `--remap-path-prefix "$HOME"="$RANDOM"`. (Par [Yamakadi](https://github.com/yamakadi))
- Bien que pour ce qui précède, il y ait une autre façon de supprimer les informations sur le répertoire personnel en ajoutant en haut du Cargo.toml
`cargo-features = ["strip"]` .
Comme Rust laisse par défaut beaucoup de choses sous forme de chaînes dans le binaire, j'utilise surtout ce [cargo.toml](../master/cargo.toml) pour les éviter et aussi réduire la taille
avec la commande de compilation
`cargo build --release -Z build-std=std,panic_abort -Z build-std-features=panic_immediate_abort --target x86_64-pc-windows-msvc`
- [Yamakadi] a également souligné que selon les bibliothèques importées, le stripping n'est pas toujours cohérent pour masquer le répertoire personnel, donc une combinaison de sa solution pour remapper le chemin et l'utilisation du cargo ci-dessus fonctionnerait le mieux. Essayez d'être conscient et vérifiez vos binaires avant de les exécuter dans vos engagements pour d'éventuelles chaînes qui ne sont pas correctement supprimées.
## Autres projets que j'ai réalisés en Rust
- [UDPlant](https://github.com/trickster0/UDPlant) - Fondamentalement un reverse shell UDP
- [EDR Detector](https://github.com/trickster0/EDR_Detector) - Détecte les EDR du système installé selon les fichiers .sys installés
- [Lenum](https://github.com/trickster0/Lenum) - Un simple outil d'énumération Unix
## Projets en Rust qui peuvent être utiles
- [houdini](https://github.com/yamakadi/houdini) - Aide à rendre votre exécutable auto-supprimant
| Fichier | Description |
|---|
| Allocate_With_Syscalls | Utilise les fonctions NTDLL directement avec la bibliothèque ntapi |
| Create_DLL | Crée une DLL et affiche une boîte de message, Rust ne supporte pas totalement cela donc les choses peuvent devenir étranges car les DLL Rust n’ont pas de fonction principale |
| DeviceIoControl | Ouvre un handle de driver et exécute DeviceIoControl |
| EnableDebugPrivileges | Active SeDebugPrivilege dans le processus courant |
| Shellcode_Local_inject | Exécute du shellcode directement dans le processus local en castant un pointeur |
| Execute_With_CMD | Exécute cmd en passant une commande via Rust |
| ImportedFunctionCall | Importe minidump depuis dbghelp et l’exécute |
| Kernel_Driver_Exploit | Exploit de driver kernel pour un simple buffer overflow |
| Named_Pipe_Client | Client de tube nommé |
| Named_Pipe_Server | Serveur de tube nommé |
| PEB_Walk | Résout et invoque dynamiquement les API Windows |
| Process_Injection_CreateThread | Injection de processus dans un processus en cours avec CreateThread |
| Process_Injection_CreateRemoteThread | Injection de processus dans un processus distant avec CreateRemoteThread |
| Process_Injection_Self_EnumSystemGeoID | Auto-injecteur utilisant l’appel API EnumSystemsGeoID pour exécuter du shellcode. |
| Unhooking | Appels de déshook |
| asm_syscall | Obtention de l’adresse PEB via asm |
| base64_system_enum | Encodage/décodage Base64 de chaînes |
| http-https-requests | Requêtes HTTP/S en ignorant la vérification du certificat pour GET/POST |
| patch_etw | Patch ETW |
| ppid_spoof | Usurpation du processus parent pour le processus créé |
| tcp_ssl_client | Client TCP avec SSL ignorant la vérification du certificat (nécessite openssl et perl pour la compilation) |
| tcp_ssl_server | Serveur TCP, avec paramètre de port (nécessite openssl et perl pour la compilation) |
| wmi_execute | Exécute une requête WMI pour obtenir les AV/EDR de l’hôte |
| Windows.h+ Bindings | Ce fichier contient les structures de Windows.h plus des LDR, PEB, etc. personnalisés complets non documentés officiellement par Microsoft, ajoutez en haut de votre fichier include!("../bindings.rs"); |
| UUID_Shellcode_Execution | Place du shellcode depuis un tableau UUID dans l’espace heap et utilise le callback EnumSystemLocalesA pour exécuter le shellcode. |
| AMSI Bypass | Contournement AMSI sur le processus local |
| Injection_AES_Loader | Injection NtTestAlert avec déchiffrement AES |
| Litcrypt_String_Encryption | Utilisation de la crate Litcrypt pour chiffrer les chaînes littérales au repos et en mémoire afin de contourner l’AV statique. |
| Api Hooking | Accrochage d’API en utilisant la bibliothèque detour |
| memfd_create | Exécution de payloads depuis la mémoire en utilisant la technique memfd_create (pour Linux) |
| RC4_Encryption | Shellcode déchiffré RC4 |
| Steal Token | Vol de jeton depuis un processus |
| Keyboard Hooking | Enregistrement des frappes par accrochage du clavier avec SetWindowsHookEx |
| memN0ps arsenal: shellcode_runner_classic-rs | Lanceur/injecteur de shellcode classique utilisant ntapi |
| memN0ps arsenal: dll_injector_classic-rs | Injection DLL classique utilisant windows-sys |
| memN0ps arsenal: module_stomping-rs | Module Stomping / Module Overloading / DLL Hollowing utilisant windows-sys |
| memN0ps arsenal: obfuscate_shellcode-rs | Obfuscateur simple de shellcode XOR et AES |
| memN0ps arsenal: process_hollowing-rs | Process Hollowing utilisant ntapi |
| memN0ps arsenal: rdi-rs | Injection DLL réfléchissante utilisant windows-sys |
| memN0ps: eagle-rs | Rusty Rootkit : pilote noyau Windows en Rust pour les red teamers utilisant winapi et ntapi |
| memN0ps: psyscalls-rs | Bibliothèque Rusty Parallel Syscalls utilisant winapi |
| memN0ps: mmapper-rs | Rusty Manual Mapper utilisant winapi |
| memN0ps: srdi-rs | Injection DLL réfléchissante de shellcode en Rust utilisant windows-sys |
| memN0ps: mordor-rs - freshycalls_syswhispers | Bibliothèque Rusty FreshyCalls / SysWhispers1 / SysWhispers2 / SysWhispers3 utilisant windows-sys |
| memN0ps: mordor-rs - hells_halos_tartarus_gate | Bibliothèque Rusty Hell's Gate / Halo's Gate / Tartarus' Gate utilisant windows-sys |
| memN0ps: pemadness-rs | Bibliothèque Rusty d’analyse d’exécutables portables (bibliothèque d’analyse PE) utilisant windows-sys |
| memN0ps: mimiRust | Mimikatz réalisé en Rust par @ThottySploit. L’auteur original a supprimé son compte GitHub, donc il a été téléchargé pour un usage communautaire. |
| memN0ps et trickster0: ekko-rs | Rusty Ekko - Obfuscation de sommeil en Rust utilisant windows-sys. |