Order Of Six Angles

Main Logo

Х.Р.А.М Сатаны

Home | RU | Translations | Art | Feed.xml

3 February 2022

tags: windows

ExpressБайтоебство_0

Быстрый рассказ о хламе, что скапливается в голове

0

Увидел твит

Стало интересно, малварь для турков, на момент просмотра было всего 5 детектов на вт. Почему так мало? (когда сделал скрин, стало уже 10)

В письме присылался ISO файл, внутри lnk и DLL. ISO обычно используется для избегания детектирования. lnk вызывает функцию DeleteDateConnectionPosition в DLL. Анализирую DLLы я так -

  1. Копирую в папку саму длл и файл rundll32.exe
  2. В x64dbg в commandline прописываю "D:\rundll32.exe" D:\\malware.dll,DeleteDateConnectionPosition
  3. В preference ставлю галочку Dll Entry (чтобы словить нашу длл)
  4. Кликаю F9, пока не подгрузится наша длл
  5. Как подгрузилась, ставлю брейкпоинт на нужную функцию

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

выявился одинаковый повторяющийся паттерн through бинарник, который очень похож на декодирование чегото

mov-хуюв, чтото кудато перекладывается, мне было неважно, меня привлек VirtualAlloc, стало понятно, что чтото декодируется, а потом исполняется поэтому решено было тупо промотать все до прямого вызова адреса в памяти (типа call MEMORY_ADDR). И яего нашел

Декодированые инструкции выглядили вот так

Чуть продебажил и увидел в памяти что-то похожее на PE

Хэдер у него правда MZARUH, бросающийся в глаза. Это слово попадается в yara правиле от avast, под именем cobaltstrike_beacon_encoded. Остановившись в дебагере запустил hollows_hunter, дампнул этот PE, посмотрел свойства, намеков на cobaltstrike стало больше, да и ребята подтвердили

1

Увидел твит.

2 детекта. MSI. Распаковываем его любым способом из интернета, получаем mtSilverclient.exe. Это C#. Коннектится к snapsvcvirtual[.]net (0 детектов вт). Очень подозрительно.

Мимикрирует под silverlight прогу

Код разбит по тематическим неймспейсам, например hibiscus.contention занимается связью с С2. HelpMeOut - отправка/прием данных, которые кодируются ксором

ProcessHelp класс может рассказать обо всем функционале малвари

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

интересно, почему так мало детектов? Я думаю потому что

  1. По сути делает 1 коннект к “безобидному” домену и ждет
  2. Запакован в MSI

2

Строки лежат в чистом виде, коннектится к следующим адресам

и скачивает файл в

Получается просто downloader

3

https://twitter.com/BaoshengbinCumt/status/1495578841544531968

Турла. Детектируется как Kazuar, по следующим yara правилам (1, 2) - APT_MAL_RU_Turla_Kazuar_May20_1, Kazuar. Как известно, казуар - это .NET RAT.

сэндбоксы, windows loader, парсеры проанализровать файл не могут

Раз так, откроем его в хекс редакторе, посмотрим глазами. Мы увидим, что один файл содержит внутри себя как минимум три PE (судя по хэдеру)

Разделим файл руками на 3 части, каждая будет являться PE файлом. Первый, невалидный, его не может загрузить windows loader и парсеры ругаются.

Дальше начал читать что пишет чувак по поводу структуры .NET файлов, так как они очевидно отличаются от стандартной PE. Отличаются например тем, что у .NET файлов всего 3 секции и таблица импортов и тд лежит в секции text.text вообще содержит всю CLR метадату.

PEbear с недавних пор понимает .NET файлы. У нашего файла он пустой

Короче я решил начать с того, чтобы восстановить CLI header (заголовок, описывающий .NET файл). Смотрите, секция .text валидного .NET файла должна начинаться по оффсету 0x200, и с 0x208 начинается CLI header. Я взял рандомный валидный .net файл, и сравнил с нашим казуартом

стало очевидно, что здесь вставлен огромный блоб заполненый нулям, нахрена он нужен, я незнаю, так как он рушит всю структуру и тут не нужен. Зная, что каждый cli header должен начинаться с байт 0x48 (его размер) 0x2 (константа) 0x5 (константа), сделал поиск по этим байтам дальше по файлу. Байты были найдену по смещению 0x2008, то есть файл был испорчен (хрен пойми кем и как) блобом заполненым нулями размером 0x1e00

Вырезаем этот блоб из файла. Почему он именно длиной 0x1e00? Если мы посмотрим на raw и virtualaddress секции text, то его разница как раз будет равняться 1e00

Теперь сравним валидный и нашего бедолагу в dnspy

Как видно, у нас все еще не определяются потоки и даже подпись. Потоки находятся в Metadata. Metadata RVA прописан в .NET header. Metadata header должен начинаться с константы 0x424a5342. В нашем файле сейчас 0x369A0. Что мы делаем? Мы ищем в нашем файле константу 0x424a5342 и подгоняем RVA так, чтобы он начинался с этой константы. Он становится равным - OriginalMetadata.VA - 0x1e00

У нас определились потоки и даже типы (правда коряво)

Теперь посмотрим на таблицу импортов.

У .NET должен быть 1 импорт с 1 функцией, выставляем правильно соответствующие оффсеты и получаем

entry point должен указывать на начало loader stub, который представлен байтами FF 25 00 20 40 00 или по другому jmp 0x402000. Это jump на CorExe библиотеки mscoree. Поэтому ищем эти байты у себя в файле, высчитываем RVA и заменяем.

по крайней мере теперь он запускается. И падает, что естественно

а естественно, потому что .net runtime по всей видимости не может найти код и метаданные кода (MethodDef, TypeDef, …). Мне еще удалось восстановить .reloc и .rsrc секции, но ирония в том, что они для нормальной работы не нужны. Точнее, их повреждение не мешает работе. .reloc секция всегда содержит 1 запись, это собственно говоря релокация адреса входа в функцию CorExe. Ну а в ресурсах обычно лежат два entity - ID и манифест. Попытки дальнейшего восстановления дали понять, что вручную это практически невозможно и я забил.

Несмотря на поврежденную структуру мы все еще может судить о функционале по видимым строкам в бинарнике. Как минимум таким функционалом обладает данный образец:

  1. Использование шифрования (симметричное и RSA)
  2. WMI запросы
  3. Работа с сетью (прокси, HTTPS)
  4. Process Injection/DLL injection (скорее всего для инжекта DLL в Explorer.exe)
  5. Работа с реестром
  6. Работа с файловой системой
  7. работа с XML

Внутри, бинарник содержит две DLL x86/x64. Они содержат метод проверки, заинжекчены ли они в Explorer.exe (Инжект в Explorer.exe является одним из известных индикаторов Turla Kazuar .NET)

Очень интересная деталь, под конец, я нашел, что бинарник содержит строку E73DCA6A8E53934C77A0BB669FDC383A20925866 - SHA1 хэш известного образца турлы казуар, который был загружен на ВТ 2020-05-15. То есть, этот образец использует старые и известные пейлоды

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

Вверх