Budowanie własnego monitora sieci za pomocą Pyshark

Budowanie własnego monitora sieci za pomocą Pyshark

Istniejące narzędzia

Od dłuższego czasu istnieje wiele narzędzi do analizy sieci. Na przykład pod Linux są to Wireshark, TCPDump, Nload, IFTOP, IPTRAF, Nethogs, BMON, TCPTRACK, a także prędkościomierza i Ettercap. Aby uzyskać szczegółowy opis, możesz rzucić okiem na porównanie Silver Moon [1].

Dlaczego więc nie użyć istniejącego narzędzia i napisz własnego, zamiast tego? Powody, dla których widzę, lepiej rozumieją protokoły sieci TCP/IP, uczenie się, jak prawidłowo kodować lub wdrażanie tylko konkretnej funkcji potrzebnej do użytku, ponieważ istniejące narzędzia nie dają ci tego, czego faktycznie potrzebujesz. Ponadto ulepszenia prędkości i obciążenia w aplikacji/systemie mogą również odgrywać rolę, która motywuje do poruszania się w tym kierunku.

Na wolności istnieje kilka bibliotek Python do przetwarzania i analizy sieciowej. Do programowania niskiego poziomu biblioteka gniazd [2] jest kluczem. Biblioteki oparte na protokole wysokiego poziomu to HTTPLIB, FTPLIB, IMAPLIB i SMTPLIB. W celu monitorowania portów sieciowych i konkurencyjnych kandydatów na strumień pakietu są używane Python-Nmap [3], DPKT [4] i Pyshark [5]. Zarówno do monitorowania, jak i zmiany strumienia pakietu, biblioteka SCapy [6] jest szeroko stosowana.

W tym artykule przyjrzymy się bibliotece Pyshark i monitorowanie, które pakiety osiągają określony interfejs sieciowy. Jak zobaczysz poniżej, praca z Pyshark jest prosta. Dokumentacja na stronie internetowej projektu pomoże Ci w pierwszych krokach - dzięki niej bardzo szybko osiągniesz użyteczny wynik. Jednak jeśli chodzi o drobiazgowe, konieczne jest więcej wiedzy.

Pyshark może zrobić o wiele więcej, niż się wydaje na pierwszy rzut oka, i niestety w chwili pisania tego tekstu istniejąca dokumentacja nie obejmuje tego w całości. To sprawia, że ​​niepotrzebnie jest trudne i stanowi dobry powód, aby spojrzeć głębiej pod maską.

O PYSHARK

Pyshark [8] to opakowanie Pythona dla TShark [10]. Po prostu wykorzystuje swoją zdolność do eksportowania danych XML za pomocą jego parsingu. Sam TShark to wersja wiersza polecenia Wireshark. Zarówno TShark, jak i Pysshark zależą od biblioteki PCAP, która faktycznie przechwytuje pakiety sieciowe i jest utrzymywane pod maską TCPDump [7]. Pyshark jest opracowywany i stale utrzymywany przez Dan (używa nazwy Kiminewt na Twitterze).

Aby zapobiec możliwym zamieszaniu, istnieje podobnie brzmiące narzędzie, Apache Spark [11], które jest ujednoliconym silnikiem analitycznym do przetwarzania danych na dużą skalę. Nazwa PYSPARK jest używana do interfejsu Pythona do Apache Spark, którego nie omawiamy tutaj.

Instalowanie Pyshark

Pyshark wymaga zainstalowania zarówno biblioteki PCAP, jak i TShark. Odpowiednie pakiety dla Debian GNU/Linux 10 i Ubuntu nazywane są libpcap0.8 i TShark i można je skonfigurować w następujący sposób za pomocą apt-get:

Lista 1: Instalowanie biblioteki PCAP i TSHARK

# PIP3 Zainstaluj Python-Pytshark

Jeśli jeszcze nie zainstalowane, należy też dodać Python3 i Pip. Odpowiednie pakiety dla Debian GNU/Linux 10 i Ubuntu nazywane są Python3 i Python3-Pip i można je zainstalować w następujący sposób za pomocą Apt-Get:

Lista 2: Zainstaluj Python 3 i PIP dla Python 3

# apt-get instal Python3 Python3-Pip

Teraz nadszedł czas, aby dodać Pyshark. Na podstawie naszych badań Pytshark nie jest jeszcze pakowany dla żadnej dużej dystrybucji Linuksa. Instalacja odbywa się przy użyciu instalatora pakietu Python PIP3 (PIP dla Python 3) jako pakietu całego systemu w następujący sposób:

