0%

2020黑帽Detecting Access Token Manipulate学习

这篇文章主要目的是帮助安全从业人员理解:Windows下访问令牌是怎么工作的;攻击者是如何利用合法的Windows功能来横向移动并损害整个ActiveDirectory域信;他们检测和响应其环境中的访问令牌操作的能力。

Windows Security Internals

Logon Sessions and Access Tokens

简单的说,用户登陆到windows系统之后,不管该用户是本地登陆的,还是远程登陆,系统都会为这个用户分配一个新的**会话ID(SID)**。也就是说会话与用户的登录是相关连的,没有用户登录就不存在会话。因此,会话的含义是指用户登录之后的一种运行的环境。会话管理器(\Windows\System32\Smss.exe)是系统中第一个创建的用户态模式进程,负责完成执行体和内核的初始化工作的内核模式系统线程在最后阶段创建了实际的Smss进程。

会话(session)是由进程和其他的系统对象(比如窗口站、桌面和窗口)构成的,它们代表了一个用户的工作站登录会话。会话具体是由如下几个部分组成的:

\1. 每个会话包含一个单独的win32k.sys

\2. 专门的换页池区域

\3. 私有windows子系统和登陆进程的拷贝

\4. 系统空间中被映射的空间,被称为会话空间的区域

现在会话同进程做一个比较,发现他们之间有一些相似之处:

\1. 都提供一个执行的环境

\2. 都有一个私有空间

进程是为了内部的执行的线程提供一个空间和环境,而会话则是为内部所有的进程提供一个执行的空间和环境。当用户登陆到系统中之后,用户下所有的进程都属于这个会话空间,在每个进程的PEB当中就有SessionID。Windows创建的第一个会话被称为会话0,是系统用户SYSTEM的会话通常称为会话0,服务就是运行在此会话中。而令牌就像是一个标识符,标识该账号的一切应用和操作。

访问令牌是用来描述进程或线程安全上下文的对象,令牌所包含的信息是与该 user 账户相关的进程或线程的身份和权限信息。当 user 登录时,系统通过将 user 输入的密码与储存在安全数据库中的密码进行对比。若密码正确,系统此时会为 user 生成一个访问令牌。之后,该 user 执行的每个进程都会拥有一个该访问令牌的副本。每个线程默认直接继承进程的token,线程还可以通过模拟,改变自己的token,让自己拥有别的用户的token。

令牌产生过程:使用凭据(用户密码)进行认证;

登录Session创建;

Windows返回用户sid和用户组sid;

LSA(Local Security Authority)创建一个Token;

依据该token创建进程、线程(如果CreaetProcess时自己指定了 Token, LSA会用该Token, 否则就继承父进程Token进行运行)

首先了解下令牌的四个模拟级别,分别是:Anonymous,Identification,Impersonation,Delegation

Anonymous:服务器无法模拟或识别客户端。

Identification:服务器可以获取客户端的身份和特权,但不能模拟客户端。

Impersonation:服务器可以在本地系统上模拟客户端的安全上下文。

Delegation:服务器可以在远程系统上模拟客户端的安全上下文。

所以当令牌具有Impersonation和Delegation级别的时候才可以进行模拟。

img
言而总之,只要我们有SeAssignPrimaryToken或者SeImpersonate权限,就可以通过模拟Primary令牌来提升权限,而Primary令牌可以通过DuplicateTokenEx调用一个Impersonation令牌来转换。

所以一个模拟令牌的过程大概是:OpenProcess(获取目标进程上下文)->OpenProcessToken(获得进程访问令牌的句柄)–>DuplicateTokenEx(创建一个主/模拟令牌)–>CreateProcessWithTokenW(创建进程)

How Attackers Abuse Access Token

攻击者可以使用内置的Windows API函数从现有进程复制访问令牌,这就是所谓的令牌窃取。然后可以将这些令牌应用于现有进程(即Token Impersonation/Theft)或用于生成新进程(即Create Process with Token)。攻击者必须已经处于特权用户上下文(即管理员)中才能窃取令牌。然而,攻击者通常使用令牌窃取将其安全上下文从管理员级别提升到系统级别。然后,如果帐户在远程系统上具有适当的权限,则攻击者可以使用令牌向远程系统进行身份验证,作为该令牌的帐户。

在ATT&CK框架中,对于令牌操作有五种技术介绍:

img

Token Impersonation/Theft

攻击者可以使用DuplicateToken(Ex)创建一个新的访问令牌来复制现有令牌。然后,该令牌可与ImpersonalLoggedOnUser一起使用,以允许调用线程模拟登录用户的安全上下文,或与SetThreadToken一起将模拟令牌分配给线程。

