Bygge din egen nettverksmonitor med Pyshark

Bygge din egen nettverksmonitor med Pyshark

Eksisterende verktøy

Mange verktøy for nettverksanalyse har eksistert i ganske lang tid. Under Linux, for eksempel, er dette Wireshark, Tcpdump, Noad, Iftop, IpTraf, Nethogs, Bmon, TCPTrack samt speedometer og ettercap. For en detaljert beskrivelse av dem, kan du se på Silver Moons sammenligning [1].

Så hvorfor ikke bruke et eksisterende verktøy, og skriv ditt eget, i stedet? Årsaker til at jeg ser er en bedre forståelse av TCP/IP -nettverksprotokoller, lære å kode riktig, eller implementere bare den spesifikke funksjonen du trenger for brukssaken din fordi de eksisterende verktøyene ikke gir deg det du faktisk trenger. Videre kan hastighet og belastningsforbedringer på applikasjonen/systemet også spille en rolle som motiverer deg til å bevege deg mer i denne retningen.

I naturen eksisterer det ganske flere Python -biblioteker for nettverksbehandling og analyse. For programmering på lavt nivå er socketbiblioteket [2] nøkkelen. Protokollbaserte biblioteker på høyt nivå er HTTPLIB, FTPLIB, IMAPLIB og SMTPLIB. For å overvåke nettverksporter og konkurransedyktige kandidater. For både overvåking og endring av pakkestrømmen er Scapy Library [6] mye i bruk.

I denne artikkelen vil vi se på Pyshark -biblioteket og overvåke hvilke pakker som kommer til et spesifikt nettverksgrensesnitt. Som du vil se nedenfor, er det greit å jobbe med Pyshark. Dokumentasjonen på prosjektnettstedet vil hjelpe deg for de første trinnene - med det vil du oppnå et brukbart resultat veldig raskt. Men når det gjelder den pusete, er mer kunnskap nødvendig.

Pyshark kan gjøre mye mer enn det virker ved første blikk, og dessverre, på dette tidspunktet, dekker ikke den eksisterende dokumentasjonen det i sin helhet. Dette gjør det unødvendig vanskelig og gir en god grunn til å se dypere under panseret.

Om Pyshark

Pyshark [8] er en Python -innpakning for Tshark [10]. Den bruker ganske enkelt sin evne til å eksportere XML -data ved hjelp av parsing. Tshark i seg selv er kommandolinjeversjonen av Wireshark. Både Tshark og Pyshark er avhengige av PCAP -biblioteket som faktisk fanger nettverkspakker og opprettholdes under panseret til TCPDump [7]. Pyshark er utviklet og kontinuerlig vedlikeholdt av Dan (han bruker navnet Kiminewt på Twitter).

For å forhindre mulig forvirring eksisterer det et lignende klingende verktøy, Apache Spark [11], som er en enhetlig analytisk motor for storskala databehandling. Navnet Pyspark brukes til Python -grensesnittet til Apache Spark, som vi ikke diskuterer her.

Installere PyShark

Pyshark krever at både PCAP -biblioteket og Tshark blir installert. De tilsvarende pakkene for Debian Gnu/Linux 10 og Ubuntu heter Libpcap0.8 og Tshark og kan settes opp som følger ved å bruke apt-get:

Oppføring 1: Installere PCAP -biblioteket og Tshark

# pip3 installer python-pyshark

Hvis det ikke er installert ennå, må Python3 og Pip også legges til. De tilsvarende pakkene for Debian Gnu/Linux 10 og Ubuntu heter Python3 og Python3-Pip og kan installeres som følger ved hjelp av apt-get:

Oppføring 2: Installer Python 3 og Pip for Python 3

# apt-get install python3 python3-pip

Nå er det på tide å legge til pyshark. Basert på vår forskning er ikke pyshark pakket for noen større Linux -distribusjon ennå. Installasjonen av den gjøres ved hjelp av Python-pakken installasjonspipler PIP3 (PIP for Python 3) som en systemomfattende pakke som følger:

