python实现图片嗅探工具——自编driftnet

article/2025/9/15 20:02:15

python实现图片嗅探工具——自编driftnet

  • 前言
  • 一、数据包嗅探
  • 二、图片捕获
  • 三、图片显示及主函数
  • 写在最后

前言

想必尝试过中间人攻击(MITM)的小伙伴,大概率是知道driftnet的。这是一款简单使用的图片捕获工具,可以很方便的从网络数据包中抓取图片,从而将监听对象所浏览的图片尽收眼底。
苦于driftnet对windows的支持不是特别友好,而且近日闲来没事,于是我决定用python写一个简单的图片嗅探工具。
哐哐哐~搞定之后,效果还是不错的:
在这里插入图片描述
简单设置过后,开始监听:
在这里插入图片描述
注意:本工具不具有arp欺骗的功能,因此需要结合arp欺骗相应工具使用(如EvilFoca)

一、数据包嗅探

数据的嗅探采用的是scapy库的sniff模块,一句话便能搞定:

# 嗅探函数
def dosniff(filter_rule,sniff_time,prn_f):sniff(filter=filter_rule,timeout=sniff_time,prn=prn_f) # 监听数据包

其中prn参数是一个回调函数,即每抓取到一个数据包之后将执行这个函数,而这也是捕获数据包中图片的关键,具体实现,客官您望下看~

二、图片捕获

这里需要明确的是,在图片的传输过程中,往往一个TCP包的长度是不够的,所以一张图片往往分为很多个包。因此,为了捕获其中的图片,我们必须对图片数据进行识别,并将对应的数据包合并(相同的ack值)。
具体思路如下:

  1. 找到有上网数据的数据包
if p.haslayer(Raw): # 找出有上网数据的
  1. 判断是否为含有图片的HTTP响应
if 'Content-Type: image' in str(load): # 如果为图片响应xxxxx # 提取HTTP协议中的相关信息(图片长度、图片后缀、IP地址、以及部分图片二进制数据)
else:xxxxx # 判断是否为图片数据的某一部分,如果是则将数据添加进去

3、把图片数据合并并生成图片

for i in img_list[ack][1:]: img += i
if len(img) == length: # 如果图片数据已经完整imgname = '%d.%s'%(N,img_map[postfix])with open('./images/%s/%s'%(target,imgname),'wb') as f:f.write(img)   

完整的回调函数:

# 处理数据包
def handlepacket(p):global N,img_list,imgvalue_list,img_mapif p.haslayer(Raw): # 找出有上网数据的load = p.load ack = p.ack try:## 如果为图片相应,且带有HTTP头(即第一个图片TCP包)if 'Content-Type: image' in str(load): # 如果为图片响应postfix = re.findall('image/(.*?)\\\\r',str(load))[0] # 图片后缀length = int(re.findall('Content-Length: (.*?)\\\\r',str(load))[0]) # 图片数据长度ip_src = p['IP'].src # 源头IPip_dst = p['IP'].dst # 目的IPimg_list[ack] = [(postfix,length,ip_src,ip_dst)] # 0为图片信息(以下为图片二进制数据)img_load=load[load.find(b'\x0d\x0a\x0d\x0a')+4:] # 去除请求头部分,只要图片数据img_list[ack].append(img_load)## 如果为某图片的后续数据包elif ack in list(img_list.keys()):img_load = load # 所有load均为图片数据img_list[ack].append(img_load)img = bytes()postfix = img_list[ack][0][0] # 图片后缀length = img_list[ack][0][1] # 图片长度ip_src = img_list[ack][0][2] # 源头IP ip_dst = img_list[ack][0][3] # 目的IPfor i in img_list[ack][1:]: img += iif len(img) == length: # 如果图片数据已经完整imgname = '%d.%s'%(N,img_map[postfix])with open('./images/%s/%s'%(target,imgname),'wb') as f:f.write(img)img = Image.open(BytesIO(img))img = resize(200,200,img)img_tk = ImageTk.PhotoImage(img)imgvalue_list.append(img_tk)Label(frame,image=imgvalue_list[-1],bg='black').grid(row=(N-1)//4,column=(N-1)%4,padx=23,pady=3)canvas.create_window((ww/2,math.ceil(N/4)*105), window=frame)  #create_window canvas['scrollregion'] = (0,0,ww,math.ceil(N/4)*210)canvas.yview_moveto(1)print('%s【driftnet】: saving image data as "%s"'%(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),imgname))N += 1except:pass

三、图片显示及主函数

为了将捕获的图片显示出来,我采用tkinter库,具体如下:

