Вредоносные файлы-ярлыки Windows (.lnk) долгое время считались чем-то вторичным в арсенале злоумышленников. Однако практика показывает, что за этой простой точкой входа могут скрываться не только техники обхода защиты, но и ценнейшие данные об атакующем, вплоть до серийного номера его жёсткого диска. Недавний инцидент, связанный с загрузчиком на основе PowerShell и последующей доставкой бэкдора Cobalt Strike, наглядно демонстрирует эту закономерность.
Описание
Исследование началось с безобидного на первый взгляд файла - ярлыка, обнаруженного на площадке MalwareBazaar. При ближайшем рассмотрении выяснилось, что это классический загрузчик. Он выполняет удалённый PowerShell-скрипт, расположенный по адресу hxxp://120.48.85[.]228:80/favicon. Казалось бы, типичный вектор атаки. Однако при детальном изучении структуры ярлыка аналитики заметили одну странность. В большинстве случаев вредоносные .lnk-файлы, указывающие на исполняемые программы, содержат свойство "RelativePath". Здесь оно отсутствовало. Подобное часто означает, что исходная цель ярлыка была изменена вручную. Злоумышленник, скорее всего, создал файл, указывающий на другой тип документа, а уже затем подменил путь на powershell.exe.
Чтобы подтвердить эту гипотезу, специалисты обратились к данным о первоначальном имени файла. На VirusTotal образец значился как "附件:安全自查工具.lnk", что в переводе с китайского означает "Вложение: Инструмент самопроверки безопасности.lnk". Стало очевидно, что файл был переименован после создания, а жертва с высокой вероятностью говорит на китайском языке. Сообщили аналитики, счастливым случаем стало то, что файлы .lnk хранят в себе секцию ExtraData - коллекцию структур с дополнительной информацией о привязанном файле. Эти данные не обновляются при последующем редактировании ярлыка через стандартное диалоговое окно свойств Windows.
Именно в этой секции и таилась удача. В структуре PropertyStoreDataBlock обнаружилось свойство ParsingPath, которое содержало исходный путь к целевому файлу. Оказалось, что ярлык изначально указывал на документ с названием "E:\downloads\附件1:如何在个税APP上完成汇算清缴?.pdf" - это пособие по налоговым расчётам в приложении. Загадка была решена. Злоумышленник действительно взял ссылку на PDF-файл, а затем перенаправил её на вызов PowerShell. Отсутствие RelativePath объяснялось тем, что изначальная цель не была исполняемой программой.
Помимо пути к файлу, структура PropertyStoreDataBlock содержала ещё несколько ключевых улик, которые позволили составить портрет злоумышленника. Системная метка System.DateCreated указывала, что налоговая PDF-инструкция была скачана 30 июня. Свойство System.ItemTypeText, отражающее MIME-тип целевого файла, показало, что на компьютере атакующего документы формата PDF открывались в браузере Microsoft Edge. Это необычный выбор, который говорит либо о новизне системы, либо о том, что у пользователя нет других привычных средств для просмотра PDF. Наконец, значение FolderPath подтвердило, что файл был сохранён в папку "E:\下载" ("Загрузки" на китайском языке). Таким образом, язык пользователя был определён практически со стопроцентной точностью.
Но на этом сбор разведданных не закончился. Структура LinkInfo, помимо подтверждения цепочки на исполнение powershell.exe, содержала уникальный серийный номер жёсткого диска, на котором находилась эта программа на момент последнего изменения. Фактически, это был серийный номер накопителя злоумышленника. Более того, структура TrackerDataBlock раскрыла имя компьютера "desktop-31400cr" и уникальные идентификаторы DROID (Digital Record Object Identification). В их составе оказались специальные GUID, последние восемь цифр которых являлись MAC-адресом атакующего. Быстрый поиск показал, что адрес 00:50:56:C0:00:08 принадлежит сетевым интерфейсам виртуальных машин VMWare. Злоумышленник работал из виртуальной среды, что затрудняло, но не делало невозможным отслеживание. Весь этот объём информации был извлечён из простого ярлыка размером в несколько килобайт.
Следующим этапом стал анализ содержимого, которое загружал заражённый ярлык. По адресу hxxp://120.48.85[.]228:80/favicon находился PowerShell-скрипт размером около 190 КБ. На 99 процентов он состоял из одной длинной base64-строки. После декодирования и распаковки сжатого GZip-архива аналитики получили полноценный инжектор кода. Этот скрипт содержал ещё один зашифрованный base64-блок. Процедура была проста: декодировать строку, применить операцию XOR с ключом 35 для расшифровки, а затем использовать системный вызов VirtualAlloc для выделения памяти и копирования в неё вредоносного исполняемого файла.
После расшифровки перед исследователями предстал PE-файл размером 205 КБ с низкой энтропией, что указывало на отсутствие обёртки. Уже по экспорту "beacon.dll" можно было догадаться, с чем имеешь дело. Cobalt Strike - это известный инструмент для тестирования на проникновение, который, однако, активно используется настоящими преступными группами. Отличительной чертой этого бэкдора является наличие конфигурационного файла, вшитого в секцию .data. Именно в нём хранятся адреса командных серверов, ключи шифрования и другие параметры работы. Попытки извлечь эту конфигурацию при помощи стандартных утилит, таких как CobalStrikeParser от SentinelOne или 1768.py, не увенчались успехом - инструменты не смогли подобрать ключ шифрования. Аналитикам пришлось применить ручной метод.
Они искали в секции .data зашифрованные блоки данных размером в несколько сотен байт, на которые ссылался декодирующий код. Ключевым признаком было то, что после расшифровки такие блоки должны были начинаться с последовательности "00 01 00 01 00 02 00". Эта сигнатура соответствует первому параметру конфигурации - типу бэкдора. Кандидат был найден по адресу 0x10032020. Применив операцию XOR с ранее неизвестным ключом 0xe9 и выгрузив результат в новый файл, исследователи получили полную и неискажённую конфигурацию Cobalt Strike. Причина, по которой автоматические инструменты потерпели неудачу, очевидна: в их словаре ключей просто не было значения 0xe9. Это могло быть связано с использованием атакующими более новой версии инструмента или с модификацией криптографических параметров.
Данный случай - не просто очередная история о заражении через ярлык. Это наглядный пример того, что даже самый простой и привычный файл может содержать огромный массив разведывательной информации. Вместо того чтобы полагаться исключительно на автоматические средства, специалистам по информационной безопасности необходимо понимать структуру данных таких артефактов. В данном случае именно ручной анализ и статическое исследование позволили не только извлечь полезную нагрузку, но и узнать о самом злоумышленнике больше, чем он мог бы предположить, - вплоть до модели используемой виртуальной машины и серийного номера накопителя.
Индикаторы компрометации
URLs
- http://120.48.85.228:80/favicon
MD5
- e3f89049dc5f0065ee4d780f8aef9c04
SHA1
- ba5fcbdbd5b71bfc52b8a824bd40c547a7223260
SHA256
- 21286ed0b3e56f49c287617ee5bf4ef687c627e342d72297008e3fce73a5ae20
- b154b7681167bd4a61c54b543126f31d0ecca4c71846d5fe35a677c908fae3d1
- bb26724c27361a5881ebf646166423b9668fd4089cf50e4e493641d471d30fa9