Analiza techniczna trojana bankowego Cerberus

Data publikacji: 31/10/2019, CERT Polska

W ostatnim czasie obserwowaliśmy kolejną kampanię złośliwego oprogramowania wymierzoną w użytkowników urządzeń mobilnych z systemem Android. Szkodliwa aplikacja, podszywająca się pod produkt marki InPost, okazała się być trojanem bankowym rozpoznanym jako Cerberus.

Dystrybucja złośliwego kodu opierała się o wysyłkę wiadomości SMS z informacją o śledzeniu przesyłki za pomocą aplikacji mobilnej, wraz z linkiem do jej pobrania. Jedną z podstawowych funkcji bota było wykradanie danych logowania do wybranych aplikacji. Na celowniku znalazły się m.in. produkty do obsługi bankowości internetowej i poczty. Złośliwe oprogramowanie po udzieleniu mu zezwolenia na korzystanie z usług ułatwień dostępu (ang. accessibility services) dokonywało samodzielnego podniesienia własnych uprawnień. Trojan przyznawał sobie m.in. możliwość odczytywania listy kontaktów, inicjowania wywołań USSD, stawał się administratorem urządzenia oraz domyślną aplikacją do obsługi SMS.

 


Rys. 1 – Witryna phishingowa zachęcająca do pobrania złośliwej aplikacji

 

Podstawowe informacje

Cerberus to po trojanach takich jak GMBot, Marcher, czy Anubis kolejna odmiana złośliwego oprogramowania atakującego użytkowników telefonów z systemem Android. Udostępniany w modelu malware-as-a-service trojan jest silnie promowany w mediach społecznościowych. Cerberus posiada swój profil na Twitterze (@AndroidCerberus), gdzie publikowane są informacje o nowościach, ale również wiadomości kierowane do analityków bezpieczeństwa np. Lukasa Stefanko czy Trend Micro Research. W zamyśle autorów trojan miał pozwalać np. na wyłączenie Google Play Protect, przechwytywanie komunikacji SMS, uruchamianie i usuwanie zainstalowanych aplikacji, otwieranie adresów URL, wyświetlanie fałszywych powiadomień z aplikacji bankowych, unikanie analizy poprzez stosowanie technik anty-emulacji, a w niektórych wypadkach także wykradanie danych przy użyciu keyloggera. W analizowanej próbce zaobserwowano aktywne użycie tylko części funkcji.

Poniżej zrzut ekranu przedstawiający panel zarządzania Cerberusa, opublikowany na oficjalnym Twitterze autorów:


Rys. 2 – Panel Cerberusa służący do zarządzania botami [źródło: @AndroidCerberus]

 

Sposób działania

Aby zainstalować złośliwe oprogramowanie użytkownik musi pobrać plik z linka w SMS-ie oraz wyłączyć blokadę instalacji aplikacji spoza oficjalnego sklepu Google Play. Próbka trojana analizowana w środowisku Android 7.0 (API 24) nie domaga się przydzielania dodatkowych uprawnień na etapie instalacji. Może to spowodować uśpienie czujności użytkownika. Dopiero pierwsze uruchomienie skutkuje pojawieniem się okna, które w natarczywy sposób domaga się wyrażenia zgody na korzystanie z usług ułatwień dostępu (ang. accessibility services).

 


Rys. 3 – Ekran Cerberusa po uruchomieniu

Rys. 4 – Moment przydzielania uprawnień dostępności

 

Ułatwienia dostępu, mające z założenia wspomagać obsługę systemu osobom niepełnosprawnym zostają, w przypadku Cerberusa, użyte do przejęcia kontroli nad urządzeniem. Jedną z możliwości jakie dają Accessibility Services jest odczytywanie zawartości wyświetlanych okien i wchodzenie z nimi w interakcję. Jeżeli użytkownik zgodzi się, aby złośliwe oprogramowanie korzystało z tej funkcjonalności, może ono samodzielnie pozyskiwać dalsze uprawnienia.

 

Uprawnienia żądane przez aplikację obejmują m.in:

  • android.permission.BIND_ACCESSIBILITY_SERVICE – ułatwienia dostępu (pobieranie zawartości okien i samodzielne nadawanie uprawnień).
  • android.permission.READ_SMS – odczytywanie SMS.
  • android.permission.RECEIVE_SMS – odbiór wiadomości tekstowych.
  • android.permission.SEND_SMS – wysyłanie wiadomości SMS.
  • android.permission.INTERNET – dostęp do internetu.
  • android.permission.CALL_PHONE – wykonywanie połączeń.
  • android.permission.READ_CONTACTS – odczytywanie kontaktów.
  • android.permission.READ_PHONE_STATE – odczytywanie informacji o stanie urządzenia (m.in. numer telefonu użytkownika, status połączeń telefonicznych, dane dot. sieci komórkowej, lista kont korzystających z menedżera połączeń).
  • android.permission.BIND_DEVICE_ADMIN – przydzielenie uprawnień administratora urządzenia.

 

Poniżej zrzuty ekranu samodzielnie nadanych uprawnień:


Rys. 5 – Cerberus ustanowił się domyślną aplikacją do obsługi SMS’ów.

Rys. 6 – Cerberus z nadanymi uprawnieniami administratora urządzenia.

 

Korzystając z techniki przysłaniania ekranu za pomocą nakładek (ang. overlay), złośliwe narzędzie wykrada dane logowania do popularnych aplikacji. Overlay’e są pobierane z zewnętrznego serwera w trakcie działania trojana – warunek stanowi zainstalowana na urządzeniu aplikacja, na którą przestępcy posiadają przygotowaną nakładkę.

 

Rys. 7 – Przykłady używanych przez Cerberusa nakładek, wykradających dane logowania.

 

Złośliwe oprogramowanie posiada funkcjonalność dynamicznego ładowania modułów kodu, co utrudnia analizę i ewentualne wykrycie złośliwych działań – można zaobserwować to w pliku AndroidManifest.xml, zawierającym opis ładowanych klas (np. linia 20 – adult.weapon.shop…), których nie widać w dostarczonej próbce (drzewo po lewej stronie).


Rys. 8 – AndroidManifest.xml (widoczne definicje klas nieobecnych w drzewie aplikacji).

Pozostała część kodu znajduje się w zasobach aplikacji, podszywając się pod plik JSON. Moduł szyfrowany jest przy użyciu RC4, stałym kluczem o wartości: PUPn.


Rys. 9- Zaszyfrowany moduł DEX

Ładowanie osadzonego w aplikacji kodu następuje po odszyfrowaniu za pomocą funkcji trophyalone() widocznej na poniższym zrzucie ekranu:


Rys. 10 – Funkcja służąca do dynamicznego ładowania aplikacji.

Fragment zdekompilowanego modułu po odszyfrowaniu:


Rys. 11 – Odszyfrowany moduł DEX

Załadowany moduł dodatkowo szyfruje łańcuchy znakowe. Pierwotnie są one przechowywane w postaci {12-znakowy-klucz-RC4}{Base64}. Base64 jest odkodowywany, a wynik jest deszyfrowany pierwszymi 12 znakami stanowiącymi wartość klucza.


Rys. 12 – Łańcuchy znakowe w załadowanym dynamicznie module

Przykładowe wartości łańcuchów po odszyfrowaniu:

statMails
activeDevice
timeWorking
statDownloadModule
lockDevice
offSound
keylogger
activeInjection
timeInject
timeCC
timeMails
dataKeylogger
autoClick
key
display_width
display_height
checkProtect
goOffProtect
timeProtect
packageName
packageNameActivityInject
logsContacts
logsApplications
logsSavedSMS
locale
batteryLevel
ojsghOSFogewghdgsg
android.provider.Telephony.SMS_RECEIVED
android.permission.READ_PHONE_STATE
timestop
package:
>> 
POST
Content-Length

