Meglévő eszközök
A hálózati elemzéshez számos eszköz létezik már jó ideje. Például Linux alatt ezek a Wireshark, tcpdump, nload, iftop, iptraf, nethogs, bmon, tcptrack, valamint sebességmérő és ettercap. Részletes leírásukért nézd meg Silver Moon összehasonlítását [1].
Tehát miért nem használ egy meglévő eszközt, és inkább megírja a sajátját? Az okok szerintem jobban megértik a TCP / IP hálózati protokollokat, megtanulják, hogyan kell megfelelően kódolni, vagy csak a saját használatához szükséges sajátosságot valósítják meg, mert a meglévő eszközök nem adják meg azt, amire valójában szüksége van. Ezenkívül az alkalmazás / rendszer sebességének és terhelésének fejlesztése is szerepet játszhat, amely arra ösztönöz, hogy többet lépjen ebben az irányban.
A vadonban elég sok Python-könyvtár létezik a hálózati feldolgozáshoz és elemzéshez. Alacsony szintű programozáshoz a socket könyvtár [2] a kulcs. A magas szintű protokoll alapú könyvtárak a httplib, az ftplib, az imaplib és az smtplib. A hálózati portok és a csomagfolyamok versenyképes jelöltjeinek megfigyeléséhez a Python-nmap [3], a dpkt [4] és a PyShark [5] elemeket használják. A csomagfolyam figyelése és megváltoztatása érdekében a scapy könyvtárat [6] széles körben használják.
Ebben a cikkben megnézzük a PyShark könyvtárat, és figyeljük, hogy mely csomagok érkeznek egy adott hálózati interfészhez. Amint alább láthatja, a PySharkkal való együttműködés egyszerű. A projekt honlapján található dokumentáció segít az első lépésekben - ezzel nagyon gyorsan elérheti a használható eredményt. Ami viszont a szemcsés-szemcsésséget illeti, több ismeretre van szükség.
A PyShark sokkal többet képes megtenni, mint amilyennek első látásra tűnik, és sajnos az írás idején a meglévő dokumentáció nem fedi le ezt teljes egészében. Ez feleslegesen megnehezíti, és jó okot ad arra, hogy mélyebben belenézzünk a motorháztető alá.
A PySharkról
A PyShark [8] egy Python csomagoló a Tshark számára [10]. Az XML adatok exportálásának képességét egyszerűen elemzésével használja. Maga a Tshark a Wireshark parancssori változata. A Tshark és a PyShark egyaránt függ a Pcap könyvtáraktól, amely ténylegesen rögzíti a hálózati csomagokat, és amelyet a Tcpdump fedélzetén tartanak fenn [7]. A PySharkot Dan fejleszti és folyamatosan karbantartja (a KimiNewt nevet használja a Twitteren).
Az esetleges zavarok elkerülése érdekében létezik egy hasonló hangzású eszköz, az Apache Spark [11], amely egységes elemző motor a nagyszabású adatfeldolgozáshoz. A PySpark nevet az Apache Spark Python felületéhez használják, amelyet itt nem tárgyalunk.
A PyShark telepítése
A PySharknak a Pcap könyvtár és a Tshark telepítésére is szükség van. A Debian GNU / Linux 10 és az Ubuntu megfelelő csomagjainak neve libpcap0.8 és a tshark, és az alábbiak szerint állítható be az apt-get használatával:
1. lista: A Pcap könyvtár és a Tshark telepítése
# pip3 telepítse a python-pysharkotHa még nincs telepítve, akkor hozzá kell adni a Python3-at és a Pip-et is. A Debian GNU / Linux 10 és az Ubuntu megfelelő csomagjainak neve python3 és python3-pip, és az alábbiak szerint telepíthetők az apt-get használatával:
2. lista: Telepítse a Python 3-at és a PIP-et a Python 3-hoz
# apt-get install python3 python3-pipItt az ideje hozzáadni a PySharkot. Kutatásunk alapján a PyShark még nincs csomagolva egyetlen nagyobb Linux disztribúcióhoz sem. Telepítése a Python csomagtelepítővel (pip3 a Python 3-hoz), egész rendszerre kiterjedő csomagként, az alábbiak szerint:
3. lista: Telepítse a PySharkot a PIP használatával
# pip3 telepítse a python-pysharkotA PyShark készen áll a Linux rendszer Python szkriptjeiben való használatra. Felhívjuk figyelmét, hogy az alábbi Python szkripteket adminisztrátori felhasználóként hajtsa végre, például sudo használatával, mert a Pcap könyvtár nem engedélyezi, hogy csomagokat keressen rendes felhasználóként.
Az alábbi utasítás hozzáadja a PyShark modul tartalmát a Python szkript névteréhez:
4. lista: Importálja a PyShark modult
import pysharkA csomagok elfogásának módszerei
A dobozból kiindulva a PyShark két különböző módot kínál, amelyekkel csomagokat gyűjthet a megfigyelt hálózati interfészről. A folyamatos gyűjtéshez használja a LiveCapture () metódust, a helyi fájlba történő mentéshez pedig a PyChure modul FileCapture () metódusát. Az eredmény egy csomaglista (Python iterator objektum), amely lehetővé teszi, hogy a rögzített adatcsomagokat csomagonként haladhassa át. Az alábbi felsorolások bemutatják a két módszer használatát.
5. lista: A PyShark segítségével rögzítheti az első wlan0 Wifi interfészt
import pysharkelfog = pyshark.LiveCapture (interfész = 'wlan0')
Az előző állításokkal a rögzített hálózati csomagok a memóriában maradnak. A rendelkezésre álló memória korlátozott lehet, azonban az elfogott csomagok helyi fájlban történő tárolása alternatív megoldás. Használatban van a Pcap fájlformátum [9]. Ez lehetővé teszi, hogy a rögzített adatokat más eszközökkel dolgozza fel és értelmezze, amelyek a Pcap könyvtárhoz is kapcsolódnak.
6. lista: A PyShark segítségével tárolja az elfogott csomagokat egy helyi fájlban
import pysharkelfog = pyshark.FileCapture ('/ tmp / hálózati csomagok.sapka')
Az 5. és 6. listát futtatva még nem lesz kimenete. A következő lépés az összegyűjtendő csomagok szűkítése a pontos kritériumok alapján.
Csomagok kiválasztása
A korábban bemutatott elfogási objektum kapcsolatot létesít a kívánt interfésszel. Ezután a két módszer a befogási objektum szimatolja () és folytonosan szippantja () a hálózati csomagokat. A sniff () visszatér a hívóhoz, amint az összes kért csomag összegyűlt. Ezzel szemben a sniff_continuously () egyetlen csomagot juttat el a hívóhoz, amint összegyűjtötte. Ez lehetővé teszi a hálózati forgalom élő közvetítését.
Ezenkívül a két módszer lehetővé teszi a csomagok különféle korlátozásainak és szűrési mechanizmusainak megadását, például a packet_count paramétert használó csomagok számát és azt az időszakot, amely alatt a csomagokat a timeout paraméter használatával kell összegyűjteni. A 7. lista bemutatja, hogyan lehet csak 50 hálózati csomagot gyűjteni élő közvetítésként a sniff_continuously () módszerrel.
7. lista: Gyűjtsön össze 50 hálózati csomagot a wlan0-ból
import pysharkelfog = pyshark.LiveCapture (interfész = 'wlan0')
az elfogott csomagok számára.szippantás_folyamatosan (csomag_szám = 5):
nyomtatás (csomag)
Különböző csomagrészletek láthatók az utasítás nyomtatásával (csomag) (lásd 1. ábra).
1. ábra: csomag tartalma
A 7. listában mindenféle hálózati csomagot összegyűjtött, függetlenül attól, hogy milyen protokoll vagy szolgáltatási port van. A PyShark lehetővé teszi speciális szűrés elvégzését az úgynevezett BPF szűrő használatával [12]. A 8. lista bemutatja, hogyan lehet összegyűjteni 5 TCP-csomagot, amelyek a 80-as porton keresztül érkeznek és kinyomtatják a csomag típusát. Az információkat a legnagyobb_réteg csomagattribútum tárolja.
8. lista: Csak TCP-csomagok gyűjtése
import pysharkelfog = pyshark.LiveCapture (interfész = 'wlan0', bpf_filter = 'tcp 80-as port')
elfog.szippantás (csomag_szám = 5)
nyomtatás (rögzítés)
elfogott csomag esetén:
nyomtatás (csomag.legmagasabb réteg)
A 8. lista mentése a tcp-sniff fájlként.py, és futtassa a Python szkriptet. A kimenet a következő:
9. lista: A 8. lista kimenete
# python3 tcp-szippantás.pyTCP
TCP
TCP
OCSP
TCP
#
Az elfogott csomagok kibontása
Az elfogott objektum orosz Matroska babaként működik - rétegenként, tartalmazza a megfelelő hálózati csomag tartalmát. A kicsomagolás kissé karácsonyszerűnek tűnik - soha nem lehet tudni, milyen információt talál benne, amíg nem nyitotta meg. A 10 felsorolás bemutatja 10 hálózati csomag elfogását és a protokoll típusának feltárását, mind a forrás, mind a cél portot és címet.
10. lista: A rögzített csomag forrásának és céljának megjelenítése
import pysharkimport idő
# define interface
networkInterface = "enp0s3"
# define elfogási objektum
elfog = pyshark.LiveCapture (interfész = networkInterface)
nyomtatás ("% s hallgatás"% networkInterface)
az elfogott csomagok számára.szippantás_folyamatosan (csomag_szám = 10):
# korrigált kimenet
próbáld ki:
# get timestamp
localtime = idő.tényállás (idő.helyi idő (idő.idő()))
# csomagtartalom beolvasása
protokoll = csomag.transport_layer # protokoll típusa
src_addr = csomag.ip.src # forráscím
src_port = csomag [protokoll].srcport # forrás port
dst_addr = csomag.ip.dst # rendeltetési cím
dst_port = csomag [protokoll].dstport # célport
# kimeneti csomaginformáció
nyomtatás ("% s IP% s:% s <-> % s:% s (% s) "% (localtime, src_addr, src_port, dst_addr, dst_port, protokoll))
kivéve az AttributeError as e:
# figyelmen kívül hagyja a TCP, UDP és IPv4 kivételével más csomagokat
passz
nyomtatás ("")
A szkript egy kimenetet generál, amint azt a 2. ábra mutatja, egyetlen sort fogadott csomagonként. Minden sor időbélyeggel kezdődik, amelyet a forrás IP-cím és port követ, majd a cél IP-cím és port, végül pedig a hálózati protokoll típusa.
2. ábra: Az elfogott csomagok forrása és rendeltetési helye
Következtetés
A saját hálózati szkenner elkészítése még soha nem volt ilyen egyszerű. A Wireshark alapjai alapján a PyShark átfogó és stabil keretet kínál a rendszer hálózati interfészeinek a kívánt módon történő figyelemmel kíséréséhez.
Linkek és hivatkozások
- [1] Silver Moon: 18 parancs a hálózati sávszélesség figyelésére a Linux szerveren, https: // www.binaritidok.com / linux-commands-monitor-network /
- [2] Python socket könyvtár, https: // docs.piton.org / 3 / library / socket.html
- [3] python-nmap, https: // pypi.org / project / python3-nmap /
- [4] dpkt, https: // pypi.org / project / dpkt /
- [5] PyShark, https: // pypi.org / project / pyshark /
- [6] scapy, https: // pypi.org / project / scapy /
- [7] Tcpdump és libpcap, http: // www.tcpdump.org /
- [8] PyShark, projekt weboldala, http: // kiminewt.github.io / pyshark /
- [9] Libpcap fájlformátum, Wireshark Wiki, https: // gitlab.com / wireshark / wireshark / - / wikis / Fejlesztés / LibpcapFileFormat
- [10] Tshark, https: // www.drótcápa.org / docs / man-pages / tshark.html
- [11] Apache Spark, https: // szikra.apache.org /
- [12] BPF szűrő, https: // wiki.drótcápa.org / CaptureFilters