diff --git a/src/windows-hardening/windows-local-privilege-escalation/dll-hijacking/README.md b/src/windows-hardening/windows-local-privilege-escalation/dll-hijacking/README.md index 23102c085..72c716703 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/dll-hijacking/README.md +++ b/src/windows-hardening/windows-local-privilege-escalation/dll-hijacking/README.md @@ -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" "\", виконати його та зупинити захоплення подій**. +Якщо ви шукаєте **відсутні dll загалом**, ви **залишаєте** це працювати кілька **секунд**.\ +Якщо ви шукаєте **відсутній dll у конкретному виконуваному файлі**, вам слід встановити **інший фільтр, наприклад "Process Name" "contains" "\", виконати його і зупинити захоплення подій**. ## 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 + +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)