目录

1.前言

2. 基础知识

2.1 WMI简介

2.2 WMI体系结构

2.3 WMI的类与命名空间

2.4 查询WMI

2.5 管理WMI

2.6 WMI事件

3.工具分析

3.1 WMIHACK主要功能

3.2 对比WMIEXEC、PSEXEC

3.3 代码分析

未完待续。。。

结尾


1.前言

此工具为香山大佬开源的一款内网横向渗透工具,阅读源码后被大佬的思路及所使用的技术细节所震撼,并始终认为对于wmi没有一定了解是无法写出如此精妙的代码,获益良多。本文不对工具的使用做太多讲解,关于使用网上的文章已经太多了,只探讨背后的技术细节。

项目地址:https://github.com/360-Linton-Lab/WMIHACKER

2. 基础知识

2.1 WMI简介

WMI 的全称是 Windows Management Instrumentation,即 Windows 管理规范,在 Windows 操作系统中,随着 WMI 技术的引入并在之后随着时间的推移而过时,它作为一项功能强大的技术,从 Windows NT 4.0 和 Windows 95 开始,始终保持其一致性。它出现在所有的 Windows 操作系统中,并由一组强大的工具集合组成,用于管理本地或远程的 Windows 系统。

尽管已被大众所知并且从其创始以来,已经被系统管理员大量使用,但当WMI技术在震网病毒中被发现以后,它开始在安全社区变得非常流行。从那之后, WMI 在攻击中变得日益普及,其作用有执行系统侦察,反病毒和虚拟机检测,代码执行,横向运动,权限持久化以及数据窃取。

随着越来越多的攻击者利用 WMI 进行攻击,他将会是安全维护人员,事件响应人员,取证分析师必须掌握的一项重要技能,并且要明白如何发挥它的优势。

2.2 WMI体系结构

WMI是微软实现的由分布式管理任务组(DMTF)发布的基于 Web 的企业管理(WBEM)和公共信息模型(CIM)标准。这两个标准的目的是提供工业不可知论者手段,收集和传播在企业中有关的任何托管组件中的信息。

在一个较高的水平上,微软所实现的这些标准可以总结如下:

托管组件

托管组件被表示为 WMI 对象 —— 表示高度结构化的操作系统数据的类实例。微软提供了丰富的 WMI 对象用来与操作系统相关的信息进行通信。例如: Win32_Process,Win32_Service,AntiVirusProduct,Win32_StartupCommand 等等。

使用 WMI 数据

微软提供了几种方式来使用 WMI 数据和执行 WMI 方法。例如, PowerShell 提供了一种非常简单的方式与 WMI 进行交互。

查询 WMI 数据

所有的WMI对象都使用类似于一个 SQL 查询的语言称为 WMI 查询语言(WQL)。 WQL 能够很好且细微的控制返回给用户的 WMI 对象。

填充 WMI 数据

当用户请求特定的 WMI 对象时,WMI 服务 (Winmgmt) 需要知道如何填充被请求的 WMI 对象。这个过程是由 WMI 提供程序去实现的。WMI 提供程序是一个基于 COM 的 DLL 文件 ,它包含一个在注册表中已经注册的相关联的 GUID 。 WMI 提供程序的功能 —— 例如查询所有正在运行的进程,枚举注册表项等等。

当 WMI 服务填充 WMI 对象时,有两种类型的类实例: 动态对象和持久性对象。动态对象是在特定查询执行时在运行过程中生成的。例如,Win32_Process 对象就是在运行过程中动态生成的。持久性对象存储在位于 %SystemRoot%\System32\wbem\Repository\ 的 CIM 数据库中,它存储着 WMI 类的实例,类的定义和命名空间的定义。

结构化 WMI 数据

绝大多数的 WMI 对象的架构是在托管对象格式 (MOF) 文件中描述的。MOF 文件使用类似于 C++ 的语法并为一个 WMI 对象提供架构。因此,尽管 WMI 提供程序产生了原始数据,但是 MOF 文件为其产生的数据提供了被格式化的模式。从安全维护人员的角度来看,值得注意的是, WMI 对象定义可以在没有 MOF 文件的情况下被创建。相反,他们可以使用 .NET 代码直接插入到 CIM 资料库中。

