T0ngMystic`s Blog

"Security studying, Strive to be Security Re-Searcher. Love everything that I want to do"

CVE-2023-38831-winrar漏洞

2023-09-04 / 共计1536 字


CVE-2023-38831 WINRAR漏洞复现

感谢b1tg提供的POC和CVE-2023-38831: WinRAR Bug Or Windows Feature? In-Depth Analysis of Winrar Vulnerability的分析。

经测试新版本winrar 6.23无法进行利用。 Tip:下文中{{ }}表示空格

漏洞复现

环境详情:

winrar: 5.91

操作系统:win10

构造恶意winrar文件: python cve-2023-38831-exp-gen.py CLASSIFIED_DOCUMENTS.pdf script.bat poc.rar 生成压缩文件如下: image-CVE-2023-38831-winrar漏洞-20230903194509754 CLASSIFIED_DOCUMENTS.pdf 目录下: image-CVE-2023-38831-winrar漏洞-20230904183528800

点击”CLASSIFIED_DOCUMENTS.pdf“时,会执行CLASSIFIED_DOCUMENTS.pdf\CLASSIFIED_DOCUMENTS.pdf{{ }}.cmd image.png

漏洞分析

详情可阅读CVE-2023-38831: WinRAR Bug Or Windows Feature? In-Depth Analysis of Winrar Vulnerabilityb1tg的文章。

  在winrar解压文件时,会将压缩目录中的文件与要解压的文件名进行对比,若匹配,则进行解压。具体伪代码如下

int i = 0;
dec_file_list[i] = choose_file; //要解压文件
i++

for file in files{
    if(compare_wstr(choose_file.name,file.name,choose_file.name.length)\=\=1){ //对比函数
	    dec_file_list[i] =file;
	    i++;
    }
}

for dir in directories{ 
    if(dir.name \=\= choose_file.name){ //文件夹与解压文件同名,则匹配该文件夹下文件
        for file in dir.files{
            if(compare_wstr(choose.name,file.name,choose.name.length) \=\= 1){
                dec_file_list[i] = file;
                i++;
            }
        }
    }
}

例如,解压t0ngmystic.zip t0ngmystic.zip目录如下:

t0ngmystic.txt //这是一个文件夹
    t0ngmystic.txt .cmd
t0ngmystic.txt //txt文件

winrar要解压t0ngmystic.txt(txt文件)时,winrar匹配文件名的时候匹配到t0ngmystic.txt(文件夹)会继续匹配这下面的t0ngmystic.txt .cmd,由于匹配文件名时,传入的匹配名字的长度为t0ngmystic.txt的长度14,t0ngmystic.txt{{ }}.cmd文件只配置了前面t0ngmystic.txt,所以也给解压出去了。

解压之后为什么最后执行能够执行.cmd文件呢,其实是调用了windows api中的ShellExecuteExW而形成的。

ShellExecuteExW详情如下 image-CVE-2023-38831-winrar漏洞-20230903233300487

SHELLEXECUTEINFOW为一个结构体,具体如下,其实只用关注LPCSTR lpVerb和LPCSTR lpFile就可以了。 image.png lpVerb表示打开文件所执行的动作,可以为空,当为空时会使用默认动作,若默认动作不可用,则会使用open动作。 image.png

lpFile为一个以 null 结尾的字符串的地址,指定将执行lpVerb所指定的动作的文件路径。 image.png 在ShellExecuteExW在打开文件的时候,当lpVerb为空时,会模式用open打开文件,但仅可用于可执行文件(.cmd、.exe、.bat),document file,目录。就由微软对IpVerb描述的一样:

漏洞总结

对于CVE-2023-38831-winrar漏洞的分析b1tgCVE-2023-38831: WinRAR Bug Or Windows Feature? In-Depth Analysis of Winrar Vulnerability都有具体的分析,我就不多赘述了。

根据漏洞分析猜想,可执行文件可以隐藏在多层文件夹下,只要文件夹的名称为样本文件开头即可。 例如,将.cmd文件放在\CLASSIFIED_DOCUMENTS.pdf \CLASSIFIED_DOCUMENTS.pdf .eesww\下面 image-CVE-2023-38831-WINRAR 漏洞-20230905195141834.png

同样可以进行漏洞利用 image.png

该漏洞成因可以分为winrar和windows api两个部分, winrar在解压文件时,传入文件名长度,导致文件名的不完全匹配,将携带攻击载荷的文件也解压到临时目录中。 windows api的ShellExecuteExW中的lpVerb为空,默认到open操作,从而执行.cmd文件。

在任何程序中,只要能够落地文件,在文件执行时不管是隐式或显式调用了ShellExecuteExW,都有可能触发该漏洞。

经过检验python中的os.startfile()同样使用了ShellExecuteExW。

image.png

文笔垃圾,技术欠缺,欢迎各位大师傅请斧正,非常感谢!


如果文章对您有帮助

部分文章会发布公众号!

感谢您的支持!