
Инструмент для сбора данных Active Directory для BloodHound Legacy, написанный на Rust. 🦀
Эта версия совместима только с BloodHound Legacy 4.x
Версия, совместимая с BloodHound Community Edition (CE), доступна здесь RustHound-CE.
Не все функции SharpHound реализованы. Некоторые существуют в RustHound и отсутствуют в SharpHound или BloodHound-Python. Пожалуйста, обратитесь к плану развития для получения дополнительной информации.
RustHound — это кроссплатформенный инструмент сбора данных для BloodHound, написанный на Rust, что делает его совместимым с Linux, Windows и macOS.
Без обнаружения антивирусом и кросскомпилирован.
RustHound генерирует JSON-файлы пользователей, групп, компьютеров, подразделений, GPO, контейнеров и доменов, которые можно анализировать с помощью BloodHound.
💡 Если вы можете использовать SharpHound, используйте его. Используйте RustHound как запасное решение, если SharpHound обнаруживается антивирусом или несовместим с вашей ОС.
Вы можете использовать команду make для установки RustHound или его компиляции под Linux или Windows.
make install
rusthound -h
Больше команд в Makefile:
Default:
usage: make install
usage: make uninstall
usage: make debug
usage: make release
Static:
usage: make windows
usage: make windows_x64
usage: make windows_x86
usage: make linux_aarch64
usage: make linux_x86_64
usage: make linux_musl
usage: make macos
usage: make arm_musl
usage: make armv7
Without cli argument:
usage: make windows_noargs
Dependencies:
usage: make install_windows_deps
usage: make install_linux_musl_deps
usage: make install_macos_deps
Используйте RustHound с Docker, чтобы быть уверенным в наличии всех зависимостей.
docker build --rm -t rusthound .
# Затем
docker run --rm -v ./:/usr/src/rusthound rusthound windows
docker run --rm -v ./:/usr/src/rusthound rusthound linux_musl
docker run --rm -v ./:/usr/src/rusthound rusthound macos
Вам нужно установить Rust в вашу систему.
https://www.rust-lang.org/fr/tools/install
RustHound поддерживает Kerberos и GSSAPI. Поэтому ему требуются Clang и его библиотеки разработки, а также библиотеки разработки Kerberos. На Debian и Ubuntu это означает clang-N, libclang-N-dev и libkrb5-dev.
Например:
# Debian/Ubuntu
sudo apt-get -y update && sudo apt-get -y install gcc clang libclang-dev libgssapi-krb5-2 libkrb5-dev libsasl2-modules-gssapi-mit musl-tools gcc-mingw-w64-x86-64
Вот как скомпилировать версии "release" и "debug" с помощью команды cargo.
git clone https://github.com/OPENCYBER-FR/RustHound
cd RustHound
cargo build --release
# или debug версия
cargo b
Результат можно найти в папке target/release или target/debug.
Ниже приведена методология компиляции для каждой ОС из Linux. Если вам нужна другая система компиляции, пожалуйста, обратитесь к списку по этой ссылке: https://doc.rust-lang.org/nightly/rustc/platform-support.html
# Установка rustup и Cargo для Linux
curl https://sh.rustup.rs -sSf | sh
# Добавление зависимостей Linux
rustup install stable-x86_64-unknown-linux-gnu
rustup target add x86_64-unknown-linux-gnu
# Статическая компиляция для Linux
git clone https://github.com/OPENCYBER-FR/RustHound
cd RustHound
CFLAGS="-lrt";LDFLAGS="-lrt";RUSTFLAGS='-C target-feature=+crt-static';cargo build --release --target x86_64-unknown-linux-gnu
Результат можно найти в папке target/x86_64-unknown-linux-gnu/release.
# Установка rustup и Cargo в Linux
curl https://sh.rustup.rs -sSf | sh
# Добавление зависимостей Windows
rustup install stable-x86_64-pc-windows-gnu
rustup target add x86_64-pc-windows-gnu
# Статическая компиляция для Windows
git clone https://github.com/OPENCYBER-FR/RustHound
cd RustHound
RUSTFLAGS="-C target-feature=+crt-static" cargo build --release --target x86_64-pc-windows-gnu
Результат можно найти в папке target/x86_64-pc-windows-gnu/release.
Отличная документация: https://wapl.es/rust/2019/02/17/rust-cross-compile-linux-to-macos.html
# Установка rustup и Cargo в Linux
curl https://sh.rustup.rs -sSf | sh
# Добавление цепочки инструментов macOS
sudo git clone https://github.com/tpoechtrager/osxcross /usr/local/bin/osxcross
sudo wget -P /usr/local/bin/osxcross/ -nc https://s3.dockerproject.org/darwin/v2/MacOSX10.10.sdk.tar.xz && sudo mv /usr/local/bin/osxcross/MacOSX10.10.sdk.tar.xz /usr/local/bin/osxcross/tarballs/
sudo UNATTENDED=yes OSX_VERSION_MIN=10.7 /usr/local/bin/osxcross/build.sh
sudo chmod 775 /usr/local/bin/osxcross/ -R
export PATH="/usr/local/bin/osxcross/target/bin:$PATH"
# Cargo необходимо указать правильный линковщик для цели x86_64-apple-darwin, добавьте следующее в файл .cargo/config вашего проекта:
grep 'target.x86_64-apple-darwin' ~/.cargo/config || echo "[target.x86_64-apple-darwin]" >> ~/.cargo/config
grep 'linker = "x86_64-apple-darwin14-clang"' ~/.cargo/config || echo 'linker = "x86_64-apple-darwin14-clang"' >> ~/.cargo/config
grep 'ar = "x86_64-apple-darwin14-clang"' ~/.cargo/config || echo 'ar = "x86_64-apple-darwin14-clang"' >> ~/.cargo/config
# Статическая компиляция для macOS
git clone https://github.com/OPENCYBER-FR/RustHound
cd RustHound
RUSTFLAGS="-C target-feature=+crt-static" cargo build --release --target x86_64-apple-darwin --features nogssapi
Результат можно найти в папке target/x86_64-apple-darwin/release.
💡 Для получения оптимизированной компиляции RustHound добавьте следующие параметры компиляции в конец файла
Cargo.toml.
[profile.release]
opt-level = "z"
lto = true
strip = true
codegen-units = 1
panic = "abort"
Размер бинарного файла будет значительно уменьшен. Можно использовать стандартные команды компилятора cargo.
make windows
Дополнительная информация здесь
git clone https://github.com/OPENCYBER-FR/RustHound
cd RustHound
cargo doc --open --no-deps
Usage: rusthound [OPTIONS] --domain <domain>
Options:
-v... Установить уровень подробности вывода
-h, --help Вывести справку
-V, --version Вывести информацию о версии
ОБЯЗАТЕЛЬНЫЕ ЗНАЧЕНИЯ:
-d, --domain <domain> Имя домена, например: DOMAIN.LOCAL
НЕОБЯЗАТЕЛЬНЫЕ ЗНАЧЕНИЯ:
-u, --ldapusername <ldapusername> Имя пользователя LDAP, например: [email protected]
-p, --ldappassword <ldappassword> Пароль LDAP
-f, --ldapfqdn <ldapfqdn> Полное доменное имя контроллера домена, например: DC01.DOMAIN.LOCAL или просто DC01
-i, --ldapip <ldapip> IP-адрес контроллера домена, например: 192.168.1.10
-P, --ldapport <ldapport> Порт LDAP [по умолчанию: 389]
-n, --name-server <name-server> Альтернативный IP-адрес сервера имён для DNS-запросов
-o, --output <output> Директория вывода для сохранения JSON-файлов [по умолчанию: ./]
НЕОБЯЗАТЕЛЬНЫЕ ФЛАГИ:
--ldaps Принудительно использовать LDAPS для запроса, например: ldaps://DOMAIN.LOCAL/
--dns-tcp Использовать TCP вместо UDP для DNS-запросов
--dc-only Собирает данные только с контроллера домена. Не будет пытаться получить конфигурацию/безопасность ЦС или проверить веб-регистрацию
--old-bloodhound Только для ADCS. Вывод результата как данных BloodHound для оригинальной версии BloodHound от @BloodHoundAD без поддержки PKI
-z, --zip Сжать JSON-файлы в zip-архив
НЕОБЯЗАТЕЛЬНЫЕ МОДУЛИ:
--fqdn-resolver Использовать модуль fqdn-resolver для получения IP-адресов компьютеров
--adcs Использовать модуль ADCS для перечисления шаблонов сертификатов, центров сертификации и других конфигураций.
(Для специальной сборки BloodHound от @ly4k с поддержкой PKI)
Примеры выполнены на GOADv2, реализованной mayfly:
# Linux с username:password
rusthound -d north.sevenkingdoms.local -u '[email protected]' -p '_L0ngCl@w_' -o /tmp/demo -z
# Linux с username:password и ldapip
rusthound -d north.sevenkingdoms.local -i 192.168.56.11 -u '[email protected]' -p '_L0ngCl@w_' -o /tmp/demo -z
# Linux с username:password и ldaps
rusthound -d north.sevenkingdoms.local --ldaps -u '[email protected]' -p '_L0ngCl@w_' -o /tmp/demo -z
# Linux с username:password и ldaps и пользовательским портом
rusthound -d north.sevenkingdoms.local --ldaps -P 3636 -u '[email protected]' -p '_L0ngCl@w_' -o /tmp/demo -z
# Совет: перенаправить и стандартный вывод, и стандартную ошибку в файл > /tmp/rh_output 2>&1
rusthound -d north.sevenkingdoms.local --ldaps -u '[email protected]' -p '_L0ngCl@w_' -o /tmp/demo --fqdn-resolver > /tmp/rh_output 2>&1
# Windows с сессией GSSAPI
rusthound.exe -d sevenkingdoms.local --ldapfqdn kingslanding
# Windows простое bind-соединение username:password (не используйте одинарные или двойные кавычки в cmd.exe)
rusthound.exe -d sevenkingdoms.local -u [email protected] -p _L0ngCl@w_ -o output -z
# Аутентификация Kerberos (Linux)
export KRB5CCNAME="/tmp/jeor.mormont.ccache"
rusthound -d sevenkingdoms.local -f kingslanding -k -z
# Аутентификация Kerberos (Windows)
rusthound.exe -d sevenkingdoms.local -f kingslanding -k -z
# Linux с username:password и модулем FQDN resolver
rusthound -d essos.local -u '[email protected]' -p 'BurnThemAll!' -o /tmp/demo --fqdn-resolver -z
# Linux с username:password и ldaps и модулем FQDN resolver и TCP DNS запросом и пользовательским сервером имён
rusthound -d essos.local --ldaps -u '[email protected]' -p 'BurnThemAll!' -o /tmp/demo --fqdn-resolver --tcp-dns --name-server 192.168.56.12 -z
# Windows с сессией GSSAPI и модулем FQDN resolver
rusthound.exe -d essos.local -f meereen -o output --fqdn-resolver -z
# Windows простое bind-соединение username:password и модулем FQDN resolver и TCP DNS запросом и пользовательским сервером имён (не используйте одинарные или двойные кавычки в cmd.exe)
rusthound.exe -d essos.local -u [email protected] -p BurnThemAll! -o output -z --fqdn-resolver --tcp-dns --name-server 192.168.56.12
Пример с использованием версии @ly4k BloodHound.
# Linux с username:password и модулем ADCS для версии @ly4k BloodHound
rusthound -d essos.local -u '[email protected]' -p 'BurnThemAll!' -o /tmp/adcs --adcs -z
# Linux с username:password и модулем ADCS и флагом dconly (не будет проверять веб-регистрацию)
rusthound -d essos.local -u '[email protected]' -p 'BurnThemAll!' -o /tmp/adcs --adcs --dc-only -z
# Linux с username:password и модулем ADCS с использованием аргумента "--old-bloodhound" для официальной версии @BloodHoundAd
rusthound -d essos.local -u '[email protected]' -p 'BurnThemAll!' -o /tmp/adcs --adcs --old-bloodhound -z
# Windows с сессией GSSAPI и модулем ADCS
rusthound.exe -d essos.local -f meereen -o output -z --adcs
# Windows с сессией GSSAPI и модулем ADCS и TCP DNS запросом и пользовательским сервером имён
rusthound.exe -d essos.local --ldapfqdn meereen -o output -z --adcs --tcp-dns --name-server 192.168.56.12
# Windows простое bind-соединение username:password (не используйте одинарные или двойные кавычки в cmd.exe)
rusthound.exe -d essos.local -u [email protected] -p BurnThemAll! -o output -z --adcs --dc-only
Пользовательские запросы, использованные в демонстрации, можно найти в папке ресурсов.
Используйте следующую команду для их установки:
cp resources/customqueries.json ~/.config/bloodhound/customqueries.json
Для получения статистики по контроллеру домена с большим количеством объектов LDAP запустите BadBlood на контроллере домена ESSOS.local из GOAD. После этого на контроллере домена должно быть около 3500 объектов. Ниже приведено среднее время выполнения следующих инструментов:
BINDNTLMKerberosВозможности парсинга
HasSIDHistoryСвойства : sfupasswordDCERPC (зависимости)
СеансыLocalAdminsRemoteDesktopUsersDcomUsersPSRemoteUsers| Инструмент | Окружение | Объектов | Время | Команда |
|---|
| SharpHound.exe | Windows ![]() | ~3500 | ~51.605с | Measure-Command { sharphound.exe -d essos.local --ldapusername 'khal.drogo' --ldappassword 'horse' --domaincontroller '192.168.56.12' -c All } |
| BloodHound.py | Linux ![]() | ~3500 | ~9.657с | time python3 bloodhound.py -u khal.drogo -p horse -d essos.local -ns 192.168.56.12 --zip -c all |
| RustHound.exe | Windows ![]() | ~3500 | ~5.315с | Measure-Command { rusthound.exe -d essos.local -u [email protected] -p horse -z } |
| RustHound | Linux ![]() | ~3500 | ~3.166с | time rusthound -d essos.local -u [email protected] -p horse -z |
User Specified SANRequest Disposition