Głębsze spojrzenie na moduły Tofsee

Data publikacji: 19/10/2017, Jarosław Jedynak

logo

Tofsee jest złośliwym oprogramowaniem z wieloma funkcjami – może kopać bitcoiny, wysyłać emaile, kraść dane dostępowe, wykonywać ataki DDoS i wiele więcej.

Pisaliśmy już o Tofsee/Ghegu kilka miesięcy temu – nasza analiza znajduje się pod adresem https://www.cert.pl/news/single/tofsee. Znajomość tamtego posta jest potrzebna żeby w pełni zrozumieć obecnie omawiany temat. Ten post ma za zadanie tylko rozszerzyć tamte badania, koncentrując się na funkcjach wtyczek, których wcześniej nie opisaliśmy.

Podsumujemy pokrótce każdy moduł i podkreślimy jego najważniejsze możliwości.

Ten post jest raczej długi – dla niecierpliwych, lista hashy i spis treści w jednym:

ID Zasobu Nazwa DLL Hash pluginu
1 ddosR.dll fbc7eebe4a56114e55989e50d8d19b5b
2 antibot.dll a3ba755086b75e1b654532d1d097c549
3 snrpR.dll 385b09563350897f8c941b47fb199dcb
4 proxyR.dll 4a174e770958be3eb5cc2c4a164038af
5 webmR.dll 78ee41b097d402849474291214391d34
6 protect.dll 624c5469ba44c7eda33a293638260544
7 locsR.dll 2d28c116ca0783046732edf4d4079c77
10 hostR.dll c90224a3f8b0ab83fafbac6708b9f834
11 text.dll 48ace17c96ae8b30509efcb83a1218b4
12 smtp.dll 761e654fb2f47a39b69340c1de181ce0
13 blist.dll e77c0f921ef3ff1c4ef83ea6383b51b9
14 miner.dll 47405b40ef8603f24b0e4e2b59b74a8c
15 img.dll e0b0448dc095738ab8eaa89539b66e47
16 spread.dll 227ec327fe7544f04ce07023ebe816d5
17 spread2.dll 90a7f97c02d5f15801f7449cdf35cd2d
18 sys.dll 70dbbaba56a58775658d74cdddc56d05
19 webb.dll 8a3d2ae32b894624b090ff7a36da2db4
20 p2p.dll e0061dce024cca457457d217c9905358

1. ddosR.dll

Oryginalna nazwa pliku: p:\cmf5\small2\plugins\plg_ddos\ddos.cpp

Zadaniem tego pluginu jest wykonywanie ataków DDoS na wskazane cele. Zaimplementowane metody nie są zbyt skomplikowane, np. wykonywanie wielu zapytań (tzw. HTTP Flood):

Albo stary dobry SYN flood (używając sterownika PassThru, czyli modułu grabb).

Nie zaobserwowaliśmy jeszcze żadnej aktywności DDoS od Tofsee – prawdopodobnie ten plugin obecnie nie jest wykorzystywany przez botmastera.

Konfiguracja otrzymywana z C&C dla tego pluginu jest bardzo prosta:

Moduły zawierają wiele napisów, które znacznie upraszczają analizę:

2. antibot.dll

Oryginalna nazwa pliku: z:\cmf5\small2\plugins\plg_antibot\plugin.cpp

To bardzo interesujący plugin – jego celem jest usunięcie innych rodzajów złośliwego oprogramowania z komputera ofiary.

Jest w stanie:

    • sprawdzić wszystkie działające procesy i zabić te, które mogą być potencjalnym zagrożeniem (sprawdzenie oparte o nazwę procesu)
    • przeszukać klucz rejestru SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects i usunąć niektóre dodatki do przeglądarki
    • przeszukać aktualne mutexy i zabić procesy które je posiadają (sprawdzenie oparte o nazwę)

Lista dodatków usuwanych aktualnie przez moduł (pobranych z C&C):

3. snrpR.dll

Oryginalna nazwa pliku: p:\\cmf5\\small2\\plugins\\plg_sniff\\sniff.cpp

Powiązana sekcja w konfiguracji:

Ruch jest podsłuchiwany i przechwytywany przez sterownik PassThru (dostępny przez named pipe „\\\\.\\PassThru”).

    • mail.sniff aktywuje kradzież adresów e-mail przechodzących po sieci. Adresy są kradzione z nagłówków From i To. Dodatkowo szuka w treści encji „%40″,”#64″,”#064” (czyli zakodowanego znaku „@”).

    • ftp.sniff i pop.sniff aktywują kradzież danych logowania POP3 i FTP. Plugin szuka komend USER i PASS, a następnie wyciąga zawartość i wysyła do serwera C&C.

    • mail.replace Aktywuje transparentne podmienianie zawartości wysyłanych emaili, używając wybranego szablonu (przechowywanego w konfiguracji w polu mailbody)

