尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Windows Token窃取:内网渗透中的权限提升与横向移动核心技术

Windows Token窃取:内网渗透中的权限提升与横向移动核心技术 1. 项目概述从“敲门砖”到“万能钥匙”在攻防演练或者授权安全测试中我们常常会遇到这样的场景经过一番努力终于通过某个漏洞拿到了一台内网主机的权限比如一个普通的Web服务器。登录上去一看是个Windows系统当前用户权限不高只是个普通用户。环顾四周发现内网里还有大量的服务器、数据库、文件共享但苦于没有密码感觉寸步难行。这时候很多人的第一反应是去抓密码哈希、翻配置文件或者尝试各种提权漏洞。但有一个往往被初级测试人员忽略却威力巨大的“捷径”就是Token令牌窃取。简单来说Token是Windows操作系统用于标识一个用户安全上下文的核心对象。它不像密码那样是静态的字符串而是一个动态的、包含用户身份、所属组、特权等信息的“通行证”。当你以某个用户身份登录系统时系统就会为你生成一个Token。很多高权限的服务比如系统服务、计划任务或者管理员用户登录的会话它们的Token就静静地躺在内存里。Token窃取的核心思想就是“借用”这些高权限的Token让自己瞬间拥有目标Token所代表的所有权限从而实现权限提升或横向移动相当于拿到了进入其他房间的“万能钥匙”。这个过程之所以危险且高效是因为它完全在内存中操作不涉及磁盘读写因此能绕过很多基于文件行为的防护检测。它不依赖于复杂的漏洞利用更多是利用Windows自身的安全机制和设计特性。对于防守方而言Token窃取活动隐蔽、快速是内网渗透中需要重点监控和防范的“隐形杀手”。接下来我将结合多年的一线经验深入拆解Token窃取的技术原理、实操手法、对抗检测与防御思路。2. 核心原理Windows安全模型的“身份证”系统要理解Token窃取必须先弄明白Windows的Token到底是什么以及它在整个安全体系中扮演的角色。你可以把Windows系统想象成一个大型的、有许多房间进程、服务、资源的办公楼。每个想进入办公楼或在楼内活动的人用户都需要一张“工牌”这张工牌就是Token。2.1 Token的构成你的安全属性“档案袋”一个Token并非一个简单的字符串而是一个复杂的数据结构它至少包含以下几类关键信息用户安全标识符这是最核心的用来唯一标识一个用户。它决定了“你是谁”。组安全标识符列表标识了你属于哪些用户组。这非常重要因为权限往往授予组而非单个用户。例如属于“Administrators”组就意味着你拥有管理员权限。特权列表这是一系列具体的、高级的操作权限例如“调试程序”、“加载驱动”、“备份文件”等。即使用户是管理员某些特权也可能默认是禁用的。会话ID标识了你当前所处的登录会话。同一用户在不同终端服务会话中会有不同的Token。完整性级别这是自Windows Vista引入的重要概念用于强制完整性控制。常见的级别有“低”、“中”、“高”、“系统”。一个“中”完整性级别的进程无法直接向“高”完整性级别的进程写入内存。当用户登录时系统会为其创建一个主令牌。此后该用户启动的每一个进程默认都会继承或关联这个主令牌的一个副本。此外当进程通过CreateProcessWithTokenW或ImpersonateLoggedOnUser等API模拟另一个用户时会使用一个模拟令牌。模拟令牌允许一个进程在特定线程中临时“扮演”另一个用户。2.2 为什么能“窃取”进程与Token的绑定关系在Windows中每个进程对象都关联着一个Token。拥有足够权限的进程例如拥有SeDebugPrivilege特权这允许调试其他进程可以打开另一个进程的句柄然后通过这个句柄去查询甚至复制该进程的Token。关键在于Token代表的权限是“与生俱来”的而不是通过验证获得的。如果我复制了一个以SYSTEM身份运行的服务进程的Token并用这个Token生成一个新的进程例如cmd.exe那么这个新进程就会直接以SYSTEM权限运行完全不需要知道SYSTEM用户的密码。这就好比你作为大楼保安拥有SeDebugPrivilege有权检查任何人的工牌Token。如果你发现总经理的工牌高权限Token暂时放在前台存在于某个进程的内存中你可以复制一张复制Token然后你自己戴上这张复制的工牌大摇大摆地进入所有受限区域访问系统资源。2.3 两种主要的窃取利用方式基于上述原理实战中主要有两种利用方式进程令牌复制与创建新进程这是最经典的方式。找到目标高权限进程如lsass.exe,spoolsv.exe, 或其他以SYSTEM或高权限用户运行的服务复制其Token然后使用这个Token创建一个新的进程如cmd.exe或powershell.exe。新进程将“继承”目标进程的所有权限。常用的工具是Mimikatz的token::elevate或Metasploit的incognito模块。线程令牌模拟这种方式更为隐蔽。它不创建新进程而是让当前进程的某个线程去“模拟”另一个Token。这通常用于服务进程处理客户端请求时临时切换身份以访问客户端有权限的资源。在攻击中攻击者可以窃取一个高权限线程的Token并让当前线程模拟它从而在当前进程的上下文中执行高权限操作。这比创建新进程的动静要小。理解这些原理是后续一切实操和防御的基础。它解释了为什么我们总是盯着SYSTEM进程或管理员用户会话的进程也解释了为什么这种攻击难以被传统的基于密码或哈希的防护手段所发现。3. 实操环境准备与工具选型在开始动手之前我们需要一个基本的测试环境。强烈建议在虚拟机中搭建并与物理主机做好网络隔离。3.1 实验环境搭建攻击机通常是一台安装有Kali Linux或其它渗透测试发行版的虚拟机。需要安装好后续提到的工具。靶机一台Windows系统虚拟机推荐Windows 10或Windows Server 2016/2019。需要将其加入一个域环境或配置好本地高权限账户以便模拟内网环境。初始权限我们假设已经通过某种方式例如利用Web漏洞上传了Webshell获得了靶机上一个普通权限的命令执行能力。这个用户可能属于“Users”组但肯定不是“Administrators”成员。网络确保攻击机和靶机在同一网络段可以互相通信。3.2 核心工具解析与选择工欲善其事必先利其器。Token窃取领域有几个“明星”工具各有侧重。Mimikatz这是毋庸置疑的“神器”。它功能极其强大不仅能抓取密码、哈希其token模块更是专门用于Token操作。它的token::elevate命令可以列出并窃取进程Token。优点是功能全面、直接有效缺点是名声太大几乎所有的终端防护软件都会将其列为头号恶意软件直接上传运行极易被查杀。使用要点在实战中通常需要对其二进制文件进行混淆、加壳或内存加载无文件落地来绕过静态查杀。或者只提取其核心的DLL通过反射加载等技术来使用。Metasploit Framework 的 Incognito 模块这是一个非常经典的后期利用模块。当你通过Metasploit获得一个Meterpreter会话后可以加载incognito扩展。它可以列举可用的Token并进行窃取和模拟。优点是集成在Metasploit中使用方便且Meterpreter本身具备一定的内存操作和规避能力。缺点是需要先获得一个Meterpreter会话依赖Metasploit框架。Cobalt Strike 的steal_token命令Cobalt Strike作为高级攻击平台其steal_token命令非常简洁高效。在Beacon控制台直接输入steal_token即可窃取指定PID进程的Token后续所有命令都将以该Token身份执行。优点是操作极其便捷与Cobalt Strike的其他功能如横向移动、权限维持无缝集成且规避性较好。缺点是Cobalt Strike是商业软件。PowerShell 与 .NET 脚本随着防护软件对可执行文件的查杀越来越严无文件攻击和利用系统自带组件如PowerShell成为趋势。可以编写PowerShell脚本利用.NET的[System.Diagnostics.Process]类和Windows API通过P/Invoke调用来打开进程、复制Token并创建新进程。这种方式更加灵活隐蔽但编写和调试门槛稍高。一个简单思路用PowerShell获取目标进程句柄调用OpenProcessToken和DuplicateTokenEx等API最后通过CreateProcessWithTokenW创建新进程。工具选型心得 在真实的测试中我通常会准备多种方案。初期信息搜集时可能会用PowerShell脚本进行轻量级的探测。在已经获得稳定会话且环境相对宽松时使用Metasploit的incognito快速验证。在需要高度隐蔽和后续持续操作的场景下Cobalt Strike的集成化操作是首选。而Mimikatz更多是作为原理研究和在特定免杀环境下使用的“终极手段”。永远不要只依赖一种工具。4. 分步实操从普通用户到SYSTEM假设我们已经通过Webshell在靶机上获得了一个反向Shell一个普通的cmd.exe当前用户是iisapppool。我们的目标是获取SYSTEM权限。4.1 第一步信息搜集与目标定位首先我们需要知道当前自己是谁以及系统里有哪些“肥羊”高权限进程。# 查看当前用户和权限 whoami whoami /groups | findstr /i administrators # 检查是否在管理员组 # 查看系统进程列表寻找目标 tasklist /v | findstr /i system\|local service\|network service\|administrator # 或者使用更详细的工具如Sysinternals Suite里的pslist.exe需上传常见的优质目标PID包括services.exe(PID: 通常是500左右父进程SYSTEM权限)lsass.exe(PID: 通常是600左右存储凭证SYSTEM权限但防护严密)svchost.exe(PID: 多个需要看具体承载的服务有些是SYSTEM)spoolsv.exe(打印服务SYSTEM权限历史上漏洞多常被用作跳板)任何以域管理员或其他高权限用户登录的交互式会话进程如explorer.exe。注意直接对lsass.exe动手风险极高。自从Windows 8.1/2012 R2引入Credential Guard凭据保护后对LSASS进程的访问受到严格限制且极易触发告警。在非必要情况下优先选择其他SYSTEM进程。4.2 第二步提升当前进程权限SeDebugPrivilege要打开其他进程并复制Token我们当前的进程通常需要SeDebugPrivilege调试特权。这个特权默认只授予管理员。但有时即使不是管理员某些服务账户也可能拥有此特权。我们可以先尝试启用它。在Mimikatz或一些提权脚本中这一步是自动完成的。手动检查与启用可以参考以下思路通过PowerShell或C代码调用API# 这是一个概念性PowerShell脚本片段实际使用需要更完整的错误处理和API声明 # 获取当前进程令牌 $currentToken Get-Process -Id $PID | Select-Object -ExpandProperty Handle # 查找SeDebugPrivilege的LUID # 调整令牌特权启用SeDebugPrivilege # ... (此处涉及复杂的P/Invoke调用)在实际操作中我们更常直接使用工具。如果工具执行失败提示“权限不足”往往就是因为缺少SeDebugPrivilege。这时可能需要先通过其他提权漏洞如内核漏洞、服务配置错误等获得管理员权限然后再进行Token窃取。4.3 第三步执行Token窃取这里以Mimikatz在命令行下的操作为例进行详解。假设我们已经通过某种方式将免杀版的Mimikatz上传到了靶机C:\temp\mimi.exe。列出可用TokenC:\temp\mimi.exe token::list exit这条命令会列出当前系统上所有可以被窃取的Token。你会看到一系列Token关注其User Name列寻找NT AUTHORITY\SYSTEM或域管理员账户。同时记下它们的Process ID和Token ID。窃取Token并创建新进程 假设我们看中了PID为784的某个SYSTEM权限的svchost.exe进程。C:\temp\mimi.exe token::elevate /process:784 exit执行成功后Mimikatz会尝试复制PID 784进程的Token并用它启动一个新的cmd.exe。注意新启动的cmd.exe窗口是独立于当前Shell的。你需要通过其他方式如管道、绑定端口去连接这个新的SYSTEM权限的Shell。更常见的用法是直接窃取Token到当前进程但这需要当前进程支持。Mimikatz的token::elevate命令通常用于启动新进程。使用Metasploit的流程获得一个meterpreter会话session。加载incognito模块use incognito列出Tokenlist_tokens -u窃取Tokenimpersonate_token NT AUTHORITY\\SYSTEM注意双反斜杠窃取成功后你的meterpreter会话上下文就变成了SYSTEM可以直接执行getsystem有时不需要了或访问受限资源。使用Cobalt Strike的流程在Beacon控制台输入ps查看进程列表。找到目标进程PID例如784。输入steal_token 784。执行后Beacon会提示令牌已窃取。后续的shell whoami等命令都将以SYSTEM身份执行。4.4 第四步权限验证与横向移动窃取成功后务必进行验证# 在新的SYSTEM命令行或已提升权限的会话中执行 whoami # 应该返回 nt authority\system whoami /priv # 查看当前激活的特权列表应该包含SeDebugPrivilege, SeImpersonatePrivilege等高危特权。 dir C:\Windows\System32\config\SAM # 尝试读取SAM文件普通用户拒绝访问SYSTEM权限可以。获得SYSTEM权限后横向移动的大门就打开了哈希传递可以从内存中 dump 出所有登录用户的哈希包括域管理员使用 Mimikatz 的sekurlsa::logonpasswords但要注意触发防护。票据传递可以 dump 出 Kerberos 票据用于访问域内其他资源。访问域控如果窃取到的是域管理员令牌可以直接访问域控制器进行域渗透。5. 高级利用技巧与隐蔽手段基础的Token窃取很容易被检测。作为一个资深从业者掌握一些高级技巧和隐蔽手段至关重要。5.1 窃取“模拟令牌”进行线程注入直接创建新进程如cmd.exe动作较大。更隐蔽的方式是窃取一个高权限线程的Token并将其注入到当前进程的某个线程中执行代码。这通常需要编写自定义的Shellcode或使用高级框架。大致流程使用OpenProcess和OpenThread打开目标进程和其中的一个线程。使用ImpersonateLoggedOnUser或SetThreadToken让当前线程模拟目标线程的Token。在当前模拟上下文中执行敏感操作如添加用户、访问注册表。操作完成后恢复原始Token。这种方式没有创建新进程只在现有进程内进行线程上下文切换行为更加隐蔽很多基于进程创建的检测会失效。5.2 利用“父进程PID欺骗”结合Token窃取这是一个组合技。Windows的进程在创建时可以选择“父进程”。安全软件常常通过检查进程的父进程来判断其是否可疑例如cmd.exe的父进程是explorer.exe是正常的如果是powershell.exe就可能可疑。我们可以先窃取一个高权限、可信进程如winlogon.exe的Token然后使用这个Token并指定父进程为winlogon.exe来创建一个新的进程。这样新进程既有高权限又有“清白”的父进程欺骗性极强。一些高级的C2框架如Cobalt Strike的spawnto功能就支持这种父进程PID欺骗。5.3 Token的“克隆”与“制作”除了窃取我们还可以“制作”Token。如果我们已经获得了某个用户的密码或哈希我们可以使用LogonUserAPI来为该用户创建一个全新的登录会话并获取其Token。这比窃取更加“正规”但需要凭证。此外DuplicateTokenExAPI可以创建Token的副本并且可以指定副本的类型主令牌或模拟令牌和权限。这为我们在不同场景下使用Token提供了灵活性。5.4 针对防护软件的绕过思路无文件落地避免上传mimikatz.exe这样的可执行文件。使用PowerShell脚本从远程加载并反射执行DLL或者使用.NET assembly在内存中加载Mimikatz的核心功能。API钩子检测安全软件会钩住OpenProcess、DuplicateTokenEx等关键API。可以尝试使用未导出的底层API如NtOpenProcess、NtDuplicateToken或者通过直接系统调用Syscall来绕过用户态的钩子。行为检测对CreateProcessWithTokenW或特定进程如lsass.exe的句柄请求进行监控。应对方法是使用CreateProcessAsUser代替CreateProcessWithTokenW。在窃取Token后不直接创建cmd.exe而是注入到已有的、看似无害的系统进程如dllhost.exe中。尽量使用线程模拟而非创建新进程。信誉父进程检测如前所述使用父进程PID欺骗。6. 防御视角如何检测与缓解Token窃取了解了攻击才能更好地防御。从蓝队防守方角度看Token窃取活动会留下哪些痕迹又该如何防范6.1 关键检测点与日志分析进程创建日志监控事件ID4688Windows安全日志或4689进程终止。特别关注非标准父进程-子进程关系如svchost.exe创建cmd.exe。新进程的“主体安全标识符”突然变成SYSTEM或高权限用户但其父进程却是低权限用户。使用CreateProcessWithTokenWAPI创建的进程在日志中会有体现。Token操作日志监控事件ID4672特殊权限分配和4673特权服务调用。SeDebugPrivilege和SeImpersonatePrivilege的启用是强烈告警信号。事件ID4674尝试对特权对象进行操作也可能记录Token复制行为。LSASS进程访问监控对lsass.exe进程的PROCESS_VM_READ或PROCESS_QUERY_INFORMATION访问请求。Sysmon事件ID10ProcessAccess可以详细记录这些行为并可以设置规则对目标进程为lsass.exe的访问进行告警。PowerShell日志如果攻击者使用PowerShell脚本需启用模块日志、脚本块日志事件ID 4103/4104分析其中可疑的API调用或.NET反射代码。6.2 系统加固与缓解措施最小权限原则这是黄金法则。确保所有服务、计划任务、应用程序都以完成其功能所需的最低权限运行。避免使用SYSTEM或域管理员账户运行Web服务、数据库等应用。保护高权限账户对管理员账户实施严格的保护如禁止其进行网络登录除非通过特权访问工作站使用“受保护用户”组启用Credential Guard。启用Credential Guard对于Windows 10/Server 2016及以上版本启用基于虚拟化的安全VBS和Credential Guard可以极大地增加从LSASS进程提取凭证和Token的难度。限制特权通过组策略限制非必要账户拥有SeDebugPrivilege、SeImpersonatePrivilege、SeAssignPrimaryTokenPrivilege等危险特权。特别是SeImpersonatePrivilege在服务账户中很常见却是Token模拟攻击的关键。应用控制策略使用Windows Defender应用程序控制或AppLocker限制只有授权的、签名的应用程序可以在关键服务器上运行阻止未知的或可疑的工具如Mimikatz执行。终端检测与响应部署具备行为检测能力的EDR产品。好的EDR可以监控进程的Token操作序列、异常的进程父子关系、以及LSASS内存读取等恶意行为模式并进行实时告警和阻断。网络分段与监控即使攻击者在某台主机上获得了SYSTEM权限通过严格的网络分段和东西向流量监控也能阻止其轻易地在内网横向移动。6.3 针对Token窃取的专项狩猎查询安全分析师可以构建以下逻辑的查询在SIEM或日志平台中进行狩猎场景一可疑的SYSTEM权限进程创建查找父进程是低权限用户如IIS AppPool账户但子进程以SYSTEM身份运行的4688事件。场景二SeDebugPrivilege特权启用在安全日志中集中搜索事件ID 4672筛选特权列表包含{SE_DEBUG_NAME}的记录并关联查看启用该特权的进程和用户。场景三对LSASS的异常访问利用Sysmon事件ID 10筛选TargetImage以lsass.exe结尾且GrantedAccess包含0x1410PROCESS_VM_READ | PROCESS_QUERY_INFORMATION或0x1010等敏感访问掩码的记录。然后排除已知合法的安全软件进程。防御Token窃取是一个体系化的工作需要人、技术、流程的结合。单纯依靠某个工具或某个配置是无法完全解决的必须建立纵深防御体系。7. 实战案例复盘与深度思考最后分享一个我印象深刻的真实测试案例它完美体现了Token窃取的威力和防御的复杂性。在一次针对某大型企业内网的授权测试中我们通过一个陈旧的、未打补丁的Web应用漏洞获得了一台外围Web服务器的www-data权限一个低权限服务账户。这台服务器部署在DMZ区系统是Windows Server 2012 R2。常规的提权漏洞扫描没有收获。我们检查了系统进程发现一个以NT AUTHORITY\NETWORK SERVICE身份运行的Java应用服务进程。这个身份本身权限也不高但我们发现它所在的服务器上有一个定制的日志清理服务是以Local System身份运行的并且该服务在启动时会加载一个配置目录下的DLL。我们并没有直接利用这个DLL劫持因为需要重启服务。我们注意到这个日志清理服务进程logsvc.exe在运行时会周期性地与Java服务进程进行一个RPC通信。利用SeDebugPrivilege幸运的是www-data账户所在的某个组被误配置了此特权我们向Java进程注入了一个Shellcode。这个Shellcode的功能是循环遍历所有进程找到logsvc.exe打开其进程复制其Token然后使用这个Token在当前Java进程内创建一个新的线程来执行命令。这样一来我们就在不创建新进程、不触碰LSASS的情况下在Java进程的内存空间里获得了一个SYSTEM权限的命令执行能力。我们通过这个通道抓取了服务器上多个域用户的哈希并最终利用其中一个域用户哈希成功横向移动到核心业务区。这个案例给我的启示权限是链式的www-data-SeDebugPrivilege-NETWORK SERVICE进程内存 -Local SystemToken。攻击路径往往不是直来直去的。Token窃取可以非常隐蔽我们没有运行mimikatz.exe没有创建cmd.exe新进程所有操作都在一个合法的、正在运行的服务进程内完成。这绕过了当时客户部署的、主要基于进程黑白名单和HIPS的防护软件。配置错误是最大的漏洞赋予www-data相关账户SeDebugPrivilege是严重的配置失误。而服务间不必要的、高权限的交互logsvc.exe的Token能被轻易窃取则扩大了攻击面。防御需要多维度仅靠杀毒软件不够。需要启用Credential Guard该环境未启用需要严格的权限审计清理危险特权需要能够检测进程内存注入和线程Token模拟的EDR还需要对服务间的通信进行最小权限化设计。Token窃取技术从Windows NT时代就已存在至今仍是内网渗透中最锋利的一把“快刀”。它不依赖于某个具体的CVE而是基于操作系统核心安全模型的一种“特性利用”。对于红队而言深入理解Token机制能让你在内网中无声地穿梭对于蓝队而言认清这种攻击的本质才能构建起真正有效的身份与访问管理防线。攻防的博弈就在对这些基础而又核心的细节的把握之中不断升级。
返回列表