Недавно столкнулся с задачкой повышения привилегий в ОС.

Метод типа “найти эксплоит” не проходил, crontab был адекватно настроен, исследовать каждый сервис вручную времени не было.

Короче говоря, оставалось только посмотреть setuid-setgid.

Кроме базовых утилит были замечены картинки в директориях веб-сервера и несколько php скриптов.

Их владельцем был, конечно, не root, но пользователь с правами повыше, чем были у меня на тот момент.

Очень похоже, что биты выставлялись каким-то клиентом, через который эти файлы и закачивались на сервер. Хотя до сих пор как они туда попали, остается для меня загадкой.

Само собой, что при редактировании файлов с правами не владельца, setuid-setgid спадают.

Но счастье будет если найти в одном их них хотя бы 1 конструкцию типа include, require, require-once.

Такой инклуд позволяет изменить функционал скрипта без изменения его кода, то есть без потери setuid-setgid.

В итоге в подключаемый файл был внедрен нужный код, который при вызове родительского уже setgid-setuid-ого скрипта выполнился с правами выше, чем были у меня в ОС.

Здесь есть одно НО – скрипт должен запускаться как CGI, таким образом, обязательным становиться указание в начале скрипта пути до интерпретатора, типа #!/usr/bin/php5 или #!/usr/local/perl.

И если для PHP скриптов такое встретить можно редко, то для .pl .py – сплошь и рядом. Кто ищет, тот всегда найдет (С)

Для поиска setdui-setgid заветных файлов для подобных трюков можно использовать команды:

find / -local -type f \( -perm -4000 -o -perm -2000 \) -print | grep php >  sweet-sugid.lst &

Ну и ес-но такая фишка пройдет на perl, и всех остальных интерпретаторах.

Кстати, касательно perl, меня очень прикалывает наличие на многих серверах /usr/bin/suidperl.

Также прошу поделиться своими хинтами для повышения привилегий.

Опять же, есть еще одно НО – системный вызов должен позволять наследовать suid, для BSD картина вот такая:

Запуск скриптов системным вызовом execve(2) в xBSD.
Ветвь BSD  только #! magic  suid/sgid скрипт может быть шеллом
4.4-Lite не определено не определено не определено
4.4-Lite2 не определено не определено не определено
FreeBSD да нет нет
NetBSD да опционально нет
OpenBSD да опционально нет
BSDI BSD/OS да нет да