Oppføring 3: Installer Pyshark ved hjelp av PIP

# pip3 installer python-pyshark

Nå er PyShark klar til å brukes i Python -skript på Linux -systemet ditt. Vær oppmerksom på å utføre Python -skriptene nedenfor som en administrativ bruker, for eksempel ved hjelp av sudo fordi PCAP -biblioteket ikke tillater deg å se etter pakker som en vanlig bruker.

Følgende uttalelse legger til innholdet i Pyshark -modulen til navneområdet til Python -skriptet ditt:

Oppføring 4: Importer Pyshark -modulen

Importer pyshark

Metoder for å fange pakker

Ut av boksen kommer Pyshark med to forskjellige modus som den tilbyr for å samle pakker fra det observerte nettverksgrensesnittet. For kontinuerlig samling, bruk LiveCapture () -metoden, og for å lagre en lokal fil, bruk FileCapture () -metoden fra Pyshark -modulen. Resultatet er en pakkeliste (Python Iterator -objekt) som lar deg gå gjennom den fangede datapakken etter pakke. Oppføringene nedenfor viser hvordan du bruker de to metodene.

Oppføring 5: Bruk Pyshark til å fange fra det første WiFi -grensesnittet WLAN0

Importer pyshark
Capture = Pyshark.LiveCapture (grensesnitt = 'wlan0')

Med de tidligere uttalelsene holdes de fangede nettverkspakkene i minnet. Det tilgjengelige minnet kan imidlertid være begrenset, men lagring av de fangede pakkene i en lokal fil er et alternativ. I bruk er PCAP -filformatet [9]. Dette lar deg behandle og tolke de fangede dataene med andre verktøy som også er koblet til PCAP -biblioteket.

Oppføring 6: Bruk Pyshark til å lagre de fangede pakkene i en lokal fil

Importer pyshark
Capture = Pyshark.FileCapture ('/TMP/NetworkPackages.lokk')

Kjørelister 5 og 6, du vil ikke ha noen utdata ennå. Neste trinn er å begrense pakkene som skal samles mer presist basert på dine ønskede kriterier.

Velge pakker

Det tidligere innførte fangstobjektet etablerer en forbindelse til ønsket grensesnitt. Deretter samler de to metodene sniff () og sniff_continuously () av ​​fangstobjektet nettverkspakkene. Sniff () vender tilbake til den som ringer så snart alle de forespurte pakkene er samlet. I kontrast leverer sniff_continuously () en enkelt pakke til den som ringer så snart den ble samlet. Dette tillater en livestrøm av nettverkstrafikken.

Videre lar de to metodene deg spesifisere forskjellige begrensninger og filtreringsmekanisme for pakker, for eksempel antall pakker som bruker parameterpakken_Count, og perioden der pakkene skal samles ved å bruke parameterens timeout. Oppføring 7 demonstrerer hvordan du kan samle inn 50 nettverkspakker, bare som en direktesendt strøm, ved å bruke metoden sniff_continuously ().

Oppføring 7: Samle 50 nettverkspakker fra WLAN0

Importer pyshark
Capture = Pyshark.LiveCapture (grensesnitt = 'wlan0')
for pakke i fangst.sniff_continuously (packet_count = 5):
trykk (pakke)

Ulike pakkedetaljer er synlige ved hjelp av uttalelsesutskriften (pakke) (se figur 1).

Figur 1: Pakkeinnhold

I oppføring 7 samlet du alle slags nettverkspakker uansett hvilken protokoll eller serviceport. Pyshark lar deg gjøre avansert filtrering, ved hjelp av det såkalte BPF-filteret [12]. Oppføring 8 demonstrerer hvordan du samler inn 5 TCP -pakker som kommer inn via port 80 og skriver ut pakketypen. Informasjonen er lagret i pakkeattributtet høyeste_layer.

Oppføring 8: Kun samler TCP -pakker

