Анализ семейства троянов Agent Tesla

Общая информация

Agent Tesla – это шпионское ПО, способное похищать личные данные из веб-браузеров, почтовых клиентов и FTP-серверов. Зловред также может собирать скриншоты, видео и захватывать данные из буфера обмена. Распространение зловреда производится через-спам рассылку с использованием социальной инженерии, злоумышленники уделяют большое внимание к деталям, снабжая свои письма реальными логотипами и легитимно выглядящими подписями. Чаще всего рассылку производят от имени-отправителя резидентов англоговорящих стран. Для большей убедительности, меняются имена компаний от которых ведется рассылка и текст, отличительной чертой, данной спам-рассылки от других, является то, что авторы рассылки уделили достаточно много внимания подготовке.

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

Цель одна - заставить жертву открыть / запустить вредоносный макрос из документа, приложенного в архиве, и скачать полезную нагрузку с C2-сервера.

Анализ в системе Athena

1.1. Статический анализ

Рисунок 1. Анализ исполняемого файла антивирусными движками

Во внешнем аналитическом ресурсе «VitusTotal», в файле было обнаружено вредоносное содержимое несколькими антивирусными движками.

Рисунок 2. Анализ файла внешним аналитическим ресурсом

Во вкладке «Индикаторы» сработал индикатор «Цифровая подпись: Несовпадение контрольной суммы PE файла».

Рисунок 3. Вкладка индикаторов

Во вкладке «Источники вердикта» строится графическая карта с источниками и их вердиктами, а также общим вердиктом по исследуемому файлу.

Рисунок 4. Источники вердикта

1.2. Динамический анализ

Динамический анализ в системе Афина, выявил множество индикаторов. Среди них, отмечается событие в виде добавление пути к копии вредоносного семпла в исключения Windows Defender, что само по себе является точным признаком вредоносной активности, ведь обычные программы не станут без разрешения пользователя, добавлять свой путь в исключения EDR.

Вредоносное программное обеспечение считывает значения реестра для клиента удаленного подключения WinSCP, на что отреагировал индикатор «Исследование клиентов удаленного подключения». В том числе программа считала файл истории подключений FTP-клиента – FileZilla, об этом информирует индикатор «Кража пользовательских данных из файлов FTP-клиента». Дальше, ПО начало поиск конфигурационных файлов пользователя, из браузеров: Chrome, Comodo, Flock. Индикатор «Кража пользовательских данных из файлов почтового приложения» отреагировал на попытку ВПО считать информацию из реестра, хранящую в себе адрес электронной почты Outlook, и считало конфигурационные файлы почтового клиента Thunderbird.

О том, что ПО пыталось исследовать сторонние клиенты удаленных подключений, а также браузеров свидетельствуют индикатор «Исследование файлов других приложений».

В заключении, ПО сразу же добавило свою исполняемо копию в автозагрузки.

Рисунок 5. Индикаторы динамических событий

Среди системных программ, выявленных в процессе динамического исследования, были выявлены такие как: powershell.exe, conhost.exe, schtasks.exe:

Рисунок 6. Созданные процессы

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

Рисунок 7. Дампы

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

Рисунок 8. Содержимое файла логов

В статике, вредоносный вердикт, был вынесен за счет сигнатурного анализа с использованием антивирусов, внешнего аналитического ресурса VirusTotal, а также подозрительный вердикт вынесла «Система» из-за несоответствия вердиктов модели машинного обучения и антивирусных движков. Динамика установила вредоносный вердикт, за счет событий (кража пользовательских данных, управление Defender), и дампов файлов/процессов.

Рисунок 9. Источники вердикта

Рисунок 10. События

Исследование файла

2.1. Первичный осмотр

Для удобства извлечения динамически генерируемых модулей, и других исполняемых PE, используется онлайн сервис www.unpac.me и analyze.intezer.com. На ресурсе www.unpac.me, в процессе динамической распаковки, удалось извлечь четыре PE, среди которых три DLL и один EXE, не считая собственной копии вредоноса, которую он помещает по пути C:\Users\ \AppData\Roaming\lluLbfyDcd.exe:

Рисунок 11. Динамически сгенерированные модули

Если прогнать через www.unpac.me файл bddff1ee-8667-474d-b470-167aea1af3de.exe мы сможем увидеть учетную запись от SMTP-сервера злоумышленника:

Рисунок 12. Эксфильтрованные SMTP кредо

На почтовом ящике, судя по частоте отправки некоторых писем, можно найти реальные данные злоумышленника:

Рисунок 13. Переписка злоумышленника

Так выглядят учётные данные на почтовом сервере злоумышленника, которые зловред отправляет ему, используя доступ к его почтовому ящику, из всех входящих сообщений 1/3 являются учетными данными присланные от вредоносного ПО для доступа к чужим учетным данным:

Рисунок 14. Украденные данные жертв

Можно найти архивы с cookie-файлами от браузеров Firefox и Chrome которые зловред украла с другого компьютера:

Рисунок 15. Архив с cookie жертвы

Рисунок 16. Распакованные cookie жертвы

