Анализ упакованного образца Agent Tesla
Объект
Для анализа был предоставлен следующий файл:
- OUTSTANDING STATEMENT.xlz.exe
A24BF02CE43A846463532E46211962EC7E883E682ABBDE61F922FCD46FC301BC
Общее описание
В декабре 2020 года вредоносное программное обеспечение было направлено на корпоративную почту АО «Центр развития трудовых ресурсов», которая является нашим клиентом и использует систему tLab. Данное вредоносное ПО не обнаруживалось антивирусным программным обеспечением на статическом, сигнатурном уровне, однако наша система tLab обнаружила данную угрозу на поведенческом и эвристическом уровнях.
По результатам первичной оценки, в рамках технической поддержки системы tLab, данный образец был предоставлен нам для глубокого ручного анализа (reverse engineering) в недрах нашей вирусной лаборатории.
По результатам исследования образца выяснилось, что это угроза нулевого дня. Дата создания образца совпадает с днем его обнаружения.
Позже данный факт был опубликован в АО «Центр развития трудовых ресурсов»
Мы провели динамический и статический анализ данного образца в системе tLab. Анализ показал, что образец является шпионским ПО и отвечает за сбор конфиденциальных данных пользователя (жертвы), таких как: аутентификационные данные веб ресурсов (браузера), vpn, ftp и email клиентов. Исходя из характера данной атаки (не массовость), ее можно отнести к целевой.
В ходе ручного анализа мы также нашли много схожих характеристик с вредоносным ПО AgentTesla.

Общая схема работы образца 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




Данный 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)



Получение текущего 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 довольно довольно хорошо упакован, с помощью различных способов и использует несколько стадий распаковки. Кодирование строк и стеганография делают ручной анализ затруднительным. Этот образец отличается большим списком ПО, данные которого извлекаются.