
Україна Online: Новини | Політика

Телеграмна служба новин - Україна

Резидент

Мир сегодня с "Юрий Подоляка"

Труха⚡️Україна

Николаевский Ванёк

Лачен пише

Реальний Київ | Украина

Реальна Війна

Україна Online: Новини | Політика

Телеграмна служба новин - Україна

Резидент

Мир сегодня с "Юрий Подоляка"

Труха⚡️Україна

Николаевский Ванёк

Лачен пише

Реальний Київ | Украина

Реальна Війна

Україна Online: Новини | Політика

Телеграмна служба новин - Україна

Резидент

ESCalator
Tips and tricks от команды экспертного центра безопасности Positive Technologies (PT ESC)
Рейтинг TGlist
0
0
ТипПубличный
Верификация
Не верифицированныйДоверенность
Не провернныйРасположениеРосія
ЯзыкДругой
Дата создания каналаJun 03, 2024
Добавлено на TGlist
Nov 12, 202424.03.202514:59
Как починить 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):
Напишем функцию поиска сохраняемого на стек адреса
lookup_push_insn
. В ней найдем предположительную верхнюю границу блока 2 и проверим, что блок имеет единственную ссылку. Дополнительно ограничим диапазон поиска, в целях оптимизации.def lookup_push_insn(self, start: int, limit: int = 30) -> int | None:
Добавим инициализацию хука при запуске скрипта и загрузим его в IDA. Запустим повторный анализ бинарного файла. В результате получим исправленный граф (скриншот 3).
Оставшиеся одиночные блоки — это вызовы обработчиков исключений; в данном случае они не влияют на ход работы программы. Стоит помнить, что пока хук активен, он будет автоматически вызываться даже при разметке нового кода, который не был размечен ранее.
hook_instance = DelphiJmpEaxFixer()
hook_instance.hook()
Happy reversing! 💫
#tip #reverse #idapython
@ptescalator


16.04.202511:44
APT-группировка Cloud Atlas атакует предприятия ОПК России 🌎
В конце прошлого — начале текущего года группа киберразведки обнаружила миграцию управляющей инфраструктуры и эволюцию вредоносных документов в арсенале Cloud Atlas, ознаменовавшие начало новой кампании группировки в отношении предприятий оборонно-промышленного комплекса России.
Наблюдение за выявленной вредоносной инфраструктурой позволило в режиме реального времени отслеживать весь размах новой киберактивности группировки Cloud Atlas, в том числе вскрыть BEC-атаки с использованием электронной почты ранее зараженных предприятий ОПК России для отправки вредоносных документов Microsoft Office в адрес контрагентов.
📫 Вектором проникновения традиционно выступала фишинговая рассылка электронных писем с вредоносными документами Microsoft Office во вложении. Информация об управляющей инфраструктуре и вредоносные VB-скрипты были скрыты в альтернативном потоке данных (1Table) документов. Открытие файлов приводило к выполнению этих скриптов, которые взаимодействовали с API Google Sheets для передачи информации о зараженной системе и загрузки бэкдора PowerShower с последующей эксфильтрацией украденных данных в облачные хранилища (более подробно — в нашем прошлом исследовании).
🤷♂️ Обнаруженные документы — по большей части характерные для государственного сектора шаблоны — отсутствуют в открытом доступе и, вероятнее всего, были украдены из сетей ранее атакованных предприятий. Во избежание раскрытия предприятий, в сетях которых присутствует группировка, из зараженных документов накануне использования в новых атаках удалялись метаданные, о чем свидетельствуют временные метки их модификации.
Активность АРТ-группировки Cloud Atlas отслеживается с 2014 года. Традиционной географией атак являются страны СНГ. В 2024 году вектор кибератак существенно сместился в сторону России, их высокая интенсивность, частота миграции атакующей инфраструктуры и эволюции вредоносных документов сохраняются до настоящего времени.
Прогнозируется сохранение высокого уровня опасности киберугроз для российских учреждений и организаций, исходящих от APT-группировки Cloud Atlas.
🧐 Подробнее читайте на нашем сайте.
#TI #APT #Malware
@ptescalator
В конце прошлого — начале текущего года группа киберразведки обнаружила миграцию управляющей инфраструктуры и эволюцию вредоносных документов в арсенале Cloud Atlas, ознаменовавшие начало новой кампании группировки в отношении предприятий оборонно-промышленного комплекса России.
Наблюдение за выявленной вредоносной инфраструктурой позволило в режиме реального времени отслеживать весь размах новой киберактивности группировки Cloud Atlas, в том числе вскрыть BEC-атаки с использованием электронной почты ранее зараженных предприятий ОПК России для отправки вредоносных документов Microsoft Office в адрес контрагентов.
📫 Вектором проникновения традиционно выступала фишинговая рассылка электронных писем с вредоносными документами Microsoft Office во вложении. Информация об управляющей инфраструктуре и вредоносные VB-скрипты были скрыты в альтернативном потоке данных (1Table) документов. Открытие файлов приводило к выполнению этих скриптов, которые взаимодействовали с API Google Sheets для передачи информации о зараженной системе и загрузки бэкдора PowerShower с последующей эксфильтрацией украденных данных в облачные хранилища (более подробно — в нашем прошлом исследовании).
По содержанию вредоносные вложения представляли собой приглашения на курсы повышения квалификации, документы об антикоррупционных проверках и мобилизационных мероприятиях, акты сверки взаимных расчетов, справки в отношении сотрудников, резюме соискателей на должность оператора ЧПУ.
🤷♂️ Обнаруженные документы — по большей части характерные для государственного сектора шаблоны — отсутствуют в открытом доступе и, вероятнее всего, были украдены из сетей ранее атакованных предприятий. Во избежание раскрытия предприятий, в сетях которых присутствует группировка, из зараженных документов накануне использования в новых атаках удалялись метаданные, о чем свидетельствуют временные метки их модификации.
Активность АРТ-группировки Cloud Atlas отслеживается с 2014 года. Традиционной географией атак являются страны СНГ. В 2024 году вектор кибератак существенно сместился в сторону России, их высокая интенсивность, частота миграции атакующей инфраструктуры и эволюции вредоносных документов сохраняются до настоящего времени.
Прогнозируется сохранение высокого уровня опасности киберугроз для российских учреждений и организаций, исходящих от APT-группировки Cloud Atlas.
🧐 Подробнее читайте на нашем сайте.
#TI #APT #Malware
@ptescalator


