Под капотом DarkGate: разбираем ВПО-мультитул

Что такое DarkGate

DarkGate — вредоносное ПО, которое реализует функциональность загрузчика, стилера и RAT. Таким образом, оно представляет собой комплексный тулкит для кражи различной информации, удаленного управления зараженным хостом, майнинга криптовалюты. Интересно, что разработчик позиционирует DarkGate как загрузчик. Но в то же время это ВПО предоставляет богатый набор инструментов для заражения, закрепления на зараженном хосте, повышения привилегий, кражи учетных и других данных, а также является полноценным трояном удаленного доступа. В итоге DarkGate может использоваться в любой противоправной деятельности, в частности в распространении программ-вымогателей или в кибершпионаже.

История появления DarkGate и методы его распространения

Стоит остановиться подробнее на том, почему вообще DarkGate начал фигурировать в отчетах и сообщениях исследователей. Дело в том, что cразу после того, как ФБР в августе 2023 года ликвидировало инфраструктуру QakBot, независимые исследователи и компании начали обращать внимание на рост заражений с использованием PikaBot и DarkGate. Распространенная точка зрения по поводу того, почему так произошло, следующая: клиенты и крупные операторы QakBot, чтобы избежать простоя, сразу после этих событий начали искать замену своему почившему инструменту, так что DarkGate и PikaBot попытались заполнить эту нишу. Соответственно, и основной способ распространения был унаследован от QakBot: им стал фишинг.

Отдельно отметим, что очевидной связи между DarkGate, QakBot или PikaBot нет. Кроме того, реверс-инжиниринг экземпляров этих семейств ВПО также не выявил никаких сходств.

По информации Cofense, летом текущего года количество вредоносных писем, распространяющих DarkGate, значительно увеличилось, а в октябре 2023 года злоумышленники перешли к использованию PikaBot в качестве основной полезной нагрузки.

Хакер

e32efad7754d7fb5d5e84cfdcc2abd6a.jpg

Кто разрабатывает DarkGate

Объявление о сдаче в аренду ВПО под названием DarkGate Loader было размещено в закрытом разделе одного из известных русскоязычных подпольных форумов. Со слов продавца, он создавал это ВПО с 2017 года. Разработка заняла к моменту продажи не менее 20 000 часов. Интересный момент: продавец заявлял о том, что не собирается сдавать в аренду ВПО более чем 10 клиентам, позиционируя его как приватное. Продавец указывал следующие расценки:

Через некоторое время «разработчик» удалил тред на форуме, предположительно набрав 10 партнеров в свой продукт. Однако позднее на форуме снова появился пользователь, который занимался продажей DarkGate, при этом сообщив, что «разработчик» с форума ушел окончательно, а он является лишь посредником.

Характерно, что разработчик ВПО старается затруднить использование его продукта в атаках на российские компании. Но, вопреки его стараниям, в течение 2023 года мы неоднократно видели использование DarkGate в атаках на российский бизнес. 

Что отличает DarkGate

DarkGate существенно отличается от типового ВПО, с которым аналитики сталкиваются ежедневно. Прежде всего, стоит отметить следующие характеристики DarkGate:

  • Написан на языке Delphi + wrapper для RDP на Delphi.

  • Использует кастомный пакер (unity.dll).

  • Использует кастомные маппинги Base64.

  • Имеет свою реализацию MD5 в комплекте с нестандартным шифрованием сетевого трафика.

  • Содержит большое количество сигнатурных абсолютных или относительных системных путей, используемых в работе ВПО. Их можно задействовать в качестве детектирующих правил (HWID-пути).

  • Содержит абсолютные пути, жестко закодированные в ВПО (/tmpp).

  • Имеет в скомпилированном виде большой размер (~ 500 КБ).

Процесс реверс-инжиниринга

Когда был зафиксирован рост кампаний с использованием DarkGate, наша команда получила семпл этого ВПО и приступила к реверс-инжинирингу. Впереди нас ожидало много удивительных открытий, включая способ упаковки ВПО, выбор языка разработки, кастомное шифрование и многое другое. Здесь расскажем в общих чертах, аподробные результаты реверс-инжиниринга представлены в отдельном материале на нашем сайте, который посвящен техническому анализу DarkGate.

Как выглядит процесс работы DarkGate

Читать статью →

Снятие пакера

