如何管理/恢复到特定的操作系统版本以进行有效的补丁差异化?

逆向工程 视窗 操作系统
2021-07-09 06:57:31

为了了解编写 PoC 所涉及的复杂性(并获得经验),可以进行补丁差异化并使用现实世界中的易受攻击的示例进行练习。现在请忽略制作自己的易受攻击程序的想法。

对于补丁差异,我看到操作系统可以处于 3 种状态,让我们以 Windows 7 为例:

  1. 普通状态(无服务包,无补丁)
  2. 部分修补(未更新到最新发布的补丁)
  3. 完全修补

设想

  • 我的 vmware/vbox 系统处于状态 3(已完全修补)。
  • 接下来,我转到 Microsoft 安全公告并选择一个漏洞(例如内核)。
  • 现在我想恢复到有用的状态......

尽管它可能适用于普通状态 (1),但差异结果会更大/更难发现问题。其次,最新漏洞的错误可能是由以前的补丁/服务包引入的。

因此,如何从操作系统状态 3 转到状态 2,其中状态 2 是在解决问题的新补丁之前修补的系统?或者如果更方便,从状态 1 到状态 2。

更新

我意识到我的问题并不像我想象的那么清楚,希望这能澄清一点

我知道 vmware/vbox 的快照功能,但这不是我要找的。我真正的目标是

  1. 如何获取已更改二进制文件的旧版本?
  2. 如何知道要恢复到哪个版本?文件中有一些命名方案吗?

例子:

  • 我的系统是完全最新的。
  • 我在安全公告中找到了一个 KB-XXXXX,将其解压缩,它为我提供了一个名为 abc_005.dll 的更新后的 .dll
  • 现在,我想让我的系统处于获取 dll 的先前(易受攻击)版本(例如 abc_004.dll)的状态。<- 我将如何做这部分?
3个回答

我认为有几种方法可以到达你想要的地方。鉴于您在完全更新的系统上拥有 KB 补丁的情况。要恢复到以前的版本,请卸载该补丁。

使用的 Metasploit Unleashed 类(仍然使用?)具有用于卸载所有补丁的 XP 命令:

C:\>dir /a /b c:\windows\$ntuninstallkb* > kbs.txt && for /f %i in (kbs.txt) do cd c:\windows\%i\spuninst && spuninst.exe /passive /norestart && ping -n 15 localhost > nul

我认为另一种方法是安装一个完全未打补丁的操作系统版本(例如从没有服务包的 MSDN 安装)。从这里,您可以提取基本文件。对于补丁版本,MSFT 每个月都会提供一个带有补丁的 ISO。您可以从这里提取打过补丁的可执行文件。例如,下面是从本月的安全更新的ISO。

VMWare 提供了一个非常有用的快照功能,这使得在同一 VM 的不同状态之间切换变得非常简单。您可以使用 VIX 自动执行此过程。
我假设其他 VM 解决方案也有类似的东西。

我不是 100% 确定我理解你的问题,但我会尽力回答。

首先,我将为您要定位的 Windows 版本准备 VM。每天您都可以创建一个快照,这意味着您可以在未来的任何日期回到那个时间点。大多数虚拟机都支持快照。然后我会在虚拟机上运行 Windows 更新。这意味着随着时间的推移,您将构建大量 Microsoft DLL 版本的目录。您也可以从 Microsoft 符号服务器中提取二进制文件及其 PDB,但这需要我知道它们的哈希值。

现在,您将遵循Microsoft 安全公告选择您感兴趣的产品并仅选择最新的补丁。研究安全公告文章。如果发现安全公告很有趣,您可以转到安全公告中链接的知识库文章。在那里您可以研究修补了哪些文件。如果您仍然对它感兴趣,您可以从安全公告页面下载补丁。

获得补丁文件后,需要使用以下命令之一进行提取:

。可执行程序

setup.exe /t:C:[dest_dir] /c

.msu

expand -F:* [update_filename.msu] C:[tmp_dest_dir]

cd [tmp_dest_dir]

expand -F:* [extracted_update_filename.cab] C:[final_dest_dir]

.msp

msix [update_filename.msp] /out C:[dest_dir]

.msi

msiexec /a [update_filename.msi] /qb TARGETDIR=C:[target_dir]

在提取的文件夹中,您应该可以找到知识库文章中指示的文件。如果您一直遵循正确的快照策略,那么今天早上创建的快照中应该有一个旧版本可用。从虚拟机中拉出该版本并使用BinDiff以探索差异。