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