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

-==Кореец Чуонг сводит всех с ума - Полный анализ рансома /BlackMatter/***/v2/==-

yashechka

Генератор контента.Фанат Ильфака и Рикардо Нарвахи
Эксперт
Регистрация
24.11.2012
Сообщения
2 344
Реакции
3 563
Это мой анализ BlackMatter Ransomware версии 2.0.

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

BlackMatter использует схему гибридной криптографии RSA-1024 и модифицированной ChaCha20, для шифрования файлов и защиты своей матрицы ChaCha20.

Как и Darkside, его конфигурация зашифрована и в памяти сжимается с помощью aPLib.

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

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

Благодаря тому, что в основе своей многопоточной лежит архитектуры REvil, шифрование BlackMatter выполняется относительно быстро.

101.png


IOCS

Этот сэмпл представляет собой 32-разрядный исполняемый файл Windows.

MD5: 50c4970003a84cab1bf2634631fe39d7

SHA256
: 520bd9ed608c668810971dbd51184c6a29819674280b018dc4027bc38fc42e57

СЭМПЛ: https://bazaar.abuse.ch/sample/520bd9ed608c668810971dbd51184c6a29819674280b018dc4027bc38fc42e57/


102.png


Записка с требованием выкупа

Содержимое записки с требованием выкупа зашифровано в конфигурации BlackMatter, динамически расшифровывается и записывается в файл с запиской о выкупе в каждом каталоге.

Имя файла о выкупе имеет вид **. README.txt **.

103.png


Статический анализ кода

Антианализ:
резолвинг API функций

Поскольку BlackMatter представляет собой комбинацию LockBit, Darkside и REvil, неудивительно, что программа-вымогатель скрывает свои вызовы API из статического анализа.

Обфускация довольно крутая, но я не буду ее здесь анализировать. Я настоятельно рекомендую коллегам-аналитикам проверить, как это работает, если у них будет время!

104.png


Ознакомьтесь с моими скриптами IDAPython dll_exports.py и revil_api_resolve.py, если вы хотите автоматизировать резолвинг этих API в IDA Pro и ускорить анализ.

Эти сценарии основаны на сценариях REVil из видео YouTube OALabs.

У Яна Г. есть действительно хорошая запись в блоге, в которой объясняется хеширование и обфускация API BlackMatter с помощью указателей-трамплинов. Если вам интересен технический анализ этого, не стесняйтесь проверить их работу.

Антианализ: шифрование строк

Как и в случае с другими крупными программами-вымогателями, большинство строк в BlackMatter зашифрованы и разрешаются во время выполнения.

Незашифрованные строки хранятся в стеке как строки стека. Для каждого зашифрованного файла зашифрованные байты/DWORD помещаются в стек и дешифруются с помощью операции XOR с константой.

Эта реализация действительно похожа на реализацию программы-вымогателя Conti, и, вероятно, есть хороший способ автоматизировать их разрешение с помощью сценария IDAPython.

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

105.png


Антианализ: сравнение строк

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

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

BlackMatter обфусцирует их с помощью односторонней хеш-функции и сравнивает только хеши строк, а не сами строки. Хеш строки - это просто сумма каждого байта, повернутого вправо на 13, с начальным сидом.

106.png


Суммирование делает невозможным работу в обратном направлении от хеша для создания строки, поэтому для разрешения этих хешей требуется эвристический анализ, взлом словаря и брутфорс.

Я использую и добавляю этот инструмент созданный @sisoma2 для поиска хэшей, которые использует BlackMatter! В его инструменте есть отличный словарь для взлома хэшей, поэтому обязательно используйте его для облегчения анализа!

Ниже приведен список хешей, используемых BlackMatter v2, и их строки.

0xd3801b00 -> hlp
0x5366e694 -> perflogs
0xe7681bc0 -> rom
0xdd481cc0 -> msi
0xd9c81940 -> key
0xef3a37b3 -> default
0xd57818c0 -> ico
0x67b00e00 -> 386
0xcd2e9b7a -> theme
0x6b66f975 -> intel
0xdd081c00 -> mpa
0xdd101900 -> mdb
0xe9981a00 -> shs
0x267078f5 -> $windows.~bt
0xcd101900 -> edb
0xc6ce6958 -> appdata
0xeb869d00 -> http
0x85aa57e4 -> ntuser.dat.log
0x4a6bb7db -> msstyles
0x4cca7837 -> nomedia
0x49164931 -> accdb
0xc9101840 -> cab
0xe1c018c0 -> ocx
0xdb301900 -> ldf
0x12018c0 -> c$
0xfcc8ab56 -> bootsect.bak
0xdf981b00 -> nls
0xe99018c0 -> scr
0xa6f2d1a7 -> application data
0x4c4b25d4 -> tor browser
0xe7801d00 -> rtp
0xdd201bc0 -> mod
0xf00cae96 -> bootfont.bin
0x846bec00 -> iconcache.db
0xd4aaebb2 -> admin$
0xc7a01840 -> bat
0xc8cef7d1 -> thumbs.db
0xdd301900 -> mdf
0xf1c01c00 -> wpx
0xe1a63bc0 -> boot
0xcbb01c80 -> drv
0xc5481b80 -> ani
0xcbe2aa35 -> ntuser.ini
0x2e75e394 -> programdata
0x4ae29631 -> diagcfg
0xba22623b -> all users
0x4aba94f1 -> diagcab
0xd5c01900 -> idx
0xdd801cc0 -> msp
0xdd181cc0 -> msc
0xeb9f5c34 -> https
0x3907099b -> boot.ini
0x64e29771 -> diagpkg
0x86ccaa15 -> autorun.inf
0xb7e02438 -> svchost.exe
0xe3301c80 -> prf
0xe9601c00 -> spl
0xc5b01900 -> adv
0x452f4997 -> -safe
0xe1881cc0 -> ps1
0xaf16c593 -> themepack
0xe3101900 -> pdb
0xd59818c0 -> ics
0xdb975937 -> ntldr
0xc23aa6f5 -> ntuser.dat
0x3eb272e6 -> explorer.exe
0xb7ea3892 -> msocache
0xe15ed8c0 -> lock
0xcb601b00 -> dll
0xe3426cd7 -> windows
0xc7701a40 -> bin
0xc9601c00 -> cpl
0x5cde3a7b -> public
0xc99eab80 -> icns
0xdf301900 -> ndf
0xd3081d00 -> hta
0x7f07935 -> windows.old
0x45678b17 -> -wall
0xdda81cc0 -> msu
0xe9981e40 -> sys
0x30a212d -> $recycle.bin
0x45471d17 -> -path
0x52cb0b38 -> google
0xdccab8dd -> mozilla
0xc9201b40 -> cmd
0xa1fccbfe -> deskthemepack
0x26687e35 -> $windows.~ws
0xc9901d40 -> cur
0xae018eae -> system volume information
0xdb581b80 -> lnk
0xcd281e00 -> exe
0x82d2a252 -> desktop.ini
0x8cf281cd -> config.msi
0xfe9e7c10 -> runonce.exe
0x36004e4e -> program files
0xd56018c0 -> icl
0xab086595 -> program files (x86)
0xc9681bc0 -> com

