Что такое DarkGate
DarkGate — вредоносное ПО, которое реализует функциональность загрузчика, стилера и RAT. Таким образом, оно представляет собой комплексный тулкит для кражи различной информации, удаленного управления зараженным хостом, майнинга криптовалюты. Интересно, что разработчик позиционирует DarkGate как загрузчик. Но в то же время это ВПО предоставляет богатый набор инструментов для заражения, закрепления на зараженном хосте, повышения привилегий, кражи учетных и других данных, а также является полноценным трояном удаленного доступа. В итоге DarkGate может использоваться в любой противоправной деятельности, в частности в распространении программ-вымогателей или в кибершпионаже.
История появления DarkGate и методы его распространения
Стоит остановиться подробнее на том, почему вообще DarkGate начал фигурировать в отчетах и сообщениях исследователей. Дело в том, что cразу после того, как ФБР в августе 2023 года ликвидировало инфраструктуру QakBot, независимые исследователи и компании начали обращать внимание на рост заражений с использованием PikaBot и DarkGate. Распространенная точка зрения по поводу того, почему так произошло, следующая: клиенты и крупные операторы QakBot, чтобы избежать простоя, сразу после этих событий начали искать замену своему почившему инструменту, так что DarkGate и PikaBot попытались заполнить эту нишу. Соответственно, и основной способ распространения был унаследован от QakBot: им стал фишинг.
Отдельно отметим, что очевидной связи между DarkGate, QakBot или PikaBot нет. Кроме того, реверс-инжиниринг экземпляров этих семейств ВПО также не выявил никаких сходств.
По информации Cofense, летом текущего года количество вредоносных писем, распространяющих DarkGate, значительно увеличилось, а в октябре 2023 года злоумышленники перешли к использованию PikaBot в качестве основной полезной нагрузки.
Кто разрабатывает DarkGate
Объявление о сдаче в аренду ВПО под названием DarkGate Loader было размещено в закрытом разделе одного из известных русскоязычных подпольных форумов. Со слов продавца, он создавал это ВПО с 2017 года. Разработка заняла к моменту продажи не менее 20 000 часов. Интересный момент: продавец заявлял о том, что не собирается сдавать в аренду ВПО более чем 10 клиентам, позиционируя его как приватное. Продавец указывал следующие расценки:
1000 $ за набор ПО для теста (1 day package).
15 000 $ ежемесячно.
Через некоторое время «разработчик» удалил тред на форуме, предположительно набрав 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 hijacking, поэтому в библиотеке есть несколько экспортных функций, таких как UnityMain
, DebugCreate
, KSInit
и т. д., что соответствует функциям из Unity, dbghelp.dll
и продукта KeyScrambler Pro. Так или иначе все они сводятся к одной и той же функции — KSFFInit
.
Эта функция вызывается из DllEntryPoint
.
Функция загружает из DLL-файла ресурс с названием ResA
. При открытии этого ресурса нас встречает большая Base64-строка (так кажется на первый взгляд). Но, если попытаться декодировать стандартным словарем, ничего не получится. И мы приходим к одному из основных методов шифрования в DarkGate — кастомным Base64-маппингам. Сам ресурс разделен словом splitres.
В результате разделение происходит на три разные части, каждая из которых обозначает следующее:
Base64-маппинг для расшифровки остальных частей.
Данные, которые пойдут в файл
C:\tmpp\test.au3
.Данные, которые пойдут в файл
C:\tmpp\Autoit3.exe
.
Интересно, что Base64-маппинг был перемешан с использованием алгоритма из Delphi. После этого управление передается скрипту test.au3
.
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
Посмотрим, как выглядит этот адрес:
Подмечаем строку This program must be run under Win32
, что намекает нам на DOS Stub. При этом конкретно эта строка вшивается в DOS Stub, если используется Delphi, однако об этом немного позже. Но где MZ
? dec ebp
и pop edx
транслируются ассемблером в 2 байта 4d5a
, что, если перевести из HEX-формата, как раз и является MZ
. Теперь можно смотреть не шелл-код, а полноценный PE-файл.
В процессе изучения PE-файла замечаем следующий псевдокод:
На данном этапе появилось понимание, что мы столкнулись с Delphi. Возможно, мы имеем дело с пакером, разработанным на Delphi. Сама нагрузка делает следующее:
Читает файл
C:\tmpp\test.au3
.Разбивает содержимое файла подстрокой
AU3!EA06
, берет третью подстроку.Берет первые восемь символов — XOR-ключ для расшифровки.
Расшифровывает все, что идет дальше, XOR-ключом.
В результате создается PE-файл. Так это выглядит в самом AU3-файле.
Так можно получить сам DarkGate.
Язык разработки
Как мы упоминали ранее, у нас фигурирует Delphi. В результате исследования выяснилось, что на Delphi написан и сам DarkGate. На это указывают некоторые строки, например TStringList
или THandleStream
. Также для Delphi/Pascal характерно использование TEB и выполнение следующей последовательности инструкций.
Конечно, реверсить Delphi могло бы быть весьма неприятно, если бы не было IDR, который содержит в себе полноценные базы для различных версий Delphi, а также позволяет загрузить метадату в базу IDA PRO. Таким образом, имея названия большинства библиотечных функций и некоторые структуры, процесс реверса можно сильно упростить. Об этом также читайте в подробном материале.
Кастомное шифрование общения с C2
Любой распространенный RAT или стилер шифрует свое общение с C2 каким-либо способом. Что же использует DarkGate? AES? Salsa20? Может быть, RC4? Нет, нет и нет. Base64. Для многих это алгоритм, которым можно передать бинарные данные в alphanumeric-формате, а для DarkGate это действительно алгоритм шифрования общения. Рассмотрим, как создатели ВПО это реализовали. В детальном материале мы описали алгоритм создания ключа, здесь же коротко его опишем.
Приведенный ниже псевдокод отвечает за сбор информации о компьютере.
ВПО извлекает следующую информацию:
Версия операционной системы. Используется путь реестра
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
. Берутся ключиProductName
,CSDVersion
иCurrentBuildNumber
.ProductId
из того же пути, что и версия операционной системы.Имя процессора и количество ядер.
Имя пользователя, от имени которого запущен DarkGate.
Сетевое имя компьютера.
Затем строки конкатенируются в следующем порядке: <Имя пользователя><Сетевое имя><ProductId><Имя процессора и количество ядер>
. Берется модифицированный MD5 (информация о том, как он модифицирован, и Python-скрипт, который считает MD5 так же, как и DarkGate, представлены в подробном анализе в разделе GetAgentInformation). Далее эта сумма превращается в HEX-строку (тоже модифицированную), и уже именно она используется для генерации ключа. Происходит этот процесс следующим образом:
Считается сумма символов HEX-строки, сгенерированной в начале функции, она будет служить сидом рандома.
Берется встроенный чарсет Base64 (
zLAxuU0kQKf3sWE7ePRO2imyg9GSpVoYC6rhlX48ZHnvjJDBNFtMd1I5acwbqT+=
), и происходит его перемешивание.
Выполняется кодирование данных с этим чарсетом, и получается своего рода защищенный канал.
Заключение
Мы наблюдаем, как ранее широко распространенные инструменты становятся неактуальными, а им на смену приходят новые игроки, о которых, вероятно, мы услышим в будущем. Стоит отметить, что по большей части рынок вредоносного ПО живет по законам рыночной экономики. Такие события, как остановка ботнетов QakBot и Emotet, несомненно, ведут к появлению новых инструментов и акторов, эта ниша быстро наполняется новым, ранее неизвестным широкой публике ВПО.