|
С/C++ - Самопальный снифер под Linux kas1e Xakep, номер #050, стр. 050-082-1 Sniffer - англ. "нюхач". Такой вот незамысловатый перевод довольно распространенного на сегодняшний день слова. Тема гораздо шире, чем может показаться на первый взгляд, и поэтому для более полного понимания начнем с краткой истории, постепенно разгоняясь и углубляясь в детали. В середине 90-х годов компания Network Associates (организованная в 1989) выпускает программку, которая позволяет полностью следить за происходящим в сети и контролировать передаваемые данные. Программку назвали Network Analyzer и выпустили ее под маркой Sniffer(r). После этого большинство вновь выходящих сетевых анализаторов от сторонних контор стали называть сниферами, что не очень точно, но всех, в общем, устраивает. Сегодня сниферы сильно помогают как сетевым администраторам в поиске неисправностей, так и различного рода злодеям в поиске чего душе угодно. Техническая сторона Что должен делать простейший снифер? Правильно, он должен вынюхивать. Вынюхивать данные, передаваемые по сети, топология построения которой чаще всего была основана на Ethernet с участием пассивных хабов (теперь свичи стали настолько дешевы, что их продают под названием хабы). В этом основное предназначение стандартного снифера. Давай посмотрим, как передаются данные в такого рода сетях. Допустим, у нас имеется сеть с несколькими машинами, у каждой из которых есть по сетевой карте, и на каждой сетевой карте настроено по IP. Включаем сеть. Какой-то хост захотел передать данные, что он сделает? Он пошлет широковещательный запрос на broadcast-адрес с вопросом типа "вот тут у меня есть IP, чей это?". Все машины будут брать этот пакет и смотреть, как только найдется машина, которая соответствует запрошенному IP (это смотрится по соответствиям ip-mac адресам), она отправит запросившей машине ответ типа "да-да, я нашлась и готова меняться данными". Вот так работает сетевая карта в обычном режиме. Т.е. она сравнивает некие данные, и если они не подходят - обработка пакетов завершается. Однако есть некий режим, который говорит сетевой карте в любом случае обрабатывать пакеты, ходящие по сети. Т.е. любой пакет, который физически будет видеть сетевая карта, должен быть обработан. Режим этот называется "promiscuous". Переводится как "смешанный" или "неразборчивый". В этот режим мы можем переходить как программно (имеется в виду писать установку в promisc кодом), так и всякими подсобными утилитами, такими как ifconfig (утилита ;)). В этой статье описан переход в promisc, осуществляемый ifconfig'ом, что проще, и к тому же уменьшается (хоть и незначительно) размер кода/исполнимого файла. Команда для перехода, как я сказал, очень проста, но чтобы не возникло лишних неприятностей, вот она: # ifconfig eth0 promisc и соответственно для перевода обратно: # ifconfig eth0 -promisc Т.е. то, что мы будем писать, будет работать в любом случае. Хоть с promisc, хоть без него. Только в одном случае будут анализироваться данные двух хостов, а в другом - всех. Главное понимать, что ловить все пакеты мы сможем только тогда, когда в сегменте стоит пассивный хаб - раритет, на смену которому приходят равноценные свичи. Но для анализа и понимания работы - разницы нет. К тому же, есть разные хитрые способы, которые реализуют разные люди ;). |