首页
社区
课程
招聘
[翻译]初学Windows内核漏洞利用(三):窃取访问凭证
发表于: 2017-7-3 22:47 6645

[翻译]初学Windows内核漏洞利用(三):窃取访问凭证

2017-7-3 22:47
6645

初学Windows内核漏洞利用(一):搭建实验环境  http://bbs.pediy.com/thread-218838.htm

初学Windows内核漏洞利用(二):熟悉HEVD      http://bbs.pediy.com/thread-218868.htm


最近我刚刚开始学习Windows内核漏洞利用,因此决定以博客的形式分享一些我的学习心得。

之前的部分我介绍了如何搭建环境,现在我们将接触熟悉用于权限提升的载荷。

本部分我所用到的工具环境如下:

·在(1)和(2)中所描述的环境;

·nasm工具(下载网址:bcaK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3&6S2M7$3#2Q4x3X3g2#2M7#2)9J5c8R3`.`. );

·HxD工具(下载网址:bebK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6E0K9q4)9J5k6r3&6W2P5s2g2K6i4K6u0W2k6r3g2Q4x3V1k6W2L8W2)9J5c8X3S2^5k6q4)9J5c8R3`.`. )。

回顾一下,我们的攻击目标是存在漏洞的驱动程序,我们将从用户层向其提交一段缓冲区数据。上一部分中,我们通过提交畸形的输入数据,成功触发了一些崩溃场景;然而我们的目标并不是破坏执行流程,而是通过精心构造输入来控制执行流程重定向到我们的代码中。

通常,传输载荷被用于提升攻击者应用程序的权限;而这可以通过窃取拥有更高权限的应用程序的访问凭证(关于访问凭证的具体含义,可参考相关维基百科,网址:ceeK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6W2L8W2)9J5k6i4N6A6K9$3W2H3k6h3c8A6j5g2)9J5k6h3!0J5k6#2)9J5c8Y4N6A6K9$3W2Q4x3V1k6m8j5$3y4W2M7%4y4Q4y4h3k6@1L8$3E0W2L8R3`.`.)来实现。

查看访问凭证

系统中运行的每个进程都有其对应的EPROCESS数据结构,其中封装了所有与之相关的数据。该结构的完整定义,详见网址f9fK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2F1K9i4u0K6L8$3k6@1i4K6u0W2L8X3g2@1i4K6u0r3K9$3g2J5L8X3g2D9i4K6g2X3M7%4c8J5N6h3y4@1i4K6u0r3N6X3W2K6N6r3q4Q4x3V1k6q4f1q4u0a6b7@1g2e0f1#2)9J5k6h3S2@1L8h3H3`.EPROCESS数据结构在Windows操作系统的不同版本之间会有细微差别,更多信息参见网址fecK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2Y4k6h3!0X3k6X3y4Z5j5i4m8H3k6h3I4D9i4K6u0W2j5$3!0E0i4K6u0r3M7%4c8#2k6r3W2W2M7#2)9J5c8Y4N6A6L8X3c8G2N6%4y4Q4x3V1k6C8L8g2)9J5c8X3&6@1L8%4y4C8M7X3&6D9i4K6u0r3M7%4c8J5N6h3y4@1M7#2)9J5c8X3g2H3M7X3!0U0k6i4y4K6i4K6u0r3K9h3&6V1k6i4S2Q4x3X3g2Z5N6r3@1`. )。EPROCESS结构的某些成员,比如PEBProcess Environment Block,进程环境块,具体含义可参考维基百科,网址:6f8K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6W2L8W2)9J5k6i4N6A6K9$3W2H3k6h3c8A6j5g2)9J5k6h3!0J5k6#2)9J5c8Y4N6A6K9$3W2Q4x3V1k6b7M7X3!0U0k6i4y4K6i4K6g2X3c8h3&6$3K9i4u0G2L8X3#2W2L8Y4c8Q4y4h3k6n7L8r3!0U0K9H3`.`. ),用户模式下即可访问;而另一些,比如所提到的访问凭证,只能在内核模式下访问。我们可以通过如下命令,使用WinDbg调试器查看EPROCESS结构的所有域成员,结果如下图所示。

可见,结构起始位置到域成员Token的偏移为0xF8

    通过使用如下命令,让我们查看凭证中所包含类型的细节,结果如下图所示。

凭证存储于一个联合结构体_EX_FAST_REF中,其有两个域成员:RefCnt(引用计数)和Value。我们只对替代Value感兴趣;出于应用程序的稳定性考虑,最好不要改变引用计数。

现在,让我们查看被调试方主机上运行的某些应用程序的凭证。我们可以使用如下命令来列举进程:

示例

结果如下图所示。


图中所示的第一列,是对应于特定进程的EPROCESS结构首地址。

现在,使用图中的地址,我们可以通过如下命令来发现更多选定进程相关的细节:

在如下图所示的各个域成员之中,我们可以看到访问凭证。


通过如下命令,我们还可以在更低层次上查看凭证的具体内容:

命令执行结果如下图所示。


或者使用如下命令:

结果如下图所示。


从上面的结果我们可以看出,!process命令会自动应用掩码,并从显示信息中过滤引用计数;我们可以通过使用最右3比特置零的掩码,在如下表达式求值的帮助下,人工实现相同的功能:

