在不熟悉C/C++情况下,hook windows事件

简介: 本文讲的是在不熟悉C/C++情况下,hook windows事件,WMI(Windows 管理规范)是基于Windows操作系统的管理数据和操作的基础架构。可以编写WMI脚本或应用程序来自动执行远程计算机上的管理任务,但是WMI会将管理数据提供给操作系统和产品的其他部分。
本文讲的是 在不熟悉C/C++情况下,hook windows事件

介绍

MSDN中对它的介绍为:

WMI(Windows 管理规范)是基于Windows操作系统的管理数据和操作的基础架构。可以编写WMI脚本或应用程序来自动执行远程计算机上的管理任务,但是WMI会将管理数据提供给操作系统和产品的其他部分。

通过上述定义,我们了解到他所具有的威力,你不仅可以以管理员权限进行计划任务执行,而且最重要的是,还是通过远程执行!但是这仅是它功能的冰山一角,而且很多像CozyDuke,和DeepPanda这样的黑客组织已经注意到了这一”武器”。实际上,在过去几年里,黑客们已经开始在他们的渗透测试过程中使用windows本机工具来达成他们的目的。

这种无上传攻击提供了很多便利之处,首先,攻击者不需要将各种各样的工具上传到目标操作系统上面,从而降低了被杀毒软件以及用户检测到的可能性。其次,这种攻击方法减少了攻击溯源被发现的可能性。

WMI可以由Powershell,WMI控制台,或者使用MOF脚本实现。

在Powershell中使用WMI,你需要打开Powershell控制台,然后执行Get-wmiobject命令(或者gwmi),如下:

$ get-wmiobject win32_logicaldisk name, freespace, systemname, size -filter drivetype=3

__GENUS         : 2
__CLASS         : Win32_LogicalDisk
__SUPERCLASS    :
__DYNASTY       :
__RELPATH       :
__PROPERTY_COUNT : 4
__DERIVATION    : {}
__SERVER        :
__NAMESPACE     :
__PATH          :
FreeSpace       : 34652438528
Name            : C:
Size            : 106901270528
SystemName      : AI-PINCHEWEEEY-VM
PSComputerName   :

上方代码中你可以看到,我们通过Win32_LogicalDisk类获取到了多个系统驱动器的属性。这些类中每一个都具有一些属性和你可以执行的函数,你可以通过阅读MSDN给出的这些类的文档进行了解。Win32_LogicalDisk类的说明文档:https://msdn.microsoft.com/en-us/library/windows/desktop/aa394173%28v=vs.85%29.aspx。WMI所有类的说明文档:https://msdn.microsoft.com/en-us/library/windows/desktop/aa394554%28v=vs.85%29.aspx

攻击者可以对C盘进行复制,并且得到C盘的ID,以便渗透测试结束之后删除副本,清理痕迹。在解密SAM文件获取windows凭证攻击过程中,就用到了这一攻击方法,在这一方法中,Win32_ShadowCopy类中的Create()函数被调用:

$ Get-WMIObject Win32_ShadowCopy -List).Create("C:", "ClientAccessible").ShadowID

顺便说一下,如果你想要有关于影子副本的moar cookies,你可以阅读这一篇文章:https://webcache.googleusercontent.com/search?q=cache:qiIjB9TU0VwJ:blog.szynalski.com/2009/11/volume-shadow-copy-system-restore/

你还有很多方法去执行WMI,比如可以通过windows命令行执行,如下,你可以发现,变量基本上是相同的:

$ wmic logicaldisk where drivetype=3 get name, freespace, systemname, size
FreeSpace   Name  Size          SystemName
33230168064  C: 106901270528  AI-PINCHEWEEEY-VM

做一些有趣的事情

现在我们已经说了很多WMI中你可以使用的类以及函数。那么攻击者如何使用WMI达到他们的目的呢?

比如开启一个进程?

$ wmic process call create "notepad.exe"
Executing (Win32_Process)->Create()
Method execution successful.
Out Parameters:
instance of __PARAMETERS
{
        ProcessId = 2416;
        ReturnValue = 0;
};

再比如杀掉一个进程?

$ wmic process where name="notepad.exe" delete
Deleting instance AI-PINCHEWEEEY-VMROOTCIMV2:Win32_Process.Handle="2416"
Instance deletion successful.

事情变得不简单了吧?

在不熟悉C/C++情况下,hook windows事件

还有更多可以实现的,你可以参考OS类的指南,比如:

Win32_Process (“edit”, query processes)
Win32_Service (“edit”, query services)
Win32_Directory (“edit”, query directories)
Win32_Shares (“edit”, query network shares)
Win32_LocalTime (query time)

你没有忘记最有趣的事情吧,你可以远程执行命令!

$ wmic /node: "192.168.1.10" /username:domainuser /password:pwd process call create 'notepad.exe'
Executing (Win32_Process)->Create()
Method execution successful.
Out Parameters:
instance of __PARAMETERS
{
        ProcessId = 5176;
        ReturnValue = 0;
};

这是攻击者在内网中进行横向渗透的最佳方法,因为攻击者不用将PSexec这类的工具上传到受害机器上面。

如何hook windows事件呢?

我们还没有讨论到MOF脚本,用我自己的话讲,MOF脚本需要使用mofcomp.exe进行”编译”,然后就可以访问到一些WMI功能。

使用MOF脚本,你可以决定操作系统执行命令的对象,以及执行命令的时间。以下对象就是用于定义这两个变量:

__EventConsumer: 指定执行程序
__EventFilter: 设置执行时间
__FilterToConsumerBinding: 将执行程序和执行时间进行绑定

这样做最有趣的一件事就是可以执行vbs脚本,所以这样的话你就可以做你想做的任何事情,比如:

instance of ActiveScriptEventConsumer as $Cons
{
    Name = "ASEC";
    ScriptingEngine = "VBScript";
    ScriptText =
        "Set objShell = CreateObject("WScript.Shell") n"  
        "objShell.Exec("c:windowssystem32cmd.exe /c echo MOF Script Output>c:mof_output.txt")n";
};

上述EventConsumer将执行windows命令并且通过vb脚本将一些内容写入文件,这样就很方便去检查命令执行成功与否。

接下来就是Event Filter,什么时间执行:

instance of __EventFilter as $Filt
{
    Name = "EF";
    EventNamespace = "rootcimv2";
    QueryLanguage = "WQL";
    Query = "SELECT * FROM __InstanceCreationEvent "  
            "WITHIN 2 WHERE TargetInstance ISA 'Win32_Process' "
            "AND TargetInstance.Name = 'notepad.exe'";
};

对于EventFilter,一种叫做WQL(WMI查询语言)的语言在这里被使用。这一语言可以用来hook不通的系统事件。在上方代码中,我们正在定义了”什么时候触发”,即什么时候创建实例。你可以阅读一篇文档详细了解:https://msdn.microsoft.com/en-us/library/windows/desktop/aa394649%28v=vs.85%29.aspx。在这里,我们创建名为”notepad.exe”的Wind32_Process类的实例。

这是一个非常简单的方法来实现类似于hook CreateProcess调用的东西。攻击者可以查看特定的进程,然后执行某些操作,例如杀死进程。

现在让我们定义将执行程序和执行时间进行绑定的操作:

instance of __FilterToConsumerBinding
{
    Filter = $Filt;
    Consumer = $Cons;
};

最后,MOF脚本如下:

#pragma namespace (".rootsubscription")

instance of ActiveScriptEventConsumer as $Cons
{
    Name = "ASEC";
    ScriptingEngine = "VBScript";
    ScriptText =
        "Set objShell = CreateObject("WScript.Shell") n"  
        "objShell.Exec("c:windowssystem32cmd.exe /c echo MOF Script Output>c:mof_output.txt")n";
};

instance of __EventFilter as $Filt
{
    Name = "EF";
    EventNamespace = "rootcimv2";
    QueryLanguage = "WQL";
    Query = "SELECT * FROM __InstanceCreationEvent "  
            "WITHIN 2 WHERE TargetInstance ISA 'Win32_Process' "
            "AND TargetInstance.Name = 'notepad.exe'";
};

instance of __FilterToConsumerBinding
{
    Filter = $Filt;
    Consumer = $Cons;
};

我们只需要通过以管理员身份执行mofcomp.exe对这一脚本进行编译:

$ mofcomp.exe .mof_script.mof
Microsoft (R) MOF Compiler Version 10.0.10586.0
Copyright (c) Microsoft Corp. 1997-2006. All rights reserved.
Parsing MOF file: .mof_script.mof
MOF file has been successfully parsed
Storing data in the repository...
WARNING: File .mof_script.mof does not contain #PRAGMA AUTORECOVER.
If the WMI repository is rebuilt in the future, the contents of this MOF file will not be included in the new WMI repository.
To include this MOF file when the WMI Repository is automatically reconstructed, place the #PRAGMA AUTORECOVER statement on the first line of the MOF file.
Done!

此时如果你打开记事本,你就会看到在C盘下面出现了mof_output.txt.

进行更复杂的攻击

我敢确信,当你小时候看电视或者看电影过程中,一定听过所谓的”时间炸弹”或者”逻辑炸弹”~那么,让我们实现这样的一个”炸弹”吧~

在不熟悉C/C++情况下,hook windows事件

由上文可知,我们可以改变代码的执行时间,我们只需要对 Event Filter中的代码做一些小小的修改:

instance of __EventFilter as $Filt
{
    Name = "EF";
    EventNamespace = "rootcimv2";
    QueryLanguage = "WQL";
    Query = "SELECT * FROM __InstanceModificationEvent WITHIN 20 WHERE "
            "TargetInstance ISA 'Win32_LocalTime' AND "
            "TargetInstance.Hour = 10 AND "
            "TargetInstance.Minute = 34";
};

