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: zarejestruj się w Intigriti, premium platformie bug bounty stworzonej przez hackerów, dla hackerów! Dołącz do nas na https://go.intigriti.com/hacktricks już dziś i zacznij zarabiać nagrody do 100 000 USD!
DLL Hijacking polega na manipulowaniu zaufaną aplikacją w celu załadowania złośliwego DLL. Termin ten obejmuje kilka taktyk, takich jak DLL Spoofing, Injection i Side-Loading. Jest głównie wykorzystywany do wykonywania kodu, osiągania trwałości i, rzadziej, eskalacji uprawnień. Mimo że skupiamy się tutaj na eskalacji, metoda hijackingu pozostaje spójna w różnych celach.
Wykorzystywanych jest kilka metod do DLL hijacking, z których każda ma swoją skuteczność w zależności od strategii ładowania DLL aplikacji:
DLL Replacement: Wymiana autentycznego DLL na złośliwy, opcjonalnie z użyciem DLL Proxying w celu zachowania funkcjonalności oryginalnego DLL.
DLL Search Order Hijacking: Umieszczanie złośliwego DLL w ścieżce wyszukiwania przed legalnym, wykorzystując wzór wyszukiwania aplikacji.
Phantom DLL Hijacking: Tworzenie złośliwego DLL, który aplikacja załadowuje, myśląc, że jest to nieistniejący wymagany DLL.
DLL Redirection: Modyfikowanie parametrów wyszukiwania, takich jak %PATH%
lub pliki .exe.manifest
/ .exe.local
, aby skierować aplikację do złośliwego DLL.
WinSxS DLL Replacement: Zastępowanie legalnego DLL złośliwym odpowiednikiem w katalogu WinSxS, metoda często związana z DLL side-loading.
Relative Path DLL Hijacking: Umieszczanie złośliwego DLL w katalogu kontrolowanym przez użytkownika z skopiowaną aplikacją, przypominającym techniki Binary Proxy Execution.
Najczęstszym sposobem na znalezienie brakujących DLL w systemie jest uruchomienie procmon z sysinternals, ustawiając następujące 2 filtry:
i pokazując tylko Aktywność systemu plików:
Jeśli szukasz brakujących dll w ogóle, powinieneś pozostawić to uruchomione przez kilka sekund. Jeśli szukasz brakującego dll w konkretnej aplikacji, powinieneś ustawić inny filtr, taki jak "Nazwa procesu" "zawiera" "<nazwa exec>", uruchomić go i zatrzymać rejestrowanie zdarzeń.
Aby eskalować uprawnienia, najlepszą szansą, jaką mamy, jest możliwość napisania dll, który proces z uprawnieniami spróbuje załadować w jednym z miejsc, gdzie będzie szukany. Dlatego będziemy mogli napisać dll w folderze, w którym dll jest wyszukiwany przed folderem, w którym znajduje się oryginalny dll (dziwny przypadek), lub będziemy mogli napisać w jakimś folderze, gdzie dll będzie wyszukiwany, a oryginalny dll nie istnieje w żadnym folderze.
W dokumentacji Microsoftu możesz znaleźć, jak DLL są ładowane konkretnie.
Aplikacje Windows szukają DLL, podążając za zestawem zdefiniowanych ścieżek wyszukiwania, przestrzegając określonej sekwencji. Problem z DLL hijacking pojawia się, gdy złośliwy DLL jest strategicznie umieszczany w jednym z tych katalogów, zapewniając, że zostanie załadowany przed autentycznym DLL. Rozwiązaniem, aby temu zapobiec, jest upewnienie się, że aplikacja używa ścieżek bezwzględnych, gdy odnosi się do wymaganych DLL.
Możesz zobaczyć kolejność wyszukiwania DLL w systemach 32-bitowych poniżej:
Katalog, z którego aplikacja została załadowana.
Katalog systemowy. Użyj funkcji GetSystemDirectory, aby uzyskać ścieżkę do tego katalogu. (C:\Windows\System32)
Katalog systemowy 16-bitowy. Nie ma funkcji, która uzyskuje ścieżkę do tego katalogu, ale jest on przeszukiwany. (C:\Windows\System)
Katalog Windows. Użyj funkcji GetWindowsDirectory, aby uzyskać ścieżkę do tego katalogu. (C:\Windows)
Bieżący katalog.
Katalogi wymienione w zmiennej środowiskowej PATH. Zauważ, że nie obejmuje to ścieżki per-aplikacji określonej przez klucz rejestru App Paths. Klucz App Paths nie jest używany przy obliczaniu ścieżki wyszukiwania DLL.
To jest domyślna kolejność wyszukiwania z włączonym SafeDllSearchMode. Gdy jest wyłączony, bieżący katalog awansuje na drugie miejsce. Aby wyłączyć tę funkcję, utwórz wartość rejestru HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode i ustaw ją na 0 (domyślnie jest włączona).
Jeśli funkcja LoadLibraryEx jest wywoływana z LOAD_WITH_ALTERED_SEARCH_PATH, wyszukiwanie zaczyna się w katalogu modułu wykonywalnego, który LoadLibraryEx ładuje.
Na koniec zauważ, że dll może być załadowany, wskazując bezwzględną ścieżkę zamiast tylko nazwy. W takim przypadku ten dll będzie wyszukiwany tylko w tej ścieżce (jeśli dll ma jakieś zależności, będą one wyszukiwane tak, jakby były załadowane tylko po nazwie).
Istnieją inne sposoby na zmianę sposobów zmiany kolejności wyszukiwania, ale nie zamierzam ich tutaj wyjaśniać.
Niektóre wyjątki od standardowej kolejności wyszukiwania DLL są zauważane w dokumentacji Windows:
Gdy napotkany jest DLL, który dzieli swoją nazwę z już załadowanym w pamięci, system pomija zwykłe wyszukiwanie. Zamiast tego wykonuje sprawdzenie przekierowania i manifestu, zanim domyślnie przejdzie do DLL już w pamięci. W tej sytuacji system nie przeprowadza wyszukiwania DLL.
W przypadkach, gdy DLL jest rozpoznawany jako znany DLL dla bieżącej wersji Windows, system wykorzysta swoją wersję znanego DLL, wraz z wszelkimi jego zależnymi DLL, pomijając proces wyszukiwania. Klucz rejestru HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs zawiera listę tych znanych DLL.
Jeśli DLL ma zależności, wyszukiwanie tych zależnych DLL jest przeprowadzane tak, jakby były wskazywane tylko przez swoje nazwy modułów, niezależnie od tego, czy początkowy DLL został zidentyfikowany przez pełną ścieżkę.
Wymagania:
Zidentyfikuj proces, który działa lub będzie działał z innymi uprawnieniami (ruch poziomy lub boczny), który nie ma DLL.
Upewnij się, że dostęp do zapisu jest dostępny dla dowolnego katalogu, w którym DLL będzie wyszukiwany. To miejsce może być katalogiem wykonywalnym lub katalogiem w ścieżce systemowej.
Tak, wymagania są skomplikowane do znalezienia, ponieważ domyślnie dość dziwne jest znalezienie uprzywilejowanego pliku wykonywalnego bez dll i jest jeszcze dziwniejsze, aby mieć uprawnienia do zapisu w folderze ścieżki systemowej (domyślnie nie możesz). Ale w źle skonfigurowanych środowiskach jest to możliwe. W przypadku, gdy masz szczęście i spełniasz wymagania, możesz sprawdzić projekt UACME. Nawet jeśli głównym celem projektu jest obejście UAC, możesz tam znaleźć PoC DLL hijacking dla wersji Windows, której możesz użyć (prawdopodobnie zmieniając tylko ścieżkę folderu, w którym masz uprawnienia do zapisu).
Zauważ, że możesz sprawdzić swoje uprawnienia w folderze wykonując:
I sprawdź uprawnienia wszystkich folderów w PATH:
Możesz również sprawdzić importy pliku wykonywalnego i eksporty dll za pomocą:
Aby uzyskać pełny przewodnik na temat wykorzystania Dll Hijacking do eskalacji uprawnień z uprawnieniami do zapisu w folderze System Path, sprawdź:
Writable Sys Path +Dll Hijacking PrivescWinpeas sprawdzi, czy masz uprawnienia do zapisu w jakimkolwiek folderze w system PATH. Inne interesujące narzędzia automatyczne do odkrywania tej podatności to funkcje PowerSploit: Find-ProcessDLLHijack, Find-PathDLLHijack i Write-HijackDll.
W przypadku znalezienia scenariusza do wykorzystania, jedną z najważniejszych rzeczy, aby skutecznie go wykorzystać, będzie stworzenie dll, która eksportuje przynajmniej wszystkie funkcje, które wykonywalny plik zaimportuje z niej. Tak czy inaczej, zauważ, że Dll Hijacking jest przydatny do eskalacji z poziomu Medium Integrity do High (obejście UAC) lub z High Integrity do SYSTEM. Możesz znaleźć przykład jak stworzyć ważną dll w tym badaniu dotyczącym dll hijacking skoncentrowanym na dll hijacking do wykonania: https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows. Ponadto, w następnej sekcji znajdziesz kilka podstawowych kodów dll, które mogą być przydatne jako szablony lub do stworzenia dll z niepotrzebnymi funkcjami eksportowanymi.
W zasadzie Dll proxy to Dll zdolna do wykonywania twojego złośliwego kodu po załadowaniu, ale także do ekspozycji i działania zgodnie z oczekiwaniami, przekazując wszystkie wywołania do prawdziwej biblioteki.
Za pomocą narzędzia DLLirant lub Spartacus możesz faktycznie wskazać wykonywalny plik i wybrać bibliotekę, którą chcesz proxifikować oraz wygenerować proxifikowaną dll lub wskazać Dll i wygenerować proxifikowaną dll.
Uzyskaj rev shell (x64):
Uzyskaj meterpreter (x86):
Utwórz użytkownika (x86, nie widziałem wersji x64):
Zauważ, że w kilku przypadkach Dll, którą kompilujesz, musi eksportować kilka funkcji, które będą ładowane przez proces ofiary; jeśli te funkcje nie istnieją, plik binarny nie będzie w stanie ich załadować i eksploit się nie powiedzie.
Wskazówka dotycząca bug bounty: zarejestruj się w Intigriti, premium platformie bug bounty stworzonej przez hackerów, dla hackerów! Dołącz do nas na https://go.intigriti.com/hacktricks już dziś i zacznij zarabiać nagrody do 100 000 $!
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)