Явку провалено: виводимо AgentTesla на чисту воду. Частина 3

Явку провалено: виводимо AgentTesla на чисту воду. Частина 3

Цією статтею ми завершуємо цикл публікацій, присвячених аналізу шкідливого програмного забезпечення. У першій частині ми провели детальний аналіз зараженого файлу, який отримала поштою одна європейська компанія, та виявили там шпигунську програму AgentTesla. У другій частині Описали результати поетапного аналізу основного модуля AgentTesla.

Сьогодні Ілля Померанцев, фахівець із аналізу шкідливого коду CERT Group-IB, розповість про перший етап аналізу ВПО — напівавтоматичне розпакування семплів AgentTesla на прикладі трьох міні-кейсів із практики фахівців CERT Group-IB.

Зазвичай перша стадія під час аналізу ВПО — зняття захисту як пакера, криптора, протектора чи завантажувача. У більшості випадків ця проблема вирішується запуском ВПО та виконанням дампа, проте існують ситуації, коли цей метод не підходить. Наприклад, якщо ВПО є шифрувальником, якщо воно захищає свої регіони пам'яті від дампа, якщо в коді є механізми виявлення віртуальної машини або якщо відразу після старту ВПО виконує перезавантаження. У таких випадках застосовується так зване «напівавтоматичне» розпакування, тобто дослідник повністю контролює процес і може будь-якої миті втрутитися. Розглянемо цю процедуру з прикладу трьох семплів сімейства AgentTesla. Це відносно нешкідливий ВПЗ, якщо вимкнути йому доступ до мережі.

Семпл №1

Вихідний файл – це документ MS Word, який експлуатує вразливість CVE-2017-11882.

Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
В результаті відбувається завантаження та запуск пейлоаду.

Аналіз дерева процесів та поведінкових маркерів показує інжект у процес RegAsm.exe.

Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
Є характерні для AgentTesla поведінкові маркери.

Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
Завантажений семпл - це виконуваний . NET-файл, захищений протектором Реактор .NET.

Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
Відкриємо його в утиліті dnSpy x86 і перейдемо до точки входу.

Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
Перейшовши у функцію DateTimeOffset, ми виявимо код ініціалізації нового . NET-модуля. Поставимо точка зупинки на рядку, що нас цікавить, і запустимо файл.

Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
В одному з повернутих буферів можна побачити MZ-сигнатуру (0x4D 0x5A). Зберігаємо його.

Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
Сдампленный файл — це динамічна бібліотека, яка є лоадером, тобто. витягує із секції ресурсів корисне навантаження і здійснює її запуск.

Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
При цьому самі потрібні ресурси в дампі відсутні. Вони перебувають у батьківському семпле.

Утиліта dnSpy має дві вкрай корисні функціональні можливості, які допоможуть нам досить швидко створити «франкенштейна» з двох пов'язаних файлів.

  1. Перша дозволяє «вклеїти» у батьківський семпл динамічну бібліотеку.

    Явку провалено: виводимо AgentTesla на чисту воду. Частина 3

  2. Друга – переписати код функції біля точки входу, щоб викликати потрібний метод вставленої динамічної бібліотеки.

    Явку провалено: виводимо AgentTesla на чисту воду. Частина 3

Зберігаємо нашого "франкенштейна", ставимо точка зупинки на рядку, що повертає буфер з дешифрованими ресурсами, і робимо дамп за аналогією з попереднім етапом.

Другий дамп - це написаний на VB.NET виконуваний файл, який захищений знайомим нам протектором ConfuserEx.

Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
Після зняття протектора використовуємо раніше написані YARA-правила і переконаємося в тому, що розпаковане ВПО — дійсно AgentTesla.

Явку провалено: виводимо AgentTesla на чисту воду. Частина 3

Семпл №2

Вихідний файл – документ MS Excel. До виконання шкідливого коду наводить вбудований макрос.

Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
В результаті запускається PowerShell скрипт.

Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
Скрипт дешифрує код C# і передає йому управління. Сам код є завантажувачем, що також видно зі звіту пісочниці.

Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
Корисне навантаження є виконуваним . NET-Файл.

Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
Відкривши файл у dnSpy x86, можна побачити, що він обфускований. Знімаємо обфускацію утилітою de4dot та повертаємося до аналізу.

У ході дослідження коду можна виявити таку функцію:

Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
В очі кидаються закодовані рядки Точка входу и волати. Ставимо точка зупинки на перший рядок, запускаємо та зберігаємо значення буфера байт_0.

Дамп знову є додатком на . NET та захищений ConfuserEx.

Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
Знімаємо обфускацію за допомогою de4dot і завантажуємо в dnSpy. З опису файлу розуміємо, що зіткнулися з CyaX-Sharp loader.

Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
Цей завантажувач має великий функціонал для протидії аналізу.

Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
Цей функціонал включає в себе обхід вбудованих систем захисту Windows, відключення Windows Defender, а також механізми виявлення пісочниць і віртуальних машин. Є можливість підвантажувати корисне навантаження з мережі або зберігати їх у секції ресурсів. Запуск виконується через інжект у власний процес, дублікат власного процесу або ж у процеси MSBuild.exe, vbc.exe и RegSvcs.exe залежно від вибраного зловмисником параметра.

