Этот пост является продолжением предыдущей статьи. Ели вам интересно, как распаковать стейджер этой вредоносной программы, вы можете проверить это здесь. ( 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 для перебора системных раскладок клавиатуры.
Для каждого из этих языков вредоносное ПО проверяет его допустимость с помощью битовой маски.
Если идентификатор языка больше 0x43 или меньше 0x18, он считается действительным, и BAZARLOADER продолжает его выполнение.
Если он находится в диапазоне от 0x18 до 0x43, разница между идентификатором языка и 0x18 используется как индекс проверяемого бита в битовой маске.
Битовая маска, которую использует BAZARLOADER, — 0xD8080190C03, что равно 11011000000010000000000110010000110000000011 в двоичном виде. Первый бит битовой маски проверяется, если идентификатор языка равен 0x18. Второй бит проверяется, если идентификатор языка равен 0x19 и так далее…
Ниже приведен список всех языков из битовой маски, которые вредоносная программа избегает.
Шаг 2: Однократный мьютекс
Чтобы проверить наличие нескольких запущенных экземпляров самого себя, BAZARLOADER сначала извлекает субавторитет SID из своего процесса. Для этого он вызывает GetTokenInformation для получения уровня целостности токена процесса и вызывает GetSidSubAuthorityCount и GetSidSubAuthority для доступа к субавторитету SID.
Если дочерним органом SID является SECURITY_MANDATORY_SYSTEM_RID или SECURITY_MANDATORY_PROTECTED_PROCESS_RID, BAZARLOADER проверяет, принадлежит ли в настоящее время мьютекс "{b837ef4f-10ee-4821-ac76-2331eb32a23f}" какому-либо другому процессу, вызывая CreateMutexA.
Если это так, вредоносное ПО уничтожает себя. Однако есть небольшая ошибка с условием проверки существования объекта мьютекса, который предполагает, что он не может открыть мьютекс, когда это действительно удается.
После этого вредоносное ПО разрешает строку "{0caa6ebb-cf78-4b01-9b0b-51032c9120ce}" и пытается создать мьютекс с таким именем.
Если этот объект мьютекса уже существует, вредоносная программа также завершает свою работу.
Если дочерним органом SID является не SECURITY_MANDATORY_SYSTEM_RID или SECURITY_MANDATORY_PROTECTED_PROCESS_RID, BAZARLOADER по-прежнему использует эти два имени мьютекса, но добавляет перед ними строку "Global\". Это проверяет наличие мьютексов в глобальном пространстве имен, а не в пространстве имен для каждого сеанса, что позволяет вредоносному ПО проверять, есть ли у него экземпляры, запущенные в сеансах других пользователей.
Шаг 4: Генерация случайного интернет-трафика
Чтобы генерировать действия в Интернете, чтобы скрыть свою связь с серверами C2, BAZARLOADER сначала вызывает InternetOpenA для инициализации использования функций WinINet со следующей строкой в качестве пользовательского агента HTTP.
Затем вредоносная программа порождает поток для периодического подключения к случайным URL-адресам и генерации шумов, чтобы скрыть основной трафик C2, используя следующую структуру.
Во-первых, BAZARLOADER вызывает InitializeCriticalSection для инициализации объекта критической секции структуры, который позже используется для защиты доступа к полю create_flag.
Затем он устанавливает поле self так, чтобы оно указывало на структуру, поле create_flag — как TRUE, и вызывает CreateThread, чтобы создать поток для выполнения этих случайных интернет-операций. Если не удается создать поток, поле create_flag устанавливается в FALSE.
Поток сначала пытается получить право собственности на объект критической секции и проверяет, включен ли флаг создания. Если это так, вредоносное ПО разрешает следующие URL-адреса как строки стека.
Затем поток входит в бесконечный цикл, чтобы начать генерировать шум трафика. Для генерации случайных чисел BAZARLOADER использует различные функции, которые вызывают Windows API BCryptGenRandom для создания заданного количества случайных байтов.
Он случайным образом выбирает один из 4 URL-адресов, перечисленных выше, случайным образом генерирует для него сегменты пути URL-адреса и объединяет их для создания полного URL-адреса.
Чтобы сгенерировать сегменты пути, функция принимает минимальное и максимальное количество сегментов пути для генерации, а также минимальную и максимальную длину для каждого сегмента пути.
Он генерирует количество сегментов пути случайным образом в заданном диапазоне. Для каждого из сегментов вредоносное ПО случайным образом генерирует строку произвольной длины в заданном диапазоне, содержащую цифры и прописные/строчные буквы.
Наконец, вредоносная программа вызывает InternetOpenURLA, чтобы установить соединение со сгенерированным URL-адресом. Он вызывает HTTPQueryInfoA с флагом HTTP_QUERY_CONTENT_LENGTH для получения длины содержимого, выделяет буфер с этим размером и вызывает InternetReadFile для чтения данных с этого URL-адреса.
Это повторяется неоднократно до тех пор, пока связь с C2 и вставка полезной нагрузки не будут завершены, что создает много шума для маскировки основного трафика, поступающего на серверы C2 и от них.
Шаг 4: Заполнение криптографической структуры
BAZARLOADER в основном использует следующую структуру для связи с серверами C2. Поля структуры будут объяснены по мере того, как мы будем анализировать код.
Во-первых, он заполняет поле crypto_struct в основной структуре. Эта структура содержит криптографические дескрипторы, которые позже используются для расшифровки исполняемых файлов, отправляемых с серверов C2.
Структура может быть реконструирована, как показано ниже.
Вредоносное ПО разрешает строки "RSA" и "SHA384" и вызывает BCryptOpenAlgorithmProvider для получения дескрипторов для этих двух алгоритмов. Дескрипторы хранятся в соответствующих полях в структуре crypto_struct.
Затем он разрешает свои жестко запрограммированные большие двоичные объекты открытого и закрытого ключей RSA в памяти, чтобы импортировать соответствующие дескрипторы ключей.
Для каждого блоба ПО разрешает одну из строк "RSAFULLPRIVATEBLOB" или "«RSAPUBLICBLOB" и использует ее для указания типа большого двоичного объекта при вызове BCryptImportKeyPair для импорта соответствующего дескриптора ключа.
Наконец, он вызывает BCryptGetProperty для получения длины общедоступных и частных блоков шифрования RSA. Теперь, когда эта структура полностью заполнена, BAZARLOADER может выполнять шифрование/дешифрование RSA, а также хеширование SHA384.
Шаг 5: Соединение C2 через необработанные IP-адреса
Прежде чем связываться с серверами C2, BAZARLOADER сначала разрешает список необработанных IP-адресов и записывает их в поле C2_addr_list в основной структуре.
Это поле представляет собой структуру, представляющую список строковых структур, каждая из которых может быть реконструирована, как показано ниже.
Ниже приведен список всех IP-адресов серверов C2, используемых в этом примере.
Для каждого из этих адресов вредоносное ПО пытается связаться с соответствующим сервером и загрузить исполняемый файл следующего этапа.
Чтобы установить соединение, он заполняет следующую структуру.
Вредоносное ПО вызывает InternetCrackUrlA для получения компонентов URL-адреса C2 и InternetConnectA для подключения к серверу.
Поля этой структуры подключения затем копируются в C2_connection_struct основной структуры. Здесь я не совсем уверен, почему они вместо этого просто не заполняют основную структуру.
Точно так же BAZARLOADER заполняет приведенную ниже структуру для создания HTTP-запроса к C2.Имя объекта запроса и HTTP разрешаются как "/data/service" и "GET".
HTTP-версия запроса определяется как "HTTP/1.1", и BAZARLOADER вызывает HttpOpenRequestA, чтобы создать этот запрос для сервера C2, используя полученный выше дескриптор соединения.
Он также вызывает InternetSetOptionA, чтобы установить время ожидания для получения ответа и отправки запроса на 300 секунд и время ожидания для подключения к C2 на 120 секунд.
Затем BAZARLOADER генерирует заголовок HTTP, который будет добавлен к запросу. Это делается путем вызова GetSystemTime для заполнения полей curr_system_time и datetime_string основной структуры текущими датой и временем.
Он также генерирует хэш SHA384 строки даты и времени для заполнения полей структуры datetime_string_hash и datetime_string_hash_len.
Затем BAZARLOADER подписывает сгенерированный хэш своим приватным RSA, вызывая BCryptSignHash, и использует эту хэш-подпись для произвольного создания заголовка HTTP.
Ниже приведена форма случайного заголовка HTTP.
С сгенерированным заголовком HTTP и дескриптором запроса BAZARLOADER вызывает HttpSendRequestA для отправки запроса на сервер C2 и вызывает HttpQueryInfoA для получения кода состояния.
Если код состояния не HTTP_STATUS_OK, вредоносное ПО переходит на другой адрес C2.
Если код состояния HTTP_STATUS_OK, BAZARLOADER вызывает InternetQueryDataAvailable, чтобы определить размер данных для чтения, выделяет буфер памяти в соответствии с размером и вызывает InternetReadFile для чтения полезных данных следующего этапа, пока все не будет записано в память.
Наконец, вредоносное ПО расшифровывает полезную нагрузку с помощью своего открытого ключа RSA, вызывая BCryptDecrypt, и проверяет, превышает ли размер полезной нагрузки 64 байта и содержит ли она заголовок MZ.
Шаг 6. Подключение C2 через настраиваемые URL-адреса
Если BAZARLOADER не может загрузить исполняемый файл следующего этапа с перечисленных выше IP-адресов, он пытается разрешить пользовательские домены C2 с помощью OpenNIC (https://www.opennic.org/), службы сообщества DNS, принадлежащей пользователям.
Чтобы начать запрос к API OpenNIC, вредоносное ПО сначала разрешает URL-адрес "api.opennicproject.org" и вызывает InternetConnectA для установления соединения с сайтом.
Затем он вызывает 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 серверов. Только.
Чтобы проверить это, мы можем просто вставить путь ниже в браузер по нашему выбору.
Затем вредоносная программа входит в цикл для вызова InternetQueryDataAvailable и InternetReadFile для чтения 8 DNS-серверов OpenNIC в память.
Для каждого IP-адреса DNS-сервера BAZARLOADER анализирует его из строки в int и заполняет поле opennic_server_struct в основной структуре. Ниже представлена структура, используемая для хранения IP-адресов OpenNIC.
Наконец, вредоносное ПО декодирует следующие пользовательские домены C2, пытается разрешить их с помощью DNS-серверов и загружает исполняемый файл следующего этапа.
Для каждого из этих пользовательских доменов BAZARLOADER вызывает DnsQuery_A, чтобы запросить запись ресурса DNS с серверов OpenNIC для разрешения IP-адреса сервера C2.
После проверки правильности IP-адреса вредоносное ПО пытается подключиться к нему и запрашивает загрузку исполняемого файла следующего этапа, подобного тому, что мы видели на предыдущем шаге.
Шаг 5: Инъекция через выемку подмену процесса
После успешной загрузки исполняемого файла следующего этапа BAZARLOADER запускает функцию внедрения, чтобы запустить его из другого процесса.
Для этой функциональности BAZARLOADER заполняет следующую структуру.
Во-первых, он проверяет, повышен ли его процесс с правами администратора. Он вызывает GetCurrentProcess и OpenProcessToken, чтобы получить собственный дескриптор токена процесса, и GetTokenInformation, чтобы получить информацию о повышении прав токена.
Если процесс не повышен, он разрешает имена следующих процессов и пытается заполнить поля структуры внедрения.
Для каждого имени процесса вредоносное ПО перечисляет моментальный снимок процесса, чтобы получить его идентификатор, и вызывает OpenProcess, чтобы получить его дескриптор.
Чтобы заполнить поля full_exec_command и thread_curr_directory, которые содержат командную строку процесса и полный путь, BAZARLOADER сначала извлекает параметры процесса из блока среды процесса (PEB).
Чтобы получить доступ к PEB, вредоносное ПО вызывает NtQueryInformationProcess для получения адреса PEB и вызывает ReadProcessMemory для чтения PEB в память.
Затем он вызывает ReadProcessMemory для чтения параметров процесса из памяти процесса.
Со структурой параметра процесса RTL_USER_PROCESS_PARAMETERS BAZARLOADER считывает командную строку процесса и полный путь для заполнения структуры внедрения.
Точно так же он также использует параметр процесса для доступа к блоку среды браузера и записывает его в структуру внедрения.
Если BAZARLOADER имеет права администратора, вместо процесса браузера он пытается заполнить структуру инъекции процессом svchost.exe из следующей командной строки.
Затем, используя структуру инъекции, вредоносное ПО вызывает CreateProcessA, чтобы создать целевой процесс в приостановленном состоянии для выполнения очистки процесса.
Мы не будем слишком глубоко погружаться в реализацию этого процесса, так как это почти точно такая же реализация, как показано здесь.
Мы можем быстро определить, что происходит подмена процесса через вызываемые API-интерфейсы Windows. NtUnmapViewOfSection вызывается для отмены отображения и выделения памяти родителя. Затем вызываются VirtualAllocEx и WriteProcessMemory для выделения виртуальной памяти в родительском процессе и записи в нее вредоносной полезной нагрузки.
Мы также можем видеть, что вредоносное ПО перебирает заголовок родительского раздела, чтобы найти раздел ".reloc" и выполняет перемещение внедренного образа в память.
Наконец, BAZARLOADER вызывает SetThreadContext, чтобы установить новую точку входа для родительского процесса, и вызывает ResumeThread, чтобы снова возобновить родительский процесс, который выполнит внедренный исполняемый файл.
И при этом мы проанализировали, как BAZARLOADER загружает удаленный исполняемый файл и выполняет его, используя процесс очистки! Если у вас есть какие-либо вопросы относительно анализа, не стесняйтесь обращаться ко мне через Twitter.
Переведено специально для xss.pro
Автор перевода: yashechka
Источник: https://www.0ffset.net/reverse-engineering/analysing-the-main-bazarloader/
В этом посте мы рассмотрим последний этап этого загрузчика, который имеет возможность загружать и выполнять удаленные полезные нагрузки, такие как Cobalt Strike. Чтобы продолжить, вы можете получить образец, а также файлы PCAP для него на Malware-Traffic-Analysis.net. (https://www.malware-traffic-analysis.net/2022/02/07/index.html)
Шаг 1. Проверка системных языков
Подобно многим вредоносным программам, BAZARLOADER вручную проверяет языки системы, чтобы избежать запуска на машинах в России и соседних странах.
Он вызывает GetSystemDefaultLangID для получения языка системы по умолчанию и GetKeyboardLayoutList для перебора системных раскладок клавиатуры.
Для каждого из этих языков вредоносное ПО проверяет его допустимость с помощью битовой маски.
Если идентификатор языка больше 0x43 или меньше 0x18, он считается действительным, и BAZARLOADER продолжает его выполнение.
Если он находится в диапазоне от 0x18 до 0x43, разница между идентификатором языка и 0x18 используется как индекс проверяемого бита в битовой маске.
Битовая маска, которую использует BAZARLOADER, — 0xD8080190C03, что равно 11011000000010000000000110010000110000000011 в двоичном виде. Первый бит битовой маски проверяется, если идентификатор языка равен 0x18. Второй бит проверяется, если идентификатор языка равен 0x19 и так далее…
Ниже приведен список всех языков из битовой маски, которые вредоносная программа избегает.
Шаг 2: Однократный мьютекс
Чтобы проверить наличие нескольких запущенных экземпляров самого себя, BAZARLOADER сначала извлекает субавторитет SID из своего процесса. Для этого он вызывает GetTokenInformation для получения уровня целостности токена процесса и вызывает GetSidSubAuthorityCount и GetSidSubAuthority для доступа к субавторитету SID.
Если дочерним органом SID является SECURITY_MANDATORY_SYSTEM_RID или SECURITY_MANDATORY_PROTECTED_PROCESS_RID, BAZARLOADER проверяет, принадлежит ли в настоящее время мьютекс "{b837ef4f-10ee-4821-ac76-2331eb32a23f}" какому-либо другому процессу, вызывая CreateMutexA.
Если это так, вредоносное ПО уничтожает себя. Однако есть небольшая ошибка с условием проверки существования объекта мьютекса, который предполагает, что он не может открыть мьютекс, когда это действительно удается.
После этого вредоносное ПО разрешает строку "{0caa6ebb-cf78-4b01-9b0b-51032c9120ce}" и пытается создать мьютекс с таким именем.
Если этот объект мьютекса уже существует, вредоносная программа также завершает свою работу.
Если дочерним органом SID является не SECURITY_MANDATORY_SYSTEM_RID или SECURITY_MANDATORY_PROTECTED_PROCESS_RID, BAZARLOADER по-прежнему использует эти два имени мьютекса, но добавляет перед ними строку "Global\". Это проверяет наличие мьютексов в глобальном пространстве имен, а не в пространстве имен для каждого сеанса, что позволяет вредоносному ПО проверять, есть ли у него экземпляры, запущенные в сеансах других пользователей.
Шаг 4: Генерация случайного интернет-трафика
Чтобы генерировать действия в Интернете, чтобы скрыть свою связь с серверами C2, BAZARLOADER сначала вызывает InternetOpenA для инициализации использования функций WinINet со следующей строкой в качестве пользовательского агента HTTP.
Затем вредоносная программа порождает поток для периодического подключения к случайным URL-адресам и генерации шумов, чтобы скрыть основной трафик C2, используя следующую структуру.
Во-первых, BAZARLOADER вызывает InitializeCriticalSection для инициализации объекта критической секции структуры, который позже используется для защиты доступа к полю create_flag.
Затем он устанавливает поле self так, чтобы оно указывало на структуру, поле create_flag — как TRUE, и вызывает CreateThread, чтобы создать поток для выполнения этих случайных интернет-операций. Если не удается создать поток, поле create_flag устанавливается в FALSE.
Поток сначала пытается получить право собственности на объект критической секции и проверяет, включен ли флаг создания. Если это так, вредоносное ПО разрешает следующие URL-адреса как строки стека.
Затем поток входит в бесконечный цикл, чтобы начать генерировать шум трафика. Для генерации случайных чисел BAZARLOADER использует различные функции, которые вызывают Windows API BCryptGenRandom для создания заданного количества случайных байтов.
Он случайным образом выбирает один из 4 URL-адресов, перечисленных выше, случайным образом генерирует для него сегменты пути URL-адреса и объединяет их для создания полного URL-адреса.
Чтобы сгенерировать сегменты пути, функция принимает минимальное и максимальное количество сегментов пути для генерации, а также минимальную и максимальную длину для каждого сегмента пути.
Он генерирует количество сегментов пути случайным образом в заданном диапазоне. Для каждого из сегментов вредоносное ПО случайным образом генерирует строку произвольной длины в заданном диапазоне, содержащую цифры и прописные/строчные буквы.
Наконец, вредоносная программа вызывает InternetOpenURLA, чтобы установить соединение со сгенерированным URL-адресом. Он вызывает HTTPQueryInfoA с флагом HTTP_QUERY_CONTENT_LENGTH для получения длины содержимого, выделяет буфер с этим размером и вызывает InternetReadFile для чтения данных с этого URL-адреса.
Это повторяется неоднократно до тех пор, пока связь с C2 и вставка полезной нагрузки не будут завершены, что создает много шума для маскировки основного трафика, поступающего на серверы C2 и от них.
Шаг 4: Заполнение криптографической структуры
BAZARLOADER в основном использует следующую структуру для связи с серверами C2. Поля структуры будут объяснены по мере того, как мы будем анализировать код.
Во-первых, он заполняет поле crypto_struct в основной структуре. Эта структура содержит криптографические дескрипторы, которые позже используются для расшифровки исполняемых файлов, отправляемых с серверов C2.
Структура может быть реконструирована, как показано ниже.
Вредоносное ПО разрешает строки "RSA" и "SHA384" и вызывает BCryptOpenAlgorithmProvider для получения дескрипторов для этих двух алгоритмов. Дескрипторы хранятся в соответствующих полях в структуре crypto_struct.
Затем он разрешает свои жестко запрограммированные большие двоичные объекты открытого и закрытого ключей RSA в памяти, чтобы импортировать соответствующие дескрипторы ключей.
Для каждого блоба ПО разрешает одну из строк "RSAFULLPRIVATEBLOB" или "«RSAPUBLICBLOB" и использует ее для указания типа большого двоичного объекта при вызове BCryptImportKeyPair для импорта соответствующего дескриптора ключа.
Наконец, он вызывает BCryptGetProperty для получения длины общедоступных и частных блоков шифрования RSA. Теперь, когда эта структура полностью заполнена, BAZARLOADER может выполнять шифрование/дешифрование RSA, а также хеширование SHA384.
Шаг 5: Соединение C2 через необработанные IP-адреса
Прежде чем связываться с серверами C2, BAZARLOADER сначала разрешает список необработанных IP-адресов и записывает их в поле C2_addr_list в основной структуре.
Это поле представляет собой структуру, представляющую список строковых структур, каждая из которых может быть реконструирована, как показано ниже.
Ниже приведен список всех IP-адресов серверов C2, используемых в этом примере.
Для каждого из этих адресов вредоносное ПО пытается связаться с соответствующим сервером и загрузить исполняемый файл следующего этапа.
Чтобы установить соединение, он заполняет следующую структуру.
Вредоносное ПО вызывает InternetCrackUrlA для получения компонентов URL-адреса C2 и InternetConnectA для подключения к серверу.
Поля этой структуры подключения затем копируются в C2_connection_struct основной структуры. Здесь я не совсем уверен, почему они вместо этого просто не заполняют основную структуру.
Точно так же BAZARLOADER заполняет приведенную ниже структуру для создания HTTP-запроса к C2.Имя объекта запроса и HTTP разрешаются как "/data/service" и "GET".
HTTP-версия запроса определяется как "HTTP/1.1", и BAZARLOADER вызывает HttpOpenRequestA, чтобы создать этот запрос для сервера C2, используя полученный выше дескриптор соединения.
Он также вызывает InternetSetOptionA, чтобы установить время ожидания для получения ответа и отправки запроса на 300 секунд и время ожидания для подключения к C2 на 120 секунд.
Затем BAZARLOADER генерирует заголовок HTTP, который будет добавлен к запросу. Это делается путем вызова GetSystemTime для заполнения полей curr_system_time и datetime_string основной структуры текущими датой и временем.
Он также генерирует хэш SHA384 строки даты и времени для заполнения полей структуры datetime_string_hash и datetime_string_hash_len.
Затем BAZARLOADER подписывает сгенерированный хэш своим приватным RSA, вызывая BCryptSignHash, и использует эту хэш-подпись для произвольного создания заголовка HTTP.
Ниже приведена форма случайного заголовка HTTP.
С сгенерированным заголовком HTTP и дескриптором запроса BAZARLOADER вызывает HttpSendRequestA для отправки запроса на сервер C2 и вызывает HttpQueryInfoA для получения кода состояния.
Если код состояния не HTTP_STATUS_OK, вредоносное ПО переходит на другой адрес C2.
Если код состояния HTTP_STATUS_OK, BAZARLOADER вызывает InternetQueryDataAvailable, чтобы определить размер данных для чтения, выделяет буфер памяти в соответствии с размером и вызывает InternetReadFile для чтения полезных данных следующего этапа, пока все не будет записано в память.
Наконец, вредоносное ПО расшифровывает полезную нагрузку с помощью своего открытого ключа RSA, вызывая BCryptDecrypt, и проверяет, превышает ли размер полезной нагрузки 64 байта и содержит ли она заголовок MZ.
Шаг 6. Подключение C2 через настраиваемые URL-адреса
Если BAZARLOADER не может загрузить исполняемый файл следующего этапа с перечисленных выше IP-адресов, он пытается разрешить пользовательские домены C2 с помощью OpenNIC (https://www.opennic.org/), службы сообщества DNS, принадлежащей пользователям.
Чтобы начать запрос к API OpenNIC, вредоносное ПО сначала разрешает URL-адрес "api.opennicproject.org" и вызывает InternetConnectA для установления соединения с сайтом.
Затем он вызывает 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 серверов. Только.
Чтобы проверить это, мы можем просто вставить путь ниже в браузер по нашему выбору.
Затем вредоносная программа входит в цикл для вызова InternetQueryDataAvailable и InternetReadFile для чтения 8 DNS-серверов OpenNIC в память.
Для каждого IP-адреса DNS-сервера BAZARLOADER анализирует его из строки в int и заполняет поле opennic_server_struct в основной структуре. Ниже представлена структура, используемая для хранения IP-адресов OpenNIC.
Наконец, вредоносное ПО декодирует следующие пользовательские домены C2, пытается разрешить их с помощью DNS-серверов и загружает исполняемый файл следующего этапа.
Для каждого из этих пользовательских доменов BAZARLOADER вызывает DnsQuery_A, чтобы запросить запись ресурса DNS с серверов OpenNIC для разрешения IP-адреса сервера C2.
После проверки правильности IP-адреса вредоносное ПО пытается подключиться к нему и запрашивает загрузку исполняемого файла следующего этапа, подобного тому, что мы видели на предыдущем шаге.
Шаг 5: Инъекция через выемку подмену процесса
После успешной загрузки исполняемого файла следующего этапа BAZARLOADER запускает функцию внедрения, чтобы запустить его из другого процесса.
Для этой функциональности BAZARLOADER заполняет следующую структуру.
Во-первых, он проверяет, повышен ли его процесс с правами администратора. Он вызывает GetCurrentProcess и OpenProcessToken, чтобы получить собственный дескриптор токена процесса, и GetTokenInformation, чтобы получить информацию о повышении прав токена.
Если процесс не повышен, он разрешает имена следующих процессов и пытается заполнить поля структуры внедрения.
Для каждого имени процесса вредоносное ПО перечисляет моментальный снимок процесса, чтобы получить его идентификатор, и вызывает OpenProcess, чтобы получить его дескриптор.
Чтобы заполнить поля full_exec_command и thread_curr_directory, которые содержат командную строку процесса и полный путь, BAZARLOADER сначала извлекает параметры процесса из блока среды процесса (PEB).
Чтобы получить доступ к PEB, вредоносное ПО вызывает NtQueryInformationProcess для получения адреса PEB и вызывает ReadProcessMemory для чтения PEB в память.
Затем он вызывает ReadProcessMemory для чтения параметров процесса из памяти процесса.
Со структурой параметра процесса RTL_USER_PROCESS_PARAMETERS BAZARLOADER считывает командную строку процесса и полный путь для заполнения структуры внедрения.
Точно так же он также использует параметр процесса для доступа к блоку среды браузера и записывает его в структуру внедрения.
Если BAZARLOADER имеет права администратора, вместо процесса браузера он пытается заполнить структуру инъекции процессом svchost.exe из следующей командной строки.
Затем, используя структуру инъекции, вредоносное ПО вызывает CreateProcessA, чтобы создать целевой процесс в приостановленном состоянии для выполнения очистки процесса.
Мы не будем слишком глубоко погружаться в реализацию этого процесса, так как это почти точно такая же реализация, как показано здесь.
Мы можем быстро определить, что происходит подмена процесса через вызываемые API-интерфейсы Windows. NtUnmapViewOfSection вызывается для отмены отображения и выделения памяти родителя. Затем вызываются VirtualAllocEx и WriteProcessMemory для выделения виртуальной памяти в родительском процессе и записи в нее вредоносной полезной нагрузки.
Мы также можем видеть, что вредоносное ПО перебирает заголовок родительского раздела, чтобы найти раздел ".reloc" и выполняет перемещение внедренного образа в память.
Наконец, BAZARLOADER вызывает SetThreadContext, чтобы установить новую точку входа для родительского процесса, и вызывает ResumeThread, чтобы снова возобновить родительский процесс, который выполнит внедренный исполняемый файл.
И при этом мы проанализировали, как BAZARLOADER загружает удаленный исполняемый файл и выполняет его, используя процесс очистки! Если у вас есть какие-либо вопросы относительно анализа, не стесняйтесь обращаться ко мне через Twitter.
Переведено специально для xss.pro
Автор перевода: yashechka
Источник: https://www.0ffset.net/reverse-engineering/analysing-the-main-bazarloader/