Опубликован: 20.02.2007 | Доступ: свободный | Студентов: 3481 / 786 | Оценка: 4.42 / 4.03 | Длительность: 40:03:00
Лекция 14:

Анализаторы сетевых потоков

Флаги командной строки: форматирование вывода и переключение опций

Теперь давайте перейдем к рассмотрению более важных флагов и опций, описанных в таблице 14.2.

Таблица 14.2. Опции командной строки инструмента tcpdump
Опция Объяснение
-a Разрешает IP-адреса к именам хостов.
-c <num> Прослушивает до тех пор, пока мы не получили <num> пакетов, а затем выходит.
-d, -dd, -ddd Берет фильтр, который вы указали в командной строке и, вместо прослушивания, выводит пакеты, код которых соответствует этому фильтру, в скомпилированном ассемблерном коде, фрагментах программы на языке C, или в десятичном представлении. Используется главным образом для отладки и редко полезен для новичков и пользователей среднего уровня.
-e Отображает заголовок канального (link-level) уровня. Например, если вы находитесь в сети Ethernet, вы можете отображать Ethernet-заголовки своих пакетов. Опция полезна, если вы интересуетесь низкоуровневыми деталями определенной части сетевого трафика (например, определением MAC-адреса другой машины).
-F <file> Определяет выражение для фильтра из файла вместо командной строки.
-i Прослушивает определенный интерфейс. В системе Unix вы можете использовать ifconfig, чтобы увидеть доступные сетевые интерфейсы. В Windows вы можете использовать windump-D, чтобы найти номер интерфейса, который соответствует интересующему вас сетевому интерфейсу.
-l Осуществляет буферизацию строк, использующуюся в стандартном выводе tcpdump, так что вы можете просматривать файл постранично. Без этой опции, перенаправление вывода будет препятствовать печати любого вывода до выхода из утилиты tcpdump.
-n Не разрешает IP-адреса к именам хостов.
-N Подавляет печать FQDN хоста (полностью квалифицированное имя домена), используя только имя хоста.
-O Подавляет оптимизатор кода фильтрации пакетов. Используйте эту опцию, если вам кажется, что пакетный фильтр, которым вы снабдили tcpdump, теряет нужные пакеты или наоборот включает пакеты, которые должны быть отфильтрованы.
-p Вынуждает tcpdump не помещать сетевой интерфейс в смешанный режим. Опция полезна, если вы заинтересованы только в прослушивании локального трафика (то есть трафика, идущего к машине, на которой вы работаете, и от нее).
-q Вынуждает tcpdump не печатать слишком много информации о заголовке пакета. Вы потеряете много практически важных деталей, но все еще будете видеть время передачи и вовлеченные хосты.
-r <file> tcpdump может записать свой вывод в двоичный файл (см. -w). Эта опция вынуждает tcpdump читать этот файл и отображать его. Так как tcpdump перехватывает необработанные данные, основываясь на пакетном фильтре, который вы определяете в командной строке, то можно использовать -r, чтобы заново считать данные перехваченного пакета и использовать флаги командной строки, предназначенные для форматирования вывода (-n, -s, -e и -X) для отображения его в разных видах.
-s <bytes> Определяет, сколько байтов на пакет должна попытаться "схватить" утилита tcpdump. Значение по умолчанию - 68. Если сделать это значение слишком большим, tcpdump может начать пропускать пакеты.
-S Вынуждает tcpdump печатать абсолютные порядковые номера TCP-пакетов. По умолчанию используются относительные порядковые номера так, чтобы вы могли видеть, на сколько байтов изменяется порядковый номер между пакетами за время TCP-подключения. Использование абсолютных номеров означает, что вам понадобится делать некоторые вычисления самостоятельно.
-t, -tt Вынуждает tcpdump не печатать метку времени вообще, или печатать не отформатированную метку (число секунд, начиная с 1 января 1970).
-T <type> tcpdump может естественно интерпретировать некоторые другие IP-протоколы, и отображать соответствующим образом отформатированный вывод для них, например DHCP, NBT и ARP. Эта опция вынуждает tcpdump особым образом интерпретировать выбранные пакеты, как определенный тип протокола, типа RPC или SNMP.
-v, -vv, -vvv Управляет уровнем многословия утилиты tcpdump. Чем большее количество символов -v вы установили, тем больше получите информации.
-w <file> Означает, что не надо переводить данные перехваченного пакета в удобочитаемый формат, а писать их в двоичный файл, с именем <file>. Опция полезна, если вы перехватили данные и хотите использовать tcpdump или другой инструмент типа Ethereal, чтобы рассмотреть их позже различными способами (см. -r). Так как в этом случае данные не переводятся в удобочитаемый формат, это делает утилиту tcpdump более эффективной, и снижает вероятность пропуска пакетов. Полезно использовать в системе с чрезвычайно большим объемом трафика.
-x Отображает пакет в шестнадцатеричном формате. Посидите с выводом этой команды и с книгой по TCP/IP, если вы хотите больше узнать о TCP-заголовках и такого рода вещах. Эта продвинутая функция может помочь в прослушивании пакетов, которые могут скрывать данные в опциях IP или другим способом искореженные пакеты.
-X Подобна шестнадцатеричной опции, но это как раз та опция, которую мы искали! В дополнение к шестнадцатеричному дампу, она отображает содержание пакета в ASCII-коде, позволяя нам видеть любые ясные текстовые символьные данные, содержащиеся в пакете. Это та опция, с которой мы могли бы прослушивать имена пользователей, пароли и другую интересную информацию, плавающую в сети.
Вывод утилиты Tcpdump

