研究发现,利用SCCM来部署操作系统会涉及各种账号密码的设置,而这些密码是可以通过某种手段来进行获取的,本节介绍如何获取这些密码。
为了理解如何获取密码,我们得先知道如何通过SCCM来部署操作系统,使用Windows 7系统来进行演示。
1)首先需要准备好映像包,搭建SCCM环境。搭建环境的过程较为烦琐,可以查找网上教程来跟着操作。假设已经搭建完SCCM环境,先进入SCCM控制台,接下来要利用SCCM使局域网内的机器通过PXE来安装操作系统。在分发点查看对应站点的属性,如图2-29所示。
2)勾选“为客户端启用PXE支持”的选项,如图2-30所示。
图2-29 查看对应站点的属性
图2-30 启用PXE支持
3)勾选“允许此分发点响应传入的PXE请求”“启用未知计算机支持”的选项。出于安全考虑,还要勾选“当计算机使用PXE时要求密码”并设置一个密码。最后选中“响应所有网络接口上的PXE请求”,完成后点击“确定”。注意这里设置的密码,在漏洞利用时会用到,如图2-31所示。
4)配置PXE启动映像,创建一个共享盘,在其中放置映像包并且设置为共享目录,如图2-32所示。
图2-31 勾选相应选项
图2-32 创建共享盘
5)进入“添加操作系统映像包向导”界面,添加共享目录盘中的Windows 7映像包,如图2-33所示。
6)在任务序列中创建一个部署Windows 7的序列,并指定上述创建的映像包,如图2-34所示。
7)将机器加入域,并且指定加入域的用户为“administrator”,如图2-35所示。
图2-33 添加操作系统映像包
图2-34 创建一个部署Windows 7的序列
图2-35 加入指定域
7)对任务序列进行部署设置,将对应的机器部署到所有未知计算机集合中,如图2-36所示。
图2-36 进行部署设置
8)选择“添加分发点”,如图2-37所示。
图2-37 添加分发点
9)在“引用”标签页下面看到分发进度为100%(符合性百分比),即代表分发完成,如图2-38所示。现在就可以通过局域网来安装操作系统了。
10)新建一个Windows 7的虚拟机,通过PXE来安装操作系统,如图2-39所示。
11)按下键盘中的F12快捷键,如图2-40所示。
图2-38 安装操作系统
图2-39 创建Windows 7虚拟机
图2-40 按下F12快捷键
12)进入任务序列引导页面,需要输入密码。这里输入的密码正是上述PXE密码,如图2-41所示。
图2-41 输入密码
13)选择对应的任务序列,进行Windows 7测试,如图2-42所示。
图2-42 进行Windows 7测试
14)此时已经开始下载映像文件,进行系统安装,如图2-43所示。
15)由于设置过程没有填Windows版本序列号,因此这里需要进行设置,如图2-44所示。
16)安装成功,如图2-45所示。
图2-43 系统安装
图2-44 设置
图2-45 安装成功
上述步骤便是SCCM部署Windows 7操作系统的全过程。接下来探讨如何获得SCCM服务器上所设置的密码。
在映像部署的时候,有哪些凭据值得获取呢?无非两种——网络认证凭据和域凭据。但事实上,相关研究员在探索此问题的过程中发现了三个位置,这三个位置都会配置凭据,并推送凭据到SCCM客户端。
(1)network access account
第一个位置为network access account(网络访问账户)。该账户主要由Windows PE使用,因为它和加入域无关。在操作系统部署期间,SCCM客户端首先尝试使用其机器账户来下载内容,如果失败,它就会自动尝试用网络访问账户进行访问,所以它需要一些凭据设置来和SCCM交互并下载软件。相关配置可以参考文章:https://www.prajwal.org/SCCM-network-access-account/。
1)首先在Configuration Manager控制台中配置站点,选择“管理→概述→站点配置→站点”,如图2-46所示。
图2-46 配置站点
2)在网络访问账户选项中,可以使用现有账户或者新的账户,并且需要输入对应账户的密码,如图2-47所示。
(2)task sequences
第二个位置为task sequences(任务序列)。task sequences用于向SCCM客户端指示任务。我们可以在任务序列中先创建一个空计算机,再进行一些配置,如映像包、密码以及一系列软件,然后使其加入域内,完成自动化部署。
任务序列会执行一些步骤来完成部署,过程中会涉及很多设置密码操作,如设置加入域的账号、设置本地计算机管理员密码等。配置的这些密码信息都会在后续步骤中被获取,如图2-48、图2-49、图2-50所示。
图2-47 设置网络访问账号
图2-48 在“创建任务序列向导”中设置域用户凭据
图2-49 在“应用Windows设置”中配置系统本地管理员密码
图2-50 在“应用网络设置”中配置域用户凭据
(3)设备集合
第三个位置为设备集合。设备集合中有一个有趣的设置,叫作集合环境变量(Collection Variable),如果设置了如username、password等环境变量,则这些环境变量会被推送到机器内,我们则可以对其进行解密来读取这些值,如图2-51所示。
图2-51 配置集合环境变量
通过上述介绍,此时我们已经大致了解SCCM部署系统的过程中可能会在哪些地方设置密码,接下来就深入了解如何获得这些密码。
首先需明确两个概念,第一个是content。content是从SCCM服务器中的分发点下载的内容,下载的过程中会发起身份认证。第二个需要了解的概念是police。SCCM客户端需要从分发点下载所需内容,这就肯定需要策略,即police。police设定了哪些机器可以从分发点下载,如下载软件包、映像等。
回顾部署系统的过程,任务序列的引导页面如图2-52所示。
图2-52 任务序列引导页面
在这期间,SCCM客户端向DHCP服务器发起请求。DHCP服务端收到请求后,服务器会在smstemp这个特殊文件夹中生成两个文件,一个是.var文件,另一个是.bcd文件。.bcd文件会告诉客户端如何安装映像,而.var文件则是一个存储了许多变量的文件,里面有许多配置信息,我们输入的PXE密码正是用来解密这个文件的。当客户端在加载SCCM winpe环境的时候,会使用tsmbootstrap.exe通过TFTP将.var文件拉取过来,并将其重命名为variables.dat,然后进行解密。接下来,我们使用脚本pxethife.py发起DHCP请求,探测.var文件,如图2-53所示。
图2-53 发起DHCP请求,探测.var文件
1)下载TFTP客户端,用于下载SCCM服务器上的.var文件,如图2-54所示。
图2-54 下载TFTP客户端
2)使用TFTP下载.var文件,如图2-55所示。
图2-55 使用TFTP下载.var文件
3)使用PXEThief将.var文件的哈希值识别出来。如图2-56所示。
图2-56 调试结果
4)利用密码字典配合Hashcat进行离线爆破。注意,这里要加入相关模块然后重新编译Hashcat,最好是用Hashcat 6.2.5,模块下载地址为https://github.com/MWR-CyberSec/configmgr-cryptderivekey-hashcat-module。
如果密码是弱密码,我们就能爆破出来,进行下一步利用,如图2-57所示。
图2-57 利用密码字典配合Hashcat进行离线爆破
此时已经爆破得到密码,则可以获取解密variables.dat的密钥。接下来,在部署过程中输入PXE密码的时候,.var文件将会被解密,然后客户端会向服务端发起请求下载police,而下载的过程会涉及签名认证。研究发现,在被解密的.var文件中存有一些变量,如CCMClientID、CCMClientTimestamp、ClientToken等。使用CryptsignHash函数加密变量生成签名,也就是说,只要成功解密media variables文件,就能构造签名然后发送请求并通过认证,从而下载我们感兴趣的police。之后再对police进行解密,其中正存有上述3种被配置的密码。
此时可以通过一些工具去获得在SCCM部署过程中所设置的密码。使用如下pxethief.py命令,通过下载的.var文件和破解得到的密码生成认证请求,从SCCM中拉取police,然后解密获得相关密码。具体的解密原理可以看一下相关研究员在DEFCON上的演讲。
如图2-58所示,可以看到在上述部署过程中所设置的一系列账号密码。
图2-58 账号密码获取结果