Š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ží.
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.
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.
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"
.