Как использовать Чарльза в качестве прокси для расшифровки HTTPS-сообщений в Wireshark?

6125
an0

Я знаю, что могу просматривать расшифрованные данные HTTPS непосредственно в Чарльзе. Но я хочу просматривать SSL-сообщения более низкого уровня в Wireshark. Поэтому я настроил Чарльза как прокси-сервер SSL, используя свой собственный сертификат, и настроил настройку диссектора SSL в Wireshark с локальным IP-адресом и своим личным ключом.

Как использовать Чарльза в качестве прокси для расшифровки HTTPS-сообщений в Wireshark? Как использовать Чарльза в качестве прокси для расшифровки HTTPS-сообщений в Wireshark? Как использовать Чарльза в качестве прокси для расшифровки HTTPS-сообщений в Wireshark?

Однако сообщения в Wireshark по-прежнему зашифрованы.

Как использовать Чарльза в качестве прокси для расшифровки HTTPS-сообщений в Wireshark?

Что я упустил?

2
Это не вопрос InfoSec, а вопрос о настройке приложения. schroeder 9 лет назад 0
@schroeder Действительно? Я разместил это здесь, потому что несколько связанных постов, которые я прочитал онлайн, все пришли отсюда. Где вы предлагаете мне опубликовать это? an0 9 лет назад 1
@schroeder - если вы обратитесь к [справочному центру] (http://security.stackexchange.com/help/on-topic), вопросы об инструментах безопасности будут специально посвящены теме. К сожалению, я не могу голосовать против вашего близкого голосования. paj28 9 лет назад 0
Интересно, что это было только что опубликовано в reddit / netsec https://jimshaver.net/2015/02/11/decrypting-tls-browser-traffic-with-wireshark-the-easy-way/ paj28 9 лет назад 1
(1) Чарльз использует тот же ключ для * листовых * сертификатов, которые он создает, как для * корневого * сертификата, который вы настроили? Я им не пользуюсь и ничего не вижу в отрывочном документе. (2) Используется ли в вашем соединении простой обмен ключами RSA, а не DHE или ECDHE или PFS? (3) Что именно находится в вашем файле PEM? Wireshark поддерживает только «устаревшую» форму OpenCSL PKCS # 1, а не PKCS # 8 и не шифруется. В качестве альтернативы, Wireshark поддерживает P12 / PFX напрямую, если и только если вы укажете пароль. (nitpick) `.ssh` - это странное место для установки ключей SSL (или даже SSL-CA). dave_thompson_085 9 лет назад 0
@ paj28 Классный трюк! К сожалению, я хочу расшифровать трафик между моим iOS-приложением и другим сервером. an0 9 лет назад 0
@ dave_thompson_085 Спасибо. (1) Я думаю, что Чарльз берет только сертификат, а не ключ. Я следовал этим учебникам: http://0x74696d.com/posts/CharlesSSL/, http://codeblog.shape.dk/blog/2014/01/06/custom-ssl-certificate-with-charles-web-proxy/ , (2) Я не понимаю вопроса, потому что у меня нет знаний. Как я могу проверить? (3) Файл PEM был сгенерирован в соответствии с указаниями выше. an0 9 лет назад 0
Ладно, у вас здесь довольно продвинутые вещи. Я думаю, что ваш лучший вариант - взять перехватывающий прокси с открытым исходным кодом (вероятно, Zap) и отредактировать исходный код так, чтобы он записывал ключ сессии. Вы уверены, что вам нужно посмотреть на сырой SSL? paj28 9 лет назад 0
@ paj28 В настоящее время я выясняю, почему время ожидания некоторых HTTPS-запросов истекло. Я уже исключил проблемы DNS и веб-сервера, поэтому думаю, что мне нужно отслеживать, как создаются соединения SSL / TCP, чтобы проверить, является ли это проблемой соединения. an0 9 лет назад 0
Вы управляете сервером? Вы можете войти на серверный ключ сеанса SSL paj28 9 лет назад 0
@ paj28 К сожалению нет. an0 9 лет назад 0
(1) Чарльз использует файл .pfx, который содержит сертификат (или цепочку, здесь не применимо) * и * ключ. Учебник, на который вы ссылаетесь, говорит о том, что вы четыре раза генерируете как сертификат, так и ключ для поддельного CA. Но мой вопрос - это ключ, используемый в сертификатах * leaf *, а не в сертификате CA. (2) Выбранный набор шифров находится в сообщении ServerHello, которое вы должны увидеть в Wireshark; имя имеет несколько компонентов, которые определяют используемый обмен ключами, симметричный шифр и хэш для HMAC (и / или KDF в TLS1.2). Но: ... dave_thompson_085 9 лет назад 1
... (3) Этот учебник создает 2 файла PEM, но я предполагаю, что вы использовали ca_key.pem. Если вы использовали OpenSSL 1.0.0 или более позднюю версию, `req -new -keyout` выполняет запись в форме PKCS # 8, и с настройкой по умолчанию также шифрует. Чтобы исправить это, запустите `openssl rsaca_oldkey.pem` в каталоге, где он находится, и используйте вместо него в Wireshark ca_oldkey.pem в качестве частного ключа сервера. Или, как я уже сказал, просто используйте .pfx с паролем. Но если это работает, это дает вам данные о соединении вашего клиента с Чарльзом. Я только что заметил, что у вас есть данные в Чарльзе, так что все в порядке. ... dave_thompson_085 9 лет назад 0
... Если проблема связана с подключением Чарльза к серверу, это совсем другое дело. Вы можете только расшифровать это с помощью приватного ключа * server * (и снова обычного RSA), и если это не ваш сервер, они не дадут вам этого. Или, как говорит @ paj28, попросите Чарльза или другого прокси записать секрет * premaster * или * master * (который отличается для каждого сеанса) и передайте его Wireshark (с отображением на сеанс (ы)). dave_thompson_085 9 лет назад 0
@ dave_thompson_085 большое спасибо! Я уже пробовал .pfx с паролем. Не работает Набор шифров - TLS_RSA_WITH_RC4_128_MD5 (0x0004). Одна вещь, которую я заметил и не понял, это то, что Чарльз - посредник, а его прокси - localhost: 8888, но в Wireshark я не вижу связи между localhost и прокси, а только между localhost и удаленным сервером, т.е. кажется, что среднего человека вообще не существует. Тем не менее, я вижу все расшифрованные сообщения в Чарльзе. Это нормально? an0 9 лет назад 0
@ dave_thompson_085 также я пробовал `openssl rsa`, но он генерирует точно такой же вывод, как и ввод. Так что я думаю, формат .pem уже хорош для Wireshark. an0 9 лет назад 0
Я проверил, и я был частично неправ; конфигурация по умолчанию для `req -new [key]` не шифрует, поэтому, если вы использовали это и OpenSSL 0.9.8, вы получили устаревший формат; для подтверждения проверьте первую строку: Wireshark хочет `----- BEGIN RSA PRIVATE KEY -----` not `----- BEGIN PRIVATE KEY -----`. ** localhost ** Если вы имеете в виду, что вашему приложению предписано использовать localhost: 8888 в качестве прокси-сервера, это НЕ то же самое, что использование вашего "локального IP" 10.0.1.10. localhost - это IP-адрес 127.0.0.1 или петлевой, и он (обрабатывается как) маршрутизируется через специальный петлевой интерфейс, а не реальный интерфейс. ... dave_thompson_085 9 лет назад 0
... Я не знаю, для MacOSX, но Wireshark в Windows не может перехватывать * или * петлевой трафик * или * трафик в пределах одной машины с использованием реального (маршрутизируемого) IPaddr, и мой опыт работы с другими сетевыми захватами в Unix был непредсказуемо. Возможно, вам придется разместить ваше приложение (приложения) и Чарльз на разных машинах. ** исходящий ** Я не понял, что вы (также?) пытаетесь расшифровать соединения * от * Чарльза до реального сервера (ов). Вы не можете сделать это с ключом Чарльза вообще. В этом вам может помочь только предварительный / главный секрет сеанса. dave_thompson_085 9 лет назад 0
@ dave_thompson_085 Я могу подтвердить, что мой .pem в хорошей форме. Под localhost я подразумеваю локальный IP. Я знаю, что не могу расшифровать трафик между Чарльзом и сервером, не зная его секрета. Я только хочу расшифровать трафик между моим приложением и Чарльзом в Wireshark. То есть, если Чарльз и Wireshark работают на одной машине, я не могу этого сделать? an0 9 лет назад 0
Если две * программы * (здесь ваше приложение и Чарльз) находятся на одном и том же компьютере * с Windows *, я не нашел способа заставить Wireshark перехватить это. Я видел разные результаты для других захватов в (нескольких) Unix, и у меня нет веских оснований догадываться о * MacOSX *, который, на мой взгляд, в основном Unix-подобен, но иногда нет. Также могут быть другие инструменты, которые могут * захватывать * сетевые данные в формат файла, который может * прочитать * Wireshark, например, pcap или -ng. Но это несколько другой вопрос, чем вы задавали, и не совсем мой опыт, извините. dave_thompson_085 9 лет назад 0
@ dave_thompson_085 все равно большое спасибо! По крайней мере, я кое-что узнал :) an0 9 лет назад 0