Конфигурация

Конфигурация образцов BlackMatter зашифрована и сжимается в памяти, как и в Darkside.

Во время анализа я динамически выполняю расшифровку с помощью x32dbg и распаковываю конфигурацию с помощью aPLib в Python.

107.png


Ниже приведен список полей конфигурации, которые поддерживает BlackMatter, и их описание.

RSA_PUBLIC_KEY (128 байт): ключ RSA для шифрования ключа ChaCha20.

COMPANY_VICTIM_ID (16 байт): идентификатор компании, используемый в данных, отправляемых обратно на удаленный сервер для идентификации жертвы.

AES_KEY (16 байт): ключ AES для шифрования данных, отправляемых на удаленные серверы.

ENCRYPT_LARGE_FILE_FLAG (1 байт): включить фрагменты для шифрования больших файлов.

ATTEMPT_LOGON_FLAG (1 байт): разрешить попытку входа в систему с использованием учетных данных пользователя, указанных в конфигурации.

MOUNT_VOL_AND_ENCRYPT_FLAG (1 байт): включить шифрование почтового ящика Exchange, монтирование всех томов и их шифрование.

NETWORK_ENCRYPT_FLAG (1 байт): разрешить получение имен хостов DNS и шифрование их сетевых ресурсов.

TERMINATE_PROCESSES_FLAG (1 байт): разрешить завершающие процессы, указанные в поле конфигурации PROCESSES_TO_KILL.

STOP_SERVICES_AND_DELETE_FLAG (1 байт): разрешить остановку и удаление служб, указанных в поле конфигурации SERVICES_TO_KILL.

CREATE_MUTEX_FLAG (1 байт): разрешить создание и проверку мьютекса RunOnce.

PRINTER_PRINT_RANSOM_NOTE_FLAG (1 байт): разрешить печать записки о выкупе с использованием локального принтера по умолчанию.

SEND_DATA_TO_SERVER_FLAG (1 байт): разрешить отправку информации о жертве и шифрование статистики на удаленные серверы, указанные в поле конфигурации REMOTE_SERVER_URLS.

FOLDER_HASHES_TO_AVOID: закодированный в Base64 список 4-байтовых хэшей имен папок, чтобы избежать шифрования.

FILE_HASHES_TO_AVOID: закодированный в Base64 список 4-байтовых хэшей имен файлов, чтобы избежать шифрования.

EXTENSION_HASHES_TO_AVOID: закодированный в Base64 список 4-байтовых хэшей расширений, чтобы избежать шифрования.

COMPUTERNAMES_TO_AVOID: список имен компьютеров в кодировке Base64, чтобы избежать шифрования (не используется в этом примере).

PROCESSES_TO_KILL: список уничтожаемых процессов в кодировке Base64.

SERVICES_TO_KILL: список уничтожаемых служб в кодировке Base64.

REMOTE_SERVER_URLS: список удаленных серверов в кодировке Base64 для связи.

LOGIN_CREDENTIALS: список учетных данных для попытки входа в систему (не используется в этом примере).

RANSOM_NOTE_CONTENT: закодированное в Base64 и зашифрованное содержимое записки с требованием выкупа.

RANSOM_NOTE_CONTENT_HASH: Контрольная сумма содержания записки о выкупе.


Вот конфигурация этого образца версии 2 в форме JSON. Я генерирую это с помощью этого инструмента автоматического извлечения конфигурации и исправляю имена полей конфигурации в соответствии с моим анализом. Огромный привет ребятам из McAfee Advanced Threat Research за это!

{
"RSA_PUBLIC_KEY": "4FDB27F0D5F8A0741EBE1A8C08E5B98ABECE2C281166A7FFDCF239A8A77FD2A4FC6B8828A5F3F9F5FA4B245CC90386953D6469368DAD281CA1D688F2556725D9422D08E1191230999B2E54E4103B1C19199C96E350C216B39B3D2ADDB315A4284A9A3C8C5058924AED366DD030FD4E211178BCDC4C79406B75C87EDC1851676A",
"COMPANY_VICTIM_ID": "24483508BCCFE72E63B26A1233058170",
"AES_KEY": "196387BAD88422E3F08474FA8F7E796E",
"ENCRYPT_LARGE_FILE_FLAG": "false",
"ATTEMPT_LOGON_FLAG": "false",
"MOUNT_VOL_AND_ENCRYPT_FLAG": "true",
"NETWORK_ENCRYPT_FLAG": "true",
"TERMINATE_PROCESSES_FLAG": "true",
"STOP_SERVICES_AND_DELETE_FLAG": "true",
"CREATE_MUTEX_FLAG": "true",
"SEND_DATA_TO_SERVER_FLAG": "true",
"PRINTER_PRINT_RANSOM_NOTE_FLAG": "true",
"PROCESSES_TO_KILL": [{
"": "encsvc"
}, {
"": "thebat"
}, {
"": "mydesktopqos"
}, {
"": "xfssvccon"
}, {
"": "firefox"
}, {
"": "infopath"
}, {
"": "winword"
}, {
"": "steam"
}, {
"": "synctime"
}, {
"": "notepad"
}, {
"": "ocomm"
}, {
"": "onenote"
}, {
"": "mspub"
}, {
"": "thunderbird"
}, {
"": "agntsvc"
}, {
"": "sql"
}, {
"": "excel"
}, {
"": "powerpnt"
}, {
"": "outlook"
}, {
"": "wordpad"
}, {
"": "dbeng50"
}, {
"": "isqlplussvc"
}, {
"": "sqbcoreservice"
}, {
"": "oracle"
}, {
"": "ocautoupds"
}, {
"": "dbsnmp"
}, {
"": "msaccess"
}, {
"": "tbirdconfig"
}, {
"": "ocssd"
}, {
"": "mydesktopservice"
}, {
"": "visio"
}],
"SERVICES_TO_KILL": [{
"": "mepocs"
}, {
"": "memtas"
}, {
"": "veeam"
}, {
"": "svc$"
}, {
"": "backup"
}, {
"": "sql"
}, {
"": "vss"
}, {
"": "msexchange"
}],
"REMOTE_SERVER_URLS": [{
"": "hxxps://mojobiden[.]com"
}, {
"": "hxxp://mojobiden[.]com"
}],
"RANSOM_NOTE_CONTENT": [{
"": " ~+
* +
' BLACK |
() .-.,='``'=. - o -
'=/_ \\ |
* | '=._ |
\\ `=./`, '
. '=.__.=' `=' *
+ Matter +
O * ' .

>>> What happens?
Your network is encrypted, and currently not operational.
We need only money, after payment we will give you a decryptor for the entire network and you will restore all the data.

>>> What guarantees?
We are not a politically motivated group and we do not need anything other than your money.
If you pay, we will provide you the programs for decryption and we will delete your data.
If we do not give you decrypters or we do not delete your data, no one will pay us in the future, this does not comply with our goals.
We always keep our promises.

>>> How to contact with us?
1. Download and install TOR Browser (hxxps://www[.]torproject[.]org/).
2. Open hxxp://supp24yy6a66hwszu2piygicgwzdtbwftb76htfj7vnip3getgqnzxid[.]onion/<REDACTED>

>>> Warning! Recovery recommendations.
We strongly recommend you to do not MODIFY or REPAIR your files, that will damage them."
}],
"RANSOM_NOTE_CONTENT_HASH": "38E73655"
}

Аргументы командной строки

BlackMatter может работать с аргументами командной строки или без них.

Ниже приведен список аргументов, которые может предоставить оператор.

-path <target> - Путь к каталогу, который будет специально зашифрован

<target> - Путь к каталогу, который будет специально зашифрован

-safe - Включить перезагрузку в безопасном режиме

-wall - Устанавить обои и распечатать записку с требованием выкупа

Настройка предварительного шифрования

Обход UAC


Во время установки BlackMatter проверяет, работает ли он в настоящее время с учетными данными администратора.

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

108.png


Затем, после запроса версии операционной системы через PEB, программа-вымогатель проверяет, является ли текущая ОС Windows 7 и выше.

109.png


Наконец, он проверяет, принадлежит ли токен текущего процесса к встроенным системным группам домена, используемым для администрирования.

110.png


Если проверки проходят и процесс имеет права администратора, вредоносная программа не пытается обходить UAC.

Для обхода UAC, используя LdrEnumerateLoadedModules, он регистрирует dllhost.exe в System32 как поле ImagePathName и CommandLine в поле ProcessParameters PEB процесса. Эта первоначальная настройка позволяет размещать и выполнять объекты COM как dllhost.exe.

111.png


Затем BlackMatter вызывает CoGetObject с указанным ниже именем объекта, чтобы получить COM-интерфейс ICMLuaUtil, который обычно используется для обхода UAC.

Elevation:Administrator!new:{3E5FC7F9-9A51-4367-9063-A120244FBEC7}

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

112.png


Наконец, он завершает себя, вызывая NtTerminateProcess.

Создание зашифрованного расширения

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

Сначала BlackMatter запрашивает значение указанного ниже раздела реестра, чтобы получить GUID компьютера.

HKLM\SOFTWARE\Microsoft\Cryptography\MachineGuid


Затем вредоносная программа пропускает GUID компьютера через 3 раунда хеширования, обмена байтами и Base64-кодирования окончательного хеш-кода для генерации зашифрованного расширения.

Поскольку символы ASCII '+', '/' и '=' в строке Base64 не очень хорошо работают в расширении файла, BlackMatter заменяет '+' на 'x', '/' на 'i' и ' = ' на ' z '.

113.png


Вредоносная программа повторно использует это расширение файла в качестве имени записки с требованием выкупа, добавляя его перед .README.txt.

114.png


Получение токена олицетворения с помощью внедрения процесса

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

Во-первых, он проверяет, является ли пользователь текущего процесса LocalSystem, специальной учетной записью, используемой операционной системой. Затем он вызывает NtQueryInformationToken, чтобы запросить информацию о пользователе токена, и проверяет, является ли первый SID процесса SECURITY_LOCAL_SYSTEM_RID.
115.png


Если процесс выполняется как LocalSystem, BlackMatter использует токен текущего пользователя в качестве токена с повышенными правами.

В противном случае вредоносная программа вызывает NtQuerySystemInformation для запроса информации о процессах в системе. Для каждой записи процесса он проверяет, имеет ли процесс имя explorer.exe, и получает его уникальный идентификатор.

116.png


Затем он вызывает NtOpenProcess с идентификатором процесса, чтобы получить дескриптор процесса, и получает токен процесса с помощью NtOpenProcessToken.

Наконец, BlackMatter вызывает NtDuplicateToken для дублирования токена проводника.

Если это не удается, но токен текущего процесса является членом группы администраторов во встроенном домене, BlackMatter выполняет некоторые махинации внедрения процесса, чтобы получить токен процесса svchost.exe.

Во-первых, он использует тот же прием, что и на рисунке 16, для получения идентификатора процесса и дескриптора процесса svchost.exe.

117.png


Затем он проверяет, работает ли процесс svchost.exe как 64-разрядный.

Если он 64-битный, зловред расшифровывает два разных шеллкода в памяти. Необработанные шеллкоды можно найти здесь (https://github.com/cdong1012/IDAPyt...ob/master/Blackmatter/blackmattershellcode.7z).

После выделения памяти в процессе svchost.exe с помощью NtAllocateVirtualMemory BlackMatter записывает первый шелл-код в область памяти второго шелл-кода перед настройкой и выполнением второго шелл-кода.

118.png


После внедрения второй шелл-код выделяет виртуальную память в процессе svchost с помощью NtAllocateVirtualMemory, записывает первый шелл-код с помощью NtWriteVirtualMemory и создает новый поток для выполнения первого шелл-кода с помощью NtCreateThreadEx.

119.png


Первый шелл-код вызывает WTSQueryUserToken для получения первичного токена доступа вошедшего в систему пользователя и вызывает NtDuplicateObject для дублирования этого токена. Этот токен возвращается в основной поток программы-вымогателя.

120.png


Если вместо этого процесс svchost выполняется как 32-битный процесс, вредоносная программа расшифровывает третий шелл-код и вручную создает удаленный поток, используя CreateRemoteThread для его запуска. Этот шелл-код в основном представляет собой 32-битную версию первого шелл-кода.

121.png


Анализ учетных данных для входа в систему

~Небольшая пауза~
 
Анализ учетных данных для входа в систему

Если ATTEMPT_LOGON_FLAG имеет значение true и в конфигурации указаны LOGIN_CREDENTIALS, вредоносная программа анализирует эти учетные данные перед попыткой аутентификации.

Поле LOGIN_CREDENTIALS представляет собой закодированный в Base64 и зашифрованный буфер строк, и каждая строка учетных данных имеет форму ниже.

<username>@<domain>:password

Поскольку в этом сэмпле нет этого поля в конфигурации, я просто основываю анализ на его коде и других отчетах для BlackMatter версии 1.

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

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

122.png


Затем он вызывает NtQueryInformationToken для запроса информации о группе токена аутентификации и проверяет, принадлежит ли токен группе DOMAIN_ADMINS.

1234.png


Если токен принадлежит к группе DOMAIN_ADMINS, вредоносная программа вызывает SHTestTokenMembership, чтобы проверить, имеет ли токен привилегию DOMAIN_ALIAS_RID_ADMINS.

Если у него недостаточно прав, BlackMatter освобождает все буферы в кучи, в которых хранятся учетные данные, и не использует их позже.

124.png


Настройка криптографических ключей

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

Ниже показано расположение этих буферов.

struct KeyBuffer {
DWORD RSA_encrypted_ChaCha20_matrix_Checksum;
BYTE RSA_encrypted_ChaCha20_matrix[128];
BYTE ChaCha20_Matrix[124];
}


Чтобы заполнить каждый из них, BlackMatter сначала случайным образом генерирует матрицу ChaCha20.

125.png


Для BlackMatter v2 длина матрицы составляет 124 байта или 31 DWORD. Первые 29 DWORD в буфере генерируются случайным образом с использованием инструкций ассемблера cpuid, rdrand, rdseed и __rdtsc. 30DWORD - это первые 4 байта открытого ключа RSA из конфигурации, а последний DWORD содержит 3 случайно сгенерированных байта.

Сырая матрица копируется в последние 124 байта буфера RSA_encrypted_ChaCha20_matrix, а BlackMatter помещает пропущенный размер шифрования в первый DWORD этого буфера (0, если разбиение на части не включено).

Затем этот буфер шифруется открытым ключом RSA из конфигурации, и вредоносная программа генерирует и записывает зашифрованный результат в поле RSA_encrypted_ChaCha20_matrix. Он также генерирует контрольную сумму этого зашифрованного буфера и записывает ее в поле RSA_encrypted_ChaCha20_matrix_Checksum.

126.png


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

Ниже приведен список с пропущенными размерами, которые использует BlackMatter.

0x0
0x200000
0x400000
0x800000
0x1000000
0x2000000
0x4000000
0x8000000
0x10000000
0x20000000
0x40000000

127.png


Перезагрузка в безопасном режиме


Если указан аргумент командной строки -safe и токен процесса принадлежит DOMAIN_ALIAS_RID_ADMINS, BlackMatter пытается принудительно перезагрузить систему в безопасном режиме, чтобы получить больше привилегий для самостоятельного выполнения.

Проверка имени компьютера

Вредоносная программа получает имя компьютера с помощью GetComputerNameW и сравнивает свой хэш со списком хешей из поля COMPUTERNAMES_TO_AVOID в конфигурации. Если хеш есть в списке, BlackMatter пропускает эту операцию.

128.png


Учетные данные для автоматического входа

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

Во-первых, если ATTEMPT_LOGON_FLAG истинно и имя пользователя, пароль и имя домена правильно проанализированы из конфигурации, то вредоносная программа просто использует эти учетные данные.

В противном случае он вызывает NetUserEnum с фильтром для обычных учетных записей. BlackMatter перебирает записи информации о пользователе, пока не найдет запись с идентификатором пользователя 500, который является идентификатором для обычных пользователей. Если учетная запись, соответствующая этой записи, отключена, вредоносная программа включает ее вручную, устанавливая флаги в записи информации о пользователе.

129.png


Затем BlackMatter генерирует новый пароль для этой учетной записи. Формат строки пароля: 3 случайных буквы в верхнем регистре, 1 случайный символ # или &, 3 случайных числа, 1 случайный символ # или & и 4 случайные буквы в нижнем регистре.

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

130.png


Затем BlackMatter устанавливает эти значения в следующие разделы реестра.

- SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\AutoAdminLogon: "1"
- SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\DefaultUserName: Account username
- SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\DefaultDomainName: Account domain name
- SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\DefaultPassword: Account password


Это устанавливает учетные данные по умолчанию для учетной записи, контролируемой BlackMatter (с паролем из конфигурации или вновь созданным паролем), и включает автоматический вход в систему администратора при перезагрузке.

Он также вызывает LsaStorePrivateData для локального хранения и защиты пароля учетной записи.

131.png


Постоянство через куст реестра RunOnce

BlackMatter
устанавливает в качестве значения раздела реестра SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce свой собственный путь к исполняемому файлу для автоматического запуска при перезагрузке в безопасном режиме.

Имя раздела реестра генерируется случайным образом в формате 3 случайных заглавных букв, 3 случайных чисел и 3 случайных строчных букв.

135.png


Безопасное выполнение команд загрузки

Перед выполнением команд для включения безопасной загрузки BlackMatter устанавливает операции с обоями для рабочего стола, которые описаны здесь (https://chuongdong.com/reverse engineering/2021/09/05/BlackMatterRansomware/#setting-ransom-wallpaper), без вызова SystemParametersInfoW для изменения обоев.

Если флаг включения, переданный в качестве параметра, имеет значение true, BlackMatter выполняет одну из этих команд с WinExec в зависимости от версии ОС, чтобы включить перезагрузку в безопасном режиме.

- Below Windows Vista: bootcfg /raw /a /safeboot:network /id 1
- Windows Vista and above: bcdedit /set {current} safeboot network


Если флаг включения, переданный в качестве параметра, имеет значение false, BlackMatter выполняет одну из этих команд с WinExec в зависимости от версии ОС, чтобы отключить перезагрузку в безопасном режиме.

- Below Windows Vista: bootcfg /raw /fastdetect /id 1
- Windows Vista and above: bcdedit /deletevalue {current} safeboot

Наконец, он вызывает NtShutdownSystem для перезагрузки системы.
1111.png


Установка обоев выкупа для рабочего стола

Если указан аргумент командной строки -wall, BlackMatter генерирует файл Bitmap и устанавливает его в качестве обоев на компьютере жертвы.

Во-первых, с помощью NtQuerySystemInformation он запрашивает информацию обо всех процессах в системе и завершает все процессы Run Once Wrapper Utility с именем образа runonce.exe с помощью NtTerminateProcess.

12345.png


Затем вредоносная программа вызывает GetShellWindow (если ОС Windows Vista или выше) или GetDesktopWindow для получения дескриптора окна рабочего стола. Она продолжает делать это до тех пор, пока не получит действительный дескриптор и окно в настоящее время не станет видимым.

134.png


Наконец, BlackMatter устанавливает обои для отображения инструкции о выкупе.

Вредоносная программа устанавливает следующие ключи реестра.

- HKLM\SOFTWARE\<ENCRYPTED_EXTENSION>\hScreen: Window screen height
- HKLM\SOFTWARE\<ENCRYPTED_EXTENSION>\wScreen: Window screen width

123456.png


Затем он создает дескриптор шрифта Times New Roman и записывает инструкцию выкупа, используя этот шрифт, в Bitmap.

Содержание инструкции о выкупе задокументировано ниже.

BlackMatter Ransomware encrypted all your files!
To get your data back and keep your privacy safe,
you must find <Ransom note filenam> file
and follow the instructions!

2222.png


После создания Bitmap в памяти вредоносная программа записывает его на диск по указанному ниже пути.

<special folder path>/<encrypted extension>.bmp

3333.png


Используя имеющийся у него токен с повышенными правами, BlackMatter получает SID процесса токена и создает следующий раздел реестра.

- HKU\<Process SID>\Control Panel\Desktop

Он устанавливает следующий ключ реестра.

- HKU\<Process SID>\Control Panel\Desktop\WallPaper: Bitmap file path
- HKU\<Process SID>\Control Panel\Desktop\WallpaperStyle: "10"


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

139.png


Печать записей о выкупе

Если указан аргумент командной строки -wall, BlackMatter также распечатывает записку о выкупе, используя системный принтер по умолчанию.

Если PRINTER_PRINT_RANSOMNOTE_FLAG в конфигурации равен 1, вредоносная программа извлекает текущий каталог исполняемого файла вымогателя с помощью GetCurrentDirectoryW и помещает туда файл с запиской о выкупе.

140.png


Затем он вызывает GetDefaultPrinterW для получения системного принтера по умолчанию и вызывает ShellExecuteW для выполнения команды печати для печати записки с требованием выкупа.

141.png


Одноразовый мьютекс

Если CREATE_MUTEX_FLAG в конфигурации равен 1, вредоносная программа проверяет, есть ли другой запущенный экземпляр, проверяя, существует ли уже мьютекс, указанный ниже, с помощью CreateMutex.

- Global\<MD4 hash of machine GUID>

142.png


Если есть другой экземпляр, вредоносная программа немедленно завершается и ничего не шифрует.

143.png


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

Вайпинг корзины

Перед шифрованием файлов BlackMatter стирает папку корзины на всех дисках в системе.

Для каждого диска вредоносная программа вручную выполняет итерацию по папкам на первом уровне диска и останавливается, когда находит первую папку со словом recycle в имени.

144.png


После этого он использует FindFirstFileEx и FindNextFileW для перебора папки корзины и ищет все папки, которые начинаются с S-. Найденные папки и их содержимое рекурсивно удаляются с помощью DeleteFileW.

145.png


Эта функция очистки корзины вызывается на всех фиксированных и съемных логических дисках в системе.

146.png


Удаление теневых копий через WMI

Вредоносная программа вызывает CoCreateInstance для создания объекта IWbemLocator, используя IID {DC12A687-737F-11CF-884D-00AA004B2E24} и CLSID {CB8555CC-9128-11D1-AD9B-00C04FD8FDFF}.

Затем она вызывает CoCreateInstance для создания объекта IWbemContext с использованием идентификатора CLSID {674B6698-EE92-11D0-AD71-00C04FD8FDFF}.

Если архитектура системы x64, она вызывает функцию IWbemContext:: SetValue, чтобы установить значение __ProviderArchitecture равным 64.

BlackMatter вызывает метод IWbemLocator::ConnectServer для подключения к локальному пространству имен ROOT\CIMV2 и получения указателя на объект IWbemServices.

147.png


Затем он вызывает IWbemServices::ExecQuery для выполнения указанного ниже запроса WQL, чтобы получить объект IEnumWbemClassObject для запроса теневых копий.

SELECT * FROM Win32_ShadowCopy

Вредоносная программа вызывает IEnumWbemClassObject::Next для перечисления всех теневых копий в системе, IEnumWbemClassObject::Get для получения идентификатора каждой теневой копии и IWbemServices::DeleteInstance для их удаления.

148.png


Завершение процессов через Service Control Manager

Если для поля STOP_SERVICES_AND_DELETE_FLAG установлено значение true в конфигурации, BlackMatter завершает работу и удаляет все службы, хэш имени которых находится в списке SERVICES_TO_KILL в конфигурации.

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

Затем она вызывает EnumServicesStatusExW для перечисления имен всех служб Win32. Если хэш имени службы есть в списке, вредоносная программа завершает его, вызывая ControlService, чтобы отправить управляющий код SERVICE_CONTROL_STOP в дескриптор службы.

Затем он вызывает DeleteService, чтобы полностью удалить службу.

149.png


Завершение процессов

Если для поля TERMINATE_PROCESSES_FLAG установлено значение true в конфигурации, BlackMatter завершает все процессы, хэш имени которых находится в списке PROCESSES_TO_KILL в конфигурации.

Вредоносная программа вызывает NtQuerySystemInformation для запроса и перечисления всех системных процессов.

Если хэш имени процесса есть в списке, BlackMatter завершает его, вызывая NtOpenProcess, используя идентификатор процесса, чтобы получить дескриптор процесса, и NtTerminateProcess, чтобы завершить его.

150.png


Шифрование файлов


Подобно REvil и Darkside, BlackMatter использует многопоточность с портом завершения ввода-вывода для связи между родительским потоком (проверка и отправка файлов) и дочерними потоками (шифрование файлов) для ускорения шифрования.

Многопоточность: родительский поток

В настройке многопоточности BlackMatter родительский поток создается после дочерних потоков.

Эта функция родительского потока получает параметр пути к файлу/каталогу. Сначала он проверяет, является ли этот путь каталогом или нет.

Если путь является каталогом, вредоносная программа повышает базовый уровень приоритета родительского потока до THREAD_PRIORITY_HIGHEST.

Затем он выделяет память для массива для хранения подкаталогов внутри целевого каталога для шифрования.

151.png


Родительский поток продолжает отбрасывать записку о выкупе в целевой каталог и начинает перечисление через каталог с помощью FindFirstFileExW и FindNextFileW.

Он избегает всех файлов и подкаталогов с именами . и с атрибутами FILE_ATTRIBUTE_REPARSE_POINT и FILE_ATTRIBUTE_SYSTEM.

152.png


Если BlackMatter находит подкаталог, он проверяет, находится ли хэш имени каталога в списке FOLDER_HASHES_TO_AVOID или имя - windows.

153.png


Ниже приведен список имен папок, хэш которых находится в FOLDER_HASHES_TO_AVOID.


system volume information
intel
$windows.~ws
application data
$recycle.bin
mozilla
program files (x86)
program files
$windows.~bt
public
msocache
windows
default
all users
tor browser
programdata
boot
config.msi
google
perflogs
appdata
windows.old


Если подкаталог пригоден для шифрования, BlackMatter добавляет его в конец массива каталогов.

После завершения перечисления целевого каталога BlackMatter проходит по массиву каталогов и перечисляет перечисленные в нем каталоги. Это позволяет выполнять многоуровневый обход каталогов без использования рекурсии, что значительно повышает производительность за счет устранения накладных расходов на стек из-за рекурсивных вызовов.

154.png


Если он находит файл, имя файла проверяется по списку FILE_HASHES_TO_AVOID, а расширение файла проверяется по списку EXTENSION_HASHES_TO_AVOID.

155.png


Ниже приведен список имен файлов, хэш которых находится в списке FILE_HASHES_TO_AVOID.

desktop.ini
autorun.inf
ntldr
bootsect.bak
thumbs.db
boot.ini
ntuser.dat
iconcache.db
bootfont.bin
ntuser.ini
ntuser.dat.log


Ниже приведен список расширений, хэш которых находится в списке EXTENSION_HASHES_TO_AVOID.

themepack
nls
diagpkg
msi
lnk
exe
cab
scr
bat
drv
rtp
msp
prf
msc
ico
key
ocx
diagcab
diagcfg
pdb
wpx
hlp
icns
rom
dll
msstyles
mod
ps1
ics
hta
bin
cmd
ani
386
lock
cur
idx
sys
com
deskthemepack
shs
ldf
theme
mpa
nomedia
spl
cpl
adv
icl
msu


Если файл проходит эти проверки, родительский поток отправит его дочерним потокам для шифрования.

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

Сначала, используя LinkCLSID {00021401-0000-0000-C000-000000000046} и RIID IShellLinkW {000214F9-0000-0000-C000-000000000046}, вредоносная программа извлекает интерфейс IShellLinkW.

Используя функцию QueryInterface интерфейса IShellLinkW с IPersistFile RIID {0000010b-0000-0000-C000-000000000046}, вредоносная программа извлекает интерфейс IPersistFile.

Он вызывает функцию IPersistFile->Load, чтобы загрузить файл ссылки для чтения.

После загрузки BlackMatter вызывает IShellLinkW->GetPath, чтобы получить полный путь к файлу по ссылке.

156.png


Многопоточность: обмен данными между родительскими потоками

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

BlackMatter сначала вызывает RmStartSession, чтобы начать новый сеанс Restart Manager, RmRegisterResources, чтобы зарегистрировать целевой файл в Restart Manager в качестве ресурса, и RmGetList, чтобы получить список всех приложений и служб, которые в настоящее время его используют.

157.png


Он выполняет итерацию по списку процессов и служб и завершает работу всех, чей тип приложения не является RmCritical и RmExplorer.

158.png


Для завершения службы BlackMatter вызывает OpenSCManagerW для установления соединения с диспетчером управления службами, OpenServiceW для получения дескриптора целевой службы, ControlService для отправки кода остановки управления службе для ее остановки и DeleteService для его удаления.

159.png


Чтобы завершить процесс, BlackMatter вызывает NtOpenProcess для получения дескриптора целевого процесса и NtTerminateProcess для его завершения.

160.png
 
Проверка, что файл уже зашифрован

В конце шифрования поля RSA_encrypted_ChaCha20_matrix_Checksum и RSA_encrypted_ChaCha20_matrix в структуре KeyBuffer из настройки криптографических ключей добавляются к нижнему колонтитулу файла.

Когда BlackMatter необходимо проверить, зашифрован ли файл, он извлекает буфер памяти, где должно быть поле RSA_encrypted_ChaCha20_matrix, генерирует его контрольную сумму и сравнивает ее со значением, в котором должно быть поле RSA_encrypted_ChaCha20_matrix_Checksum.

161.png
 
Проверка большого файла

В BlackMatter v2.0 добавлена возможность обработки больших файлов.

Когда ENCRYPT_LARGE_FILE_FLAG в конфигурации имеет значение true, вредоносная программа проверяет, является ли файл большим файлом, через его расширение.

Если расширение файла указано в списке ниже, файл классифицируется как большой.

mdf
ndf
edb
mdb
accdb


Их длина довольно короткая и предсказуемая, поэтому я просто подбираю их с помощью скрипта Python.

62.png


Общая структура потока

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

В случае, если новое имя файла уже существует, вредоносная программа вручную добавляет - [число] к имени файла перед расширением, где номер увеличивается с 0 до тех пор, пока имя файла не перестанет существовать в папке.

63.png


Общая структура используется потоками для связи друг с другом.

Ниже мой примерный вид этой структуры, основанный на смещении полей.

struct BlackmatterFileStruct
{
LONGLONG errorCode;
DWORD originalfilePointerLow;
DWORD originalfilePointerHigh;
int padding;
DWORD filePointerLow;
DWORD filePointerHigh;
DWORD skippedBytesLow;
DWORD skippedBytesHigh;
HANDLE fileHandle;
DWORD threadCurrentState;
BYTE rawChaCha20Matrix[124];
DWORD fileSize;
BYTE padding2[368];
BYTE fileFooter[132];
DWORD *bytesToRead;
BYTE *bufferToReadData;
};


Сначала родительский поток проверяет размер файла, чтобы заполнить поле bytesToRead. Если размер файла составляет 0x100000 байт или более, значение bytesToRead максимально равно 0x100000. Это означает, что данные файла читаются и шифруются фрагментами размером 0x100000 байт.

64.png


Затем BlackMatter заполняет поля rawChaCha20Matrix и fileFooter буферами, созданными в настройке криптографических ключей.

Каждый из этих буферов предназначен для определенного пропущенного размера между чанками.

Ниже показано преобразование между размером файла и размером пропущенного фрагмента.

File TypeFile SizeSkipped Size
SmallAny size0 byte
LargeLess than 0x8000000 bytes0x200000 bytes
LargeBetween 0x8000000 and 0x20000000 - 1 bytes0x400000 bytes
LargeBetween 0x20000000 and 0x80000000 - 1 bytes0x800000 bytes
LargeBetween 0x80000000 and 0x200000000 - 1 bytes0x1000000 bytes
LargeBetween 0x200000000 and 0x800000000 - 1 bytes0x2000000 bytes
LargeBetween 0x800000000 and 0x2000000000 - 1 bytes0x4000000 bytes
LargeBetween 0x2000000000 and 0x8000000000 - 1 bytes0x8000000 bytes
LargeBetween 0x8000000000 and 0x20000000000 - 1 bytes0x10000000 bytes
LargeBetween 0x20000000000 and 0x80000000000 - 1 bytes0x20000000 bytes
LargeEqual or greater than 0x800000000000x40000000 bytes

Изучая размер файла в таблице выше, BlackMatter выбирает соответствующую матрицу ChaCha20, используемую для шифрования файлов.

65.png


Наконец, родительский поток регистрирует дескриптор целевого файла с глобальным портом завершения ввода-вывода с помощью CreateIoCompletionPort, устанавливает поле fileHandle в структуре на дескриптор файла и поле threadCurrentState в начальное состояние и отправляет общую структуру дочерним потокам, используя PostQueuedCompletionStatus, чтобы начать шифрование.

66.png


Многопоточность: шифрование дочерних потоков

Дочерние потоки взаимодействуют друг с другом и с основным потоком с помощью GetQueuedCompletionStatus и PostQueuedCompletionStatus.

Каждый поток постоянно опрашивает пакет завершения ввода-вывода из глобального порта завершения ввода-вывода. Пакет, полученный от GetQueuedCompletionStatus, содержит структуру файла BlackmatterFileStruct для обработки.

67.png


Процесс шифрования делится на четыре состояния. Текущее состояние файла записывается в threadCurrentState совместно используемой структуры.

I. Состояние 0: чтение файла

Первое состояние считывает количество байтов, указанное полем bytesToRead, в буфер в поле bufferToReadData с помощью ReadFile.

Если ReadFile выдает ошибку ERROR_IO_PENDING, вредоносная программа входит в бесконечный цикл ожидания в течение 100 мс и вызывает ReadFile до тех пор, пока не завершится успешно.

Если ReadFile выдает ошибку ERROR_HANDLE_EOF, вредоносная программа устанавливает состояние шифрования на 2, иначе состояние шифрования устанавливается на 1.

68.png


II. Состояние 1. Зашифровать и записать файл

Второе состояние шифрует буфер в поле bufferToReadData, используя его модифицированную реализацию ChaCha20.

После шифрования вредоносная программа вызывает WriteFile для записи зашифрованных данных обратно в файл.

Если ReadFile выдает ошибку ERROR_IO_PENDING, вредоносная программа входит в бесконечный цикл ожидания в течение 100 мс и вызывает WriteFile до тех пор, пока не завершится успешно.

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

69.png


Если пропущенный размер равен нулю, вредоносная программа прекращает шифрование после первых 0x100000 байт и переходит в состояние 2.

BlackMatter модифицированная ChaCha20

Я хочу немного обсудить настраиваемую реализацию BlackMatter ChaCha20, вместо того, чтобы просто взглянуть на нее и назвать ее модифицированная.

Вся заслуга в этом разделе принадлежит Майклу Гиллеспи (https://twitter.com/demonslay335), который помог понять эту криптографическую реализацию.

Похоже, что реализация BlackMatter v2 - это модифицированная версия реализации CryptoPP ChaCha20, которую можно найти здесь (https://github.com/weidai11/cryptop...2396374f0bca94ab9f396f1c/chacha_simd.cpp#L569).

В отличие от многих реализаций ChaCha, здесь используется тип __m128i для хранения состояний в регистрах xmm.

Несмотря на выделение 124 байтов для матрицы, BlackMater использует только первые 64 байта и переводит его в 128-байтовое состояние путем зеркального копирования первых 64 байтов с последними 64 байтами.

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

70.png


III. Состояние 2. Запись нижнего колонтитула файла

Это состояние выполняется только после завершения шифрования файла.

71.png


Вредоносная программа вызывает WriteFile для записи 132-байтового буфера из поля fileFooter в общей структуре в конец файла.

Этот буфер содержит поля RSA_encrypted_ChaCha20_matrix_Checksum и RSA_encrypted_ChaCha20_matrix в структуре из Cryptographic Keys Setup, которые используются для проверки, зашифрован ли файл, и для его расшифровки.

После этого состояния вредоносная программа переходит в состояние 3.

IV. Состояние 3. Очистка

Это последнее состояние в процессе шифрования файла.

В этом состоянии BlackMatter вызывает NtClose, чтобы закрыть дескриптор файла, вызывает RtlFreeHeap, чтобы освободить буфер общей структуры из памяти, и увеличивает глобальное значение TOTAL_NUM_FILE_ENCRYPTED.

73.png


Связь между дочерними потоками

В настройке многопоточности BlackMatter каждый дочерний поток обрабатывает только одно состояние в процессе шифрования.

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

74.png


Обход почтового ящика Exchange

Если MOUNT_VOL_AND_ENCRYPT_FLAG в конфигурации имеет значение true, BlackMatter шифрует почтовый ящик Exchange локального пользователя.

Сначала он вызывает GetEnvironmentVariableW, чтобы получить путь установки Exchange.

75.png


После получения пути вредоносная программа проверяет, находится ли она в каталоге Program Files (64-разрядная установка Exchange), и добавляет к пути /Mailbox.

76.png


Наконец, BlackMatter порождает потоки для шифрования этого пути с использованием схемы шифрования, описанной выше.

77.png


Обход логических дисков

Если MOUNT_VOL_AND_ENCRYPT_FLAG в конфигурации имеет значение true, BlackMatter монтирует и шифрует все логические диски.

Сначала вредоносная программа перебирает все тома на компьютере с помощью FindFirstVolumeW и FindNextVolumeW. Он вызывает GetVolumePathNamesForVolumeNameW для получения пути к тому и обрабатывает диск по этому пути.

78.png


Она обрабатывает и шифрует только диски типа DRIVE_FIXED или DRIVE_REMOVABLE.

Если текущая ОС - Windows 7 или более поздняя версия, вредоносная программа вызывает DeviceIoControl, чтобы получить информацию о разделе целевого диска.

Если тип раздела диска - PARTITION_STYLE_GPT, BlackMatter устанавливает некоторую проверку с данными типа раздела и вызывает SetVolumeMountPointW для его монтирования.

Если тип раздела диска - PARTITION_STYLE_MBR, BlackMatter вызывает SetVolumeMountPointW для его монтирования.

79.png


Если текущая ОС более ранняя, чем Windows 7, вредоносная программа добавляет /bootmgr в конец пути к диску и вызывает SetVolumeMountPointW для его монтирования.

80.png


Затем BlackMatter вызывает GetLogicalDriveStringsW, чтобы получить список всех логических дисков в системе.

Для каждого из этих дисков, которые являются DRIVE_REMOTE, DRIVE_FIXED или DRIVE_REMOVABLE, вредоносная программа порождает потоки для шифрования этого пути с использованием схемы шифрования, описанной выше.

Если тип диска DRIVE_REMOTE, BlackMatter олицетворяет родительский поток с полученным токеном.

81.png


Обход общих сетевых ресурсов

Если NETWORK_ENCRYPT_FLAG в конфигурации имеет значение true, BlackMatter шифрует все общие сетевые ресурсы.

Во-первых, он получает список всех имен хостов DNS в сети через контроллеры домена.

BlackMatter вызывает DsGetDcNameW для получения информации о контроллере домена и DsGetDcOpenW для открытия новой операции перечисления контроллеров домена.

82.png


Вызывая DsGetDcNextW, вредоносная программа перебирает все контроллеры домена в сети и добавляет их в массив.

83.png


Затем для каждого контроллера домена BlackMatter вызывает ADsOpenObject («LDAP: // rootDSE», 0, 0, 1u, «{FD8256D0-FD15-11CE-ABC4-02608C9E7553}» ,IADs_object) для получения COM-интерфейса IADs.

Используя функцию Get интерфейса IADs, он получает контекст именования по умолчанию для домена.

84.png


Используя контекст именования по умолчанию, BlackMatter создает строку LDAP://CN = Computers, [контекст именования по умолчанию] и вызывает ADsOpenObject для получения интерфейса IADsContainer.

Используя этот интерфейс, он вызывает ADsBuildEnumerator для создания объекта перечислителя для указанного объекта контейнера ADSI. Наконец, используя перечислитель, вредоносная программа вызывает ADsEnumerateNext для перечисления всех имен хостов DNS от контроллера домена.

85.png


Имея список имен хостов DNS в сети, вредоносная программа вызывает NetShareEnum, чтобы начать перечисление каждого из них.

Если тип общего сетевого ресурса не является специальным общим ресурсом, зарезервированным для межпроцессного взаимодействия (IPC $) или удаленного администрирования сервера (ADMIN $), вредоносная программа пропускает его и не добавляет в список общих ресурсов для шифрования.

86.png


Если тип общего сетевого ресурса особый, вредоносная программа выполняет дополнительную проверку и пропускает общий ресурс, если имя сети - admin$ или $c.

87.png


Наконец, BlackMatter исправляет сетевые пути и порождает потоки для шифрования этих путей с использованием схемы шифрования, описанной выше.

88.png


Сетевые коммуникации

Если для параметра SEND_DATA_TO_SERVER_FLAG в конфигурации задано значение 1, BlackMatter дважды отправляет данные на удаленные серверы, один раз перед шифрованием и один раз после шифрования.

Перед шифрованием вредоносная программа отправляет на серверы информацию о машине жертвы.

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

{
"bot_version":"%s",
"bot_id":"%s",
"bot_company":"%.8x%.8x%.8x%.8x%",
"host_hostname":"%s",
"host_user":"%s",
"host_os":"%s",
"host_domain":"%s",
"host_arch":"%s",
"host_lang":"%s",
"disks_info":[
{
"disk_name":"%s", // for each disk
"disk_size":"%u",
"free_size":"%u"
}
]
}


Ниже приведен пример полезной нагрузки, созданной на моей виртуальной машине.

{
"bot_version":"2.0",
"bot_id":"e6175d544e3816664c0c6297cf8bcb18",
"bot_company":"00000000000000000000000000000000",
"host_hostname":"MSEDGEWIN10",
"host_user":"IEUser",
"host_os":"Windows 10 Enterprise Evaluation",
"host_domain":"WORKGROUP",
"host_arch":"x64",
"host_lang":"en-US",
"disks_info":[
{
"disk_name":"C",
"disk_size":"40957",
"free_size":"17290"
},
{
"disk_name":"Z",
"disk_size":"487290",
"free_size":"304117"
}
]
}


89.png


Этот буфер зашифрован и отправляется на удаленные серверы, указанные в поле REMOTE_SERVER_URLS в конфигурации.

После шифрования файла вредоносная программа отправляет на серверы статистику шифрования.

Информация о статистике шифрования встроена в строку в формате, приведенном ниже.

{
"bot_version":"%s",
"bot_id":"%s",
"bot_company":"%.8x%.8x%.8x%.8x%",
"stat_all_files":"%u",
"stat_not_encrypted":"%u",
"stat_size":"%s",
"execution_time":"%u",
"start_time":"%u",
"stop_time":"%u"
}


При отправке этих данных на удаленные серверы BlackMatter сначала шифрует их с помощью ключа AES из конфигурации, а затем кодирует их с помощью Base64.

90.png


Затем он случайным образом генерирует имена объектов HTTP и данные POST-запроса. BlackMatter использует следующий пользовательский агент.

91.png


Он также расшифровывает и использует этот заголовок запроса POST.

AppleWebKit/587.38 (KHTML, like Gecko)

Accept: */*
Connection: keep-alive
Accept-Encoding: gzip, deflate, br
Content-Type: text/plain


Наконец, вредоносная программа использует типичные HTTP-вызовы WinAPI, такие как InternetOpenW для получения дескриптора Интернета, InternetConnectW для получения дескриптора соединения с целевым URL-адресом, HttpOpenRequestW для открытия запроса POST и HttpSendRequestW для отправки зашифрованных данных.

92.png


Странные потоки

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

Похоже, BlackMatter любит использовать этот трюк для создания одного потока для выполнения одного вызова WinAPI.

93.png


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

Так почему я так зол? >:E

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

Или, может быть, этот метод хорош, и я просто сварливый, потому что эта программа-вымогатель чертовски длинна, чтобы полностью проанализировать её :D

Использованная литература








 
Простите за задержку друзья и за то, что не сразу выкинул весь перевод - все дело во времени, которого мало, жалко, что я не могу увеличить сутки с 24 до 36.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
В BlackMatter v2.0 добавлена возможность обработки больших файлов.

Когда ENCRYPT_LARGE_FILE_FLAG в конфигурации имеет значение true, вредоносная программа проверяет, является ли файл большим файлом, через его расширение.

Если расширение файла указано в списке ниже, файл классифицируется как большой.
Спасибо Яша, хороший перевод.
это неясно, зачем эти проверки на "большой" файл?
 
admin спасибо, если бы он не тегнул я бы и не узнал про новый разбор локера. ? ? ?
 
admin спасибо, если бы он не тегнул я бы и не узнал про новый разбор локера. ? ? ?
 
Какой локер будет следующим? У этого корейца дофига времени чтобы так страдать
 
Спасибо Яша, хороший перевод.
это неясно, зачем эти проверки на "большой" файл?
Не скажу конкретно за этот локер, но скорее всего есть приоритетное шифрование. Я например делал так. При попадании файла определенного веса или расширения в общий пул обработки приоритет в работе отдается ему, все остальные действия на данном диске останавливаются
 
Пожалуйста, обратите внимание, что пользователь заблокирован
это неясно, зачем эти проверки на "большой" файл?
Вероятнее всего "большой" файл будет зашифрован не полностью а фрагментами.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Если ReadFile выдает ошибку ERROR_IO_PENDING, вредоносная программа входит в бесконечный цикл ожидания в течение 100 мс и вызывает ReadFile до тех пор, пока не завершится успешно.

interesting post.

but what does this do? i dont understand this code. can somebody explain?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
dont understand this code. can somebody explain?
Программа вызывает функцию ReadFile в асинхронном режиме , функция сразу же возвращает управление (а операцию чтения передает ниже, драйверу FS и т.д.). Программа проверяет , как выполнилась функция (если успешно, должно вернуть TRUE, иначе FALSE). Возвращается FALSE, что значит ошибку, чтобы узнать какая ошибка, смотрим код GetLastError. Если там ERROR_IO_PENDING, то значит операция еще не завершилась. Подробнее читайте здесь https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-readfile

з.ы. MSDN учит, что надо не вызывать Sleep в цикле, а ожидание событие в OVERLAPPED, впрочем это вопрос холиварный, кто как умеет, так и кодит.
 


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