翻译:金乌实验室
预估稿费:100RMB
投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿
传送门
【技术分享】探索基于Windows 10的Windows内核Shellcode(Part 1)
【技术分享】探索基于Windows 10的Windows内核Shellcode(Part 2)
【技术分享】探索基于Windows 10的Windows内核Shellcode(Part 4)
前言
这篇文章是Windows内核shellcode系列的第三篇,在这篇文章中我们探讨Cesar Cerrudo在2012年Black Hat上提出的三种方法中的最后一种方法—启用权限,我们专注于进程token中的权限。(本系列的第一篇文章探讨的是替换进程token,地址是链接;第二篇文章探讨的是清除ACL,地址是链接)。
分析
前两篇文章中使用的假设同样适用于本篇文章,即假设漏洞利用已获得任意内核模式代码执行,我们可以手动运行汇编代码。启用权限技术非常简单明了,但是应用却并不广泛。其理念是定位cmd.exe进程的token,或者是任何获得提升权限的进程,并修改已经启用的权限。
查看Token对象的结构,我们发现:
_SEP_TOKEN_PRIVILEGES结构位于offset 0x40处,正如Cesar所描述的。深入探查后我们发现:
仍然是完全相同的布局,因此可以得出这种技术的背景并没有改变。我们需要修改进程token中的offset 0x48,以启用所述进程的权限。
The Shellcode
我们用和前两次相同的方式开始,即从GS寄存器中找到KTHREAD,然后从KTHREAD的offset 0x220处找到EPROCESS:
我想启用parent进程的权限,也就是cmd.exe进程。当我从一个独立的二进制启动漏洞利用时,我找到了cmd.exe的EPROCESS。方法如该系列的第一篇文章中描述的那样,parent进程的PID位于EPROCESS中的offset 0x3E0处:
一旦我们找到了EPROCESS,我们就能在offset 0x358处找到指向token的指针,记住指针是一个快速引用,所以低4位应该被忽略。然后我们更改offset 0x48的值,以启用我们想要的所有权限:
运行shellcode,从whoami / all得到以下输出:
我们启用了很多权限,这里只列出了目前存在的权限。当我们启动子进程的时候,它继承了parent进程的权限,这意味着如果我们启动一个应用程序将代码注入到一个特权进程,例如winlogon.exe,我们可以创建一个新的SYSTEM integrity cmd.exe:
我们能够使用可用的权限做更多的事情。完整的汇编代码可以在GitHub上找到 (地址)。
结语
至此,这个系列的文章就完结了。总结一句话就是,Cesar Cerrudo在2012年提出的想法和技术,只要做一些修改,在2017年仍然适用。
传送门
【技术分享】探索基于Windows 10的Windows内核Shellcode(Part 1)
【技术分享】探索基于Windows 10的Windows内核Shellcode(Part 2)
【技术分享】探索基于Windows 10的Windows内核Shellcode(Part 4)