• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья BAZARLOADER: Анализ основного загрузчика

yashechka

Генератор контента.Фанат Ильфака и Рикардо Нарвахи
Эксперт
Регистрация
24.11.2012
Сообщения
2 344
Реакции
3 563
Этот пост является продолжением предыдущей статьи. Ели вам интересно, как распаковать стейджер этой вредоносной программы, вы можете проверить это здесь. ( https://www.0ffset.net/reverse-engineering/bazarloader-iso-file-infection/)

В этом посте мы рассмотрим последний этап этого загрузчика, который имеет возможность загружать и выполнять удаленные полезные нагрузки, такие как Cobalt Strike. Чтобы продолжить, вы можете получить образец, а также файлы PCAP для него на Malware-Traffic-Analysis.net. (https://www.malware-traffic-analysis.net/2022/02/07/index.html)

Шаг 1. Проверка системных языков

Подобно многим вредоносным программам, BAZARLOADER вручную проверяет языки системы, чтобы избежать запуска на машинах в России и соседних странах.

Он вызывает GetSystemDefaultLangID для получения языка системы по умолчанию и GetKeyboardLayoutList для перебора системных раскладок клавиатуры.

1656623645019.png



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

Если идентификатор языка больше 0x43 или меньше 0x18, он считается действительным, и BAZARLOADER продолжает его выполнение.

Если он находится в диапазоне от 0x18 до 0x43, разница между идентификатором языка и 0x18 используется как индекс проверяемого бита в битовой маске.

Битовая маска, которую использует BAZARLOADER, — 0xD8080190C03, что равно 11011000000010000000000110010000110000000011 в двоичном виде. Первый бит битовой маски проверяется, если идентификатор языка равен 0x18. Второй бит проверяется, если идентификатор языка равен 0x19 и так далее…

1656623657249.png



Ниже приведен список всех языков из битовой маски, которые вредоносная программа избегает.

1656623667456.png


Шаг 2: Однократный мьютекс

Чтобы проверить наличие нескольких запущенных экземпляров самого себя, BAZARLOADER сначала извлекает субавторитет SID из своего процесса. Для этого он вызывает GetTokenInformation для получения уровня целостности токена процесса и вызывает GetSidSubAuthorityCount и GetSidSubAuthority для доступа к субавторитету SID.

1656623677656.png


Если дочерним органом SID является SECURITY_MANDATORY_SYSTEM_RID или SECURITY_MANDATORY_PROTECTED_PROCESS_RID, BAZARLOADER проверяет, принадлежит ли в настоящее время мьютекс "{b837ef4f-10ee-4821-ac76-2331eb32a23f}" какому-либо другому процессу, вызывая CreateMutexA.

Если это так, вредоносное ПО уничтожает себя. Однако есть небольшая ошибка с условием проверки существования объекта мьютекса, который предполагает, что он не может открыть мьютекс, когда это действительно удается.

1656623688198.png


После этого вредоносное ПО разрешает строку "{0caa6ebb-cf78-4b01-9b0b-51032c9120ce}" и пытается создать мьютекс с таким именем.

1656623698782.png


Если этот объект мьютекса уже существует, вредоносная программа также завершает свою работу.

Если дочерним органом SID является не SECURITY_MANDATORY_SYSTEM_RID или SECURITY_MANDATORY_PROTECTED_PROCESS_RID, BAZARLOADER по-прежнему использует эти два имени мьютекса, но добавляет перед ними строку "Global\". Это проверяет наличие мьютексов в глобальном пространстве имен, а не в пространстве имен для каждого сеанса, что позволяет вредоносному ПО проверять, есть ли у него экземпляры, запущенные в сеансах других пользователей.

Шаг 4: Генерация случайного интернет-трафика

Чтобы генерировать действия в Интернете, чтобы скрыть свою связь с серверами C2, BAZARLOADER сначала вызывает InternetOpenA для инициализации использования функций WinINet со следующей строкой в качестве пользовательского агента HTTP.

1656623716787.png


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

1656623728306.png


Во-первых, BAZARLOADER вызывает InitializeCriticalSection для инициализации объекта критической секции структуры, который позже используется для защиты доступа к полю create_flag.

1656623737502.png


Затем он устанавливает поле self так, чтобы оно указывало на структуру, поле create_flag — как TRUE, и вызывает CreateThread, чтобы создать поток для выполнения этих случайных интернет-операций. Если не удается создать поток, поле create_flag устанавливается в FALSE.

1656623746921.png


Поток сначала пытается получить право собственности на объект критической секции и проверяет, включен ли флаг создания. Если это так, вредоносное ПО разрешает следующие URL-адреса как строки стека.

1656623762681.png



1656623771004.png


Затем поток входит в бесконечный цикл, чтобы начать генерировать шум трафика. Для генерации случайных чисел BAZARLOADER использует различные функции, которые вызывают Windows API BCryptGenRandom для создания заданного количества случайных байтов.

Он случайным образом выбирает один из 4 URL-адресов, перечисленных выше, случайным образом генерирует для него сегменты пути URL-адреса и объединяет их для создания полного URL-адреса.

1656623807531.png


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

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

1656623818555.png


Наконец, вредоносная программа вызывает InternetOpenURLA, чтобы установить соединение со сгенерированным URL-адресом. Он вызывает HTTPQueryInfoA с флагом HTTP_QUERY_CONTENT_LENGTH для получения длины содержимого, выделяет буфер с этим размером и вызывает InternetReadFile для чтения данных с этого URL-адреса.

1656623828601.png


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

Шаг 4: Заполнение криптографической структуры

BAZARLOADER в основном использует следующую структуру для связи с серверами C2. Поля структуры будут объяснены по мере того, как мы будем анализировать код.

1656623848756.png



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

Структура может быть реконструирована, как показано ниже.

1656623860819.png


Вредоносное ПО разрешает строки "RSA" и "SHA384" и вызывает BCryptOpenAlgorithmProvider для получения дескрипторов для этих двух алгоритмов. Дескрипторы хранятся в соответствующих полях в структуре crypto_struct.

1656623873878.png


Затем он разрешает свои жестко запрограммированные большие двоичные объекты открытого и закрытого ключей RSA в памяти, чтобы импортировать соответствующие дескрипторы ключей.

1656623883198.png


Для каждого блоба ПО разрешает одну из строк "RSAFULLPRIVATEBLOB" или "«RSAPUBLICBLOB" и использует ее для указания типа большого двоичного объекта при вызове BCryptImportKeyPair для импорта соответствующего дескриптора ключа.

1656623895252.png


Наконец, он вызывает BCryptGetProperty для получения длины общедоступных и частных блоков шифрования RSA. Теперь, когда эта структура полностью заполнена, BAZARLOADER может выполнять шифрование/дешифрование RSA, а также хеширование SHA384.

Шаг 5: Соединение C2 через необработанные IP-адреса

Прежде чем связываться с серверами C2, BAZARLOADER сначала разрешает список необработанных IP-адресов и записывает их в поле C2_addr_list в основной структуре.

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

1656623908516.png


1656623919177.png


Ниже приведен список всех IP-адресов серверов C2, используемых в этом примере.

1656623929027.png


Для каждого из этих адресов вредоносное ПО пытается связаться с соответствующим сервером и загрузить исполняемый файл следующего этапа.

Чтобы установить соединение, он заполняет следующую структуру.

1656623939743.png


Вредоносное ПО вызывает InternetCrackUrlA для получения компонентов URL-адреса C2 и InternetConnectA для подключения к серверу.

1656623948495.png


Поля этой структуры подключения затем копируются в C2_connection_struct основной структуры. Здесь я не совсем уверен, почему они вместо этого просто не заполняют основную структуру.

1656623959356.png


Точно так же BAZARLOADER заполняет приведенную ниже структуру для создания HTTP-запроса к C2.Имя объекта запроса и HTTP разрешаются как "/data/service" и "GET".

1656623968920.png



1656623982363.png


HTTP-версия запроса определяется как "HTTP/1.1", и BAZARLOADER вызывает HttpOpenRequestA, чтобы создать этот запрос для сервера C2, используя полученный выше дескриптор соединения.

Он также вызывает InternetSetOptionA, чтобы установить время ожидания для получения ответа и отправки запроса на 300 секунд и время ожидания для подключения к C2 на 120 секунд.

1656623992330.png


Затем BAZARLOADER генерирует заголовок HTTP, который будет добавлен к запросу. Это делается путем вызова GetSystemTime для заполнения полей curr_system_time и datetime_string основной структуры текущими датой и временем.

Он также генерирует хэш SHA384 строки даты и времени для заполнения полей структуры datetime_string_hash и datetime_string_hash_len.

1656624002530.png


Затем BAZARLOADER подписывает сгенерированный хэш своим приватным RSA, вызывая BCryptSignHash, и использует эту хэш-подпись для произвольного создания заголовка HTTP.

Ниже приведена форма случайного заголовка HTTP.

1656624013127.png


С сгенерированным заголовком HTTP и дескриптором запроса BAZARLOADER вызывает HttpSendRequestA для отправки запроса на сервер C2 и вызывает HttpQueryInfoA для получения кода состояния.

Если код состояния не HTTP_STATUS_OK, вредоносное ПО переходит на другой адрес C2.

1656624025029.png


Если код состояния HTTP_STATUS_OK, BAZARLOADER вызывает InternetQueryDataAvailable, чтобы определить размер данных для чтения, выделяет буфер памяти в соответствии с размером и вызывает InternetReadFile для чтения полезных данных следующего этапа, пока все не будет записано в память.

1656624035083.png


Наконец, вредоносное ПО расшифровывает полезную нагрузку с помощью своего открытого ключа RSA, вызывая BCryptDecrypt, и проверяет, превышает ли размер полезной нагрузки 64 байта и содержит ли она заголовок MZ.

1656624045459.png


Шаг 6. Подключение C2 через настраиваемые URL-адреса

Если BAZARLOADER не может загрузить исполняемый файл следующего этапа с перечисленных выше IP-адресов, он пытается разрешить пользовательские домены C2 с помощью OpenNIC (https://www.opennic.org/), службы сообщества DNS, принадлежащей пользователям.

Чтобы начать запрос к API OpenNIC, вредоносное ПО сначала разрешает URL-адрес "api.opennicproject.org" и вызывает InternetConnectA для установления соединения с сайтом.

1656624059344.png


Затем он вызывает HttpOpenRequestA, чтобы создать дескриптор запроса GET с именем объекта "/geoip/?bare&ipv=4&wl=all&res=8" и отправить запрос с помощью HttpSendRequestA.

Изучив API-интерфейсы OpenNIC (https://wiki.opennic.org/api/geoip), мы можем разбить это имя объекта, чтобы увидеть, что запрашивает BAZARLOADER. Параметр "bare" запрашивает только список IP-адресов DNS-сервера, параметр "ipv" запрашивает только список серверов IPv4, параметр "wl" запрашивает только список серверов из белого списка, а параметр «res» запрашивает список 8 серверов. Только.

Чтобы проверить это, мы можем просто вставить путь ниже в браузер по нашему выбору.

1656624073334.png


Затем вредоносная программа входит в цикл для вызова InternetQueryDataAvailable и InternetReadFile для чтения 8 DNS-серверов OpenNIC в память.

1656624083241.png


Для каждого IP-адреса DNS-сервера BAZARLOADER анализирует его из строки в int и заполняет поле opennic_server_struct в основной структуре. Ниже представлена структура, используемая для хранения IP-адресов OpenNIC.

1656624092574.png


Наконец, вредоносное ПО декодирует следующие пользовательские домены C2, пытается разрешить их с помощью DNS-серверов и загружает исполняемый файл следующего этапа.

1656624101550.png


Для каждого из этих пользовательских доменов BAZARLOADER вызывает DnsQuery_A, чтобы запросить запись ресурса DNS с серверов OpenNIC для разрешения IP-адреса сервера C2.

1656624114191.png


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

1656624125532.png


Шаг 5: Инъекция через выемку подмену процесса

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

Для этой функциональности BAZARLOADER заполняет следующую структуру.

1656624138806.png


Во-первых, он проверяет, повышен ли его процесс с правами администратора. Он вызывает GetCurrentProcess и OpenProcessToken, чтобы получить собственный дескриптор токена процесса, и GetTokenInformation, чтобы получить информацию о повышении прав токена.

1656624148013.png


Если процесс не повышен, он разрешает имена следующих процессов и пытается заполнить поля структуры внедрения.

1656624158842.png


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

Чтобы заполнить поля full_exec_command и thread_curr_directory, которые содержат командную строку процесса и полный путь, BAZARLOADER сначала извлекает параметры процесса из блока среды процесса (PEB).

Чтобы получить доступ к PEB, вредоносное ПО вызывает NtQueryInformationProcess для получения адреса PEB и вызывает ReadProcessMemory для чтения PEB в память.

1656624172659.png


Затем он вызывает ReadProcessMemory для чтения параметров процесса из памяти процесса.

1656624181701.png


Со структурой параметра процесса RTL_USER_PROCESS_PARAMETERS BAZARLOADER считывает командную строку процесса и полный путь для заполнения структуры внедрения.

1656624192136.png


Точно так же он также использует параметр процесса для доступа к блоку среды браузера и записывает его в структуру внедрения.

1656624200936.png


1656624207697.png


Если BAZARLOADER имеет права администратора, вместо процесса браузера он пытается заполнить структуру инъекции процессом svchost.exe из следующей командной строки.

1656624216841.png


Затем, используя структуру инъекции, вредоносное ПО вызывает CreateProcessA, чтобы создать целевой процесс в приостановленном состоянии для выполнения очистки процесса.

1656624227109.png


Мы не будем слишком глубоко погружаться в реализацию этого процесса, так как это почти точно такая же реализация, как показано здесь.

Мы можем быстро определить, что происходит подмена процесса через вызываемые API-интерфейсы Windows. NtUnmapViewOfSection вызывается для отмены отображения и выделения памяти родителя. Затем вызываются VirtualAllocEx и WriteProcessMemory для выделения виртуальной памяти в родительском процессе и записи в нее вредоносной полезной нагрузки.

1656624238165.png


Мы также можем видеть, что вредоносное ПО перебирает заголовок родительского раздела, чтобы найти раздел ".reloc" и выполняет перемещение внедренного образа в память.

1656624247819.png


Наконец, BAZARLOADER вызывает SetThreadContext, чтобы установить новую точку входа для родительского процесса, и вызывает ResumeThread, чтобы снова возобновить родительский процесс, который выполнит внедренный исполняемый файл.

1656624257774.png


И при этом мы проанализировали, как BAZARLOADER загружает удаленный исполняемый файл и выполняет его, используя процесс очистки! Если у вас есть какие-либо вопросы относительно анализа, не стесняйтесь обращаться ко мне через Twitter.

Переведено специально для xss.pro
Автор перевода: yashechka
Источник: https://www.0ffset.net/reverse-engineering/analysing-the-main-bazarloader/
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх