作者: 360漏洞研究院 王志遠
原文鏈接:https://vul.360.net/archives/503
背景
我們在第三屆“天府杯”國際網絡安全大賽中成功完成AdobeReader RCE項目,這篇文章將會詳細介紹其中使用到的2個邏輯漏洞:長達15年之久的DLL加載漏洞與隨機數轉換邏輯漏洞,漏洞編號為CVE-2021-21037。
DLL加載邏輯漏洞分析
我們在挖掘AdobeReader時發現一個DLL加載的邏輯漏洞,該漏洞位于XFA模塊中,在解析XFA語句的barcode類型type屬性時,沒有校驗是否支持該barcode屬性,直接嘗試加載輸入的值,導致任意DLL加載漏洞。該漏洞從2006年至2021年初修復,POC無需做任何修改,期間無差別運行長達15年之久。POC如圖1:
運行POC并使用Process Monitor監控會發現:AdobeReader會嘗試加載當前目錄下的aaaaapmp.dll。如果輸入值為\xxx.xxx.xxx.xxx\aaaaa時,則會加載遠程IP共享目錄下的DLL,如果輸入值為c:\windows\aaaaa時,則會加載系統目錄中的DLL。但是有一個限制是:AdobeReader在執行LoadLibrary之前,會執行類似strcpy(in_type, “pmp”)的語句,導致LoadLibrary目標文件的后綴只能是pmp.dll。
DLL釋放邏輯漏洞分析
有了任意DLL加載漏洞之后,我們還缺少一個DLL釋放的漏洞,AdobeAcrobat存在創建“PDF包”的功能,可以添加任意類型的附件到PDF中,并且可以在PDF中可以預覽該附件,在預覽時,該附件會被自動釋放到%temp%目錄下的隨機目錄中。我們使用這個方法將制作好的DLL添加到PDF中,使用JavaScript腳本釋放到用戶目錄下的%temp%目錄中,然后用barcode任意DLL加載漏洞執行%temp%目錄下釋放出來的DLL文件,由于目錄名稱是隨機的,我們還需要分析一下隨機目錄的生成方式。PDF釋放文件時,會在%temp%目錄中創建隨機目錄并寫入,隨機目錄生成代碼位于sub_60059740函數,代碼片段如圖4。
首先了解一下Windows短路徑名命名規則:主文件名的長度如果超過了8個,系統自動截取前6個字符,然后加上~1。從代碼中可以觀察到隨機目錄生成格式為A9R+隨機字符串+隨機字符串+PID,由于A9R的存在,可以使用Windows短路徑的方式遍歷出這個目錄,總共需要遍歷4萬多個路徑,經過測試,觸發時間大約10多分鐘,但達不到我們的想要的速度。
挖掘隨機數轉換邏輯漏洞
我從上述代碼中發現了一個有意思的地方,隨機數轉換為字符串時使用itow()函數,并且參數設置為36進制,在使用itow將數值轉換為36進制字符串時存在一個概率問題:轉換后的隨機路徑第一位數有51%概率為“1”,0%概率為“0”,其他值為1%概率。如下圖是我用C語言復現了AdobeReader使用itow()函數的轉換方式,統計并打印出第一位隨機數的概率。
將此邏輯漏洞在AdobeReader中實踐可以觀察到:釋放一次文件,有51%概率目錄開頭為A9R1,釋放多次之后,生成開頭為A9R1的目錄概率約為100%。此時我們已經確定了Windows短路徑的前4位內容,再遍歷剩下2位路徑,只需1000次遍歷就可以在10秒左右加載指定DLL。
漏洞利用
最后,將DLL釋放漏洞與DLL加載漏洞組合起來,完成一套完整的利用。
CVE公告
https://helpx.adobe.com/security/products/acrobat/apsb21-09.html
https://nvd.nist.gov/vuln/detail/CVE-2021-21037
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1944/
暫無評論