VulnCity

Persistence با استفاده از Shim Cache

نویسنده: یاسین عابدینی · دسته: RedTeam · تاریخ انتشار: ۱۴۰۵/۴/۱۲

تکنیک Persistence با استفاده از Shim Cache

Application Compatibility Framework چیست؟

Windows برای حفظ سازگاری با نرم‌افزارهای قدیمی از مکانیزمی به نام Application Compatibility Framework استفاده می‌کند. این framework به صورت شبه‌شفاف (almost-transparent) عمل کرده و امکان اجرای برنامه‌های نوشته شده برای نسخه‌های قدیمی‌تر Windows را در نسخه‌های جدید فراهم می‌کند.

مکانیزم عملکرد

زمانی که یک فایل اجرایی در Windows اجرا می‌شود، سیستم عامل به صورت خودکار:

  1. به Shim Database (فایل‌های .sdb) مراجعه می‌کند
  2. بررسی می‌کند که آیا برای این برنامه باید Shim (وصله‌ی زمان اجرا) اعمال شود یا خیر
  3. در صورت لزوم، تغییرات لازم را اعمال می‌کند تا برنامه مانند نسخه‌های قدیمی Windows رفتار کند

این مکانیزم دو کاربرد متضاد دارد:

  • برای محققان Forensics: هر فرآیندی که Shim شود در Shim Cache (معروف به AppCompatCache) ردی باقی می‌گذارد
  • برای مهاجمان: همین مکانیزم می‌تواند برای DLL Injection پایدار مورد سوءاستفاده قرار گیرد

ایجاد Shim مخرب

پیش‌نیازها

برای ایجاد یک Shim سفارشی نیاز به نصب Compatibility Administrator دارید که بخشی از Windows ADK (Application Compatibility Toolkit) است.

مراحل پیاده‌سازی

۱. باز کردن Compatibility Administrator و ایجاد Database جدید

از منوی File گزینه‌ی Create new database (32-bit) را انتخاب کنید

۲. ایجاد Application Fix

  • روی "Applications" کلیک راست کرده و New → Application Fix را انتخاب کنید
  • فایل اجرایی هدف را مشخص کنید (مثلاً C:\Windows\System32\magnify.exe)

۳. تنظیم Compatibility Fix

  • در لیست Compatibility Fixes گزینه‌ی InjectDLL را فعال کنید
    • این گزینه به شما امکان می‌دهد DLL دلخواه خود را به فرآیند تزریق کنید
  • یا از RedirectEXE استفاده کنید اگر می‌خواهید کل برنامه را جایگزین کنید
  • مسیر Payload DLL خود را مشخص کنید

۴. تنظیم Matching Criteria

  • معیارهای پیش‌فرض را بپذیرید یا آنها را آزادتر کنید
  • توجه: معیارهای خیلی آزاد می‌تواند باعث False Positive شود

۵. ذخیره و تولید Database

  • Database را ذخیره کنید
  • از منوی File گزینه‌ی Generate را انتخاب کرده و فایل را با نامی مانند persistent.sdb ذخیره کنید
نکته امنیتی: نصب Shim در سطح سیستم نیاز به دسترسی Administrator دارد، اما می‌توان از Database در سطح User نیز استفاده کرد که البته فقط برای همان کاربر خاص فعال خواهد شد.

استقرار Shim در سیستم

نصب با استفاده از sdbinst.exe

# نصب بی‌صدا در سطح سیستم (نیاز به Admin)
sdbinst.exe -q persistent.sdb

# حذف بی‌صدا
sdbinst.exe -q -u persistent.sdb

تغییرات ایجاد شده در سیستم

پس از نصب، موارد زیر در سیستم ایجاد می‌شوند:

  1. فایل Database: در مسیر %SystemRoot%\AppPatch\Custom قرار می‌گیرد
  2. مدخل Registry: در کلید زیر ثبت می‌شود:
    HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\InstalledSDB
  3. تزریق DLL: در اولین اجرای برنامه (یا پس از Reboot در صورتی که برنامه AutoStart باشد)، OS Loader قبل از اجرای تابع WinMain() برنامه قربانی، DLL مخرب را تزریق می‌کند

مشخصات Persistence

ویژگی جزئیات
سطح دسترسی Admin (برای System DB) / User (برای User-level DB)
ماندگاری پس از Reboot بله – Shim Database در هر بار اجرای فرآیند بررسی می‌شود
میزان مخفی بودن بالا – بدون سرویس، Task یا کلید Autorun جدید؛ فقط یک فایل .sdb
روش حذف اجرای sdbinst.exe -u یا حذف دستی مدخل Registry و فایل
پایداری عالی – تا زمان حذف دستی فعال می‌ماند

روش‌های جایگزین: DLL Injection از طریق Registry

اگر دستکاری Shim Engine امکان‌پذیر نباشد، می‌توان مستقیماً از کلیدهای Registry که تعیین می‌کنند کدام DLL‌ها به صورت Global یا Per-Application بارگذاری شوند، سوءاستفاده کرد:

۱. AppInit_DLLs (Global Injection)

# تزریق در تمام فرآیندهای GUI
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows" /v AppInit_DLLs /t REG_SZ /d "C:\Windows\Tasks\payload.dll" /f

این روش باعث می‌شود DLL مشخص شده در تمام فرآیندهایی که user32.dll را بارگذاری می‌کنند، تزریق شود.

۲. Image File Execution Options (IFEO)

# Debugger Redirection
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\calc.exe" /v Debugger /t REG_SZ /d "C:\Windows\Tasks\payload.exe" /f

