導航:首頁 > 編程語言 > python在線抓包

python在線抓包

發布時間:2022-12-29 18:11:43

㈠ 四大網路抓包神器,總有一款適合你~

無論是開發還是測試,在工作中經常會遇到需要抓包的時候。本篇文章 主要介紹如何在各個平台下,高效的抓包。

目前的抓包軟體總體可以分為兩類:

一種是設置代理抓取http包,比如Charles、mitmproxy這些軟體。

另一種是直接抓取經過網卡的所有協議包,其中最出名就是大名鼎鼎的wireshark以及linux自帶的抓包軟體tcpmp。

下面重點介紹一下這四個抓包工具的特點以及使用。

wireshark想必大多數程序員都不會陌生。wireshark在各個平台都可以安裝使用,它 可以抓取經過指定網卡的所有協議。 wireshark雖然很強大,但是對初學者其實不是很友好。

這也正是由於它太強大,它可以抓取所有包,所以初學者在使用時面對茫茫數據流不知所措。初學者需要認真的去學習怎麼過濾得到自己感興趣的包,但是如果不熟悉wireshark的過濾語法,要過濾數據包將舉步維艱。

過濾語法簡單介紹

wireshark的過濾語法總結起來其實也很簡單,就是 以協議開頭,後面可以跟著協議的屬性,然後加上一些判斷符號, 比如contains、==、>、<等等。比如只想展示http的協議內容,則直接在過濾器輸入框中輸入http即可。

如下圖:

比如我 只想看http協議的請求頭中uri包含』/api』的協議,就可以這么寫:

如果想通過目標ip或者來源ip來過濾包,就不可以以http協議為前綴了,因為這些是ip協議的相關屬性。 通過目標ip來過濾可以這么寫:

上面表示目標機器的ip是61.135.217.100並且協議是http的包。

wireshark支持很多種協議,我們可以通過右上角的expression來打開搜索支持的協議,還可以找出協議支持的屬性,然後填入期待的值,軟體會自動為我們構建過濾語句。

優點:

功能強大,可以抓取所有協議的包

抓到的包容易分析

缺點:

由於線上伺服器沒有GUI,只有命令行,因此無法在線上伺服器使用

無法分析https數據包,由於wireshark是在鏈路層獲取的數據包信息,所以獲取到的https包是加密後的數據,因此無法分析包內容。當然,我們可以對https數據包進行解密, 但是操作具有一定的復雜度,可能要消耗很多時間。

tcpmp是linux上自帶的一個抓包軟體(mac也有),功能強大,也可以抓取經過指定網卡的所有協議包。

由於是命令行工具,tcpmp抓取到的包不易於分析,一個常見的做法是將tcpmp抓到的包輸出到某個文件,然後將文件拷貝下來用wireshark分析。

一些簡單的過濾參數:

抓包內容輸出到文件:

之後我們可以把test.cap直接用wireshark打開,就可以很直觀的分析包了。

用tcpmp輸出cap文件包:

tcpmp-r test.cap

Charles是一款http抓包工具,它是通過代理來實現的抓包。也就是我們在訪問網頁時需要配置代理,將代理指向Charles監聽的埠,之後我們的http請求都會發向Charles的埠,之後Charles會幫我們轉發並記錄協議內容。

Charles的使用非常簡單,配置好代理後,Charles就開始抓包了。

我們可以直接通過Charles的GUi查看包的內容:

上圖中的unknown表示https加密後的數據,所以看到不協議的具體內容。我們可以通過安裝Charles的證書,讓Charles也可以查看https協議的具體內容。

優點 :

使用簡單,只需配置一下代理地址就可以

要抓取https協議的配置也很簡單,只要安裝下charles的證書就可以了

mitmproxy是python寫的一款http抓包工具,雖然只支持http抓包,但是它的特性非常強大,它不僅可以抓包,還可以對請求進行攔截、重現等操作。和Charles一樣,它的原理也是基於代理,使用的時候需要設置代理指向它。

mitmproxy是命令行工具,但是也自帶了mitmweb工具,可以讓用戶在網頁上操作。另外,mitmproxy還支持用戶自行編寫插件,可以編寫腳本對請求進行處理,然後把修改後的請求發出去。

