Bezpieczny WPS

Kategoria: Artykuły, etykiety: hostapd, openwrt, pbc, pin, reaver, wifi, wpasupplicant, wps

Dodany: 2014-09-23 17:42 (zmodyfikowany: 2014-09-24 11:56)
Przez: morfik

Wyświetleń: 7141

Wi-Fi Protected Setup (WPS) powstał w celu ułatwienia konfiguracji urządzeń w sieci wifi -- zamiast mozolnie przepisywać 64 znakowe hashe (czy co tam mamy za hasło) i uzupełniać ręcznie pozostałe parametry połączenia, wystarczy wpisać np. 8 cyferek i urządzenie się skonfiguruje samo. Niemniej jednak, wszędzie gdzie nie spojrzeć, ludzie rozpisują się na temat tego jakim to niebezpieczeństwem jest włączenie w routerach wifi opcji WPS. O tych zagrożeniach, jeśli kogoś interesują, można poczytać np. tutaj. W skrócie, chodzi o wadliwy pin, który może i ma 8 cyfer ale z racji swojego zaimplementowania, by go złamać potrzeba maks 11000 prób, co można zrobić w parę godzin, najwyżej kilka dni.

Jako radę na całe WPSowskie zło, ludzie radzą wyłączenie tego ficzera zupełnie. Czy to aby nie przesada? Mało się mówi, że ten pin, który narobił tyle zamieszania, nie jest jedyną opcją, która może zostać użyta w setupie WPS -- innym mechanizmem jest PBC (Push Button Connect), czyli przyciśnięcie przycisków na obudowie routera i karcie wifi, o ile te urządzenia są wyposażone we wspomniane przyciski -- nawet jeśli ich nie posiadają, to nie stanowi żadnej przeszkody by zaimplementować funkcjonalny WPS/PBC i uprościć sobie życie w wielu przypadkach.

Wybrakowane oprogramowanie

Domyślnie w OpenWRT jest zainstalowany pakiet wpad-mini , który nie posiada obsługi WPS. Trzeba go odinstalować i doinstalować poniższe pakiety:

# opkg remove wpad-mini
# opkg install wpad hostapd-utils

Dziurawy WPS w OpenWRT

Na wiki OpenWRT możemy wyczytać, że jest do wyboru spory wachlarz metod konfiguracyjnych WPS -- mamy tam: usba, ethernet, label, display, ext_nfc_token, int_nfc_token, nfc_interface, push_button, keypad, virtual_display, physical_display, virtual_push_button oraz physical_push_button. Natomiast wspierana jest, póki co, jedna z nich -- push_button . Dodatkowo mamy również w standardzie zaimplementowaną obsługę metody z pinem i to chyba w najgorszym z możliwych wariantów -- domyślnie ustawiony jest pin 12345670 i jakby tego było mało, można użyć tego pinu i zostać podłączonym do sieci nawet przy wyraźnym określeniu, że chce się korzystać z przycisków. Ta dziura została załatana w nowszych wersjach OpenWRT, dokładniej w r42553 .

W przypadku gdy używamy starszej wersji firmware, przydałoby się ją zaktualizować ale jeśli się nie bardzo nam chce, możemy całą zaistniałą sytuację poprawić ręcznie. Konfiguracja dla hostapd w OpenWRT jest generowana dynamicznie i jest trzymana w pliku /var/run/hostapd-phy0.conf . Wartości w tym pliku są uzyskiwane ze skryptu, który siedzi w /lib/netifd/hostapd.sh . Wszystko co musimy zrobić, to wyedytować ten skrypt i zmienić w nim poniższe linijki:

...
config_add_string wps_device_type wps_device_name wps_manufacturer wps_pin
...
wps_device_type wps_device_name wps_manufacturer wps_pin \
...
set_default wps_pin "12345670"
...
append bss_conf "ap_pin=$wps_pin" "$N"
...

Z pierwszych dwóch wywalamy wps_pin , a dwie ostatnie usuwamy całkowicie.

Konfiguracja routera

By teraz aktywować WPS na routerze, dopisujemy opcje z wps_ w pliku /etc/config/wireless , tuż pod konfiguracją WPA2-PSK. Całość powinna wyglądać jak poniżej:

