Революция в *nix-системах новый взгляд на повышение привилегийЗайдя на свежезалитый шелл, ты первым делом смотришь свои права в системе, а именно — результат команды «id» в nixсистемах. Наши права по дефолту uid=80, то есть обычного юзера www! не отчаивайся, мы научимся поднимать их до r00t'a и сохранять непосредственно в веб-шелле. Это мечта любого хакера. Немного теорииSUID — расшифровывается как Set user ID, переводится с забугорного — «установить идентификатор пользователя». Если установлены права доступа SUID и файл исполняемый (то есть наш будущий бинарник), то при выполнении этот файл получает не права запустившего его (www), а права владельца файла. Эксплойт — в нашем случае это компьютерная программа, использующая уязвимости в программном обеспечении и применяемая для повышения привилегий (получения рута). Это был вольный пересказ Википедии. Root, суперпользователь — специальный аккаунт в UNIX-подобных системах с идентификатором (UID) 0, владелец которого имеет право на выполнение всех без исключения операций (грубо говоря, да простят меня линуксоиды, это аналог учетки Администратора в Windows). Тоже вольный пересказ Википедии. Итак, с теорией покончили (надеюсь, было нескучно). Движемся далее... НАПОЛЕОНОВСКИЕ ПЛАНЫ Затея у нас круче, чем у Наполеона, мы собираемся сделать мировую революцию. Нам предстоит удивить всех рутовым web-шеллом, которого нет ни у кого! А именно, предстоит:
Первым делом, первым делом... алгоритмыСначала придумаем алгоритм работы и вообще всю схему получения и сохранения рута. Сразу предупрежу, что тестировать наше детище мы будем на сервере с установленной FreeBSD 7.1 (причины сего деяния оглашу позже). Смысл всей затеи состоит в следующем — мы запустим эксплоит из Web'а, то есть непосредственно из нашего любимого браузера, установим суидные права и сменим хозяина (owner'a) нашему суиднику и наконец-таки будем выполнять команды под рутом. Мы ведь будем юзать эксплойт из веба, а под данную ОСь как раз есть подходящий эксплойт ktimer (http://milw0rm.com/exploits/8261). Прелесть в том, что результат его работы — не получение /bin/sh, а установка uid=0, gid=0 вызывающему процессу. Это-то нам и нужно. Пишем suidникОт слов к делу, — я сразу приведу листинг кода, а уж после будем с тобой его разбирать.
Думаю, глядя на комментарии, уже становится ясен смысл нашей программы. Сначала мы проверяем количество аргументов — их должно быть три: argv[0] — имя самого скомпилированного SUIDника, argv[1] — наш пароль и argv[2] — непосредственно сама команда. 1. Файл suid с правами доступа -rwxr-x--x, то есть хозяин файла (www) может читать, изменять и запускать на исполнение; члены группы (apache) могут читать и запускать файл на исполнение, а все остальные пользователи могут лишь запускать на исполнение. 2. Устанавливаем бит SUID на файл командой chmod 4751 suid Наверняка, ты заметил, что символ x (запуск на исполнение) сменился на s (SUID бит). Как мы уже знаем, бинарник с суид битом будет выполняться не от имени вызывающего, а от имени хозяина (owner'a). Опять же, результат команды id через наш файл для членов группы site будет подобным uid=80(www), gid=80(www), groups=80(apache). 3. Забегая вперед, обозначим, что нам придется сменить владельца файла. Мы это сделаем под рутом командой chown root suid. И снова результат команды id через наш файл будет подобным uid=0(root), gid=0(root), groups=80(apache). Исходя из этого, уже видно, что любой пользователь системы, даже не входя в состав группы хозяина, имеет право на запуск бинарника, да мало того, еще и с правами хозяина, то бишь рута, так как установлен SUID-бит. Так-с, с этим разобрались. Осталась самая малость, — скомпилировать файл. Делаем это командой gcc suid.c -o suid. В итоге получаем бинарный файл suid. Пример использования будет таков — «./suid cool_hack id» (имя файла, пароль, команда) Начинаем z-кодинг
Интеграция, адаптация и прочие непонятные словаВ итоге мы таки получили рута! При последующем посещении web-шелла мы уже будем рутом (при условии, что наш суид-шелл не увидит рут, и не удалит его). Однако шелл у нас получился довольно примитивный; чтобы интегрировать наши прелести в привычные шелла типа r57, c99, WSO2 и т.д., принцип работы тот же. На диске ты найдешь подправленный мной код шелла r57. Единственное, что отличает подправленный r57 от того, который мы сегодня написали, — в r57 эксплойт и суид-шелл я скомпилировал, перевел полученные бинарники в base64 и вставил полученный код в сам шелл. Далее мы расшифровываем base64-код и сохраняем в файл. Таким образом, у нас получается один файл, — это удобнее в плане транспортировки и заливки. С интеграцией в другие шеллы разобрались, осталось разобрать ситуацию с применением эксплойтов для других операционных систем и других версий. Причина, по которой я выбрал для теста FreeBSD — этот эксплойт под версию 7.1 и 7.2 результатом своей работы возвращает не /bin/sh, которой мы бы пользовались при простом бекконекте, а возвращает uid и gid 0 для текущего процесса. То есть является универсальным. Последний способ для нас удачен, ведь мы можем использовать его непосредственно из web'a. Так мы пришли к выводу, что для использования эксплойта с нашими условиями необходимо переписать эксплойты, чтобы они устанавливали uid, gid. Как это организовать — история уже для другой статьи. Итоги наших приключенийСразу хочется отметить плюсы и минусы этого подхода к получению рута. Плюсы
Минусы
Links• http://milw0rm.com/exploits/8261 — эксплоит bsdktimer.c. WarningВнимание! Редакция журнала и автор не несут ответственности за вред, возможно, причиненный при использовании методов и файлов данной статьи. Статья представлена только для ознакомления в образовательных целях. |