AutoIt木馬:鍵盤記錄木馬分析
近日,一種新型木馬被發(fā)現(xiàn),該惡意軟件到目前為止已經(jīng)感染了數(shù)十萬計(jì)算機(jī),而且感染是世界范圍的。據(jù)稱,其主要竊取被感染者的社交網(wǎng)絡(luò)賬戶信息和銀行賬戶的登錄憑證。本文是關(guān)于這個木馬進(jìn)行的一次分析。
幾天以前,一份Goolge的500萬賬戶密碼列表泄露了。Google工程師出面澄清說:該列表并非是在Google的系統(tǒng)或者某一分支下泄露的,主要泄露途徑來自于釣魚活動和一些并沒有獲取到授權(quán)的方式(注:也有人猜測是大批量的撞庫活動),而Google本身是足夠安全的。
而這幾天,我們又發(fā)現(xiàn)了一起類似于Google事件的網(wǎng)絡(luò)犯罪活動,而這款惡意軟件已經(jīng)感染了數(shù)十萬的計(jì)算機(jī),并且已經(jīng)竊取了他們的社交媒體社交網(wǎng)絡(luò)賬戶以及銀行賬戶訪問憑證。
關(guān)于木馬樣本,大體看了一下,居然也是一個AutoIt解釋器木馬,當(dāng)時我就驚呆了呀,最近還真是AutoIt木馬爆發(fā)季啊,都可以拍一部《變形記》了。
只是這個木馬是通過Email釣魚傳播,而這個百足之蟲則是通過游戲平臺來傳播的。鑒于兩個木馬同根同源,那我們就略略分析一下,看一下這個木馬是怎么做的。
(木馬樣本我會在文末給出,有興趣的同學(xué)可以下載看一下)
0×01初見美鋁——木馬樣本
大體分析了一下,發(fā)現(xiàn)木馬文件是一個winrarSFX文件(winrar自解壓格式),這里不仔細(xì)看還真看不出來,因?yàn)檫@里木馬的圖標(biāo)換成了別的樣子
然后,我們使用winrar打開:
#p#
0×02 尾隨跟蹤——文件大略分析
里面一共包含四個文件,釋放之后是保存在%USERPROFILE%\zvf382a42256\的,而且具有系統(tǒng)和隱藏的屬性,解壓之后如果看不到文件記得打開查看隱藏文件。
其中唯一一個可執(zhí)行文件是update.exe,這里,解壓之后,很明顯是一個AutoIt的腳本解釋器,看圖標(biāo)就可以看出來了。不多說。
這樣看來剩下三個文件一定有個au3或者a3x文件,我們接下來找找:
接下來引起我們注意的是最上面這個PBS文件,大小有331MB(看過上一篇文章的應(yīng)該對這個不會陌生),其實(shí)這個文件是一個經(jīng)過混淆的文件,這里我們貼出反混淆的python代碼,以供各位研究(代碼出自一位希臘研究員,讓我們向他致敬!)(小編:我貼出代碼就是為了賺稿費(fèi)的!可是發(fā)錢的人在哪里→_→)
- 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
經(jīng)過處理之后,世界瞬間變清涼了!331MB的文件只有55KB,因?yàn)橛悬c(diǎn)多,這里就不貼源代碼了,大家可以也在文末下載。
再說一下其他兩個文件:
oziryzkvvcpm.AWX—文件比較小,應(yīng)該是一個INI配置文件,代碼如下:
[8472254]
7345448=2738636
[5152433]
7790268=6953219
[5242747]
1024020=8930731
[9537477]
9537477=yzvf382a42256
sgym.VQA—一個二進(jìn)制文件?;蛟S大概是個攻擊載荷文件吧,后文我們會說到。
以上略過不講。#p#
0×03 踏入大門——腳本分析
這里著重分析一下這個經(jīng)過混淆的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處:木馬的持續(xù)攻擊處理。增加了很經(jīng)典的啟動項(xiàng):注冊表HKCU64\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\RunOnce添加啟動項(xiàng),同時在開始菜單–>程序–>啟動處添加啟動項(xiàng)。真是夠經(jīng)典的。
—位置antis1處:這里在awx配置文件中沒有看到蹤跡,這意味著antis功能并不能被執(zhí)行。這應(yīng)該是作者有意為之,應(yīng)該是一個對抗殺毒軟件的功能。
—位置8472254處:這里使用了藍(lán)屏手段來對抗殺毒軟件,一旦發(fā)現(xiàn)木馬進(jìn)程被殺掉,我們的主機(jī)就會立刻藍(lán)屏,很多木馬也會使用這種手段來進(jìn)行自我保護(hù)。
—位置5152433處:木馬自查vbs是否存在,以保證自身的可持續(xù)性攻擊。
—位置9537477處:這里就是我們剛剛說的最后一個sgym.VQA文件。此處的代碼包含一個解密的密鑰——即為配置文件9537477的值yzvf382a42256,木馬采用RC2算法進(jìn)行解密,解密之后是一個PE的可執(zhí)行文件,解密之后執(zhí)行。這應(yīng)該就是木馬的核心了,接下來我們看一下這個木馬究竟做了什么。#p#
0×04 登堂入室——木馬文件分析
下面,首先,讓我們來看一下這個解密的文件是不是一個PE文件。用OllyDbg為update.exe在CryptDecrypt 函數(shù)處下斷點(diǎn)。然后我們進(jìn)行一下對比:
接著我們繼續(xù)跟蹤,發(fā)現(xiàn)CryptDecrypt函數(shù)的第五個參數(shù)是一個包含加密的數(shù)據(jù)緩沖區(qū),很明顯這里就是我們上文提到的密鑰yzvf382a42256了,另外,函數(shù)的第六個參數(shù)包含的是一個數(shù)據(jù)長度,而我們發(fā)現(xiàn)這個長度在解密前的大小是0x6F008,十進(jìn)制的454664,這個大小恰好是sqym.VQA的確切大小。
到這里,一切都明朗了,這就是一個PE文件了?,F(xiàn)在我們第一件事就是需要將文件從內(nèi)存中dump出來。#p#
0×05 拜見岳父大人——PE文件分析
好了,我們現(xiàn)在得到了該P(yáng)E文件,我們把文件上傳到virutotal上,發(fā)現(xiàn)54款殺軟中有29款識別為病毒
該P(yáng)E文件是一個名為“商業(yè)鍵盤記錄無限記錄器”的工具,工具的網(wǎng)站在這里:http://limitlessproducts.org/(工具現(xiàn)已停止更新),這里也附上工具的使用視頻:
在視頻中我們可以看到該工具的基本上所有的功能,這里還有幾張IDA截圖
我們從上圖可以看到程序包含了很多windows控制臺消息,可是我們看不到。不過我們可以想辦法。我們修改一下PE的頭文件的信息,將GUI文件改成一個控制臺程序,這樣我們就可以看到了,修改方式如圖所示:
好了,下面我們就可以看到這個軟件每一步都做過什么了。。。額滴神額。。。
#p#
0×06 跟岳父打起來了——木馬行為分析
小樣兒,你以為到這里我們就能結(jié)束了么?NO!革命尚未成功,同志仍需努力啊!
接下來對木馬的流量進(jìn)行嗅探,我們會發(fā)現(xiàn)木馬會將用戶的所有信息——包括用戶的鍵盤記錄信息,屏幕截圖,瀏覽器中存儲的密碼。下面是嗅探到的SMTP通信數(shù)據(jù)和DNS請求:
最后,再上一張圖
最后附上這些文件:鏈接: http://pan.baidu.com/s/1eQ1SO74 密碼: ds3j RAR文件解壓縮密碼:freebuf.com
[文/FreeBuf小編xia0k,部分參考來源:133tsec.com&thehackernews.com ]




























 
 
 


 
 
 
 