
Rust로 작성된 BloodHound Legacy용 Active Directory 데이터 수집기. 🦀
이 버전은 BloodHound Legacy 4.x와만 호환됩니다.
BloodHound Community Edition (CE)과 호환되는 버전은 여기 RustHound-CE에서 찾을 수 있습니다.
모든 SharpHound 기능이 구현되지는 않았습니다. 일부 기능은 RustHound에 있지만 SharpHound나 BloodHound-Python에는 없습니다. 자세한 내용은 로드맵을 참조하세요.
RustHound는 Rust로 작성된 크로스 플랫폼 BloodHound 수집 도구로, Linux, Windows, macOS와 호환됩니다.
AV 탐지가 없으며 크로스 컴파일됩니다.
RustHound는 사용자, 그룹, 컴퓨터, OU, GPO, 컨테이너 및 도메인 JSON 파일을 생성하며, 이는 BloodHound로 분석할 수 있습니다.
💡 SharpHound를 사용할 수 있다면 사용하세요. SharpHound가 AV에 탐지되거나 OS와 호환되지 않는 경우 백업 솔루션으로 RustHound를 사용하세요.
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
모든 종속성을 확보하기 위해 Docker로 RustHound를 사용하세요.
docker build --rm -t rusthound .
# Then
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
다음은 cargo 명령어를 사용하여 'release' 및 'debug' 버전을 컴파일하는 방법입니다.
git clone https://github.com/OPENCYBER-FR/RustHound
cd RustHound
cargo build --release
# or debug version
cargo b
결과는 target/release 또는 target/debug 폴더에서 찾을 수 있습니다.
아래에서 Linux에서 각 OS에 대한 컴파일 방법을 확인할 수 있습니다. 다른 컴파일 시스템이 필요한 경우 이 링크의 목록을 참조하세요: https://doc.rust-lang.org/nightly/rustc/platform-support.html
# Install rustup and Cargo for Linux
curl https://sh.rustup.rs -sSf | sh
# Add Linux deps
rustup install stable-x86_64-unknown-linux-gnu
rustup target add x86_64-unknown-linux-gnu
# Static compilation for 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 폴더에서 찾을 수 있습니다.
# Install rustup and Cargo in Linux
curl https://sh.rustup.rs -sSf | sh
# Add Windows deps
rustup install stable-x86_64-pc-windows-gnu
rustup target add x86_64-pc-windows-gnu
# Static compilation for 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
# Install rustup and Cargo in Linux
curl https://sh.rustup.rs -sSf | sh
# Add macOS tool chain
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 needs to be told to use the correct linker for the x86_64-apple-darwin target, so add the following to your project’s .cargo/config file:
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
# Static compilation for 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... Set the level of verbosity
-h, --help Print help information
-V, --version Print version information
REQUIRED VALUES:
-d, --domain <domain> Domain name like: DOMAIN.LOCAL
OPTIONAL VALUES:
-u, --ldapusername <ldapusername> LDAP username, like: [email protected]
-p, --ldappassword <ldappassword> LDAP password
-f, --ldapfqdn <ldapfqdn> Domain Controler FQDN like: DC01.DOMAIN.LOCAL or just DC01
-i, --ldapip <ldapip> Domain Controller IP address like: 192.168.1.10
-P, --ldapport <ldapport> LDAP port [default: 389]
-n, --name-server <name-server> Alternative IP address name server to use for DNS queries
-o, --output <output> Output directory where you would like to save JSON files [default: ./]
OPTIONAL FLAGS:
--ldaps Force LDAPS using for request like: ldaps://DOMAIN.LOCAL/
--dns-tcp Use TCP instead of UDP for DNS queries
--dc-only Collects data only from the domain controller. Will not try to retrieve CA security/configuration or check for Web Enrollment
--old-bloodhound For ADCS only. Output result as BloodHound data for the original BloodHound version from @BloodHoundAD without PKI support
-z, --zip Compress the JSON files into a zip archive
OPTIONAL MODULES:
--fqdn-resolver Use fqdn-resolver module to get computers IP address
--adcs Use ADCS module to enumerate Certificate Templates, Certificate Authorities and other configurations.
(For the custom-built BloodHound version from @ly4k with PKI support)
필수 값: -d, --domain 도메인 이름 (예: DOMAIN.LOCAL)
선택 값: -u, --ldapusername LDAP 사용자 이름 (예: [email protected]) -p, --ldappassword LDAP 비밀번호 -f, --ldapfqdn 도메인 컨트롤러 FQDN (예: DC01.DOMAIN.LOCAL 또는 DC01) -i, --ldapip 도메인 컨트롤러 IP 주소 (예: 192.168.1.10) -P, --ldapport LDAP 포트 [기본값: 389] -n, --name-server DNS 쿼리에 사용할 대체 IP 주소 네임 서버 -o, --output JSON 파일을 저장할 출력 디렉터리 [기본값: ./]
선택 플래그: --ldaps 요청에 LDAPS 강제 사용 (예: ldaps://DOMAIN.LOCAL/) --dns-tcp DNS 쿼리에 TCP 사용 (UDP 대신) --dc-only 도메인 컨트롤러에서만 데이터 수집. CA 보안/구성 검색 또는 웹 등록 확인을 시도하지 않음 --old-bloodhound ADCS 전용. PKI 지원이 없는 @BloodHoundAD의 원래 BloodHound 버전에 대한 BloodHound 데이터로 결과 출력 -z, --zip JSON 파일을 zip 아카이브로 압축
선택 모듈: --fqdn-resolver fqdn-resolver 모듈을 사용하여 컴퓨터 IP 주소 가져오기 --adcs 인증서 템플릿, 인증 기관 및 기타 구성을 열거하는 ADCS 모듈 사용 (PKI 지원이 있는 @ly4k의 사용자 정의 BloodHound 버전용)
예제는 mayfly가 구현한 GOADv2에서 수행되었습니다.
# Linux with username:password
rusthound -d north.sevenkingdoms.local -u '[email protected]' -p '_L0ngCl@w_' -o /tmp/demo -z
# Linux with username:password and ldapip
rusthound -d north.sevenkingdoms.local -i 192.168.56.11 -u '[email protected]' -p '_L0ngCl@w_' -o /tmp/demo -z
# Linux with username:password and ldaps
rusthound -d north.sevenkingdoms.local --ldaps -u '[email protected]' -p '_L0ngCl@w_' -o /tmp/demo -z
# Linux with username:password and ldaps and custom port
rusthound -d north.sevenkingdoms.local --ldaps -P 3636 -u '[email protected]' -p '_L0ngCl@w_' -o /tmp/demo -z
# Tips to redirect and append both standard output and standard error to a file > /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 with GSSAPI session
rusthound.exe -d sevenkingdoms.local --ldapfqdn kingslanding
# Windows simple bind connection username:password (do not use single or double quotes with cmd.exe)
rusthound.exe -d sevenkingdoms.local -u [email protected] -p _L0ngCl@w_ -o output -z
# Kerberos authentication (Linux)
export KRB5CCNAME="/tmp/jeor.mormont.ccache"
rusthound -d sevenkingdoms.local -f kingslanding -k -z
# Kerberos authentication (Windows)
rusthound.exe -d sevenkingdoms.local -f kingslanding -k -z
# Linux with username:password and FQDN resolver module
rusthound -d essos.local -u '[email protected]' -p 'BurnThemAll!' -o /tmp/demo --fqdn-resolver -z
# Linux with username:password and ldaps and FQDN resolver module and TCP DNS request and custom name server
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 with GSSAPI session and FQDN resolver module
rusthound.exe -d essos.local -f meereen -o output --fqdn-resolver -z
# Windows simple bind connection username:password and FQDN resolver module and TCP DNS request and custom name server (do not use single or double quotes with 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
# Linux with username:password and ADCS module for @ly4k BloodHound version
rusthound -d essos.local -u '[email protected]' -p 'BurnThemAll!' -o /tmp/adcs --adcs -z
# Linux with username:password and ADCS module and dconly flag (will don't check webenrollment)
rusthound -d essos.local -u '[email protected]' -p 'BurnThemAll!' -o /tmp/adcs --adcs --dc-only -z
# Linux with username:password and ADCS module using "--old-bloodhound" argument for official @BloodHoundAd version
rusthound -d essos.local -u '[email protected]' -p 'BurnThemAll!' -o /tmp/adcs --adcs --old-bloodhound -z
# Windows with GSSAPI session and ADCS module
rusthound.exe -d essos.local -f meereen -o output -z --adcs
# Windows with GSSAPI session and ADCS module and TCP DNS request and custom name server
rusthound.exe -d essos.local --ldapfqdn meereen -o output -z --adcs --tcp-dns --name-server 192.168.56.12
# Windows simple bind connection username:password (do not use single or double quotes with cmd.exe)
rusthound.exe -d essos.local -u [email protected] -p BurnThemAll! -o output -z --adcs --dc-only
데모에서 사용된 사용자 정의 쿼리는 resource 폴더에서 찾을 수 있습니다.
다음 명령어로 설치하세요:
cp resources/customqueries.json ~/.config/bloodhound/customqueries.json
더 많은 LDAP 객체가 있는 DC에서 통계를 내기 위해 GOAD의 도메인 컨트롤러 ESSOS.local에서 BadBlood를 실행하세요. DC에는 약 3500개의 객체가 있어야 합니다. 아래는 각 도구를 실행하는 데 걸리는 평균 시간입니다:
BINDNTLMKerberosParsing Features
HasSIDHistoryProperties : sfupasswordDCERPC (종속성)
SessionsLocalAdminsRemoteDesktopUsersDcomUsersPSRemoteUsers| 도구 | 환경 | 객체 | 시간 | 명령어 |
|---|
| SharpHound.exe | Windows ![]() | ~3500 | ~51.605s | Measure-Command { sharphound.exe -d essos.local --ldapusername 'khal.drogo' --ldappassword 'horse' --domaincontroller '192.168.56.12' -c All } |
| BloodHound.py | Linux ![]() | ~3500 | ~9.657s | 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.315s | Measure-Command { rusthound.exe -d essos.local -u [email protected] -p horse -z } |
| RustHound | Linux ![]() | ~3500 | ~3.166s | time rusthound -d essos.local -u [email protected] -p horse -z |
User Specified SANRequest Disposition