1、安裝 

首先需要在機器安裝python3以及pip3.之後通過pip3安裝

pip3 install mitmproxy

如果安裝mitmproxy過程中報錯MoleNotFoundError: No mole named '_ssl',就需要安裝一下OpenSSL,然後再重新編譯安裝一下python3。

安裝好openSSL後再執行pip3 install mitmproxy

2、使用 

安裝後,直接在命令行輸入mitmproxy就會進入它的交互界面:

這時候mitmproxy已經開始監聽8080埠(默認),接著,我們可以去瀏覽器設置代理。瀏覽器設置代理的方式有很多,這里不多做介紹。

設置完代理後,訪問瀏覽器的請求都會被發到mitmproxy上,mitmproxy根據規則對請求進行攔截(不配置攔截規則的話則都不攔截),所有經過的請求都會被輸出:

在交互界面上可以通過快捷鍵操作請求。輸入問號』?』,可以查看快捷鍵的文檔。

3、下面介紹一些常用的快捷鍵和功能

① 請求過濾  

在請求列表交互界面,按下f鍵後,可以輸入一些過濾規則:

具體的過濾語法可以按下』?『鍵後,再按下方向鍵右』—>』或者l鍵。

② 請求攔截 

按下i鍵後,可以對指定的請求進行攔截。按mitmproxy收到指定條件的請求時,不會立馬把它轉發出去,而是等待我們執行resume操作後,才會把請求轉發出去——在這期間我們甚至可以對請求進行手動修改。

紅色字體表示該請求被攔截,之後我們可以按入a鍵來恢復該請求,可以輸入A鍵恢復所有被攔截的請求。

③ 查看/編輯請求 

把指示游標移動到某個請求上,按回車可以查看請求的內容。或者滑鼠直接點擊請求也可以。

之後通過左右方向鍵可以查看request、response、detail等信息。

如果要編輯請求,可以在這個界面輸入e,然後會讓我們選擇編輯哪塊內容:

之後就會進入vim編輯界面編輯相應的內容了(保存後會生效)。

④ 重發請求 

mitmproxy的游標指向某個請求時,按下r鍵可以重發這個請求(重發前可以對該請求進行編輯)。

按下』:』鍵後,可以輸入命令,這樣我們就可以通過過濾規則批量的重發請求

replay.client是mitmproxy內置的一個命令,我們也可以自行編寫命令。命令的編寫可以參考官網文檔,這里不做介紹。

⑤ 插件開發 

我們可以編寫插件,然後再啟動的時候指定插件,mitmproxy處理請求的時候會執行一個插件的鏈,這樣我們就可以對請求進行編輯然後再發送出去了。

借用官網的插件demo:

這個方法對每一個請求進行處理,然後列印序號。通過mitmproxy -s test.py來讓插件生效。通過插件可以綁定各種連接事件。感興趣的朋友可以自行去mitmproxy官網看文檔,這里不多做介紹。

⑥ 保存抓到的請求數據 

通過w快捷鍵我們可以把這次抓到的請求包保存到文件上。

通過mitmproxy -r file可以讀取以前抓取的請求信息進行分析。

優點:

命令行操作,可以在無GUI界面的伺服器上使用

對於這幾個抓包神器,我總結了下使用場景:

只抓http協議的話:

推薦使用mitmproxy。mitmproxy豐富的功能不僅可以滿足我們的抓包需求,還可以提升我們的工作效率。比如測試可以抓包後一鍵重發請求來重現bug,開發調試的時候可以修改請求內容等等。

如果是在線上的沒有GUI的伺服器:

推薦使用tcpmp,雖然mitmproxy也可以支持命令行抓包,但是生產環境的伺服器最好不要亂安裝第三方插件。另外,大多數伺服器都有裝tcpmp。我們可以通過把請求的內容輸出到文件,然後拷貝會自己的電腦用wireshark分析。

想要抓取http以外的協議的話:

直接上wireshark。功能強大。對於Charles,感覺用了mitmproxy之後,就基本用不上Charles了。Charles好像也可以編輯後再發送,但是感覺不是很好用,可能我用的不是很熟吧。

