Пользователь
119,3
рейтинг
19 марта 2015 в 16:24

Разработка → Как легко расшифровать TLS-трафик от браузера в Wireshark перевод

Многим из вас знаком Wireshark — анализатор трафика, который помогает понять работу сети, диагностировать проблемы, и вообще умеет кучу вещей.

image

Одна из проблем с тем, как работает Wireshark, заключается в невозможности легко проанализировать зашифрованный трафик, вроде TLS. Раньше вы могли указать Wireshark приватные ключи, если они у вас были, и расшифровывать трафик на лету, но это работало только в том случае, если использовался исключительно RSA. Эта функциональность сломалась из-за того, что люди начали продвигать совершенную прямую секретность (Perfect Forward Secrecy), и приватного ключа стало недостаточно, чтобы получить сессионный ключ, который используется для расшифровки данных. Вторая проблема заключается в том, что приватный ключ не должен или не может быть выгружен с клиента, сервера или HSM (Hardware Security Module), в котором находится. Из-за этого, мне приходилось прибегать к сомнительным ухищрениям с расшифровкой трафика через man-in-the-middle (например, через sslstrip).

Логгирование сессионных ключей спешит на помощь!


Что ж, друзья, сегодня я вам расскажу о способе проще! Оказалось, что Firefox и Development-версия Chrome поддерживают логгирование симметричных сессионных ключей, которые используются для зашифровки трафика, в файл. Вы можете указать этот файл в Wireshark, и (вуаля!) трафик расшифровался. Давайте-ка настроим это дело.

Настраиваем браузеры


Нам необходимо установить переменную окружения.

Windows

Откройте свойства компьютера, затем «Дополнительные параметры системы», затем «Переменные среды…»

image

Добавляем новую пользовательскую переменную «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

Настраиваем Wireshark


Вам понадобится Wireshark версии 1.6 и новее. Открываем настройки Wireshark:
image

Разворачиваем секцию «Protocols»:

image

Указываем путь к файлу:

image

Результат


Вот что мы обычно видим, когда инспектируем TLS-пакет:

image

А вот что происходит, когда мы переключаемся на вкладку «Decrypted SSL Data». Теперь мы можем видеть текст запроса. Победа!

image

Заключение


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

Спасибо за чтение!
Перевод: Jim Shaver
Влад @ValdikSS
карма
594,2
рейтинг 119,3
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (22)

  • 0
    Эх, а я думал какая-то новая интересная атака на TLS.
    Логгирование сессионных ключей вроде уже давно не новость.
    Год или даже старше.
    • +7
      Да, совсем не новость, но многие продолжают использовать MITM-Proxy или sslstrip, т.к. просто не знают другого способа.
  • 0
    А со стороны сервера это реально реализовать?
    • +2
      Сохранение сессионных ключей в веб-серверах, насколько я знаю, нигде не реализовано. Вам будет проще включить debug-режим в веб-сервере, или просто полное логирование запросов и ответов.
  • +1
    В браузере вроде в вебинспекторе все запросы видно. Мне вот интересно как расшифровать iTunes запросы, и имулировать их потом. В какую сторону копать?
    • 0
      А в iTunes HTTPS, или не-HTTP данные передаются поверх TLS? Если второе, то с этим довольно проблематично. Я не встречал удобных программ, которые позволяют подменять данные. Обычно, я для этого пишу какие-нибудь скрипты или вроде того, а перехватываю mitmproxy, предварительно пропатчив программу, если там pinning или какая-то другая проверка.
  • +1
    Спасибо за статью.
    Наверное, описанное в каких то случаях действительно может оказаться полезным.
    Хотя с другой стороны можно без всяких Wireshark воспользоваться какой либо HTTP прокси программой, например Fiddler.
    Смотреть дешифрованные HTTPS данные уже на прикладном уровне, будет даже чуть проще чем через Wireshark.
  • 0
    Спасибо за статью,
    поясните, пожалуйста, Вы указываете пользоваться Wireshark-ом версии 1.6, а на скриншотах у вас установлена самая последняя версия 1.12, т.е. как я понял, что это работает не только на версии до 1.6?..
    • 0
      Это работает на версиях, не старше (выпущенных после) 1.6. 1.12 новее 1.6.
      • 0
        При прочтении «не старше» тоже понял <= 1.6, посмотрел на at least в оригинале и удивился.
        • 0
          Почему удивились? Я неправильно использовал конструкцию «не старше»?
          • 0
            Оно может означать «по возрасту» (тогда «не старше» означает новее) и «по версии» («не старше» означает <=, часто указывают foo версии x.y или старше), что даёт разную сортировку. Проще, конечно, писать 1.6+.
            • 0
              А-а, точно. Действительно, я и не задумывался о втором значении. Сейчас изменю.
  • 0
    Как можно это сделать с мобильными приложениями (android например)?
    • 0
      Root — девайс и Intercepter-NG
    • +1
      Поднять wifi на компьютере и использовать mitmproxy, например.
      • 0
        Если это не HTTP протокол?
        • 0
          Попробуйте stunnel.
  • –3
    Ну, давайте маны еще на хабре публиковать.
  • 0
    Из-за этого, мне приходилось прибегать к сомнительным ухищрениям с расшифровкой трафика через man-in-the-middle


    Коллеги, Wireshark позволяет загружать сторонние Lua скрипты.
    Помню на позапрошлой работе требовалось это сделать, пишется все достаточно просто,
    даже если ни разу не работали с Lua.
    Один раз настроить и profit
  • 0
    Есть ли логирование сессионных ключей в таком же совместимом с wireshark виде у java?
    Есть куча софта используемого для мониторинга сети и приложений, и когда его приходится дебажить если сессия завернута в TLS это становится просто кошмаром посмотреть что он там опрашивал.
  • 0
    На Mac OS, что бы не испытывать мучений c запуском всего и вся из одной консоли, можно дать команду:
    launchctl setenv SSLKEYLOGFILE /path/to/writable-file
    

    и переменная будет задана для всей системы а не только для одного tty.
    А после использования удалить, ибо безопастность!
    launchctl unsetenv SSLKEYLOGFILE 
    

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.