Lista 3: Zainstaluj Pyshark za pomocą PIP

# PIP3 Zainstaluj Python-Pytshark

Teraz Pyshark jest gotowy do użycia w skryptach Python w systemie Linux. Uwaga, aby wykonać skrypty Python poniżej jako użytkownik administracyjny, na przykład za pomocą Sudo, ponieważ biblioteka PCAP nie pozwala na poszukiwanie pakietów jako zwykłego użytkownika.

Poniższe stwierdzenie dodaje zawartość modułu Pyshark do przestrzeni nazw twojego skryptu Python:

Lista 4: Zaimportuj moduł Pyshark

Import Pyshark

Metody przechwytywania pakietów

Po wyjęciu z pudełka Pyshark jest wyposażony w dwa różne tryby, z którymi oferuje zbieranie pakietów z obserwowanego interfejsu sieciowego. Do ciągłego gromadzenia użyj metody LiveCapture () i zapisywania w pliku lokalnym, użyj metody FiCapture () z modułu Pyshark. Rezultatem jest lista pakietów (obiekt Python iterator), który pozwala przejść przez pakiet przechwyconego danych według pakietu. Poniższe listy pokazują, jak używać dwóch metod.

Lista 5: Użyj Pyshark, aby przechwytywać z pierwszego interfejsu Wi -Fi WLAN0

Import Pyshark
Capture = Pyshark.Livecapture (interfejs = „Wlan0”)

W przypadku poprzednich stwierdzeń przechwycone pakiety sieciowe są przechowywane w pamięci. Dostępna pamięć może być jednak ograniczona, przechowywanie przechwyconych pakietów w pliku lokalnym jest alternatywą. W użyciu jest format pliku PCAP [9]. Pozwala to przetwarzać i interpretować przechwycone dane według innych narzędzi, które są również połączone z biblioteką PCAP.

Lista 6: Użyj Pyshark, aby przechowywać przechwycone pakiety w pliku lokalnym

Import Pyshark
Capture = Pyshark.Filecapture ('/TMP/NetworkPackages.czapka')

Uruchamiając oferty 5 i 6, nie będziesz jeszcze mieć wyjścia. Następnym krokiem jest zawęzienie pakietów, które zostaną zebrane dokładniej na podstawie pożądanych kryteriów.

Wybieranie pakietów

Wcześniej wprowadzony obiekt przechwytywania ustanawia połączenie z pożądanym interfejsem. Następnie dwie metody Sniff () i Sniff_Contouss () obiektu przechwytywania zbierają pakiety sieciowe. Sniff () wraca do dzwoniącego, gdy tylko wszystkie żądane pakiety zostaną zebrane. Natomiast Sniff_contouss () dostarcza pojedynczy pakiet dzwoniącego, gdy tylko został zebrany. Umożliwia to strumień na żywo ruchu sieciowego.

Ponadto te dwie metody pozwalają określić różne ograniczenia i mechanizm filtrowania pakietów, na przykład liczba pakietów za pomocą parametrów packet_count i okres, w którym pakiety mają być gromadzone za pomocą czasu parametru czasu. Listing 7 pokazuje, jak zbierać 50 pakietów sieciowych tylko jako strumień na żywo, przy użyciu metody Sniff_contouss ().

Lista 7: Zbierz 50 pakietów sieciowych z WLAN0

Import Pyshark
Capture = Pyshark.Livecapture (interfejs = „Wlan0”)
do pakietu w przechwytywaniu.Sniff_Contously (pakiet_count = 5):
Drukuj (pakiet)

Różne szczegóły pakietów są widoczne przy użyciu instrukcji drukuj (pakiet) (patrz rysunek 1).

Rysunek 1: Treść pakietu

Na liście 7 zebrałeś wszelkiego rodzaju pakiety sieciowe bez względu na protokół lub port serwisowy. PYSHARK umożliwia wykonanie zaawansowanego filtrowania za pomocą tak zwanego filtra BPF [12]. Listing 8 pokazuje, jak zbierać 5 pakietów TCP przybywających przez port 80 i drukuje typ pakietu. Informacje są przechowywane w atrybucie pakietu najwyższej klasy.

Lista 8: Zbieranie pakietów TCP tylko

