Отчеты о целевых атаках (APT)

Тайна зашифрованного вредоносного функционала Gauss

В истории Gauss и Flame остается много загадок. Например, каким образом происходит заражение вредоносной программой? И каково назначение шрифта с уникальным названием Palida Narrow, устанавливаемого Gauss?

Вероятно, наиболее интригующая тайна – это зашифрованный блок кода Gauss. В состав программы входит модуль под названием Godel, содержащий зашифрованный функционал. Вредоносная программа пытается расшифровать этот функционал, используя несколько строк, взятых из системы, и в случае успеха выполняет расшифрованный код. Как мы ни старались, нам не удалось расшифровать код. Поэтому сегодня мы представляем всю известную нам информацию о зашифрованных данных в надежде, что кто-то найдет решение и сможет раскрыть секрет. Мы просим всех, кто интересуется криптологией и математикой, принять участие в наших усилиях по разгадке этой тайны и расшифровке скрытого вредоносного функционала.

Контейнеры

На зараженных USB-носителях присутствуют два файла, содержащие несколько зашифрованных секций. Файлы, носящие имена System32.dat и System32.bin, являются 32-битной и 64-битной версиями одного и того же кода. Эти файлы загружаются с зараженных носителей с использованием хорошо известного LNK-эксплойта, впервые появившегося в Stuxnet. Их главная задача – добыть как можно больше информации о системе жертвы и сохранить ее на том же носителе в файле под названием .thumbs.db. Несколько известных на сегодняшний день версий этих файлов содержат по три зашифрованных секции (одна секция кода и две секции данных).

Ключ для расшифровки этих секций генерируется динамически в зависимости от определенных свойств зараженной системы, что не позволяет извлечь содержимое секций на иных компьютерах, чем выбранные злоумышленниками для атаки.

К слову, в 64-битной версии модуля оставлена часть отладочной информации. Модуль содержит строки, используемые в отладочных сообщениях, и названия модулей:

.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

Данные

Таинственные зашифрованные данные хранятся в трех секциях:

Файлы также содержат зашифрованный ресурс «100», который, скорее всего, и является собственно вредоносным функционалом, учитывая относительно небольшой размер зашифрованных секций. Вероятнее всего, секция .exsdat содержит код, необходимый для расшифровки ресурса и выполнения его содержимого.

Алгоритм

Код, выполняющий расшифровку секций, намного сложнее алгоритмов, которые используются в обычных вредоносных программах. Ниже представлено краткое описание алгоритма:

Валидация

  1. Создать список всех записей из GetEnvironmentPathW(“Path”), используя в качестве разделителя символ «;»
  2. Дополнить список всеми записями, возвращаемыми FindFirstFileW / FindNextFileW по маске “%PROGRAMFILES%*”, где cFileName[0] > 0x007A (UNICODE ‘z’)
    Замечание: по сути, это означает конкретную программу, установленную в “%PROGRAMFILES%”, имеющую имя, начинающееся со спецсимвола, такого как “~”, как в нашем примере, или использующее кодовую страницу UNICODE для других языков, скажем, арабского или иврита, где все коды символов больше, чем 0x007A.

  3. Составить все возможные пары из элементов полученного списка.
  4. Для каждой пары добавить первую заданную соль длиной 16 байтов и вычислить MD5-хеш.


    Пример пары строк, вторая из которых начинается с “~dir”, и первой соли

  5. Вычислить MD5-хеш от хеша (т.е. hash = md5(hash) ) 10000 раз.
  6. Проверить, соответствует ли полученный MD5-хеш заданному значению. Если нет, прекратить выполнение.

Расшифровка

Секции расшифровываются в следующем порядке: .exsdat, .exrdat, .exdat

  1. Использовать пару PATH/PROGRAMFILES, использованную для вычисления «правильного» MD5-хеша валидационным кодом выше.
  2. Добавить к паре вторую заданную соль длиной 16 байтов и байты 0x15, 0x00



    Пример пары строк, вторая из которых начинается с “~dir”, и второй соли

  3. Вычислить MD5-хеш полученного буфера.
  4. Вычислить MD5-хеш хеша (т.е. hash = md5(hash) ) 10000 раз.
  5. Вычислить RC4-ключ на основе полученного хеша, используя функцию WinAPI CryptDeriveKey(hProv, CALG_RC4, hBaseData, 0, &hKey).
  6. Расшифровать секцию (RC4), используя первый DWORD секции как длину расшифровываемого буфера, при этом зашифрованный буфер начинается со смещения 4 от начала секции.
  7. Сравнить DWORD в расшифрованном буфере на позиции 0 или 7 с магическим значением “0x20332137”. Продолжить только в случае, если хотя бы один из DWORD совпадает.
  8. Увеличить последний WORD в буфере пара+соль (первоначальное значение 0x0015) на 1.
  9. Расшифровать следующую секцию, goto 3.

