
Привет, Хабр! На связи команда UserGate uFactor, у нас новое исследование по кибербезопасности. В предыдущей статье мы восстанавливали удаленные журналы операционной системы Windows из оперативной памяти, в этот раз попытаемся расшифровать полезную нагрузку вредоносного программного обеспечения AgentTesla.
Для декомпиляции образцов будем использовать dnSpy, но встроенным отладчиком пользоваться не будем. Для примера выбрали следующие образцы ВПО.

Все файлы имеют формат PE и скомпилированы на платформе .NET — в этом можно убедиться с помощью программы Detect It Easy.




Стоит отметить, что разработчики ВПО AgentTesla могут размещать основные модули в интернете, впоследствии они загружаются в адресное пространство процесса либо в секции ресурсов самого файла.
Начнем с первого образца — Delivery Note Ningbo.pdf.exe. Загружаем его в dnSpy.

Итак, в этом образце основной модуль размещен в секции ресурсов. Его имя — Fwevhy. Сохраним ресурс в файл на исследовательской рабочей станции.

Просмотрим содержимое ресурса в hex-редакторе.

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

Далее, читая код, мы перемещаемся по указателям на классы и методы.



На рисунке 11 представлен алгоритм расшифровки основного модуля Fwevhy (выделен голубым). Алгоритм прост и заключается в вычитании четырех. Давайте для теста возьмем первые два байта (см. рис. 8). Байты представлены шестнадцатеричными числами: 51 − 4 = 4D, 5E − 4 = 5A. У нас получился magic number для PE-формата.
Напишем на Python сценарий для расшифровки. Математическую операцию будем производить сразу при добавлении байтов в список. Перед записью в файл преобразованных байтов отрицательные значения заменим на ff.


Переходим к следующему образцу — MBL HBL DRAFT.exe. Загружаем его в dnSpy и также видим множество ресурсов. Для исследования возьмем один из них.

Сохраним ресурс re в файл и посмотрим его содержимое в hex-редакторе.

Как видно по рисунку 16, скорее всего, если содержимое ресурса также имеет PE-формат, алгоритм расшифровки будет сложнее. Перемещаемся по принципу из первого примера и в коде находим следующее.

На рисунке 17 представлен алгоритм расшифровки ресурса re (выделен красным). Как видно, математические операции построены на количестве байт, размещенных в ресурсе. Впоследствии эти вычисления используются как индексы для основного списка и для списка XOR-ключей, а также участвуют в финальных математических операциях: в сложении, вычитании, делении и замене в основном списке старых значений новыми.
Перепишем сценарий для расшифровки.

Откроем расшифрованный файл decrypt в hex-редакторе.

Как видно по рисунке 19, ресурс re после расшифровки также имеет PE-формат.
Переходим к образцу PO-Tooling CT240230231 - CTA240714.com. Загружаем его в dnSpy

В данном образце ресурсов нет. По аналогии с предыдущими примерами, перемещаясь по коду, замечаем интересный фрагмент (см. рис. 21 — выделен голубым), отвечающий за считывание байт в массив с файла, расположенного по URL http[:]//hlag.cc/panel/uploads/Zzuzbs.vdf.

Файл Zzuzbs.vdf можно скачать, например, при помощи браузера или утилиты curl — разумеется, если он доступен.

На рисунке 22 видно, что данные, скорее всего, тоже зашифрованы. Теперь необходимо найти алгоритм расшифровки в декомпилированном коде исследуемого образца. Переходим в функцию LogAttacedRecord (на рис. 21 выделена желтым цветом) и изучаем представленный код.

На рисунке 23 представлен фрагмент кода, отвечающий за расшифровку основного модуля. Алгоритм шифрования — RC2, на это указывает выделенный красным цветом фрагмент. Также у нас есть массив, в котором хранится ключ (выделен голубым), и массив, в котором хранится вектор инициализации (выделен зеленым). Для расшифровки воспользуемся ресурсом CyberChef — это очень удобно в данном случае.
Копируем зашифрованные байты из основного модуля Zzuzbs.vdf в окно Input. Проводим поиск алгоритма RC2 Decrypt, используя окно search, и активируем его перетаскиванием в основное окно Recipe. Так как ключ и вектор инициализации представлены строками в кодировке base64 и имеется алгоритм конвертации Conver.FromBase64String [array2 = Convert.FromBase64String("kNSWTTza/qDYfr2bXhsqyg=="); array = Convert.FromBase64String("Pe9yG+Mr364=")], то в полях key и IV устанавливаем base64. Сервис автоматически расшифровывает данные, и нам остается только скачать файл.

Переходим к последнему образцу — Purchase.Doc45145884644514591597.com.exe. Загружаем его в dnSpy.

По аналогии с предыдущим исследованием читаем код и опять видим, что основной модуль будет загружен из интернета (рис. 27, выделено синим). Так как имя расширения файла — Tpxdut.wav, скачать его через браузер будет проблематично: откроется медиаплеер. Скачиваем модуль при помощи утилиты curl. Содержимое файла Tpxdut.wav, конечно же, не соответствует формату WAV (см. рис. 26).


Также на рисунке 27 голубым цветом выделен используемый алгоритм шифрования — Triple DES; зеленым выделены ключ и вектор, которые представлены в кодировке base64. Для расшифровки снова воспользуемся ресурсом CyberChef.
Копируем зашифрованные байты из основного модуля Tpxdut.wav, ищем алгоритм Triple DES Decrypt и активируем его перетаскиванием в основное окно. Ключ и вектор указываем в формате base64 — все готово, скачиваем расшифрованный модуль.

Итак, на нескольких примерах мы изучили, как можно расшифровать основной модуль AgentTesla без использования встроенного отладчика dnSpy. Конечно, в основных модулях часто применяются более сложные, кастомные алгоритмы шифрования, включая XOR-операции с битовыми сдвигами и другими методами.
Заключение
Наше исследование ВПО AgentTesla показало, что в этом вредоносе применяются разнообразные методы защиты, затрудняющие анализ кода. Основные модули полезной нагрузки размещаются в ресурсах исполняемых файлов и загружаются из интернета. Для маскировки используются простые арифметические преобразования и криптографические алгоритмы — RC2 и Triple DES.
С помощью dnSpy была выявлена структура шифрования каждого модуля:
· простое вычитание четырех из каждого байта для восстановления PE-формата;
· более сложная логика с использованием количества байт, XOR-операций и индексных вычислений;
· стандартное симметричное шифрование, успешно расшифрованное через CyberChef.
Анализ продемонстрировал, что встроенный отладчик dnSpy необязателен для извлечения полезной нагрузки — достаточно пошагового статического анализа и работы с «сырыми» данными.