CVE-2023-38831 WinRAR 逻辑漏洞原因分析

简介

  • 漏洞编号:CVE-2023-38831
  • 漏洞类型:逻辑漏洞
  • 软件名称:RARLAB WinRAR
  • 模块名称:WinRAR.exe
  • 历史漏洞:根据 vuldb 显示,历史漏洞并不是很多,能稳定利用的更是少之又少
    在这里插入图片描述
  • CISA 已知漏洞利用目录中只有两个可利用
    在这里插入图片描述
  • 影响的版本:版本应低于 6.23,但是在复现中发现 5.x 版本无法利用成功
  • 攻击利用:WinRAR 中的一个零日漏洞(称为 CVE-2023-38831)已被自 2023 年 4 月以来,该漏洞被网络犯罪分子积极利用,详情参见:https://www.bleepingcomputer.com/news/security/winrar-zero-day-exploited-since-april-to-hack-trading-accounts/

操作环境

  • 系统:Win10 1607
  • 软件版本:Office2016 16.0.4266.1003
  • poc:CVE-2023-38831-poc.rar(https://github.com/b1tg/CVE-2023-38831-winrar-exploit)
  • 工具:Process Monitor、windbg、IDA、二进制分析工具

分析

复现

  • 下载 github 文件后,双击目录中的 CVE-2023-38831-poc.rar 文档,弹出 WinRAR 窗口后双击 CLASSIFIED_DOCUMENTS.pdf 文件,最后弹出计算器,复现成功
    在这里插入图片描述

文件分析

  • 一级目录包括一个 PDF 文件和一个目录,名称都为 "CLASSIFIED_DOCUMENTS.pdf "
    在这里插入图片描述
  • 目录中是命名为 “CLASSIFIED_DOCUMENTS.pdf .cmd” 的文件,功能就是充当弹出计算器的有效载荷
    在这里插入图片描述

系统操作分析

文件创建分析

  • 双击 PDF 后 WinRAR 进程会向如下 Temp 中的目录创建两个文件,分别是 "CLASSIFIED_DOCUMENTS.pdf " 和 “CLASSIFIED_DOCUMENTS.pdf .cmd” 文件,并且在创建文件之前会使用 QueryDirectory 函数进行查询
    在这里插入图片描述
  • 这两个文件的创建操作都是 WinRAR.exe 在同一地址进行的指令操作创建的
    在这里插入图片描述

进程操作分析

  • 执行 cmd.exe 的操作同样是 WinRAR.exe 进程创建的,后面经过分析后发现是通过 ShellExecuteW 创建的
    在这里插入图片描述

逆向分析(基地址 0x130000)

  • 经过逆向分析后,发现 WinRAR.exe 漏洞的执行主要分为四个阶段,分别是 RAR 文件解析、文件路径转换、文件创建、以及文件执行
  • 首先是 RAR 文件解析,WinRAR.exe 会提取 RAR 文件中的名称列表并保存到全局变量 PathName 中
    (1)0021a485:通过 HeapAlloc 申请堆变量保存在 dword_320274 的地址
    在这里插入图片描述
    (2)001BE2FC:通过 ReadFile 读取 CVE-2023-38831-poc.rar 结尾不到 0x2000 的数据(包含压缩文件内的目录和文件名称列表)储存到 dword_320274 中,句柄是通过 CreateFileW 函数返回的
    在这里插入图片描述
    在这里插入图片描述
    (3)00218099:将 dword_320274 赋值到 dword_320278 中,经过了偏移操作,保证提取完整的目录或者是文件名称
    在这里插入图片描述
    (4)002141D6:将 dword_320278 赋值到 MultiByteStr 变量中,如下所示函数 sub_214660 完成此功能
    在这里插入图片描述
    (5)0021427C:将 MultiByteStr 通过宽字符转换后保存到 PathName 中,如下所示 sub_1EB9B0 函数完成此功能
    在这里插入图片描述
  • 文件路径转换操作主要是将 PathName 中保存的文件名转换为绝对路径,好使用绝对路径进行创建文件操作
    (1)00211CE3:函数 sub_1EFB90 完成此操作
    在这里插入图片描述
    (2)调试中可以很清楚的看到文件名到绝对路径的转换,0x320384 就是变量 PathName 的地址
    在这里插入图片描述
  • 文件创建操作
    (1)001BE20E:主要是通过 CreateFileW 函数完成的,创建的路径就是上面经过绝对路径转换后储存在 PathName 变量中数据
    在这里插入图片描述
  • 最后是执行操作
    (1)这个主要是通过 SHELL32!ShellExecuteExW 完成的,但是传入的参数并不是 .cmd 结尾的载荷文件
    在这里插入图片描述
    (2)但是因为后面带了一个空格,所以最终 ShellExecuteExW 在调用 CreateProcessW 执行时参数是 .cmd 结尾的文件,这样载荷就会成功触发,最后弹出计算器
    在这里插入图片描述

原因

  • 首先 WinRAR 提取了二进制压缩文件后的目录和文件名称列表,包含一个目录、目录下的 .cmd 文件和 1 个 pdf 文件
    在这里插入图片描述
  • 之后将目录和 pdf 文件转换为绝对路径
    在这里插入图片描述
  • 然后在 Temp 目录下创建临时的 pdf 副本,目录则不会创建
    在这里插入图片描述
  • 一般情况下到此结束,但是 WinRAR 则会继续解析目录下的 .cmd 文件,并且在绝对路径转换的时候取消了原本拥有的目录
    在这里插入图片描述
  • 这就会导致 .cmd 文件和 pdf 文件在同一路径,并且最后在 ShellExecuteExW 执行时还带了空格,最后导致载荷触发
    在这里插入图片描述

构建与利用

  • 构建流程:对 poc 中的文件进行自定义修改后,通过作者给出的 py 脚本创建即可
    在这里插入图片描述

缓解:卸载旧版本,安装 6.23 或者更新的版本

猜你喜欢

转载自blog.csdn.net/qq_38924942/article/details/132571600
今日推荐