远程传输 WMI 数据

Microsoft 提供了两个协议用于远程传输 WMI 数据: 分布式组件对象模型 (DCOM) 和 Windows 远程管理 (WinRM)。一般来说我们是通过DCOM来进行通信的,也就是我们的135端口的RPC服务。

执行 WMI 操作

部分 WMI 对象包括可执行的方法。例如,攻击者进行横向运动时执行的一个常用方法是在 Win32_Process 类中的静态 Create 方法,此方法可以快速创建一个新的进程。另外, WMI 提供了一个事件系统,使用户可以使用注册事件处理函数进行创建,修改或删除任何 WMI 对象实例。

下面一张Fireeye图提供了微软实现 WMI 的一个高级别概述以及微软实现的组件和实现的标准之间的关系:

2.3 WMI的类与命名空间

WMI 代表着大多数与操作系统信息以及以对象的形式操作有关的数据。一个 WMI 对象是高度结构化定义的信息被如何表示的类的实例。在 MSDN 上,有很多常用的 WMI 类的详细介绍。例如,常见的、有据可查的 WMI 类是 Win32_Process。还有很多未文档化的 WMI 类,幸运的是,所有的 WMI 类都可以使用 WMI 查询语言 (WQL) 进行查询。

WMI 类的命名空间的层次结构非常类似于传统的,面向对象的编程语言的命名空间。所有的命名空间都派生自根命名空间,在用脚本语言查询对象并未显式指定命名空间时,微软使用 ROOT\CIMV2 作为默认的命名空间。在下面的注册表项中包含所有 WMI 设置,也包括已定义的默认命名空间:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM

2.4 查询WMI

WMI 提供了一种简单的语法用于查询 WMI 对象实例、 类和命名空间 — — WMI 查询语言 (WQL) 。

有三种类别的 WQL 查询:

1. 实例查询 —— 用于查询 WMI 类的实例
        2. 事件查询 —— 用于一个 WMI 事件注册机制,例如 WMI 对象的创建、 删除或修改
        3. 元查询 —— 用于查询 WMI 类架构

实例查询

实例查询是最常见的用于获取 WMI 对象实例的 WQL 查询。基本的实例查询采用以下形式:

SELECT [Class property name|*] FROM [CLASS NAME] <WHERE [CONSTRAINT]>

以下查询将返回所有正在运行的进程的可执行文件名称中包含”Chrome”的结果。具体的说是,此查询将返回 Win32_Process 类的每个实例的所有属性的名称字段中包含字符串”Chrome”的结果。

SELECT * FROM Win32_Process WHERE Name LIKE "%chrome%"

事件查询

事件查询提供了报警机制,触发事件的类。在 WMI 类实例被创建时被用于常用的事件查询触发器。事件查询将采取以下形式:

SELECT [Class property name|*] FROM [INTRINSIC CLASS NAME] WITHIN [POLLING INTERVAL] <WHERE [CONSTRAINT]>

SELECT [Class property name|*] FROM [EXTRINSIC CLASS NAME] <WHERE [CONSTRAINT]>

内部和外部的事件将在事件章节中进一步详细解释。

下面是交互式用户登录的事件查询触发器。根据MSDN 文档描述,交互式登录的LogonType值为 2。

SELECT * FROM __InstanceCreationEvent WITHIN 15 WHERE TargetInstance
ISA 'Win32_LogonSession' AND TargetInstance.LogonType = 2

下面是在可移动媒体插入时的事件查询触发器:

SELECT * FROM Win32_VolumeChangeEvent WHERE EventType = 2

元查询

元查询提供一个 WMI 类架构发现和检查机制。元查询采用以下形式:

