Modbus Slave缓冲区溢出漏洞CVE-2022-1068分析与复现

news2025/1/16 3:38:43

漏洞概述

Modbus Slave是一个模拟工业领域通信协议Modbus从站的上位机软件,主要用于测试和调试Modbus从设备。该软件7.4.2以及以前的版本,在注册时,未对注册码长度进行安全检查,存在缓冲区溢出漏洞,导致软件崩溃。

影响范围

Modbus Slave 7.4.2以及以前的版本

复现环境

操作系统:Win7 sp1 32位操作系统

分析工具:IDA、OD、Windbg、Procexp

漏洞分析

分析时使用的版本为7.1.2.1357。

首先安装modbusslavesetup32bit_7.1.2.1357.exe程序,默认安装后主程序路径为C:\Program Files\Modbus Tools\Modbus Slave\mbslave.exe。

根据exploit-db上已公开的poc.py生成Modbus.txt,Poc比较简单,Modbus.txt的内容为736个字符“A”,如下图所示:

使用Windbg调试器调试主程序mbslave.exe,然后点击mbslave.exe菜单栏的“Connection”按钮,在弹出的菜单中选择“Connect”,此时将弹出注册对话框,如下图所示:

复制poc文件Modbus.txt中的字符串内容,粘贴到注册对话框中,最后点击“OK”按钮,验证是否触发漏洞,如果poc验证成功,Windbg将捕获到异常,如下图所示:

在Windbg中使用k命令查看调用函数调用栈,发现栈中函数的返回地址已被覆盖为一个非常规值0x92989d93,说明发生了栈溢出,如下图所示:

接下来查找栈溢出的原因。

为更方便和直观,使用调试器OD重新调试程序mbslave.exe,在异常发生地址所在函数0x426B40下断点,再次将poc内容复制到注册对话框中,触发漏洞,调试OD将停止在断点处,此时,栈中的函数返回地址为正常值0x426141,如下图所示:

为了定位栈中函数返回地址被覆盖的代码,需要对保存函数返回地址的栈地址0x12f07c下硬件写断点,然后继续运行,程序将停止在0x426e00代码处,此时,栈中的返回地址已被覆盖为0x426193,如下图所示:

根据上图,可以看出,正是地址0x426DF9处的汇编代码,将EAX最低字节AL的值0x93覆盖栈中的函数返回地址的最低字节,说明导致栈溢出的代码就是该条汇编代码,当前除了覆盖栈中返回地址,栈溢出还覆盖了栈中结构化异常处理地址(SEH)等内容。

在反编译工具IDA中可以看到漏洞产生处的伪指令为 MultiByteStr[v52] = *(_WORD *)v59,此时缓冲区的大小为300个字节,长度太小导致了溢出,覆盖了栈中函数返回地址和正常变量值,导致后续指令执行错误,使程序崩溃,如下图所示:

从上述的分析可知,溢出产生时,覆盖的数据并不是poc中的”A”字符,那么覆盖的数据是否来源于poc中,经过运算后的数据呢?

在IDA中查找数据来源,结合OD中动态调试分析,发现覆盖的数据是地址0x00426CFA处的代码运算后的结果,这是一条异或运算的汇编代码,按字节异或,如下图所示:

异或的源数据是poc中字符串按两位一组转化为十六进制的值,异或的KEY为“97280132”,比如第一轮循环时,将poc中的前两位字符串“AA”转换为0xAA,然后与KEY的第一位字符“9”,十六进制为0x39进行异或,最后将异或的结果放到栈中缓冲区MultiByteStr[v52]进行保存,如果poc中的字符串个数大于600个字符(600=300*2,poc中为736个字符“A”),将发生栈溢出,可以覆盖栈中SEH地址,函数返回地址和局部变量等,导致程序崩溃。

既然发生了栈溢出,并且数据可控,那么是否能执行任意shellcode呢?

漏洞利用

常见的栈溢出利用可以利用被覆盖的函数返回地址执行任意shellcode,即漏洞发生后,覆盖了栈中函数返回地址,当当前函数执行完毕后,将跳转到函数返回地址执行代码,但是该程序中开启了Security Cookie栈保护安全机制,位于0x00427237地址处,在函数返回前,Cookie检验失败,无法利用该方法。

