令牌窃取(Token Theft)是一种Windows上常用的提权攻击技术,攻击者可以通过获取系统中一个高权限进程的安全令牌,然后将其注入到一个低权限进程中,使得低权限进程可以获得高权限进程的访问权限,如域管理员在域内某台普通主机上留下未清除的令牌,攻击者可窃取域管理员的令牌以提升权限,从而执行各种恶意操作。
令牌是系统的临时密钥,相当于账户名和密码,用来决定是否允许这次请求以及判断这次请求是属于哪一个用户的,它允许你在不提供密码或其他凭证的前提下,访问网络和系统资源;令牌由LSA分配,包含用户安全标识SID、权限列表等,这些令牌持续存在系统中,除非系统重新启动。
如:访问令牌(access token)
是用来描述进程或线程安全上下文的对象,令牌所包含的信息是与该user账户相关的进程或线程的身份和权限信息。当user登录时,系统通过将user输入的密码与储存在安全数据库中的密码进行对比。若密码正确,系统此时会为user生成一个访问令牌。之后,该user执行的每个进程都会拥有一个该访问令牌的拷贝。
想列举令牌只能列出当前用户和比当前用户权限更低用户的令牌,例如当前权限是system或者是administrator,那么我们就可以看到系统中所有的令牌,如使用其他用户登录后注销再用administrator用户登录,通过incognito.exe工具能够获取到已注销用户的token:
指定用户token,执行任意命令
incognito.exe execute -c "用户名" calc.exe
incognito.exe execute -c "NT AUTHORITY\SYSTEM" cmd.exe
列举token
Invoke-TokenManipulation -Enumerate
提升system权限
Invoke-TokenManipulation -CreateProcess "cmd.exe" -Username "nt authority\system"
通过指定进程id窃取用户token启动进程
Invoke-TokenManipulation -CreateProcess "cmd.exe" -ProcessId 436
Msf下的利用
这里打断点对Invoke-TokenManipulation.ps1进行分析:
跳转至调用win API函数,这里分析几个窃取过程必要的函数
1)给OpenProcess()传入指定的进程PID,返回一个可操作的进程句柄(HANDLE);且必须指定进程的权限标志:PROCESS_QUERY_LIMITED_INFORMATION、PROCESS_QUERY_INFORMATION或PROCESS_ALL_ACCESS(三者权限按从低到高排序),我们可以使用拥有SeDebugPrivilege权限(忽视安全描述符允许调试进程)的用户,如用户为Administrator或是被给予了相应的权限;
函数原型如下:
HANDLE OpenProcess(
[in] DWORD dwDesiredAccess,
[in] BOOL bInheritHandle,
[in] DWORD dwProcessId
);
2)将OpenProcess()获取的进程句柄传入OpenProcessToken()用于打开与进程关联的访问令牌的句柄,且必须传入一个访问权限标志才能使用OpenProcessToken():TOKEN_QUERY和TOKEN_DUPLICATE访问权限
函数原型如下:
BOOL OpenProcessToken(
[in] HANDLE ProcessHandle,
[in] DWORD DesiredAccess,
[out] PHANDLE TokenHandle
);
3)使用 DuplicateTokenEx()来复制一个新的访问令牌。必须使用 TOKEN_ADJUST_DEFAULT TOKEN_ADJUST_SESSIONID, TOKEN_QUERY, TOKEN_DUPLICATE 和TOKEN_ASSIGN_PRIMARY 访问权限来调用 DuplicateTokenEx() 。
4)使用 CreateProcessWithTokenW(),通过DuplicateTokenEx()创建的访问令牌可以传递给CreateProcessWithTokenW(),从而使用复制的令牌生成一个新的进程。
新发现:不是所有的SYSTEM权限运行的进程都被窃取,主要有两个结构标识:TOKEN_USER和 TOKEN_OWNER,OWNER结构标识用户是使用访问令牌创建的任何进程的所有者,当该标识符是SYSTEM的时候但我们当前的权限并不是SYSTEM是无法窃取的,如winlogon.exe可利用而spoolsv.exe不可利用:
枚举可窃取的进程:
Where-Object {$.UserName -eq 'NT AUTHORITY\SYSTEM' -and $.OwnerName -ne 'NT AUTHORITY\SYSTEM'} | Select-Object ProcessName,ProcessID | Format-Table
貌似这些进程均可以窃取SYSTEM的令牌:
结果还是有一些SYSTEM进程不可被窃取,通过Process Explorer可以发现了一个导致此行为的常见属性:PsProtectedSignerWinTcb-Light(PPL),此时需要使用PROCESS_QUERY_LIMITED_INFORMATION权限标记才能进行窃取令牌操作:
总结:
从 SYSTEM 进程窃取访问令牌:
1) 必须调用TokenOwner为BUILTIN\Administrator进程执行的OpenProcessToken();
2) OpenProcess()与受 PPL 保护的 SYSTEM 进程的访问权限一起使用PROCESS_QUERY_LIMITED_INFORMATION。
4688事件:一般通过窃取SYSTEM令牌调用cmd窗口会有以下特征,令牌提升类型为%%1936(不同的版本win日志类型字段值不一样)。
对令牌提升类型说明如下 :
4656事件:常见的SYSTEM进程dllhost.exe、lsass.exe、OfficeClickToRun.exe、svchost.exe、Sysmon64.exe、unsecapp.exe、VGAuthService.exe、vmacthlp.exe、vmtoolsd.exe、winlogon.exe等被可疑进程赋予权限标记:0x400(PROCESS_QUERY_INFORMATION)
受PPL保护的进程:csrss.exe、Memory Compression.exe、services.exe、smss.exe、wininit.exe等被可疑进程赋予权限标记:0x1000(PROCESS_QUERY_LIMITED_INFORMATION)
删除不必要的用户或组,只保留需要具备这些权限的用户或组
1) 创建令牌对象的权限设置,通过GPO策略:计算机配置 > Windows 设置 > 安全设置 > 本地策略 > 用户权限分配:创建令牌对象。
2) 限制谁可以通过 GPO 创建仅本地和网络服务的进程级令牌:计算机配置 > [策略] > Windows 设置 > 安全设置 > 本地策略 > 用户权限分配:替换进程级令牌。
攻击者必须已经在本地系统上拥有管理员级别的访问权限才能充分利用此技术;确保将用户和帐户限制为所需的最低权限;
[2]https://www.secpulse.com/archives/131423.html
[3]https://learn.microsoft.com/en-us/windows/security/threat-protection/auditing/event-4688
[4]https://gist.github.com/vector-sec/a049bf12da619d9af8f9c7dbd28d3b56#file-get-token-ps1
79 篇文章
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!