Как воевать в локальных сетях

Djzlob, Журнал "Хакер"

Давным-давно в далекой-далекой локалке бушевали сетевые войны... Ты еще не подключился к локалке? Так быстро подключайся, а если в округе такой еще нет, то быстро езжай на Митьку - покупай вагон 300 метровых бухт, хабы, сетевухи, конннекторы, обжималку и собирай народ!

Подрубился? Ё! Но, как оказалось, в толпе сетевого народа есть не только друзья... Иногда так и хочется сделать что-нибудь гадкое этому тупому лоху из соседнего подъезда ;). Я помогу тебе осуществить эту заветную мечту и расскажу о вариантах атак и методах защиты в сетевой войне.

ARP Атаки

Когда в локалке несколько машин под управлением WIN имеют один и тот же IP адрес, то в Windows'e вылетает табличка, сообщающая о том, что данный IP адрес используется другим компом и интерфейс будет отключен... А фишка в том, что перед соединением с сетью комп высылает ARP-запрос, получая ответ, что нужный ему IP - занят. В итоге ты получаешь именно это сообщение. Этим можно воспользоваться и удаленно флудить машины, работающие под Win: сотнями окон, которые вряд ли кому-то под силу закрыть... проще перезагрузится ;). Занудно отмечу, что этот трюк прокатывает только в пределах сегмента сети, не ограниченного маршрутизатором или мостом.

Проделать такую операцию достаточно просто, если в твоем распоряжении есть UNIX или NT машина, т.к. только под данные платформы доступна библиотека libnet, позволяющая достаточно просто генерировать ARP пакеты. На самом деле программ такого класса, портированных под NT, не существует, но... это у всех остальных, а у тебя будет!

ЭКСКЛЮЗИВ ОТ ЖУРНАЛА - новый Х-релиз под названием Bespredel, который ты можешь выкачать с www.xakep.ru/articles/releases. Имея эту штучку, вместе с libnetNT, хаос можно будет устраивать не только пользуясь *nix`ом ;).

Юниксовые же бойцы качают это добро с:

conflictd - http://c5.hakker.com/ (требует наличие библиотеки libnet);

havoc - http://packetstorm.securify.com/DoS/havoc-0.1c.tgz

Анонимность

Как же остаться незамеченным и продолжать творить беспредел в локалке? Существует всего два идентификатора, по которым тебя могут распознать. Это MAC адрес сетевой карты и IP адрес. Сложность изменения данных параметров зависит от операционки, под которой ты работаешь. Если это UNIX, то IP адрес может быть измененным быстро и без перезагрузки, MAC адрес также просто изменить, но не под каждым UNIX'ом...

В Linux'е и FreeBSD ты сможешь реализовать этот финт ушами за 1 минуту, но, сидя под OpenBSD, тебе придется страдать огромным гимором :(. Если мы собираемся сниффать локалку и администратор достаточно продвинут для того, чтобы отслеживать пассивные атаки (сниффинг), - придется немного потрудиться. Но мы все равно настроим нашу систему так, чтобы ее никак нельзя было обнаружить в локалке, кроме как посмотреть на хаб - горит ли лампочка около нашего порта или нет ;).

Смена IP адреса

Тут все просто: берем и меняем твой IP утилитой ifconfig:

ifconfig <интерфейс> inet <нужный IP адрес>

Смена MAC адреса

под FreeBSD:

MAC адрес можно изменить также просто - командой ifconfig, набрав:

ifconfig <интерфейс> lladdr <нужный MAC адрес>

Под Linux это делается так:

ifconfig <интерфейс> down

ifconfig <интерфейс> hw ether <нужный MAC адрес>

ifconfig <интерфейс> up

Кстати, первые 3 байта MAC адреса - это идентификатор производителя сетевой карты, например, 00:C0:6F:66:66:66. Такой MAC у сетевых карточек фирмы Komatsu Ltd ;). Так что если интересно, то по этому УРЛу ты найдешь большую таблицу идентификаторов производителей сетевых карт: http://www.cavebear.com/CaveBear/Ethernet/vendor.html

Под OpenBSD:

По идее, MAC адрес можно изменить через bpf'шные sysctl'ы, но это доступно только гуру (да и на фига нам нужны такие напряги?), которые часами копаются в сорцах ядра. Так что для атак можно воспользоваться модулем etherspoof, который позволяет заменять MAC адрес в исходящих пакетах. Он доступен в пакете libnet - http://www.packetfactory.net/Projects/Libnet.

Кстати, перед загрузкой модуля не забудь установить securelevel ядра на уровень 0, т.к. по умолчанию используется уровень 1, при котором невозможна загрузка lkm.

Еще один хороший способ сохранения анонимности - правильная настройка firewall'a. Можно сконфигурировать firewall таким образом, что твоя система не будет отвечать НА ВСЕ запросы: нет ответа на пинг, все порты прикрыты. При таком раскладе уже трудно сказать: есть машина в сети или нет. Если ты используешь Firewall IPfilter, то просто добавь данную строчку "block out all" в список правил и затем заставь ipf перечитать правила.

Если ты используешь IPChains, то набери такую пургу:

ipchains -A output -j DENY -s 0/0 -d 0/0

В ipfwadm это будет выглядеть так:

ipfwadm -O -p DENY

А в ipfw это будет выглядеть так:

ipfw add deny from any to any out

Если ты используешь Linux и совсем конченый параноик, то поставь себе патч для ядра Stealth TCP/IP Stack, который сделает твою систему невидимой в локалке. Это повысит твои шансы остаться незамеченным. http://www.energymech.net/madcamel/fm/

Определение снифферов

Из существующих в данный момент способов удаленного определения снифферов действительно быстрым и эффективным является ARP метод. С ним, если не предпринято спецмер, вероятность обнаружения сниффера - 99%.

Принцип действия таков: в сеть кидается ARP-запрос на определение IP левого МАС-адреса. Если какая-нибудь машина радостно отвечает, что такого адреса нет, то можно с уверенностью сказать, что на ней запущен сниффер.

Правда, знающим людям (теперь ты один из них) с этим методом очень просто бороться. Надо всего лишь отключить использование протокола ARP на интерфейсе, набрав: ifconfig <интерфейс> -arp

Отказываться от использования протокола ARP на интерфейсе стоит только на время сниффинга, т.к. без него ты просто не сможешь использовать iNet.

Еще один неплохой способ обнаружения - DNS-метод. Для обнаружения sniffer`a делается куча запросов на несуществующие адреса, а затем сниффается весь трафик на предмет попыток зарезолвить эти

