
Rust-Waffenisierung für Red-Team-Einsätze.
Meine Experimente zur Bewaffnung von Rust für die Entwicklung von Implantaten und allgemeine offensive Operationen.
mingw-Toolchain, obwohl bestimmte Bibliotheken auf anderen Betriebssystemen nicht erfolgreich kompiliert werden können.Dieses Repository stellt keine Binärdateien bereit, Sie müssen sie selbst kompilieren.
Rust installieren
Laden Sie einfach die Binärdatei herunter und installieren Sie sie.
Dieses Repository wurde in Windows 10 kompiliert, daher würde ich dabei bleiben. Wie erwähnt werden OpenSSL-Binärdateien Abhängigkeitsprobleme haben, die die Installation von OpenSSL und perl erfordern.
Für den TCP-SSL-Client/Server empfehle ich einen statischen Build aufgrund der Abhängigkeiten auf den Hosts, auf denen Sie die Binärdateien ausführen werden.
Um ein Projekt zu erstellen, führen Sie aus:
cargo new <name>
Dadurch werden automatisch die strukturierten Projektordner erstellt mit:```bash
project
├── Cargo.toml
└── src
└── main.rs
Cargo.toml ist die Datei, die die Abhängigkeiten und die Konfiguration für die Kompilierung enthält.
main.rs ist die Hauptdatei, die zusammen mit allen eventuellen Verzeichnissen, die Bibliotheken enthalten, kompiliert wird.
Um das Projekt zu kompilieren, gehe in das Projektverzeichnis und führe aus:
`cargo build`
Dies verwendet Ihre Standard-Toolchain.
Wenn Sie die finale „Release“-Version erstellen möchten, führen Sie aus:
`cargo build --release`
Für statische Binärdateien führen Sie vor dem Build-Befehl im Terminal aus:
`"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"`
`set RUSTFLAGS=-C target-feature=+crt-static`
Falls es Ihnen nicht leichtfällt, meinen Code so zu lesen, wie er geschrieben ist,
können Sie auch den folgenden Befehl innerhalb des Projektverzeichnisses verwenden, um ihn besser zu formatieren:
`cargo fmt`
Bestimmte Beispiele könnten nicht kompilieren und einen Fehler ausgeben, da sie möglicherweise eine nächtliche
Build-Version von Rust mit den neuesten Funktionen erfordern. Um diese zu installieren, führen Sie einfach aus:
`rustup default nightly`
Der einfachste Ort, um die Abhängigkeiten zu finden, oder [Crates](https://crates.io/), wie sie genannt werden.
## Cross-Compilierung
Cross-Compilierung erfordert, den Anweisungen [hier](https://rust-lang.github.io/rustup/cross-compilation.html) zu folgen.
Durch die Installation verschiedener Toolchains können Sie mit dem folgenden Befehl cross-compilieren:
`cargo build --target <toolchain>`
Um die installierten Toolchains auf Ihrem System anzuzeigen, führen Sie aus:
`rustup toolchain list`
Um alle verfügbaren Toolchains zu überprüfen, die Sie auf Ihrem System installieren können, führen Sie aus:
`rustup target list`
Um eine neue Toolchain zu installieren, führen Sie aus:
`rustup target add <toolchain_name>`
## Optimieren von ausführbaren Dateien auf Größe
Dieses [Repo](https://github.com/johnthagen/min-sized-rust) enthält viele Konfigurationsoptionen und Ideen zur Reduzierung der Dateigröße.
Statische Binärdateien sind normalerweise recht groß.
## Fallstricke, in die ich selbst geraten bin
Vorsicht vor \0-Bytes, vergessen Sie sie nicht für Strings im Speicher. Ich habe viel Zeit damit verbracht, aber windbg half immer bei der Lösung.
## Interessante Rust-Bibliotheken
- WINAPI
- [WINAPI2](https://github.com/MauriceKayser/rs-winapi2)
- Windows – Dies ist die offizielle von Microsoft, mit der ich nicht viel herumgespielt habe
## OPSEC
- Auch wenn Rust gute Vorteile bietet, ist es ziemlich schwierig, sich daran zu gewöhnen, und es ist nicht sehr intuitiv.
- Die Shellcode-Generierung ist aufgrund von LLVM ein weiteres Problem. Ich habe ein paar Möglichkeiten gefunden, dies anzugehen.
[Donut](https://github.com/TheWover/donut) erzeugt manchmal Shellcode, der funktioniert, aber je nachdem, wie das Projekt aufgebaut ist, kann es auch sein, dass er nicht funktioniert.
Im Allgemeinen sollten bei der Shellcode-Generierung die erstellten Tools so konzipiert sein, dass sie den gesamten Code im .text-Segment hosten,
was zu diesem großartigen [Repo](https://github.com/b1tg/rust-windows-shellcode) führt.
Es gibt ein Shellcode-Beispiel in diesem Projekt, das zeigen kann, wie man seinen Code für eine erfolgreiche Shellcode-Generierung strukturiert.
Darüber hinaus verfügt dieses Projekt auch über einen Shellcode-Generator, der das .text-Segment einer Binärdatei greift und
den Shellcode nach der Ausführung einiger Patches ausgibt.
Dieses Projekt greift die Binärdatei von einem bestimmten Speicherort aus, daher habe ich einen Fork erstellt, der den Pfad der Binärdatei als Argument akzeptiert [hier](https://github.com/trickster0/rust-windows-shellcode-custom).
- Selbst wenn Sie alle Debug-Symbole entfernen, kann Rust dennoch Verweise auf Ihr Home-Verzeichnis in der Binärdatei behalten. Der einzige Weg, den ich gefunden habe, um dies zu entfernen, ist die Verwendung des folgenden Flags: `--remap-path-prefix {Ihr Home-Verzeichnis}={ein zufälliger Bezeichner}`. Sie können Bash-Variablen verwenden, um Ihr Home-Verzeichnis zu erhalten und einen zufälligen Platzhalter zu generieren: `--remap-path-prefix "$HOME"="$RANDOM"`. (Von [Yamakadi](https://github.com/yamakadi))
- Obwohl es für das obige Problem eine andere Möglichkeit gibt, Informationen über das Home-Verzeichnis zu entfernen, indem Sie am Anfang der Cargo.toml hinzufügen:
`cargo-features = ["strip"]` .
Da Rust standardmäßig viele Dinge als Strings in der Binärdatei hinterlässt, verwende ich meistens diese [cargo.toml](../master/cargo.toml), um sie zu vermeiden und auch die Größe zu reduzieren,
mit dem Build-Befehl:
`cargo build --release -Z build-std=std,panic_abort -Z build-std-features=panic_immediate_abort --target x86_64-pc-windows-msvc`
- [Yamakadi] wies auch darauf hin, dass das Strippen je nach importierten Bibliotheken nicht immer konsistent beim Verstecken des Home-Verzeichnisses ist, daher wäre eine Kombination seiner Lösung zur Neuzuordnung des Pfades und der Verwendung der obigen cargo-Konfiguration am besten. Versuchen Sie, sich dessen bewusst zu sein und überprüfen Sie Ihre Binärdateien, bevor Sie sie in Ihren Engagements ausführen, auf potenzielle Strings, die nicht richtig gestrippt wurden.
## Andere Projekte, die ich in Rust erstellt habe
- [UDPlant](https://github.com/trickster0/UDPlant) – Im Grunde ein UDP-Reverse-Shell
- [EDR Detector](https://github.com/trickster0/EDR_Detector) – Erkennt die installierten EDRs des Systems anhand der installierten .sys-Dateien
- [Lenum](https://github.com/trickster0/Lenum) – Ein einfaches Unix-Enumerationstool
## Projekte in Rust, die hilfreich sein können
- [houdini](https://github.com/yamakadi/houdini) – Hilft, Ihre ausführbare Datei selbst zu löschen
| Datei | Beschreibung |
|---|
| Allocate_With_Syscalls | Es verwendet NTDLL-Funktionen direkt mit der ntapi-Bibliothek |
| Create_DLL | Erstellt eine DLL und zeigt eine MsgBox an. Rust unterstützt dies nicht vollständig, daher kann es komisch werden, da Rust-DLLs keine main-Funktion haben |
| DeviceIoControl | Öffnet ein Treiber-Handle und führt DeviceIoControl aus |
| EnableDebugPrivileges | Aktiviert SeDebugPrivilege im aktuellen Prozess |
| Shellcode_Local_inject | Führt Shellcode direkt im lokalen Prozess durch Casten eines Zeigers aus |
| Execute_With_CMD | Führt cmd durch Übergeben eines Befehls über Rust aus |
| ImportedFunctionCall | Es importiert minidump aus dbghelp und führt es aus |
| Kernel_Driver_Exploit | Kernel-Treiber-Exploit für einen einfachen Pufferüberlauf |
| Named_Pipe_Client | Named Pipe Client |
| Named_Pipe_Server | Named Pipe Server |
| PEB_Walk | Dynamisches Auflösen und Aufrufen von Windows-APIs |
| Process_Injection_CreateThread | Process Injection in einen laufenden Prozess mit CreateThread |
| Process_Injection_CreateRemoteThread | Process Injection in einen entfernten Prozess mit CreateRemoteThread |
| Process_Injection_Self_EnumSystemGeoID | Selbstinjektor, der den EnumSystemsGeoID-API-Aufruf verwendet, um Shellcode auszuführen. |
| Unhooking | Unhooking-Aufrufe |
| asm_syscall | Ermitteln der PEB-Adresse über asm |
| base64_system_enum | Base64-Kodierung/Dekodierung von Zeichenfolgen |
| http-https-requests | HTTP/S-Anfragen unter Ignorieren der Zertifikatsprüfung für GET/POST |
| patch_etw | Patch ETW |
| ppid_spoof | Spoofing des übergeordneten Prozesses für erstellten Prozess |
| tcp_ssl_client | TCP-Client mit SSL, der Zertifikatsprüfung ignoriert (Erfordert Installation von openssl und perl für die Kompilierung) |
| tcp_ssl_server | TCP-Server mit Portparameter (Erfordert Installation von openssl und perl für die Kompilierung) |
| wmi_execute | Führt WMI-Abfrage aus, um die AV/EDRs im Host zu ermitteln |
| Windows.h+ Bindings | Diese Datei enthält Strukturen von Windows.h plus vollständig angepasste LDR, PEB usw., die von Microsoft offiziell nicht dokumentiert sind. Fügen Sie am Anfang Ihrer Datei include!("../bindings.rs"); hinzu |
| UUID_Shellcode_Execution | Pflanzt Shellcode aus einem UUID-Array in den Heap-Speicher und verwendet den EnumSystemLocalesA-Callback, um den Shellcode auszuführen. |
| AMSI Bypass | AMSI-Bypass im lokalen Prozess |
| Injection_AES_Loader | NtTestAlert-Injection mit AES-Entschlüsselung |
| Litcrypt_String_Encryption | Verwendung der Litcrypt-Crate zum Verschlüsseln von Literal-Zeichenfolgen im Ruhezustand und im Speicher, um statische AV zu umgehen. |
| Api Hooking | API-Hooking mit der Detour-Bibliothek |
| memfd_create | Ausführen von Payloads aus dem Speicher mit der memfd_create-Technik (für Linux) |
| RC4_Encryption | RC4-entschlüsselter Shellcode |
| Steal Token | Token aus Prozess stehlen |
| Keyboard Hooking | Keylogging durch Hooking der Tastatur mit SetWindowsHookEx |
| memN0ps arsenal: shellcode_runner_classic-rs | Klassischer Shellcode-Runner/Injector mit ntapi |
| memN0ps arsenal: dll_injector_classic-rs | Klassische DLL-Injection mit windows-sys |
| memN0ps arsenal: module_stomping-rs | Module Stomping / Module Overloading / DLL Hollowing mit windows-sys |
| memN0ps arsenal: obfuscate_shellcode-rs | Einfacher Shellcode-XOR- und AES-Obfuskator |
| memN0ps arsenal: process_hollowing-rs | Process Hollowing mit ntapi |
| memN0ps arsenal: rdi-rs | Reflektive DLL-Injection mit windows-sys |
| memN0ps: eagle-rs | Rusty Rootkit: Windows-Kernel-Treiber in Rust für Red Teamer mit winapi und ntapi |
| memN0ps: psyscalls-rs | Rusty Parallel Syscalls-Bibliothek mit winapi |
| memN0ps: mmapper-rs | Rusty Manual Mapper mit winapi |
| memN0ps: srdi-rs | Rusty Shellcode Reflective DLL Injection mit windows-sys |
| memN0ps: mordor-rs - freshycalls_syswhispers | Rusty FreshyCalls / SysWhispers1 / SysWhispers2 / SysWhispers3-Bibliothek mit windows-sys |
| memN0ps: mordor-rs - hells_halos_tartarus_gate | Rusty Hell's Gate / Halo's Gate / Tartarus' Gate-Bibliothek mit windows-sys |
| memN0ps: pemadness-rs | Rusty Portable Executable Parsing Library (PE-Parsing-Bibliothek) mit windows-sys |
| memN0ps: mimiRust | Mimikatz in Rust erstellt von @ThottySploit. Der ursprüngliche Autor hat sein GitHub-Konto gelöscht, daher wurde es für die Community hochgeladen. |
| memN0ps and trickster0: ekko-rs | Rusty Ekko - Sleep-Obfuskation in Rust mit windows-sys. |