
AD Miner는 #Bloodhound 그래프 데이터베이스에서 데이터를 처리하여 보안 취약점을 발견하기 위해 cypher 쿼리를 활용하는 Active Directory 감사 도구입니다.
웹 기반 보고서 기능:
Active Directory 취약점에 대한 위험 기반 등급과 함께 포괄적인 완화 경로를 제공합니다.
가장 위험한 잘못된 구성을 식별하도록 신중하게 조정된 검색 창과 컨트롤입니다.
시간에 따른 지표를 관찰하여 완화 효율성을 측정하는 데 도움을 줄 수도 있습니다.
AD Miner는 Forvis Mazars가 처음 만들었으며, 현재 Grant Thornton 사이버 보안 감사 및 자문 팀이 유지 관리하고 있습니다.
AD Miner를 실행하려면 먼저 Active Directory 개체가 포함된 neo4j 데이터베이스가 필요합니다.
[!CAUTION] BloodHound Automation 사용을 강력히 권장합니다. 이 도구는 Graph Data Science Neo4j 플러그인을 설치하여 다음을 제공합니다:
- 계산 시간과 전반적인 성능을 크게 향상시킵니다.
- 기본 제공 Neo4j shortestPath() 대신 Smartest Path 사용을 활성화합니다(예: 노드 홉이 가장 적은 경로보다는 익스플로잇하기 쉬운 경로).
BloodHound 환경(GUI 및 Neo4j 데이터베이스 포함)을 설정하려면 BloodHound Automation이 Graph Data Science 플러그인과의 원활한 통합으로 인해 매우 권장됩니다. 기본 BloodHound CE 설치를 사용해도 완전히 괜찮지만, GDS의 이점(예: 더 스마트한 경로 찾기, 향상된 실행 속도 등)을 놓치게 됩니다.
기본적으로 BloodHound는 포트 7687에서 액세스 가능한 neo4j 베이스를 생성합니다.
가장 쉬운 방법은 pipx를 사용하여 다음 명령을 실행하는 것입니다:
pipx install 'git+https://github.com/AD-Security/AD_Miner.git'
ADMiner는 일부 Linux 배포판에서도 사용할 수 있습니다:
pacman -S ad-minernix-env -iA nixos.ad-minerDocker 이미지를 빌드할 수 있습니다. 다음 명령으로 이미지를 빌드하세요:
docker build -t ad-miner .
Windows에서 BloodHound Community Edition 데이터로 실행하려면 아래 명령을 사용하세요:
docker run -v ${PWD}:/tmp ad-miner AD-miner -b bolt://host.docker.internal:7687 -u neo4j -p mypassword -cf YOUR_PREFIX
Linux에서 BloodHound Community Edition 데이터로 실행하려면 아래 명령을 사용하세요:
docker run -v ${PWD}:/tmp --network host ad-miner AD-miner -b bolt://localhost:7687 -u neo4j -p mypassword -cf YOUR_PREFIX
볼륨을 -v로 마운트하는 것이 데이터 출력을 얻는 데 중요합니다. BHCE 서버가 기본 설정으로 Docker 호스트에서 실행 중이라고 가정합니다.
도구 실행:
AD-miner [-h] [-b BOLT] [-u USERNAME] [-p PASSWORD] [-e EXTRACT_DATE] [-r RENEWAL_PASSWORD] [-a] [-c] [-l LEVEL] -cf CACHE_PREFIX [-ch NB_CHUNKS] [-co NB_CORES] [--rdp] [--evolution EVOLUTION] [--cluster CLUSTER]
예시:
AD-miner -cf My_Report -u neo4j -p mypassword
각 Neo4j 요청이 완료될 때 캐시 파일이 생성됩니다. 이 기능을 사용하면 AD Miner를 프로세스 중 언제든지 일시 중지하거나 중단해도 이전에 계산된 결과를 잃지 않습니다. 캐시를 활용하려면 -c 매개변수를 사용하세요. 캐시 파일은 현재 저장소의 cache_neo4j 폴더에 저장됩니다. 캐시를 사용하려면 보고서 이름이 캐시 파일 이름 접두사와 일치해야 합니다:
AD-miner -c -cf My_Report -u neo4j -p mypassword
대규모 데이터 세트를 더 잘 처리하기 위해 멀티스레딩을 활성화하고 neo4j 데이터베이스 클러스터를 사용할 수도 있습니다. 다음 예제와 같습니다(server1이 32개 스레드, server2가 16개 스레드 처리):
AD-miner -c -cf My_Report -b bolt://server1:7687 -u neo4j -p mypassword --cluster server1:7687:32,server2:7687:16
암호 갱신 정책을 알고 있는 경우 -r 매개변수를 사용하여 암호 갱신 제어가 환경 설정과 일치하도록 지정할 수 있습니다(기본값은 90일). 예를 들어 암호 정책이 180일로 설정된 경우 다음을 사용할 수 있습니다:
AD-miner -c -cf My_Report -b bolt://server:7687 -u neo4j -p mypassword -r 180
[!TIP] Bloodhound CE neo4j 데이터베이스의 기본 암호는
bloodhoundcommunityedition이거나, BloodHound Automation을 사용하는 경우neo5j입니다.
옵션:
-h, --help 도움말 메시지를 표시하고 종료합니다.
-b BOLT, --bolt BOLT Neo4j bolt 연결 (기본값: bolt://127.0.0.1:7687)
-u USERNAME, --username USERNAME
Neo4j 사용자 이름 (기본값: neo4j)
-p PASSWORD, --password PASSWORD
Neo4j 암호 (기본값: bloodhoundcommunityedition)
-e EXTRACT_DATE, --extract_date EXTRACT_DATE
추출 날짜 (예: 20220131). 기본값: 마지막 로그온 날짜
-r RENEWAL_PASSWORD, --renewal_password RENEWAL_PASSWORD
암호 갱신 정책(일). 기본값: 90
-c, --cache neo4j 데이터에 로컬 파일 사용
-l LEVEL, --level LEVEL
경로 쿼리의 재귀 수준
-cf CACHE_PREFIX, --cache_prefix CACHE_PREFIX
사용할 캐시 파일 (여러 회사 캐시 파일의 경우)
--gpo_low GPO에 대해 더 빠르지만 완전하지 않은 쿼리 수행 (일반 쿼리보다 빠름)
-ch NB_CHUNKS, --nb_chunks NB_CHUNKS
병렬 neo4j 요청의 청크 수. 기본값: CPU 수 * 20
-co NB_CORES, --nb_cores NB_CORES
병렬 neo4j 요청의 코어 수. 기본값: CPU 수
--rdp 그래프에 CanRDP 에지 포함
--evolution EVOLUTION
시간에 따른 진화: json 데이터 파일의 위치. 예: '../../tests/'
--cluster CLUSTER 병렬 neo4j 쿼리를 실행할 클러스터 노드. 예: host1:port1:nCore1,host2:port2:nCore2,...
그래프 페이지에서 그래프 노드를 마우스 오른쪽 버튼으로 클릭하여 클러스터링하거나 클러스터를 열 수 있습니다.
시간이 지남에 따라 여러 AD-Miner 보고서가 있는 경우 --evolution 인수를 사용하여 진화를 쉽게 추적할 수 있습니다. 각 AD-Miner 보고서는 index.html 파일과 함께 JSON 데이터 파일을 생성합니다. 이 다양한 JSON 파일을 단일 폴더에 모은 다음 --evolution 인수 뒤에 해당 폴더의 경로를 지정하기만 하면 됩니다.
AD-miner -c -cf My_Report -b bolt://server:7687 -u neo4j -p mypassword -r 180 --evolution evolution_folder/
메인 페이지에 '시간에 따른 진화' 탭이 나타나 각 범주(권한, 암호, Kerberos, 기타)에 대한 진화 그래프를 제공합니다.
각 제어에 대한 자세한 진화도 제공되며, 각 범주의 "진화 표시" 버튼을 통해 액세스할 수 있습니다. 로그 스케일을 사용하여 시간에 따른 미묘한 변화를 더 잘 강조할 수 있습니다.
AD Miner는 실제 익스플로잇 가능성을 기반으로 경로를 계산할 수 있습니다. 실제로 가장 짧은 경로가 익스플로잇하기 어려운 경우가 있습니다(여기서는 ExecuteDCOM이 HasSession보다 먼저 오기 때문).
그러나 더 길지만 더 간단한 경로가 존재합니다(여기서는 ExecuteDCOM 대신 MemberOf와 AdminTo 사용).
AD Miner는 neo4j 데이터베이스에 Graph Data Science 플러그인(https://neo4j.com/docs/graph-data-science/current/)이 설치되어 있을 때 자동으로 스마트 경로 모드로 전환합니다.
이 플러그인을 설치하는 가장 쉬운 방법은 neo4j 도커에 환경 변수를 정의하는 것입니다: NEO4J_PLUGINS=["graph-data-science"] (기본적으로 BloodHound Automation과 함께 설치됩니다).
현재 10개의 제어가 전체 그래프 적용 범위를 사용하고 분석을 위해 스마트 경로를 최적화합니다.
다음은 AD Miner에 이미 구현된 제어 목록입니다:
기여 방법은 여기를 확인하세요.
| 범주 | 설명 | 범주 | 설명 |
|---|
| Kerberos | AS-REP Roastable 계정 | 기타 | 구버전 OS를 사용하는 컴퓨터 | |
| Kerberos | Kerberoastable 계정 | 기타 | 휴면 계정 | |
| Kerberos | Kerberos 제약 위임 | 기타 | 도메인의 기능 수준 | |
| Kerberos | 컴퓨터에 대한 Kerberos RBCD | 기타 | 유령 컴퓨터 (Ghost computers) | |
| Kerberos | Kerberos 무제한 위임 | 기타 | 멤버가 없는 그룹 | |
| Kerberos | 오래된 KRBTGT 암호 | 기타 | 멤버가 없는 OU | |
| Kerberos | 권한 계정에 대한 섀도 자격 증명 | 기타 | 도메인 컨트롤러에 대한 섀도 자격 증명 | |
| Kerberos | 일반 계정에 대한 섀도 자격 증명 | 기타 | 예상치 못한 PrimaryGroupID | |
| 암호 | LAPS 암호에 대한 액세스 | 기타 | 사용자 FGPP | |
| 암호 | LAPS가 없는 컴퓨터 | 권한 | ACL 이상 | |
| 암호 | 개체가 관리자 GMSA 암호를 읽을 수 있음 | 권한 | 공격 경로 병목 지점 | |
| 암호 | 암호 요구 사항 우회 | 권한 | 다른 컴퓨터의 관리자인 컴퓨터 | |
| 암호 | 일반 텍스트 암호를 가진 사용자 | 권한 | 도메인 관리자로 가는 교차 도메인 경로 | |
| 암호 | 오래된 암호를 가진 사용자 | 권한 | 게스트 계정 | |
| 암호 | 암호 만료가 없는 사용자 | 권한 | DCSync 권한에 대한 부적절한 액세스 | |
| 권한 | 부적절한 AdminCount 설정 | 권한 | 부적절한 GPO 수정 권한 | |
| 권한 | 부적절한 도메인 관리자 수 | 권한 | 부적절한 권한을 가진 머신 계정 | |
| 권한 | 부적절한 권한을 가진 머신 계정 | 권한 | ADCS에 대한 비계층 0 로컬 관리자 권한 | |
| 권한 | SID 기록이 있는 개체 | 권한 | DNS 관리자로 가는 경로 | |
| 권한 | 도메인 관리자로 가는 경로 | 권한 | 운영자 그룹으로 가는 경로 | |
| 권한 | 조직 구성 단위(OU)로 가는 경로 | 권한 | 서버로 가는 경로 | |
| 권한 | AdminSDHolder 컨테이너로 가는 경로 | 권한 | "Pre-Windows 2000 Compatible Access" 그룹 | |
| 권한 | 보호된 사용자 그룹 외부의 권한 계정 | 권한 | RDP 액세스 (컴퓨터) | |
| 권한 | RDP 액세스 (사용자) | 권한 | 계층 0 위반 (세션) | |
| 권한 | 강력한 교차 도메인 권한을 가진 사용자 | 권한 | 로컬 관리자 권한을 가진 사용자 |
| 범주 | 설명 | 범주 | 설명 |
|---|
| Entra ID 기타 | Azure 휴면 계정 | Entra ID MS Graph | MS Graph의 직접 컨트롤러 | |
| Entra ID 암호 | Entra ID 암호 재설정 권한 | Entra ID MS Graph | 온프레미스와 동기화되지 않은 Entra ID 계정 | |
| Entra ID 암호 | 일관되지 않은 마지막 암호 변경 | Entra ID MS Graph | 비활성화된 트윈 계정이 있는 동기화된 계정 | |
| Entra ID 권한 | 권한 있는 Entra ID 역할에 대한 액세스 | Entra ID 권한 | 온프레미스 및 Azure 모두에서 권한 있는 계정 | |
| Entra ID 권한 | 온프레미스/Entra ID 교차 경로에서 계층 0으로 | Entra ID 권한 | AADConnect와 관련된 사용자 | |
| Entra ID 권한 | 높은 가치 대상으로 가는 경로를 가진 Entra ID 사용자 |