-
-
[原创]权限提升技术
-
发表于:
2021-11-14 10:10
22087
-
从下面这张图可以看到,不同的进程是有不同的权限的,其中比如System进程所拥有的权限是最高的。
而为了保护系统,Windows对一些操作进行了限制。如果没有足够的权限,是无法进行操作的。比如像创建服务这种操作,就需要程序具有管理员权限,普通的用户权限是无法完成操作的。
而在Windows系统中,每个进程都有一个Token令牌用来保存进程的权限,接下来就通过两种方法来修改进程的Token实现提权。
要在用户层实现权限的提升,最重要的是要用到AdjustTokenPrivileges函数,该函数可以把指定的需要的权限打开,定义如下:
其中TOKEN_PRIVILEGES的定义如下:
PrivilegeCount指定数组Privileges的个数,数组中的每个元素都是LUID_AND_ATTRIBUTES结构体,该结构体的定义如下
其中的Luid保存的就是令牌权限对应的Luid值,而Attributes则表示的特权的属性,不同的值对应的含义如下
AdjustTokenPrivileges函数如果执行失败,则返回值为0,而如果函数成功则会返回非0。此时需要调用GetLastError,如果返回值是ERROR_SUCCESS则表示进程成功提权。
根据这个函数可以知道,要提升需要的权限就需要获得足够权限的进程令牌以及需要提升到的令牌的Luid值,在通过这个函数把具有权限Luid值赋给对应的进程令牌。
接下来就需要解决两个问题,一个是要提升的权限的具有TOKEN_ADJUST_PRIVILEGES的令牌句柄,而要获得这个句柄就需要使用到OpenProcessToken,该函数的定义如下
通过这个函数就可以获得要修改权限的进程的令牌句柄,接下来需要获得要提升到的权限的Luid的值,要获得该值需要使用LookupPrivilegeValue,该函数的定义如下
通过lpName可以获得具有特定权限的Luid,而这个值在文档中可以指定以下的这些
此时要获得哪个权限的Luid就可以通过宏定义来指定不同的字符串指针。现在获得了令牌句柄和要获得的权限的Luid值就可以通过AdjustTokenPrivileges来提升进程的权限,完整代码如下
在内核层中,每一个进程都有一个EPROCESS结构,该结构的的成员如下
其中需要注意的三个成员是:
那么就可以使用ActiveProcessLinks来遍历进程,找到PID=4的System进程,取出它的Token赋给当前进程的Token就实现了提权。如果对进程遍历不太清楚可以看下:进程隐藏技术。下面由关于这种进程遍历的介绍
用户层代码如下:
内核层代码如下:
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2021-11-30 09:56
被1900编辑
,原因: