功能各异的中小型软件数量飞速增长,为我们的工作和生活提供了方便。然而应用软件频繁爆出漏洞,被黑客利用,越来越多的用户遭到攻击。因此,网络安全漏洞已经成为当今互联网的一个焦点。本文结合H3C攻防研究团队在攻防研究过程中的经验和体会,阐述漏洞分析的常用方法。
漏洞和漏洞分析简介
1. 漏洞
关于漏洞,存在多种定义。一般来说,系统中的安全缺陷,计算机硬件、软件、协议的具体实现或系统安全策略上存在的缺陷都可以称为漏洞(vulnerability)。漏洞会导致入侵者访问未授权的文件、获取私密信息甚至执行任意程序。漏洞包含以下几种基本属性:漏洞类型,造成的危害,严重程度,利用条件以及环境特征等。漏洞是客观存在、难以避免的,按照发现的时序可以分为三类:未发现的漏洞,0Day(零日漏洞),已经公布补丁的漏洞。
2. 0Day
0Day,零日,顾名思义,不用花一天的时间,强调“即时性”。0Day的概念最早用于软件和游戏破解,属于非盈利性和非商业化的组织行为,其基本内涵是“即时性”。在当时,0Day是指在正版软件或游戏发布的当天甚至之前,发布附带着序列号或者解密器的破解版,让使用者可以不用付费就能长期使用。因此,0Dday是反盗版的重要打击对象,但受到免费使用者和业内同行的推崇。尽管以此谋利的盗版商为0Day的拥护者所不齿,但商业利益的驱动还是将破解行为的商业化推到了高峰。
现在在网络安全界,0Day是指还没有发布补丁的漏洞,也称零时差漏洞或zero-day。通俗来讲,指的是已经被挖掘出来,但还没有大范围传播开、针对该漏洞的补丁还没有发布的漏洞。该类型漏洞可能已经掌握在极少数人手中,黑客有可能利用该类漏洞信息还没有大范围传播开、大部分用户没有获得相关的漏洞信息、厂商也没有发布漏洞补丁这些有利条件来达到攻击的目的。
3. 漏洞分析
漏洞分析是指在代码中迅速定位漏洞,弄清攻击原理,准确地估计潜在的漏洞利用方式和风险等级的过程。
扎实的漏洞利用技术是进行漏洞分析的基础,否则很可能将不可利用的bug判断成漏洞,或者对漏洞等级评估错误(如将可以允许远程控制的高危漏洞误判成DoS拒绝服务型的中级漏洞)。
一般情况下,漏洞发现者提交漏洞信息时,需要向安全专家提供一段能够重现漏洞的代码,这段代码被称作POC(Proof of Concept)。POC可以有多种形式,只要能够触发漏洞就行。例如针对IE的漏洞,POC可能是一个恶意的html文件;针对WindowsMediaPlayer播放器漏洞,POC可能是一个wma媒体文件;针对Windows SMB协议漏洞,POC可能是一个Metasploit的Exploit模块。
常用漏洞分析工具和方法
漏洞分析是一项有挑战但也很刺激的工作,好像八仙过海一样,目的很明确,通过大海,到达彼岸就是胜利,至于如何到达彼岸,就凭各显神通了。漏洞分析也是如此,明确存在漏洞后,需要尽快定位漏洞原因,而用什么方法,可以自由选择。
要分析漏洞,首先一定要能够再次复现这个漏洞,然后才能通过跟踪和调试来分析它。再次复现漏洞的过程,我们称之为漏洞重现。漏洞重现一般是找到漏洞的触发条件和步骤,能稳定的复现漏洞,通常需要自己编写POC。
为了方便漏洞重现和漏洞分析,建议用VMWare虚拟机,在虚拟机里安装分析漏洞所需要的操作系统和软件环境。用虚拟机环境进行漏洞分析,最大的优势是可以随时保存和恢复系统快照。
无论采取什么方法进行漏洞分析,分析工具是必不可少的。互联网上可以找到的漏洞分析工具很多,面向不同的操作系统、不同的漏洞类型各有所长。下面几种是H3C安全研究团队进行漏洞分析过程中常用的工具:
- 虚拟系统:VMWare;
- 编辑工具:UltraEdit,WinHex;
- 反汇编工具:IDA及常用插件;
- 动态调试工具:OllyDbg/OllyIce,SoftIce,WinDbg。OllyIce是OllyDbg的升级版。
有了这些辅助工具,就如八仙有了渡海的法宝,接下来的工作就是各显神通了。一般进行漏洞分析的方法不外乎以下几种:
1. 动态调试
该方法是指使用OllyDbg等动态调试工具打开存在漏洞的软件或附加进程,动态跟踪程序的执行过程。动态跟踪,可以实现单步执行每一条汇编指令,清楚的了解程序执行流程、堆栈数据,从而快速定位漏洞原因。由于每条指令都可以单步执行,所以动态调试能够很清楚的看到堆栈的分配和使用情况,也能够动态跟踪到程序处理输入参数的详细情况。采用动态调试跟踪,可以层层逆向回溯到发生溢出的漏洞函数。图1和图2就是用OllyDbg和SoftIce动态调试漏洞的界面,从中可以看出堆栈的详细内容以及汇编指令。
图1 利用OllyDbg进行动态分析
图2 利用SoftIce进行动态分析
2. 静态分析
该方法是指使用IDA等逆向工具进行反汇编,获得程序的“整体观”和高质量的反汇编代码,通过阅读、理解反汇编代码,弄懂代码所实现的功能,找出代码存在的缺陷。目前该方法主要辅助动态调试。动态调试和静态分析结合起来能快速定位漏洞函数,提高分析效率。
目前单纯使用静态分析来定位漏洞的情况不多,因为长篇的反汇编代码人工看起来很费劲,理解起来也比较困难,常常一个功能简单的程序反汇编以后代码量会很大。但也有些漏洞通过反汇编代码能很快发现,例如前不久在进行漏洞挖掘时挖出了国内某银行网上银行的一个缓冲区溢出漏洞,通过汇编代码分析出原因为:上层函数进入子函数前,ecx寄存器保存的是有效基址,而且后续代码将会用到该ecx值;可是上层函数调用一个子函数时使用了ecx寄存器,使用前没有保存原始值,返回上层函数时ecx的值被修改了;紧接着上层函数使用ecx作为基址时,出现异常。下面图3是利用IDA静态分析的界面图:
图3 利用IDA进行静态分析
3. 指令追踪
在进行漏洞分析时,可能会遇到结合动态调试和静态分析都很难快速定位的情况,此时就可以考虑指令追踪技术。可以先运行一个正常的程序,动态调试跟踪正常程序,记录所有执行过的指令序列;然后触发漏洞,记录攻击状况下程序执行过的指令序列。最后比较这两种执行过的指令,重点逆向两次执行中表现不同的代码区,并动态调试和跟踪这部分代码,最终定位漏洞函数。
例如我们曾在攻防研究过程中挖掘出了迅雷看看的一个0day漏洞,分析该漏洞时,就用到了指令追踪技术。刚开始动态调试和静态分析并用,没有快速定位到漏洞原因。然后尝试传入一个正确的参数,动态调试并记录指令序列,再传入一个异常的参数,动态调试并记录指令序列。通过对比这两种指令序列,找到不同的地方,再结合动态调试很快就定位了漏洞原因。
4. 补丁比较
补丁比较的前提是厂商已经针对漏洞发布了安全补丁。从漏洞发现到厂商公布安全补丁这段时间,漏洞可能还没有公开,互联网上有关漏洞的细节信息很少。而安全补丁一旦公布,其中的漏洞信息也就相当于随之一同公布了,我们可以通过比较分析打补丁前后PE文件的反汇编代码得到存在漏洞的函数,然后编写POC。在分析微软RPC漏洞MS08-067时,就用到了该方法,然后根据获得的关键信息完成了漏洞分析。以下图4-图6是部分截图:
图4 通过反汇编工具IDA找到补丁修改位置
图5 图形显示打补丁前后函数的变化
图6 获得函数的调用关系
漏洞利用
漏洞利用是指针对某一具体的漏洞编写代码,完成一定的功能,通常我们将这段完成一定功能的代码称为shellcode。漏洞利用的目的是在目标系统(较多情况是远程网络上的系统)上自动运行一些程序,或者获得远程系统的更高访问权限(简称提权)。至于运行什么样的程序,完全由编写代码的人来决定,可以是一个完成自动上传或下载功能的程序,也可以是调用系统命令的程序。
shellcode既是一段代码,同时也是填充数据,是被当作数据来发送到目标系统(Target)利用某个特定漏洞的代码。shellcode是溢出程序的核心,漏洞利用的关键就是shellcode编写。一般漏洞发现者能够给出一些漏洞信息,但不会给出shellcode或完整的shellcode。所以想要成功利用漏洞,shellcode编写技术就非常重要。
以下是一段漏洞测试常用的调用系统计算器程序calc.exe执行的shellcode:
var shellcode = unescape(
“%uE860%u0000%u0000%u815D%u06ED%u0000%u8A00%u1285%u0001%u0800” +
“%u75C0%uFE0F%u1285%u0001%uE800%u001A%u0000%uC009%u1074%u0A6A” +
“%u858D%u0114%u0000%uFF50%u0695%u0001%u6100%uC031%uC489%uC350” +
“%u8D60%u02BD%u0001%u3100%uB0C0%u6430%u008B%u408B%u8B0C%u1C40” +
“%u008B%u408B%uFC08%uC689%u3F83%u7400%uFF0F%u5637%u33E8%u0000” +
“%u0900%u74C0%uAB2B%uECEB%uC783%u8304%u003F%u1774%uF889%u5040” +
“%u95FF%u0102%u0000%uC009%u1274%uC689%uB60F%u0107%uEBC7%u31CD” +
“%u40C0%u4489%u1C24%uC361%uC031%uF6EB%u8B60%u2444%u0324%u3C40” +
“%u408D%u8D18%u6040%u388B%uFF09%u5274%u7C03%u2424%u4F8B%u8B18” +
“%u205F%u5C03%u2424%u49FC%u407C%u348B%u038B%u2474%u3124%u99C0” +
“%u08AC%u74C0%uC107%u07C2%uC201%uF4EB%u543B%u2824%uE175%u578B” +
“%u0324%u2454%u0F24%u04B7%uC14A%u02E0%u578B%u031C%u2454%u8B24” +
“%u1004%u4403%u2424%u4489%u1C24%uC261%u0008%uC031%uF4EB%uFFC9” +
“%u10DF%u9231%uE8BF%u0000%u0000%u0000%u0000%u9000%u6163%u636C” +
“%u652E%u6578%u9000”
);
这段shellcode在漏洞利用时作为数据的一部分发送给目标系统,目标系统最终会把这段数据当作机器指令来执行,下图7和图8所示:
图7 shellcode被当作数据发送到目标系统存储在内存
图8 shellcode被当作机器指令执行
结束语
漏洞分析和利用是一项系统性工程,如何快速准确的定位漏洞原因、并通过技术手段绕过安全监管和限制,是漏洞分析和利用的终极目标;在达到该目标之前,安全研究人员在熟练掌握操作系统内核及汇编语言等多种编程技术的基础上,既要深入掌握各种漏洞分析的手段和方法论,也要深刻理解现有主流web应用的开发模型框架;只有这样,才能及时的发现漏洞、封堵漏洞,提升安全设备对web应用的攻击防护水平。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
作者
相关推荐
-
通过评估风险来查找网络安全漏洞
随着网络犯罪分析开始利用更复杂的工具和技术,数据泄露事故逐年增加。并且,这种趋势可能会持续下去。 同时,在泄漏 […]