Vectored Overloading PE Injection

Tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

Pregled tehnike

Vectored Overloading je Windows PE injection primitive koja spaja klasični Module Overloading sa Vectored Exception Handlers (VEHs) i hardware breakpoints. Umesto da patchuje LoadLibrary ili napiše sopstveni loader, napadač:

  1. Kreira SEC_IMAGE sekciju koja je vezana za legitimni DLL (npr. wmp.dll).
  2. Prepisuje mapirani view sa potpuno relociranim malicioznim PE-om, ali ostavlja objekat sekcije da pokazuje na benigni fajl na disku.
  3. Registruje VEH i programira debug registre tako da svaki poziv NtOpenSection, NtMapViewOfSection, i opciono NtClose podiže user-mode breakpoint.
  4. Poziva LoadLibrary("amsi.dll") (ili bilo koji drugi benigni target). Kada Windows loader pozove pomenute syscall-ove, VEH preskače kernel transition i vraća handle-ove i base adrese pripremljenog malicioznog imag-a.

Pošto loader i dalje veruje da je mapirao traženi DLL, alati koji gledaju samo backing fajlove sekcija vide wmp.dll iako memorija sada sadrži payload napadača. U međuvremenu, imports/TLS callbacks i dalje rešava pravi loader, značajno smanjujući količinu custom PE-parsing logike koju napadač mora da održava.

Stage 1 – Build the disguised section

  1. Create and map a section for the decoy DLL
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. Copy the malicious PE into that view section by section, honouring SizeOfRawData/VirtualSize and updating protections afterwards (PAGE_EXECUTE_READ, PAGE_READWRITE, etc.).
  2. Apply relocations and resolve imports exactly as a reflective loader would. Because the view is already mapped as SEC_IMAGE, section alignments and guard pages match what the Windows loader expects later.
  3. Normalize the PE header:
  • If the payload is an EXE, set IMAGE_FILE_HEADER.Characteristics |= IMAGE_FILE_DLL and zero the entry point to keep LdrpCallTlsInitializers from jumping into EXE-specific stubs.
  • DLL payloads can keep their headers unchanged.

U ovom trenutku proces poseduje RWX-sposoban view čiji je backing object i dalje wmp.dll, dok su bajtovi u memoriji pod kontrolom napadača.

Stage 2 – Hijack the loader with VEHs

  1. Register a VEH and arm hardware breakpoints: programirajte Dr0 (ili neki drugi debug register) sa adresom ntdll!NtOpenSection i podesite DR7 tako da svaka izvršavanja podiže STATUS_SINGLE_STEP. Ponovite kasnije za NtMapViewOfSection i opciono NtClose.
  2. Trigger DLL loading with LoadLibrary("amsi.dll"). LdrLoadDll će na kraju pozvati NtOpenSection da dobije realan section handle.
  3. VEH hook for NtOpenSection:
  • Pronađite stack slot za [out] PHANDLE SectionHandle argument.
  • Upisujete prethodno kreirani DecoySection handle u taj slot.
  • Pomaknite RIP/EIP na ret instrukciju tako da kernel nikada nije pozvan.
  • Ponovo naoružajte hardware breakpoint da prati NtMapViewOfSection sledeće.
  1. VEH hook for NtMapViewOfSection:
  • Prepišite [out] PVOID *BaseAddress (i izlaze za size/protection) adresom već mapiranog malicioznog view-a.
  • Preskočite telo syscall-a kao i ranije.
  1. (Optional) VEH hook for NtClose proverava da je fake section handle oslobođen, sprečavajući resource leaks i pružajući završnu proveru ispravnosti.

Pošto se syscall-ovi nikada ne izvršavaju, kernel callback-i (ETWti, minifilter, itd.) ne primete sumnjive NtOpenSection/NtMapViewOfSection događaje, što drastično snižava telemetry. Iz perspektive loader-a, sve je uspelo i amsi.dll je u memoriji, pa nastavlja sa rešavanjem import-ova/TLS protiv bajtova napadača.

Stage 3 – Execute the payload

  • EXE payload: Injector jednostavno skače na originalni entry point kada su relocations završene. Kada loader misli da bi pozvao DllMain, umesto toga se izvršava custom kod koji ponaša kao EXE-style entry.
  • DLL payload / Node.js addon: Resolve-ujte i pozovite željeni export (Kidkadi izlaže imenovanu funkciju za JavaScript). Pošto je modul već registrovan u LdrpModuleBaseAddressIndex, naredna pretraživanja ga vide kao benigni DLL.

Kada se kombinuje sa Node.js native addon-om (.node fajl), sva težina Windows-internals poslova ostaje van JavaScript sloja, pomažući threat actor-u da isporuči isti loader sa mnogim različitim obfuskovanim Node wrapper-ima.

References

Tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks