Watch this! Stary acz jary robal Facebookowy

Ostatnio od jednego ze znajomych otrzymałem wiadomość o enigmatycznej treści „seriously? why you took these photos?”. Do wiadomości dołączony był plik .rar, który nazwany był nazwiskiem tegoż znajomego. Nabyta ostrożność od razu odradziła robienie czegokolwiek poza zamknięciem okna, ale wrodzona ciekawość twierdziła inaczej.

Pozwoliłem sobie dokonać krótkiej analizy robala, żeby wiedzieć w razie W jak i czym to potraktować. Czym by była jednak analiza bez notatek w formie krótkie wpisu. Poza tym, i tak zalegam z pisaniem, więc warto wykorzystać sytuację, aby napisać coś mądrego.

Wiadomość, z dość nieprzyjemną niespodzianką już na pierwszy rzut oka wygląda dość podejrzanie. Może dla kogoś, dla kogo język angielski jest rodzimym językiem, będzie to mniej skutecznym ostrzeżeniem, ale wiadomość ma w sobie coś takiego, co od razu zapala lampkę (chyba, że to tylko ja tak).

Wiadomość z niespodzianką

Wiadomość z niespodzianką

Ponieważ głupotą byłoby robienie czegokolwiek na swoim komputerze, do takich celów mam przystosowaną maszynę wirtualną z czystym snapshotem. Zatem uruchomiłem Predatora (no co, tak się nazywa) i po zalogowaniu na Fejsa ściągnąłem tajemniczy plik.

1. Wypakowanie

Jest to zwykłe archiwum, które samo w sobie nie zawiera nic groźnego. Zagrożenie jest dopiero w środku i jest to plik .vbs (VisualBasic Script) o bardzo zachęcającej nazwie: „Watch This!!!.vbs”.

Plik ze skryptem

Plik ze skryptem

No to plik ląduje w edytorze, jego kod źródłowy nie jest długi, ale bardzo ciekawy.

2. Analiza skryptu

Skrypt rozpoczyna swoje działanie od stworzenia obiektu FileSystemObject, który służy do wykonywania operacji na plikach. Następnie tworzona jest również zmienna, która przechowuje ścieżkę dyskową do folderu MyFolderakis, który będzie się znajdował na głównym dysku systemowym (czyli pewnie w większości przypadków C:).

Cała magia dzieje się w pętli od linijki 13. Wywoływana jest tam funkcja download z parametrem, którym jest ścieżka folderu MyFolderakis. Niżej ta funkcja jest zdefiniowana i do niej zaraz też przejdziemy. Po wykonaniu funkcji download, widzimy wywołanie Unzip, czyli pewnie chodzi o rozpakowanie tego, co funkcja ściągająca zapisała nam na dysku. Pętla powtarzana jest do chwili, aż plik o nazwie sapsalo.jar znajdzie się w tym folderze.

Funkcja download, jak sama nazwa wskazuje, ściąga plik. Link do pliku jest z kolei zwracany przez funkcję RandomLink, która z puli 10 adresów (widać je w linijce 53), wybiera losowo jeden i zwraca go do funkcji download. Losowy link jest następnie wykorzystywany do ściągnięcia archiwum ZIP i zapisania go w pliku content.zip, ciągle w tym samym folderze – MyFolderakis.

Pozostała część programu znajduje się na samym dole, pod definicjami funkcji. Jest to uruchomienie pliku run.bat, który przywędruje zapewne wraz z plikiem content.zip.

Podsumowując w punktach, skrypt:

  1. Losuje link z którego będzie ściągał archiwum .zip. Wszystkie zawierają to samo, ale są pod różnymi nazwami.
  2. Ściąga archiwum.
  3. Rozpakowuje.
  4. Sprawdza, czy po rozpakowaniu jest obecny plik sapsalo.jar, jeżeli jest to przechodzi dalej.
  5. Uruchamia plik run.bat, który znajduje się w ściągniętym wcześniej archiwum.

A co się dzieje dalej? No to trzeba ściągnąć i zobaczyć.

3. Analiza drugiego archiwum

Plik ściągnąłem spod adresu: http://trendvidz.com[slash]terlix[slash]filezilla.zip.

I tak jak wcześniej, archiwum filezilla.zip również samo w sobie nie zawierało zagrożeń, ale inaczej było z jego wnętrzem, tym razem było ono bogatsze niż wcześniej. Na archiwum składają się 3 pliki: run.batsapsalo.jar oraz jre-8u5-windows-i586-iftw.exe. Najpierw pod lupę weźmy ten pierwszy, ponieważ jest on następny w kolejce do uruchomienia.

Skrypt sprawdza czy istnieją foldery zawierające Javę. Jeżeli tak, to wykonywanie skryptu jest przekazywane na sam dół, wprost do polecenia, które uruchamia plik sapsalo.jar. Natomiast jeżeli folder Javy nie zostanie odnaleziony, JRE jest instalowane poleceniem:

Przełącznik /w mówi o tym, aby aktualne okno konsoli poczekało na zakończenie wykonywania uruchamianego programu, czyli instalacji JRE. Z kolei przełącznik /s jest przełącznikiem, który odnosi się do instalacji JRE i zgodnie ze stroną Oracle, służy do przeprowadzenia „cichej” instalacji.

Po poprawnym zainstalowaniu skrypt kierowany jest do polecenia, które uruchamia sapsalo.jar, a w przeciwnym przypadku, instalacja przeprowadzana jest ponownie.

Wirus w Javie? Nie może być… A jednak.

4. Dekompilacja sapsalo.jar

Ponieważ Java ma to do siebie, że całkiem łatwo można podejrzeć kod źródłowy, to dlaczego by nie skorzystać? Do tego celu wystarczy nam darmowe oprogramowanie o jakże wdzięcznej nazwie – Java Decompiler.

Wrzucamy zatem plik JAR do tego programu i patrzymy co tam zawiera. Nie jest tego dużo, 2 klasy i dołączone paczki. Klasą główną jest JavaApplication2, której kod źródłowy znajduje się niżej.

Drzewo plików

Drzewo plików


l. 34-37

Program rozpoczyna swoje szkodliwe działanie od skopiowania siebie samego do folderu „Startup” w Menu Start, zapewni mu tu automatyczne uruchamianie, dzięki czemu nawet po usunięciu go z przeglądarki (bo to jest jego główny cel) ponownie ją zarazi.

l. 44-69

Następnie pobierana jest ścieżka do zasobów pliku JAR, a dokładnie do umieszczonego tam pliku ext_folder.zip z folderu chrome. Na pierwszy rzut oka widać, że jest to jakieś rozszerzenie do przeglądarki i na pewno nie będzie to nic przydatnego. Następnie tworzona jest ścieżka gdzie ów plik zostanie skopiowany i jest to oczywiście folder z rozszerzeniami do Chrome’a.

Po skopiowaniu pliku jest on rozpakowywany i w folderze z rozszerzeniami ląduje folder o nazwie olmpkfnhkfomcmnodekbphlkkejkealf.

l. 70-133

No tu jest kawałek sprytnego kodu. Pierwszą czynnością jest pobranie ścieżki do tajemniczego pliku ourt.jsonCiekawe, co tam się znajduje.

Na pierwszy rzut oka, nie mówi to dużo, no to może drugi rzut oka na kod aplikacji powie więcej. Dokładnie chodzi mi o linijkę 80 i 81, gdzie pobierana jest zawartość pliku, w którym znajdują się ustawienia Chrome’a – Preferences. Następnie Chrome jest „zabijany” i z odczytanego pliku z preferencjami, wyciągana jest m.in. sekcja settings (l. 92), do której w kolejnej linijce „pakowana” jest zawartość pliku ourt.json. W ten sposób, szkodliwe rozszerzenie zostało zainstalowane „na lewo” i patrząc na wylistowany powyżej plik, możemy zobaczyć pod jaką nazwą i jakim opisem będzie widniało.

  • Flash Player
  • Cross-platform plugin plays animations, videos and sound files

No a kto się odważy usunąć Flash Player? No nikt.

Następnie z sekcji known_disabled usuwany jest identyfikator lewego ostrzeżenia, gdyby przypadkiem ktoś rozszerzenie wyłączył. Zapisywana też jest wartość „1” do atrybutu „state”, po czym cały już zmodyfikowany plik z ustawieniami zapisywany jest na dysku.

I w ten sposób dostajemy rozszerzenie, o którym zupełnie nie mamy pojęcia.

Od linijki 134 aż do końca dzieje się analogicznie to samo, tylko że dla przeglądarki Firefox.

5. Analiza wtyczki

Nie będę analizował tutaj obu, bo pewnie i tak robią to samo. Pod lupę wezmę wtyczkę, która jest wgrywana do Chrome’a. W tym celu rozpakowuję ext_folder.zip i w nim grzebię.

Patrząc na ustawienia zawarte w ourt.json, wtyczka może sobie śmigać po Facebooku (scriptable_host) i ma możliwość zarządzania otwartymi zakładkami oraz zapisywania ustawień.

Rozszerzenie w trakcie działania, będzie miało uruchomiony w tle kod zawarty w pliku analytics.js. Jest to ładnie opisane na tej stronie.

Jest to kod Google Analytics, który będzie sobie zapisywał wiele fajnych rzeczy. Na początku dodawany jest listener, który będzie reagował na wiadomości wysyłane przez wtyczkę. Listener ma kilka ifów, które w zależności od podanego parametru, będą wywoływały odpowiednie polecenie _gaq.push(). To śmieszne polecenie należy do pakietu Google Analytics i służy do zapisywania m.in. własnych parametrów, które z kolei trafią potem na konto Google Analytics (tak z grubsza). Ale kiedy ono jest wywoływane? A to już zupełnie inna historia, która zostanie wyjaśniona pod koniec.

Teraz pod lupę wezmę popup.js, który jest już niemałym kawałkiem kodu. Z powodu jego rozmiaru (812 linijek) nie będę go tutaj umieszczał, a jedynie przytoczę co ciekawsze jego fragmenty.

Kod rozpoczyna działanie od linijki 33. Jest tam zamieszczona funkcja, która spod podanego adresu URL ściągnie listę reklam, które następnie zostaną umieszczone na stronie Facebooka. Czyli zadanie wirusa już mamy – wstrzykiwanie reklam i zgarnianie zysków z klikania i oglądania.

Skrypt kontynuuje „pracę” od linijki 417, tam znajduje się część kodu, która odpowiedzialna jest za wywołanie innych funkcji. Na początku pobierana jest konfiguracja poprzez użycie metody get_config.

Po wejściu pod którykolwiek adres widoczny w powyższej metodzie, strona zwróci nam, w formacie JSON, konfigurację wirusa oraz całkiem pokaźną ilość gotowych szablonów wiadomości. Ciekawe czy ktoś to ręcznie wklepywał.

Po powrocie z get_config, sprawdzana jest wartość „on” zawarta w ściągniętej konfiguracji, jeżeli jest true, to uruchamiana jest funkcja run. Warto dodać, że skrypt zawiera również timer, który odpowiada za ładowanie świeżej konfiguracji co 30 sekund. No to skoro skrypt chce iść do run, to my również.

W funkcji run, zaraz na samym początku, pobierana jest z konfiguracji tablica o nazwie posts_to_like. Na chwilę obecną ta tablica jest pusta, a zapewne pojawią się tam identyfikatory postów, które z automatu zostaną polubione. Zaraz po tym wywoływana jest funkcja injectPost, która z konfiguracji pobiera tablicę o takiej samej nazwie i prawdopodobnie wstrzykuje te elementy pomiędzy inne wpisy widoczne na ścianie. Ta tablica również jest pusta (na razie).

Przyszedł czas na zbieranie żniw, czyli niewinnych znajomych. Do tego celu wykorzystana jest funkcja getFriends.

Po powrocie z powyższej funkcji, kiedy skrypt jest już bogatszy o listę naszych znajomych, wywoływana jest kolejna begin_to_like, która sprawdza najpierw w konfiguracji jakie strony są już polubione, a jakie należy polubić wg pobranej konfiguracji. Te, które jeszcze nie mają „lajka”, to go za moment otrzymają dzięki kolejnej funkcji Like_page.

W następnym kroku, pobierana z konfiguracji jest ilość postów jakie skrypt ma udostępnić na tablicy przypadkowym znajomym. Do tego celu służy kolejna sprytna funkcja Create_Post.

Dalej jest już dużo kodu, który służy głównie do wysyłania wiadomości. Dla ciekawskich podaję niżej linka, spod którego można ściągnąć cały plik. Wrzucam jako TXT, bo u mnie NOD panikuje na widok tego pliku.

Jeszcze na koniec analizy zwrócę uwagę na polecenie które wykonywane jest zaraz przed rozpoczęciem rozmowy:

Pamiętacie jak pisałem o kodzie, który działa cały czas w tle? To on właśnie odbierze powyższy komunikat, który zawiera identyfikator użytkownika, do którego wysyłana jest wiadomość z „niespodzianką”. Zwróciłem również wtedy uwagę na fakt, że zawartość wiadomości zapisywana jest do kolejki komunikatów, która trafi do Google Analytics. Czyli dokładnie tak jak myślisz, drogi Czytelniku, właściciel robala doskonale wie do kogo została wysłana wiadomość i będzie miał to podane na tacy w panelu GA. Wie również o tym, czy załącznik został wysłany, a także o ilości uruchomień kodu i ilości jego odinstalowań.

6. Jak się tego pozbyć

Jeżeli nie ma żadnych ukrytych niespodzianek, wystarczy usunąć z przeglądarek szkodliwą wtyczkę, a następnie pozbyć się z autostartu pliku JAR, który odpowiada za całe zamieszanie.

Można podsumować, że jest to kawałek dobrego i sprytnego kodu, na który raczej poświęcił ktoś dużo czasu. Nie żebym popierał agresora, ale pochwalić… Czemu nie ;). Pierwszy raz również spotykam się z wirusem, który wykorzystuje tyle różnych technologii do osiągnięcia celu (VBS, Batch, Java, JavaScript). Żeby nie było, że czczę twórcę, to zwrócę uwagę na niedociągnięcia jakie popełnił.

Pierwszym grzechem, jest niesprawdzenie, czy folder MyFolderakis istnieje. Jeżeli istnieje, to skrypt rzuci błąd i się wyłączy.

Błąd skryptu

Błąd skryptu

Drugim grzechem, jest użycie Javy do napisania wirusa. Teoretycznie wszystko powinno działać, jeżeli JRE jest zainstalowane. Jeżeli nie jest, to przecież w końcu można zainstalować. No nie do końca…

Błąd instalacji JRE

Błąd instalacji JRE

Nie za bardzo wiedziałem skąd taki błąd, ale jak zwykle StackOverflow rozwiązał sprawę. Problem polega na tym, że Oracle porzucił wsparcie dla Windowsa XP pomimo, że Java jest z nim dalej kompatybilna; niekompatybilny jest jednak instalator.

W efekcie nie udało mi się zainstalować wirusa, choć bardzo tego chciałem. Nawet gdybym miał zainstalowane JRE, to byłby problem, ponieważ ścieżki do których wgrywane są rozszerzenia, są typowe dla Windowsa 7. I jaki z tego wniosek? XP > 7

To by było na tyle. Do następnego wirusa ;).

[guest@itachi.pl:~]$