Утилита tcpdump
Сеть напоминает кровеносную систему, а движущиеся по ней пакеты сродни тромбоцитам, лейкоцитам и прочим клеткам крови. Однако не все, что плавает в крови, несет пользу. Периодически в кровь проникает зараза, которая стремится навредить или даже убить весь организм. Чтобы обнаружить и вовремя устранить заболевание, необходимо сдавать кровь на анализы. С аналогичной целью следует анализировать «сетевую кровь». Стандартным инструментом для такого анализа в *nix является утилита tcpdump.
Виртуозное владение опциями командной строки
Утилита tcpdump представляет собой сетевой анализатор пакетов, разработанный Lawrence Berkeley National Laboratory. Если tcpdump запустить без каких-либо параметров, она будет перехватывать все сетевые пакеты и выводить о них информацию. С помощью параметра ‘-i’ можно указать сетевой интерфейс, с которого следует принимать данные:
# tcpdump -i eth2
Таким образом, с интерфейса eth2 будет осуществляться захват пакетов. Если требуются лишь пакеты, получаемые или отправляемые от определенного хоста, то его имя или IP нужно указать после ключевого слова host:
# tcpdump host namesrv
Если же нужны пакеты, которыми обмениваются, например, хосты namesrv1 и namesrv2, то можно использовать такой фильтр:
# tcpdump host namesrv1 and namesrv2
Для отслеживания только исходящих пакетов от какого-либо узла нужно указать сочетание «src host»:
# tcpdump src host namesrv
А для отслеживания только входящих пакетов – «dst host»:
# tcpdump dst host namesrv
Ключевые слова «src port» и «dst port» позволяют указывать порт отправителя и порт получателя, например:
# tcpdump dst port 513
Если нужно отслеживать один из трех протоколов tcp, udp, icmp, то его имя можно просто указать в командной строке. С помощью булевых операторов and (&&), or (||) и not (!) можно задавать фильтры произвольной сложности. Ниже приведен пример фильтра, отслеживающего только ICMP-пакеты, приходящие из внешней сети:
# tcpdump icmp and not src net localnet
Можно проверять конкретные биты или байты в заголовках протоколов, для чего используется такой формат: proto[expr:size], где proto – один из протоколов ether, fddi, tr, ip, arp, rarp, tcp, udp, icmp или ip6; expr – смещение в байтах от начала заголовка пакета; size – дополнительное поле, указывающее, сколько байт рассматривать (может отсутствовать, тогда рассматривается 1 байт). Например, чтобы отбирать только TCP-сегменты, в которых установлен флаг SYN, следует использовать фильтр:
# tcpdump ‘tcp[ 13 ]==2′
Здесь нужно знать, что с 13 байта заголовка TCP расположены 8 бит флагов (1 байт), где SYN является вторым битом по номеру. Так как он должен быть установлен в 1, то байт флагов в двоичном виде будет выглядеть как 00000010 (это 2 в dec). С помощью аргумента ‘-c’ можно указать количество принимаемых пакетов:
# tcpdump -c 10
В итоге будет получено всего 10 пакетов. Параметр ‘-a’ позволяет (если возможно) отображать IP-адреса в символьном виде (правда это довольно сильно замедляет работу утилиты):
# tcpdump -a
С помощью флага ‘-vvv’ можно получить максимально подробный вывод. Меньшую информацию выдают флаги: ‘-v’ и ‘-vv’. Обо всех возможных опциях можно узнать на страницах справочного руководства tcpdump(8).
Формат выходной информации tcpdump
В начале каждой строки листинга tcpdump ставится отметка времени, которая является текущим временем часов в формате: «hh:mm:ss.frac», где frac – это доли секунд. За отметкой времени может указываться интерфейс, на который происходит прием пакетов, например, eth0, eth1, lo и т. п. Запись «eth0<” означает, что идет прием пакетов на интерфейс eth0. Соответственно, запись “eth0>» означает, что идет отправка пакетов в сеть с интерфейса eth0. Дальнейшие сведения зависят от типа принимаемого пакета (ARP/RARP, TCP, UDP, NBP, ATP). Далее показаны форматы для некоторых основных типов пакетов.
1. TCP-пакеты
src.port > dst.port: flags data-seqno ack window urgent options
src.port и dst.port – это IP-адрес и порт источника и приемника пакетов.
flags – это флаги, установленные в заголовке TCP-пакета. Могут принимать комбинации из символов S (SYN), F (FIN), P (PUSH), R (RST), также в этом поле может стоять одна точка ‘.’, которая означает отсутствие установленных флагов.
data-seqno – описывает данные, содержащиеся в пакете в таком формате: first:last(nbytes), где first и last – номер последовательности первого и последнего байта пакета, nbytes – количество байт данных. Если параметр nbytes равен нулю, то first и last совпадают.
ack – следующий номер последовательности (ISN + 1).
window – размер окна.
urgent – указывает на наличие срочных данных в пакете (флаг URG).
options – здесь могут указываться дополнительные сведения, например (максимальный размер сегмента).
2. UDP-пакеты
src.port > dst.port: udp nbytes
udp – метка, указывающая на то, что идет анализ UDP-пакетов.
nbytes – число байт данных, содержащих UDP-пакет.
3. ICMP-пакеты
src > dst: icmp: type
icmp – метка, идентифицирующая ICMP-пакет.
type – тип ICMP-сообщения, например, echo request или echo reply.
Учимся распознавать атаку в листингах tcpdump
Некоторые системы обнаружения атак (NIDS) используют журналы протоколирования, созданные утилитой tcpdump, но мы сейчас научимся самостоятельно определять основные типы атак в листингах tcpdump.
Листинг tcpdump, в котором зафиксировала DoS-атака SYN Flood против узла 172.23.115.22. Об этом говорит множество SYN-запросов на один порт (80/tcp) за очень короткий промежуток времени (десятки запросов за одно и то же время: 13:15:11.580126).
Зафиксирована распределенная DoS-атака (DDoS) ICMP flooding (flood ping). На первый взгляд можно подумать, что это обычный ping хоста, поскольку просто принимаются ICMP-сообщения echo request, а в ответ посылаются сообщения ICMP echo reply. Если бы не слишком большое число запросов за столь короткий промежуток времени, к тому же все они приходят с разных IP-адресов.
IP-адреса, а также порт источника и приемника совпадают – это явный признак атаки Land. Шторм Land-запросов приводит к зацикливанию и может полностью вывести атакуемый узел из строя. Долгое время считалась, что эта атака вместе с устаревшими системами окончательно ушла в историю, однако багтраки всего мира не так давно сообщили, что обнаружена возможность осуществления Land против систем Windows Server 2003 и Windows XP SP2. Стоит отметить, что существует несколько модификаций этой атаки, например, Latierra – когда посылаются пакеты на несколько портов одновременно.
Можно увидеть множество попыток установить TCP-соединение на различные порты узла 172.23.115.22. Большинство записей имеют следующий вид:
12:00:17.899408 eth0 < 192.168.10.35.2878 > 172.23.115.22.340: S 3477705342:3477705342 (0) win 64240 (DF)
12:00:17.899408 eth0 > 172.23.115.22.340 > 192.168.10.35.2878: R 0:0 (0) ack 3477705343 win 0 (DF)
В первой строке передается TCP SYN-запрос, а во второй отсылаются в ответ пакеты TCP RST – это говорит о том, что подключение к данному порту невозможно. В листинге также встречается такая цепочка записей:
12:00:17.899408 eth0 < 192.168.10.35.2879 > 172.23.115.22.ssh: S 3477765723:3477765723 (0) win 64240 (DF)
12:00:17.899408 eth0 > 172.23.115.22.ssh > 192.168.10.35.2879: S 3567248280:3567248280 (0) ack 3477765724 win 5840 (DF)
12:00:17.899408 eth0 < 192.168.10.35.2879 > 172.23.115.22.ssh: . 1:1(0) ack 1 win 64240 (DF)
12:00:17.899408 eth0 < 192.168.10.35.2879 > 172.23.115.22.ssh: R 3477765724:3477765724(0) win 0 (DF)
Здесь аналогично: в первой строке передается SYN-запрос на ssh-порт (22/tcp) узла 172.23.115.22. Затем в следующей строке показано, что узел 172.23.115.22 посылает ответ с установленными флагами SYN и ACK, при этом значение поля Acknowledgment Number в TCP заголовке увеличено на единицу (3477765723+1). В третьей строке узел 192.168.10.35 подтверждает получение ответа. И в последней строчке соединение закрывается узлом 192.168.255.20 посылкой RST. Таким образом, трехэтапное рукопожатие TCP (TCP three-way handshake) не было корректно осуществлено. На рисунке 4 зафиксировано TCP-сканирование узла 172.23.115.22.
С большой вероятностью можно предположить, что работает сканер nmap (с установленным флагом ‘-sT’), так как номера портов, на которые приходят запросы, увеличиваются не последовательно на единицу, как в случае большинства других сканеров, а совершенно случайным образом (хотя так поступает не только один nmap).
Листинг похож на предыдущий. На узел 172.20.100.100 поступают SYN-запросы, и в случае закрытого порта в ответ отсылаются пакеты с флагом RST. Однако реакция на открытые порты отличается по сравнению с предыдущим листингом:
12:44:17.899408 eth0 < 192.168.99.200.2879 > 172.20.100.100.http: S 1045782751:1045782751 (0) win 4096
12:00:17.899408 eth0 > 172.20.100.100.http > 192.168.99.200.2879: S 2341745720:2341745720 (0) ack 1045782752 win 5840 (DF)
12:00:17.899408 eth0 < 192.168.99.200.2879 > 172.20.100.100.http: R 1045782752:1045782752 (0) win 0
Заметно, что в ответ на SYN-запрос возвращается пакет с установленными флагами SYN и ACK, после чего соединение обрывается посылкой флага RST. Значит, трехэтапное рукопожатие не было выполнено полностью – это говорит о том, что порты узла 172.20.100.100 сканируются методом незавершенного открытого сеанса (half-open scanning), или как его еще называют – скрытое (stealth) TCP SYN сканирование (флаг ‘-sS’ в сканере nmap).
В листинге на рисунке 6 на различные порты поступают UDP-дейтаграммы, содержащие 0 байт данных. Это явный признак того, что осуществляется UDP-сканирование. Если порт закрыт, узел отсылает ICMP-сообщение port unreachable. Если такое сообщение не посылается, значит, порт открыт. Отмечу, что 0 байт данных при UDP-сканировании посылает сканер nmap (с установленным флагом ‘-sU’), другие сканеры могут посылать большее число байт данных. Например, Xspider посылает 3 байта в каждом пакете.
Если же в листинге будет множество запросов, в которых не установлено ни одного флага (стоит точка в поле flags), например:
02:12:59.899408 eth0 < 10.15.100.6.41343 > 192.168.2.4.30310: . 971654054:971654054(0) win 2048
02:12:59.899408 eth0 > 192.168.2.4.30310 > 10.15.100.6.41343: R 0:0(0) ack 971654054 win 0 (DF)
02:12:59.899408 eth0 < 10.15.100.6.41343 > 192.168.2.4.275: . 971654054:971654054(0) win 3072
То это ненормальное состояние, которое явно свидетельствует о том, что выполняется Null-сканирование (флаг ‘-sN’ в сканере nmap).
FIN-сканирование (флаг ‘-sF’ в nmap) легко вычислить по множеству поступающих пакетов с установленным флагом FIN:
04:17:40.580653 eth0 < 192.168.10.35.46598 > 172.23.115.22.ftp: F 1918335677: 1918335677(0) win 2048
04:17:40.580653 eth0 < 192.168.10.35.46599 > 172.23.115.22.ftp: F 1918337777: 1918337777(0) win 3072
Сканирование по методу «рождественской елки» (TCP Xmas Tree scan, флаг ‘-sX’ в nmap) определяется по множеству запросов с установленными флагами FIN, URG и PUSH. Если порт закрыт, то в ответ посылается пакет с флагом RST:
03:22:46.960653 eth0 < 192.168.10.35.55133 > 172.23.115.22.19150: FP 1308848741:1308848741(0) win 2048 urg 0
03:22:46.960653 eth0 > 172.23.115.22.19150 > 192.168.10.35.55133: R 0:0(0) ack 1308848741 win 0 (DF)
03:22:46.960653 eth0 < 192.168.10.35.55133 > 172.23.115.22.smtp: FP 1308848741:1308848741(0) win 3072 urg 0
Также существует сканирование с помощью ACK-пакетов (флаг ‘-sA’ в nmap). Этот метод используется для определения правил, используемых брандмауэром. На порты сканируемого узла отправляются пакеты с установленным флагом ACK. Если в ответ приходят пакеты с флагом RST, то порты классифицируются как нефильтруемые (unfiltered) брандмауэром. Если никакого ответа не приходит, порт считается фильтруемым (filtered). Для подтверждения сканер делает запрос дважды, листинг tcpdump будет выглядеть примерно так:
13:44:46.361688 eth0 < 192.168.91.130.56528 > 172.18.10.23.30310: . 1114201130:1114201130(0) ack 0 win 2048
13:44:46.361688 eth0 > 172.18.10.23.30310 > 192.168.91.130.56528: R 0:0(0) win 0 (DF)
13:44:46.361688 eth0 < 192.168.91.130.56528 > 172.18.10.23.275: . 1114201130:1114201130(0) ack 0 win 3072
13:44:46.361688 eth0 >172.18.10.23.275 > 192.168.91.130.56528: R 0:0(0) win 0 (DF)
13:44:46.361688 eth0 < 192.168.91.130.56528 > 172.18.10.23.nntp: . 1114201130:1114201130(0) ack 0 win 2048
На рисунке 7 показана Smurf-атака. Хакер посылает широковещательный ICMP-запрос (echo request) в сеть 172.23.115.0 от имени жертвы (192.168.10.1). Каждый компьютер сети (в листинге показан только узел 172.23.115.1), получивший широковещательный запрос, генерирует ответ (echo reply) на адрес жертвы, вызывая «отказ в обслуживании». Периодическое повторение запроса позволяет поддерживать проведение атаки против хоста 192.168.10.1. Утилита tcpdump после имени интерфейса (eth0) предупреждает опцией B, что идет прием широковещательного запроса. Есть разновидность атаки Smurf под названием Fraggle (осколочная граната), в которой используется UDP, а не ICMP:
08:34:18.899408 eth0 B 192.168.10.22.34904 > 172.23.115.255.echo: udp 64
08:34:18.899408 eth0 > 172.23.115.255.echo > 192.168.10.22.34904: udp 64
08:34:18.520602 eth0 B 192.168.10.22.34904 > 172.23.115.255.echo: udp 64
Атакующий посылает поддельные UDP-пакеты на широковещательной адрес усиливающей сети (обычно на echo-порт 7/udp). Каждая система сети, в которой разрешен ответ на эхо-пакеты, возвратит пакеты системе-жертве, в результате чего будет сгенерирован большой объем трафика.
Иногда в поступающих пакетах могут быть установлены нестандартные сочетания флагов, например, взаимоисключающие флаги SF (SYN+FIN), где SYN – устанавливает соединение, FIN – завершает. Также могут быть указаны резервные флаги [ECN-Echo,CWR] и идущие подряд флаги FIN без предшествующих SYN, например:
11:16:22:899931 eth0 < 192.168.10.35.2879 > 172.23.115.22.491: SF 3477765723:3477765723 (0) win 1024
11:16:22:899931 eth0 < 192.168.10.35.2880 > 172.23.115.22.1351: S [ECN-Echo,CWR] 3477800253:3477800253 (0) win 4096
11:16:22:899931 eth0 < 192.168.10.35.2881 > 172.23.115.22.2880: SFR 3477835208:3477835208 (0) win 4096
Такие запросы злоумышленник может использовать в двух целях. Во-первых, нестандартные комбинации флагов могут вывести узел из строя или способствовать обходу систем обнаружения атак и межсетевых экранов. А, во-вторых, нестандартные флаги используются для идентификации ОС узла. Разные оси реагируют по-разному на пакеты несоответствующие стандартам RFC – эту возможность практикуют утилиты nmap, queso и пр.
Эти и другие атаки в качестве тренировки ты сможешь поискать в листингах tcpdump в головоломках из моей книги «Головоломки для хакера». К тому времени, когда ты читаешь эту статью, книга должна уже быть в продаже.
Теги: tcpdump