洞察移动政务小程序助力政府数字化转型,保障数据安全和效率提升
841
2022-09-16
漏洞类型及检测
作者 | 榴莲
编辑 | 楌橪
I.通用漏洞类型
1.栈溢出 栈溢出是缓冲区溢出的一种,往往由于对缓冲区的长度没有判断,导致缓冲区的大小超过了预定的大小,导致在栈内的保存的返回地址被覆盖,这时候返回地址将指向未知的位置.造成访问异常的错误. 而当我们精心构造一段shellcode保存在某个位置,并且通过滑板指令以及其他特定的方法跳转至shellcode的位置上执行shellcode,此时就可以通过shellcode获取到系统的管理员权限.执行任意代码, windows XP之前的系统可以直接利用,在windows7以后的系统需要构造ROP链突破保护权限,突破方法见附录1. 2.堆溢出 堆溢出与栈溢出一样,也是缓冲区溢出的一种,堆栈溢出的产生往往是由于过多的函数调用,导致调用堆栈无法容纳这些调用的返回地址,一般在递归中产生。堆栈溢出很可能由无限递归产生,但也可能仅仅是过多的堆栈层级 在 windows XP SP2上可以利用调整链表指针的方式,向固定的地址写入可控的数据,比如讲shellcode的地址写到返回地址,或者覆盖PEB函数指针.SEH结构等方法,但是随着后续系统的更新,在windows 7系统中多了许多保护机制,因此需要构造ROP在绕过相关的保护机制后再利用漏洞获取管理员权限,执行任意代码. 3.整数溢出 整数分为有符号和无符号两种类型,有符号数以最高位作为其符号位,即正整数最高位为1,负整数最高位为0,而无符号数没有这种情况,它的取值范围是非负数,在平时编程的时候常用的整型变量有 8位(单字节字符、布尔类型)、16位(短整型)、32位(长整型)等 ,每种整数类型在内存中有不同的固定取值范围,比如unsigned short的存储范围是0-65535,但是当存储的值超过65535的时候,数据就会截断,例如输入65536,系统就会识别为0. 如果利用整数溢出后的值做为内存拷贝的参数,那么就会造成缓冲区溢出(堆/栈),利用方法就是缓冲区溢出的利用方法. 4.格式化字符串 格式化字符串漏洞的产生主要源于对用户输入内容未进行过滤,这些输入数据都是作为参数传递给某些执行格式化操作的函数,如printf.fprintf.bprintf.sprintf等等.恶意用户可以使用”%s”和”%x”等格式符,从堆栈或其他位置输出数据,也可以使用格式符”%n”向任意位置写入任意数据,配合printf()函数和其他功能类似的函数就可以向任意地址写入被格式化的字节数,可能导致任意代码执行,或者读取敏感信息,比如用户名以及密码等等. 因为可以执行任意代码,所以可以通过shellcode获取系统管理员的权限,也有可能通过一些技术,直接在内存中将系统密码直接读出.
5.双重释放 双重释放漏洞主要是由对同一块内存进行二次重复释放导致的,利用漏洞可以执行任意代码. 在释放过程中,临近的已释放堆块的合并动作,这回改变原有的堆头信息以及前后向指针,之后在对其中的地址进行引用,就会导致访问异常,最后程序崩溃,正式因为程序引用到了已释放的内存,所以说双重释放漏洞就是Use After Free漏洞的子集.如果程序不存在堆块合并动作,那么双重释放后可能不会马上崩溃,但会在程序中遗留隐患,导致在后续执行过程中的某一刻爆发. 对于堆内存的利用,最常用也最简单的方法就是使用堆喷射技术(Heap Spraying),也就是申请大量内存块,将shellcode放在内存块的最后,前面放上利用地址以及滑板指令,用大量内存来碰撞,直到最后执行到shellcode. Shellcode可以执行任意代码,也就可以利用此来进行提权操作. 6.释放重引用 UAF漏洞的成因一般都是因为在编程过程中对引用计数的处理不当导致对象被释放后重用的。利用UAF漏洞实现远程代码执行,首先需要Bypass ASLR,获得模块基址及 shellcode的地址(也可以通过堆喷射在指定内存空间布置shellcode),然后硬编码、动态构造ROP来Bypass DEP,最终实现任意代码的执行。 7.数组访问越界 数组访问越界类似于溢出漏洞,但是又不完全是溢出漏洞 A)数组访问越界包含读写类型,而溢出属于数据写入 通常数组越界访问是由于数组下标数值超出了数组元素个数导致的,数组的读写操作有时是同时并存的,程序越界索引栈上分配的数组,同时又向其写入数据.最终造成溢出. B)部分溢出漏洞的本质就是数组越界 导致溢出的原因有多种,有些正是由于针对数组下表标范围未做有效限制,导致允许越界访问数组并对其写入数据,造成溢出 8.内核级漏洞 在Ring3的溢出漏洞,格式化字符串漏洞,释放重引用漏洞,双重释放漏洞,数组越界漏洞都可以在内核中复现,但是利用方法差异比较大. 内核漏洞不易挖掘,也不易分析利用.但是如果可以利用成功,那么直接可以使用Ring0权限.
9.类型混淆 类型混淆漏洞主要是讲数据类型A当做数据类型B解析引用,可能导致非法访问数据,进而执行任意代码,但这里的数据类型并非是单纯的编程概念上的数据类型,比如Uint被转换成String,Flash漏洞:CVE-2014-0590,也包括类对象或者数据结构的转换,比如以下两个类,A类被混淆成B类,就可能导致私有域被外部访问到. 10.沙盒逃逸 A)Broker接口漏洞:IE借助Broker进程完成一些需要高权限的操作,若其服务端口本身就存在漏洞,就可以直接被攻击者用于执行任意代码. B)策略检查绕过:Broker进程在检查Elevation Policies时若被绕过也可能导致沙盒逃逸,比如CVE-2013-4015用Tab带起空格从而绕过对程序名的检查. C)策略设置不当:对于沙箱可操作的程序,如果其Elevation Policies设置不当,允许静默以Medium权限执行,就可能创建高权限的进程再借助该程序的一些接口完成任意代码执行. D)IPC通信问题:当IPC通信过程中使用的共享内存包含过多的IE的未注册信息,可能导致沙盒的进程篡改其中主进程中的敏感信息,比如EPM沙盒的开关标准,被篡改后就可以直接关闭沙盒 E)沙盒权限限制不严:在沙盒中的进程如果权限限制的不够严谨,使得本不改访问的安全对象被访问,就可能导致沙盒逃逸. F)内核提取:利用系统内核漏洞获取比沙盒本更更高的权限,就可以直接关闭沙盒本身,从而实现沙盒逃逸. 11.RPC漏洞 RPC是一种远程过程调用协议,RPC提供进程间的交互通信机制,允许在某台计算机上运行的程序无缝的在远程系统上执行. 因为TCP/IP处理交换等问题,导致恶意代码可以利用漏洞以本地系统权限在系统上执行任意指令.
V.检测方法 1.shellcode模糊检测A)利用特定的编码方式检测1)/x**:类C语言的shellcode编码形式2)/u****:类javascript的shellcode编码形式 3)%u****:类JavaScript的shellcode编码形式4)%**:多种脚本使用的shellcode编码形式 B)利用GetPC的特征来匹配shellcode1)E80000000058方式GetPC2)E8FFFFFFFFC258方式GetPC3)D9EED97424F45B方式GetPC
C)利用动态函数获取编码来匹配shellcode1)利用shellcode必须动态获取函数地址,以摆脱对宿主的环境要求的特点,针对动态获取函数地址的编码来进行检测 D)利用滑板指令来匹配shellcode1)可以利用大量出现的滑板指令来匹配shellcode,例如0C0C0C0C,90909090,FFFFFFFF等经典滑板指令
直播主题:8日HOOK专题 9日lnject专题
直播时间:20:00-21:30
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~