Stan zagrożeń w internecie znajduje się obecnie na poziomie standardowym. Nie występują duże epidemie a eksperci z Kaspersky Lab nie zanotowali żadnych poważnych incydentów związanych z bezpieczeństwem. Poziom zagrożenia: 1

Zagadka zaszyfrowanej zawartości Gaussa

Dodany 14 sierpnia 2012, 15:12 CEST
Tagi:

Wciąż pozostaje wiele zagadek dotyczących szkodliwego oprogramowania Gauss i Flame. Na przykład, w jaki sposób dochodzi do infekcji? Nie wiemy także jakie jest zadanie czcionki „Palida Narrow”, którą instaluje Gauss?

Prawdopodobnie najbardziej interesującą zagadką jest zaszyfrowany ładunek bojowy Gaussa. Gauss zawiera moduł o nazwie “Godel”, w którym znajduje się zaszyfrowany ładunek. Szkodliwe oprogramowanie rozszyfrowuje ten ładunek korzystając z łańcuchów tekstowych pochodzących z systemu, a następnie uruchamia go. Pomimo usilnych starań nie udało nam się złamać szyfru. Upubliczniamy więc wszystkie dostępne informacje o ładunku w nadziei, że komuś uda się znaleźć rozwiązanie i ujawnić jego tajemnicę. Prosimy wszystkich zainteresowanych kryptologią i matematyką aby przyłączyli się do rozwiązywania zagadki i wydobywania zaszyfrowanej zawartości.

Kontenery

Zainfekowane napędy USB zawierają dwa pliki posiadające kilka zaszyfrowanych sekcji. Pliki noszą nazwy “System32.dat” oraz “System32.bin”, są 32-bitowymi i 64-bitowymi wersjami tego samego kodu. Pliki te są wczytywane z zainfekowanych napędów przy pomocy dobrze znanego exploita LNK, który po raz pierwszy został użyty w szkodliwym oprogramowaniu Stuxnet. Ich głównym zadaniem jest uzyskanie dużej ilości informacji o systemie ofiary i zapisanie ich w pliku “.thumbs.db” na dysku przenośnym. Kilka znanych wersji plików zawiera trzy zaszyfrowane sekcje (jedna sekcja kodu, dwie sekcje danych).

Klucz deszyfrujący dla tych sekcji jest generowany dynamicznie i zależy od cech systemu ofiary, co zapobiega uzyskaniu zawartości sekcji przez kogoś innego, niż wybrane cele.

Nawiasem mówiąc, w 64-bitowej wersji modułu pozostawiono pewne informacje o debugowaniu. Moduł zawiera łańcuchy potwierdzające używane przy debugowaniu oraz nazwy modułów:


.\loader.cpp
NULL != encSection
Path
NULL != pathVar && curPos < pathVarSize
NULL != progFilesDirs && curPos < progFilesDirsSize
NULL != isExpected
NULL != key
(NULL != result) && (NULL !=str1) && (NULL != str2)
.\encryption_funcs.cpp

Dane

 

Zagadkowe, zaszyfrowane dane są przechowywane w trzech sekcjach:

 

Pliki zawierają również zaszyfrowany zasób “100”, który wydaje się być właściwym ładunkiem, biorąc pod uwagę względnie mały rozmiar zaszyfrowanych sekcji. Najprawdopodobniej sekcja “.exsdat” zawiera kod służący do deszyfrowania zasobu i uruchomienia jego zawartości.

 

Algorytm

 

Kod deszyfrujący sekcje jest bardzo złożony w porównaniu ze standardową procedurą deszyfrowania, którą często znajdujemy w szkodliwym oprogramowaniu. Oto krótki opis algorytmu:

 

Walidacja

 

1. Utwórz listę wszystkich wpisów z GetEnvironmentPathW(“Path”), rozdzielonych separatorem “;”
2. Dodaj do listy wszystkie wpisy zwrócone przez FindFirstFileW / FindNextFileW z maską “%PROGRAMFILES%\*”, gdzie cFileName[0] > 0x007A (UNICODE ‘z’)

 

Uwaga: w istocie oznacza to, że określony program zainstalowany w “%PROGRAMFILES%” ma nazwę zaczynającą się od znaku specjalnego, takiego jak “~” – tak jak w naszym przykładzie – lub korzysta ze specjalnej tablicy znaków UNICODE, na przykład arabskiej lub żydowskiej, gdzie wszystkie znaki mają wyższą wartość niż 0x007A.

 

