چرا 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")
بذارید یکم دقیق تر بررسی کنیم. در کدی که زدیم Wscript.Shell یک COM Object هست که ما با استفاده از New-Object مقداردهیش کردیم . انگار که یک نمونه میسازید از روی یک کلاس !
بیاید اینترنالش رو بهتر بفهمیم . واقعا چی میشه وقتی این دستور رو میزنید ؟!
اول از همه COM Library میاد وسط و میخواد بفهمه که شما واقعا چی رو میخواید صدا کنید.
بدونید که به Wscript.Shell ما اصطلاحا میگیم ProgID . ولی کامپیوتر اینارو با GUID هایی میفهمه که ما بهشون میگیم CLSID .
پس بعد از اینکه این دستورو میزنیم میره تو مسیر زیر :
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID
میبینه کدوم CLSID هست که مقدار ProgID ایش برابر با Wscirpt.shell عه؟ چیزی که میبینه عکس زیره مثلا :))
سه تا مود مختلف لود کردن COM ها
وقتی که یک پروسسی یک COM رو اصطلاحا Initiate میکنه و میخواد ازش استفاده کنه ۳ تا حالت مختلف داره برای استفاده ازش که به ترتیب میگم .
$comobj = [System.Activator]::CreateInstance([Type]::GetTypeFromCLSID("49B2791A-B1AE-4C90-9B8E-E860BA07F889", "10.10.0.1"))
خب خیلیم عالی . تو این بلاگ پست میخواستم توضیح خیلی کوتاهی از 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