1. 程式人生 > >Python中Scapy網路嗅探模組的使用

Python中Scapy網路嗅探模組的使用

目錄

Scapy

發包

發包和收包 

抓包 

格式化輸出

過濾抓包

Scapy

scapy是python中一個可用於網路嗅探的非常強大的第三方庫,可以用它來做 packet 嗅探和偽造 packet。 scapy已經在內部實現了大量的網路協議。如DNS、ARP、IP、TCP、UDP等等,可以用它來編寫非常靈活實用的工具。

換言之,Scapy 是一個強大的操縱報文的互動程式。它可以偽造或者解析多種協議的報文,還具有傳送、捕獲、匹配請求和響應這些報文以及更多的功能。Scapy 可以輕鬆地做到像掃描(scanning)、路由跟蹤(tracerouting)、探測(probing)、單元測試(unit tests)、攻擊(attacks)和發現網路(network discorvery)這樣的傳統任務。它可以代替 hping 、arpspoof 、arp-sk、arping,p0f 甚至是部分的Namp、tcpdump 和 tshark 的功能。

最簡單的一個發包

from scapy.all import *
data='hello,word!'
pkt=IP(src='10.96.10.208',dst='10.96.10.209')/TCP(sport=12345,dport=12345)/data
send(pkt,inter=1,count=5)  #每隔一秒發包,發5次

scapy的安裝和使用 

scapy預設是不安裝的,安裝命令:pip  install   scapy 

安裝完後: 

  • ls()  命令可以檢視所有支援的協議
  • ls(IP) 命令列出ip協議頭部欄位格式,只要想檢視哪個協議的引數,括號裡就填哪個協議
  • IP().show() 列出ip包的資訊
  • lsc() 命令列出scapy的所有命令 
  • conf 命令列出scapy 的配置引數

發包的包格式: 層的協議(引數)/上一層的協議(引數) /要傳送的資料    ,比如如下

IP(src='10.96.10.208',dst='10.96.10.209')/TCP(sport=12345,dport=12345)/data

發包

傳送三層包:send(pkt, inter=0, loop=0, count=1, iface=N) 
傳送二層包:sendp(pkt, inter=0, loop=0, count=1, iface=N) 
使用tcpreplay在第二層以更快的速度傳送資料包 :sendpfast(pkt, pps=N, mbps=N, loop=0, iface=N) 

def send(x, inter=0, loop=0, count=None, verbose=None, realtime=None, return_packets=False, socket=None,*args,**kargs)

def sendp(x, inter=0, loop=0, iface=None, iface_hint=None, count=None, verbose=None, realtime=None,
          return_packets=False, socket=None,*args,**kargs)

def sendpfast(x, pps=None, mbps=None, realtime=None, loop=0, file_cache=False, iface=None,*args,**kargs)

from scapy.all import *
send(IP(dst="202.99.96.68")/UDP(dport=53))
sendp(Ether()/IP(dst="202.99.96.68")/UDP(dport=53))

發包和收包 

和上面發包不同的是,發包僅僅是傳送包,而發包和收包是對發包的回覆資訊進行收集。

  • 三層發包和收包:sr(pkt, filter=N, iface=N)
  • 二層發包和收包:srp(pkt, filter=N, iface=N) 
  • 三層發包但是僅僅接受第一個回覆:sr1(pkt, inter=0, loop=0, count=1, iface=N),
  • 二層發包但是僅僅接受第一個回覆:srp1(pkt, filter=N, iface=N) 
  • 在環回口發包並且打印出所有的回覆:srloop(pkt, timeout=N, count=N), srploop(…) 

def sr(x, promisc=None, filter=None, iface=None, nofilter=0,*args,**kargs)

def srp(x, promisc=None, iface=None, iface_hint=None, filter=None, nofilter=0, type=ETH_P_ALL,*args,**kargs)

def sr1(x, promisc=None, filter=None, iface=None, nofilter=0,*args,**kargs)

def srp1(*args,**kargs) 

以上所有的發包和收包都是接收到兩個引數,第一個引數是回覆的包,第二個引數是沒回復的包 

舉例,我們利用arp協議獲得指定ip的mac地址

>>ans,unans=srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst="10.96.10.197"))
>>print(ans)
>>print(unans)
<Results: TCP:0 UDP:0 ICMP:0 Other:1>
<Unanswered: TCP:0 UDP:0 ICMP:0 Other:0>

