>
Ноябрь 2017
Пн Вт Ср Чт Пт Сб Вс
« Окт    
 12345
6789101112
13141516171819
20212223242526
27282930  

Эксплоит для получения ROOT за счет повышения привилегий в Nginx

Сегодня мы расмотрим эксплоит Давида Голунского. На этот раз его руки и пытливый ум дотянулись до прокси-сервера nginx. Проблема довольно банальна и присутствует только в Debian-подобных дистрибутивах Linux (в том числе Ubuntu). При установке пакетов сервера из официальных репозиториев скрипт создает папку /var/log/nginx, владельцем которой является юзер www-data. Сам демон nginx работает от суперпользователя, поэтому создание симлинков вместо лог-файлoв позволяет манипулировать файлами от его имени.

Image result for exploit nginx root

EXPLOIT

После установки nginx через apt-get ты можешь проверить, что владелец папки с логами действительно пользователь www-data.

Теперь давай пробежимся по коду эксплоита и рассмотрим ключевые моменты успешной эксплуатации.

В качестве аргумента для запуска эксплоита указываем путь до лог-файла nginx.

40768.sh:

Компилируем либу, которая будет ставить бит SUID на шелл и менять его владельца на root.

40768.sh:

Библиотека хукает функцию geteuid. Если она вызывается от root, то нужные пермишены устанавливаются на файл с шеллом. В переменной old_geteuid хранится указатель на оригинальную geteuid, результат которой и возвращается после всех манипуляций.

xiaomi-miband-2-

40768.sh:

Дальше скрипт удаляет оригинальный лог-файл и заменяет его симлинком на /etc/ld.so.preload.

40768.sh:

Магия /etc/ld.so.preaload заключается в том, что если этот файл существует, то каждый бинарник при запуске будет пoдгружать указанные в нем библиотеки.

Вот только писать файлы в /etc может исключительно рут. Пройдя по симлинку, эту рабoту за нас проделает nginx, а для этого нужно дождаться открытия лог-файлов. Происходит это в тех случаях, кoгда сервис перезагружается или его процесс получает сигнал USR1. В Debian такoй сигнал по умолчанию отправляет функция do_rotate(), которую вызывает скрипт logrotate.

/etc/logrotate.d/nginx:

/etc/init.d/nginx:

Настройки по умолчанию вызывают скрипт ротации логов ежедневно в 6:25 утра, и если nginx настроен на архивацию логов каждый день, то нужно подождать сутки до успешной эксплуатации.

40768.sh:

Для демонстрации можно ускорить выполнение нужных функций командой /usr/sbin/logrotate -vf /etc/logrotate.d/nginx. Также стоит отметить, что архивация сработает, только если в файле access.log есть хотя бы одна запись. Поэтому в экcплоите выполняется следующая команда:

40768.sh:

Файл /etc/ld.so.preload создался, и его владельцем стал www-data:

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

40768.sh:

Последним шагом в эксплоите вызывается sudo для установки нужных привилегий на копию шелла.

40768.sh:

Вообще, сгодится любой бинарник, который принадлежит руту, имеет бит SUID и вызывает функцию geteuid, например mount.

Лог strace показывает нам, что все прошло успешно.

Результат работы эксплоита — суидная копия /bin/bash. Запускаем и получаем шелл с привилегиями суперпользователя. Pwned.

40768.sh:

Успешное пoвышение привилегий через nginx
Успешное повышение привилегий через nginx

TARGETS

В Debian — nginx младше 1.6.2-5+deb8u3, в Ubuntu 16.10 — nginx до версии 1.10.1-0ubuntu1.1, в 16.04 LTS — до 1.10.0-0ubuntu0.16.04.3, в 14.04 LTS — до 1.4.6-1ubuntu3.6.

SOLUTION

Уязвимость была исправлена в новых версиях пакетов, так что советую всем обновиться как можно скорее. Или же ручками поправить права на папку с лог-файлами nginx.

Ссылки:

[Всего голосов: 9    Средний: 3.9/5]
Share Button

Last updated by at .

Leave a Reply

You can use these HTML tags

<a href="" title="" rel=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">