Dll Hijacking
Підказка щодо багів у винагороді: зареєструйтеся на Intigriti, преміальній платформі для багів, створеній хакерами для хакерів! Приєднуйтесь до нас на https://go.intigriti.com/hacktricks сьогодні, і почніть заробляти винагороди до $100,000!
Основна інформація
Викрадення DLL включає маніпулювання довіреною програмою для завантаження шкідливої DLL. Цей термін охоплює кілька тактик, таких як підробка, ін'єкція та бокове завантаження DLL. Це використовується головним чином для виконання коду, досягнення постійності та, менш часто, підвищення привілеїв. Незважаючи на акцент на підвищенні привілеїв тут, метод викрадення залишається стійким незалежно від цілей.
Загальні техніки
Для викрадення DLL використовуються кілька методів, кожен з яких має свою ефективність в залежності від стратегії завантаження DLL програми:
Заміна DLL: Заміна справжньої DLL на шкідливу, за необхідності використовуючи Підробку DLL для збереження функціональності оригінальної DLL.
Викрадення порядку пошуку DLL: Розміщення шкідливої DLL у шляху пошуку перед законною, використовуючи шаблон пошуку програми.
Викрадення фантомної DLL: Створення шкідливої DLL для завантаження програмою, вважаючи, що це невідома необхідна DLL.
Перенаправлення DLL: Зміна параметрів пошуку, таких як
%PATH%
або файли.exe.manifest
/.exe.local
, щоб спрямувати програму на шкідливу DLL.Заміна DLL у WinSxS: Заміна законної DLL на шкідливий еквівалент у каталозі WinSxS, метод часто пов'язаний з боковим завантаженням DLL.
Викрадення DLL за відносним шляхом: Розміщення шкідливої DLL у каталозі, котрий контролюється користувачем, разом з копійованою програмою, нагадуючи техніки виконання бінарних проксі.
Пошук відсутніх DLL
Найпоширеніший спосіб знайти відсутні DLL у системі - запустити procmon від sysinternals, встановивши наступні 2 фільтри:
і просто показати Активність файлової системи:
Якщо ви шукаєте відсутні DLL загалом, ви залишаєте це працюючим протягом декількох секунд. Якщо ви шукаєте відсутню DLL у конкретному виконуваному файлі, вам слід встановити інший фільтр, наприклад "Ім'я процесу" "містить" "<ім'я виконуваного файлу>", виконати його і зупинити захоплення подій.
Використання відсутніх DLL
Для підвищення привілеїв найкращий шанс - мати можливість записати DLL, яку привілейований процес спробує завантажити в якомусь місці, де її буде шукати. Тому ми зможемо записати DLL у каталозі, де DLL шукається перед каталогом, де знаходиться оригінальна DLL (дивний випадок), або ми зможемо записати у каталозі, де буде шукатися DLL, а оригінальна DLL не існує у жодному каталозі.
Порядок пошуку DLL
У документації Microsoft можна знайти, як саме завантажуються DLL.
Windows-додатки шукають DLL, слідуючи набору передбачених шляхів пошуку, дотримуючись певної послідовності. Проблема викрадення DLL виникає, коли шкідлива 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 є залежності, вони будуть шукатися за іменем, що їх завантажено).
Є інші способи змінити порядок пошуку, але я не буду пояснювати їх тут.
Виключення у порядку пошуку DLL з документації Windows
Деякі виключення зі стандартного порядку пошуку DLL відзначені в документації Windows:
Коли зустрічається 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 для версії Windows, яку ви можете використовувати (імовірно, просто змінивши шлях каталогу, де у вас є права на запис).
Зверніть увагу, що ви можете перевірити свої дозволи в каталозі, виконавши:
І перевірте дозволи на всі папки всередині ШЛЯХУ:
Ви також можете перевірити імпорти виконуваного файлу та експорти dll за допомогою:
Для повного посібника з зловживання Dll Hijacking для підвищення привілеїв з дозволом на запис у папці System Path перевірте:
pageWritable Sys Path +Dll Hijacking PrivescАвтоматизовані інструменти
Winpeas перевірить, чи є у вас права на запис у будь-якій папці всередині системного шляху. Інші цікаві автоматизовані інструменти для виявлення цієї вразливості - це функції PowerSploit: Find-ProcessDLLHijack, Find-PathDLLHijack та Write-HijackDll.
Приклад
У випадку виявлення ситуації, яку можна використати для атаки, одним з найважливіших аспектів успішної експлуатації буде створення dll, яка експортує принаймні всі функції, які виконуваний файл буде імпортувати з неї. У будь-якому випадку, слід зауважити, що Dll Hijacking допомагає підвищити рівень середовища від середнього до високого (обхід UAC) або з високого рівня до SYSTEM. Ви можете знайти приклад створення дійсної dll у цьому дослідженні зосередженому на Dll Hijacking для виконання: https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows. Більше того, у наступному розділі ви можете знайти деякі основні коди dll, які можуть бути корисними як шаблони або для створення dll з експортом функцій, які не потрібні.
Створення та компіляція Dlls
Проксіфікація Dll
Основна ідея проксі-бібліотеки Dll полягає в тому, що вона може виконувати ваш шкідливий код при завантаженні, а також виконувати та працювати як вимагається, перенаправляючи всі виклики до реальної бібліотеки.
За допомогою інструментів DLLirant або Spartacus ви можете вказати виконавчий файл та вибрати бібліотеку, яку ви хочете проксіфікувати та створити проксіфіковану dll або вказати Dll та створити проксіфіковану dll.
Meterpreter
Отримати обернену оболонку (x64):
Отримати meterpreter (x86):
Створення користувача (x86 я не бачив версії x64):
Ваш власний
Зверніть увагу, що у декількох випадках Dll, який ви компілюєте, повинен експортувати кілька функцій, які будуть завантажені жертовним процесом, якщо ці функції не існують, бінарний файл не зможе їх завантажити, і експлойт не вдасться.
Посилання
Підказка щодо винагороди за виявлення помилок: зареєструйтесь на Intigriti, преміальній платформі для виявлення помилок, створеній хакерами для хакерів! Приєднуйтесь до нас на https://go.intigriti.com/hacktricks сьогодні, і почніть заробляти винагороди до $100,000!
Last updated