3. Utwórz wszystkie możliwe pary z wpisów pochodzących z listy wynikowej.
4. Dla każdej pary dodaj pierwszą stałą 16-bajtową sól i wylicz sumę kontrolną MD5.

 

Przykład łańcucha tekstowego pary, drugi łańcuch tekstowy zaczyna się od “~dir” i pierwszej soli

 

5. Wylicz sumę kontrolną MD5 z sumy kontrolnej ( czyli suma kontrolna = md5(suma kontrolna) ), 10000 razy.
6. Porównaj czy suma kontrolna MD5 zgadza się ze stałą wartością. Jeśli nie, zakończ działanie.

 

Deszyfrowanie

 

Sekcje są deszyfrowane w następującej kolejności: .exsdat, .exrdat, .exdat.

 

1. Użyj pary PATH/PROGRAMFILES wykorzystanej do wygenerowania oczekiwanej sumy kontrolnej MD5 w kodzie walidującym powyżej.
2. Do pary dodaj drugą, stałą 16-bajtową sól i bajty 0x15, 0x00

 

Przykład łańcucha tekstowego pary, drugi łańcuch tekstowy zaczyna się od “~dir” i drugiej soli

 

3. Wylicz sumę kontrolną MD5 z wynikowego bufora.
4. Wylicz sumę kontrolną MD5 z sumy kontrolnej ( tzn. suma kontrolna = md5(suma kontrolna) ), 10000 razy.
5. Uzyskaj klucz RC4 z wynikowej sumy kontrolnej korzystając z funkcji CryptDeriveKey(hProv, CALG_RC4, hBaseData, 0, &hKey) pochodzącej z biblioteki WinAPI.
6. Deszyfruj sekcję (RC4), traktując jej pierwsze słowo DWORD jako długość bufora przeznaczonego do deszyfrowania, zaszyfrowany bufor znajduje się w sekcji przesunięty o 4
7. Porównaj słowa DWORD w zaszyfrowanym buforze na pozycjach 0 lub 7 z „magiczną” wartością “0x20332137”. Przejdź dalej tylko, jeśli słowa DWORD są takie same.
8. Zwiększ rozmiar ostatniego słowa WORD w buforze para+sól (ten początkowo ustawiony na 0x0015) o 1.
9. Deszyfruj następną sekcję, przejdź do punktu 3.

 

Po odszyfrowaniu wszystkich sekcji: wywołaj funkcję znajdującą się na początku sekcji .exsdat.

 

Przykładowe dane do walidacji algorytmu:

 

Para łańcuchów tekstowych jest tworzona poprzez konkatenację łańcuchów. Łańcuchy tekstowe i bufor soli nie są oddzielone żadnym znakiem.

 

Przykładowe łańcuchy tekstowe, Unicode (bez cudzysłowu):

 

  • “C:\Documents and Settings\john\Local Settings\Application Data\Google\Chrome\Application”
  • “~dir1”

 

Pierwsza sól, zrzut wartości heksadecymalnych: 97 48 6C AA 22 5F E8 77 C0 35 CC 03 73 23 6D 51
MD5 w kroku 6 walidacji: 76405ce7f4e75e352c1cd4d9aeb6be41
Druga sól, zrzut wartości heksadecymalnych: BB 49 4E 77 F9 25 EE C0 3B 89 FC ED C2 22 4A 21
MD5 w 5 kroku deszyfrowania: 00916031b3e9513044436ee42b6aa273

 

Weź udział w poszukiwaniach

 

Wypróbowaliśmy miliony kombinacji znanych nazw w %PROGRAMFILES% i Path, bez powodzenia. Sprawdzanie pierwszego znaku foldera znajdującego się w %PROGRAMFILES% wskazuje, że cyberprzestępcy szukają bardzo konkretnego programu o nazwie zapisanej przy pomocy rozszerzonego zbioru znaków, takiego jak arabski czy żydowski, lub takiej zaczynającej się od znaku specjalnego, np. “~”.

 

Naturalnie oczywistym jest, że złamanie takiego szyfrowania prostym atakiem brute-force jest niemożliwe. Prosimy wszystkich zainteresowanych złamaniem kodu i poznaniem zagadkowego ładunku o dołączenie do nas.

 

Sekcja zasobów jest wystarczająco duża, aby zawierać kod atakujący systemy SCADA podobny do Stuxneta, a wszystkie środki ostrożności podjęte przez autorów wskazują, że cel rzeczywiście jest bardzo znaczący.

 

