netvu-Netview/README.md
2021-01-31 13:53:41 +01:00

319 lines
11 KiB
Markdown

# Projekt magisterski - skaner ruchu bezprzewodowego sieci 802.11
# Autor - Wojciech Pakulski - s426211
# Podprojekty - netvu i Netview
1. netvu - skaner sieciowy, analizator plików PCAP, serwer HTTP
2. Netview - nakładka graficzna umożliwiająca interakcję z modułem serwera HTTP netvu
## Dokumentacja - netvu
### Opis
Program netvu jest aplikacją konsolową napisaną pod system Linux. Aplikacja wejściowa służy jako
pośrednik, który przekazuje odpowiednie parametry do dostępnych modułów. Przed procesem budowania
programu użytkownik może wybrać, które z modułów będą dostępne. Proces budowania i wymagane
zależności są zapisane w odpowiednich plikach `CMakeLists.txt`.
Po uruchomieniu programu bez podania parametrów bądź z flagą `-h`/`--help` ukazane zostaną
dostępne opcje i domyślne argumenty:
```
Allowed options:
-h [ --help ] print usage information and exit
-c [ --config ] arg (=netvu.conf) alternative config file
Configuration:
-m [ --mode ] arg runtime mode - scanner/analyzer/server
Scanner:
-i [ --scanner.interface ] arg wireless interface
-C [ --scanner.channels ] arg space separated 802.11 channels numbers
-M [ --scanner.max_packets ] arg (=0) packet capture limit
-l [ --scanner.log_dir ] arg (=log) where to save captured packets
-I [ --scanner.channel_hop_interval ] arg (=300)
channel hop interval in milliseconds
Analyzer:
-L [ --analyzer.log_dir ] arg (=log) where captured packets are stored
-D [ --analyzer.database_dir ] arg (=db)
where to save analisys result
Server:
-a [ --server.address ] arg (=0.0.0.0)
listening address
-p [ --server.port ] arg (=9000) listening port
-d [ --server.database_dir ] arg (=db)
where analisys result is stored
-o [ --server.cors ] arg (=*) access control allow origin
```
Argumenty nie muszą być podawane wyłącznie z poziomu terminala. Netvu postara się odczytać
także wartości z pliku konfiguracyjnego `netvu.conf`, jeśli taki istnieje. Użytkownik może
podać inną ścieżkę do pliku konfiguracyjnego przez parametr `-c`/`--config`.
Przykładowy plik konfiguracyjny wygląda następująco:
```
mode=scanner
[scanner]
max_packets=2000
[analyzer]
log_dir=pcaps
database_dir=/home/x/my_db
```
Parametr `-m`/`--mode` ustala tryb w jakim netvu zostanie uruchomiony. W przypadku próby
uruchomienia trybu, który nie został dołączony w procesie budowania, zostanie zwrócony błąd.
Dokładniejszy opis każdego z dostępnych parametrów zostanie opisany w sekcjach poświęconych
danemu modułowi.
### Budowanie
Do zbudowania wszystkich modułów wymagane są następujące narzędzia i biblioteki:
* Kompilator obsługujący C++17
* CMake 3.16
* libtins
* Boost >=1.7
* SQLite3
* nlohmann_json
* Biblioteka wątków (Threads)
Przykładowy proces zbudowania projektu może wyglądać następująco:
```
$ mkdir netvu/bin
$ cd netvu/bin
$ cmake ../src
$ cmake --build .
```
### Moduł skanera sieciowego
#### Opis
Moduł skanera składa się z kilku funkcji - nie jest nią jedynie sniffowanie ruchu Wi-Fi. Do jego
zadań należy również zapisywanie przechwyconych pakietów do plików i
przełączanie kanałów. Ponadto, w jego skład wchodzą również funkcje pomocnicze, są to:
1. Wyszukiwanie domyślnego interfejsu karty bezprzewodowej.
2. Sprawdzanie obecności enkapsulacji RadioTap.
3. Włączanie/wyłączanie trybu Monitor na czas działania skanera.
4. Odszukanie dostępnych kanałów na danym interfejsie.
Nie wszystkie zadania muszą być wykonywane po uruchomieniu skanera. Część zadań może być całkowicie
pominięta w zależności od parametrów podanych przez użytkownika. Większość zadań jest wykonywana
synchronicznie, wyjątkiem są sniffowanie pakietów i przełączanie kanałów, które są podzielone na
dwa osobne wątki.
Spośród pozostałych modułów jest to
jedyny, który musi zostać uruchomiony z podwyższonymi uprawnieniami np. poprzez `sudo`.
#### Parametry
* `interface` - określa, który interfejs sieciowy zostanie wykorzystany do skanowania .
* `channels` - oddzielone spacją numery kanałów po których interfejs będzie się przełączać.
W przypadku nie podania wartości lub wartości 0 netvu postara się automatycznie wykryć listę
dostępnych kanałów na danym interfejsie. Zostaną wówczas wykorzystane wszystkie wykryte kanały.
* `max_packets` - określa, po ilu pakietach skanowanie zostanie przerwane. W przypadku nie podania
wartości lub wartości 0 skanowanie będzie trwało do momentu przerwania przez użytkownika.
* `log_dir` - katalog do którego zostanie zapisany wynik skanowania w formacie pcap.
* `channel_hop_interval` - podawany w milisekundach czas po którym netvu będzie przełączać kanały.
#### Wymagania
* Bezprzewodowa karta sieciowa i sterownik z obsługą trybu Monitor
* Podwyższone uprawnienia systemowe
* Obecność następujących programów:
1. `ip` - w celu wykrycia obecności enkapsulacji RadioTap na karcie sieciowej
2. `ifconfig` - w celu włączania/wyłączania interfejsu karty
3. `iwconfig` - w celu przełączania między trybami Managed/Monitor na czas uruchomienia
programu, wyszukiwaniu interfejsów bezprzewodowych oraz przełączaniu kanałów
4. `iwlist` - w celu wykrycia dostępnych kanałów
#### Przykład
Wywołanie bez podania konkretnego interfejsu, skanowanie jedynie kanałów 1,6 i 12 z interwałem
przełączania kanału co pół sekundy i limitem 300 pakietów.
Przed wywołaniem programu na interfejsie WLAN włączony był tryb Managed.
```
% sudo ./netvu --scanner.channels 1 6 12 --scanner.max_packets 300 --scanner.channel_hop_interval 500 --mode scanner
Starting scanner
lo no wireless extensions.
enp11s0 no wireless extensions.
enp12s0 no wireless extensions.
br-06884e076801 no wireless extensions.
docker0 no wireless extensions.
Using wlp9s0
Turning wlp9s0 down
Enabling Monitor mode
Turning wlp9s0 up
Packet: 1/300
Packet: 2/300
Packet: 3/300
Packet: 4/300
Packet: 5/300
...
Packet: 298/300
Packet: 299/300
Packet: 300/300
Turning wlp9s0 down
Enabling Managed mode
Turning wlp9s0up
All done
```
#### Budowanie
Do zbudowania modułu skanera wymagane są następujące komponenty:
* Boost (thread, filesystem, system)
* libtins
* Threads
### Moduł analizatora
#### Opis
Zadaniem analizatora jest iteracja po wszystkich plikach pcap z danego katalogu utworzonych przez
skaner i wyciągnięcie z nich konkretnych danych. Wśród tych danych należą m. in. adresy MAC,
połączenia między urządzeniami i ilość przesłanych pakietów między hostami, średnia siła sygnału
czy interwały w których wykryto ruch z lub do danego urządzenia. Wszystkie dane wyciągnięte z
plików są
umieszczane w pamięciowej bazie danych SQLite, która jest zrzutowana do pliku po zakończeniu pracy
modułu.
### Przykład
Wywołanie modułu z domyślnymi parametrami:
```
% ./netvu --mode analyzer
Starting analyzer
Adding hosts..Done
Adding connections..Done
Adding host info..Done
Adding packet types..Done
Adding timestamps..Done
Adding scanning times..Done
% ls db
2021-01-31_13-30-01.sqlite
```
#### Kompilacja
Do skompilowania modułu analizatora wymagane są następujące komponenty:
* SQLite3
* libtins
* Threads
### Moduł serwera
#### Opis
Moduł ten pełni funkcję lekkiego serwera HTTP udostępniającego dane w formacie JSON z najnowszej
bazy SQLite wygenerowanej przez moduł analizatora. Serwer asynchronicznie otwiera połączenia po
otrzymaniu odpowiedniej metody HTTP. Serwer nie umożliwia modyfikacji bazy, jego zadaniem jest
jedynie pobieranie danych na żądanie i przesyłanie ich do klienta. W razie potrzeby istnieje
możliwość ustawienia innych parametrów nasłuchiwania i odczytu danych z innego katalogu.
#### Parametry
* `address` - adres, pod którym serwer będzie nasłuchiwał nadchodzących połączeń
* `port` - port, pod którym serwer będzie nasłuchiwał nadchodzących połączeń
* `database_dir` - katalog, w którym zawarte są pliki sqlite wygenerowane przez analizator
* `cors` - URI, na które serwer będzie odpowiadał
#### Budowanie
Do zbudowania modułu serwera wymagane są następujące komponenty:
* Boost (thread)
* SQLite3
* nlohmann_json
* Threads
## Dokumentacja - Netview
### Opis
Netview jest aplikacją internetową za pomocą której można interaktywnie obejrzeć wyniki
modułu analizatora netvu. Do komunikacji z netvu nie jest potrzebny serwer proxy - Netview można
uruchomić lokalnie otwierając plik `index.html` w przeglądarce. Aplikacja postara się automatycznie
załadować z serwera dane o hostach po jej uruchomieniu. Domyślnie Netview będzie próbować się
połączyć z serwerem na adresie lokalnym i porcie 9000. Adres ten można zmienić w widoku ustawień,
a po jego zmianie dane zostaną pobrane automatycznie.
Aplikacja składa się z:
1. Interaktywnego grafu w którym widoczne są wykryte urządzenia, połączenia a także natężenie ruchu
między urządzeniami. W widoku tym można przełączać wyświetlanie danych elementów
* Odległość wierzchołków od skanera jest wyliczona na podstawie średniej
arytmetycznej wykrytych sił sygnału (dBm).
* Grubość krawędzi jest zależna od ilości przesłanych pakietów w daną stronę. Można dzięki temu
łatwiej stwierdzić, czy dany host pełni funkcję punktu dostępowego.
* Szczegółowe informacje o urządzeniach w kolejnych zakładkach dostępne są po
zaznaczeniu wierzchołków.
* W celu ułatwienia analizy możliwe jest przemieszczanie wierzchołków.
![Graf sieci](./doc-img/graph.png)
2. Widok statystyk składający się z wykresów sumy wysłanych, odebranych i transmitowanych pakietów.
![Statystyki](./doc-img/stats.png)
3. Widok szczegółów urządzeń oraz wykrytych SSID wraz z powiązanymi z nimi punktami dostępowymi.
W widoku szczegółów dostępne są informacje takie jak:
1. Adres MAC
1. Liczba pakietów z/do danego hosta
3. Powiązany adres BSSID i SSID
4. Partnerzy z którymi host nawiązał połączenie
5. Wykres dostępności urządzenia - punkty w czasie, w których wykryto ruch z/do urządzenia
![Info](./doc-img/host_info.png)
![Punkty dostępu](./doc-img/aps.png)
4. Widoku informacji ogólnych, w którym zawarty jest wykres liczby pakietów danego typu, a także
przedziały czasowe w którym rozpoczęto i zakończono skanowanie
![Ogólne](./doc-img/overall.png)
Jeśli istnieje potrzeba zmiany adresu serwera, można to zrobić klikając w przycisk ustawień
dostępnym na pasku nawigacji. Po jego kliknięciu otworzy się okienko zmiany adresu.
![Zmiana adresu](./doc-img/disconnected.png)
### Wymagania
* Do pobrania danych konieczny jest uruchomiony moduł serwera netvu.
* Przeglądarka internetowa.
### Budowanie - wymagania
W celu zbudowania Netview z kodu źródłowego konieczna jest instalacja Vue CLI (Vue.js 3).
Do poprawnego zbudowania należy także pobrać zależności projektu zawarte w pliku `package.json`.
Następnie, należy wykonać polecenie `npm run build`. Zostanie wówczas wygenerowany katalog dist
zawierający gotową aplikację.