Логотип
Главная | Статьи | Крипто-эксплойты: Атака на слабые CSRNG в веб-приложениях. Предсказание сессионных куков через утечки энтропии. Генерация коллизий для Math.random() в Node.js
Крипто-эксплойты: Атака на слабые CSRNG в веб-приложениях. Предсказание сессионных куков через утечки энтропии. Генерация коллизий для Math.random() в Node.js

Крипто-эксплойты: Атака на слабые CSRNG в веб-приложениях. Предсказание сессионных куков через утечки энтропии. Генерация коллизий для Math.random() в Node.js

17 июня, 2025

41

Эй, кодеры и хакеры! Сегодня мы ныряем в тёмные воды крипто-эксплойтов, где слабые генераторы случайных чисел (CSRNG — Cryptographically Secure Random Number Generators) становятся твоей дверью в святая святых веб-приложений. Мы разберём, как предсказывать сессионные куки через утечки энтропии и как ломать Math.random() в Node.js, создавая коллизии. Всё с примерами, кодом и хардкорным подходом. Погнали!

Почему CSRNG — слабое звено?

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

Что мы будем ломать?

  • Сессионные куки. Если их генерация основана на слабом генераторе, мы можем предсказать следующий токен и захватить сессию.
  • Math.random() в Node.js. Этот генератор псевдослучайных чисел (PRNG) уязвим к атакам, если его состояние можно восстановить.

Утечки энтропии: Как предсказать сессионные куки?

Утечка энтропии происходит, когда генератор случайных чисел выдаёт предсказуемые значения из-за недостаточного “шума” (энтропии) или плохой реализации. В веб-приложениях это часто встречается в старых системах или при использовании слабых генераторов вроде PHP mt_rand() или JavaScript Math.random().

Сценарий атаки:

  1. Собираем несколько сессионных идентификаторов (например, через перехват куков или анализ ответов сервера).
  2. Анализируем их на предмет паттернов (например, временные метки или последовательности).
  3. Восстанавливаем состояние генератора или предсказываем следующий токен.

Пример: Утечка через временные метки в PHP
Многие старые веб-приложения используют что-то вроде uniqid() в PHP для генерации сессий. Этот метод часто основан на временных метках, что делает его предсказуемым.

Если ты можешь угадать временную метку (например, зная время ответа сервера с точностью до миллисекунд), то можешь предсказать sessionId. Инструмент Burp Suite или простой перехват запросов через mitmproxy помогут собрать данные для анализа.

Практика: Сбор и предсказание

  1. Перехватывай куки через прокси или сетевой сниффер.
  2. Ищи корреляцию между значением куки и временем запроса (например, через HEX-анализ).
  3. Напиши скрипт для brute-force с учётом временного диапазона.

Вот пример простого Python-скрипта для анализа временных меток:

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

Атака на Math.random() в Node.js: Генерация коллизий

Math.random() в Node.js (и в браузерах) — это не криптографически безопасный генератор. Он основан на алгоритме Mersenne Twister (MT19937) или его вариациях в зависимости от движка V8. Если у тебя есть доступ к нескольким последовательным значениям, ты можешь восстановить внутреннее состояние генератора и предсказать будущие числа.

Почему это проблема?

  • Многие разработчики используют Math.random() для генерации “уникальных” идентификаторов или токенов.
  • В Node.js это может быть использовано для создания временных ключей или сессий.

Сценарий атаки:

  1. Получаем несколько последовательных значений Math.random() (например, через уязвимость в приложении, которая раскрывает ответы сервера).
  2. Восстанавливаем состояние Mersenne Twister.
  3. Предсказываем следующие значения и создаём коллизии (например, генерируем тот же токен, что и у жертвы).

Практика: Восстановление состояния MT19937
Для этого можно использовать библиотеку вроде mersenne-twister или писать кастомный код. Вот пример на JavaScript с использованием готового решения:

Как получить значения?

  • Если приложение выдаёт случайные числа в ответах (например, в играх или генераторах кодов), собирай их через API-запросы.
  • Ищи утечки в WebSocket-сообщениях или через XSS, если фронтенд раскрывает значения.

Генерация коллизий
После восстановления состояния ты можешь генерировать те же значения, что и сервер. Например, если это временный токен для сброса пароля, ты можешь подменить его своим значением и получить доступ к аккаунту жертвы.

Лайфхак: Используй инструмент jsfuzz или пиши свой парсер для анализа фронтенд-кода на предмет использования Math.random().

Как усложнить обнаружение?

Чтобы твоя атака осталась незамеченной, следуй этим советам:

  • Маскируй трафик. Используй прокси или Tor для отправки запросов, чтобы не светить свой IP.
  • Мимикрируй под жертву. Подделывай заголовки запросов, включая User-Agent, чтобы выглядеть как легитимный пользователь.
  • Ограничивай запросы. Не спами сервер сотнями попыток предсказания — это вызовет подозрения.

Как защититься от таких атак?

Если ты разработчик, вот что нужно сделать, чтобы не стать жертвой:

  1. Используй криптографически безопасные генераторы. В Node.js это crypto.randomBytes() вместо Math.random().
  2. Добавляй соль. Даже если генератор слабый, добавление уникальной соли (например, хэш IP-адреса пользователя) усложнит предсказание.
  3. Ограничивай утечки. Не раскрывай случайные числа в ответах API или фронтенде.
  4. Мониторь подозрительные действия. Настрой WAF или IDS для обнаружения brute-force попыток.

Пример безопасного кода в Node.js:

Заключение: Будь на шаг впереди

Крипто-эксплойты на слабые CSRNG — это мощный инструмент в арсенале хакера. Предсказание сессионных куков через утечки энтропии и генерация коллизий для Math.random() в Node.js показывают, как небольшие ошибки разработчиков превращаются в катастрофу. Но помни: с большой силой приходит большая ответственность. Используй эти знания для пентеста или обучения, а не для вреда.

Лайфхак на прощание: Если хочешь углубиться, изучи атаки на генераторы вроде Dual_EC_DRBG (да, это та самая уязвимость от АНБ). А пока — копай исходники приложений, ищи слабые PRNG и тестируй в безопасной среде.