
Python PoC, воспроизводящий локальную уязвимость принтера в CUPS 2.4.16: перехватывает токен локальной аутентификации через поддельную конечную точку IPP, создаёт принтер file:// и запускает гонку заданий для записи файлов, принадлежащих root.
Только для авторизованного тестирования / исследований. Запускайте этот PoC только против систем, которыми вы владеете или на тестирование которых у вас есть явное разрешение.
Этот репозиторий содержит ориентированное на системный CUPS воспроизведение уязвимости локального принтера в CUPS 2.4.16.
Реализация была разработана на основе опубликованного воспроизведения уязвимости CUPS и адаптирована для работы против уже запущенной системной установки CUPS, вместо того чтобы требовать отдельно установленной сборки CUPS и запускаемого от root стенда для воспроизведения.
Воспроизведение следует следующей общей цепочке:
CUPS 2.4.16
│
▼
Local authentication challenge
│
▼
Attacker-controlled IPP endpoint
│
▼
Authorization: Local <token>
│
▼
Authenticated CUPS administration
│
▼
CUPS-Create-Local-Printer
│
▼
file:// device URI
│
▼
Printer/job race
│
▼
Root-owned target file
Эксплойт зависит от состояния гонки, поэтому успешное выполнение не гарантируется при каждой попытке.
Опубликованное воспроизведение разработано как контролируемый стенд для уязвимости. В частности, оно предполагает выделенную установку CUPS и выполняет операции настройки/сброса, которые уместны для среды воспроизведения, но не отражают уже запущенную дистрибутивную установку.
Эта реализация вместо этого:
ipptool.cups-create-local-printer.test, когда оно доступно.Local.file://.Протестировано в лаборатории автора с:
ipptoolОжидается, что определение теста находится по пути:
/usr/share/cups/ipptool/cups-create-local-printer.test
Проверьте вашу установку с помощью:
cupsd -v
which ipptool
find /usr/share/cups -name 'cups-create-local-printer.test' 2>/dev/null
Настройте идентификатор атакующего и целевой путь через переменные окружения:
export CUPS_ATTACKER="$USER"
export CUPS_TARGET="/tmp/cups-poc-target"
python3 exploit.py
Для контролируемого воспроизведения повышения привилегий выберите цель, подходящую для вашей изолированной тестовой среды.
Скрипт также по умолчанию использует цель в стиле sudoers в каталоге /etc/sudoers.d/, поэтому не запускайте его бездумно на производственной системе.
PoC запускает слушатель IPP и заставляет CUPS аутентифицироваться против него. Слушатель изначально возвращает вызов 401 с:
WWW-Authenticate: Local trc="y"
Последующий запрос содержит:
Authorization: Local <token>
Затем токен повторно используется против локальной конечной точки администрирования CUPS.
Воспроизведение использует:
CUPS-Create-Local-Printer
с URI устройства file://.
Цикл кандидатов многократно выполняет операции с принтером, включая:
CUPS-Add-Modify-Printer
CUPS-Accept-Jobs
Resume-Printer
Print-Job
Гонка намеренно повторяется, поскольку одна попытка может не выиграть.
Этот репозиторий является адаптацией, а не канонической вышестоящей реализацией.
Логика построения запросов и последовательность эксплуатации основаны на опубликованном воспроизведении. Основные изменения касаются работы против существующей системной установки CUPS и удаления предположений о настройке/сбросе среды воспроизведения.
См. вышестоящий бюллетень безопасности OpenPrinting CUPS и репозиторий для авторитетной информации об уязвимости и оригинального воспроизведения.
Не используйте это против установок CUPS без разрешения.
Для защитной проверки полезные индикаторы включают неожиданные запросы IPP к контролируемым атакующим конечным точкам, необычные обмены аутентификации Local, создание неожиданных локальных принтеров и подозрительную активность принтеров/заданий.