-
-
[原创] #30天写作挑战#在内核中利用Token实现提权
-
发表于: 2020-9-13 01:01 13577
-
在开始之前,我们需要知道两个内核重要的数据结构
_EPROCESS
是一个用来描述系统进程的内核结构体(或者说每一个运行在系统上的进程都有一个储存在内核中的某个地方的被称为描述符的_EPROCESS
结构体和它相对),它包含了诸如进程映像名,运行在哪一个桌面会话中,打开了多少个内核对象的句柄,token的访问权限......之类的信息。
在WinDBG中使用
可以查看该结构体的内容。
_TOKEN
是一个描述进程安全上下文的内核数据结构,包含了诸如进程token的等级,登陆id,会话id,token的类型......之类的信息。
下面介绍下如何使用上述两个结构体来把一个中等权限进程提升到system权限。
一种内核提权的方式是使用高权限等级的token替换低权限等级的token,下面列出一些关键操作。
下面尝试用一个图直观地表示上面描述的过程:
下面是个使用上述命令获取当前运行在此计算机的进程截图,高亮部分是指向所属进程的_EPROCESS
结构体。
下面运行一个powershell(使用非管理员权限)并且查看它的进程id(pid):
使用下面命令获取pid为2780(0xadc)的powershell进程的信息:
从下图可看到我们的powershell.exe进程信息,_EPROCESS
在ffff8c0ab3e77080地址处:
找到powershellcode进程的_EPROCESS
结构体在内核中的位置,我们可以使用下述命令:
我们可以看到token在偏移0x360处。
读出指针_EPROCESS.Token
指向的位置,0xffff9f891b2296b5:
但是当我们使用时:
显示
再让我们仔细看一下_EX_FAST_RED
这个结构体:
注意这三个成员都有相同的偏移,但是RefCnt只有四位,看起来像object和value成员的最后的一个数。
可以检查一下没有数据的_EX_FAST_REF
结构体,定义如下:
上述结构体表明,16进制的最后四位数被用来作为这个token的引用计数的,也就是说它不是token地址的一部分,因此我们可以把它置为0后,就可以得到token结构体的地址。
实际上我们可以通过
或
直接得到token结构体的地址
查看token的内容:
可以看到提权成功。
在_TOKEN结构体中偏移0x40处有一个Privileges的成员,它是_SEP_TOKEN_PRIVILEGES结构体:
检查该结构体:
此时权限状态为:
我们把Present的值复制到Enable值中:
权限状态如下所示:
查看系统进程的权限,过程如下:
更改其权限:
查看权限:
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
- [讨论]VMProtect编译 5997
- [翻译]Intel虚拟化技术简介 6011
- [原创]Arm指令介绍 17797
- [翻译]利用逆向分析框架 Angr 分析一个代码混淆的样本 14655
- [原创]渗透测试中PowerShell的基本使用 2368