本月微軟的“星期二補丁”如約而至,其中就包括MS15-004補丁,修復了一個可能導致特權提升的漏洞(CVE-2015-0016),這是一個非常罕見的針對IE沙箱的漏洞,趨勢科技的研究員對這個漏洞進行了詳細的分析。
漏洞在TSWbPrxy.exe模塊中,TSWbPrxy.exe是一個ActiveX控件,是微軟遠程桌面服務網絡代理的程序。
首先,我用IDA插件patchdiff2查看補丁所作的修改,修改的是函數CTSWebProxy::StartRemoteDestop。
我用OleView加載了TSWbPrxy.exe,查看CTSWebProxy::StartRemoteDestop的定義。
StartRemoteDesktop的定義
我發現StartRemoteDesktop有兩個參數,都和mstsc.exe有關,這個mstsc.exe就是遠程桌面程序。
bstrMstsc: mstsc.exe的文件路徑
bstrArguments: mstsc.exe的參數
StartRemoteDesktop函數創建進程啟動mstsc.exe。我使用了IDA插件更加仔細地檢查打過補丁版本和未打補丁的區別:
打過補丁版本和未打補丁的區別
左圖是打過補丁的版本,右邊是沒有打過的。左圖顯示在調用CreateProcessW之前,首先會調用check_path函數(灰色部分),而未打補丁的版本沒有調用這個函數。
那我們來仔細看看這個函數:
check_path代碼
函數中有一個參數(lpApplicationName),函數執行過程如下:
首先檢查lpApplicationName的長度,如果大于0x104,返回錯誤0x80075007。
對lpApplicationName進行格式化,將字符‘/’轉換為‘\’,將結果保存至var_formatApplicationName。
調用CompareStringW對SystemDirectory + “mstsc.exe”與var_formatApplicationName進行比較,如果兩者相同,check_path返回”0″。
調用CompareStringW對SystemWow64Directory + “mstsc.exe”與var_formatApplicationName進行比較,如果兩者相同,check_path返回”0″,否則返回0x80075007錯誤。
我們看一看出微軟是如何修復漏洞的。程序會檢查lpApplicationName的值是否與遠程桌面程序在系統文件夾(對于32位版本的系統是C:\Windows\System32,對于64位是C:\Windows\SysWOW64)中的路徑相同。如果二者相同,就會創建進程,否則會返回錯誤。
漏洞的原理很簡單:StartRemoteDesktop函數的功能應該是啟動遠程桌面程序mstsc.exe,但執行這一程序時沒有檢查lpApplicationName參數,這就意味著攻擊者可以通過修改lpApplicationName參數啟動其他任意的進程。
下面是未打補丁版本的代碼
未打補丁版本的代碼
繞過IE的沙箱
為了繞過IE的沙箱,我們先得知道沙箱的提升策略是怎樣的。提升策略決定進程怎么啟動,以什么特權級別啟動,這些都儲存在注冊表項中:
HKLM\Software\Microsoft\Internet Explorer\Low Rights\ElevationPolicy\{GUID}
注冊表項中有如下幾個值:
AppName: 程序執行名稱
AppPath: 程序路徑
Policy: 程序的特權級別
不同的特權級別
對于特權級別為3的進程,IE沙箱會以中等完整性級別(當前用戶的權限)運行這個進程。
而TSWbPryx.exe的特權級別正是3。
TSWbPryx.exe的注冊表項
攻擊者可以利用另一個漏洞通過IE運行任意代碼,但前面說過,由于IE的沙箱機制,代碼可能被限制為在較低的完整性級別(權限非常有限)運行,攻擊者隨后可以利用此漏洞導致任意代碼在中等完整性級別(當前用戶的權限)運行。攻擊者可以用TSWbPrxy ActiveX控件調用StartRemoteDesktop,攻擊者就可以較高權限運行某些程序,如,它的父進程TSWbPrxy.exe。
我們可以將這個漏洞與CVE-2014-6332配合使用,這樣就可以繞過IE沙箱,以中等完整性級別運行程序。
另外,我們也可以使用CVE-2014-6332繞過ActiveX的安全機制。也就是說IE不會顯示像下圖這樣的窗口,而是直接運行這些控件。
最終結果就是攻擊者可以以中等完整性級別運行某些程序,如下圖所示
以中等完整性級別運行計算器
文章來源:Freebuf黑客與極客(FreeBuf.COM)