Analiza złośliwego oprogramowania Backswap

Data publikacji: 19/06/2018, Hubert Barc


    Backswap jest bankerem, który pojawił się w Polsce w okolicach marca 2018 r. Jest to wariant znanego od dawna oprogramowania o nazwie TinBa (od „tiny banker”), którego cechą charakterystyczną jest względnie mały rozmiar (mieszczący się zazwyczaj w zakresie 10-50 kB). Powody dla których uważamy, że jest to ten sam malware tylko z lekkimi modyfikacjami zamieszczamy w podsumowaniu.

    W polskim internecie obecna jest długo, pisaliśmy o niej już w 2016 roku. Wtedy mogliśmy spotkać wersję używającą technik:

    • DGA do komunikacji z C&C
    • Form grabbing do wykradania danych logowania
    • wstrzykiwania w inne procesy.

     

    Więcej o starszych wersjach Tinby, można przeczytać w odnośnikach poniżej:

    Występuje wiele odmian tego malware’u. Dla przejrzystości tego artykułu skupiliśmy się głównie na części wspólnej i zachowaniach z nowszych próbek.

    Atakuje głównie polskie banki, podmieniając adres docelowy przelewów poprzez wstrzyknięcie kodu JavaScript, lecz nie tylko, czasem celem ataków są konta krytpowalutowe – Bitcoin, Ethereum i inne. Dostępny jest kod źródłowy kilkuletniej wersji.

    Cechy:

    • malware potrafi uruchomić się z dowolnego miejsca w pamięci procesu
    • samemu rozwiązuje tablice importów, używając do tego hashy nazw funkcji
    • podmienia zawartość schowka, numery bankowe/adresy portfeli kryptowalut
    • wstrzykuje WebInjecty, podmienia numery bankowe oraz kradnie dane dostępowe

     
    Cele ataków, w niektórych wersjach ‚*’ używana jako wildcard

    W innych szukane były podciągi w odwiedzanej stronie

    Analiza techniczna

    Bardzo dużo informacji możemy uzyskać z samego kodu źródłowego. Pomaga on zorientować się w działaniu tego malware, lecz z uwagi na dużą ilość odmian i relatywnie stary dostępny kod, nie jest on wystarczający.

    1. Position Independent

    Backswap prawie zawsze zaszyty jest w innym programie. Najczęsciej programami głownymi są 7zip, ollydbg, dbgview. Nie ma to na celu spowodowania, że ofiara nie zorientuje się, że coś jest nie tak, lecz prawdopodobnie zmylenie heurestyk programów antywirusowych. Do tabeli initterm, wewnętrznej tabeli inicjalizacyjnej środowiska języka C++, dopisuje się funkcja kopiująca kod Backswapa w nowo zaalokowany obszar pamięci.

    Aby umożliwić takie działanie, malware ten posiada możliwość operowania w dowolnym miejscu pamięci, mówimy że jest Position Independent(PIC), co oznacza, że wszystkie offsety liczone są relatywnie do pozycji w kodzie.

    Realizowane jest to poprzez charakterystyczną kombinację instrukcji:

    Wylicza ona przesunięcie kodu backswapa względem adresu 0x401000. Następnie offset ten jest dodawany do każdego skoku oraz do każdej instrukcji pobierania wartości z pamięci.

    Trudnością przy analizie może okazać się niedoskonałość narzędzi do dezasemblacji. IDA Pro, używająca metody dezasemblacji metodą zejść rekurencyjnych, nie radzi sobie z umieszczonymi bezpośrednio w kodzie napisami. Backswap umieszcza argumenty, które są wskaźnikami na napisy, wywołując instrukcje call bezpośrednio za napis w kodzie wygenerowany od razu po tej instrukcji. Jest to nazywane „call-over-string”. Zaoszczędza miejsce, oraz ułatwia pisanie kodu Position Independent.

    • Kod wygenerowany przez IDA automatycznie (kod bezpośrednio pod instrukcją call jest dezasemblowany w pierwszej kolejności, mimo że nigdy nie jest osiągany, dopiero w następnym kroku IDA próbuje dezasemblować instrukcje wskazywane przez skok, lecz ponieważ zostały już inaczej zinterpretowane nie zostają ponownie analizowane)

    • Kod po manualnym poprawieniu. Jak widać, pod instrukcją call znajduje się napis, który na pierwszym screenshocie przez IDA został niepoprawnie zinterpretowany jako kod, przez co dezasemblacja części dalszej została wykonana niepoprawnie. Po zdefiniowaniu MozillaWindowClass jako napis, IDA dezasembluje następny kawałek kodu poprawnie

    2. Windows API

    Następstwem kodu Position Independent jest fakt, że Backswap musi ładować funkcje z Windowsowego API samodzielnie. Adres biblioteki kernel32.dll otrzymywany jest poprzez trawersowanie struktury PEB.

    Opis PEB oraz więcej o tego typu technikach można znaleźć w innej analizie CERT Polska

    Reszta bibliotek ładowana jest przy pomocy funkcji LoadLibraryA z tej właśnie biblioteki.

    Funkcje ładowane są poprzez porównanie prostego hasha nazwy funkcji z nazwą eksportowaną w tablicy eksportów danej biblioteki. Poniżej algorytm hashowania wyrażony w języku Python:

    Ładowane biblioteki

    3. Szkodliwa aktywność

    Backswap wykazuje kilka szkodliwych aktywności. Obsługuje wstrzykiwanie WebInjectów zmieniających dane do przelewów oraz kradnących dane logowania do popularnych przeglądarek internetowych (Internet Explorer, Mozilla Firefox, Google Chrome). W niektórych wariantach podmienia również zawartość schowka, gdy znajdzie się w nim numer bankowy bądź adres portfela kryptowaluty.

    WebInjecty

    WebInjecty wstrzykiwane są metodą, która dla antywirusów z heurestykami nie wydaje się podejrzana, przynajmniej nie tak bardzo jak wstrzykiwanie kodu w inny proces, czy chociażby pisanie bezpośrednio po jego pamięci, co czyni ją dość efektywną w swojej prostocie.

    Przechowywane są w sekcji .rsrc pliku PE, zxorowane ze stałą wartością, najczęściej 0x8 lub 8^7^6 = 0x9. Funkcja realizująca to zadanie jest napisana w dość specyficzny sposób. Zamiast xora z jedną wartością, xorowanie wykonywane jest kilkukrotnie z innymi wartościami. W późniejszych wersjach Backswap przeprowadzał xorowanie również z innymi wartościami, aczkolwiek zawsze kluczem był jeden bajt.

    Backswap używa skrótów klawiszowych do wstrzyknięcia swojego kodu. Cały proces wygląda nastepująco:

    • W przypadku Mozilli Firefox: wyłączenie zabezpieczenia wklejania kodu JavaScript do konsoli, co realizowane jest następującym poleceniem: /V:ON /C dir /S/B/A-D „%APPDATA%\Mozilla\prefs.js” > „%TEMP%\edit” && SETLOCAL EnableDelayedExpansion && set /p v=<„%TEMP%\edit” && echo ^user_pref(„devtools.selfxss.count”, 100); >> „!v!”
    • Uzyskanie WebInjectów z sekcji .rsrc
    • Ustawienie zawartości schowka na WebInject. W pierwszej ramce inject jest kopiowany do nowo zaalokowanego globalnego bufora, a następnie przy użyciu SetClipboardData umieszczany jest w schowku

    • Schowanie okna przeglądarki. W tym celu używane jest GetWindowLong do pobrania GWL_EXSTYLE, czyli rozszerzonych styli okna, które następnie są rozszerzane o atrybut WS_EX_LAYERED(or eax, 80000h) i ustawiane na oknie przy użyciu SetWindowLong. Umożliwia to ustawienie przeźroczystości na oknie poprzez wywołanie SetLayeredWindowAttributes

    • Wysłanie do procesu kombinacji klawiszy CTRL+SHIFT+J dla IE/Chrome oraz CTRL+SHIFT+K dla Firefox, co powoduje otworzenie konsoli dla developerów. Wykorzystywana jest funkcja SendInput
    • W ten sam sposób wysyłana jest kombinacja CTRL+V, następnie ENTER

    • Ostatecznie konsola chowana jest tą samą kombinacją klawiszy, którą została otworzona. Przeźroczystość okna jest wyłączana

    Drugim sposobem injectowania jest wklejenie WebInjecta w pasku adresu, poprzedzając go ciągiem javascript: wpisywanym literka po literce. Wpisywanie w ten sposób zapobiega mechanizmom obronnym przeglądarek. Kroki po wstępnym wydobyciu injectów i umieszczeniu ich w schowku wyglądają następująco:

    • Wyślij CTRL+L do okna przeglądarki przy użyciu SendInput opisanego powyżej
    • Wpisuj ciąg javascript: znak po znaku, używając do tego mechanizmu WinApi do obsługi zdarzeń. W pętli wywoływana jest funkcja SendMessage z parametrem WM_CHAR

    Kradzież danych do logowania

    Niektóre próbki malware’u używają sprytnych metod do wykradania danych logowania. Backswap przy użyciu funkcji SetWinEventHook hookuje eventy:

    Funkcja obsługująca te eventy zapisuje wartość paska tytułowego aktywnego okna w ścieżce %TEMP%/<nazwa>.log, gdzie przykładowe nazwy pliku to dero, niko, gobi, abc.

    WebInjecty, po przeczytaniu odpowiednich wartości ze strony logowania, umieszczają dane w pasku tytułowym okna. W tym czasie drugi wątek okresowo wysyła nazwy okien z pliku logów do serwera C&C. Niektóre wycinki WebInjectów realizujące te funkcje przedstawiamy poniżej

    Niektóre z używanych C&C wraz z endpointami:

    Jak widać są to głównie serwery, pod którymi działają nieszkodliwe serwisy, co sugeruje, że zostały one skompromitowane. Utrudnia to namierzanie przestępców zarządzających malwarem.

    Próbki nie posiadające serwera C&C, zawierają url postaci http://counter.yadro.ru/hit?rhttp://sexy.com/;uhttp://sexy.com/;h, sugerujący, że twórcy malware zliczają ilość infekcji.

    Podsumowanie

    Backswap z Tinbą dzieli wiele wspólnego, charakterystyczny wzorzec call $+5; pop ebx używany w celu realizacji kodu Position Independent, funkcje rekonstruujące Windowsowe API, przechowywanie WebInjectów w sekcji .rsrc zxorowanych ze stałym kluczem, call-over-string czy chociażby napisy w próbce:

    Zmieniła się jedynie szkodliwa aktywność, co nie jest dziwne lub zaskakujące. Metody twórców malware ciągłe ewoluują, dostosowując się do nowych zabezpieczeń i nawyków internautów.

    Reguły

    Hashe

    Inne analizy

    https://www.welivesecurity.com/2018/05/25/backswap-malware-empty-bank-accounts/