Журнал регистрации TCPdump
Утилита TCPdump для Unix (или WinDump для Windows) предназначена для получения вывода (на экран, в файл и т. д.) заголовков сетевых пакетов, получаемых/посылаемых через заданный сетевой интерфейс и соответствующих определенному условию. Данная утилита очень часто используется как самостоятельное средство для сбора информации о сетевом трафике, фиксируемом в сегменте корпоративной сети. На базе этого инструмента очень часто строят системы обнаружения атак и другие средства сетевой безопасности. Так как в данной книге преимущественно приводятся примеры атак именно на основе данных, хранящихся в журнале регистрации TCPdump, я бы хотел описать формат выходных данных, генерируемых этой утилитой. Понимание формата данных, вырабатываемых утилитой TCPdump, также поможет легко адаптироваться и к другим системам анализа сетевого трафика, имеющим схожий формат данных (SHADOW, IPCHAINS, Snort и т. д.).
Генерируемые TCPdump данные зависят от протокола, заголовки пакетов которого анализируются утилитой. Формат протоколов канального уровня я рассматривать не буду, хотя TCPdump и умеет распознавать пакеты этих протоколов (SLIP, Ethernet, FDDI и т. д.). Основное внимание я бы хотел уделить протоколам уровня выше канального, в частности — TCP и UDP. Вывод TCPdump для протокола TCP выглядит следующим образом:
Src.port > dst.port: flags data-seqno ack window urgent options
где Src.port и dst.port – это адреса и порты получателя и отправителя соответственно. Значения номеров портов позволяют идентифицировать различные нарушения, например, функционирование "троянских коней". Flags — комбинация флагов, найденных в заголовке TCP-пакета. К таким флагам могут быть отнесены S (SYN), F (FIN), R (RST), P (PUSH) или '.' (нет флагов). Данный параметр очень часто позволяет обнаружить атаки, основанные на использовании запрещенных комбинаций флагов, как это было описано выше. Параметр data-seqno определяет номер первого байта в последовательности (очереди) байтов (Sequence Number) в текущем сегменте данных. Параметр ack - это номер подтверждения (Acknowledgment Number), определяющий следующий номер в последовательности получаемых подтверждений, который ожидает отправитель в ответ на отосланный сегмент. Параметр window задает размер "скользящего" окна, доступного для приема данных в указанном соединении. Параметр urgent идентифицирует пакет с установленным флагом "Urgent". Параметр options описывает опции сетевого пакета, взятые в угловые скобки (например, <mss 1024>). Параметры src, dst и flags присутствуют всегда, в то время как наличие остальных параметров зависит от разных условий. Можно заметить, что формат данных TCPdump'a для протокола TCP практически полностью повторяет заголовок этого протокола (рис. 4.5).
Для каждой записи журнала регистрации TCPdump первым параметром будет отметка времени, в которой зафиксировано то или иное событие. Эта отметка имеет следующий формат:
hh:mm:ss.frac
Временная отметка является очень важным параметром, т. к. позволяет обнаружить очень многие нарушения политики безопасности (например, работу в нерабочее время). Кроме того, анализ этого параметра позволяет делать вывод о том как действует злоумышленник — в ручном (вводя команды с клавиатуры) или автоматизированном (при помощи специальных программ или сценариев) режиме. Например, если между попытками регистрации в системе проходит всего несколько секунд, то вероятнее всего, сценарий входа реализуется специальной программой, в автоматизированном режиме подставляющей различные идентификаторы и пароли пользователей.
Рис. 4.5. Формат заголовка TCP-пакета
Для протокола UDP формат данных TCPdump выглядит так:
Src.port > Dst.port: udp len
где Src.port и Dst.port — это адреса и порты получателя и отправителя соответственно, a len — размер сообщения. Как и в случае с протоколом TCP, вывод TCPdump для протокола UDP полностью соответствует формату заголовка этого протокола (рис. 4.6). Необходимо отметить, что различные сервисы, построенные на базе UDP (например, DNS или Sun RFC), могут иметь формат заголовка, отличный от указанного.
Рис. 4.6. Формат заголовка
В том случае, когда сообщение фрагментировано, в журнал регистрации TCPdump будет помещен код следующего вида:
(frag id:size@offset+)
или
(frag id:size@offset)
Первый код появляется, если существуют еще фрагменты, связанные с данным фрагментом, а последний – когда данный фрагмент является последним в последовательности. Параметр id определяет идентификатор фрагмента, size – размер фрагмента в байтах, a offset – смещение фрагмента в байтах по отношению к первоначальному сообщению.
Во многих случаях приходится анализировать не только TCP- или UDP-трафик, но и IP-пакеты, для которых формат TCPdump будет следующим:
Src.IP > Dst.IP: protocol len tos
где Src.IP и Dst.IP – адреса источника и получателя, protocol — идентификатор протокола (см. Приложение 4), len — размер передаваемых в пакете данных и tos — тип сервиса (рис. 4.7).
Рис. 4.7. Формат заголовка IP-пакета
Рассмотрим фрагмент (листинг 4.13) журнала регистрации TCPdump [Bejtlichl-00].
Листинг 4.13. Взаимодействие по протоколу FTP
(Фрагмент журнала регистрации TCPdump)
[4:05:27.083238 ftp.client.org.1057 > ftp.server.edu.21: S
1414:1484414(0) win 8192 <mss 536,nop,nop,sackOK> (DF)
14:05:27.250587 ftp.server.edu.21 > ftp.client.org.1057: S
3037133697:3037133697(0) ack 1484415 win 9112 <mss 536> (DF)
14:05:27.259810 ftp.client.org.1057 > ftp.server.edu.21: . ack 1 win 8576 (DF)
...14:05:35.903492 ftp.server.edu.21 > ftp.client.org.l057: F 197:197(0)
ack 37 win 9112 (DF) [tos 0x10]
14:05:35.906748 ftp.client.org.1057 > ftp.server.edu.21: . ack 198 win
8380 (DF)
14:05:35.917049 ftp.client.org.1057 > ftp.server.edu.21: F 37:37(0) ack
198 win 8380 (DF)
Первая запись говорит о том, что узел ftp.client.org инициировал соединение с узлом ftp.server.edu в 14 часов 5 минут 27,083238 секунд. Соединение была запрошено между портом источника 1057 и портом получателя 21 по протоколу TCP. Параметр s свидетельствует о наличии в заголовке TCP-пакета установленного флага SYN. Поскольку такой флаг один, то данный пакет представляет собой первый шаг в трехсторонней процедуре установления виртуального соединения. Номер последовательности равен 1 484 414, а значение 0 в скобках указывает на то, что в пакете передается 0 байтов данных. Числа после двоеточия одинаковы в первом пакете соединения, но уже 1 следующих пакетах эти значения разнятся, т. к. первое является номером последовательности первого байта текущего пакета, а второе — номер последовательности первого байта в следующем пакете. Размер окна для данного соединения устанавливается источником в 8192 байта. Максимальный размер сегмента, т. е. максимальная длина данных, передаваемых источником (FTP-клиентом) получателю (FTP-серверу), равен 536 байтам. Опции пор характеризуют выравнивание TCP-заголовка по 32 битовой границе.
Вторая запись — это следующий шаг процедуры инициализации соединения между FTP-сервером и FTP-клиентом. В этом пакете устанавливается собственный номер последовательности (3037133697) и подтверждается номер, полученный от клиента (1484414). Однако видно, что в поле ack указано значение, на единицу превышающее 1 484 414, т. е. номер последовательности, который FTP-сервер ожидает от клиента. Третий пакет завершает установление TCP-соединения. Можно заметить небольшую ошибку в данном пакете. Номер последовательности должен был быть 3037133698, однако в записи показано число 1. Это отражает только то, что для данной записи номер последовательности записывался не в абсолютном, а в относительном формате (параметр -s командной строки TCPdump). Параметр '.' говорит, что никаких флагов (кроме АСК) в TCP-заголовке не установлено.
Последние три пакета описывают закрытие соединения между FTP-сервером и FTP-клиентом. Сервер посылает клиенту пакет с флагом FIN, указывая на то, что больше не будет передавать никаких данных. При помощи последнего пакета, а точнее – параметра 37:37(0) указывается, что сервер закончил передачу данных. Клиент подтверждает прием FIN-пакет отсылкой своего FIN-пакета. В некоторых случаях вместо нормального завершения соединения при помощи флага FIN может использоваться немедленное прекращение соединения посредством флага RST, который не требует никаких подтверждений.
Более подробно о программе TCPdump и формате генерируемых ею данных можно прочитать в документации на данную утилиту [TCP 1-97]. Версию TCPdump для ОС Unix можно загрузить с FТР-сервера: ftp://ftp.ee.lbl.gov/TCPDump.tar.Z, а версию для ОС Windows 95/98/NT – с http://netgroup-serv.polito.it/windump/.