结果如下图所示。


通过WinDbg调试器窃取访问凭证

作为练习,我们将在被调试方主机运行cmd.exe,并在调试方主机使用WinDbg调试器来提升其权限。

首先,列举所有进程;然后,显示查看选定进程Systemcmd的访问凭证;之后,将System进程的访问凭证复制到cmd进程内,在这个过程中为了保持引用计数不变我们需要使用相应的掩码;最终,cmd.exe提权成功。

窃取凭证的载荷

现在我们需要通过注入代码来重现以上过程;当然这并不简单,因为我们不能再借助WinDbg调试器了。

在官方的HEVD知识库中,提供了一些用于窃取凭证的载荷的完整例子,作为漏洞利用代码的一部分(网址:5d8K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6Z5j5h3y4C8M7%4W2K6N6r3g2S2L8g2)9J5c8V1S2S2j5$3E0e0P5i4y4q4P5s2c8J5k6h3#2W2g2Y4g2D9L8X3g2J5j5h3u0D9k6f1c8J5K9i4k6W2M7W2)9J5c8X3u0D9L8$3u0Q4x3V1k6E0j5i4y4@1k6i4u0Q4x3V1k6q4P5s2m8D9L8$3W2@1i4K6u0r3f1r3q4&6L8r3!0S2k6s2y4Q4x3X3g2U0 )。

代码中所包含的所有载荷的目的是相同的,即窃取访问凭证;然而我们可以看到,为了适应特定的漏洞,它们之间有一点差别。它们的代码大部分是相同的,只有结尾不同(该部分被称之为“内核恢复桩程序”);这部分代码被用于进行必要的清理工作,以便在载荷部分执行完成返回之后,应用程序不会崩溃。

接着,我们看一个通用版本(网址:b32K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6Z5j5h3y4C8M7%4W2K6N6r3g2S2L8g2)9J5c8V1S2S2j5$3E0e0P5i4y4q4P5s2c8J5k6h3#2W2g2Y4g2D9L8X3g2J5j5h3u0D9k6f1c8J5K9i4k6W2M7W2)9J5c8X3u0D9L8$3u0Q4x3V1k6E0j5i4y4@1k6i4u0Q4x3V1k6q4P5s2m8D9L8$3W2@1i4K6u0r3f1r3q4&6L8r3!0S2k6s2y4Q4x3X3g2U0i4K6t1K6e0o6p5^5y4R3`.`. ),具体代码如下图所示。


首先,我们必须找到EPROCESS结构的起始位置。使用WinDbg调试器这轻而易举,一条命令就可以显示该信息;现在,我们需要从其他的域来顺藤摸瓜,自己动手找到该结构的起始位置。

我们使用KPCRKernel Processor Control Region,内核处理器控制区域)结构作为起点,32Windows操作系统上的FS寄存器(64位系统上则是GS寄存器)指向该结构。

上图中所述的代码利用了以下结构之间的关系:

KPCRPrcbData->KPRCBCurrentThread->KTHREADApcState->KAPC_STATEProcess->KPROCESS

KPROCESS结构是EPROCESS结构的第一个域,如下图所示;因此,通过找到它我们最终找到了EPROCESS结构的起始位置。


当前进程的EPROCESS结构找到之后,我们将利用其另一个域来找到SYSTEM进程的EPROCESS结构,如下图所示。

LIST_ENTRY是双向链表的一个成员类型,该表将所有正在运行的进程连接到一起。该结构的具体定义如下图所示。


[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 1
支持
分享
最新回复 (7)
雪    币: 341
活跃值: (153)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
2
感谢!拿去学习了
2017-12-28 14:25
0
雪    币: 1784
活跃值: (512)
能力值: ( LV12,RANK:310 )
在线值:
发帖
回帖
粉丝
3
地狱怪客 感谢!拿去学习了
客气,加油!
2017-12-28 18:03
0
雪    币: 341
活跃值: (153)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
4
大佬问个问题,任意地址写0的漏洞能干吗呢  提权不行吧
2017-12-28 18:32
0
雪    币: 300
活跃值: (2772)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
mark
2017-12-28 21:41
0
雪    币: 1784
活跃值: (512)
能力值: ( LV12,RANK:310 )
在线值:
发帖
回帖
粉丝
6
地狱怪客 大佬问个问题,任意地址写0的漏洞能干吗呢 提权不行吧
我没太明白您的问题,方便的话私信聊
2017-12-29 19:32
0
雪    币: 341
活跃值: (153)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
7
木无聊偶 我没太明白您的问题,方便的话私信聊[em_20]
额  就是挖到一些任意地址写0的漏洞,不知道能干嘛用...
大概就是这样    --->>>  https://bbs.pediy.com/thread-223604.htm
2018-1-3 11:08
0
雪    币: 1784
活跃值: (512)
能力值: ( LV12,RANK:310 )
在线值:
发帖
回帖
粉丝
8
地狱怪客 额 就是挖到一些任意地址写0的漏洞,不知道能干嘛用... 大概就是这样 --->>> https://bbs.pediy.com/thread-223604.htm
我具体研究一下,尽快给您回复
2018-1-3 18:07
0
游客
登录 | 注册 方可回帖
返回