可知,ans是回覆我們的包,如果我們想獲得ans回覆的資料,我們可以檢視ans的第一個包
>>print(ans[0])
(<Ether  dst=ff:ff:ff:ff:ff:ff type=0x806 |<ARP  pdst=10.96.10.197 |>>, <Ether  dst=50:7b:9d:12:b2:ca src=e4:35:c8:7a:58:a6 type=0x806 |<ARP  hwtype=0x1 ptype=0x800 hwlen=6 plen=4 op=is-at hwsrc=e4:35:c8:7a:58:a6 psrc=10.96.10.197 hwdst=50:7b:9d:12:b2:ca pdst=10.96.10.208 |<Padding  load='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' |>>>)

ans[0]包中是一個元組,第一部分是我們發的資訊,第二部分是回覆的資訊。很明顯,第二部分才是我們要的內容
>>for snd,rcv in ans:
>>   list_mac=rcv.sprintf("%Ether.src% - %ARP.psrc%")     #按照指定格式打印出我們的包
>>   print(list_mac)
e4:35:c8:7a:58:a6 - 10.96.10.197

抓包 

scapy抓包使用 sniff() 函式,這個函式有很多引數

def sniff(count=0, store=1, offline=None, prn=None,filter=None, L2socket=None, timeout=None, opened_socket=None, stop_filter=None, iface=None,*args,**kargs)

  • count:抓包的數量,0表示無限制;
  • store:儲存抓取的資料包或者丟棄,1儲存,0丟棄
  • offline:從 pcap 檔案讀取資料包,而不進行嗅探,預設為None
  • prn:為每一個數據包定義一個函式,如果返回了什麼,則顯示。例如:prn = lambda x: x.summary(); (  packct.summar()函式返回的是對包的統計性資訊 )
  • filter:過濾規則,使用wireshark裡面的過濾語法
  • L2socket:使用給定的 L2socket
  • timeout:在給定的時間後停止嗅探,預設為 None
  • opened_socket:對指定的物件使用 .recv() 進行讀取;
  • stop_filter:定義一個函式,決定在抓到指定資料包後停止抓包,如:stop_filter = lambda x: x.haslayer(TCP);
  • iface:指定抓包的介面 

將抓取到的資料包儲存

from scapy.all import *
package=sniff(iface='eth0',count=10)  #掃描eth0網絡卡的資料包,總數為10個
wrpcap("test.pcap",package)  #將抓取到的包儲存為test.pcap檔案

如果我們以後想檢視這個包的話,可以這樣使用
package = sniff(offline='test.pcap')  或 package= rdpcap('test.pcap')

檢視抓取到的資料包 

>>from scapy.all import *
>>package=sniff(iface='eth0',count=10)  #掃描eth0網絡卡的資料包,總數為10個
>>print(package)
<Sniffed: TCP:0 UDP:10 ICMP:0 Other:0>

從上面可以看到,我們抓取到了十個UDP的資料包,然後我們可以檢視第一個資料包:package[0]是檢視第一個資料包的資料,package[0].show()是檢視第一個資料包的詳細資訊,scapy是按照按照 TCP/IP 四層參考模型顯示詳細包資訊的,即:鏈路層 [Ethernet]、網路層[IP]、傳輸層[TCP/UDP]、應用層[RAW] 。我們還可以通過協議來檢視指定的包:

package[UDP][0].show() ,因為我們這裡只有UDP的資料包,所以就沒有這樣使用。,而我們也可以直接只獲取指定層的資料,如: pcap[UDP][1][Ether].dst   這個包裡面是等於ff:ff:ff:ff:ff:ff

from scapy.all import *
package=sniff(iface='eth0',count=10)  #掃描eth0網絡卡的資料包,總數為10個
print(package)
print(package[0])   #檢視第一個資料包的資料
print(package[0].show())  #檢視第一個資料包的詳情 
######################################################################
<Sniffed: TCP:0 UDP:9 ICMP:0 Other:1>

b"\xff\xff\xff\xff\xff\xff\xc8[v\xec5\xed\x08\x00E\x00\x01#8G\x00\[email protected]\x11\x17=\n`\n\x88\n`\n\xff\xd6\x83\xd6\x83\x01\x0fN\xa0\x00qu-PC\x00\x00H\xb6\x1d\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x1dF\x02\x00\x00\x00\x00\xd0\xb5\x1d\x07\x00\x00\x00\x003'\x00\x00\x00\x00\x00\x00\xd0\x1dF\x02\x00\x00\x00\x00\xc02\xc5\x05\x00\x00\x00\x00|j\x85`\x00\x00\x00\x00p\xa4/a\x00\x00\x00\x00\xf9\xb9\x1d\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\xfe\xcc\x05\x00\x00\x00\x00D\xb6\x1d\x07\x00\x00\x00\x00`\xb6\x1d\x07\x00\x00\x00\x00H\xaa {efdced0c-1ada-40e0-a13e-2968030599d4}\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\[email protected]\xb6\x1d\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00n\x00\xc5\xac"

