Графика с сюрпризом: когда векторы скрывают вредоносный код 🤨
В этом посте мы рассмотрим пример фишингового электронного письма, в котором вредоносный контент доставлялся через SVG-файл. Ранее о таком способе обхода средств защиты информации писали здесь, но сейчас мы более подробно рассмотрим, как это работает. Наши наблюдения за последние недели показали, что половина вредоносных писем с HTML-подобными вложениями содержат именно SVG-файл.
Фишинговое письмо🥳
Почтовый образец достаточно скромный: отправлялся от почтового ящика из сервиса GMX, поддерживающего свободную регистрацию; в теме содержал информацию о поступлении квитанции об оплате; тело письма было пустым, а вредоносный SVG-файл был единственным вложением (скриншот 1).
SVG-файл😱
Начало файла имеет достаточно обычную SVG-верстку с метаданными, а само тело «изображения» представляет собой загрузку HTML-контента через вызов
Заранее стоит отметить, что анализируемый образец при открытии не отображается как изображение, а загружаемый им скрипт содержит элементы управления вкладками браузера и редиректами.
Внутри блока символьных данных (
JS-скрипт🐈⬛️
Подгружаемый скрипт, естественно, обфусцирован, а также наполнен довольно приличным скопом бессмысленных комментариев.
Конфигурация скрипта содержит блоки Base64-данных, но просто декодировав их информацию не получить (скриншот 3).
Далее по скрипту находится функция декодирования и дешифрования данных из конфига, а также запуска блока кода из дешифрованных данных. Его вывод представляет собой JSON-конфиг, а ключ
В нем мы также видим запрос значения переменной
Запуск функций в скрипте осуществляется через
Советы☕️
Тщательно проверяйте средствами защиты информации поступающие к пользователям образцы SVG-изображений: для них вполне могут подойти признаковые паттерны, используемые для анализа HTML-страниц и другого XML-контента.
#phishing #detect #tip #news
@ptescalator
В этом посте мы рассмотрим пример фишингового электронного письма, в котором вредоносный контент доставлялся через SVG-файл. Ранее о таком способе обхода средств защиты информации писали здесь, но сейчас мы более подробно рассмотрим, как это работает. Наши наблюдения за последние недели показали, что половина вредоносных писем с HTML-подобными вложениями содержат именно SVG-файл.
Фишинговое письмо
Почтовый образец достаточно скромный: отправлялся от почтового ящика из сервиса GMX, поддерживающего свободную регистрацию; в теме содержал информацию о поступлении квитанции об оплате; тело письма было пустым, а вредоносный SVG-файл был единственным вложением (скриншот 1).
SVG-файл
Начало файла имеет достаточно обычную SVG-верстку с метаданными, а само тело «изображения» представляет собой загрузку HTML-контента через вызов
<foreignObject> (скриншот 2).Примечание: элемент <foreignObject> в SVG используется для подгрузки других XML-объектов в изображение, в том числе HTML. Подгрузка последнего позволяет наполнить изображение «фишками» HTML, такими как интерактивные объекты или динамический контент.Заранее стоит отметить, что анализируемый образец при открытии не отображается как изображение, а загружаемый им скрипт содержит элементы управления вкладками браузера и редиректами.
Внутри блока символьных данных (
<![CDATA[ ... ]]>) определяется константа, волатильная в зависимости от адресата электронного письма. Такой подход позволяет не менять непосредственно код JS-скрипта, встраивая его одинаковым Base64-блоком в элемент <noscript src=>.JS-скрипт
Подгружаемый скрипт, естественно, обфусцирован, а также наполнен довольно приличным скопом бессмысленных комментариев.
Конфигурация скрипта содержит блоки Base64-данных, но просто декодировав их информацию не получить (скриншот 3).
Далее по скрипту находится функция декодирования и дешифрования данных из конфига, а также запуска блока кода из дешифрованных данных. Его вывод представляет собой JSON-конфиг, а ключ
code уже содержит URL-адрес вредоносной страницы (скриншот 4).В нем мы также видим запрос значения переменной
huqe из предыдущего пункта и его подстановку за «якорем» в формируемую URL-ссылку — достаточно известная техника проброса email-адреса получателя в форму сбора учетных записей.Запуск функций в скрипте осуществляется через
window.addEventListener("DOMContentLoaded", noscript_function()), но с учетом того, что никакого DOM скрипт не содержит: сразу запускается код из JSON-ключа code, возвращаемого из функции дешифрования.window.location.assign() запускает редирект на URL-адрес из его параметров. Это говорит о том, что непосредственные манипуляции с пользователем осуществляются уже на отдельной веб-странице, а не внутри SVG-изображения.Советы
Тщательно проверяйте средствами защиты информации поступающие к пользователям образцы SVG-изображений: для них вполне могут подойти признаковые паттерны, используемые для анализа HTML-страниц и другого XML-контента.
#phishing #detect #tip #news
@ptescalator
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16👍11❤6👏3🆒3
Группой киберразведки зафиксирована новая кампания хакерской группировки XDSpy, направленная на компрометацию IT-инфраструктуры государственных организаций и ведомств.
Злоумышленники используют фишинговые письма, отправляемые с заспуфленных (поддельных) адресов, маскируясь под доверенные источники. В содержании сообщений применяются элементы социальной инженерии, побуждающие жертв перейти по вредоносной ссылке (скриншоты 1 и 2).
🧑⚖️ В качестве триггеров могут использоваться угрозы возникновения юридических последствий или необходимость ознакомления с якобы официальными документами.
При переходе по ссылке жертва скачивает ZIP-архив (скриншот 3), содержащий LNK-файл, название которого совпадает с темой письма, файл, замаскированный под INI-документ, который на самом деле является архивом с легитимным исполняемым файлом (
.exe), вредоносной DLL-библиотекой и конфигурационным файлом (.cfg), представляющим собой документ-приманку в формате PDF (скриншот 4).При запуске LNK-файла (скриншот 5) активируется встроенный сценарий, который ищет в папке пользователя скачанный архив. Если архив найден, создается временный файл с кодом на
JScript.NET с последующей компиляцией с помощью jsc.exe (поиск компилятора осуществляется в системной папке %SystemRoot%\Microsoft.Net\Framework*jsc.exe) и запуском.🗄 Скомпилированный файл выполняет дополнительные операции, включая распаковку вложенного архива и последующий запуск легитимного исполняемого файла. Он, в свою очередь, запускает вредоносную DLL-библиотеку для скачивания полезной нагрузки. Для запуска DLL-файла используется техника DLL Side-Loading, ранее описанная коллегами из компании F6. XDSpy продолжает попытки совершенствования методов сокрытия и обхода защиты.
Рекомендуется усилить механизмы фильтрации электронной почты, блокировать подозрительные вложения и ссылки в почтовых сообщениях, контролировать активность файлов в системных папках, мониторить сетевой трафик на предмет связи с известными C2-серверами и проводить регулярные учения по кибербезопасности для сотрудников.
IoCs
LNK-файлы
fae06cd491519b67a08739365bd40ff2
c402f9d8ae02450613e871584047ba2c
3d529f6f077eae5c7c2830729f20689f
d8c1609d82a74843dc795128121c190c
fb127a60b29af914eebdf87121320224
cb36db26550d804add58f92fe636d120
40e14abd06af70230849704760272cea
2bdd91c8b815db57708c288d0b5b0934
5e5ca319bcb2630c7b86af9348cea0e7
a3c450458c18090b0c514baa364b7651
DLL-библиотеки
cbc37e28da9f512456704658b55e06ae
6ef03a145e4af940f8eb804b5379695b
d0907aae24c3721d56e29a5e178cfcc4
5daf7a4f8ec97c0cd5013378712f816d
17d9277bac3f58ab11d7e7a9c73bb8d3
987822015413905afe5a95797fdbdd1d
d5b1c03f2f09579f7cdcdde8db779671
129399b838d6526751faf16ecea92942
Документы-приманки
5692f9da3882563d9f45a3bb6deb52ad
e2a1207456d586f3f3680454310fba8f
Домены
pdf-bazaar.com
pdfdepozit.com
file-bazar.com
vashazagruzka365.com
#TI #APT #Phishing
@ptescalator
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥19❤9🆒9🥰1
⚠️ Эксперты PT ESC обнаружили попытки эксплуатации уязвимости CVE-2025-24071
Уязвимость CVE-2025-24071, затрагивающая широкий спектр операционных систем Windows, включая серверные и клиентские версии Windows 10 и Windows 11, была выявлена 11 марта.
CVE-2025-24071 связана с механизмом обработки файлов в Windows Explorer и системой индексирования — они автоматически анализируют файл
Операционная система без взаимодействия с пользователем инициирует NTLM-аутентификацию на атакующем SMB-сервере — это приводит к утечке хеш-суммы NTLMv2 учетной записи жертвы, что может быть использовано для атаки.
Впервые описание и РoС уязвимости привел исследователь 0x6rss в своем блоге. Эксперты также заметили, что уязвимость может использоваться при сохранении файла с расширением
🕵️♀️ Несмотря на то что данные об уязвимости были опубликованы пару дней назад, злоумышленники не спят: мы уже обнаружили попытки эксплуатации CVE-2025-24071 в организациях в России и Республике Беларусь.
Атакующие распространяют архивы, в которых содержатся документ в формате PDF и файл
📈 Эксперты PT ESC прогнозируют всплеск атак с использованием этой уязвимости. Мы рекомендуем следующие методы защиты:
• Ограничить соединения по SMB-протоколу к внешним серверам.
• Обновить Windows до последней версии (установить мартовские обновления).
• Запретить запуск файлов с расширением
• Заблокировать получение файлов с расширением
IoCs
#win #news #cve #detect #ioc
@ptescalator
Уязвимость CVE-2025-24071, затрагивающая широкий спектр операционных систем Windows, включая серверные и клиентские версии Windows 10 и Windows 11, была выявлена 11 марта.
CVE-2025-24071 связана с механизмом обработки файлов в Windows Explorer и системой индексирования — они автоматически анализируют файл
.library-ms, извлекаемый при распаковке вредоносного архива и содержащий ссылку на SMB-ресурс. Операционная система без взаимодействия с пользователем инициирует NTLM-аутентификацию на атакующем SMB-сервере — это приводит к утечке хеш-суммы NTLMv2 учетной записи жертвы, что может быть использовано для атаки.
Впервые описание и РoС уязвимости привел исследователь 0x6rss в своем блоге. Эксперты также заметили, что уязвимость может использоваться при сохранении файла с расширением
.library-ms из электронного письма.🕵️♀️ Несмотря на то что данные об уязвимости были опубликованы пару дней назад, злоумышленники не спят: мы уже обнаружили попытки эксплуатации CVE-2025-24071 в организациях в России и Республике Беларусь.
Атакующие распространяют архивы, в которых содержатся документ в формате PDF и файл
.library-ms (скриншот 1). Жертва распаковывает архив и запускает PDF-приманку (скриншот 2), в то время как файл .library-ms автоматически и незаметно для пользователя отправляет данные на командный центр злоумышленников.📈 Эксперты PT ESC прогнозируют всплеск атак с использованием этой уязвимости. Мы рекомендуем следующие методы защиты:
• Ограничить соединения по SMB-протоколу к внешним серверам.
• Обновить Windows до последней версии (установить мартовские обновления).
• Запретить запуск файлов с расширением
.library-ms.• Заблокировать получение файлов с расширением
.library-ms по электронной почте.IoCs
Письмо Минпромторга России от 17.03.2025 № 182544_21 о направлении сведений по кадровому потенциалу предприятий 2025.pdf.library-ms
MD5: c3f9813545b7f830183369dd649bd595
SHA-1: fcadd1a24f2fa6e0f5338ff0e8d186258c79a05d
SHA-256: a4205e773eee7f33d1bb776a2f7b36da4b3955284208c015257311b8ef23f721
Письмо Минпромторга России от 17.03.2025 № 182544_21.zip
MD5: 83a60de9faed1b0a0344eda108aee44f
SHA-1: 10c02f7a3214dc166f6a8ce19c3d0a988084b3ea
SHA-256: e7897176a7d226c82af27ff525399bd0c7d7b73fdfffac8d2d56b8707637aa99
01 Сопроводительное.pdf.library-ms
MD5: 74e2f206e99040868b60eef04781de8a
SHA-1: f27ecc7ec9c6425a41a3cbfa8bf74f24c32c6488
SHA-256: 8a3728ebdb64e69347c14356b250eb0720801ce367acd1b53510a8dea16f7001
01 Сопроводительное.zip
MD5: 78cd8d4481713fbd4beb790a127bd793
SHA-1: 595b68aaad8a705e78125735cdb7136b6f17b077
SHA-256: 07f6d81b5e3fba23f5de34038424ebec4710cbc16959de4389ceb7855e69bac2
spisoc.library-ms
MD5: 9bab71704cefac935546e09d12dfd2c1
SHA-1: 922c6ee612bd22a85cd1e84f50e18d21656c3f3d
SHA-256: cb9810b6492aad667554958332a3518aeed8d356dcd03b43e4116cd92c938d0f
154.205.148.56
38.60.247.250
94.250.249.129
#win #news #cve #detect #ioc
@ptescalator
🔥20👍16❤8👏4🆒2❤🔥1
Куда предпочитаете отправлять свои NTLM-хеши? 🔐
Anonymous Poll
16%
/dev/null 😏
14%
Responder 📱
5%
Радужные таблицы 🪧
9%
JohnTheRipper 🎩
3%
crackstation 👍
11%
Своей любимке 💓
9%
На «Авито» 🤑
4%
В центральное хранилище хешей 🏦
3%
Лично в руки PhaseShifters 👽
24%
Держу голову в холоде, ноги в тепле, руки — чистыми, сердце — горячим, хеши — в надежном месте 🛡
😁12👍4👏3💘3🦄3
Как починить CFG. Часть вторая 🛠
Ранее мы рассказывали про то, как восстановить Control Flow Graph (CFG) в случае его обфускации. Однако часто при анализе даже необфусцированного ВПО можно встретить случаи, когда CFG некоторых функций генерируется с ошибками. Одним из таких примеров является написанное на Delphi ВПО, где из-за особенностей обработки исключений часто можно встретить картину, как на скриншоте 1.
🤔 Если присмотреться внимательнее (скриншот 2), то можно заметить, что в блоке (1) на стек сохраняется адрес одного из последующих блоков (3), после чего выполняется некоторая логика (зачастую — освобождение ресурсов или объектов) и происходит прыжок на сохраненный ранее адрес (2).
Из-за того что в блоке 2 присутствует дополнительная ссылка, IDA не может однозначно определить адрес, куда будет осуществлен прыжок в
Создадим класс хука, который будет ожидать событие
Напишем функцию поиска сохраняемого на стек адреса
Добавим инициализацию хука при запуске скрипта и загрузим его в IDA. Запустим повторный анализ бинарного файла. В результате получим исправленный граф (скриншот 3).
Оставшиеся одиночные блоки — это вызовы обработчиков исключений; в данном случае они не влияют на ход работы программы. Стоит помнить, что пока хук активен, он будет автоматически вызываться даже при разметке нового кода, который не был размечен ранее.
Happy reversing! 💫
#tip #reverse #idapython
@ptescalator
Ранее мы рассказывали про то, как восстановить Control Flow Graph (CFG) в случае его обфускации. Однако часто при анализе даже необфусцированного ВПО можно встретить случаи, когда CFG некоторых функций генерируется с ошибками. Одним из таких примеров является написанное на Delphi ВПО, где из-за особенностей обработки исключений часто можно встретить картину, как на скриншоте 1.
🤔 Если присмотреться внимательнее (скриншот 2), то можно заметить, что в блоке (1) на стек сохраняется адрес одного из последующих блоков (3), после чего выполняется некоторая логика (зачастую — освобождение ресурсов или объектов) и происходит прыжок на сохраненный ранее адрес (2).
Из-за того что в блоке 2 присутствует дополнительная ссылка, IDA не может однозначно определить адрес, куда будет осуществлен прыжок в
jmp eax. Чтобы исправить эту проблему, напишем небольшой хук, который будет проверять и автоматически патчить подобные места в коде.Создадим класс хука, который будет ожидать событие
ev_ana_insn. Для начала необходимо убедиться, что это действительно интересующая нас последовательность, после чего пройтись «вверх» и попытаться найти сохраненный на стек адрес. Затем пропатчить jmp eax на jmp short address.class DelphiJmpEaxFixer(idaapi.IDP_Hooks):
def lookup_push_insn(self, start: int, limit: int = 30) -> int | None:
...
def ev_ana_insn(self, insn: idaapi.insn_t) -> bool:
#
b = bytes(idaapi.get_bytes(insn.ea - 1, 3))
if idaapi.is_tail(idaapi.get_flags(insn.ea)):
return True
# pop eax | 58
# jmp eax | ff e0
# ensure all pop & jmp seq
if b[0] != 0x58 or b[1] != 0xFF or b[2] != 0xE0:
return False
print(f"Got jmp short eax at {insn.ea:x}")
pushed_address = self.lookup_push_insn(insn.ea)
if pushed_address is None:
return False
delta = pushed_address - insn.ea
if delta < 0 or delta > 128:
return False
print(f"{delta=}")
asm_call = f"jmp short {delta}"
assembled = idaapi.AssembleLine(insn.ea, 0, 0, True, asm_call)
if assembled is None:
return False
return idaapi.patch_bytes(insn.ea, assembled)
Напишем функцию поиска сохраняемого на стек адреса
lookup_push_insn. В ней найдем предположительную верхнюю границу блока 2 и проверим, что блок имеет единственную ссылку. Дополнительно ограничим диапазон поиска, в целях оптимизации.def lookup_push_insn(self, start: int, limit: int = 30) -> int | None:
ptr: int = start
insn = idaapi.insn_t()
jmp_ref = idaapi.BADADDR
for _ in range(limit, 0, -1):
prev_addr = idaapi.decode_prev_insn(insn, ptr)
if prev_addr == idaapi.BADADDR:
break
ptr = prev_addr
_refs = [xref for xref in idautils.CodeRefsTo(ptr, False)]
# If we found refs it's likely an upper basic block address
# it must be a single jmp ref
if _refs:
if len(_refs) != 1:
return None
jmp_ref = next(iter(_refs))
break
if jmp_ref == idaapi.BADADDR:
return None
ref_insn_sz = idaapi.decode_insn(insn, jmp_ref)
if ref_insn_sz == 0 or insn.itype != idaapi.NN_jmp:
return None
addr = idaapi.decode_prev_insn(insn, ptr)
if addr == idaapi.BADADDR or insn.itype != idaapi.NN_push:
return None
return insn.Op1.value
Добавим инициализацию хука при запуске скрипта и загрузим его в IDA. Запустим повторный анализ бинарного файла. В результате получим исправленный граф (скриншот 3).
Оставшиеся одиночные блоки — это вызовы обработчиков исключений; в данном случае они не влияют на ход работы программы. Стоит помнить, что пока хук активен, он будет автоматически вызываться даже при разметке нового кода, который не был размечен ранее.
hook_instance = DelphiJmpEaxFixer()
hook_instance.hook()
Happy reversing! 💫
#tip #reverse #idapython
@ptescalator
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21👍11❤8👏3🆒2
Mmaallwwaarree iinn ooppeennssoouurrccee!
В сети развивается примечательная кампания одного исследователя. Ему принадлежат следующие пакеты:
Пользователь
🟢
🟢
🟢
🟢
🟢
🟢
🟢
Пользователь
🟢
🟢
Нагрузка отрабатывает в момент установки пакета.
Интересно в реальном времени наблюдать, как развивается кампания:
🔤 PoC с комментариями на китайском. Вероятно, тут приложил руку LLM-ассистент (скриншот 1, библиотека
🔤 Результат работы Unix-команды
🔤 Выполняется код, полученный с C2-сервера (скриншот 3,
🔤 Почему бы не прихватить листинг интересных директорий (
🔤 Нет, так много не надо, из директорий достаточно
На хосте либо на виртуалке для тестов злоумышленник использует имя пользователя
Примечателен принцип именования пакетов. Кроме того, всегда интересно следить, как в режиме реального времени злоумышленник борется с тем, что его пакеты удаляют по репортам😈
В информационной безопасности есть термин «пирамида боли» (The Pyramid of Pain) — он описывает сложность ухода от обнаружения. Так вот, в рамках кампании злоумышленник использует один и тот же уникальный файл😑
Опасайтесь всяких волков.
#ti #scs #pyanalysis
@ptescalator
В сети развивается примечательная кампания одного исследователя. Ему принадлежат следующие пакеты:
Пользователь
lastbright:yytttbbllaacckkwwoollffbbllaacckkwwoollff-6ad8f762-1a91-45d7-a9c5-356bd858356abbllaacckkwwoollff6ad8f762bbllaacckkwwoollff6ad8f751bbllaacckkwwoollff6ad8f752bbllaacckkwwoollff6ad8f753Пользователь
lifeyi2253:f2d5cfdc642c3d4f2d5cfdc642c3d5Нагрузка отрабатывает в момент установки пакета.
Интересно в реальном времени наблюдать, как развивается кампания:
yyttt 0.1).id отправляется на удаленный сервер (скриншот 2, bbllaacckkwwoollff 0.1, 0.2).bbllaacckkwwoollff 0.3, 0.4, bbllaacckkwwoollff-6ad8f762-1a91-45d7-a9c5-356bd858356a 0.1)./opt/, /run/), переменные окружения и прочую радость (скриншот 4, bbllaacckkwwoollff6ad8f753 0.1)?/etc/ (скриншот 5, f2d5cfdc642c3d5 0.1).На хосте либо на виртуалке для тестов злоумышленник использует имя пользователя
mind, о чем говорит путь /home/mind/configuration/config.py в четвертой итерации (скриншот 4).Примечателен принцип именования пакетов. Кроме того, всегда интересно следить, как в режиме реального времени злоумышленник борется с тем, что его пакеты удаляют по репортам
В информационной безопасности есть термин «пирамида боли» (The Pyramid of Pain) — он описывает сложность ухода от обнаружения. Так вот, в рамках кампании злоумышленник использует один и тот же уникальный файл
__init__.py, представленный на скриншоте 6. Система PT PyAnalysis легко это подсвечивает Опасайтесь всяких волков.
#ti #scs #pyanalysis
@ptescalator
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
😁20👍13🔥9❤3