检测:

如果攻击者使用标准命令行shell,分析人员可以通过审核命令行活动来检测令牌操纵。具体来说,分析人员应该寻找runas命令的使用。默认情况下,Windows中未启用详细的命令行日志记录。

分析人员还可以监视Windows API(如DuplicateToken(Ex)、ImpersonalLoggeDonUser和SetThreadToken)的使用情况,并将活动与其他可疑行为关联起来,以减少由于用户和管理员正常的良性使用而导致的误报。

Create Process with Token

攻击者可能会使用重复的令牌创建一个新进程,以升级权限并绕过访问控制。攻击者可以使用DuplicateToken(Ex)复制所需的访问令牌,并将其与CreateProcessWithTokenW一起使用,以创建在模拟用户的安全上下文下运行的新进程。这对于在不同用户的安全上下文下创建新进程非常有用。

检测:

如果攻击者使用标准命令行shell,同上。

如果攻击者使用直接调用Windows令牌API的有效负载,分析人员只能通过仔细分析用户网络活动、检查正在运行的进程以及与其他端点和网络行为的关联来检测令牌操纵。

分析人员还可以监视Windows API,同上。

Make and Impersonate Token

攻击者可以制作和模拟令牌以提升权限并绕过访问控制。如果攻击者拥有用户名和密码,但用户未登录系统,则攻击者可以使用LogonUser功能为用户创建登录会话。该函数将返回新会话的访问令牌的副本,攻击者可以使用SetThreadToken将令牌分配给线程。

检测:

同上

Parent PID Spoofing

攻击者可以欺骗新进程的父进程标识符(PPID),以逃避进程监视防御或提升权限。除非明确指定,否则新进程通常直接从其父进程或调用进程派生。显式分配新进程的PPID的一种方法是通过CreateProcess API调用,该调用支持定义要使用的PPID的参数。此功能由Windows功能(如用户帐户控制(UAC))使用,以便在系统生成请求的提升进程后正确设置PPID(通常通过svchost.exe或approve.exe)而不是当前用户上下文。

攻击者可能会利用这些机制来逃避防御,例如阻止直接从Office文档生成的进程,以及针对异常/潜在恶意父子进程关系的分析,例如将PowerShell/Rundll32的PPID欺骗为explorer.exe,而不是将Office文档作为Spearphishing Attachment的一部分。此欺骗可以通过Visual Basic在恶意Office文档或任何可以执行本机API的代码中执行。

显式分配PPID还可以启用提升的权限,赋予父进程适当的访问权限。例如,特权用户上下文(即管理员)中的攻击者可能会生成一个新进程,并将父进程分配为作为系统运行的进程(如lsass.exe),导致新进程通过继承的访问令牌提升。

检测:

查找存储PPID信息的各个字段之间的不一致性,例如通过Windows事件跟踪(ETW)收集的数据中的EventHeader ProcessId、Windows事件日志中的创建者进程ID/名称以及ProcessId和ParentProcessID(也由ETW和其他实用程序(如任务管理器和Process Explorer)生成)。ETW提供的EventHeader ProcessId标识实际的父进程。

监视和分析对CreateProcess/CreateProcessA的API调用,特别是来自用户/潜在恶意进程的API调用,并使用显式分配PPID的参数(例如:进程创建标志0x8XXX,表示正在使用扩展启动信息创建进程)。恶意使用CreateProcess/CreateProcessA也可能通过调用UpdateProctThreadAttribute进行,这可能是更新进程创建属性所必需的。这可能会从正常UAC提升行为中产生误报,因此如果可能,请与系统基线/对正常系统活动的理解进行比较。

SID-History Injection

对手可以使用SID历史记录注入来升级权限和绕过访问控制。Windows安全标识符(SID)是标识用户或组帐户的唯一值。Windows security在安全描述符和访问令牌中都使用SID。帐户可以在SID-History Active Directory属性中保存其他SID,从而允许在域之间进行可互操作的帐户迁移(例如,SID-History中的所有值都包含在访问令牌中)。

使用域管理员(或同等)权限,可以将获取的或已知的SID值插入到SID历史记录中,以启用对任意用户/组(如企业管理员)的模拟。此操作可能会导致通过横向移动技术(如远程服务、SMB/Windows管理员共享或Windows远程管理)提升对本地资源的访问和/或访问无法访问的域。

检测:

使用PowerShell Get-ADUser 命令行工具检查用户SID历史记录属性中的数据,尤其是具有来自同一域的SID历史记录值的用户。还可以监视域控制器上的帐户管理事件,以查看SID历史记录的成功更改和失败更改。

监视对DsAddSidHistory函数的Windows API调用。