Dll Hijacking
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Bug bounty tip: зареєструйтесь на Intigriti, преміум платформі для винагород за вразливості, створеній хакерами для хакерів! Приєднуйтесь до нас на https://go.intigriti.com/hacktricks сьогодні та почніть заробляти винагороди до $100,000!
DLL Hijacking передбачає маніпуляцію довіреною програмою для завантаження шкідливого DLL. Цей термін охоплює кілька тактик, таких як DLL Spoofing, Injection, і Side-Loading. Він в основному використовується для виконання коду, досягнення стійкості та, меншою мірою, ескалації привілеїв. Незважаючи на акцент на ескалації тут, метод захоплення залишається незмінним для всіх цілей.
Для DLL hijacking використовуються кілька методів, кожен з яких має свою ефективність залежно від стратегії завантаження DLL програми:
DLL Replacement: Заміна справжнього DLL на шкідливий, за бажанням використовуючи DLL Proxying для збереження функціональності оригінального DLL.
DLL Search Order Hijacking: Розміщення шкідливого DLL у шляху пошуку перед легітимним, експлуатуючи шаблон пошуку програми.
Phantom DLL Hijacking: Створення шкідливого DLL для програми, щоб вона завантажила його, вважаючи, що це неіснуючий необхідний DLL.
DLL Redirection: Модифікація параметрів пошуку, таких як %PATH%
або .exe.manifest
/ .exe.local
файли, щоб направити програму на шкідливий DLL.
WinSxS DLL Replacement: Заміна легітимного DLL на шкідливий у каталозі WinSxS, метод, який часто асоціюється з DLL side-loading.
Relative Path DLL Hijacking: Розміщення шкідливого DLL у каталозі, контрольованому користувачем, з копією програми, що нагадує техніки Binary Proxy Execution.
Найпоширеніший спосіб знайти відсутні DLL у системі - це запуск procmon з sysinternals, встановивши наступні 2 фільтри:
і просто показати Діяльність файлової системи:
Якщо ви шукаєте відсутні dll загалом, ви залишаєте це запущеним на кілька секунд. Якщо ви шукаєте відсутній dll у конкретному виконуваному файлі, вам слід встановити інший фільтр, наприклад "Ім'я процесу" "містить" "<exec name>", виконати його та зупинити захоплення подій.
Щоб ескалувати привілеї, найкраща можливість, яку ми маємо, - це змогти написати dll, який привілейований процес спробує завантажити в деякому місці, де його будуть шукати. Тому ми зможемо написати dll у папці, де dll шукається перед папкою, де оригінальний dll (незвичайний випадок), або ми зможемо написати в деяку папку, де dll буде шукатися, а оригінальний dll не існує в жодній папці.
У документації Microsoft ви можете знайти, як конкретно завантажуються DLL.
Windows програми шукають DLL, дотримуючись набору попередньо визначених шляхів пошуку, дотримуючись певної послідовності. Проблема DLL hijacking виникає, коли шкідливий DLL стратегічно розміщується в одному з цих каталогів, забезпечуючи його завантаження перед автентичним DLL. Рішенням для запобігання цьому є забезпечення того, щоб програма використовувала абсолютні шляхи при посиланні на DLL, які їй потрібні.
Ви можете побачити порядок пошуку DLL на 32-бітних системах нижче:
Каталог, з якого завантажено програму.
Системний каталог. Використовуйте функцію GetSystemDirectory, щоб отримати шлях до цього каталогу.(C:\Windows\System32)
16-бітний системний каталог. Немає функції, яка отримує шлях до цього каталогу, але він шукається. (C:\Windows\System)
Каталог Windows. Використовуйте функцію GetWindowsDirectory, щоб отримати шлях до цього каталогу.
(C:\Windows)
Поточний каталог.
Каталоги, які вказані в змінній середовища PATH. Зверніть увагу, що це не включає шлях для кожного застосунку, вказаний ключем реєстру App Paths. Ключ App Paths не використовується при обчисленні шляху пошуку DLL.
Це за замовчуванням порядок пошуку з SafeDllSearchMode увімкненим. Коли він вимкнений, поточний каталог підвищується до другого місця. Щоб вимкнути цю функцію, створіть значення реєстру HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode і встановіть його на 0 (за замовчуванням увімкнено).
Якщо функція LoadLibraryEx викликається з LOAD_WITH_ALTERED_SEARCH_PATH, пошук починається в каталозі виконуваного модуля, який LoadLibraryEx завантажує.
Нарешті, зверніть увагу, що dll може бути завантажено, вказуючи абсолютний шлях, а не просто ім'я. У цьому випадку цей dll шукатиметься лише в цьому шляху (якщо у dll є якісь залежності, вони будуть шукатися так, як завантажено за ім'ям).
Є й інші способи змінити порядок пошуку, але я не буду пояснювати їх тут.
В документації 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 і ще більш дивно мати права на запис у папці системного шляху (за замовчуванням ви не можете). Але в неправильно налаштованих середовищах це можливо. У випадку, якщо вам пощастить і ви знайдете себе, що відповідає вимогам, ви можете перевірити проект UACME. Навіть якщо основна мета проекту - обійти UAC, ви можете знайти там PoC для Dll hijaking для версії Windows, яку ви можете використовувати (можливо, просто змінивши шлях до папки, де у вас є права на запис).
Зверніть увагу, що ви можете перевірити свої права в папці, виконавши:
І перевірте дозволи всіх папок всередині PATH:
Ви також можете перевірити імпорти виконуваного файлу та експорти dll за допомогою:
Для повного посібника про те, як зловживати Dll Hijacking для ескалації привілеїв з правами на запис у папку системного шляху, перегляньте:
Writable Sys Path +Dll Hijacking PrivescWinpeas перевірить, чи маєте ви права на запис у будь-якій папці всередині системного шляху. Інші цікаві автоматизовані інструменти для виявлення цієї вразливості - це функції PowerSploit: Find-ProcessDLLHijack, Find-PathDLLHijack та Write-HijackDll.
Якщо ви знайдете експлуатовану ситуацію, однією з найважливіших речей для успішної експлуатації буде створити dll, яка експортує принаймні всі функції, які виконуваний файл імпортуватиме з неї. У будь-якому випадку, зверніть увагу, що Dll Hijacking є корисним для ескалації з середнього рівня цілісності до високого (обхід UAC) або з високого рівня цілісності до SYSTEM. Ви можете знайти приклад як створити дійсну dll в цьому дослідженні dll hijacking, зосередженому на dll hijacking для виконання: https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows. Більше того, у наступному розділі ви можете знайти деякі базові коди dll, які можуть бути корисними як шаблони або для створення dll з не обов'язковими експортованими функціями.
В основному, Dll проксі - це Dll, здатна виконувати ваш шкідливий код при завантаженні, але також виконувати та працювати як очікувалося, пересилаючи всі виклики до реальної бібліотеки.
За допомогою інструменту DLLirant або Spartacus ви можете фактично вказати виконуваний файл і вибрати бібліотеку, яку хочете проксувати, і згенерувати проксовану dll або вказати Dll і згенерувати проксовану dll.
Отримати rev shell (x64):
Отримати meterpreter (x86):
Створіть користувача (x86, я не бачив версії x64):
Зверніть увагу, що в кількох випадках Dll, яку ви компілюєте, повинна експортувати кілька функцій, які будуть завантажені жертвою, якщо ці функції не існують, бінарний файл не зможе їх завантажити і експлуатація зазнає невдачі.
Bug bounty tip: зареєструйтесь на Intigriti, преміум платформі для винагород за вразливості, створеній хакерами для хакерів! Приєднуйтесь до нас на https://go.intigriti.com/hacktricks сьогодні та почніть заробляти винагороди до $100,000!
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)