Письмо с поддельным запросом коммерческого предложения доставило LausivLoader через вложение .r01

Письмо с поддельным запросом коммерческого предложения доставило LausivLoader через вложение .r01

В конце августа в карантине почтового шлюза одной из компаний задержалось письмо, которое выглядело как обычная рабочая переписка. Отправитель выдавал себя за сотрудника известной фирмы, просил ознакомиться с приложенными требованиями и прислать стоимость оптоволоконной системы. Шлюз остановил доставку из-за вредоносного содержимого во вложении. Даже если бы фильтр не сработал, письмо всё равно не дошло бы до адресата: проверки подлинности домена отправителя оно не прошло.

Описание

Интерес представляло именно вложение. К письму прилагался архив с расширением .r01, внутри лежал файл размером около 613 килобайт. Имя файла имитировало документ с заказом на поставку для цепочки импорта, и на такую маскировку легко купиться в отделе закупок. Расширение .r01 встречается у многотомных архивов, поэтому часть фильтров пропускает его мимо внимания. К моменту публикации разбора файл определяли 28 из 55 антивирусных движков на VirusTotal, а несколько движков прямо назвали семейство, к которому относится скрипт, - LausivLoader.

Письмо из каратина

Разбор содержимого начался с очевидной странности. Сценарий на языке JavaScript открывался 450 строками комментариев со случайным набором английских слов, а оставшаяся часть в основном собирала длинные строки из мелких фрагментов. Подобное запутывание рассчитано на то, что человек устанет читать мусор и закроет файл. Ближе к концу сценария фрагменты складывались в команду, которая незаметно запускает системную консоль, а через неё - PowerShell с закодированным аргументом и скрытым окном.

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

Дальше PowerShell читает оба файла, немедленно удаляет их с диска, объединяет содержимое и расшифровывает симметричным алгоритмом, ключ для которого прописан прямо в коде. Затем данные распаковываются, и на выходе получается исполняемый файл для платформы .NET (среда исполнения от Microsoft) размером около 316 килобайт. На диск он не записывается: код загружает его в память и сразу передаёт управление. Стирание промежуточных файлов заметно мешает разбору, ведь повторно собрать цепочку вручную уже не получится.

Параллельно скрипт закрепляется в системе. Свою копию он прячет в скрытой папке внутри профиля пользователя и маскирует под компонент графического редактора. Для автозапуска создаётся задание в планировщике с именем, похожим на задачу обновления Microsoft Edge. Задание срабатывает при входе человека в систему и тихо запускает сценарий в фоновом режиме.

Второй этап тоже оказался загрузчиком. Он ищет нужные системные функции по именам, а перед запуском следующего кода пытается отключить встроенный в Windows механизм, который передаёт содержимое скриптов антивирусным движкам на проверку. Внутри спрятан ещё один исполняемый файл, и упакован он с избыточным запасом: загрузчик оставляет только каждый пятый байт длинного массива, расшифровывает остаток и получает файл примерно на 60 килобайт. Такая схема раздувает образец в пять раз и заметно усложняет автоматический разбор.

Следующая ступень добавляет к цепочке сеть. Файл обращается к внешнему серверу и скачивает изображение в формате PNG. Хитрость в том, что это настоящая картинка, а не исполняемый файл с подменённым расширением: полезная нагрузка спрятана в текстовом блоке, который формат PNG допускает для описаний и подписей. По служебной метке внутри блока загрузчик вычисляет длину данных, снимает простое посимвольное шифрование и распаковывает результат, ожидая увидеть характерное начало исполняемого файла Windows.

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

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

Индикаторы компрометации

Комментарии: 0