zoukankan      html  css  js  c++  java
  • 《0day安全:软件漏洞分析技术》的一点总结

    评价

    1. 首先评价一下这本书吧:(先抑后扬吧)
      有些漏洞是win2000的,实在是太老了,难以进行实践,但是介绍一下也是很好的,但是不能实践理解得不深刻。【第一版是08年出版的,第二版是2011年,我手上的是第二版,这2014年,xp都停止服务啦(xp用着还是挺爽的哦)】
    2. 从基础的漏洞利用原理,到漏洞挖掘的技术(其实基本都是举例子),到内核,最后接近10个分析案例,相对来说还是比较全面的了,在基础知识方面,讲得挺好的,图文并茂

    软件安全的漏洞类型

    • 栈溢出漏洞
    • 堆溢出漏洞
    • 释放后重用
    • 双重释放
    • 整数溢出漏洞
    • 字符串格式化漏洞
    • 拒绝服务漏洞
    • 竞争条件漏洞
    • 资源未释放漏洞
    • 数组越界访问
    • 类型混淆
    • ……

    其实0day2里面主要讲的是栈溢出和堆溢出,提了一下字符串格式化漏洞,其他的基本没有吧
    栈溢出应该是最为简单的一个漏洞类型,相对容易理解

    还有就是里面有一篇有关内核漏洞,也看看分类吧

    按照漏洞的严重程度分类
    - 远程拒绝服务漏洞
    - 本地拒绝服务漏洞
    - 远程任意代码执行漏洞
    - 本地权限提升漏洞

    我感觉本地拒绝服务是严重程度是最低的,之后才是远程拒绝服务

    按照漏洞的利用原理分类
    - 拒绝服务漏洞
    - 缓冲区溢出漏洞
    - 内存篡改漏洞
    - - 任意地址写任意数据
    - - 固定地址写任意数据
    - - 任意地址写固定数据
    - 设计缺陷

    既然说到内核,看看书里面内核漏洞利用的思路:
    一种是篡改内核内存数据
    另外一种是执行Ring0 Shellcode(推荐的是这种)
    因为我们需要用Ring0 Shellcode将CR0的WP标志位置0了,进而禁用了内存保护,我们才能够篡改内核内存数据

    windows提权怎么实现的?

    其实windows系统的提权就是将当前进程EPROCESS的token值覆盖为system的token值,这样就完成了提权,shellcode的作用便是如此

    Windows的安全机制

    面对形形色色的内存攻击,微软加入了什么样的安全机制呢

    • GS编译,就是Security Cookie
    • SafeSEH(Safe Structured Exception Handling)安全的结构化异常处理(增加了安全的校验机制)
    • DEP(Data Execution Prevention)数据执行保护
    • ASLR(Address Space Layout Randomization)地址空间布局随机化
    • SEHOP(Structured Exception Handling Overwrite Protection )SEH覆盖保护

    栈溢出漏洞的利用

    1. 最经典的就是覆盖返回地址
    2. 覆盖SEH结构
    3. 覆盖虚表指针
    4. 堆喷射(Heap Spray)
    5. offset by one(就是部分覆盖)

    还有的话就是特定的常见会有特定的思路
    或许你修改了栈上的一个变量的地址,或许会改变程序执行流程什么的,获取它是一个函数指针呢

    堆溢出漏洞的利用

    1. DWORD SHOOT
      其实就是利用这个下一个空闲的堆块从链表卸下时会有一次写的机会
      因为前向指针和后向指针都被我们覆盖了

    公式如下:
    node->blink->flink = node->flink
    node->flink->blink = node->blink

    假如flink被覆盖shellcode地址,blink被覆盖为SEH的处理程序的地址
    那么
    SEH的处理程序的地址 = shellcode的地址
    shellcode地址+4的位置 = SEH的处理程序的地址

    其实这样可能会影响shellcode的,因为shellcode的第4-8个字节被改了,当然我们前面的字节一般是nop,如果改了之后不影响shellcode的执行才行

    这DWORD的任意地址写任意地址写任意数据还可以写哪里呢
    可能可以覆盖接下来要调用的虚函数表中的某个虚函数呢

    当然如果linux直接就覆盖got表了

    绕过Windows的安全机制

    GS

    因为GS为每个函数的调用增加了一些额外的数据和操作,这会影响性能,所以并不是每个函数都会应用GS,不会应用GS的情况如下:
    - 不包含缓冲区的函数
    - 函数被定义为具有变量参数列表的
    - 使用无保护的关键字标记的(但是这个关键字是什么呢)
    - 函数的第一个语句中包含内嵌汇编代码的
    - 缓冲区不是8字节类型且大小不大于4字节

    1.利用未被保护的内存突破GS

    就是你的攻击点是攻击没被保护的函数,假如他们有漏洞就好,没漏洞能不能将漏洞转移到这呢,这是一个问题

    2.覆盖虚函数突破GS

    假如我们攻击的函数在复制之后,有这个虚函数的调用,那么假如覆盖了栈上的虚表数指针,就可以在gs检测之前劫持程序(0day里面是使用部分覆盖,由于作者使用的是静态字符,跟虚表都在.rdata段,但利用起来还是会出些问题)

    3.攻击异常处理突破GS

    当然这也是在复制覆盖SEH后,函数还调用了某些因为覆盖了某些变量导致触发异常处理的操作

    4.同时替换栈中和.data段中Cookie突破GS

    这个其实很难做到吧(就算有任意地址写,你要知道他在data段的,之后你还要有机会利用溢出),0day里面其实都是写死了,提前将buf跟data段Cookie的距离都给计算出了

    SafeSEH

    在书中的那个图中,我们怎么可以通过SafeSEH的安全验证呢?
    - 异常处理函数位于加载模块的内存范围之外,DEP关闭
    - 异常处理函数位于加载模块的内存范围之内,相应模块未启用SEH(安全SEH表为空),同时还要不是纯IL(IL是.NET框架中中间语言(Intermediate Language)的缩写),根据图的话DEP也是要关掉
    - 内存范围之内但启用了SafeSEH(安全SEH表不为空),异常处理函数包含在安全SEH表中

    其实有时候作者说的某些方法并不算绕过,拿SafeSEH来说,其实是不攻击SEH
    比如:
    攻击返回地址绕过SafeSEH
    攻击虚函数绕过SafeSEH

    我们看看实际一点的:
    1. 从堆中绕过SafeSEH:利用的是SafeSEH对堆的特殊处理,作者说看成是普通的SafeSEH(当然DEP要关闭咯)
    2. 利用未启用SafeSEH模块绕过SafeSEH(可以用OllySSEH插件查看)
    3. 利用加载模块之外的地址绕过SafeSEH(类型为Map的映射文件,SafeSEH是无视他们的,加入在里面找到跳板就很好了)
    4. 利用Adobe Flash Player ActiveX控件绕过SafeSEH(Adobe Flash Player 9.2.124之前的版本不支持SafeSEH),当然如果有其他的没有启用的ActiveX插件也是可以的哦

    DEP

    1. 攻击未启用DEP的程序(这个也算不上绕过…)
    2. 利用Ret2Libc挑战DEP
      • 比如通过传递特定的参数给ZwSetInformationProcess关闭DEP【第一个参数为进程的句柄,设置为−1 的时候表示为当前进程,第二个参数为信息类 —– 0x22,第三个参数可以用来设置_KEXECUTE_OPTIONS —- 0x2,第四个参数为第三个参数的长度 — 0x4】,之后就随便搞咯,但其实系统里面本来就存在关闭DEP的代码,不用我们构造参数,^_^
      • 返回到VirtualProtect,申请一段可执行的内存

      • BOOL VirtualProtect(
        LPVOID lpAddress, // region of committed pages
        SIZE_T dwSize, // size of the region
        DWORD flNewProtect, // desired access protection
        PDWORD lpflOldProtect // old protection
        );
    3. 利用可执行内存挑战DEP(假如我们能将shellcode复制到哪个区域,之后将EIP指向哪里就行了)
    4. 利用.NET挑战DEP(需要ActiveX有溢出漏洞,.net控件包含shellcode和触发ActiveX控件溢出漏洞的POC页面)
    5. 利用java applet挑战DEP(跟上面差不多,差别就是java applet含有shellcode)

    ASLR

    1. 攻击未启用ASLR的模块
    2. 利用部分覆盖定位内存(因为32位随机化的是前两个字节)
    3. 利用Heap spray技术定位内存地址
    4. 利用Java applet heap spray技术定位内存地址
    5. 为.NET控件禁用ASLR

    SEHOP

    1. 利用未启用SEHOP的模块
    2. 伪造SEH链表(FFFFFFFF是最后一项标识符)

    堆的保护机制

    堆保护方式:
    1. PEB random:dword shoot写内存,覆盖PEB指针,加入随机化了就不行了
    2. Safe Unlink:验证当前堆块的下一个堆块的前向指针和前一个堆块的后向指针是否指向当前堆块
    3. heap cookie:跟栈的GS类似,cookie放在segment table处,占一个字节
    4. 元数据加密:块首一些重要元素与一个4字节的随机数进行异或运算,使用时再异或回来,我们就不能直接破坏或改写这些数据了

    绕过
    1. 利用chunk重设大小攻击堆(利用申请新的内存的时候的一次写的机会)
    2. 利用Lookaside表进行堆溢出(Safe Unlink对快表没验证,所以就攻击快表咯)

  • 相关阅读:
    redis 数据迁移
    redis
    Redis集群的三种模式
    Golang 协程 (goroutine) 与通道 (channel)
    Python生成器next方法和send方法区别
    python 文件
    Tornado 异步以及非阻塞的I/O
    python 多进程和多线程3 —— asyncio
    利用CSS改变图片颜色的100种方法!
    jquery获取div的位置
  • 原文地址:https://www.cnblogs.com/cnsec/p/13286515.html
Copyright © 2011-2022 走看看