安全漏洞--基于NDAY和0DAY漏洞免杀技巧

一 概念简介

     

        0day中的0表示zero,早期的0day表示在软件发行后的24小时内就出现破解版本,现在我们已经

        引申了这个含义,只要是在软件或者其他东西发布后,在最短时间内出现相关破解的,都可以叫

        0day。 0day是一个统称,所有的破解都可以叫0day。简而言之,0day就是代表还没有公开的漏

        洞,nday就是代表已经公开了的漏洞。漏洞开发者在利用0day和Nday时,除了在逃过windos的

        自身安全机制的基础上,不可避免的要接触到与杀软对抗的工作,就一般情况来看,如果针对特

        定的目标杀软还是有很大可能可以绕过,难点是通用所有的杀软。

        另外值得注意的一点,现今主流杀软很多,在通用的前提下,免杀工作往往占用很多时间。


        


二 构造POC


    2.1 构造POC

     

        要想利用一个漏洞,首先得构造一个POC样本,构造好的POC,会遭遇杀软的第一层防护,

        也就是经常说的静态查杀。

    2.2 必要工具


        MYCCL,VirTest。


    2.3 0day构造


        杀软容易检测的地方,比如:会被检测的堆喷代码或者0322中类似判断文件

        存在的这类代码,漏洞触发的经典字节码。
        重灾区:PE结构的嵌入。
        杀软认为危险的函数名或者一些二进制中能看到的字符串。

    2.4 Nday的构造


        漏洞爆出来时所用的代码已经被“黑名单”。

        一些杀软对二进制文件漏洞触发点检测很深入。

    2.5 0day 过静态


        宗旨:尽量让代码和二进制文件靠近“正常”或者“随机”。
        方法:加密,混淆,随机数据,压缩。

    2.6 Nday过静态


        最理想:通过另外一种方法或者类似方法去重新构造一个样本。
        一般时候:可通过前面提到的那些方法使杀软不认识这些文件或代码。


三 漏洞触发


    3.1 检测


        构造好POC后,运行起来的POC样本能不能过掉杀软正确的触发漏洞走到攻击者的代码,

        就是攻击者面临的杀软第二层保护。代表:EMET

    3.2 涉及点

       

        堆喷,GS栈保护,ROP,DEP,ASLR,HOOK

    3.3 堆喷技术
       

        有些时候攻击者不能预先知道自己的东西出现在什么地方的时候,就需要用到堆喷技术使

        恶意代码出现在一定的地址范围内,比如CALL EAX。现在杀软对堆喷都有一定的检测,

        所以在堆喷时必须注意一些地方。这里大概总结出了三个方面。

    3.4 堆喷地址

       

        杀软中的堆喷地址 。0x0c0c0c0c

        堆喷内容的检测。0x41414141

        堆喷方法的权衡。

       

        GS栈的保护机制->栈溢出


        原理图


       


        性能影响很大,需要编译时设置,只针对一些开发者认为比较重要的模块。


    3.5 系统流程

        _security_init_cookie

        save in _security_cookie

        _security_check_cookie

    3.6 Bypass  GS栈保护


        利用未被保护的内存突破GS 。
        基于改写函数指针的攻击,如C++虚函数攻击。
        针对异常处理机制的攻击。
        堆溢出没有保护。


    3.7 DEP
       

        DEP(Data Execution Prevention),分为硬件DEP和软件DEP,这里主要讨论软件DEP,DEP

        维基百科的解释:数据执行保护,简称“DEP”,英文全称为“Data Execution Prevention”,是

        一组在存储器上运行额外检查的硬件和软件技术,有助于防止恶意程序码在系统上运行。”

        对攻击者来说,自己的代码必然是通过外部的手段传进去的,所以经常用来放代码的方法,

        比如string,数组,在内存中是不可执行的内存页,也就是数据页,必然的,我们在漏洞触发

        后紧接着需要改变该内存的属性,这都是可以通过调用函数来实现的。
       

        利用函数:

        VirtualProtect,

        VirtualAlloc,                 

        NtSetInformationProcess。

        杀软中的DEP

        杀软在漏洞触发点对DEP的加固一般是通过hook相关函数来实现的,要绕过杀软保护一般情况下

        可以直接跳过hook代码或者调用更加底层的函数来实现。

        无杀软环境下:

 
       

        诺顿360环境下:

       


    3.8 ASLR


        ASLR的定义:“位址空间配置随机加载(英语:Address space layout randomization (ASLR)),

        又称为位址空间布局随机化,是指利用随机方式配置资料位址。一般现代操作系统中都加设这一

        机制,以防范恶意程式对已知位址进行攻击。”
       

       ASLR通俗的讲就是伪随机化模块加载地址,这项安全技术主要针对的是ROP,因为ROP是通

        过人为的构造,如果要用到的代码在内存中的地址是随机的,那么ROP的部署将不再是那么容易的。
        在杀软中的ASLR在win7中的ASLR在每次重启后,加载地址会有一定随机的变化,但是在杀软中加

        载地址的随机性更高一些。

    3.9 ROP
    

        这里有必要对ROP进行简单介绍,ROP全称是返回导向编程,其字面概念比较晦涩,下面给

        出一个图解释一下简单的ROP:


       



        所以ROP是为了突破DEP+ASLR环境。


四 shellcode


    4.1 杀软


        对于主流杀软来说,当漏洞已经成功触发走到攻击者的代码,也就是shellcode时,也许真正的

        免杀工作才刚刚开始。
                                     核心点                      

        


    4.2 举例


        现今杀软对于漏洞触发后的行为检测有一些参差不齐的水平。行为检测的比较好的杀软代表:

        卡巴斯基(卡巴),比特梵德(bit)。卡巴和bit检测都是在驱动级上,如果想深入了解其行为检测

        的细节,需要逆向其驱动。

    4.3 行为查杀

       

       这个是一项很笼统的概念,并没有明确规定孰是孰非,而且不同杀软行为查杀的能力也不同,但

      是核心思想是扰乱行为和拆分行为,这里举一些例子来说明。

    4.4 例1


        文档类漏洞中查找文件handle,伪代码如下

              add HANDLE,4
              …push  0x2014
              …CALL SetFilePointer//设置对应句柄读取位置为特定位置
              …CALL ReadFile    //读取我们设置好的标志。

        正常代码中不会存在挨个打开handle去读其中内容的操作。

        解决办法:拆分行为

    4.5 例2


        漏洞的一般流程:释放文件,执行文件

       

                 


        拆分行为,比如:省去其中一步;分开这些步骤(没有验证)

        扰乱行为,比如:伪装调用失败;进入函数的方式;dll加载时…


五 返回空间


    5.1 EMET



        返回进程空间是漏洞的最后一步,也就是经常所说的完美退出,一般情况下如果完美恢复堆栈

        和寄存器,这步操作是不会受到杀软的阻挡的,但也有例外,比如覆盖异常。覆盖异常会碰到

        一些针对该攻击的安全手段,SEHOP,SAFESEH。这个情况主要是针对EMET来说。


       


    5.2 SAFESEH


        SAFESEH由于需要编译支持,而且杀软上一般是没有相关设置,要想逃过这个机制只需要有可执行的

        堆上的代码就可以绕过,就不阐述了。

    5.3 SEHOP特点


        SHE  handler必须指向non-SafeSEH module

        内存页必须可执行

        SHE链表不应被篡改,并且位于链表末端的SHE结构必 须为特定值

        (next SHE指针值为0xFFFFFFFF, SHE handler也必须为一特定值)

        所有的SHE结构必须为4-byte对齐

        最后一个SHE结构的handler必须正确指向ntdll中的ntdll!FinalExceptionHandler例程

        所有SHE指针必须指向栈中。

    5.4 Bypass SEHOP
            

        如果遇到SEHOP,而又要必须用到覆盖异常攻击时,只有一条路可走,就是构造一个伪造的SHE异

        常处理链表。
      

六 资料参考


        POC 
        http://baike.baidu.com/item/POC%E6%B5%8B%E8%AF%95


        ASLR 
        http://baike.baidu.com/item/aslr


        DEP 
        http://baike.baidu.com/item/DEP/7694630


        Bypass
        http://blog.csdn.net/apxar/article/details/10366649


        shellcode
        http://shell-storm.org/


        EMET
        https://www.microsoft.com/en-us/download/details.aspx?id=54265


  

你可能感兴趣的:(漏洞学习,二进制,安全札记,技术文章,网络安全与恶意代码)