
Вооружение на Rust для операций красной команды.
Мои эксперименты по превращению Rust в оружие для разработки имплантов и общих наступательных операций.
mingw, хотя некоторые библиотеки не удаётся успешно скомпилировать в других ОС.Этот репозиторий не предоставляет бинарные файлы, вы должны скомпилировать их сами.
Установите Rust
Просто скачайте бинарный файл и установите.
Этот репозиторий компилировался в Windows 10, так что я бы придерживался её. Как упоминалось, бинарники OpenSSL будут иметь проблемы с зависимостями, требующие установки OpenSSL и perl.
Для TCP SSL клиента/сервера рекомендую статическую сборку из-за зависимостей на хостах, где вы будете выполнять бинарники.
Для создания проекта выполните:
cargo new <имя>
Это автоматически создаст структурированные папки проекта с:```bash
project
├── Cargo.toml
└── src
└── main.rs
Cargo.toml — это файл, содержащий зависимости и конфигурацию для компиляции.
main.rs — это основной файл, который будет скомпилирован вместе с возможными каталогами, содержащими библиотеки.
Для компиляции проекта перейдите в каталог проекта и выполните:
`cargo build`
Это будет использовать вашу цепочку инструментов по умолчанию.
Если вы хотите собрать финальную «release» версию, выполните:
`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/), как они называются.
## Кросс-компиляция
Кросс-компиляция требует следования инструкциям [здесь](https://rust-lang.github.io/rustup/cross-compilation.html)
Установив различные цепочки инструментов, вы можете выполнять кросс-компиляцию с помощью следующей команды
`cargo build --target <toolchain>`
Чтобы увидеть установленные цепочки инструментов в вашей системе, выполните:
`rustup toolchain list`
Чтобы проверить все доступные для установки цепочки инструментов, выполните:
`rustup target list`
Для установки новой цепочки инструментов выполните:
`rustup target add <toolchain_name>`
## Оптимизация исполняемых файлов по размеру
Этот [репозиторий](https://github.com/johnthagen/min-sized-rust) содержит множество опций конфигурации и идей по уменьшению размера файла.
Статические двоичные файлы обычно довольно большие.
## Ловушки, в которые я сам попадал
Остерегайтесь нулевых байтов, не забывайте их для строк в памяти. Я потратил много времени, но windbg всегда помогал решить эту проблему.
## Интересные библиотеки Rust
- 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 {ваш домашний каталог}={случайный идентификатор}`. Вы можете использовать переменные 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] также указал, что в зависимости от импортированных библиотек, stripping не всегда последовательно скрывает домашний каталог, поэтому комбинация его решения с переназначением пути и использования вышеуказанного cargo будет работать лучше. Постарайтесь быть внимательными и проверять свои двоичные файлы перед запуском в ваших миссиях на предмет потенциальных строк, которые не были удалены должным образом.
## Другие проекты, которые я сделал на Rust
- [UDPlant](https://github.com/trickster0/UDPlant) — По сути, UDP-обратный шелл
- [EDR Detector](https://github.com/trickster0/EDR_Detector) — Обнаруживает EDR установленной системы по установленным .sys файлам
- [Lenum](https://github.com/trickster0/Lenum) — Простой инструмент для перечисления в Unix
## Полезные проекты на Rust
- [houdini](https://github.com/yamakadi/houdini) — Помогает сделать ваш исполняемый файл самоудаляемым
| Файл | Описание |
|---|
| Allocate_With_Syscalls | Использует функции NTDLL напрямую с библиотекой ntapi |
| Create_DLL | Создаёт DLL и показывает окно сообщения; Rust не полностью поддерживает это, так что возможны странности, так как DLL на Rust не имеют функции main |
| DeviceIoControl | Открывает дескриптор драйвера и выполняет DeviceIoControl |
| EnableDebugPrivileges | Включает привилегию SeDebugPrivilege в текущем процессе |
| Shellcode_Local_inject | Выполняет шеллкод непосредственно в локальном процессе, используя приведение указателя |
| Execute_With_CMD | Выполняет cmd, передавая команду через Rust |
| ImportedFunctionCall | Импортирует minidump из dbghelp и выполняет его |
| 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 | Самоинжектор, использующий вызов API EnumSystemGeoID для запуска шеллкода |
| Unhooking | Вызовы unhooking |
| asm_syscall | Получение адреса PEB через ассемблер |
| base64_system_enum | Кодирование/декодирование строк в Base64 |
| http-https-requests | HTTP/S запросы с игнорированием проверки сертификата для GET/POST |
| patch_etw | Патч ETW |
| ppid_spoof | Подмена родительского процесса для созданного процесса |
| tcp_ssl_client | TCP-клиент с SSL, игнорирующий проверку сертификата (требуется установка openssl и perl для компиляции) |
| tcp_ssl_server | TCP-сервер с параметром порта (требуется установка openssl и perl для компиляции) |
| wmi_execute | Выполняет WMI-запрос для получения AV/EDR на хосте |
| Windows.h+ Bindings | Этот файл содержит структуры Windows.h, а также полные пользовательские LDR, PEB и т.д., официально не документированные Microsoft; добавьте в начало вашего файла include!("../bindings.rs"); |
| UUID_Shellcode_Execution | Помещает шеллкод из массива UUID в пространство кучи и использует обратный вызов EnumSystemLocalesA для выполнения шеллкода |
| AMSI Bypass | Обход AMSI в локальном процессе |
| Injection_AES_Loader | Внедрение через NtTestAlert с дешифрованием AES |
| Litcrypt_String_Encryption | Использование крейта Litcrypt для шифрования строковых литералов в покое и в памяти для обхода статического AV |
| Api Hooking | Перехват API с использованием библиотеки detour |
| 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 | Классическое внедрение DLL с использованием windows-sys |
| memN0ps arsenal: module_stomping-rs | Module Stomping / Module Overloading / DLL Hollowing с использованием windows-sys |
| memN0ps arsenal: obfuscate_shellcode-rs | Простой обфускатор шеллкода XOR и AES |
| memN0ps arsenal: process_hollowing-rs | Process Hollowing с использованием ntapi |
| memN0ps arsenal: rdi-rs | Рефлективное внедрение DLL с использованием windows-sys |
| memN0ps: eagle-rs | Rusty Rootkit: драйвер ядра Windows на Rust для Red Team с использованием winapi и ntapi |
| memN0ps: psyscalls-rs | Библиотека параллельных системных вызовов на Rust с использованием winapi |
| memN0ps: mmapper-rs | Ручной маппер на Rust с использованием winapi |
| memN0ps: srdi-rs | Рефлективное внедрение DLL через шеллкод на Rust с использованием windows-sys |
| memN0ps: mordor-rs — freshycalls_syswhispers | Библиотека FreshyCalls / SysWhispers1 / SysWhispers2 / SysWhispers3 на Rust с использованием windows-sys |
| memN0ps: mordor-rs — hells_halos_tartarus_gate | Библиотека Hell's Gate / Halo's Gate / Tartarus' Gate на Rust с использованием windows-sys |
| memN0ps: pemadness-rs | Библиотека разбора переносимых исполняемых файлов (PE Parsing Library) на Rust с использованием windows-sys |
| memN0ps: mimiRust | Mimikatz, написанный на Rust от @ThottySploit. Оригинальный автор удалил свой аккаунт на GitHub, поэтому выложен для сообщества. |
| memN0ps и trickster0: ekko-rs | Rusty Ekko — обфускация сна в Rust с использованием windows-sys. |