Persistence با استفاده از Shim Cache
نویسنده: یاسین عابدینی · دسته: RedTeam · تاریخ انتشار: ۱۴۰۵/۴/۱۲
تکنیک Persistence با استفاده از Shim Cache
Application Compatibility Framework چیست؟
Windows برای حفظ سازگاری با نرمافزارهای قدیمی از مکانیزمی به نام Application Compatibility Framework استفاده میکند. این framework به صورت شبهشفاف (almost-transparent) عمل کرده و امکان اجرای برنامههای نوشته شده برای نسخههای قدیمیتر Windows را در نسخههای جدید فراهم میکند.
مکانیزم عملکرد
زمانی که یک فایل اجرایی در Windows اجرا میشود، سیستم عامل به صورت خودکار:
- به Shim Database (فایلهای .sdb) مراجعه میکند
- بررسی میکند که آیا برای این برنامه باید Shim (وصلهی زمان اجرا) اعمال شود یا خیر
- در صورت لزوم، تغییرات لازم را اعمال میکند تا برنامه مانند نسخههای قدیمی 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 در سیستم
نصب با استفاده از sdbinst.exe
# نصب بیصدا در سطح سیستم (نیاز به Admin)
sdbinst.exe -q persistent.sdb
# حذف بیصدا
sdbinst.exe -q -u persistent.sdb
تغییرات ایجاد شده در سیستم
پس از نصب، موارد زیر در سیستم ایجاد میشوند:
- فایل Database: در مسیر
%SystemRoot%\AppPatch\Customقرار میگیرد - مدخل Registry: در کلید زیر ثبت میشود:
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\InstalledSDB - تزریق 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 اجرا شود، به جای آن فایل مخرب اجرا میشود.
نگاه 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 مخرب:
- ایزوله کردن سیستم تا از انتشار بیشتر جلوگیری شود
- جمعآوری Evidence:
- Memory dump فرآیندهای مرتبط
- کپی فایلهای .sdb
- Export کردن کلیدهای Registry مرتبط
- حذف Persistence:
sdbinst.exe -u [path-to-malicious-sdb] - بررسی Lateral Movement: آیا Shim مشابه در سیستمهای دیگر نیز نصب شده؟
- Root Cause Analysis: چگونه مهاجم دسترسی Admin به دست آورده است؟
نتیجهگیری
تکنیک Shim Cache یک روش پیچیده و قدرتمند برای Persistence است که از قابلیتهای مشروع Windows سوءاستفاده میکند. برای Blue Team، شناسایی این تکنیک نیازمند نظارت دقیق بر فرآیندها، فایلها و Registry است. ترکیب راهکارهای پیشگیرانه (Hardening) با نظارت فعال (Monitoring) و پاسخ سریع (Incident Response) کلید دفاع موثر در برابر این نوع حملات است.