1 ответ на вопрос

1
Safaci

Я столкнулся с точно такой же проблемой с Чарльзом Прокси в сочетании с Wireshark.

Я думаю, что проблема в том, что Чарльз отправляет два (или более) сертификата клиенту (проверьте сообщение сертификата, отправленное с прокси-сервера клиенту). Затем Wireshark будет использовать первый сертификат в этом списке, который, вероятно, не будет соответствовать сгенерированному вами закрытому ключу.

(Это именно то, что интересует пользователя dave_thompson_85 в комментариях.)

Я проверил это, извлекая сертификат из Wireshark. Обратите внимание, что Wireshark извлекает сертификат в .derформате. Затем я преобразовал .der-файл в .pemсертификат:

openssl x509 -inform DER -outform PEM -text -in wireshark_charles.der -out wireshark_charles.pem 

Я также преобразовал в .pema .crt, но это не обязательно.

Сертификат отправлен Чарльзом клиенту

$ openssl x509 -noout -modulus -in wireshark_charles.crt | openssl md5  7a37a32781daf79402623c19ac9c8d7f 

Таможенный сертификат установлен в Чарльзе

$ openssl x509 -noout -modulus -in charles_custom.crt | openssl md5  62ea5ed061fca62efaaecbbb0226b08e 

Соответствующий закрытый ключ

$ openssl rsa -noout -modulus -in charles_custom.pem | openssl md5  62ea5ed061fca62efaaecbbb0226b08e 

Модуль сертификата, отправленного Чарльзом, не совпадает с модулем сгенерированного пользователем закрытого ключа.

И Wireshark также регистрирует эту проблему во время анализа SSL:

ssl_decrypt_pre_master_secret wrong pre_master_secret length (128, expected 48) ssl_generate_pre_master_secret: can't decrypt pre master secret 

Чарльз генерирует новый сертификат для каждого хоста, используя пользовательский сертификат в качестве корневого сертификата. К сожалению, я не нашел способа извлечь этот закрытый ключ для каждого хоста, сгенерированный Чарльзом. Я предлагаю использовать Burp Proxy. В Burp вы можете выбрать, какой тип сертификата вы хотите использовать.