
PSPKI 도구 키트를 기반으로 하는 AD CS 감사용 PowerShell 도구 키트.
Active Directory Certificate Services (AD CS) 감사를 위한 PowerShell 툴킷.
해당 툴킷은 PKISolution의 PSPKI 툴킷(Microsoft Public License)을 기반으로 구축되었습니다. 이 리포지토리에는 PSGallery에서 사용 가능한 버전보다 최신 버전의 PSPKI가 포함되어 있습니다(PSPKI 디렉토리 참조). Vadims Podans(PSPKI의 창시자)님께서 여러 버그 패치가 포함된 이 버전을 친절하게 제공해 주셨습니다.
이 README는 출발점일 뿐입니다. 완전한 세부 정보 및 방어 지침은 "Certified Pre-Owned" 백서를 참조하십시오.
모듈에는 다음과 같은 주요 기능이 포함되어 있습니다.
경고: 이 코드는 베타 버전입니다! Invoke-PKIAudit은 쿼리하는 데이터 양이 매우 제한적이므로 환경에 영향을 미치지 않을 것이라고 확신합니다. 일반적인 CA 서버 워크로드에 대한 Get-CertRequest의 엄격한 테스트는 수행하지 않았습니다. Get-CertRequest는 CA 데이터베이스를 직접 쿼리하며 수천 개의 결과를 처리해야 할 수 있으므로 성능에 영향을 미칠 수 있습니다.
결과가 없다고 해서 환경이 안전하다는 보장은 없습니다!!
또한 당사의 완화 권장 사항이 환경을 안전하게 만들거나 운영을 중단시키지 않을 것이라고 보장할 수 없습니다!
환경에 가장 적합한 완화 조치를 결정하려면 Active Directory/PKI/아키텍처 팀과 상담하는 것은 귀하의 책임입니다.
코드가 손상되거나 누락된 부분이 있으면 수정을 위해 이슈 또는 풀 리퀘스트를 제출해 주세요!
상승된 PowerShell 프롬프트(PowerShell 버전 5.1 이상)를 사용하여 Windows 머신에 다음을 설치합니다.
* [PSPKI PowerShell module](https://github.com/PKISolutions/PSPKI). 다음 명령어로 설치합니다:```
Install-Module -Name PSPKI
모듈을 다운로드하고 폴더에 압축을 푸세요. 그런 다음, 다음 명령어를 사용하여 모듈을 가져오세요:``` cd PSPKIAudit Get-ChildItem -Recurse | Unblock-File
Import-Module .\PSPKIAudit.psd1
# AD CS 오류 구성 감사
`Invoke-PKIAudit`을 실행하면 현재 도메인의 AD CS에 대해 모든 감사 검사를 실행하며, 다양한 인증 기관 및 인증서 템플릿 설정을 열거합니다. 특정 CA를 감사하려면 `Invoke-PKIAudit -CAComputerName CA.DOMAIN.COM` 또는 `Invoke-PKIAudit -CAName X-Y-Z`를 실행하면 됩니다.
발견된 특정 오류 구성을 식별하기 위해 표시된 CA/템플릿 결과에 오류 구성(ESC1-8)이 속성으로 나타납니다.
등록/액세스 제어를 테스트하는 데 사용되는 그룹/사용자를 변경하려면 `Invoke-PKIAudit.ps1` 상단에 있는 `$CommonLowprivPrincipals` 정규식을 수정하세요.
모든 CA 정보를 csv로 내보내려면 다음을 실행하세요: `Get-AuditCertificateAuthority [-CAComputerName CA.DOMAIN.COM | -CAName X-Y-Z] | Export-Csv -NoTypeInformation CAs.csv`
모든 게시된 템플릿 정보를 csv로 내보내려면(취약한 템플릿뿐만 아니라) 다음을 실행하세요: `Get-AuditCertificateTemplate [-CAComputerName CA.DOMAIN.COM | -CAName X-Y-Z] | Export-Csv -NoTypeInformation templates.csv`
## 출력 설명
출력에는 두 가지 주요 섹션이 있습니다: 발견된 CA에 대한 세부 정보와 잠재적으로 취약한 템플릿에 대한 세부 정보입니다.
인증 기관 결과의 경우:
| 인증 기관 속성 | 설명 |
| ------------------------------ | ------------------------------------------------------------------ |
| ComputerName | CA가 실행 중인 시스템입니다. |
| CAName | CA의 이름입니다. |
| ConfigString | 전체 COMPUTER\CA_NAME 구성 문자열입니다. |
| IsRoot | CA가 루트 CA인지 여부입니다. |
| AllowsUserSuppliedSans | CA에 `EDITF_ATTRIBUTESUBJECTALTNAME2` 플래그가 설정되어 있는지 여부입니다. |
| VulnerableACL | CA에 취약한 ACL 설정이 있는지 여부입니다. |
| EnrollmentPrincipals | CA 수준에서 `Enroll` 권한이 있는 주체입니다. |
| EnrollmentEndpoints | CA의 웹 서비스 등록 엔드포인트입니다. |
| NTLMEnrollmentEndpoints | NTLM이 활성화된 CA의 웹 서비스 등록 엔드포인트입니다. |
| DACL | 전체 액세스 제어 정보입니다. |
| Misconfigurations | 존재하는 특정 오류 구성을 나타내는 ESCX(있는 경우). |
인증서 템플릿 결과의 경우:
| 속성 | 설명 |
| ----------------------- | -------------------------------------------------------------------------------------------------------- |
| CA | 템플릿이 게시된 전체 CA ConfigString입니다(게시되지 않은 경우 null). |
| Name | 템플릿 이름입니다. |
| SchemaVersion | 템플릿의 스키마 버전(1/2/3)입니다. |
| OID | 템플릿의 고유 개체 식별자입니다. |
| VulnerableTemplateACL | 템플릿에 취약한 ACL 설정이 있는 경우 True입니다. |
| LowPrivCanEnroll | 낮은 권한의 사용자가 템플릿에 등록할 수 있는 경우 True입니다. |
| EnrolleeSuppliesSubject | `CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT` 플래그가 있는 경우 True입니다(즉, 사용자가 임의의 SAN을 제공할 수 있음). |
| EnhancedKeyUsage | 템플릿에서 활성화된 사용 EKU입니다. |
| HasAuthenticationEku | 템플릿에 인증을 허용하는 EKU가 있는 경우 True입니다. |
| HasDangerousEku | 템플릿에 "위험한"(임의 목적 또는 null) EKU가 있는 경우 True입니다. |
| EnrollmentAgentTemplate | 템플릿에 "Certificate Request Agent" EKU가 있는 경우 True입니다. |
| CAManagerApproval | 등록에 관리자 승인이 필요한 경우 True입니다. |
| IssuanceRequirements | 인증된 서명 정보입니다. |
| ValidityPeriod | 인증서가 유효한 기간입니다. |
| RenewalPeriod | 인증서의 갱신 기간입니다. |
| Owner | 인증서를 소유한 주체입니다. |
| DACL | 전체 액세스 제어 정보입니다. |
| Misconfigurations | 존재하는 특정 오류 구성을 나타내는 ESCX(있는 경우). |
## ESC1 - 잘못 구성된 인증서 템플릿
### 세부 사항 <!-- omit in toc -->
이 권한 상승 시나리오는 다음 조건이 충족될 때 발생합니다:
1. **엔터프라이즈 CA가 낮은 권한의 사용자에게 등록 권한을 부여합니다.** 엔터프라이즈 CA의 구성은 낮은 권한의 사용자가 인증서를 요청할 수 있도록 허용해야 합니다. 자세한 내용은 백서 시작 부분의 "배경 - 등록" 섹션을 참조하십시오.
2. **관리자 승인이 비활성화되었습니다.** 이 설정은 인증서 "관리자" 권한이 있는 사용자가 요청된 인증서를 검토하고 승인해야 인증서가 발급됩니다. 자세한 내용은 백서 시작 부분의 "배경 - 발급 요구 사항" 섹션을 참조하십시오.
3. **인증된 서명이 필요하지 않습니다.** 이 설정은 모든 CSR이 기존 인증된 인증서로 서명되어야 합니다. 자세한 내용은 백서 시작 부분의 "배경 - 발급 요구 사항" 섹션을 참조하십시오.
4. **지나치게 허용적인 인증서 템플릿 보안 설명자가 낮은 권한의 사용자에게 인증서 등록 권한을 부여합니다.** 인증서 등록 권한이 있으면 낮은 권한의 공격자가 템플릿을 기반으로 인증서를 요청하고 획득할 수 있습니다. 등록 권한은 인증서 템플릿 AD 개체의 보안 설명자를 통해 부여됩니다.
5. **인증서 템플릿이 인증을 활성화하는 EKU를 정의합니다.** 적용 가능한 EKU에는 클라이언트 인증(OID 1.3.6.1.5.5.7.3.2), PKINIT 클라이언트 인증(OID 1.3.6.1.5.2.3.4) 또는 스마트 카드 로그온(OID 1.3.6.1.4.1.311.20.2.2)이 포함됩니다.
6. **인증서 템플릿이 요청자가 CSR에 subjectAltName(SAN)을 지정할 수 있도록 허용합니다.** 요청자가 CSR에 SAN을 지정할 수 있으면 누구(예: 도메인 관리 사용자)로도 인증서를 요청할 수 있습니다. 인증서 템플릿의 AD 개체는 mspki-certificate-name-flag 속성에서 요청자가 SAN을 지정할 수 있는지 여부를 지정합니다. mspki-certificate-name-flag 속성은 비트 마스크이며 CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT 플래그가 있으면 요청자가 SAN을 지정할 수 있습니다.
**요약** 이 상황은 권한이 없는 사용자가 도메인 인증에 사용할 수 있는 인증서를 요청할 수 있으며, 여기서 임의의 대체 이름(예: 도메인 관리자)을 지정할 수 있음을 의미합니다. 이로 인해 도메인 관리자와 같은 상승된 사용자에 대한 작동하는 인증서가 생성될 수 있습니다!
### 예제 <!-- omit in toc -->```
[!] Potentially vulnerable Certificate Templates:
CA : dc.theshire.local\theshire-DC-CA
Name : ESC1Template
SchemaVersion : 2
OID : ESC1 Template (1.3.6.1.4.1.311.21.8.10395027.10224472.4213181.15714845.1171465.9.10657968.9897558)
VulnerableTemplateACL : False
LowPrivCanEnroll : True
EnrolleeSuppliesSubject : True
EnhancedKeyUsage : Client Authentication (1.3.6.1.5.5.7.3.2)|Secure Email (1.3.6.1.5.5.7.3.4)|Encrypting File System (1.3.6.1.4.1.311.10.3.4)
HasAuthenticationEku : True
HasDangerousEku : False
EnrollmentAgentTemplate : False
CAManagerApproval : False
IssuanceRequirements : [Issuance Requirements]
Authorized signature count: 0
Reenrollment requires: same criteria as for enrollment.
ValidityPeriod : 1 years
RenewalPeriod : 6 weeks
Owner : THESHIRE\localadmin
DACL : NT AUTHORITY\Authenticated Users (Allow) - Read
THESHIRE\Domain Admins (Allow) - Read, Write, Enroll
THESHIRE\Domain Users (Allow) - Enroll
THESHIRE\Enterprise Admins (Allow) - Read, Write, Enroll
THESHIRE\localadmin (Allow) - Read, Write
Misconfigurations : ESC1
몇 가지 옵션이 있습니다. 먼저, 인증서 템플릿 콘솔(certtmpl.msc)에서 영향을 받는 인증서 템플릿을 마우스 오른쪽 버튼으로 클릭하고 '속성'을 클릭하십시오.
이 권한 상승 시나리오는 다음 조건이 충족될 때 발생합니다:
엔터프라이즈 CA가 낮은 권한의 사용자에게 등록 권한을 부여합니다. 세부 사항은 ESC1과 동일합니다.
관리자 승인이 비활성화됩니다. 세부 사항은 ESC1과 동일합니다.
권한 있는 서명이 필요하지 않습니다. 세부 사항은 ESC1과 동일합니다.
과도하게 허용적인 인증서 템플릿 보안 설명자가 낮은 권한의 사용자에게 인증서 등록 권한을 부여합니다. 세부 사항은 ESC1과 동일합니다.
인증서 템플릿이 Any Purpose EKU를 정의하거나 EKU가 없습니다. Any Purpose(OID 2.5.29.37.0)는 (놀랍게도!) 클라이언트 인증을 포함한 모든 목적으로 사용할 수 있습니다. EKU가 지정되지 않은 경우(예: pkiextendedkeyusage가 비어 있거나 해당 특성이 존재하지 않는 경우) 인증서는 하위 CA 인증서와 동등하며 모든 용도로 사용될 수 있습니다.
요약 ESC1과 매우 유사하지만, Any Purpose 또는 EKU가 없는 경우 CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT 플래그가 존재할 필요가 없습니다.
[!] Potentially vulnerable Certificate Templates:
CA : dc.theshire.local\theshire-DC-CA Name : ESC2Template SchemaVersion : 2 OID : ESC2 Template (1.3.6.1.4.1.311.21.8.10395027.10224472.4213181.15714845.1171465.9.7730030.4389735) VulnerableTemplateACL : False LowPrivCanEnroll : True EnrolleeSuppliesSubject : False EnhancedKeyUsage : HasAuthenticationEku : True HasDangerousEku : True EnrollmentAgentTemplate : False CAManagerApproval : False IssuanceRequirements : [Issuance Requirements] Authorized signature count: 0 Reenrollment requires: same criteria as for enrollment. ValidityPeriod : 1 years RenewalPeriod : 6 weeks Owner : THESHIRE\localadmin DACL : NT AUTHORITY\Authenticated Users (Allow) - Read THESHIRE\Domain Admins (Allow) - Read, Write, Enroll THESHIRE\Domain Users (Allow) - Enroll THESHIRE\Enterprise Admins (Allow) - Read, Write, Enroll THESHIRE\localadmin (Allow) - Read, Write Misconfigurations : ESC2
### 완화 조치 <!-- omit in toc -->
몇 가지 옵션이 있습니다. 먼저, Certificate Templates Console(certtmpl.msc)에서 영향을 받은 인증서 템플릿을 마우스 오른쪽 버튼으로 클릭하고 "Properties"를 클릭합니다.
1. "Security"를 통해 이 템플릿에 low-privileged 사용자가 등록할 수 있는 권한을 제거하고 적절한 **Enroll** 권한을 제거합니다.
* 민감한 EKU를 low-privileged 사용자가 사용할 수 없어야 하므로 이것이 최선의 수정 방법일 것입니다!
2. "Issuance Requirements"에서 **"CA Certificate Manager Approval"**을 활성화합니다.
* 이렇게 하면 이 템플릿에 대한 요청이 "Pending Requests" 큐에 들어가며, 인증서 관리자가 수동으로 승인해야 합니다.
3. "Issuance Requirements"에서 **Authorized Signatures**를 활성화합니다 (할 수 있는 경우).
* 이렇게 하면 CSR이 Enrollment Agent 인증서에 의해 공동 서명되어야 합니다.
## ESC3 - 잘못 구성된 Enrollment Agent Templates
### 세부 사항 <!-- omit in toc -->
This privilege escalation scenario occurs when the following conditions are met:
1. **Enterprise CA가 low-privileged 사용자에게 등록 권한을 부여합니다.** 세부 사항은 ESC1과 동일합니다.
2. **Manager approval이 비활성화되어 있습니다.** 세부 사항은 ESC1과 동일합니다.
3. **authorized signatures가 필요하지 않습니다.** 세부 사항은 ESC1과 동일합니다.
4. **과도하게 허용적인 인증서 템플릿 보안 설명자가 low-privileged 사용자에게 인증서 등록 권한을 부여합니다.** 세부 사항은 ESC1과 동일합니다.
5. **인증서 템플릿이 Certificate Request Agent EKU를 정의합니다.** Certificate Request Agent EKU(OID 1.3.6.1.4.1.311.20.2.1)를 사용하면 보안 주체가 다른 사용자를 대신하여 _다른_ 인증서 템플릿에 등록할 수 있습니다.
6. **CA에 Enrollment agent 제한이 구현되어 있지 않습니다.**
**요약** Certificate Request(일명 Enrollment) Agent 인증서를 가진 사람은 도메인의 모든 사용자를 대신하여 다른 인증서에 등록할 수 있습니다. 단, CA 수준에서 "Enrollment Agent Restrictions"이 구현되지 않은 경우에 한하며, 적절한 "Authorized Signatures/Application Policy" Issuance Requirement가 필요한 모든 Schema Version 1 템플릿 또는 Schema Version 2+ 템플릿에 대해 가능합니다.
### 예시 <!-- omit in toc -->```
[!] Potentially vulnerable Certificate Templates:
CA : dc.theshire.local\theshire-DC-CA
Name : ESC3Template
SchemaVersion : 2
OID : ESC3 Template (1.3.6.1.4.1.311.21.8.10395027.10224472.4213181.15714845.1171465.9.4300342.10028552)
VulnerableTemplateACL : False
LowPrivCanEnroll : True
EnrolleeSuppliesSubject : False
EnhancedKeyUsage : Certificate Request Agent (1.3.6.1.4.1.311.20.2.1)
HasAuthenticationEku : False
HasDangerousEku : False
EnrollmentAgentTemplate : True
CAManagerApproval : False
IssuanceRequirements : [Issuance Requirements]
Authorized signature count: 0
Reenrollment requires: same criteria as for enrollment.
ValidityPeriod : 1 years
RenewalPeriod : 6 weeks
Owner : THESHIRE\localadmin
DACL : NT AUTHORITY\Authenticated Users (Allow) - Read
THESHIRE\Domain Admins (Allow) - Read, Write, Enroll
THESHIRE\Domain Users (Allow) - Enroll
THESHIRE\Enterprise Admins (Allow) - Read, Write, Enroll
THESHIRE\localadmin (Allow) - Read, Write
Misconfigurations : ESC3
몇 가지 옵션이 있습니다. 먼저, 인증서 템플릿 콘솔(certtmpl.msc)에서 영향을 받는 인증서 템플릿을 마우스 오른쪽 버튼으로 클릭한 다음 "속성"을 클릭합니다.
인증 기관 콘솔(certsrv.msc)을 통해 "등록 에이전트 제한"을 구현할 수도 있습니다. 영향을 받는 CA에서 CA 이름을 마우스 오른쪽 버튼으로 클릭하고 "속성" -> "등록 에이전트"를 클릭합니다. 이 접근 방식에 대한 자세한 내용은 여기에서 확인할 수 있습니다.
인증서 템플릿은 Active Directory에서 보안 가능한 개체입니다. 즉, 템플릿에 대한 특정 권한을 가진 Active Directory 보안 주체를 지정하는 보안 설명자가 있습니다. 취약한 액세스 제어가 있는 템플릿은 의도하지 않은 보안 주체에게 템플릿의 설정을 수정할 수 있는 권한을 부여합니다. 수정 권한이 있으면 공격자는 취약한 EKU(ESC1-ESC3)를 설정하고, CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT(ESC1)와 같은 설정을 전환하거나, 관리자 승인 또는 승인된 서명과 같은 "발급 요구 사항"을 제거할 수 있습니다.
[!] Potentially vulnerable Certificate Templates:
CA : dc.theshire.local\theshire-DC-CA Name : ESC4Template SchemaVersion : 2 OID : ESC4 Template (1.3.6.1.4.1.311.21.8.10395027.10224472.4213181.15714845.1171465.9.1768738.6205646) VulnerableTemplateACL : True LowPrivCanEnroll : True EnrolleeSuppliesSubject : False EnhancedKeyUsage : Client Authentication (1.3.6.1.5.5.7.3.2)|Secure Email (1.3.6.1.5.5.7.3.4)|Encrypting File System (1.3.6.1.4.1.311.10.3.4) HasAuthenticationEku : True HasDangerousEku : False EnrollmentAgentTemplate : False CAManagerApproval : False IssuanceRequirements : [Issuance Requirements] Authorized signature count: 0 Reenrollment requires: same criteria as for enrollment. ValidityPeriod : 1 years RenewalPeriod : 6 weeks Owner : THESHIRE\localadmin DACL : NT AUTHORITY\Authenticated Users (Allow) - Read, Write THESHIRE\Domain Admins (Allow) - Read, Write, Enroll THESHIRE\Domain Users (Allow) - Read, Enroll THESHIRE\Enterprise Admins (Allow) - Read, Write, Enroll THESHIRE\localadmin (Allow) - Read, Write Misconfigurations : ESC4
### Mitigations <!-- omit in toc -->
영향을 받는 인증서 템플릿을 인증서 템플릿 콘솔(certtmpl.msc)에서 마우스 오른쪽 버튼으로 클릭한 후 "속성"을 클릭합니다.
"보안" 탭으로 이동하여 취약한 액세스 제어 항목을 제거합니다.
## ESC5 - 취약한 PKI AD 개체 액세스 제어
### Details <!-- omit in toc -->
인증서 템플릿과 인증 기관 자체 외에도 여러 개체가 전체 AD CS 시스템의 보안에 영향을 미칠 수 있습니다.
가능한 사례는 다음과 같습니다(이에 국한되지 않음):
- CA 서버의 AD 컴퓨터 개체(예: RBCD를 통한 손상)
- CA 서버의 RPC/DCOM 서버
- PKI 관련 AD 개체. CN=Public Key Services,CN=Services,CN=Configuration,DC=<COMPANY>,DC=<COM> 컨테이너에 속한 모든 하위 AD 개체 또는 컨테이너(예: 인증서 템플릿 컨테이너, 인증 기관 컨테이너, NTAuthCertificates 개체 등)
*이 특정 잘못된 구성의 범위가 넓기 때문에, 현재 이 도구 키트에서는 ESC5를 기본적으로 확인하지 않습니다.*
CA 서버 자체에 대한 액세스 경로는 현재 BloodHound 수집에서 찾을 수 있습니다.
CA 서버의 RPC/DCOM 서버 보안은 수동 분석이 필요합니다.
다음 명령은 사용자와 해당 사용자가 PKI 관련 AD 개체에 대해 가진 제어/편집 권한 목록을 출력합니다.```
$Controllers = Get-AuditPKIADObjectControllers
Format-PKIAdObjectControllers $Controllers
결과의 모든 주체가 나열된 권한을 반드시 필요로 하는지 확인하세요. 종종 비티어 0 계정(낮은 권한의 사용자/그룹 또는 낮은 권한의 비AD 서버 관리자)이 PKI 관련 AD 객체를 제어하고 있습니다.
THESHIRE\Cert Publishers (S-1-5-21-3022474190-4230777124-3051344698-517) GenericAll CN=THESHIRE-DC-CA,CN=Certification Authorities,CN=Public Key Services,CN=Services,CN=Configuration,DC=THESHIRE,DC=LOCAL GenericAll CN=AIA,CN=Public Key Services,CN=Services,CN=Configuration,DC=THESHIRE,DC=LOCAL GenericAll CN=DC,CN=CDP,CN=Public Key Services,CN=Services,CN=Configuration,DC=THESHIRE,DC=LOCAL GenericAll CN=THESHIRE-DC-CA,CN=DC,CN=CDP,CN=Public Key Services,CN=Services,CN=Configuration,DC=THESHIRE,DC=LOCAL
THESHIRE\DC$ (S-1-5-21-3022474190-4230777124-3051344698-1000) WriteOwner CN=THESHIRE-DC-CA,CN=Enrollment Services,CN=Public Key Services,CN=Services,CN=Configuration,DC=THESHIRE,DC=LOCAL GenericAll CN=THESHIRE-DC-CA,CN=AIA,CN=Public Key Services,CN=Services,CN=Configuration,DC=THESHIRE,DC=LOCAL GenericAll CN=THESHIRE-DC-CA,CN=DC,CN=CDP,CN=Public Key Services,CN=Services,CN=Configuration,DC=THESHIRE,DC=LOCAL GenericAll CN=THESHIRE-DC-CA,CN=KRA,CN=Public Key Services,CN=Services,CN=Configuration,DC=THESHIRE,DC=LOCAL
THESHIRE\Domain Computers (S-1-5-21-3022474190-4230777124-3051344698-515) WriteDacl CN=MisconfiguredTemplate,CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration,DC=THESHIRE,DC=LOCAL
THESHIRE\Domain Users (S-1-5-21-3022474190-4230777124-3051344698-513) WriteAllProperties CN=MisconfiguredTemplate,CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration,DC=THESHIRE,DC=LOCAL
THESHIRE\john-sa (S-1-5-21-3022474190-4230777124-3051344698-1602) GenericAll CN=MisconfiguredTemplate,CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration,DC=THESHIRE,DC=LOCAL
NT AUTHORITY\Authenticated Users (S-1-5-11) Owner CN=MisconfiguredTemplate,CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration,DC=THESHIRE,DC=LOCAL WriteOwner CN=MisconfiguredTemplate,CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration,DC=THESHIRE,DC=LOCAL
### Mitigations <!-- omit in toc -->
구성 개체에 대해 Active Directory 사용자 및 컴퓨터(*dsa.msc*) 또는 ADSIEdit(*adsiedit.msc*)를 통해 취약한 액세스 제어 항목을 제거합니다.
## ESC6 - EDITF_ATTRIBUTESUBJECTALTNAME2
### Details <!-- omit in toc -->
인증 기관의 구성에서 **EDITF_ATTRIBUTESUBJECTALTNAME2** 플래그가 설정된 경우, *모든* 인증서 요청이 임의의 주체 대체 이름(SAN)을 지정할 수 있습니다. 이는 도메인 인증용으로 구성되고 권한이 없는 사용자가 등록할 수 있는 모든 템플릿(예: 기본 **User** 템플릿)이 악용되어 도메인 관리자(또는 모든 활성 사용자/머신)로 인증할 수 있는 인증서를 획득할 수 있음을 의미합니다.
**이 설정은 환경에서 절대 설정해서는 안 됩니다.**
### Example <!-- omit in toc -->```
=== Certificate Authority ===
ComputerName : dc.theshire.local
CAName : theshire-DC-CA
ConfigString : dc.theshire.local\theshire-DC-CA
IsRoot : True
AllowsUserSuppliedSans : True
VulnerableACL : False
EnrollmentPrincipals : THESHIRE\Domain Users
THESHIRE\Domain Computers
THESHIRE\certmanager
THESHIRE\certadmin
THESHIRE\Nested3
EnrollmentEndpoints :
NTLMEnrollmentEndpoints :
DACL : BUILTIN\Administrators (Allow) - ManageCA, ManageCertificates
THESHIRE\Domain Admins (Allow) - ManageCA, ManageCertificates
THESHIRE\Domain Users (Allow) - Read, Enroll
THESHIRE\Domain Computers (Allow) - Enroll
THESHIRE\Enterprise Admins (Allow) - ManageCA, ManageCertificates
THESHIRE\certmanager (Allow) - ManageCertificates, Enroll
THESHIRE\certadmin (Allow) - ManageCA, Enroll
THESHIRE\Nested3 (Allow) - ManageCertificates, Enroll
Misconfigurations : ESC6
[!] The above CA is misconfigured!
...(snip)...
[!] EDITF_ATTRIBUTESUBJECTALTNAME2 set on this CA, the following templates may be vulnerable:
CA : dc.theshire.local\theshire-DC-CA
Name : User
SchemaVersion : 1
OID : 1.3.6.1.4.1.311.21.8.10395027.10224472.4213181.15714845.1171465.9.1.1
VulnerableTemplateACL : False
LowPrivCanEnroll : True
EnrolleeSuppliesSubject : False
EnhancedKeyUsage : Encrypting File System (1.3.6.1.4.1.311.10.3.4)|Secure Email (1.3.6.1.5.5.7.3.4)|Client Authentication (1.3.6.1.5.5.7.3.2)
HasAuthenticationEku : True
HasDangerousEku : False
EnrollmentAgentTemplate : False
CAManagerApproval : False
IssuanceRequirements : [Issuance Requirements]
Authorized signature count: 0
Reenrollment requires: same criteria as for enrollment.
ValidityPeriod : 1 years
RenewalPeriod : 6 weeks
Owner : THESHIRE\Enterprise Admins
DACL : NT AUTHORITY\Authenticated Users (Allow) - Read
THESHIRE\Domain Admins (Allow) - Read, Write, Enroll
THESHIRE\Domain Users (Allow) - Read, Enroll
THESHIRE\Enterprise Admins (Allow) - Read, Write, Enroll
Misconfigurations :
즉시 이 플래그를 제거하고, CA 서버에 대해 관리자 권한으로 PowerShell 프롬프트에서 영향을 받는 인증 기관을 다시 시작하십시오:``` PS C:> certutil -config "CA_HOST\CA_NAME" -setreg policy\EditFlags -EDITF_ATTRIBUTESUBJECTALTNAME2
PS C:> Get-Service -ComputerName CA_HOST certsvc | Restart-Service -Force
## ESC7 - 취약한 인증 기관 접근 제어
### 세부 사항 <!-- omit in toc -->
인증서 템플릿 외에도 인증 기관 자체는 다양한 CA 작업을 보호하는 일련의 권한을 가지고 있습니다. 이러한 권한은 certsrv.msc에서 CA를 마우스 오른쪽 버튼으로 클릭하고 속성을 선택한 후 보안 탭으로 전환하여 액세스할 수 있습니다.
의도하지 않은 주체가 보유할 경우 보안상 민감하고 위험한 두 가지 권한이 있습니다:
* **ManageCA** ("CA 관리자"라고도 함) - 관리 CA 작업을 허용하며, 여기에는 (원격으로) EDITF_ATTRIBUTESUBJECTALTNAME2 비트를 전환하여 ESC6를 초래하는 작업이 포함됩니다.
* **ManageCertificates** ("인증서 관리자/담당자"라고도 함) - 주체가 보류 중인 인증서 요청을 승인할 수 있도록 하여 "관리자 승인" 발급 요구 사항/보호를 무효화합니다.
### 예시 <!-- omit in toc -->```
=== Certificate Authority ===
ComputerName : dc.theshire.local
CAName : theshire-DC-CA
ConfigString : dc.theshire.local\theshire-DC-CA
IsRoot : True
AllowsUserSuppliedSans : False
VulnerableACL : True
EnrollmentPrincipals : THESHIRE\Domain Users
THESHIRE\Domain Computers
THESHIRE\certmanager
THESHIRE\certadmin
THESHIRE\Nested3
EnrollmentEndpoints :
NTLMEnrollmentEndpoints :
DACL : BUILTIN\Administrators (Allow) - ManageCA, ManageCertificates
THESHIRE\Domain Admins (Allow) - ManageCA, ManageCertificates
THESHIRE\Domain Users (Allow) - ManageCA, Read, Enroll
THESHIRE\Domain Computers (Allow) - Enroll
THESHIRE\Enterprise Admins (Allow) - ManageCA, ManageCertificates
THESHIRE\certmanager (Allow) - ManageCertificates, Enroll
THESHIRE\certadmin (Allow) - ManageCA, Enroll
THESHIRE\Nested3 (Allow) - ManageCertificates, Enroll
Misconfigurations : ESC7
[!] The above CA is misconfigured!
영향을 받은 CA에서 인증 기관 콘솔(certsrv.msc)을 열고, CA 이름을 마우스 오른쪽 버튼으로 클릭한 후 "속성"을 클릭합니다.
"보안"으로 이동하여 취약한 액세스 제어 항목을 제거합니다.
참고: PSPKIAudit의 이 특정 검사는 게시된 등록 엔드포인트에 NTLM이 존재하는지만 확인합니다. 이러한 NTLM 활성화 엔드포인트에 Extended Protection for Authentication이 존재하는지 확인하지 않으므로, 오탐(False Positive)이 발생할 수 있습니다!
[!IMPORTANT]
보호된 사용자 그룹의 계정은 NTLM 인증이 비활성화됩니다. 보호된 사용자로 로그인한 상태에서 PSPKIAudit을 실행하면 이 검사가 실패할 수 있습니다.
AD CS는 관리자가 설치할 수 있는 추가 AD CS 서버 역할을 통해 여러 HTTP 기반 등록 방법을 지원합니다. 이러한 HTTP 기반 인증서 등록 인터페이스는 모두 NTLM 릴레이 공격에 취약합니다.
NTLM 릴레이를 사용하여, 손상된 시스템의 공격자는 인바운드 NTLM 인증을 수행하는 모든 AD 계정을 가장할 수 있습니다. 피해자 계정을 가장하는 동안 공격자는 이러한 웹 인터페이스에 액세스하여 사용자 또는 머신 인증서 템플릿을 기반으로 하는 클라이언트 인증 인증서를 요청할 수 있습니다.
=== Certificate Authority ===
ComputerName : dc.theshire.local CAName : theshire-DC-CA ConfigString : dc.theshire.local\theshire-DC-CA IsRoot : True AllowsUserSuppliedSans : False VulnerableACL : False EnrollmentPrincipals : THESHIRE\Domain Users THESHIRE\Domain Computers THESHIRE\certmanager THESHIRE\certadmin THESHIRE\Nested3 EnrollmentEndpoints : http://dc.theshire.local/certsrv/ NTLMEnrollmentEndpoints : http://dc.theshire.local/certsrv/ DACL : BUILTIN\Administrators (Allow) - ManageCA, ManageCertificates THESHIRE\Domain Admins (Allow) - ManageCA, ManageCertificates THESHIRE\Domain Users (Allow) - Read, Enroll THESHIRE\Domain Computers (Allow) - Enroll THESHIRE\Enterprise Admins (Allow) - ManageCA, ManageCertificates THESHIRE\certmanager (Allow) - ManageCertificates, Enroll THESHIRE\certadmin (Allow) - ManageCA, Enroll THESHIRE\Nested3 (Allow) - ManageCertificates, Enroll Misconfigurations : ESC8
[!] The above CA is misconfigured!
### Mitigations <!-- omit in toc -->
HTTP(S) 등록 엔드포인트를 제거하거나, 엔드포인트에 대해 NTLM을 비활성화하거나, 인증을 위한 확장 보호(Extended Protection for Authentication)를 활성화하세요. 자세한 내용은 백서의 **Harden AD CS HTTP Endpoints – PREVENT8**를 참조하십시오.
## Misc - Explicit Mappings
일부 상황에서 가능한 또 다른 완화 조치는 인증서에 대한 명시적 매핑을 적용하는 것입니다. 이렇게 하면 Active Directory에 인증할 때 인증서에서 대체 SAN(Subject Alternative Name)을 사용하지 못하게 됩니다.
Kerberos의 경우, **HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Kdc ! UseSubjectAltName** 키 값을 00000000으로 설정하면 명시적 매핑이 강제됩니다. 자세한 내용은 [KB4043463](https://mskb.pkisolutions.com/kb/4043463)에서 확인할 수 있습니다.
SChannel에 대한 명시적 매핑 비활성화는 공식 문서화되어 있지 않지만, 당사의 연구에 따르면 **HKEY_LOCAL_MACHINE\CurrentControlSet\Control\SecurityProviders\SCHANNEL ! CertificateMappingMethods** 키를 0x1 또는 0x2로 설정하면 SAN이 차단되는 것으로 보입니다. 그러나 추가 테스트가 필요합니다.
# 기존에 발급된 인증서 요청 분석
**경고:** 이 기능은 대규모 환경에서 최소한으로 테스트되었습니다!
**참고:** 추가 정보 및 certutil을 사용하여 이러한 검색을 수행하는 방법은 백서의 "Monitor User/Machine Certificate Enrollments - DETECT1"를 참조하십시오.
기존에 발급된 인증서 요청을 검사하려는 경우, 예를 들어 임의의 SAN이 지정된 요청이 있는지, 특정 템플릿/특정 주체에 의해 요청되었는지 확인하려면 `Get-CertRequest [-CAComputerName COMPUTER.DOMAIN.COM | -CAName X-Y-Z]` 함수가 다양한 PSPKI 함수를 기반으로 더 많은 컨텍스트 정보를 제공합니다.
구체적으로, 도메인에서 현재 발급된 모든 인증서에 대해 원시 인증서 서명 요청(CSR)이 추출되고, 요청에서 SAN 지정 여부, 요청자 이름/머신/프로세스 등과 같은 특정 정보가 구성되어 CSR 개체를 보강합니다.
다음 플래그가 유용할 수 있습니다:
| Flag | Description |
| --------------------------- | --------------------------------------------------------------------------------------------- |
| **-HasSAN** | 요청에 주체 대체 이름(Subject Alternative Name)이 지정된 발급된 인증서만 반환합니다. |
| **-Requester DOMAIN\USER** | 특정 요청 사용자에 대한 발급된 인증서 요청만 반환합니다. |
| **-Template TEMPLATE_NAME** | 지정된 템플릿 이름에 대한 발급된 인증서 요청만 반환합니다. |
<br/>
모든 발급된 인증서 요청을 CSV로 내보내려면 `Get-CertRequest | Export-CSV -NoTypeInformation requests.csv`를 사용하십시오.
다음은 Certify를 사용하여 주체 대체 이름(SAN)이 지정된 상황을 보여주는 예제 결과 항목입니다:```
CA : dc.theshire.local\theshire-DC-CA
RequestID : 4602
RequesterName : THESHIRE\cody
RequesterMachineName : dev.theshire.local
RequesterProcessName : Certify.exe
SubjectAltNamesExtension :
SubjectAltNamesAttrib : Administrator
SerialNumber : 55000011faef0fab5ffd7f75b30000000011fa
CertificateTemplate : ESC1 Template
(1.3.6.1.4.1.311.21.8.10395027.10224472.4213181.15714845.1171465.9.10657968.9897558)
RequestDate : 6/3/2021 5:54:51 PM
StartDate : 6/3/2021 5:44:51 PM
EndDate : 6/3/2022 5:44:51 PM
CA : dc.theshire.local\theshire-DC-CA
RequestID : 4603
RequesterName : THESHIRE\cody
RequesterMachineName : dev.theshire.local
RequesterProcessName : Certify.exe
SubjectAltNamesExtension : Administrator
SubjectAltNamesAttrib :
SerialNumber : 55000011fb021b79cf7276c2de0000000011fb
CertificateTemplate : ESC1 Template
(1.3.6.1.4.1.311.21.8.10395027.10224472.4213181.15714845.1171465.9.10657968.9897558)
RequestDate : 6/3/2021 5:55:10 PM
StartDate : 6/3/2021 5:45:10 PM
EndDate : 6/3/2022 5:45:10 PM
SubjectAltNamesExtension 속성은 x509 SubjectAlternativeNames 확장이 SAN을 지정하는 데 사용되었음을 의미하며, 이는 CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT 플래그가 있는 템플릿에서 발생합니다. SubjectAltNamesAttrib 속성은 x509 이름/값 쌍이 사용되었음을 의미하며, 이는 EDITF_ATTRIBUTESUBJECTALTNAME2 CA 플래그가 설정된 상태에서 SAN을 지정할 때 발생합니다.
기존에 발급된 인증서는 PSPKI의 Revoke-Certificate 함수를 사용하여 해지할 수 있습니다:
PS C:\> Get-CertificationAuthority <CAName> | Get-IssuedRequest -RequestID <X> | Revoke-Certificate -Reason "KeyCompromise"
-Reason에 적용 가능한 값은 "KeyCompromise", "CACompromise" 및 "Unspecified"입니다.