Vectored Overloading PE Injection

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ

๊ธฐ์ˆ  ๊ฐœ์š”

Vectored Overloading๋Š” ์ „ํ†ต์ ์ธ Module Overloading๊ณผ Vectored Exception Handlers (VEHs), hardware breakpoints๋ฅผ ๊ฒฐํ•ฉํ•œ Windows PE ์ธ์ ์…˜ ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค. LoadLibrary๋ฅผ ํŒจ์น˜ํ•˜๊ฑฐ๋‚˜ ์ž์ฒด ๋กœ๋”๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋Œ€์‹ , ๊ณต๊ฒฉ์ž๋Š”:

  1. ์ •์ƒ DLL(์˜ˆ: wmp.dll)์— ๊ธฐ๋ฐ˜ํ•œ SEC_IMAGE ์„น์…˜์„ ์ƒ์„ฑํ•œ๋‹ค.
  2. ๋งคํ•‘๋œ ๋ทฐ๋ฅผ ์™„์ „ํžˆ ์žฌ๋ฐฐ์น˜๋œ ์•…์„ฑ PE๋กœ ๋ฎ์–ด์“ฐ๋˜ ์„น์…˜ ์˜ค๋ธŒ์ ํŠธ๋Š” ๋””์Šคํฌ์˜ ์ •์ƒ ์ด๋ฏธ์ง€(wmp.dll)๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ์œ ์ง€ํ•œ๋‹ค.
  3. VEH๋ฅผ ๋“ฑ๋กํ•˜๊ณ  ๋””๋ฒ„๊ทธ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜์—ฌ NtOpenSection, NtMapViewOfSection, ํ•„์š”์‹œ NtClose์— ๋Œ€ํ•œ ๋ชจ๋“  ํ˜ธ์ถœ๋งˆ๋‹ค ์‚ฌ์šฉ์ž ๋ชจ๋“œ ๋ธŒ๋ ˆ์ดํฌํฌ์ธํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋„๋ก ํ•œ๋‹ค.
  4. LoadLibrary(โ€œamsi.dllโ€)(๋˜๋Š” ๋‹ค๋ฅธ ์ •์ƒ ๋Œ€์ƒ)๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. Windows ๋กœ๋”๊ฐ€ ํ•ด๋‹น syscall๋“ค์„ ํ˜ธ์ถœํ•  ๋•Œ VEH๊ฐ€ ์ปค๋„ ์ „ํ™˜์„ ๊ฑด๋„ˆ๋›ฐ๊ณ  ์ค€๋น„๋œ ์•…์„ฑ ์ด๋ฏธ์ง€์˜ ํ•ธ๋“ค๊ณผ ๋ฒ ์ด์Šค ์ฃผ์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋กœ๋”๋Š” ์—ฌ์ „ํžˆ ์š”์ฒญํ•œ DLL์„ ๋งคํ•‘ํ–ˆ๋‹ค๊ณ  ๋ฏฟ๊ธฐ ๋•Œ๋ฌธ์—, ์„น์…˜์˜ backing ํŒŒ์ผ๋งŒ ํ™•์ธํ•˜๋Š” ํˆด์€ ๋ฉ”๋ชจ๋ฆฌ์— ๊ณต๊ฒฉ์ž์˜ ํŽ˜์ด๋กœ๋“œ๊ฐ€ ๋“ค์–ด ์žˆ์Œ์—๋„ wmp.dll์„ ๋ณด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ•œํŽธ imports/TLS callbacks๋Š” ์ง„์งœ ๋กœ๋”์— ์˜ํ•ด ์—ฌ์ „ํžˆ ํ•ด๊ฒฐ๋˜๋ฏ€๋กœ ๊ณต๊ฒฉ์ž๊ฐ€ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ์ปค์Šคํ…€ PE ํŒŒ์‹ฑ ๋กœ์ง์˜ ์–‘์ด ํฌ๊ฒŒ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.

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. ํ•ด๋‹น ๋ทฐ์— ์„น์…˜ ๋‹จ์œ„๋กœ ์•…์„ฑ PE๋ฅผ ๋ณต์‚ฌํ•˜๋˜ SizeOfRawData/VirtualSize๋ฅผ ์ค€์ˆ˜ํ•˜๊ณ  ์ดํ›„ ๋ณดํ˜ธ ์†์„ฑ(PAGE_EXECUTE_READ, PAGE_READWRITE ๋“ฑ)์„ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
  2. ๋ฐ˜์‚ฌ ๋กœ๋”(reflective loader)๊ฐ€ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ •ํ™•ํžˆ ์žฌ๋ฐฐ์น˜(relocations)์™€ ์ž„ํฌํŠธ ํ•ด๊ฒฐ(imports)์„ ์ ์šฉํ•œ๋‹ค. ๋ทฐ๊ฐ€ ์ด๋ฏธ SEC_IMAGE๋กœ ๋งคํ•‘๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์„น์…˜ ์ •๋ ฌ๊ณผ ๊ฐ€๋“œ ํŽ˜์ด์ง€๋Š” ์ดํ›„ Windows ๋กœ๋”๊ฐ€ ์˜ˆ์ƒํ•˜๋Š” ๊ฒƒ๊ณผ ์ผ์น˜ํ•œ๋‹ค.
  3. PE ํ—ค๋” ์ •๊ทœํ™”:
  • ํŽ˜์ด๋กœ๋“œ๊ฐ€ EXE์ธ ๊ฒฝ์šฐ, IMAGE_FILE_HEADER.Characteristics |= IMAGE_FILE_DLL์„ ์„ค์ •ํ•˜๊ณ  ์—”ํŠธ๋ฆฌ ํฌ์ธํŠธ๋ฅผ 0์œผ๋กœ ๋งŒ๋“ค์–ด LdrpCallTlsInitializers๊ฐ€ EXE ์ „์šฉ ์Šคํ…์œผ๋กœ ์ ํ”„ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๋Š”๋‹ค.
  • DLL ํŽ˜์ด๋กœ๋“œ๋Š” ํ—ค๋”๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ ๋‘˜ ์ˆ˜ ์žˆ๋‹ค.

