Захват только 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, может декодировать его и показать вам все биты.

Другие вопросы по тегам