譯者:blueSky
預估稿費:200RMB
投稿方式:發送郵件至linwei#360.cn,或登陸網頁版在線投稿
前言
像Netflix這樣的服務商通常使用內容分發網絡(CDN)來最大限度地提高帶寬使用率,當用戶在Netflix上觀看影片時,由於CDN服務器靠近用戶所在地,因此用戶在觀看電視劇或者電影時,影片內容的加載時間將會很快,以使得全世界的用戶都能夠獲得良好的觀影效果。但是,CDN卻開始成為傳播惡意軟件的新方式。
圖1:2016年6月檢測到的NSIS/TrojanDropper.Agent.CL
使用CDN進行網絡攻擊的攻擊鏈非常廣泛,其中包括執行遠程腳本(在某些方面類似於最近的“無文件”銀行惡意軟件)、將CDN用於命令和控制(C&C)服務器以及使用其他“高級”技術來保護惡意軟件等。本文的目的是對downAndExec技術進行分析,該技術正廣泛使用JS腳本在受害者的機器上下載和執行惡意軟件。
階段1:初始感染
攻擊鏈從發送一些文件開始,這些文件被ESET檢測到並命名為NSIS/TrojanDropper.Agent.CL。在VirusTotal上通過文件名來查詢與文件名相關聯的樣本,我們看到該類型的惡意軟件是通過使用社會工程技術來誘騙受害者執行機器上的惡意軟件的,查詢的結果如下表所示:
自版本9.43(June/2014)發佈以來,NSIS惡意軟件最大的的特點之一就是可以提取嵌入在可執行文件中的腳本,該腳本具有惡意軟件初始階段的所有功能。該腳本在加載時,通過廣泛使用遞歸調用來加大安全工具監視其執行路徑的難度。在NSIS惡意軟件的各個版本中,原始腳本基本很少修改,在腳本實現上利用了ActiveX等資源(僅適用於Internet Explorer),我們可以使用Google Chrome瀏覽器的DevTools工具來調試該腳本。
圖2:使用DevTools工具對腳本進行調試
提取到的腳本在惡意軟件中扮演downloader的角色,目的是在受害者的計算機上下載並執行其他類型的惡意軟件,腳本在執行的過程中會從外部主機上下載一段JS代碼片段,該JS代碼片段是惡意軟件執行過程中所必需的。
在網絡攻擊鏈中,提供CDN服務的主機被用來託管上述JS代碼片段。由於對整個CDN域名進行阻斷不切實際,因此當處理這種威脅時我們將面臨以下挑戰:
1. 阻止新的C&C惡意軟件:這可能是為什麼我們一直看到新的URLS頻繁出現在同一個域名上的原因。
2. 搜索IoC:在受影響的環境中,存在大量非惡意軟件訪問記錄。
圖3:模擬託管惡意JS代碼段的CDN
為了模擬託管惡意JS代碼片段的CDN並方便調試過程,我們可以使用本地HTTP服務在本地機器上提供此內容分發服務。
圖4:加載外部託管的JS代碼片段
通過上圖我們可以看到腳本是如何向外部域(CDN)發出請求以獲取該代碼片段內容的,如果響應狀態為“OK”(即HTTP 200),則表示腳本成功從CDN上獲取到代碼片段的內容。
階段2:下載階段
在調用f()函數獲取到返回的JS代碼片段後,腳本調用eval()函數,將“downAndExec(\”<parameter_1> \“,”parameter_2“\”)”字符串添加到JS代碼片段的末尾,如下圖所示:
圖5:將C&C URL和x-id插入到JS代碼片段中
第一個參數(<parameter_1>)對應於C&C服務器的URL,第二個參數(<parameter_2>)包含了“x-id”數據,該數據用於下載惡意軟件的其他有效載荷。
圖6:downAndExec中涉及到文件的關係
JS代碼片段只有在執行時才會在代碼中出現幾個特徵字符串,這使得當對JS代碼片段執行靜態分析時很難理解腳本的含義(即使函數的名稱未被修改或模糊)。
圖7:JS片段中使用的混淆
JS腳本的主要功能部分是NSIS downloader添加的downAndExec()函數。這意味著如果單獨在沙盒環境中分析該JS代碼片段,代碼的惡意函數將不會被執行,那麼最後得出的分析結果可能就是該代碼片段不是惡意的。
圖8:JS代碼段中的downAndExec()的定義
除了對沙盒環境進行檢測之外,腳本還在執行惡意代碼之前執行多個檢查,以便對惡意代碼的執行環境執行全面的檢測。第一個檢測函數是isOS(),它只是簡單的返回true,但也可能是這個惡意軟件未來版本的存根。第二個檢查是hasAnyPrograms(),它檢查受害者的計算機上是否安裝了攻擊者感興趣的應用程序。
圖9:在系統上搜索銀行軟件的hasAnyPrograms()函數
getPathfromGuid()和getPathFromGuidWow()函數通過HKCR中的CLSID鍵來執行文件搜索,如果找不到這些文件,腳本就會搜索與Bradesco,Itaú,Sicoob和Santander等銀行相關的文件夾。
搜索這些文件旨在防止在可能不用於網上銀行目的的計算機上激活惡意功能,如果通過hasAnyPrograms()函數找到這些文件中的任何一個,則進行第三次檢查以驗證連接是否來自巴西。由於受害者的帳戶大多來自於巴西,為了避免非巴西國家進行分析(主要是自動),該代碼段還驗證了客戶IP是否來自巴西的AS,代碼實現如下圖所示:
圖10:驗證客戶IP地址是否在巴西
此檢查通過ip-api.com上的API接口函數進行,該API接口在客戶連接到Internet時返回Internet服務提供商提供的公網IP地址。如果countryCode被驗證為“BR”,則代碼片段成功通過第三個條件的檢測(即isBR()),然後執行惡意代碼片段。
階段3:與C&C進行通信並執行有效載荷。
如果受害者的計算機滿足所有的條件,那麼惡意軟件開始和C&C服務器建立通信連接。
圖11:JS代碼片段的主要執行部分
通過上圖我們可以看到,在第497行上調用的dlToText_s()函數接收兩個參數:C&C 服務器的URL(在downAndExec中被解析為<parameter_1>);另一個參數是一個字符串(在downAndExec被解析為<parameter_2>)。dlToText_s()函數的的第一個參數(即“<parameter_1>/?t”)表示應該從哪個C&C上去下載惡意軟件的有效載荷,而第二個參數“x-id ”字段(值為 <parameter_2 >)用於下載惡意軟件的其他有效載荷,具體實現如下圖所示:
圖12:用於下載C&C有效載荷的功能實現
在分析的過程中,我們發現t文件只包含“3”這個值。正如我們可以在downAndExec()中看到的那樣,惡意軟件可能使用不同的t值來表示不同的操作行為。
圖13:t文件的內容
下面我們總結了惡意軟件中t值(用K來表示t的取值)可能代表的不同操作行為:
1. K =“1”:代碼片段退出執行階段,不執行惡意操作。
2. K =“3”:代碼片段下載三個文件,其中一個只是一個字符串(以DLL命名),另外兩個都是PE文件。runAsUser()函數會在執行的過程中被調用。
3. K =“4”:與K=“3”類似,但只下載了兩個PE文件,並且調用runAsRundll()函數而不是runAsUser()。
當K=“4”的時候,PE文件無法下載,我們目前還不清楚在這種情況下會發生什麼,對於K=“3”,下載的文件如下所示:
總結
對有效載荷的分析工作仍在緊鑼密鼓的進行中,在分析中我們發現惡意軟件會使用DLL預加載技術(DLL預加載攻擊)來將惡意PE程序注入到內存中。正如我們上述已經分析的那樣,downAndExec技術涉及兩個下載階段以及幾個自我保護措施,其中包括識別符合所需配置文件的機器,將片段中無惡意操作的代碼分發到各個受害者機器上,儘管這些無惡意操作代碼本身不執行(只是為了繞過在線檢測),但是當與其他惡意代碼一起存在於受害者的機器上時,它們便能夠損害受害者的機器。
目前,還有一些與downAndExec有關的問題需要我們進一步研究的分析:
1. 為什麼要使用內容分發網絡託管JS代碼片段?
2. JS代碼片段中並沒有使用runAsAdmin()函數,該代碼片段是否被用作其他類型的巴西網絡犯罪或惡意軟件的共享模塊?
3. 當K=“4”時惡意軟件是如何執行的?
我們將會對上述問題進行持續的研究和分析,並將研究結果發佈到我們的博客上,請不要忘記閱讀我們的博客,以瞭解巴西網絡犯罪分子使用的其他網絡攻擊手法。
IoC