基于fuzzing技术的漏洞挖掘与攻防技术
基于模糊测试的漏洞挖掘与攻防技术
引言
安全事件层出不穷
- 滴滴8天3城连发暴力事件 媒体:被资本绑架轻视安全
- 史上最大云安全事件 Cloudflare流量泄露
- 洲际酒店(IHG)信用卡数据泄露
- 搭载NSA网络核武 WannaCry勒索攻击全球爆发
伙伴挖大坑 1.4亿Verizon用户数据泄露
安全漏洞定义:
安全漏洞是网络攻击和防御的关键点
攻击:根据目标存在的漏洞,编写攻击程序
防御:提前挖掘出漏洞,并修复
网络安全事件的根本原因:
漏洞挖掘
漏洞防御
常见的漏洞挖掘技术
手工测试
定义:由测试人员手工分析和测试被测目标,发现漏洞的过程,是最原始的漏洞挖掘方法
优点:
补丁对比
定义:一种通过对比补丁之间的差异来挖掘漏洞的技术。
优点:发现速度快
缺点:已知漏洞
程序分析:
包括静态和动态
定义:至在不运行计算机程序的条件下,通过词法分析,语法分析,控制流分析,污点分析等技术对程序代码进行扫描,验证代码是否满足规范性,安全性等指标的一种代码分析。
有点:覆盖率100%
缺点:误报和漏报
二进制审核
定义:通过逆向获取二进制代码,在二进制代码层次上进行安全评估。
模糊测试
定义:通过像被测数据输入大量的畸形数据并检测差异来发现异常。
漏洞挖掘实例
攻防实例
学习中的感想
在很久之前,看到过一个教程,关于校园卡或者ic卡的破解过程,用的一般就是NFC技术,这种技术具有普遍实用的特征,并且攻击性范围巨大,易造成巨额损失,好在近两年来,关于相关硬件的生产有了新的改进,并且在相关技术的安全性上有了新的要求,所以安全性上有了一定程序的提升,但是还是一个不可以忽略的情况,在以后的生活中应该也注意报关相应的产品,自己的隐私等。
扩展学习:
漏洞原理:
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处理交换等问题,导致恶意代码可以利用漏洞以本地系统权限在系统上执行任意指令.
II.数据库漏洞类型
1.SQL Server漏洞提权
SQL server 2005以上有一个叫做xp_cmdshell的危险存储过程,可以直接利用提权,在SQL server 2005之后如果通过SQL注入等技术手段获得了SA的密码的话,一样可以通过添加存储过程的手段,将存储过程添加回来,然后像SQL server 2000一样的提权
2.MySQL 漏洞提权
将MySQL提权脚本文件上传到服务器,设置UID为ROOT,密码为具有root权限用户的密码,链接,创建shell函数,然后用select shell(‘cmd’,’net’,’user’)查看系统的所有用户,然后select shell(‘cmd’,’net user temp temp123456’),select shell(‘cmd’,’net localgroup administrators temp /add’)执行,如果成功,就已经成功添加了具有管理员权限的账号,提权成功.
III.服务器软件漏洞
1.Serv-U提权
漏洞是使用Serv-u本地默认管理端口,以默认管理员登陆新建域和用户来执行命令,Serv-u>3.x版本默认本地管理端口是:43958,默认管理员:LocalAdministrator,默认密码:#l@$ak#.lk;0@P,这是集成在Serv-u内部的,可以以Guest权限来进行连接,对Serv-u进行管理。
2.Magic Winmail Server 提权
Magic Winmail server程序安装为系统服务,程序一般是在administrator权限下运行的,而服务程序MailServer.exe是在system权限下运行的,因此当有Webshell时,就可以通过这个漏洞来提升权限了。
3.Pr提权
pr是通过搜索 wmiprvse.exe 取到SYSTEM权限后 执行任意命令执行添加用户命令当然就是添加用户了
4.Radmin提权
Radmin是平时在windows下用的比较多的一个远程管理工具。其具有支持多个连接和IP 过滤(即允许特定的IP控制远程机器)、个性化的档互传、远程关机、支持高分辨率模式、基于Windows NT的安全支持及密码保护以及提供日志文件支持等特性。不过老版本的radmin server2.X、radmin server3.0都存在一个“致命”漏洞 —— radmin hash提权漏洞。
5.Gene6 FTP Server提权
逻辑漏洞,可以直接添加具有管理员权限的账号
IV.Windows密码获取
A)使用GetHashes获取
B)使用gsecdump获取
C)使用Quarks PwDump获取
D)使用PwDump获取
E)使用SAMInside获取
F)使用Opehcrack破解Hash
G)使用oclHashcat破解
H)使用L0phtCreack破解
I)使用hive文件获取系统密码Hash
J)使用WinlogonHack获取
V.检测方法
1.shellcode模糊检测
A)利用特定的编码方式检测
1)/x:类C语言的shellcode编码形式
2)/u:类javascript的shellcode编码形式
3)%u:类JavaScript的shellcode编码形式
4)%:多种脚本使用的shellcode编码形式
B)利用GetPC的特征来匹配shellcode
1)E80000000058方式GetPC
2)E8FFFFFFFFC258方式GetPC
3)D9EED97424F45B方式GetPC
C)利用动态函数获取编码来匹配shellcode
1)利用shellcode必须动态获取函数地址,以摆脱对宿主的环境要求的特点,针对动态获取函数地址的编码来进行检测
D)利用滑板指令来匹配shellcode
1)可以利用大量出现的滑板指令来匹配shellcode,例如0C0C0C0C,90909090,FFFFFFFF等经典滑板指令
2.恶意行为模糊检测
A)针对不应该出现的敏感库进行检测,如文档中如果出现ws2_32.dll就属于不正常的情况,可以针对性检测
B)针对不应该出现的敏感函数进行检测,如文档中如果出现申请内存,download等敏感操作,可以针对性进程检测
C)针对敏感对象以及字段进行检测,如果出现updata,autoopen一类敏感对象或字段,可以针对性进行检测
D)针对未知网址的检测,如果文档中出现非官方网址的未知网址,那么可以针对其进行针对性检测