...
config wifi-iface
   option device 'radio0'
   option network 'lan'
   option mode 'ap'
   option ssid 'Winter Is Coming'
   option encryption 'psk2+aes'
   option key 'krotszego-hasla-to-juz-nie-bylo?'
   option disabled '0'
   option hidden '0'
   option isolate '0'
   option macfilter 'disable'
   option maclist ''
   option maxassoc '50'
   option wps_pushbutton '1'
   option wps_device_type '6-0050F204-1'
   option wps_config 'push_button'
   option wps_device_name 'OpenWrt AP'
...

I resetujemy wifi:

# wifi

Zweryfikujmy też czy w pliku /var/run/hostapd-phy0.conf jest jakaś wzmianka dotycząca pinu -- nie powinno jej być. Jeśli z jakiegoś powodu chcielibyśmy wyłączyć WPS, wystarczy, że przestawimy parametr wps_pushbutton na 0 .

Konfiguracja klienta

Konfiguracja wpasuplicanta na maszynie klienckiej jest jeszcze prostsza. Tworzymy plik /etc/wpa_supplicant/wpa_supplicant.conf o poniższej treści:

update_config=1

Ta linijka nakazuje narzędziu wpasupplicant, by zaktualizował ten plik o wartości, które otrzyma za sprawą protokołu WPS. Po uzupełnieniu tego pliku, połączenie zostanie ustanowione w oparciu o te dane. Jedyny problem jaki jest z powyższą opcją, to taki, że czyści ona wszelkie komentarze jakie mamy w tym pliku.

Można też zrezygnować z powyższego pliku, tylko wtedy za każdym razem gdy będziemy się podłączać do sieci, trzeba będzie przyciskać przyciski by na nowo powiązać urzadzenia.

Teraz jeszcze potrzebujemy konfiguracji dla interfejsu sieciowego w pliku /etc/network/interfaces :

auto wlan1
allow-hotplug wlan1
iface wlan1 inet dhcp
    wpa-driver nl80211
    wpa-debug-level -1
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

Parowanie urządzeń

Podłączamy kartę do PC i skanujemy eter w poszukiwaniu sieci:

# wpa_cli scan_results
Selected interface 'wlan1'
bssid / frequency / signal level / flags / ssid
...
e8:94:f6:68:79:f0       2447    -33     [WPA2-PSK-CCMP][WPS][ESS]       Winter Is Coming
...

Jak widzimy wyżej, [WPS] sugeruje, że opcja WPS jest aktywowana. W przypadku gdyby tam widniał [WPS-PBC], oznacza to, że aktualnie trwa faza parowania urządzeń, czyli, że na routerze został przyciśnięty przycisk WPS. Po jej zakończeniu [WPS-PBC] zmieni się znów na [WPS]. W przypadku gdyby tam widniał [WPS-PIN] oznaczałoby to, że wykorzystywany jest pin. Dlatego też dobrze jest zwrócić na ten szczegół uwagę.

Ze względów bezpieczeństwa dobrze jest najpierw wciskać przycisk na kliencie, a dopiero na routerze, a to choćby z tego względu, że jeśli router wykryje co najmniej dwa klienty oczekujące na konfigurację przez protokół WPS, żaden z nich jej nie otrzyma po wciśnięciu przycisku na routerze. Tego typu sytuację możemy zaobserwować poniżej -- podłączyłem dwie karty wifi. W tej chwili obie karty nasłuchują i jeśli wciśniemy przycisk na routerze, WPS nie zostanie aktywowany, a my będziemy mogli zobaczyć poniższy komunikat:

# hostapd_cli wps_get_status
Selected interface 'wlan0'
PBC Status: Overlap
Last WPS result: None

Tego typu zachowanie ma zapobiec wyciekowi poufnych danych na wypadek gdyby ktoś czekał na naciśnięcie przez nas przycisku. Jedyny problem jaki może z zaistniałej sytuacji wyniknąć, to fakt, że teraz nie idzie włączyć WPS na routerze, nawet w przypadku gdy odłączy się drugą maszynę. By przywrócić działający WPS, trzeba zresetować wifi przez wydanie polecenia wifi .

