RenX6 发布于2022年11月8日 分享 发布于2022年11月8日 0x00 前言 之前的文章《渗透技巧——获得Windows系统的远程桌面连接历史记录》介绍了获取远程桌面连接历史的方法。 在实际渗透过程中,如果发现了远程桌面连接的历史,那么下一步就是想办法获取远程桌面连接使用的密码。 本文将结合RdpThief介绍从远程桌面客户端提取明文凭证的方法,并分享需要注意的细节。 RdpThief的地址: https://github.com/0x09AL/RdpThief 0x01 简介 本文将介绍以下内容: 获取远程桌面连接密码的思考 底特律图书馆hook系统API的使用方法 API监控器监控系统API调用的方法 使用RdpThief从远程桌面客户端提取明文凭据。 0x02 获取远程桌面连接口令的思路 通常有以下两种: 1.使用键盘记录器记录用户在mstsc.exe启动期间输入的密码。 2.当mstsc.exe启动时,读取mstsc.exe的内存数据,提取用户输入的密码。 RdpThief是第二种实现思想。它利用Detours库的hook系统API和API monitor来监控系统的API调用,找到mstsc.exe在内存中存储明文密码的位置。代码简洁有效。 0x03 使用Detours库hook系统API的方法 RdpThief在实现中使用了Detours库来挂接系统API,这里简单介绍一下Detours库的用法。 Detours库用于监控和检测Windows上的API调用,可以用来挂接系统API。 介绍了使用Detours库hook API的两种方法。 1.编译Detours源码并使用 (1)编译Detours源码 从以下地址下载Detours源代码: https://github.com/Microsoft/Detours 使用Visual Studio编译Detours源代码(这里以VS2015为例),需要区分32位和64位。 64位编译: 打开VS2015 x64本机工具命令提示符。 执行以下命令: cd绕路-主\src nmake 命令执行后,文件夹Detours-master下会生成以下三个文件夹,包括底特律的头文件和库文件。 斌。X64 包括 lib。X64 32位编译: 打开VS2015本机工具命令提示符。 执行以下命令: cd弯路-主\src nmake 命令执行后,文件夹Detours-master下会生成以下三个文件夹,包括底特律的头文件和库文件。 斌。X86 包括 lib。X86 (2)导入Detours 在新的C项目中添加相应版本的头文件: 绕路h detours.lib 代码如下: #包含“detours.h” #pragma注释(lib,' detours.lib ') 2.通过Install-Package自动安装 (1)安装 在Visual Studio中选择工具-获取包管理器-包管理器控制台。 输入安装命令: 安装包绕道 Detours库将被自动安装,如下图所示。 (2)导入Detours 代码如下: #包括 #pragma注释(lib,' detours.lib ') 使用Detours库的hook系统API时常用的几个函数: DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); detour tach(); detour detach(); DetourTransactionCommit() 钩子系统API Messagebox()的示例代码如下: #包括 #包括 #pragma注释(lib,' detours.lib ') static int(WINAPI * true MessageBox)(HWND,LPCTSTR,LPCTSTR,UINT)=MessageBox; int WINAPI OurMessageBox(HWND HWND,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType) { 返回TrueMessageBox(NULL,L'Hooked ',lpCaption,0); } int main() { DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); detour tach((PVOID)true messagebox,our messagebox); DetourTransactionCommit(); MessageBox(NULL,L'Hello ',L'Hello ',0); DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); detour detach((PVOID)true messagebox,our messagebox); DetourTransactionCommit(); } 0x04 使用API monitor监控系统API调用的方法 RdpThief使用API monitor来监控系统的API调用,并找到mstsc.exe在内存中存储明文密码的位置。下面简单介绍一下API monitor的用法。 API的下载地址: http://www.rohitab.com/downloads 运行后,需要选择要监控的模块,如下图所示。 然后选择要监控的流程,如下图所示 API会在流程运行时监控流程调用的API,如下图所示。 0x05 RdpThief测试 介绍RdpThief详细信息的文章: https://www . MD sec . co . uk/2019/11/rdpthief-extracting-clear-text-credentials-from-remote-desktop-clients/ RdpThief的代码包括三个部分: 1.C++工程,编译生成dll 生成的dll需要注入到mstsc.exe进程中 在这里,您可以使用我之前编写的dll注入的代码。地址如下: https://github . com/3g student/home-of-C-Language/blob/master/NtCreateThreadEx+ldrloaddll . CPP 但是,需要移除FreeDll()的函数,并且Dll需要一直在进程mstsc.exe的内存中记录用户输入的密码。 2.RdpThief_x64.tmp Shellcode格式dll,作者使用sRDI将编译后的dll转换成shellcode格式,方便cna脚本调用。 3.RdpThief.cna Colbalt Strike使用的cna脚本,用于以外壳代码格式注入dll 支持三个命令: Rdpthief_enable,每5秒搜索一次mstsc.exe,注入dll Rdpthief_disable,停止rdpthief_enable,但不卸载注入的dll。 Rdpthief_dump,显示捕获的凭证。默认读取路径是% %temp%\data.bin 实际测试 预期功能: 在mstsc.exe中输入用户名和密码后,无论是否正确,都会记录在文件% %temp%\data.bin中 1.Win10下没有问题 2.在Win7下,可以得到输入的用户名和密码,但是不能得到服务器名。 查找问题原因: 在实现中,RdpThief通过捕获API SspiPrepareForCredRead()来获取服务器名称 在Win7系统下,我用API monitor监控系统调用的API,发现这个API不存在,如下图。 找到问题的原因。 解决方法1: 通过搜索发现API CredReadW()可以记录服务器名,如下图所示 所以可以试试hook API CredReadW。示例代码如下: static BOOL(WINAPI * OriginalCredReadW)(LPCWSTR target name,DWORD Type,DWORD Flags,PCREDENTIALW * Credential)=CredReadW; BOOL HookedCredReadW(LPCWSTR目标名称,DWORD类型,DWORD标志,PCREDENTIALW *凭据) { lpServer=TargetName 返回OriginalCredReadW(目标名称、类型、标志、凭据); } 添加附着和分离代码: detour tach((PV oid)OriginalCredReadW,HookedCredReadW); detour detach((PV oid)OriginalCredReadW,HookedCredReadW); 解决方法2: 远程桌面建立连接后,远程桌面连接的记录将保存在注册表中。这里,可以通过读取远程桌面连接的历史来获得服务器名称。 使用的脚本地址: https://github . com/3g student/List-RDP-Connections-History/blob/master/List logged-in users . PS1 0x06 小结 介绍了利用Detours库的hook系统API和API monitor监控系统API调用的方法,测试了RdpThief,分享了在Win7中使用时获取服务器名称的方法,实现了远程桌面客户端明文凭证的提取。 留下回复 链接帖子 意见的链接 分享到其他网站 更多分享选项…
推荐的帖子