近日,一种新型木马被发现,该恶意软件到目前为止已经感染了数十万计算机,而且感染是世界范围的。据称,其主要窃取被感染者的社交网络账户信息和银行账户的登录凭证。本文是关于这个木马进行的一次分析。
几天以前,一份Goolge的500万账户密码列表泄露了。Google工程师出面澄清说:该列表并非是在Google的系统或者某一分支下泄露的,主要泄露途径来自于钓鱼活动和一些并没有获取到授权的方式(注:也有人猜测是大批量的撞库活动),而Google本身是足够安全的。
而这几天,我们又发现了一起类似于Google事件的网络犯罪活动,而这款恶意软件已经感染了数十万的计算机,并且已经窃取了他们的社交媒体社交网络账户以及银行账户访问凭证。
关于木马样本,大体看了一下,居然也是一个AutoIt解释器木马,当时我就惊呆了呀,最近还真是AutoIt木马爆发季啊,都可以拍一部《变形记》了。
只是这个木马是通过Email钓鱼传播,而这个百足之虫则是通过游戏平台来传播的。鉴于两个木马同根同源,那我们就略略分析一下,看一下这个木马是怎么做的。
(木马样本我会在文末给出,有兴趣的同学可以下载看一下)
0×01初见美铝——木马样本
大体分析了一下,发现木马文件是一个winrarSFX文件(winrar自解压格式),这里不仔细看还真看不出来,因为这里木马的图标换成了别的样子
然后,我们使用winrar打开:
#p#
0×02 尾随跟踪——文件大略分析
里面一共包含四个文件,释放之后是保存在%USERPROFILE%\zvf382a42256\的,而且具有系统和隐藏的属性,解压之后如果看不到文件记得打开查看隐藏文件。
其中唯一一个可执行文件是update.exe,这里,解压之后,很明显是一个AutoIt的脚本解释器,看图标就可以看出来了。不多说。
这样看来剩下三个文件一定有个au3或者a3x文件,我们接下来找找:
接下来引起我们注意的是最上面这个PBS文件,大小有331MB(看过上一篇文章的应该对这个不会陌生),其实这个文件是一个经过混淆的文件,这里我们贴出反混淆的python代码,以供各位研究(代码出自一位希腊研究员,让我们向他致敬!)(小编:我贴出代码就是为了赚稿费的!可是发钱的人在哪里→_→)
- import sys, os
- import sys, os
- def progress(n, total):
- sys.stdout.write("\r[+] Cleaned: %d%%" % (n*100/total))
- sys.stdout.flush()
- def remove_from_list(string_to_remove, list):
- while True:
- try:
- list.remove(string_to_remove)
- # print ".",
- except:
- # print "done"
- break
- def clean_from_dummystring_newlines(dummyfilename, newfilename):
- f = open(dummyfilename)
- with f as lines:
- content = lines.readlines()
- f.close()
- for mem in content:
- string_to_remove = mem
- print "\n[+] dummy string to be removed, seems to be: "+string_to_remove
- break
- if content.count(string_to_remove) > 10:
- # print "String to be removed, seems to be: \""+string_to_remove+"\""
- remove_from_list(string_to_remove, content)
- if content.count(' \n') > 5:
- print "[+] Removing \" \\n\""
- remove_from_list(" \n", content)
- f = open(newfilename, 'wb')
- f.write(''.join(content))
- f.close()
- info = os.stat(sys.argv[1])# get file size
- filesz = info.st_size
- f = open(sys.argv[1], 'rb')#.. now open file to read
- l = open(sys.argv[2], 'wb')
- b = f.read(1)
- datatowrite = ""
- list1 = []
- i = 0
- k = 0
- print "\n[+] cleaning the tab chars.."
- while b != '':# read file till EOF.. :)
- while b == '\t':# tabs are the chars i want to ignore...
- i += 1
- k += 1
- b = f.read(1)
- if i>0:
- # print "There were "+str(i)+" tabs.."
- if i<10:# writeable tabs
- for j in range (0,i):
- datatowrite = '\t'
- l.write(datatowrite)
- i = 0
- progress(k, filesz)# give progress status
- if b == '\n':# write \n to file...
- # print "NL"
- k += 1
- datatowrite = '\n'
- l.write(datatowrite)
- elif b == '\r':# write \r to file
- # print "CR"
- k += 1
- datatowrite = '\r'
- l.write(datatowrite)
- else:
- while b >= ' ' and b <= '}':# printable char? write it..
- k += 1
- list1.append(b)
- b = f.read(1)
- # print "".join(list1)
- datatowrite = ''.join(list1)# write to file
- l.write(datatowrite)
- list1 = []
- b = f.read(1)
- f.close()
- l.close()
- # Now clean a bit more.. clear the 1) dummy comment strings and 2) the dummy new lines.
- clean_from_dummystring_newlines(sys.argv[2], sys.argv[2])
- print "Done!"
处理文件的命令是:
111.py jqanjzruzb.PBS clean.au3
经过处理之后,世界瞬间变清凉了!331MB的文件只有55KB,因为有点多,这里就不贴源代码了,大家可以也在文末下载。
再说一下其他两个文件:
oziryzkvvcpm.AWX—文件比较小,应该是一个INI配置文件,代码如下:
[8472254]
7345448=2738636
[5152433]
7790268=6953219
[5242747]
1024020=8930731
[9537477]
9537477=yzvf382a42256
sgym.VQA—一个二进制文件。或许大概是个攻击载荷文件吧,后文我们会说到。
以上略过不讲。#p#
0×03 踏入大门——脚本分析
这里着重分析一下这个经过混淆的au3脚本文件,贴出主要代码:
- .....
- .....
- Local $startup = IniRead($uniscriptdir & "\oziryzkvvcpm.AWX", "5242747", "1024020", "NotFound")
- If $startup = "8930731" Then
- startup()
- Else
- EndIf
- Local $antis = IniRead($uniscriptdir & "\oziryzkvvcpm.AWX", "antis1", "antis2", "NotFound")
- If $antis = "antis3" Then
- antis()
- Else
- EndIf
- .....
- $protectprocess = IniRead($uniscriptdir & "\oziryzkvvcpm.AWX", "8472254", "7345448", "NotFound")
- If $protectprocess = "2738636" Then
- AdlibRegister("anti_hook", 500)
- .....
- Local $persistence = IniRead($uniscriptdir & "\oziryzkvvcpm.AWX", "5152433", "7790268", "NotFound")
- If $persistence = "6953219" Then
- checkvbs()
- AdlibRegister("persistence", 500)
- Else
- EndIf
- ......
- Func submain()
- $skey = IniRead($uniscriptdir & "\oziryzkvvcpm.AWX", "9537477", "9537477", "NotFound")
- $sapppath1 = FileGetShortName(@ScriptDir & "\sgym.VQA")
- $sapppath = FileRead(FileOpen($sapppath1, 16))
- $sarquive = _crypt_decryptdata($sapppath, $skey, $calg_rc2)
- Local $commandline = IniRead($uniscriptdir & "\oziryzkvvcpm.AWX", "commandline1", "commandline2", "NotFound")
- If $commandline = "commandline3" Then
- _runpe($sarquive," command-replace")
- Else
- _runpe($sarquive)
- EndIf
- EndFunc
- ....
—位置5242747处:木马的持续攻击处理。增加了很经典的启动项:注册表HKCU64\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\RunOnce添加启动项,同时在开始菜单–>程序–>启动处添加启动项。真是够经典的。
—位置antis1处:这里在awx配置文件中没有看到踪迹,这意味着antis功能并不能被执行。这应该是作者有意为之,应该是一个对抗杀毒软件的功能。
—位置8472254处:这里使用了蓝屏手段来对抗杀毒软件,一旦发现木马进程被杀掉,我们的主机就会立刻蓝屏,很多木马也会使用这种手段来进行自我保护。
—位置5152433处:木马自查vbs是否存在,以保证自身的可持续性攻击。
—位置9537477处:这里就是我们刚刚说的最后一个sgym.VQA文件。此处的代码包含一个解密的密钥——即为配置文件9537477的值yzvf382a42256,木马采用RC2算法进行解密,解密之后是一个PE的可执行文件,解密之后执行。这应该就是木马的核心了,接下来我们看一下这个木马究竟做了什么。#p#
0×04 登堂入室——木马文件分析
下面,首先,让我们来看一下这个解密的文件是不是一个PE文件。用OllyDbg为update.exe在CryptDecrypt 函数处下断点。然后我们进行一下对比:
接着我们继续跟踪,发现CryptDecrypt函数的第五个参数是一个包含加密的数据缓冲区,很明显这里就是我们上文提到的密钥yzvf382a42256了,另外,函数的第六个参数包含的是一个数据长度,而我们发现这个长度在解密前的大小是0x6F008,十进制的454664,这个大小恰好是sqym.VQA的确切大小。
到这里,一切都明朗了,这就是一个PE文件了。现在我们第一件事就是需要将文件从内存中dump出来。#p#
0×05 拜见岳父大人——PE文件分析
好了,我们现在得到了该PE文件,我们把文件上传到virutotal上,发现54款杀软中有29款识别为病毒
该PE文件是一个名为“商业键盘记录无限记录器”的工具,工具的网站在这里:http://limitlessproducts.org/(工具现已停止更新),这里也附上工具的使用视频:
在视频中我们可以看到该工具的基本上所有的功能,这里还有几张IDA截图
我们从上图可以看到程序包含了很多windows控制台消息,可是我们看不到。不过我们可以想办法。我们修改一下PE的头文件的信息,将GUI文件改成一个控制台程序,这样我们就可以看到了,修改方式如图所示:
好了,下面我们就可以看到这个软件每一步都做过什么了。。。额滴神额。。。
#p#
0×06 跟岳父打起来了——木马行为分析
小样儿,你以为到这里我们就能结束了么?NO!革命尚未成功,同志仍需努力啊!
接下来对木马的流量进行嗅探,我们会发现木马会将用户的所有信息——包括用户的键盘记录信息,屏幕截图,浏览器中存储的密码。下面是嗅探到的SMTP通信数据和DNS请求:
最后,再上一张图
最后附上这些文件:链接: http://pan.baidu.com/s/1eQ1SO74 密码: ds3j RAR文件解压缩密码:freebuf.com
[文/FreeBuf小编xia0k,部分参考来源:133tsec.com&thehackernews.com ]