EDRバイパス入門
自己紹介 GMOサイバーセキュリティ byイエラエ株式会社 オフェンシブセキュリティ部ペネトレーションテスト一課 シニアエンジニア 川田 柾浩 • 資格 • 著書 ペネトレーションテストの教科書 (ハッカーの技術書) • その他 https://kawakatz.io/ https://x.com/kawakatz
概要 • 主にWindows端末でのEDR回避手法の例 • HavocベースでCrowdStrike Falcon、Microsoft Defender for Endpoint、Cortex XDRに検知され ない.exe形式のマルウェアを実装 • 端末内での情報収集等については、今回は対象外
目次 • • • • • • • • • はじめに macOS vs EDR Havoc vs YARA vs CrowdStrike Falcon vs Microsoft Defender for Endpoint vs Cortex XDR vs その他 おまけ
はじめに
EDRとは EDR (Endpoint Detection and Response) = (シグネチャベースの検知 + 振る舞い検知) + 検知対応機能 • シグネチャベースの検知 YARAルールによるスキャン ファイルのハッシュ値の比較 ... • 振る舞い検知 新規プロセスの外部通信 重要ファイル/プロセスへのアクセス Windows APIの監視 ...
macOS vs EDR
macOS vs EDR macOSでの検知は比較的困難 SIPによる保護が厳しく、OSから取得できるログも比較的限定されているので、プロセスの悪性判 断が難しい • SIP (System Integrity Protect) システムファイル/アプリケーションの保護 プロセスの保護 (デバッグ、コードインジェクション、メモリアクセスの制限) ... ただし、シグネチャベースの検知は問題なく行えるので、最近は各EDRも力を入れてきた印象
macOS vs EDR • ESF (Endpoint Security Framework) ProcessMonitor: https://objective-see.org/products/utilities.html
macOS vs EDR • ESF (Endpoint Security Framework) ProcessMonitor: https://objective-see.org/products/utilities.html
macOS vs EDR • ESF (Endpoint Security Framework) ProcessMonitor: https://objective-see.org/products/utilities.html
macOS vs EDR • ESF (Endpoint Security Framework) FileMonitor: https://objective-see.org/products/utilities.html
macOS vs EDR • ESF (Endpoint Security Framework) Red Canary Mac Monitor: https://github.com/redcanaryco/mac-monitor
macOS vs EDR • Network Filter Extension LuLu: https://objective-see.org/products/lulu.html
macOS vs EDR • Network Filter Extension LuLu: https://objective-see.org/products/lulu.html
macOS vs EDR • Network Filter Extension LuLu: https://objective-see.org/products/lulu.html $ sudo log stream --level debug --predicate 'subsystem == "com.objectivesee.lulu"'
macOS vs EDR • Network Filter Extension Netiquette: https://objective-see.org/products/netiquette.html
macOS vs EDR • Unified Logging
macOS vs EDR 検知が難しい例 JavaScript for Automationの検知 ※ JavaScript for Automation ≒ WindowsのPowerShell
macOS vs EDR • Apfell https://github.com/MythicAgents/apfell JXA (JavaScript for Automation)をベースとしたペイロード
macOS vs EDR • Apfell
macOS vs EDR • Apfell
macOS vs EDR • vs CrowdStrike (当時) OSAKitの使用 NG .jsファイルをosascriptコマンドで実行 ペイロードによってはNG
macOS vs EDR • vs CrowdStrike (当時) マルウェアからosascriptコマンドを実行し、標準入力経由でペイロードを渡す
macOS vs EDR • vs CrowdStrike (当時)
macOS vs EDR シグネチャベースの検知回避として、独自のMythic Agentを開発するのもあり • How to create your own mythic agent in C: https://red-team-sncf.github.io/how-to-create-your-own-mythic-agent-in-c.html • 1. Agent Message Format: https://docs.mythic-c2.net/customizing/payload-type-development/create_tasking/agentside-coding/agent-message-format
Havoc
Havoc • Havoc https://github.com/HavocFramework/Havoc OSSのC2フレームワーク BOFを実行する機能を持つ
Havoc • Havoc https://github.com/HavocFramework/Havoc OSSのC2フレームワーク BOFを実行する機能を持つ
BOF • BOF (Beacon Object File) マルウェアのメインスレッドで実行される 新規プロセス/スレッドを生成することなくコードを実行可能 検知回避の観点で大きなメリット 注意事項 実行中はメインスレッドが占有されるため、長時間の処理には向かない BOFがクラッシュするとマルウェアのプロセスが死んでしまう
BOF
BOF • COFF (Common Object File Format) 半完成品のコードで、Loaderを用いて初めて実行できる COFF Loader: https://github.com/trustedsec/COFFLoader
BOF • COFF (Common Object File Format) 半完成品のコードで、Loaderを用いて初めて実行できる COFF Loader: https://github.com/trustedsec/COFFLoader
BOF • COFF (Common Object File Format) 半完成品のコードで、Loaderを用いて初めて実行できる COFF Loader: https://github.com/trustedsec/COFFLoader
BOF • Various BOF collection https://github.com/crypt0p3g/bof-collection
Shellcode ”Windows Shellcode” ≠ Shellcode (Position-Independent Code)
Shellcode ”Windows Shellcode” ≠ Shellcode (Position-Independent Code) Reflective DLL Loader DLL
Reflective DLL Loader メモリ上に存在するDLLを読み込む技術 (Position-Independent Code) payloads/Shellcode/
DLL Reflective DLL Loaderから読み込まれるDLLでHavocのメイン機能を実装 payloads/Demon/
Shellcode Runner • 実行ファイル(.exe)形式 • 検知回避のため、独自実装のものを使用 • AIで生成したものから開始
Shellcode Runner
まとめ • Reflective DLL Loader • DLL • Shellcode Runner
vs YARA
YARA EDRでもシグネチャベースの検知に用いられるパターンマッチングルール • vs Havoc https://github.com/elastic/protections-artifacts/blob/main/yara/rules/Windows_Trojan_Havoc.yar
vs YARA
vs YARA Windows_Trojan_Havoc_9c7bb863 0x0:$a1: 56 48 89 E6 48 83 E4 F0 48 83 EC 20 E8 0F 00 00 00 48 89 F4 5E C3 0x2ea:$a2: 65 48 8B 04 25 60 00 00 00 https://defuse.ca/online-x86-assembler.htm
vs YARA Windows_Trojan_Havoc_9c7bb863 0x0:$a1: 56 48 89 E6 48 83 E4 F0 48 83 EC 20 E8 0F 00 00 00 48 89 F4 5E C3 0x2ea:$a2: 65 48 8B 04 25 60 00 00 00
vs YARA Windows_Trojan_Havoc_9c7bb863 0x0:$a1: 56 48 89 E6 48 83 E4 F0 48 83 EC 20 E8 0F 00 00 00 48 89 F4 5E C3 0x2ea:$a2: 65 48 8B 04 25 60 00 00 00
vs YARA Windows_Trojan_Havoc_9c7bb863 0x0:$a1: 56 48 89 E6 48 83 E4 F0 48 83 EC 20 E8 0F 00 00 00 48 89 F4 5E C3 0x2ea:$a2: 65 48 8B 04 25 60 00 00 00
vs YARA Windows_Trojan_Havoc_9c7bb863 0x0:$a1: 56 48 89 E6 48 83 E4 F0 48 83 EC 20 E8 0F 00 00 00 48 89 F4 5E C3 0x2ea:$a2: 65 48 8B 04 25 60 00 00 00 https://defuse.ca/online-x86-assembler.htm
GSレジスタ スレッド情報にアクセスするためのレジスタ GS: 0x30 => TEB (Thread Environment Block) GS: 0x60 => PEB (Process Environment Block) … ① TEB (GS: 0x30) + 0x60 => PEB … ②
vs YARA Windows_Trojan_Havoc_9c7bb863 0x0:$a1: 56 48 89 E6 48 83 E4 F0 48 83 EC 20 E8 0F 00 00 00 48 89 F4 5E C3 0x2ea:$a2: 65 48 8B 04 25 60 00 00 00 https://defuse.ca/online-x86-assembler.htm
vs YARA Windows_Trojan_Havoc_9c7bb863 0x0:$a1: 56 48 89 E6 48 83 E4 F0 48 83 EC 20 E8 0F 00 00 00 48 89 F4 5E C3 0x2ea:$a2: 65 48 8B 04 25 60 00 00 00
vs YARA • Before • After
vs YARA Windows_Trojan_Havoc_88053562 0xffcb:$a: 48 81 EC F8 04 00 00 48 8D 7C 24 78 44 89 8C 24 58 05 00 00 48 8B AC 24 60 05 00 00 4C 8D 6C 24 78 F3 AB B9 59 00 00 00 48 C7 44 24 70 00 00 00 00 C7 44 24 78 68 00 00 00 C7 84 24 B4 00 00 00
vs YARA Windows_Trojan_Havoc_88053562 0xffcb:$a: 48 81 EC F8 04 00 00 48 8D 7C 24 78 44 89 8C 24 58 05 00 00 48 8B AC 24 60 05 00 00 4C 8D 6C 24 78 F3 AB B9 59 00 00 00 48 C7 44 24 70 00 00 00 00 C7 44 24 78 68 00 00 00 C7 84 24 B4 00 00 00
vs YARA
vs YARA sudo ./havoc server --profile profiles/havoc.yaotl -v --debug --debug-dev
vs YARA Windows_Trojan_Havoc_88053562 0xffcb:$a: 48 81 EC F8 04 00 00 48 8D 7C 24 78 44 89 8C 24 58 05 00 00 48 8B AC 24 60 05 00 00 4C 8D 6C 24 78 F3 AB B9 59 00 00 00 48 C7 44 24 70 00 00 00 00 C7 44 24 78 68 00 00 00 C7 84 24 B4 00 00 00
vs YARA Windows_Trojan_Havoc_88053562 0xffcb:$a: 48 81 EC F8 04 00 00 48 8D 7C 24 78 44 89 8C 24 58 05 00 00 48 8B AC 24 60 05 00 00 4C 8D 6C 24 78 F3 AB B9 59 00 00 00 48 C7 44 24 70 00 00 00 00 C7 44 24 78 68 00 00 00 C7 84 24 B4 00 00 00
vs YARA
vs YARA
vs YARA
vs YARA Windows_Trojan_Havoc_88053562 0xffcb:$a: 48 81 EC F8 04 00 00 48 8D 7C 24 78 44 89 8C 24 58 05 00 00 48 8B AC 24 60 05 00 00 4C 8D 6C 24 78 F3 AB B9 59 00 00 00 48 C7 44 24 70 00 00 00 00 C7 44 24 78 68 00 00 00 C7 84 24 B4 00 00 00
vs YARA Windows_Trojan_Havoc_ffecc8af 0x181ff:$commands_table: 0B 00 00 00 00 00 00 00 20 64 2B A4 02 00 00 00 64 00 00 00 00 00 00 00 00 34 2B A4 02 00 00 00 15 00 00 00 00 00 00 00 70 4A 2B A4 02 00 00 00 10 10 00 00 00 00 00 00 30 5A 2B A4 02 00 00 00 ...
vs YARA Windows_Trojan_Havoc_ffecc8af 0x181ff:$commands_table: 0B 00 00 00 00 00 00 00 20 64 2B A4 02 00 00 00 64 00 00 00 00 00 00 00 00 34 2B A4 02 00 00 00 15 00 00 00 00 00 00 00 70 4A 2B A4 02 00 00 00 10 10 00 00 00 00 00 00 30 5A 2B A4 02 00 00 00 ...
vs YARA Windows_Trojan_Havoc_ffecc8af 0x181ff:$commands_table: 0B 00 00 00 00 00 00 00 20 64 2B A4 02 00 00 00 64 00 00 00 00 00 00 00 00 34 2B A4 02 00 00 00 15 00 00 00 00 00 00 00 70 4A 2B A4 02 00 00 00 10 10 00 00 00 00 00 00 30 5A 2B A4 02 00 00 00 ...
vs YARA Windows_Trojan_Havoc_ffecc8af 0x181ff:$commands_table: 0B 00 00 00 00 00 00 00 20 64 2B A4 02 00 00 00 64 00 00 00 00 00 00 00 00 34 2B A4 02 00 00 00 15 00 00 00 00 00 00 00 70 4A 2B A4 02 00 00 00 10 10 00 00 00 00 00 00 30 5A 2B A4 02 00 00 00 ...
vs YARA 0x76:$hash_ldrloaddll: 43 6A 45 9E 0x7528:$hash_ldrloaddll: 43 6A 45 9E 0x13969:$hash_ntaddbootentry: 76 C7 FC 8C 0x89:$hash_ntallocatevirtualmemory: EC B8 83 F7 0x788c:$hash_ntallocatevirtualmemory: EC B8 83 F7 0x7b36:$hash_ntfreevirtualmemory: 09 C6 02 28 0x7b55:$hash_ntunmapviewofsection: CD 12 A4 6A 0x7ad9:$hash_ntwritevirtualmemory: 92 01 17 C3 0x77d2:$hash_ntsetinformationvirtualmemory: 39 C2 6A 94 0x7b74:$hash_ntqueryvirtualmemory: 5D E8 C0 10 0x7a5d:$hash_ntopenprocesstoken: 99 CA 0D 35 0x78e9:$hash_ntopenthreadtoken: D2 47 33 80
vs YARA
vs YARA
vs YARA
vs YARA
vs YARA
vs YARA OK
vs CrowdStrike Falcon
CrowdStrike Falcon • トップクラスのEDR • MLを用いた静的解析など • インジェクション系の関数も注力的に監視 => シンプルにShellcodeを実行するのがベスト • ADに関する攻撃も結構見てくれる印象 • OverWatchも優秀 => かゆいところに手が届いて良い
CrowdStrike Falcon
CrowdStrike Falcon • CrowdStrike • Normal
CrowdStrike Falcon
CrowdStrike Falcon • Mini-Filter
CrowdStrike Falcon • Mini-Filter
CrowdStrike Falcon • WFP (Windows Filtering Platform) Filter
vs CrowdStrike Shellcode Runnerに対するMachine Learningの検知
vs CrowdStrike
vs CrowdStrike
vs CrowdStrike
vs Microsoft Defender for Endpoint
Microsoft Defender for Endpoint • トップクラスのEDR • Microsoft製品で統一している会社で広く導入 • CrowdStrikeとは味が違うけど良い
vs Microsoft Defender for Endpoint
vs Microsoft Defender for Endpoint
vs Microsoft Defender for Endpoint
vs Microsoft Defender for Endpoint
Sleep Mask • Sleep中にShellcodeを暗号化してシグネチャベースの検知を回避 Cobalt Strike: Sleep Mask Kit、BeaconGate + Sleepmask-VS Havoc: Sleep Technique sleep mask shellcode
vs Microsoft Defender for Endpoint
vs Microsoft Defender for Endpoint
vs Cortex XDR
Cortex XDR • トップクラスのEDR • 日本企業では少しレア • YARAでのスキャンが凶悪 => YARAでスキャンされないようにしたい
vs Cortex XDR プロセスメモリ中のShellcodeに対する検知
vs Cortex XDR プロセスメモリ中のShellcodeに対する検知
vs Cortex XDR • PART 3: How I Met Your Beacon – Brute Ratel https://www.mdsec.co.uk/2022/08/part-3-how-i-met-your-beacon-brute-ratel/ As we can see, the DLLs highlighted are all the DLLs that are loaded when the badger is injected. This list includes the loading of winhttp.dll and wininet.dll, which are not necessarily nefarious but are traditional loads for an egress beacon. There are however a number of less common DLLs loaded, such as dbghelp.dll, credui.dll samcli.dll and logoncli.dll amongst others. This behaviour allows us to create a signature for the image loads and leads to a high signal indicator that can be hunted for through image load telemetry.
vs Cortex XDR
vs Cortex XDR
vs Cortex XDR
vs Cortex XDR
vs Cortex XDR
vs Cortex XDR
Proxy Loading 別スレッドからLoadLibraryW関数を呼び出し、Call Stackが綺麗な状態を保つ • RtlRegisterWait • RtlCreateTimer • RtlQueueWorkItem
Proxy Loading (RtlRegisterWait) • RtlRegisterWait 登録したイベントがシグナル状態かタイムアウトした場合に、callback関数が呼び出される ThreadPool: 非同期タスクやcallback関数を効率よく実行するための仕組み Worker Thread: 関数を実行するためのスレッド Wait Thread: イベント等の待機状態を監視し、原則Worker Threadで関数を実行 Instance->Win32.RtlRegisterWait( &Timer, Event, C_PTR( Instance->Win32.LoadLibraryW ), // callback関数 NameW, // 引数 0, // 待機時間 WT_EXECUTEONLYONCE | WT_EXECUTEINWAITTHREAD // callback関数実行後に登録解除 | Wait Threadでcallback関数を実行 )
Proxy Loading (RtlRegisterWait) • Havoc payloads/Demon/src/core/Win32.c
Proxy Loading (RtlRegisterWait) • Havoc
Proxy Loading (RtlRegisterWait)
Proxy Loading (RtlRegisterWait) ls C:\Users\kawada\
Proxy Loading (RtlRegisterWait)
vs Cortex XDR OK
Call Stack Spoofing 関数呼び出し時にCall Stackを偽装する技術
Call Stack Spoofing 関数呼び出し時にCall Stackを偽装する技術
Call Stack Spoofing 関数呼び出し時にCall Stackを偽装する技術
Call Stack Spoofing 関数呼び出し時にCall Stackを偽装する技術
Call Stack Spoofing • Havoc
Call Stack Spoofing • Havoc SpoofFunc( Instance->Modules.Kernel32, IMAGE_SIZE( Instance->Modules.Kernel32 ), Instance->Win32.WaitForSingleObjectEx, NtCurrentProcess(), C_PTR( TimeOut ), FALSE );
Call Stack Spoofing • Havoc
Call Stack Spoofing • Havoc
Call Stack Spoofing ※ コメントは追記したもの
Call Stack Spoofing
Call Stack Spoofing
Call Stack Spoofing
Call Stack Spoofing
vs その他
vs カスタムルール CrowdStrikeの例 • Process Creation • File Creation • Network Connection • Domain Name
vs カスタムルール
vs SACL • SACL (System Access Control List) 純粋なファイルアクセスを監視することが可能
vs SACL • SACL (System Access Control List) 純粋なファイルアクセスを監視することが可能
vs SACL • SACL (System Access Control List) 純粋なファイルアクセスを監視することが可能
vs SACL
vs Sysmon 詳細な調整が可能な玄人向けツール https://learn.microsoft.com/en-us/sysinternals/downloads/sysmon
vs Sysmon 詳細な調整が可能な玄人向けツール https://learn.microsoft.com/en-us/sysinternals/downloads/sysmon
おまけ
検知パターン 端末内での検知例 • オペレーションミス 不適切な方法でのSAM/SYSTEM/SECURITYファイルのダンプ 不適切なプロセスを用いた外部/内部への通信 • 検知ロジック更新 AMSIの検知回避手法に対する検知強化 Machine Learning/シグネチャの検知ロジック更新 • カスタムルール Chromeのデバッグモード起動 定期的な/不審な通信先への外部通信
検知後 • クリーンアップ 感染したアカウントのセッション/認証情報無効化 感染した端末のクリーンアップ 横展開先の端末/サーバのクリーンアップ 攻撃者が取得した認証情報/アクセス権等の無効化 ... • 検知強化 マルウェアの形式、ファイル名、通信先、永続化手法 フィッシングの経路、シナリオ、環境構成
今後 • • • • 他形式のマルウェア開発 通信先の選定 AMSI/ETW等の検知機能の回避 横展開時のマルウェア実行方法 • • • • • Cookies/Login Dataおよび暗号鍵の取得 UACの突破 SAM/SYSTEM/SECURITYファイルのダンプ プロセスメモリのダンプ Mimikatz等の機能/関数の抽出/検知回避
終