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

21 stycznia 2015, 09:55 | Teksty | komentarzy 9

W tym artykule:

  • 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.

W artykule skupiam się wyłącznie na mechanizmie WPAD w systemie Windows, ponieważ, o ile się orientuję, jest to jedyny system operacyjny, na którym automatyczne wykrywanie proxy jest domyślnie włączone. Można to sprawdzić w ustawieniach proxy: w Panelu sterowania należy wpisać „proxy”, wybrać opcję „Konfiguruj serwer proxy”, a następnie przycisk „Ustawienia sieci LAN”. Opcja „Automatycznie wykryj ustawienia” prawdopodobnie będzie włączona (rys 1.)
Rys 1. Automatyczne wykrywanie proxy w Windowsie

Rys 1. Automatyczne wykrywanie proxy w Windowsie

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:

  1. Wykrywanie przez DHCP,
  2. Wykrywanie przez DNS/LLMNR,
  3. 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.

Rys 2. Prośba do serwera DHCP o przesłanie informacji o proxy

Rys 2. Prośba do serwera DHCP o przesłanie informacji o proxy

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.

Rys 3. Zapytania DNS/LLMNR

Rys 3. Zapytania DNS/LLMNR

Uwaga, według większości źródeł opisujących standard WPAD, wliczając Wikipedię, w przypadku nierozwiązania nazwy domenowej wpad.biuro.krakow.sekurak.local, powinna nastąpić próba „cofania się” o kolejne elementy nazwy, tj. powinna nastąpić próba rozwiązania nazw kolejno:

  • 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.

Rys 4. Wysłane żądanie NetBIOS o nazwę WPAD

Rys 4. Wysłane żądanie NetBIOS o nazwę WPAD

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:

  1. Jeżeli protokół żądania http jest inny niż „http” (np. https) – wówczas, żądanie przesyłane jest bezpośrednio.
  2. 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.
  3. 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!

Przypominamy, że przedstawione w artykule sposoby ataku podane są jedynie w celach edukacyjnych.

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:

  1. Nasz host musi mieć ustawioną nazwę WPAD w NetBIOS.
  2. Na porcie 80 musi zostać wystawiony plik /wpad.dat z konfiguracją proxy przekierowującą przez nasz serwer.
  3. 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”.

Rys 5. Przejście do edycji listenera

Rys 5. Przejście do edycji listenera

Rys 6. Aktywacja nasłuchiwania na wszystkich interfejsach

Rys 6. Aktywacja nasłuchiwania na wszystkich interfejsach

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.).

Rys 7. Polecenie ifconfig

Rys 7. Polecenie ifconfig

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.

Rys 8. Uruchomienie spoofera NBNS

Rys 8. Uruchomienie spoofera NBNS

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).

Rys 9. Konfiguracja modułu wpad

Rys 9. Konfiguracja modułu wpad

Rys 10. Podgląd żądań przechwyconych w Burpie

Rys 10. Podgląd żądań przechwyconych w Burpie

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

–Michał Bentkowski, prowadzi bloga, pracuje w Securitum.

Spodobał Ci się wpis? Podziel się nim ze znajomymi:



Komentarze

  1. marcin

    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.

    Odpowiedz
    • 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„.

      Odpowiedz
  2. Hoo

    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.

    Odpowiedz
  3. Jurek

    Dzięki za artykuł, fajnie i przejrzyście opisane.

    Odpowiedz
  4. Z

    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 ;).

    Odpowiedz
  5. Paweł

    U mnie ta opcja jest wyłączona, prawdopodobnie domyślnie. Nie przypominam sobie abym coś tam zmieniał.

    Odpowiedz
  6. Daniel

    Świetny artykuł, lekka ale treściwa lektura!

    Odpowiedz
  7. P4

    OT: czy te zamazane hexdumpy to jakiś wechall z deobfuskacji? generuj słownik i dopasowuj kolorkody xD

    Odpowiedz
  8. pabik

    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ę.

    Odpowiedz

Odpowiedz