Администрирование систем Linux. Перехват сетевого трафика
Оригинал: Network sniffing
Автор: Paul Cobbaut
Дата публикации: 12 марта 2015 г.
Перевод: A. Панин
Дата перевода: 1 апреля 2015 г.
Глава 23. Перехват сетевого трафика
Администратор сети должен уметь работать со сниффером, таким, как wireshark или tcpdump, для диагностирования проблем сети.
Студенту также придется нередко прибегать к использованию сниффера для того, чтобы разобраться в принципах функционирования сетей. В данной главе описываются соответствующие методики перехвата сетевого трафика.
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 генерации трафика между вашим и каким-либо другим компьютером.
-
ping $ip_адрес
-
3. Начните перехват сетевого трафика.
-
(sudo) wireshark
Выберите сетевой интерфейс (вероятно, 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' в процессе работы сниффера. Теперь попытайтесь найти введенные имя пользователя и пароль в захваченных с помощью сниффера данных.
http://rus-linux.net/MyLDP/BOOKS/LSA/ch23.html
|