0day安全
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.1 漏洞概述

1.1.1 bug与漏洞

随着现代软件工业的发展,软件规模不断扩大,软件内部的逻辑也变得异常复杂。为了保证软件的质量,测试环节在软件生命周期中所占的地位已经得到了普遍重视。在一些著名的大型软件公司中,测试环节(QA)所耗费的资源甚至已经超过了开发。即便如此,不论从理论上还是工程上都没有任何人敢声称能够彻底消灭软件中所有的逻辑缺陷——bug。

在形形色色的软件逻辑缺陷中,有一部分能够引起非常严重的后果。例如,网站系统中,如果在用户输入数据的限制方面存在缺陷,将会使服务器变成SQL注入攻击和XSS(Cross Site Script,跨站脚本)攻击的目标;服务器软件在解析协议时,如果遇到出乎预料的数据格式而没有进行恰当的异常处理,那么就很可能会给攻击者提供远程控制服务器的机会。

我们通常把这类能够引起软件做一些“超出设计范围的事情”的bug称为漏洞(vulnerability)。

(1)功能性逻辑缺陷(bug):影响软件的正常功能,例如,执行结果错误、图标显示错误等。

(2)安全性逻辑缺陷(漏洞):通常情况下不影响软件的正常功能,但被攻击者成功利用后,有可能引起软件去执行额外的恶意代码。常见的漏洞包括软件中的缓冲区溢出漏洞、网站中的跨站脚本漏洞(XSS)、SQL注入漏洞等。

1.1.2 几个令人困惑的安全问题

也许您有一定的计算机知识,但仍然经常费解于下面这些安全问题。

(1)我从不运行任何来历不明的软件,为什么还会中病毒?

如果病毒利用重量级的系统漏洞进行传播,您将在劫难逃。因为系统漏洞可以引起计算机被远程控制,更何况传播病毒。横扫世界的冲击波蠕虫、slammer蠕虫等就是这种类型的病毒。

如果服务器软件存在安全漏洞,或者系统中可以被RPC远程调用的函数中存在缓冲区溢出漏洞,攻击者也可以发起“主动”进攻。在这种情况下,您的计算机会轻易沦为所谓的“肉鸡”。

(2)我只是点击了一个URL链接,并没有执行任何其他操作,为什么会中木马?

如果您的浏览器在解析HTML文件时存在缓冲区溢出漏洞,那么攻击者就可以精心构造一个承载着恶意代码的HTML文件,并把其链接发给您。当您点击这种链接时,漏洞被触发,从而导致HTML中所承载的恶意代码(shellcode)被执行。这段代码通常是在没有任何提示的情况下去指定的地方下载木马客户端并运行。

此外,第三方软件所加载的ActiveX控件中的漏洞也是被“网马”所经常利用的对象。所以千万不要忽视URL链接。

(3)Word文档、Power Point文档、Excel表格文档并非可执行文件,它们会导致恶意代码的执行吗?

和html文件一样,这类文档本身虽然是数据文件,但是如果Office软件在解析这些数据文件的特定数据结构时存在缓冲区溢出漏洞的话,攻击者就可以通过一个精心构造的Word文档来触发并利用漏洞。当您在用Office软件打开这个Word文档的时候,一段恶意代码可能已经悄无声息地被执行过了。

(4)上网时,我总是使用高强度的密码注册账户,我的账户安全吗?

高强度的密码只能抵抗密码暴力猜解的攻击,具体安全与否还取决于很多其他因素:

密码存在哪里,例如,存本地计算机还是远程服务器。

密码怎样存,例如,明文存放还是加密存放,什么强度的加密算法等。

密码怎样传递,例如,密钥交换的过程是否安全,网络通讯是否使用SSL等。

这些过程中如果有任何一处失误,都有可能引起密码泄漏。例如,一个网站存在SQL注入漏洞,而您的账号密码又以明文形式存在Web服务器的数据库中,那么无论您的密码多长,包含多少奇怪的字符,最终仍将为脚本注入攻击者获取。

此外,如果密码存在本地,即使使用高强度的Hash算法进行加密,如果没有考虑到CRACK攻击,验证机制也很可能被轻易突破。

您也许阅读过很多本网络安全书籍,所以经常看到端口扫描、网络监听、密码猜解、DOS等名词。虽然这些话题在网络安全技术中永远都不会过时,但阅读完本书之后,您将发现漏洞利用技术才是实施有效攻击的最核心技术,才是突破安全边界、实施深度入侵的关键所在。

1.1.3 漏洞挖掘、漏洞分析、漏洞利用

利用漏洞进行攻击可以大致分为漏洞挖掘、漏洞分析、漏洞利用三个步骤。这三部分所用的技术有相同之处,比如都需要精通系统底层知识、逆向工程等;同时也有一定的差异。

1.漏洞挖掘

安全性漏洞往往不会对软件本身功能造成很大影响,因此很难被QA工程师的功能性测试发现,对于进行“正常操作”的普通用户来说,更难体会到软件中的这类逻辑瑕疵了。

由于安全性漏洞往往有极高的利用价值,例如,导致计算机被非法远程控制,数据库数据泄漏等,所以总是有无数技术精湛、精力旺盛的家伙在夜以继日地寻找软件中的这类逻辑瑕疵。他们精通二进制、汇编语言、操作系统底层的知识;他们往往也是杰出的程序员,因此能够敏锐地捕捉到程序员所犯的细小错误。

寻找漏洞的人并非全是攻击者。大型的软件企业也会雇用一些安全专家来测试自己产品中的漏洞,这种测试工作被称做Penetration test(攻击测试),这些测试团队则被称做Tiger team或者Ethic hacker。

从技术角度讲,漏洞挖掘实际上是一种高级的测试(QA)。学术界一直热衷于使用静态分析的方法寻找源代码中的漏洞;而在工程界,不管是安全专家还是攻击者,普遍采用的漏洞挖掘方法是Fuzz,这实际是一种“灰”盒测试。

我们会在第3篇的相关章节中进一步介绍漏洞挖掘与产品安全性测试方面的知识。

2.漏洞分析

当fuzz捕捉到软件中一个严重的异常时,当您想透过厂商公布的简单描述了解漏洞细节的时候,您就需要具备一定的漏洞分析能力。一般情况下,我们需要调试二进制级别的程序。

在分析漏洞时,如果能够搜索到POC(proof of concept)代码,就能重现漏洞被触发的现场。这时可以使用调试器观察漏洞的细节,或者利用一些工具(如Paimei)更方便地找到漏洞的触发点。

当无法获得POC时,就只有厂商提供的对漏洞的简单描述了。一个比较通用的办法是使用补丁比较器,首先比较patch前后可执行文件都有哪些地方被修改,之后可以利用反汇编工具(如IDA Pro)重点逆向分析这些地方。

漏洞分析需要扎实的逆向基础和调试技术,除此以外还要精通各种场景下的漏洞利用方法。这种技术更多依靠的是经验,很难总结出通用的条款。本书将在第5篇中用若干个实际的分析案例来帮助您体会漏洞分析的过程,希望能够起到抛砖引玉的效果。

3.漏洞利用

漏洞利用技术可以一直追溯到20世纪80年代的缓冲区溢出漏洞的利用。然而直到Aleph One于1996年在Phrack第49期上发表了著名的文章《Smashing The Stack For Fun And Profit》,这种技术才真正流行起来。

随着时间的推移,经过无数安全专家和黑客们针锋相对的研究,这项技术已经在多种流行的操作系统和编译环境下得到了实践,并日趋完善。这包括内存漏洞(堆栈溢出)和Web应用漏洞(脚本注入)等。

本书将从攻防两个角度着重介绍Windows平台下内存漏洞利用技术的方方面面。由于手机安全及Web应用中的脚本注入攻击所使用的技术与Windows平台下缓冲区溢出相差较大,且自成体系,本书只做原理性简单介绍,如有机会将单独著书以述之。本书将在第1篇与第2篇中由浅入深地集中介绍这部分内容。

1.1.4 漏洞的公布与0day响应

漏洞公布的流程取决于漏洞是被谁发现的。

如果是安全专家、Pen Tester、Ethic Hacker在测试中发现了漏洞,一般会立刻通知厂商的产品安全中心。软件厂商在经过漏洞确认、补丁测试之后,会正式发布漏洞公告和官方补丁。

然而事情总是没有那么简单,如果漏洞被攻击者找到,肯定不会立刻通知软件厂商。这时漏洞的信息只有攻击者自己知道,他可以写出exploit利用漏洞来做任何事情。这种未被公布、未被修复的漏洞往往被称做0day。

0day漏洞是危害最大的漏洞,当然对攻击者来说也是最有价值的漏洞。

0day毕竟只是被少数攻击者掌握,并且大多数情况下也不会有人浮躁到写出蠕虫来攻击整个Internet。但有时0day漏洞会被曝光,那意味着全世界的黑客都知道这个漏洞,也懂得怎么去利用它,在厂商的官方补丁发布前,整个Internet的网络将处于高危预警状态。

0day曝光属于严重的安全事件,一般情况下,软件厂商都会进入应急响应处理流程,以最快的速度修复漏洞,保护用户的合法权利。

公布漏洞的权威机构有两个。

(1)CVE (Common Vulnerabilities and Exposures)http://cve.mitre.org/截至目前,这里收录了两万多个漏洞。CVE会对每个公布的漏洞进行编号、审查。CVE编号通常也是引用漏洞的标准方式。

(2)CERT(Computer Emergency Response Team)http://www.cert.org/计算机应急响应组往往会在第一时间跟进当前的严重漏洞,包括描述信息、POC的发布链接、厂商的安全响应进度、用户应该采取的临时性防范措施等。

此外,微软的安全中心所公布的漏洞也是所有安全工作者和黑客们最感兴趣的地方。微软每个月第二周的星期二发布补丁,这一天通常被称为“Black Tuesday”,因为会有许多攻击者通宵达旦地去研究这些补丁patch了哪些漏洞,并写出exploit。因为在补丁刚刚发布的一段时间内,并非所有用户都能及时修复,故这种新公布的漏洞也有一定利用价值。有时把攻击这种刚刚被patch过的漏洞称为1day攻击。(patch发布后1天,叫做1day,5天叫做5day,未发patch统称0day)