2016-03-26 47 views
6

Mam aplikację, którą robię, która używa OpenSSL 1.0.2 i chciałbym zbadać ruch z Wireshark. Wireshark może (rzekomo) odszyfrować rozmowy TLS pod warunkiem, że dasz mu sekret pre-master.Jak wyodrębnić tajny klucz wstępny za pomocą klienta opartego na OpenSSL?

Jeśli używam zestawu algorytmów szyfrowania, takiego jak TLS_RSA_WITH_AES_256_CBC_SHA256; czy ktoś może mi powiedzieć, jak uzyskać pre-master secret ze struktury SSL lub SSL_CTX? Nie mam nic przeciwko hakowaniu nieprzezroczystych struktur wewnątrz obiektu SSL - nie dotyczy to niczego, co mogłoby zostać wysłane do produktu; Chcę tylko wiedzieć, jak wypełnić tajny plik przedmianowy dla Wireshark.

+1

Zobacz także [Wyodrębnij klucze przedrzędne z aplikacji OpenSSL] (http://security.stackexchange.com/q/80158/29925) na InfoSec.SE. – jww

+0

Jest to prawdopodobnie godne uwagi teraz, gdy OpenSSL 1.1.Wydano 0: wiele struktur zostało nieprzezroczystych, więc prawdopodobnie będziesz musiał zrobić sporo hakowania. – jww

Odpowiedz

6

Polecam używanie klucza głównego, do którego łatwiej się dostać. Zgodnie z moją wiedzą klucz przed master może istnieć tylko efemerycznie na stosie w OpenSSL. Klucz główny jest dostępny pod numerem ssl_session_st (zdefiniowanym w ssl.h w gałęzi 1.0.2, ale przeniesiony do wersji ssl_locl.h w późniejszej wersji). Zmienna SSL zmienna składowa session jest wskaźnikiem do jej ssl_session_st (alias SSL_SESSION).

Do odszyfrowywania połączeń Wireshark może używać klucza głównego i klucza głównego. Here are the formats że Wireshark obsługuje jak to pisze:

  • RSA xxxx yyyy Gdzie xxxx są pierwsze 8 bajtów zaszyfrowanej pre-Master Secret (hex kodowane) Gdzie yyyy jest zwykłym tekstem tajne pre-master (heks zakodowanej) (to jest oryginalny format wprowadzony błąd 4349)

  • RSA Session-ID:xxxx Master-Key:yyyy przypadku xxxx jest identyfikator sesji SSL (heks-zakodowanej) gdzie c jest yyyy leartext master secret (kodowany szesnastkowo) (dodany do wsparcia openssl s_client output) Jest to w pewnym sensie mylące, ponieważ nie ma w tym przypadku nic wspólnego z RSA .

  • PMS_CLIENT_RANDOM xxxx yyyy Gdzie xxxx jest client_random z ClientHello (hex kodowane) Gdzie yyyy jest czystym tekście pre-master secret (hex kodowane) (Format ten umożliwia połączenia SSL odszyfrowanie, czy użytkownik może uchwycić PMS, ale nie mógł odzyskać MS dla określonej sesji z serwerem SSL.)

  • CLIENT_RANDOM xxxx yyyy Gdzie xxxx jest client_random z ClientHello (hex kodowane) Gdzie yyyy jest zwykłym tekstem tajne master (hex kodowane) (Format ten umożliwia połączenia non-RSA SSL odszyfrowanie, tj ECDHE-RSA.)

Należy pamiętać, że żaden klucz pre-master, ani mistrz klucz jest kluczem symetrycznym (twój tytuł pytania sugeruje, że tak właśnie jest). Klucz symetryczny pochodzi z klucza głównego i losowych danych klient/serwer.

+0

rhashimoto: Tak! To jest dokładnie ta informacja, której potrzebowałem. I masz rację - byłem zdezorientowany - myślałem, że sekretem przed mistrzami był klucz symetryczny. Zamierzam zmienić tytuł, aby lepiej to odzwierciedlić, aby nie wprowadzać nikogo w błąd. –

+1

FYI: OpenSSL 1.1.0 udostępnia funkcję [SSL_SESSION_get_master_key()] (https://www.openssl.org/docs/man1.1.0/ssl/SSL_SESSION_get_master_key.html). –