Назад | Перейти на главную страницу

Фильтр сертификатов приветствия сервера tcpdump

На устройствах, расположенных между моей локальной сетью и маршрутизатором (весь трафик проходит), мне нужно прочитать общее имя из пакета сертификата сервера Hello.

Итак, я пытаюсь понять, как получить правильный фильтр с помощью tcpdump.

Я нашел помощь в этой статье: http://www.wains.be/pub/networking/tcpdump_advanced_filters.txt
В нем объясняется, как использовать расширенный фильтр для полей IP и TCP.

Я пробовал такой фильтр:

$ tcpdump -i any \
  'tcp and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' \
   -A -s 0 -v | grep 'Host\|id-at-commonName='

Как поясняется в документе, «Мы сопоставляем любой пакет, содержащий данные».

Это работает для Host поле, как и многие другие данные, но я не могу сопоставить поле id-at-commonName= который находится в поле SSL (то есть в поле данных TCP?).

Чтобы быть уверенным, что я захватил файл pcap с тем же самым фильтром (без grep), и когда я открываю его с помощью Wireshark, я могу получить каждое общее имя сертификата. Я должен использовать tcpdump фильтр, потому что мне нужно получать данные "на лету".

Может кто-нибудь объяснить, почему я не вижу эти данные через tcpdump?

Если вы просто хотите получить пакет SSL Handshake Hello, чтобы увидеть содержащийся в нем SNI, следующий фильтр, похоже, работает как для TLS1.0, так и для TLS1.2:

tcpdump -i any -s 1500 (tcp[((tcp[12:1] & 0xf0) >> 2)+5:1] = 0x01) and (tcp[((tcp[12:1] & 0xf0) >> 2):1] = 0x16)

где 0x16 = рукопожатие (22) в первом байтовом поле данных

и 0x01 = Client Hello (1) в 6-м байтовом поле данных

В id-at-commonName метка отображается Wireshark, формат провода не содержит текст, а необработанные байты. Имя id-at-commonName является 03 в байтах. После этого идет UTF8String (12 = 0x0c) длиной 9 байт (localhost).

Если вы пытаетесь сопоставить имена хостов из потока TCP, имейте в виду следующее:

  • Сертификаты могут быть действительны для нескольких субъектов, дополнительные имена можно найти в id-ce-subjectAltName (2.5.29.17)
  • Реальный хост, к которому вы пытаетесь подключиться, может быть объявлен в сообщении подтверждения ClientHello через расширение Server Name Indication (SNI).
  • Несколько сообщений могут быть объединены в одну запись.

Наконец, обратите внимание, что сообщения SSL могут быть разделены на несколько сегментов TCP, что еще больше затрудняет прямой анализ. Возможно, это вариант захвата для записи фиксированного количества пакетов в файл с включенной ротацией, последующего ручного анализа с помощью tshark и, наконец, удаления захвата?

спасибо @Nathan Chan, так как я не могу комментировать из-за недостаточной репутации, добавьте параметры -nnXSs0 -ttt, чтобы сделать его читабельным.

tcpdump -i any -s 1500 '(tcp[((tcp[12:1] & 0xf0) >> 2)+5:1] = 0x01) and (tcp[((tcp[12:1] & 0xf0) >> 2):1] = 0x16)' -nnXSs0 -ttt