Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
KindaRails2Shell — Однофайловый PoC для Rails CVE-2026-66066: произвольное чтение файлов, восстановление секретов, многопоточное сканирование и условный RCE через подписанные варианты изображений. | Kitploit
Инструменты/GitHubGitHub/0xsha/kindarails2shell
Сканеры уязвимостейЭксплуатацияЭксплуатация веб-приложенийВеб-безопасностьТестирование на ПроникновениеРазработка Полезной НагрузкиЛаборатории и Практика
GitHub0xsha/kindarails2shell

KindaRails2Shell

Однофайловый PoC для Rails CVE-2026-66066: произвольное чтение файлов, восстановление секретов, многопоточное сканирование и условный RCE через подписанные варианты изображений.

Репозиторий
2220 дней назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

KindaRails2Shell: CVE-2026-66066

Концепт-эксплойт без зависимостей в одном файле и Docker-лаборатория, ограниченная loopback-интерфейсом, для уязвимости произвольного чтения файлов в Rails Active Storage/libvips. Он также демонстрирует условную эскалацию, описанную в бюллетене: от восстановленного secret_key_base к поддельному варианту изображения и выполнению команд.

  • Затронуты: Rails 7.2.0–7.2.3.1, 8.0.0–8.0.5 и 8.1.0–8.1.3
  • Исправлено: Rails 7.2.3.2, 8.0.5.1 и 8.1.3.1
  • Среда выполнения: Python 3.11+, только стандартная библиотека
  • Область применения: авторизованное тестирование и локальные исследования

Основные ссылки: Бюллетень Rails, форензический анализ Rails, технический разбор Ethiack и релиз 8.1.3.1.

Демо

https://github.com/user-attachments/assets/fdcb5651-c1d1-4bc4-b322-8f1205b09635

Почему этот PoC полезен

kr2s.py содержит весь клиент в одном файле:

  • встроенная, допускающая модификации нагрузка HDF5/MAT без h5py и numpy;
  • прямая загрузка (direct upload) и автоматическая обработка CSRF;
  • извлечение ключа варианта из существующей миниатюры Active Storage;
  • строгий PNG-декодер из стандартной библиотеки для побайтово точного восстановления;
  • произвольные смещения и чтение до 16 МиБ за запрос;
  • обнаружение секретов и чистый Python-подписант вариантов Rails;
  • чтение вывода команд со случайным маркером и посильная очистка;
  • многопоточное пассивное или явно активное сканирование с JSON-отчётами;
  • управление прокси, пользовательским путём, TLS, таймаутом и user-agent.

Инструмент не устанавливает пакеты, не запускает callback-слушатель, не требует curl на целевой системе и не зависит от make. Стадия RCE использует встроенный маршрут представления Active Storage и не требует Marshal-гаджета.

Быстрый старт

Запустите уязвимую лабораторию:

root@kitploit:~
cd lab
RAILS_VERSION=8.1.3 docker compose up --build

Порт Compose привязан к 127.0.0.1, а контейнер работает от непривилегированного пользователя со сброшенными всеми Linux capabilities.

В другом терминале:

root@kitploit:~
# Intrusive: uploads a blob, then confirms /etc/hostname is readable.
python3 kr2s.py check http://127.0.0.1:3000

# Recover a fixed-size prefix. Binary output goes to stdout unless -o is used.
python3 kr2s.py read http://127.0.0.1:3000 /etc/passwd --size 4096
python3 kr2s.py read http://127.0.0.1:3000 /etc/passwd -o passwd.bin

# Recover selected environment secrets. Values are redacted by default.
python3 kr2s.py secrets http://127.0.0.1:3000

# Display complete matched environment values for authorized analysis.
python3 kr2s.py secrets http://127.0.0.1:3000 --show-full

# Passive preflight of one target or a file containing one target per line.
python3 kr2s.py scan http://127.0.0.1:3000
python3 kr2s.py scan targets.txt --threads 10 --json scan.json

# Intrusively confirm file read on every target in the list.
python3 kr2s.py scan targets.txt --active

# Probe selected libvips loaders.
python3 kr2s.py probe http://127.0.0.1:3000

# Conditional escalation. This executes the supplied command.
python3 kr2s.py rce http://127.0.0.1:3000 "id; uname -a"

Выполните python3 kr2s.py COMMAND --help, чтобы увидеть все параметры. Часто применяемые при работе с реальными приложениями параметры включают --harvest-url, --show-path, --proxy, --insecure и --skb.

secrets --show-full выводит полные значения совпавших переменных окружения. Без него инструмент печатает только первые 12 символов и многоточие. Файлы, запрошенные через --also-read, включая стандартные пути к учётным данным Rails, выводятся объёмом до 600 символов, если они читаемы.

Пассивный scan лишь сообщает, отдаёт ли страница извлекаемое представление Active Storage; он не может определить установленный уровень заплатки Rails. scan --active загружает вредоносный blob и пытается выполнить проверочное чтение. Неудачный результат активного сканирования помечается как BLOCKED_OR_INCONCLUSIVE, а не SAFE, потому что WAF, аутентификация, неподдерживаемые варианты и исправление Rails могут выглядеть одинаково снаружи приложения.

Остановите лабораторию:

root@kitploit:~
cd lab
docker compose down

Что делает эксплойт

  1. Клиент резервирует прямую загрузку Active Storage с типом image/png.
  2. Он загружает гибридный файл MATLAB/HDF5. Набор данных HDF5 использует внешнее хранилище: имя файла и смещение в нём указывают на файл внутри процесса Rails.
  3. Подписанный сервером ключ варианта извлекается из существующей миниатюры и повторно используется с подписанным ID вредоносного blob.
  4. Уязвимый Rails передаёт данные в libvips matload; байты целевого файла становятся пикселями изображения и возвращаются в сгенерированном PNG.
  5. Клиент проверяет и декодирует PNG, а затем обращает порядок хранения по столбцам (column-major) matio, чтобы восстановить исходные байты.

