چرا COM مهمه؟‌ اصلا چیه و از کجا پیدا شده؟

خب سلام :) ما تا الان راجع به ۷ روش مختلف برای پرسیست شدن بدافزار ها گفتیم که اتفاقا هیچکدوم نیاز به دسترسی ادمین نداشتن.
تو این پست به بهونه ی روش هشتم میخوام بریم سراغ COM Object ها !
فرض کنید میخواید یه نرم افزار بنویسید یا یک اتومیشن و نیاز دارید دوتا نرم افزار باهم دیگه بتونن ارتباط بگیرن. خب طبعا ما DLL هارو داشتیم که یه سری توابع export میکردن تا بقیه نرم افزارا بتونن اورنارو فراخوانی کنن و ازشون استفاده کنن .
ولی چند مشکل بود. مثلا سینک بودن نرم افزار ها روی نحوه ی پاس دادن پارامتر هاشون !
تو فلان تابع من به چه ترتیبی بهت پارامتر برسونم که بفهمی؟ ( اصطلاحا بهش میگن نحوه ی Calling Convention ) یا مثلا هر نسخه ی DLL تغییر میکرد نحوه ی استفاده از فانکشن ها هم تفاوت میکرد.
یا مثلا مشکلات بین Variable Type ها !‌ مثلا C++ چطور ورودی Struct رو برای بقیه تعریف میکرد که بتونه پارسش کنه؟
کل این مشکلات و ناسازگاری ها باعث شد که ویندوز خیلی زود فکر کنه به ایده ای که نرم افزارا در یک استاندارد مشخص بتونن با استفاده از sub system ویندوز باهم حرف بزنن !
و جواب ویندوز :

COM => Windows Component Object Model

قبل از توضیح بیشتر بیاید با یکی از این COM ها کار کنیم و بعدش بریم سراغ توضیحش .

$Shell_object = New-Object -ComObject Wscript.Shell
$Shell_object | gm
$Shell_object.Exec("cmd.exe /c calc.exe")
میبینید که ما تونستیم با استفاده از COM Object که اسمش Wscript.shell هست دستور سیستمی اجرا کنیم.
میبینید که ما تونستیم با استفاده از COM Object که اسمش Wscript.shell هست دستور سیستمی اجرا کنیم.

بذارید یکم دقیق تر بررسی کنیم. در کدی که زدیم Wscript.Shell یک COM Object هست که ما با استفاده از New-Object مقداردهیش کردیم . انگار که یک نمونه میسازید از روی یک کلاس !
بیاید اینترنالش رو بهتر بفهمیم . واقعا چی میشه وقتی این دستور رو میزنید ؟!‌
اول از همه COM Library میاد وسط و میخواد بفهمه که شما واقعا چی رو میخواید صدا کنید.
بدونید که به Wscript.Shell ما اصطلاحا میگیم ProgID . ولی کامپیوتر اینارو با GUID هایی میفهمه که ما بهشون میگیم CLSID .
پس بعد از اینکه این دستورو میزنیم میره تو مسیر زیر :
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID
میبینه کدوم CLSID هست که مقدار ProgID ایش برابر با Wscirpt.shell عه؟ چیزی که میبینه عکس زیره مثلا :))‌

رجیستری مربوط به wscript.shell
رجیستری مربوط به wscript.shell

سه تا مود مختلف لود کردن COM ها

وقتی که یک پروسسی یک COM رو اصطلاحا Initiate میکنه و میخواد ازش استفاده کنه ۳ تا حالت مختلف داره برای استفاده ازش که به ترتیب میگم .

$comobj = [System.Activator]::CreateInstance([Type]::GetTypeFromCLSID("49B2791A-B1AE-4C90-9B8E-E860BA07F889", "10.10.0.1"))
شغل شریف واسطه گری توسط پراسس dllhost.exe
شغل شریف واسطه گری توسط پراسس dllhost.exe

خب خیلیم عالی . تو این بلاگ پست میخواستم توضیح خیلی کوتاهی از COM و نحوه ی کارکردش بدم. احساس میکنم تا اینجا کافیه که حملات روی COM رو بتونیم بیشتر بفهمیم.
در ادامه حمله های روی COM Object ها مثل Persist و Privilage Scalation یا UAC BYPASS رو توضیح خواهم داد.
منابعی که ازشون استفاده کردم هم اینها بوده و میتونید برای توضیح بیشتر ببینیدشون :

https://www.221bluestreet.com/offensive-security/windows-components-object-model/demystifying-windows-component-object-model-com#activation-of-a-com-object

https://medium.com/@jasemalsadi/dissecting-com-objects-9b1ea3f18964