Перехват SSL рукопожатия с помощью tcpdump

Перехват SSL рукопожатия с помощью tcpdump

08.05.2024
Автор: HostZealot Team
2 мин.
54

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

Однако иногда обмен происходит не так, как предполагалось, и возникает необходимость обнаружить проблемы и устранить их. Обычный способ сделать это - перехватить SSL рукопожатие с помощью tchpdump. Сделав это, вы сможете детально проанализировать, что происходит с передачей данных, и предпринять шаги для решения проблем.

Обзор команды tcpdump

tcpdump - это мощный инструмент сетевого анализа командной строки, который используется для захвата и отображения пакетов, передаваемых и принимаемых через сетевой интерфейс, доступный в большинстве Unix-подобных операционных систем, включая Linux и macOS. Если ваша цель - перехват SSL рукопожатия, вам следует знать, что сам по себе инструмент может захватить огромные объемы данных, которые вы не сможете продуктивно проанализировать. Учитывая это, вам придется применить ряд фильтров, которые выделят пакеты, имеющие непосредственное отношение к вашей задаче. Критерии фильтрации включают IP-адреса источника и назначения, номера портов и протоколы. 

Об SSL рукопожатии

Рукопожатие SSL (Secure Sockets Layer) является важной частью протокола SSL/TLS (Transport Layer Security), который широко используется для защиты связи в компьютерных сетях. Хотя протокол SSL в значительной степени вытеснен протоколом TLS, термин "рукопожатие SSL" по-прежнему широко используется для описания начальной фазы переговоров при создании соединения TLS.

Рукопожатие SSL состоит из серии сообщений, которыми обмениваются клиент и сервер, и эти сообщения являются этапами создания защищенного и зашифрованного канала связи. Давайте рассмотрим их.

  1. ClientHello: рукопожатие начинается с того, что клиент отправляет серверу сообщение ClientHello. Это сообщение состоит из номера версии SSL/TLS клиента, списка поддерживаемых наборов шифров (алгоритмов для шифрования, обмена ключами и аутентификации сообщений), списка поддерживаемых методов сжатия и, возможно, списка поддерживаемых расширений.
  2. ServerHello: чтобы ответить на предыдущее сообщение, сервер отправляет клиенту сообщение ServerHello, содержащее номер версии SSL/TLS сервера, набор шифров и метод сжатия, выбранные из списка клиента, и, возможно, выбранные сервером расширения.
  3. Сертификат сервера: Для аутентификации сервер отправляет клиенту свой сертификат, содержащий открытый ключ сервера, который впоследствии используется клиентом для обмена ключами.
  4. Запрос сертификата (необязательно): В случае если серверу требуется аутентификация со стороны клиента, как в случае с двусторонним SSL, сервер отправляет сообщение клиенту.
  5. Обмен ключами: Клиент и сервер обмениваются ключевой информацией. Это может происходить разными способами. Например, клиент может отправить предварительный мастер-секрет, зашифрованный открытым ключом сервера (как в случае обмена ключами RSA). В качестве альтернативы клиент и сервер могут генерировать ключи вместе (как в случае обмена ключами Диффи-Хеллмана). В зависимости от выбранного набора шифров этот шаг может меняться.
  6. Server Hello Done: После того как сервер закончил отправку сообщений для поддержки обмена ключами и аутентификации сервера, он отправляет сообщение ServerHelloDone, чтобы сообщить об этом.
  7. Обмен ключами клиента: В ответ на предыдущее сообщение клиент отправляет сообщение об обмене ключами, включая предварительный мастер-секрет, который зависит от метода обмена ключами.
  8. Проверка сертификата (опционально): В случае необходимости аутентификации клиента клиент может отправить сообщение о проверке сертификата с цифровой подписью, позволяющее серверу проверить сертификат клиента.
  9. Завершение: Наконец, клиент и сервер обмениваются зашифрованными сообщениями Finished, которые подтверждают, что процессы обмена ключами и аутентификации прошли успешно.

Фильтрация сообщений рукопожатия SSL в tcpdump

Поскольку tcpdump фильтрует информацию на уровне пакетов и не может напрямую работать с такими конструкциями, как протоколы SSL/TLS, вам придется применять фильтры, основанные на общих характеристиках пакетов рукопожатия, таких как номера портов и размеры упаковщиков, чтобы захватить только процесс рукопожатия. Давайте рассмотрим подходы, которые можно использовать для решения этой задачи.

  • Фильтрация по порту:

