Notepad++ Plugin Autoload Persistence & Execution

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 ์ง€์›ํ•˜๊ธฐ

Notepad++๋Š” ์‹œ์ž‘ ์‹œ plugins ํ•˜์œ„ ํด๋”์—์„œ ๋ฐœ๊ฒฌ๋˜๋Š” ๋ชจ๋“  plugin DLL์„ autoloadํ•ฉ๋‹ˆ๋‹ค. ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ Notepad++ ์„ค์น˜ ํด๋”์— ์•…์„ฑ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋„ฃ์œผ๋ฉด ์—๋””ํ„ฐ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ๋งˆ๋‹ค notepad++.exe ๋‚ด๋ถ€์—์„œ ์ฝ”๋“œ ์‹คํ–‰์ด ๋ฐœ์ƒํ•˜๋ฉฐ, ์ด๋Š” persistence, ์€๋ฐ€ํ•œ initial execution, ๋˜๋Š” ์—๋””ํ„ฐ๊ฐ€ elevated๋กœ ์‹คํ–‰๋  ๊ฒฝ์šฐ in-process loader๋กœ ์•…์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Writable plugin locations

  • Standard install: C:\Program Files\Notepad++\plugins\<PluginName>\<PluginName>.dll (์ผ๋ฐ˜์ ์œผ๋กœ ์“ฐ๋ ค๋ฉด admin ๊ถŒํ•œ ํ•„์š”).
  • Writable options for low-privileged operators:
  • Use the portable Notepad++ build in a user-writable folder.
  • Copy C:\Program Files\Notepad++ to a user-controlled path (e.g., %LOCALAPPDATA%\npp\) and run notepad++.exe from there.
  • Each plugin gets its own subfolder under plugins and is loaded automatically at startup; menu entries appear under Plugins.

Plugin load points (execution primitives)

Notepad++๋Š” ํŠน์ • exported functions๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ์ดˆ๊ธฐํ™” ์ค‘ ์ด๋“ค ํ•จ์ˆ˜๊ฐ€ ๋ชจ๋‘ ํ˜ธ์ถœ๋˜์–ด ์—ฌ๋Ÿฌ ์‹คํ–‰ ์ง€์ ์ด ์ƒ๊น๋‹ˆ๋‹ค:

  • DllMain โ€” DLL ๋กœ๋“œ ์ฆ‰์‹œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค (์ฒซ ๋ฒˆ์งธ ์‹คํ–‰ ์ง€์ ).
  • setInfo(NppData) โ€” ๋กœ๋“œ ์‹œ ํ•œ ๋ฒˆ ํ˜ธ์ถœ๋˜์–ด Notepad++ ํ•ธ๋“ค์„ ์ œ๊ณต; ๋ณดํ†ต ๋ฉ”๋‰ด ํ•ญ๋ชฉ ๋“ฑ๋ก์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • getName() โ€” ๋ฉ”๋‰ด์— ํ‘œ์‹œ๋  ํ”Œ๋Ÿฌ๊ทธ์ธ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • getFuncsArray(int *nbF) โ€” ๋ฉ”๋‰ด ๋ช…๋ น์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค; ๋น„์–ด ์žˆ์–ด๋„ ์‹œ์ž‘ ์‹œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
  • beNotified(SCNotification*) โ€” ํŽธ์ง‘๊ธฐ ์ด๋ฒคํŠธ(ํŒŒ์ผ ์—ด๊ธฐ/๋ณ€๊ฒฝ, UI ์ด๋ฒคํŠธ ๋“ฑ)๋ฅผ ์ˆ˜์‹ ํ•˜์—ฌ ์ง€์†์ ์ธ ํŠธ๋ฆฌ๊ฑฐ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • messageProc(UINT, WPARAM, LPARAM) โ€” ๋ฉ”์‹œ์ง€ ํ•ธ๋“ค๋Ÿฌ๋กœ, ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ๊ตํ™˜์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • isUnicode() โ€” ๋กœ๋“œ ์‹œ ํ™•์ธ๋˜๋Š” ํ˜ธํ™˜์„ฑ ํ”Œ๋ž˜๊ทธ์ž…๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ exports๋Š” stubs๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ; autoload ๋™์•ˆ DllMain์ด๋‚˜ ์œ„์˜ ์ฝœ๋ฐฑ๋“ค ์–ด๋””์—์„œ๋‚˜ ์‹คํ–‰์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Minimal malicious plugin skeleton

๊ธฐ๋Œ€๋˜๋Š” exports๋ฅผ ํฌํ•จํ•œ DLL์„ ์ปดํŒŒ์ผํ•˜๊ณ  ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ Notepad++ ํด๋”์˜ plugins\\MyNewPlugin\\MyNewPlugin.dll์— ๋ฐฐ์น˜ํ•˜์„ธ์š”:

