ESCalator – Telegram
ESCalator
6.52K subscribers
471 photos
1 video
18 files
188 links
Tips and tricks от команды экспертного центра безопасности Positive Technologies (PT ESC)
Download Telegram
Графика с сюрпризом: когда векторы скрывают вредоносный код 🤨

В этом посте мы рассмотрим пример фишингового электронного письма, в котором вредоносный контент доставлялся через 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👍116👏3🆒3
😆Spy снова в деле

Группой киберразведки зафиксирована новая кампания хакерской группировки 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
🔥199🆒9🥰1
⚠️ Эксперты PT ESC обнаружили попытки эксплуатации уязвимости CVE-2025-24071

Уязвимость 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👍168👏4🆒2❤‍🔥1
Как починить CFG. Часть вторая 🛠

Ранее мы рассказывали про то, как восстановить 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👍118👏3🆒2
Mmaallwwaarree iinn ooppeennssoouurrccee!

В сети развивается примечательная кампания одного исследователя. Ему принадлежат следующие пакеты:

Пользователь lastbright:
🟢yyttt
🟢bbllaacckkwwoollff
🟢bbllaacckkwwoollff-6ad8f762-1a91-45d7-a9c5-356bd858356a
🟢bbllaacckkwwoollff6ad8f762
🟢bbllaacckkwwoollff6ad8f751
🟢bbllaacckkwwoollff6ad8f752
🟢bbllaacckkwwoollff6ad8f753
Пользователь lifeyi2253:
🟢f2d5cfdc642c3d4
🟢f2d5cfdc642c3d5

Нагрузка отрабатывает в момент установки пакета.

Интересно в реальном времени наблюдать, как развивается кампания:

🔤 PoC с комментариями на китайском. Вероятно, тут приложил руку LLM-ассистент (скриншот 1, библиотека yyttt 0.1).

🔤 Результат работы Unix-команды id отправляется на удаленный сервер (скриншот 2, bbllaacckkwwoollff 0.1, 0.2).

🔤 Выполняется код, полученный с C2-сервера (скриншот 3, 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🔥93