Podsłuchiwanie formularzy w Internecie

Materiał przerabiany przez uczniów Zespołu Szkół Publicznych nr 1 STO im. Rotmistrza Witolda Pileckiego
w roku szkolnym 2016/17.

UWAGA: W czasie CAŁEGO semestru będziemy używać programu (sniffera) Wireshark
Program Wireshark dostępny jest na tej stronie: https://www.wireshark.org/#download. Są wersje na każdy system operacyjny (włącznie z OS X).


Znalezienie i zbadanie działania formularza

Większość serwisów wspomaga algorytm HTTPS, jednak czasem możliwe jest wymuszenie braku szyfrowania poprzez "zabranie" litery "s" z paska adresu i przeładowanie strony

uruchomienie wersji http (usuniecie litery 's')

Klikamy prawym klawiczem na obszar pola tekstowego i wybieramy opcję "zbadaj element"/"inspect"/"Inspect Element" lub podobną.
Jeżeli zaznaczyliśmy pole formularza musimy "przejść" kilka poziomów wyżej aby odnaleźć znacznik "FORM" i jego atrybut "action". Atrybut ten przechowuje adres (URL), pod który wysłany zostanie nasz formularz (wszystkie pola tekstowe, zaznaczone opcje itp). W naszym przypadku informacja zostanie wysłana na adres "/search" ("http://www.bing.com/search"). Adresu tego będziemy szukać w logach sniffera.

Znacznik FORM w kodzie html (po prawej) i obszar aktywny na stronie (po lewej)

Po włączeniu łapania pakietów (ikona płetwy - trzecia od lewej) w snifferze Wireshark wpisujemy dowolny napis (w tym przypadku "samolot") i klikamy w formularz. Następnie wyłączamy łapanie pakietów (ikona czerwonego kwadratu - czwarta od lewej).
Dla szybszego wyszukiwania wpisujemy filtr "http" w pole filtrów sniffera. Szukamy adresu, który był ustawiony w znaczniku "FORM" ("/search").

Zaznaczone ikony startu i stopu łapania pakietów oraz znaleziony pakiet (numer 13)

Po zaznaczeniu pakietu w dolnej części ekranu rozwijamy odpowiedni protokół (http) i czytamy co dokładnie wysyła nasz komputer do serwera.
Nasze słowo kluczowe "samolot" zostało przekazane w parametrze o nazwie 'q'. Dodatkowo wysłane zostały inne informacje, które dla niektórych serwisów pozwalają na dodatkowe zmiany parametrów szukania. Znaczenie parametrów niestety nie zawsze jest wyjaśnione.

Rozwinięta sekcja protkołu http i zaznaczone dane, które wysyła formularz (z naszym słowem kluczowym)

Utworzenie własnego formularza i przekierowanie na inny serwer

Zaznaczamy fragment kodu HTML, który odpowiada za wyświetlenie oraz wysłanie formularza.

Fragment kodu HTML (znacznik 'FORM')

Wklejamy kod do nowego dokumentu HTML (sniffer_formularz.html) a następnie zmieniamy atrybut "action" w znaczniku "FORM". Adres, na który wysłamy formularz to: http://users.pja.edu.pl/~kaszubat/superszkola/podsluch.php

Treść pliku sniffer_formularz.html ze zmienionym atrybutem 'action'

Plik podsluch.php jest prostym programem w języku skryptowym PHP. Umieszczony jest na serwerze obsługującym skrypty PHP i jest dostępny z sieci Internet.

Treść pliku podsluch.php

<?php
//parametr szukania jest w zmiennej
//$_GET["q"]

header('Location: http://www.bing.com/search?q='.$_GET["q"].' podsluchalem');
?>

Program odbiera formularz, i zmienia nagłówek "Location" powodując przeładowanie strony w przeglądarce. Adres podmieniamy na właściwą lokalizację (http://www.bing.com/search), parametr zapytania 'q' zostaje zmieniony. poprzez znak kropki dodajemy do parematru zapytania $_GET["q"] napis "podsluchalem'. Oczywiście kod pozbawiony jest jakiejkolwiek metody zapisu parametru, ale można w łatwy sposób dołożyć zapis do pliku lub do bazy danych.

Widok formularza w przeglądarce

Formularz pozbawiony reszty strony internetowej (stylów, grafiki i tekstu) prezentuje się niezbyt okazale. Pozostało tylko miejsce do wpisania tekstu do wyszukania oraz przycisk wysyłania.

Formularz przed wysłaniem zapytania

Po wpisaniu zapytania i zatwierdzeniu go następuje wysłanie do serwera ze skryptem podsłuch.php zamiast do serwera bing.com .
Skrypt PHP modyfikuje zapytanie i odsyła z powrotem do przeglądarki prawdziwą lokalizację serwera (ale zapytanie już ma dodany nasz napis "podsłuchałem").

Wynik wyszukiwania zapytania 'samolot' z dopisanym przez skrypt dodatkowym napisem

Przeglądarka automatycznie przeładowuje stronę. Jedyną rzecz, którą widzi użytkownik to zmodyfikowane oryginalne zapytanie. Jeżeli nie zrobimy żadnej modyfikacji, tylko odeślemy zapytanie bez zmian, użytkownik nie ma szans zauważyć faktu, że braliśmy udział w komunikacji (oczywiście jeżeli użyje sniffera widać dodatkowe wysłanie informacji na nasz serwer ze skryptem php).
Możemy oczywiście podmienić całą stronę startową serwisu bing zapisując stronę na dysku jako plik Bing.html.
Poniżej screenshot formularza skopiowanego ze strony. Jak widać wygląda całkiem podobnie do oryginału.

Strona serwisu bing zapisana i uruchomiona z dysku komputera (lokalnie)

Musimy zlokalizować miejsce formularza i zmodyfikować atrybut "action" wpisując adres naszego skryptu php.

Treść pliku Bing.html ze zmienionym atrybutem 'action'

Po uruchomieniu sniffera możemy podsłuchać jaka informacja faktycznie zostaje wysłana przez przeglądarkę i do kogo. Widać dokładnie jak przeglądarka komunikuje się z kolejnymi serwerami. Opisując od góry:
Pakiet nr 37: Zapytanie GET (wysłanie formularza) na podmieniony przez nas adres. Jak widać widać nasze zapytanie w parametrze "q"
Pakiet nr 39: Odpowiedź naszego skryptu z kodem 302 Moved Temporarily (tymczasowa zmiana adresu). Użytkownik nie jest o tym informowany w żaden sposób, przeglądarka po prostu wysyła formularz w inne miejsce
Pakiet nr 47: Wysłanie zmodyfikowanego formularza do komputera bing (właściwego)
Pakiet nr 93: Odbiór strony z wynikiem zapytania

Pakiety widoczne w komunikacji przeglądarki z serwerami

Jak widzimy w kolumnie "Time" różnica czasu między ostatnim zapytaniem (0.372 ms) i pierwszym (0.039ms) trwa jedną trzecią sekundy, także użytkownik nie zorientuje się, "że coś się dzieje".


Ukrycie komunikacji między naszym serwerem a przeglądarką.