Windows中的访问控制模型(Access Control Model),它是Windows安全性的基础构件。访问控制模型有两个主要的组成部分,访问令牌(Access Token)和安全描述符(Security Descriptor),它们分别是访问者和被访问者拥有的东西。通过访问令牌和安全描述符的内容,Windows可以确定持有令牌的访问者能否访问持有安全描述符的对象。

0x1基本概念

0x1.1 访问令牌

访问令牌是与特定的Windows账户关联的。当一个Windows账户登录的时候,系统会从内部数据库里读取该账户的信息,然后使用这些信息生成一个访问令牌。在该账户环境下启动的进程,都会获得这个令牌的一个副本,进程中的线程默认持有这个令牌。线程要想去访问某个对象,或者执行某些系统管理相关的操作时,Windows就会使用这个线程持有的
令牌进行访问检查

访问令牌包含:

1
2
3
4
5
6
7
8
9
10
11
12
用户的SID
用户所在组的SIDs
当前登陆Session的登陆SID
用户及其用户组所拥有的权限列表
所有者的 SID
首要组的SID
默认的DACL
当前的Access Token来源
是内核创建的Primary Token还是扮演的Impersonation Token
一份受限SIDs的列表
当前的扮演等级(impersonation levels)
其他数据

SID(Security Identifiers),是用户的唯一身份标识。

0x1.2 安全描述符

安全描述符是与被访问对象关联的,它含有这个对象所有者的SID,以及一个访问控制列表(ACL,Access Control List),访问控制列表又包括了DACL(Discretionary Access Control List)和SACL(System Access Control List)

自主访问控制列表(DACL)是安全描述符中最重要的,它里面包含零个或多个访问控制项(ACE,Access Control Entry),每个访问控制项的内容描述了允许或拒绝特定账户对这个对象执行特定操作

系统访问控制列表(SACL) 主要是用于系统审计的,它的内容指定了当特定账户对这个对象执行特定操作时,记录到系统日志中。

ACE的内容

1
2
3
4
特定账户或者账户组的SID
一个访问掩码(Access Mask),该掩码指定了具体的访问权限(Access Rights),也就是可以对该对象执行的操作
一个位标记,指示了这个ACE的类型
一组位标记,指示了安全描述符所属对象的子对象是否继承这个ACE

所有的可访问对象都有三种ACE

1
2
3
Access-denied ACE 用于拒绝账户访问
Access-allowed ACE 用于允许账户访问
而System-audit ACE 用于SACL中。

0x2权限

0x2.1对象所有权

创建对象时,将为该对象分配所有者。 默认情况下,所有者是对象的创建者。 无论对对象设置了哪些权限,对象的所有者始终可以更改权限。

0x2.2 权限的继承

继承允许管理员轻松分配和管理权限。 此功能自动使容器内的对象继承该容器的所有可继承权限。 例如,文件夹中的文件将继承文件夹的权限。 只有标记为要继承的权限才会被继承。

0x2.3 用户权限

用户权限授予你的计算环境中的用户和组的特定权限和登录权限。 管理员可以向组帐户或单个用户帐户分配特定的权限。 这些权限授权用户执行特定操作,例如以交互方式登录系统或备份文件和目录。

0x3 Token的窃取与使用

Token是一个用户的身份标识,拿到他的Token就能伪装成该用户了。

Token的类型

1
2
3
4
Anonymous
Identification
Impersonation 创建于非交互的登陆中,如登陆FTP服务器,不同的账户能访问的资料也不同
Delegation 创建于交互的登陆中,如从控制台或者远程服务登陆服务器

后两种token只在系统重启后清除
具有Delegation token的用户在注销后,该Token将变成Impersonation token,依旧有效

详情可看如下文章:
渗透技巧——Token窃取与利用
渗透技巧——Windows Token九种权限的利用

window中的incognito.exe

1
2
列举token:incognito.exe list_tokens -u
复制token:incognito.exe execute [options] <token> <command>

Metasploit中的incognito

1
2
3
4
5
6
7
加载incognito:load incognito
列举token:list_tokens -u
查看当前token:getuid
提示至system权限:getsystem
token窃取:impersonate_token "NT AUTHORITY\\SYSTEM"
从进程窃取:steal_token 1252
返回之前token:rev2self or drop_token

参考文章:

访问控制概述
Windows的访问控制模型
渗透技巧——Token窃取与利用