Hlavní navigace

Dešifrujeme HTTPS pomocí nástroje Wireshark

12. 1. 2022
Doba čtení: 4 minuty

Sdílet

 Autor: Depositphotos
Celý svět začal šifrovat a skrývat tak komunikaci před nezvanými hosty. Někdy se ale jako správci potřebujeme podívat, co se přenáší. Naštěstí nám s tím může snadno pomoci Wireshark. Ukážeme si, jak na to.

Šifrování provozu je všeobecně prospěšné a rozhodně chceme, aby se k naší komunikaci nedostal po trase nikdo nepovolaný. Přesto existují situace, kdy nám šifrování překáží: typicky při analýze nějakého aplikačního problému. Víme, že to nefunguje, ale protože se nemůžeme podívat na průběh komunikace, máme zavázané oči.

Jak nahlédnout do komunikace

Máme k dispozici několik řešení, která nám na koncových bodech mohou pomoci do komunikace nahlédnout. Můžeme použít například utilitu openssl a její režim s_client, který implementuje obecného TLS klienta. Můžeme tak sestavit šifrovaný tunel, posílat do něj požadavky a sledovat odpovědi.

Pokročilejší možností je například nástroj MITM Proxy, který se umí chovat jako prostředník mezi klientem a serverem a zatímco předává informace mezi oběma stranami, může si v nich krásně číst a sledovat provoz.

My si ukážeme, jak zaznamenat a dešifrovat HTTPS (a obecně TLS) pomocí nástrojů tcpdump a Wireshark. První jmenovaný dovolí celou komunikaci nahrát do souboru a druhý ji pak umí na základě poskytnutých kryptografických informací dešifrovat, analyzovat a interpretovat.

Ve všech výše zmíněných případech je nutná spolupráce na klientské straně. Nejde o žádné magické postupy, kterými dokážeme číst šifrovanou komunikaci někde po cestě. Pokud se obě strany chovají správně, je pro nás šifrovaná komunikace nedobytná. My ovšem máme pod kontrolou klienta, můžeme mu tedy takřka koukat pod ruce.

Zachytáváme kryptografický materiál

Abychom mohli úspěšně nahlédnout do šifrované komunikace, musíme od klienta získat symetrické šifrovací klíče, které při komunikaci používá. Pokud je máme, můžeme stejně jako on provést dešifrování a podívat se na obsah. K získání těchto nezbytných informací nám poslouží proměnná prostředí  SSLKEYLOGFILE.

Na její přítomnost reagují webové prohlížeče, ale i nejrůznější stahovací utility. Konkrétně si s ní poradí například Chrome (Chromium), Firefox nebo třeba knihovna libcurl a tedy i utilita curl a další na této knihovně založené. Podpora existuje i v dalších programech a pomocí knihoven je možné ji přidat také v nejrůznějších programovacích jazycích.

Proměnná zařídí, že klient během sestavování šifrované komunikace uloží do souboru vygenerované kryptografické produkty, které je pak možné použít k sestavení symetrického klíče (master key) a použít k dešifrování. Proměnnou stačí naplnit cestou, třeba takto:

$ export SSLKEYLOGFILE=/tmp/ssl-keys.log

Poznámka: Wireshark umí pro dešifrování použít přímo i asymetrický soukromý klíč RSA patřící k certifikátu na serveru. Má to ale několik podmínek – nesmíte pro výměnu symetrického klíče používat algoritmus Diffie-Hellman, nesmíte mít nasazen protokol TLS 1.3 a nesmíte mít jen záznam z opětovně navázané (resume) komunikace. Postup popsaný v tomto článku je preferovaný, protože funguje vždycky.

Zaznamenáváme provoz

Abychom si mohli později v provozu číst, musíme si ho nejdříve nahrát. Použijeme k tomu nástroj tcpdump, který je pomyslným švýcarským nožem každého síťaře. Komunikaci nemusíme nutně nahrávat přímo u klienta, můžeme to udělat i někde po cestě. Budeme ale schopni dešifrovat jen to, k čemu budeme mít potřebné klíče.

Nechceme-li toho nahrávat zbytečně hodně, můžeme rovnou vybrat, co bychom chtěli uložit. Nejjednodušší je použít přepínač host, po kterém můžeme určit adresu jedné ze stran, které budou za chvíli komunikovat:

# tcpdump host 2001:67c:68::76 -w /tmp/dump.pcap

Jde se komunikovat

Nyní nastal čas přenášet nějaká data, která si pak budeme chtít prohlédnout. Můžeme použít curl nebo třeba webový prohlížeč. Nezapomeňte, že v jeho prostředí je nutné mít definovanou proměnnou  SSLKEYLOGFILE.

$ curl https://www.root.cz/
$ links
$ firefox
…

Dešifrujeme komunikaci

Nastal čas to celé zkombinovat dohromady a podívat se na výsledek. K tomu budeme používat parádní nástroj Wireshark, který umí interpretovat komunikaci nahranou tcpdumpem a obsahuje i možnost dešifrování na základě souborů, které jsme už získali.

Nejprve ho musíme navést k souboru s uloženými kryptografickými produkty. V menu vybereme Edit a volbu Preferences, v menu pak nalistujeme a rozbalíme položku Protocols. V ní najdeme položku TLS a tady nás zajímá úplně poslední řádek s názvem (Pre)-Master-Secret log filename. Jednoduše mu ukážeme, kde soubor se záznamem klíčů leží.


Autor: Petr Krčmář, Root.cz

Výběr souboru s kryptografickým materiálem

Součástí balíčků s Wiresharkem je i utilita editcap, která dovoluje propojit oba soubory do jednoho. K zaznamenané komunikaci jsou tak automaticky přidány klíče potřebné k dešifrování. Výsledkem je jeden soubor, který se dobře distribuuje a při každém prohlížení není potřeba měnit nastavení programu výše uvedeným způsobem.

$ editcap --inject-secrets tls,ssl-keys.log dump.pcap combined-dump.pcap

Utilita načte klíče ze souboru ssl-keys.log, komunikaci z dump.pcap  a obojí zkombinuje a uloží do nového souboru combined-dump.pcap. Ten můžeme přenést a rovnou otevřít ve Wiresharku.

Linux tip

Koukáme do provozu

Nyní stačí jen použít Wireshark standardním způsobem, otevřít v něm zmíněný záznam komunikace a číst si v něm jako v otevřené knize. Obsah zašifrovaný protokolem TLS je pro nás transparentně dešifrován a my vidíme vyšší vrstvy, včetně HTTP a jeho obsahu.


Autor: Petr Krčmář, Root.cz

Dešifrovaná podoba komunikace pomocí protokolu HTTP/2

Pokud si chcete prohlédnout komunikaci zaznamenanou v rámci přípravy tohoto článku, stáhněte si soubor se záznamem. Na konci v něm najdete v čitelné podobě také pokus o přihlášení včetně uživatelského jména a hesla. Vypátráte ho snadno, pokud použijete filtr  http.request.method == "POST".

Autor článku

Petr Krčmář pracuje jako šéfredaktor serveru Root.cz. Studoval počítače a média, takže je rozpolcen mezi dva obory. Snaží se dělat obojí, jak nejlépe umí.