Pyton

Zbuduj własny monitor sieci za pomocą PyShark

Zbuduj własny monitor sieci za pomocą PyShark

Istniejące narzędzia

Wiele narzędzi do analizy sieci istnieje od dłuższego czasu. Pod Linuksem są to np. Wireshark, tcpdump, nload, iftop, iptraf, nethogs, bmon, tcptrack oraz prędkościomierz i ettercap. Szczegółowy ich opis można znaleźć w porównaniu Silver Moon [1].

Dlaczego więc nie skorzystać z istniejącego narzędzia i zamiast tego napisać własne? Powody, które widzę, to lepsze zrozumienie protokołów sieciowych TCP/IP, nauka prawidłowego kodowania lub implementacja tylko określonej funkcji, której potrzebujesz w danym przypadku użycia, ponieważ istniejące narzędzia nie zapewniają tego, czego faktycznie potrzebujesz. Co więcej, poprawa szybkości i obciążenia aplikacji/systemu może również odgrywać rolę, która motywuje Cię do dalszego podążania w tym kierunku.

Na wolności istnieje wiele bibliotek Pythona do przetwarzania i analizy sieci. W przypadku programowania niskopoziomowego kluczem jest biblioteka gniazd [2]. Biblioteki oparte na protokołach wysokiego poziomu to httplib, ftplib, imaplib i smtplib. W celu monitorowania portów sieciowych i strumienia pakietów konkurencyjnych kandydatów wykorzystuje się python-nmap [3], dpkt [4] i PyShark [5]. Zarówno do monitorowania, jak i zmiany strumienia pakietów szeroko stosowana jest biblioteka scapy [6].

W tym artykule przyjrzymy się bibliotece PyShark i sprawdzimy, które pakiety docierają do określonego interfejsu sieciowego. Jak zobaczysz poniżej, praca z PyShark jest prosta. Dokumentacja na stronie projektu pomoże Ci w pierwszych krokach - dzięki niej bardzo szybko osiągniesz użyteczny efekt. Jednak jeśli chodzi o sedno sprawy, potrzebna jest większa wiedza.

PyShark potrafi dużo więcej, niż się wydaje na pierwszy rzut oka i niestety w chwili pisania tego tekstu istniejąca dokumentacja nie obejmuje tego w pełni. To sprawia, że ​​jest to niepotrzebnie trudne i stanowi dobry powód, aby zajrzeć głębiej pod maskę.

O PyShark

PyShark [8] to wrapper Pythona dla Tsharka [10]. Po prostu wykorzystuje swoją zdolność do eksportowania danych XML za pomocą ich parsowania. Sam Tshark jest wersją programu Wireshark z wiersza poleceń. Zarówno Tshark, jak i PyShark zależą od biblioteki Pcap, która faktycznie przechwytuje pakiety sieciowe i jest utrzymywana pod maską Tcpdump [7]. PyShark jest rozwijany i stale utrzymywany przez Dana (używa on nazwy KimiNewt na Twitterze).

Aby zapobiec ewentualnym nieporozumieniom, istnieje podobnie brzmiące narzędzie, Apache Spark [11], które jest zunifikowanym silnikiem analitycznym do przetwarzania danych na dużą skalę. Nazwa PySpark jest używana dla interfejsu Pythona do Apache Spark, którego tutaj nie omawiamy.

Instalowanie PySharka

PyShark wymaga zainstalowania zarówno biblioteki Pcap, jak i Tshark. Odpowiednie pakiety dla Debiana GNU/Linux 10 i Ubuntu noszą nazwę libpcap0.8 i tshark i można je skonfigurować w następujący sposób za pomocą apt-get:

Listing 1: Instalacja biblioteki Pcap i Tshark

# pip3 zainstaluj python-pyshark

Jeśli jeszcze nie zainstalowano, należy również dodać Python3 i Pip. Odpowiednie pakiety dla Debiana GNU/Linux 10 i Ubuntu noszą nazwy python3 i python3-pip i można je zainstalować w następujący sposób za pomocą apt-get:

Listing 2: Zainstaluj Python 3 i PIP dla Pythona 3

# apt-get zainstaluj python3 python3-pip