В справке man для tcpdump раздел вывода является, вероятно, одним из самых больших разделов. Поскольку tcpdump пробует интерпретировать некоторые протоколы по-разному, то фактический вывод tcpdump изменится также в зависимости от опций, которыми вы ее снабдили и типа пакетов, которые вы фильтруете. Мы не можем рассмотреть здесь все, но рассмотрим некоторый основной вывод утилиты tcpdump и поговорим о том, что он значит.

Ниже приводится вывод утилиты tcpdump, полученный без опций.

20:11:28.527191 eth0 B somehost.netbios-ns > 192.168.1.255.netbios-ns:NBT
UDP PACKET(137): QUERY; REQUEST; BROADCAST
20:11:28.531361 eth0 arp who-has 192.168.1.1 tell originix 
  (0:e0:29:38:b4:67)
20:11:28.531939 eth0 arp reply 192.168.1.1 is-at 0:4:5a:e3:44:a3
(0:e0:29:38:b4:67)
20:11:28.531994 eth0 originix.1024 ns01.domain: 49930+ PTR?
255.1.168.192.in-addr.arpa. (44)
20:11:28.630838 eth0 ns01.domain originix.1024: 49930 NXDomain* 0/1/0
(116) (DF)
20:11:28.632600 eth0 originix.1024 ns01.domain: 49931+ PTR?
1.1.168.192.in-addr.arpa. (42)
20:11:28.655958 eth0 ns01.domain originix.1024: 49931 NXDomain 0/1/0
(114) (DF)
20:11:28.657685 eth0 originix.1024 ns01.domain: 49932+ PTR?
150.1.1.10.in-addr.arpa. (41)
20:11:28.668566 eth0 ns01.domain originix.1024: 49932 1/2/2 PTR ns01.
(162) (DF)
20:11:29.277025 eth0 B somehost.netbios-ns 192.168.1.255.netbios-ns:NBT
UDP PACKET(137): QUERY; REQUEST; BROADCAST

Давайте вначале сосредоточимся на отдельной строке. Первое значение представляет собой временную метку для пакета. Заметьте, что заданный по умолчанию формат не включает дату. Следующая порция информации - это интерфейс, на котором этот пакет был получен. После интерфейса мы видим <, > или B. Это указание, был ли пакет входящим, выходящим или широковещательным. Затем мы видим имена хостов или IP-адреса, за которыми следует точка и имя порта или номер. Знак "больше" (>) указывает, что хост и порт отправителя будут всегда слева, а хост и порт получателя будут всегда справа.

Первый пакет распознан как NetBIOS поверх TCP- (NBT-) пакета. Поскольку tcpdump может интерпретировать часть информации о пакете, он сообщает вам, что somehost выполнял широковещательный запрос NetBIOS, вероятно пробуя искать имя хоста для сетевого IP-адреса.

Второй пакет оказался запросом протокола определения адресов (ARP). ARP отображает IP-адрес на MAC-адрес Ethernet и наоборот. Originix посылает запрос ARP, прося MAC-адрес, соответствующий адресу 192.168.1.1 (возможно, это его шлюз). На следующей строке шлюз отвечает со своим MAC-адресом. Теперь два адаптера Ethernet могут говорить друг с другом на канальном уровне (Data Link Layer). Этот шаг необходим прежде, чем может осуществиться любая IP-связь.

Четвертая и последующие строки содержат то, что оказалось трафиком DNS. Originix делает запрос к ns01 через порт домена 53. Поскольку утилита tcpdump может также интерпретировать пакеты DNS, то она пытается дать информацию о фактическом содержании пакета, включая тип запроса и адрес, с которого он сделан. Из вывода следует, что сначала она выполняет обратный поиск на "широковещательном" адресе (192.168.1.255), затем она пробует обратный поиск на 192.168.1.1, и, наконец, она пробует разрешать 10.1.1.150. Первые два поиска оканчиваются неудачей и получением сообщений "NXDomain" или "несуществующий домен" с DNS-сервера. Но адрес 10.1.1.150 успешно разрешается к имени ns01, которое является именем самого сервера.

Выше был приведен пример некоторых пакетов, которые утилита tcpdump может естественно интерпретировать.

С другими пакетами, подобными нормальному telnet- или SSH-трафику, будет отображена только информация о пакетах, и ничего больше.

20:28:48.375504 eth0 <somehost.2765 > originix.ssh: P 13024:13068(44) ack
42597 win 64695 (DF)
20:28:48.375574 eth0 >originix.ssh > somehost.2765: P 42597:42877(280) ack
13068 win 32120 (DF)
20:28:48.377010 eth0 < somehost.2765 > originix.ssh: P 13068:13200(132) ack
42877 win 64415 (DF)
20:28:48.377081 eth0 >originix.ssh > somehost.2765: P 42877:43157(280) ack
13200 win 32120 (DF)

Здесь мы поймали середину SSH-сеанса между Originix и somehost. Мы можем видеть, что установлен флаг P (push). Мы можем также видеть размер пакетов, поскольку утилита отображает относительный порядковый номер TCP-пакета, за которым следует ожидаемый номер и размер пакета (13024:13068 (44)). Заметьте, что вторая строка дает ack 13068. Это оказывается подтверждением получения предыдущего пакета, и того, что 13068 является следующим номером пакета, который он ожидает. Размер TCP-окна (наибольшее количество данных, которые он может обрабатывать) сообщается хостом в каждом пакете, и в этом примере установлен бит "не фрагментировать", чтобы препятствовать разделению пакета на части. Наблюдение TCP-трафика таким способом может быть чрезвычайно полезным при изучении работы протокола.

Вы можете многое узнать о внутренней работе TCP, выполняя tcpdump и наблюдать, что происходит, когда вы запускаете сеанс telnet. Проверьте следующее.

