转储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
参考
- https://www.mdsec.co.uk/2019/11/rdpthief-extracting-clear-text-credentials-from-remote-desktop-clients/
- https://www.n00py.io/2021/05/dumping-plaintext-rdp-credentials-from-svchost-exe/
- https://github.com/0x09AL/RdpThief
- https://github.com/mantvydasb/RdpThief
- https://github.com/passthehashbrowns/SharpRDPThief
- https://www.ired.team/offensive-security/code-injection-process-injection/api-monitoring-and-hooking-for-offensive-tooling
- https://labs.f-secure.com/blog/attack-detection-fundamentals-2021-windows-lab-3/