除此之外,溢出还覆盖了栈中结构化溢出处理(SEH)函数地址,当异常发生时,将跳转到异常处理函数执行代码,但是该程序中开启了Safe SEH安全保护机制,简单来讲,不是预定义的异常处理函数地址,不予执行,使用 dumpbin /loadconfig mbslave.exe命令可以查看Safe SEH 表,如下图所示:

既然开启了Safe SEH,是否有办法绕过呢?常见的绕过方法如下:

1、攻击返回地址绕过,该程序开启了Security Cookie,无法绕过。

2、虚函数绕过,溢出覆盖范围有限,无法覆盖虚函数。

3、从堆中绕过,将shellcode布置在堆中 ,SEH处理函数指向这个地址即可,该程序开启数据执行保护(DEP),无法将数据作为代码执行。

4、利用未启用Safe SEH模块绕过,可以把这个模块的指令作为跳板,去执行shellcode,该程序没有未启用Safe SEH的模块。

5、加载模块之外的地址绕过,内存中有一些Map类型的映射文件,在这些文件中找到跳板指令覆盖SEH处理函数地址即可绕过,该程序开启数据执行保护(DEP),无法将数据作为代码执行。

总的来说,该程序在测试系统win7 sp1上,无法绕过Safe SEH执行shellcode,如果使用低版本的系统,比如Windows XP低版本系统,可以实现执行任意shellcode,因为Safe SEH是Windows XP sp2以及之后的版本中加入的安全特性。

poc

https://github.com/webraybtl/CVE-2022-1068

参考链接

https://www.exploit-db.com/exploits/50536

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-1068

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/159061.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在 Kubernetes 中部署并使用 KubeEdge

作者:马伟,青云科技容器顾问,云原生爱好者,目前专注于云原生技术,云原生领域技术栈涉及 Kubernetes、KubeSphere、KubeKey 等。 边缘计算在广泛制造业、工业、零售和金融等行业,随着云原生应用的兴起&#…

UDS诊断系列介绍07-2E服务

本文框架1. 系列介绍2E服务概述2. 2E服务请求与应答2.1 2E服务请求2.2 2E服务肯定响应2.3 2E服务否定应答3. Autosar系列文章快速链接1. 系列介绍 UDS(Unified Diagnostic Services)协议,即统一的诊断服务,是面向整车所有ECU的一…

Webpack打包图片-JS-Vue文件

打包图片等静态资源 资源模块 | webpack 中文文档 (docschina.org) 1、加载图片案例准备 为了演示我们项目中可以加载图片,我们需要在项目中使用图片,比较常见的使用图片的方式是两种: img元素,设置src属性;其他元…

基于Java jsp+mysql+Spring的汽车出租平台租赁网站平台设计和实现

基于Java jspmysqlSpring的汽车出租平台租赁网站平台设计和实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 …

蓝队攻击的四个阶段(二)

