
OffsetInspect v3.3.0
PowerShellツールキット。AMSI/Defender検出境界の解析と静的マルウェアトリアージのためのもので、バイトオフセットを検出トリガーにマッピングし、さらにYARA、エントロピー、文字列、PE/imphash解析を提供します。OffsetScanのコンパニオンツールです。
OffsetInspect
バイトオフセット検査、ソース相関、バイナリ比較、防御的検知境界分析のための、メモリ使用量を制限したPowerShellツールキット。
OffsetInspectは、アナリストの実践的な問いに答えます:
このバイトオフセットにはどのようなコンテンツが存在し、その周囲にはどのようなソースまたはバイナリコンテキストがあるのか?
また、ThreatCheckが扱うのと同じアナリストの問題に着想を得た、OffsetInspectネイティブの検知境界ワークフローを提供します(ThreatCheckのソースやバイナリは同梱しません)。AMSIまたはMicrosoft Defenderがまだ検知する最も早いコンテンツプレフィックスを特定し、その境界を繰り返し検証し、得られたオフセットをそのままコンテキストインスペクタに渡します。その中核に加えて、レッドチーム分析と静的トリアージスイートを追加します。複数領域の発見、コーパススキャン、検知差分、検知トリガー相関、ドリフトジャーナリング、エンゲージメントレポート、エントロピー解析、文字列抽出、PE/imphash解析など、すべて読み取り専用です。さらに、承認された利用に限った署名ロバストネステスターも備え、サンプルをメモリ内でのみ改変し、エンドポイント保護を無効化または再構成することは一切ありません。
関連ツール
PowerShellのオーバーヘッドなしでコーパス規模の静的トリアージ(PE解析、エントロピー、文字列、IOC)を行うには、OffsetScan を参照してください。同じJSON出力スキーマを持つネイティブRustバイナリです。OffsetInspect 3.1.0以降は、-IocJsonPath を使用してOffsetScanのIOC JSONを直接取り込めます。
ハイライト
- 一意の各検査ファイルを安定した読み取りハンドルで開き、要求されたすべてのオフセットをまとめて処理します。
- オフセットごとにファイル全体を再読み取りする代わりに、メモリ使用量を制限したストリーミングパスを使用して行マッピングを行います。
- 16進出力と比較のために、要求されたバイトウィンドウのみを読み取ります。
- UTF-8およびUTF-16のバイトオフセットをソース行と文字位置にマッピングします。
-ContextLinesによる前後のソースコンテキストを実装します。- 人間可読、オブジェクト、JSON、CSV、CSVファイルの出力契約をサポートします。
- 一対多、多対一、ペア形式のファイル/オフセット計画をサポートします。
- 2番目のファイルを繰り返し読み込むことなく、対象バイトをそのファイルと比較します。
- 独立に実装されたAMSIおよびMicrosoft Defenderプロバイダーレイヤーを追加し、エラー、タイムアウト、ブロック、不確定の各状態を明示します。
- プロバイダー呼び出しの種類ごとにプローブ単位の監査証跡(
ProbeLog/ProbeCount)を記録し、-Verboseにライブでストリーミングして、スキャンの実際のプロバイダーコストをレポートに使える形で記録します。 - インメモリAMSIスキャンにより、1つのファイル内で独立に検知可能な複数の領域を発見し(検知されたものはディスクに書き込まれません)、各境界を絶対オフセットにマッピングします。
- コーパスをスキャンして統合検知マトリックスを生成し、2つのスキャン間の検知差分を取ります。さらにMarkdown/HTMLのエンゲージメントレポートをエクスポートします(コーパス規模のIOCパネルには、オプションでネイティブOffsetScanエンジンのJSONを利用できます)。
- 検知境界を、それを生み出したコンテンツと関連付けます。PEセクション、境界までのランのエントロピー、境界で終わる/またがる文字列を候補シグネチャコンテンツとして関連付けます。
- 検知を経時的にジャーナリングします(ファイルハッシュ および ローカルのDefenderシグネチャバージョン)。これにより、検知可能性の変化を、ファイル自体、シグネチャデータベースの更新、または非決定的なプロバイダー結果のいずれかに帰属させることができます。
- 承認されたエンゲージメントのために、検知されたサンプルをメモリ内で改変(大文字小文字、連結、コメント、空白)し、どの変換クラスが回避するかを報告することで、署名のロバストネスをテストします。変異体がディスクに書き込まれることは決してありません。
- スキャンを、それが生成するWindowsテレメトリ(
-CaptureTelemetry)と関連付けます:Microsoft Defenderのアラートが発生したかどうか、どのようなコンテキストで発生したか、どのテレメトリソースが盲点だったか。「可視性を仮定し、それを検証する」という原則を具現化します。読み取り専用、非管理者、Windowsのみ。 - 静的マルウェアトリアージヘルパーを追加します:ウィンドウ単位のエントロピー(パック/暗号化領域)、オフセット付きのASCII/UTF-16LE文字列抽出、imphashとオーバーレイ検出を含むPEヘッダー/セクション/インポート解析。
- Authenticodeの来歴を検証します(
Get-OffsetSignature):プラットフォームの実際の信頼検証を使用して、ファイルが有効に署名され信頼されているか、誰が署名したか、埋め込み署名とカタログ署名のどちらであるかを報告します。imphashおよびビルドツールチェーンのフィンガープリント(インポート vs ツールチェーン vs 署名者)を補完する署名者シグナルです。Windowsのみ。 - Defenderの除外設定、リアルタイム保護、またはシステムのセキュリティ構成を変更することは決してありません。
- 外部ランタイム依存関係のない自己完結型のPowerShell Galleryパッケージとして提供されます。YARAおよびClamAVスキャンのみがオプションの例外で、それぞれ独自の外部エンジンが必要です。
コマンド
| コマンド | 目的 | プラットフォーム |
|---|---|---|
Invoke-OffsetInspect | バイトオフセットをソース/バイナリコンテキスト、16進、比較にマッピング | クロスプラットフォーム |
Invoke-OffsetThreatScan | 1つのファイルに対するAMSI/Defender検知境界検索 | Windows |
Invoke-OffsetThreatScanBatch | ファイルのコーパスをスキャン;-Summary は検知マトリックスを返す | Windows |
Invoke-OffsetThreatScanRegion | インメモリAMSIによる複数領域の発見(ディスク書き込みなし) | Windows |
Invoke-OffsetMutationTest | 署名ロバストネステスト:検知されたサンプルをメモリ内で改変し、どの変換が回避するかを報告(承認された利用のみ) | Windows |
Compare-OffsetThreatResult | 2つのスキャン結果の差分を取る(例:シグネチャ定義の更新前後) | クロスプラットフォーム |
Get-OffsetDetectionTrigger | 検知境界を、それを最も引き起こした可能性が高いコンテンツと関連付ける | クロスプラットフォーム |
Add-OffsetDriftEntry | 検知スナップショット(ファイルハッシュ + Defenderシグネチャバージョン)をジャーナルに記録 | クロスプラットフォーム² |
Get-OffsetDrift | ファイルの検知可能性がどのように変化したかを説明:ファイル変更 vs シグネチャ更新 vs 非決定的 | クロスプラットフォーム |
Export-OffsetThreatReport | スキャン結果をMarkdown/HTMLエンゲージメントレポートに変換 | クロスプラットフォーム |
Invoke-OffsetYaraScan | ファイルをYARAルールと照合し、バイトオフセット付きのヒットを返す | クロスプラットフォーム¹ |
Invoke-OffsetClamScan | ClamAVエンジンでファイルをスキャン;正規化された検知結果を返す | クロスプラットフォーム¹ |
Get-OffsetEntropy | パック/暗号化領域を特定するためのウィンドウ単位のシャノンエントロピー | クロスプラットフォーム |
Get-OffsetString | バイトオフセット付きでASCII/UTF-16LE文字列を抽出 | クロスプラットフォーム |
Get-OffsetPEInfo | PEヘッダー、セクション、インポート/imphash、オーバーレイ、オフセット→セクション | クロスプラットフォーム |
Get-OffsetIOC | 統合インジケーターパネル:ハッシュ、エントロピー、PE/imphash、文字列 | クロスプラットフォーム |
Get-OffsetSignature | Authenticode署名:有効に署名され信頼されているか、誰によるものか、埋め込み署名とカタログ署名のどちらか | Windows |
¹ これら2つのコマンドにはオプションの外部依存関係があります:Invoke-OffsetYaraScan はYARAエンジン(winget install VirusTotal.YARA)が必要で、Invoke-OffsetClamScan はシグネチャデータベースを持つClamAV(winget install Cisco.ClamAV、続けて freshclam)が必要です。他のすべてのコマンドは自己完結型です。ここでのClamAVは単一ファイル検出器であり、境界検索エンジンではありません。clamscan は呼び出しのたびに全データベースを読み込むため、二分探索には clamd デーモンが必要です。
² Add-OffsetDriftEntry はクロスプラットフォームでジャーナリングしますが、Defenderのシグネチャ/エンジンバージョン欄はWindows(Get-MpComputerStatus 経由)でのみ設定されます。それ以外の環境ではnullとして記録され、スナップショットの残りは引き続き書き込まれます。
オフセット検査の中核とすべての静的トリアージヘルパーはクロスプラットフォーム(Windows、Linux、macOS)です。AMSI/Defender脅威プロバイダーはWindowsのみです。
インストール
PowerShellギャラリー```powershell
Install-Module OffsetInspect -Scope CurrentUser Import-Module OffsetInspect
### リポジトリのチェックアウト```powershell
git clone https://github.com/warpedatom/OffsetInspect.git
cd OffsetInspect
Import-Module ./module/OffsetInspect/OffsetInspect.psd1 -Force
このリポジトリには、軽量なCLIラッパーも含まれています:```powershell ./OffsetInspect.ps1 ./OffsetThreatScan.ps1 -Engine AMSI
## オフセット検査
### 人間可読出力```powershell
Invoke-OffsetInspect ./sample.bin 0x200
はじめに
前提条件
- このデモリポジトリのすべての手順は、Ubuntu 22.04上で
KinD version v0.20.0 go1.20.4 linux/amd64を使用してテストされました。このデモはまた、2023 MacBook Pro M2 Max上でUTMを介してUbuntu 22.04 ARM64 VMを実行することによっても検証されています。 - CockroachDB ServerlessまたはCockroachDB Dedicatedの無料トライアルデータベースのいずれか。https://cockroachlabs.cloud/signup で登録してください。注:これらのデモはCDC webhookクエリに依存しており、すべてのCRDBバージョンで利用可能です。```powershell $inspectParameters = @{ FilePaths = './script.ps1' OffsetInputs = 128, 256, 512 ByteWindow = 64 ContextLines = 4 } Invoke-OffsetInspect @inspectParameters
### 構造化オブジェクト```powershell
$inspectParameters = @{
FilePaths = './script.ps1'
OffsetInputs = 0x80, 0x100
PassThru = $true
}
$results = Invoke-OffsetInspect @inspectParameters
$results | Where-Object BytesDiffer
JSONとCSV```powershell
Invoke-OffsetInspect ./sample.bin 0x200 -Json Invoke-OffsetInspect ./sample.bin 0x200 -Csv Invoke-OffsetInspect ./sample.bin 0x200 -CsvPath ./artifacts/offsets.csv
JSON モードは常に配列を出力します。単一の結果の場合も同様です。
### バイナリ比較```powershell
$compareParameters = @{
FilePaths = './before.bin'
OffsetInputs = 0x200
CompareFile = './after.bin'
PassThru = $true
}
Invoke-OffsetInspect @compareParameters