์ด ์‹œ์ ์—์„œ ํ”„๋กœ์„ธ์Šค๋Š” backing object๊ฐ€ ์—ฌ์ „ํžˆ wmp.dll์ธ RWX ๊ถŒํ•œ์˜ ๋ทฐ๋ฅผ ์†Œ์œ ํ•˜์ง€๋งŒ, ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ฐ”์ดํŠธ๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

Stage 2 โ€“ Hijack the loader with VEHs

  1. VEH๋ฅผ ๋“ฑ๋กํ•˜๊ณ  hardware breakpoints๋ฅผ ์„ค์ •: ntldl!NtOpenSection์˜ ์ฃผ์†Œ๋กœ Dr0(๋˜๋Š” ๋‹ค๋ฅธ ๋””๋ฒ„๊ทธ ๋ ˆ์ง€์Šคํ„ฐ)๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๊ณ  DR7์„ ์„ค์ •ํ•˜์—ฌ ์‹คํ–‰ ์‹œ๋งˆ๋‹ค STATUS_SINGLE_STEP๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ํ•œ๋‹ค. ์ดํ›„ NtMapViewOfSection๊ณผ ํ•„์š”์‹œ NtClose์— ๋Œ€ํ•ด์„œ๋„ ๋™์ผํ•˜๊ฒŒ ๋ฐ˜๋ณตํ•œ๋‹ค.
  2. LoadLibrary(โ€œamsi.dllโ€)๋กœ DLL ๋กœ๋”ฉ์„ ํŠธ๋ฆฌ๊ฑฐํ•œ๋‹ค. LdrLoadDll์€ ๊ฒฐ๊ตญ NtOpenSection์„ ํ˜ธ์ถœํ•˜์—ฌ ์‹ค์ œ ์„น์…˜ ํ•ธ๋“ค์„ ์–ป๋Š”๋‹ค.
  3. NtOpenSection์— ๋Œ€ํ•œ VEH ํ›…:
  • [out] PHANDLE SectionHandle ์ธ์ˆ˜์˜ ์Šคํƒ ์Šฌ๋กฏ์„ ์ฐพ๋Š”๋‹ค.
  • ์ด์ „์— ์ƒ์„ฑํ•œ DecoySection ํ•ธ๋“ค์„ ํ•ด๋‹น ์Šฌ๋กฏ์— ์“ด๋‹ค.
  • RIP/EIP๋ฅผ ret ๋ช…๋ น์œผ๋กœ ์ด๋™์‹œ์ผœ ์ปค๋„ ํ˜ธ์ถœ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ฒŒ ํ•œ๋‹ค.
  • ๋‹ค์Œ์œผ๋กœ NtMapViewOfSection์„ ๊ฐ์‹œํ•˜๋„๋ก ํ•˜๋“œ์›จ์–ด ๋ธŒ๋ ˆ์ดํฌํฌ์ธํŠธ๋ฅผ ์žฌ์„ค์ •ํ•œ๋‹ค.
  1. NtMapViewOfSection์— ๋Œ€ํ•œ VEH ํ›…:
  • [out] PVOID *BaseAddress(๋ฐ ํฌ๊ธฐ/๋ณดํ˜ธ ์ถœ๋ ฅ๊ฐ’)๋ฅผ ์ด๋ฏธ ๋งคํ•‘๋œ ์•…์„ฑ ๋ทฐ์˜ ์ฃผ์†Œ๋กœ ๋ฎ์–ด์“ด๋‹ค.
  • ์•ž์„œ์™€ ๊ฐ™์ด syscall ๋ณธ๋ฌธ์„ ๊ฑด๋„ˆ๋›ด๋‹ค.
  1. (์„ ํƒ์ ) NtClose์— ๋Œ€ํ•œ VEH ํ›…์€ ๊ฐ€์งœ ์„น์…˜ ํ•ธ๋“ค์ด ์ •๋ฆฌ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜์—ฌ resource leaks๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์ตœ์ข…์ ์ธ ์ •์ƒ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

