CVE-2023-38831(Winrar RCE)漏洞复现与分析

免责声明:由于传播、利用本文章所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本号及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!在这里插入图片描述
本文由DRagon7团队的发条熊师傅提供
公众号:Dragon7 SEC

前言:

本文对Winrar RCE漏洞(CVE-2023-38831)进行复现以及原理分析,对攻击过程进行还原,让你更直观的感受此漏洞的攻击面。对于Reverse本人并不擅长,所以此篇文章参考了很多互联网公开的对此漏洞的研究分析报告,文末标注。

压缩软件:

压缩软件是一类用于将计算机本地文件进行压缩处理的工具,其用途在于减小文件大小达到节省计算机存储压力,提升文件传输效率的目的,下图中使用压缩软件对计算机中的compress文件夹进行压缩,压缩为compress.zip压缩包后其大小由71.5MB缩小至12.3MB。可见文件体积减小了约六倍。
在这里插入图片描述

大多数的压缩软件还支持对压缩包添加密码达到保护压缩包内文件的目的。下图将compress文件夹压缩至compress.zip中并设置密码,当文件传输到其它用户的计算机时,解压时则需要键入密码才能成功解压(保护文件)。当然,安全并不是绝对的,设置密码的压缩包也有被暴力破解的可能(有专门对压缩包进行暴力密码破解的工具)。
在这里插入图片描述
在这里插入图片描述

Winrar:

Winrar是一款功能强大的文件压缩和解压缩软件,广泛应用于全球。由Eugene Roshal开发,最早版本1.3发布于1993年,如今已衍生至6.24版本,发行至今约30年。

根据官网统计,Winrar在全球范围内用户量超5亿。
在这里插入图片描述

CVE-2023-38831漏洞:

CVE-2023-38831最早于2023年8月23日在Group-IB发布的报告https://www.group-ib.com/blog/cve-2023-38831-winrar-zero-day/中被披露,文中提到该漏洞自 2023 年 4 月起已被在野利用,Group-IB于7月12日提交了该漏洞,8月15日该漏洞被正式标记为CVE-2023-38831。RARLAB在7月20日发布补丁,最终于2023年8月2号发布修复漏洞的版本,版本号为6.23。

虽然现在距离漏洞被披露过去了两个月,但考虑到Winrar用户量巨大,所以现在仍有不少的APT组织正在积极的利用此漏洞发起网络钓鱼攻击。

在这里插入图片描述

基本信息:

影响版本: Winrar < 6.23

交互条件: 1Click

披露时间:2023.8.23

基本概况:

Winrar6.23版本之前,在用户使用Winrar预览压缩包内容时,点击文件进行文件释放/执行的过程中释放了额外的恶意文件,在释放结束后,Winrar会调用WinAPI ShellExecuteExW函数打开该文件,ShellExecuteExW在打开文件的过程中会对文件的文件名/路径进行处理,如果文件的末尾为空格” ”,就会在其末尾添加.*通配符,最终导致用户的点击的文件没有正确执行却错误的执行了恶意文件。

漏洞复现原理详解:

Step1:错误的文件释放:

Winrar支持在没有解压压缩包时预览压缩包内的目录结构,在安装Winrar后,双击一个压缩包文件,会在视图中展示压缩包中的文件结构,如图1所示

在这里插入图片描述
在正常情况下,当用户双击其中任意一个文件时,Winrar会将其解压至"C:\Users\用户名\AppData\Local\Temp"Windows系统临时文件目录中,并且会执行该文件。当关闭Winrar后,被解压到临时目录中的文件会随之被销毁删除,如图2所示。
在这里插入图片描述
接下来再看看不正常的情况,也就是"错误的文件释放",这里需要创建一个文件和一个文件夹,名称任意,.jpg不是必须的,这里文件夹末尾加1是为了充当占位符,方便我们后期使用010Editor工具将其置为空(因为无论是Linux还是Windows都不允许在同一目录下出现相同名称的文件/文件夹)。
在这里插入图片描述
在这里插入图片描述
将文件夹和文件压缩为zip包,使用010Editor或是任意一款你熟悉的二进制文件分析编辑工具打开这个zip压缩包
在这里插入图片描述

在010Ediotr安装了对应的压缩包模板后,压缩包的文件结构会在右下角的工作空间视图中显示(没想到吧,这一段乱七八糟的二进制是有规律的~,这就是zip的文件结构)。

在zip文件结构中,每个被压缩的文件夹/文件都会对应一个ZIPDIRENTRY结构体,ZIPDIRENTRY中详细记录了被压缩文件的详细信息,这个结构体对于理解这个漏洞来说很重要,其中记录了被压缩文件名,创建时间等信息,其中deFileName字段记录了被压缩文件的文件名

在这里插入图片描述
在这里插入图片描述