###[ Ethernet ]### 
  dst       = ff:ff:ff:ff:ff:ff
  src       = c8:5b:76:ec:35:ed
  type      = 0x800
###[ IP ]### 
     version   = 4
     ihl       = 5
     tos       = 0x0
     len       = 291
     id        = 14407
     flags     = 
     frag      = 0
     ttl       = 64
     proto     = udp
     chksum    = 0x173d
     src       = 10.96.10.136
     dst       = 10.96.10.255
     \options   \
###[ UDP ]### 
        sport     = 54915
        dport     = 54915
        len       = 271
        chksum    = 0x4ea0
###[ Raw ]### 
           load      = "\x00qu-PC\x00\x00H\xb6\x1d\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x1dF\x02\x00\x00\x00\x00\xd0\xb5\x1d\x07\x00\x00\x00\x003'\x00\x00\x00\x00\x00\x00\xd0\x1dF\x02\x00\x00\x00\x00\xc02\xc5\x05\x00\x00\x00\x00|j\x85`\x00\x00\x00\x00p\xa4/a\x00\x00\x00\x00\xf9\xb9\x1d\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\xfe\xcc\x05\x00\x00\x00\x00D\xb6\x1d\x07\x00\x00\x00\x00`\xb6\x1d\x07\x00\x00\x00\x00H\xaa {efdced0c-1ada-40e0-a13e-2968030599d4}\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\[email protected]\xb6\x1d\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00n\x00\xc5\xac"

格式化輸出

如果我們要對抓取到的資料包進行格式化輸出,我們可以使用 packet.sprintf() 函式進行格式化輸出 

sprintf()讀資料格式:IP:%IP.src%  代表讀取的是IP欄位的源地址

比如要讀取IP包的源地址和目的地址: IP:%IP.src% -> %IP.dst%

要讀取UDP中的源埠和目的埠:  UDP:%UDP.sport% -> %UDP.sport%

過濾抓包

如果我們想抓指定型別的資料包,就需要使用 filter 進行過濾,而 filter 使用的是 Berkeley Packet Filter (BPF)語法,也就是我們在 wireshark 中可以使用的過濾語法

比如說我們只抓取 icmp 的包,並且按照 源ip-> 目的ip 的格式打印出來 。我在一直ping百度,下面是抓包的

sniff(filter="icmp",count=5,prn=lambda x : x.sprintf("{IP:%IP.src%-> %IP.dst%}"))

相關推薦

PythonScapy網路模組的使用

目錄 Scapy 發包 發包和收包  抓包  格式化輸出 過濾抓包 Scapy scapy是python中一個可用於網路嗅探的非常強大的第三方庫,可以用它來做 packet 嗅探和偽造 packet。 scapy已經在內部實現了大量的網路協議。如D

網路爬蟲筆記【6】 Python 的正則表示式模組與應用

python3 內建的 re 模組,包含了正則表示式的操作集。 re 模組的一般使用步驟如下: 編譯正則表示式,即使用 compile() 函式將正則表示式的字串形式編譯為一個 Pattern 物件。 對目標字串進行匹配,即通過 Pattern 物件提供的一些列方法對文字

實驗二 網路與欺騙 實驗報告 二

實驗報告 二   中國人民公安大學 Chinese people’ public security university   網路對抗技術 實驗報告  

使用libpcap庫用c編寫網路

定義:網路嗅探也叫網路偵聽,指的是使用特定的網路協議來分解捕獲到的資料包,並根據對應的網路協議識別對應資料片斷 作用:管理員可以用來監聽網路的流量情況            開發網路應用的程式設計師可以

winPcap+MFC實現網路

1.1、不可或缺的東西 WinPcap V4.1.2:驅動程式、Dll檔案 http://www.winpcap.org/install/bin/WinPcap_4_1_2.exe WinPcap V4.1.2 Developer’s Pack:庫檔案、標頭檔案、簡單的示例程式程式碼

網路