㈡ 想用Python抓包(keep APP),進而修改數據,得到偽造的結果,有什麼具體方案嗎

用fiddler抓包,獲取post的地址,然後偽造表單,用requests.post()把表單內容發過去試試。

㈢ 在linux下,python怎麼才能抓到網卡上的所有TCP數據包

Ethereal 自帶許多協議的 decoder,簡單,易用,基於winpcap的一個開源的軟體.但是它的架構並不靈活,如何你要加入一個自己定義的的解碼器,得去修改 Ethereal的代碼,再重新編譯,很煩瑣.對於一般的明文 協議,沒有什麼問題,但是對於加密協議,比如網路游戲,客戶端程序一般會在剛連接上的時候,發送一個隨機密鑰,而後的報文都會用這個密鑰進行加密,如此. 要想破解,得要有一個可編程的抓包器.
libpcap是一個不錯的選擇,但是對於抓包這樣需要反復進行」試 驗->修改」這個過程的操作,c 語言顯然不是明智的選擇.
Python提供了幾個libpcapbind。在windows平台上,你需要先安裝winpcap,如果你已經安裝了Ethereal非常好用
一個規范的抓包過程
import pcap
import dpkt
pc=pcap.pcap() #注,參數可為網卡名,如eth0
pc.setfilter('tcp port 80') #設置監聽過濾器
for ptime,pdata in pc: #ptime為收到時間,pdata為收到數據
print ptime,pdata #...
對抓到的乙太網V2數據包(raw packet)進行解包
p=dpkt.ethernet.Ethernet(pdata)
if p.data.__class__.__name__=='IP':
ip='%d.%d.%d.%d'%tuple(map(ord,list(p.data.dst)))
if p.data.data.__class__.__name__=='TCP':
if data.dport==80:
print p.data.data.data # by gashero
一些顯示參數
nrecv,ndrop,nifdrop=pc.stats()
返回的元組中,第一個參數為接收到的數據包,(by gashero)第二個參數為被核心丟棄的數據包。

㈣ Python(六十五)抓包及其簡單解析

04_抓包及其簡單解析/01_分析攝圖網.py:

04_抓包及其簡單解析/02_xpinyin模塊.py

04_抓包及其簡單解析/03_requests_html模塊.py:

04_抓包及其簡單解析/04_攝圖網簡單解析.py:

文章到這里就結束了!希望大家能多多支持Python(系列)!六個月帶大家學會Python,私聊我,可以問關於本文章的問題!以後每天都會發布新的文章,喜歡的點點關注!一個陪伴你學習Python的新青年!不管多忙都會更新下去,一起加油!

Editor:Lonelyroots

㈤ python3.2 下的抓包庫。。無論是pypcap還是scapy。貌似都沒有py3的版本。。跪求一個可以python3用

有一個py3kcap是pycap的封裝版本,可以用於python3版本。

給你一個使用的示例代碼:

#!/usr/bin/env python3.2
import ctypes,sys
from ctypes.util import find_library
#pcap = ctypes.cdll.LoadLibrary("libpcap.so")
pcap = None
if(find_library("libpcap") == None):
print("We are here!")
pcap = ctypes.cdll.LoadLibrary("libpcap.so")
else:
pcap = ctypes.cdll.LoadLibrary(find_library("libpcap"))
# required so we can access bpf_program->bf_insns
"""
struct bpf_program {
u_int bf_len;
struct bpf_insn *bf_insns;}
"""
class bpf_program(ctypes.Structure):
_fields_ = [("bf_len", ctypes.c_int),("bf_insns", ctypes.c_void_p)]
class sockaddr(ctypes.Structure):
_fields_=[("sa_family",ctypes.c_uint16),("sa_data",ctypes.c_char*14)]
class pcap_pkthdr(ctypes.Structure):
_fields_ = [("tv_sec", ctypes.c_long), ("tv_usec", ctypes.c_long), ("caplen", ctypes.c_uint), ("len", ctypes.c_uint)]