Importer pyshark
Capture = Pyshark.LiveCapture (grensesnitt = 'wlan0', bpf_filter = 'tcp port 80')
fange.Sniff (Packet_Count = 5)
trykk (fangst)
For pakke i fangst:
trykk (pakke.høyest_layer)

Lagre oppføring 8, som filen TCP-SNIFF.py, og kjør python -skriptet. Utgangen er som følger:

Oppføring 9: Utgangen fra oppføring 8

# python3 tcp-sniff.py

TCP
TCP
TCP
OCSP
TCP
#

Unboxing de fangede pakkene

Det fangede objektet fungerer som en russisk matroska -dukke - lag for lag, den inneholder innholdet i den tilsvarende nettverkspakken. Unboxing føles litt som jul - du vet aldri hvilken informasjon du finner inni før du åpnet den. Oppføring 10 demonstrerer å fange 10 nettverkspakker og avsløre protokolltypen, både kilde- og destinasjonsport og adresse.

Oppføring 10: Viser kilde og destinasjon for den fangede pakken

Importer pyshark
Importer tid
# Definer grensesnitt
NetworkInterface = "ENP0S3"
# definere fangstobjekt
Capture = Pyshark.LiveCapture (grensesnitt = NetworkInterface)
Print ("Lytter på % S" % NetworkInterface)
for pakke i fangst.sniff_continuously (packet_count = 10):
# Justert utgang
prøve:
# Få tidsstempel
Lokaletid = tid.Asctime (tid.Lokaletid (tid.tid()))
# Få pakkeinnhold
protokoll = pakke.transport_layer # protokolltype
src_addr = pakke.IP.SRC # kildeadresse
src_port = pakke [protokoll].srcport # kildeport
dst_addr = pakke.IP.DST # destinasjonsadresse
dst_port = pakke [protokoll].dstport # destinasjonsport
# Utgangspakkeinfo
Print ("%S IP%S:%S%S:%S (%S)"%(Localime, SRC_ADDR, SRC_PORT, DST_ADDR, DST_PORT, PROTOCOL))
Bortsett fra attributt som e:
# Ignorer andre pakker enn TCP, UDP og IPv4
sende
skrive ut (" ")

Skriptet genererer en utgang, som vist i figur 2, en enkelt linje per mottatt pakke. Hver linje starter med en tidsstempel, etterfulgt av kilden IP -adresse og port, deretter destinasjons -IP -adressen og port, og til slutt typen nettverksprotokoll.


Figur 2: Kilde og destinasjon for fangede pakker

Konklusjon

Å bygge din egen nettverksskanner har aldri vært enklere enn det. Basert på grunnlaget for Wireshark, tilbyr Pyshark deg et omfattende og stabilt rammeverk for å overvåke nettverksgrensesnittene til systemet ditt på den måten du trenger det.

Lenker og referanser

  • [1] Silver Moon: 18 Kommandoer for å overvåke nettverksbåndbredde på Linux Server, https: // www.binæriske.com/linux-commands-monitor-nettverk/
  • [2] Python Socket Library, https: // docs.Python.org/3/bibliotek/stikkontakt.html
  • [3] Python-nmap, https: // pypi.org/prosjekt/python3-nmap/
  • [4] DPKT, https: // pypi.org/prosjekt/dpkt/
  • [5] Pyshark, https: // pypi.org/prosjekt/pyshark/
  • [6] Scapy, https: // pypi.org/prosjekt/scapy/
  • [7] Tcpdump og libpcap, http: // www.tcpdump.org/
  • [8] Pyshark, prosjektnettsted, http: // kiminewt.github.io/pyshark/
  • [9] libpcap filformat, wireshark wiki, https: // gitlab.com/wireshark/wireshark/-/wikis/utvikling/libpcapfileformat
  • [10] Tshark, https: // www.Wireshark.org/docs/man-sider/tshark.html
  • [11] Apache Spark, https: // Spark.Apache.org/
  • [12] BPF -filter, https: // wiki.Wireshark.org/capturefilters