1、网络监测技术网络监测技术缓冲区溢出漏洞攻击缓冲区溢出漏洞攻击软件安全概述软件安全概述l美国国家标准技术研究院提到:软件安全漏洞是导致系统安全策软件安全漏洞是导致系统安全策略违背的本质原因略违背的本质原因l安全漏洞在软件中大规模存在安全漏洞在软件中大规模存在l大多数成功攻击利用已公布未修补的软件安全漏洞或不安全配置利用已公布未修补的软件安全漏洞或不安全配置l软件漏洞:l缓冲区溢出缓冲区溢出l格式化字符串漏洞格式化字符串漏洞l竞争条件漏洞竞争条件漏洞l整数溢出整数溢出lXSS跨站脚本跨站脚本lSQL注入注入l最简单的栈溢出,更难控制的堆溢出、内核溢出,对抗DEP(数据执行保护)和对抗ASLR(地址
2、空间布局随机化)的攻击l软件代码与内存空间上演着精彩的对弈软件代码与内存空间上演着精彩的对弈软件安全概述软件安全概述l软件自诞生,就和软件自诞生,就和BUG形影不离形影不离l能被攻击者利用并导致危害的能被攻击者利用并导致危害的BUG就是软件安全漏就是软件安全漏洞洞(安全漏洞范围更广)l安全漏洞的三个基本元素:安全漏洞的三个基本元素:l系统的脆弱性或缺陷系统的脆弱性或缺陷l攻击者对缺陷的可访问性攻击者对缺陷的可访问性l攻击者对缺陷的可利用性攻击者对缺陷的可利用性l软件安全漏洞:在软件需求、开发和配置过程中引入在软件需求、开发和配置过程中引入的缺陷,执行会违反安全策略,具有三个基本元素的缺陷,执行
3、会违反安全策略,具有三个基本元素lCERT公布2006-08年,每年公开漏洞每年公开漏洞7K-8K个个l实际每年新公开漏洞上万个,大量漏洞把持在国家情大量漏洞把持在国家情报部门、软件厂商、安全公司和黑客团体手中报部门、软件厂商、安全公司和黑客团体手中软件安全概述软件安全概述l软件功能强大,扩展到生活方方面面,软件安全对经济和社会生活影响巨大l软件安全漏洞造成的经济损失经济损失l1988年莫里斯蠕虫造成损失9600万美元l2001年红色代码蠕虫,造成损失26亿美元l2003年冲击波、Mydoom等 蠕虫,带来数十亿,甚至数 百亿美元的损失l这些蠕虫利用服务器软件这些蠕虫利用服务器软件 中的漏洞传
4、播中的漏洞传播软件安全概述软件安全概述l软件安全漏洞对生命威胁对生命威胁l1988两伊战争期间,美国防空导弹 击落伊朗客机,290人遇难,美国的 解释是雷达跟踪软件的含糊和令人跟踪软件的含糊和令人 误解的输出显示误解的输出显示l鱼鹰V-22倾斜旋翼直升机试飞时,一条水压线爆裂,软件错误认为备软件错误认为备 份系统没有工作份系统没有工作,导致飞机坠毁,4人遇难l2010年英国科学家以身试法,全球 首个被计算机病毒感染的人类首个被计算机病毒感染的人类,证 明体内的医疗器材(心脏起搏器)有感染病毒的风险软件安全概述软件安全概述l安全领域多年研究,软件安全问题反而越来越严重软件安全问题反而越来越严重,
5、为什么软件普遍存在漏洞?l软件安全“困境三要素困境三要素”l复杂性复杂性 源代码行数:Windows NT 3.1(3百万)Windows XP(4千万)Windows Server 2003(5千万)软件规模越来越大,越来越复杂,BUG也会越来越多,预计每千行代码约存在每千行代码约存在5-50个个BUG 大多数大多数BUG不会造成安全问题,但一个足以致命不会造成安全问题,但一个足以致命软件安全概述软件安全概述l软件安全“困境三要素困境三要素”l可扩展性可扩展性 为了支持更好的用户感受,软件提供扩展渠道,软件的可扩展性机制促进现代软件的蓬勃发展;可扩展性机制促进现代软件的蓬勃发展;操作系统通过
6、动态装载设备驱动和模块动态装载设备驱动和模块,浏览器通过脚脚本语言、控件和动态装载库本语言、控件和动态装载库支持更好的扩展性;很难组织攻击者和恶意代码以不可预测的扩展方式入侵不可预测的扩展方式入侵软件和系统软件和系统,厂商不重视 分析可扩展软件的安全性要比分析不能更改软件的安全性困难得多软件安全概述软件安全概述l软件安全“困境三要素困境三要素”l连通性连通性 接入互联网的计算机数量快速增加,高连通性使小小软使小小软件缺陷造成巨大的影响件缺陷造成巨大的影响(蠕虫)高度连通性也使得网络攻击能够引发现实世界的故障引发现实世界的故障,电话网、电力网事故(电影:鹰眼)连通性使得不需人为干预的自动化攻击自
7、动化攻击成为可能,大大改变了威胁环境,威胁传播范围更大更迅速威胁传播范围更大更迅速 在一个普遍依赖软件的高连通性网络中,一旦软件中的安全漏洞被恶意利用,后果将不仅是计算机短期无法工作,对正常生活也会造成重要影响对正常生活也会造成重要影响软件安全概述软件安全概述l软件安全漏洞类型lCVE标准目录中,将安全漏洞分37类类l2001-04年,缓冲区溢出漏洞保持第一位年,缓冲区溢出漏洞保持第一位l2005开始,开始,Web安全问题快速升温安全问题快速升温,XSS、SQL注入、PHP远程文件包含等占据前三l其他普遍流行的安全漏洞其他普遍流行的安全漏洞:目录遍历、信息泄露、畸形输入导致的拒绝服务、符合链接
8、问题、格式化字符串、密码学缺陷软件安全概述软件安全概述l软件安全漏洞从技术上主要分类:软件安全漏洞从技术上主要分类:l内存安全违规类内存安全违规类 内存访问时引入的安全缺陷,如缓冲区溢出、Use-after-Free、Double free等不安全指针问题;主要出现在C/C+编写的软件中,支持任意的内存分配与回收,任意指针计算、转换,未保护内未保护内存存;Java等则通过禁用指针计算与转换,实施内存垃圾跟踪与收集等机制,保证内存安全;缓冲区溢出是最基础的内存安全问题缓冲区溢出是最基础的内存安全问题软件安全概述软件安全概述l软件安全漏洞从技术上主要分类:软件安全漏洞从技术上主要分类:l输入验证类
9、输入验证类 程序在对用户输入进行数据验证存在错误用户输入进行数据验证存在错误,没有保证输入数据的正确性、合法性和安全性,导致可能被恶意攻击与利用;可细分为:格式化字符串、SQL注入、代码注入、远程文件包含、目录遍历、XSS、HTTP Header注入、HTTP响应分割错误等 针对目前流行的针对目前流行的Web应用程序的输入验证类漏洞,近年来已经应用程序的输入验证类漏洞,近年来已经成为攻击者最普遍利用的目标成为攻击者最普遍利用的目标 例:例:字符串格式化漏洞:C语言特定字符串处理函数printf()涉及将未过滤的用户输入作为该函数的格式字符串参数,恶意用户利用%s、%x等格式化选项,打印内存某些
10、地址的数据内容;利用%n格式化选项,将任意构造的数据写入任意栈内存位置,从而控制程序逻辑,控制系统。软件安全概述软件安全概述l软件安全漏洞从技术上主要分类:软件安全漏洞从技术上主要分类:l竞争条件类竞争条件类 涉及多进程或多线程处理的程序中,输出或结果无法预测,依赖于其他进程事件发生的次序或时间 TOCTTOU,检查时刻与使用时刻条件状态不一致,导致攻击者可利用的漏洞软件安全概述软件安全概述l软件安全漏洞从技术上主要分类:软件安全漏洞从技术上主要分类:l权限混淆与提升类权限混淆与提升类 程序由于自身编程疏忽或被第三方欺骗,滥用其特权,或赋予第三方不该给予的权限 权限提升漏洞通常发生在一些拥有特
11、权的应用程序中,由于安全缺陷,使得获取特权的安全检查被绕过,或被攻破 FTP反弹攻击利用FTP协议的缺陷,绕过FTP服务器的权限限制,让FTP作为中间代理,使用PORT命令向其他主机的端口请求访问,用于隐蔽的端口扫描 “越狱”由于iPhone和iPad流行被大众了解与接受,原指破解类Unix系统中jail机制,移动设备为自身利益,只允许访问特定来源的软件资源,黑客与厂商之间开始了一轮轮越狱与反越狱斗争 软件安全概述软件安全概述l软件安全漏洞远不止上述几种类型不止上述几种类型l新的安全漏洞形式也在进一步挖掘进一步挖掘l大家认为应该披露安全漏洞这些危险信息吗?大家认为应该披露安全漏洞这些危险信息吗
12、?l保密和包庇阴暗最终只会害了我们自己l透明无论对我们个人、社会,都是有帮助的(政治不也是一样吗?)缓冲区溢出概述缓冲区溢出概述l缓冲区溢出是最早被发现,也是最基础最早被发现,也是最基础的安全软件漏洞类型(特别是栈溢出特别是栈溢出)l缓冲区溢出基本概念l本质:内存安全违规类漏洞内存安全违规类漏洞,计算机程序向特定缓冲区内填向特定缓冲区内填充数据充数据时,超出了缓冲区本身的容量超出了缓冲区本身的容量,导致外溢数据覆盖外溢数据覆盖了相邻内存空间的合法数据合法数据,从而改变程序执行流程改变程序执行流程破坏系统运行完整性l原因:程序本身没有没有检查数据长度与所分配的存储空间检查数据长度与所分配的存储空
13、间是否是否匹配匹配l多见于C/C+中的memcpy()、strcpy()等内存与字符串复制函数的引用位置,这些函数不检查内存越界问题不检查内存越界问题l根本原因:现代计算机基础构架根本原因:现代计算机基础构架冯诺依曼体系的安全缺冯诺依曼体系的安全缺陷,即程序的数据和指令都在同一内存中进行存储陷,即程序的数据和指令都在同一内存中进行存储缓冲区溢出概述缓冲区溢出概述l缓冲区溢出攻击技术的发展l80年代初,国外黑客就意识到程序中存在缓冲区溢出问题,1988年莫里斯蠕虫利用的是年莫里斯蠕虫利用的是fingerd服务中存在的缓冲区溢出漏洞服务中存在的缓冲区溢出漏洞进行传播的l1996年,黑客One在经典
14、文章Smashing the Stack for fun and Profit中,详细描述详细描述Linux系统的栈结构,及如何利用缓冲区溢出系统的栈结构,及如何利用缓冲区溢出获得远程获得远程Shell;l90年代末20世纪初,缓冲区溢出深入人心,是最为流行的攻击技术lWindows内存分布和系统调用机制不同于类内存分布和系统调用机制不同于类Unix系统系统,但这难不倒睿智的黑客,1998年死牛崇拜黑客团队以Microsoft Netmeeting服务中缓冲区溢出漏洞为例,详细介绍如何利用Windows平台的栈溢出漏洞l1999年,Spyrit提出使用系统核心DLL中的JMP ESP等指令完成
15、指令跳转和控制的想法,推动该平台栈溢出漏洞的利用;同年Conover对基于堆的缓冲区溢出堆的缓冲区溢出攻击技术进行深入总结和整理l这些研究也促进了21世纪初世纪初Windows平台蠕虫大规模爆发平台蠕虫大规模爆发缓冲区溢出概述缓冲区溢出概述l黑客对技术锲而不舍的钻研精神不应该因此被黑客对技术锲而不舍的钻研精神不应该因此被贬低,正因为他们的不断找茬和曝光,促使软贬低,正因为他们的不断找茬和曝光,促使软件厂商更注重软件的安全性件厂商更注重软件的安全性l近年来缓冲区溢出在软件漏洞中比重有所下降,近年来缓冲区溢出在软件漏洞中比重有所下降,但绝对数量仍在增长但绝对数量仍在增长l直到现在,缓冲区溢出漏洞与
16、攻击并未被根除,直到现在,缓冲区溢出漏洞与攻击并未被根除,仍在一些实际网络攻击事件和恶意代码中见到其踪迹缓冲区溢出背景知识缓冲区溢出背景知识l掌握计算机程序的底层运行机理底层运行机理l熟悉编程语言、汇编语言、操作系统编程语言、汇编语言、操作系统等基础知识l编译器与调试器lC/C+编写的源码,需要通过编译器编译器(生成目标文件,二进制代码)和连接器连接器生成最终的可执行程序l调试器调试器提供程序断点管理、执行控制、信息查看断点管理、执行控制、信息查看lWindows平台下VC+集成开发环境,自带调试与反汇编功能l类Unix平台下,GDB是常用的调试器缓冲区溢出背景知识缓冲区溢出背景知识l汇编语言
17、基础知识l汇编语言(特别是IA32构架下)是理解软件安全漏理解软件安全漏洞机理的底层基础洞机理的底层基础l因为无法得到所分析软件的源代码,只能阅读理解反汇编得到的汇编代码反汇编得到的汇编代码l渗透攻击代码中包含机器指令形式存在的机器指令形式存在的Shellcode,理解和编写也需要汇编语言知识l调试渗透代码对软件安全漏洞的利用过程,在调试器中一般只能在汇编代码层次上分析缓冲区溢出背景知识缓冲区溢出背景知识l汇编语言基础知识l首先熟悉常用的寄存器及其功能熟悉常用的寄存器及其功能l通用、段、控制、其他通用、段、控制、其他四类寄存器l通用寄存器,主要用于算术运算,保存数据、地址、偏移量等;特别注意的
18、是esp:栈指针寄存器,栈溢出攻击时关键的操控对象l段寄存器一般用作段基址寄存器,16位l控制寄存器控制处理器的执行流程;其中最关键是eip:指令指针,保存了下一条即将执行的机器指令的地址,成为各种攻击控制程序执行流程的关键攻击目标对象l其他寄存器中值得关注的是“扩展标志扩展标志”eflags寄存器,不同标志位组成,保存指令执行后的状态和控制指令执行流程的标志信息缓冲区溢出背景知识缓冲区溢出背景知识l进程内存管理进程内存管理l了解进程内存管理机制是深入理解软件安全漏洞及攻击机理所必须掌握的内容lLinux:程序执行时,系统在内存中创建一个虚 拟的内存地址空间,32位机4GB;3GB以下用户态空
19、间,3-4GB为内核态 空间;.text为程序指令,只读;.data段主要包含静态初始化数据;.bss则包含未初始化的数据;加载完成后,系统为程序初始化栈和堆初始化栈和堆 缓冲区溢出背景知识缓冲区溢出背景知识lLinux进程内存管理进程内存管理l栈(栈(Stack)LIFO,环境变量环境变量env、运行参数、运行参数argv、运行参数数量、运行参数数量argc放置在栈底,然后是主主函数及调用栈中各个函数的临时保存信息函数及调用栈中各个函数的临时保存信息;l堆(堆(Heap)FIFO,保存程序动态分配的数据保存程序动态分配的数据和变量和变量;l程序执行,安装逻辑执行.text中的指令,并在栈和堆
20、中保存和读取数据l程序无法正确区分程序和数据,可通过修改内存空间,影响程序执行逻辑,将恶意数据作为指令提交给处理器缓冲区溢出背景知识缓冲区溢出背景知识lWindows进程内存管理进程内存管理l空间布局与Linux系统有差异l2-4GB为内核态地址空间,映射内核 代码和一些核心DLLl0-2GB为用户态地址空间,高地址段 映射大量应用程序共用的DLL,1GB 位置装载一些应用程序本身使用的DLLl可执行代码区,静态内存空间保存全局变量、静态变量,堆存储动态数据,多线程有多个栈和堆缓冲区溢出背景知识缓冲区溢出背景知识l了解函数调用过程l栈结构和函数调用过程栈结构和函数调用过程的底层细节,是理解栈溢
21、出攻击的重要基础l栈溢出攻击l针对函数调用过程中返回地址返回地址l对栈中的存储返回地址栈中的存储返回地址的位置进行缓冲区溢出进行缓冲区溢出l改写返回地址改写返回地址l使程序跳转到攻击者指定的位置跳转到攻击者指定的位置执行恶意代码缓冲区溢出背景知识缓冲区溢出背景知识l函数调用过程l栈,LIFO,用于实现程序中的函数或过程调用实现程序中的函数或过程调用,保存函数的调用参数、返回地址、调用者栈基址、保存函数的调用参数、返回地址、调用者栈基址、函数局部变量等函数局部变量等l最关键是返回地址最关键是返回地址,即函数调用结束后执行的下一下一条指令地址条指令地址l返回地址在可读写的栈中保存,与攻击者可操纵的
22、与攻击者可操纵的局部变量缓冲区相邻局部变量缓冲区相邻,有可乘之机(如果没有严格边界检查的话)lebp、esp(寄存器栈底和栈顶地址)lpush、pop(指令,将数据压入栈,弹出栈)缓冲区溢出背景知识缓冲区溢出背景知识l缓冲区溢出例子l最简单的溢出例子最简单的溢出例子void return_input(void)char array30;gets(array);printf(“%sn”,array);int main(void)return_input();return 0;l程序运行后,输入超过30个字符,造成缓冲区溢出,一旦覆盖上方的EBP和RET缓冲区溢出背景知识缓冲区溢出背景知识l缓冲区
23、溢出的利用l缓冲区溢出两个要素两个要素:l程序中存在缺乏边界安全保护的缓冲区操作存在缺乏边界安全保护的缓冲区操作;l缓冲区操作必须是用户输入可控制的用户输入可控制的l上述例子造成结果结果?l黑客不会满足于此,期望获得系统访问权期望获得系统访问权l黑客的三个挑战l如何找出缓冲区溢出要覆盖和修改的敏感位置敏感位置?l将敏感位置的值修改值修改成什么?l执行什么指令代码指令代码达到攻击的目标?(Shellcode)缓冲区溢出背景知识缓冲区溢出背景知识l栈溢出攻击的简单例子char shellcode=“x31xd2x52x68x6ex2fx73x68 x68x2fx2fx62”“x69x89xe3x5
24、2x53x89xe1 x8d0 x42x0bxcdx80”char large_string128;int main(int argc,char*argv)char buffer96;int i;long*long_ptr=(long*)large_string;for(i=0;i32;i+)*(long_ptr+i)=(int)buffer;for(i=0;i(int)strlen(shellcode);i+)large_stringi=shellcodei;strcpy(buffer,large_string);return 0;缓冲区溢出背景知识缓冲区溢出背景知识l上例中,三个挑战问题是
25、怎么解决的?l如何找出缓冲区溢出要覆盖和修改的敏感位置敏感位置?l将敏感位置的值修改值修改成什么?l执行什么指令代码指令代码达到攻击的目标?(Shellcode)l前面的例子非常简单,用于说明l实际攻击过程要复杂得多渗透测试软件渗透测试软件l渗透测试,安全管理重要一环l渗透测试软件lCORE ImpactlImmunity CANVAS 商业软件,价格昂贵商业软件,价格昂贵lMetasploit 开源的渗透攻击测试软件开源的渗透攻击测试软件lMetasploitlHD Moore于2003年组织开发l04年公布,当年进入安全社区流行软件5强渗透测试软件渗透测试软件lMetasploit软件结构
26、l开发框架和组件模块的可扩展模型lRuby编写的MSF为基础,为渗透测试组件开发与测试提供平台l模块组件是实施渗透攻击的代码 利用安全漏洞的Exploits模块 扫描、查点等辅助任务的Auxiliary模型 在目标系统植入并运行的Shellcode攻击负载Payloads模块 对攻击负载进行编码以躲避检测的Encoders模块,等等渗透测试软件渗透测试软件lMetasploit提供多种用户接口lMetasploit提供API接口和插件支持,支持第三方在MSF基础上开发扩展模块l2010年底,3.5.1版,集成了635个渗透攻击模块,314个辅助攻击模块;215种不同攻击负载渗透测试软件渗透测试软件lMetasploit的安装与熟悉总结总结