您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 不借助ROP_JIT绕过DEP_ASLR方法的分析
不借助ROP/JIT绕过DEP/ASLR方法的分析2013/9/12攻防实验室桂加睿主要内容:议题背景Xcon2013Windows溢出保护原理与绕过方法概览基于SharedUserData的绕过方法利用UAF获取执行流程的控制漏洞的利用及演示总结与启发议题背景Xcon2013•这次会议主要围绕系统安全及网络安全,涉及漏洞挖掘、病毒木马检测、渗透测试、工业控制安全等四个方面的探讨和研究。•TombKeeper介绍一种通过直接调用SharedUserData数据区函数指针绕过Windows系统ASLR和DEP内存保护机制的漏洞利用方法。该方法对x64版Windows7和Vista有效,适用于绝大多数UseAfterFree、VtableOverflow类漏洞。《一种不依赖于ROP和JIT的漏洞利用方法》•潜伏鹰介绍反封锁、反追踪、反监听、反检测、按需服务的“无痕-2A”反追踪支援平台。在“反封锁接入”、“反监听截获”、“按需路由”和“抗毁进化”等方面进行了有益的探索。《“无痕-2A”反追踪支援平台的设计与改进》XCon2013安全焦点信息安全技术峰会主要内容:议题背景Xcon2013Windows溢出保护原理与绕过方法概览基于SharedUserData的绕过方法利用UAF获取执行流程的控制漏洞的利用及演示总结与启发Windows溢出保护原理与绕过方法概览•在经典的栈溢出模型中,通过覆盖函数的返回地址来达到控制程序执行流程(EIP寄存器),Call/JMPESP跳回堆栈执行。•从WindowsXPSP2开始,windows利用CPU提供的不可执行位(XN),实现了数据执行保护(DataExecutionPrevention),引入DEP之后,堆、栈上的内存页属性默认不再具有可执行属性,常用的绕过DEP的技术是ROP。•从WindowsVista起,Windows操作系统开始引入ASLR,ASLR使得加载程序时不再使用固定的加载基地址加载。这一方法使程序和模块在内存中的加载位置变得难以预测,使ROP这样的技术难以实施。•GS、SafeSEH、SafeUnlinking、HeapCookie、DEP、ASLR、SEHOPWindows漏洞及对抗攻击未启用ASLR的模块堆喷射(HeapSpray)技术覆盖部分返回地址JavaAppletSprayJITSprayTombKeeper提出的基于SharedUserData的方法Windows溢出保护原理与绕过方法概览常用的绕过ASLR的方法ASLR(地址空间布局随机化)技术的主要功能是通过对系统关键地址的随机化,防止攻击者在堆栈溢出后利用固定的地址定位到恶意代码并加以运行。主要内容:议题背景Xcon2013Windows溢出保护原理与绕过方法概览基于SharedUserData的绕过方法利用UAF获取执行流程的控制漏洞的利用及演示总结与启发基于SharedUserData的绕过方法利用SharedUserData-SystemCall执行系统调用从WindowsNT4到Windows8,SharedUserData的位置一直固定在地址0x7ffe0000上。从WRK源代码中nti386.h以及ntamd64.h可以看出:#defineMM_SHARED_USER_DATA_VA0x7FFE0000基于SharedUserData的绕过方法利用SharedUserData-SystemCall执行系统调用SharedUserData的数据结构可以在WRK源代码ntexapi.h中找到,名称是“_KUSER_SHARED_DATA”,结构定义如下:typedefstruct_KUSER_SHARED_DATA{…..ULONGLONGTestRetInstruction;ULONGSystemCall;ULONGSystemCallReturn;ULONGLONGSystemCallPad[3];ULONGWow64SharedInformation[MAX_WOW64_SHARED_ENTRIES];}KUSER_SHARED_DATA,*PKUSER_SHARED_DATA;基于SharedUserData的绕过方法利用SharedUserData-SystemCall执行系统调用在Windbg中用dt命令查看当前系统的dt_KUSER_SHARED_DATA0x7ffe0000基于SharedUserData的绕过方法利用SharedUserData-SystemCall执行系统调用SharedUserData-SystemCall的地址未被ASLR始终位于0x7ffe0300,在32位WindowsVista、Windows7、WindowsServer2008上,可以直接调用该指针执行系统调用。dt_KUSER_SHARED_DATASystemCall0x7ffe0000ufpoi(0x7ffe0300)基于SharedUserData的绕过方法利用SharedUserData-SystemCall执行系统调用反汇编NtUserLockWorkStation函数,发现其就是通过7ffe0300进入内核其中11E6是NtUserLockWorkStation的服务号(ShadowSSDT中0x01E6的服务),通过Xuetr可以看到基于SharedUserData的绕过方法利用SharedUserData-SystemCall执行系统调用如果通过某个漏洞,可以调用0x7ffe0300,并给eax传递合适的系统调用号,就可以实现执行系统调用。这样,在触发漏洞前合理布局寄存器内容,用函数在系统服务(SSDT/ShadowSSDT)中服务号填充EAX寄存器,然后让EIP跳转到对应的地方去执行,就可以调用指定的函数了。但是也存在很大的局限性:仅仅工作于x86Windows上;几乎无法调用有参数的函数。直接执行SharedUserData-SystemCall这一方法显然不受DEP和ASLR的影响。但这个方法难以传递调用参数,因而仅能执行类似NtUserLockWorkStation这样无需传递参数的系统调用,所以该方法造成的威胁可能仅具有理论意义。基于SharedUserData的绕过方法利用SharedUserData-WowSharedInformation在64位Windows系统上SystemCall的值为NULL,因为系统不再通过该指针实现系统的调用这是64位系统上的32位进程执行系统调用的情况基于SharedUserData的绕过方法利用SharedUserData-WowSharedInformation在64位的windows上,SharedUserData的地址仍然固定在0X7FFE0000,但不再包含有效的SystemCall指针,为了实现32位兼容,64位windows的SharedUserData里的WowSharedInformation中会包含一些有效的函数指针。基于SharedUserData的绕过方法利用SharedUserData-WowSharedInformationSharedUserData-WowSharedInformation的地址未被ASLR,始终位于0X7FFE0340,在64位WindowsVista、Windows7、WindowsServer2008上的32进程中,可以直接调用WowSharedInformation中的LdrHotPatchRoutine的函数指针,加载位于本地或UAC路径上的动态链接库。绝大多数释放后重利用的(UAF,Use-After-Free)漏洞都可以使用这种方法。在wow64t.h中可以看到WowSharedInformation的枚举类型typedefenum_WOW64_SHARED_INFORMATION{SharedNtdll32LdrInitializeThunk,SharedNtdll32KiUserExceptionDispatcher,SharedNtdll32KiUserApcDispatcher,SharedNtdll32KiUserCallbackDispatcher,SharedNtdll32LdrHotPatchRoutine,SharedNtdll32ExpInterlockedPopEntrySListFault,SharedNtdll32ExpInterlockedPopEntrySListResume,SharedNtdll32ExpInterlockedPopEntrySListEnd,SharedNtdll32Reserved2,Wow64SharedPageEntriesCount}WOW64_SHARED_INFORMATION;基于SharedUserData的绕过方法利用SharedUserData-WowSharedInformationLdrHotPatchRoutine会调用ntdll.LdrLoadDll加载动态库NTSTATUSLdrLoadDll(PWSTRszcwPath,PDWORDpdwLdrErr,PUNICODE_STRINGpUniModuleName,PHINSTANCEpResultInstance);基于SharedUserData的绕过方法利用SharedUserData-WowSharedInformationLdrHotPatchRoutine函数的原型VoidLdrHotPatchRoutine(struct*HotPatchBuffer);HotPatchBuffer结构的定义typedefstruct_HotPatchBuffer{ULONGNotSoSure01;//&0X20000000!=0ULONGNotSoSure02;USHORTPatcherNameOffset;//结构体相对偏移地址USHORTPatcherNameLen;USHORTPatcheeNameOffset;USHORTPatcheeNameLen;USHORTUnknownNameOffset;USHORTUnknownNameLen;}HotPatchBuffer,*PHotPatchBuffer;只需要构造合适的HotPatchBuffer作为参数传递给LdrHotPatchRoutine,代码就会用LdrLoadDll加载PatcherNameOffset和PatcherNameLen指定路径的动态链接库。路径可以是本地路径,也可以是UNC路径。基于SharedUserData的绕过方法•演示1利用SharedUserData-WowSharedInformation基于SharedUserData的绕过方法利用SharedUserData-WowSharedInformation对于绝大多数Use-After-Free和VTable-Overflow等类型的漏洞来说,获取执行流程控制的那部分代码通常都是先将虚表指针入栈,然后调用表中函数指针。如果在内存中构造出有效的HotPatchBuffer,并将其第一成员设置成为相对0X7FFE0350的合适偏移,把HotPatchBuffer的指针作为虚表指针传入执行流程,就可以利用代码既有流程执行LdrHotPatchRoutine函数。此方法通常需要HeapSpray协助布局内存数据;且需要文件共享服务器存放恶意DLL;只工作于64位系统上的32位应用程序。直接执行SharedUserData-WowSharedInformation.LdrHotPatchRoutine这一方法不受DEP和ASLR的影响,甚至不需要Shellcode,有时也不需要HeapSpray,对于IE,FireFox,AdobeReader,AdobeFlash,MSOffice等各种软件都使用。主要内容:议题背
本文标题:不借助ROP_JIT绕过DEP_ASLR方法的分析
链接地址:https://www.777doc.com/doc-1228953 .html