Udostępniamy pierwsze 32 bajty zaszyfrowanych danych oraz sumy kontrolne z różnych wersji modułów. Jeśli jesteś kryptologiem, lub po prostu chcesz pomóc nam w deszyfrowaniu, skontaktuj się z nami za pośrednictwem adresu e-mail: theflame@kaspersky.com.

 

Dane źródłowe

 

Udostępniamy do 32 bajtów z początku każdej zaszyfrowanej sekcji, pomijając słowo DWORD zawierające długość zaszyfrowanego bufora. Jeśli potrzebujesz więcej zaszyfrowanych danych, skontaktuj się z nami za pośrednictwem adresu e-mail: theflame@kaspersky.com.

 

Próbka 56e4fb972828fafbbdc11158a1b5fa72
Sól 1 97 48 6C AA 22 5F E8 77 C0 35 CC 03 73 23 6D 51
Suma kontrolna MD5 758EA09A147DCBCAD6BD558BE30774DE
Sól 2 BB 49 4E 77 F9 25 EE C0 3B 89 FC ED C2 22 4A 21
Exsdat 4C CC BA E2 E0 BA 2E 44 C7 60 17 9A 72 F4 2F 27 DD FD DB 11 03 94 E3 4B 0A 16 66 F3 36 97 6C D8
Exrdat C9 27 BE 67 4D 3B 39 36 AB 14 44 32 88 60 7A 64 B0 92 9B 3A A1 5B C5 21 A7 6E 09 0C F8 71 84 87
Exdat B8 EB 6D 61 2B 4F 70 65 75 A2 1C 03 1C DF 26 2F

Próbka 695056ffacef1fdaa326d7c8bb0f88ba
Sól 1 6E E3 47 2C 06 A5 C8 59 BD 16 42 D1 D4 F5 BB 3E
Suma kontrolna MD5 EB2F172398261ED94C8D05216650919B
Sól 2 8F 42 B5 87 E8 9A B2 32 C8 1C 1A EC B5 2D 55 19
Exsdat CE 31 D0 5D 7D CB 57 9A 83 06 09 8D 42 2B 44 34 24 13 B2 39 22 48 8F F3 76 E5 9C DA 87 8F BC 42
Exrdat 50 1F F8 BA 18 1B 3E 36 23 9D 95 DC 5A 07 E4 EC 76 38 78 79 BA 84 A5 4E 24 BA 0E 27 94 63 F7 3D
Exdat 9D 5B B8 3B B2 17 00 DC 76 81 1D 4E 54 80 9B 31

Próbka 089d45e4c3bb60388211aa669deab26a
Sól 1 0E A5 01 D1 24 71 CD CD 0E 9E AC 6E 48 5A F9 32
Suma kontrolna MD5 52DD4D6B792D84C422E6A08E4272ACB8
Sól 2 38 F9 A6 5B 82 08 E7 61 1D 10 73 53 50 BC B4 F0
Exsdat D3 CA 9D 9F 87 FB 25 43 7E C6 57 7C D9 06 10 8D D2 5B B2 88 18 6E FD B4 C4 30 12 2E 1E EC E0 64
Exrdat B4 43 8F B8 0A 67 7D 88 C1 CD F3 E8 D9 61 1B E9 5A 8A 41 16 8B 8A 18 AD 25 5A 81 87 8F 8D 1A 40
Exdat F6 C9 81 C9 86 27 16 0C B7 33 93 AB 3E 71 5B E2

Próbka 8d90e3c68030fbb91ad5b920d5e17b32
Sól 1 C3 23 4D 51 5D 52 A5 8E 81 46 FA 8A 6D 93 DF 7D
Suma kontrolna MD5 53B3FAEA53CC1B90AA2C5FCF831EF9E2
Sól 2 21 9D 04 35 7B 96 74 53 B0 9C CD 7F 2F E6 63 AA
Exsdat AB 01 6A 8E 42 F0 F2 92 1D F1 4A 42 01 63 72 78 D6 F7 A5 0C 54 37 21 2C B8 59 6A D0 7E 68 19 2D
Exrdat 6C 2D D7 E4 F6 08 15 C0 69 D9 9E FF EA 68 63 4F 56 59 DA 28 E5 2E A1 EF 21 FB F9 2B C2 BC E7 CE
Exdat 55 A7 F3 93 E0 AF 5B 7E 17 22 7E 82 8A 6F 25 21 3D 64 D7 E8