hamburger

(jeśli zgłaszasz przypadek phishingu, zapisz mail (przesuń go z programu pocztowego na pulpit komputera lub wybierz opcję plik/zapisz jako), a następnie załącz)

Podejrzany SMS prześlij na nr 508 700 900

Jeśli zgłoszenie dotyczy bezpieczeństwa dzieci, zgłoś je również pod http://www.dyzurnet.pl
@CERT_OPL

Malware Flubot – analiza

Kolejny tydzień – kolejne kampanie phishingowe z fałszywymi aplikacjami mobilnymi. Do takiej aktywności przestępców przyzwyczailiśmy się przez ostatnie miesiące, ale w kilka/naście dni temu pojawiło się coś nowego. Zamiast klasycznych w rękach przestępców Cerberusa, czy Hydry pojawił się Flubot.

Pierwsze wersje Malware Flubot zaobserwowano w Hiszpanii, po raz pierwszy trafiliśmy na nie w Polsce 3. marca. Pierwsze ostrzeżenie opublikowaliśmy 3 marca w tekście o fałszywej aplikacji FedEx. Po kliknięciu w niemający niczego wspólnego z FedExem link w domenie .ro ściągaliśmy aplikację FedEx.apk (43c25bee994bf0d87aa313c0ac20a74f), opatrzoną logo znanej firmy kurierskiej. Co się działo, jeśli mimo ostrzeżeń o jej pochodzeniu spoza Sklepu Play zdecydowaliśmy się na instalację?

Podstępne ułatwienia dostępu

Analizowaliśmy wersję 3.2 aplikacji, w systemie operacyjnym Android 10/API 29. Warto już na początku zwrócić uwagę na wyjątkowo rozbudowane uprawnienia, których żąda aplikacja (w pliku AndroidManifest.xml)

android.permission.INTERNET
android.permission.READ_CONTACTS
android.permission.WRITE_SMS

android.permission.READ_SMS
android.permission.SEND_SMS

android.permission.RECEIVE_SMS
android.permission.READ_PHONE_STATE
android.permission.QUERY_ALL_PACKAGES
android.permission.WAKE_LOCK
android.permission.FOREGROUND_SERVICE
android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
android.permission.CALL_PHONE
android.permission.REQUEST_DELETE_PACKAGES

Po zainstalowaniu, aby aplikacja mogła wchodzić w interakcje z wyświetlanymi oknami prosi o zgodę na dostęp do Ułatwień Dostępu/Accessibility Services. Z założenia przeznaczone dla osób niepełnosprawnych pozwalają one aplikacji, której są przydzielone, na bardzo rozbudowaną kontrolę nad otwieranymi oknami (bez konieczności pytań i interakcji ze strony użytkownika). Swoją drogą, treści, które zobaczycie na poniższych zrzutach ekranu to kolejne wyjące czerwone syreny, które powinny w takiej chwili uruchomić się w głowach potencjalnej ofiary.

W kolejnym kroku „Fedex” przejmuje rolę domyślnej aplikacji do wysyłania SMSów. Ta aktywność to kolejny dowód, że warto uaktualniać system operacyjny do najnowszej wersji. Począwszy bowiem od Androida 10 system wymaga potwierdzenia zmiany domyślnej aplikacji. W starszych systemach dzieje się to bez konieczności interakcji z użytkownikiem.

Jednym ze sposobów, który aplikacja wykorzystuje do wykradania danych użytkownika jest wygenerowanie okna z informacją o konieczności podania danych karty płatniczej, w celu rzekomego sprawdzenia wieku ofiary (pojawia się w momencie, gdy taką aktywność uruchomi botmaster):

A bank card must be provided to prove that you are an adult. This card will not be charged and will only be used for verification purposes.

Na ekranie wyświetlane są pola, umożliwiające wprowadzenie numeru karty, terminu jej ważności oraz numeru CVV. Co ciekawe, mimo iż aplikacja wspiera język polski, ten komunikat pojawia się w języku angielskim.

Elementy utrudniające analizę

Aby utrudnić analizę złośliwej aplikacji zostały użyte dwa sposoby. Przede wszystkim jest spakowana. Po uruchomieniu automatycznie się rozpakowuje i zapisuje pod nazwą “classes-v1.bin”. Jest to plik dex, który jest następnie dynamicznie ładowany i wykonywany.

Drugi sposów to obfuskacja łańcuchów znaków, które są następnie dekodowane w osobnej paczce, która w analizowanej próbce miała nazwe “io.michaelrocks.paranoid”. Samo dekodowanie jest wykonywane w metodzie “getString”