# 主函数
if __name__ == '__main__':printinfo()target = ''sniff_time = 24*60*60while True:choice = input('\n请选择:')if choice not in ['1','2','3','4','5']:print(colored('>>>选择错误,请重新输入!','red'))time.sleep(1)printinfo()else:if choice == '1':scan()if choice == '2':target = input('>>>监听目标(对方IP地址):')print('监听目标设置成功!')time.sleep(1)printinfo()if choice == '3':sniff_time = input('>>>监听时间(默认为86400秒):')sniff_time = int(sniff_time)print('监听时间设置成功!')time.sleep(1)printinfo()if choice == '4':if target == '':print(colored('监听目标未设置!','red'))time.sleep(1)printinfo()else:print('监听目标为"%s"  监听时间为"%s秒"'%(colored(target,'green'),colored(sniff_time,'green')))op = input('是否开始(Y/N)?')if not (op == 'Y' or op == 'y'):printinfo()continue# 创建GUI## 初始化全局变量N = 1 # 图片编号img_list = {} # 图片字典,用于存储图片信息,以及对应数据包imgvalue_list = [] # 图片数据,用于在画布上显示(防止由于局部变量等原因丢失变量)## 相关参数bgcolor = 'black'## 创建root窗口(1000x630)root = Tk()                   root.title('driftnet') # 设置标题root.iconbitmap('logo.ico')root.config(bg=bgcolor)sw = root.winfo_screenwidth()  # 屏幕宽度sh = root.winfo_screenheight() # 屏幕高度ww = 1000 # 窗口宽度wh = 630 # 窗口高度x = (sw-ww)/2 # 窗口横坐标y = (sh-wh)/2 # 窗口纵坐标root.geometry('%dx%d+%d+%d' %(ww,wh,x,y))root.resizable(width=False, height=False) # 窗口大小无法更改## 创建画布canvascanvas=Canvas(root,width=ww,height=wh) #创建canvascanvas.grid()## 创建frame窗口frame = tk.Frame(canvas)frame.grid()## 滚动条vbar=Scrollbar(root,orient=VERTICAL) #竖直滚动条vbar.place(x=ww-20,y=0,width=20,height=wh)vbar.configure(command=canvas.yview)canvas.config(yscrollcommand=vbar.set) #设置 # 嗅探数据if not os.path.exists('./images'):os.mkdir('./images')if not os.path.exists('./images/%s'%target):os.mkdir('./images/%s'%target)filter_rule = "tcp src port 80 and dst host {}".format(target) # 过滤规则print('开始嗅探.....')t = threading.Thread(target=dosniff,args=(filter_rule,sniff_time,handlepacket,))t.start()# 进入消息循环root.mainloop()# 关闭嗅探线程stop_thread(t)#input() # 处理stop_thread多余的输出流printinfo()if choice == '5':print('Good bye!')exit(0)

这里遇到的坑主要是滚动条自动下滑的问题(即当我们不断捕获到图片的时候,如果让界面将所有图片显示出来,并且滚动条始终保持在最小面)。

写在最后

代码些许有些混乱,主要是想跟小伙伴们分享下一些思路,也希望可以有所帮助或启发:

  • 如何从数据包中捕获图片数据
  • Tkinter如何实现滚动条自动下滑

最后,感谢各位大大的耐心阅读~
慢着,大侠请留步… 动起可爱的双手,来个赞再走呗 (๑◕ܫ←๑)


http://chatgpt.dhexx.cn/article/hhI9pld6.shtml

相关文章

kali中 arpspoof、driftnet、流量转发的图片抓取

1、开启内核转发模式(echo 1为转发 echo 0为拦截) echo 1 /proc/sys/net/ipv4/ip_forward 配置完成使用命令查看cat /proc/sys/net/ipv4/ip_forward 2、使用 Arpspoof 开始攻击 命令:Arpspoof -i (自己网卡) -t 目标IP 网关 3、打开另一个终端 查看dri…

ARP欺骗攻击(流量图片)——dsniff与driftnet使用