Однак для нас вони менш суттєві, ніж AntiDump-функція, яку додає ConfuserEx. Її вихідний код можна знайти на GitHub.

Для відключення захисту скористаємося можливістю dnSpy, яка дозволяє редагувати IL-код.

Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
Зберігаємось і ставимо точка зупинки на рядок виклику функції дешифрування корисного навантаження. Вона знаходиться у конструкторі основного класу.

Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
Запускаємо та дампимо корисне навантаження. Використовуючи раніше написані YARA-правила, переконуємось, що перед нами AgentTesla.

Явку провалено: виводимо AgentTesla на чисту воду. Частина 3

Семпл №3

Вихідний файл - це виконуваний VB Native PE32-Файл.

Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
Аналіз ентропії свідчить про наявність великого фрагмента зашифрованих даних.

Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
При аналізі форми додатку VB Декомпілятор можна помітити дивне піксельне тло.

Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
Графік ентропії bmp-Малюнки ідентичний графіку ентропії вихідного файлу, а розмір становить 85% від розміру файлу.

Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
Загальний вигляд зображення свідчить про використання стеганографії.

Звернімо увагу на вид деревини процесів, а також на наявність маркера інжекта.

Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
Це говорить про виконання розпакування. Для завантажувачів на Visual Basic (вони ж VBKrypt або VBInjector) характерне використання шелл-код для ініціалізації корисного навантаження, а також для виконання самого інжекту.

Аналіз у VB Декомпілятор показав наявність події Навантаження у форми FegatassocAirballoon2.

Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
Перейдемо до IDA pro за вказаною адресою та вивчимо функцію. Код сильно обфузований. Фрагмент, який нас цікавить, наведено нижче.

Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
Тут здійснюється сканування адресного простору процесу у пошуках сигнатури. Такий підхід вкрай сумнівний.

По-перше, адреса початку сканування 0x400100. Це значення статично і коригується при зміщенні бази. В ідеальних тепличних умовах він буде вказувати на кінець PE-заголовка файлу, що виконується. Проте база не статична, її значення може змінюватися, а пошук реальної адреси сигнатури хоч і не викличе переповнення змінної, але може зайняти дуже багато часу.

По-друге, значення сигнатури iWGK. Думаю, очевидно, що 4 байти надто мало, щоб гарантувати унікальність. А якщо зважати на перший пункт, ймовірність помилитися досить висока.

Насправді потрібний фрагмент прикріплений до кінця знайденої раніше bmp-картинки зі зміщення 0xA1D0D.

Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
виконання Shell -код здійснюється у дві стадії. Перша робить дешифрування основного тіла. У цьому ключ визначається перебором.

Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
Сдампім дешифрований Shell -код і подивимося на рядки.

По-перше, тепер ми знаємо функцію створення дочірнього процесу: CreateProcessInternalW.

Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
По-друге, нам став відомим механізм закріплення в системі.

Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
Повернемося до початкового процесу. Поставимо точка зупинки на CreateProcessInternalW та продовжимо виконання. Далі спостерігаємо зв'язку NtGetContextThread/NtSetContextThreadяка змінює адресу початку виконання на адресу ShellCode.

Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
Підключаємось до створеного процесу відладчиком, активуємо подію Suspend on libraryu load/unload, відновлюємо процес і чекаємо навантаження . NET-бібліотек.

Далі за допомогою ProcessHucker дампім регіони, що містять у розпакованому вигляді . NET-додаток.

Зупиняємо всі процеси і видаляємо копію ВПО, що закріпилася в системі.

Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
Сдамплений файл захищений протектором Реактор .NET, який легко знімається за допомогою утиліти de4dot.

Явку провалено: виводимо AgentTesla на чисту воду. Частина 3
Скориставшись раніше написаними YARA-правилами, переконуємося, що перед нами AgentTesla.

Підведемо підсумок

Отже, ми детально продемонстрували процес напівавтоматичного розпакування семплів на прикладі трьох міні-кейсів, а також провели аналіз шкідливого програмного забезпечення на основі повноцінного кейсу, з'ясувавши, що досліджуваний зразок - це AgentTesla, встановивши його функціональні можливості та повний список індикаторів компрометації.

Аналіз шкідливого об'єкта, який ми провели, потребує багато часу та зусиль, і цю роботу має виконувати спеціальний співробітник у компанії, проте не всі компанії готові тримати у штаті аналітика.

Одна з послуг, яку надає Лабораторія комп'ютерної криміналістики та аналізу шкідливого коду Group-IB, — реагування на кіберінциденти. А щоб замовники не витрачали час на погодження документів та обговорення в розпал кібератаки, Group-IB запустила Фіксатор реагування на інциденти, послугу з реагування на інциденти за попередньою підпискою, що включає також етап аналізу шкідливого коду Більш детальну інформацію про це можна знайти тут.

Якщо ви хочете самі ще раз вивчити, як проводиться розпакування семплів AgentTesla, та побачити, як це робить спеціаліст CERT Group-IB, можете завантажити запис вебінару на цю тему тут.

Джерело: habr.com

Додати коментар або відгук