CAIN使用教程 Cain v4.9全攻略 一、軟體介紹: Cain是著名的windows平臺口令恢復工具。它能通過網路嗅探很容易的恢復多種口令,能使用字典破解加密的口令,暴力口令破解,錄音VOIP(IP電話)談話內容,解碼編碼化的口令,獲取無線網路金鑰,恢復快取的口令,分析路由協議

Python的單例設計模組及異常

一、單例設計模式 1、設計模式 設計模式是前人的總結和經驗的提煉,通常被人們廣為流傳 2、單例 由類建立的物件,在系統中有唯一的例項 3、建立物件的步驟 (1)為物件分配空間:__new__()           建立物件的時候,python直譯器首先會呼叫_

網路與欺騙 實驗報告二

中國人民公安大學 Chinese people’ public security university 網路對抗技術 實驗報告 實驗二 網路嗅探與欺騙 學生姓名 程前錦  年級  2015級 區隊  一區 指導教師  高見

解決 python 使用tesserocr,Imag模組 處理驗證碼的問題

python程式: from PIL import Image import tesserocr imag=Image.open(r"path") print(tesserocr.image_to_text(imag)) 會報以下錯誤: Traceback (most recent cal

Python程式設計:python的計時器timeit模組

from timeit import timeit from timeit import repeat # 執行1000000次x=1的時間 t1 = timeit("x=1") print("t1"

【嵌入式開發】自定義AT指令實現sniffer網路功能

基礎 該功能是在NON-OS SDK下實現的。 Non-OS SDK 是不不基於作業系統的 SDK,提供 IOT_Demo 和 AT 的編譯。Non-OS SDK 主要使⽤用定時器和回撥函式的方式實現各個功能事件的巢狀,達到特定條件下觸發特定功能函式的目

Python 的os、sys模組

sys模組 sys模組主要是用於提供對python直譯器相關的操作 函式 sys.argv #命令列引數List,第一個元素是程式本身路徑 sys.path #返回模組的搜尋路徑,初始化時使用PYTHONPATH環境變數的值 sys.modules.ke

網路器(Sniffer)的原理與實現(1)

一.背景 為了使不同體系結構的計算機網路都能進行互聯,國際標準化組織ISO於1997年成立了專門的結構研究這個問題。不久他們就提出了一個試圖使各種計算機在世界範圍內都能互聯的成網的標準框架,即著名的OSI/RM(Open Systems Interconnection Re

計算機網路實驗-網路

計算機網路實驗-網路嗅探器 內容 課題:簡單的個人網路嗅探器 一、目的 加深對 TCP/IP 協議的理解 二、任務: • 實現 Sniffer 的基本功能。 Sniffer 是一種用於監測網路效能、使用情況的工具。 • 能夠指定需要偵聽的網絡卡

Python 的實用資料

[mean:0.98677,std:0.00259,params:{'classifier__kernel':'linear','classifier__C':1},mean:0.98654,std:0.00100,params:{'classifier__kernel':'linear','classifi

Keras神經網路視覺化模組keras.utils.visualize_util 的安裝

一、Keras中提供了一個神經網路視覺化的函式plot,並可以將視覺化結果儲存在本地。plot使用方法如下: from keras.utils.visualize_util import plot

python為自己的庫(模組)配置路徑

在使用python的過程中,有時候會自己編寫一些庫檔案,為了能夠呼叫這些檔案裡的函式,需要對將自己編寫的檔案的路徑新增到python預設庫路徑中去。通過查詢資料,發現了兩種方法: (1)在shell命令視窗中輸入以下命令: import sys sys.path.appen

pythondoctest自我測試(測試模組的函式是否對)

#該檔名為mymod.py def sum(x,y): ''' 此處為文件字串 The sum of two numbers. >>> sum(1,3) 4 >>> sum(9,11)

Python的內建的模組 和第三方的模組

1.Python內建模組和第三方模組 內建模組: Python中,安裝好了Python後,本身就帶有的庫,就叫做Python的內建的庫。 內建模組,也被稱為Python的標準庫。 Python 2.x的線上庫函式查詢,可以去這裡: 第三方庫: 而非Python本

Keras神經網路視覺化模組keras.utils.visualize_util安裝配置方法

Keras中提供了一個神經網路視覺化的函式plot,並可以將視覺化結果儲存在本地。plot使用方法如下: from keras.utils.visualize_util import plot plot(model, to_file='model.png') 注:筆者使用的Keras版本是1.0.6 不