Дейв Тейлор - Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание
- Название:Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание
- Автор:
- Жанр:
- Издательство:Питер
- Год:2017
- Город:СПб.
- ISBN:978-5-496-03029-8
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Дейв Тейлор - Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание краткое содержание
Цель этой книги — продемонстрировать практические приемы программирования сценариев на bash и познакомить с самыми распространенными утилитами на коротких и компактных примерах, не вдаваясь в излишние подробности. Экспериментируйте с этими сценариями — ломайте, исправляйте и приспосабливайте их под свои нужды, чтобы понять, как они работают. Только так вы сможете решать самые сложные задачи.
Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
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. Установка системной даты
Лаконичность лежит в основе ОС Linux и предшествовавших ей версий Unix, и она оказала самое серьезное влияние на развитие Linux. Но иногда чрезмерная лаконичность способна довести системного администратора до сумасшествия. Типичным примером может служить формат представления системной даты в команде date, показанный ниже:
usage: date [[[[[cc]yy]mm]dd]hh]mm[.ss]
Трудно даже просто пересчитать все эти квадратные скобки, не говоря уже о том, чтобы определить, что нужно вводить, а что нет. Объясним: вы можете ввести только минуты, или минуты и секунды, или часы, минуты и секунды, или месяц, плюс все перечисленное перед этим, или вы можете добавить год и даже век. Чистое сумасшествие! Вместо утомительных попыток выяснить, что и в каком порядке вводить, попробуйте воспользоваться приведенным в листинге 6.4 сценарием, который предложит ввести соответствующие значения и затем сконструирует компактную строку с датой. Это верный способ сохранить психическое здоровье.
Код
Листинг 6.4.Сценарий setdate
··#!/bin/bash
··# setdate — дружественный интерфейс к команде date.
··# Команда date предлагает формат ввода: [[[[[cc]yy]mm]dd]hh]mm[.ss]
··# Чтобы обеспечить максимум удобств, эта функция просит ввести конкретную
··#·· дату, показывая значение по умолчанию в квадратных скобках [], исходя
··#·· из текущей даты и времени.
··. library.sh # Source our library of bash functions to get echon().
··askvalue()
··{
····# $1 = имя поля, $2 = значение по умолчанию, $3 = максимальное значение,
····# $4 = требуемая длина в символах/цифрах
····echon "$1 [$2]: "
····read answer
····if [${answer:=$2} −gt $3]; then
······echo "$0: $1 $answer is invalid"
······exit 0
····elif ["$(($(echo $answer | wc −c) — 1))" −lt $4]; then
······echo "$0: $1 $answer is too short: please specify $4 digits"
······exit 0
····fi
····eval $1=$answer # Загрузить в заданную переменную указанное значение.
··}
··eval $(date "+nyear=%Y nmon=%m nday=%d nhr=%H nmin=%M")
··askvalue year $nyear 3000 4
··askvalue month $nmon 12 2
··askvalue day $nday 31 2
··askvalue hour $nhr 24 2
··askvalue minute $nmin 59 2
··squished="$year$month$day$hour$minute"
··# Или, если сценарий предполагается использовать в Linux:
··# squished="$month$day$hour$minute$year"
··# Да, в системах Linux и OS X/BSD используются разные форматы.
Интервал:
Закладка: