Linux глазами хакера - Михаил Флёнов
Шрифт:
Интервал:
Закладка:
Хакер может установить соединение с защищенной сетью через туннель на открытом порту и с дозволенным адресом внутри сети. От этого уже никуда не денешься, потому что хоть что-то, но должно быть разрешено.
В крупных компаниях в одной сети может быть несколько серверов. Я только водной фирме и в кино видел, как администраторы для управления каждым из них работают за несколькими мониторами и клавиатурами одновременно. В реальной жизни такие специалисты слишком ленивы, да и однообразный труд утомляет, поэтому они сидят только за одним компьютером, а для подключения к серверу используют удаленное соединение.
Но на этом лень администраторов не заканчивается. Чтобы не приезжать на работу во внеурочное время в случае экстренной ситуации, им требуется доступ к консоли сервера прямо из дома. А вот это уже может стать сильной угрозой. Благо, если программа, через которую происходит управление, поддерживает шифрование (например, SSH), а если это простой telnet-клиент? Злоумышленник сможет подсмотреть параметры аутентификации с помощью утилиты сниффинга и получить такой же административный доступ к серверу.
4.13.3. Безопасный Интернет
Интернет не будет безопасным, пока нельзя четко установить принадлежность пакета. Любое поле IP-пакета можно подделать, и сервер никогда не сможет определить подлинность данных.
Вы должны тщательно маскировать, что именно и кому разрешено на сервере. Чем меньше знает хакер, тем лучше. Помимо этого, должны пресекаться любые разведывательные действия, например, использование сканеров портов, трассировка сети и др.
Что такое трассировка? В сети каждый пакет проходит по определенному пути. При необходимости перенаправления такой пакет обязательно проходит через маршрутизаторы, которые доставляют его в нужные сети. Но если в устройство, обеспечивающее межсетевую совместимость, закралась ошибка, то пакет может навечно заблудиться. Чтобы этого не произошло, в заголовке IP-пакета есть поле TTL (Time То Live, время жизни). Отправитель пакета устанавливает в это поле определенное число, а каждый маршрутизатор уменьшает счетчик ретрансляций. Если значение TTL становится равным нулю, то пакет считается потерявшимся и уничтожается, а отправителю посылается сообщение о недостижимости хоста.
Эту особенность хакеры стали использовать для диагностики сети, чтобы узнать маршрут, по которому проходит пакет. Как это работает? В 99 % случаев каждый запрос идет до адресата одним и тем же путем. На отправленный со значением TTL, равным 1, пакет первый же маршрутизатор ответит ошибкой, и по полученному отклику можно узнать его адрес. Следующая посылка идет с TTL, равным 2. В ответ на это ошибку вернет второй маршрутизатор. Таким образом можно узнать, через какие узлы проходят запросы к адресату.
Сетевой экран должен уничтожать любые пакеты с TTL, равным 1. Это защищает сеть, но явно указывает на наличие Firewall. Пакет с реальным значением TTL дойдет до адресата, а если команда traceroute выдала ошибку, то это значит, что на пути следования пакета есть Firewall, который запрещает трассировку.
Для выполнения трассировки в ОС Linux нужно выполнить команду traceroute с ключом -I, указав имя хоста. Например:
traceroute -I redhat.com
В ОС Windows есть аналогичная команда tracert, и в ней достаточно задать имя узла или IP-адрес, который нужно трассировать без использования дополнительных ключей.
Итак, на экране начнут появляться адреса промежуточных маршрутизаторов, через которые проходит пакет. Например, результат может быть следующим:
traceroute to redhat.com (xxx.xxx.xxx.xxx)? 30 hops max, 38 byte packets
1 218 ms 501 ms 219 ms RDN11-f200.101.transtelecom.net
[217.150.37.34]
2 312 ms 259 ms 259 ms sl-gw10-sto-5-2.sprintlink.net
[80.77.97.93]
...
...
17 638 ms 839 ms 479 ms 216.140.3.38
18 * * * Request timed out.
Если сетевой экран допускает ICMP-пакеты, то сканирование можно провести с помощью traceroute. Возможно, появится сообщение об ошибке. В данном случае 18 строка сообщает о превышении времени ожидания ответа. Это значит, что пакет отправлен, но сервер отбросил запрос, а значит, пакет с TTL, равным 18, будет уничтожен.
Для сканирования сети за пределами Firewall достаточно выполнить команду соединения с компьютерами внутри сети с TTL, равным 19. Во время трассировки мы увидим первые 17 ответов, 18 пропадет, а 19 пройдет дальше в сеть, потому что на сетевом экране такой пакет появится с TTL=2 и не будет удален, а вот в локальной сети первый же маршрутизатор вернет ошибку.
Но в реальности ICMP-пакеты запрещены, поэтому такой метод редко приносит злоумышленнику пользу.
С другой стороны, если мы увидели полный путь к компьютеру назначения, это еще не значит, что сетевого экрана нет. Он может просто не запрещает ICMP-трафик.
Внутреннюю сеть можно просканировать и через DNS-сервер, если он находится внутри нее и доступен для всеобщего использования.
4.13.4. Дополнительная защита
Помимо фильтров на основе определенных, администратором правил в сетевом экране может быть реализовано несколько дополнительных защитных механизмов, которые работают вне зависимости от вашей конфигурации или могут включаться специальными опциями. Рассмотрим наиболее интересные аспекты такой защиты.
Одним из популярных методов обхода Firewall и проведения атаки является фальсификация IP-адреса отправителя. Например, у хакера может быть адрес 100.1.1.1, но с него запрещено подключаться к сервису FTP. Чтобы получить доступ, хакер может послать пакеты, в которых в качестве отправителя указан, например, 100.2.2.2.
Но это еще не все. Просто воспользовавшись чужим именем, ничего хорошего не получится. Хакер не увидит отклика сервера (рис. 4.9).
Рис. 4.9. Подмена IP-адреса
Чтобы хакер смог получить ответ на свой запрос, в IP-пакет должна быть добавлена специальная информация, по которой сервер найдет реальный адрес хакера 100.1.1.1.
Современные сетевые экраны (в том числе и поставляемые с Linux) легко определяют подделку и блокируют такие пакеты.
4.14. Запрет и разрешение хостов
Работа с ipchains или iptables (см. разд. 4.11 и 4.12) может показаться сложной, потому что требует знания необходимых портов, но этот способ наиболее надежный, и для построения реальной защиты рекомендуется использовать именно его. А вот для решения простых задач (например, временная защита) есть другой метод — использование файлов /etc/hosts.allow и /etc/hosts.deny. Первый файл содержит записи хостов, которым разрешен доступ в систему, а во втором прописаны запреты.
При подключении к серверу файлы проверяются следующим образом:
1. Если для компьютера нет ни одной записи в файлах, то доступ по умолчанию разрешен.
2. Если соответствие обнаружено в файле hosts.allow, то доступ разрешен и файл hosts.deny не проверяется.
3. Если в файле hosts.deny найдена запись, то доступ запрещен.
Удобство использования этих файлов заключается в том, что в них нужно указывать сервисы, требующие ограничения доступа. Это делается в виде строк следующего вида:
сервис: хост
Строка состоит из двух параметров, разделенных двоеточием. Первым указывается имя сервиса (или список, разделенный запятыми), доступ к которому нужно ограничить. Второй — это адреса (для файла /etc/hosts.allow разрешенные, а для /etc/hosts.deny — запрещенные), разделенные запятыми. В качестве параметров можно использовать ключевое слово ALL, которое соответствует любому адресу или сервису.
Рассмотрим пример конфигурирования файла. Для начала закроем любой доступ. Для этого в файле /etc/hosts.deny нужно прописать запрет для всех пользователей на любые сервисы. Для этого добавляем строку ALL: ALL. В результате ваш файл будет выглядеть следующим образом:
#
# hosts.deny This file describes the names of the hosts which are
# *not* allowed to use the local INET services, as decided
# by the '/usr/sbin/tcpd' server.
#
# The portmap line is redundant, but it is left to remind you that
# the new secure portmap uses hosts.deny and hosts.allow. In particular
# you should know that NFS uses portmap!
ALL: ALL
Теперь санкционируем только следующий доступ:
□ компьютеру с адресом 192.168.1.1 разрешено подключение ко всем сервисам;
□ с ftpd-сервисом могут работать только компьютеры с адресами 192.168.1.2 и 192.168.1.3.
#
# hosts.allow This file describes the names of the hosts
# which are allowed to use the local INET services,
# as decided by the '/usr/sbin/tcpd' server,
#
ALL: 192.168.1.1
ftpd: 192.168.1.2, 192.168.1.3
Если вам нужно целой сети позволить доступ к какому-либо сервису, то можно указать неполный адрес:
ftpd: 192.168.1.
В данной строке разрешен доступ к ftpd-сервису всем компьютерам сети 192.168.1.x (последнее число адреса не указано, значит, оно может быть любым).