Archive for 十一月, 2014

绕过百度杀毒溢出保护的一些方法

作者:椒图实验室

转载请注明出处:http://blog.jowto.com

背景

前段时间参加了http://xp.erangelab.com/举办的XP挑战赛,把绕过一些安全防护软件的过程和大家分享一下。

其中百度杀毒的测试版本为1.8.14.1

使用的IE漏洞

由于比赛系统为XP SP3 +IE8未打任何其他补丁,所以从IE漏洞选取了CVE 2012-1889、CVE 2012-4969、CVE 2013-1347,原因就是这三个能在网上找到现成的exp,后来证明多找几个漏洞还是很必要的,因为适应各种突发变化。

百度防护手段

防堆喷射

这几个漏洞本身没什么可说的,拿到1889就开始在百度卫士上开测,直接IE加载exp,没有成功IE崩溃,这是必然的嘛,要不然还叫什么保护。因为yuange、tk等高人说的DVE技术我还没有学会,所以还是用被大牛们淘汰的堆喷射,用vmmap打开IE进程,发现堆喷的地址都被占位了:

spray1

这就是传说中的占坑,0C0C0C0C这种地址都被占了,这样我们堆喷的时候当然就占不到这个位置了。但是,事实证明这种方法对于防护堆喷射一点作用都没有,我不知道做这个功能的人自己试验了没有,在提前占坑的进程中堆喷射,喷射完成后内存布局是这样的:

spray2

可以看到除了开始的4K以外,后面该喷射占用的内存还是一样占用了,0C0D0000里面照样是我们的的shellcode,我们利用的时候直接用0C0E0C0C这个地址就好了,保证是成功喷射的,所以占坑这招只要改个地址就可以破解了。百度和金山都用了这种占坑的方法,而事实证明这种做法根本没有任何意义,而金山的实现更差,用explib直接喷射仍然占了0C0C0C0C。现在精确堆喷射的技术已经很成熟了,这方面不再多做介绍。

ROP

因为XP SP3上是没有ASLR的,因此我们只要ROP绕过DEP就可以了,喷射成功之后,就成功来到了shellcode中,但还是被百度报了ROP攻击,当然大牛们可以用DVE技术,但是咱还没学会不是,还是老老实实看看ROP怎么绕过保护。网上找的原始exp里的ROP是用VirtualProtect,跟踪发现调用这个API的时候被百度拦截了,于是要找其他的ROP,打开immunity debugger,用mona插件(https://www.corelan.be/index.php/2011/07/14/mona-py-the-manual/)找了几种不同的ROP,经过修改调试之后,在百度环境下测试发现VirtualAlloc没有被百度拦截,终于成功进入了真正的shellcode,不过最后一天百度升级补了此方法,最后没有用这种方法,后面绕过的方法随后再介绍。下面是VirtualAlloc的ROP:

var rop_chain = unescape(
"‰uBE4C‰u77BE" + // 0x77BEBE4C # retn [msvcrt.dll]
"‰uBE4B‰u77BE" + // 
阅读全文
Posted on 十一月 7, 2014 at 上午11:13 by admin · Permalink · Comments Closed
In: 漏洞分析

安全输入控件分析

作者:椒图实验室

转载请注明出处:http://blog.jowto.com

 

随着B/S技术的发展当浏览器(如IE)中需要输入用户名和密码,而这个密码又和经济挂钩的时就产生了安全输入控件,安全输入控件通过软件技术实现了对用户密码的保护,使得攻击者无法通过键盘记录、输入框内容查看等技术得到用户输入的密码,保证用户的密码不被攻击者非法获得,目前安全输入控件技术被网上银行等广泛使用。

那么安全控件是否真的可以完全阻止黑客的攻击呢?应该是不行的。

在IE下,安全输入控件是一个ActiveX控件,而ActiveX使用了COM接口技术, COM接口是Windows的一项重要技术,Microsoft的许多技术都用到了COM接口,如ActiveX、DirectX等。

现在想通过传统的办法获取安全输入控件的内容是不行的,那么是不是可以通过COM接口做一些工作呢?当用户在安全输入控件中输入内容时是明文,控件内部会对用户输入的明文进行加密然后发送到服务器,如果能知道控件在那个函数处理的这部分工作应该可以获取明文内容的,下面就尝试通过COM接口的Hook技术找到这个函数。

与传统的API HOOK不同,所有的COM接口都是由一个虚函数表组成(vTable),虚函数表的内容为成员或函数地址,是纯地址列表。当调用IDispatchEx类的成员函数时也包括其派生类函数,程序会通过该函数地址列表找到函数的真正地址并进行调用。那么我们可以通过修改该地址列表,来达到拦截指定函数的目标。而Windows系统通过函数DispCallFunc来实现所有COM接口成员函数的分发,我们可以通过Windbg来挂钩OLEAUT32! DispCallFunc函数来观察COM接口的分发调用过程。

那么如何获得一个具体COM接口的虚函数表呢?我们可以通过CoCreateInstance函数获取虚函数表,但在IE中,其调用ActiveX控件时通过CoGetClassObject函数来获得虚函数表,所以,我们只要在不同的情况下Hook这2个函数,就可以获得指定COM接口的虚函数表。了解了COM接口的原理后,现在开始找一个目标,在很随机的情况下,我选择了一个银行的安全输入控件做测试。

首先,对IE里面加载的模块进行观察,找到安全输入控件的文件,如下图:

comi1

从这个图里面就可以发现xxxEdit.dll不是IE默认的DLL,应该就是银行的安全输入控件,首先获取此DLL的CLSID。然后注入代码到IE进程,对CoGetClassObject函数进行Hook,通过比较CLSID,确认获取安全控件的虚函数表地址(vTable)。

获取到接口的vTable后,现在就可以Hook接口的具体函数了,接着Hook成员函数CoGetClassObject:: CreateInstance,获得安全输入控件的方法vTable地址为0x10045220。

对比xxxEdit.dll的反汇编代码,可以看到这个COM接口提供的所有方法和属性,如下图:

comi2

查看银行的网页源代码可以发现JavaScript从安全控件获得卡号和密码的方法是:

loginInfo.AccountNo = document.getElementById(“DebitCardNo_Ctrl”).IValue;

loginInfo.Password = document.getElementById(“DebitCardQueryPwd_Ctrl”).IValue;

于是,开始分析10011521这个函数,发现执行到1001160F前ECX的值正好是卡号和密码的明文,这样攻击者可以要获得安全输入控件的内容只需要远程注入代码到IE中并inline Hook这个地址,获取ECX的值,就可以获得明文的卡号和密码。

可见,安全输入控件并不是绝对的安全,所以,为了尽可能的避免这样的情况发生,我们应该养成良好的上网习惯,包括:

 阅读全文

Posted on 十一月 6, 2014 at 下午1:02 by admin · Permalink · Comments Closed
In: 未分类

ASP下一句话木马的动态拦截技术

作者:椒图实验室

转载请注明出处:http://blog.jowto.com

        一句话木马如<%eval request(“MH”)%>,攻击者通过组织好的参数访问木马,就可以让参数中的恶意脚本在服务器端执行。为了防止执行恶意脚本,可以在IIS脚本引擎中拦截EVAL函数来过滤非法请求。

以下分析都在windows server 2003 x86下调试:
w3wp.exe是在IIS(Internet Information Server)与应用程序池相关联的一个进程,如果你有多个应用程序池,就会有对应的多个w3wp.exe的进程实例运行。当需要解析ASP脚本时会加载vbscript.dll,通过IDA搜索vbscript.dll中和“eval”有关的函数,找到

VbsEval(VAR *,int,VAR *) .text 7337da95

在windbg中调试发现脚本执行Eval函数时都会调用到VbsEval,见下图:
URL:

localhost/test.asp?MH=1*2

test.asp:

<%eval request("MH")%>

windbg:

image001

在内存中可以看到eval函数执行的脚本。现在只需要将此脚本与URL中请求参数内容对比,如果内存中执行的EVAL脚本在URL中存在则可以认为是URL请求试图调用一句话木马并执行。如上图截取的底层执行代码为1*2,判断1*2是否在localhost/test.asp?MH=1*2中存在,如果存在则直接返回恶意代码提示,最终效果如下图:

image003

HOOK住vbscript!VbsEval很容易截取到要执行的脚本,现在的问题是任何脚本执行eval都要调用vbseval函数,那么怎么才能找到当前执行脚本是由哪个URL触发的呢?如果无法取到URL则不能与EVAL中执行脚本对比,过滤是无从谈起的。

现在从vbseval函数往上看整个脚本解释执行的流程!

image005下asp!CViperAsyncRequest::OnCall断点,堆栈回溯如下:

image007

可以看出脚本执行eval函数是通过启动线程调用回调函数来触发的。但是下新建线程的API都断不下来,需要换个思路。通过上图可以看到线程启动后最先执行函数是asp.dll里的asp!CViperAsyncRequest::OnCall,查看asp.dll的导出函数如下图:image009

通过这3个导出函数可以判断asp.dll是ISAPI中的ISA。ISA简介如下:

ISA(Internet Server Application)也可称为ISAPI DLL,其功能和CGI程序的功能直接相对应
,使用方法和CGI也类似,由客户端在URL中指定其名称而激活。

ISA和服务器之间的接口主要有两个:GetExtentionVersion( )和HttpExtentionProc( )。任何
ISA都必须在其PE文件头的引出表中定义这两个引出函数,以供Web服务器在适当的时候调用。
ISA大概工作流程如下:

1、当服务器刚加载ISA时,它会调用ISA提供的GetExtentionVersion( )来获得该ISA所需要的服
务器版本,并与自己的版本相比较,以保证版本兼容。… 阅读全文

Posted on 十一月 5, 2014 at 下午2:04 by admin · Permalink · Comments Closed
In: Web安全
友情链接