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

相关文章

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和

hdu4407容斥原理

题意: 有一个元素为 1~n 的数列{An},有2种操作(1000次): 1、求某段区间 [a,b] 中与 p 互质的数的和。 2、将数列中某个位置元素的值改变。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.Inpu

hdu4059容斥原理

求1-n中与n互质的数的4次方之和 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWrit

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类

TL-Tomcat中长连接的底层源码原理实现

长连接:浏览器告诉tomcat不要将请求关掉。  如果不是长连接,tomcat响应后会告诉浏览器把这个连接关掉。    tomcat中有一个缓冲区  如果发送大批量数据后 又不处理  那么会堆积缓冲区 后面的请求会越来越慢。

HNU-2023电路与电子学-实验3

写在前面: 一、实验目的 1.了解简易模型机的内部结构和工作原理。 2.分析模型机的功能,设计 8 重 3-1 多路复用器。 3.分析模型机的功能,设计 8 重 2-1 多路复用器。 4.分析模型机的工作原理,设计模型机控制信号产生逻辑。 二、实验内容 1.用 VERILOG 语言设计模型机的 8 重 3-1 多路复用器; 2.用 VERILOG 语言设计模型机的 8 重 2-1 多

PHP原理之内存管理中难懂的几个点

PHP的内存管理, 分为俩大部分, 第一部分是PHP自身的内存管理, 这部分主要的内容就是引用计数, 写时复制, 等等面向应用的层面的管理. 而第二部分就是今天我要介绍的, zend_alloc中描写的关于PHP自身的内存管理, 包括它是如何管理可用内存, 如何分配内存等. 另外, 为什么要写这个呢, 因为之前并没有任何资料来介绍PHP内存管理中使用的策略, 数据结构, 或者算法. 而在我们

Smarty模板执行原理

为了实现程序的业务逻辑和内容表现页面的分离从而提高开发速度,php 引入了模板引擎的概念,php 模板引擎里面最流行的可以说是smarty了,smarty因其功能强大而且速度快而被广大php web开发者所认可。本文将记录一下smarty模板引擎的工作执行原理,算是加深一下理解。 其实所有的模板引擎的工作原理是差不多的,无非就是在php程序里面用正则匹配将模板里面的标签替换为php代码从而将两者