01.04.202511:38
PT ESC обнаружил новую кампанию Joking Wolf 🐺
Юмористы проникают в популярные (и не очень) Telegram-каналы и публикуют несуществующие новости. Основная цель — ввести граждан в заблуждение, последствия — легкая растерянность и желание проверить информацию.
Попытки проникновения зафиксированы и в канал @ptescalator, но были успешно отбиты. Для защиты рекомендуем прокачивать навыки критического мышления. Эксклюзивное фото злоумышленников прикрепляем к посту.
IoCs опубликовали в Telegraph.
Будьте бдительны!
Юмористы проникают в популярные (и не очень) Telegram-каналы и публикуют несуществующие новости. Основная цель — ввести граждан в заблуждение, последствия — легкая растерянность и желание проверить информацию.
Попытки проникновения зафиксированы и в канал @ptescalator, но были успешно отбиты. Для защиты рекомендуем прокачивать навыки критического мышления. Эксклюзивное фото злоумышленников прикрепляем к посту.
IoCs опубликовали в Telegraph.
Будьте бдительны!
02.04.202511:45
@Вредонос попал в систему...
@Вредонос хочет сделать пакость...
@Вредонос вызывает WinAPI и...
@EDR-система обнаруживает его и начинает очень громко орать...
😱 Не самое приятное развитие событий для вирусописателей. Как же они борются с подобными ситуациями?
Один из способов — вызывать необходимую функцию Windows не через WinAPI, а через системные вызовы (system calls). Многие EDR-системы перехватывают вызовы WinAPI-функций, но далеко не всегда они определяют использование system calls. Этой особенностью можно воспользоваться для обхода защитных механизмов.
SysWhispers
Зачем самому реализовывать механизм вызова
Выглядит это так: вызываем функцию
🧐 И вот теперь приходит исследователь, которому нужно это отреверсить. Как же ему понять, какой syscall используется?
Напрямую получить номер нужной системной функции мы не можем: он захеширован, поэтому придется что-то придумать. Можно написать скрипт, который будет реализовывать тот же алгоритм хеширования, что и SysWhispers (по сути, в нем используется XOR имени функции по случайному значению). Но можно пойти другим путем: с помощью механизма
Просто сравните — написать скрипт, который будет воссоздавать хеш-функцию, или одну строчку кода на Python:
👋 Угу, номер syscall у нас есть, а что дальше, как узнать его имя?
Можем найти его по номеру в табличке, а можем обойтись без нее и податься в автоматизацию процесса. Как ранее было сказано,
Код скрипта, реализующего эту логику, представлен в публикации ниже. Основная идея заключается в том, что все функции-обертки над системными вызовами однотипны и выглядят примерно так, как показано на скриншоте 2. Перед вызовом инструкции
😮💨 Вот таким незамысловатым образом реверсер может облегчить себе жизнь, когда ему попадется вредонос с SysWhispers. Напоследок еще раз (на всякий случай) скажем, что представленный скрипт будет работать только в режиме отладки, поэтому, если речь заходит про анализ чего-то зловредного, то лучше делать это в виртуальной машине. Так что стоит отметить, что IDA работает со многими отладчиками, в нашем же случае все разрабатывалось и проверялось с использованием WinDbg.
#reverse #malware #tip
@ptescalator
@Вредонос хочет сделать пакость...
@Вредонос вызывает WinAPI и...
@EDR-система обнаруживает его и начинает очень громко орать...
😱 Не самое приятное развитие событий для вирусописателей. Как же они борются с подобными ситуациями?
Один из способов — вызывать необходимую функцию Windows не через WinAPI, а через системные вызовы (system calls). Многие EDR-системы перехватывают вызовы WinAPI-функций, но далеко не всегда они определяют использование system calls. Этой особенностью можно воспользоваться для обхода защитных механизмов.
SysWhispers
Зачем самому реализовывать механизм вызова
syscall
, если добрые люди уже это сделали за тебя? Правильно, будем использовать готовое решение — SysWhispers (в этом посте будем говорить про его вторую версию). Стоит отметить, что помимо предоставления удобного интерфейса, с помощью которого можно вызывать syscall
, SysWhispers также хеширует их.Выглядит это так: вызываем функцию
SW2_GetSyscallNumber
, в которую передаем хеш необходимого syscall
. В ответ функция возвращает номер системной функции, которую мы и вызываем с помощью инструкции syscall
. Более подробно этот процесс показан на скриншоте 1 (на нем приведен пример вызова функции NtWriteVirtualMemory
).🧐 И вот теперь приходит исследователь, которому нужно это отреверсить. Как же ему понять, какой syscall используется?
Напрямую получить номер нужной системной функции мы не можем: он захеширован, поэтому придется что-то придумать. Можно написать скрипт, который будет реализовывать тот же алгоритм хеширования, что и SysWhispers (по сути, в нем используется XOR имени функции по случайному значению). Но можно пойти другим путем: с помощью механизма
Appcall
в IDA Pro (Appcall работает только в режиме отладки, поэтому с вредоносами лучше работать в виртуальной машине) напрямую вызвать SW2_GetSyscallNumber
, передав ей хеш необходимой функции. Мы все также получим номер функции, но при этом процесс пройдет значительно быстрее. Просто сравните — написать скрипт, который будет воссоздавать хеш-функцию, или одну строчку кода на Python:
syscall_id = idaapi.Appcall.SW2_GetSyscallNumber(hash).value
👋 Угу, номер syscall у нас есть, а что дальше, как узнать его имя?
Можем найти его по номеру в табличке, а можем обойтись без нее и податься в автоматизацию процесса. Как ранее было сказано,
Appcall
работает именно в режиме отладки, в этом режиме мы можем получить имена функций, определенных в различных модулях, загружаемых во время исполнения бинаря. Среди этих модулей самым интересным для нас является ntdll.dll
: в нем находятся определения оберток над системными вызовами, которые имеют идентичные названия. По этим оберткам мы и получим имя системной функции. Код скрипта, реализующего эту логику, представлен в публикации ниже. Основная идея заключается в том, что все функции-обертки над системными вызовами однотипны и выглядят примерно так, как показано на скриншоте 2. Перед вызовом инструкции
syscall
происходит передача номера нужной функции в регистр EAX
(вторая инструкция). Мы можем взять вторую инструкцию функции-обертки, получить ее операнд — это и будет номер системного вызова. Далее остается сравнить его с тем, что ищем мы, и вывести результат (скриншот 3).😮💨 Вот таким незамысловатым образом реверсер может облегчить себе жизнь, когда ему попадется вредонос с SysWhispers. Напоследок еще раз (на всякий случай) скажем, что представленный скрипт будет работать только в режиме отладки, поэтому, если речь заходит про анализ чего-то зловредного, то лучше делать это в виртуальной машине. Так что стоит отметить, что IDA работает со многими отладчиками, в нашем же случае все разрабатывалось и проверялось с использованием WinDbg.
#reverse #malware #tip
@ptescalator
04.04.202514:48
А вы знали, что злые люди не любят парсеры LNK-файлов? 👿
В марте мы писали об атаках XDSpy на российские организации. LNK-файлы, которые использовались в этой атаке, были модифицированы так, что при их обработке многие парсеры «падали». Например, это касается LECmd, LnkParse3 и ExifTool, который используется на VirusTotal (скриншот 1).
Разберемся, в чем кроется проблема и как ее исправить 🔧
В общих чертах структура LNK-файла выглядит следующим образом:
1.
2. [Optional]
3. [Optional]
4. [Optional]
STRING_DATA — это массив структур
•
•
Структура
🫱 Именно в
Как оказалось, Windows «под капотом» ограничивает длину строк
• Парсеры «падают» из-за некорректных значений (считают смещение
• Windows ограничивается 260 символами, правильно попадая на следующую
• Ограничение в 260 символов точно подразумевается для
• Для
• Windows считает последний байт нулевым, даже если это не так, хотя из документации можно было предположить, что последний символ тоже учитывается.
🕵️♀️ В варианте LNK-файла от XDSpy атакующие «сломали» таким образом строку
Чтобы исправить это недоразумение, нужно проверять размер
#tip #win
@ptescalator
В марте мы писали об атаках XDSpy на российские организации. LNK-файлы, которые использовались в этой атаке, были модифицированы так, что при их обработке многие парсеры «падали». Например, это касается LECmd, LnkParse3 и ExifTool, который используется на VirusTotal (скриншот 1).
Разберемся, в чем кроется проблема и как ее исправить 🔧
В общих чертах структура LNK-файла выглядит следующим образом:
1.
SHELL_LINK_HEADER
с интересующим нас значением LinkFlags
. Оно задает присутствие тех или иных структур в LNK-файле и выглядит так:typedef struct
{
uint32 HasLinkTargetIDList : 1; // есть LINKTARGET_IDLIST
uint32 HasLinkInfo : 1; // есть LINKINFO
uint32 HasName : 1; // есть STRING_DATA
uint32 HasRelativePath : 1; // есть STRING_DATA
uint32 HasWorkingDir : 1; // есть STRING_DATA
uint32 HasArguments : 1; // есть STRING_DATA
uint32 HasIconLocation : 1; // есть STRING_DATA
uint32 IsUnicode : 1; // строки в UTF-16
// ... skipped
} LinkFlags;
2. [Optional]
LINKTARGET_IDLIST
. 3. [Optional]
LINKINFO
.4. [Optional]
STRING_DATA
.STRING_DATA — это массив структур
StringData
, каждая из которых имеет следующий формат:•
CountCharacters
(количество символов в строке, поэтому для юникода количество байт будет CountCharacters
× 2).•
String
(строка, которая в соответствии с документацией MUST NOT be NULL-terminated
).Структура
STRING_DATA
содержит Description (Name)
, RelativePath
, WorkingDir
, Arguments
и IconLocation
в том порядке, который указан в LinkFlags
.🫱 Именно в
CountCharacters
и кроется проблема для парсеров, которые на него полагаются. Чтобы их «уронить» добрые дяденьки устанавливают большое значение в CountCharacters
, например 0xFFFF
. String
делают длиной до 260 символов, а следующую StringData
располагают ровно через 260 символов (в UTF-16 это 520 байт).Как оказалось, Windows «под капотом» ограничивает длину строк
Description
, RelativePath
и WorkingDir
260 символами. В итоге мы имеем следующее:• Парсеры «падают» из-за некорректных значений (считают смещение
0xFFFF
и попадают на бессмысленные байты).• Windows ограничивается 260 символами, правильно попадая на следующую
StringData
, и запускает LNK-файл без проблем.• Ограничение в 260 символов точно подразумевается для
Description
, что было неочевидно, RelativePath
и WorkingDir
.• Для
Arguments
такого ограничения нет или порог сильно выше, что уже логично. При этом в свойствах LNK-файла при нажатии правой кнопкой будет отображаться только 260 первых символов команды.• Windows считает последний байт нулевым, даже если это не так, хотя из документации можно было предположить, что последний символ тоже учитывается.
🕵️♀️ В варианте LNK-файла от XDSpy атакующие «сломали» таким образом строку
WorkingDir
и установили ее значение в C:\Windows\System32\<пробелы>
с длиной 260 символов (скриншот 2). Здесь можно посмотреть, как выглядит такой файл на VT (скриншот 3).---- WorkingDir ----
0x0 CountCharacters (0XFFFF)
0x2 String (до 0x208) // C:\Windows\System32_______
---- Arguments ----
0x20A CountCharacters // Парсер Windows идет сюда
0x20C String // Arguments
...
0xFFFF RandomData // Обычные парсеры идут сюда
Чтобы исправить это недоразумение, нужно проверять размер
CountCharacters
для релевантных строк и ограничивать смещение до следующей StringData
260 символами с учетом флага isUnicode.#tip #win
@ptescalator
14.04.202510:09
Большой браузер следит за тобой 👹
Группа киберразведки зафиксировала новую кампанию с использованием обновленного стилера Unicorn, начавшуюся в середине февраля и продолжающуюся по сей день. Целью атак является государственный сектор, а за их проведением стоит ранее не идентифицированная хакерская группировка.
Злоумышленники рассылают фишинговые письма с тематикой СВО, содержащие вложенные архивы с вредоносным HTA-файлом (скриншот 1). Этот файл содержит обфусцированный код и имеет название, совпадающее с темой письма. При его открытии запускается документ-приманка (скриншот 2), а вместе с ним — вредоносный код (посредством события
ВПО пытается мимикрировать под Яндекс Браузер. Вредоносный скрипт создает VBA-файлы по пути
🔤 Изначально злоумышленники использовали три скрипта:
•
•
•
👾 В последних атаках группировка модифицировала и расширила функциональность ВПО:
• В
• С помощью
• Добавлен механизм самозащиты:
⚠️ Важно отметить, что VBA-скрипты не детектируются антивирусными решениями, так как считывают значения из реестра и запускают вредоносный код напрямую. Это усложняет процесс обнаружения (скриншот 5).
Анализ атаки указывает на развитие методики злоумышленников. Кроме того, стоит отметить, что группировка проявляет интерес к расширениям, связанным с картографией. Это может свидетельствовать о специфической цели или о стратегическом интересе в указанной области.
IoCs
#TI #APT #Malware #Phishing
@ptescalator
Группа киберразведки зафиксировала новую кампанию с использованием обновленного стилера Unicorn, начавшуюся в середине февраля и продолжающуюся по сей день. Целью атак является государственный сектор, а за их проведением стоит ранее не идентифицированная хакерская группировка.
Злоумышленники рассылают фишинговые письма с тематикой СВО, содержащие вложенные архивы с вредоносным HTA-файлом (скриншот 1). Этот файл содержит обфусцированный код и имеет название, совпадающее с темой письма. При его открытии запускается документ-приманка (скриншот 2), а вместе с ним — вредоносный код (посредством события
window_OnLoad
). ВПО пытается мимикрировать под Яндекс Браузер. Вредоносный скрипт создает VBA-файлы по пути
%USERPROFILE%\AppData\Local\YandexUpdate
, добавляет полезную нагрузку в реестр HKCU\Software\YandexUpdate
(скриншоты 3, 4), прописывает VBA-файлы в автозагрузку через реестр HKCU\Software\Microsoft\Windows\CurrentVersion\Run
, а также регистрирует задания в планировщике с помощью schtasks
. 🔤 Изначально злоумышленники использовали три скрипта:
•
log01.vbs
— выполняет обход директорий пользователей, анализирует содержимое определенных папок и сохраняет файлы с заданными расширениями (.pdf
, .txt
, .doc
, .docx
, .rtf
, .od
t, .xls
, .xlsx
, .ods
, .csv
, .jpg
, .png
, .zip
, .rar
). •
log02.vbs
— похищает учетные данные из Telegram и браузеров (из Chrome, Edge, Opera, Яндекс Браузера). •
log03.vbs
— передает собранные данные на командный сервер. 👾 В последних атаках группировка модифицировала и расширила функциональность ВПО:
• В
crash_report.vbs
(ранее — log01.vbs
) увеличен список расширений файлов для сбора (.vsdx
, .vdx
, .7z
, .tar
, .jpeg
, .cdr
, .kmz
, .kml
, .aqe
). Важно, что были добавлены расширения .kml
и .kmz
, используемые в военной топографии.• С помощью
service_report.vba
злоумышленники пытались получить список всех флеш-накопителей, но скрипт оказался нерабочим. • Добавлен механизм самозащиты:
update_logging.vbs
восстанавливает удаленные вредоносные файлы, подгружая их содержимое из реестра. ⚠️ Важно отметить, что VBA-скрипты не детектируются антивирусными решениями, так как считывают значения из реестра и запускают вредоносный код напрямую. Это усложняет процесс обнаружения (скриншот 5).
Анализ атаки указывает на развитие методики злоумышленников. Кроме того, стоит отметить, что группировка проявляет интерес к расширениям, связанным с картографией. Это может свидетельствовать о специфической цели или о стратегическом интересе в указанной области.
IoCs
Домен
vm-tiktok.org
Хеш-суммы
096c340e9a20476a191721e6eaeedcc2
0debff602f2912127c562839c7fcd3d7
e25042fba726356d7e88efe0608a4e36
290a4cff70029ca2a0095a3e3a8b19e7
65ef77db51277a046f76f21a59dee9e0
80bc350629a1ba59b2a19b9029feece5
d0f9fadbf157a8236b88cfc03f17a811
4feaa6c50348641799a8f56e76cd52e7
#TI #APT #Malware #Phishing
@ptescalator


09.04.202514:10
🐾 По следам Puma: как обнаружить руткит через его же интерфейс
Сегодня в нашем обзоре технически интересный и многофункциональный руткит для Linux — Puma, недавно исследованный коллегами из Elastic Security Labs и Solar 4RAYS.
Puma представляет собой комплексный руткит уровня ядра (LKM), нацеленный на длительное скрытное пребывание в системе и кражу учетных данных для перемещения в инфраструктуре жертвы. Закрепляется в системе путем подмены штатного cron на модифицированный вредоносный аналог, состоящий из нескольких компонентов:
1️⃣ Загрузчик (
2️⃣ Легитимный cron (
3️⃣ LKM-модуль (
4️⃣ Бэкдор (
🎯 Любопытная деталь
Помимо стандартного удаленного управления через C2-сервер в Puma используется и локальное, реализованное через переопределенный системный вызов rmdir: при наличии определенных аргументов руткит интерпретирует вызов как команду и возвращает инициировавшему процессу результат выполнения. Так, бэкдор использует этот механизм, чтобы запросить у модуля конфигурацию удаленного сервера или отобразить перехваченные конфиденциальные данные.
🔎 Что нам удалось обнаружить
Анализируя Puma, мы выявили в LKM-модуле важную уязвимость: он не проверяет, какой именно процесс вызывает переопределенный rmdir для выполнения команд. Таким образом, вызвав rmdir с определенными аргументами, можно однозначно определить присутствие руткита в системе.
📌 Почему это важно
Уязвимость трудноустранима: злоумышленники, используя возможности бэкдора, могут обновлять лишь его код, но не код загруженного в систему модуля ядра. Для этого потребуется значительно больше усилий. Таким образом, уязвимость можно использовать для быстрого детекта Puma в инфраструктуре.
🐍 Для удобства мы написали небольшой Python-скрипт, который поможет вам определить руткит в системе:
Не самый типичный случай — когда уязвимость играет не против защитника, а ему на руку. Такое бывает нечасто, но именно это дает возможность для точного детекта.
⚠️ Если вы обнаружили Puma, то в инфраструктуре почти наверняка есть и другое ВПО. Обязательно обратитесь за помощью к специалистам по реагированию на инциденты информационной безопасности.
#TI #detect #malware #linux
@ptescalator
Сегодня в нашем обзоре технически интересный и многофункциональный руткит для Linux — Puma, недавно исследованный коллегами из Elastic Security Labs и Solar 4RAYS.
Puma представляет собой комплексный руткит уровня ядра (LKM), нацеленный на длительное скрытное пребывание в системе и кражу учетных данных для перемещения в инфраструктуре жертвы. Закрепляется в системе путем подмены штатного cron на модифицированный вредоносный аналог, состоящий из нескольких компонентов:
1️⃣ Загрузчик (
wpn.bin
) — отвечает за корректную установку модуля ядра.2️⃣ Легитимный cron (
tgt.bin
) — обеспечивает исправную работу cron, чтобы жертва не заметила подмены.3️⃣ LKM-модуль (
audit
) — основной компонент для перехвата системных вызовов и функций ядра Linux. Благодаря ему модуль эффективно скрывает процессы, файлы, директории и сетевые соединения, а также перехватывает чувствительную информацию, такую как учетные данные и криптографические ключи.4️⃣ Бэкдор (
libs.so
) — обеспечивает связь с C2-сервером, получение команд от злоумышленников и передачу результатов.🎯 Любопытная деталь
Помимо стандартного удаленного управления через C2-сервер в Puma используется и локальное, реализованное через переопределенный системный вызов rmdir: при наличии определенных аргументов руткит интерпретирует вызов как команду и возвращает инициировавшему процессу результат выполнения. Так, бэкдор использует этот механизм, чтобы запросить у модуля конфигурацию удаленного сервера или отобразить перехваченные конфиденциальные данные.
🔎 Что нам удалось обнаружить
Анализируя Puma, мы выявили в LKM-модуле важную уязвимость: он не проверяет, какой именно процесс вызывает переопределенный rmdir для выполнения команд. Таким образом, вызвав rmdir с определенными аргументами, можно однозначно определить присутствие руткита в системе.
📌 Почему это важно
Уязвимость трудноустранима: злоумышленники, используя возможности бэкдора, могут обновлять лишь его код, но не код загруженного в систему модуля ядра. Для этого потребуется значительно больше усилий. Таким образом, уязвимость можно использовать для быстрого детекта Puma в инфраструктуре.
🐍 Для удобства мы написали небольшой Python-скрипт, который поможет вам определить руткит в системе:
import ctypes
Не самый типичный случай — когда уязвимость играет не против защитника, а ему на руку. Такое бывает нечасто, но именно это дает возможность для точного детекта.
⚠️ Если вы обнаружили Puma, то в инфраструктуре почти наверняка есть и другое ВПО. Обязательно обратитесь за помощью к специалистам по реагированию на инциденты информационной безопасности.
#TI #detect #malware #linux
@ptescalator
26.03.202510:39
Mmaallwwaarree iinn ooppeennssoouurrccee!
В сети развивается примечательная кампания одного исследователя. Ему принадлежат следующие пакеты:
Пользователь
🟢
🟢
🟢
🟢
🟢
🟢
🟢
Пользователь
🟢
🟢
Нагрузка отрабатывает в момент установки пакета.
Интересно в реальном времени наблюдать, как развивается кампания:
🔤 PoC с комментариями на китайском. Вероятно, тут приложил руку LLM-ассистент (скриншот 1, библиотека
🔤 Результат работы Unix-команды
🔤 Выполняется код, полученный с C2-сервера (скриншот 3,
🔤 Почему бы не прихватить листинг интересных директорий (
🔤 Нет, так много не надо, из директорий достаточно
На хосте либо на виртуалке для тестов злоумышленник использует имя пользователя
Примечателен принцип именования пакетов. Кроме того, всегда интересно следить, как в режиме реального времени злоумышленник борется с тем, что его пакеты удаляют по репортам 😈
В информационной безопасности есть термин «пирамида боли» (The Pyramid of Pain) — он описывает сложность ухода от обнаружения. Так вот, в рамках кампании злоумышленник использует один и тот же уникальный файл
Опасайтесь всяких волков.
#ti #scs #pyanalysis
@ptescalator
В сети развивается примечательная кампания одного исследователя. Ему принадлежат следующие пакеты:
Пользователь
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
02.04.202511:45
Код скрипта:
@ptescalator
import idaapi
@ptescalator


15.04.202515:39
Реально тонкое взаимодействие 🕊
В ходе реверс-инжиниринга протокола одного из бразильских банковских троянов обнаружилось использование интересного сетевого фреймворка — RealThinClient. Процесс общения между клиентом и сервером в этом фреймворке построен на сериализации структур вызова функции в строковый формат и их последующей десериализации на другой стороне. Это делает RTC не только мощным инструментом разработки, но и удобной платформой для скрытого обмена командами — например, в случае малварного поведения.
Сначала клиент и сервер проходят через кастомное рукопожатие, в ходе которого устанавливаются ключи шифрования и дешифрования для обеих сторон. После этого фреймворк предоставляет возможность выполнять функции на стороне как клиента, так и сервера.
Перейдем сразу к примеру и на нем разберемся в логике работы инструмента. Клиент хочет залогиниться на сервере и отправляет запрос, как на скриншоте.
Что здесь происходит
1. Клиент формирует запрос:
• Устанавливает параметр
• Добавляет параметры: логин, пароль и id. Они передаются в виде структуры-словаря
• На стороне Delphi это будет примерно так:
А при сериализации все это превратится в следующее:
📁 Когда мы вызываем удаленную функцию через RTC SDK, мы создаем объект
• Перед отправкой запроса клиент регистрирует хендлер OnLoginResult для обработки результата выполнения функции на сервере.
2. Запрос отправляется на сервер RTC:
• Сервер принимает HTTP-запрос и интерпретирует параметр
• На стороне сервера вызывается обработчик для функции
3. Сервер отвечает:
• Результат функции возвращается клиенту, и он вызывает свой хендлер
• Ответ сервера десериализуется обратно в
Например:
👾 Это может успешно использоваться в малвари: сервер возвращает зашифрованное описание команды, которую клиент должен выполнить. Таким образом, в легитимный RTC-поток можно прятать вполне себе вредоносное поведение.
#reverse #hacktool
@ptescalator
В ходе реверс-инжиниринга протокола одного из бразильских банковских троянов обнаружилось использование интересного сетевого фреймворка — RealThinClient. Процесс общения между клиентом и сервером в этом фреймворке построен на сериализации структур вызова функции в строковый формат и их последующей десериализации на другой стороне. Это делает RTC не только мощным инструментом разработки, но и удобной платформой для скрытого обмена командами — например, в случае малварного поведения.
Сначала клиент и сервер проходят через кастомное рукопожатие, в ходе которого устанавливаются ключи шифрования и дешифрования для обеих сторон. После этого фреймворк предоставляет возможность выполнять функции на стороне как клиента, так и сервера.
Перейдем сразу к примеру и на нем разберемся в логике работы инструмента. Клиент хочет залогиниться на сервере и отправляет запрос, как на скриншоте.
Что здесь происходит
1. Клиент формирует запрос:
• Устанавливает параметр
FC
(function call) в значение Login
.• Добавляет параметры: логин, пароль и id. Они передаются в виде структуры-словаря
RE=3
(record), содержащей ключи user
, pwd
, id
и т. п. В user
можно передать зашифрованный малварный запрос. RE обозначает тип rtc_Record
— это структура вида «ключ:значение», аналогичная словарю или JSON-объекту.• На стороне Delphi это будет примерно так:
with FunctionCall.Param do
begin
asText['user'] := '...'; // rtc_Text
asText['pwd'] := ''; // rtc_Text
asString['id'] := '8DF313279CD34B81A3FB438708B4E8F1'; // rtc_String
end;
А при сериализации все это превратится в следующее:
RE=3;
user:T=...;
pwd:T=...;
id:S=...
📁 Когда мы вызываем удаленную функцию через RTC SDK, мы создаем объект
TRtcFunctionInfo
— это класс, который описывает удаленную вызываемую функцию, ее имя, параметры и результат выполнения. Он используется как на клиенте (для упаковки вызова), так и на сервере (для распаковки и выполнения). Объект TRtcFunctionInfo
упаковывается в контейнер TRtcValue
и сериализуется в строку или поток байтов. TRtcValue
может хранить любой поддерживаемый тип данных: строку, число, массив, запись, дату, вложенную функцию и т. п. Фактически он используется везде, где нужно передать или получить данные по сети, например в параметрах удаленной функции (Param.asValue[...]
) или результатах выполнения функций (Result.asValue
). Это делает его гибким, но и потенциально непрозрачным, что хорошо для скрытой передачи команд, особенно если используются вложенные структуры типа rtc_Function
.• Перед отправкой запроса клиент регистрирует хендлер OnLoginResult для обработки результата выполнения функции на сервере.
2. Запрос отправляется на сервер RTC:
• Сервер принимает HTTP-запрос и интерпретирует параметр
FC
как указание на то, какую функцию нужно вызвать.• На стороне сервера вызывается обработчик для функции
Login
. Выполняется Delphi-процедура, связанная с этим именем.3. Сервер отвечает:
• Результат функции возвращается клиенту, и он вызывает свой хендлер
OnLoginResult
для обработки полученного ответа.• Ответ сервера десериализуется обратно в
TRtcValue
, чтобы мы смогли снова получить доступ к его структуре. Сервер может вернуть не просто данные, а вложенный вызов функции. Это структура, поле в которой содержит rtc_Function
, rtc_Record
или rtc_Array
, которые клиент десериализует и выполняет. Например:
if xData.isType = rtc_Record then
ExecuteRec(xData.asRecord)
else if xData.isType = rtc_Array then
ExecuteArr(xData.asArray)
👾 Это может успешно использоваться в малвари: сервер возвращает зашифрованное описание команды, которую клиент должен выполнить. Таким образом, в легитимный RTC-поток можно прятать вполне себе вредоносное поведение.
#reverse #hacktool
@ptescalator
Войдите, чтобы разблокировать больше функциональности.