Захват сетевого трафика linux
Библиотека сайта rus-linux.net
Студенту также придется нередко прибегать к использованию сниффера для того, чтобы разобраться в принципах функционирования сетей. В данной главе описываются соответствующие методики перехвата сетевого трафика .
23.1. Приложение wireshark
23.1.1. Установка wireshark
В данном примере приведена команда для установки приложения wireshark в дистрибутивах, использующих пакеты программного обеспечения с расширением .deb (включая Debian, Mint, Xubuntu и другие дистрибутивы).
root@debian8:~# Чтение списков пакетов Готово Построение дерева зависимостей Чтение информации о состоянии Готово . (вывод сокращен)
В дистрибутивах, использующих пакеты программного обеспечения с расширением .rpm , таких, как CentOS, RHEL и Fedora, для установки приложения wireshark может использоваться утилита yum .
[root@centos7 ~]# yum install wireshark Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile . (вывод сокращен)
23.1.2. Выбор сетевого интерфейса
При запуске приложения wireshark в первый раз вам придется выбрать сетевой интерфейс. Вы увидите диалог, который выглядит аналогично приведенному на иллюстрации ниже.
Вероятна ситуация, при которой доступных сетевых интерфейсов попросту не окажется, ведь в некоторых дистрибутивах перехват сетевого трафика может осуществляться исключительно пользователем root. В этом случае вам придется запустить приложение wireshark от лица пользователя root с помощью команды sudo wireshark .
Или же вы можете последовать общим рекомендациям и использовать утилиту tcpdump или какой-либо другой инструмент для перехвата трафика и записи данных в файл. Любые перехваченные данные могут быть проанализированы позднее с помощью приложения wireshark .
23.1.3. Минимизация трафика
В процессе перехвата сетевого трафика в течение очень коротких промежутков времени могут генерироваться тысячи пакетов. Очевидно, что такой объем данных затруднит анализ трафика. Попытайтесь выйти из этого положения, изолировав ваш сниффер в рамках сети. Предпочтительным вариантом является перехват трафика, проходящего через сетевой интерфейс изолированной виртуальной сети, находящейся под вашим полным контролем.
Если вы изучаете инструменты для перехвата сетевого трафика в домашних условиях, для минимизации трафика будет полезно завершить работу всех приложений для работы с сетью, запущенных на вашем компьютере, а также отсоединить компьютер от других компьютеров и от таких устройств, как смартфоны и планшеты.
И все же более важным инструментом для минимизации трафика являются фильтры , которые будут обсуждаться в следующем разделе.
23.1.4. Перехват трафика, генерируемого утилитой ping
Я запустил сниффер и захватил все пакеты, переданные по сети в результате исполнения трех команд ping (не имеет смысла выполнять эти команды от лица пользователя root):
root@debian7:~# ping -c2 ns1.paul.local PING ns1.paul.local (10.104.33.30) 56(84) bytes of data. 64 bytes from 10.104.33.30: icmp_req=1 ttl=64 time=0.010 ms 64 bytes from 10.104.33.30: icmp_req=2 ttl=64 time=0.023 ms --- ns1.paul.local ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1001ms rtt min/avg/max/mdev = 0.010/0.016/0.023/0.007 ms root@debian7:~# ping -c3 linux-training.be PING linux-training.be (188.93.155.87) 56(84) bytes of data. 64 bytes from antares.ginsys.net (188.93.155.87): icmp_req=1 ttl=56 time=15.6 ms 64 bytes from antares.ginsys.net (188.93.155.87): icmp_req=2 ttl=56 time=17.8 ms 64 bytes from antares.ginsys.net (188.93.155.87): icmp_req=3 ttl=56 time=14.7 ms --- linux-training.be ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 14.756/16.110/17.881/1.309 ms root@debian7:~# ping -c1 centos7.paul.local PING centos7.paul.local (10.104.33.31) 56(84) bytes of data. 64 bytes from 10.104.33.31: icmp_req=1 ttl=64 time=0.590 ms --- centos7.paul.local ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.590/0.590/0.590/0.000 ms
В общей сложности из сети было захвачено более чем 200 пакетов. Все станет гораздо очевиднее в том случае, если введете строку icmp в поле фильтра и нажмете кнопку «Применить» («Apply»).
23.1.5. Перехват трафика, генерируемого утилитой ping и клиентом dns
Работая с той же сессией захвата данных, применим отличный фильтр . Мы хотим отслеживать трафик, относящийся как к протоколу dns , так и к протоколу icmp , поэтому нам придется ввести названия двух упомянутых протоколов в поле фильтра.
Для захвата данных, относящихся к двум рассматриваемым протоколам, в поле фильтра должна быть введена строка «dns or icmp» . В случае ввода строки «dns and icmp» не будет выведено информации о каких-либо пакетах, так как не существует пакетов, относящихся к обоим упомянутыми протоколам.
При рассмотрении приведенной выше иллюстрации можно заметить, что пакеты 25 и 26 имеют исходные и целевые IP-адреса 10.104.33.30. Это объясняется тем, что клиент DNS работает на том же компьютере, что и сервер DNS.
Аналогичная ситуация наблюдается и в случае пакетов 31 и 32, ведь с помощью утилиты ping осуществляется отправка пакетов рабочей системе, на которой запущена данная утилита.
23.1.6. Определенный IP-адрес
В данном случае осуществляется фильтрация пакетов, относящихся к протоколу DNS и содержащих определенный IP-адрес . В качестве фильтра используется строка «ip.addr==10.104.33.30 and dns» . Директива and сообщает приложению о том, что следует выводить информацию о каждом пакете, соответствующем двум условиям.
Пакет 93 содержит запрос DNS , направленный на получение записи типа A домена linux-training.be. Пакет 98 содержит ответ от сервера DNS . Как вы думаете, что происходило после отправки пакета 93 и до приема пакета 98? Попытайтесь ответить на этот вопрос перед чтением следующего раздела (при работе с различными системами всегда полезно пытаться предсказывать наступающие события и проверять корректность своих предсказаний).
23.1.7. Фильтрация на основе фреймов
Корректным термином, используемым для обозначения перехваченного пакета , является термин фрейм (из-за того, что мы осуществляем перехват пакетов на уровне 2 сетевой модели OSI). Таким образом, для вывода информации о пакетах с определенными номерами, следует использовать директиву frame.number в поле фильтра.
23.1.8. Исследование содержимого пакетов
Средняя панель окна сниффера может быть раскрыта. При выборе строки в рамках данной панели вы можете увидеть соответствующие значения байт в поле нижней панели.
На иллюстрации ниже показана средняя панель окна сниффера с выбранным адресом моего ноутбука.
Учтите, что описанная выше техника отлично работает при перехвате трафика, передаваемого через один сетевой интерфейс. Если же вы перехватываете трафик, к примеру, с помощью команды tcpdump -i any , вы столкнетесь с методом перехвата пакетов «Linux cooked capture» .
23.1.9. Другие примеры фильтров
Вы можете комбинировать два описания протоколов с помощью директивы логической операции or («ИЛИ»), расположенной между ними. На иллюстрации ниже показан способ захвата исключительно пакетов, относящихся к протоколам ARP и BOOTP (или DHCP ).
А на следующей иллюстрации показан способ перехвата пакетов, относящихся к протоколу DNS и содержащих определенный IP-адрес .
23.2. Утилита tcpdump
В случае работы с интерфейсом командной строки системы перехват пакетов может осуществляться с помощью утилиты tcpdump . Ниже приведены некоторые примеры ее использования.
При использовании команды tcpdump host $ip будет выводиться информация обо всем трафике, относящимся к определенному узлу (в данном случае с IP-адресом 192.168.1.38).
root@ubuntu910:~# tcpdump host 192.168.1.38 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
Перехват трафика, относящегося исключительно к протоколу ssh (протокол TCP, порт 22), может осуществляться с помощью команды tcpdump tcp port $порт . Длина строк вывода урезана до 76 символов для более удобного чтения.
root@deb503:~# tcpdump tcp port 22 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes 14:22:20.716313 IP deb503.local.37973 > rhel53.local.ssh: P 666050963:66605 14:22:20.719936 IP rhel53.local.ssh > deb503.local.37973: P 1:49(48) ack 48 14:22:20.720922 IP rhel53.local.ssh > deb503.local.37973: P 49:113(64) ack 14:22:20.721321 IP rhel53.local.ssh > deb503.local.37973: P 113:161(48) ack 14:22:20.721820 IP deb503.local.37973 > rhel53.local.ssh: . ack 161 win 200 14:22:20.722492 IP rhel53.local.ssh > deb503.local.37973: P 161:225(64) ack 14:22:20.760602 IP deb503.local.37973 > rhel53.local.ssh: . ack 225 win 200 14:22:23.108106 IP deb503.local.54424 > ubuntu910.local.ssh: P 467252637:46 14:22:23.116804 IP ubuntu910.local.ssh > deb503.local.54424: P 1:81(80) ack 14:22:23.116844 IP deb503.local.54424 > ubuntu910.local.ssh: . ack 81 win 2 ^C 10 packets captured 10 packets received by filter 0 packets dropped by kernel
Та же операция, но с записью захваченных данных в файл, может осуществляться с помощью команды tcpdump -w $имя_файла .
root@ubuntu910:~# tcpdump -w sshdump.tcpdump tcp port 22 tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes ^C 17 packets captured 17 packets received by filter 0 packets dropped by kernel
С помощью команды tcpdump -r $имя_файла может быть выведено содержимое файла, созданного в предыдущем примере.
root@ubuntu910:~# tcpdump -r sshdump.tcpdump
Множество других примеров использования рассматриваемой утилиты может быть найдено на странице руководства man tcpdump .
23.3. Практическое задание: перехват сетевого трафика
1. Установите приложение wireshark в вашу систему (работающую не в виртуальной машине).
2. Используйте утилиту ping генерации трафика между вашим и каким-либо другим компьютером.
3. Начните перехват сетевого трафика.
4. С помощью фильтра осуществите вывод информации исключительно о тех пакетах, которые содержат ответы на запросы от утилиты ping.
5. Теперь передайте утилите ping имя домена (такое, как www.linux-training.be) и попытайтесь перехватить пакеты с запросом и ответом DNS. Какой DNS-сервер был использован? Был ли использован протокол TCP или UDP для передачи запроса и ответа?
6. Найдите закрытый вебсайт, имеющий форму запроса пароля. Попытайтесь войти на него, использовав имя пользователя ‘paul’ и пароль ‘hunter2’ в процессе работы сниффера. Теперь попытайтесь найти введенные имя пользователя и пароль в захваченных с помощью сниффера данных.
23.4. Корректная процедура выполнения практического задания: перехват сетевого трафика
1. Установите приложение wireshark в вашу систему (работающую не в виртуальной машине).
В дистрибутивах Debain/Ubuntu: aptitude install wireshark
В дистрибутивах Red Hat/Mandriva/Fedora: yum install wireshark
2. Используйте утилиту ping генерации трафика между вашим и каким-либо другим компьютером.
3. Начните перехват сетевого трафика.
Выберите сетевой интерфейс (вероятно, eth0)
4. С помощью фильтра осуществите вывод информации исключительно о тех пакетах, которые содержат ответы на запросы от утилиты ping.
Введите ‘icmp’ (без кавычек) в поле фильтра и нажмите кнопку «Применить» («Apply»).
5. Теперь передайте утилите ping имя домена (такое, как www.linux-training.be) и попытайтесь перехватить пакеты с запросом и ответом DNS. Какой DNS-сервер был использован? Был ли использован протокол TCP или UDP для передачи запроса и ответа?
В первую очередь запустите сниффер.
Введите ‘dns’ в поле фильтра и нажмите кнопку «Применить» («Apply»).
root@ubuntu910:~# ping www.linux-training.be PING www.linux-training.be (88.151.243.8) 56(84) bytes of data. 64 bytes from fosfor.openminds.be (88.151.243.8): icmp_seq=1 ttl=58 time=14.9 ms 64 bytes from fosfor.openminds.be (88.151.243.8): icmp_seq=2 ttl=58 time=16.0 ms ^C --- www.linux-training.be ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1002ms rtt min/avg/max/mdev = 14.984/15.539/16.095/0.569 ms
Окно приложения wireshark должно выглядеть аналогичным образом.
На основе информация из окна приложения wireshark можно сделать вывод о том, что запрос DNS передавался с помощью пакета UDP, после чего несложно дать ответы на поставленные вопросы.
6. Найдите закрытый вебсайт, имеющий форму запроса пароля. Попытайтесь войти на него, использовав имя пользователя ‘paul’ и пароль ‘hunter2’ в процессе работы сниффера. Теперь попытайтесь найти введенные имя пользователя и пароль в захваченных с помощью сниффера данных.
Предыдущий раздел: | Оглавление | Следующий раздел: |
Глава 22. Настройка сетевых интерфейсов | Глава 24. Добавление IP-адресов и связывание сетевых интерфейсов |