如何利用Python嗅探数据包

如何利用Python嗅探数据包,第1张

一提到Python获取数据包的方式,相信很多Python爱好者会利用Linux的libpcap软件包或利用Windows下的WinPcap可移植版的方式进行抓取数据包,然后再利用dpkt软件包进行协议分析,我们这里想换一个角度去思考:1.Python版本的pcap存储内存数据过小,也就是说缓仿枣竖存不够,在高并发下容易发生丢包现象,其实C版本的也同样存在这样的问题,只不过Python版本的缓存实在是过低,让人很郁闷。2.dpkt协议分析并非必须,如果你对RFC791和RFC793等协议熟悉的话,完全可以使用struct.unpack的方式进行分析。如果你平常习惯使用tcpdump抓取数据包的话,备大完全可以使用它来代替pcap软件包,只不过我们需要利用tcpdump将抓取的数据以pcap格式进行保存,说道这里大家一定会想到Wireshark工具,具体命令如下:tcpdumpdst10.13.202.116andtcpdstport80-s0-ieth1-w../pcap/tcpdump.pcap-C1k-W5我们首先需要对pcap文件格式有所了解,具体信息大家可以参考其他资料文档,我这里只说其重要的结构体组成,如下:sturctpcap_file_header{DWORDmagicWORDversion_majorWORDversion_minorDWORDthiszoneDWORDsigfigsDWORDsnaplenDWORDlinktype}structpcap_pkthdr{structtimevaltsDWORDcaplenDWORDlen}structtimeval{DWORDGMTtimeDWORDmicroTime}这里需要说明的一点是,因为在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()返回的元组中,第一个参数为接收到的数据包,第二个参数为被核心丢弃的数据包。至于对于如何监控tcpdump生成的pcap文件数据,大家可以通过pyinotify软件包来实现,如下:classPacker(pyinotify.ProcessEvent):def__init__(self,product):self.product=productself.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.product.put(filename)ifself.product.qsize()>1:try:logger.debug("createconsumerproduct.qsize:%s"%self.product.qsize())consumer=Consumer(self.product)consumer.start()exceptException,errmsg:logger.error("createconsumerfailed:%s"%errmsg)returnfilenameclassFactory(object):def__init__(self,product):self.product=productself.manager=pyinotify.WatchManager()self.mask=pyinotify.IN_CREATE|pyinotify.IN_DELETE|pyinotify.IN_MODIFYdefwork(self):try:try:notifier=pyinotify.ThreadedNotifier(self.manager,Packer(self.product))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,product,stack):threading.Thread.__init__(self)self.product=productself.stack=stackself.pcap_pkthdr={}defrun(self):whileTrue:filename=self.product.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()

常见有使用:scp命令、xshell软件里的xftp程序、U盘挂载、服务器自带的lrzsz程序。

一、scp使用说明:

1、把本机的文件传给目的服务器:

scp get66.pcap root@192.168.1.147:/super

   

备注:把本机get66.pcap拷贝到147这台服务器的super目录下,需要提供147的密码

2、在本机上执行scp,把远端的服务器文件拷贝到本机上:

scp root@192.168.1.147:/super/dns.pcap /

   

备注:在本机上执行scp,把远端服务器的dns.pcap文件拷贝到本机的根目录

3、拷贝目录下的所有文件:

scp -r /super/ root@192.168.1.145:/

 世握  

备注:把/super/目录下的所有文件,拷贝到145服务器根目录下

二、xshell软件里的xftp程序:

xshell这个软件很好,强烈推荐哦!!!

里面有个xftp小插件,可以支持文件在笔记本和服务器互传,这个小插件需要单独在网上下载,直接百度搜xftp,很方便。

1、点击xshell软件上的xftp图标(前提xftp已经下载好)

2、然后就可以互传文件了啊

三、U盘挂载

文件在U盘,那好办,直接插到服务器上,然后挂载上,就能把U盘上的文件拷贝到服务器上了

1、执行fdisk -l查看:

fdisk -l

备注:插上U盘后,fdisk -l查看服务器识别到了,/dev/sdc是我的U盘,16G的

2、挂载到自定义目录下:

mkdir /upan  则慧

新建一个目录

mount /dev/sdc1 /upan/

把U盘挂载到刚新建的目录下

cd /upan/ls

就能看到U盘里所有的文件了

3、把文件拷到服务器home下

cp autorun.inf /home/

把U盘里的autorun.inf拷贝到服务器的home目录下

4、卸载U盘

文件拷到服务器后,建议先手动执行命令,然后再拔U盘,防止U盘损坏!!!

cd /umount /dev/sdc1

好了,拔出U盘吧(按照上面的来,先退回到根目录下,再执行umount命令,不然会报错提示U盘在使用,无法卸载)

四、服务器自带的lrzsz程序

现在大多数Linux服务器都带有lrzsz程序,方便上传下载文件,如果没有,可以直接下载rpm包安装下就好搜盯庆。

lrzsz安装包链接:http://down.51cto.com/data/2322755

1、rz(笔记本上传给服务器)

1

选择笔记本上文件传给服务器

2、sz(服务器上的文件拷贝给笔记本)

sz test.tar

把服务器的test.tar拷贝给笔记本。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/8152795.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存