Teraz nadszedł czas, aby dodać PyShark. Z naszych badań wynika, że ​​PyShark nie jest jeszcze dostępny w żadnej większej dystrybucji Linuksa. Instalacja odbywa się za pomocą instalatora pakietów Pythona pip3 (pip dla Pythona 3) jako pakietu ogólnosystemowego w następujący sposób:

Listing 3: Zainstaluj PyShark za pomocą PIP

# pip3 zainstaluj python-pyshark

Teraz PyShark jest gotowy do użycia w skryptach Pythona w systemie Linux. Należy pamiętać, aby wykonać poniższe skrypty Pythona jako użytkownik administracyjny, na przykład przy użyciu sudo, ponieważ biblioteka Pcap nie pozwala na wyszukiwanie pakietów jako zwykły użytkownik.

Poniższa instrukcja dodaje zawartość modułu PyShark do przestrzeni nazw twojego skryptu Pythona:

Listing 4: Importuj moduł PyShark

importuj pysharka

Metody przechwytywania pakietów

Po wyjęciu z pudełka, PyShark jest wyposażony w dwa różne tryby, za pomocą których oferuje zbieranie pakietów z obserwowanego interfejsu sieciowego. Do ciągłego zbierania użyj metody LiveCapture(), a do zapisu do pliku lokalnego użyj metody FileCapture() z modułu PyShark. Wynikiem jest lista pakietów (obiekt iteratora Pythona), która umożliwia przeglądanie przechwyconych pakietów danych według pakietów. Poniższe zestawienia pokazują, jak korzystać z dwóch metod.

Listing 5: Użyj PyShark do przechwytywania z pierwszego interfejsu Wifi wlan0

importuj pysharka
przechwytywanie = pyshark.LiveCapture(interfejs='wlan0')

W przypadku poprzednich instrukcji przechwycone pakiety sieciowe są przechowywane w pamięci. Dostępna pamięć może być ograniczona, jednak przechowywanie przechwyconych pakietów w lokalnym pliku jest alternatywą. W użyciu jest format pliku Pcap [9]. Pozwala to na przetwarzanie i interpretację przechwyconych danych przez inne narzędzia, które są również połączone z biblioteką Pcap.

Listing 6: Użyj PyShark do przechowywania przechwyconych pakietów w lokalnym pliku

importuj pysharka
przechwytywanie = pyshark.FileCapture('/tmp/pakiety sieciowe.czapka')

Uruchamiasz listingi 5 i 6, nie masz jeszcze żadnych wyników. Następnym krokiem jest dokładniejsze zawężenie paczek do odbioru w oparciu o pożądane kryteria.

Wybieranie pakietów

Wprowadzony wcześniej obiekt przechwytywania nawiązuje połączenie z żądanym interfejsem. Następnie dwie metody sniff() i sniff_continuously() obiektu przechwytywania zbierają pakiety sieciowe. sniff() wraca do dzwoniącego, gdy tylko wszystkie żądane pakiety zostaną zebrane. W przeciwieństwie do tego, sniff_continuously() dostarcza pojedynczy pakiet do dzwoniącego zaraz po jego odebraniu. Pozwala to na transmisję na żywo ruchu sieciowego.

Ponadto obie metody pozwalają określić różne ograniczenia i mechanizm filtrowania paczek, na przykład liczbę paczek za pomocą parametru liczba_pakietów oraz okres w jakim paczki mają być zbierane za pomocą parametru timeout. Listing 7 pokazuje, jak zebrać 50 pakietów sieciowych, tylko jako strumień na żywo, przy użyciu metody sniff_continuously().

Listing 7: Zbierz 50 pakietów sieciowych z wlan0

importuj pysharka
przechwytywanie = pyshark.LiveCapture(interfejs='wlan0')
dla pakietu w przechwyceniu.sniff_continuously(liczba_pakietów=5):
drukuj (pakiet)

Różne szczegóły pakietu są widoczne za pomocą instrukcji print(packet) (patrz Rysunek 1).

Rysunek 1: zawartość opakowania

Na liście 7 zebrałeś wszystkie rodzaje pakietów sieciowych, bez względu na protokół lub port usługi. PyShark pozwala na zaawansowane filtrowanie, z wykorzystaniem tzw. filtra BPF [12]. Listing 8 pokazuje, jak zebrać 5 pakietów TCP przychodzących przez port 80 i wyświetlających typ pakietu. Informacje są przechowywane w atrybucie pakietu najwyższa_warstwa.