目录 一,漏洞利用工具 (1)WebLogic 全版本需洞利用工具 (2)Struts2 综合漏洞利用工具 (3)sqlmap 注入工具 (4)vSphere Client RCE 漏洞(CVE-2021-21972)利用工具 (5)Windows Print Spooler 权限提升漏洞(CVE-2021-1675) (6)Exchange Server漏洞组合利用(CVE-2…

JVM-【面试题】-带你了解对象的创建过程

本文介绍对象在jvm的创建过程该图是对象在jvm的创建过程一、类加载检查虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那…

图机器学习-图机器学习传统方法

图机器学习-图机器学习传统方法 最近在学习一些GNN相关的知识,想写一些笔记记录一下自己的学习过程,主要的学习资料为CS224W课程主页上面的资料和b站同济子豪兄的中文讲解。这篇博客是我2023年的第一篇博客,想以图机器学习中的传统方法作为博…

项目管理工具dhtmlxGantt甘特图入门教程(八):数据加载(三)

dhtmlxGantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表,可满足项目管理控件应用程序的所有需求,是最完善的甘特图图表库。 这篇文章给大家讲解如何利用 dhtmlxGantt正确保存和显示任务的结束日期,本节将给你一个明确答案。 Dht…

异常-捕获业务异常踩坑记录

事情是这样,用了google的一个本地缓存框架,就是在查询数据的时候如果有就取缓存,没有就发http请求调接口,但是http请求也会有查询失败的时候,查询失败就会手动抛一个业务异常,然后我会在外层各种捕获异常&a…

三消游戏查找算法的原理和实现

本文首发于公众号: 小蚂蚁教你做游戏。欢迎关注领取更多学习做游戏的原创教程资料,每天学点儿游戏开发知识。嗨!大家好,我是小蚂蚁。今天这篇文章分享一下三消查找算法的原理和实现,其实三消的机制最早源于《宝石方块》…

无联不成春,2023创宇网安春联展!

春 联 又叫“春贴”“门对”“对联” 它以对仗工整、简洁精巧的文字 描绘美好形象,寄托美好愿望 是中国独特的文学形式 网络安全的列车已驶入2023,癸卯兔年新春将至! 热爱中华优秀传统文化的创宇人,也纷纷以春联为载体&…

大网进阶安全刷题讲解(带答案)(1)

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.大网进阶安全刷题 前言 本章将会讲解大网进阶安全刷题讲解。 一.大网进阶…

测试开发 | AppCrawler 自动遍历测试实践(二):定制化配置

本文为霍格沃兹测试学院学院学员课程 AppCrawler 学习笔记,文末加群一起学习交流。 定制化配置 自动遍历测试技术以及工具该如何选择和快速入门?经过对比和需求,最终选择测试架构师思寒大佬的 AppCrawler 作为自动遍历测试的工具。以下就分享…

LeetCode 112. 路径总和

🌈🌈😄😄 欢迎来到茶色岛独家岛屿,本期将为大家揭晓LeetCode 112. 路径总和,做好准备了么,那么开始吧。 🌲🌲🐴🐴 一、题目名称 LeetCode 112…

Cadence PCB仿真使用Allegro PCB SI按照指定的规则自动创建差分对方法图文教程

⏪《上一篇》   🏡《总目录》   ⏩《下一篇》 目录 1,概述2,配置方法3,总结1,概述 本文简单介绍使用Allegro PCB SI按照指定的规则自动创建差分的方法。 2,配置方法 第1步:打开待仿真的PCB文件,并确认软件为Allegro PCB SI 如果,打开软件不是Allegro PCB SI则可…

在使用示波器时,为什么有些波形感觉一直在晃?

我们可以从三个角度进行分析: 采样分析: 1、示波器采样信号的过程如上图:采样——处理——采样——处理。 2、处理时间也称死区时间,死区时间内示波器不监测输入信号。 3、提高波形刷新率,实质上是减少了死区时间&…

MyBatis-Plus数据安全保护(配置安全)

SpringBootMyBatis-Plus配置安全 1.该功能为了保护数据库配置及数据安全,在一定的程度上控制开发人员流动导致敏感信息泄露2.加密配置 mpw: 开头紧接加密内容( 非数据库配置专用 YML 中其它配置也是可以使用的 )3.随机密钥请负责人妥善保管&a…

设计模式_创建型模式 -《原型模式》

设计模式_创建型模式 -《原型模式》 笔记整理自 黑马程序员Java设计模式详解, 23种Java设计模式(图解框架源码分析实战) 概述 原型模式 (Prototype Pattern) :用一个已经创建的实例作为原型,通过复制该原型对象来创建…

Kafka的相关知识

一. Kafka基本介绍 Kafka是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统。具有:高吞吐量、低延迟、可扩展性、持久性、可靠性、容错性、高并发等特性。常见的…

RabbitMQ(五)常见面试题

目录1. 什么是 RabbitMQ?2.为什么要使用 RabbitMQ?3.使用 RabbitMQ 的场景4.如何确保消息正确地发送至 RabbitMQ?如何确保消息接收方消费了消息?5.如何避免消息重复投递或重复消费?6.消息基于什么传输?7.消…