Зачем это нужно? Как известно,
компьютеры взламывают через ошибки в программах или их настройках. Очевидно,
что если доступных из сети программ
(сервисов) нет, то взломать такой
компьютер невозможно (это то же самое, что
пытаться взломать компьютер, не
включенный в сеть вообще).

Как защититься? Сервисы нужны. Иначе бы
их не было 🙂 Хотелось бы, чтобы они
были доступны только с некоторых машин,
например, из локальной сети. Стандартное решение - использование
брандмауэра - программы или железяки,
избирательно пропускающей информацию
по сети.

Но брандмауэры выдают себя особым
поведением. Как? Когда сервиса нет (порт
закрыт), компьютер сообщает об этом. А
когда порт заблокирован брандмауэром,
запрос не доходит до него, и,
соответственно, ответа о недоступности
сервиса
нет. В некоторых случаях брандмауэры
посылают ответ, но не такой. Это
позволяет обнаружить их и искать другие
пути взлома системы (а именно -
взлом другой, имеющей доступ к сервису,
машины).

Более подробно: на пакет с
установленным флагом 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.
Буду благодарен за любые замечания.

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии