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

Для декомпиляции образцов будем использовать dnSpy, но встроенным отладчиком пользоваться не будем. Для примера выбрали следующие образцы ВПО.

Рисунок 1. Исследуемые образцы AgentTesla
Рисунок 1. Исследуемые образцы AgentTesla

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

Рисунок 2. Сведения о файле Delivery Note Ningbo.pdf.exe
Рисунок 2. Сведения о файле Delivery Note Ningbo.pdf.exe
Рисунок 3. Сведения о файле MBL HBL DRAFT.exe
Рисунок 3. Сведения о файле MBL HBL DRAFT.exe
Рисунок 4. Сведения о файле PO-Tooling CT240230231 - CTA240714.com
Рисунок 4. Сведения о файле PO-Tooling CT240230231 - CTA240714.com
Рисунок 5. Сведения о файле Purchase.Doc45145884644514591597.com.exe
Рисунок 5. Сведения о файле Purchase.Doc45145884644514591597.com.exe

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

Начнем с первого образца — Delivery Note Ningbo.pdf.exe. Загружаем его в dnSpy.

Рисунок 6. Фрагмент содержимого Delivery Note Ningbo.pdf.exe
Рисунок 6. Фрагмент содержимого Delivery Note Ningbo.pdf.exe

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

Рисунок 7. Сохранение ресурса
Рисунок 7. Сохранение ресурса

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

Рисунок 8. Фрагмент содержимого ресурса Fwevhy
Рисунок 8. Фрагмент содержимого ресурса Fwevhy

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

Перейдем к анализу кода. Началом анализа является определение точки входа, и dnSpy нам ее показывает.

Рисунок 9. Точка входа
Рисунок 9. Точка входа

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

Рисунок 10. Фрагмент кода
Рисунок 10. Фрагмент кода
Рисунок 11. Фрагмент кода
Рисунок 11. Фрагмент кода
Рисунок 12. Фрагмент кода
Рисунок 12. Фрагмент кода

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

Напишем на Python сценарий для расшифровки. Математическую операцию будем производить сразу при добавлении байтов в список. Перед записью в файл преобразованных байтов отрицательные значения заменим на ff.

Рисунок 13. Сценарий расшифровки для ресурса Fwevhy
Рисунок 13. Сценарий расшифровки для ресурса Fwevhy
Рисунок 14. Результат расшифровки ресурса Fwevhy
Рисунок 14. Результат расшифровки ресурса Fwevhy

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

Рисунок 15. Фрагмент содержимого MBL HBL DRAFT.exe
Рисунок 15. Фрагмент содержимого MBL HBL DRAFT.exe

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

Рисунок 16. Фрагмент содержимого ресурса re
Рисунок 16. Фрагмент содержимого ресурса re

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

Рисунок 17. Фрагмент кода
Рисунок 17. Фрагмент кода

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

Перепишем сценарий для расшифровки.

Рисунок 18. Код сценария расшифровки ресурса re
Рисунок 18. Код сценария расшифровки ресурса re

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

Рисунок 19. Результат расшифровки
Рисунок 19. Результат расшифровки

Как видно по рисунке 19, ресурс re после расшифровки также имеет PE-формат.

Переходим к образцу PO-Tooling CT240230231 - CTA240714.com. Загружаем его в dnSpy

Рисунок 20. Фрагмент содержимого PO-Tooling CT240230231 - CTA240714.com
Рисунок 20. Фрагмент содержимого PO-Tooling CT240230231 - CTA240714.com

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

Рисунок 21. Фрагмент кода
Рисунок 21. Фрагмент кода

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

Рисунок 22. Фрагмент содержимого модуля Zzuzbs.vdf
Рисунок 22. Фрагмент содержимого модуля Zzuzbs.vdf

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

Рисунок 23. Фрагмент кода
Рисунок 23. Фрагмент кода

На рисунке 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. Сервис автоматически расшифровывает данные, и нам остается только скачать файл.

Рисунок 24. Расшифровка модуля Zzuzbs.vdf при помощи CyberChef
Рисунок 24. Расшифровка модуля Zzuzbs.vdf при помощи CyberChef

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

Рисунок 25. Фрагмент содержимого Purchase.Doc45145884644514591597.com.exe
Рисунок 25. Фрагмент содержимого Purchase.Doc45145884644514591597.com.exe

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

Рисунок 26. Фрагмент содержимого модуля Tpxdut.wav
Рисунок 26. Фрагмент содержимого модуля Tpxdut.wav
Рисунок 27. Фрагмент кода
Рисунок 27. Фрагмент кода

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

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

Рисунок 28. Расшифровка Tpxdut.wav при помощи CyberChef
Рисунок 28. Расшифровка Tpxdut.wav при помощи CyberChef

Итак, на нескольких примерах мы изучили, как можно расшифровать основной модуль AgentTesla без использования встроенного отладчика dnSpy. Конечно, в основных модулях часто применяются более сложные, кастомные алгоритмы шифрования, включая XOR-операции с битовыми сдвигами и другими методами.

Заключение

Наше исследование ВПО AgentTesla показало, что в этом вредоносе применяются разнообразные методы защиты, затрудняющие анализ кода. Основные модули полезной нагрузки размещаются в ресурсах исполняемых файлов и загружаются из интернета. Для маскировки используются простые арифметические преобразования и криптографические алгоритмы — RC2 и Triple DES.

С помощью dnSpy была выявлена структура шифрования каждого модуля:

·        простое вычитание четырех из каждого байта для восстановления PE-формата;

·        более сложная логика с использованием количества байт, XOR-операций и индексных вычислений;

·        стандартное симметричное шифрование, успешно расшифрованное через CyberChef.

Анализ продемонстрировал, что встроенный отладчик dnSpy необязателен для извлечения полезной нагрузки — достаточно пошагового статического анализа и работы с «сырыми» данными.

Комментарии (0)