Dokładnie taki deobfuskator znajdziemy na stronie https://github.com/MichaelRocks/paranoid/blob/master/core/src/main/java/io/michaelrocks/paranoid/DeobfuscatorHelper.java

Pokazywane w dalszej części analizy łańcuchy znaków w poszczególnych metodach są już zdekodowane.

Komunikacja z serwerem Command&Control

Ciekawym mechanizmem jest sposób generowania domen, przy użyciu których z serwerami Command&Control łączą się zainfekowane urządzenia. Aby utrudnić ewentualną blokadę ruchu do serwera C&C, domeny z którymi próbuje się połączyć analizowana aplikacja, generowane są przy użyciu mechanizmu Domain Generating Algorithm (DGA). Ziarno (seed) używane do zainicjowania generatora, jest tworzone z użyciem roku i numeru miesiąca. Dzięki temu zestaw domen jest inny każdego miesiąca. Dla analizowanej aplikacji każdorazowo kreowane jest 2000 hostów.

Na samym początku działania metody generowane jest ziarno (seed), przekazywane następnie do generatora. Seed jest tworzony przez “GetSeed”:

“Calendar.getInstance().get()” wywołane z cyframi 1 oraz 2, zwraca odpowiednio rok oraz numer miesiąca, a następnie wykonuje na tych wartościach operacje arytmetyczne i logiczne. Tak stworzony seed inicjuje obiekt “random”, Tworzonych jest 2000 domen, z TLD (domen najwyższego rzędu) .com, .ru oraz .cn. Dla każdej z nich sprawdzane jest, czy jest do niej przyporządkowany adres IP i czy po wysłaniu zapytania witryna zwraca poprawną odpowiedź. Opowiada za to:

PanelReq.Send(str, „PREPING,”) != null

Funkcja wysyła do serwera C&C zaszyfrowane zapytanie “PREPING,” i jeśli odpowiedź zdeszyfruje się poprawnie – host zostaje C&C.

Szyfrowanie

Kolejnym sposobem ukrycia złośliwych działań jest zaszyfrowanie całej komunikacji. Same polecenia i odpowiedź z serwera są zaszyfrowane za pomocą operacji logicznej XOR, przy użyciu 10-znakowego, odrębnego dla każdego zapytania klucza. Jest on wysyłany wraz z wygenerowanym UUID (Universal Unique identifier) i zaszyfrowany za pomocą RSA. Za wysyłanie danych do C&C i obsługę szyfrowania odpowiada metoda:

Całość wiadomości składa się z dwóch części. Pierwsza zaszyfrowana jest za pomocą RSA. W niej znajdziemy zawartość zmiennej BotID (czyli właśnie faktyczny UUID, generowany jest na początku działania aplikacji) oraz klucz który zostanie użyty do zaszyfrowania drugiej części .

Przykładowa wartość wiadomości szyfrowanej przez RSA to 314E69247AB445A680D7E52D6B91DCE6,AAAAAAAAAA

Gdzie 314E69247AB445A680D7E52D6B91DCE6 to UUID, zaś AAAAAAAAAA to klucz użyty do zaszyfrowania drugiej części.

W analizowanych próbkach klucz publiczny użyty do zaszyfrowania przez RSA miał wartość:

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiQ3YWOM6ycmMrUGB8b3LqUiuXdxFYm/eBxARoAHC/9dC8c6agwdveSqj3/9hTOM5zTS/OsrYlIT6+ZmmmZrnOfbB+FXq3pCG8/kM6ujvGxY0ANfbGVlfCTOnd+jKVHH1YhPT55aAY5K0C0EACXoV+TyyjReAtzC2xn4gI/tklOOfK2/17qaOIuYLneGHRuklmM/BVMvlg9st4If6WYyntcX6RZtY7Usks7MWVhFOpzYlLN02b/FAPWjbgOPehZUqz8WGAuHFjuAX99c65nsYm1UT9IYypQXx3KJMBeJr1Yr4VUkkPMRqgAbKacWvgDywkJuYOcbfz8Om8a+8TVaojwIDAQAB

Za szyfrowanie drugiej części wiadomości odpowiada metoda “Encrypt”, gdy przekazana jest jej wartość „true” dla trzeciego argumentu.

Obie części są kodowane za pomocą Base64 i wysyłane za pomocą zapytania POST na ścieżkę ”/poll.php” wcześniej znalezionego serwera C&C. Przykładowe zapytanie do serwera może mieć postać:

