Зачем это нужно? Как известно,
компьютеры взламывают через ошибки в программах или их настройках. Очевидно,
что если доступных из сети программ
(сервисов) нет, то взломать такой
компьютер невозможно (это то же самое, что
пытаться взломать компьютер, не
включенный в сеть вообще).
Как защититься? Сервисы нужны. Иначе бы
их не было 🙂 Хотелось бы, чтобы они
были доступны только с некоторых машин,
например, из локальной сети. Стандартное решение - использование
брандмауэра - программы или железяки,
избирательно пропускающей информацию
по сети.
Но брандмауэры выдают себя особым
поведением. Как? Когда сервиса нет (порт
закрыт), компьютер сообщает об этом. А
когда порт заблокирован брандмауэром,
запрос не доходит до него, и,
соответственно, ответа о недоступности
сервиса
нет. В некоторых случаях брандмауэры
посылают ответ, но не такой. Это
позволяет обнаружить их и искать другие
пути взлома системы (а именно -
взлом другой, имеющей доступ к сервису,
машины).
Более подробно: на пакет с
установленным флагом SYN (запрос на
подсоединение), направленным на закрытый
порт, должен приходить ответ RST.
Любая другая реакция (другой ответ или
отсутствие ответа) свидетельствует о
том, что порт заблокирован брандмауэром.
Некоторые брандмауэры умеют
имитировать нужный ответ. Например, ipfw из
FreeBSD позволяет имитировать RST-ответ в
случае, если пакеты удовлетворяют определенным критериям. А вот мой любимый
Linux оказался ущербным (!?!) -
его ipchains такого не умеет.
При более подробном рассмотрении
выяснилось, что ipchains собственно ни в
чем не виноват. Сама основа, ядро OS Linux, не
поддерживает возможности
имитировать закрытый TCP-порт.
Соответственно, если кому-то это не
нравится - клаву в руки, и правь ядро, благо,
исходники есть.
Мне захотелось попробовать себя в роли
kernel hacker'а. Нет, это не тот, кто
<ломает> ядро, а тот, кто его создает.
Изначально слово <hacker> обозначало
именно это, лишь потом его исказили
обыватели. Подробные рассуждения по
этому поводу есть у Эрви Хэккера,
россиянина, занимающегося <хэккерской>
философией. Лично я его не поддерживаю, а
вы можете ознакомиться с его
трудами на www.hscool.org.
Результат работы - патч для ядра Linux
(2-2.17), позволяющий через
интерфейс, предоставляемый ipchains,
программировать имитацию закрытых
портов. Далее - комментарии к патчу.
/include/linux/ip_fw.h - добавлено соответствие
константы IP_FW_LABEL_RESET и
слова "RESET". Это - имя правила, которое
будет использоваться в ipchains.
/include/linux/firewall.h - добавлено числовое
значение константы для RESET.
/net/ipv4/input.c - обрабатывает реакцию на
входящий пакет. Исправления -
если пакет попадает под правило RESET, то
выбрасывать его, а источнику
посылать RST.
/net/ipv4/ip_fw.c - обработка правил брандмауэра.
Добавлена поддержка
правила RESET.
/net/ipv4/tcp_ipv4.c - обработка TCP-пакетов. Сокет,
через который идет
отсылка RST-пакетов, сделан доступным из
других модулей.
Установка и использование патча. Файлы
скопировать поверх ядра 2-2.17,
перекомпилировать. Для управления
используется стандартный ipchains. Ядро
отсылает RST-пакет в ответ на любой пакет
протокола TCP, принятый правилом
RESET.
Пример:
ipchains -A input -s 10.0.0.250 -p TCP -dport 23 -y -jRESET -
правилу RESET соответствуют SYN-пакеты на 23й
порт с заданного адреса.
Патч можно скачать с http://www.nerf.ru.
Буду благодарен за любые замечания.