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-escalation/dl
This commit is contained in:
		
							parent
							
								
									24292a9eb9
								
							
						
					
					
						commit
						5586bbbba6
					
				@ -2,9 +2,10 @@
 | 
			
		||||
 | 
			
		||||
{{#include ../../../banners/hacktricks-training.md}}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## Basic Information
 | 
			
		||||
 | 
			
		||||
DLL Hijacking передбачає маніпуляцію довіреною програмою для завантаження шкідливого DLL. Цей термін охоплює кілька тактик, таких як **DLL Spoofing, Injection, і Side-Loading**. Він в основному використовується для виконання коду, досягнення стійкості та, менш поширено, ескалації привілеїв. Незважаючи на акцент на ескалації тут, метод захоплення залишається послідовним у всіх цілях.
 | 
			
		||||
DLL Hijacking передбачає маніпуляцію довіреною програмою для завантаження шкідливого DLL. Цей термін охоплює кілька тактик, таких як **DLL Spoofing, Injection, і Side-Loading**. Він в основному використовується для виконання коду, досягнення стійкості та, меншою мірою, ескалації привілеїв. Незважаючи на акцент на ескалації тут, метод захоплення залишається незмінним для різних цілей.
 | 
			
		||||
 | 
			
		||||
### Common Techniques
 | 
			
		||||
 | 
			
		||||
@ -19,7 +20,7 @@ DLL Hijacking передбачає маніпуляцію довіреною п
 | 
			
		||||
 | 
			
		||||
## Finding missing Dlls
 | 
			
		||||
 | 
			
		||||
Найпоширеніший спосіб знайти відсутні DLL у системі - це запустити [procmon](https://docs.microsoft.com/en-us/sysinternals/downloads/procmon) з sysinternals, **встановивши** **наступні 2 фільтри**:
 | 
			
		||||
Найпоширеніший спосіб знайти відсутні DLL у системі - це запуск [procmon](https://docs.microsoft.com/en-us/sysinternals/downloads/procmon) з sysinternals, **встановивши** **наступні 2 фільтри**:
 | 
			
		||||
 | 
			
		||||
.png>)
 | 
			
		||||
 | 
			
		||||
@ -29,33 +30,34 @@ DLL Hijacking передбачає маніпуляцію довіреною п
 | 
			
		||||
 | 
			
		||||
.png>)
 | 
			
		||||
 | 
			
		||||
Якщо ви шукаєте **відсутні dll загалом**, ви **залишаєте** це запущеним на кілька **секунд**.\
 | 
			
		||||
Якщо ви шукаєте **відсутній dll у конкретному виконуваному файлі**, вам слід встановити **інший фільтр, наприклад "Process Name" "contains" "\<exec name>", виконати його та зупинити захоплення подій**.
 | 
			
		||||
Якщо ви шукаєте **відсутні dll загалом**, ви **залишаєте** це працювати кілька **секунд**.\
 | 
			
		||||
Якщо ви шукаєте **відсутній dll у конкретному виконуваному файлі**, вам слід встановити **інший фільтр, наприклад "Process Name" "contains" "\<exec name>", виконати його і зупинити захоплення подій**.
 | 
			
		||||
 | 
			
		||||
## Exploiting Missing Dlls
 | 
			
		||||
 | 
			
		||||
Щоб ескалувати привілеї, найкраща можливість, яку ми маємо, - це можливість **написати dll, який привілейований процес спробує завантажити** в деякому **місці, де його будуть шукати**. Тому ми зможемо **написати** dll у **папці**, де **dll шукається перед** папкою, де знаходиться **оригінальний dll** (дивний випадок), або ми зможемо **написати в деяку папку, де dll буде шукатися**, а оригінальний **dll не існує** в жодній папці.
 | 
			
		||||
Щоб ескалувати привілеї, найкраща можливість, яку ми маємо, - це можливість **написати dll, який процес з привілеями спробує завантажити** в деякому **місці, де його будуть шукати**. Тому ми зможемо **написати** dll у **папці**, де **dll шукається перед** папкою, де знаходиться **оригінальний dll** (дивний випадок), або ми зможемо **записати в деяку папку, де dll буде шукатися**, а оригінальний **dll не існує** в жодній папці.
 | 
			
		||||
 | 
			
		||||
### Dll Search Order
 | 
			
		||||
 | 
			
		||||
**У** [**документації Microsoft**](https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order#factors-that-affect-searching) **ви можете знайти, як конкретно завантажуються DLL.**
 | 
			
		||||
 | 
			
		||||
**Windows програми** шукають DLL, дотримуючись набору **попередньо визначених пошукових шляхів**, дотримуючись певної послідовності. Проблема DLL hijacking виникає, коли шкідливий DLL стратегічно розміщений в одному з цих каталогів, забезпечуючи його завантаження перед автентичним DLL. Рішенням для запобігання цьому є забезпечення того, щоб програма використовувала абсолютні шляхи при посиланні на DLL, які їй потрібні.
 | 
			
		||||
**Windows програми** шукають DLL, дотримуючись набору **попередньо визначених шляхів пошуку**, дотримуючись певної послідовності. Проблема DLL hijacking виникає, коли шкідливий DLL стратегічно розміщується в одному з цих каталогів, забезпечуючи його завантаження перед автентичним DLL. Рішенням для запобігання цьому є забезпечення того, щоб програма використовувала абсолютні шляхи при посиланні на необхідні їй DLL.
 | 
			
		||||
 | 
			
		||||
Ви можете побачити **порядок пошуку DLL на 32-бітних** системах нижче:
 | 
			
		||||
 | 
			
		||||
1. Каталог, з якого була завантажена програма.
 | 
			
		||||
2. Системний каталог. Використовуйте функцію [**GetSystemDirectory**](https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getsystemdirectorya), щоб отримати шлях до цього каталогу. (_C:\Windows\System32_)
 | 
			
		||||
1. Каталог, з якого завантажено програму.
 | 
			
		||||
2. Системний каталог. Використовуйте функцію [**GetSystemDirectory**](https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getsystemdirectorya), щоб отримати шлях до цього каталогу.(_C:\Windows\System32_)
 | 
			
		||||
3. 16-бітний системний каталог. Немає функції, яка отримує шлях до цього каталогу, але він шукається. (_C:\Windows\System_)
 | 
			
		||||
4. Каталог Windows. Використовуйте функцію [**GetWindowsDirectory**](https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getwindowsdirectorya), щоб отримати шлях до цього каталогу. (_C:\Windows_)
 | 
			
		||||
4. Каталог Windows. Використовуйте функцію [**GetWindowsDirectory**](https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getwindowsdirectorya), щоб отримати шлях до цього каталогу.
 | 
			
		||||
1. (_C:\Windows_)
 | 
			
		||||
5. Поточний каталог.
 | 
			
		||||
6. Каталоги, які вказані в змінній середовища PATH. Зверніть увагу, що це не включає шлях для кожного застосунку, вказаний у реєстрі **App Paths**. Ключ **App Paths** не використовується при обчисленні шляху пошуку DLL.
 | 
			
		||||
6. Каталоги, які вказані в змінній середовища PATH. Зверніть увагу, що це не включає шлях для кожної програми, вказаний у реєстраційній ключі **App Paths**. Ключ **App Paths** не використовується при обчисленні шляху пошуку DLL.
 | 
			
		||||
 | 
			
		||||
Це **за замовчуванням** порядок пошуку з **SafeDllSearchMode** увімкненим. Коли він вимкнений, поточний каталог підвищується до другого місця. Щоб вимкнути цю функцію, створіть значення реєстру **HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager**\\**SafeDllSearchMode** і встановіть його на 0 (за замовчуванням увімкнено).
 | 
			
		||||
Це **за замовчуванням** порядок пошуку з **SafeDllSearchMode** увімкнено. Коли він вимкнений, поточний каталог підвищується до другого місця. Щоб вимкнути цю функцію, створіть значення реєстру **HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager**\\**SafeDllSearchMode** і встановіть його на 0 (за замовчуванням увімкнено).
 | 
			
		||||
 | 
			
		||||
Якщо функція [**LoadLibraryEx**](https://docs.microsoft.com/en-us/windows/desktop/api/LibLoaderAPI/nf-libloaderapi-loadlibraryexa) викликається з **LOAD_WITH_ALTERED_SEARCH_PATH**, пошук починається в каталозі виконуваного модуля, який **LoadLibraryEx** завантажує.
 | 
			
		||||
 | 
			
		||||
Нарешті, зверніть увагу, що **dll може бути завантажений, вказуючи абсолютний шлях, а не просто ім'я**. У цьому випадку цей dll **шукатиметься лише в цьому шляху** (якщо у dll є якісь залежності, їх шукатимуть так, як якщо б їх завантажили за ім'ям).
 | 
			
		||||
Нарешті, зверніть увагу, що **dll може бути завантажено, вказуючи абсолютний шлях, а не просто ім'я**. У цьому випадку цей dll **шукатиметься лише в цьому шляху** (якщо у dll є якісь залежності, їх шукатимуть так, як якщо б їх завантажили за ім'ям).
 | 
			
		||||
 | 
			
		||||
Є й інші способи змінити порядок пошуку, але я не буду пояснювати їх тут.
 | 
			
		||||
 | 
			
		||||
@ -63,19 +65,19 @@ DLL Hijacking передбачає маніпуляцію довіреною п
 | 
			
		||||
 | 
			
		||||
В документації Windows зазначено певні винятки з стандартного порядку пошуку DLL:
 | 
			
		||||
 | 
			
		||||
- Коли зустрічається **DLL, яка має таку ж назву, як одна, що вже завантажена в пам'яті**, система обходить звичайний пошук. Натомість вона виконує перевірку на перенаправлення та маніфест, перш ніж за замовчуванням використовувати DLL, вже в пам'яті. **У цьому випадку система не проводить пошук для DLL**.
 | 
			
		||||
- У випадках, коли DLL визнано **відомим DLL** для поточної версії Windows, система використовуватиме свою версію відомого DLL разом з будь-якими його залежними DLL, **пропускаючи процес пошуку**. Ключ реєстру **HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs** містить список цих відомих DLL.
 | 
			
		||||
- Якщо **DLL має залежності**, пошук цих залежних DLL проводиться так, ніби їх вказано лише за їх **іменами модулів**, незалежно від того, чи була початкова DLL ідентифікована через повний шлях.
 | 
			
		||||
- Коли зустрічається **DLL, яка має таку ж назву, як одна, що вже завантажена в пам'ять**, система обходить звичайний пошук. Натомість вона виконує перевірку на перенаправлення та маніфест, перш ніж за замовчуванням використовувати DLL, вже в пам'яті. **У цьому випадку система не проводить пошук для DLL**.
 | 
			
		||||
- У випадках, коли DLL визнано **відомим DLL** для поточної версії Windows, система використовуватиме свою версію відомого DLL разом з будь-якими його залежними DLL, **пропускаючи процес пошуку**. Реєстраційний ключ **HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs** містить список цих відомих DLL.
 | 
			
		||||
- Якщо **DLL має залежності**, пошук цих залежних DLL проводиться так, ніби вони були вказані лише своїми **іменами модулів**, незалежно від того, чи була початкова DLL ідентифікована через повний шлях.
 | 
			
		||||
 | 
			
		||||
### Escalating Privileges
 | 
			
		||||
 | 
			
		||||
**Requirements**:
 | 
			
		||||
 | 
			
		||||
- Визначити процес, який працює або буде працювати під **іншими привілеями** (горизонтальний або бічний рух), який **не має DLL**.
 | 
			
		||||
- Забезпечити **доступ на запис** для будь-якої **каталогу**, в якій **DLL** буде **шукатися**. Це місце може бути каталогом виконуваного файлу або каталогом у системному шляху.
 | 
			
		||||
- Забезпечити **доступ на запис** для будь-якого **каталогу**, в якому **DLL** буде **шукатися**. Це місце може бути каталогом виконуваного файлу або каталогом у системному шляху.
 | 
			
		||||
 | 
			
		||||
Так, вимоги складно знайти, оскільки **за замовчуванням це досить дивно - знайти привілейований виконуваний файл без dll**, і ще **дивніше мати права на запис у папці системного шляху** (за замовчуванням ви не можете). Але в неправильно налаштованих середовищах це можливо.\
 | 
			
		||||
У випадку, якщо вам пощастить і ви знайдете себе, що відповідає вимогам, ви можете перевірити проект [UACME](https://github.com/hfiref0x/UACME). Навіть якщо **основна мета проекту - обійти UAC**, ви можете знайти там **PoC** для Dll hijacking для версії Windows, яку ви можете використовувати (можливо, просто змінивши шлях до папки, де у вас є права на запис).
 | 
			
		||||
Так, вимоги складно знайти, оскільки **за замовчуванням це досить дивно - знайти привілейований виконуваний файл без dll**, і ще **більш дивно мати права на запис у каталозі системного шляху** (за замовчуванням ви не можете). Але в неправильно налаштованих середовищах це можливо.\
 | 
			
		||||
У випадку, якщо вам пощастить і ви знайдете себе, що відповідає вимогам, ви можете перевірити проект [UACME](https://github.com/hfiref0x/UACME). Навіть якщо **головна мета проекту - обійти UAC**, ви можете знайти там **PoC** для Dll hijaking для версії Windows, яку ви можете використовувати (можливо, просто змінивши шлях до папки, де у вас є права на запис).
 | 
			
		||||
 | 
			
		||||
Зверніть увагу, що ви можете **перевірити свої права в папці**, виконавши:
 | 
			
		||||
```bash
 | 
			
		||||
@ -91,7 +93,7 @@ for %%A in ("%path:;=";"%") do ( cmd.exe /c icacls "%%~A" 2>nul | findstr /i "(F
 | 
			
		||||
dumpbin /imports C:\path\Tools\putty\Putty.exe
 | 
			
		||||
dumpbin /export /path/file.dll
 | 
			
		||||
```
 | 
			
		||||
Для повного посібника про те, як **зловживати Dll Hijacking для підвищення привілеїв** з правами на запис у **папку системного шляху**, перевірте:
 | 
			
		||||
Для повного посібника про те, як **зловживати Dll Hijacking для ескалації привілеїв** з правами на запис у **папку системного шляху**, перевірте:
 | 
			
		||||
 | 
			
		||||
{{#ref}}
 | 
			
		||||
writable-sys-path-+dll-hijacking-privesc.md
 | 
			
		||||
@ -99,12 +101,12 @@ writable-sys-path-+dll-hijacking-privesc.md
 | 
			
		||||
 | 
			
		||||
### Автоматизовані інструменти
 | 
			
		||||
 | 
			
		||||
[**Winpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS) перевірить, чи маєте ви права на запис у будь-яку папку всередині системного PATH.\
 | 
			
		||||
[**Winpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS) перевірить, чи маєте ви права на запис у будь-яку папку всередині системного шляху.\
 | 
			
		||||
Інші цікаві автоматизовані інструменти для виявлення цієї вразливості - це **функції PowerSploit**: _Find-ProcessDLLHijack_, _Find-PathDLLHijack_ та _Write-HijackDll._
 | 
			
		||||
 | 
			
		||||
### Приклад
 | 
			
		||||
 | 
			
		||||
У разі, якщо ви знайдете експлуатовану ситуацію, однією з найважливіших речей для успішної експлуатації буде **створити dll, яка експортує принаймні всі функції, які виконуваний файл імпортуватиме з неї**. У будь-якому випадку, зверніть увагу, що Dll Hijacking є корисним для [підвищення з рівня середньої цілісності до високої **(обхід UAC)**](../../authentication-credentials-uac-and-efs/index.html#uac) або з [**високої цілісності до SYSTEM**](../index.html#from-high-integrity-to-system)**.** Ви можете знайти приклад **як створити дійсну dll** в цьому дослідженні dll hijacking, зосередженому на dll hijacking для виконання: [**https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows**](https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows)**.**\
 | 
			
		||||
У разі, якщо ви знайдете експлуатовану ситуацію, однією з найважливіших речей для успішної експлуатації буде **створити dll, яка експортує принаймні всі функції, які виконуваний файл імпортуватиме з неї**. У будь-якому випадку, зверніть увагу, що Dll Hijacking є корисним для [ескалації з середнього рівня цілісності до високого **(обхід UAC)**](../../authentication-credentials-uac-and-efs/index.html#uac) або з [**високого рівня цілісності до SYSTEM**](../index.html#from-high-integrity-to-system)**.** Ви можете знайти приклад **як створити дійсну dll** в цьому дослідженні dll hijacking, зосередженому на dll hijacking для виконання: [**https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows**](https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows)**.**\
 | 
			
		||||
Більше того, у **наступному розділі** ви можете знайти деякі **базові коди dll**, які можуть бути корисними як **шаблони** або для створення **dll з не обов'язковими експортованими функціями**.
 | 
			
		||||
 | 
			
		||||
## **Створення та компіляція Dlls**
 | 
			
		||||
@ -113,7 +115,7 @@ writable-sys-path-+dll-hijacking-privesc.md
 | 
			
		||||
 | 
			
		||||
В основному, **Dll проксі** - це Dll, здатна **виконувати ваш шкідливий код при завантаженні**, але також **виконувати** та **працювати** як **очікувалося**, **пересилаючи всі виклики до реальної бібліотеки**.
 | 
			
		||||
 | 
			
		||||
За допомогою інструмента [**DLLirant**](https://github.com/redteamsocietegenerale/DLLirant) або [**Spartacus**](https://github.com/Accenture/Spartacus) ви можете фактично **вказати виконуваний файл і вибрати бібліотеку**, яку хочете проксувати, і **згенерувати проксовану dll** або **вказати Dll** і **згенерувати проксовану dll**.
 | 
			
		||||
За допомогою інструмента [**DLLirant**](https://github.com/redteamsocietegenerale/DLLirant) або [**Spartacus**](https://github.com/Accenture/Spartacus) ви можете фактично **вказати виконуваний файл і вибрати бібліотеку**, яку хочете проксіювати, і **згенерувати проксійовану dll** або **вказати Dll** і **згенерувати проксійовану dll**.
 | 
			
		||||
 | 
			
		||||
### **Meterpreter**
 | 
			
		||||
 | 
			
		||||
@ -212,7 +214,47 @@ break;
 | 
			
		||||
return TRUE;
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
## Посилання
 | 
			
		||||
## Дослідження випадку: CVE-2025-1729 - Підвищення привілеїв за допомогою TPQMAssistant.exe
 | 
			
		||||
 | 
			
		||||
Цей випадок демонструє **Phantom DLL Hijacking** у Quick Menu TrackPoint від Lenovo (`TPQMAssistant.exe`), зафіксованому як **CVE-2025-1729**.
 | 
			
		||||
 | 
			
		||||
### Деталі вразливості
 | 
			
		||||
 | 
			
		||||
- **Компонент**: `TPQMAssistant.exe`, розташований за адресою `C:\ProgramData\Lenovo\TPQM\Assistant\`.
 | 
			
		||||
- **Заплановане завдання**: `Lenovo\TrackPointQuickMenu\Schedule\ActivationDailyScheduleTask` виконується щодня о 9:30 ранку в контексті увійшовшого користувача.
 | 
			
		||||
- **Права доступу до каталогу**: Доступні для запису `CREATOR OWNER`, що дозволяє локальним користувачам скидувати довільні файли.
 | 
			
		||||
- **Поведение пошуку DLL**: Спробує завантажити `hostfxr.dll` спочатку з робочого каталогу і реєструє "NAME NOT FOUND", якщо відсутній, що вказує на пріоритет пошуку в локальному каталозі.
 | 
			
		||||
 | 
			
		||||
### Реалізація експлуатації
 | 
			
		||||
 | 
			
		||||
Зловмисник може помістити шкідливий `hostfxr.dll` stub в той же каталог, експлуатуючи відсутню DLL для досягнення виконання коду в контексті користувача:
 | 
			
		||||
```c
 | 
			
		||||
#include <windows.h>
 | 
			
		||||
 | 
			
		||||
BOOL APIENTRY DllMain(HMODULE hModule, DWORD fdwReason, LPVOID lpReserved) {
 | 
			
		||||
if (fdwReason == DLL_PROCESS_ATTACH) {
 | 
			
		||||
// Payload: display a message box (proof-of-concept)
 | 
			
		||||
MessageBoxA(NULL, "DLL Hijacked!", "TPQM", MB_OK);
 | 
			
		||||
}
 | 
			
		||||
return TRUE;
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
### Attack Flow
 | 
			
		||||
 | 
			
		||||
1. Як стандартний користувач, помістіть `hostfxr.dll` у `C:\ProgramData\Lenovo\TPQM\Assistant\`.
 | 
			
		||||
2. Зачекайте, поки заплановане завдання запуститься о 9:30 ранку в контексті поточного користувача.
 | 
			
		||||
3. Якщо адміністратор увійшов у систему, коли завдання виконується, шкідливий DLL запускається в сеансі адміністратора з середньою цілісністю.
 | 
			
		||||
4. Зв'яжіть стандартні методи обходу UAC, щоб підвищити з середньої цілісності до привілеїв SYSTEM.
 | 
			
		||||
 | 
			
		||||
### Mitigation
 | 
			
		||||
 | 
			
		||||
Lenovo випустила версію UWP **1.12.54.0** через Microsoft Store, яка встановлює TPQMAssistant у `C:\Program Files (x86)\Lenovo\TPQM\TPQMAssistant\`, видаляє вразливе заплановане завдання та видаляє застарілі компоненти Win32.
 | 
			
		||||
 | 
			
		||||
## References
 | 
			
		||||
 | 
			
		||||
- [CVE-2025-1729 - Privilege Escalation Using TPQMAssistant.exe](https://trustedsec.com/blog/cve-2025-1729-privilege-escalation-using-tpqmassistant-exe)
 | 
			
		||||
- [Microsoft Store - TPQM Assistant UWP](https://apps.microsoft.com/detail/9mz08jf4t3ng)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
- [https://medium.com/@pranaybafna/tcapt-dll-hijacking-888d181ede8e](https://medium.com/@pranaybafna/tcapt-dll-hijacking-888d181ede8e)
 | 
			
		||||
- [https://cocomelonc.github.io/pentest/2021/09/24/dll-hijacking-1.html](https://cocomelonc.github.io/pentest/2021/09/24/dll-hijacking-1.html)
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user