‘GDGlm5Xkc+/ppRehVPEaYU+EfwhGa03Gak+pBOz1agtgQNrZVdCpy2lfv1vESDXaXyUc/nSeK8hasVMKgyC2a4DyGCpEhO/GYHVhngLMOUaKNGxUlwDwHo9xbUfzehwA75wSQOpSbEpOEeNJFaS6yawFa8+irnXsrdTieOYftfzsmMAapueZpk58SFBToUjNCp/fFSV6ZRpCOJKyWtI4XOhcTRXEIkt9H0w08TMY/cD8JEyWZTMUoTm+orrwggWqvhjTeZHl/D+xdUilKsedi/sbZRiK0CZA1II1H05/RVMjqbf98sLLP1+p8TeITxZVEnDYUeZzSoY7L8YKMnr20Q==\r\nITE1KCspIF0=’

Pierwsza część od drugiej jest oddzielona za pomocą ”\r\n”.

Następnie odpowiedź z serwera jest deszyfrowana za pomocą tej samej metody “Encrypt”, gdzie trzeci argument przybiera wartość „false”. W metodzie “Send” sprawdzane jest, czy pierwsza część wiadomości zawiera ten sam wygenerowany UUID. Jeśli tak – zdeszyfrowana druga część odpowiedzi zwracana jest przez metodę; jeśli UUID się nie zgadza, zwracany jest null.

Dostępne polecenia

Do serwera C&C cyklicznie wysyłana jest polecenie “PING” z informacjami o wersji złośliwej aplikacji (analizowana miała wersje 3.2), informacje o wersji androida, ustawiony język, całkowity czas jaki urządzenie jest włączone, nazwa operatora telekomunikacyjnego. W odpowiedzi aplikacja otrzymuje polecenie które wykonuje, lista dostępnych poleceń:

UNINSTALL_APP
CARD_BLOCK
SMS_INT_TOGGLE
BLOCK
SOCKS
UPLOAD_SMS
OPEN_URL
RUN_USSD
DISABLE_PLAY_PROTECT
RELOAD_INJECTS
SEND_SMS
GET_CONTACTS
RETRY_INJECT

System dystrybucji

Głównym wektorem rozpowszechniania złośliwej aplikacji są wiadomości SMS. Co ciekawe, mimo iż są one wysyłane z przejętych telefonów, nie trafiają bezpośrednio do kontaktów ofiary. Przykładowo przy zainfekowaniu telefonów użytkowników A i B ich kontakty trafiają do serwera C&C. W następnym kroku do A trafiają kontakty B, zaś do B – od A. Dzięki temu SMS, dystrybuujący złośliwą aplikację zostanie wysłany od obcego numeru, co może ułatwić ofierze uwierzenie w socjotechniczną sztuczkę.

Lista kontaktów z telefonu jest wysyłana do serwera C&C po otrzymaniu od niego polecenia “GET_CONTACTS”, za pomocą metody:

Wysyła ona numer telefonu nadaną mu przez użytkownika nazwą. Przykładowe kompletne zapytanie do serwera C&C przybiera postać (jeśli na telefonie są 2 kontakty):

LOG,CONTACTS,[nazwa_wyświetlania1]:[numer_telefonu1]
[nazwa_wyświetlania2]:[numer_telefonu2]

Każdy kontakt jest oddzielony znakiem nowej linii, zaś nazwa wyświetlana od numeru telefonu oddzielona jest za pomocą znaku :

Oddzielny wątek odpowiada za rozsyłanie sms z linkiem do pobrania aplikacji do kolejnych ofiar. W kodzie aplikacji odpowiada za to klasa “Spammer”. Main tej klasy wywołuje metodę która najpierw pobiera częstotliwość, z jaką SMS mają być rozsyłane. Po otrzymaniu odpowiedzi metoda SendSms jest wykonywana z wcześniej określoną częstotliwością:

Wysyła ona polecenie GET_SMS, w odpowiedzi otrzymując numer telefonu (zmienna “str”), oraz treść wiadomości do wysłania (zmienna “str2”), oddzielone znakiem “,”. W kolejnym kroku sprawdzane jest, czy otrzymany numer znajduje się w książce adresowej na zainfekowanym telefonie. Jeśli nie – wiadomość jest wysyłana, zaś numer dodawany jest do blokowanych.

Poniżej przykładowe SMSy wysłane przez aplikację:

Złośliwa aplikacja przykuwa uwagę przez swój system dystrybucji, który w krótkim czasie potrafi dotrzeć do dużej liczby użytkowników. Jak podaje grupa PRODAFT, która dotarła do serwera C&C używanego do kampanii adresowanej na użytkowników w Hiszpanii, Flubotem zainfekowało się około 60000 urządzeń w trakcie 2 miesięcy.

Teraz ten malware trafił do nas. Uważajcie.


Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Zobacz także