从上述代码中可以看到,Event Consumer会在上午10:34触发。我们通过hook系统时间以及监控其变化来对它进行实现。代码中within是指定事件相差间隔为20秒。

我们已经展示了如何使用WMI和MOF脚本来实现攻击者使用自定义工具执行的许多操作。你可以在某些时间执行某些操作(有助于确定何时从受感染的系统中获取信息),在程序或服务启动或停止时执行,当文件从文件系统中写入或删除时执行,或者windows事件被记录时执行,等等。

是不是非常酷!

在不熟悉C/C++情况下,hook windows事件

如何检查我是否被入侵呢?

现在你知道WMI的强大了吧,那么下一个问题就是如何防护这种攻击呢?首先,和平时入侵检测一样,了解当前系统正在运行什么,你需要知道在系统中注册了哪些事件,以便你可以监控其创建以及删除。你可以使用如下powershell命令列出所有的Event
Consumers,,Event Filters 以及Filter To Consumer Bindings。

gwmi -Namespace "root/subscription" -Class __EventFilter
gwmi -Namespace "root/subscription" -Class __EventConsumer
gwmi -Namespace "root/subscription" -Class __FilterToConsumerBinding

如果想删除事件,你可以使用如下命令:

gwmi -Namespace "root/subscription" -Class __EventConsumer | where name -eq "<NAME>" | Remove-WmiObject
gwmi -Namespace "root/subscription" -Class __EventFilter | where name -eq "<NAME>" | Remove-WmiObject

现在你可以写脚本来监控系统事件,以及删除掉不应该存在的异常事件.
你还可以使用windows平台上的时间追踪器来跟踪wmi活动.

结论

总之现在得到的结论是黑客可以使用wmi进行侦查,横向渗透,以及与之相关的一切,由于windows中自带这种服务,导致了使用这一攻击方法进行渗透的案例越来越多。

和往常一样,每一个功能强大的好工具如果用来做坏事,同样会非常强大。wmi攻击已经在一些恶意软件中被使用,比如:Wiper,Flame中利用MOF文件使用rundll32执行恶意dll,Kjw0rm中使用TV5Monde
Compromise 获取系统信息,PowerWorm中使用WMI进行持久性控制,Operation Mangal等等。
所以,希望你之后在威胁建模时,将wmi加入到其中。




原文发布时间为:2017年8月3日
本文作者:xnianq
本文来自云栖社区合作伙伴嘶吼,了解相关信息可以关注嘶吼网站。
目录
相关文章
|
7月前
|
存储 开发框架 开发者
QT C++焦点事件:多角度解析实用技巧与方法
QT C++焦点事件:多角度解析实用技巧与方法
1297 0
|
7月前
|
存储 设计模式 安全
【C++ 软件设计思路】多角度探索C++事件处理:以‘handlePowerEvent’函数为例
【C++ 软件设计思路】多角度探索C++事件处理:以‘handlePowerEvent’函数为例
122 2
|
7月前
|
人工智能 机器人 C++
【C++/Python】Windows用Swig实现C++调用Python(史上最简单详细,80岁看了都会操作)
【C++/Python】Windows用Swig实现C++调用Python(史上最简单详细,80岁看了都会操作)
141 0
|
7月前
|
关系型数据库 数据库 C++
【C++】Windows使用Visual Studio C++链接云数据库PostgreSQL(沉浸式老爷教学)
【C++】Windows使用Visual Studio C++链接云数据库PostgreSQL(沉浸式老爷教学)
|
7月前
|
人工智能 机器人 编译器
【C++】Windows端VS code中运行CMake工程(手把手教学)
【C++】Windows端VS code中运行CMake工程(手把手教学)
396 0
|
4月前
|
安全 C++ Windows
Windows下C++使用gRPC(Qt和VS,含文件包和使用方法)
Windows下C++使用gRPC(Qt和VS,含文件包和使用方法)
|
6月前
|
安全 API C++
逆向学习Windows篇:C++中多线程的使用和回调函数的实现
逆向学习Windows篇:C++中多线程的使用和回调函数的实现
194 0
|
6月前
|
C++ UED 开发者
逆向学习 MFC 篇:视图分割和在 C++ 的 Windows 窗口程序中添加图标的方法
逆向学习 MFC 篇:视图分割和在 C++ 的 Windows 窗口程序中添加图标的方法
81 0
|
7月前
|
测试技术 数据库 C++
Qt C++拖放事件探索之旅:多方法深入解析
Qt C++拖放事件探索之旅:多方法深入解析
521 1
|
7月前
|
编译器 C语言 C++
VSCode上搭建C/C++开发环境(vscode配置c/c++环境)Windows系统---保姆级教程
VSCode上搭建C/C++开发环境(vscode配置c/c++环境)Windows系统---保姆级教程