Cerberus poza kodem “ukrytym” w aplikacji, pobiera dodatkowy moduł z serwera dostawców oprogramowania. Ponownie, część programu jest szyfrowana za pomocą algorytmu RC4 (tym razem kluczem o wartości: ojsghOSFogewghdgsg widocznym powyżej). Interesującym faktem jest, że klucz jest osadzony pomiędzy łańcuchami znakowymi wykorzystywanymi przez złośliwe oprogramowanie i mogącymi wskazywać na jego potencjalne funkcjonalności.

Fragment modułu pobranego z sieci publikujemy na zrzucie ekranu poniżej:


Rys.13 – Łańcuchy znakowe w module pobranym z serwera C&C

Komunikacja z C&C

Aplikacja komunikuje się z serwerem zarządzającym pod adresem badabinglalaland[.]com. Początkowa wymiana danych to rejestracja w botnecie. Dalsza komunikacja przebiega cyklicznie i złośliwe oprogramowanie przesyła dane identyfikujące ofiarę: wygenerowany identyfikator, numer telefonu (jeśli uda się go pozyskać), nazwę operatora GSM, model telefonu, wersję systemu Android, listę zainstalowanych aplikacji, kraj oraz wykradzione loginy i hasła.

Poufność danych płynących do serwerów przestępców jest gwarantowana przez algorytm RC4, który korzysta z tej samej wartości klucza (ojsghOSFogewghdgsg), która była wykorzystana przy pobieraniu z sieci dodatkowego modułu.

Rys. 14 – Przykładowe zapytanie wysyłane do serwera C&C przez zainfekowane urządzenie

Po odszyfrowaniu, bot przesyłał następujące dane w postaci JSON:

{„id”:”CERTPL”,”idSettings”:”CERTPL”,”number”:”+48CERTPL”,”statAdmin”:”1″,”statProtect”:”0″,”statScreen”:”0″,”statAccessibilty”:”1″,”statSMS”:”0″,”statCards”:”0″,”statBanks”:”1″,”statMails”:”1″,”activeDevice”:”0″,”timeWorking”:”688″,”statDownloadModule”:”1″,”batteryLevel”:”100″,”locale”:”pl”}

Podczas analizy aplikacji, nie została zaobserwowana komunikacja sieciowa dotycząca wykradania SMS-ów, kontaktów oraz działania keyloggera.

 

Zapobieganie infekcji

Aplikacja, z uwagi na sposób dystrybucji poza sklepem Google, domyślnie nie powinna zainstalować się na urządzeniu. Standardowe polityki bezpieczeństwa w systemie Android nie zezwalają na instalację pakietów pochodzących z niezaufanych źródeł. Użytkownik może świadomie zrezygnować z tego mechanizmu, stanowczo jednak odradzamy takiego rozwiązania.

Nie można wykluczyć prób umieszczania tego typu złośliwych aplikacji w oficjalnych kanałach dystrybucji. W związku z tym, pobierając i instalując aplikacje warto zachować ostrożność i weryfikować, czy nie wymagają od użytkownika przydzielenia niebezpiecznych lub nieadekwatnych uprawnień. Również natarczywe domaganie się przydzielenia któregoś z dostępów powinno być odebrane jako sygnał alarmowy.

IoC

  • Nazwa aplikacji: InPost (verify.ship.observe)
  • SHA256 aplikacji: 8332b45100044db8c4d94b8414b4aa8e9b3c204b5e05c2230a480b41fd6c6a57
  • SHA256 certyfikatu użytego do podpisania aplikacji: a40da80a59d170caa950cf15c18c454d47a39b26989d8b640ecd745ba71bf5dc
  • Adres witryny dystrybuującej aplikację: inpost24[.]tk/inpost
  • Serwer C&C: badabinglalaland[.]com (47.74.219.29)