На analyze.intezer.com можно увидеть, куда вредоносное ПО делает запросы.

Рисунок 17. Сетевые запросы ВПО

2.2. Статический анализ и отладка

В метаданных, можно увидеть оригинальное название файла как EEna.exe. Detect It Easy показывает, что вредоносное ПО разработано, с использованием платформы .NET на языке C#, является 32-х разрядной, весит относительно немного и обфусцированна/упакована неизвестным протектором:

Рисунок 18. Анализ в DIE

Среди ресурсов было найдено два изображения, PNG и BMP. Зловред их использует для распаковки подгружаемых DLL и EXE.

Рисунок 19. Извлеченные изображения

При просмотре строк в исходнике, можно найти имя компьютера, возможно принадлежащего автору сборки данного вредоносного ПО - DESKTOP-G2JV1IG.

Рисунок 20. Строка с именем компьютера

Также была найдена строка, с использованием C#-класса Bitmap, используемая для работы с полученными изображениями, извлечения DLL и EXE.

Рисунок 21. Строка с использованием класса Bitmap

Открыв бинарный файл CLI вредоноса, видно, что в точке входа инициализируется объект класса AboutBox, и для него запускается цикл обработки сообщений приложения в текущем потоке.

Отлаживая AboutBox1, наблюдается подозрительный цикл c инициализацией объекта Bitmap и массив «b» размером 26624 байта, сохранив дамп данного массива в “Dump_Malware1.txt” увидим, что на самом деле, данный набор байтов представляет из себя DLL с именем Aads.dll, написанную на C# с использованием .NET. Ниже можно увидеть, как вызывается метод InvokeMember с параметром Load, для динамической загрузки извлеченной DLL.

Рисунок 22. Извлечение и загрузка Aads.dll

Далее видно, что полученное изображение Aeeee.png тот же файл что мы экстрагировали первоначально, при помощи Detect It Easy (справа), оба изображения имеют одинаковый размер по 106712 байт.

Рисунок 23. Изображения, в которых хранятся DLL

Опустившись чуть ниже, видно, что при помощи метода GetType инициализируется доступ к некоторому типу Aads.Sorts.HeapSort:

Рисунок 24. Доступ к методу Heapsort

В метод «Heapsort» класса «Aads.Sorts» передается несколько аргументов, среди которых массив с именем array с тремя другими массивами строк, это видно на строке с выполнением CreateInstance:

Рисунок 25. Массив инициализации Headpsort

Перейдя на отладку Aads.dll можно заметить, что в самом начале выполняется метод Dodge в который как раз и передаются три аргумента, в нем же видно, как выполняется sleep на 34.6 секунд, после чего происходит распаковка и загрузка ReactionDiffusion и инициализация типа ReactionVessel, итоговым результатом данных действий, является распакованный динамический модуль Tyrone.dll, код которого сохраняется в динамическом 8-ми битном массиве array:

Рисунок 26. Инициализация ReactionVessel

В методе LowestBreakIteration, видно, что подгружаются данные из секции ресурсов Interface.Properties.Resources.

Рисунок 27. Доступ к ресурсам с изображением ldqt

Рисунок 28. Изображение ldqt в разделе ресурсов

Так в декомпиляторе dnSpy выглядит изображение, из которого будет извлечен динамический модуль Tyrone.dll:

Рисунок 29. Изображение ldqt

Рисунок 30. Массив array

Извлеченные бинарные данные являются очередной динамической 32-х разрядной библиотекой, в метаданных видно, что авторские права пренадлежат некой компании Zephyr LTD, что скорее всего является дезинформацией, оригинальное имя библиотеки отображается как Tyrone.dll:

Рисунок 31. Выгруженный Tyrone.dll

Рисунок 32. Загруженный модуль Tyrone.dll

Далее поток выполняет код из библиотеки Aads.dll:

Рисунок 33. Обфусцированный метод из Aads.dll

Инициализируется объект типа Assembly, с передачей параметров из-за обфускации кода, объект, принадлежит Tyrone.dll:

Рисунок 34. Объект типа #E

Метод #co принимает объект #E, на основе класса Assembly, для загрузки динамического кода, и доступа к необходимому типу:

Рисунок 35. Доступ к классу sPD5DWZ6OayEIkPNA8

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

Рисунок 36. Класс sPD5DWZ6OayElkPNA8

Далее определяется указатель на метод 77pv5SbRQ и переход в область этой функции::

Рисунок 37. Доступ к методу 77pv5SbRQ

Рисунок 38. Тело метода 77pv5SbRQ

Далее в папку Appdata/Roaming загружается тот же вредоносный .exe:

Рисунок 39. Тело lluLbfyDcd.exe в папке Roaming

В метаданных, оригинальное имя файла lluLbfyDcd.exe отображается как EEna.exe. В процессе отладки попадаем в метод, который загружает обфусцированный xml-документ:

Рисунок 40. XML-документ

Далее инициализируется ряд параметров для создания задачи в планировщике задач, вредоносного процесса lluLbfyDcd.exe, путь до исполняемого PE прописывается в <Exec><Command>.