SELECT [Class property name|*] FROM [Meta_Class<WHERE [CONSTRAINT]>

以下查询将列出所有以字符串 “Win32” 开头的 WMI 类:

SELECT * FROM Meta_Class WHERE __Class LIKE "Win32%"

当执行任何 WMI 查询时,除非显式提供命名空间,否则将隐式使用默认的命名空间 ROOT\CIMV2。

2.5 管理WMI

Microsoft 和第三方供应商提供了丰富的客户端工具使您可以与 WMI 进行交互。以下是此类客户端实用程序的非详尽清单:

PowerShell

PowerShell 是功能极其强大的脚本语言,包含了丰富的与 WMI 进行交互的功能。截至 PowerShell V3,以下 cmdlet (PowerShell 命令术语) 可用于与 WMI 进行交互:

Get-WmiObject

Get-CimAssociatedInstance

Get-CimClass

Get-CimInstance

Get-CimSession

Set-WmiInstance

Set-CimInstance

Invoke-WmiMethod

Invoke-CimMethod

New-CimInstance

New-CimSession

New-CimSessionOption

Register-CimIndicationEvent

Register-WmiEvent

Remove-CimInstance

Remove-WmiObject

Remove-CimSession

WMI 和 CIM 的 cmdlet 也提供了类似的功能。然而,CIM cmdlet 引入了 PowerShell V3,并通过 WMI cmdlets 提供了一些额外的灵活性。使用 CIM cmdlet 的最大优点是它们工作在 WinRM 和 DCOM 协议之上。WMI cmdlet 只工作在 DCOM 协议之上。但是并不是所有的系统都将安装 PowerShell v3+。PowerShell v2 是默认安装在 Windows 7 上的。因此,它被攻击者视为最小公共程序。

wmic.exe

wmic.exe 是一个与 WMI 进行交互的强大的命令行实用工具。它拥有大量的 WMI 对象的方便记忆的默认别名,但你还可以执行更为复杂的查询。wmic.exe 还可以执行 WMI 方法,攻击者经常用来通过调用 Win32_Process 的 Create 方法来进行横向运动。Wmic.exe 的局限性之一是不能接受调用嵌入的 WMI 对象的方法。在 PowerShell 不可用的情况下,使用 wmic.exe 足够用于执行系统侦察和基本方法的调用。

wbemtest.exe

wbemtest.exe 是一个功能强大的带有图形界面的 WMI 诊断工具。它能够枚举对象实例、执行查询、注册事件、修改 WMI 对象和类,并且可以在本地或远程去调用方法。它的接口对大多数用户来说不是特别友好,但从攻击者的角度来看,在其他工具不可用时,它完全可以作为替代选项 —— 例如,如果应用程序白名单机制阻止了 wmic.exe 和 powershell.exe,那么 wbemtest.exe 将是一个带有一个不太理想的 UI但是功能却很强大的实用工具。

winrm.exe

Windows 脚本宿主(WSH)语言

Microsoft 提供了两个 WSH 脚本语言,VBScript 和 JScript。尽管它们比较过时,也算不上高雅的编程语言,但是说到与 WMI 进行交互时,它们的确都是功能强大的脚本语言。事实上,使用 VBScript 和 JScript 编写的利用 WMI 作为主要的 C&C 机制的后门已经出现了。此外,如后面将要解释的,它们是唯一支持 ActiveScriptEventConsumer 事件消费者组件的语言,该组件对于攻击者和防御者来说都是一个非常有价值的 WMI 组件。最后,从攻击的角度来看, VBScript 和 JScript 是在未安装 PowerShell 的老版本的 Windows 系统上的最小公共程序。

C/C++ 调用 IWbem* COM API

如果你需要使用非托管语言如 C 或 C++ 与 WMI 进行交互,你将需要使用 WMI 的 COM API(https://msdn.microsoft.com/en-us/library/aa389276(v=vs.85).aspx)。逆向工程师将需要非常熟悉此接口以及每一个 COM Guid 才能充分理解与 WMI 交互的恶意软件。

.NET System.Management 类

.NET 类库在 System.Management 命名空间中提供了几个与 WMI 相关的类,可以相对简单的使用如 C#、VB.Net 和 F# 语言编写与 WMI 交互的程序。在后续的示例中,这些类将用于在 PowerShell 代码中补充现有的 WMI/CIM cmdlet。

2.6 WMI事件

从攻击者或防御者的角度来看, WMI 最强大的功能之一就是对 WMI 事件的异步响应的能力。除了少数例外,WMI 事件几乎可以用于对操作系统的任何事件作出响应。例如,WMI 事件可能用于触发一个进程创建的事件。这种机制可随后被用作在任何 Windows 操作系统上执行命令行审计。

有两类 WMI 事件 —— 它们都运行在本地的单个进程和 WMI 永久事件订阅的上下文中。本地事件可以维持宿主进程的生存期,尽管 WMI 永久事件订阅存储在 WMI 存储库中,但是作为 SYSTEM 权限运行后依旧可以在重新启动之后继续持续运行。

事件触发条件

事件筛选器

事件筛选器描述事件并且执行WQL事件查询。

事件消费者

事件消费是一个派生自 __EventConsumer 系统类的类,它表示了在事件触发时的动作。我们常用的消费类有下面两个:

1. ActiveScriptEventConsumer – 执行嵌入的 VBScript 或 JScript 脚本 payload

2. CommandLineEventConsumer – 执行一个命令行程序

消费者绑定筛选器

消费者绑定筛选器就是将筛选器绑定到消费者的注册机制。

3.工具分析

3.1 WMIHACK主要功能

  1. 命令执行
  2. 文件上传
  3. 文件下载

3.2 对比WMIEXEC、PSEXEC

常见的WMIEXEC、PSEXEC执行命令是创建服务或调用Win32_Process.create执行命令,这些方式都已经被杀软100%拦截,而wmihack则是借鉴了wmi在攻防中用的最神化的一个功能,无文件持久化控制,实现了免杀横向渗透远程命令执行。

3.3 代码分析

创建对象并连接服务器

第53行创建一个服务定位对象

第56-65用该对象的connectserver方法连接服务器

获取系统版本

通过Win32_OperatingSystem类查询出操作系统版本,并以点做分割截取第0位

命令执行

命令执行一共有两种执行方式,有回显和无回显,这里具体分析有回显的执行方式,因为有回显和无回显在命令执行上没有区别,而有回显功能上比无回显多一点。

注:由于系统版本不同,执行方式也存在差异,笔者经过测试,win7之下的系统在获取系统版本并截取第0位后的值是小于6的,所以我们讲解的方法为98-102行。

首先是98行的AddSCHTASKWithres方法,这个方法传了两个参数command和file,跟进去看下具体的实现逻辑

AddSCHTASKWithres方法的207和208行,创建活动脚本事件消费者。

209到211行,创建一个计划任务名称变量值为随机字符串,并输出。

212行定义消费者名称。

213行定义脚本语言vbscript。

214-248行为具体的脚本代码,主要实现了通过计划任务去执行命令,并将执行后的结果输出到指定文件。

249行注册消费者,返回其链接。

251-252行创建事件过滤器。

253行定义事件过滤器名称。

254行定义事件过滤器命名空间。

255行每秒查询一次实列修改事件,目标实例的类是Win32_PerfFormattedData_PerfOS_System。

256行定义查询语句。

257定义查询语言。

258注册过滤器,返回其链接。

260-261行创建过滤器和消费者绑定。

262行指定消费者。

263行指定过滤器。

264行执行绑定。

266行设置两秒等待时间

267-269行删除活动脚本事件消费者,事件过滤器,消费者绑定过滤器

未完待续。。。

结尾

欢迎大家加我的微信一起交流学习。

细说内网横向工具WMIHACK相关推荐

  1. 基于nodejs与花生壳内网穿透工具的调查问卷

    一.制作调查问卷 先去网上找一张调查问卷的html页面(直接复制网页源代码,包括link链接里的css文件),所有文件放在一个文件夹下面,就叫'调查问卷'吧,然后修改问卷中问题,变成你的调查问卷,关于 ...

  2. 内网横向渗透之各种传递攻击

    内网横向渗透之各种传递攻击 前言 在前面一篇文章已经对内网信息收集做了详细介绍,所需要的内网环境也包含在那篇文章中,接下来将以前期内网信息收集到的信息为基础介绍各种明文或hash传递攻击进行横向渗透. ...

  3. 【内网渗透工具】炫彩蛇安装教程

    点击查看[学习资料] Viper是一款图形化内网渗透工具,将内网渗透过程中常用的战术及技术进行模块化及武器化. Viper基础功能已集成杀软绕过,内网隧道,文件管理,增强命令行等基础功能. Viper ...

  4. NatApp 内网穿透工具简单使用介绍说明

    什么是内网穿透? 内网穿透简单来说就是将内网外网通过natapp隧道打通,让内网的数据让外网可以获取.比如常用的办公室软件等,一般在办公室或家里,通过拨号上网,这样办公软件只有在本地的局域网之内才能访 ...

  5. FastTunnel - 打造人人都能搭建的内网穿透工具

    FastTunnel是用.net core开发的一款跨平台内网穿透工具,它可以实现将内网服务暴露到公网供自己或任何人访问. 与其他穿透工具不同的是:FastTunnel项目致力于打造一个易于扩展.易于 ...

  6. 采用.NET CORE的全异步模式打造一款免费的内网穿透工具--NSmartProxy

    什么是NSmartProxy? NSmartProxy是一款免费的内网穿透工具. 特点 跨平台,客户端和服务端均可运行在MacOS,Linux,Windows系统上: 使用方便,配置简单: 多端映射, ...

  7. 启动go服务_内网穿透工具 FRP公网服务端、内网客户端快速配置文件说明

    内网穿透工具 FRP 公网服务端.内网客户端 frps.ini .frpc.ini 配置文件常用设置展示及说明 公网服务端 frps.ini 配置文件常用设置 公网服务端配置文件:frps.ini [ ...

  8. 钉钉开放平台:内网穿透工具 - 服务器免费打造教程

    钉钉开放平台:内网穿透工具 - 服务器免费打造教程 让全世界的人都可以访问到你本地电脑上的网站,老程序员亲自演示

  9. 内网穿透工具_utools让你3步搭建一个内网穿透工具

    文章简介 在日常生活中,我们经常会因为各种需要下载各种APP.例如,备忘录需要下载备忘录软件,时间管理需要番茄时间法类的软件,内网穿透需要自行配置.这些软件可能我们只是为了一时的使用,用完就不会再用了 ...

最新文章

  1. Linux下使用perf进行性能分析,并导出火焰图
  2. ARTS打卡计划第二周-Share-使用java注解对方法计时
  3. abaqus python二次开发攻略_Abaqus有限元分析常见问题解答与实用技巧 12天后上架...
  4. 【python】排序算法的稳定性冒泡排序(画图详细讲解)
  5. SpringMVC——Spring中的DispatcherServlet怎么工作?
  6. [转] 前端异常监控解决方案研究
  7. JavaScript深入浅出第1课:箭头函数中的this究竟是什么鬼?
  8. sizeof不是java关键字是_下列哪项不是Java语言的关键字。
  9. Java环境配置及第一个HelloWord(Win)
  10. 利用uiautomator2刷金币
  11. Django提交表单报错:CSRF token missing or incorrect.
  12. 如何能成为一名合格的前端开发工程师?
  13. L3-001. 凑零钱-PAT团体程序设计天梯赛GPLT(01背包,动态规划)
  14. Win10重装系统后如何合并分区?
  15. dds通信中间件_车内的中间件协议:是面向服务,还是以数据为中心,或是RESTful?...
  16. 最优化问题中,牛顿法为什么比梯度下降法求解需要的迭代次数更少?
  17. C语言自学笔记(16)
  18. 冒泡排序代码实现与详解
  19. DEFCON 23|利用U盘60秒打开保险柜
  20. Tableau仪表板制作

热门文章

  1. python open 函数漏洞_python和django的目录遍历漏洞
  2. note pro 国际版_改装Redmi Note 8 Pro —一次冒险
  3. 苹果xr截屏怎么截_原来苹果手机可实现长截屏!学到了,以后不用羡慕别人手机了...
  4. 统计学第一篇,均值、中位数、众数
  5. 工作的思考七:重视邮件
  6. 生产制造业ERP管理系统对于制造企业的好处有哪些?
  7. 开环零极点对根轨迹的影响
  8. Mysql三、数据库面试题+sql语句解析
  9. TokenRise的见茶卸甲@一杯严选 六道一辉探访“茶人的栖息地@世科坊”
  10. windows使用ssh连接远程服务器