После расшифровки всех секций: вызвать функцию в начале секции .exsdat.

Пример данных для проверки алгоритма:

Пара строк получается путем их склеивания. Строки и соль в буфере не разделяются какими-либо символами.

Тестовые строки, в Unicode (без кавычек):

  • “C:Documents and SettingsjohnLocal SettingsApplication DataGoogleChromeApplication”
  • “~dir1”

Первая соль, hex-дамп: 97 48 6C AA 22 5F E8 77 C0 35 CC 03 73 23 6D 51
MD5 на шаге 6 валидации: 76405ce7f4e75e352c1cd4d9aeb6be41
Вторая соль, hex-дамп: BB 49 4E 77 F9 25 EE C0 3B 89 FC ED C2 22 4A 21
MD5 на шаге 5 расшифровки: 00916031b3e9513044436ee42b6aa273

Примите участие в поиске ответа

Мы безуспешно перепробовали миллионы комбинаций известных имен в %PROGRAMFILES% и Path. Наличие проверки первого символа имен файлов в папке %PROGRAMFILES% показывает, что злоумышленники ищут совершенно конкретную программу, имя которой записано в расширенном наборе символов, например, используемом в арабском языке или иврите, или начинается со спецсимвола, например, “~”.

Конечно, очевидно, что этот шифр невозможно сломать с помощью простого перебора. Мы приглашаем всех, кого интересует задача взлома шифра и расшифровки загадочного вредоносного функционала, присоединиться к нам.

Секция ресурсов достаточно велика, чтобы содержать код целевой атаки, подобный примененной в Stuxnet атаке на SCADA-систему, а использованные авторами меры предосторожности свидетельствуют о том, что цель у этой атаки действительно чрезвычайно значимая.

Ниже мы приводим первые 32 байта зашифрованных данных и хеши для известных вариантов модулей. Если вы специалист по криптографии мирового класса или можете помочь нам в расшифровке, пожалуйста, напишите нам на электронный адрес: theflame@kaspersky.com.

Исходные данные

Ниже представлены hex-дампы до 32 первых байтов из начала каждой зашифрованной секции, не считая DWORD, в котором записана длина зашифрованного буфера. Пожалуйста, напишите нам на электронный адрес theflame@kaspersky.com, если вам требуются дополнительные фрагменты зашифрованных данных..

Образец 56e4fb972828fafbbdc11158a1b5fa72
Salt 1 97 48 6C AA 22 5F E8 77 C0 35 CC 03 73 23 6D 51
Reference MD5 758EA09A147DCBCAD6BD558BE30774DE
Salt 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

Образец 695056ffacef1fdaa326d7c8bb0f88ba
Salt 1 6E E3 47 2C 06 A5 C8 59 BD 16 42 D1 D4 F5 BB 3E
Reference MD5 EB2F172398261ED94C8D05216650919B
Salt 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

Образец 089d45e4c3bb60388211aa669deab26a
Salt 1 0E A5 01 D1 24 71 CD CD 0E 9E AC 6E 48 5A F9 32
Reference MD5 52DD4D6B792D84C422E6A08E4272ACB8
Salt 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

Образец 8d90e3c68030fbb91ad5b920d5e17b32
Salt 1 C3 23 4D 51 5D 52 A5 8E 81 46 FA 8A 6D 93 DF 7D
Reference MD5 53B3FAEA53CC1B90AA2C5FCF831EF9E2
Salt 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

Тайна зашифрованного вредоносного функционала Gauss

Ваш e-mail не будет опубликован. Обязательные поля помечены *

 

Отчеты

StripedFly: двуликий и незаметный

Разбираем фреймворк StripedFly для целевых атак, использовавший собственную версию эксплойта EternalBlue и успешно прикрывавшийся майнером.

Азиатские APT-группировки: тактики, техники и процедуры

Делимся с сообществом подходами, которые используют азиатские APT-группировки при взломе инфраструктуры, и подробной информацией о тактиках, техниках и процедурах (TTPs) злоумышленников, основанной на методологии MITRE ATT&CK.

Как поймать «Триангуляцию»

Эксперты «Лаборатории Касперского» смогли получить все этапы «Операции Триангуляция»: эксплойты нулевого дня для iOS, валидаторы, имплант TriangleDB и дополнительные модули.

Подпишитесь на еженедельную рассылку

Самая актуальная аналитика – в вашем почтовом ящике