AllowStartOnDemand – указывает что задачу можно запустить с помощью команды Выполнить или контекстного меню.

Enabled - указывает, что задача включена. Задача может быть выполнена только в том случае, если этот параметр имеет значение «True».

Hidden - указывает, что задача не будет отображаться в пользовательском интерфейсе по умолчанию.

RunOnlyIfIdle - указывает, что задача выполняется только в том случае, если компьютер находится в состоянии простоя.

WakeToRun - указывает, что планировщик задач разбудит компьютер при выполнении задачи.

ExecutionTimeLimit - количество времени, затраченное на выполнение задачи (в моем случае PT0S, что означает ноль секунд, т.е. сразу).

Priority - указывает уровень приоритета для задачи.

Также видно, как создается tmpE2EC.tmp в папку Local\Temp, для записи в неё данных, в виде пути к расположению файла tmpE2EC.tmp и xml-данные пользователя c параметрами для запуска lluLbfyDcd.exe:

Рисунок 41. XML-файл tmpE2EC.tmp

Происходит формирование командной строки для вызова утилиты schtasks.exe с передачей аргументов:

Рисунок 42. Создание задачи в планировщике

Команда целиком выглядит следующим образом:

При помощи schtasks создается планирование новой задачи с передачей имени задачи и путь до xml-данных. После инициализации объекта с информацией для запуска задачи, происходит её запуск, с передачей аргумента Process.WindowStyle.Hidden указывая на то, что процесс нужно запустить со скрытым окном:

Рисунок 43. Планирование и запуск задачи

В планировщике задач, в Updates, видно новую задачу lluLbfyDcd готовую к запуску:

Рисунок 44. Задача в планировщике задач

Создается экземпляр процесса lluLbfyDcd и удаляет tmpE2EC.tmp c XML-данными для запуска процесса:

Рисунок 45. Функции запуска процесса и удаление XML-файла

Далее выполняются обфусцированные методы, и возвращается массив размером 172 032 байта (165 Кб на диске):

Рисунок 46. Массив с содержимым PE (EXE) файла

Данный массив представляет собой бинарный файл CLI-PE, он же bddff1ee-8667-474d-b470-167aea1af3de.exe, полученный в самом начале на веб-ресурсе www.unpack.me:

Рисунок 47. Копирование данных из одного массива в другой

Извлекается хеш-таблица пространства имен для работы с HTTP-запросами:

Рисунок 48. Хеш-таблица пространства имен

Данные массива деобфусцируются в бинарный PE-файл, с использованием ключа stoiqWvsa, который хранится в массиве array:

Рисунок 49. Расшифровка массива

Дамп массива, открытый в Detect It Easy, показывает, что он является исполняемым PE созданным при помощи .NET и C#:

Рисунок 50. Дамп массива в Detect It Easy

Далее вызывается метод GetRuntimeDirectory и возвращается директория в которой установлен CLR, после чего считываются данные из GetRuntimeDirectory() + Config\machine.config:

Рисунок 51. Дамп массива в Detect It Easy

Рассмотрим работу бинарного файл CLI c оригинальным именем bddff1ee-8667-474d-b470-167aea1af3de.exe, выполняющего функции передачи данных пользователя. В процессе отладки, видно, как вредоносное ПО извлекает системную информацию:

Рисунок 52. Системная информация

Для GET-запроса по HTTP на api.ipify.org используется класс HttpWebRequest:

Рисунок 53. Использование класса HttpWebRequest

Делается это для того, чтобы определить ip-адрес зараженной машины в глобальной сети. Среди сформированных полей HTTP-заголовка, можно найти такие значения как: время ожидания (timeout) в миллисекундах, поле if-modified-since, тип запроса (GET), юзерагент (UserAgent), длину контента и ряд других полей, сформированных для осуществления HTTP-запроса на этот домен:

Рисунок 54. Заголовки HTTP запроса на api.ipify.org

Чтобы в процессе отслеживать то, как будет вести себя зловред, самостоятельно был изменен возвращаемый ответ от inetsim, в итоге зловред получает подменный ip-адрес (100.100.100.100).

Рисунок 55. Вредоносное ПО получает подменный ip

Создается таймер для повтора отправки запроса:

Рисунок 56. Метод с использованием таймера

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

Рисунок 57. Использование таймера с задержкой в 20 минут

Используется вызов Clipboard.GetText для копирования содержимого из буфера обмена. Ниже демонстрируется текст, который был самостоятельно специально скопирован в буфер обмена, и вызов данной функции:

Рисунок 58. Метод GetText

Обрабатывает символы для отправки содержимого в html:

Рисунок 59. Копирование содержимого буфера обмена

Далее формируется список дерикторий для проверки 29-ти источников на компьютере жертвы:

Рисунок 60. Формирование строк с директориями браузеров

Рисунок 61. Наименования сервисов

С помощью ПО Wireshark видно как осуществляются DNS запросы на api.ipify.org и checkappexec.microsoft.com:

Рисунок 62. Сетевой трафик в Wireshark

С помощью ПО Wireshark видно как осуществляются DNS запросы на api.ipify.org и checkappexec.microsoft.com:

Информация о компрометации