Firewall и его атака


Макаров Тихон

атака фаерволлаПоставил firewall. Открытые порты вполне можно определить, если постараться, а firewall даже не пикнет (так Kaspersky Anti-hacker, например, ничего мне не сообщил, когда я сканировал себя же с соседнего компьютера и нашел 5 портов, и даже определил службы, на них стоящие). ICMP пакеты все равно нельзя запретить (точнее не хорошо запретить входящие ответы), иначе та же фрагментация в сети может помешать доставить пакет, а вы об этом даже не узнаете. Соответственно smurf-атака вполне возможна, да и вообще от многих функций, которая умеет программа Loki, спасает не каждый firewall (распространенный Agnitum Outpost 2.1 один из них, кстати). Пришлось настраивать, чтобы, например, Apache не отвечал на пакеты с разными ключевыми для взлома параметрами.

А вот с этого момента я начинаю рассказывать про атаки, которые фильтруют не все фаерволы. Для более детального пониманию рассмотрим заголовок пакета IP.

Схема заголовка IP-пакета

Итак, теперь вернемся в нашему firewall. Пусть у нас есть соединение telnet. Но мы не хотим, чтобы передавались какие-то определенные команды (аналогично и для Apache, мы не хотим передачи ему пакетов содержащих какую-то строку, причем отлавливаем это на уровне firewall). Допустим, мы не хотим, чтобы пользователь отсылал строку passwd (чтобы etc/passwd даже если взломают - не могли просмотреть) и будем блокировать такой пакет.

Способов обойти такую проверку существует много, но типа всего два: скрытая атака и атака со вставкой.

Рассмотрим первый тип атаки: мы отправляем SYN пакет (на соединение), но в нем отправляем данные со строкой "Pa". Firewall (хотя не все) не просматривает данные Syn пакета, пока соединения не оборвется, т.к. Syn пакет вообще-то должен быть пустым, но в правилах RFC такая передача все же разрешена. Поэтому firewall просто отбросит данный пакет от рассмотрения, но пропустит дальше (как же нам без соединения?!), а вот хост примет соединение и прочитает эту строку. Дальше нам достаточно отправить обычный пакет со строкой "sswd". Firewall просмотрит его и не увидит в нем запрещенной строки, поэтому опять же пропустит, а хост получит эту строку и прибавит к ней в начале строку "pa". Что получится? Правильно, "passwd". Атака прошла успешно.

Теперь о втором типе атаки: злоумышленник отправляет пакет со строкой "P", потом еще один со строкой "edfsdf", а потом еще один со строкой "asswd". Что должен получить и firewall и хост-получатель? Строку "pedfsdfasswd"? Правильно. И firewall такую строку не заблокирует. Но и пользы от нее не будет все равно. Зато что будет, если мы у второго пакета укажем, например, неверную контрольную сумму? Тогда firewall ее пропустит, т.к. он не может сам отсылать хосту-отправителю уведомления об ошибке, а примет этот пакет, записав в очередь и прибавив к уже имеющейся строке "р". А вот хост эту строку из второго пакета вместе с самим пакетом просто отбросит. Соответственно третий пакет является нормальным и firewall его пропускает, а хост не отбрасывает. Что получает firewall? Строку "pedfsdfasswd". А что получает хост? строку "passwd". В данном примере строка "edfsdf" являлась вставкой.

Атака удалась, хакер добился своей цели, а администратор остался в дураках.

Теперь почему это до сих пор работает, когда производители фаерволов об этом знают. У меня в сети в секунду проходит до 100 разных сообщений через мой компьютер. В загруженные дни даже аська открывается минут 5, т.к. не может дождаться, пока firewall отфильтрует пакеты и дойдет до ее пакетов. Теперь представьте, что будет если фаервол будет проверять все пакеты на еще огромное кол-во соблюдающихся правил. Скорость 100 мегабитной сетки упадет так, что dial-up будет казаться просто мгновенной передачей данных.

Как же тогда быть? Есть одно решение для сумасшедших, а так же ИТ-профессионалов (которые тоже и так сумасшедшие обычно :)). Мы должны своими глазами просматривать передающиеся пакеты. Для этого можно использовать программу Ethereal, а так же tcpdump (его аналог для windows - windump). Их отчеты просто ужасны на первый взгляд, но через неделю-две вы начнете их понимать.