Vectored Overloading PE Injection

Tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Jifunze na fanya mazoezi ya Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks

Tip

Unatafuta mbinu za Windows 11 LFH heap shaping na VMware Workstation PVSCSI (vmware-vmx) escape techniques?

{{#ref}} vmware-workstation-pvscsi-lfh-escape.md {{#endref}}

Muhtasari wa mbinu

Vectored Overloading ni Windows PE injection primitive inayochanganya classic Module Overloading na Vectored Exception Handlers (VEHs) na hardware breakpoints. Badala ya kupachika LoadLibrary au kuandika loader yake mwenyewe, mshambuliaji:

  1. Anaunda section ya SEC_IMAGE inayoungwa mkono na DLL halali (mfano, wmp.dll).
  2. Anakandamiza mapped view na PE mbaya iliyosogezwa kikamilifu lakini akaweka section object ikielekea picha nzuri kwenye diski.
  3. Anasajili VEH na kuendesha debug registers ili kila simu ya NtOpenSection, NtMapViewOfSection, na hiari NtClose ifanye breakpoint ya user-mode.
  4. Anaita LoadLibrary("amsi.dll") (au DLL nyingine yoyote isiyo-hasimu). Wakati loader ya Windows inapoita syscalls hizo, VEH inapitia kernel transition na kurudisha handles na base addresses za picha mbaya zilizotayarishwa.

Kwa kuwa loader bado inaamini ilirambia DLL iliyoombwa, zana ambazo zinatafuta tu section backing files zinaona wmp.dll ingawa memory sasa ina payload ya mshambuliaji. Wakati huo huo, imports/TLS callbacks bado zinafunguliwa na loader halisi, hivyo kupunguza kiasi cha PE-parsing ya custom mshambuliaji anapaswa kudumisha.

Hatua ya 1 – Tengeneza sehemu iliyofichwa

  1. Tengeneza na ramisha section kwa DLL ya kisingizio
NtCreateSection(&DecoySection, SECTION_ALL_ACCESS, NULL,
0, PAGE_READWRITE, SEC_IMAGE, L"\??\C:\\Windows\\System32\\wmp.dll");
NtMapViewOfSection(DecoySection, GetCurrentProcess(), &DecoyView, 0, 0,
NULL, &DecoySize, ViewShare, 0, PAGE_READWRITE);
  1. Nakili PE mbaya ndani ya view hiyo section kwa section, ukiheshimu SizeOfRawData/VirtualSize na kusasisha ulinzi baadae (PAGE_EXECUTE_READ, PAGE_READWRITE, nk.).
  2. Tumia relocations na tatua imports kwa usahihi kama reflective loader ingefanya. Kwa kuwa view tayari imemapishwa kama SEC_IMAGE, alignments za section na guard pages zinaendana na matarajio ya Windows loader baadaye.
  3. Sanitiza header ya PE:
  • Ikiwa payload ni EXE, weka IMAGE_FILE_HEADER.Characteristics |= IMAGE_FILE_DLL na weka entry point kuwa sifuri ili kuzuia LdrpCallTlsInitializers kuruka ndani ya stubs maalumu za EXE.
  • DLL payloads zinaweza kuendelea kutumia headers zao bila mabadiliko.

Kwa hatua hii mchakato unamiliki view yenye uwezo wa RWX lakini backing object bado ni wmp.dll, huku bytes za memory zikidhibitiwa na mshambuliaji.

Hatua ya 2 – Rivalisha loader kwa VEHs

  1. Sajili VEH na weka hardware breakpoints: panga Dr0 (au register nyingine ya debug) kwa anwani ya ntdll!NtOpenSection na weka DR7 ili kila utekelezaji ulete STATUS_SINGLE_STEP. Rudia baadaye kwa NtMapViewOfSection na hiari NtClose.
  2. Inua mzigo wa DLL kwa kutumia LoadLibrary("amsi.dll"). LdrLoadDll hatimaye itaweka simu ya NtOpenSection kupata section handle halisi.
  3. VEH hook kwa NtOpenSection:
  • Tafuta slot ya stack ya hoja ya [out] PHANDLE SectionHandle.
  • Andika handle ya DecoySection iliyotengenezwa hapo awali ndani ya slot hiyo.
  • Endesha RIP/EIP hadi kwa maagizo ya ret ili kernel isishiriki.
  • Re-arm hardware breakpoint kuona NtMapViewOfSection ifuatayo.
  1. VEH hook kwa NtMapViewOfSection:
  • Kandika tena [out] PVOID *BaseAddress (na outputs za size/protection) na anwani ya view mbaya iliyokuwepo tayari.
  • Ruka sehemu ya syscall kama kabla.
  1. (Hiari) VEH hook kwa NtClose inathibitisha kuwa fake section handle imetolewa, kuzuia resource leaks na kutoa ukaguzi wa mwisho wa busara.

Kwa kuwa syscalls hazitekelezeki, callback za kernel (ETWti, minifilter, nk.) haziona matukio ya NtOpenSection/NtMapViewOfSection yenye shaka, hivyo kupunguza telemetry kwa kiasi kikubwa. Kwa mtazamo wa loader kila kitu kilifanikiwa na amsi.dll iko katika memory, hivyo inaendelea na utatuzi wa imports/TLS dhidi ya bytes za mshambuliaji.

Maelezo ya utekelezaji ya PoC (2025)

PoC ya umma inaonyesha baadhi ya maelezo ya vitendo yanayoweza kupitwa wakati wa kutekeleza tena mbinu:

  • HWBPs ni kwa kila thread. PoC inaweka CONTEXT_DEBUG_REGISTERS kwenye thread ya sasa kabla ya kuita LoadLibrary, hivyo VEH lazima iendeshwe kwenye thread ile ile inayochochea loader.
  • Emulation ya syscall: VEH inaweka RAX = 0 na kuendesha RIP hadi ret ndani ya stub ya ntdll (inatafuta 0xC3) ili kernel transition isitokee, kisha inaendelea kwa NtContinue.
  • Parameters za output: kwa NtMapViewOfSection, VEH inaandika upya BaseAddress, ViewSize, na Win32Protect zilizorejeshwa ili loader iaiamini mapping ilifanikiwa na kuendelea na imports/TLS ikitumia view ya mshambuliaji.

Minimal HWBP setup used by the PoC (x64):

CONTEXT ctx = {0};
ctx.ContextFlags = CONTEXT_DEBUG_REGISTERS;
GetThreadContext(GetCurrentThread(), &ctx);
ctx.Dr0 = (DWORD64)NtOpenSection;
ctx.Dr7 = 1;
SetThreadContext(GetCurrentThread(), &ctx);
AddVectoredExceptionHandler(1, VehHandler);

Tofauti ya kujificha

Utafiti wa hivi karibuni juu ya VEH unaonyesha kwamba watunzaji wanaweza kusajiliwa kwa kuendesha kwa mkono orodha ya VEH badala ya kuita AddVectoredExceptionHandler, jambo linalopunguza utegemezi wa user-mode APIs ambazo zinaweza kufuatiliwa au ku-hook. Hii si lazima kwa Vectored Overloading lakini inaweza kuchanganywa nayo kupunguza shughuli za API zinazoonekana.

Hatua 3 – Tekeleza payload

  • EXE payload: injector anaruka tu kwenye original entry point mara relocations zimekamilika. Wakati loader inadhani itaitisha DllMain, badala yake code maalum hufanya entry ya mtindo wa EXE.
  • DLL payload / Node.js addon: Tengeneza na itumie export iliyokusudiwa (Kidkadi inaonyesha function yenye jina kwa JavaScript). Kwa kuwa module tayari imesajiliwa kwa LdrpModuleBaseAddressIndex, uchunguzi unaofuata unaiona kama DLL isiyo hatari.

Wakati ikichanganywa na Node.js native addon (.node file), mzigo mzito wa Windows-internals unabaki nje ya tabaka la JavaScript, na hivyo kuwasaidia threat actor kusafirisha loader ile ile pamoja na wrappers nyingi za Node zilizo obfuscated.

References

Tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Jifunze na fanya mazoezi ya Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks