Podczas analizy szkodliwego oprogramowania Flame [1], które wykryliśmy w maju 2012 r., nasze badania zidentyfikowały cechy odróżniające od siebie poszczególne moduły tego szkodnika. Rozważając te funkcje modułowe wykryliśmy, że pierwszy wariant robaka Stuxnet [4] w 2009 r. zawierał moduł, który został stworzony w oparciu o platformę Flame. Potwierdziło to nasze domniemania, że istniała jakaś forma współpracy między grupami, które rozwinęły projekt Flame i platformę Tilded (Stuxnet / Duqu) [5].
Opierając się na wynikach szczegółowej analizy Flame'a kontynuowaliśmy poszukiwania nowych, nieznanych komponentów szkodnika. Bardziej szczegółowe badania, przeprowadzone w czerwcu 2012 r., zaowocowały wykryciem kolejnego, sponsorowanego przez rząd i dotychczas nieznanego, szkodliwego oprogramowania, któremu nadaliśmy nazwę Gauss [2]. Gauss używał konstrukcji modułowej, przypominającej tę znaną z Flame'a, był podobnie kodowany, korzystał z podobnego do Flame'a systemu komunikacji z serwerami centrum kontroli (C&C) i posiadał kilka pomniejszych funkcjonalności do złudzenia przypominających funkcje Flame'a. Bazując na zewnętrznych obserwacjach i publicznie dostępnych informacjach, opublikowaliśmy naszą własną analizę serwerów centrum kontroli Flame'a. Pomogła ona w poznaniu rozkładu geograficznego serwerów C&C i sposobu ich rejestracji. We wrześniu 2012 r. opublikowaliśmy nowe informacje, które zostały zebrane podczas intensywnego śledztwa prowadzonego we współpracy z firmami Symantec, ITU-IMPACT i CERT-Bund/BSI.
Przeprowadzona analiza wykazała, że kod C&C może zrozumieć kilka protokołów komunikacyjnych i porozumiewać się z różnymi "klientami" lub innym szkodliwym oprogramowaniem:
Bliższe spojrzenie na sposoby obsługi tych protokołów ujawniło cztery różne typy klientów o nazwach kodowych: "SP", "SPE", "FL" i "IP". Opierając się na logice analizowanego kodu C&C potwierdziliśmy, że szkodliwe oprogramowanie Flame zostało zidentyfikowane jako klient typu "FL". Oczywiście, w momencie tego odkrycia oznaczało to, że istnieją jeszcze trzy niewykryte narzędzia do cyberszpiegostwa lub cybersabotażu, stworzone przez tych samych autorów co "FL" ("SP", "SPE" i "IP").
Przy współudziale i nieocenionej pomocy ze strony naszych partnerów byliśmy w stanie skonfigurować lej dla Flame'a. W poprzednim artykule [3] opublikowaliśmy statystyki pochodzące z utworzonego dla Flame'a leja. Prawdopodobnie najbardziej interesującą rzeczą jest to, że analizując kod C&C Flame'a byliśmy w stanie podzielić połączenia otrzymywane przez nasz lej na dwie główne kategorie:
W ten sposób, we wrześniu 2012 r. potwierdziliśmy istnienie "na wolności" co najmniej jednego, nieznanego dotychczas, szkodliwego programu stworzonego w oparciu o platformę Flame.
Wszystko rozpoczęło się na początku lipca 2012 r., gdy wykryliśmy nieduży, ale bardzo interesujący moduł Flame'a. Moduł posiadał wiele cech charakterystycznych dla Flame'a, co sprawiło, iż założyliśmy, że jest to jakaś wcześniejsza wersja tego szkodnika (wszystkie znane warianty Flame'a opatrzone są numerem wersji 2.x). W kolejnych miesiącach nie tylko studiowaliśmy związek tego złośliwego oprogramowania z Flamem, ale natknęliśmy się również na przykłady użycia tego modułu w cyberbroni Gauss (moduł występował jako składnik kontrolowany przez główny moduł Gaussa). Po przeanalizowaniu centrum kontroli Flame'a byliśmy zaskoczeni, że nowo wykryty wariant domniemanego "FL" używa do komunikacji z C&C protokołu "OldProtocolE", który był skojarzony z tajemniczym modułem "SPE". Wreszcie zrozumieliśmy, że nie mamy do czynienia z wtyczką Flame'a, a z kompletnie odrębnym i unikalnym oprogramowaniem, rozpoznawanym przez serwery C&C Flame'a jako "SPE". Niniejszy artykuł opisuje odkrycie szkodnika "SPE" i podaje analizę funkcjonalności tego zagrożenia.
Szkodliwe oprogramowanie "SPE", które postanowiliśmy nazwać "miniFlame", jest małym, w pełni funkcjonalnym modułem szpiegowskim, zaprojektowanym do kradzieży danych i uzyskiwania bezpośredniego dostępu do zainfekowanych systemów. miniFlame faktycznie został stworzony w oparciu o platformę Flame, lecz zaimplementowano go jako osobny moduł. Może pracować niezależnie od obecności w systemie głównych modułów Flame'a lub jako składnik pracujący pod kontrolą Flame'a.
Wart podkreślenia jest fakt, że miniFlame może być stosowany również w połączeniu z innym programem szpiegowskim – Gaussem. Jak wielu czytelników zapewne pamięta, powstało założenie, że Flame i Gauss były równoległymi projektami, które nie posiadały żadnych wspólnych modułów ani serwerów C&C. Odkrycie miniFlame'a, który może współpracować z oboma wspomnianymi projektami szpiegowskimi, częściowo potwierdza słuszność naszej konkluzji, że wszystkie badane narzędzia cyberszpiegowskie pochodzą z tej samej "cyberzbrojowni".
Najwyraźniej rozwój miniFlame'a rozpoczął się kilka lat temu i był kontynuowany do 2012 r. Na podstawie kodu C&C widać, że protokoły wykorzystywane przez "SP" i "SPE" zostały utworzone wcześniej lub w tym samym czasie, co protokół komunikacyjny używany przez Flame'a ("FL"), tj. przynajmniej w 2007 r. Wierzymy, że deweloperzy miniFlame'a stworzyli dziesiątki różnych modyfikacji tego programu. Jak do tej pory wykryliśmy tylko sześć, datowanych na okres 2010 - 2011 r. W niektórych przypadkach dedykowane serwery C&C kontrolowały wyłącznie operacje z użyciem "SPE". Jednocześnie, niektóre warianty "SPE" pracowały z serwerami, z którymi komunikował się Flame.
Szkodnik miniFlame / SPE różni się od Flame'a i Gaussa znacznie mniejszą liczbą infekcji. Podczas, gdy szacowana przez nas liczba ofiar Flame'a / Gaussa nie jest niższa niż 10 000, "SPE" wykryto na zaledwie kilkudziesięciu systemach w Zachodniej Azji. Oznacza to, że "SPE" jest narzędziem wykorzystywanym do ukierunkowanych ataków na starannie dobrane cele o najwyższym priorytecie, budzące szczególne zainteresowanie napastników.
Kiedy porównamy liczbę infekcji "SPE" z infekcjami rozprzestrzenianymi przez wykryte wcześniej zagrożenia o podobnej strukturze otrzymamy poniższą tabelę:
Nazwa | Incydenty (statystyki Kaspersky Lab) | Incydenty (szacunkowo) |
---|---|---|
Stuxnet | więcej niż 100 000 | więcej niż 300 000 |
Gauss | około 2500 | około 10 000 |
Flame ("FL") | około 700 | około 5000 - 6000 |
Duqu | około 20 | około 50 - 60 |
miniFlame ("SPE") | około 10 - 20 | około 50 - 60 |
W przeciwieństwie do Flame'a, w którego przypadku większość incydentów została zarejestrowana w Iranie i Sudanie, oraz Gaussa, który skoncentrowany był na Libanie, "SPE" nie ma jasnej przynależności geograficznej. Uważamy jednak, że wybór krajów zależy od użytego wariantu "SPE". Dla przykładu, modyfikacja znana jako 4.50 występuje głównie w Libanie i Palestynie. Pozostałe warianty szkodnika były rejestrowane w innych krajach, takich jak Iran, Kuwejt czy Katar.
Oryginalny wektor dystrybucji "SPE" nie jest znany. Jednakże, ponieważ wiadomo, że szkodnik działa jako część Flame'a i Gaussa, i że może współdzielić serwery C&C z Flamem, wierzymy, iż w większości przypadków "SPE" był instalowany z serwerów C&C na systemach, które już wcześniej zostały zainfekowane przez Flame'a lub Gaussa. Należy jednak wyraźnie zaznaczyć, że "SPE" nie był obecny na wstępnie zdefiniowanych listach plików, występujących w znanych konfiguracjach Flame'a i nie był usuwany przez moduł "browse32.ocx", który był dystrybuowany przez autorów Flame'a w maju 2012 r. w celu samoczynnej dezinstalacji szkodnika z zainfekowanych systemów.
Flame implementuje ciekawą strukturę konfiguracyjną dla całego systemu złośliwego oprogramowania. Struktura ta jest zorganizowana na takich samych zasadach, jak rejestr systemu Windows. Konfiguracja określa nie tylko listy wszystkich dostępnych modułów i plików, ale również ich parametry, listy plików tymczasowych, listy programów antywirusowych itd. Łączna liczba parametrów, określonych w konfiguracji, może sięgać kilku tysięcy.
Nasza analiza ponad dziesięciu różnych wariantów Flame'a (z których najwcześniejszy jest datowany na 2008 r.) pokazała, że podczas lipca i sierpnia 2010 r. deweloperzy zaimplementowali coś w rodzaju zmiany wersji - z wariantu "A" na wariant "B". Do tego momentu konfiguracja Flame'a obejmowała jedynie pliki z identyfikatorem "A":
Fragment konfiguracji Flame'a datowany na dzień 21.07.2010 r. |
---|
SUICIDE.RESIDUAL_FILES.A15 : %COMMONPROGRAMFILES% |
Identyfikator "B" po raz pierwszy pojawił się w próbkach Flame'a datowanych na dzień 1 sierpnia 2010 r. i był stosowany we wszystkich kolejnych wariantach szkodnika, również w tych ostatnich z roku 2011.
Fragment konfiguracji Flame'a datowany na dzień 01.08.2010 r. |
---|
SUICIDE.RESIDUAL_FILES.B9 : %windir%\system32\advnetcfg.ocx SUICIDE.RESIDUAL_FILES.B8 : %windir%\system32\nteps32.ocx SUICIDE.RESIDUAL_FILES.B7 : %temp%\~HLV473.tmp SUICIDE.RESIDUAL_FILES.B6 : %temp%\~HLV927.tmp SUICIDE.RESIDUAL_FILES.B5 : %temp%\~HLV294.tmp SUICIDE.RESIDUAL_FILES.B4 : %temp%\~HLV084.tmp SUICIDE.RESIDUAL_FILES.B3 : %temp%\~KWI989.tmp SUICIDE.RESIDUAL_FILES.B2 : %temp%\~KWI988.tmp SUICIDE.RESIDUAL_FILES.B18 : %systemroot%\system32\msglu32.ocx SUICIDE.RESIDUAL_FILES.B17 : %temp%\~dra53.tmp SUICIDE.RESIDUAL_FILES.B16 : %temp%\~rf288.tmp SUICIDE.RESIDUAL_FILES.B15 : %windir%\system32\advpck.dat SUICIDE.RESIDUAL_FILES.B14 : %windir%\system32\ntaps.dat SUICIDE.RESIDUAL_FILES.B13 : %windir%\system32\soapr32.ocx SUICIDE.RESIDUAL_FILES.B12 : %windir%\system32\rpcnc.dat SUICIDE.RESIDUAL_FILES.B11 : %windir%\system32\boot32drv.sys SUICIDE.RESIDUAL_FILES.B10 : %windir%\system32\ccalc32.sys SUICIDE.RESIDUAL_FILES.B1 : %temp%\~HLV751.tmp SUICIDE.RESIDUAL_FILES.B : %temp%\~DFL542.tmp |
Oczywiście staraliśmy się znaleźć wszystkie pliki z nazwami, które były wykorzystywane we Flamie od 2008 r. Na początku czerwca 2012 r. natrafiliśmy na plik "watchxb.sys" (SUICIDE.RESIDUAL_FILES.A9 : %windir%\system32\watchxb.sys), który jest jednym z plików Flame'a "A", używanym do sierpnia 2010 r. Kiedy przeanalizowaliśmy znaleziony plik "watchxb.sys", byliśmy co najmniej zaskoczeni.
Plik ten został zaszyfrowany z wykorzystaniem prostego algorytmu XOR 0xFF. "watchxb.sys" to plik konfiguracyjny skonstruowany podobnie do plików konfiguracji Flame'a: określa on swoje własne pliki składowe, klucze rejestru, listy programów antywirusowych i nazwy plików tymczasowych. Pośród wspomnianych nazw plików natrafiliśmy na plik "icsvnt32.ocx", z którym wcześniej nie mieliśmy do czynienia.
Fragment pliku "watchxb.sys" |
---|
Files.10 : %windir%\system32\mspbee32.ocx Files.9 : %windir%\system32\mspbee32.dll Files.8 : %windir%\system32\comspol32.ocx Files.7 : %windir%\system32\comspol32.dll Files.6 : %windir%\system32\commgr32.ocx Files.5 : %windir%\system32\commgr32.dll Files.4 : %windir%\system32\icsvnt32.ocx Files.3 : %windir%\system32\icsvnt32.dll Files.2 : %windir%\system32\mssvc32.ocx Files.1 : %windir%\system32\mssvc32.dll RegKeys.5 : HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation\StandardSize RegKeys.4 : HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SeCEdit\LastUsedIdentifier RegKeys.3 : HKLM\SOFTWARE\Classes\CLSID\{ 4E14FBA2-2E22-11D1-9964-00C04FBBB345}\InprocServer32\#icsvnt32.ocx RegKeys.2 : HKLM\SOFTWARE\Classes\CLSID\{ 4E14FBA2-2E22-11D1-9964-00C04FBBB345}\InprocServer32\#icsvnt32.dll RegKeys.1 : HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32\wave9#%commonprogramfiles%\Microsoft Shared\MSAudio\wavesup3.drv |
Nigdy wcześniej nie napotkaliśmy pliku o takiej nazwie w żadnym ze znanych modułów Flame'a. Aż do tego momentu plik nie był używany w żadnej znanej konfiguracji Flame'a i co więcej - nie figurował on na liście plików przeznaczonych do samousunięcia (przypominamy, że listę tę zawierał moduł "browse32.ocx"). Prowadząc dalsze poszukiwania natrafiliśmy na plik "icsvnt32.ocx". Stało się to w tym samym czasie, w którym prowadziliśmy analizę kolejnego narzędzia cyberszpiegowskiego - Gaussa. Miejsce, w którym odkryliśmy plik, było jednak zaskakujące.
Gauss posiada budowę modułową. Liczba i kombinacja modułów może być zmienna w zależności od natury infekowanych systemów. W trakcie naszych badań odkryliśmy następujące moduły: Cosmos, Godel (Kurt), Tailor, McDomain, UsbDir, Lagrange, Gauss i ShellHW. Konfiguracja specyficznego połączenia modułów dla każdego systemu opisywana jest w specjalnym kluczu rejestru. Technika ta, jak również sama struktura konfiguracji jest podobna do tej zastosowanej w Stuxnecie / Duqu (przechowywanie konfiguracji w rejestrze Windows) i Flamie (struktura konfiguracji).
Stworzyliśmy specjalną procedurę wykrywania, która pomogła nam w odkryciu różnych konfiguracji Gaussa, w zależności od ustawień rejestru na zainfekowanych maszynach. W sumie wykryliśmy około 1700 takich konfiguracji, które ujawniły obraz propagacji poszczególnych modułów. I w tym miejscu po raz kolejny doznaliśmy zaskoczenia. Na niektórych systemach w Libanie, konfiguracja Gaussa, oprócz wymienionych powyżej modułów, zawierała jeden dodatkowy moduł o nazwie kodowej "John".
We wszystkich tych nietypowych konfiguracjach Gaussa nowo odkryty moduł wskazywał na plik %systemroot%\system32\icsvnt32.ocx i był wywoływany przez funkcję "RegisterService".
Przykładowy plik konfiguracyjny Gaussa |
---|
Gauss 1.0.8 ShellNotifyUser ShellNotifyUserEx SetWindowEvent InitShellEx %systemroot%\system32\winshell.ocx %systemroot%\temp\ws1bin.dat Godel InitCache RevertCache ValidateEntry CreateEntry %windir%\system32\dskapi.ocx %temp%\~gdl.tmp John RegisterService %systemroot%\system32\icsvnt32.ocx UsbDir %windir%\system32\smdk.ocx %temp%\~mdk.tmp |
Zrzut ekranu odszyfrowanego klucza rejestru w pliku konfiguracyjnym Gaussa, który używał modułu "John":
Dało to potwierdzenie faktu, że "icsvnt32.ocx" jest unikalnym modułem, możliwym do zastosowania zarówno we Flamie, jak i w Gaussie. Jest to ogniwo, które mimo iż pozostaje niezależnym komponentem, to jednak mocniej łączy ze sobą oba projekty cyberszpiegowskie. "icsvnt32.ocx" używa swoich własnych, dedykowanych serwerów C&C, ale potrafi też współdzielić serwery kontroli z Flamem.
W sumie wykryliśmy sześć różnych wariantów "SPE". Wszystkie z nich powstały w okresie od 1 października 2010 r. do 1 września 2011 r. Dla trzech z tych wersji "SPE" wykryliśmy również tzw. moduły "U", odpowiedzialne za interakcję szkodnika z dyskami USB.
Powyższa oś czasu pokazuje, że istniała tylko jedna instancja "SPE" (4.50), dla której moduł "U" został utworzony w innym czasie, niż moduł główny.
Istnienie wersji "SPE" wcześniejszych niż 4.x i starszych niż 5.x nie zostało dotychczas potwierdzone. Możliwe jest, że wcześniejsze wersje "SPE" to faktycznie klient typu "SP", który również był obsługiwany przez serwery C&C. Zakładając, że rozwój każdej głównej wersji programu trwał około jednego roku, wersja 1.x mogła powstać już w roku 2007. W momencie pisania tego artykułu, "na wolności" najbardziej rozprzestrzeniony jest wariant o numerze wersji 4.50 (zgodnie ze statystykami z Kaspersky Security Network). Analizując informacje z wielu pośrednich źródeł możemy przypuszczać, że dalszy rozwój programu przerwano po opublikowaniu wersji o numerze 5.00.
Po szczegółowym przebadaniu modułów "SPE", logiki operacji i możliwości serwerów C&C, zdołaliśmy stworzyć schemat ogólnego algorytmu, pokazujący w jaki sposób "SPE" działa na zainfekowanym systemie:
Pierwszy etap polega na wstępnej infekcji całego systemu. Metoda infekcji nie jest znana, jednak biorąc pod uwagę ustalone wcześniej powiązania pomiędzy "SPE" i Flamem / Gaussem, możemy uznać za prawdopodobne, że moduł "icsvnt32.ocx" zostaje załadowany i zainstalowany na uprzednio zainfekowanym systemie. Szkodnik jest dostarczany z jednego z serwerów kontroli Flame'a / Gaussa i uruchamiany na życzenie operatora C&C. Możliwa jest również sytuacja, w której "SPE" jest częścią jakiegoś głównego droppera Flame'a (który nie został do tej pory wykryty) lub nieznanym, zaszyfrowanym ładunkiem, który był dystrybuowany przez Gaussa na nośnikach USB (zobacz artykuły [2] i [7]).
Po całkowitym zainfekowaniu systemu, "SPE" rozpoczyna komunikację z serwerem C&C i wysyła do niego zgromadzone informacje. Na tym etapie zebrane dane są prawdopodobnie analizowane przez operatorów. Jeżeli zainfekowany system ofiary nadaje się do wdrożenia "modułu USB", a sama ofiara jest dość interesująca, "moduł USB" ("icsvntu32.ocx") jest instalowany wraz z plikiem "petsec.sys". Na każdym kolejnym etapie oba moduły (moduł główny i moduł infekcji USB) działają niezależnie od siebie. Moduł główny jest odpowiedzialny za wysyłanie danych (z uwzględnieniem informacji zgromadzonych przez "moduł USB") na serwer C&C i wykonywanie rozkazów zwrotnych, natomiast "moduł USB" infekuje dyski wymienne i kradnie zapisane na nich informacje.
Należy podkreślić fakt, iż "moduł USB" nie zawsze jest instalowany. Dla przykładu, jeżeli aktywna jest infekcja wywołana przez Gaussa, a w systemie obecny jest również "SPE", operacje na dyskach USB są wykonywane przez odpowiedni moduł Gaussa.
Jak już wspomnieliśmy wcześniej, wykryliśmy w sumie sześć różnych modyfikacji miniFlame'a, które występują w dwóch grupach wersji – 4.x i 5.x.
Wersja | Data kompilacji | MD5 | Rozmiar |
---|---|---|---|
4.00 | 10.10.2010 | 6F5ACDC848508C33F15634B1A068B16D | 75264 |
4.20 | 21.02.2011 | 11C845B2C254C4170E9E49177F5053BB | 89680 |
4.30 | 09.03.2011 | 16C986E14D34C7881E16186384DAB968 | 76288 |
4.40 | 11.04.2011 | 3091B15D27EEEE830FF85C50D50B3A05 | 97280 |
4.50 | 26.07.2011 | B3E630714BF2526D3AA70370D2AC54B7 | 96768 |
5.00 | 01.09.2011 | 256469662C493731D4CEB003FC4783B1 | 104448 |
Wersja | Data kompilacji | MD5 | Rozmiar |
---|---|---|---|
4.30 | 09.03.2011 | 523C6D9229B5656942B2CADEA3F0824C | 108544 |
4.40 | 11.04.2011 | E4EA1110E5915B7B66B405979E586887 | 113152 |
4.50 | 20.07.2011 | A4C2DD6F3998A7625196DC79B1954150 | 112128 |
We wszystkich wersjach z grupy 4.x twórcy użyli tego samego pliku "informacji o wersji".
Length Of Struc: 0378h Length Of Value: 0034h Type Of Struc: 0000h Info: VS_VERSION_INFO Signature: FEEF04BDh Struc Version: 1.0 File Version: 1.0.0.1 Product Version: 1.0.0.1 File Flags Mask: 0.63 File Flags: File OS: NT (WINDOWS32) File Type: DLL Language/Code Page: 3081/1200 CompanyName: Microsoft Corporation FileDescription: icsvnt32 FileVersion: 1, 0, 0, 1 InternalName: icsvnt32 (lub icsvntu32 dla modułu "U") LegalCopyright: Copyright (C) 2010 LegalTrademarks: OriginalFilename: icsvnt32.ocx (lub icsvntu32 dla modułu "U") PrivateBuild: ProductName: Microsoft Corporation icsvnt32 (lub icsvntu32 dla modułu "U") ProductVersion: 1, 0, 0, 1 SpecialBuild: Child Type: VarFileInfo Translation: 3081/1200 |
Najbardziej godnym uwagi szczegółem są informacje o języku skonfigurowanym w systemie, na którym modyfikowano zawartość pliku "informacji o wersji". Skonfigurowana strona kodowa to 3081, co odpowiada ENG_AUS (Angielski (Australia)):
Żaden ze znanych nam modułów Flame'a lub Gaussa nie zawierał informacji o ENG_AUS. Moduły zazwyczaj używały typu kodowania ENGLISH_US lub NEUTRAL. Jednocześnie wersja 5.00 (która jest najnowszą znaną wersją "SPE") używa nowego pliku "informacji o wersji", który wykorzystuje stronę kodowania 1033, co odpowiada ENGLISH_US.
Length Of Struc: 0454h Length Of Value: 0034h Type Of Struc: 0000h Info: VS_VERSION_INFO Signature: FEEF04BDh Struc Version: 1.0 File Version: 2001.12.4414.320 Product Version: 3.0.0.4414 File Flags Mask: 0.63 File Flags: File OS: WINDOWS32 File Type: DLL File SubType: UNKNOWN Language/Code Page: 1033/1200 CompanyName: Microsoft Coporation FileDescription: FileVersion: 2001.12.4414.320 InternalName: ICSVNT32.DLL LegalCopyright: Copyright (C) Microsoft Corp. 1995-1999 LegalTrademarks: Microsoft(R) is a registered trademark of Microsoft |
Szczególnie interesującym przypadkiem jest wersja 4.20. W wersji tej, podczas procesu kompilowania, autor przez przypadek zawarł ścieżkę dostępu i nazwę projektu jako informacje debugowania CODEVIEW:
Wartość 4D629B52 odpowiada znacznikowi czasowemu, który powstał dla momentu, kiedy miało miejsce łączenie plików wykonywalnych, tj. 21/02/2011 17:05:22.
Pełna ścieżka do bazy danych debugowania projektu:
C:\projects\e\SP4.2\general_vob\sp\Release\icsvnt32.pdb
Widać wyraźnie, że gałęzią projektu jest "e", a nazwa projektu i wersja to "SP4.2". Znana jest nazwa pliku wykonywalnego "icsvnt32" i była ona obecna w różnych wersjach szkodnika. Znaczenie frazy "general_vob" pozostaje dla nas tajemnicą.
Jak już wcześniej wspomnieliśmy, liczba zidentyfikowanych infekcji "SPE" jest nieduża i bliżej jej do liczby infekcji wywołanych przez Duqu niż Flame'a / Gaussa. Według danych otrzymanych z Kaspersky Security Network, pod koniec września 2012 r. z zainfekowanych maszyn otrzymaliśmy 15 raportów. Wszystkie komputery były zlokalizowane w Zachodniej Azji, głównie w Libanie.
Kraj | Liczba incydentów |
---|---|
Liban | 10 |
Terytorium Palestyńskie | 3 |
Katar | 1 |
Kuwejt | 1 |
Wierzymy, że większość infekcji wywołanych przez "SPE" w Libanie jest bezpośrednio skojarzona z niedawnymi infekcjami wywołanymi w tym kraju przez Gaussa. Aby udowodnić tę teorię, połączyliśmy raporty infekcji głównego modułu "SPE", "modułu USB" oraz modułów Flame'a i Gaussa.
Ofiary "SPE" | Wcześniejsza infekcja Flamem | Wcześniejsza infekcja Gaussem | Moduł USB |
---|---|---|---|
Liban#1 | Nie | Nie | Nie |
Liban#2 | Nie | Tak | Nie |
Liban#3 | Nie | Tak | Tak |
Liban#4 | Nie | Tak | Nie |
Liban#5 | Nie | Tak | Nie |
Terytorium Palestyńskie#1 | Nie | Tak | Nie |
Katar#1 | Nie | Nie | Tak |
Liban#6 | Tak | Tak | Nie |
Liban#7 | Nie | Nie | Tak |
Liban#8 | Nie | Nie | Nie |
Liban#9 | Tak | Tak | Nie |
Kuwejt#1 | Nie | Nie | Tak |
Terytorium Palestyńskie#2 | Nie | Tak | Nie |
Liban#10 | Tak | Tak | Tak |
Terytorium Palestyńskie#3 | Tak | Tak | Nie |
W rezultacie widać, że tylko dwie, spośród dziesięciu ofiar Gaussa i SPE, posiadały zainstalowany "moduł USB". Wskazuje to na prawdopodobne użycie modułu "dskapi.ocx" Gaussa, gdyż implementuje on niemalże tę samą funkcjonalność, co "moduł USB" skojarzony z "SPE".
Podczas naszych badań udało się nam się zassać do leja kilka domen C&C Flame'a i miniFlame'a. Statystyki poniżej sporządzone zostały dla miniFlame'a. Od 28 maja 2012 r. do 30 września 2012 r. naliczyliśmy blisko 14 000 połączeń, pochodzących z około 90 różnych adresów IP:
Rozkład adresów IP ofiar infekcji:
Adresy IP wyśledzone w Stanach Zjednoczonych pochodzą z połączeń VPN. Podobnie, adresy IP pochodzące z Litwy przynależą do dostawcy usług internetowych, który zapewnia satelitarne połączenia internetowe na terenie Libanu. Najbardziej zagadkowe wydają się być adresy IP we Francji – niektóre zdają się pochodzić od proxy lub VPN - ale inne nie są już tak oczywiste. Dla przykładu, jeden z adresów IP ofiary we Francji należy do Uniwersytetu Francoisa Rabelaisa w Tours:
Inne adresy IP we Francji należą do użytkowników internetu mobilnego lub przydzielone zostały darmowym usługom internetowym. Ogólnie rzecz biorąc, wygląda na to, że głównymi lokalizacjami ofiar są Liban i Iran. Rozkład połączeń w tygodniu wygląda następująco:
Z powyższego obrazu wynika, że ofiary były najmniej aktywne w czwartki i w piątki. Poniżej prezentujemy zestawienie wersji, które łączyły się z naszym lejem:
Podczas łączenia się z lejem, miniFlame zgłasza się jako "SP vx.yz", a nie "SPE". Należy również zaznaczyć, że wersja 4.10 najprawdopodobniej nie występuje już "na wolności".
Jako punktu odniesienia użyjemy wersji o numerze 4.50.
Nazwy plików | Foldery |
---|---|
icsvnt32.ocx | %windir%\System32 |
icsvnt32a.ocx | %windir%\System32 |
icsvntu32.ocx | “%allusersprofile%\ (Documents and Settings\All Users) |
icsvntu32a.ocx | “%allusersprofile%\ (Documents and Settings\All Users) |
ICSVNTU32.OCX | ProgramData |
ICSVNTU32A.OCX | ProgramData |
Plik jest biblioteką DLL Windows PE z 19 funkcjami eksportu, skompilowaną przy pomocy Microsoft Visual Studio 6.0.
Funkcje eksportu:
L.p. | Nazwa |
---|---|
1 | DllGetClassObject |
2 | DllCanUnloadNow |
3 | <brak> |
4 | DllRegisterServer |
5 | DllUnregisterServer |
6 | NotifyLogoffUser |
7 | NotifyLogonUser |
8 | ServiceMain |
9 | LCEControlServer |
10 | RegisterTheFrigginEventServiceDuringSetup |
11 | RegisterTheFrigginEventServiceAfterSetup |
12 | RegisterTheEventServiceDuringSetup |
13 | RegisterTheEventServiceAfterSetup |
14 | RestoreMyDocsFolder |
15 | PerUserInit |
16 | DllInstall |
17 | CreateSharedDocuments |
18 | RegisterService |
19 | SvchostPushServiceGlobals |
Moduł tworzy zdarzenia:
Nazwa zdarzenia | Komentarz |
---|---|
Global\TRStepEvent | wszystkie wersje |
Global\EPOAgentEvent | oprócz wersji 5.00 |
Global\MICEvent | tylko w wersji 5.00 |
Global\AdvTW32SyncEvent | wszystkie wersje |
Global\AdvTW32ReadyXXXWfEvent | gdzie XXX jest numerem wersji (np. 450) |
Moduł zapisuje zaszyfrowane pliki dziennika i nadaje im nazwy: "%allusersprofile%\mstlis.log", "%allusersprofile%\datFE2B.da1", "%temp%\daa59.tmp" (tylko w wersji 5.00). Cała rzeczywista funkcjonalność jest realizowana za pomocą dwóch funkcji: "DllMain" (punkt wejścia) i "RegisterService".
Procedura punktu wejścia działa w dwóch trybach, w zależności od wybranych parametrów. Jeśli parametr "lpReserved" nie jest równy magicznej liczbie 0x1A33F1AB (jest to prawdą dla loadera Windows), uruchamiany jest "tryb loadera". Jeżeli parametr jest równy magicznej liczbie, uruchamiany jest wątek główny.
Moduł sprawdza wersję systemu operacyjnego, na której został uruchomiony i dobiera parametry do dalszego działania:
Dla systemów Windows NT 4.0 i nowszych:
Nazwa procesu docelowego | svchost.exe |
Docelowa nazwa użytkownika | SYSTEM |
Docelowy klucz rejestru | HKLM\SOFTWARE\Classes\CLSID\{ 4E14FBA2-2E22-11D1-9964-00C04FBBB345}\InProcServer32 |
Nazwa hosta DLL | es.dll |
Dla systemów Windows 9x:
Nazwa procesu docelowego | explorer.exe |
Docelowa nazwa użytkownika | brak |
Docelowy klucz rejestru | HKLM\SOFTWARE\Classes\CLSID\{ 450D8FBA-AD25-11D0-98A8-0800361B1103}\InProcServer32 |
Nazwa hosta DLL | mydocs.dll |
Moduł występuje w charakterze proxy dla wybranego pliku DLL. Ładuje oryginalną bibliotekę i rozwiązuje nazwy funkcji eksportu, które zostaną zastąpione. Następnie uruchamia wątek loadera i wykonuje powrót z DllMain. W przypadku wystąpienia błędu, moduł czyści rejestr poprzez przywrócenie oryginalnych wartości i powstrzymuje się przed dalszym uruchamianiem.
Na początku moduł sprawdza, czy jest uruchomiony w nazwie procesu docelowego (jeśli taki został określony) przez użytkownika o docelowej nazwie. Jeżeli nazwy procesu lub użytkownika nie zgadzają się, wątek jest zamykany. Następnie moduł rozpoczyna wątek monitora rejestru i, jeżeli operacja powiodła się, ładuje swój własny moduł używając własnych procedur manipulacji formatem PE. Następnie przy pomocy magicznej liczby 0x1A33F1AB wykonuje funkcję "DllMain" z załadowanej kopii, co pozwala mu na efektywne uruchomienie się w "trybie głównym".
Moduł otwiera docelowy klucz rejestru i oczekuje na jego modyfikację przy pomocy funkcji API: "RegNotifyChangeKeyValue". Jeżeli domyślna wartość klucza rejestru została zmieniona i nie wskazuje ona na moduł, próbuje on przywrócić zmiany i zwiększa specjalny licznik. Wątek zatrzymuje działanie modułu i czyści rejestr, jeśli napotka więcej niż dwie zmiany w rejestrze lub inny wątek zgłosi zdarzenie "Global\TRStepEvent".
Po uruchomieniu w "trybie głównym" moduł inicjuje swoje priorytetowe działania, uruchamia komponent interakcji z C&C i wchodzi do pętli głównej operacji.
Jedynie w wersji 5.00: moduł ładuje opcjonalną bibliotekę "%windir%\system32\msfrmt32.dll" i wywołuje jej funkcje eksportu "DllStartServer" i "DllStopServer" odpowiednio przed i po pętli głównej. W procedurze samozniszczenia moduł usuwa ten plik. Cel biblioteki "msfrmt32.dll" pozostaje nieznany. Szczegółowa analiza nie miała miejsca ze względu na brak odpowiednich próbek.
Moduł nieustannie poszukuje uruchomionych procesów antywirusowych, zwracając szczególną uwagę na pliki wykonywalne: "outpost.exe" i "bdagent.exe". Jeżeli którykolwiek z tych procesów zostanie odnaleziony, moduł kończy pracę.
Następnie moduł sprawdza, czy jego pliki dziennika są na tyle obszerne, aby poddać je wyprowadzeniu na zdalny serwer, i jeżeli jest to prawdą przenosi każdy dziennik do lokalizacji "%allusersprofile%\Wnm.tmp", skąd następnie przesyła treść dzienników do pierwszego dostępnego serwera C&C. Połączenie z serwerem C&C ma miejsce tylko wtedy, gdy moduł najpierw może wywołać stronę "http://www.google.com". Jeżeli strona odpowiada, moduł łączy się z serwerem C&C i pobiera nowe rozkazy.
Lista serwerów C&C jest stała i składa się z dwóch tablic: pierwsza tablica zawiera nazwy hostów i adresy IP serwerów, natomiast druga tablica zawiera adresy URL odpowiadające każdemu serwerowi.
Nazwa serwera | Adres URL |
---|---|
webupdate.hopto.org | /cgi-bin/feed.cgi |
webapp.serveftp.com | /cgi-bin/feed.cgi |
web.autoflash.info | /cgi-bin/feed.cgi |
web.velocitycache.com | /cgi-bin/feed.cgi |
webupdate.dyndns.info | /cgi-bin/feed.cgi |
cache.dyndns.info | /cgi-bin/feed.cgi |
Nazwa serwera | Adres URL |
---|---|
flashcenter.info | /cgi-bin/feed.cgi |
flashrider.org | /cgi-bin/feed.cgi |
Nazwa serwera | Adres URL |
---|---|
flashupdates.info | /cgi-bin/counter.cgi |
syncstream.info | /cgi-bin/counter.cgi |
nvidiasoft.info | /cgi-bin/counter.cgi |
202.75.58.179 | /cgi-bin/counter.cgi |
nvidiadrivers.info | /cgi-bin/counter.cgi |
nvidiastream.info | /cgi-bin/counter.cgi |
videosync.info | /cgi-bin/counter.cgi |
rendercodec.info | /cgi-bin/counter.cgi |
194.192.14.125 | /cgi-bin/counter.cgi |
Domeny używane w wersji 5.00 - poza kilkoma wyjątkami - są takie same, jak domeny używane w kilku znanych wersjach Flame'a [8]. Tak więc, "SPE" i Flame komunikowały się z tymi samymi serwerami C&C i były obsługiwane przez ten sam zestaw oprogramowania, który opisywaliśmy wcześniej, przy okazji szczegółowej analizy serwerów C&C Flame'a. Po stronie serwera połączenia nawiązywane przez miniFlame'a były przetwarzane przez kod protokołu "OldProtocolE", który identyfikował klienta jako "SPE".
Moduł wybiera pierwszy dostępny serwer, a jeżeli połączenie nie powiedzie się, przełącza się do następnego wolnego serwera. Podczas operacji moduł odczytuje i zapisuje swoje wewnętrzne dane konfiguracji w kluczu rejestru:
[HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation] StandardTimeBias
Co ciekawe, ten klucz rejestru jest również znany Flame'owi. Moduł Flame'a, który przeprowadza unikalny atak MitM [6], podczas rozprzestrzeniania się za pośrednictwem sieci lokalnej sprawdza, czy ten klucz "SPE" jest obecny w infekowanym systemie i jeżeli jest, moduł pomija ten system. Tak więc, systemy zainfekowane przez "SPE" są rozpoznawane i unikane przez kod replikacji Flame'a.
Protokół komunikacyjny C&C jest oparty na HTTP: moduł wysyła zarówno żądania, jak i odpowiedzi w ciele zgłoszenia HTTP POST, a serwer może odpowiadać modułowi wysyłanymi rozkazami. Wszystkie dane wysyłane na serwer C&C umieszczane są w zawartości zgłoszenia POST. Pakiet rozpoczyna się 10-bajtowym kluczem XOR i ciągiem znaków, zaszyfrowanym przy pomocy tego klucza. Wygląda on jak ciąg znaków żądania HTTP i zawiera podstawowe informacje dotyczące zgłoszenia:
"U=unikalny_identyfikator_ofiary&K=1&A=1 lub 3&F=wewnętrzny_numer_pliku&S=rozmiar_aktualnego_zgłoszenia"
Po ciągu znaków żądania występuje druga część żądania, która jest zaszyfrowana przy pomocy algorytmu Twofish. Rozmiar zaszyfrowanej części jest definiowany poprzez wartość "S=" w pierwszej części pakietu. Druga część pakietu zawiera więcej informacji o komputerze i o samym żądaniu:
UNIQUE_NUMBER=unikalny_identyfikator_ofiary
PASSWORD=LifeStyle2
TOOL_B=SP_numer_wersji
COM_B=H
LI=0
VERSION_INFO=zaszyfrowana_wersja_Windows
SERVICE_PACK=numer_poprawki_Service_Pack
IP=adres_IP_ofiary
MAC=adres_MAC_hosta
COMPUTER_NAME=nazwa_komputera_w_systemie_Windows
CMD_ATTEMPTS=liczba_otrzymanych_rozkazów
SUC_CMD_ATTEMPTS=liczba_rozkazów_wykonanych_pomyślnie
SEC_COUNT=GetTickCount()/1000
LOGGED_ON=1/0(jeśli uruchomiony jest proces explorer.exe)
COMP_ID=wartość [HKLM\SYSTEM\CurrentControlSet\Hardware Profiles\Current\Software\Fonts] PixelShader
ACTION=liczba
FILE_NAME=wewnętrzny_numer_pliku
Zwróćmy uwagę na wartość parametru PASSWORD. Tą wartością jest "LifeStyle2" - to samo hasło używane jest podczas komunikacji z serwerami C&C wszystkich znanych wersji Flame'a.
Po drugiej części żądania może następować opcjonalna część trzecia, która zawiera jeszcze więcej danych. Może to być plik dziennika, plik z komputera ofiary lub dziennik poleceń otrzymany z serwera C&C. Trzecia część jest szyfrowana kolejną warstwą algorytmu Twofish, wykorzystującą ten sam klucz. Format odpowiedzi serwera jest znacznie prostszy: jest to bufor zawierający rozkazy i ich parametry, zaszyfrowane przy pomocy jednowarstwowego algorytmu Twofish, używającego tego samego klucza. Każda linia w buforze reprezentuje polecenie:
<!-- NAZWA_ROZKAZU CONTINUE_ON_ERROR(0/1) parametry … serwer_do_wysłania_wyników port_do_wysłania_wyników --> \n
Nazwa polecenia | Opis |
---|---|
FIONA | Zapisz na komputerze ofiary plik z serwera C&C |
SONIA | Prześlij na serwer C&C plik z komputera ofiary |
EVE | Załaduj zdefiniowaną bibliotekę DLL i wywołaj bez argumentów określoną funkcję eksportu |
ELVIS | Utwórz proces o określonych parametrach i czekaj na jego uruchomienie |
DRAKE | Usuń z rejestru parametr "StandardTimeBias" i zasygnalizuj zdarzenie "Global\TRStepEvent" (procedura samounicestwienia) |
CHARLES | Zapisz do rejestru nową wartość "StandardTimeBias" |
SAM | Przejdź w tryb uśpienia na określony czas |
ALEX (wersja 5.00) | Zmierz czas bezczynności systemu i podaj go w milisekundach |
BARBARA (wersja 5.00) | Zrób zrzut ekranu z okna na pierwszym planie, jeśli należy ono do jednego ze wstępnie zdefiniowanych procesów |
TIFFANY (wersja 5.00) | Przełącz się na serwer C&C określony w parametrach rozkazu |
Po wykonaniu wszystkich poleceń wydanych przez serwer, bot wysyła do serwera nowe zgłoszenie, które zawiera dziennik wykonanych rozkazów. Jeśli którekolwiek z poleceń wymagają od bota wysyłania danych na serwer (np. SONIA), są one wysyłane w oddzielnych żądaniach HTTP poprzedzających zgłoszenie dziennika. Żądania te mogą zostać przekierowane do innych serwerów C&C, jeżeli zostało to zaznaczone w parametrach rozkazów.
Kiedy moduł otrzyma rozkaz "BARBARA", najpierw pobiera czas ostatniej aktywności użytkownika i kontynuuje operację, tylko jeśli komputer nie jest w stanie spoczynku. Następnie wykonuje zrzut ekranu całego pulpitu, zapisuje go w formacie BMP, kompresuje z wykorzystaniem algorytmu PPMd (zmodyfikowany wariant "I") i w osobnym zgłoszeniu wysyła zrzut ekranu na swój serwer C&C. Warto przypomnieć, że jeden z modułów szkodliwego oprogramowania Flame do kompresowania zrzutów ekranu używał dokładnie tego samego algorytmu (PPMd). Procedura obsługi polecenia "BARBARA" może zostać uruchomiona w różnych trybach i może zbierać zrzuty ekranu, tylko jeśli okno na pierwszym planie należy do procesu z ustalonej listy; jednakże ta funkcja jest wyłączona.
Nazwa procesu | Opis |
---|---|
Iexplore.exe | Przeglądarka Internet Explorer |
Mozilla.exe | Przeglądarka Mozilla |
Outlook.exe | MS Outlook |
Msimn.exe | MS Outlook Express |
Winword.exe | MS Word |
Excel.exe | MS Excel |
Msmsgs.exe | MSN Messenger |
Msgplus.exe | Rozszerzenie MSN Messenger |
Msnmsgr.exe | Rozszerzenie MSN Messenger |
Msdev.exe | Microsoft Developers Studio |
Explorer.exe | Eksplorator Windows |
Cygwin.exe | Podobne do Linuxa środowisko dla systemu Windows, umożliwiające uruchomienie na systemie Windows oprogramowania dla systemów POSIX (takich jak Linux, BSD i Unix) |
Acrobat.exe | Adobe Acrobat |
Acrord32.exe | Adobe Acrobat Reader |
Aim.exe | Komunikator internetowy AOL |
Aim95.exe | Komunikator internetowy AOL |
Frontpage.exe | Edytor MS FrontPage |
Icq.exe | Komunikator internetowy ICQ |
Icqlite.exe | ICQ Lite |
Inetinfo.exe | Komponent, który hostuje metabazę IIS i niesieciowe usługi IIS 6.0 |
Exceed.exe | System zarządzania przedsiębiorstwem Hummingbird Ltd. / OpenText |
telnet.exe | Klient Windows Telnet |
ftp.exe | Klient Windows FTP |
Putty.exe | Klient SSH / Telnet |
Netscape.exe | Przeglądarka Netscape Navigator |
Notepad.exe | Notatnik Windows |
Winproj.exe | Projekt Microsoft Office |
Powerpnt.exe | Microsoft PowerPoint |
Visio.exe | MS Visio |
Ypager.exe | Yahoo Messenger |
Mstsc.exe | Podłączenie zdalnego pulpitu Microsoft |
mmc.exe | Konsola zarządzania Microsoft |
Paltalk.exe | PalTalk Messenger |
Onenote.exe | Microsoft Office OneNote |
Onenotem.exe | Szybkie uruchamianie dla Microsoft Office OneNote |
Po wykonaniu wszystkich poleceń wydanych przez serwer, bot wysyła do serwera nowe zgłoszenie, które zawiera dziennik wykonanych rozkazów. Jeśli którekolwiek z poleceń wymagają od bota wysyłania danych na serwer (np. SONIA), są one wysyłane w oddzielnych żądaniach HTTP poprzedzających zgłoszenie dziennika. Żądania te mogą zostać przekierowane do innych serwerów C&C, jeżeli zostało to zaznaczone w parametrach rozkazów.
Ta funkcja może zostać wywołana przez zewnętrzny moduł, np. składnik loadera Gaussa. Jest to procedura instalacyjna: kopiuje moduł do katalogu systemowego i modyfikuje rejestr, tak aby skopiowany moduł był uruchamiany przy starcie systemu.
Moduł sprawdza, czy został uruchomiony na systemie Windows 2000, czy nowszej wersji systemu NT (XP, Vista, 7) i wykonuje powrót, jeśli nie jest to prawdą. Moduł sprawdza również, czy w systemie uruchomione są procesy "outpost.exe" i "bdagent.exe". Jeżeli któryś z tych procesów jest obecny, moduł czyści rejestr i kończy swoje działanie. Następnie moduł kopiuje plik "%windir%\system32\icsvnt32a.ocx" do tymczasowego katalogu z prefiksem "%allusersprofile%\gfw". Później przenosi ten plik z lokalizacji tymczasowej do właściwej lokalizacji "%windir%\system32\icsvnt32.ocx". Pobiera również czas utworzenia pliku "%windir%\system32\kernel32.dll" i ustawia identyczną wartość jako czas utworzenia swojego własnego pliku. Oryginalny plik "%windir%\system32\icsvnt32a.ocx" zostaje przeznaczony do usunięcia przy pierwszym powtórnym uruchomieniu komputera.
Jeżeli plik "icsvnt32.ocx" zostanie zainstalowany bez żadnych błędów, moduł zmienia domyślną wartość docelowego klucza rejestru na "%windir%\system32\icsvnt32.ocx". Poprzez podmianę jednego systemowego obiektu COM, moduł rejestruje się w systemie i dzięki temu jest ładowany przez większość procesów systemowych.
Ten moduł jest oparty na tym samym kodzie źródłowym co "icsvnt32.ocx" i posiada wiele identycznych funkcji. Plik zawiera kod do interpretacji rozkazów z serwera C&C, ale jest on błędny. Powinien łączyć się z serwerem kontroli, lecz generuje przekierowanie, które prowadzi do zapisu danych w pliku dziennika.
Moduł jest biblioteką DLL Windows PE z 19 funkcjami eksportu, skompilowanymi przy pomocy Microsoft Visual Studio 6.0.
Funkcje eksportu:
L.p. | Nazwa |
---|---|
1 | DllGetClassObject |
2 | DllCanUnloadNow |
3 | <brak> |
4 | DllRegisterServer |
5 | DllUnregisterServer |
6 | NotifyLogoffUser |
7 | NotifyLogonUser |
8 | ServiceMain |
9 | LCEControlServer |
10 | RegisterTheFrigginEventServiceDuringSetup |
11 | RegisterTheFrigginEventServiceAfterSetup |
12 | RegisterTheEventServiceDuringSetup |
13 | RegisterTheEventServiceAfterSetup |
14 | RestoreMyDocsFolder |
15 | PerUserInit |
16 | DllInstall |
17 | CreateSharedDocuments |
18 | RegisterService |
19 | SvchostPushServiceGlobals |
Moduł tworzy zdarzenia:
Nazwa zdarzenia | Komentarz |
---|---|
Global\TRStepEventU | wszystkie wersje |
Global\EPOAgentEventU | wszystkie wersje |
Global\TUSEventU | wszystkie wersje |
Global\AdvTW32AutoDetectU | wszystkie wersje |
Global\AdvTW32ReadyXXXWfEventU | gdzie XXX jest numerem wersji (np. 450) |
Global\MSTKCSrvEventU | wszystkie wersje |
Moduł tworzy zaszyfrowane pliki dziennika o nazwach: "%allusersprofile%\mstlis.log", "%allusersprofile%\datFE2B.da1", "%allusersprofile%\datFE2A.tmp".
Procedura punktu wejścia pracuje w dwóch różnych trybach, w zależności od parametrów. Jeżeli parametr "lpReserved" nie jest równy magicznej liczbie 0x1A33F1AB (co jest prawdą dla loadera Windows), moduł zaczyna działać w "trybie loadera". Jeżeli parametr jest równy magicznej liczbie, rozpoczynany jest wątek główny.
Moduł sprawdza wersję systemu operacyjnego, na której został uruchomiony i dobiera parametry do dalszego działania:
Dla systemów Windows NT 4.0 i nowszych oraz dla systemów Windows 9x:
Nazwa procesu docelowego | explorer.exe |
Docelowa nazwa użytkownika | brak |
Docelowy klucz rejestru | HKLM\SOFTWARE\Classes\CLSID\{ 35CEC8A3-2BE6-11D2-8773-92E220524153}\InProcServer32 |
Nazwa hosta DLL | stobject.dll |
Parametry dla wersji systemu NT i 9x są takie same, ale różne są funkcje, które inicjują wartości tych parametrów.
Moduł zdaje się operować jako proxy dla wybranego pliku DLL. Ładuje oryginalną bibliotekę i rozwiązuje nazwy jej funkcji eksportu, które zostaną zastąpione. Następnie moduł uruchamia wątek loadera i wykonuje powrót z "DllMain". W przypadku wystąpienia błędu, moduł wykonuje czyszczenie rejestru poprzez przywrócenie oryginalnych wartości i powstrzymuje się przed kolejnym uruchomieniem.
Na początku moduł sprawdza, czy jest uruchomiony w nazwie procesu docelowego (jeśli taki został określony) przez użytkownika o docelowej nazwie. Jeżeli nazwy procesu lub użytkownika nie zgadzają się, wątek jest zamykany. Następnie moduł rozpoczyna wątek monitora rejestru i, jeżeli operacja powiodła się, ładuje swój własny moduł używając własnych procedur manipulacji formatem PE. Następnie, pomocy magicznej liczby 0x1A33F1AB, wykonuje funkcję "DllMain" załadowanej kopii, co pozwala mu na efektywne uruchomienie się w "trybie głównym".
Moduł otwiera docelowy klucz rejestru i oczekuje na jego modyfikację przy pomocy funkcji API: "RegNotifyChangeKeyValue". Jeżeli domyślna wartość klucza rejestru została zmieniona i nie wskazuje ona na moduł, próbuje on przywrócić zmiany i zwiększa specjalny licznik. Wątek zatrzymuje działanie modułu i czyści rejestr, jeśli napotka więcej niż dwie zmiany w rejestrze lub inny wątek zgłosi zdarzenie "Global\TRStepEventU".
Po uruchomieniu w "trybie głównym", moduł zaczyna realizować swoje podstawowe zadania i zamienia komponent interakcji z C&C (na podobny do składnika w "icsvnt32.ocx"). Tworzy on również pulpit o nazwie "Default3" i przypisuje swój główny wątek do tego pulpitu. Następnie, moduł wchodzi do pętli głównej operacji. Moduł nieustannie poszukuje uruchomionych procesów antywirusowych, zwracając szczególną uwagę na pliki wykonywalne: "outpost.exe" i "bdagent.exe". Jeżeli którykolwiek z tych procesów zostanie odnaleziony, moduł kończy pracę.
Pętla głównej operacji jest zmodyfikowaną pętlą interakcji z C&C pobraną z "icsvnt32.ocx", która zamiast połączenia z serwerem rozpoczyna procedury infekcji dysku. Podczas operacji, moduł odczytuje i zapisuje swoje wewnętrzne dane konfiguracji w wartości rejestru:
[HKCU\Console]
StandardTimeBiasU
Moduł wylicza wszystkie dostępne napędy USB. Następnie infekowane są wszystkie urządzenia USB o systemie plików FAT, FAT32 i NTFS. Najpierw moduł pobiera informacje o dysku i zapisuje je w raporcie "%allusersprofile%\mstlis.log". Następnie, próbuje wyleczyć dysk z potencjalnej infekcji dokonanej przez starszy wariant szkodnika usuwając następujące pliki:
System32.dat
.Catroot.tmp
Poszukuje również katalogów, w których nazwach występuje ".Backup0D" – ".Backup0M" i dla każdego takiego usuwa pliki "target.lnk" i "desktop.ini" oraz sam folder. Te katalogi są tworzone podczas infekcji przeprowadzanych przez "moduł USB" Gaussa.
Jeżeli urządzenie w swoim katalogu głównym posiada plik ".thumbs.db", moduł odczytuje zawartość tego pliku i zapisuje ją w pliku dziennika "%allusersprofile%\datFE2A.tmp". Wpis do dziennika jest poprzedzany ciągiem znaków "USB_RESULT" i aktualną datą oraz czasem. Jeśli plik dziennika jest uważany za wystarczająco duży do wyprowadzenia go na zewnątrz, zawartość ".thumbs.db" jest zapisywana do kolejnego pliku dziennika: "%allusersprofile%\datFE2B.da1". Następnie moduł infekuje urządzenie. Tworzy nowy plik o nazwie ".thumbs.db" w katalogu głównym urządzenia. Plik zawiera magiczną liczbę 0x0EB397F2B i wartość TTL równą 10. Licznik TTL jest zmniejszany przez ładunek uruchamiany z dysku USB, a ładunek czyści dysk, gdy licznik osiągnie wartość zero.
Format pliku ".thumbs.db" jest identyczny, jak format stosowany przez moduł Gaussa "dskapi.ocx".
Moduł odszyfrowuje plik "%allusersprofile%\petsec.sys" używając ustalonego klucza Twofish i zapisuje go w katalogu głównym dysku pod nazwą "System32.dat". Plik jest biblioteką PE DLL i powinien być ładowany z zainfekowanego dysku przez exploit LNK. Następnie, moduł tworzy katalogi ".Backup0D" – ".Backup0M". W każdym z tych katalogów tworzone są pliki "target.lnk" i "desktop.ini". Pierwszy plik zawiera exploit LNK, który ładuje plik "System32.dat", a drugi z plików konwertuje katalog do formatu pliku skrzyżowanego.
Ta funkcja może zostać wywołana przez zewnętrzny moduł, np. składnik loadera Gaussa. Jest to procedura instalacyjna: kopiuje moduł do katalogu systemowego i modyfikuje rejestr, tak aby skopiowany moduł był uruchamiany przy starcie systemu. Moduł sprawdza, czy został uruchomiony na systemie Windows 2000, czy nowszej wersji systemu NT (XP, Vista, 7) i wykonuje powrót, jeśli nie jest to prawdą. Moduł sprawdza również, czy w systemie uruchomione są procesy "outpost.exe", "bdagent.exe" i "antivirus.exe". Jeżeli któryś z tych procesów jest obecny, moduł czyści rejestr i kończy swoje działanie.
Następnie moduł kopiuje plik "%allusersprofile%\icsvntu32a.ocx" do tymczasowego katalogu z prefiksem "%allusersprofile%\gfw". Później przenosi ten plik z lokalizacji tymczasowej do właściwej lokalizacji "%allusersprofile%\icsvntu32.ocx". Pobiera również czas utworzenia pliku "%windir%\system32\kernel32.dll" i ustawia identyczną wartość jako czas utworzenia swojego własnego pliku. Oryginalny plik "%allusersprofile%\icsvntu32a.ocx" zostaje przeznaczony do usunięcia przy pierwszym powtórnym uruchomieniu komputera. Jeżeli plik "icsvntu32.ocx" zostanie zainstalowany bez żadnych błędów, moduł zmienia domyślną wartość docelowego klucza rejestru na "%allusersprofile%\icsvntu32a.ocx". Poprzez podmianę jednego systemowego obiektu COM, moduł rejestruje się w systemie i dzięki temu jest ładowany przez większość procesów systemowych.
Byliśmy w stanie odszukać kopię pliku "petsec.sys", o którym mowa w wersji 4.00 "SPE". Lokalizacja pliku na zainfekowanym dysku USB: "\.CatRoot.tmp", "\System32.dat".
Właściwości pliku:
Wersja | MD5 | Data kompilacji | Rozmiar |
---|---|---|---|
4 | 8d206625957f7c96fd468f6c176248d0 | 2010.09.15 15:08:17 (GMT) | 13312 |
Plik tworzy mutex "Isvp4003ltrEvent" i jest biblioteką DLL Windows PE, nie zawierającą funkcji eksportu i skompilowaną przy pomocy Microsoft Visual Studio 6.0. Bieżąca funkcjonalność jest zaimplementowana w funkcji "DllMain" (punkt wejścia). Funkcjonalność modułu jest prawie identyczna jak funkcjonalność plików "System32.dat" / "System32.bin" zapisywanych przez moduł Gaussa "dskapi.ocx": zbiera informacje o systemie, na którym został uruchomiony i zapisuje je do pliku na zainfekowanym dysku USB.
Powyższy wariant odpowiada wersji 4.00 modułu "icsvntu32.ocx" i prawdopodobnie posiada nazwę ".CatRoot.tmp". Nowsza wersja "icsvntu32.ocx" infekuje dyski USB plikiem o nazwie "System32.dat", jednakże nie dysponujemy próbkami tego szkodliwego ładunku.
Moduł sprawdza, czy jego nazwa zawiera kompletną oryginalną nazwę pliku, ".CatRoot.tmp" (wersja 4.00). Ponieważ moduł zawiesza się, gdy jego nazwa jest inna, nowsze modyfikacje modułu powinny stosować inną nazwę - "System32.dat". Jeżeli nazwa pliku się zgadza, moduł kopiuje się do lokalizacji "%TEMP%\%cCatRoot.tmp", gdzie "%c" jest nazwą dysku, z którego uruchomiony został moduł. Dla przykładu, jeżeli moduł wystartował z dysku "F:", lokalizacja będzie wyglądała następująco: "%TEMP%\FCatRoot.tmp". Następnie moduł ładuje swoją nową kopię i wykonuje powrót.
Jeśli nazwa pliku zawiera jego oryginalną nazwę bez pierwszego symbolu (np. "CatRoot.tmp" bez kropki), moduł zakłada, że został załadowany z kopii lokalnej i przystępuje do wykonywania swojej głównej procedury. Moduł oznacza system jako zainfekowany zapisując następujący klucz rejestru:
[HKCU\Control Panel\Desktop]
WindowBuildVal = losowa wartość
Następnie, odczytuje plik ".thumbs.db" z katalogu głównego zainfekowanego dysku USB. 32-bitowa wartość całkowita na offsecie 4 tego pliku zawiera licznik życia TTL (ang. Time To Live) modułu. Licznik jest zmniejszany przy każdym załadowaniu modułu, a gdy jego wartość dojdzie do zera, moduł wykonuje procedurę samousuwania. Jeśli wartość TTL jest większa niż zero, moduł realizuje procedurę zbierania danych.
Moduł gromadzi kilka typów danych i zapisuje je na końcu pliku ".thumbs.db" w głównym katalogu zainfekowanego urządzenia USB. Plik jest szyfrowany przy pomocy algorytmu XOR, a jego format jest identyczny, jak format wykorzystywany przez moduł Gaussa "dskapi.ocx". Moduł gromadzi następujące informacje:
Moduł usuwa plik ".CatRoot.tmp" z głównego katalogu zainfekowanego napędu. Następnie, katalog główny jest przeszukiwany pod kątem obecności podkatalogów o nazwach ".Backup0D" – ".Backup0M", a dla każdego z tych podkatalogów moduł:
Plik ".thumbs.db" nie jest usuwany podczas wykonywania procedury samodzielnej dezinstalacji.
Podczas analizy kodu centrum kontroli Flame'a, zidentyfikowaliśmy cztery odmiany szkodliwego oprogramowania znane serwerowi C&C: "SP", "SPE", "FL" i "IP". Pod nazwą kodową "FL" kryje się Flame. Szkodnik znany jako "SPE" został opisany w niniejszym artykule.
Opierając się na przeprowadzonej analizie, byliśmy w stanie połączyć ze sobą kilka cech charakterystycznych szkodnika "SPE", którego nazywamy również "miniFlame" lub "John" (w ten sposób nazwano go w konfiguracji Gaussa):
Projekty Flame i Gauss były masowymi operacjami cyberszpiegowskimi, infekującymi tysiące użytkowników. SPE / miniFlame jest wysoce precyzyjnym narzędziem szpiegowskim. Liczba ofiar tego szkodliwego oprogramowania jest porównywalna do ofiar infekcji Duqu. Możemy założyć, że miniFlame był częścią operacji Flame i Gauss, które odbyły się w kilku fazach. Pierwsza faza: zainfekowanie jak największej liczby potencjalnie interesujących ofiar. Druga faza: zbieranie danych od ofiar, pozwalające atakującemu określić profile ofiar i znaleźć najciekawsze cele. Finalna faza: dla "wybranych" celów zastosowanie wyspecjalizowanego narzędzia szpiegowskiego, takiego jak SPE / miniFlame, do prowadzenia nadzoru / monitoringu.
Wewnątrz kodu C&C Flame'a istnieje odniesienie do dwóch dotąd nieznanych części szkodliwego oprogramowania: "SP" i "IP". "SP" to najprawdopodobniej starszy wariant szkodnika opisanego w tym artykule. "IP" to prawdopodobnie odrębna część szkodliwego oprogramowania, która do tej pory pozostaje nieznana.
Analizując Flame'a, Gaussa i miniFlame'a najprawdopodobniej odkryliśmy czubek góry lodowej masowych operacji cyberszpiegowskich, mających miejsce na Bliskim Wschodzie. Ich prawdziwy cel pozostaje niejasny, a tożsamość ofiar i napastników pozostaje nieznana.
[1] Flame: Pytania i odpowiedzi
[2] Gauss: nietypowa dystrybucja
[3] Pełna analiza serwerów centrum kontroli Flame'a
[4] Powrót do Stuxneta: brakujące ogniwo
[5] Stuxnet/Duqu: ewolucja sterowników
[6] Flame: replikacja przez serwer proxy utworzony w wyniku ataku MITM
[7] Zagadka zaszyfrowanej zawartości Gaussa
[8] Dach płonie: walka z serwerami kontroli Flame'a
Analizy
Blog