Listing 8: Tylko zbieranie pakietów TCP

importuj pysharka
przechwytywanie = pyshark.LiveCapture(interface='wlan0', bpf_filter='tcp port 80')
zdobyć.powąchać(liczba_pakietów=5)
drukuj (przechwytywanie)
dla pakietu w przechwyceniu:
drukuj (pakiet.najwyższa_warstwa)

Zapisz listing 8 jako plik tcp-sniff.py i uruchom skrypt Pythona. Dane wyjściowe są następujące:

Listing 9: Wynik Listingu 8

# python3 tcp-sniff.py

TCP
TCP
TCP
OCSP
TCP
#

Rozpakowywanie przechwyconych pakietów

Przechwycony obiekt działa jak rosyjska lalka Matroska - warstwa po warstwie, zawiera zawartość odpowiedniego pakietu sieciowego. Rozpakowywanie jest trochę jak Święta Bożego Narodzenia - nigdy nie wiesz, jakie informacje znajdziesz w środku, dopóki go nie otworzysz. Listing 10 pokazuje przechwycenie 10 pakietów sieciowych i ujawnienie typu protokołu, zarówno portu źródłowego, jak i docelowego oraz adresu.

Listing 10: Pokazywanie źródła i celu przechwyconego pakietu

importuj pysharka
czas importu
# zdefiniuj interfejs
interfejs sieciowy = "enp0s3"
# zdefiniuj obiekt przechwytywania
przechwytywanie = pyshark.LiveCapture (interfejs=interfejs sieci)
print("słuchanie na %s" % networkInterface)
dla pakietu w przechwyceniu.sniff_continuously(liczba_pakietów=10):
# dostosowane wyjście
próbować:
# pobierz znacznik czasu
czas lokalny = czas.asctime(czas.czas lokalny(czas.czas()))
# pobierz zawartość pakietu
protokół = pakiet.warstwa_transportowa # 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)" % (czas lokalny, 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, pojedynczą linię na odebrany pakiet. Każda linia zaczyna się od znacznika czasu, po którym następuje źródłowy adres IP i port, następnie docelowy adres IP i port, a na końcu rodzaj protokołu sieciowego.


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

Wniosek

Budowanie własnego skanera sieciowego nigdy nie było łatwiejsze niż to. Opierając się na fundamentach Wireshark, PyShark oferuje kompleksową i stabilną platformę do monitorowania interfejsów sieciowych Twojego systemu w sposób, w jaki tego potrzebujesz.

Linki i referencje

  • [1] Silver Moon: 18 poleceń do monitorowania przepustowości sieci na serwerze Linux, https://www.binarny.com/linux-commands-monitor-network/
  • [2] Biblioteka gniazd Pythona, https://docs.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/projekt/pyshark/
  • [6] scapy, https://pypi.org/projekt/scapy/
  • [7] Tcpdump i libpcap, http://www.tcpdump.organizacja/
  • [8] PyShark, witryna projektu, http://kiminewt.github.io/pyshark/
  • [9] Format pliku Libpcap, Wireshark Wiki, https://gitlab.com/wireshark/wireshark/-/wikis/Development/LibpcapFileFormat
  • [10] Tshark, https://www.Wireshark.org/docs/man-pages/tshark.html
  • [11] Apache Spark, https://spark.Apache.organizacja/
  • [12] Filtr BPF, https://wiki.Wireshark.org/CaptureFilters
Gry How to Show FPS Counter in Linux Games
How to Show FPS Counter in Linux Games
Linux gaming got a major push when Valve announced Linux support for Steam client and their games in 2012. Since then, many AAA and indie games have m...
Gry How to download and Play Sid Meier's Civilization VI on Linux
How to download and Play Sid Meier's Civilization VI on Linux
Introduction to the game Civilization 6 is a modern take on the classic concept introduced in the series of the Age of Empires games. The idea was fai...
Gry How to Install and Play Doom on Linux
How to Install and Play Doom on Linux
Introduction to Doom The Doom Series originated in the 90s after the release of the original Doom. It was an instant hit and from that time onwards th...