10月24, 2014

VBS远控木马

最近捕获到一个vbs后门脚本,发现比较有意思,根据以往遇到的脚本,绝大多数都是蠕虫、下载者(从木马服务器下载一个远控)这类或者是配合木马本身做自删除中间文件,极少遇到本身就是后门或是远程控制类木马,原因是这类木马的局限性较大,一些复杂功能不能完整编写。简单分析下。

木马基本信息:

MD5:0ad2a50ac1a1a98ce3db134e795e2974

大小:97,525 字节

目标端口:1346

上线域名:略

原始文件局部一览:

vbs1

根据脚本本身,拿python写了一个简单的解密片段得到明文vbs恶意文件

或者更简单的方法就是在executeGlobal

'executeGlobal (CKglagJDVsalqnU)
set fso =createobject("scripting.filesystemobject")
fso.createtextfile("C:\1.txt").write CKglagJDVsalqnU

语句的时候,直接将语句写到另一个文件保存下来。

木马执行:

VBS脚本启动的时候被Wscript.exe分析执行,即Wscripts是VBS脚本的解释器。

木马协议特征:

该木马传输主要是同过http协议传输,同时以字符串“<|>”作为信息分割,通过WMI查询本地计算机信息以及安全信息。

set objsecuritycenter = getobject("winmgmts:\localhostroot" & sc)
set colantivirus = objsecuritycenter.execquery("select * from antivirusproduct","wql",0)
for each objantivirus in colantivirus
    security  = security  & objantivirus.displayname & " ."

该后门已知功能包括: | excecute %1 | 执行命令行%1 | |-----------------|--------------------------------------| | update %1 | 后门升级,升级地址为%1 | | uninstall | 后门卸载 | | send %1 %2 | 从%1下载文件存为%2并执行(POST方法) | | site-send %1 %2 | 从%1下载文件存为%2并执行(GET方法) | | enum-driver | 枚举驱动器 | | enum-faf %1 | 遍历指定目录%1 | | enum-process | 枚举当前进程 | | cmd-shell %1 | 远程shell执行命令%1 | | delete %1 | 删除目标%1 | | exit-process %1 | 指定一个目标pid==%1,退出该进程 | | sleep %1 | 休眠,时间为%1 |

本地监听:

本地监听到上线数据包。

上线数据信息是放在user-Agent里面

vbs2

上线后接受远程服务器的指令:

vbs3

利用python写个简易的脚本,模拟服务端,远程执行cmd命令,

得到的效果如下(虚拟机中显示):

vbs4

可以看出除了传统PE木马外,木马作者配合其他形式脚本,制作出来的木马能起到免杀效果,未来可能会出现其它解释性语言编写木马也说不定。

附:

python解密code片段:

def decode_code(arg,key):
    return chr(ord(arg)-ord(key[0]))
encodeString="加密长字符串"
split_key = "~*"
key = "PqUYslk7QB7zwn7g6BiT7lsXlOixZ7ubWR2"
text=''
encode_list=encodeString.split(split_key)
for i in encode_list:
    text=text+decode_code(chr(int(i)-847),key)
with open('code','w') as f:
    f.write(text)

简易http服务code片段:

from SimpleHTTPServer import SimpleHTTPRequestHandler
from BaseHTTPServer import BaseHTTPRequestHandler
from BaseHTTPServer import HTTPServer

class MyHTTPRequestHandler(BaseHTTPRequestHandler):
    def do_POST(self):
        text=self.deal_post_data()
        if text is not None:
            print text
        enc='utf-8'
        self.send_response( 200 )
        self.send_header("Content-type", "text/html;charset%s" %enc )

        ct = r'cmd-shell<|>dir c:windows'
        self.send_header('Content-length', str(len(ct)))
        self.end_headers()
        self.wfile.write(ct)

    def deal_post_data(self):
        remainbytes = int(self.headers['content-length'])
        if remainbytes:
            data = self.rfile.read(remainbytes)
            return data

if __name__ == '__main__':
    port = 1346

    handler = SimpleHTTPRequestHandler

    httpd = HTTPServer(('', port ), MyHTTPRequestHandler)

    print "Server is running at port", port
    httpd.serve_forever()

本文链接:http://blogs.360.cn/post/vbs_cc_trojan-2.html

-- EOF --

Comments