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

相关文章

Spring Boot Interceptor的原理、配置、顺序控制及与Filter的关键区别对比分析

《SpringBootInterceptor的原理、配置、顺序控制及与Filter的关键区别对比分析》本文主要介绍了SpringBoot中的拦截器(Interceptor)及其与过滤器(Filt... 目录前言一、核心功能二、拦截器的实现2.1 定义自定义拦截器2.2 注册拦截器三、多拦截器的执行顺序四、过

Java 队列Queue从原理到实战指南

《Java队列Queue从原理到实战指南》本文介绍了Java中队列(Queue)的底层实现、常见方法及其区别,通过LinkedList和ArrayDeque的实现,以及循环队列的概念,展示了如何高效... 目录一、队列的认识队列的底层与集合框架常见的队列方法插入元素方法对比(add和offer)移除元素方法

SQL 注入攻击(SQL Injection)原理、利用方式与防御策略深度解析

《SQL注入攻击(SQLInjection)原理、利用方式与防御策略深度解析》本文将从SQL注入的基本原理、攻击方式、常见利用手法,到企业级防御方案进行全面讲解,以帮助开发者和安全人员更系统地理解... 目录一、前言二、SQL 注入攻击的基本概念三、SQL 注入常见类型分析1. 基于错误回显的注入(Erro

Spring IOC核心原理详解与运用实战教程

《SpringIOC核心原理详解与运用实战教程》本文详细解析了SpringIOC容器的核心原理,包括BeanFactory体系、依赖注入机制、循环依赖解决和三级缓存机制,同时,介绍了SpringBo... 目录1. Spring IOC核心原理深度解析1.1 BeanFactory体系与内部结构1.1.1

MySQL 批量插入的原理和实战方法(快速提升大数据导入效率)

《MySQL批量插入的原理和实战方法(快速提升大数据导入效率)》在日常开发中,我们经常需要将大量数据批量插入到MySQL数据库中,本文将介绍批量插入的原理、实现方法,并结合Python和PyMySQ... 目录一、批量插入的优势二、mysql 表的创建示例三、python 实现批量插入1. 安装 PyMyS

深入理解Redis线程模型的原理及使用

《深入理解Redis线程模型的原理及使用》Redis的线程模型整体还是多线程的,只是后台执行指令的核心线程是单线程的,整个线程模型可以理解为还是以单线程为主,基于这种单线程为主的线程模型,不同客户端的... 目录1 Redis是单线程www.chinasem.cn还是多线程2 Redis如何保证指令原子性2.

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Redis中Hash从使用过程到原理说明

《Redis中Hash从使用过程到原理说明》RedisHash结构用于存储字段-值对,适合对象数据,支持HSET、HGET等命令,采用ziplist或hashtable编码,通过渐进式rehash优化... 目录一、开篇:Hash就像超市的货架二、Hash的基本使用1. 常用命令示例2. Java操作示例三