ARP欺骗攻击(流量&图片) 原理: 首先我们![请添加图片描述](https://img-blog.csdnimg.cn/7de7923387224bcda1ea4be958032ae9.png 要明白何为ARP(地址解析协议):是根据 IP地址 获取 物理地址 的一个 TC…

NO.26——利用ettercap和driftnet截获数据流里的图片

原理 Ettercap最初设计为交换网上的sniffer,但是随着发展,它获得了越来越多的功能,成为一款有效的、灵活的中介攻击工具。它支持主动及被动的协议解析并包含了许多网络和主机特性(如OS指纹等)分析。 Ettercap…

linux嗅探器抓包,Kali Linux 嗅探/欺骗工具 driftnet 教程

日期:2018年01月11日 观看: 13,491 C 次 Driftnet是一个监听网络流量并从它观察到的TCP流中提取图像的程序。有趣的是看到很多网络流量的主机上运行。在实验性增强中,driftnet现在从网络流量中挑选出MPEG音频流,并尝试播放它们。 Driftnet是一款从网络流量捕获图像并将其显…

ARP中使用driftnet工具捕获图片

在进行任何网络攻防实验时,请务必遵守当地法律法规以及道德准则,必须遵守法律规定,只能在合法授权的情况下进行实验和演练。 预备知识 基本网络概念:了解TCP/IP协议、IP地址、MAC地址等基本网络概念。 ARP协议:了解A…

使用Arp欺骗与driftnet工具监听局域网信息

【重点声明】此系列仅用于工作和学习,禁止用于非法攻击,非法传播。一切遵守《网络安全法》 环境: Ubuntu 16.0.4攻击主机:192.168.1.130,Windows10 目标机:192.168.1.219 扫描该网段存活的主机&#xff1…

(arpspoof + driftnet)实现arp欺骗

(arpspoof driftnet)实现arp欺骗 虚拟机环境:kali linux window 7 文章目录 (arpspoof driftnet)实现arp欺骗前言一、安装arpspoof和driftnet二、Attack1.信息收集2.MAC欺骗与流量截图 总结 前言 ARP欺骗:欺骗局域网内主机的网关MAC地址&#xff0c…

自举电路介绍

自举电路也叫升压电路,利用自举升压二极管,自举升压电容等电子元件,使电容放电电压和电源电压叠加,从而使电压升高.有的电路升高的电压能达到数倍电源电压。 升压电路原理 举个简单的例子:有一个12V的电路&#xff0c…

秒懂电容自举电路

自举电容的核心原理是:电容两端电压不能突变。 从这句话中,我们可以获取到两个关键字:两端电压、不能突变。 两端电压指的是电容一边相对另一边的电压,我们知道电压本身就是个参考值(一般认定参考GND,认定…

STM32自举程序

空间分布 将flash空间分为自举程序区和应用程序区。 应用程序区存放用户应用程序。 自举程序负责获取用户应用程序数据,并写入应用程序区,实现程序升级。 程序跳转 自举程序需要可以跳转到应用程序区,当然应用程序也可以根据需要设计成可…

自举电路(升压电路)

the boost converter,或者叫step-up converter,是一种开关直流升压电路,它可以是输出电压比输入电压高。基本电路图见图1.假定那个开关(三极管或者mos管)已经断开了很长时间,所有的元件都处于理想状态,电容电压等于输入电压。下面…

Web精美个人网页静态展示

今天和大家分享一个纯用web(htmlcssjs)实现的一个优美的个人信息菜单资料展示。 项目结构很简单只有一个html文件一个css样式文件以及一个js脚本文件。 项目实现的功能: 1:进入首页是一个天气样式页面(显示当前时间…

【测控电路】自举式高输入阻抗放大电路

ref 测控电路第五版 有些传感器输出阻抗很高, 要求其测量放大电路有高输入阻抗. 开环集成运放的输入阻抗通常很高, 反相运放输入阻抗远低于同相运放, 为提高输入阻抗, 可在输入端加接电压跟随器, 但会引入共模误差. 在要求较高的场合下, 可采用高输入阻抗集成运放/采用通用运放…

自举电路工作原理分析

OTL功率放大器中要设自举电路,图18-9所示是自举电路。电路中的C1, R1和R2构成自举电路。C1为自举电容,R1O 隔离电阻,R2将自举电压加到 VT2基极。 向左转 | 向右转 VT1集电极信号为正半周期间VT2导通、放大,当输入VT2基极的信号比较大 时&…

STM32自举程序,你了解多少?

置顶/星标公众号,不错过每一条消息 本文主要讲述STM32启动模式中System memory的内容,以及围绕的相关内容。 1写在前面 STM32中内嵌了一段自举程序,可能很多人不知道。 那段自举程序存放在System memory(系统存储器)中…

静态网站以及动态网站

学习时间:7月7日-8日 学习素材:B站博主 学习的内容:静态网站以及动态网站 静态网站就是没有采用任何程序开发的网站,纯粹采用HTML语言编写,不要求懂太多网站制作知识,使用一般的软件就可以制作网页了。网页…

编译器之自举

**要阅读本文,不需要太高深的编译原理知识,甚至不需要编译相关的知识。但是本文也不是面向对电脑一无所知的读者的,你至少要知道: 不管是exe可执行文件还是Linux下的程序,都是一些二进制代码,我们称之为机器…

DC-DC电路中自举电容和自举电阻是什么?

文章目录 1. 什么是自举电容2. 自举电容的原理3. 自举电容的额定电压如何选择4. 什么是自举电阻1. 什么是自举电容 DCDC BUCK芯片有一个管脚叫BOOT,有的叫BST,如下是一个DCDC芯片对BOOT管脚的解释,在外部电路设计时,BOOT和SW管脚之间,需要加一个电容,一般是0.1uF,连接到…

自举电路原理分析

原文来自公众号:工程师看海 自举电路字面意思是自己把自己抬起来的电路,是利用自举升压电容的升压电路,是电子电路中常见的电路之一。 我们经常在IC外围器件中看到自举电容,比如下图同步降压转换器(BUCK)电…

自举电路分析

1.什么是自举电路 自举电路也叫升压电路,是利用自举升压二极管,自举升压电容等电子元件,使电容放电电压和电源电压叠加,从而使电压升高,有的电路升高的电压能达到数倍电源电压。 有一个12V的电路,电路中有一…