В истории 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 содержит код, необходимый для расшифровки ресурса и выполнения его содержимого.
Алгоритм
Код, выполняющий расшифровку секций, намного сложнее алгоритмов, которые используются в обычных вредоносных программах. Ниже представлено краткое описание алгоритма:
Валидация
- Создать список всех записей из GetEnvironmentPathW(“Path”), используя в качестве разделителя символ «;»
- Дополнить список всеми записями, возвращаемыми FindFirstFileW / FindNextFileW по маске “%PROGRAMFILES%*”, где cFileName[0] > 0x007A (UNICODE ‘z’)
Замечание: по сути, это означает конкретную программу, установленную в “%PROGRAMFILES%”, имеющую имя, начинающееся со спецсимвола, такого как “~”, как в нашем примере, или использующее кодовую страницу UNICODE для других языков, скажем, арабского или иврита, где все коды символов больше, чем 0x007A. - Составить все возможные пары из элементов полученного списка.
- Для каждой пары добавить первую заданную соль длиной 16 байтов и вычислить MD5-хеш.
Пример пары строк, вторая из которых начинается с “~dir”, и первой соли - Вычислить MD5-хеш от хеша (т.е. hash = md5(hash) ) 10000 раз.
- Проверить, соответствует ли полученный MD5-хеш заданному значению. Если нет, прекратить выполнение.
Расшифровка
Секции расшифровываются в следующем порядке: .exsdat, .exrdat, .exdat
- Использовать пару PATH/PROGRAMFILES, использованную для вычисления «правильного» MD5-хеша валидационным кодом выше.
- Добавить к паре вторую заданную соль длиной 16 байтов и байты 0x15, 0x00
Пример пары строк, вторая из которых начинается с “~dir”, и второй соли - Вычислить MD5-хеш полученного буфера.
- Вычислить MD5-хеш хеша (т.е. hash = md5(hash) ) 10000 раз.
- Вычислить RC4-ключ на основе полученного хеша, используя функцию WinAPI CryptDeriveKey(hProv, CALG_RC4, hBaseData, 0, &hKey).
- Расшифровать секцию (RC4), используя первый DWORD секции как длину расшифровываемого буфера, при этом зашифрованный буфер начинается со смещения 4 от начала секции.
- Сравнить DWORD в расшифрованном буфере на позиции 0 или 7 с магическим значением “0x20332137”. Продолжить только в случае, если хотя бы один из DWORD совпадает.
- Увеличить последний WORD в буфере пара+соль (первоначальное значение 0x0015) на 1.
- Расшифровать следующую секцию, 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