google web font

суббота, 26 марта 2011 г.

три простых способа обмануть sudo

Юрик Ученик(107)
Помогите сделать себя админом на своём сервере

Минь Мастер(1118)
Ну и вопросы....
"Как из-под рута получить права рута?"

Предположим, что сервера принадлежат компании, которая даёт Вам только ограниченные права через sudo и то только согласованию. Либо собственный работодатель, который не уверен, что Вы не сломаете сервак своими кривыми руками, ограничил Вам свободу дйствий. Либо собственные родители залили все USB-порты эпоксидкой и сменили рутовый пароль, оставив только sudo для настройки и запуска локального ftp-сервера. Мало ли.

Так вот, если верить документации непосредственно на sudo, система эта крайне неудачная, на самом деле. После того, как я расскажу эти три простых способа, неудачность идеи станет очевидной, потому что для обхода — не взлома! — не надо вообще ничего делать, достаточно иметь недостаточно жестоко настроенный sudoers.

Напомню, что все настройки программы sudo делаются в файле /etc/sudoers. Для его редактирования у рута есть команда visudo, которая после завершения правки проверяет корректность синтаксиса и выставляет правильные права доступа (readonly) на этот файл. В этом файле можно создавать алиасы для пользователей, группировать их, группировать команды — всё это надстройки, помогающие в итоге просто сделать короче самую главную запись, которая выглядит так:
user ALL=(ALL) NOPASSWD: ALL
Ну, этот пример даже обходить не надо, он разрешает делать пользователю user всё, причём без ввода пароля.

А теперь предположим, что по каким-то причинам админ написал что-то вроде
user ALL= NOPASSWD: /bin/cp /home/user/sandbox/*.conf /etc/httpd/vhosts.d/
Хочу лишний раз напомнить, что любую команду в sudoers надо прописывать в виде полного абсолютного пути к исполняемому файлу. Иначе я бы написал четвёртый способ обойти sudo ;-) Представленная команда, на первый взгляд, разрешает пользователю копировать только файлы с расширением .conf из специального каталога в одно единственное место. Но тут есть нюанс, из-за которого разработчики sudo не рекомендуют использовать в настройках wildcard. Связано это с тем, как wildcard обрабатывается шеллом.

Дело в том, что шелл раскрывает wildcard в имена всех файлов, которые под него подходят. И от разработчиков sudo ожидают того, что список полученных файлов подойдёт под wildcard в sudoers. То есть по сути /home/user/sandbox/*.conf — это не любой файл из каталога sandbox с расширением .conf, это целый список файлов, начинающийся с /home/user/sandbox и заканчивающийся на .conf. А тут мы уже можем сделать, например, так:
sudo cp /home/user/sandbox/../../anotheruser/anyfile /home/user/sandbox/foo.conf /etc/httpd/vhosts.d/
Уже понятно, куда я клоню? Таким способом можно втащить в пределы досягаемости любой файл, к которому по хорошему нельзя добраться. Если есть аналогичная запись для rm, то этот файл можно будет потом незаметненько грохнуть. А если в sudoers каталог назначения тоже указан со звёздочкой, то можно вообще копировать что угодно куда угодно! То есть если, например, запись выглядит так:
user ALL=/bin/cp /home/user/sandbox/*.conf /etc/httpd/vhosts.d/*.conf 
То мы в своём домашнем каталоге делаем mkdir .conf, например, а потом копируем что угодно откуда угодно в этот каталог и делаем там с ним что хотим. Попробуйте на досуге.

Как админу защититься от этого способа? Не использовать звёздочку. Иначе пользователь сможет либо отредактировать, либо скопировать, либо удалить любой файл в системе. Одна звёздочка может сделать весь остальной текст в файле sudoers бесполезной тратой админского времени.

Второй способ выглядит гораздо более дерзко, но и встречается гораздо реже. Предположим, что недальновидный админ разрешил запуск такой программы:
user ALL=/usr/bin/vim /etc/httpd/httpd.conf
Не важно, будет там vim или vi. Внешне безобидный текстовый редактор используется админами, как и человеческий мозг, только на 10%. И только программисты знают, что vim может, например, выполнить редактируемый файл. Правда, если файл не исполняемый, то не факт, что он выполнится, но есть способ проще. В "нормальном" режиме (это когда он бибикает), нужно набрать команду :!bash. Я думаю, суровой лаконичности этой команды достаточно для того, чтобы осознать, как мало нужно для взлома сервера, если у тебя к нему есть доступ: всего лишь запустить от рута текстовый редактор :-)

Защититься от этого тоже можно, админу достаточно знать, что у вима есть restricted режим. Надо просто прописать в sudoers не vim, а rvim.

Третий способ просто нахальный, но по сути является комбинацией первого и второго. Если админ дал пользователю право редактровать файл и в названии файла указал звёздочку, то он опять сфейлил. Например
user ALL=/usr/bin/rvim /etc/httpd/vhosts.d/*.conf
Как я уже говорил выше, это позволит отредактировать любой файл в системе, но в третьем способе самый смак именно в том, что это за файл:
sudo vim /etc/httpd/vhosts.d/../../sudoers .conf 
Да-да, главное не забыть .conf в конце приписать. Пишем себе в sudoers всё, чего душа пожелает, например, самый первый приведённый в этом топике вариант настройки, и наслаждаемся жизнью. Если нет редактора, но есть cp со звёздочкой в папке назначения, то можно исхитриться и скопировать произвольный файл в sudoers, но там ещё нужно правильно права переназначить, так что это сложно.

Как обойти этот способ — да так же, как и первый. Чтобы дать права на редактирование любого файла в нужном каталоге без звёздочки, можно написать регулярное выражение, которое запретит использовать слеш в том месте, где сейчас стоит звёздочка. В принципе, арсенал есть, просто админу нужно знать про такие тонкости. Если посмотреть sudoers на моём среваке и представить, сколько буков придётся затоптать, чтобы выпилить из него звёздочки, то переделывать ничего не хочется. К счастью, в sudoers предусмотрена очень обширная система alias'ов (но это не от хорошей жизни придумано).

На основе этих простых способов можно наклепать действительно много конструкций. Можно передавать разрешённым командам самые неожиданные аргументы (кто-нибудь знает, что svn имеет параметр --diff? А к нему в нагрузку ещё и -x? Дай юзеру рутовые права на svn и он сможет запустить что угодно), можно с помощью первого метода подменить разрешённый бинарник на любой свой и опять запускать что угодно — в общем, сам по себе sudoers годится реально только для того, чтобы прописать в него NOPASSWD: ALL. Собственно, в мануале на эту тему всё написано честно.

А как же тогда раздавать ограниченные права пользователям? Это комплексная задача, на самом деле. sudo тут будет одним из инструментов. Нужно будет продумать, какие задачи имеет право выполнять пользователь, какие инструменты можно разрешить ему использовать для этих задач, к каким ресурсам ему нужно будет обращаться... И собрать результаты в один скрипт, который будет принимать фиксированный набор аргументов, без всяких звёздочек и скобочек, чтобы все эти действия скрипт делал сам, не позволяя пользователю мухлевать. Короче, придётся писать собственный велосипед, причём получится не песочница, а натурально карцер. Я постараюсь об этом заикнуться в дальнейшем.

2 комментария: