
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에게 감사드립니다. 두 라이브러리 모두 정말 유용합니다.