Import Pyshark
Capture = Pyshark.Livecapture (interfejs = „Wlan0”, BPF_FILTER = „Port TCP 80 ')
schwytać.Sniff (Packet_Count = 5)
Drukuj (przechwytywanie)
Do pakietu w przechwytywaniu:
Drukuj (pakiet.najwyższy)

Zapisz listę 8, jako plik tcp-sniff.PY i uruchom skrypt Python. Wyjście jest następujące:

Lista 9: Wyjście listy 8

# Python3 Tcp-Sniff.py

TCP
TCP
TCP
OCSP
TCP
#

Rozpakowanie przechwyconych pakietów

Zabryczony obiekt działa jako rosyjska lalka Matroska - warstwa po warstwie, zawiera zawartość odpowiedniego pakietu sieciowego. Rozpakowanie przypomina trochę Boże Narodzenie - nigdy nie wiesz, jakie informacje znajdujesz w środku, dopóki ich nie otworzyłeś. Listing 10 pokazuje przechwytywanie 10 pakietów sieciowych i ujawnienie typu protokołu, zarówno portu i adresu źródłowego, jak i docelowego.

Lista 10: Pokazanie źródła i miejsca docelowego przechwyconego pakietu

Import Pyshark
czas importu
# Zdefiniuj interfejs
Networkinterface = "ENP0S3"
# Zdefiniuj obiekt przechwytywania
Capture = Pyshark.LiveCapture (interface = Networkinterface)
Drukuj („słuchanie na % s” % Networkinterface)
do pakietu w przechwytywaniu.Sniff_Contously (pakiet_count = 10):
# Dostosowane wyjście
próbować:
# Zdobądź znacznik czasu
LocalTime = czas.Asctym (czas.czas lokalny (czas.czas()))
# Pobierz zawartość pakietów
protokół = pakiet.Transport_layer # typ protokołu
src_addr = pakiet.ip.SRC # adres źródłowy
src_port = pakiet [protokół].Srcport # Port źródłowy
dst_addr = pakiet.ip.DST # Adres docelowy
dst_port = pakiet [protokół].DSTPORT # port docelowy
# Informacje o pakiecie wyjściowym
Drukuj („%s ip%s:%s%s:%s (%s)”%(LocalTime, src_addr, src_port, DST_ADDR, DST_PORT, protokół)))
z wyjątkiem AttributeError jako e:
# Ignoruj ​​pakiety inne niż TCP, UDP i IPv4
przechodzić
Drukuj („”)

Skrypt generuje dane wyjściowe, jak pokazano na rysunku 2, pojedynczy wiersz na odebrany pakiet. Każda linia zaczyna się od znacznika czasu, a następnie źródłowego adresu IP i portu, a następnie docelowego adresu IP i portu, a na koniec typu protokołu sieciowego.


Rysunek 2: Źródło i miejsce docelowe dla przechwyconych pakietów

Wniosek

Budowanie własnego skanera sieciowego nigdy nie było łatwiejsze niż to. W oparciu o fundamenty Wireshark, Pyshark oferuje kompleksowe i stabilne ramy do monitorowania interfejsów sieciowych systemu w sposób, w jaki go potrzebujesz.

Linki i referencje

  • [1] Silver Moon: 18 poleceń do monitorowania przepustowości sieci na serwerze Linux, https: // www.Binarytydes.com/Linux-Commands-Monitor-Network/
  • [2] Python Socket Library, https: // dokumenty.pyton.org/3/biblioteka/gniazdo.html
  • [3] Python-nmap, https: // pypi.org/projekt/python3-nmap/
  • [4] DPKT, https: // pYPI.org/projekt/dpkt/
  • [5] Pyshark, https: // pypi.Org/Project/Pyshark/
  • [6] Scapy, https: // pYPI.Org/Project/Scapy/
  • [7] tcpdump i libpcap, http: // www.TCPDUMP.org/
  • [8] Pyshark, strona internetowa projektu, http: // Kiminewt.github.IO/PYSHARK/
  • [9] Format pliku libpcap, Wireshark Wiki, https: // gitlab.com/wireshark/wireshark/-/wiki/development/libpcapfileformat
  • [10] TShark, https: // www.Wireshark.Org/Docs/Man-Pages/TShark.html
  • [11] Apache Spark, https: // iskra.Apache.org/
  • [12] BPF Filtr, https: // wiki.Wireshark.org/capturefilters