Захват только ssl рукопожатие с tcpdump
У меня есть сервер, к которому многие клиенты подключаются с использованием SSL. В последнее время я наблюдаю ошибки рукопожатия SSL в журналах сервера (например, ошибка MAC MAC). Сама ошибка не важна, но я хочу понять, почему некоторые клиенты могут подключаться, в то время как другие терпят неудачу, а также должны определить, какие клиенты отказывают.
Для устранения этой проблемы я хочу перехватить все рукопожатия SSL, происходящие на сервере, и, поскольку я не знаю, когда подключаются проблемные клиенты, я не хочу перехватывать весь трафик, пока это не произойдет. Я просто хочу захватить все рукопожатия SSL и позже проанализировать их с помощью Wireshark. Предположим, что у меня есть доступ только к tcpdump и никаких других инструментов для захвата.
3 ответа
Я не знаю, что именно вы называете рукопожатием, но я предлагаю эту команду, которая, вероятно, захватит более 95% того, что вы можете захотеть:
tcpdump -ni eth0 "tcp port 443 and (tcp[((tcp[12] & 0xf0) >> 2)] = 0x16)"
Теперь, что это делает:
- eth0: мой сетевой интерфейс, измените его, если вам нужно
- TCP-порт 443: я полагаю, это порт, который слушает ваш сервер, измените его, если вам нужно
- tcp [((tcp [12] & 0xf0) >> 2)] = 0x16: немного сложнее, давайте подробно это рассмотрим ниже
tcp[12]
означает захват 13-го байта tcp-пакета, причем первая половина соответствует смещению, а вторая половина зарезервирована. Смещение, умноженное на 4, дает количество байтов заголовка TCP, что означает ((tcp[12] & 0xf0) >> 2)
предоставляет размер заголовка TCP.
Первый байт пакета TLS определяет тип содержимого. Значение 22 (0x16 в шестнадцатеричном формате) было определено как содержимое "рукопожатия".
Как следствие, tcp[((tcp[12] & 0xf0) >> 2)] = 0x16
захватывает каждый пакет, имеющий первый байт после заголовка TCP, установленного в 0x16
,
Можно выполнить дополнительную фильтрацию, но это строго ответит на ваш вопрос.
Если вы также хотите использовать шифрование SQL Server, вам также нужно посмотреть на +8.
tcp[((tcp[12] & 0xf0) >> 2)] = 0x16 or (tcp port 1433 and tcp[((tcp[12] & 0xf0) >> 2) + 8] = 0x16)
Я думаю, что принятый ответ - преждевременная оптимизация с хрупким решением.
SSL рукопожатие происходит, как только соединение установлено.
Простой подход: запустите захват до того, как клиент подключится к удаленному хосту, и перехватите первые полные N пакетов.
Например, для 300 пакетов:
/ usr / sbin / tcpdump -i eth0 -p -s 65535 -c 300 "tcp и хост 1.2.3.4 и порт 443"
Таким образом, wireshark имеет полную полезную нагрузку рукопожатия SSL, может декодировать его и показать вам все биты.