转储RDP凭据

本文为翻译文章,原文链接:https://pentestlab.blog/2021/05/24/dumping-rdp-credentials/

管理员通常使用远程桌面协议(RDP)来远程管理Windows环境。同时它也是系统会开启的标准的RDP,来作为允许用户访问其他网络的跳转站。然而,尽管该协议长时间被广泛使用,却并没有得到加固或适当的监视。

从红队角度来说,转储lsass进程的凭据,可能会导致横向移动来穿越网络,或者如果获取到域管理员账户的凭据则直接导致整个域被接管。与RDP协议相关的进程也存在于红队收集凭证的范围内。这些进程是:

  • 1.svchost.exe
  • 2.mstsc.exe

上述进程可以作为一个可选的选择来检索凭据而无需访问lsass,lsass通常来说已经是被EDR产品重点监控的进程。

svchost

服务宿主(svchost.exe)是一个系统进程,可以承载多个服务来防止资源消耗。当用户通过RDP连接进行身份验证时,终端服务由svchost进程托管。 基于WIndows身份验证机制的工作原理,根据Jonas Lyk的发现,凭据以纯文本形式存储在svchost进程的内存中。然而,查看进程列表,将会有多个svchost进程,因此可以通过执行以下其中一个命令来识别是哪个进程,托管了终端服务的连接。

查询终端服务:

sc queryex termservice

图解: svchost Identification – Service Query

查询哪个任务加载了rdpcorets.dll:

tasklist /M:rdpcorets.dll

图解: svchost Identification – RDP Core DLL

运行Netstat:

netstat -nob | Select-String TermService -Context 1

图解:svchost Identification – netstat

查看进程的内存字符串, 密码显示在用户名下方:

图解: Memory Strings

Sysinternal的进程转储也可用于通过指定PID和写入.dmp file文件的目录来转储内存。

procdump64.exe -ma 988 -accepteula C:\Users\pentestlab

图解:Memory Dumping – Process Dump

.dmp 文件可以传送到另一台主机用于离线分析。通过执行简单的grep便可识别出存储在用户名下方的内存文件中的密码。

strings -el svchost* | grep Password123 -C3

图解:Discovery of Password in Memory Dump

上述方法并不认为是完全可靠的,svchost进程在什么情况下会维持凭证仍然是未知的。但是,Mimikatz支持通过执行如下命令从已经存在的RDP连接中检索凭证。

privilege::debug
ts::logonpasswords

图解:Mimikatz – RDP Credentials

mstsc

当用户打开远程桌面连接应用以便通过RDP协议连接到其他系统时,将创建mstsc.exe进程。API hooking可以用于拦截用户提供的凭据,并将其用于横向移动。Rio Sherri开发了一个名为RdpThief的概念验证工具,它试图hooking mstsc 进程(CredIsMarshaledCredentialW 和 CryptProtectMemory)使用的函数,以检索凭据并将它们写入带磁盘上的文件中。该工具的详细信息可以在 MDSec 网站的一篇文章中找到。

从已被入侵且mstsc.exe正在运行的系统中,需要将DLL注入到该进程中。

SimpleInjector.exe mstsc.exe RdpThief.dll

图解:RdpThief.dll – DLL Injection

一旦用户输入了对目标主机进行身份验证的凭据,这些凭据将被捕获并写入到C:\temp文件夹的文件中。

图解:CredPrompt

creds.txt 文件包含了IP地址。如果使用提升的账户,则可以利用这些信息在网络中横向移动甚至提升权限。

该工具已由Josh Magri用 C# 重写。然而,与RdpThief相比,SharpRDPThief 使用IPC Server来接收来自mstsc.exe进程的凭据。如果mstsc.exe被终止,server 将会继续运行,并且当进程再次重新启动时会尝试再次进行Hooking。这解决了 RdpThief 要求进程已经存在的限制。

图解:SharpRDPThief

RDP 文件

对于倾向于通过RDP连接对特定主机进行多次身份验证的用户,他们可能会保存连接的详细信息,以便进行快速的身份验证。这些凭据使用数据保护API以加密的形式存储在Windows的凭据管理器。

图解:Credential Manager

Windows凭据在磁盘上的位置如下:

C:\Users\username\AppData\Local\Microsoft\Credentials

图解:Windows Credentials Location

该文件可以通过Mimikatz二进制文件查看:

dpapi::cred /in:C:\Users\pentestlab\AppData\Local\Microsoft\Credentials\ACC240EEE479C1B634EC496F9838074B

"pbData" 字段包含加密形式的信息。但是,用于解密的主密钥存储在lsass中,可以通过执行以下Mimikatz模块来检索。"guidMasterKey"也很重要,因为查询lsass时可能存在多个条目,并且需要将GUID与主密钥匹配。

sekurlsa::dpapi

图解:Mimikatz – DPAPI Master Key

再次执行带有主密钥的命令 dpapi::cred 模块将会返回解密内容和以纯文本形式公开的RDP凭证。

dpapi::cred /in:C:\Users\pentestlab\AppData\Local\Microsoft\Credentials\ACC240EEE479C1B634EC496F9838074B
/masterkey:05d8e693421698148d8a4692f27263201f1c65e0b3ac08e3be91ea75f43e71e9b398e2418ba0f0c62ea70a317bdba88f11da3adebd07d65d2b349f933eab85e1

图解:DPAPI – Decrypting Credentials

执行以下命令将提供这些凭据属于哪个Server的详细信息。

vault::list

图解:Mimikatz – Vault List

YouTube

视频演示: https://youtu.be/KzP-yx6Dq_U

参考

点击收藏 | 1 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