Пакер состоит из трех частей:

  • DLL, которая распаковывает Autoit3.exe и test.au3.

  • AutoIt3-скрипт, который загружает в память шелл-код / исполняемый файл.

  • Шелл-код, который достает из AU3-файла тело DarkGate, расшифровывает его и запускает.

Рассмотрим каждую из этих частей.

DLL

Здесь используется техника DLL injection, поэтому в библиотеке есть несколько экспортных функций, таких как UnityMain,  DebugCreate,  KSInit и т. д., что соответствует функциям из Unity,  dbghelp.dll и продукта KeyScrambler Pro. Так или иначе все они сводятся к одной и той же функции — KSFFInit.

2e17755a9932d55c90e0724b5fe1b914.png

Эта функция вызывается из DllEntryPoint.

2ea533269f6f29042d5482af2696a241.png

Функция загружает из DLL-файла ресурс с названием ResA. При открытии этого ресурса нас встречает большая Base64-строка (так кажется на первый взгляд). Но, если попытаться декодировать стандартным словарем, ничего не получится. И мы приходим к одному из основных методов шифрования в DarkGate — кастомным Base64-маппингам. Сам ресурс разделен словом splitres.

91a164a4b26d52edd0e9cc34d9111e7e.png

В результате разделение происходит на три разные части, каждая из которых обозначает следующее:

  1. Base64-маппинг для расшифровки остальных частей.

  2. Данные, которые пойдут в файл C:\tmpp\test.au3.

  3. Данные, которые пойдут в файл C:\tmpp\Autoit3.exe.

Интересно, что Base64-маппинг был перемешан с использованием алгоритма из Delphi. После этого управление передается скрипту test.au3.

bcd866de9303ffe67a5422ef878172c6.png

AU3-скрипт

Сам скрипт поставляется в скомпилированном виде, и декомпилировать его не составляет труда. Для решения этой задачи мы воспользовались данным скриптом с небольшими модификациями, чтобы можно было подавать на вход не EXE-файл, а сам скрипт. Однако возникает интересная особенность: скрипт в скомпилированном виде весит 493 КБ, а скрипт, который был декомпилирован, весит 250 КБ. Это говорит о том, что декомпилировалась лишь часть скрипта. Все попытки извлечь оставшуюся часть не увенчались успехом. По мере продолжения процесса разбора ВПО станет ясно, почему так вышло. Сам скрипт не обфусцирован и выглядит следующим образом:

      Local $ZXJNIG
#NoTrayIcon
      
Local $XNJM
$MVPLXXLL = "90E9B903000000"
Local $ESBHNXGC
$MVPLXXLL &= "5472785841655A"
Local $OFBKBJJJ
...
$MVPLXXLL &= ""
Local $VTDKEDNE
Local $XZTUTDEIT
$SVAIDD = DllStructCreate ( "byte[" & 49425 & "]" )
Local $ZEJEH
If Not FileExists ( "C:\Program Files (x86)\Sophos" ) Then
	Local $JUGTJAX
	DllCall("kernel32.dll", "BOOL", "VirtualProtect", "ptr", DllStructGetPtr($svaidd), "int", 49425, "dword", 0x40, "dword*", null)
	Local $PZXPHWQ
EndIf
Local $QNVVBPPJ
DllStructSetData($svaidd, 1, BinaryToString("0x"&$MVpLXXLl))
Local $BROBKJK
DllCall("user32.dll", "int", "EnumWindows", "ptr", DllStructGetPtr($svaidd), "lparam", 0)

Стоит отметить одну деталь: DarkGate уже на этапе работы скрипта C:\tmpp\test.au3 проверяет наличие в системе антивирусного ПО, а именно Sophos. В отдельном материале с детальными результатами реверс-инжиниринга мы разобрали, какие антивирусные продукты находит DarkGate и какие действия предпринимает для борьбы с вендорами антивирусов.

Логика же скрипта тривиальна: собирается HEX-строка, которая затем загружается в память и исполняется. Таким образом, мы добрались до этапа с шелл-кодом.

Шелл-код

На этом этапе разработчик DarkGate позволяет себе слабость, а именно добавление в шелл-код самого PE-файла, который будет исполнять нагрузку. Опытные реверсеры могли уже заметить, что начало шелл-кода — 90e9b903, что соответствует следующим инструкциям:

      nop
jmp 0x3BF

Посмотрим, как выглядит этот адрес:

