فورتی نت یه گزارشی منتشر کرده در خصوص یه کمپین، که از یه درایور کرنلی بنام WinTapix.sys در حملاتشون استفاده کردن و با توجه به هدف، با احتمال کم، اونو به ایران نسبت دادن.
فورتی نت گفته که فایلهای اجرایی مشکوکی که از ابزارها و فریمورکهای متن باز استفاده میکنن رو رصد میکنه. یکی از این ابزارها، پروژه Donut هستش. با استفاده از این ابزار میشه، .NET Assemblies ، فایلهای اجرایی و سایر پیلودها رو به یه شلکد مستقل (position-independent shellcode) تبدیل کرد و با استفاده از تکنیکهایی مانند process hollowing یا thread hijacking از مموری لوود و اجرا کرد.
در جریان شکار تهدید در اوایل فوریه، محققین متوجه میشن که یه درایور کرنلی از Donut استفاده میکنه، بنابراین به قضیه مشکوک میشن و بیشتر آنالیزش میکنن.
درایوری که استفاده شده، WinTapix.sys هستش و بنابراین اسم نمونه ای که در شکار تهدید بدست آوردن رو ، WINTAPIX گذاشتن. از این نمونه، برای حملات هدفمندی در کشورهای خاورمیانه استفاده شده.
نمونه، در مه 2020 کامپایل شده اما در فوریه 2023 در VT آپلود شده. محققا با توجه به این نمونه، یه نمونه دیگه از این درایور رو به همین نام پیدا کردن که در همون زمان کامپایل شده اما در سپتامبر 2022 در VT آپلود شده. یه نمونه دیگه از WINTAPIX رو هم پیدا کردن که از درایور SRVNET2.SYS استفاده میکنه و در ژوئن 2021 کامپایل شده و در دسامبر 2021 در VT آپلود شده.
براساس اطلاعاتی که محققین بدست آوردن ، معنقدن که این درایور از اواسط 2020 مورد استفاده قرار گرفته و تا الان گزارشی در خصوصش منتشر نشده. همچنین محققین براساس گزارشات تله متری ، متوجه شدن که 65 درصد بررسیها برای این درایور ، در عربستان بوده، که نشون دهنده هدف اصلی بوده. همچنین تله متری نشون میده که بررسی ها برای این درایور در آگوست و سپتامبر 2022 و فوریه و مارس 2023 بیشتر شده. این نشون میده که بازیگران پشت این درایور، کمپین های بزرگی رو در این تاریخ ها اجرا کردن.
محققین اعلام کردن که هنوز نمیدونن این درایور چطوری توزیع شده و یا بازیگران تهدیدش چه کسانی هستن، اما براساس هدف اصلی که عربستان هستش، با احتمال کم اونو به، هکرهای ایرانی نسبت دادن. علاوه بر عربستان، اردن و قطر و امارات هم هدف قرار گرفتن که اینها هم باز اهداف ایران هستن.
از اونجایی که بازیگران تهدید ایرانی ، به اکسپلویت سرورهای Exchange برای استقرار بدافزار معروف هستن، ممکنه این درایور در کنار حملات Exchange استفاده شده باشه. چون زمان کامپایل درایورها با زمان حملات Exchange همسو هستش.
تحلیل فنی:
نمونه ای که محققا اونو بررسی کردن ، 8578bff36e3b02cc71495b647db88c67c3c5ca710b5a2bd539148550595d0330 هستش و شکل زیر ویژگی های این درایور رو با استفاده از ابزار sigcheck نشون میده :
همونطور که مشاهده میکنید، امضای اون نامعتبره، این یعنی اینکه، بازیگر ممکنه از یه درایور آسیب پذیر اما قانونی برای لوود Wintapix.sys استفاده کرده.
اگه درایور Wintapix.sys لوود بشه، مراحل زیر اجرا میشه :
- Wintapix.sys در کرنل لوود میشه
- این درایور یه شلکد رو به یه پروسس که امتیاز local system داره تزریق میکنه
- شلکد یه پیلود دات نتی که رمزشده رو لوود و اجرا میکنه.
درایور Wintapix :
Wintapix.sys تا حدودی با VMProtect محافظت شده. VMProtect یه ابزاری هستش که با استفاده از مجازی سازی ، از برنامه ها در برابر کرک و مهندسی معکوس جلوگیری میکنه. کاری هم که میکنه اینه که فایل اجرایی رو به یسری virtualized code تبدیل میکنه که در یه محیط امن قابل اجراست، در نتیجه آنالیز اونو سختتر میکنه.
اما نکته ای که وجود داره، همه بخش های درایور با این ابزار محافظت نشدن، از جمله قسمتی که مرحله بعدی حمله رو پیاده سازی میکنه.
تزریق شلکد:
Wintapix.sys در حقیقت یه لودر هستش. بنابراین هدف اصلی اون ، لود و اجرای مرحله بعدی حمله هستش. این کار توسط یه شلکد انجام میشه. نکته جالب اینکه این شلکد بدون هیچ مبهم سازی، در باینری قرار گرفته.
این کار حفاظت VMProtect رو زیر سوال میبره، چون آنتی ویروسها میتونن، شلکد رو داخل باینری شناسایی کنن.
برای تزریق شلکد، درایور باید یه پروسس مناسب پیدا کنه. این پروسس باید شرایط زیر رو داشته باشه :
- این پروسس باید با اکانت Local System اجرا شده باشه
- 32 بیتی باشه
- در لیست بلاک شده ها نباشه. این لیست شامل wininit.exe ، csrss.exe، smss.exe، services.exe ، winlogon.exe و lsass.exe هستش. (غیر از اینا باشه)
در نهایت اگه یه پروسسی پیدا بشه، اون پروسس با ZwOpenProcess باز شده و با ZwAllocateVirtualMemory یه حافظه ای در پروسس هدف اختصاص داده میشه و با NtWriteVirtualMemory ، شلکد بهش تزریق میشه. آدرس NtWriteVirtualMemory در زمان اجرا بازیابی میشه، تا بدافزار بتونه فراخوانی تابع رو از آنالیز استاتیک مخفی نگه داره.
پرسیست :
برای پرسیست در ابتدا از رجیستری استفاده میکنه و کلیدهای زیر رو ایجاد میکنه :
1 2 3 |
\\REGISTRY\\MACHINE\\SYSTEM\\CurrentControlSet\\Services\\WinTapix \\REGISTRY\\MACHINE\\SYSTEM\\CurrentControlSet\\Control\\SafeBoot\\Minimal\\WinTapix.sys \\REGISTRY\\MACHINE\\SYSTEM\\CurrentControlSet\\Control\\SafeBoot\\Network\\WinTapix.sys |
بعدش برای درایورها ، سرویس ایجاد میکنه :
نکته جالب اینه که درایور قراره در Safe Boot لوود بشه. Safe Boot که بعنوان Safe Mode هم شناخته میشه، یه حالت راه اندازی با حداقل درایور و سرویس هستش تا کاربران بتونن، ایرادات سیستم رو تشخیص و رفع کنن. لوود درایور در حالت Safe Boot یه روش دیگه برای پرسیست هستش.
تمام کلیدهای رجیستری با استفاده از ZwNotifyChangeKey مونیتور میشن. این تابع که از نوع کرنلی هستش، تغییرات رجیستری رو مونیتور میکنه. این کار باعث میشه، اگه بدافزار حذف بشه، خودش دوباره بازیابی کنه.
همچنین یه Thread جدید بنام PsCreateSystemThread برای مونیتور کردن محل فایل Wintapix.sys ایجاد میشه. برای مونیتور کردن هم از NtNotifyChangeDirectoryFile استفاده میکنه. در نتیجه اگه فایل حذف بشه، دوباره اونو در همون محل ایجاد میکنه.
شلکد تزریق شده :
خوشبختانه میشه شلکد رو از درایور دامپ گرفت و بصورت مجزا ، آنالیزش کرد. شلکد نشون دهنده اینه که با پروژه Donut ایجاد شده. بنابراین هدف اصلی اینجا اینه که مرحله بعدی حمله که .NET assembly هستش رو استخراج و آنالیز کنیم.
با شناسایی و شکستن تابع رمزگشا (decryption) در یه دیباگر ، میشه پیلود .NET رو از شلکد Donut استخراج کرد. برای این کار بعد از اجرای رمزگشا، میشه .NET assembly رو از مموری دامپ گرفت.
پیلود .NET :
محققا بعد از اینکه پیلود رو بعنوان یه فایل ذخیره کردن، اونو بعنوان یه فایل اجرایی دات نتی آنالیزش کردن.
از دید مهندسی معکوس، یکی از مزایای فایلهای دات نتی ، تبدیل ساده اونا به سورس کدشون هستش، که باعث درک ساده تر از اهداف و عملکرد باینری میشه. اما اگه این فایل دات نتی رو با Detect It Easy بررسی کنیم ، متوجه میشیم که با یسری مبهم کننده از جمله Smart Assembly و Eazfuscator محافظت میشه.
ابزارهای deobfuscator جواب ندادن و محققا مجبور شدن که اونو دستی تحلیل کنن.
تابع اصلی برنامه، در ابتدا با استفاده GetListUrls دو تا آرایه رو دیکد میکنه که نتایج شامل یسری URL هستش.
آرایه input بعد از دیکد شدن :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
"accidents_" "js-" "aspnet_client_" "js_search-" "_book" "library-" "subject_" "lookup_data-" "_toj_web" "mng_data_bank_" "transactions-" "_models" "trn_fitness-" "news_" "update-" "_omrvision" "user_accounts-" "popup_" "violation-" "_program_steps" "workflow-" |
آرایه input2 بعد از دیکد شدن :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
"programs_skill_" "competences-" "properties_" "-content" "_report" "evaluation-" "expert_data_" "css-" "_expert_form" "img-" "-field" "educat_" "reports-" "_employee" "-scales" "files_" "scripts-" "_fonts" "-skill" "helpes_" |
از این مقادیر برای ساخت URL استفاده میشه. با این حال بدافزار دنبال ویژگی های Microsoft Internet Information Services (IIS) ، برای ساخت اوناست. این یعنی اینکه بدافزار فقط سرورهای IIS هدف قرار میده.
با توجه به ویژگی های IIS که در شکل زیر مشاهده میکنید، بدافزار سایتهایی که توسط سرور IIS میزبانی میشن رو استخراج میکنه و با استفاده از اونا و رشته هایی که در بالا استخراج شدن، لیستی از الگوهای URL رو ایجاد میکنه که میخواد به اونا گوش بده.
در نهایت از این لیست URLها، برای بکدور و پروکسی استفاده میشه.
از لیست input2 برای بکدور استفاده میشه. یه HTTP listener روی این URLها راه اندازی میکنه و با استفاده از تابع Program.HandleRequest ، درخواستهای ورودی رو مدیریت میکنه، در نهایت اونارو به تابع RequestHandler.Execute که در شکل زیر مشاهده میکنید ، می فرسته :
در انتهای کدهای بالا، اگه درخواست ورودی حاوی رشته ، wOxhuoSBgpGcnLQZxipa باشه، رشته UsEPTIkCRUwarKZfRnyjcG13DFA برگردونده میشه. این عمل در حقیقت فعال بودن بکدور (heartbeat implementation) رو بررسی میکنه.
اگه درخواست حاوی پارامتر Jet یا <space>Ver باشه، مقدار اونا با base64 دیکد شده و یه دستور با cmd /c <command> می سازه و اونو به تابع RunCommand ارسال میکنه، که با استفاده از Process.start اجرا شده و خروجی بعنوان پاسخ به درخواست مربوطه ارسال میشه.
اگه درخواست دارای یه بدنه (body) باشه، تابع RunData ، که در شکل زیر مشاهده میکنید، اجرا میشه.
این تابع ، بدنه درخواست رو رمزگشایی میکنه و بسته به پیام ارسالی ، کارایه زیر انجام میده :
- RunCommand : مانند موارد قبلی دستور اجرا میکنه.
- UploadFile : فایل موجود در درخواست، در یه فایلی مینویسه
- DownloadFile: فایل درخواست شده رو بصورت HTTP response ارسال میکنه.
همه پیامهای ارسالی و دریافتی رمزنگاری میشن. همونطور که در شکل زیر مشاهده میکنید، وجود PrivateKey نشون دهنده یه الگوریتم نامتقارن هستش. اما با بررسی که روی کد کردن متوجه شدن که چنین نبوده و یه رمزنگاری ساده XOR با کلید PrivateKey هستش.
از لیست input ،با استفاده از تابع Proxy.HandleRequest برای راه اندازی proxy listener روی این URLها استفاده میشه. این قسمت از برنامه میتونه انواع مختلفی از data stream رو مدیریت کنه. اگه فقط داده باشه، بعنوان یه پروکسی عمل میکنه و داده ها رو بین دو طرف پروکسی ارسال و دریافت میکنه.
همچنین میتونه پیکربندی RDP رو بگیره :
با این داده میتونه یه ارتباط RDP روی ماشین هدف باز کنه و اونو به عامل تهدید پروکسی کنه.
IOC ها :
نام فایل | sha256 |
srvnet2.sys | f6c316e2385f2694d47e936b0ac4bc9b55e279d530dd5e805f0d963cb47c3c0d |
WinTapix.sys | 1485c0ed3e875cbdfc6786a5bd26d18ea9d31727deb8df290a1c00c780419a4e |
WinTapix.sys | 8578bff36e3b02cc71495b647db88c67c3c5ca710b5a2bd539148550595d0330 |
injected shellcode | aae9c8bd9db4e0d48e35d9ab3b1a8c7933284dcbeb344809fed18349a9ec7407 |
.net payload | 27a6c3f5c50c8813ca34ab3b0791c08817c803877665774954890884842973ed |