Многим из вас знаком Wireshark — анализатор трафика, который помогает понять работу сети, диагностировать проблемы, и вообще умеет кучу вещей.
Одна из проблем с тем, как работает Wireshark, заключается в невозможности легко проанализировать зашифрованный трафик, вроде TLS. Раньше вы могли указать Wireshark приватные ключи, если они у вас были, и расшифровывать трафик на лету, но это работало только в том случае, если использовался исключительно RSA. Эта функциональность сломалась из-за того, что люди начали продвигать совершенную прямую секретность (Perfect Forward Secrecy), и приватного ключа стало недостаточно, чтобы получить сессионный ключ, который используется для расшифровки данных. Вторая проблема заключается в том, что приватный ключ не должен или не может быть выгружен с клиента, сервера или HSM (Hardware Security Module), в котором находится. Из-за этого, мне приходилось прибегать к сомнительным ухищрениям с расшифровкой трафика через man-in-the-middle (например, через sslstrip).
Что ж, друзья, сегодня я вам расскажу о способе проще! Оказалось, что Firefox и Development-версия Chrome поддерживают логгирование симметричных сессионных ключей, которые используются для зашифровки трафика, в файл. Вы можете указать этот файл в Wireshark, и (вуаля!) трафик расшифровался. Давайте-ка настроим это дело.
Нам необходимо установить переменную окружения.
Откройте свойства компьютера, затем «Дополнительные параметры системы», затем «Переменные среды…»
Добавляем новую пользовательскую переменную «SSLKEYLOGFILE», и указываем путь до файла, куда мы хотим его сохранять.
Вы также можете добавить эту строку в конец вашего
В следующий раз, когда вы запустите Firefox или Chrome из Dev channel, они будут логгировать TLS-ключи в этот файл.
UPD: Если у вас ничего не работает на OS X, загляните в комментарии (оригинальной статьи). Похоже, Apple изменила работу переменных окружения в новой версии OS X. Попробуйте запускать Firefox и Wireshark из этого же терминального окна:
Спасибо Tomi за это замечание.
Вам понадобится Wireshark версии 1.6 и новее. Открываем настройки Wireshark:
Разворачиваем секцию «Protocols»:
Указываем путь к файлу:
Вот что мы обычно видим, когда инспектируем TLS-пакет:
А вот что происходит, когда мы переключаемся на вкладку «Decrypted SSL Data». Теперь мы можем видеть текст запроса. Победа!
Надеюсь, теперь вам будет гораздо проще перехватывать TLS. Одна примечательная особенность этого метода заключается в том, что устанавливать Wireshark на компьютер, который генерирует TLS-трафик, не требуется, поэтому вам не придется устанавливать ненужные клиентам программы, вы можете сохранить дамп в файл на сетевой диск или просто скопировать его с машины, и использовать с дампом трафика.
Спасибо за чтение!
Одна из проблем с тем, как работает Wireshark, заключается в невозможности легко проанализировать зашифрованный трафик, вроде TLS. Раньше вы могли указать Wireshark приватные ключи, если они у вас были, и расшифровывать трафик на лету, но это работало только в том случае, если использовался исключительно RSA. Эта функциональность сломалась из-за того, что люди начали продвигать совершенную прямую секретность (Perfect Forward Secrecy), и приватного ключа стало недостаточно, чтобы получить сессионный ключ, который используется для расшифровки данных. Вторая проблема заключается в том, что приватный ключ не должен или не может быть выгружен с клиента, сервера или HSM (Hardware Security Module), в котором находится. Из-за этого, мне приходилось прибегать к сомнительным ухищрениям с расшифровкой трафика через man-in-the-middle (например, через sslstrip).
Логгирование сессионных ключей спешит на помощь!
Что ж, друзья, сегодня я вам расскажу о способе проще! Оказалось, что Firefox и Development-версия Chrome поддерживают логгирование симметричных сессионных ключей, которые используются для зашифровки трафика, в файл. Вы можете указать этот файл в Wireshark, и (вуаля!) трафик расшифровался. Давайте-ка настроим это дело.
Настраиваем браузеры
Нам необходимо установить переменную окружения.
Windows
Откройте свойства компьютера, затем «Дополнительные параметры системы», затем «Переменные среды…»
Добавляем новую пользовательскую переменную «SSLKEYLOGFILE», и указываем путь до файла, куда мы хотим его сохранять.
Linux и Mac OS X
$ export SSLKEYLOGFILE=~/path/to/sslkeylog.log
Вы также можете добавить эту строку в конец вашего
~/.bashrc
на Linux или в ~/.MacOSX/environment
на OS X, чтобы вам не пришлось ее устанавливать каждый раз после перелогина.В следующий раз, когда вы запустите Firefox или Chrome из Dev channel, они будут логгировать TLS-ключи в этот файл.
UPD: Если у вас ничего не работает на OS X, загляните в комментарии (оригинальной статьи). Похоже, Apple изменила работу переменных окружения в новой версии OS X. Попробуйте запускать Firefox и Wireshark из этого же терминального окна:
# export SSLKEYLOGFILE=/Users/username/sslkeylogs/output.log
# open -a firefox
# wireshark
Спасибо Tomi за это замечание.
Скрытый текст
Не знаю, как в MAC OS X, но в Linux способ, описанный автором, работать не будет. Переменные окружения всегда работают в пределах одной сессии (tty, pty), и запускать Firefox вам нужно из этого же окна.
~ ValdikSS
~ ValdikSS
Настраиваем Wireshark
Вам понадобится Wireshark версии 1.6 и новее. Открываем настройки Wireshark:
Разворачиваем секцию «Protocols»:
Указываем путь к файлу:
Результат
Вот что мы обычно видим, когда инспектируем TLS-пакет:
А вот что происходит, когда мы переключаемся на вкладку «Decrypted SSL Data». Теперь мы можем видеть текст запроса. Победа!
Заключение
Надеюсь, теперь вам будет гораздо проще перехватывать TLS. Одна примечательная особенность этого метода заключается в том, что устанавливать Wireshark на компьютер, который генерирует TLS-трафик, не требуется, поэтому вам не придется устанавливать ненужные клиентам программы, вы можете сохранить дамп в файл на сетевой диск или просто скопировать его с машины, и использовать с дампом трафика.
Спасибо за чтение!