Translated ['src/windows-hardening/windows-local-privilege-escalation/dl

This commit is contained in:
Translator 2025-07-09 09:14:20 +00:00
parent 24292a9eb9
commit 5586bbbba6

View File

@ -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 фільтри**:
![](<../../../images/image (961).png>)
@ -29,33 +30,34 @@ DLL Hijacking передбачає маніпуляцію довіреною п
![](<../../../images/image (153).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)