ffc555372e7166e849c9aef4c7984fde.png

Подмечаем строку This program must be run under Win32, что намекает нам на DOS Stub. При этом конкретно эта строка вшивается в DOS Stub, если используется Delphi, однако об этом немного позже. Но где MZ?  dec ebp и pop edx транслируются ассемблером в 2 байта 4d5a, что, если перевести из HEX-формата, как раз и является MZ. Теперь можно смотреть не шелл-код, а полноценный PE-файл.

В процессе изучения PE-файла замечаем следующий псевдокод:

36b8cb7d4b5e394079499d889ad68ba3.png

На данном этапе появилось понимание, что мы столкнулись с Delphi. Возможно, мы имеем дело с пакером, разработанным на Delphi. Сама нагрузка делает следующее:

  • Читает файл C:\tmpp\test.au3.

  • Разбивает содержимое файла подстрокой AU3!EA06, берет третью подстроку.

  • Берет первые восемь символов — XOR-ключ для расшифровки.

  • Расшифровывает все, что идет дальше, XOR-ключом.

В результате создается PE-файл. Так это выглядит в самом AU3-файле.

88a26efb9d1adab3a6b90c38d87c8840.png

Так можно получить сам DarkGate.

b08b1d29290106e635d25a2052baf412.png

Язык разработки

Как мы упоминали ранее, у нас фигурирует Delphi. В результате исследования выяснилось, что на Delphi написан и сам DarkGate. На это указывают некоторые строки, например TStringList или THandleStream. Также для Delphi/Pascal характерно использование TEB и выполнение следующей последовательности инструкций.

9ad53df6138bdd7b1d736e9dff0dd73a.png

Конечно, реверсить Delphi могло бы быть весьма неприятно, если бы не было IDR, который содержит в себе полноценные базы для различных версий Delphi, а также позволяет загрузить метадату в базу IDA PRO. Таким образом, имея названия большинства библиотечных функций и некоторые структуры, процесс реверса можно сильно упростить. Об этом также читайте в подробном материале.

Кастомное шифрование общения с C2

Любой распространенный RAT или стилер шифрует свое общение с C2 каким-либо способом. Что же использует DarkGate? AES? Salsa20? Может быть, RC4? Нет, нет и нет. Base64. Для многих это алгоритм, которым можно передать бинарные данные в alphanumeric-формате, а для DarkGate это действительно алгоритм шифрования общения. Рассмотрим, как создатели ВПО это реализовали. В детальном материале мы описали алгоритм создания ключа, здесь же коротко его опишем.

Приведенный ниже псевдокод отвечает за сбор информации о компьютере.

2b764a1555edea6263661b4d89462bd9.png

ВПО извлекает следующую информацию:

  1. Версия операционной системы. Используется путь реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion. Берутся ключи ProductName,  CSDVersion и CurrentBuildNumber.

  2. ProductId из того же пути, что и версия операционной системы.

  3. Имя процессора и количество ядер.

  4. Имя пользователя, от имени которого запущен DarkGate.

  5. Сетевое имя компьютера.

Затем строки конкатенируются в следующем порядке:  <Имя пользователя><Сетевое имя><Имя процессора и количество ядер>. Берется модифицированный MD5 (информация о том, как он модифицирован, и Python-скрипт, который считает MD5 так же, как и DarkGate, представлены в подробном анализе в разделе GetAgentInformation). Далее эта сумма превращается в HEX-строку (тоже модифицированную), и уже именно она используется для генерации ключа. Происходит этот процесс следующим образом:

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

  • Берется встроенный чарсет Base64 (zLAxuU0kQKf3sWE7ePRO2imyg9GSpVoYC6rhlX48ZHnvjJDBNFtMd1I5acwbqT+=), и происходит его перемешивание.

Выполняется кодирование данных с этим чарсетом, и получается своего рода защищенный канал.

Заключение

Мы наблюдаем, как ранее широко распространенные инструменты становятся неактуальными, а им на смену приходят новые игроки, о которых, вероятно, мы услышим в будущем. Стоит отметить, что по большей части рынок вредоносного ПО живет по законам рыночной экономики. Такие события, как остановка ботнетов QakBot и Emotet, несомненно, ведут к появлению новых инструментов и акторов, эта ниша быстро наполняется новым, ранее неизвестным широкой публике ВПО.

Habrahabr.ru прочитано 2816 раз