WPA2 (Wi-Fi Protected Access 2) je dnes alespoň podle statistik projektu Wifileaks nejrozšířenějším způsobem zabezpečení Wi-Fi sítí v České republice. Existuje ve dvou variantách, WPA2-Personal (neboli WPA2-PSK), kde všichni klienti využívají stejné sdílené heslo a WPA2-Enterprise, který je po bezpečnostní stránce lepší, avšak díky nutnosti RADIUS serveru a složitější implementaci je vhodný, jak již z názvu plyne, spíše do podnikové sféry. My se podíváme na první variantu, která je typickým zástupcem zabezpečení většiny domácích sítí a v následujících odstavcích budu pod pojmem WPA2 myslet variantu WPA2-Personal.
Pokud zde očekáváte nějakou revoluční metodu, díky které budete schopni prolomit silné heslo u sítě vašeho souseda, tak vás musím zklamat – WPA2 je při správné konfiguraci stále bezpečné. Ani zde nečekejte sérii pěti příkazů, které bezmyšlenkovitě vložíte do terminálu svého Kali Linuxu a bude z vás „obávaný hacker“. Spíše se pokusím popsat, jak specifikace IEEE 802.11 a WPA2 funguje z bezpečnostního hlediska, rozebereme si 4-way handshake paket po paketu a různé další zajímavé aspekty. Těchto znalostí poté využijeme pro dešifrování WPA2 provozu ostatních klientů (za předpokladu, že známe sdílené heslo) a také se podíváme na slovníkový útok proti zachycenému handshake s cílem získat heslo.
Simulace a nalezení sítě
Pro účely tohoto článku jsem si vytvořil síť s názvem (SSID) root_wpa2
, která bude zabezpečená pomocí WPA2-PSK s heslem PrisneTajneHeslo
. Protože jsem u této sítě neskryl SSID, AP (Access Point) bude periodicky (zde konkrétně 10× za vteřinu) vysílat tzv. Beacon frames, které patří k jedněm z řídících rámců standardu IEEE 802.11:
Obsahují SSID sítě (maximálně 32 znaků), timestamp, interval vysílání beacon rámců, RSN (Robust Secure Network) – informace ohledně zabezpečení, podporované rychlosti a další:
AP je odesílá z toho důvodu, aby případným klientům dal vědět o existenci své sítě a možnosti připojení. Díky tomu vidíte na svém zařízení seznam dostupných Wi-Fi sítí. Tomuto mechanismu, kdy klienti poslouchají výzvy od jednotlivých AP na všech kanálech, se říká pasivní skenování.
Většina zařízení však zároveň kvůli efektivitě využívá i aktivního skenování, což znamená, že na každém kanálu vysílají rámce Probe Request na broadcastovou adresu ff:ff:ff:ff:ff:ff
. Těmito rámci se klienti ptají přítomných AP, které sítě jsou přítomné. Probe Request nemusí být všeobecný, ale může se dotazovat na jednu konkrétní síť. Vaše zařízení se obvykle tímto způsobem ptá na všechny sítě, které máte uložené. Toho lze bohužel využít pro sledování a fingerprinting, ale to je nad rámec tohoto článku.
AP na Probe Request odpovídá rámcem Probe Response, který je téměř stejný jako Beacon (obsahuje detaily o nabízené síti), takže ho nemá cenu nijak zdlouhavě popisovat:
Autentizace a asociace
Jakmile si vaše zařízení vybere cílovou síť (ať již pomocí automaticky vysílaných Beacon rámců nebo v případě např. skrytého SSID kombinací Probe Request/Response), dojde k autentizaci a asociaci spojení. Celý proces vypadá takto:
Prvním rámcem je Authentication. Komunikaci začíná klient, který odesílá tento rámec s příznakem Request. AP následně odpoví stejným rámcem, avšak s příznakem Response, a to buď kladně, nebo zamítavě. Pro nás budou stěžejní hlavně tyto 3 položky:
- Authentication Algorithm – bude mít vždy hodnotu 0 (Open System), druhou možností je 1 (Shared Key), která je již však zastaralá a dnes se nepoužívá
- Authentication SEQ – 1 pro Request, 2 pro Response
- Status Code – návratový kód (0 = v pořádku)
Ukázky:
Jakmile se dokončí autentizace, nastane čas na asociaci. Ta začíná tím, že klient odešle rámec Association Request. Cílem tohoto rámce je, aby si AP nealokoval pro naše spojení prostředky a sdělil nám AID (Association Identifier). Obsahem je název SSID, podporovaná rychlost, možnosti šifrování (RSN) a mnoho dalších podrobností:
AP po přijetí rámce Association Request ověří, zda všechny pole v žádosti vyhovují tomu, co sám podporuje. Pokud dojde ke kompatibilitě, odešle AP rámec Association Response s návratovým kódem 0. Pozor, na rozdíl od autentizace, která využívá stejný rámec, pouze s jinou hodnotou SEQ, se u asociace využívají 2 různé řídící rámce. Obsahem je hlavně již zmíněné AID a další specifikace podporované AP:
Všechny tyto výše uvedené řídící rámce jsou pořád pouze standardem IEEE 802.11, nezávisle na zvoleném typu zabezpečení. Některé další si představíme v průběhu článku, jakmile na ně dojde řada. Pokud chcete, tak si je můžete odchytávat. Stačí si přepnout svojí Wi-Fi kartu do monitorovacího módu (tedy aby zachytávala veškerý provoz, nejen ten, který je určen pro ni). Využít můžete například oblíbeného programu airmon-ng. Syntaxe je airmon-ng <start|stop> <interface> [channel]
, takže například:
airmon-ng start wlan0
TKIP vs. CCMP
Trochu odbočím – někde se můžete setkat s termíny WPA2-PSK-TKIP a WPA2-PSK-CCMP. Jedná se o způsob šifrování a zajištění autentizace. TKIP (Temporal Key Integrity Protocol), který se používal v první verzi WPA (i když z důvodů kompatibility existuje někde i u WPA2) využívá k šifrování proudovou šifru RC4 a k autentizaci zpráv keyed-hash algoritmus Michael. Modernější a mnohem častěji využívaný protokol CCMP (Counter Mode CBC-MAC Protocol) šifruje data pomocí šifry AES a k ověření autentizace využívá CBC-MAC. CCMP je z hlediska bezpečnosti mnohem lepší, proto se v následujícím textu omezím pouze na tuto variantu.
Generování PSK
Po úspěšné autentizaci a asociaci, která je stejná pro všechny typy zabezpečení, se dostáváme k detailům samotného WPA2. Jako první krok si obě strany spočítají sdílený tajný klíč PSK (Pre-shared key). PSK závisí pouze na názvu sítě – SSID (zde konkrétně root_wpa2
) a heslu (v našem případě PrisneTajneHeslo
). PSK se počítá s pomocí funkce pro derivaci klíče PBKDF2 s využitím HMACu založeném na SHA1, konkrétně:
PSK = PBKDF2 (HMAC-SHA1, heslo, SSID, 4096, 256)
4096 je počet iterací (kvůli zpomalení) a 256 je velikost výstupu v bitech. Tyto hodnoty jsou pevně dané. Konkrétní hodnotu PSK si můžete spočítat například na stránkách Wiresharku:
Jak je vidět, PSK si může spočítat klient i AP samostatně, ještě před jakýmkoliv handshakem a tento klíč je vždy stejný (dokud nezměníme SSID nebo heslo). Někdy se můžete setkat ještě s termínem PMK (Pairwise Master Key). Pro WPA2-Personal je PSK to samé jako PMK, u WPA2-Enterprise se PMK počítá odlišně. V našem případě tedy platí, že PSK == PMK a nadále budu používat pouze termín PSK. Hodnota klíče PSK je následně použita pro výpočet klíče PTK (Pairwise Transient Key), který se již používá pro samotné šifrování dat (unicast). Během handshaku si strany vymění ještě GTK (Group Temporal Key), který vznikne z GMK (Group Master Key) a je určen pro šifrování multicast/broadcast provozu. To není pro účely toho článku až tak zásadní, GTK tedy nebude probrán tak podrobně.
4-way handshake
4-way handshake je mechanismus výměny 4 zpráv, během kterých se klient a AP vzájemně dohodnou na šifrovacích klíčích PTK/GTK a ověří si, že jsou na obou stranách stejné.
Na počátku AP vygeneruje 32 bajtů náhodných dat označovaných jako ANonce (A jako Authenticator). To samé udělá klient, který vygeneruje SNonce (S jako Supplicant).
První zprávu, jejímž obsahem je ANonce, odesílá AP klientovi. Klient má nyní všech 5 komponent pro výpočet šifrovacího klíče PTK:
- PSK si spočítal na základě SSID a hesla
- SNonce si sám vygeneroval
- ANonce obdržel v první zprávě 4-way handshaku od AP
- svoji MAC adresu zná
- MAC adresu AP vidí v komunikaci
Výpočet PTK probíhá tak, že se všechny tyto atributy vloží do pseudonáhodné funkce PRF-384, využívající HMAC-SHA1. Výsledkem je 48 bajtů dlouhý šifrovací klíč PTK. Obsah této první zprávy není nijak šifrován ani podepsán.
Ve druhé zprávě odešle klient svojí náhodnou hodnotu SNonce a MIC (Message Integrity Code), který je spočítán z této zprávy. MIC slouží k autentizaci zprávy a ověření datové integrity. K jeho výpočtu je využit CBC-MAC a jako klíč se použije PTK. AP má nyní také všech 5 komponent pro výpočet PTK:
- PSK si spočítal na základě SSID a hesla
- ANonce si sám vygeneroval
- SNonce obdržel v druhé zprávě 4-way handshaku od klienta
- svojí MAC adresu zná
- MAC adresu klienta vidí v komunikaci
Navíc z této zprávy sám spočítá MIC a porovná ho s přijatým MIC. Pokud se rovnají, tak PTK má na obou stranách stejnou hodnotu a tudíž se bude šifrovat stejným klíčem.
Ve třetí zprávě odešle AP klíč GTK, který je vytvořen z náhodných hodnot GMK a GNonce a je zašifrovaný pomocí PTK. GTK je, jak jsem již zmiňoval, použit pro šifrování multicast/broadcast provozu. K celé této zprávě je opět spočítán MIC, aby si i klient mohl ověřit shodnost PTK.
Nyní si klient dešifruje a nainstaluje GTK a odešle AP poslední zprávu (opět podepsanou MIC), která slouží pouze jako potvrzení. Proces celého 4-way handshaku zjednodušeně znázorňuje následující schéma:
Nyní mají obě strany spočítán stejný klíč PTK, který slouží k šifrování unicast provozu a je s každým připojením jiný (kvůli jiným hodnotám SNonce a ANonce). Tento klíč a ani samotný PSK nikdy není přenesen po síti. AP si musí držet několik klíčů PTK, protože každý klient má odlišný. Z tohoto důvodu nemohou klienti jednoduše rozšifrovat a sledovat provoz ostatních.
Abychom těch zkratek neměli málo, PTK (48 bajtů) doopravdy není jeden klíč (jak jsem pro jednoduchost popisoval výše), ale dělí se na 3 podklíče:
- prvních 16 bajtů – KCK (Key Confirmation Key) – slouží pro výpočet MIC při handshaku
- druhých 16 bajtů – KEK (Key Encryption Key) – použit pro šifrování dalších podrobností při handshaku (např. GTK)
- posledních 16 bajtů – TEK (Temporal Key) – použit pro šifrování/dešifrování samotných dat (unicast) pomocí šifry AES-128
Dešifrování provozu ostatních klientů
Dost bylo teorie, přesuňme se k praxi. Našim cílem bude odposlouchávat komunikaci ostatních klientů, připojených na stejnou síť za podmínky, že známe sdílené heslo (v našem případě PrisneTajneHeslo
). To za normálních okolností není možné, protože jak jsme si během popisu 4-way handshaku vysvětlili, každý klient používá pro šifrování unikátní klíč PTK (resp. jeho podčást TEK). Podívejme se na následující diagram, který nám vykresluje, co všechno je potřeba, abychom mohli spočítat TEK ostatních klientů:
Zelená políčka známe:
- SSID buď víme anebo odposlechneme z Beacon/Probe Response rámců
- heslo musíme znát, to je nutná podmínka
- PSK si spočítáme pomocí funkce PBKDF2
- MAC adresy klienta a AP vidíme v zachycené komunikaci
Abychom mohli spočítat PTK a odvodit si z něj TEK, potřebujeme znát ještě náhodné hodnoty SNonce a ANonce. Jak jsme si popsali výše, tyto hodnoty jsou přeneseny během prvních 2 zpráv handshaku a nejsou nijak šifrované. Stačilo by nám tedy tyto zprávy zachytit a měli bychom všechny vstupy pro funkci PRF-384 a výpočet šifracích klíčů ostatních klientů.
K handshaku dochází ale pouze při navazování spojení a takové čekání, než se oběť znovu připojí, může být nekonečné. Naštěstí můžeme využít toho, že řídící rámce 802.11 nejsou nijak šifrované ani podepsané a lze je snadno podvrhnout. Na tento účel nám poslouží rámec Deauthentication, který se využívá pro ukončení spojení. Odešleme ho s podvrhnutou zdrojovou MAC adresou, kdy se budeme vydávat za oběť, čímž způsobíme její odpojení od sítě. Spojení sice bude ihned automaticky navázáno, takže si toho pravděpodobně nikdo nevšimne, my však zachytíme handshake a tím pádem i ANonce a SNonce.
Praktická ukázka
Vše níže uvedené budu provádět z Kali Linuxu, obecně vám však postačí jakákoliv distribuce s uvedenými programy. Nejprve si deaktivujeme primární rozhraní wlan0
a přepneme Wi-Fi kartu do monitorovacího módu:
ifconfig wlan0 down airmon-ng start wlan0
Pomocí jakéhokoliv programu budeme zachytávat veškerý provoz na monitorovacím rozhraní (pravděpodobně mon0
). Já využiji známý nástroj Wireshark. Pro zjednodušení si lze nastavit filtr na eapol.type == 3
, což nám bude zobrazovat pouze rámce patřící k handshaku. Pokud jsme zatím handshake nezachytili, můžeme poslat podvrhnutý deautentizační rámec pomocí programu aireplay-ng:
aireplay-ng -0 1 -a 38:2c:4a:4e:06:1d -c 0c:e7:25:5a:1b:14 mon0
kde:
- -0 znamená deautentizaci
- 1 znamená, že se bude deautentizovat pouze 1× (můžete i vícekrát, případně 0 pro nekonečnou deautentizaci)
- -a 38:2c:4a:4e:06:1d je MAC adresa AP
- -c 0c:e7:25:5a:1b:14 je MAC adresa klienta, kterého chceme odpojit
- mon0 je název rozhraní
Poté byste měli vidět deautentizační rámce spolu s ihned automaticky navázaným spojením a tedy zachyceným handshakem:
Pokud bude handshake neúplný (například 3 zprávy ze 4), je nutné celý proces zopakovat. Jestli nevíte, kde zjistit MAC adresy AP a případné oběti, můžete na to použít program airodump-ng:
airodump-ng --essid root_wpa2 -a mon0
kde:
- –essid root_wpa2 je název SSID sítě
- -a znamená, že se nám budou zobrazovat připojení klienti
Jak je vidět na screenshotu níže, k naší Wi-Fi síti root_wpa2
(MAC 38:2C:4A:4E:06:1D) jsou připojení dva klienti (MAC 0C:E7:25:5A:1B:14 a 6C:27:79:77:8A:60). Tyto informace tedy můžeme využít pro aireplay-ng.
Jakmile jsme oběť deautentizovali a zachytili handshake, získali jsme díky tomu i náhodná data SNonce a ANonce. Nyní nám nic nebrání provoz dešifrovat symetrickou šifrou AES s právě vypočteným klíčem TEK. Využijeme k tomu opět Wireshark – konkrétně Edit → Preferences → Protocols → IEEE 802.11. Zde zaškrtneme Enable decryption a klikneme na Edit. Nyní vybereme typ wpa-pwd a klíč vepíšeme ve formátu heslo:SSID
.
Od této doby by měl Wireshark dešifrovat veškerý provoz (i real-time) všech klientů, ke kterým zachytil handshake. Pokud nebudou data šifrovaná nějakou další vrstvou (HTTPS, VPN…), tak útočník uvidí vše – webové stránky, které navštěvujete, vaše uživatelská jména i hesla, obsahy odeslaných formulářů, obsahy zpráv atd.
Prolamování hesla
Druhou a poslední praktickou ukázkou v tomto článku bude prolamování hesla. Tedy situace, kdy k Wi-Fi síti zabezpečené pomocí WPA2-PSK (CCMP) heslo neznáme. Samozřejmě jednou z možností je zkoušet jedno heslo po druhém (ideálně z nějakého slovníku) přímo pokusem o připojení – to je však extrémně pomalé a lehce detekovatelné.
My místo toho využijeme výše uvedených znalostí k provedení tzv. offline útoku. To znamená, že se pokusíme heslo prolomit lokálně, aniž bychom se neustále dotazovali AP. Pokud neznáme heslo, ztroskotáme hned na začátku celého procesu, protože nebudeme schopni pomocí funkce PBKDF2 spočítat PSK. Z toho vyplývá, že naše snažení bude spočívat ve zkoušení mnoha různých hesel jako vstupu do funkce PBKDF2. Jak ale ověřit, že je heslo správné?
Pokud si ještě pamatujete 4-way handshake, tak ve druhé zprávě je i autentizační kód MIC, který se spočítal pomocí CBC-MAC a klíče KCK (prvních 16 bajtů PTK). Náš postup bude tedy následující:
- Opět si zachytíme 4-way handshake kvůli získání ANonce a SNonce, i když tentokrát by nám stačily jen první 2 zprávy.
- Vezmeme první heslo ze slovníku a spočítáme PSK pomocí PBKDF2.
- Spočítáme si PTK pomocí funkce PRF-384 (vše potřebné již známe).
- Z právě vypočteného klíče si oddělíme prvních 16 bajtů – klíč KCK.
- Spočítáme MIC druhé zprávy s využitím CBC-MAC a klíče KCK.
- Pokud se zachycený MIC rovná našemu právě vypočtenému, heslo z bodu 2 je správné. Když je MIC různé, vracíme se k bodu 2 a zkoušíme druhé heslo ze slovníku atd.
Jak je na výše uvedeném algoritmu vidět, vše lze počítat i ověřovat lokálně. Nejpomalejší částí celého procesu je funkce PBKDF2, která má pro zpomalení nastaveno 4096 iterací. Jelikož je založená na HMACu s využitím SHA1, musíme spočítat 8192 SHA1 hashů pro vyzkoušení jediného hesla. Spolu s minimální délkou hesla 8 znaků (maximum je 63) je možné prolomit heslo víceméně jen s využitím slovníkového útoku. Bruteforcing, tedy zkoušení všech možných kombinací, je díky velké časové náročnosti téměř nemožný.
Praktická ukázka
Opět využiji Kali Linux a moji testovací síť root_wpa2
, tentokrát s neznámým heslem. Protože se zde bude plno věcí opakovat, budu to brát stručněji. Nejprve si opět přepneme kartu do monitorovacího módu:
ifconfig wlan0 down airmon-ng start wlan0
Dále si programem airodump-ng zjistíme kanál, na kterém AP vysílá:
airodump-ng mon0
Na tomto kanálu začneme zachytávat veškerý provoz a ukládat ho do souboru:
airodump-ng –-channel 6 –-essid root_wpa2 mon0 –-write /tmp/root_wpa2
Mezitím z druhé konzole vyhodíme libovolného klienta, abychom zachytili handshake:
aireplay-ng -0 1 -a 38:2c:4a:4e:06:1d -c 0c:e7:25:5a:1b:14 mon0
Jakmile zachytíme 4-way handshake, objeví se nám to ve výstupu programu airodump-ng a můžeme ho ukončit:
Nyní máme v souboru/tmp/root_wpa2-01.cap
uložen veškerý provoz včetně handshaku a můžeme se pokusit prolomit heslo, k čemuž budeme potřebovat nějaký slovník. Pro testovací účely jsem si vytvořil vlastní:
root@i5sb:~# cat /tmp/list.txt SpatneHeslo NespravneHeslo Kdepak PrisneTajneHeslo TohleToNeni AniTohle
Použiji program aircrack-ng, kterému předám wordlist a zachycený provoz:
aircrack-ng –w /tmp/list.txt /tmp/root_wpa2-01.cap
Jak je vidět, aircrack-ng prolomil heslo vcelku rychle. Reálná rychlost na mém starším notebooku (Intel Core i5–2410M) je přibližně 1800 hesel za vteřinu. Zrychlení na GPU/FPGA/ASIC bude markantní, avšak při dostatečně dlouhém a neslovníkovém heslu jste pořád v bezpečí.
Jak se bránit
Co se týká odposlouchávání provozu, tam je nejdůležitější uvědomění si, že kdokoliv zná heslo, může sledovat veškerý váš provoz. Pro domácí využití lze doporučit pořízení routeru, který umožňuje mít více SSID (a ke každému jiné heslo). Jedno SSID pro vás, další pro návštěvy, nájemníky apod. Pokud jste někde mimo domov, doporučuji využít šifrovaného VPN spojení – osobně se na veřejných hotspotech bez VPN téměř nepřipojuji. V neposlední řadě je zde možností využít WPA2-Enterprise módu, což rozhodně kvůli složitější implementaci nelze doporučit všem.
Pokud chcete zabránit prolomení hesla, rada je velmi jednoduchá – zvolte dostatečně dlouhé a neslovníkové heslo. Zajímavostí, kterou moc lidí netuší, je, že bezpečnost vaší sítě závisí i na zvoleném SSID. Proč? Pokud budete mít např. defaultní SSID, které mají další statisíce lidí po celém světě, je zde mnohem větší šance, že si útočníci předpočítali dostatečně velké rainbow tabulky pro vaše SSID (do funkce PBKDF2 vstupuje jak heslo, tak SSID). To jim šanci na prolomení hesla mnohonásobně zvýší. Například na placené službě GPUHASH.me se můžete pokusit prolomit heslo k zachycenému handshaku.
Bezpečnost Wi-Fi je velmi široké téma a rozhodně by nebylo na škodu probrat i nějaké další věci, namátkou – více řídících rámců 802.11, útoky na WEP/WPA, generování a používání klíče GTK pro multicast/broadcast, prolomení WPA2 přes WPS, útok Hole196 apod. Už tak je však tento článek příliš dlouhý, necháme si to tedy na někdy příště.