• Партнер

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

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

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

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

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