Препарируем IP

Константин Клягин

Xakep, номер #063, стр. 063-116-1

(http://thekonst.net/)

Работа с raw sockets в Linux

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

Интернет - то же болото. Лягушки TCP/IP соединений, UDP-головастики, жуки PING’ов и личинки DNS-запросов шныряют тут и там, повинуясь подводному течению роутингов. Наша задача сегодня - выловить несколько экземпляров этой живности и препарировать их. Разложить на косточки, кишочки и прочий ливер. А потом из всего этого мы вполне сможем собрать какого-нибудь Франкенштейна.

TCP/IP

Пожалуй, самым сложным из всех стандартных IP-протоколов является TCP, в котором клиент и сервер для осуществления коммуникации открывают по отдельному сокету для каждого соединения. На TCP ездят большинство интернет-сервисов, хорошо знакомых каждому: HTTP, POP3, SMTP, TELNET, SSH и т.п.

На первый взгляд (или спьяну) может показаться, что TCP соединение - своего рода выделенный канал, работающий по принципу: с одного конца вбросил - с другого поймал. Однако, протерев похмельные глаза рукавом, замечаешь массу небольших пакетов, с помощью которых этот поток реализуется. Грубо говоря, двунаправленный поток данных по TCP из IP-пакетов склеивается воедино. Протокол предусматривает несколько важных моментов, делающих сокет-соединения тем, что они собой и представляют. Во-первых, в IP никто не гарантирует доставку пакетов, в то время как потеря куска данных в сокет-соединении недопустима. Поэтому на каждый принятый пакет получающая сторона отвечает подтверждением. В противном случае все посылается заново. Кроме этого, TCP-пакеты имеют порядковые номера, используемые для восстановления порядка, в котором были посланы данные. Контрольные суммы, включенные в пакеты, обеспечивают сохранность данных и их прибытие на место назначения в лучшем виде.

Формат пакетов TCP, а также их разновидности ты запросто найдешь в RFC. Аббревиатура TCP означает Transport Control Protocol, и сам протокол часто обозначается как TCP/IP, так как уровнем ниже лежит IP - Internet Protocol.

Черный ping смерти

Общеизвестно, что старый добрый пинг используется для проверки соединения с машинкой, имеющей определенный адрес. На самом деле протокол этот называется ICMP, а пинг - одно из его применений с включенной echo-функцией. Получая такой пакет, хост обязан ответить точной копией полученных данных.

Как ни странно, когда-то злобные хакеры валили хосты именно с помощью пинга. Дело в том, что некоторые операционки были уязвимы для атак типа Ping of death. Их смысл прост: машинке с дырявой операционкой посылался пинг длиной больше стандартных 65535 байтов. Системы, вроде Solaris 2.4, Minix, MacOS 7, Windows 3.11 и 95, от этого пучило, они падали, перезагружались и висли. В 1996 году POD помог славно повеселиться многим товарищам. И хотя сейчас большинство операционок на такой понт не возьмешь, стоит все-таки взглянуть, как это делается. Вдруг кто-нибудь да выпустит интернет-холодильник или швейную машинку с неотлаженным IP-стеком? Только представь себе, сколько протухших супов, гнилых окороков, а также рубашек с наглухо зашитыми карманами и рукавами обещает нам такой поворот событий. Поэтому приступим.

Содержание  Вперед на стр. 063-116-2
ttfb: 3.4990310668945 ms