pkthdr = pcap_pkthdr()
program = bpf_program()
# prepare args
snaplen = ctypes.c_int(1500)
#buf = ctypes.c_char_p(filter)
optimize = ctypes.c_int(1)
mask = ctypes.c_uint()
net = ctypes.c_uint()
to_ms = ctypes.c_int(100000)
promisc = ctypes.c_int(1)
filter = bytes(str("port 80"), 'ascii')
buf = ctypes.c_char_p(filter)
errbuf = ctypes.create_string_buffer(256)
pcap_close = pcap.pcap_close
pcap_lookupdev = pcap.pcap_lookupdev
pcap_lookupdev.restype = ctypes.c_char_p
#pcap_lookupnet(dev, &net, &mask, errbuf)
pcap_lookupnet = pcap.pcap_lookupnet
#pcap_t *pcap_open_live(const char *device, int snaplen,int promisc, int to_ms,
#char *errbuf
pcap_open_live = pcap.pcap_open_live
#int pcap_compile(pcap_t *p, struct bpf_program *fp,const char *str, int optimize,
#bpf_u_int32 netmask)
pcap_compile = pcap.pcap_compile
#int pcap_setfilter(pcap_t *p, struct bpf_program *fp);
pcap_setfilter = pcap.pcap_setfilter
#const u_char *pcap_next(pcap_t *p, struct pcap_pkthdr *h);
pcap_next = pcap.pcap_next
# int pcap_compile_nopcap(int snaplen, int linktype, struct bpf_program *program,
# const char *buf, int optimize, bpf_u_int32 mask);
pcap_geterr = pcap.pcap_geterr
pcap_geterr.restype = ctypes.c_char_p
#check for default lookup device
dev = pcap_lookupdev(errbuf)
#override it for now ..
dev = bytes(str("wlan0"), 'ascii')
if(dev):
print("{0} is the default interface".format(dev))
else:
print("Was not able to find default interface")

if(pcap_lookupnet(dev,ctypes.byref(net),ctypes.byref(mask),errbuf) == -1):
print("Error could not get netmask for device {0}".format(errbuf))
sys.exit(0)
else:
print("Got Required netmask")
handle = pcap_open_live(dev,snaplen,promisc,to_ms,errbuf)
if(handle is False):
print("Error unable to open session : {0}".format(errbuf.value))
sys.exit(0)
else:
print("Pcap open live worked!")
if(pcap_compile(handle,ctypes.byref(program),buf,optimize,mask) == -1):
# this requires we call pcap_geterr() to get the error
err = pcap_geterr(handle)
print("Error could not compile bpf filter because {0}".format(err))
else:
print("Filter Compiled!")
if(pcap_setfilter(handle,ctypes.byref(program)) == -1):
print("Error couldn't install filter {0}".format(errbuf.value))
sys.exit(0)
else:
print("Filter installed!")
if(pcap_next(handle,ctypes.byref(pkthdr)) == -1):
err = pcap_geterr(handle)
print("ERROR pcap_next: {0}".format(err))
print("Got {0} bytes of data".format(pkthdr.len))
pcap_close(handle)

㈥ 如何用Python爬取數據

方法/步驟

㈦ mac用什麼python抓包工具

常用的抓包工具有兩種:Charles和Fiddler
兩者的區別:Charles不分平台,可用於Mac、windows和Linux,而fiddler只能用於windows
共同點:可以抓到PC端的請求,手機設置代理後也可以抓到手機上的請求,也可以修改請求數據和返回數據

㈧ Python 爬蟲之抓包的理解

目前主流的移動端抓包工具為:TcpDump、WireShark、Fiddler, 他們的對比如下。

㈨ 如何利用python2.7實現網頁的抓包攔包改包功能有沒有範例

登陸其實就是將賬號密碼之類的POST到那個網站的伺服器。你可以通過抓包看到你點擊登陸時發的POST包。那麼你用python也模擬發一個一樣的包給伺服器,就實現了模擬登陸唄。

㈩ 如何利用Python嗅探數據包