Przykładowy szablon który otrzymaliśmy (mimo że ta funkcja jest obecnie wyłączona):

Jak widać, szablon zostawia oryginalne nagłówki From, To (%FROM_LINE, %TO_LINE), dodatkowo ma opcję zostawienia oryginalnego tematu (%SUBJ, %_SUBJ) i oryginalnego czasu (%DATE, %P5DATE, %M5DATE)

4. proxyR.dll

Oryginalna nazwa pliku: p:\\cmf5\\small2\\plugins\\plg_proxy\\plugin.cpp

Ten moduł nasłuchuje na połączenia TCP na adresie 0.0.0.0:1080 i dostarcza wielowątkowy serwer SOCKS proxy. Wersja, którą analizowaliśmy, identyfikuje się w nagłówku Proxy-agent jako WinRoute Pro/4.1.

Ruch jest przekierowywany do adresów wpisanych w sekcji proxy_cfg, osobno dla każdego regionu:

Adresy są albo wpisane jako referencje do listy work_srv, albo bezpośrednio:

W proxy_cfg mamy też listę skonfigurowanych dla socketów timeoutów:

Kiedy brakuje jakiejś wartości w konfiguracji, program ma kilka domyślnych wartości zapewniających działanie.

Moduł dodatkowo dodaje mapowanie portu używając UPnP, przedstawiając się jako Skype:

Napisy z programu dają trochę wglądu w cel i wewnętrzne działanie tego pluginu:

6. protect.dll

Oryginalna nazwa pliku: z:\cmf5\small2\plugins\plg_protect\plugin.cpp

Ten moduł pobiera i instaluje złośliwą usługę w systemie:

Złośliwa usługa jest obfuskowana „nowoczesnym algorytmem szyfrowania” – czyli każdy bajt jest negowany:

Md5 zdeszyfrowanego backdoora = 49642f1d1b1673a40f5fa6263a66d056. Ten backdoor jest chroniony przez packer i to jedyne zaobserwowane przez nas jego użycie podczas całego procesu analizy Tofsee – może to sugerować, że był stworzony przez innego aktora i później wykorzystany przez twórców Tofsee.

7. locsR.dll

Oryginalna nazwa pliku: z:\cmf5\cmf5\small2\plugins\plg_locs\plg.cpp

Ten plugin kradnie dane dostępowe do programu Microsoft Outlook:

Po wyciągnięciu ich z rejestru, są odszyfrowywane i wykorzystywane do wysłania większej liczby emaili. Dodatkowo, generuje adres email w postaci [nazwa komputera]@mail.run i próbuje wysłać emaile korzystając z niej (czystym protokołem SMTP).

Ciekawsze napisy z pliku:

10. hostR.dll

Plugin, który potrafi działać jako serwer HTTP. Przedstawia się Apache/2.2.15 (Win32). Może serwować pliki, prawdopodobnie dla innych botów (w połączeniu z pluginem p2p.dll).

Jest w stanie wykluczać niektóre IP – prawdopodobnie analityków bezpieczeństwa (np. całe zakresy adresowe Forcepoint i Google są zbanowane).

Pobrana z C&C konfiguracja dla tego modułu:

11. text.dll

Oryginalna nazwa pliku: p:\cmf5\small2\plugins\plg_text\plg_text.cpp.

Bardzo prosty plugin, jest w stanie tylko przetwarzać szablony emaili pobranych z serwera C&C.

12. smtp.dll

Bardzo ważny moduł – generuje i wysyła emaile. Jest prawdopodobnie największym pluginem, a jego kod jest często skomplikowany.

Najciekawszą rzeczą w nim jest fakt, że do generowania wiadomości używa własnego dedykowanego języka skryptowego. Przykładowy skrypt otrzymany od C&C:

Jeśli ktoś jest w stanie rozpoznać ten język skryptowy, bardzo chętnie dowiedzielibyśmy się co jeszcze z niego korzysta. Jako że nie widzieliśmy wcześniej czegoś takiego, spróbowaliśmy przeanalizować interpreter tego języka.

Składnia jest raczej prosta, ale bardzo podobna do asemblera i prymitywna. Mamy nadzieję że autorzy malware generują ten skrypt z jakiegoś bardziej wysokopoziomowego języka, bo pisanie w takim czymś musi bardzo ranić zdrowie psychiczne programisty ;].

