导航:首页 > 编程语言 > 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