winrar(CVE-2023-38831)漏洞原理

2024-03-07 12:12
文章标签 2023 漏洞 原理 cve winrar 38831

本文主要是介绍winrar(CVE-2023-38831)漏洞原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

背景

WinRAR是最受欢迎的压缩工具之一,在全球拥用超过5亿用户。2023 年 7 月 10 日,国外威胁情报机构Group-IB研究DarkMe恶意软件传播时,在 WinRAR 处理 ZIP 文件格式中发现了一个以前未知的漏洞。通过利用该程序中的漏洞,威胁行为者能够制作 ZIP 存档,作为各种恶意软件系列的载体。2023 年 8 月 15 日,MITRE Corporation 将此零日漏洞标记为 CVE-2023-38831

 

漏洞详情

漏洞受影响范围:5亿WinRAR用户;

漏洞受影响版本:WinRar < v6.23所有版本。

图片

漏洞复现

WinRar在小于6.23版本中点击压缩包中的文件预览时错误得将被点击的文件名和同名文件夹下的所有文件释放到临时目录中,随后调用Shellexecute执行文件造成代码执行。

正常情况下windows文件系统不允许同一路径下存在同名的文件或文件夹,但是可以通过一些途径绕过此限制。

1.创建一个test.txt1文件和一个test.txt2文件夹,在test.txt2文件夹中创建一个test.txt3.cmd,写入打开计算机,然后打包成zip文件。

图片

图片

2.使用16进制编辑器,如010Editor,对压缩文件中的文件名进行更改。

图片