Гибридный файл удовлетворяет сразу двум парсерам: его текст начинается с MATLAB 5.0, а слово версии по смещению 124 выбирает путь MATLAB 7.3 на основе HDF5. Исправление Rails блокирует операции libvips, помеченные как недоверенные, до того как управляемый атакующим файл достигнет matload.

Условный RCE

rce сначала читает SECRET_KEY_BASE из /proc/self/environ, если не передан --skb. Он вычисляет ключ верификатора Active Storage и подписывает JSON-вариант, содержащий операцию instance_eval. На затронутом пути vips операция достигает Vips::Image.public_send. PoC отправляет её через встроенный маршрут представления, выполняет указанную команду через /bin/sh и перехватывает оба потока вывода.

Эта вторая стадия возможна только при условии восстановления подписывающего секрета и достижения уязвимого поведения трансформации vips, описанного в анализе Ethiack для CVE-2025-24293. Патч CVE-2026-66066 закрывает точку входа для чтения файлов; это не универсальное исправление для ранее утёкших подписывающих секретов. После подозрительной утечки ротируйте секреты, как рекомендует бюллетень Rails.

Вывод команды записывается в случайный файл /tmp/.kr2s_*, извлекается через тот же примитив чтения файлов, а затем удаляется с помощью второй подписанной нагрузки.

Поведение чтения и ограничения

Чтение возвращает запрошенную область фиксированного размера. Если источник короче, его префикс дополняется нулевыми байтами. Используйте --offset для последующих областей.

Стандартный вариант лаборатории только преобразует изображение в PNG, поэтому восстановление побайтово точное. Реальные приложения могут изменять размер вариантов. Режим с извлечённым ключом использует колонку шириной в один пиксель, чтобы избежать горизонтальной передискретизации, но вариант с меньшей высотой всё равно может изменить геометрию. В этом случае клиент явно завершается с ошибкой; уменьшите --size или извлеките представление без изменения размера.

Каждая команда интрузивна: она создаёт постоянные blob-объекты Active Storage и может создавать обработанные варианты. rce дополнительно выполняет указанную команду.

Матрица версий

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

root@kitploit:~
./lab/matrix.sh
./lab/matrix.sh 8.1.3
./lab/matrix.sh 8.1.3.1:PATCHED

Проверено 2026-07-31 с Ruby 3.4.10, image_processing 1.14.0, ruby-vips 2.3.0 и libvips 8.16.1:

Строки с исправленными версиями намеренно не запускают RCE-нагрузку с заранее заданным подписывающим секретом; матрица проверяет границу чтения файлов, связанную с CVE.

Исследовательские утилиты

research/craft.py заново генерирует кандидатные нагрузки для исследования загрузчиков и требует h5py и numpy. Он не импортируется релизным PoC. lab/probe/probe.sh проверяет эти кандидаты с помощью ruby-vips внутри лабораторного образа:

root@kitploit:~
uv run --script research/craft.py all -o /tmp/kr2s-payloads
docker run --rm \
  -v "$PWD/lab/probe:/probe:ro" \
  -v /tmp/kr2s-payloads:/payloads:ro \
  --entrypoint /probe/probe.sh kr2s-rails:8.1.3

Запустите модульные тесты без зависимостей следующей командой:

root@kitploit:~
python3 -m unittest discover -s tests -v

Происхождение публичной работы

MAT/HDF5-нагрузка и клиент без зависимостей были разработаны в ходе локального тестирования. После появления публичных PoC в этот релиз были включены извлечение ключа варианта и встроенные маршруты Active Storage, описанные в PoC Zer0SumGam3. Реализация на Python здесь оригинальна и использует только стандартную библиотеку.

Более ранняя редакция демонстрировала, что RCE также возможен с подписанной Marshal-нагрузкой с использованием Puma::MiniSSL::Context и прокси ActiveSupport, на основе публичного исследования гаджетов Behrad Taher. Этот путь обходился без вспомогательных бинарных файлов на стороне цели, но требовал приёмника подписанных ID с поддержкой Marshal, а также загруженных классов-гаджетов Puma и ActiveSupport. Он был заменён после того, как исследовательская группа Ethiack опубликовала свой технический разбор KindaRails2Shell, в котором описан более простой метод подписанного JSON-варианта. Он использует штатный маршрут и устраняет эти предварительные условия.

Авторство открытия принадлежит André Baptista (0xacb), Bruno Mendes (s3np41k1r1t0), Rafael Castilho, исследовательской группе Ethiack, а также RyotaK (GMO Flatt Security). Abdelmounaim Moulahcene (bl0rph) независимо опубликовал базовый примитив незадолго до скоординированного раскрытия. Полный таймлайн и список авторов см. в форензическом репозитории Rails.

Ответственное использование и лицензия

Используйте только на системах, которыми вы владеете или на которые у вас есть явное разрешение на тестирование. Авторы не несут ответственности за неправомерное использование. Об ошибках в этом исследовательском артефакте сообщайте через SECURITY.md.

Опубликовано под лицензией MIT.

Скачать инструмент
RailsЧтение файлаПроверка RCEРезультат
7.2.3.1READ-OKRCE-OKпройдено
7.2.3.2заблокированоне запускаласьпройдено
8.0.5READ-OKRCE-OKпройдено
8.0.5.1заблокированоне запускаласьпройдено
8.1.3READ-OKRCE-OKпройдено
8.1.3.1заблокированоне запускаласьпройдено