Анализ упакованного образца Agent Tesla

Объект

Для анализа был предоставлен следующий файл:

  • OUTSTANDING STATEMENT.xlz.exe

A24BF02CE43A846463532E46211962EC7E883E682ABBDE61F922FCD46FC301BC

Общее описание

В декабре 2020 года вредоносное программное обеспечение было направлено на корпоративную почту АО «Центр развития трудовых ресурсов», которая является нашим клиентом и использует систему tLab. Данное вредоносное ПО не обнаруживалось антивирусным программным обеспечением на статическом, сигнатурном уровне, однако наша система tLab обнаружила данную угрозу на поведенческом и эвристическом уровнях.

По результатам первичной оценки, в рамках технической поддержки системы tLab, данный образец был предоставлен нам для глубокого ручного анализа (reverse engineering) в недрах нашей вирусной лаборатории.

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

Позже данный факт был опубликован в АО «Центр развития трудовых ресурсов»

Мы провели динамический и статический анализ данного образца в системе tLab. Анализ показал, что образец является шпионским ПО и отвечает за сбор конфиденциальных данных пользователя (жертвы), таких как: аутентификационные данные веб ресурсов (браузера), vpn, ftp и email клиентов. Исходя из характера данной атаки (не массовость), ее можно отнести к целевой.

В ходе ручного анализа мы также нашли много схожих характеристик с вредоносным ПО AgentTesla.

Agent Tesla — это вредоносное ПО, используемое для шпионажа. Agent Tesla был известен с 2014 года и в последние два три года наблюдается рост количества заражений. Обычно распространяется с помощью фишинговых писем.

Общая схема работы образца OUTSTANDING STATEMENT.xlz.exe

На первой стадии, исследуемый образец распаковывает ресурс под именем dx, который является url-encoded base64 строкой. В результате получается PE файл.

Во второй стадии, библиотека использует второй ресурс под именем hLuPu.png, преобразовывает его в массив байт. Далее выполняется операция xor с заранее известным ключом и в результате получается gzip архив, который содержит вредоносную нагрузку.

На третьей стадии происходит внедрение вредоносного кода в целевой процесс.

Анализ

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

Образец содержит несколько визуальных форм, с помощью которых злоумышленники маскировали наличие вредоносного функционала

При запуске программы, в методе Main(), создается форма StudentScores

Управление передается на функцию инициализации формы

Далее вызывается функция wx() c основным вредоносным функционалом

Функция wx() раскодирует файл с именем dx из ресурсов и выполняет метод Buta.

Всего, в ресурсах вредоносного ПО находится три файла

dx - это URL-encoded строка в формате Base 64

Остальные два файла имеют расширение png и содержат закодированную информацию. Файл с именем q

Файл с именем hLuPu

Данный способ кодирования информации в графических изображениях называется - стеганография. С помощью алгоритма в коде вредоносного ПО мы раскодировали файл dx. В результате, он представляет из себя PE файл.
Быстро определить формат файла можно по первым нескольким байтам, в нашем случае байты 4D 5A сигнализирует о том, что файл имеет формат PE

Данный PE файл является динамической библиотекой написанной на C#. Библиотека обфусцирована с помощью Deep Sea 4.1. В ней мы находим вызываемый метод Buta

В метод Buta передается объект, в качестве аргумента

SoapDate это класс, с двумя строками, одна из которых совпадает с именем png файла в ресурсах первого файла

Код метода Buta

Алгоритм работы метода Buta:

  • В начале выполняется sleep на 41.5 секунд
  • Ресурс hLuPu превращается в Bitmap объект

  • Bitmap декодируется в массив байтов. Данный способ декодирования полезной нагрузки описан в статье Commodity .NET Packers use Embedded Images to Hide Payloads следуя которой мы можем однозначно идентифицировать, что данный образец использует упаковщик “Cyax”. Суть алгоритма в использовании RGB модели PNG изображения и формирование соответствующего ей байтового массива.

  • Получившийся в результате массив байтов декодируется функцией xor, ключом wNspdaa

  • Получившийся архив распаковывается алгоритмом gzip и в результате получается конечная полезная нагрузка

  • В полезной нагрузке запускается функция, которая является входной точкой

Для автоматизации процесса извлечения полезной нагрузки, нами был написан следующий скрипт:

using System;

using System.Drawing;

using System.Collections.Generic;

using System.IO;

using System.IO.Compression;

using System.Reflection;

using System.Text;

namespace Outstanding

{

    class Program

    {

        static void Main(string[] args)

        {

            Bitmap bitmap = (Bitmap) Bitmap.FromFile(@"hLuPu.png");

            byte[] bitmap_arr = smethod_0(bitmap);

            byte[] bitmap_decoded = decode(bitmap_arr, "wNspdaa");

            byte[] payload = getPayload(bitmap_decoded);

            File.WriteAllBytes("payload", bitmap_decoded);

        }

        public static byte[] getPayload(byte[] bitmap_decoded)

        {

            byte[] result;

            using (MemoryStream memoryStream = new MemoryStream(bitmap_decoded))

            {

                byte[] array = new byte[4];

                memoryStream.Read(array, 0, 4);

                int num = BitConverter.ToInt32(array, 0);

                using (GZipStream gzipStream = new GZipStream(memoryStream, CompressionMode.Decompress))

                {

                    byte[] array2 = new byte[num];

                    gzipStream.Read(array2, 0, num);

                    result = array2;

                }

            }

            return result;

        }