липовые адреса в имя машины. К несчастью (кому как ;), это также просто обойти, отключив в сниффере перевод IP адресов в имена (в более-менее нормальных снифферах, таких как sniffit или dsniff, это есть).

DoS атаки

В настоящий момент реально эффективными DoS`ами являются по-прежнему атаки фрагментированными IGMP пакетами (kod, pimp, voidozer).

Кстати, для тех, кто не в курсе: voidozer в исходящих пакетах отсылает информацию о системе, на которой работает атакующий (имя юзера и директория запуска).

Kod - http://packetstorm.securify.com/9907-xploits/windows_kod.txt

Pimp - http://packetstorm.securify.com/DoS/pimp.c

Voidozer - http://www.void.ru/toolz/xplo/29.html

От всех этих атак для виндов существуют патчи. На www.microsoft.com (ВАУ, впервые что-то полезное можно там найти ;) - в поиске просто набираем IGMP).

Oshare-атака

http://packetstorm.securify.com/9901-exploits/oshare_1_gou.c

Достаточно эффективная атака (патч недоступен?), работающая в сегментах сети, не ограниченных маршрутизаторами. Ограничение в зоне работы объясняется тем, что у пакета незаконченная структура и он не может пройти через роутер. Работает только на Linux'е. Как написал автор проги: "Linux не думает, что она умнее программиста" :). Из-под *BSD эта штучка не будет пахать, потому что *BSD системы не позволяют отсылку пакетов с незаконченной структурой.

Флуд атаки

Флуд атаки по-прежнему остаются эффективными, особенно если у тебя 10-мбитная локалка, дешевые хабы и большие расстояния между компьютерами. В этом случае сильный пинг будет создавать большую коллизию. Плюс к этому, ОС не успевает обрабатывать такое огромное количество входящих пакетов. Например, я пинговал с машины под OpenBSD свой notebook - Celeron433,

32ram, 10mbit PCMCIA сетевая карта, когда на нем был запущен win98se.

Результат: во время флуда машина не подавала никаких признаков жизни (даже мышка не двигалась).

Осуществлять пинг-флуд лучше всего с максимальным размером пакета, который равен 65000, с флагами:

-l (использование максимальной возможной пропускной способности).

-f (режим флуда).

Опять сниффера!

Я полагаю, ты читал статью в 9-ом номере, где рассказывалось про снифферы... Так вот, далее мы поболтаем немного про снифферы и антиснифферы и добавим кое-чего, что не было отражено в предыдущей статье.

Если хочешь определить, кто же там у вас сниффает, кроме тебя, то воспользуйся, помимо уже описанных AntiSniff и Sentinel, бесплатной утилитой neped, использующей arp-метод. Утилита работает на всех платформах, для которых есть библиотека libnet.

http://kalug.lug.net/coding/nettools/neped-libnet.tar.gz

А если, допустим, твою машину взломали, установили сниффер и подменили ifconfig так, чтобы он не показывал, что карта находится в PROMISC режиме? Вешаться? Нет! Скачиваешь фирменную утилиту с паги Х-релизов: www.xakep.ru/articles/releases. Lordz называется :).

Главный миф админов локальных сетей, у которых много денег и мало мозгов, таков, что "никто не сможет сниффать на свитчах" (switch-hub).

Так вот это - полный бред (почти)! На свитчах можно сниффать, перенаправляя весь траффик к себе, используя утилиту arpredirect из пакета dsniff, про который рассказывалось в 9-ом Х. Теперь пакет dsniff портирован и под Windows. Лежит по адресу http://www.datanerds.net/~mike.

Портировал эту тулзу Michael Davis, который также подарил пользователям Windows порт программы siphon, реализующей технику пассивного определения операционной системы. Это аналог nmap для *nix. http://www.subterrain.net/projects/siphon/.

Для сниффинга в сетях, построенных на свитчах, существует несколько методов.

ARP Spoofing

В момент, когда вражеская машина будет по ARP'у резолвить MAC адрес шлюза, мы можем послать ей в ответ свой МАС адрес, как будто наша машина и есть гейт ;). Шлюз тоже ответит на этот запрос.

Таким образом получится, что пакеты от вражеской тачки будут идти одновременно к нам и на гейт, т.е. iNet работает и сниффер без дела не остается ;). Этот метод называется Man in the Middle. Кстати, этот способ может быть использован как DoS атака. Например, удаленно ты можешь сообщить жертве, что MAC адрес интернет шлюза, используемый в локалке, задается тобой как какой-нибудь несуществующий. Соответственно, чуваку на этой машине не удастся использовать Интернет >:). И "доступ к глобальной сети Интернет" он вернет только после сброса arp таблицы или перезагрузившись. Ведь он не знает, как сбросить таблицу ;).

MAC Flooding

Самый эффективный метод, основанный на том, что свитчи имеют лимит памяти. Т.е. зафлуженный switch не сможет контролировать передачу пакетов и будет слать все пакеты на все порты как самый обыкновенный тупой хаб.

MAC Duplicating

Это метод основан на том, что ты устанавливаешь себе MAC адрес жертвы, трафик, который ты хочешь сниффать. Соответственно, все пакеты идут тебе и жертве одновременно. Самое главное - на них не отвечать, а сидеть и тихо дудеть в трубочку :o).

Routing attacks

Данный метод основан на посылке жертве фальшивых ICMP-редирект пакетов. Таковые используются, например, когда маршрутизатор видит, что до запрашиваемого узла есть более короткий маршрут. При таком раскладе он отсылает клиенту адрес данного маршрутизатора. Мы кидаем жертве данные пакеты с адреса используемого ею маршрутизатора и адрес нового маршрутизатора, которым является наш компьютер. Следовательно, весь траффик от жертвы будет идти через нас.

Отличной утилитой, реализующей данные методы, является:

parasite - http://packetstorm.securify.com/sniffers/parasite-0.5.tar.gz

MiM - http://packetstorm.securify.com/sniffers/MiM.c

dsniff - http://www.monkey.org/~dugsong/dsniff

Приколы:

Какой чат используется в вашей локалке? Наверняка это Vypress Chat или IRC! Как же поприкалываться с чатами?

Специально для этой статьи я написал программку, которая позволяет тебе читать приватные сообщения Vypress Chat'a. Она доступна для *BSD, Linux и даже под Windows(!) с нашего сайта www.xakep.ru в разделе релизов.

А если же в твоей локалке используется ИРК, то и тут можно пошутить с помощью утилиты irchijack, которая позволяет тебе перехватывать соединения

с irc сервером, творить что угодно на сервере от имени этого человека!

Используется она предельно просто: качаем с http://c5.hakker.com/archives/, компилируем и запускаем с параметром в виде ника человека, соединение которого мы хотим перехватить... А дальше делай, что хочешь!

Хочешь читать ICQ сообщения? Dug Song обещает в скором времени добавить в свой пакет dsniff утилиту msgsnarf, которая позволит читать чужие ICQ-cообщения и приваты на IRC. Так что жди >:).

Приколы c DNS

Как заставить компьютер соседа поверить, что microsoft.com имеет твой IP? Очень просто: качаем с http://adm.freelsd.net/ADM/ набор утилит ADMid-pkg.tgz, компилируем и запускаем:

./ADMsniffID <интерфейс> <желаемый IP> <нужное имя хоста> <тип записи>

(тип записи 1 = TYPE A(имя в IP) или 12 = TYPE PTR(IP в имя)).Вот так мы заставим подумать компьютер Васи Пупкина, что microsoft.com имеет IP адрес 192.168.6.66, когда он попытается запросить это имя.

./ADMsniffID eth0 192.168.6.66 microsoft.com 1

Итоги

Подводя итог, я хочу сказать, что, ИМХО, самой эффективной операционной системой для данного вида деятельности является Linux, по сравнению с Windows, FreeBSD и OpenBSD. К сожалению, я не могу сравнивать ее с коммерческими юникс-клонами типа Solaris, AIX, UnixWare и т.д.

Linux позволяет:

- быстро изменять IP адрес;

- быстро изменять MAC адрес;

- отсылать пакеты с нестандартной/незаконченной структурой (что требуется для ДоС атак);

- устанавливать желаемый обратный MAC адрес в исходящих пакетах;

- достаточно просто писать снифферы (все пакеты можно ловить через RAW_SOCK). А под операционными системами *BSD, использующими систему bpf (berkley packet filter), через RAW_SOCK возможно ловить все пакеты, кроме TCP, UDP и ICMP`ей 8-ого типа (echo request).

