0x00 前言

在之前的文章《渗透技巧——获得Windows系统的远程桌面连接历史记录》曾介绍了获得远程桌面连接历史记录的方法。

在实际的渗透过程中,如果发现了远程桌面连接的历史记录,奇热那么下一步就需要想办法获取远程桌面连接使用的口令。

本文将会结合RdpThief介绍从远程桌面客户端提取明文凭据的方法,分享需要注意的细节。

RdpThief地址:

https://github.com/0x09AL/RdpThief

0x01 简介

本文将要介绍以下内容:

· 获取远程桌面连接口令的思路

· 使用Detours库hook系统API的方法

· 使用API monitor监控系统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库来hook系统API,所以这里简要介绍一下Detours库的用法。

Detours库用于监视和检测Windows上的API调用,可以用来hook系统API。

这里介绍使用Detours库hook系统API的两种方法。

1.编译Detours源码并使用

(1)编译Detours源码

下载Detours源码,地址如下:

https://github.com/Microsoft/Detours

使用Visual Studio编译Detours源码(这里以VS2015为例),需要区分32位和64位。

64位编译:

打开VS2015 x64 本机工具命令提示符。

执行以下命令:

cd Detours-master\src
nmake

命令执行后将在文件夹Detours-master下生成以下三个文件夹,包括Detours的头文件和库文件。

· bin.X64

· include

· lib.X64

32位编译:

打开VS2015本机工具命令提示符。

执行以下命令:

cd Detours-master\src
nmake

命令执行后将在文件夹Detours-master下生成以下三个文件夹,包括Detours的头文件和库文件。

· bin.X86

· include

· lib.X86

(2)导入Detours

在新建的C++工程中添加对应版本的头文件:

· detours.h

· detours.lib

代码如下:

#include "detours.h"
#pragma comment (lib,"detours.lib")

2.通过Install-Package自动安装

(1)安装

在Visual Studio中选择工具->NuGet包管理器->程序包管理器控制台。

输入安装命令:

Install-Package Detours

将会自动安装Detours库,如下图:

(2)导入Detours

代码如下:

#include <detours.h>
#pragma comment (lib,"detours.lib")

使用Detours库hook系统API时常用的几个函数:

· DetourTransactionBegin();

· DetourUpdateThread(GetCurrentThread());

· DetourAttach();

· DetourDetach();

· DetourTransactionCommit()

Hook系统API Messagebox()的实例代码如下:

#include <Windows.h>
#include <detours.h>
#pragma comment (lib,"detours.lib")
static int(WINAPI *TrueMessageBox)(HWND, LPCTSTR, LPCTSTR, UINT) = MessageBox;
int WINAPI OurMessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType) {return TrueMessageBox(NULL, L"Hooked", lpCaption, 0);
}
int main()
{DetourTransactionBegin();DetourUpdateThread(GetCurrentThread());DetourAttach(&(PVOID&)TrueMessageBox, OurMessageBox);DetourTransactionCommit();MessageBox(NULL, L"Hello", L"Hello", 0);DetourTransactionBegin();DetourUpdateThread(GetCurrentThread());DetourDetach(&(PVOID&)TrueMessageBox, OurMessageBox); DetourTransactionCommit();
}

0x04 使用API monitor监控系统API调用的方法

RdpThief使用API monitor监控系统的API调用,找到mstsc.exe在内存中存储明文口令的位置,这里简要介绍一下API monitor的用法。

API monitor的下载地址:

http://www.rohitab.com/downloads

运行后需要选择进行监控的模块,如下图:

接着选择需要监控的进程,如下图:

API monitor将会监控进程运行时调用的API,如下图:

0x05 RdpThief测试

介绍RdpThief细节的文章:

https://www.mdsec.co.uk/2019/11/rdpthief-extracting-clear-text-credentials-from-remote-desktop-clients/

RdpThief的代码里包括三部分内容:

1.C++工程,编译生成dll

编译生成的dll,需要注入到mstsc.exe进程中。

这里可以使用我之前写的dll注入的代码,地址如下:

https://github.com/3gstudent/Homework-of-C-Language/blob/master/NtCreateThreadEx %2B LdrLoadDll.cpp

但是需要把FreeDll()的功能去掉,dll需要一直在进程mstsc.exe的内存中,用来记录用户输入的口令。

2.RdpThief_x64.tmp

shellcode格式的dll,作者使用sRDI将编译好的dll转换为shellcode格式,便于cna脚本的调用。

3.RdpThief.cna

Colbalt Strike使用的cna脚本,用于注入shellcode格式的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下能够获得输入的用户名和口令,但无法获得Server名称。

查找问题原因:

RdpThief在实现上通过捕获API SspiPrepareForCredRead()获得Server名称。

在Win7系统下,我使用API monitor监控系统调用的API,发现不存在这个API,如下图:

找到问题的原因

解决方法1:

通过搜索,发现API CredReadW() 能够记录Server名称,如下图:

所以可以尝试hook API CredReadW ,示例代码如下:

static BOOL(WINAPI *OriginalCredReadW)(LPCWSTR TargetName, DWORD Type, DWORD Flags, PCREDENTIALW *Credential) = CredReadW;
BOOL HookedCredReadW(LPCWSTR TargetName, DWORD Type, DWORD Flags, PCREDENTIALW *Credential)
{lpServer = TargetName;return OriginalCredReadW(TargetName, Type, Flags, Credential);
}

添加Attach和Detach代码:

DetourAttach(&(PVOID&)OriginalCredReadW, HookedCredReadW);
DetourDetach(&(PVOID&)OriginalCredReadW, HookedCredReadW);

解决方法2:

远程桌面建立连接后会在注册表保存远程桌面连接的记录,这里可以通过读取远程桌面连接的历史记录获得Server名称。

使用的脚本地址:

https://github.com/3gstudent/List-RDP-Connections-History/blob/master/ListLogged-inUsers.ps1

0x06 小结

本文介绍了使用Detours库hook系统API和使用API monitor监控系统API调用的方法,测试RdpThief,分享在Win7下使用时获得Server名称的方法,实现了从远程桌面客户端提取明文凭据。

渗透技巧——从远程桌面客户端提取明文凭据相关推荐

  1. python socket tcp6_渗透技巧——使用远程桌面协议建立通道

    0x00 前言 最近从@cpl3h的博客中学到了使用远程桌面协议建立通道的方法. 本文将对这个方法进行整理,结合自己的经验,添加个人理解. 学习地址: 0x01 简介 本文将要介绍以下内容: ·使用场 ...

  2. 推荐三个Windows远程桌面客户端,mRemote、TSMMC.MSC、Terminals

    推荐非常好用的三个WINDOWS远程桌面客户端,mRemote.TSMMC.MSC.Terminals WINDOWS下大多都是直接用远程桌面进行远程管理,服务器稍微一多,有那十来多台以上的服务器,还 ...

  3. [转]RamDisk导致远程桌面客户端无法启动问题

    在一次重启系统后发现无法运行远程桌面客户端,运行后进行连接即报错. 查看日志有AppCrash错误: 错误应用程序名称: mstsc.exe,版本: 6.1.7600.16385,时间戳: 0x4a5 ...

  4. 解决“远程会话已断开连接,因为访问被拒绝导致许可证存储的创建失败,请使用提升的权限运行远程桌面客户端”问题

    解决"远程会话已断开连接,因为访问被拒绝导致许可证存储的创建失败,请使用提升的权限运行远程桌面客户端"问题 参考文章: (1)解决"远程会话已断开连接,因为访问被拒绝导致 ...

  5. web远程桌面客户端_您所说的内容:桌面与基于Web的电子邮件客户端

    web远程桌面客户端 We clearly tapped into a subject you all have a strong opinion about with this week's Ask ...

  6. 如何提升权限运行远程桌面客户端?

    ​ 我们远程支持他人的时候,有些情况下需要管理员权限才能执行操作,比如更新软件.那么如何提升权限运行远程桌面客户端? 如果您使用 Splashtop SOS 软件远程支持客户,可以使用连线提权功能提升 ...

  7. windows系统无法远程桌面提示CredSSP 身份验证协议和远程桌面客户端

    引言 微软在2018 年 3 月 13 日初始版本更新了所有受影响平台的 CredSSP 身份验证协议和远程桌面客户端.2018年5月8日将默认设置从"易受攻击"更改为" ...

  8. linux下远程桌面客户端Remmina

    今天推荐一下这个客户端软件,Remmina 远程桌面客户端,可以传输文件和用命令链接操作,挺方便,可以试试哦 安装方法  apt-get install remmina 安装之后,直接运行  remm ...

  9. Windows10远程桌面客户端无法登录,出现“CredSSP encryption...”的解决方法

    → 现象描述 当使用Windows远程桌面客户端登录服务器时,可能会出现无法登录的现象,最常见的一种如下: 简单的翻译一下就是"发生了身份验证错误,可能的原因是由于CredSSP加密 -&q ...

最新文章

  1. CentOS Linux 7 安全基线设置
  2. Elasticsearch之分布式介绍
  3. 协防差_西班牙男篮的投篮比美国还差 为什么在2019年世界杯夺冠
  4. 2018python培训-2018年5月python自动化运维开发课程新班正式开课!
  5. 机器学习实战读书笔记--k邻近算法KNN
  6. 【Smartform】开发中报SSFCOMPOSER154错误原因分析
  7. Greg Kroah-Hartman LDD3 作者,LKN作者,linux driver 开发者,新闻两则,因为过时了所以就放我这个垃圾博客里吧...
  8. matlab lmi 定义一个任意方阵,matlab中LMI应用说明
  9. linux环境发送中文失败,linux - 无法从linux命令发送邮件 - SO中文参考 - www.soinside.com...
  10. springboot 日志级别_SpringBoot实战(十三):Admin动态修改日志级别
  11. java api接口签名验证失败_cryptapi结合java进行数字签名与验证签名的困惑
  12. 戴森工程师揭秘Dyson 360 Eye吸尘机器人的故事:先要做到“智能”
  13. 第六届蓝桥杯试题c/c++B组5
  14. i2c通信的详细讲解_STM32Cube15 | 使用硬件I2C读写温湿度传感器(SHT30)
  15. 阿里巴巴CTO程立:双11的再进化
  16. PySpark : Structured Streaming
  17. JavaWeb项目作业 Market商品管理系统
  18. unity中Asset Store下载的资源保存位置
  19. 汇编指令rep stosq
  20. 自己对ajax的第一次上手被人说菜死还真是菜

热门文章

  1. c# winform以及wpf下子pannel或paneldock里切换多个子窗体的方法
  2. 不见棺材不落泪,不到黄河不死心
  3. Adobe Magento 2 认证证书的变化
  4. Hive实践1之【静态分区及动态分区基本操作】
  5. Unity3D关于模型合并,模型简化
  6. ROS采集GPS/北斗数据在百度地图中可视化位置
  7. midi接口 stm32_ALIENTEK MiniSTM32读取midi文件数据出错
  8. 阿里云oss之sts服务部署
  9. HUNAN UNIVERSITY ACM/ICPC Judge Online —— Problem 10026 谁拿了最多奖学金
  10. 软件项目管理笔记汇总及考试要点