这里代表有3个文件,我们把txt后面的数字123都改成空格,空格x`对应的acsll码是0x20。

图片

再去看压缩包发现文件夹和文件已经是同名的。

图片

此时去双击test.txt 文件,会发现.cmd文件被执行了,弹出了计算机,且临时目录下提取了两个文件。

图片

至此,Winrar代码执行漏洞复现完毕,下面我们了解下,这个过程发生了什么,为什么要该掉一个字符为空格(0x20)?为什么点击了一个文件却解压出来了两个文件?为什么test.txt .cmd被执行了?

Winrar的执行流程

Winrar是一个GUI程序,在用户双击一个文件预览时会发送一个WM_LBUTTONDOWN消息,然后主程序根据此消息获得点击的文件名,也就是click_name,随即主程序会遍历压缩包中所有的deFileName(文件夹也在此列),当deFileName==click_name那么该文件就会被释放出来并写入临时目录中,也就是说同名文件夹下的所有文件都会被释放出来。最终Winrar会初始化ShellExecuteInfo结构体,将click_name释放后的路径设置到lpFileName中,并调用Windows系统APi ShellExecute函数执行该文件。

图片

图片

我们通过调试逆向的方式看到整个流程确实是这样的,而且在调用Shellexecute函数时可以看到文件名也确实是test.txt 。为什么最终是test.txt .cmd被执行了。带着这个问题继续往下看,我们知道一个程序被运行是要被加载到进程空间的,因此Shellexecute函数最终也会调用CreateProcess等函数来创建进程,于是在进程创建函数上下断点进行调试运行。

图片

此时断点命中CreateProcessW,但这里发现一个问题,WinRAR在调用ShellexecuteW时lpFileName参数明明是"test.txt ",后面调用CreateProcesssW创建进程时却变成了”test.txt .cmd“。很明显ShellexecuteW做了一些我们不知道的操作,更改了参数。那shellexecute做了什么就变成了了解问题的关键。

ShellExecute函数

Shellexecute在处理一个文件时会通过文件路径获取文件的扩展名(PathFindExtension),然后通过注册表和**AssocQueryString**等文件关联函数获取绑定了扩展名的关联程序(例:.xml文件的关联程序:MS Edge微软浏览器)的绝对路径,最后将创建进程所需的ModuleFileName参数设置为获取到的绝对路径,CommandLine参数设置为文件的绝对路径,并调用CreateProcessW启动进程。

如果没找到扩展名,则会对当前目录下的所有同名文件进行遍历,如果存在同名文件且是可执行文件(com、cmd、bat、exe等)则使用该可执行文件作为进程的模块地址。若找不到同名文件,或没有找到扩展名的关联程序,那么会弹出窗口让用户自己选择要使用的处理程序。

以正常的test.txt文件为例

该文件为正常的.txt文本文件,后面无空格。此时再到CreateProcessW断点处,可以看到ModuleFIleName(lpApplicationName)参数被设置为notepad++的地址,CommandLine参数被设置为test.txt文件地址,这些参数都是Shellexecute进行设置的。

图片

Shellexecute会通过.txt后缀名在注册表中找到绑定的ProgID(一般在默认键值中),如果没设置默认值也可以在子键OpenWithProgID中找到绑定的ProgID,随后根据ProgID找到注册的处理程序的路径地址,将之设为ModuleFilName参数的值。

图片

图片

图片

图片

以恶意的test.txt 文件为例

注意,test.txt后面有个空格,此时就变成了最初看到的情况,test.txt .cmd被设置成了创建进程的参数。

图片

接下来我们通过逆向ShellExecute函数看看为什么加了空格后,原本的执行逻辑就改变了。

ShellExecute函数逆向

ShellExecute在Shell32.dll中,大致执行流程如下图所示,我们只关注的核心的标红函数,这三个函数是最终的问题所在,但他们不在Shell32.dll而是在Shlwapi.dll中。

图片

PahtFileExistsDefExtAndAttributesW

路径字符串末尾为空格或”\“就会返回指向NULL的指针(windwos文件系统在创建文件时首部和尾部会自动把空格清除)。

图片

PathFindExtensionw

该函数没找到符号文件,IDA解析时有问题,故用了另一位博主B1tg的图。通过伪代码可以看出如果路径长度超过最大长度或在最后一个点后再次出现空格或\都会返回指向NULL的字符串指针,即未找到后缀名。这也是为什么把最后一个字符串改成空格的原因。

图片

当未找到后缀名时会进入sub_63192842函数中。

sub_63192842

这个函数的主要功能是遍历当前路径下的所有文件,并将文件后缀和一个数组比较,数组中是windwos系统下常见可执行文件的后缀名。

图片

对遍历到的文件进行比对,返回数组下标。

图片

图片

所以test.txt 文件因为.后面出现的空格返回了Null,导致if中的表达式为False,于是进入了sub_63192842函数中,搜索到了test.txt .cmd文件,最终该文件被返回并设置了进程创建的参数完成了代码执行。

当然如果同一路径下也没发现这6种可执行路径的后缀则会启动rundll32程序,加载shell32的OpenAs_RunDLL函数弹出对话框,让用户选择要执行的程序。

图片

图片

总结

触发该漏洞的完整调用链大致如上所述,究其原因还是Winrar程序本身在双击文件预览时错误的释放逻辑,以及WindowsApi Shellexecute在根据后缀名寻找相应执行文件时触发本地搜索的特性,二者结合才形成了完整的漏洞利用链条。

这篇关于winrar(CVE-2023-38831)漏洞原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/783471

相关文章

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

Mysql的主从同步/复制的原理分析

《Mysql的主从同步/复制的原理分析》:本文主要介绍Mysql的主从同步/复制的原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录为什么要主从同步?mysql主从同步架构有哪些?Mysql主从复制的原理/整体流程级联复制架构为什么好?Mysql主从复制注意

Nacos注册中心和配置中心的底层原理全面解读

《Nacos注册中心和配置中心的底层原理全面解读》:本文主要介绍Nacos注册中心和配置中心的底层原理的全面解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录临时实例和永久实例为什么 Nacos 要将服务实例分为临时实例和永久实例?1.x 版本和2.x版本的区别

Python中文件读取操作漏洞深度解析与防护指南

《Python中文件读取操作漏洞深度解析与防护指南》在Web应用开发中,文件操作是最基础也最危险的功能之一,这篇文章将全面剖析Python环境中常见的文件读取漏洞类型,成因及防护方案,感兴趣的小伙伴可... 目录引言一、静态资源处理中的路径穿越漏洞1.1 典型漏洞场景1.2 os.path.join()的陷

apache的commons-pool2原理与使用实践记录

《apache的commons-pool2原理与使用实践记录》ApacheCommonsPool2是一个高效的对象池化框架,通过复用昂贵资源(如数据库连接、线程、网络连接)优化系统性能,这篇文章主... 目录一、核心原理与组件二、使用步骤详解(以数据库连接池为例)三、高级配置与优化四、典型应用场景五、注意事

电脑系统Hosts文件原理和应用分享

《电脑系统Hosts文件原理和应用分享》Hosts是一个没有扩展名的系统文件,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应... Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应

Dubbo之SPI机制的实现原理和优势分析

《Dubbo之SPI机制的实现原理和优势分析》:本文主要介绍Dubbo之SPI机制的实现原理和优势,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Dubbo中SPI机制的实现原理和优势JDK 中的 SPI 机制解析Dubbo 中的 SPI 机制解析总结Dubbo中

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

Spring框架中@Lazy延迟加载原理和使用详解

《Spring框架中@Lazy延迟加载原理和使用详解》:本文主要介绍Spring框架中@Lazy延迟加载原理和使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、@Lazy延迟加载原理1.延迟加载原理1.1 @Lazy三种配置方法1.2 @Component

spring IOC的理解之原理和实现过程

《springIOC的理解之原理和实现过程》:本文主要介绍springIOC的理解之原理和实现过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、IoC 核心概念二、核心原理1. 容器架构2. 核心组件3. 工作流程三、关键实现机制1. Bean生命周期2.