Wspieranych jest bardzo wiele opcodów – polecamy spojrzeć na tę uproszczoną funkcję parsującą jako przykład:

Nie przeanalizowaliśmy ich wszystkich, ale kilka najważniejszych to:

    • C ip:port – Połącz do ip:port (Connect)
    • L lbl – Stwórz etykietę (Label) o nazwie lbl.
    • J lbl – Skocz (Jump) do etykiety lbl.
    • v name value – Stwórz zmienną (variable) o nazwie name i przypisz wartość value.
    • W text – Wypisz (Write) coś na wyjście – czyli w tym przypadku do emaila.
    • I lbl condition – Jeśli (If) condition jest spełniony, skocz do etykiety lbl

Dodatkowo, otoczenie tekstu w „”” pozwala na znaki nowej linii i escape sequences, a __v(XX)__ to interpolacja zmiennych.

Ponownie, kilka ciekawszych napisów, które można znaleźć w tym pliku:

Przez chwilę myśleliśmy, że IfYouAreReadingThisYouHaveTooMuchFreeTime to easter-egg dla nas, analityków malware – ale okazuje się że to tylko dziwny specjalny przypadek związany z logowaniem do hotmaila.

Konfiguracja, którą pobraliśmy dla tego modułu z C&C:

13. blist.dll

Ten plugin sprawdza czy bot znajduje się na listach spambotów. W konfiguracji, którą zaobserwowaliśmy, następujące DNSBL (DNS-based Blackhole List) były używane:

DNSBL to usługa bazująca na DNS, używana do publikowania adresów IP nadających spam. Jeśli serwer mailowy używa DNSBL, wykona żądanie DNS do domeny DNSBL z każdym nadchodzącym połączeniem SMTP. Techniczne detale tego rozwiązania są poza zakresem naszego posta, ale jeśli ktoś jest ciekawy może spojrzeć na http://www.us.sorbs.net/using.shtml albo https://en.wikipedia.org/wiki/DNSBL.

Sprawdzenie DNSBL w malware jest wykonywana za pomocą gethostbyname.

Konfiguracja modułu pobrana z C&C:

14. miner.dll

Jak sama nazwa wskazuje, jest to koparka kryptowalut. Ten plugin służy tylko do koordynacji pracy, ale ma kilka powiązanych programów, które wykonują całą „ciężką pracę”.

Jeden z programów, nazywany grabb, jest dystrybuowany prosto z C&C. Inne są pobierane z URLi zapisanych w konfiguracji – w teorii. W praktyce serwery dystrybuujące programy kopiące wyglądają na martwe, więc nie byliśmy w stanie ich pobrać.

Miner.dll weryfikuje że na pewno pobrał poprawny program, ale być może hashowanie było za trudne do zaimplementowania dla twórców, więc użyli prostszej metody – porównanie długości – na przykład, upewniają się że pobrany program cores_gt_1 ma dokładnie 223744 bajtów.

Nie analizowaliśmy tego pluginu bardzo dokładnie, bo koparki bitcoinów nie leżą w naszym obszarze zainteresowań, a napisy dały wystarczająco wiele informacji o tym co dzieje się w środku i tak:

A resztę można znaleźc w konfiguracji pobranej z C&C:

15. img.dll

Ten krótki plugin służy do przetwarzania złośliwych załączników – koduje je za pomocą algorytmu base64 i załącza do emaili.

Nie ma tu nic interesującego, jak widać w napisach zapisanych w kodzie:

Konfiguracja dla tego modułu pobrana z C&C.

16. spread.dll

Ten plugin jest wykorzystywany żeby rozprzestrzeniać Tofsee przez media społecznościowe: Facebooka, Twittera oraz komunikator Skype.

Najpierw wyciąga ciastka xs, datr, c_user (i więcej).

Dokładna metoda zależy od przeglądarki, ale generalnie wtyczka czyta ciastka zapisane na dysku przez przeglądarkę. Na przykład cookies.sqlite z \Mozilla\Firefox\Profiles dla Firefoxa. Wspierane przeglądarki to Chrome, IE, Firefox, Safari i Opera.

Następnie plugin używa tych ciastek np. żeby podszyć się pod użytkownika przed API Facebooka:

Lista przyjaciół jest pobierana przez API i wiadomość jest wysyłana do każdego z nich. Format wiadomości jest przechowywany w konfiguracji, na przykład:

‚fb.message1’: ‚%SPRD_TEXT1|%LANG_ID| %SPRD_URL1’

Twitter jest obsługiwany bardzo podobnie – ciastka są kradzione, followersi są pobierani przez API pod adresem https://twitter.com/followers, a następnie wysyłane są wiadomości.

