
レッドチームエンゲージメントのためのRust武器化
Rust をインプラント開発や一般的な攻撃操作に活用するための実験用リポジトリです。
mingw ツールチェーンをインストールするだけで済む(ただし、一部のライブラリは他の OS では正常にコンパイルできない場合がある)このリポジトリではバイナリを提供していません。自分でコンパイルする必要があります。
Rust をインストールする
バイナリをダウンロードしてインストールするだけです。
このリポジトリは Windows 10 でコンパイルされましたので、そちらを使用することをお勧めします。前述の通り、OpenSSL バイナリは OpenSSL と Perl のインストールを必要とする依存関係の問題が発生します。
TCP SSL クライアント/サーバーについては、実行先のホストに依存するため、静的ビルドを推奨します。
プロジェクトを作成するには、以下を実行します。
cargo new <名前>
これにより、以下の構造化されたプロジェクトフォルダが自動的に作成されます。```bash
project
├── Cargo.toml
└── src
└── main.rs
Cargo.toml は、依存関係とコンパイルの構成を含むファイルです。main.rs は、ライブラリを含む可能性のあるディレクトリとともにコンパイルされるメインファイルです。
プロジェクトをコンパイルするには、プロジェクトディレクトリに移動して次を実行します:
`cargo build`
これにより、デフォルトのツールチェーンが使用されます。
最終的な「リリース」バージョンをビルドする場合は、次を実行します:
`cargo build --release`
静的バイナリの場合は、ビルドコマンドの前にターミナルで次を実行します:
`"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"`
`set RUSTFLAGS=-C target-feature=+crt-static`
コードの書き方が読みにくいと感じた場合は、プロジェクトディレクトリ内で以下のコマンドを使用して、より良い形式にフォーマットすることもできます
`cargo fmt`
一部の例は、Rustの最新機能を備えたナイトリービルドが必要なため、コンパイルできずエラーが発生する可能性があります。インストールするには次のようにします:
`rustup default nightly`
依存関係(または [Crates](https://crates.io/) と呼ばれるもの)を見つける最も簡単な場所。
## Cross Compiling
クロスコンパイルには、[ここ](https://rust-lang.github.io/rustup/cross-compilation.html)の指示に従う必要があります。
異なるツールチェーンをインストールすることで、以下のコマンドでクロスコンパイルできます:
`cargo build --target <toolchain>`
システムにインストールされているツールチェーンを表示するには:
`rustup toolchain list`
システムにインストール可能なすべてのツールチェーンを確認するには:
`rustup target list`
新しいツールチェーンをインストールするには:
`rustup target add <toolchain_name>`
## Optimizing executables for size
この[リポジトリ](https://github.com/johnthagen/min-sized-rust)には、ファイルサイズを削減するための多くの構成オプションとアイデアが含まれています。
静的バイナリは通常かなり大きくなります。
## Pitfalls I found myself falling into
\0 バイトに注意してください。メモリ内の文字列ではそれらを忘れないでください。多くの時間を費やしましたが、windbg が常に解決に役立ちました。
## Interesting Rust libraries
- WINAPI
- [WINAPI2](https://github.com/MauriceKayser/rs-winapi2)
- Windows - これは Microsoft 公式のもので、あまり触っていません
## OPSEC
- Rust には良い利点がありますが、それに慣れるのはかなり難しく、直感的ではありません。
- シェルコード生成は LLVM による別の問題です。これに取り組むいくつかの方法を見つけました。
[Donut](https://github.com/TheWover/donut) は時々動作するシェルコードを生成しますが、プロジェクトの作り方によっては動作しない場合があります。
一般に、シェルコード生成のために作成されるツールは、すべてのコードを .text セグメントに配置するように作られるべきであり、それがこの素晴らしい[リポジトリ](https://github.com/b1tg/rust-windows-shellcode)につながります。
このプロジェクトには、シェルコード生成を成功させるためにコードを構造化する方法を示すシェルコードのサンプルがあります。
さらに、このプロジェクトには、バイナリの .text セグメントを取得し、いくつかのパッチを実行した後にシェルコードをダンプするシェルコードジェネレータもあります。
このプロジェクトは特定の場所からバイナリを取得するため、バイナリのパスを引数として受け取るフォークを作成しました[こちら](https://github.com/trickster0/rust-windows-shellcode-custom)。
- すべてのデバッグシンボルを削除しても、Rust はバイナリ内にホームディレクトリへの参照を保持することがあります。これを削除する唯一の方法として、次のフラグを渡すことです: `--remap-path-prefix {your home directory}={some random identifier}`。Bash変数を使用してホームディレクトリを取得し、ランダムなプレースホルダを生成できます: `--remap-path-prefix "$HOME"="$RANDOM"`。([Yamakadi](https://github.com/yamakadi) より)
- 上記の方法に加えて、Cargo.toml の先頭に `cargo-features = ["strip"]` を追加することで、ホームディレクトリに関する情報を削除する別の方法があります。
Rust はデフォルトで多くのものをバイナリ内に文字列として残すため、私は主にこの [cargo.toml](../master/cargo.toml) を使用してそれらを回避し、ビルドコマンド
`cargo build --release -Z build-std=std,panic_abort -Z build-std-features=panic_immediate_abort --target x86_64-pc-windows-msvc`
- [Yamakadi] 氏はまた、インポートされたライブラリによっては、ストリップがホームディレクトリを隠すことに関して一貫していない可能性があると指摘しています。そのため、パスを再マッピングする彼の解決策と上記の cargo 設定を組み合わせるのが最善でしょう。バイナリを実行する前に、適切にストリップされていない可能性のある文字列がないか確認するように注意してください。
## Other projects I have have made in Rust
- [UDPlant](https://github.com/trickster0/UDPlant) - 基本的にUDPリバースシェル
- [EDR Detector](https://github.com/trickster0/EDR_Detector) - インストールされている.sysファイルに基づいて、システムのEDRを検出します
- [Lenum](https://github.com/trickster0/Lenum) - シンプルなUnix列挙ツール
## Projects in Rust that can be hepfull
- [houdini](https://github.com/yamakadi/houdini) - 実行ファイルの自己削除を支援します
| ファイル | 説明 |
|---|
| Allocate_With_Syscalls | ntapi ライブラリを使用して NTDLL 関数を直接呼び出す |
| Create_DLL | DLL を作成してメッセージボックスを表示する。Rust は DLL に main 関数がないため、この機能を完全にはサポートしておらず、動作が不安定になる可能性がある |
| DeviceIoControl | ドライバハンドルを開いて DeviceIoControl を実行する |
| EnableDebugPrivileges | 現在のプロセスで SeDebugPrivilege を有効にする |
| Shellcode_Local_inject | ポインタをキャストして、ローカルプロセス内でシェルコードを直接実行する |
| Execute_With_CMD | Rust を介してコマンドを渡し、cmd を実行する |
| ImportedFunctionCall | dbghelp から minidump をインポートして実行する |
| Kernel_Driver_Exploit | シンプルなバッファオーバーフローを利用したカーネルドライバのエクスプロイト |
| Named_Pipe_Client | 名前付きパイプのクライアント |
| Named_Pipe_Server | 名前付きパイプのサーバー |
| PEB_Walk | Windows API を動的に解決して呼び出す |
| Process_Injection_CreateThread | 実行中のプロセスに CreateThread でプロセスインジェクションを行う |
| Process_Injection_CreateRemoteThread | リモートプロセスに CreateRemoteThread でプロセスインジェクションを行う |
| Process_Injection_Self_EnumSystemGeoID | EnumSystemsGeoID API 呼び出しを使用してシェルコードを実行するセルフインジェクター |
| Unhooking | フックの解除 |
| asm_syscall | アセンブリを使用して PEB アドレスを取得する |
| base64_system_enum | Base64 エンコード/デコード文字列 |
| http-https-requests | 証明書チェックを無視して HTTP/S リクエスト(GET/POST) |
| patch_etw | ETW をパッチする |
| ppid_spoof | 作成したプロセスの親プロセスを偽装する |
| tcp_ssl_client | 証明書チェックを無視する SSL 対応 TCP クライアント(コンパイルには OpenSSL と Perl のインストールが必要) |
| tcp_ssl_server | ポートパラメータ付き TCP サーバー(コンパイルには OpenSSL と Perl のインストールが必要) |
| wmi_execute | WMI クエリを実行してホスト上の AV/EDR を取得する |
| Windows.h+ Bindings | このファイルには Windows.h の構造体と、Microsoft が公式に文書化していないカスタマイズされた LDR、PEB などが含まれています。ファイルの先頭に include!("../bindings.rs"); を追加してください。 |
| UUID_Shellcode_Execution | UUID 配列からシェルコードをヒープ領域に配置し、EnumSystemLocalesA コールバックを使用してシェルコードを実行する |
| AMSI Bypass | ローカルプロセスでの AMSI バイパス |
| Injection_AES_Loader | AES 復号化による NtTestAlert インジェクション |
| Litcrypt_String_Encryption | Litcrypt クレートを使用して、静的 AV を無効化するためにリテラル文字列を保存時およびメモリ内で暗号化する |
| Api Hooking | detour ライブラリを使用した API フッキング |
| memfd_create | memfd_create テクニックを使用してメモリからペイロードを実行する(Linux 用) |
| RC4_Encryption | RC4 復号化されたシェルコード |
| Steal Token | プロセスからトークンを奪取する |
| Keyboard Hooking | SetWindowsHookEx を使用したキーボードフックによるキーロギング |
| memN0ps arsenal: shellcode_runner_classic-rs | ntapi を使用したクラシックなシェルコードランナー/インジェクター |
| memN0ps arsenal: dll_injector_classic-rs | windows-sys を使用したクラシックな DLL インジェクション |
| memN0ps arsenal: module_stomping-rs | windows-sys を使用したモジュールストンピング / モジュールオーバーローディング / DLL ホロウイング |
| memN0ps arsenal: obfuscate_shellcode-rs | シンプルなシェルコード XOR および AES 難読化ツール |
| memN0ps arsenal: process_hollowing-rs | ntapi を使用したプロセスハローイング |
| memN0ps arsenal: rdi-rs | windows-sys を使用したリフレクティブ DLL インジェクション |
| memN0ps: eagle-rs | Rusty Rootkit: Red Team 向け Rust による Windows カーネルドライバ。winapi と ntapi を使用 |
| memN0ps: psyscalls-rs | winapi を使用した Rusty パラレルシステムコールライブラリ |
| memN0ps: mmapper-rs | winapi を使用した Rusty マニュアルマッパー |
| memN0ps: srdi-rs | windows-sys を使用した Rusty シェルコードリフレクティブ DLL インジェクション |
| memN0ps: mordor-rs - freshycalls_syswhispers | windows-sys を使用した Rusty FreshyCalls / SysWhispers1 / SysWhispers2 / SysWhispers3 ライブラリ |
| memN0ps: mordor-rs - hells_halos_tartarus_gate | windows-sys を使用した Rusty Hell's Gate / Halo's Gate / Tartarus' Gate ライブラリ |
| memN0ps: pemadness-rs | windows-sys を使用した Rusty Portable Executable パースライブラリ(PE パースライブラリ) |
| memN0ps: mimiRust | @ThottySploit による Rust 製 Mimikatz。原作者が GitHub アカウントを削除したため、コミュニティ用にアップロードされています。 |
| memN0ps and trickster0: ekko-rs | Rusty Ekko - windows-sys を使用した Rust によるスリープ難読化 |