这是[信安成长计划]的第 21 篇文章
0x01 介绍
0x02 结构分析
0x03 进程注入测试
0x04 参考文章
在 Token 当中还存在一个特别重要的内容——Privileges,它也是权限检查中的一个,当用户去执行一些特权操作的时候,会检查这个位置,看是否有执行的权限。
通过滥用一些特权指令,可以达到权限提升等目的,最常见的一个特权就是 SeDebugPrivilege,除此之外,还有很多的特权
这些权限都可以通过 AdjustTokenPrivileges 来提升权限,代码可以参考微软给的例子
https://docs.microsoft.com/en-us/windows/win32/secauthz/enabling-and-disabling-privileges-in-c--
可以在命令行中查看当前所拥有的特权
其中 SeChangeNotifyPrivilege 是默认会启用的一个特权,即使是 Low 完整性等级的也会有这个特权
可以在 Windbg 当中查看到一下,就用刚刚启动的 cmd-low.exe 来进行
查看它的 TOKEN 结构
可以看到在 0x40 的位置就是 Privileges,继续看它的结构
这三个值的每一位都代表着一个权限,我们重点要看的是 Present 和 Enabled,Present 决定了哪些位是当前可以用,Enabled 则决定了是否启用
可以看到当前是有五个权限位的,在根据上面的 Enabled 可以知道,只有一个权限位是打开的
那这每一位到底代表着什么特权,我没有在微软的文档中找到描述,但是在 Windbg 中找到了另外的方案
我们使用 !token 命令让 Windbg 自己解析一下,可以看到有五个权限位,并且只有一个是启用的,数位数也刚好与上面所解析到的一致
既然通过这样的方法可以知道位置和对应的权限,那么就可以通过全部启用,然后再让 Windbg 来进行解析,就可以得到所有的权限位了
然后就可以看到所有的权限位和对应的权限了
在查资料的时候,还发现了一个情况,在 AdjustTokenPrivileges 的时候,会进行额外的检查,所能启用的权限与进程的完整性挂钩了
文章我贴到最后的参考链接当中
在正常情况下,我们当前作为低完整性等级是不能够注入高完整性等级的进程的,在之前的文章中也已经测试过了
在 OpenProcess 的时候就直接出问题了,这是符合我们的预期的
但是在 OpenProcess 当中还有这样的一句话,如果给了 SeDebugPrivilege 权限,那么就会直接授予
这里为了方便起见,直接使用 Windbg 来进行修改
可以看到确实启用了
然后再进行注入,可以发现成功了
如果将其注入到 winlogon 进程当中,再创建一个 cmd,因为继承关系,我们也就拥有了 system 权限
1.https://docs.microsoft.com/en-us/windows/win32/secbp/changing-privileges-in-a-token
2.https://docs.microsoft.com/en-us/windows/win32/secauthz/privilege-constants
3.https://docs.microsoft.com/en-us/windows/win32/secauthz/enabling-and-disabling-privileges-in-c--
4.https://docs.microsoft.com/en-us/windows/win32/secauthz/privileges
5.https://book.hacktricks.xyz/windows/windows-local-privilege-escalation/privilege-escalation-abusing-tokens
6.https://github.com/gtworek/Priv2Admin
7.http://showlinkroom.me/2020/05/02/Windows-Via-C-C-note-4-2/
8.https://paper.seebug.org/1743/
9.https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-openprocess