地狱怪客

将Write-Where内核攻击转化为任意写入攻击

文章地址:https://theevilbit.blogspot.com/2017/12/convert-write-where-kernel-exploits.html

2017年12月28日,星期四

将Write-Where内核攻击转化为任意写入攻击

这篇文章是我以前的帖子的后续:https :  //theevilbit.blogspot.hu/2017/11/turning-cve-2017-14961-ikarus-antivirus.html。我意识到我在那里使用的技术可以推广。

    1. 目前已知我们可以在大型会话池中创建PALETTE对象,我们可以泄漏他们的地址。
    2. 我们可以一个接一个地分配两个PALETTE对象,即使没有喷涂,它们也将足够接近(相距<0x1000000字节) – 这是来自我的测试,并且运行了很多次
    3. 如果我们有一个write-where漏洞(我们不能控制我们写的东西),我们可以通过修改cEntries字段中的1个字节来修改PALETTE对象的大小,唯一的要求是我们可以精确地设置位置,它应该是0以外的东西。我们将目标位置标记为**:
0:kd> dd fffff8cc44dc4000
fffff8cc`44dc4000 fe0809ec ffffffff 00000000 00000000
fffff8cc`44dc4010 26986580 ffffd687 00000501 ** 0003de
fffff8cc`44dc4020  0096f8aa 00000000 00000000 00000000
fffff8cc`44dc4030 00000000 00000000 00000000 00000000
fffff8cc`44dc4040 00000000 00000000 00000000 00000000
fffff8cc`44dc4050 00000000 00000000 00000000 00000000
fffff8cc`44dc4060 00000002 00000001 00000000 00000000
fffff8cc`44dc4070 00000000 00000000 44dc4088 fffff8cc
    1. 幸运的是,之前的7个字节和8个字节之后的字段并不那么重要,所以如果我们粉碎它们,我们不会导致BSOD,我们可以继续使用该对象。基本上 PALETTE结构中用红色(也在上面的memdump中)标记的以下字段不会导致问题,如果我们覆盖它们(之前或之后的任何东西都会导致BSOD):
 BASEOBJECT64 BaseObject; // 0x00
FLONG flPal; // 0x18
ULONG32 cEntries; // 0x1C
ULONG32 ulTime; // 0x20
HDC hdcHead; // 0x24 ULONG64 hSelected; // 0x28,
  1. 把这个字节修改为0以外的任何东西,我们将PALETTE的大小增加到大于4 * 0x1000000,这意味着如果我们在附近有另外一个字节(正如我们在步骤2中看到的那样),我们可以写信给它与超出界限的写道
  2. 我们覆盖第二PALETTE的pFirstColor指针指向我们原来的PALETTE的pFirstColor内存位置,从而实现了经典的GDI读/写原语 – >我们实现了任意的内核读/写

同样,这里的实际使用可以在这里看到:https :  //theevilbit.blogspot.hu/2017/11/turning-cve-2017-14961-ikarus-antivirus.html

如果我们有另一种类型的漏洞,我们可以在我们选择的内存位置递减/递增一个值,我们也可以达到同样的效果。我们将上面的字节(**)定位为递减或递增的目标,我们达到了相同的目的。

限制:

  • PALETTE本身,它不会超越Win10 RS3
  • 如果我们不能控制的写操作大于0x10字节,则不能使用,因为我们覆盖了会导致BSOD的其他字段
码字很辛苦,转载请注明来自人生在世《将Write-Where内核攻击转化为任意写入攻击》

评论