☰
RDP凭据内存窃取与防御:从Mimikatz提取到安全加固
2026/10/20 7:35:10 网站建设 项目流程

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 2016,IP为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的标准流程

确认权限无误后,我按以下流程操作:

  1. 第一步:开启调试权限
privilege::debug

这条命令没有回显报错的话,基本就说明权限够用了。如果返回错误,那说明当前不是管理员权限,或者被Credential Guard保护了。

  1. 第二步:提取LSASS中的所有凭据
sekurlsa::logonpasswords

这条命令会列出自系统启动以来的所有登录会话,包括交互式登录、服务登录、网络登录,以及最关键的远程桌面登录会话。输出中会显示对应会话的用户名、域名、以及NTLM哈希和明文密码(如果系统支持)。

  1. 第三步:定向提取RDP相关凭据
sekurlsa::tspkg

这个命令是专门针对终端服务提供程序的。如果mimikatz中的Sekurlsa模块能识别LSASS用于tspkg的内存地址,就可以从中读出与RDP会话相关的明文密码信息。这里要说明的是,看到的是最近一次RDP登录的凭据,而不是历史上所有的RDP凭据。

  1. 第四步:检查凭据管理器中的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凭据提取在全局中的位置感知。

时间线如下:

  1. 09:00——攻击者使用钓鱼邮件投递恶意宏,在终端A上成功执行,反弹得到一个普通用户权限。
  2. 09:15——攻击者利用本地提权漏洞(如PrintNightmare或类似CVE),成功拿到终端A本地管理员权限。
  3. 09:20——在管理员权限下运行mimikatz,开启调试权限并从LSASS中提取到运维人员账户的NTLM哈希和明文密码。
  4. 09:25——使用提取到的凭据通过RDP横向登录到终端B,并在终端B上继续收集凭据。
  5. 09:40——在终端B上发现存有域管账户的哈希,配合内存中获取的会话票据,成功拿下域控制器访问权限。

在这个攻击链中,第三步的RDP凭据提取是承上启下的关键节点。如果没有通过内存提取RDP凭据,攻击者就只能停留在终端A的普通权限上,无法继续深入内网。而实际场景中,很多企业恰恰忽略了这一步的检测,导致攻击者拿到管理员权限后畅通无阻。

从防守方角度看,如果在第三步能够及时通过EDR检测到LSASS进程的异常访问,整个攻击链就会被拦腰截断。这也是我一直强调“检测响应及时性”的原因。防守方不是要阻止每一次攻击动作,而是要在关键节点卡住攻击者的去路。

这个案例让我意识到,RDP凭据的安全问题本质上是一个安全配置与管理规范的复合问题。单靠某个安全产品无法解决,需要从身份治理、认证方式、监控检测和应急响应四个维度全面发力。

8. 写在最后:攻防视角下的几点体会

在实战中反复打磨RDP凭据的提取与防御后,我个人最大的体会是:技术本身是镜像的,关键取决于使用者与上下文。mimikatz作为安全研究工具的价值无需赘述,但如果企业内部的RDP配置长期处于“裸奔”状态,这些工具就会变成攻击者手中的利器。

从防御角度倒推回来,几个优先级最高的改进方向值得特别关注:

一是尽快启用Credential Guard。在大型组织的Windows环境中,这个功能虽然会带来一定的兼容性挑战(比如与某些第三方认证软件的兼容性问题),但相比凭据泄露造成的损失,这些兼容性付出的成本完全可以接受。

二是加强本地管理员账户的治理。很多企业的本地管理员密码是统一且长期不变的,这种情况下攻击者只要拿到一台机器,就会迅速掌握全网机器的登录权限。建议通过本地密码管理方案进行差异化管控,定期轮换,降低凭据被横向复用的风险。

三是把“凭据窃取”当作核心监控场景来建设。无论是EDR的规则设计、还是SIEM的告警逻辑,都应围绕LSASS访问、内存转储、凭据重放高频场景做针对性开发。技术对抗中,抢先一步发现就等于阻止了一次深度渗透。

最后想说的是,安全对抗是一个持续更新的过程。攻击者不会只停留在一招一式上,mimikatz只是整个攻击链中一个环节。真正有效的防御策略,永远不是堆砌某个工具,而是建立“监控到行为、响应到进程、修复到机制”的全链路安全运营体系。希望这篇实战记录能给你带来一些可落地的启示,也期待大家在自己的环境中多多演练,用实战驱动的思路来检验安全防线。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询