一提到Python獲取數據包的方式,相信很多Python愛好者會利用Linux的libpcap軟體包或利用Windows下的WinPcap可移植版的方式進行抓取數據包,然後再利用dpkt軟體包進行協議分析,我們這里想換一個角度去思考:1.Python版本的pcap存儲內存數據過小,也就是說緩存不夠,在高並發下容易發生丟包現象,其實C版本的也同樣存在這樣的問題,只不過Python版本的緩存實在是過低,讓人很郁悶。2.dpkt協議分析並非必須,如果你對RFC791和RFC793等協議熟悉的話,完全可以使用struct.unpack的方式進行分析。如果你平常習慣使用tcpmp抓取數據包的話,完全可以使用它來代替pcap軟體包,只不過我們需要利用tcpmp將抓取的數據以pcap格式進行保存,說道這里大家一定會想到Wireshark工具,具體命令如下:tcpmpdst10.13.202.116andtcpdstport80-s0-ieth1-w../pcap/tcpmp.pcap-C1k-W5我們首先需要對pcap文件格式有所了解,具體信息大家可以參考其他資料文檔,我這里只說其重要的結構體組成,如下:sturctpcap_file_header{DWORDmagic;WORDversion_major;WORDversion_minor;DWORDthiszone;DWORDsigfigs;DWORDsnaplen;DWORDlinktype;}structpcap_pkthdr{structtimevalts;DWORDcaplen;DWORDlen;}structtimeval{DWORDGMTtime;DWORDmicroTime;}這里需要說明的一點是,因為在Python的世界裡一切都是對象,所以往往Python在處理數據包的時候感覺讓人比較麻煩。Python提供了幾個libpcapbind,這里有一個最簡單的。在windows平台上,你需要先安裝winpcap,如果你已經安裝了Ethereal非常好用。一個規范的抓包過程:importpcapimportdpktpc=pcap.pcap()#注,參數可為網卡名,如eth0pc.setfilter('tcpport80')#設置監聽過濾器forptime,pdatainpc:#ptime為收到時間,pdata為收到數據printptime,pdata#對抓到的乙太網V2數據包(rawpacket)進行解包:p=dpkt.ethernet.Ethernet(pdata)ifp.data.__class__.__name__=='IP':ip='%d.%d.%d.%d'%tuple(map(ord,list(p.data.dst)))ifp.data.data.__class__.__name__=='TCP':ifdata.dport==80:printp.data.data.data一些顯示參數nrecv,ndrop,nifdrop=pc.stats()返回的元組中,第一個參數為接收到的數據包,第二個參數為被核心丟棄的數據包。至於對於如何監控tcpmp生成的pcap文件數據,大家可以通過pyinotify軟體包來實現,如下:classPacker(pyinotify.ProcessEvent):def__init__(self,proct):self.proct=proctself.process=Nonedefprocess_IN_CREATE(self,event):logger.debug("createfile:%sinqueue"%self.process_IF_START_THREAD(event))defprocess_IN_MODIFY(self,event):self.process_IF_START_THREAD(event)logger.debug("modifyfile:%sinqueue"%self.process_IF_START_THREAD(event))defprocess_IN_DELETE(self,event):filename=os.path.join(event.path,event.name)logger.debug("deletefile:%s"%filename)defprocess_IF_START_THREAD(self,event):filename=os.path.join(event.path,event.name)iffilename!=self.process:self.process=filenameself.proct.put(filename)ifself.proct.qsize()>1:try:logger.debug("createconsumerproct.qsize:%s"%self.proct.qsize())consumer=Consumer(self.proct)consumer.start()exceptException,errmsg:logger.error("createconsumerfailed:%s"%errmsg)returnfilenameclassFactory(object):def__init__(self,proct):self.proct=proctself.manager=pyinotify.WatchManager()self.mask=pyinotify.IN_CREATE|pyinotify.IN_DELETE|pyinotify.IN_MODIFYdefwork(self):try:try:notifier=pyinotify.ThreadedNotifier(self.manager,Packer(self.proct))notifier.start()self.manager.add_watch("../pcap",self.mask,rec=True)notifier.join()exceptException,errmsg:logger.error("createnotifierfailed:%s"%errmsg)exceptKeyboardInterrupt,errmsg:logger.error("factoryhasbeenterminated:%s"%errmsg)在獲得要分析的pcap文件數據之後,就要對其分析了,只要你足夠了解pcap文件格式就可以了,對於我們來講只需要獲得TCP數據段的數據即可,如下:classWriter(threading.Thread):def__init__(self,proct,stack):threading.Thread.__init__(self)self.proct=proctself.stack=stackself.pcap_pkthdr={}defrun(self):whileTrue:filename=self.proct.get()try:f=open(filename,"rb")readlines=f.read()f.close()offset=24whilelen(readlines)>offset:self.pcap_pkthdr["len"]=readlines[offset+12:offset+16]try:length=struct.unpack("I",self.pcap_pkthdr["len"])[0]self.stack.put(readlines[offset+16:offset+16+length])offset+=length+16exceptException,errmsg:logger.error("unpackpcap_pkthdrfailed:%s"%errmsg)exceptIOError,errmsg:logger.error("openfilefailed:%s"%errmsg)在獲得TCP數據段的數據包之後,問題就簡單多了,根據大家的具體需求就可以進行相應的分析了,我這里是想分析其HTTP協議數據,同樣也藉助了dpkt軟體包進行分析,如下:defworker(memcache,packet,local_address,remote_address):try:p=dpkt.ethernet.Ethernet(packet)ifp.data.__class__.__name__=="IP":srcip="%d.%d.%d.%d"%tuple(map(ord,list(p.data.src)))dstip="%d.%d.%d.%d"%tuple(map(ord,list(p.data.dst)))ifp.data.data.__class__.__name__=="TCP":tcpacket=p.data.dataiftcpacket.dport==80anddstip==local_address:srcport=tcpacket.sportkey=srcip+":"+str(srcport)iftcpacket.data:ifnotmemcache.has_key(key):memcache[key]={}ifnotmemcache[key].has_key("response"):memcache[key]["response"]=Noneifmemcache[key].has_key("data"):memcache[key]["data"]+=tcpacket.dataelse:memcache[key]["data"]=tcpacket.dataelse:ifmemcache.has_key(key):memcache[key]["response"]=dpkt.http.Request(memcache[key]["data"])try:stackless.tasklet(connection)(memcache[key]["response"],local_address,remote_address)stackless.run()exceptException,errmsg:logger.error("connectremoteremote_addressfailed:%s",errmsg)logger.debug("oldheaders(nonecontent-length):%s",memcache[key]["response"])memcache.pop(key)exceptException,errmsg:logger.error("dpkt.ethernet.Ethernetfailedinworker:%s",errmsg)如果大家只是想單純的獲取IP地址、埠、流量信息,那麼問題就更簡單了,這里只是拋磚引玉。另外再提供一段代碼供參考:importpcap,dpkt,structimportbinasciidefmain():a=pcap.pcap()a.setfilter('udpportrange4000-4050')try:fori,pdataina:p=dpkt.ethernet.Ethernet(pdata)src='%d.%d.%d.%d'%tuple(map(ord,list(p.data.src)))dst='%d.%d.%d.%d'%tuple(map(ord,list(p.data.dst)))sport=p.data.data.sportdport=p.data.data.dport =int(binascii.hexlify(p.data.data.data[7:11]),16)print' :%d,From:%s:%d,To:%s:%d'%( ,src,sport,dst,dport)exceptException,e:print'%s'%en=raw_input()if__name__=='__main__':main()

閱讀全文

與python在線抓包相關的資料

熱點內容
dvd光碟存儲漢子演算法 瀏覽:757
蘋果郵件無法連接伺服器地址 瀏覽:962
phpffmpeg轉碼 瀏覽:671
長沙好玩的解壓項目 瀏覽:144
專屬學情分析報告是什麼app 瀏覽:564
php工程部署 瀏覽:833
android全屏透明 瀏覽:736
阿里雲伺服器已開通怎麼辦 瀏覽:803
光遇為什麼登錄時伺服器已滿 瀏覽:302
PDF分析 瀏覽:484
h3c光纖全工半全工設置命令 瀏覽:143
公司法pdf下載 瀏覽:381
linuxmarkdown 瀏覽:350
華為手機怎麼多選文件夾 瀏覽:683
如何取消命令方塊指令 瀏覽:349
風翼app為什麼進不去了 瀏覽:778
im4java壓縮圖片 瀏覽:362
數據查詢網站源碼 瀏覽:150
伊克塞爾文檔怎麼進行加密 瀏覽:892
app轉賬是什麼 瀏覽:163