Naturalnie nie musimy przyciskać przycisków -- tę akcję możemy zwyczajnie zasymulować. W tym celu, na maszynie klienckiej wydajemy poniższe polecenie:

# wpa_cli wps_pbc
Selected interface 'wlan1'
OK

Na routerze również możemy zasymulować wciśnięcie przycisku:

# hostapd_cli wps_get_status
Selected interface 'wlan0'
PBC Status: Disabled
Last WPS result: None

# hostapd_cli wps_pbc
Selected interface 'wlan0'
OK

# hostapd_cli wps_get_status
Selected interface 'wlan0'
PBC Status: Active
Last WPS result: None

Czas przewidziany na parowanie urządzeń to równo dwie minuty -- podczas tego okresu czasu musimy wcisnąć przyciski na obu urządzeniach. Jeśli nie zmieścimy się w tym przedziale, na routerze będziemy mogli odczytać poniższą wiadomość:

# hostapd_cli wps_get_status
Selected interface 'wlan0'
PBC Status: Timed-out
Last WPS result: None

Po rozpoczęciu procesu parowania, diody na karcie oraz routerze powinny zacząć migać. Po chwili powinien zostać uzupełniony plik /etc/wpa_supplicant/wpa_supplicant.conf . Sprawdźmy czy tak się stało:

ctrl_interface=/var/run/wpa_supplicant
update_config=1

network={
    ssid="Winter Is Coming"
    psk=krotszego-hasla-to-juz-nie-bylo?
    proto=RSN
    key_mgmt=WPA-PSK
    pairwise=CCMP
    auth_alg=OPEN
}

Mamy zatem skonfigurowane parametry dla sieci wifi. Teraz tylko zresetujmy interfejs sieciowy by dostać adres IP:

# ifdown wlan1
Internet Systems Consortium DHCP Client 4.3.1
Copyright 2004-2014 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/

Listening on LPF/wlan1/e8:94:f6:1e:15:e9
Sending on   LPF/wlan1/e8:94:f6:1e:15:e9
Sending on   Socket/fallback
DHCPRELEASE on wlan1 to 192.168.1.1 port 67

# ifup wlan1
Internet Systems Consortium DHCP Client 4.3.1
Copyright 2004-2014 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/

Listening on LPF/wlan1/e8:94:f6:1e:15:e9
Sending on   LPF/wlan1/e8:94:f6:1e:15:e9
Sending on   Socket/fallback
DHCPDISCOVER on wlan1 to 255.255.255.255 port 67 interval 7
DHCPDISCOVER on wlan1 to 255.255.255.255 port 67 interval 9
DHCPREQUEST on wlan1 to 255.255.255.255 port 67
DHCPOFFER from 192.168.1.1
DHCPACK from 192.168.1.1
bound to 192.168.1.207 -- renewal in 36711 seconds.

Po dokonaniu konfiguracji, WPS automatycznie przechodzi w stan spoczynku i drugie urządzenie, które by chciało skorzystać i potajemnie wtargnąć do naszej sieci, nie będzie miało takiej możliwości. Jeśli wydamy poniższe polecenie na routerze:

# hostapd_cli wps_get_status
Selected interface 'wlan0'
PBC Status: Disabled
Last WPS result: Success
Peer Address: e8:94:f6:1e:15:e9

Możemy dostrzec Peer Address . Dobrze jest zweryfikować tego MACa ale nawet bez tego będzie wiadomo czy komuś przez przypadek udało się uzyskać dostęp do naszej sieci via WPS, bo wtedy my go zwyczajnie nie uzyskamy.

W przypadku gdybyśmy przez przypadek aktywowali funkcję WPS, istnieje możliwość ręcznego przerwania procesu parowania urządzeń i nie trzeba czekać 2 minut aż ten proces się zakończy sam z siebie. Wystarczy na routerze wpisać poniższe polecenie:

# hostapd_cli wps_cancel
Selected interface 'wlan0'
OK

WPS via przyciski na obudowie

Jeśli chodzi o przyciski, to jest wielce prawdopodobne, że musimy zaprogramować je ręcznie, bo inaczej nie będą chciały działać. Poniżej jest skrypt obsługujący przycisk reset mojego routera. Są tam trzy akcje -- inny przycisk póki co nie działa i reset jest jedyny, który może być programowalny. Konfiguracja przycisku znajduje się w pliku /etc/rc.button/reset :

#!/bin/sh

[ "${ACTION}" = "released" ] || exit 0

. /lib/functions.sh

logger "$BUTTON pressed for $SEEN seconds"

if [ "$SEEN" -lt 1 ]
then
        wps_state=`hostapd_cli get_config | grep wps_state | cut -d= -f2`

        if [ "$wps_state" = "disabled" ]
        then
                logger "WPS is disabled, please enable it in /etc/config/wireless ."
                exit 1
        elif [ "$wps_state" = "configured" ]
        then
                for dir in /var/run/hostapd*; do
                [ -d "$dir" ] || continue
                        hostapd_cli -p "$dir" wps_pbc
                done
                echo "255" > /sys/class/leds/tp-link\:green\:wps/brightness

                for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
                do
                        is_wps_active=`hostapd_cli wps_get_status | grep "PBC Status" | cut -d " " -f 3`

                        if [ "$is_wps_active" != "Active" ]
                        then
                                echo "0" > /sys/class/leds/tp-link\:green\:wps/brightness
                        else
                                sleep 1
                        fi
                done
                hostapd_cli wps_cancel
                echo "0" > /sys/class/leds/tp-link\:green\:wps/brightness
        else
                exit 1
        fi
elif [ "$SEEN" -gt 2 -a "$SEEN" -lt 5 ]
then
        echo "REBOOT" > /dev/console
        sync
        reboot
elif [ "$SEEN" -gt 10 ]
then
        echo "FACTORY RESET" > /dev/console
        jffs2reset -y && reboot &
fi

Sprawdziłem też jak się zachowuje przycisk na karcie sieciowej i ten też nie działa -- jakże by inaczej. Najgorsze jest to, że póki co nie mam zielonego pojęcia jak zmusić przycisk na adapterze wifi do pracy.

A co z PINem?

Jeśli ktoś jednak chciałby korzystać z pinu, choć nie jest to zalecane w większości wypadków, to może naturalnie z niego korzystać, tylko przydałoby się pierw ustalić czy nasz router posiada mechanizm zabezpieczający przed wprowadzaniem wielu błędnych pinów pod rząd, a jeśli tak, to na jaki czas zostaje zablokowana funkcja WPS. Można to ustalić posługując się narzędziem reaver. Nie będę tutaj opisywał całego procesu, jedynie to w jaki sposób ustalić czas WPS LOCKa:

# reaver -i mon0 -b E8:94:F6:68:79:F0 -vv -c 8 --lock-delay 10
# reaver -i mon0 -b E8:94:F6:68:79:F0 -vv -c 8 --lock-delay 30
# reaver -i mon0 -b E8:94:F6:68:79:F0 -vv -c 8 --lock-delay 50
# reaver -i mon0 -b E8:94:F6:68:79:F0 -vv -c 8 --lock-delay 60
# reaver -i mon0 -b E8:94:F6:68:79:F0 -vv -c 8 --lock-delay 50

Dostrajamy odpowiednio parametr --lock-delay zwiększając czas, a ten jest w sekundach. Jeśli będą wyrzucane komunikat o zablokowaniu WPS, trzeba zwiększyć odstępy czasu, aż do chwili gdy nie będziemy łapać się na WPS LOCKa. W przypadku mojego routera (TL-WR1043N/ND v2) ten mechanizm jest zaimplementowany i blokada WPS jest ustawiona jedynie na 60s, co niezbyt cieszy, bo by przeskanować 11000 możliwości, potrzeba 660000 sekund, czyli nieco ponad 7 dni, a biorąc pod uwagę średnią, złamanie pinu potrwa maksymalnie 4 dni. Dlatego też jeśli jesteśmy w posiadaniu tego modelu routera, opcja WPS/PIN kompletnie nie wchodzi w grę.

Dodatkowe info

Pełną dokumentacje na temat implementacji WPS w narzędziu wpasupplicant można znaleźć pod tym adresem. Natomiast o konfiguracji WPS routera można więcej poczytać na stronie OpenWRT.

OSnews Wykop Blip Flaker Kciuk Śledzik Facebook Identi.ca Twitter del.icio.us Google Bookmarks