На устройствах, расположенных между моей локальной сетью и маршрутизатором (весь трафик проходит), мне нужно прочитать общее имя из пакета сертификата сервера 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)Наконец, обратите внимание, что сообщения 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