Windows 的提权是在攻防对抗中绕不开的话题,本文针对 Windows 操作系统的本地提权手段原理以及方式进行梳理介绍。提权是后渗透中的一个重要环节,在权限较低的情况下,站在攻击者的视角进行内部网络安全测试、系统安全测试、应用安全测试等方面会受到限制。
目前长亭牧云(CloudWalker)主机安全管理平台已支持通用性的的 windows 提权检测,如果你也对主机安全感兴趣,欢迎投递简历到邮箱:[email protected]
-
S-1-5-18 (LocalSystem) -
S-1-5-19 (LocalService)
-
S-1-5-20 (NetworkService)
-
S-1-5-32-544 (Administrators)
-
S-1-5-32-545 (Users)
-
S-1-5-32-550 (PrintOperators)
SID 简化的结构如下
-
SID 的版本号是 1
-
主标识值是 5,代表 NT 权限
-
域相关的子标识值是 21-1004336348-1177238915-682003330
-
RID 是 512,代表 DomainAdmins
-
特定访问权限:执行单个操作的权限,如调试进程需要 SeDebugPrivilege 的权限,这个权限和需要操作的对象无关,只和操作行为本身有关系。具体可以参考官方文档。
-
一般访问权限:一种泛型访问权限,和对象的ACL有关,如上文中的FILE_READ_DATA 权限。
-
ACL: Access Control List,用来表示用户(组)权限的列表,包括 DACL和 SACL
-
ACE: Access Control Entry,ACL 中的访问控制实体,一个 ACL 可能包含0到多个 ACE
-
DACL:当一个进程尝试访问一个安全对象的时候,系统检查对象的 DACL 中的ACE
注:DACL就是ACE链表,一种数据结构,每一个节点存放着访问权限等信息(这种链表查找起来比数组快)来决定是否赋予访问权限。如果对象没有DACL,系统赋予完全的访问权限
-
SACL: System Access Control List,用来记录对安全对象访问的日志
-
如果没有 DACL,系统将允许访问
-
如果存在 DACL,但没有 ACE,系统将拒绝所有访问
-
如果存在 DACL,也存在 ACE,那么会按照每个 ACE 指定允许或拒绝
其中Object-specific access rights代表和对象类型相关的访问权限,如FILE_READ_DATA 对应的则是0x1, 属于文件这种对象类型的访问权限。
管理员账户(Administrators)
默认本地系统账户
SYSTEM 账户由操作系统和在 Windows下运行的服务使用。Windows 操作系统中有许多服务和进程需要能够在内部登录,例如在 Windows 安装期间。
SYSTEM 账户就是为此目的而设计的。它是一个内部帐户,不会显示在用户管理器中,并且无法添加到任何组中。
默认情况下,SYSTEM 账户被授予对 NTFS 卷上所有文件的完全控制权限。因此 SYSTEM 账户包含管理员账户所具有的功能和权限。
网络服务账户
NETWORK SERVICE 是服务控制管理器( SCM )使用的预定义本地账户, 以这个账户运行的服务,允许把访问凭据提交给远程的计算机。
WindowsToken 又叫 AccessToken (访问令牌),它是一个描述进程或者线程安全上下文的一个对象。不同的用户登录计算机后,都会生成一个 AccessToken,这个 Token 在用户创建进程或者线程时会被使用并且不断地拷贝,这也就解释了 A 用户创建一个进程而该进程也不会有 B 用户的权限。
关于令牌的解释可以在 MSDN 中找到:
https://docs.microsoft.com/zh-cn/windows/win32/secauthz/access-tokens?redirectedfrom=MSDN
访问令牌组成
令牌分为如下两类:
-
Primary Token(主令牌)
-
Impersonation令牌(模拟令牌)
注:当用户注销后,系统将会使主令牌切换为模拟令牌,而模拟令牌不会被清除,只有在重启机器后才会清除
主令牌是由 windows 内核创建并分配给进程的默认访问令牌,每一个进程有一个主令牌,它描述了与当前进程相关的用户账户的安全上下文。
此外,线程可以模拟客户端帐户。模拟允许线程使用客户端的安全上下文与安全对象进行交互。模拟客户端的线程同时具有主令牌和模拟令牌,笔者理解为线程可以以客户端的身份和服务端交互并且是有模拟服务端的身份的权限
-
TokenID (标识 token 的唯一ID)
-
Privileges (当前 token 的权限,具体可查看官方文档)
-
UserAndGroups (当前用户及所属的组,实际是一个 SID 数组)
-
RestrictedSids (如果该值不为空,则表示令牌属于受限令牌,同样是一个 SID 数组)
-
TokenType (当前令牌的类型)
-
ImpersonationLevel (模拟令牌的等级)
-
使用凭据(用户密码)进行认证
-
登录 Session 创建 -
Windows 返回用户 sid 和用户组 sid -
LSA(Local Security Authority)创建一个 Token -
依据该 token 创建进程、线程(如果 CreaetProcess 时,自己指定了 Token, LSA会用该 Token, 否则就继承父进程 Token 进行运行)
令牌模拟级别
官方说明如下:
https://docs.microsoft.com/zh-cn/windows/win32/secauthz/impersonation-levels
模拟等级通过如下所示的 SECURITY_IMPERSONATION_LEVEL 枚举表示
typedef enum _SECURITY_IMPERSONATION_LEVEL {
SecurityAnonymous,
SecurityIdentification,
SecurityImpersonation,
SecurityDelegation
} SECURITY_IMPERSONATION_LEVEL, *PSECURITY_IMPERSONATION_LEVEL;
模拟级别 | 说明 |
|
|
|
|
|
|
|
|
函数 |
需要特权 |
输入 |
|
|
|
|
|
|
|
|
|
如何获取令牌
Win API 中提供了 OpenProcessToken/openThreadToken 等函数用来打开某个进程或者线程的访问令牌,其函数原型如下:
BOOL OpenProcessToken(
HANDLE ProcessHandle, //访问令牌已打开的进程的句柄
DWORD DesiredAccess,
PHANDLE TokenHandle//指向句柄的指针,该句柄在函数返回时标识新打开的访问令牌。
);
BOOL OpenThreadToken(
HANDLE ThreadHandle, //打开访问令牌的线程的句柄。
DWORD DesiredAccess,
BOOL OpenAsSelf,
PHANDLE TokenHandle//指向接收新打开的访问令牌句柄的变量的指针
);
通过 OpenThreadToken/OpenProcessToken 函数来获取访问令牌。
在这里,模拟令牌和主令牌之间是可以通过 DuplicateTokenEx 函数互相转换的
DuplicateTokenEx :我们在最后调用 CreateProcessWithToken/CreateThreadWithToken 时所传递的令牌必须要是主令牌,而我们一般获得的令牌都是模拟令牌,因此中间过程需要由 DuplicateTokenEx 函数来进行转化。
微软官方文档中给出了 DuplicateTokenEx 创建主令牌的典型场景,服务器应用程序创建一个线程,该线程调用其中一个模拟函数(例如 ImpersonateNamedPipeClient)来模拟客户端。模拟线程然后调用 OpenThreadToken 函数来获取自己的令牌,该令牌是模拟令牌。该线程在对 DuplicateTokenEx 的调用中指定此模拟令牌,并指定 TokenPrimary 标志。然后 DuplicateTokenEx 函数创建一个主令牌。
因此,一个模拟令牌的过程大概是:
-
OpenProcess (获取目标进程上下文),返回的句柄将用于步骤2的参数
-
OpenProcessToken (获得进程访问令牌的句柄),通过该函数获得对应进程的令牌句柄
-
DuplicateTokenEx (创建一个主令牌),设置访问令牌模拟级别并复制一个令牌句柄
-
CreateProcessWithTokenW(创建进程),模拟主令牌的权限创建对应进程
所以当我们拥有 SeImpersonatePrivilege 权限时便可以通过对进程爆破的方式找到满足如下条件的进程:
-
进程运行用户是 SYSTEM -
令牌级别至少是 Impersonation 级别 -
攻击者运行的权限至少拥有 SeImpersonatePrivilege
这其实就是 Token Kidnapping 技术,相关介绍
https://msrc-blog.microsoft.com/2009/04/14/token-kidnapping/
不过如果不是 Administrator 身份通过这种方式爆破来提权的成功性很低,这里只是提供了一种思路。
原文始发于微信公众号(长亭安全课堂):主机安全技术剖析 - Windows 本地提权(基础篇)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论