初学Windows内核漏洞利用(一):搭建实验环境 http://bbs.pediy.com/thread-218838.htm
初学Windows内核漏洞利用(二):熟悉HEVD http://bbs.pediy.com/thread-218868.htm
最近我刚刚开始学习Windows内核漏洞利用,因此决定以博客的形式分享一些我的学习心得。
之前的部分我介绍了如何搭建环境,现在我们将接触熟悉用于权限提升的载荷。
本部分我所用到的工具环境如下:
·在(1)和(2)中所描述的环境;
·nasm工具(下载网址:892K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3&6S2M7$3#2Q4x3X3g2#2M7#2)9J5c8R3`.`. );
·HxD工具(下载网址:236K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6E0K9q4)9J5k6r3&6W2P5s2g2K6i4K6u0W2k6r3g2Q4x3V1k6W2L8W2)9J5c8X3S2^5k6q4)9J5c8R3`.`. )。
回顾一下,我们的攻击目标是存在漏洞的驱动程序,我们将从用户层向其提交一段缓冲区数据。上一部分中,我们通过提交畸形的输入数据,成功触发了一些崩溃场景;然而我们的目标并不是破坏执行流程,而是通过精心构造输入来控制执行流程重定向到我们的代码中。
通常,传输载荷被用于提升攻击者应用程序的权限;而这可以通过窃取拥有更高权限的应用程序的访问凭证(关于访问凭证的具体含义,可参考相关维基百科,网址:b55K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6W2L8W2)9J5k6i4N6A6K9$3W2H3k6h3c8A6j5g2)9J5k6h3!0J5k6#2)9J5c8Y4N6A6K9$3W2Q4x3V1k6m8j5$3y4W2M7%4y4Q4y4h3k6@1L8$3E0W2L8R3`.`.)来实现。
查看访问凭证
系统中运行的每个进程都有其对应的EPROCESS数据结构,其中封装了所有与之相关的数据。该结构的完整定义,详见网址51eK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2F1K9i4u0K6L8$3k6@1i4K6u0W2L8X3g2@1i4K6u0r3K9$3g2J5L8X3g2D9i4K6g2X3M7%4c8J5N6h3y4@1i4K6u0r3N6X3W2K6N6r3q4Q4x3V1k6q4f1q4u0a6b7@1g2e0f1#2)9J5k6h3S2@1L8h3H3`.(EPROCESS数据结构在Windows操作系统的不同版本之间会有细微差别,更多信息参见网址efeK9s2c8@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结构的某些成员,比如PEB(Process Environment Block,进程环境块,具体含义可参考维基百科,网址:d29K9s2c8@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调试器来提升其权限。
首先,列举所有进程;然后,显示查看选定进程System和cmd的访问凭证;之后,将System进程的访问凭证复制到cmd进程内,在这个过程中为了保持引用计数不变我们需要使用相应的掩码;最终,cmd.exe提权成功。
窃取凭证的载荷
现在我们需要通过注入代码来重现以上过程;当然这并不简单,因为我们不能再借助WinDbg调试器了。
在官方的HEVD知识库中,提供了一些用于窃取凭证的载荷的完整例子,作为漏洞利用代码的一部分(网址:75bK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6Z5j5h3y4C8M7%4W2K6N6r3g2S2L8g2)9J5c8V1S2S2j5$3E0e0P5i4y4q4P5s2c8J5k6h3#2W2g2Y4g2D9L8X3g2J5j5h3u0D9k6f1c8J5K9i4k6W2M7W2)9J5c8X3u0D9L8$3u0Q4x3V1k6E0j5i4y4@1k6i4u0Q4x3V1k6q4P5s2m8D9L8$3W2@1i4K6u0r3f1r3q4&6L8r3!0S2k6s2y4Q4x3X3g2U0 )。
代码中所包含的所有载荷的目的是相同的,即窃取访问凭证;然而我们可以看到,为了适应特定的漏洞,它们之间有一点差别。它们的代码大部分是相同的,只有结尾不同(该部分被称之为“内核恢复桩程序”);这部分代码被用于进行必要的清理工作,以便在载荷部分执行完成返回之后,应用程序不会崩溃。
接着,我们看一个通用版本(网址:145K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6Z5j5h3y4C8M7%4W2K6N6r3g2S2L8g2)9J5c8V1S2S2j5$3E0e0P5i4y4q4P5s2c8J5k6h3#2W2g2Y4g2D9L8X3g2J5j5h3u0D9k6f1c8J5K9i4k6W2M7W2)9J5c8X3u0D9L8$3u0Q4x3V1k6E0j5i4y4@1k6i4u0Q4x3V1k6q4P5s2m8D9L8$3W2@1i4K6u0r3f1r3q4&6L8r3!0S2k6s2y4Q4x3X3g2U0i4K6t1K6e0o6p5^5y4R3`.`. ),具体代码如下图所示。
首先,我们必须找到EPROCESS结构的起始位置。使用WinDbg调试器这轻而易举,一条命令就可以显示该信息;现在,我们需要从其他的域来顺藤摸瓜,自己动手找到该结构的起始位置。
我们使用KPCR(Kernel Processor Control Region,内核处理器控制区域)结构作为起点,32位Windows操作系统上的FS寄存器(64位系统上则是GS寄存器)指向该结构。
上图中所述的代码利用了以下结构之间的关系:
KPCR(PrcbData)->KPRCB(CurrentThread)->KTHREAD(ApcState)->KAPC_STATE(Process)->KPROCESS
KPROCESS结构是EPROCESS结构的第一个域,如下图所示;因此,通过找到它我们最终找到了EPROCESS结构的起始位置。
当前进程的EPROCESS结构找到之后,我们将利用其另一个域来找到SYSTEM进程的EPROCESS结构,如下图所示。
LIST_ENTRY是双向链表的一个成员类型,该表将所有正在运行的进程连接到一起。该结构的具体定义如下图所示。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
地狱怪客 感谢!拿去学习了
地狱怪客 大佬问个问题,任意地址写0的漏洞能干吗呢 提权不行吧
木无聊偶 我没太明白您的问题,方便的话私信聊[em_20]
地狱怪客 额 就是挖到一些任意地址写0的漏洞,不知道能干嘛用... 大概就是这样 --->>> https://bbs.pediy.com/thread-223604.htm