syscall์ด ์ „ํ˜€ ์‹คํ–‰๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ปค๋„ ์ฝœ๋ฐฑ(ETWti, minifilter ๋“ฑ)์€ ์˜์‹ฌ์Šค๋Ÿฌ์šด NtOpenSection/NtMapViewOfSection ์ด๋ฒคํŠธ๋ฅผ ๊ด€์ฐฐํ•˜์ง€ ๋ชปํ•ด telemetry๊ฐ€ ํฌ๊ฒŒ ๋‚ฎ์•„์ง‘๋‹ˆ๋‹ค. ๋กœ๋” ๊ด€์ ์—์„œ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ์„ฑ๊ณตํ–ˆ๊ณ  amsi.dll์ด ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ์œผ๋ฏ€๋กœ, ๋กœ๋”๋Š” ๊ณต๊ฒฉ์ž์˜ ๋ฐ”์ดํŠธ์— ๋Œ€ํ•ด import/TLS ํ•ด๊ฒฐ์„ ๊ณ„์† ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Stage 3 โ€“ Execute the payload

  • EXE ํŽ˜์ด๋กœ๋“œ: ์žฌ๋ฐฐ์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์ธ์ ํ„ฐ๋Š” ์›๋ž˜ ์—”ํŠธ๋ฆฌ ํฌ์ธํŠธ๋กœ ๋‹จ์ˆœํžˆ ์ ํ”„ํ•œ๋‹ค. ๋กœ๋”๊ฐ€ DllMain์„ ํ˜ธ์ถœํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•  ๋•Œ, ์ปค์Šคํ…€ ์ฝ”๋“œ๋Š” ๋Œ€์‹  EXE ์Šคํƒ€์ผ ์—”ํŠธ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
  • DLL ํŽ˜์ด๋กœ๋“œ / Node.js addon: ์˜๋„๋œ ์ต์ŠคํฌํŠธ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ํ˜ธ์ถœํ•œ๋‹ค(Kidkadi๋Š” JavaScript์— ์ด๋ฆ„์ด ์ง€์ •๋œ ํ•จ์ˆ˜๋ฅผ ๋…ธ์ถœํ•จ). ๋ชจ๋“ˆ์ด ์ด๋ฏธ LdrpModuleBaseAddressIndex์— ๋“ฑ๋ก๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์ดํ›„์˜ ์กฐํšŒ๋Š” ๊ทธ๊ฒƒ์„ ์ •์ƒ DLL๋กœ ์ธ์‹ํ•œ๋‹ค.

Node.js ๋„ค์ดํ‹ฐ๋ธŒ ์• ๋“œ์˜จ(.node ํŒŒ์ผ)๊ณผ ๊ฒฐํ•ฉํ•˜๋ฉด Windows ๋‚ด๋ถ€ ๋™์ž‘์— ๋Œ€ํ•œ ๋ฌด๊ฑฐ์šด ์ž‘์—…์€ JavaScript ๋ ˆ์ด์–ด ๋ฐ–์— ๋‚จ๊ฒŒ ๋˜์–ด, ์œ„ํ˜‘ ํ–‰์œ„์ž๋Š” ๋‹ค์–‘ํ•œ ๋‚œ๋…ํ™”๋œ Node ๋ž˜ํผ์™€ ํ•จ๊ป˜ ๋™์ผํ•œ ๋กœ๋”๋ฅผ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

References

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