
TUI 기반 Active Directory 데이터 수집 도구로, LDAP 객체를 수집하고 원격 RPC/SMB/HTTP 수집을 수행하며, 공격 경로 분석을 위해 BloodHound CE 호환 덤프를 생성합니다.
Active Directory 수집을 위한 TUI입니다.
이 프로젝트의 주요 목표는 다음과 같습니다:
Flashingestor는 다른 수집기들이 지정된 메서드를 단일 단계로 실행하는 것과 달리, LDAP 수집, 원격 수집, 변환의 3가지 기본적인 개별 단계를 구현합니다:
수집 (Ctrl+l) - LDAP에서 원시 객체 속성 데이터를 수집하여 output/ldap 아래에 중간 msgpack 파일로 저장합니다. 쿼리는 config.yaml에서 사용자 정의할 수 있습니다.
원격 (Ctrl+r) - 이 중간 파일들을 메모리로 읽어들이고, 수집할 컴퓨터 목록을 계산한 후, 일련의 RPC/SMB/HTTP 요청을 수행하여 Computer 및 EnterpriseCA 객체에 대한 관련 원격 정보를 얻어 output/remote에 저장합니다.
변환 (Ctrl+s) - 중간 파일들을 메모리로 읽어들이고, 수집 및 원격 수집 단계의 정보를 병합하여 output/bloodhound 아래에 BloodHound 호환 덤프를 생성합니다. 이 단계는 완전히 오프라인에서 이루어집니다.
더 자세한 기술적 내용과 인사이트는 📖 위키를 확인하세요.
$ git clone https://github.com/Macmod/flashingestor
$ cd flashingestor
# 빌드만 하려면:
$ go build ./cmd/flashingestor
# 실행 파일을 $GOBIN 또는 $GOPATH/bin에 설치하려면:
$ go install ./cmd/flashingestor
[!NOTE] 제공된 릴리즈에서 미리 빌드된 바이너리를 사용할 수도 있습니다.
먼저 다음 중 하나로 인증하세요:
# 익명
# [DirectoryServices 개체에 dSHeuristics가 0000002로 설정되어 있어야 하며,
# Read ACE가 없어 가시성이 제한될 수 있음]
$ ./flashingestor -u '@<DOMAIN>' -p '' [...]
# 사용자 + 비밀번호
$ ./flashingestor -u <USER>@<DOMAIN> -p <PASSWORD> [-k] [...]
# 사용자 + NTHash
$ ./flashingestor -u <USER>@<DOMAIN> -H <NTHASH> [-k] [...]
# 사용자 + PFX
$ ./flashingestor -u <USER>@<DOMAIN> --pfx <PFXPATH> [--pfx-password <PFXPASS>] [-k] [...]
# 사용자 + PEM
$ ./flashingestor -u <USER>@<DOMAIN> --cert <PEMPATH> --key <KEYPATH> [-k] [...]
# 사용자 + AESKey
$ ./flashingestor -u <USER>@<DOMAIN> --aes-key <AESKEY> -k [...]
# 사용자 + 티켓
$ ./flashingestor -u <USER>@<DOMAIN> --ccache /path/to/ticket.ccache -k [...]
또는
$ KRB5CCNAME=/path/to/ticket.ccache ./flashingestor -u <USER>@<DOMAIN> -k [...]
그런 다음 원하는 대로 단계를 실행하세요. LDAP 전용 수집(GPOLocalGroup 및 CertServices 예외인 DCOnly)의 경우, Ctrl+l을 실행하여 수집이 성공했는지 확인한 다음 Ctrl+s를 실행하여 최종 덤프를 생성하면 됩니다.
flashingestor를 실행할 때 --dc와 --dns를 지정하는 것이 좋습니다. --dc를 지정하지 않으면 flashingestor는 SRV / A 조회를 통해 DC를 찾으려고 시도하며, 이로 인해 초기 수집 단계가 지연될 수 있습니다.
표준 DNS 서버가 도메인을 인식하지 못하는 경우 --dns를 지정해야 합니다. AD 통합 DNS를 사용 중인 경우 --dns를 해당 DNS를 호스팅하는 DC로 지정하면 됩니다. 또한 --dc와 관계없이, 원격 수집 단계를 실행하려고 하고 DNS 서버가 도메인의 컴퓨터를 인식하지 못하는 경우 조회를 위해 --dns를 지정해야 합니다.
[!TIP] 여러 DC가 있는 환경에서는
dcprobe유틸리티를 사용하여 모든 DC에 대한 지연 시간을 측정하고 수집에 적합한 대상 후보를 찾을 수 있습니다:$ go build ./cmd/dcprobe $ ./dcprobe --dns 192.168.88.6 -d creta.local -r 10
설정 파일이 현재 디렉터리에 config.yaml로 존재하지 않거나 --config를 통해 제공된 경로에 없으면 기본 옵션(제공된 config.yaml과 동일)이 사용됩니다. 이 기본 옵션은 config/fallback.go에 하드코딩되어 있습니다. 자세한 내용은 설정 파일을 읽어보세요.
로그 출력 파일을 지정하려면 --log를 사용하는 것을 고려하세요 (TUI를 닫은 후 로그를 검토해야 할 경우 유용함). 디버그 로그 메시지를 보려면 -vv를 사용하세요. 이러한 옵션은 잠재적인 문제를 해결하는 데 도움이 될 수 있습니다. 명령줄 인수 전체 목록은 명령줄 인수를 읽어보세요.
[!NOTE] 제공된
config.yaml의 기본 쿼리는 BloodHound 변환에 필요한 정보를 염두에 두고 설계되었습니다.config.yaml에서 쿼리나 속성을 사용자 정의할 수 있지만, 필요한 속성을 제거하지 않도록 하고 검색 필터의 의미를 변경하지 않도록 주의하는 것이 좋습니다.
recurse_trusts가 true로 설정되면, 초기 수집에 제공된 자격 증명을 사용하여 발견된 모든 신뢰 도메인을 재귀적으로 수집합니다.
search_forest가 true로 설정되면, Configuration 파티션에서 초기 도메인과 같은 포리스트의 일부인 도메인을 수집합니다. 추가 쿼리는 발행되지 않습니다. 이는 이미 기본 수집 계획의 일부이기 때문입니다. 두 옵션을 동시에 설정할 수 있으며, flashingestor는 발견된 모든 도메인을 한 번만 수집합니다 (신뢰를 통하거나 현재 포리스트를 통해).
recurse_trusts가 활성화되고 recurse_feasible_only도 true로 설정되면, 신뢰가 다음 조건을 충족하는 경우에만 신뢰된 도메인을 수집하려고 시도합니다:
즉, 아웃바운드 전용 신뢰는 탐색되지 않으며, 첫 번째 수준의 신뢰를 제외하고는 비전이적 신뢰에서 수집 경로가 중단됩니다. B가 A를 비전이적으로 신뢰하면 A는 여전히 B에 인증할 수 있지만, C도 B를 비전이적으로 신뢰하면 A는 C에 인증할 수 없습니다.
[!IMPORTANT]
recurse_trusts/search_forest는 제공된 자격 증명이일반 비밀번호또는NT 해시인 경우에만 발견된 도메인의 LDAP에 인증합니다. TGT를 사용하여 이 목적을 위해 참조 티켓을 발급하는 것은 이론적으로 가능하지만adauth라이브러리에서 아직 구현되지 않았습니다.
Macmod/ldapx의 미들웨어 체인은 -f (--ldapx-filter), -a (--ldapx-attrs), -b (--ldapx-basedn) 옵션을 사용하여 수집 단계에서 LDAP 쿼리를 난독화하는 데 직접 사용할 수 있습니다. -vv를 사용하면 난독화 전후의 원시 쿼리도 로그에 표시됩니다.
원격 수집 단계를 실행하려면 활성화된 methods를 확인하세요. 이는 대략 SharpHound에서 제공하는 메서드에 해당하며 RPC 또는 HTTP를 통한 특정 수집을 켜거나 끄는 데 사용할 수 있습니다.
--remote-* 인수는 원격 수집을 위한 별도의 자격 증명 집합을 지정하는 데 사용할 수 있습니다. 지정하지 않으면 flashingestor는 표준 수집 인수(--user, --password 등)에 제공된 사용자와 동일한 자격 증명을 사용하려고 시도합니다.
로컬 관리자는 --remote-user Administrator@.와 같이 지정하여 원격 수집에도 사용할 수 있지만, 이 방법의 효과는 계정이 기본 제공 관리자인지 여부와 FilterAdministratorToken / LocalAccountTokenFilterPolicy 레지스트리 키 값에 따라 달라집니다. 이 동작에 대한 자세한 내용은 Pass-the-Hash Is Dead: Long Live LocalAccountTokenFilterPolicy를 참조하세요.
compress_output 및 cleanup_after_compression 옵션은 디스크 사용량을 작게 유지하는 데 도움이 됩니다. 최종 덤프를 BloodHound에 로드한 후에는 필요하지 않으면 output/ldap 및 output/remote 아래의 파일을 수동으로 안전하게 삭제할 수 있지만, 이러한 파일을 보관하면 전체 수집을 다시 실행하지 않고도 중요한 정보를 조회할 수 있습니다.
[!TIP]
output/ldap및output/remote폴더 아래의msgpack파일의 주요 목적은 전체 프로세스에 대한 책임을 분리하기 위한 중간 형식 역할을 하는 것이지만, 이러한 파일을 JSON으로 변환하여 정보 소스로 사용할 수도 있습니다. 이렇게 하면 원시 객체 속성이나 원격 수집 결과를 조회할 필요가 없습니다:$ go build ./cmd/ingest2json $ ./ingest2json output/ldap/YOURDOMAIN/SelectedFile.msgpack -o output.json
기여는 이슈 열기 또는 풀 리퀘스트 제출을 통해 환영합니다.
이 도구의 주요 참고 자료인 BloodHound, SharpHound / SharpHoundCommon을 제공해 주신 SpecterOps와 BloodHound.py를 제공해 주신 dirkjanm에게 큰 감사를 드립니다.
adauth를 제공해 주신 rtpt-erikgeiser & RedTeamPentesting과 winacl을 제공해 주신 p0dalirius에게 감사드립니다. 두 라이브러리 모두 정말 유용합니다.
go-msrpc를 제공해 주신 oiweiwei에게 감사드립니다. 그의 라이브러리 덕분에 RPC 기반 원격 수집 메서드를 구현할 수 있었습니다.
Protected Users 그룹에 속하거나 NTLM 인증이 보안 설정을 통해 차단된 경우) 또는 인증서(내부적으로 PKINIT 사용)로 원격 수집을 실행할 때, 원격 수집은 사용자가 속한 도메인과 다른 도메인의 컴퓨터에 인증을 시도하지 않습니다. 이는 수집된 데이터에 여러 도메인이 있더라도 GPOLocalGroup 메서드에도 적용되며, 해당 메서드는 다른 도메인의 DC에서 GPO 파일을 읽으려고 시도하지 않습니다.Computer 유형의 SmbInfo는 여전히 기본 구현입니다(레지스트리 확인만 수행).HttpEnrollmentEndpoints는 제공된 사용자 이름/비밀번호에서만 작동합니다.AllowedToDelegateTo / ServicePrincipalNames 확인은 여전히 기본 구현입니다.SharpHound에 구현된 거의 모든 속성이 지원되지만, 이 도구와 SharpHound 사이에는 많은 아키텍처 차이가 있으므로 출력이 공식 구현과 정확히 일치할 것으로 기대하지 마십시오(우발적인 버그는 제외). 특히 RPC를 통한 원격 수집 및 CA/인증서 남용과 관련된 수집과 같은 더 복잡한 구현에서 주요 차이가 발생할 수 있습니다.
시간 제한은 여전히 대부분 정적입니다. SharpHound의 구현은 적응형 시간 제한을 사용합니다(꽤 영리합니다!). 그러나 아직 연구할 시간이 없었습니다. 필요한 경우 --timeout, --computer-timeout, --method-timeout 옵션(config/config.go는 다른 작업별 시간 제한을 지정함)으로 시간 제한을 사용자 정의하세요.
테스트는 현재 구현되지 않았으며 기능의 작은 하위 집합만 수동으로 테스트했습니다.
MIT 라이선스 (MIT)
Copyright (c) 2023 Artur Henrique Marzano Gonzaga
본 소프트웨어 및 관련 문서 파일(이하 "소프트웨어")의 사본을 받는 모든 사람에게는 다음 조건에 따라 소프트웨어를 제한 없이 다룰 수 있는 권한이 무료로 부여됩니다. 여기에는 소프트웨어의 사용, 복사, 수정, 병합, 게시, 배포, 서브라이선스 및/또는 판본을 판매할 권리와 소프트웨어를 제공받은 사람이 이러한 작업을 수행하도록 허용할 권리가 포함되지만 이에 국한되지는 않습니다.
위 저작권 표시와 본 허가 표시는 소프트웨어의 모든 사본 또는 상당 부분에 포함되어야 합니다.
소프트웨어는 "있는 그대로" 제공되며, 상품성, 특정 목적에의 적합성 및 비침해에 대한 보증을 포함하되 이에 국한되지 않는 어떠한 명시적이거나 묵시적인 보증 없이 제공됩니다. 어떠한 경우에도 저작자나 저작권 보유자는 계약, 불법 행위 또는 기타 행위로 인해 소프트웨어 또는 소프트웨어의 사용 또는 기타 거래로 인해 발생하는 모든 청구, 손해 또는 기타 책임에 대해 책임을 지지 않습니다.