Dodatkowo wspierane jest rosyjskie VKontakte, ale ta funkcja jest opcjonalna i trzymana w osobnym pluginie. Opisywany tu moduł sprawdza tylko czy VK jest włączony w konfiguracji i wywołuje odpowiedni handler (który musi być inicjalizowany z innego pluginu), jeśli jest zdefiniowany. Twórcy złośliwego oprogramowania zazwyczaj nie obierają na cel Rosji, więc ta funkcja jest wyłączona i moduł do Vkontakte nie jest rozpowszechniany.

Moduł może również rozprzestrzeniać się za pomocą Skype, ale analiza wsteczna protokołu Skype była widocznie za trudna, więc twórcy poszli na łatwiznę i wtyczka czeka, aż Skype zostanie uruchomiony, po czym wysyła wiadomości windowsowe do okna Skype:

Ten plugin ma dziesiątki zapisanych napisów, więc analiza w deasemblerze jest bardzo prosta. Kilka ciekawszych grup:

Referencje do pluginu OCR – żeby rozwiązywać Captchę:

Ciastka Facebooka:

Napisy związane z rozpowszechnianiem się przez Facebooka:

Napisy związane z kradzieżą ciasteczek:

Napisy związane z przechwytywaniem Skype:

Ciastka Twittera:

I rozpowszechnianie się przez Twittera:

Na koniec napisy związane z wysyłaniem ciasteczek:

Dużo funkcji oznacza dużo konfiguracji od C&C:

17. spread2.dll

Plugin stosujący metody sprzed ponad 15 lat – przenosić Tofsee przez… zainfekowane nośniki USB! Nie brzmi to jak dobra strategia w roku 2017, ale mimo to, jest on ciągle aktywny.

Najpierw złośliwy program jest kopiowany jako RECYCLER\<random_gibberish>.exe na nośnik USB, następnie są na nim ustawiane atrybuty READONLY i SYSTEM, a finalnie zapisywany jest złośliwy autorun.inf:

Złośliwy program, który będzie dystrybuowany, jest pobierany z Internetu (patrz również sys.dll i zmienna %FIREURL).

W napisach nie ma wiele ciekawego, poza logami:

A konfiguracja dla modułu jest dość uboga:

18. sys.dll

Ten plugin wygląda na downloader, albo raczej program aktualizujący. Wysyła on żądanie zależne od zawartości zmiennej %FIREURL w konfiguracji:

Przykładowe wartości %FIREURL (jeden na linię):

Zmienne są podmieniane rekursywnie, a %SYS_RN oznacza \r\n, więc pierwsza możliwa wartość powinna być traktowana jako:

Jeśli wyślemy to żądanie do odpowiedniego IP na porcie 80, otrzymamy kolejny złośliwy program. Różne żądania zwracają inne programy.

Jeśli żądanie jest niepoprawne, albo nie wspierane, zwracany jest następujący obraz:

Doceniamy poczucie humoru.

Nic zaskakującego w napisach:

Konfiguracja od C&C:

Dodatkowo używana jest zmienna %FIREURL z głównego modułu.

19. webb.dll

Ta wtyczka szuka procesu iexplore.exe. Jeśli znajdzie go, wstrzykuje do niego DLL IEStub.dll.

IEStub.dll przechwytuje bardzo dużo funkcji – lista:

Hooki przechwytują wołane funkcje i mogą nawet zmienić im parametry. Nie analizowaliśmy ich dokładnie, ale większość z nich to bardziej loggery, które tylko przechwytują interesujące dane z parametrów. Nie zaobserwowaliśmy żeby Tofsee serwowało jakiekolwiek web injecty.

Dla kompletności, interesujące napisy:

Konfiguracja dla tego modułu pobrana z C&C:

20. P2P.dll

Oryginalna nazwa pliku: p:\cmf5\small2\plugins\plg_p2p\plg_p2p.cpp

Ten plugin jest raczej krótki. Mimo że ma obiecującą nazwę, nie ma w nim wiele ciekawego – otwiera port na routerze i nasłuchuje połączeń. Nie implementuje żadnych poleceń, wszystko jest zostawione dla głównego modułu (albo pluginów, jak np. serwer HTTP).

Jak prawie każdy moduł, zapisuje logi do pliku %TMP%\log_%s.txt, a jeśli to się nie uda, to do C:\log.txt.

Dodaje również mapowanie portu używając UPnP, w taki sam sposób jak plugin 4 (proxyR.dll).

Konfiguracja otrzymana z C&C:

Interesujące napisy: