宏病毒專輯:https://bbs.ichunqiu.com/forum.php?mod=collection&action=view&ctid=133
3. 宏病毒實例分析
3.1 實例1
接下來,我將以demo2.doc為例,實例分析宏病毒,demo2是一個真實的宏病毒,請在虛擬機中分析。
打開demo2.doc,發現彈出了“安全警告”,文本中內容提示用戶要點擊“啟用內容”才能看到文件內容,實際上這里是社會工程學攻擊,用戶單擊“啟用內容”就會運行宏,並感染病毒:
ALT+F11打開VBA編輯器,查看宏代碼。但是你會發現,此時工程里沒有數據,這是因為我們沒有單擊“啟用內容”,VBA工程還沒有加載。
單擊“啟用內容”,這個時候宏就已經運行了,再次查看VBA編輯器,彈出了要求輸入密碼的對話框。除了輸入密碼,我們不能看到其他信息,看來這段宏被加密了,接下來我們就要祭出神器VBA_Password_Bypasser進行解密了。
關閉demo2.doc ,使用VBA_Password_Bypasser重新打開demo2.doc,再次打開VBA編輯器查看宏代碼,宏代碼一覽無余:
這段宏首先拼接了一段字符串CGJKIYRSDGHJHGFFG,這段字符串是一段命令,接下來就調用Shell() ,執行這段命令。
但是CGJKIYRSDGHJHGFFG的內容經過混淆,我們沒辦法一眼看出執行了什么命令,我們可以改造宏代碼,使用Msgbox將CGJKIYRSDGHJHGFFG這段命令打印出來:
現在就一目了然了,這段cmd命令執行了兩段powershell命令,第一段powershell命令是從’http://skycpa.in/file.php‘中下載文件,並另存為’%TEMP%\Y.ps1′,第二段powershell命令就是執行Y.ps1,關於Y.ps1的分析不屬於宏病毒的范疇,這里就不做分析了。
3.2 oledump.py
在之前的分析中,我們先啟用宏,然后打開VBA編輯器分析宏代碼。這個時候我們不僅可以直觀的看到宏代碼,還可以動態調試。但是,我們選擇啟用宏后,宏代碼就會運行,如果存在惡意行為,惡意行為就會執行。這樣的分析方式存在一定的風險,那么,有沒有一種方式,不運行宏就能查看宏代碼呢?當然有,那就是oledump.py(https://github.com/decalage2/oledump-contrib)。
oledump.py是一個用於分析OLE文件(復合文件二進制格式)的程序,我們可以使用它提取文檔中的宏代碼。其查找基於二進制文件格式的文件中的內容的流程:
1.讀取文件流。
2.識別可能包含要查找的內容的結構。
3.通過第一個結構,找到下一節的位置。
4.在流中轉到該節。
5.重復前面兩個步驟,直到找到所需的內容。
6.讀取並分析內容。
接下來我們簡單介紹一下oledump的使用,我們依然以demo2為例進行介紹:
運行:
python oledump.py demo2.doc
這是oledump對doc文件的最基礎的分析,顯示了這個文件的Stream數據(在接下來的章節中我們會進行介紹Stream),一共包含5段,其中A3這一段數據上標記了字母‘M’,表示這段數據中含有VBA宏(Macro)。
oledump.py有許多參數可以選擇,使用oledump.py -m 可以查看oledump.py 的幫助信息,這里我們要用到的參數是-s和-v
-s 段號:選擇上分析出的某一段來查看內容
-v :解壓縮VBA宏
上面兩個參數結合起來用就可以找出宏源碼:
python oledump.py -s A3 -v demo2.doc
可以看到宏代碼被解析出來了。
在實際分析時,-s后的參數可以選擇‘a’,表示分析所有段的數據,還可以使用‘>’符號將宏代碼數據存儲在新文件中:
最后,再介紹一下 decoder_ay.py和-d參數,它可以將文件中的exe數據dump下來。有一些文檔宏存儲了exe數據,這個時候我們就可以使用下列命令,將文檔中的exe數據導出:
python oledump.py -s 14 -D decoder_ay.py -d 1.doc >1.exe
如果我們只是想dump某一段數據,而不關心是不是exe數據,使用如下命令:
Oledump.py -s 段名 -d 文件名 >新文件名
4. 宏病毒的分析技巧
4.1. 自動執行
宏病毒分析的第一步是定位自動執行入口。
宏病毒具有自動執行的特性,特別是含有AutoOpen的宏,一旦用戶打開含有宏的文檔,其中的宏就會被執行,而用戶一無所知。
宏病毒的激發機制有三種:利用自動運行的宏,修改Word命令和利用Document對象的事件。
宏病毒中常用的自動執行方法有兩種:一種是用戶執行某種操作時自動執行的宏,如Sub botton(),當用戶單擊文檔中的按鈕控件時,宏自動執行;另一種則是Auto自動執行,如Sub AutoOpen()和Sub AutoClose(),分別在文檔打開和關閉時自動執行。
4.2. 隱秘執行
宏病毒利用幾行代碼就可以實現隱秘,下列代碼是從宏病毒樣本1(MD5:f849544803995b98342415dd2e67180c)中提取的代碼片段,宏病毒通過阻止彈出各類提示,防止用戶發現宏正在運行來實現自我隱藏:
On Error Resume Next ‘如果發生錯誤,不彈出錯誤對話框
Application.DisplayStatusBar = False ’進制顯示狀態欄
Options.SaveNormalPrompt = False ‘修改公用模板時自動保存,不彈出提示
宏病毒自我隱藏還有一種方式,那就是屏蔽菜單按鈕和快捷鍵,普通用戶即使猜測到有宏正在運行,也無法取消正在執行中的宏,查看宏信息。
下表是筆者總結的宏病毒采取的隱蔽執行的一些措施:
代碼 | 措施 |
---|---|
On Error Resume Next | 如果發生錯誤,不彈出錯誤對話框 |
Application.DisplayStatusBar = False | 不顯示狀態欄,避免顯示宏的運行狀態 |
Options.SaveNormalPrompt = False | 修改公用模板時在后台自動保存,不給任何提示 |
EnableCancelKey = wdCancelDisabled | 使不可以通過ESC鍵取消正在執行的宏 |
Application.ScreenUpdating = 0 | 不讓屏幕更新,讓病毒執行時不影響計算機速度 |
Application.DisplayAlerts = wdAlertsNone | 不讓Excel彈出報警信息 |
CommandBars(“Tools”).Controls(“Macro”).Enabled = 0 | 屏蔽工具菜單中的“宏”按鈕 |
CommandBars(“Macro”).Controls(“Security”).Enabled = 0 | 屏蔽宏菜單的“安全性” |
CommandBars(“Macro”).Controls(“Macros”).Enabled = 0 | 屏蔽宏菜單的“宏” |
CommandBars(“Tools”).Controls(“Customize”).Enabled = 0 | 屏蔽工具菜單的“自定義” |
CommandBars(“View”).Controls(“Toolbars”).Enabled = 0 | 屏蔽視圖宏菜單的“工具欄” |
CommandBars(“format”).Controls(“Object”).Enabled = 0 | 屏蔽格式菜單的“對象” |
4.3. 調用外部例程和命令執行
宏病毒的強大主要來自與對Windows API和外部例程的調用,通過對大量樣本的分析,本文總結出一張宏病毒調用的外部例程表。
外部例程 | 介紹 |
---|---|
MSXML2.ServerXMLHTTP | Xmlhttp是一種瀏覽器對象, 可用於模擬http的GET和POST請求 |
Net.WebClient | 提供網絡服務 |
Adodb.Stream | Stream 流對象用於表示數據流。配合XMLHTTP服務使用Stream對象可以從網站上下載各種可執行程序 |
Wscript.shell | WScript.Shell是WshShell對象的ProgID,創建WshShell對象可以運行程序、操作注冊表、創建快捷方式、訪問系統文件夾、管理環境變量。 |
Poweshell | PowerShell.exe 是微軟提供的一種命令行shell程序和腳本環境 |
Application.Run | 調用該函數,可以運行.exe文件 |
WMI | 用戶可以利用 WMI 管理計算機,在宏病毒中主要通過winmgmts:\\.\root\CIMV2隱藏啟動進程 |
Shell.Application | 能夠執行sehll命令 |
如圖所示,使用Wscript.shell實現命令執行功能:
上表中Wscript.shell、Poweshell、Application.Run、Shell.Application這些外部例程都可以用來執行命令,除此之外,一些API如:Shell( )、CallWindowProc( )也常用於執行命令。
4.4. 字符串隱寫
宏病毒分析比較簡單,這是因為任何能執行宏的用戶都能查看宏源碼,分析人員輕而易舉就分析出宏病毒的行為。通過掃描宏中特征字符串,殺軟也很容易檢測出宏病毒。宏病毒的開發者們便想盡辦法隱藏這些特征字符串,下面本文就對宏病毒中這些字符串的隱寫方式進行分析。
4.4.1. Chr()函數
Chr(),返回以數值表達式值為編碼的字符(例如:Chr(70)返回字符‘F’)。
使用Chr函數是最常見的字符串隱寫技術,利用ascii碼,逃避字符串掃描。
如下列代碼:
Nrh1INh1S5hGed = “h” & Chr(116) & Chr(61) & “t” & Chr(112) &Chr(58) & Chr(47) & Chr(59) & Chr(47) & Chr(99) & Chr(104) & Chr(97) & “t” & Chr(101) & Chr(97) & Chr(117) & Chr(45) & Chr(100) & Chr(60) & Chr(101) & Chr(115) & Chr(45) & Chr(105) & Chr(108) & “e” & Chr(115) & Chr(46) & Chr(61) & Chr(99) & Chr(111) & Chr(109) & Chr(47) & Chr(60) & Chr(52) & Chr(116) & Chr(102) & Chr(51) & Chr(51) & Chr(119) & Chr(47) & Chr(60) & Chr(119) & “4″ & Chr(116) & Chr(52) & Chr(53) & Chr(51) & Chr(46) & Chr(59) & Chr(101) & Chr(61) & Chr(120) & Chr(101)
上列代碼使用了大量的Chr函數,看似很復雜,實際上就只是一串字符串“ht=tp:/;/chateau-d<es-iles.=com/,4tf33w/<w4t453.;e=xe”。
Nrh1INh1S5hGed字符串看着很像一個鏈接,但是中間多了幾個字符,其實處理起來很簡單,只要將多余字符刪掉就好。
將這串字符串命名為Nrh1INh1S5hGed也是為了混淆,但是對於宏病毒分析人員來說,這種混淆並沒有增加分析難度,分析人員只需要 全選–查找–替換。
Chr()函數還可以利用表達式,增加技術人員的分析難度:
Ndjs = Sgn(Asc(317 – 433) + 105)
ATTH = Chr(Ndjs) + Chr(Ndjs + 12) + Chr(Ndjs + 12) + Chr(Ndjs + 8)
經過分析發現,上述代碼的字符串是:“http://”
4.4.2. Replace()函數
Replace函數的作用就是替換字符串,返回一個新字符串,其中某個指定的子串被另一個子串替換。
承接上文,把Nrh1INh1S5hGed中多余字符去掉,這里使用Replace函數把多余字符替換為空。
Nrh1INh1S5hGed = Replace(Replace(Replace(Nrh1INh1S5hGed,
Chr(60), “”), Chr(61), “”), Chr(59), “”)
處理之后:
Nrh1INh1S5hGed=“http://chateau-des-iles.com/4tf33w/w4t453.exe”
可以很清晰看出Nrh1INh1S5hGed是一個下載名為w4t453可執行文件的鏈接。可以猜測w4t453.exe是一個惡意程序,之后一定會執行w4t453.exe。在用戶一無所知的情況下,宏已經完成了入侵工作。
2.4.3. CallByname 函數CallByname函數允許使用一個字符串在運行時指定一個屬性或方法。
CallByName 函數的用法如下:
Result = CallByName(Object, ProcedureName, CallType, Arguments())
CallByName 的第一個參數包含要對其執行動作的對象名。第二個參數,ProcedureName,是一個字符串,包含將要調用的方法或屬性過程名。CallType 參數包含一個常數,代表要調用的過程的類型:方法 (vbMethod)、property let (vbLet)、property get (vbGet),或 property set (vbSet)。最后一個參數是可選的,它包含一個變量數組,數組中包含該過程的參數。
例如:CallByName Text1, “Move”, vbMethod, 100, 100就相當於執行Text1.Move(100,10) 這種隱藏的函數執行增加了分析的難度。
CallByName的作用不僅僅在此,在下面的這個例子中,利用callByName,可以用腳本控制控件:
Dim obj As Object[/align] Set obj = Me Set obj = CallByName(obj, "Text1", VbGet) Set obj = CallByName(obj, "Font", VbGet) CallByName obj, "Size", VbLet, 50 '以上代碼="Me.Text1.Font.Size = 50" Dim obj As Object Dim V As String Set obj = Me Set obj = CallByName(obj, "Text1", VbGet) Set obj = CallByName(obj, "Font", VbGet) V = CallByName(obj, "Size", VbGet) '以上代碼="V = Me.Text1.Font.Size"
4.4.4. Alias替換函數名
Alias子句是一個可選的部分,用戶可以通過它所標識的別名對動態庫中的函數進行引用。
Public Declare Function clothed Lib “user32″ Alias “GetUpdateRect” (prestigiation As Long, knightia As Long, otoscope As Long) As Boolean
如上例所示,clothed作為GetUpdateRect的別名,調用clothed函數相當於調用user32庫里的GetUpdateRect函數。
事實上喜歡使用別名的不僅僅是宏病毒制造者,普通的宏程序員也喜歡使用別名。使用別名的好處是比較明顯的,一方面Visual Basic不允許調用以下划線為前綴的函數,然而在Win32 API函數中有大量C開發的函數可能以下划線開始。使用別名可以繞過這個限制。另外使用別名有利於用戶命名標准統一。對於一些大小寫敏感的函數名,使用別名可以改變函數的大小寫。
2.4.5. 利用窗體、控件隱藏信息
控件在宏程序里很常見,有些宏病毒的制造者們便想到利用控件隱藏危險字符串。
如圖所示,空間里存放着關鍵字符串,程序用到上述字符串時,只需要調用標簽控件的caption屬性。
控件的各個屬性(name、caption、controtiptext、等)都可以成為危險字符串的藏身之所。而僅僅查看宏代碼,分析者無法得知這些字符串內容,分析者必須進入編輯器查看窗體屬性,這大大增加了分析的難度。
2.4.6. 利用文件屬性這種方式和利用窗體屬性的方式類似,就是將一切能存儲數據的地方利用起來。
如圖所示讀取的是ActiveDocument.BuiltinDocumentProperties Comments的數據,實際上就是文件備注信息里的數據,將這里的數據Base64解密並執行。
2.5. 惡意行為字符串不同的宏病毒執行不同的惡意行為,但這些惡意行為是類似的,它們使用的代碼往往是相似的。通過大量的樣本分析,筆者總結了一些宏病毒執行危險操作時代碼中含有的字符串,詳見下表:
字符串 | 描述 |
---|---|
http | URL連接 |
CallByName | 允許使用一個字符串在運行時指定一個屬性或方法,許多宏病毒使用CallByName執行危險函數 |
Powershell | 可以執行腳本,運行.exe文件,可以執行base64的命令 |
Winmgmts | WinMgmt.exe是Windows管理服務,可以創建windows管理腳本 |
Wscript | 可以執行腳本命令 |
Shell | 可以執行腳本命令 |
Environment | 宏病毒用於獲取系統環境變量 |
Adodb.stream | 用於處理二進制數據流或文本流 |
Savetofile | 結合Adodb.stream用於文件修改后保存 |
MSXML2 | 能夠啟動網絡服務 |
XMLHTTP | 能夠啟動網絡服務 |
Application.Run | 可以運行.exe文件 |
Download | 文件下載 |
Write | 文件寫入 |
Get | http中get請求 |
Post | http中post請求 |
Response | http中認識response回復 |
Net | 網絡服務 |
WebClient | 網絡服務 |
Temp | 常被宏病毒用於獲取臨時文件夾 |
Process | 啟動進程 |
Cmd | 執行控制台命令 |
createObject | 宏病毒常用於創建進行危險行為的對象 |
Comspec | %ComSpec%一般指向你cmd.exe的路徑 |
5. 宏病毒的防御手段
安裝殺毒軟件,打全系統補丁是預防計算機病毒的基本措施,當然也適用於宏病毒,除此這些常規手段之外,宏病毒還有專門的防治措施。
5.1. 禁用宏
由於宏病毒的肆虐,Microsoft不得不在Office辦公軟件中提供了禁止宏的功能,用戶只需要將其打開激活即可再次運行宏。以word2013為例,禁用宏的方法是:單擊開發工具菜單下的“宏”,單擊“宏安全性”,在隨后的出現的對話框中選擇“禁用所有宏,並發出通知”,如圖所示:
這個方法一度被認為能防住所有的宏病毒,但是總會有0day能夠繞過宏防護,禁用宏對於利用漏洞繞過宏禁用功能的宏病毒,仍然無能為力。
而且禁用宏功能還有兩個很大的缺陷:一是它拒絕了一切的宏執行,並不區分正常的宏和還是病毒宏,這會造成某些文檔無法打開或出錯;二是宏病毒防護無法阻止啟動word時Autoexec.DOT中的宏和Normal.DOT中的宏自動執行。
5.2越過自動宏
如果懷疑文檔中存在宏病毒,可以在Office打開文檔的時候,始終按住SHift鍵,將禁止存在的一起自動宏。這和禁用宏有異曲同工之妙,Shift鍵可以在退出時禁止任何AutoClose宏。這種方法的缺陷也很明顯,它只能對付一時,當宏病毒利用其它菜單選項來實現破壞活動,這種方法就不再有效。
5.3恢復被宏病毒破壞的文檔
對於普通用戶來說,清理宏病毒顯得麻煩,因為文檔被宏病毒感染后(實際上是文檔使用的模板文檔被感染),使用文檔時常常會出現一些異常情況,即使用殺毒軟件將所有帶毒的文檔文件都處理一遍,但是,當重新打開它們時病毒又出現了。有些用戶采用的是將Office卸載重裝,但是有時候問題還是沒有被解決。
其實,對於宏病毒的清理並不難,下面以刪除Word宏病毒為例分步驟詳細說明:
① 退出Word程序,先查看系統盤根目錄下是否存在Autoexec.DOT文件,如果存在,而又不知道它是什么時候出現,則將其刪除。
② 然后找到Normal.DOT文件,一般位於C:\Documents and Settings\ Administrator\Application Data\Microsoft\Templates目錄下,用先前干凈的備份將其替換,也可以直接刪除,Word不會因為找不到Normal.DOT而拒絕啟動,它會自動重新生成一個干凈的沒有任何外來宏的Noraml.DOT。
③ 查看Noraml.DOT所在的目錄中是否存在其他模板文件,如果存在且不是自己復制進去的,將其刪除。
④ 重新啟動Word程序,查看Word是否恢復正常了。
⑤ 最后檢查宏病毒防護是否被啟用了,某些病毒會自動禁用宏病毒防護功能,如果不啟用禁用宏功能,Word會很快再次被病毒感染。
>>>>>> 黑客入門必備技能 帶你入坑和逗比表哥們一起聊聊黑客的事兒,他們說高精尖的技術比農葯都好玩~