با این روش، هر بار که calc.exe اجرا شود، به جای آن فایل مخرب اجرا می‌شود.

نکته: هر دو روش نیاز به دسترسی Administrator دارند اما اجرای کد را در اولین بار اجرای برنامه هدف فراهم می‌کنند.

نگاه Blue Team: شناسایی و مقابله

۱. نظارت بر فرآیندها

Sysmon Event ID 1 (Process Creation)

<!-- نظارت بر اجرای sdbinst.exe -->
<RuleGroup name="ShimInstallation" groupRelation="or">
  <ProcessCreate>
    <Image condition="contains">sdbinst.exe</Image>
  </ProcessCreate>
</RuleGroup>

هر اجرای sdbinst.exe مشکوک است و باید بررسی شود.

۲. نظارت بر تغییرات فایل

Sysmon Event ID 11 (File Creation)

<!-- نظارت بر ایجاد فایل در AppPatch\Custom -->
<RuleGroup name="ShimFileCreation" groupRelation="or">
  <FileCreate>
    <TargetFilename condition="contains">\AppPatch\Custom\</TargetFilename>
  </FileCreate>
</RuleGroup>

هر فایل جدید در %windir%\AppPatch\Custom باید مورد بررسی دقیق قرار گیرد.

۳. بررسی Registry

کلید اصلی برای Shim Database‌ها:

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\InstalledSDB

PowerShell Script برای Audit:

# لیست تمام Shim Database‌های نصب شده
Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\InstalledSDB" | 
    ForEach-Object {
        $props = Get-ItemProperty $_.PSPath
        [PSCustomObject]@{
            DatabasePath = $props.DatabasePath
            DatabaseType = $props.DatabaseType
            DatabaseDescription = $props.DatabaseDescription
        }
    }

۴. مقایسه با Golden Image

یک روش قدرتمند، نگه‌داشتن snapshot از کلید AppCompatFlags\InstalledSDB از سیستم‌های تازه نصب شده (Golden Image) و مقایسه‌ی منظم با سیستم‌های در حال اجرا است.

۵. بررسی DLL‌های بارگذاری شده

استفاده از Process Explorer یا PowerShell:

# لیست DLL‌های بارگذاری شده در یک فرآیند
Get-Process | 
    Select-Object Name, @{Name="Modules";Expression={$_.Modules | Select-Object -ExpandProperty FileName}} |
    Where-Object {$_.Modules -like "*Tasks*" -or $_.Modules -like "*Temp*"}

DLL‌هایی که در مسیرهای غیرمعمول (مثل C:\Windows\Tasks یا %temp%) قرار دارند مشکوک هستند.

۶. نظارت بر AppInit_DLLs و IFEO

# بررسی AppInit_DLLs
Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows" -Name AppInit_DLLs

# لیست تمام IFEO Debuggers
Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options" |
    Where-Object {$_.GetValue("Debugger")} |
    ForEach-Object {
        [PSCustomObject]@{
            Image = $_.PSChildName
            Debugger = $_.GetValue("Debugger")
        }
    }

۷. استراتژی‌های Hardening

الف. محدود کردن دسترسی به ابزارهای Compatibility

  • محدود کردن دسترسی به sdbinst.exe با استفاده از AppLocker یا WDAC
  • نظارت بر دسترسی به مسیر %SystemRoot%\AppPatch\Custom

ب. استفاده از Protected Processes

برای فرآیندهای حساس، استفاده از Protected Process Light (PPL) می‌تواند از DLL Injection جلوگیری کند.

ج. Least Privilege

محدود کردن تعداد کاربرانی که دسترسی Administrator دارند.

۸. ابزارهای تشخیص

  • Autoruns (Sysinternals): قادر به نمایش Shim Database‌های نصب شده در تب "AppInit"
  • ShimCacheParser: ابزار Forensics برای تحلیل Shim Cache
  • RegRipper: برای استخراج اطلاعات مرتبط با Shim از Registry Hive‌ها

۹. IOC‌های کلیدی

  • اجرای sdbinst.exe توسط کاربران غیر از Administrator واقعی
  • فایل‌های .sdb در AppPatch\Custom که با برنامه‌های شناخته شده مطابقت ندارند
  • DLL‌های بارگذاری شده از مسیرهای غیرمعمول
  • مقادیر غیرخالی در AppInit_DLLs
  • کلیدهای IFEO با Debugger غیرمعمول

۱۰. Incident Response

در صورت کشف Shim مخرب:

  1. ایزوله کردن سیستم تا از انتشار بیشتر جلوگیری شود
  2. جمع‌آوری Evidence:
    • Memory dump فرآیندهای مرتبط
    • کپی فایل‌های .sdb
    • Export کردن کلیدهای Registry مرتبط
  3. حذف Persistence:
    sdbinst.exe -u [path-to-malicious-sdb]
  4. بررسی Lateral Movement: آیا Shim مشابه در سیستم‌های دیگر نیز نصب شده؟
  5. Root Cause Analysis: چگونه مهاجم دسترسی Admin به دست آورده است؟

نتیجه‌گیری

تکنیک Shim Cache یک روش پیچیده و قدرتمند برای Persistence است که از قابلیت‌های مشروع Windows سوءاستفاده می‌کند. برای Blue Team، شناسایی این تکنیک نیازمند نظارت دقیق بر فرآیندها، فایل‌ها و Registry است. ترکیب راهکارهای پیشگیرانه (Hardening) با نظارت فعال (Monitoring) و پاسخ سریع (Incident Response) کلید دفاع موثر در برابر این نوع حملات است.