20:30:58.635657 eth0 < somehost.2910 > originix.telnet: S
213111209:213111209(0) win 65535 <mss 1460,nop,nop,sackOK> (DF)
20:30:58.636019 eth0 > originix.telnet > somehost.2910: S
1513461939:1513461939(0) ack 213111210 win 32120 <mss 1460,nop,nop,sackOK>
(DF)
20:30:58.636659 eth0 < somehost.2910 > originix.telnet: . 1:1(0) ack 1 win
65535 (DF)
20:30:58.639213 eth0 < somehost.2910 > originix.telnet: P 1:4(3) ack 1 win
65535 (DF)

Выше приведен вывод, который дает tcpdump, встречая подключение telnet. В двух первых строчках обратите внимание на отличия от тех пакетов, которые мы рассматривали в сеансе SSH. Этот пакет начинает подключение. Мы можем это утверждать, потому что установлен флаг S (SYN). Мы также видим, что порядковые номера пакетов в двух первых строках намного больше. Дело в том, что tcpdump использует фактические порядковые номера TCP-пакетов (32-х битные значения из диапазона от 0 до 4294967295) в начале TCP-подключения. Для остальной части подключения по умолчанию используются значения относительных порядковых номеров так, чтобы пользователям было легче видеть изменения во время передвижения пакетов туда-сюда. Мы также видим некоторые опции TCP, по которым ведутся переговоры во время трехэтапного "квитирования" (mss1460, nop, nop, sackOK). После того, как связь установлена, somehost начинает посылать данные (3 байта заслуживающих внимания данных).

Используя программу BUTTSniffer, мы наблюдали процесс входа в систему из сеанса telnet. Мы можем делать это и с помощью утилиты tcpdump, используя опцию -X, чтобы отобразить содержание пакета в ASCII-коде. Однако поскольку эта опция отображает и заголовки пакета, и данные, то трудно локализовать то, что мы ищем. Сеанс telnet особенно труден для прослушивания с помощью tcpdump, потому что пакет посылается для каждого символа, который печатается. Соединить это в одно целое вручную может быть трудно. Но таким путем все-таки можно подслушать любого клиента, который держит в памяти информацию о пользователе и о пароле, а затем посылает ее одновременно в одном пакете (подобно Web-транзакции по HTTP, или входу в систему по FTP).

Давайте попробуем подслушать сеанс FTP с помощью команды tcpdump -X dst port 21. Поскольку FTP использует команды USER и PASS для пересылки имени пользователя и пароля, мы должны искать вывод, содержащий эти команды.

20:51:06.697724 somehost.2937 originix.ftp: P 0:10(10) ack 84 win 65452 (DF)
0x0000  4500    0032    5bd4    4000    8006    1ad8    c0a8    0165    E..2[.@........e
0x0010  c0a8    0164    0b79    0015    0cc6    3325    a621    9a45    ...d.y....3%.!.E
0x0020  5018    ffac    68a7    0000    5553    4552    2062    6f62    P...h...USER.bob
0x0030  0d0a                            ..

20:51:06.893543 somehost.2937 originix.ftp: . ack 116 win 65420 (DF)
0x0000  4500    0028    5fd4    4000    8006    16e2    c0a8    0165    E..(_.@........e
0x0010  c0a8    0164    0b79    0015    0cc6    332f    a621    9a65    ...d.y....3/.!.e
0x0020  5010    ff8c    a023    0000    0000    0000    0000        P....#........

20:51:10.828077 somehost.2937 originix.ftp: P 10:23(13) ack 116 win 65420 (DF)
0x0000  4500    0035    64d4    4000    8006    11d5    c0a8    0165    E..5d.@........e
0x0010  c0a8    0164    0b79    0015    0cc6    332f    a621    9a65    ...d.y....3/.!.e
0x0020  5018    ff8c    fe75    0000    5041    5353    2062    6f62    P....u..PASS.bob
0x0030  3132    330d    0a                      123 ..
14.1.

Фильтруя только трафик, предназначенный для порта 21, и используя опцию -X, мы можем легко обнаруживать информацию FTP, предназначенную для входа в систему. В этом примере снова появился пользователь bob, регистрирующий вход на FTP-сервер на хосте originix с паролем bob123.