Короче, кукишь на БЗДЕ, что сделаешь. Всякие разговоры о том, что линух - это UNIX для детей, не совсем корректны ;).

at last... let the wars begin!

ЭКСКЛЮЗИВ ОТ ЖУРНАЛА - новый Х-релиз под названием Bespredel, который ты можешь выкачать с www.xakep.ru/articles/releases. Имея эту штучку вместе с libnetNT, хаос можно будет устраивать не только пользуясь *nix`ом ;).

Главный миф админов локальных сетей, у которых много денег и мало мозгов, таков, что "никто не сможет сниффать на свитчах" (switch-hub).

Так вот это - полный бред (почти)!

Терминология:

MAC адрес - идентификатор сетевой карты, данный ей производителем, представляющий 48 (6 байт) битное число. На большинстве карточек MAC адрес физически находится в небольшой выступающей микрухе, расположенной около разъемов. Так что в случаях, когда сетевуха сдохла, а MAC адрес необходимо оставить прежний, - эту микросхему можно безбоязненно переставить в новую карточку.

libnet - библиотека, позволяющая достаточно просто генерировать пакеты протоколов ARP/IP/TCP/UDP/ICMP/IGMP/RIP/OSPF. Библиотека доступна для большинства UNIX-систем и также для WindowsNT/2000 (libnetNT - www.eeye.com, не совсем доделанная версия)

libpcap - библиотека, созданная для упрощенного написания программ перехвата пакетов из сетевого потока. В настоящее время эта тулза входит в стандартную поставку большинства UNIX-клонов или доступна для них из пакетов (портов). Если же ты так обломался и не заимел ее, то можешь смело бежать на сайт http://www.tcpdump.org./ Большинство снифферов написано с использованием libpcap (например, tcpdump, dsniff, sniffit).

ifconfig - стандартная программа в ОС UNIX, используемая для конфигурации и изменения параметров сетевых интерфейсов.

ARP - Address Resolution Protocol. ARP используется для определения MAC адреса по IP адресу и наоборот. В сетке реально компы определяются только по MAC адресам, и для того чтобы соединиться с машиной, зная ее IP, сетевуха посылает в сеть пакет с запросом типа: "А у кого тут у нас IP-шник 192.168.0.1?". Все молчат, на запрос отвечает только 192.168.0.1 и сообщает свой MAC адрес.

ARP-Таблица. Чтобы не засорять сеть бесчисленными ARP запросами на соответствие "IP -> MAC", полученные ранее результаты заносятся в специальную таблицу. Записи в этой таблице бывают динамическими (часто обновляются) и статическими, которые не меняются ни при каких условиях. Посмотреть arp-таблицу можно командой arp-a.

Netmask - маска подсети. Это 48 битное число, которое характеризует размер сетки. Лучше всего это станет понятно на таком примере: часто встречающаяся маска 255.255.255.240 - означает, что в сети находится (или может находиться) не более чем 16 компов. Как я это определил? А вот как: эта же маска в двоичной записи выглядит как 11111111.11111111.11111111.11110000. В конце видим четыре нуля, т.к. в процессе расчетов адресов маска инвертируется, то у нас вместо четырех нулей остается четыре единицы. 1111 это 16 в десятеричной системе. Вот и все ;). Чтобы так сильно не заморачиваться, я могу порекомендовать прогу IPcalсulator (http://www.net3group.com/download.asp). Она может рассчитывать маски, броадкасты и прочую шнягу.

Gateway/гейт (шлюз). Если твой комп направляет пакет внутри локальной сетки, то тут все ясно. А что делать, если надо пульнуть инфу в другую сеть, в Инет, например? А то, что нужен шлюз, через который направится пакет во внешнюю Net.