ОРИГИНАЛЬНАЯ СТАТЬЯ
ПЕРЕВЕДЕНО СПЕЦИАЛЬНО ДЛЯ xss.pro
$600 на SSD для Jolah Milovski ---> 0x5B1f2Ac9cF5616D9d7F1819d1519912e85eb5C09 для поднятия ноды ETHEREUM и тестов
CredoMap — это стиллер, разработанный российскими APT28/Sofacy/Fancy Bear, который использовался для таргетинга на пользователей в Украине в контексте продолжающейся войны между Россией и Украиной. Первоначально вредоносное ПО было обнаружено Google и CERT-UA Злоумышленник использовал документ для использования уязвимости Follina (CVE-2022-30190), которая привела к загрузке стилера .NET. Вредоносная программа нацелена на кражу учетных данных и файлов cookie из Google Chrome, Mozilla Firefox и Microsoft Edge. Эксфильтрация данных осуществляется путем отправки информации на возможно скомпрометированный сервер C2 по протоколу электронной почты IMAP.
SHA256: 2318ae5d7c23bf186b88abecf892e23ce199381b22c8eb216ad1616ee8877933
Процесс извлекает путь к текущему исполняемому файлу, а затем подключается к жестко запрограммированному серверу C2 (162.241.216.236) через порт 143 (IMAP), используя жестко запрограммированные учетные данные:
Зловред создает объект TcpClient, получает клиентский поток для чтения и записи, а затем считывает ответ от сервера:
Двоичный файл выполняет операцию входа в систему и читает ответ, используя метод Read:
Он выбирает папку INBOX с помощью команды SELECT и выполняет несколько вызовов функций, которые крадут учетные данные и файлы cookie браузеров:
Образец проверяет, существует ли файл «\Google\Chrome\User Data\Default\Network\Cookies» в папке Local AppData, вызывая функцию File.Exists:
Метод File.Copy используется для копирования вышеуказанного файла в новый файл с именем «cc»:
Вредоносный двоичный файл открывает соединение с базой данных Cookies и выполняет SQL-запрос, который извлекает некоторые поля:
Процесс открывает и читает файл с именем «Local/Google/Chrome/User Data/Local State» с помощью File.ReadAllText. Он извлекает случайный ключ в кодировке Base64, зашифрованный с помощью DPAPI, из JSON(["os_crypt"]["encrypted_key"]). Ключ декодируется с помощью Base64 и расшифровывается с помощью вызова функции ProtectedData.Unprotect:
Извлеченное из базы данных Cookies «encrypted_value» расшифровывается с помощью методов ProcessBytes и DoFinal:
Результирующие значения сохраняются в словаре с ключами «host_key» со значениями «name=<Decrypted зашифрованное_значение>;», как показано на рисунке ниже.
Наконец, процесс сериализует словарь в строку JSON, используя JsonConvert.SerializeObject:
Эксфильтрация данных происходит путем ввода действительной команды IMAP APPEND. В поле «От» указано имя пользователя, полученное из свойства Environment.UserName, в поле «Тема» — текущая дата и время на компьютере, полученные из свойства DateTime.UtcNow, а строка JSON также включена в команду
Вредоносная программа проверяет наличие файла «\Google\Chrome\User Data\Default\Login Data» в папке Local AppData с помощью File.Exists:
Функция File.Copy используется для копирования вышеуказанного файла в новый файл с именем «cp»:
Бинарный файл открывает соединение с базой данных Login Data и выполняет SQL-запрос, который извлекает поля «action_url», «username_value» и «password_value»:
Вредоносный процесс считывает файл «Local/Google/Chrome/User Data/Local State», найденный в каталоге AppData, и десериализует его с помощью метода JsonConvert.DeserializeObject:
Образец извлекает случайный ключ в кодировке Base64, зашифрованный с помощью DPAPI, из ["os_crypt"]["encrypted_key"]. Ключ декодируется с помощью Base64 и расшифровывается с помощью вызова функции ProtectedData.Unprotect:
Зашифрованное поле «password_value» расшифровывается с помощью функции, которая будет объяснена ниже:
Первые 12 байтов после пропуска 3 байтов (тег версии) из «password_value» представляют одноразовый номер AES, а остальная информация представляет собой зашифрованный текст, как показано на рисунке ниже.
Как и в первом случае, поле «значение_пароля» расшифровывается вызовом функций ProcessBytes и DoFinal:
Однако не все пароли могут быть зашифрованы с помощью AES-GCM. В случае более старых версий Chrome злоумышленник пытается расшифровать пароли с помощью API ProtectedData.Unprotect:
Как мы видим на рисунке 26, процесс вычисляет строку, содержащую «action_url», «username_value» и расшифрованное поле «password_value», которое было получено с использованием 1-го метода расшифровки или 2-го метода расшифровки соответственно:
Эксфильтрация учетных данных происходит таким же образом с помощью команды IMAP на сервер C2. Бинарный файл проверяет, может ли каталог «Mozilla\Firefox\Profiles\» находиться в папке AppData
Вредоносная программа ищет файл с именем «cookies.sqlite» в папках профиля. База данных «cookies.sqlite» копируется в файл с именем «fc»:
Образец запускает SQL-запрос «SELECT * FROM moz_cookies» для получения файлов cookie Firefox:
Создается новый словарь с ключами «host» со значениями «name=value;», как показано на рисунке ниже.
Словарь сериализуется в JSON и будет удален через IMAP. Исполняемый файл проверяет, можно ли идентифицировать следующие файлы в папках профиля:
- logins.json
- key4.db
- cert9.db
- signons.sqlite
- key3.db
- cert8.db
Если какой-либо из вышеуказанных файлов существует, он копируется в текущий каталог, а его содержимое кодируется с использованием Base64. Расположение файла и содержимое в кодировке Base64 эксфильтрируются с использованием протокола IMAP. Наконец, вновь созданные файлы удаляются с помощью File.Delete:
Функция File.Exists используется для проверки наличия файла «\Microsoft\Edge\User Data\Default\Login Data» в каталоге Local AppData:
Приведенный выше файл копируется в новый файл с именем «ep»
В примере выполняется следующий SQL-запрос, который извлекает имена пользователей и зашифрованные пароли из таблицы «логины»:
Поле «password_value» расшифровывается путем вызова функции расшифровки, которая также использовалась для расшифровки учетных данных Chrome:
В случае более старых версий Microsoft Edge процесс пытается расшифровать пароли с помощью функции ProtectedData.Unprotect:
Вредоносная программа создает строку, содержащую «action_url», «username_value» и расшифрованное поле «password_value», полученное одним из двух способов расшифровки:
Исполняемый файл проверяет, можно ли найти файл «\Microsoft\Edge\User Data\Default\Network\Cookies» в папке Local AppData
File.Copy используется для копирования вышеуказанного файла в файл с именем «ec»:
Следующий SQL-запрос выполняется вредоносной программой, которая извлекает некоторые поля из таблицы «cookies»:
Двоичный файл извлекает ключ в кодировке Base64, зашифрованный с помощью DPAPI, из «%LocalApplicationData%\Microsoft\Edge\User Data\Local State». Ключ расшифровывается через вызов функции ProtectedData.Unprotect:
Поле «encrypted_value» расшифровывается с помощью извлеченного выше ключа AES путем вызова методов ProcessBytes и DoFinal:
Результатом функции является словарь, содержащий соответствующую информацию, которая сериализуется с помощью JsonConvert.SerializeObject:
Все файлы, которые были скопированы в текущий каталог, удаляются с помощью функции File.Delete:
Вредоносный процесс устанавливает атрибуты Normal для файла с именем «SQLite.Interop.dll», который, как обнаружила Malwarebytes, был загружен с сервера C2 вместе с исходным исполняемым файлом. Файл DLL удаляется с помощью File.Delete и другой функции удаления, реализованной вредоносной программой:
Реализация функции удаления состоит в создании процесса cmd.exe, удаляющего файл DLL, показанный выше:
Процесс удаляет исходный исполняемый файл и затем завершается:
Индикаторы компрометации
C2-сервер162.241.216.236
SHA256
2318ae5d7c23bf186b88abecf892e23ce199381b22c8eb216ad1616ee8877933
Порожденные процессы
cmd.exe «/C Del <files>»
Правило YARA для обнаружения угрозы
rule CredoMap_APT28
Код с оформлением (BB-коды):
{
meta:
author = "Vlad Pasca - SecurityScorecard"
Date = "2022-09-16"
strings:
$s1 = "\\cookies.sqlite" fullword wide
$s2 = "SQLite.Interop.dll" fullword wide
$s3 = "Subject:" fullword wide
$s4 = "$ LOGIN" fullword wide
$s5 = "/C Del" fullword wide
condition:
(uint16(0) == 0x5A4D) and (4 of ($s*))
}