Западло в Linux

Forb (forb@real.xakep.ru)

Xakep, номер #053, стр. 053-082-1


Изучаем новые подлянки!

Начать эту статью хотелось бы с банальной, всем известной пословицы: "Делу - время, потехе - час". Ведь согласись, тебе временами хочется сделать что-то нехорошее, другими словами, устроить кому-нибудь подлянку :). Если так, то эта статья для тебя. Используя фичи твоей любимой Оси (я надеюсь, ты понимаешь, о чем идет речь?) ты можешь реально приколоться над товарищем и даже в какой-то степени удивить его. Только помни, что злой администратор хуже татарина :), поэтому остерегайся летящих в тебя хабов или клавиатур.

Итак, рассмотрим две заподлянские штучки, которые только и ждут свою жертву. С помощью первой можно довести своего админа до полной апатии и мысли о том, что не существует защищенной системы, а вторая при определенных обстоятельствах может увести root-пароль. Но обо всем по порядку.

Bug в LD_PRELOAD

Называть эту отличительную особенность багом уже не совсем правильно. Багтрак знает о нем, и все системы тоже :). Но последствия, которые он вызывает, могут реально довести твоего админа до инфаркта (или запоя, зависит от его характера). Смысл в том, что пишется библиотека со следующими функциями: getuid, getgid, geteuid и getegid, возвращающие 0. При умелом их подгружении система опознает пользователя как root. Но это только на первый взгляд. На самом деле, замещение системных функций идет только для неSUIDных программ, то есть без закрепленного на них флага +s, позволяющих выполнять бинарник c правами owner’а. Но админы обычно народ ленивый, багтраки читают редко, и эта фишка может вызвать у них некоторое удивление =). Итак, ближе к телу. Для осуществления столь грязной махинации создадим программу на C, примерно следующего содержания:

int getuid() { return (0); }

int getgid() { return (0); }

int geteuid() { return (0); }

int getegid() { return (0); }

Не удивляйся отсутствию в сишнике функции main() - ее нет, так как файл будем компилить с флагом "shared", что позволит ему подключаться к другим бинарникам. Компилим:

gcc -shared fake.c -o fake.so,

получая тем самым полноценную библиотеку fake.so (естественно, что имя сишника должно быть fake.c).

Затем выполним непосредственное подключение библиотеки. Наберем следующую строку:

LD_PRELOAD=./fake.so /bin/bash

И что же мы теперь видим? Заветный r00tовый prompt, типа [root@server user]#. Ничего удивительного, при обработке /etc/profile скрипт успешно скушал переменную UID, которая стала равной нулю, что дало право выставлять prompt для рута. Но фейк есть фейк, поэтому радоваться рано. При выполнении какой-либо привилегированной операции тебе скажут, что у тебя нет прав. Но внешний вид очень впечатляет, и я сперва подумал, что на халяву получил рута, запустив один единственный файл :). Естественно, в нем все было автоматизировано: компиляция поддельных функция+запуск bash с библиотекой.

Самое интересное, обращение к загружаемым функциям работает для всех бинарников без +s, в том числе и id, поэтому жертва может часами любоваться на свои права =). При обращении же к более серьезным файлам, таким как su, passwd и т.д. тебя ждет облом-c. Для них используются только стандартные функции, делая тем самым систему безопасной. Пользы от этой шутки никакой, но она может быть уместна в кривых скриптах, которые проверяют переменную $UID на нулевое значение :). Если это так, то, возможно, скрипт позволит тебе совершить какие-либо рутовые действия. Поэтому хочу дать напутствие программистам: никогда не делайте простую проверку прав пользователя - взломщики только этого и ждут.

Содержание  Вперед на стр. 053-082-2