《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对快表没验证,所以就攻击快表咯)

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《揭秘家用路由器0day漏洞挖掘技术》是一本讲解家用路由器漏洞挖掘的技术书籍。这本书主要讲述了路由器漏洞的挖掘原理、方法和步骤,以及如何利用漏洞获取系统的管理员权限。 书中首先介绍了家用路由器的基本原理和工作模式,以及路由器的基本安全机制,包括密码验证、防火墙等,再讲述了路由器漏洞的基础知识,如堆栈溢出、格式化字符串漏洞等,为读者打下了扎实的理论基础。 接着,书中详细讲解了路由器漏洞的挖掘方法和技巧,包括静态分析、动态分析和Fuzzing技术,其中尤其强调了Fuzzing技术的重要性。Fuzzing技术是一种自动化的漏洞测试方法,通过向系统输入大量随机的无效数据,来寻找系统的漏洞,是现代漏洞挖掘技术中不可缺少的一部分。 最后,书中还分享了一些实用的漏洞利用技巧,如ROP链、GOT覆盖等,帮助读者能够深入理解漏洞利用的原理和方法,更好地应对各种复杂情况。 总的来说,《揭秘家用路由器0day漏洞挖掘技术》是一本非常实用的技术书籍,对于研究家用路由器安全的人员来说是一本不错的参考书。同时,对于网络安全爱好者,这本书也有很好的启发和帮助作用。 ### 回答2: 《揭秘家用路由器0day漏洞挖掘技术》是一份技术文档,主要介绍了基于路由器的0day漏洞挖掘技术和攻击方法。首先,文档介绍了路由器的基本结构和工作原理,包括路由器的硬件和软件组成,以及路由器的主要功能。其次,文档讲解了如何使用路由器的操作系统和开源工具进行漏洞分析和挖掘。最后,文档介绍了一些实际案例,包括路由器上的重大漏洞和针对路由器的攻击手段。 在文档中,作者重点介绍了路由器中常见的漏洞类型,包括缓冲区溢出、格式化字符串漏洞等,以及漏洞挖掘的一般方法。特别是在讲解缓冲区溢出漏洞时,作者详细地介绍了漏洞的原理、危害和检测方法,为有志于从事漏洞挖掘工作的安全研究员提供了有益的指导和参考。 除了讲解漏洞挖掘技术,文档还介绍了路由器中常见的攻击手段,如ARP欺骗、DNS劫持、端口扫描和DDoS攻击等。同时,文档也指出了如何通过安全配置和固件升级等方法来提高路由器的安全性。 总之,这份文档从技术方面全面详细地介绍了家用路由器的漏洞和攻击,为安全研究工作者提供了更深入的认识和了解,也提醒用户关注家用路由器的安全性。需要指出的是,本文档旨在为安全研究和教育提供帮助,对非法攻击行为不作任何支持或鼓励。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值