Декриптиране на клиентски SSL трафик в Wireshark, генериран от Java HttpsURLConnection

Опитвам се да използвам GUI Java програма, написана от някой друг, която не се държи както бих очаквал. В хода на работата на програмата тя се свързва със сървър, за да изтегли данни, но не показва правилните данни. Опитвам се да установя дали проблемът, който изпитвам, е свързан с мрежата --- т.е. правилните битове никога не достигат до клиента.

Преглеждайки изходния код на програмата Java, изглежда, че използва HttpsURLConnection клас за изтегляне на данни от сървъра през SSL. Това, което бих искал да мога да направя, е да проверя какво се случва по кабела с помощта на Wireshark. Разбирам, че Wireshark поддържа дешифриране на някои SSL трафик, ако имате съответния ключ(ове). Аз не контролирам сървъра и затова нямам достъп до личния му ключ. Аз обаче контролирам клиента, на който работи програмата. Въпросът ми е как на практика бих конфигурирал wireshark да дешифрира SSL трафика за сценария, който току-що описах? Има ли конкретен ключ, използван от HttpsURLConnection, който мога да добавя към Wireshark? Има ли нещо друго?

Трябва да отбележа, че обмислях просто да добавя регистриране в кодовата база на Java, но в крайна сметка бих предпочел основната истина за улавяне на пакет пред регистриране, тъй като може да пропусна/пропусна нещо важно в регистрирането на кодова база, която не напълно разбирам.


person Bryce Thomas    schedule 21.07.2012    source източник


Отговори (2)


Тъй като нямате достъп до частния ключ на сървъра, Wireshark не може да се използва за директно дешифриране.

Дори с частния ключ Wireshark не може да дешифрира трафика, в случай че се използва шифър с перфектна предна секретност (PFS).

Това, от което се нуждаете, е прокси Man-in-The-Middle, който действа като SSL сървър от гледна точка на вашето приложение, а от гледна точка на сървъра работи като клиент.

Има много програми, които могат да работят като прокси, напр. Fiddler на .Net/Windows, Webscarab или BurpSuite (Java). За всички тези програми трябва да експортирате техния използван сървърен сертификат и да го добавите като надежден сертификат към вашата програма, напр. чрез указване на подходящ хранилище за доверие на командния ред при стартиране на вашето приложение (вижте свойството на Java javax.net.ssl.trustStrore).

person Robert    schedule 21.07.2012
comment
Ако не мога да дешифрирам данните от сървъра без личния му ключ чрез wireshark, как клиентското приложение може да го направи? - person hacklikecrack; 28.05.2013
comment
Това става чрез протокол за ключово споразумение. В края на споразумението всяка страна (клиент, сървър) знае тайната, но самата тайна никога не се прехвърля между тях. Вижте също обмен на ключове Diffie–Hellman (Wikipedia) - person Robert; 28.05.2013

Можете да извлечете ключовете, необходими на Wireshark, от всяко Java приложение, като използвате extract-ssl-secrets инструмент.

  • Изтеглете буркана локално от https://repo1.maven.org/maven2/name/neykov/extract-ssl-secrets/1.0.0/extract-ssl-secrets-1.0.0.jar. Уверете се, че запазвате името на файла същото - extract-ssl-secrets-1.0.0.jar.
  • Добавете -javaagent:<absolute path to>/extract-ssl-secrets-1.0.0.jar=/tmp/secrets.log" към VM опциите на приложението.
  • Стартирайте Wireshark с wireshark -o ssl.keylog_file:/tmp/secrets.log
  • Започнете да улавяте трафика - той трябва да бъде дешифриран в движение

Вижте раздел за отстраняване на неизправности, ако не работи веднага.

person Svet    schedule 13.12.2016