Exchange Server Patch Diff 方法

警告
本文最后更新于 2023-11-20,文中内容可能已过时。

Exchange Server Patch Diff 方法

分析 Exchange 漏洞的时候,我们无法避免分析 Exchange Server 的补丁,本文将介绍如何获取补丁,获取补丁包含的 DLL 文件,如何反编译以及如何 diff 反编译后的代码。接下来讲使用 ProxyLogon 的 CVE-2021-26855 作为例子。

我们先在 MSRC 上面查看对应的 CVE 的漏洞通报页面,里面会说明某个 CVE 编号对应的补丁 CVE 号。我们可以看到 CVE 对应的 KB 号是 5000871。

MSRC 的 URL,后面补上需要查询的 CVE 即可。 https://msrc.microsoft.com/update-guide/vulnerability/CVE-202X-XXXX

image-20231120102328925

我们点击进去会跳转到一个详细说明的页面,里面包含了包括但不限于 CVE-2021-26855 的一个说明,因为常规的一个补丁会同时修复多个 CVE 漏洞,我们也可以看到包含 ProxyLogon 的另外一个 CVE-2021-27065。这样我们解析了这个补丁也就相当于可以分析 PrxoyLogon 的补丁了。

image-20231120103130779

我们可以看到页面中给我们挑选了不同 Server 版本的对应补丁,这里我们需要寻找一个最小补丁修复的版本去进行分析,这样我们才可以尽可能快的定位到我们想要的代码的位置,不会被其他不是 ProxyLogon 的补丁修复干扰。

image-20231120103341807

方法就是转到Microsoft 更新目录网站,直接搜索刚刚获取到的 KB 号,这里是 KB5000871。我们在找到大小最小的补丁直接下载下来,这里我们选择的是 Security Update For Exchange Server 2013 CU23 (KB5000871)

image-20231120103554622

我们把 .cab 文件下载下来之后直接使用任意解压工具解压,会得到一个 .msp。这里,我们需要使用 7zip 压缩直接解压 .msp 文件,会直接得到很多 DLL 文件(当然也包含很多不是 DLL 的文件)。类似下图:

image-20231120104151122

实际上,这里解析出来的 DLL 是 Exchange Server 使用的全部的 DLL 文件了(猜测),所以我们上面选择大小最小的补丁去分析也可以减少我们解析和反编译的时间。

接着我们下载同版本 Server 的上一个的补丁,我们直接搜索 Security Update For Exchange Server 2013 CU23,选择日期排序后查看到到刚刚下载的补丁的上一个补丁,这里是 KB4593466。下载后以刚刚相同的方法处理获得对应的 DLL。

image-20231120105032300

我们刚刚获取了两个补丁,方便说明补丁分为 A 和 B。A 补丁时间在前,B 补丁时间在后。

Win 下启动 powershell(普通用户权限下可能无法正常使用 dnspy 反编译 dll的话使用管理员权限),运行下面的语句即可反编译所有 dll 文件。其中 -r 是源文件夹,-o 是输出文件夹。

.\dnSpy.Console.exe --no-tokens --no-stdlib --no-resx --no-baml --no-color -o "Exchange2013-KB4593466_de" -r "E:\Vuln\Exchange Patch\Exchange2013-KB4593466-x64-en\*.dll"

然后利用 git 把 A 补丁反编译出来的 C# 代码做第一次提交。

git init
git add .
git commit -m "kbxxxA"

同样的先反编译B 补丁,使用 Powershell 命令直接粘贴覆盖更新代码,然后再使用 git 把这个反编译出来的 C# 代码做第二次提交。

Copy-Item -Recurse -Force ..\Exchange2013-KB5000871_de\* .\
git add .
git commit -m "kbxxxB"

使用 git 虽然可以直接查看 diff ,但是由于代码量过多我们无法一一查看我们想要看的代码 diff。假如可以的话你可以直接 Push 到

Git 其实是有 GUI 界面去给我们更好的 diff 的,使用如下命令,打开 GUI 界面即可看见下图揭 GUI,点击 Repository - Visualize master’s History。

image-20231120142021888

即可使用 GUI 界面查看,类似下图。但是仔细查看到 Diff 之后我们会发现,绝大多数的 diff 都是修改了一个版本表示的字符串而已(类似 ProjectGuid 和 AssemblyFileVersion )。这样也会大大干扰我们分析核心的补丁代码。

image-20231120142659814

俺真的找不到筛选的办法,有没有偶像师傅们可以教教我。现在只能手动查看 diff 了,例如下图和反序列化有关的黑名单。

image-20231120160125677