BOOL APIENTRY DllMain(HMODULE h, DWORD r, LPVOID) { if (r == DLL_PROCESS_ATTACH) MessageBox(NULL, TEXT("Hello from Notepad++"), TEXT("MyNewPlugin"), MB_OK); return TRUE; }
extern "C" __declspec(dllexport) void setInfo(NppData) {}
extern "C" __declspec(dllexport) const TCHAR *getName() { return TEXT("MyNewPlugin"); }
extern "C" __declspec(dllexport) FuncItem *getFuncsArray(int *nbF) { *nbF = 0; return NULL; }
extern "C" __declspec(dllexport) void beNotified(SCNotification *) {}
extern "C" __declspec(dllexport) LRESULT messageProc(UINT, WPARAM, LPARAM) { return TRUE; }
extern "C" __declspec(dllexport) BOOL isUnicode() { return TRUE; }
  1. DLL์„ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค (Visual Studio/MinGW).
  2. plugins ์•„๋ž˜์— plugin ํ•˜์œ„ ํด๋”๋ฅผ ๋งŒ๋“ค๊ณ  DLL์„ ๊ทธ ์•ˆ์— ๋„ฃ์Šต๋‹ˆ๋‹ค.
  3. Notepad++๋ฅผ ์žฌ์‹œ์ž‘ํ•˜๋ฉด DLL์ด ์ž๋™์œผ๋กœ ๋กœ๋“œ๋˜์–ด DllMain ๋ฐ ์ดํ›„ ์ฝœ๋ฐฑ์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

Reflective loader plugin pattern

์•…์šฉ๋œ plugin์€ Notepad++์„ reflective DLL loader๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ์ตœ์†Œํ•œ์˜ UI/๋ฉ”๋‰ด ํ•ญ๋ชฉ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: โ€œLoadDLLโ€).
  • ํŽ˜์ด๋กœ๋“œ DLL์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด file path ๋˜๋Š” URL์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.
  • DLL์„ ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค์— reflectively mapํ•˜๊ณ  export๋œ entry point(์˜ˆ: ๊ฐ€์ ธ์˜จ DLL ๋‚ด๋ถ€์˜ loader function)๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  • ์ด์ : ์ƒˆ๋กœ์šด ๋กœ๋”๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋Œ€์‹  ์ •์ƒ์œผ๋กœ ๋ณด์ด๋Š” GUI ํ”„๋กœ์„ธ์Šค๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŽ˜์ด๋กœ๋“œ๋Š” notepad++.exe์˜ ๋ฌด๊ฒฐ์„ฑ(๊ถŒํ•œ ์ƒ์Šน๋œ ์ปจํ…์ŠคํŠธ ํฌํ•จ)์„ ๊ณ„์Šนํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹จ์ : ๋””์Šคํฌ์— unsigned plugin DLL์„ ๋–จ์–ด๋œจ๋ฆฌ๋Š” ๊ฒƒ์€ ์†Œ์Œ์ด ํฌ๋ฏ€๋กœ, ๊ฐ€๋Šฅํ•˜๋ฉด ๊ธฐ์กด์˜ ์‹ ๋ขฐ๋œ ํ”Œ๋Ÿฌ๊ทธ์ธ์— piggybackingํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์„ธ์š”.

ํƒ์ง€ ๋ฐ ํ•˜๋“œ๋‹ ๋…ธํŠธ

  • writes to Notepad++ plugin directories๋ฅผ ์ฐจ๋‹จํ•˜๊ฑฐ๋‚˜ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์„ธ์š”(์‚ฌ์šฉ์ž ํ”„๋กœํ•„์˜ portable ๋ณต์‚ฌ๋ณธ ํฌํ•จ); Controlled Folder Access ๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ allowlisting์„ ํ™œ์„ฑํ™”ํ•˜์„ธ์š”.
  • plugins ์•„๋ž˜์˜ new unsigned DLLs์— ๋Œ€ํ•ด ๊ฒฝ๋ณด๋ฅผ ์„ค์ •ํ•˜๊ณ , notepad++.exe์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ด์ƒํ•œ child processes/network activity๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์„ธ์š”.
  • ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜๋Š” Plugins Admin์„ ํ†ตํ•ด์„œ๋งŒ ํ—ˆ์šฉํ•˜๊ณ , ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ๋กœ์—์„œ์˜ portable ๋ณต์‚ฌ๋ณธ ์‹คํ–‰์„ ์ œํ•œํ•˜์„ธ์š”.

์ฐธ๊ณ ์ž๋ฃŒ

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 ์ง€์›ํ•˜๊ธฐ