1 前置概念
关于Windows Access Token
Windows Access
Token(访问令牌),它是一个描述进程或者线程安全上下文的一个对象。每个用户登录计算机都会产生一个AcessToken以用于创建进程和线程,用户注销以后会将主令牌切换成模拟令牌,也就是授权令牌和模拟令牌,不会清除令牌,只有重启才会。
两种类型的Token
-
Delegation token(授权令牌):用于交互会话登录(例如本地直接登录、rdp login 、psexec )
-
Impersonation token(模拟令牌):用于非交互登录(利用net use访问共享文件夹,或者wmi、winrm等等)
注:
都是在登录时产生创建的
两种token只在系统重启后清除
具有Delegation token的用户在注销后,该Token将变成Impersonation token,依旧有效
TOKEN的产生
每个进程创建时都会根据登录会话权限由LSA(Local Security
Authority)分配一个Token(如果CreaetProcess时自己指定了Token, LSA会用该Token,否则就继承父进程Token进行运行)
TOKEN组成
当前用户的安全ID(SID)
当前用户所属组的安全ID(SID)
当前会话安全ID
用户所有的特权列表(包括用户本身,和其所属组)
令牌拥有者安全ID
用户所属主组群安全ID
默认的自由访问控制列表
源访问令牌
表明此令牌是源令牌还是模拟令牌
可选的链表,表明此令牌限制哪些SID
当前模拟令牌的级别
其他数据资料
2 进程的身份标识:Luid与SID
Luid
每个特权常量字符串(Privileges)都对应一个LUID(本地标识符),使用LookupPrivilegeName函数将LUID转换为其对应的字符串常量,总计是36个特权,所以LUID有36个(0x24),所有特权如下:
- MSDN对特权常量的描述:https://docs.microsoft.com/en-us/windows/win32/secauthz/privilege-constants
SID
安全标识符(SID)是用户、组的唯一标识符,SID的构成如下:
S-版本号-(颁发机构:Identity-Authority)-(子机构:SubAuthority)-RID
MSDN上的一个例子
由4个部分组成,其中的子机构值是可以由多位组成,“whoami /all” 可以查看本机中的用户的sid以及用户组的sid
这里讲一个后续会用到的sid:S-1-16-0,微软的解释是一个权限最低的完整性级别的SID。
标识符机构值为16(0x10)表示强制完整级别的SID,