Preorder drugiego tomu książki sekuraka: Wprowadzenie do bezpieczeństwa IT. -15% z kodem: sekurak-book
Automatyczne wykrywanie proxy przez WPAD – czyli jak łatwo przechwycić ruch http w sieci lokalnej
- Wyjaśnię, jak działa mechanizm automatycznego wykrywania serwerów proxy (WPAD),
- Omówię niebezpieczeństwa związane bezpośrednio ze sposobem działania WPAD,
- Pokażę strukturę pliku wpad.dat (format PAC),
- Pokażę praktycznie jak można nadużyć WPAD w celu przechwycenia ruchu sieciowego http(s) w sieci lokalnej.
WPAD (Web Proxy Auto-Discovery Protocol) to mechanizm, który pozwala systemowi operacyjnemu bądź aplikacjom na automatyczne wykrywanie i konfigurację serwera proxy. Pierwszym krokiem jest próba wykrycia hosta, który serwuje plik konfiguracyjny o nazwie wpad.dat; a następnie interpretacja tego pliku i ustawienie reguł przesyłania żądań do proxy na jego podstawie. Plik wpad.dat musi zostać napisany w formacie PAC (Proxy Auto-Config), o którym kilka słów napiszę w dalszej części tekstu.
Jak działa WPAD
Jak wspomniałem wcześniej, mechanizm WPAD w pierwszym kroku próbuje zlokalizować w sieci host, który serwuje plik konfiguracyjny wpad.dat. Zasadniczo odbywa się to na jeden z trzech sposobów:
- Wykrywanie przez DHCP,
- Wykrywanie przez DNS/LLMNR,
- Wykrywanie przez NetBIOS.
Wykrywanie odbywa się w takiej kolejności jak napisałem powyżej. Jeżeli dany sposób nie zadziała, np. nie uda się wykryć serwera proxy przez DHCP, następuje próba wyszukania serwera kolejnym sposobem. Jeżeli nie uda się tego zrobić żadną z trzech wymienionych metod, połączenia nie będą wysyłane przez proxy tylko bezpośrednio do serwerów.
DHCP
Wykrywanie przez DHCP polega na wysłaniu pakietu DHCP Inform z prośbą, między innymi, o przesłanie opcji 252 – Proxy autodiscovery (rys 2.). Jeżeli serwer DHCP wspiera tę opcję, w odpowiedzi (DHCP ACK) prześle bezpośredni URL do pliku wpad.dat.
DNS/LLMNR
Wykrywanie DNS/LLMNR polega na wysłaniu zapytania DNS/LLMNR typu A. Jeśli użytkownik znajduje się w sieci korporacyjnej, w której jego nazwa komputera wygląda następująco: tester.biuro.krakow.sekurak.local, wówczas serwer DNS zostanie odpytane o nazwę wpad.biuro.krakow.sekurak.local. Jeśli to się nie powiedzie, zostanie wysłane zapytanie LLMNR (Link-local Multicast Name Resolution) o nazwę wpad (rys 3.). Gdyby zapytanie do wpad.biuro.krakow.sekurak.local się powiodło, nastąpi próba pobrania i interpretacji pliku http://wpad.biuro.krakow.sekurak.local/wpad.dat.
- wpad.biuro.krakow.sekurak.local,
- wpad.krakow.sekurak.local,
- wpad.sekurak.local
Jednakże w testowanych przeze mnie środowiskach, nie były wykonywane zapytania do tych kolejnych domen. Być może zależy to od konfiguracji sieci lokalnej lub zostało to zmienione w ostatnich wersjach Windowsa. Zachęcam czytelników znajdujących się w sieciach korporacyjnych o sprawdzenie zachowania systemu operacyjnego w swoim środowisku. W tym celu należy uruchomić wiresharka, a następnie Internet Explorera. Zapytania DNS do wpad można łatwo śledzić, definiując filtr: dns.qry.name matches „wpad”.
NetBIOS
W ostateczności, jeśli wcześniejsze próby zawiodą, nazwa WPAD jest rozwiązywana przez NetBIOS (rys 4.). Jeśli nazwa zostanie rozwiązana, pobierany i interpretowany jest plik http://WPAD/wpad.dat.
Struktura pliku wpad.dat
Plik wpad.dat jest plikiem javascriptowym definiowanym w oparciu o standard PAC (proxy autoconfig). Powinien zawierać definicję funkcji FindProxyForURL(url, host), która zwraca ciąg znaków z informacją, czy dane żądanie ma zostać przepuszczone przez proxy. Przeglądarka następnie będzie wykonywać tę funkcję dla każdego żądania, które będzie chciała wykonać i na podstawie jej wyniku podejmie decyzję, czy dane żądanie powinno być wysłane przez proxy czy bezpośrednio. Poniżej przedstawiam przykładowy plik wpad.dat:
function FindProxyForURL(url, host) { if (url.substring(0, 5) != 'http:') // 1 return "DIRECT"; if (dnsDomainIs(host, ".sekurak.pl")) // 2 return "PROXY 192.168.2.1:8080" return "PROXY 192.168.1.1:8080"; // 3 }
Działanie przykładu jest następujące:
- Jeżeli protokół żądania http jest inny niż „http” (np. https) – wówczas, żądanie przesyłane jest bezpośrednio.
- Jeżeli nazwa hosta, do którego wysyłane jest żądanie, jest domeną sekurak.pl lub dowolną subdomeną sekurak.pl, żądanie zostanie wysłane do proxy 192.168.2.1:8080.
- Każde inne żądanie zostanie wysłane do proxy 192.168.1.1:8080.
W plikach PAC można używać wielu innych funkcji – po szczegółowy opis odsyłam do strony FindProxyForURL.
Zagrożenia
Sposób działania WPAD daje bezpośrednio bardzo prostą metodę ataku: wystarczy w sieci uruchomić hosta o nazwie WPAD, który na porcie 80 wystawi odpowiednio spreparowany plik wpad.dat. Wówczas inne hosty w sieci same zaczną odpytywać o konfigurację proxy, co umożliwi przechwycenie ruchu poprzez przekierowanie go do serwera proxy kontrolowanego przez atakującego.
W zasadzie do przeprowadzenia ataku wystarczy dowolne proxy + Apache + serwer Samby ze zdefiniowaną dyrektywą netbios name = wpad. W celach edukacyjnych pokażę jednak w jaki sposób można zrobić to samo, korzystając z ulubionych narzędzi pentesterów: Kali, Metasploit, Burp. Do dzieła!
Ewentualne testy z wykorzystaniem zamieszczonych tu informacji należy realizować jedynie w sieciach, których bezpieczeństwo możemy oficjalnie sprawdzać.
Składając wszystko w jedną całość, potrzebujemy trzech składników:
- Nasz host musi mieć ustawioną nazwę WPAD w NetBIOS.
- Na porcie 80 musi zostać wystawiony plik /wpad.dat z konfiguracją proxy przekierowującą przez nasz serwer.
- Na porcie 8080 uruchomimy proxy do podglądu przechwyconych żądań http.
Pierwsze dwa punkty załatwi nam Metasploit, trzeci – zrobimy Burpem.
Zacznijmy od uruchomienia Burpa. W Kalim możemy to zrobić z menu Programy -> Kali Linux -> Web Applications -> Web Application Proxies -> burpsuite. Alternatywnie wystarczy wpisać burpsuite.jar w konsoli. Musimy skonfigurować Burpa, aby nasłuchiwał na połączenia z wszystkich hostów (domyślnie nasłuchuje tylko na localhost). W tym celu przechodzimy do zakładki Proxy -> Options. Następnie w Proxy listeners wybieramy interfejs i klikamy Edit (rys 5.). W wyświetlonym okienku (Edit proxy listener) zaznaczamy opcję „All interfaces” i zatwierdzamy przyciskiem OK (rys 6.). Burp wyświetli jeszcze ostrzeżenie, czy aby na pewno chcemy nasłuchiwać na wszystkich interfejsach. Oczywiście odpowiadamy „Yes”.
Burp jest już ustawiony i czeka na połączenia. Przed przejściem do kolejnego kroku, musimy upewnić się jaki adres IP ma nasza maszyna z Kalim. W tym celu wykonujemy polecenie ifconfig . W moim przypadku IP to 10.10.10.100 (rys 7.).
Przechodzimy więc do konsoli i uruchamiamy Metasploita poleceniem msfconsole. Metasploit musi zostać uruchomiony z prawami roota (aby mógł później otworzyć port 80).
Pierwszym modułem, którego użyjemy jest auxiliary/spoof/nbns/nbns_response. Moduł ten nasłuchuje na żądania NetBIOS Name Service pojawiające się w sieci i odpowiada na nie zdefiniowanym adresem IP, jeśli pasują do zdefiniowanego wyrażenia regularnego. W tym przypadku zdefiniujemy po prostu, że wyrażeniem regularnym jest WPAD, bo chcemy odpowiadać tylko na taką nazwę hosta. Musimy więc wykonać kolejno polecenia:
use auxiliary/spoof/nbns/nbns_response set REGEX WPAD set SPOOFIP 10.10.10.100 run
W odpowiedzi powinniśmy zobaczyć informację, że moduł wystartował (rys 8.). Od tego momentu, jeśli w któryś z hostów w sieci odpyta o host WPAD, otrzyma odpowiedź iż znajduje się on pod adresem 10.10.10.100.
Kolejnym krokiem będzie wystawienie pliku /wpad.dat na porcie 80. Skorzystamy w tym celu z modułu auxiliary/server/wpad. Tym razem zdefiniujemy tylko nazwę hosta z proxy oraz port, na którym działa proxy.
use auxiliary/server/wpad set PROXY 10.10.10.100 set PROXYPORT 8080 run
Moduł zostanie uruchomiony. Jak tylko jakiś host odpyta o plik wpad.dat, w konsoli metasploita zostanie wyświetlona odpowiednia informacja (rys 9.). Teraz pozostaje już tylko przełączyć okno na zakładkę Proxy->History w Burpie i czekać aż pojawią się tam zapytania przechwycone z innych hostów (rys 10.). Powinny pojawić się tam żądania wygenerowane przez dowolną aplikację, która korzysta z systemowych ustawień proxy (m.in. IE i Google Chrome).
Podsumowanie
Mechanizm wyszukiwania serwera proxy (domyślnie włączony w systemie Windows) umożliwia łatwe przeprowadzenie ataku polegającego na przechwyceniu ruchu http(s) w sieci lokalnej. Aby przeprowadzić taki atak, wystarczy utworzyć hosta, którego nazwa to WPAD i utworzyć plik /wpad.dat wystawiany na porcie 80. Inne hosty w sieci zaczną same o ten plik odpytywać i wykorzystywać zdefiniowaną w nim konfigurację proxy.
Aby zabezpieczyć się przed atakiem, można zastosować kilka metod:
- Wyłączyć automatyczne wykrywanie serwerów proxy na komputerach w sieci,
- Zdefiniować w DHCP rekord 252 z adresem do pliku wpad.dat. Jeżeli w organizacji nie planuje się używać proxy, można funkcję wyszukiwania proxy zdefiniować zawsze jako return „DIRECT”;, by wszystkie połączenia były wysyłane bezpośrednio.
- Monitorować sieć w celu sprawdzenia czy któryś z hostów próbuje się przedstawiać jako WPAD.
Dalsza lektura
- http://findproxyforurl.com/ – strona opisująca standard pliku wpad.dat (PAC) jak również sam standard WPAD.
Warto zwrócić uwagę na web interfejs wystawiany przez burpa. Za jego pomocą można przejrzeć historie wszystkich zapytań oraz ich treść, udostępniając w ten sposób całej sieci lokalnej efekty naszego ataku.
Zgadza się.
Ten interfejs webowy można wyłączyć w zakładce Proxy->Options, grupa opcji „Miscellaneous” (na samym dole), opcja: „Disable web interface at http://burp„.
Chyba rozwiązałem jeden problem z przechwytywaniem ruchu po https (hasła itd). Teraz zostaje jeszcze problem z dostępem zdalnym do komp. (vista; 7; 8.1). Usługi dostępu zdalnego są wyłączone. Systemy AV nie są w stanie sobie z tym poradzić ( KIS 2015; Comodo Premium 8 ). Jak już kiedyś pisałem, bez większych problemów można wyciągnąć dokumenty zapisane w PDF, czy Office.
Jest też problem z połączeniem wi fi z routerem INSSIDER pokazuje że mam 2 sieci bezprzewodowe o tej samej nazwie – jedna widoczna, a druga nie.
Dzięki za artykuł, fajnie i przejrzyście opisane.
Uzywajac wpad-a, mozna tez wymusic na „boskich” urzadzeniach przenosnych Apple uzywanie tunelu ssh jako proxy dla polaczen sieciowych: w pliku wpad mowimy, ze proxy jest na localhost, wrzucamy plik gdzies do sieci, w ustawieniach wifi podajemy link do niego, odpalamy klienta ssh z opcja proxy i mamy… cale 10 minut tunelowania np. Safari, bo klient ssh nie jest oznaczony jako aplikacja streamujaca i mamy 10 minut od momentu wyslania go w tlo do momentu kiedy iOS stwierdzi, ze ten socket, ktory caly czas przesyla dane nie jest chyba juz potrzebny ;).
U mnie ta opcja jest wyłączona, prawdopodobnie domyślnie. Nie przypominam sobie abym coś tam zmieniał.
Świetny artykuł, lekka ale treściwa lektura!
OT: czy te zamazane hexdumpy to jakiś wechall z deobfuskacji? generuj słownik i dopasowuj kolorkody xD
Witam
Ja mam z kolei pytanie.
Jak mogę sprawdzić czy mam poprawnie skonfigurowane przekierowanie proxy jeśli chodzi o łączenie telnetem?
Bez połączenia proxy wpisuje telnet i w oknie telnetu odpytuje serwer na konkretnym porcie.Mam odpowiedź- jest ok.
A jak będzie to wyglądać w przypadku ustawionej w Win konfiguracji ruchu przez Proxy?
Będę wdzięczny za wskazówkę.