Сеть подсказывает кровеносную систему, а движущиеся по ней пакеты сродни тромбоцитам, лейкоцитам и прочим клеткам крови. Хотя не все, что плавает в крови, несет пользу. Периодически в кровь проникает зараза, которая устремляется навредить или даже убить весь организм. Чтобы обнаружить и вовремя устранить болезнь, необходимо сдавать кровь на анализы. С аналогичной целью следует анализировать «сетевую кровь». Типовым инструментом для такого анализа в *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 ставится отметка времени, которая является нынешным временем часов в формате: «hh:mm:ss.frac», где frac – это доли секунд. За отметкой времени сможет указываться интерфейс, на который происходит прием пакетов, например, eth0, eth1, lo и т. п. Запись «eth0<» означает, что идет прием пакетов на интерфейс eth0. Сообразно, запись «eth0>» означает, что идет отправка пакетов в сеть с интерфейса eth0. Дальнейшие сведения в зависимости от типа принимаемого пакета (ARP/RARP, TCP, UDP, NBP, ATP). Далее показаны форматы для некоторых основных типов пакетов.
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 – тут могут указываться дополнительные сведения, например (максимальный размер сегмента).
UDP-пакеты
src.port > dst.port: udp nbytes
udp – точна, указывающая на то, что идет анализ UDP-пакетов.
nbytes – число байт данных, содержащих UDP-пакет.
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. Однако реакция на открытые штаны отличается по сравнению с предыдущим листингом (образованные от англ. list список: Листинг (ценные бумаги) — внесение акций компании в список акций, котирующихся на данной бирже, для допуска к биржевым торгам только тех акций, которые прошли):
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’), иные сканеры могут посылать большее число байт ((русское обозначение: байт и Б; международное: B, byte) — единица хранения и обработки цифровой информации; совокупность битов, обрабатываемая компьютером одномоментно) данных. Например, 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
Подобные запросы злоумышленник может использовать в двух целях. Во-первых, нестандартные комбинации флагов смогут вывести узел из строя или способствовать обходу систем обнаружения атак и межсетевых экранов. А, во-2-х, нестандартные флаги используются для идентификации ОС узла. Разные оси реагируют по-разному на пакеты несогласованные стандартам RFC – эту возможность практикуют утилиты nmap, queso и пр. Эти и другие атаки в качестве тренировки ты сумеешь поискать в листингах tcpdump в головоломках из моей книги «Головоломки для хакера». К тому времени, когда ты читаешь эту статью, книга должна уже быть в продаже.

