
공격적 GPO 덤핑 및 분석 도구로, BloodHound 데이터를 활용하고 강화합니다.
# GPOHound
`GPOHound`는 SYSVOL 공유에서 추출된 GPO(그룹 정책 개체)를 덤프하고 분석하기 위한 도구입니다.
이는 Active Directory 환경에서 잘못된 구성, 안전하지 않은 설정, 권한 상승 경로를 발견하는 데 도움이 되는 구조화되고 공식화된 형식을 제공합니다.
이 도구는 BloodHound의 Neo4j 데이터베이스와 통합되어 이를 Active Directory 정보의 LDAP 유사 소스로 사용하는 동시에 분석 결과를 바탕으로 새로운 관계(엣지) 및 노드 속성을 추가하여 이를 보강합니다.
## 기능
### 덤프
- [x] 구조화된 JSON 또는 트리 형식으로 GPO 덤프
- [x] 여러 도메인 처리
- [x] GPO GUID로 GPO 이름 확인
- [x] GPO 파일, GPO GUID, 도메인별 출력 필터링
- [x] 정규식을 사용하여 키/값 쌍 검색
### 분석
- [x] 영향을 받는 개체별 설정 그룹화 (예: 로컬 그룹, 레지스트리)
- [x] 로컬 권한 그룹에 추가된 구성원 감지
- [x] 안전하지 않은 레지스트리 설정, 저장된 자격 증명, 권한 권한 감지
- [x] VNC 자격 증명 및 GPP 암호 복호화 지원
- [x] GPO의 영향을 받는 도메인, 컨테이너, OU 찾기
- [x] 특정 사용자, 컴퓨터, OU, 컨테이너 또는 도메인에 적용된 GPO 가져오기
- [x] 관계 및 속성으로 BloodHound 데이터 보강
## 설치
### pip로 설치
```
git clone "https://github.com/cogiceo/GPOHound"
cd GPOHound
pip install .
```
### pipx로 설치
```
pipx install "git+https://github.com/cogiceo/GPOHound"
```
### Neo4j용 APOC 설정
BloodHound 데이터 보강을 위해 Neo4j APOC를 설정해야 합니다:
- 표준 Neo4j 설치를 사용하는 경우, APOC `jar` 파일을 플러그인 폴더에 복사한 후 Neo4j를 다시 시작하여 APOC를 활성화할 수 있습니다:
```bash
cp /var/lib/neo4j/labs/apoc-* /var/lib/neo4j/plugins/
neo4j restart
```
- "Docker Compose"로 Neo4j를 설치하는 경우, 환경 변수 `NEO4J_PLUGINS=["apoc"]`를 추가하세요:
```yaml
neo4j:
image: neo4j:latest
environment:
- NEO4J_PLUGINS=["apoc"]
```
> 자세한 내용이나 대체 설치 방법은 공식 [APOC 문서](https://neo4j.com/docs/apoc/current/installation/)를 참조하세요.
### BloodHound 쿼리 추가
`GPOHound`가 추가한 관계와 속성을 시각화하려면 `customqueries.json` 파일에서 사용자 정의 쿼리를 BloodHound로 가져올 수 있습니다. 기본적으로 이 파일은 `~/.config/bloodhound/customqueries.json`에 위치합니다.
## 전제 조건
### SYSVOL 덤프
먼저 도메인 컨트롤러에서 `SYSVOL` 내용을 다운로드하세요.
- 전체 `SYSVOL` 다운로드:
```bash
gpohound sysvol --dc $DC_HOST -d $DOMAIN -u $USER -p $PASSWORD
```
- GPO만 다운로드:
```bash
gpohound sysvol --dc $DC_HOST -d $DOMAIN -u $USER -p $PASSWORD --gpos
```
- 제외 항목과 함께 다운로드:
```bash
gpohound sysvol --dc $DC_HOST -u $USER -p $PASSWORD --exclude '/Policydefinitions/','/scripts/' --max-size 100
```
### LDAP 덤프
LDAP에서 필요한 모든 데이터를 검색합니다:
```bash
gpohound ldap --dc $DC_HOST -d $DOMAIN -u $USER -p $PASSWORD
```
### BloodHound
BloodHound 데이터 보강을 위해서는 `bloodhound.py` 또는 `SharpHound.exe`와 같은 수집기를 사용하여 BloodHound 데이터를 수집하고, 수집된 데이터를 BloodHound 인터페이스로 가져와야 합니다.
## 사용법
샘플 GPOHound 파일은 `example.zip`에 있습니다. `unzip example.zip`으로 압축을 해제하세요.
기본값 및 구성 사용자 지정에 대한 지침은 [CONFIG.md](https://github.com/cogiceo/gpohound/blob/main/CONFIG.md)를 참조하십시오.
```bash
gpohound --neo4j-user $USER --neo4j-pass $PASS dump
gpohound --neo4j-user $USER --neo4j-pass $PASS analysis
```
### 파싱
```bash
gpohound parse "gpos/sysvols/$DOMAIN/Policies/{31B2F340-016D-11D2-945F-00C04FB984F9}/MACHINE/Registry.pol"
```
### 덤프
```bash
gpohound dump
gpohound dump --list
gpohound dump --guid 31B2F340-016D-11D2-945F-00C04FB984F9
gpohound dump --policies scripts psscripts
gpohound dump --search 'VNC.*Server' --show
```
### 분석
```bash
gpohound analysis
gpohound analysis --affected
gpohound analysis --trustee 'SRV01.SEVENKINGDOMS.LOCAL'
gpohound analysis --trustee 'SRV01.SEVENKINGDOMS.LOCAL' --list
gpohound analysis --trustee 'SRV01.SEVENKINGDOMS.LOCAL' --dump
gpohound analysis --enrich
gpohound analysis --enrich-ce
```
## 현재 분석 및 보강
> [!IMPORTANT]
> - 보안 필터, WMI 필터, 항목 수준 대상 지정과 같은 조건은 해석되지 않습니다.
> - GPO 충돌은 시뮬레이션되지 않으며, 유효한 설정이 누락되는 것을 방지합니다.
### 로컬 그룹
- 로그온 시 권한 있는 로컬 그룹에 할당된 사용자 감지
- 이름이 변경된 기본 제공 권한 있는 로컬 그룹 감지.
- "기본 설정 프로세스 변수"(예: %ComputerName%, %DomainName%)를 사용하여 권한 있는 로컬 그룹에 추가된 수탁자 감지
- `sAMAccountName` 하이재킹을 사용한 악용 가능한 수탁자 감지
- 권한 있는 로컬 그룹에 추가된 모든 수탁자 감지:
| 그룹 | 엣지 |
|--------------------------------|--------------|
| Administrators | `AdminTo` |
| Remote Desktop Users | `CanRDP` |
| Distributed COM Users | `ExecuteDCOM`|
| Remote Management Users | `CanPSRemote`|
| Backup Operators | `CanPrivEsc` |
| Print Operators | `CanPrivEsc` |
| Network Configuration Operators| `CanPrivEsc` |
### 레지스트리
| 분석 | 속성 |
|--------------------------------------------------------------------------|---------------------------|
| "Everyone" 그룹에 "Anonymous Logon" 포함 | — |
| SMB 서버 세션 서명이 활성화되지 않음 | `smbSigningEnabled: false`|
| SMB 서버 세션 서명이 필수로 설정되지 않음 | `smbSigningRequired: false`|
| NTLMv1 인증 지원됨 | `NTLMv1Support: true` |
| Windows 자동 로그온 기본 암호 | — |
| VNC 자격 증명 (Generic: RealVNC, TightVNC, TigerVNC 등) | `*VNC*PASS*` (다양함) |
| FileZilla 저장된 암호 | — |
| PuTTY 프록시 암호 | — |
| TeamViewer 저장된 자격 증명 | — |
| WinSCP 저장된 세션 | — |
| Picasa 저장된 암호 | — |
### 권한 권한
기본 권한 있는 수탁자 및 SID가 `S-1-5-8`로 시작하는 서비스 계정은 분석에서 제외됩니다.
| 권한 | 설명 | 엣지 |
| ----------------------------- | -------------------------------------------------------------- | ------------ |
| SeDebugPrivilege | 사용자가 모든 프로세스를 디버그 및 상호 작용할 수 있도록 허용 | `CanPrivEsc` |
| SeBackupPrivilege | 중요한 파일에 대한 액세스 권한 부여 | `CanPrivEsc` |
| SeRestorePrivilege | 복원 중 개체 권한 우회 | `CanPrivEsc` |
| SeAssignPrimaryTokenPrivilege | SYSTEM 권한 상승을 위한 토큰 가장 활성화 | `CanPrivEsc` |
| SeImpersonatePrivilege | 다른 사용자의 컨텍스트에서 프로세스 생성 허용 | `CanPrivEsc` |
| SeTakeOwnershipPrivilege | 사용자가 시스템 개체의 소유권을 가져올 수 있도록 함 | `CanPrivEsc` |
| SeTcbPrivilege | OS의 일부로 작동할 수 있는 권한 부여 | `CanPrivEsc` |
| SeCreateTokenPrivilege | 인증 토큰 생성 허용 | `CanPrivEsc` |
| SeLoadDriverPrivilege | 드라이버 로드/언로드 권한 부여 | `CanPrivEsc` |
| SeManageVolumePrivilege | 볼륨 또는 디스크 관리 권한 부여 | `CanPrivEsc` |
| SeEnableDelegationPrivilege | 컴퓨터 및 사용자 계정이 위임을 위해 신뢰되도록 활성화 | |
# 개선 사항
- [x] 로깅 개선
- [x] LDAP 통합
- [x] SMB 통합
- [ ] 나머지 확장 구문 분석
- [ ] 웹 인터페이스
- [ ] GPO 간 잠재적 충돌 강조 표시
## GPO 문서
### SYSVOL 및 LDAP
- [x] [\[MS-GPAC\]](https://learn.microsoft.com/en-us/openspecs/windows_protocols/MS-GPAC/) 감사 구성 확장
- [x] [\[MS-GPCAP\]](https://learn.microsoft.com/en-us/openspecs/windows_protocols/MS-GPCAP/) 중앙 액세스 정책 프로토콜 확장
- [x] [\[MS-GPEF\]](https://learn.microsoft.com/en-us/openspecs/windows_protocols/MS-GPEF/) 암호화 파일 시스템 확장
- [x] [\[MS-GPFAS\]](https://learn.microsoft.com/en-us/openspecs/windows_protocols/MS-GPFAS/) 방화벽 및 고급 보안 데이터 구조
- [x] [\[MS-GPFR\]](https://learn.microsoft.com/en-us/openspecs/windows_protocols/MS-GPFR/) 폴더 리디렉션 프로토콜 확장
- [ ] [\[MS-GPIE\]](https://learn.microsoft.com/en-us/openspecs/windows_protocols/MS-GPIE/) Internet Explorer 유지 관리 확장
- [x] [\[MS-GPNAP\]](https://learn.microsoft.com/en-us/openspecs/windows_protocols/MS-GPNAP/) 네트워크 액세스 보호(NAP) 확장
- [x] [\[MS-GPNRPT\]](https://learn.microsoft.com/en-us/openspecs/windows_protocols/MS-GPNRPT/) 이름 확인 정책 테이블(NRPT) 데이터 확장
- [x] [\[MS-GPOL\]](https://learn.microsoft.com/en-us/openspecs/windows_protocols/MS-GPOL/) 핵심 프로토콜
- [x] [\[MS-GPPREF\]](https://learn.microsoft.com/en-us/openspecs/windows_protocols/MS-GPPREF/) 기본 설정 확장 데이터 구조
- [x] [\[MS-GPREG\]](https://learn.microsoft.com/en-us/openspecs/windows_protocols/MS-GPREG/) 레지스트리 확장 인코딩
- [x] [\[MS-GPSB\]](https://learn.microsoft.com/en-us/openspecs/windows_protocols/MS-GPSB/) 보안 프로토콜 확장
- [x] [\[MS-GPSCR\]](https://learn.microsoft.com/en-us/openspecs/windows_protocols/MS-GPSCR/) 스크립트 확장 인코딩
- [x] [\[MS-GPSI\]](https://learn.microsoft.com/en-us/openspecs/windows_protocols/MS-GPSI/) 소프트웨어 설치 프로토콜 확장
### LDAP 전용
- [x] [\[MS-GPDPC\]](https://learn.microsoft.com/en-us/openspecs/windows_protocols/MS-GPDPC/) 배포된 프린터 연결 확장
- [ ] [\[MS-GPWL\]](https://learn.microsoft.com/en-us/openspecs/windows_protocols/MS-GPWL/) 무선/유선 프로토콜 확장