
1. 从攻击视角看RDP凭据保护的薄弱点在内网环境中远程桌面协议RDP一直是运维管理最常用的通道之一。但恰恰是这种高权限的远程访问方式成了内网攻击链中被重点针对的环节。最近我复盘了一次针对模拟内网环境X的完整攻防流程对RDP凭据在内存中被窃取的过程做了详细记录这里从操作者视角出发把整个思路和关键细节梳理出来希望帮助安全从业人员更深入地理解攻击路径从而有针对性地强化防御。先说一下背景。某次授权演练中我负责模拟攻击者从边界突破后的横向移动环节。在拿下一台普通办公终端后发现该终端的本地管理员组里存在一个高权限账户且该账户最近有过远程登录其他服务器的行为。通过条件判断这台终端上极有可能存在该账户的明文密码或可重用的凭据哈希。于是我采用mimikatz对本地内存中的RDP相关凭据进行了提取。整个过程非常顺利几分钟内就获取到了目标服务器的远程登录权限。这个案例说明RDP凭据一旦在内存中被暴露攻击者可以轻松实现内网环境和核心系统的横向渗透。这篇文章由三部分组成先拆解RDP凭据为什么会出现在内存中再详细介绍基于mimikatz的提取思路和实际操作最后结合实战场景分析如何发现和阻断这类攻击。无论你是红队渗透测试人员、蓝队防御人员还是企业IT管理员这一整套逻辑都值得收藏参考。提示本文所有内容仅限授权环境下的安全测试与防御研究。任何未授权环境下的攻击行为均违反法律法规请读者务必注意适用范围。2. RDP凭据泄露的根源内存中的明文与哈希2.1 操作系统为什么要保留这些凭据很多人不理解一个问题为什么Windows系统会在内存中保留RDP相关的凭据这其实和Windows的凭据管理机制有关。当你使用远程桌面登录某台服务器时客户端和服务器之间会进行身份认证。在这个过程中操作系统为了优化用户体验、实现单点登录效果会在当前会话的本地内存中暂存一组凭据信息。这些凭据可能是明文密码也可能是经过特定算法处理的哈希值。特别是当你勾选了“允许保存凭据”或系统组策略开启了“将凭据作为进程运行”选项时凭据留在内存中的概率会大幅增加。另一个容易被忽略的场景是当你从机器A远程登录机器B时如果在登录界面输入了密码这个密码在内存中其实会保留一段时间。在Windows 8.1和Windows Server 2012 R2之后微软做了一些安全性改进默认情况下不再像早期版本那样直接保存明文密码而是保存了加密后的数据块。但问题在于解密这些数据块的密钥往往也存在于同一台机器上——或者存储在LSASS进程本地安全认证服务的上下文中或者可以通过特定方式推导出来。2.2 常见的凭据存储位置从攻击视角看RDP凭据可能散落在多个位置包括但不限于LSASS进程内存这是最常见的凭据宝库账号密码、哈希、Kerberos票据都集中在这里。凭据管理器Windows的凭据管理器Credential Manager会保存远程登录时勾选“记住凭据”的条目这些凭据经过DPAPI加密但解密的master key可能就在当前用户会话中。RDP缓存文件某些版本或配置下RDP会话的相关信息会缓存在本地文件中里面可能包含可用的验证信息。终端服务相关的进程内存如运行svchost或其他终端服务相关进程时也可能在内存中保留身份验证数据。这三种位置各具特色LSASS是最高价值的目标因为这里面的数据是最新的、可用的凭据管理器更适合拿到稳定的、长期有效的口令RDP缓存文件则可能在未及时清理的临时文件或系统卷影副本中被发现给攻击者留下可乘之机。2.3 为什么Mimikatz能发挥作用说到mimikatz很多人第一反应是“神器”但很少人真正理解它的工作原理。mimikatz之所以能从LSASS进程中提取到凭据基于一个核心前提——LSASS进程在认证过程中必须使用可逆的加密方式或直接在内存中以明文形式处理特定数据。以新版Windows系统为例微软默认启用了“受保护的用户”组和Credential Guard等功能来防止凭据被提取。但在默认配置的普通工作站和服务器环境中LSASS依然会以传统方式工作它需要使用用户的密码哈希来验证传入的认证请求并将这些哈希缓存在自己的内存空间中。这就为mimikatz这类工具提供了可乘之机。在解密的原理上wdigest、kerberos、tspkg这几种不同的认证提供程序会分别以不同的格式保存凭据。其中tspkg终端服务提供程序与RDP直接相关当用户通过远程桌面进行认证时tspkg会接收密码信息并以可逆的格式暂存在内存中以便后续的多跳认证和单点登录。mimikatz正是利用了这一特性通过读取LSASS进程的内存空间并解析特定结构来还原这些凭据。3. 实操前置确认环境与攻击条件3.1 环境说明与角色分配这一节先介绍一下我实际用到的测试环境方便你对照理解。我所在的模拟域环境中有三台主机攻击机模拟攻击者控制的主机运行Windows 10专业版IP为192.168.10.50。被突破的普通办公终端目标机运行Windows 10企业版IP为192.168.10.100属于某生产域的成员机器。目标服务器横向移动的最终目标运行Windows Server 2016IP为192.168.20.15数据库和内部核心应用都部署在这台机器上。初始攻击条件如下已通过钓鱼邮件拿到办公终端192.168.10.100的本地管理员权限。该管理员账户在该终端上拥有调试权限即具有SeDebugPrivilege。攻击流程的目标是获取到目标服务器192.168.20.15的RDP访问权限进而访问数据库。有了这些条件接下来就是实操的具体过程了。3.2 检查目标是否具备提权条件在实际执行中第一步不是急着去运行mimikatz而是先检查当前进程是否具备足够的权限。通过mimikatz提权的方式有两种privilege::debug开启SeDebugPrivilege用于读取其他进程的内存空间。token::elevate将当前令牌提升到SYSTEM权限以便访问LSASS进程。如果当前用户是本地管理员通常privilege::debug就够了但如果得到的是一个普通用户权限那还需要先进行本地提权才能完成后续步骤。这里有一个经常被新手忽略的细节如果当前会话是UAC用户账户控制过滤后的管理员令牌即便你是管理员组成员也需要先通过token::elevate或绕过UAC方式获得完整的管理员权限否则mimikatz后续操作会失败。我在实战中遇到过一个情况拿到的那台终端上虽然当前用户是管理员但UAC设置为总是通知导致所有操作都是以受限管理员身份运行的。折腾了一阵才发现要先执行UAC绕过这也提醒大家在做攻击路径推演时UAC的影响不可小觑。3.3 现场执行mimikatz的标准流程确认权限无误后我按以下流程操作第一步开启调试权限privilege::debug这条命令没有回显报错的话基本就说明权限够用了。如果返回错误那说明当前不是管理员权限或者被Credential Guard保护了。第二步提取LSASS中的所有凭据sekurlsa::logonpasswords这条命令会列出自系统启动以来的所有登录会话包括交互式登录、服务登录、网络登录以及最关键的远程桌面登录会话。输出中会显示对应会话的用户名、域名、以及NTLM哈希和明文密码如果系统支持。第三步定向提取RDP相关凭据sekurlsa::tspkg这个命令是专门针对终端服务提供程序的。如果mimikatz中的Sekurlsa模块能识别LSASS用于tspkg的内存地址就可以从中读出与RDP会话相关的明文密码信息。这里要说明的是看到的是最近一次RDP登录的凭据而不是历史上所有的RDP凭据。第四步检查凭据管理器中的RDP条目cmd::lsadump::credman这一步用于查看凭据管理器里保存的远程登录信息。如果目标用户曾经在凭据管理器中保存过RDP密码这里就能直接看到。执行结果分析通过sekurlsa::logonpasswords我成功获取到了192.168.20.15上管理员账户的NTLM哈希通过sekurlsa::tspkg还原出了明文密码。这两种凭据信息中的任意一种都可以直接用于远程登录。整个过程从开始到拿到凭据耗时不超过三分钟。4. 深入RDP会话凭据提取的执行细节4.1 RDP凭据提取的成功条件RDP凭据能不能成功提取很大程度上取决于三个条件第一LSASS进程中是否存有可解析的密码信息。这取决于目标系统的Windows版本。经过实际测试Windows 10 1607版本前的系统比较容易被直接提出明文而1709版本后的系统默认情况下不容易直接提出明文但哈希仍然是可以拿到的。在Windows Server 2016默认配置下RDP的明文提取概率要高于Windows 10。第二目标当前是否有活动的RDP会话。如果没有用户正在通过远程桌面连接这台机器或者登录完成后已经注销了会话凭据在内存中保留的时间就会非常短。最常见的情形是某个运维人员正在通过RDP连到服务器上操作这时同一台机器被攻击者拿到本地管理员权限内存中的RDP凭据就比较容易提取。第三是否存在可解除加密的DPAPI主密钥。如果凭据是通过Credential Manager保存的攻击者需要以该用户的身份来解密凭据条目。如果当前不是该用户上下文还需进行额外的分析和对抗比如获取该用户的密码哈希后模拟登录或利用DPAPI的相关漏洞来获取主密钥。4.2 实战中细化的操作步骤我在真实操作时并没有一套固定的命令走天下而是根据不同的现场情况微调方案。下面是我常用的两套中途方案。方案一直接从LSASS内存提取RDP相关的缓存信息# 先确认mimikatz版本和权限 mimikatz # version # 开启调试权限 privilege::debug # 列出当前所有登录会话 sekurlsa::logonpasswords # 如果输出过长可以配合log参数输出到文件 sekurlsa::logonpasswords /out:cred.txt # 导出LSASS进程的内存镜像便于离线分析 sekurlsa::minidump lsass.dmp方案二在目标服务器已开启Credential Guard的场景下的应对手段如果检测到LSASS进程运行在受保护的环境中通过检查Lsass进程是否存在“LsaIso”进程来判断常规的mimikatz提取方法就会失效。在这种场景下我的做法是先检查当前系统是否运行了LsaIso.exe进程如果存在说明已启用Credential Guard。在这种情况下考虑通过注册表方式暂时禁用Credential Guard这需要重启系统代价较大且容易引起蓝队警觉。或者逆向思路从内存文件中找到LSASS进程的写时复制副本再在离线环境中使用mimikatz的dcdiy模块来提取。这里我重点提一下minidump的用法。mimikatz支持通过sekurlsa::minidump读取离线导出的LSASS内存镜像文件这意味着我们可以先将LSASS的内存完整复制下来再把它拷贝到攻击机上慢慢分析。这样做的好处是目标机器上的操作时间极短不容易被检测到。常用的导出LSASS内存的方式包括使用系统自带的任务管理器、或使用其他开源工具如ProcDump等。但需要注意如果在导出过程中被杀毒软件拦截整个操作就会暴露所以这种方式更多适用于对抗能力较弱的模拟环境中。4.3 常见参数与输出字段解读实际执行sekurlsa::logonpasswords后回显往往包含大量无关信息——比如系统服务账户、机器账户的哈希等。这时候如何快速定位RDP凭据呢我一般会重点看这几类字段Authentication ID这个字段中的数字若是以xxxxx结尾的往往对应登录会话相关字段正常登录的会话ID不同具体分析时需要留意。Package如果显示为tspkg、wdigest、kerberos说明对应的凭据与远程桌面认证存在关联。Domain和User快速判断这个凭据属于哪个域和哪个用户。如果看到目标是高权限域管账户优先级会立刻拉高。NTLM哈希即使没有明文密码哈希也可以用于直接远程登录配合RDP的Pass-the-Hash技巧非常有效。Password在某些系统配置下这里会直接显示明文密码拿到手直接就能用了。这里我记录一段典型输出出于安全考虑已做脱敏处理Authentication Id : 0 ; 0x47f8 (123456) Session : Interactive from 192.168.10.100 User Name : Administrator Domain : X-DOMAIN Logon Server : X-DC01 Logon Time : 2024/3/15 9:24:31 SID : S-1-5-21-123456789-123456789-123456789-500 msv : [00000003] Primary * Username : Administrator * Domain : X-DOMAIN * NTLM : a3f4b2c1d5e6f7a8b9c0d1e2f3a4b5c6 * SHA1 : b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1 tspkg : * Username : Administrator * Domain : X-DOMAIN * Password : CleartextPassword123! wdigest : * Username : Administrator * Domain : X-DOMAIN * Password : (null) kerberos : * Username : Administrator * Domain : X-DOMAIN * Password : CleartextPassword123!看到tspkg和kerberos字段下都出现了明文密码基本上就说明了这个凭据可以直接用于远程登录目标服务器192.168.20.15。这里的Password字段显示的是暂时可用的明文密码。4.4 RDP会话凭据与Pass-the-Hash的配合拿到NTLM哈希后还有一个高效的方式配合工具进行Pass-the-Hash直接以哈希作为凭据发起RDP连接。这种方式在目标环境开启了Restricted Admin模式的情况下非常有效因为Restricted Admin模式本身就允许使用哈希进行认证而不需要明文密码。操作命令大致如下# 使用哈希直接发起远程桌面登录 xfreerdp /v:192.168.20.15 /u:administrator /pth:a3f4b2c1d5e6f7a8b9c0d1e2f3a4b5c6这种方式的优势在于不需要知道明文密码而且不会触发常规的“账户锁定”策略因为本质上属于Kerberos的PKINIT机制隐蔽性更高。当然如果目标系统不支持Restricted Admin模式就需要先通过哈希获取明文密码再用标准方式登录。整个过程就像打仗时手中同时握有钥匙和开锁工具哪个能用就用哪个。5. 检测与防御从蓝队视角升级RDP安全5.1 如何发现攻击行为如果我是防守方如何发现mimikatz提取RDP凭据的行为这需要从两个角度进行检测。第一个角度是进程行为监控。正常情况下一个普通进程不会主动请求SeDebugPrivilege来读取LSASS进程的内容。当出现以下行为特征时要立刻拉响警报某个非系统进程调用了OpenProcess去打开LSASS进程句柄。某个进程尝试使用MiniDumpWriteDump导出LSASS进程的内存镜像。进程加载了不常见的DLL到LSASS进程中可能是注入攻击的前奏。第二个角度是系统日志分析。Windows安全日志中与登录类型和权限相关的审计项可以揭示RDP凭据提取的痕迹登录类型10远程交互式登录短时间内在同一台机器上出现大量登录类型为10的记录说明有人在批量尝试RDP连接。事件ID 4624和4625结合审计策略详细记录每次远程登录的成功与失败信息。如果看到同一账户在短时间内连续登录多台机器很可能是横向移动。进程创建事件事件ID 4688如果捕获到mimikatz相关进程的执行记录则可以顺藤摸瓜找出攻击源头。在实际攻防演练中部署EDR终端检测与响应产品会大幅提高发现这类行为的能力。EDR可以通过行为特征如LSASS内存访问、异常进程创建精准捕获攻击行为并自动触发响应比如隔离主机、结束进程等。5.2 阻止RDP凭据被进一步滥用防御的核心思路是让攻击者在拿到凭据之后“用不了”。首先必须启用Credential Guard。这是微软官方提供的应对凭据窃取攻击的核心机制。开启后LSASS进程中的凭据数据将交由独立的虚拟化安全进程LsaIso保护常规的mimikatz提取手段都会失效。启用方式如下通过组策略开启“基于虚拟化的安全”。在“设备安全性”中启用“内核隔离”和“内存完整性”。确认运行msinfo32后“基于虚拟化的安全”显示为“正在运行”。其次可以将高权限账户加入到“受保护的用户”组。这个组的成员在认证时会使用更严格的机制不支持NTLM哈希的简单转发也不允许委派从而大幅降低凭据被重放的风险。再者建议限制本地管理员权限。很多攻击场景中攻击者之所以能提权到管理员是因为当前用户本身就在目标机器的本地管理员组中。最小权限原则的落实程度直接决定了攻击者的初始权限上限。5.3 安全配置与基线建议从长期防御视角看RDP相关的安全加固应形成一套完整的基线措施包括但不限于开启网络级别认证NLA这要求用户在建立RDP会话前先完成身份验证在一定程度上防止了凭据直接暴露在早期会话中。关闭不必要的RDP服务没有实际需求的服务器不应该开启远程桌面。即使需要开启也应该限制允许来源IP从网络层面隔离风险。使用远程桌面网关RD Gateway通过网关中转所有RDP流量并在网关层实施多因素认证这样即使拿到账户密码也无法直接访问后端服务器。定期轮换高权限口令万一凭据已经泄露短时间内通过定期轮换可以减少影响。尤其是服务账户和域管账户强烈建议建立固定周期的轮换机制。我在某次防御实战中发现真正让RDP凭据暴露的根本原因并不是技术漏洞而是运维习惯——有人习惯在办公终端上保存RDP凭据或者在不同服务器之间反复用同一个管理员密码。这些习惯为攻击者提供了打开内网大门的钥匙防御工作不仅要解决技术问题还要解决人的问题。6. 常见问题速查与避坑经验在多次渗透测试和攻防演练中RDP凭据提取不是每次都顺利。这里把常见问题和我的解决思路整理成表方便后续查阅。现象可能原因解决办法privilege::debug返回错误当前令牌权限不足UAC过滤尝试token::elevate或先绕过UAC检查是否本地管理员sekurlsa::logonpasswords输出为空系统启用了Credential Guard无活动会话确认是否运行LsaIso.exe换用离线分析LSASS dump的方式检查登录会话是否过期sekurlsa::tspkg无明文密码Windows版本较高默认不保存明文改用哈希进行Pass-the-Hash或提取Kerberos票据使用凭据管理器条目无法打开当前用户不是加密凭据的用户获取目标用户的NTDS哈希模拟该用户登录后再解密提取到哈希但无法RDP登录目标未开启Restricted Admin模式使用工具先转换出明文或结合SMB进行攻击与横向移动目标安装了杀毒软件mimikatz被杀杀软对内存操作有拦截考虑使用反射加载、分离免杀等方式但需注意合法授权范围这里再分享三个不会写在标准文档里的经验第一很多有价值的信息其实来自服务账户。渗透测试时很多攻防人员只关注域管账户而忽略了SQL服务、IIS应用池等账户。这些服务账户的密码往往长期不变且权限不小如果能在LSASS中提取到它们的哈希常有意想不到的收获。第二内存中的凭据具有时效性。如果目标机器长时间无人登录内存中的凭据可能已经被清理。这时候可以尝试诱导目标管理员重新登录——比如通过发送钓鱼链接、触发某种业务操作等。这就回到攻击链设计的层面单一技术动作很难保证成功前期的信息侦察和策略规划同样重要。第三取证时要保护好现场。在检测响应过程中如果发现疑似凭据窃取行为第一步不是直接杀进程或关机器而是先导出LSASS进程的内存镜像作为后续排查和溯源的关键证据。很多安全工程师在初期容易犯的错误是过度响应导致关键证据被清除。7. 从一次实战案例看整体攻防视角我复盘一个完整的攻击链帮你建立对RDP凭据提取在全局中的位置感知。时间线如下09:00——攻击者使用钓鱼邮件投递恶意宏在终端A上成功执行反弹得到一个普通用户权限。09:15——攻击者利用本地提权漏洞如PrintNightmare或类似CVE成功拿到终端A本地管理员权限。09:20——在管理员权限下运行mimikatz开启调试权限并从LSASS中提取到运维人员账户的NTLM哈希和明文密码。09:25——使用提取到的凭据通过RDP横向登录到终端B并在终端B上继续收集凭据。09:40——在终端B上发现存有域管账户的哈希配合内存中获取的会话票据成功拿下域控制器访问权限。在这个攻击链中第三步的RDP凭据提取是承上启下的关键节点。如果没有通过内存提取RDP凭据攻击者就只能停留在终端A的普通权限上无法继续深入内网。而实际场景中很多企业恰恰忽略了这一步的检测导致攻击者拿到管理员权限后畅通无阻。从防守方角度看如果在第三步能够及时通过EDR检测到LSASS进程的异常访问整个攻击链就会被拦腰截断。这也是我一直强调“检测响应及时性”的原因。防守方不是要阻止每一次攻击动作而是要在关键节点卡住攻击者的去路。这个案例让我意识到RDP凭据的安全问题本质上是一个安全配置与管理规范的复合问题。单靠某个安全产品无法解决需要从身份治理、认证方式、监控检测和应急响应四个维度全面发力。8. 写在最后攻防视角下的几点体会在实战中反复打磨RDP凭据的提取与防御后我个人最大的体会是技术本身是镜像的关键取决于使用者与上下文。mimikatz作为安全研究工具的价值无需赘述但如果企业内部的RDP配置长期处于“裸奔”状态这些工具就会变成攻击者手中的利器。从防御角度倒推回来几个优先级最高的改进方向值得特别关注一是尽快启用Credential Guard。在大型组织的Windows环境中这个功能虽然会带来一定的兼容性挑战比如与某些第三方认证软件的兼容性问题但相比凭据泄露造成的损失这些兼容性付出的成本完全可以接受。二是加强本地管理员账户的治理。很多企业的本地管理员密码是统一且长期不变的这种情况下攻击者只要拿到一台机器就会迅速掌握全网机器的登录权限。建议通过本地密码管理方案进行差异化管控定期轮换降低凭据被横向复用的风险。三是把“凭据窃取”当作核心监控场景来建设。无论是EDR的规则设计、还是SIEM的告警逻辑都应围绕LSASS访问、内存转储、凭据重放高频场景做针对性开发。技术对抗中抢先一步发现就等于阻止了一次深度渗透。最后想说的是安全对抗是一个持续更新的过程。攻击者不会只停留在一招一式上mimikatz只是整个攻击链中一个环节。真正有效的防御策略永远不是堆砌某个工具而是建立“监控到行为、响应到进程、修复到机制”的全链路安全运营体系。希望这篇实战记录能给你带来一些可落地的启示也期待大家在自己的环境中多多演练用实战驱动的思路来检验安全防线。