本文讲的是在不熟悉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.

事情变得不简单了吧?

还有更多可以实现的,你可以参考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.

进行更复杂的攻击

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

由上文可知,我们可以改变代码的执行时间,我们只需要对 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事件被记录时执行,等等。

是不是非常酷!

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

现在你知道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
本文来自云栖社区合作伙伴嘶吼,了解相关信息可以关注嘶吼网站。
原文链接

在不熟悉C/C++情况下,hook windows事件相关推荐

  1. Suggestion [3,General]: 找不到命令 webpack,但它确实存在于当前位置。默认情况下,Windows PowerShell 不会从当前位置加载命令。如果信任此命令,请改为键

    Suggestion [3,General]: 找不到命令 webpack,但它确实存在于当前位置.默认情况下,Windows PowerShell 不会从当前位置加载命令.如果信任此命令,请改为键入 ...

  2. 如何在没有微软商店的情况下在Windows 10上安装应用程序

    如何在没有微软商店的情况下在Windows 10上安装应用程序 通过微软商店,你可以轻松地在Windows 10设备上安装应用程序,就像使用Google Play或AppleStore一样.IT部门经 ...

  3. 安装Typora情况下,Windows右键新建菜单中增加新建md文件

    搜了好久,看CSDN里都不能用了.留作备忘 在安装了Typora的情况下 Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\.md] @=& ...

  4. 多网段情况下配置windows防火墙允许ping以及远程打印和网络发现

    1 左下角搜索栏中输入"高级安全 Windows Defender 防火墙" 2.分别在"入站规则"和"出站规则"里面选择"文件和 ...

  5. 已经windows如何在安装linux,如何在已经安装linux情况下安装windows

    1.找到磁盘分区工具,将一个主分区磁盘格式化为windows认可的文件系统,如: ntfs. 2.安装windows,或ghost to this partition.(最好是ghost,这样不会抢l ...

  6. 在不借助其他工具的情况下破解Windows开机密码

    文章:http://www.cnblogs.com/vforbox/p/4828855.html#!comments. 从该文章我们也可以得到一个快速启动某个程序的方法:将自己常用的程序命名为seth ...

  7. 使用socket 情况下的windows系统与ubuntu16.04系统通信

    1.1 更改网络IP地址 1.1 windows系统更改IP地址 右下角网络→右击打开网络和Internet设置→更改适配器选项→右击VMware Network Adapter VMnet8→属性→ ...

  8. 教你在硬件不满足Windows 11最低硬件要求的情况下安装Windows 11(绝对有效)

    众所周知,Win11 Beta版已经发布,但一部分电脑因为硬件无法升级,(大多倒在了TPM2.0,下面我来教你怎样强制安装. 首先,在Win10的设置中找到Windows预览体验计划,登录后选择Rel ...

  9. 想买楼下邻居的那套房,彼此熟悉,这种情况还用找中介付中介费吗?

    身边很多的朋友都特别讨厌中介,尤其是在购买二手房的时候,因为要支出一大笔的中介费,特别不划算. 所以很多朋友在购房的过程当中总是想着一切办法去回避中介费,希望能够跳过中介房产交易. 那么如果你想购买楼 ...

最新文章

  1. ASP.NET AJAX 1.0 发布
  2. 【组合数学】生成函数 ( 正整数拆分 | 无序 | 有序 | 允许重复 | 不允许重复 | 无序不重复拆分 | 无序重复拆分 )
  3. java怎么读取文件夹下的_java怎么读取读取文件夹下的所有文件夹和文件?
  4. 美团Android开发工程师岗位职能要求,真香
  5. P1616 疯狂的采药(洛谷,动态规划递推,完全背包)
  6. 通过SQL发送邮件,SQL发送Email(转)
  7. Spring Boot 中文索引--资料大全
  8. 总结: C++ 中如何把输出结果写入到文件中
  9. 茶余饭后聊Spring 一
  10. GitHub遭遇史上最强DDoS攻击:峰值流量1.35Tbps!
  11. CSS从入门到精通——基础知识
  12. Xshell7安装教程
  13. 串联两个路由器共享宽带上网
  14. 有机无脂牛奶的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  15. Firefox(火狐浏览器)常用插件
  16. NLP入门概览(3)—— 神经网络语言模型、词向量
  17. Field类的概述和使用
  18. mysql5.7.17 32_mysql—MySQL 5.7.17安装及基本SQL语句(第七章)
  19. 进阶三部曲第一部《Android进阶之光》第2版已出版
  20. VBA:Excel工作簿所有子表数据一键汇总

热门文章

  1. Perl中删除或替换字符串中特殊字符(如空格)的方法
  2. Nginx做反向代理和负载均衡时“X-Forwarded-For”信息头的处理
  3. 好几个div(元素)找到最后一个
  4. 赛门铁克发布第21期《互联网安全威胁报告》 揭示当前更为严峻的网络威胁现状...
  5. 瑞元双玻组件助力浙江多座分布式电站高效运行
  6. 《流量的秘密 Google Analytics网站分析与商业实战》一2.2 版本选择的标准
  7. Cartographer系列之三——ROS中的安装
  8. java_db常见错误总结
  9. 程序员专属段子集锦 4/10
  10. Linux 命令(124)—— lsof 命令