既然操作系统不允许创建同名的文件夹/文件,那我们就直接用二进制文件编辑器改呗,将末尾的1替换为00(结束符),然后Ctrl+S保存,这不就搞定了吗。
在这里插入图片描述
接下来使用Winrar打开更改后的zip包,当点击test.jpg时,神奇的事情发生了,不止test.jpg被解压释放到了临时目录中,文件夹下的evil.exe也被释放到了临时目录中
在这里插入图片描述

释放逻辑:

当用户点击压缩包中文件时,Winrar会遍历zip压缩包中所有的ZIPDIRENTRY结构体,并用点击文件(ClickName这里指点击文件的文件名)与ZIPDIRENTRY中的deFileName做比较,使用wcsncmp函数进行比较,比较的长度为ClickName的长度(也就是wcsncmp的第三个参数)。例如这里点击test.jpg那么ClickName的长度为8,在遍历到第二个ZIPDIRENTRY结构体时,由于只比较前8位,所以会匹配成功(返回0),接下来会使用ClickName的长度作为下标获取deFileName中的特定字符,如果字符为”/”,”\”或0结束符则返回True(1),Winrar会把匹配结果为True所对应的ZIPDIRENTRY所指向的文件释放到系统的临时文件目录中。由于是递归匹配,所以test.jpg目录下的所有文件都会被释放。

引用一张好鱼大佬逆向还原的Winrar文件释放过程的伪代码(就不掏出我压箱底的IDA了-Re废物)

在这里插入图片描述
(原文链接:https://www.cnblogs.com/GoodFish-/p/17715977.html)

wcsncmp函数详细用法:

该函数在两个字符串匹配相同的情况下会返回0
在这里插入图片描述
本地用伪代码还原一下ClickName和deFileName比较以及获取lastchar(最后一个字符)的过程。下标是从0开始的,所以这里获取到了”/”。
在这里插入图片描述

Step2:ShellExecuteExW函数引发恶意文件被打开

先来了解一下ShellExecuteExW函数,该函数是windows api中提供的一个函数,用于对指定的文件执行操作。
在这里插入图片描述
这个函数的参数是一个结构体指针,结构如下,这个结构体用于描述打开指定文件的相关信息,例如文件路径,执行的操作等等。
在这里插入图片描述
lpFile用于指定操作文件的文件路径,lpVerb用于指定对文件执行的操作,具体的动作详见下图,如果lpVerb为null空字符串的话,默认动作为open。
在这里插入图片描述

在释放文件之后,Winrar会调用ShellExecuteExW函数打开ClickFile(用户点击的文件),以临时文件路径+ClickName作为lpFile参数传入ShellExcuteExW,在ShellExecuteExW中会对文件路径做处理,如果文件末尾为" "空格的话("test.jpg “),就会在其末尾添加.通配符进行匹配,因此最后ClickName被处理成了"test.jpg .”,之后会匹配符合条件的文件进行执行,"test.jpg .cmd"符合匹配条件,所以最终导致了恶意文件被错误执行。

在本地编写代码对ShellExecuteExW的这一特性进行测试,在lpFile的末尾添加空格,执行该程序后成功执行了目录下的file.txt .cmd文件。

在这里插入图片描述

具体代码:

#include <Windows.h>
#include <cstdio>

int main() {
    SHELLEXECUTEINFOW shExecInfo = { 0 };
    shExecInfo.cbSize = sizeof(SHELLEXECUTEINFOW);
    shExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
    shExecInfo.lpFile = L"C:\\Users\\用户名\\Desktop\\test\\file.txt ";
    shExecInfo.lpVerb = L"";
    shExecInfo.nShow = SW_SHOWNORMAL;

    if (ShellExecuteExW(&shExecInfo)) {
        WaitForSingleObject(shExecInfo.hProcess, INFINITE);
        CloseHandle(shExecInfo.hProcess);
    }
    else {
        DWORD error = GetLastError();
        wprintf(L"Error %d: Unable to open file\n", error);
    }

    return 0;
}

所以在手动构造POC时要将末尾的字符置为” ”空格
在这里插入图片描述
在这里插入图片描述
(漏洞触发截图)

影响范围:

所有安装了Winrar且版本低于6.23的用户都会受此漏洞的影响,前面说过距离此漏洞被披露至今约三个月了,仍有攻击者在积极的利用此漏洞进行水坑/鱼叉式网络攻击。

EXP地址:

https://github.com/80r1ng/CVE-2023-38831-EXP

参考:

(1).https://cybersecuritynews.com/konni-apt-exploits-winrar-vulnerability/

(2).https://securityaffairs.com/154460/apt/apt29-targets-embassies-winrar-flaw.html

(3).https://securityaffairs.com/154414/apt/darkcasino-apt-exploiting-winrar-0day.html

(4).https://www.group-ib.com/blog/cve-2023-38831-winrar-zero-day/

(5).https://blog.google/threat-analysis-group/government-backed-actors-exploiting-winrar-vulnerability/

(6).https://www.cnblogs.com/GoodFish-/p/17715977.html

(7).https://paper.seebug.org/3036/

  • 19
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值