SSL/TLS рукопожатия обычно происходят через порт 443 для HTTPS, хотя могут быть задействованы и другие порты, используемые для защиты протоколов. В частности, чтобы перехватить весь трафик на стандартном порту HTTPS 443, используйте:

tcpdump -i any 'port 443'

Помните, что при этом будет захвачен весь трафик на порту, а не только сообщения рукопожатия.

  • Захват начала соединения:

Поскольку в начале соединения SSL/TLS происходит рукопожатие, захват начального обмена пакетами может помочь выделить сообщения рукопожатия. Например, вы можете перехватить пакеты SYN и SYN-ACK, чтобы увидеть начало TCP-соединения до рукопожатия SSL/TLS.

tcpdump -i any 'порт 443 и (tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn)'
  • Фильтры по длине:

Поскольку сообщения рукопожатия, в частности ClientHello и ServerHello, имеют характерный диапазон размеров, этот факт теоретически может быть использован для фильтрации пакетов на основе размера их полезной нагрузки TCP.  Тем не менее, поскольку такие переменные, как размер, имеют большую степень случайности, этот метод является довольно неточным и ненадежным.

  • Перехват и анализ с помощью Wireshark:

Wireshark - это специальный инструмент, с помощью которого можно провести более детальный анализ трафика, захваченного ранее с помощью tcpdump, отфильтровав определенные сообщения рукопожатия. Сначала перехватите трафик с определенного порта и запишите его в файл:

tcpdump -i any 'port 443' -w capture_file.pcap

Откройте файл capture_file.pcap с помощью Wireshark и используйте его фильтры SSL/TLS, например ssl.handshake.type, для дальнейшего анализа.

Захват пакета TLS для конкретной версии

Хотя большинство современных приложений используют для обмена сообщениями протокол TLSv1.3. Тем не менее, для сохранения совместимости с более старыми версиями поддерживаются TLSv1.0, TLSv1.1 и TLSv1.2. Каждой версии присвоен цифровой код:

SSLv3 - 0x300

TLSv1.0 - 0x0301

TLSv1.1 - 0x0302

TLSv1.2 - 0x0303

TLSv1.3 - 0x0304

Учитывая, что эта информация содержится в 10-м и 11-м байтах данных в сообщении SSL handshake, можно использовать следующий фильтр:

tcpdump "tcp port 8081 and (tcp[((tcp[12] & 0xf0) >>2)] = 0x16) \\
  && (tcp[((tcp[12] & 0xf0) >>2)+9] = 0x03) \\
  && (tcp[((tcp[12] & 0xf0) >>2)+10] = 0x03)"

Перехват пакетов данных приложения через TLS

За сообщениями рукопожатия следуют данные приложения, которые также содержат версию TLS во 2-м и 3-м байтах данных. Чтобы перехватить их:

tcpdump "tcp port 8081 and (tcp[((tcp[12] & 0xf0) >>2)] = 0x17) \\
  && (tcp[((tcp[12] & 0xf0) >>2)+1] = 0x03) \\
  && (tcp[((tcp[12] & 0xf0) >>2)+2] = 0x03)" -w appdata.pcap

Таким образом, мы можем перехватить пакеты, содержащие 17 в 1-м и 03 во 2-м и 3-м байтах.

Мониторинг сбоев SSL-соединений

Для фильтрации ошибок следует проверить 1-й байт, содержащий 15 или 21 - числа, соответствующие конкретным сбоям:

tcpdump "tcp port 8081 and (tcp[((tcp[12] & 0xf0) >>2)] = 0x15) || (tcp[((tcp[12] & 0xf0) >>2)] = 0x21)" -w error.pcap

Заключение

Использование tcpdump для захвата SSL рукопожатия – это эффективный способ анализа трафика и поиска ошибок и сбоев, если что-то идет не так. В этой статье мы рассмотрели некоторые подходы, которые помогут вам правильно отфильтровать перехваченный трафик и обнаружить любые проблемы. Мы надеемся, что это руководство было полезным, будьте осторожны!

# Как сделать Поделиться:
Статьи по Теме