        private static byte[] smethod_0(Bitmap bitmap_0)

        {

            List<byte> list = new List<byte>();

            checked

            {

                int num = bitmap_0.Width - 1;

                for (int i = 0; i <= num; i++)

                {

                    int num2 = bitmap_0.Height - 1;

                    for (int j = 0; j <= num2; j++)

                    {

                        Color pixel = bitmap_0.GetPixel(i, j);

                        if (pixel != Color.FromArgb(0, 0, 0, 0))

                        {

                            list.InsertRange(list.Count, new byte[]

                            {

                                pixel.R,

                                pixel.G,

                                pixel.B

                            });

                        }

                    }

                }

                return (byte[])list.ToArray();

            }

        }

        public static byte[] decode(byte[] bitmap_arr, string key)

        {

            byte[] bytes = Encoding.ASCII.GetBytes(key);

            int num = (int)(bitmap_arr[bitmap_arr.Length - 1] ^ 112);

            byte[] array = new byte[bitmap_arr.Length + 1];

            int num2 = 0;

            for (int i = 0; i <= bitmap_arr.Length - 1; i++)

            {

                array[i] = (byte)((int)bitmap_arr[i] ^ num ^ (int)bytes[num2]);

                if (num2 == key.Length - 1)

                {

                    num2 = 0;

                }

                else

                {

                    num2++;

                }

            }

            Array.Resize<byte>(ref array, bitmap_arr.Length - 1);

            return array;

        }

    }

}

SHA256 полезной нагрузки:

DE87F049D9DC99A60D457FDAC61C332BB88F5BCFF042AA395F55BCEE4A3C17E8

Полезная нагрузка также написана на C# и содержит набор функция для внедрения кода в процесс. Для внедрения кода используется техника Process Hollowing.

Первым шагом является создание процесса RegSvcs.exe, с параметром CREATE_SUSPENDED (константа 0x00000004)

Далее, с помощью функции GetThreadContext и взятия 41 байта из результата, идет получение структуры PEB целевого процесса, которая содержит информацию о процессе.

После получения структуры PEB, происходит чтение базового адреса (ImageBaseAddress) процесса RegSvcs.exe

Перед выделением памяти в процессе, он подготавливается функцией NtUnmapViewOfSection

Функция VirtualAllocEx выделяет память для вредоносного кода внутри процесса RegSvcs.exe

Запись вредоносного кода в процесс функцией WriteProcessMemory

Запуск процесса RegSvcs.exe функцией ResumeThread

Сохранив массив байтов, который используется в качестве аргумента WriteProcessMemory, мы получим еще один PE. Функционал данного образца схож с функционалом файла описанного в статье New Agent Tesla Variant Spreading by Phishing и мы предполагаем, что он тоже является вариантом AgentTesla. Образец является стилером, написанном на C#.

SHA256 образца:

E701BED0853C2F782B0710F7895D7DCE22A58DBB0042DB56A7D9509929C8F05E

Выполнение образца AgentTesla начинается с функции D(), которая проверяет запущен ли уже стилер, чтобы предотвратить повторный запуск

Далее мусорный код, в котором несколько раз выполняется Sleep. Количество раз зависит от переданного заранее предопределенного параметра в функцию A.b.A(). Данная функция в коде встречается повсеместно

Получение имени пользователя (в данном случае имя пользователя - john)

Образец AgentTesla не использует методы закрепления в системе. Все собранные данные отправляются на сервер злоумышленников. Данное вредоносное ПО также следит за изменением буфера обмена

Получение текущего ip адреса

Основной функционал представлен в виде подобных функций

Все имена закодированы и после раскодирования мы можем увидеть пути к данным различных браузеров

Алгоритм кодирования строк находится в классе DF7A7911_002D5159_002D4174_002D9C8D_002D344C41F0E4CF. В нем определен массив байт из 12005 элементов

В конструкторе класса происходит декодирование массива, через операцию xor с его порядковым номером и ключом 0xAA

Основная функция в этом классе возвращает строку, которая конструируется переданными аргументами

Настоящие строковые значения получаются путём вызова множества схожих функций

Имея декомпилированный код, мы можем написать код, который будет декодировать строки, с помощью вызова всех функций в данном классе

В итоге мы получим файл со всеми декодированными строками

Еще один фрагмент кода по декодированию строк связанных с FTP клиентами

В системе tLab мы также можем увидеть установленное интернет соединение

T&T security предоставляет своим клиентам yara правила для каждого вредоносного файла. Yara правило для образца A24BF02CE43A846463532E46211962EC7E883E682ABBDE61F922FCD46FC301BC:

Идентификация по Yara в системе tLab

Yara правило для образца C88A66CBF00B12C88E2B970B8BC220E970E8465E56098CED24E97D42BE901B94:

Идентификация по Yara в системе tLab

Yara правило для образца DE87F049D9DC99A60D457FDAC61C332BB88F5BCFF042AA395F55BCEE4A3C17E8:

Идентификация по Yara в системе tLab

Yara правило для образца E701BED0853C2F782B0710F7895D7DCE22A58DBB0042DB56A7D9509929C8F05E:

Идентификация по Yara в системе tLab

Заключение

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