Active Directory ACL 오남용 분석은(는) 무엇을 하나요?
개요
Active Directory Access Control List(ACL)는 DACL(Discretionary Access Control List)을 통해 AD 개체에 대한 권한을 정의하며, DACL은 ACE(Access Control Entry)로 구성됩니다. 잘못 구성된 ACE는 권한이 없는 사용자에게 Domain Admins 그룹, 도메인 컨트롤러, GPO와 같은 중요한 개체에 대해 GenericAll(전체 제어), WriteDACL(권한 수정), WriteOwner(소유권 변경), GenericWrite(속성 수정)와 같은 위험한 권한을 부여할 수 있습니다.
이 스킬은 ldap3 Python 라이브러리를 사용하여 도메인 컨트롤러에 연결하고, nTSecurityDescriptor 속성이 있는 개체를 쿼리하고, 이진 보안 설명자를 SDDL(Security Descriptor Definition Language) 형식으로 파싱하여, 관리자가 아닌 보안 주체에게 위험한 권한을 부여하는 ACE를 식별합니다. 이러한 오구성은 BloodHound와 같은 도구가 발견하는 ACL 기반 공격 경로의 기초가 됩니다.
사용 시기
- Active Directory ACL 오남용 분석이 필요한 보안 사고를 조사할 때
- 이 도메인에 대한 탐지 규칙 또는 위협 헌팅 쿼리를 구축할 때
- SOC 분석가가 이 분석 유형에 대한 구조화된 절차가 필요할 때
- 관련 공격 기술에 대한 보안 모니터링 범위를 검증할 때
사전 요구 사항
- Python 3.9 이상 및 ldap3 라이브러리 (
pip install ldap3) - AD 개체에 대한 읽기 권한이 있는 도메인 사용자 자격 증명
- 포트 389(LDAP) 또는 636(LDAPS)에서 도메인 컨트롤러에 대한 네트워크 연결
- Active Directory 보안 모델 및 SDDL 형식에 대한 이해
단계
-
도메인 컨트롤러에 연결: ldap3를 사용하여 NTLM 또는 단순 인증으로 LDAP 연결을 설정합니다. 프로덕션 환경에서는 암호화된 연결을 위해 LDAPS(포트 636)를 사용하세요.
-
대상 개체 쿼리: 대상 OU 또는 전체 도메인에서 사용자, 그룹, 컴퓨터, OU를 포함한 개체를 검색합니다.
nTSecurityDescriptor,distinguishedName,objectClass,sAMAccountName속성을 요청합니다. -
보안 설명자 파싱: 이진 nTSecurityDescriptor를 SDDL 문자열 표현으로 변환합니다. DACL의 각 ACE를 파싱하여 트러스티 SID, 액세스 마스크, ACE 유형(허용/거부)을 추출합니다.
-
SID를 보안 주체로 해석: 보안 식별자(SID)를 LDAP 조회를 통해 사람이 읽을 수 있는 계정 이름으로 매핑합니다. 기본 제공 그룹의 잘 알려진 SID를 식별합니다.
-
위험한 권한 확인: 각 ACE의 액세스 마스크를 위험한 권한 비트마스크(GenericAll: 0x10000000, WriteDACL: 0x00040000, WriteOwner: 0x00080000, GenericWrite: 0x40000000, 특정 확장 권한에 대한 WriteProperty)와 비교합니다.
-
관리자가 아닌 트러스티 필터링: 예상되는 관리 트러스티(Domain Admins, Enterprise Admins, SYSTEM, Administrators)를 제외하고, 권한이 없는 사용자나 그룹이 위험한 권한을 보유한 ACE에 플래그를 지정합니다.
-
공격 경로 매핑: 각 발견 사항에 대해 잠재적인 공격 체인을 문서화합니다(예: 사용자에 대한 GenericAll은 암호 재설정 허용, 그룹에 대한 WriteDACL은 자신을 그룹에 추가할 수 있음).
-
수정 보고서 생성: 모든 위험한 ACE, 영향을 받는 개체, 관리자가 아닌 트러스티, 권장 수정 단계를 포함한 JSON 보고서를 출력합니다.
예상 출력
{
"domain": "corp.example.com",
"objects_scanned": 1247,
"dangerous_aces_found": 8,
"findings": [
{
"severity": "critical",
"target_object": "CN=Domain Admins,CN=Users,DC=corp,DC=example,DC=com",
"target_type": "group",
"trustee": "CORP\\helpdesk-team",
"permission": "GenericAll",
"access_mask": "0x10000000",
"ace_type": "ACCESS_ALLOWED",
"attack_path": "Domain Admins 그룹에 대한 GenericAll은 임의 멤버 추가를 허용합니다",
"remediation": "Domain Admins에 대한 helpdesk-team의 GenericAll ACE 제거"
}
]
}