从远程桌面客户端提取明文凭证的工具RdpThief

news2024/9/30 5:37:51

导语:在本文中,我将描述我编写的一个工具,能使用API钩子从Microsoft RDP客户端提取明文凭据,而且如果是在已经受感染用户的权限下操作(比如网络钓鱼导致),并且该用户已打开RDP会话,则可以提取明文凭据而无需提权。

介绍

远程桌面(RDP)是用于管理Windows Server的最广泛使用的工具之一,除了被管理员使用外,也容易成为攻击者的利用目标。登录到RDP会话的凭据通常用于是具有管理权限的,这也使得它们成为红队行动的一个理想目标。站在传统的角度看,许多人倾向于使用LSASS进行凭据盗窃,但是lsass.exe通常受到EDR和防病毒产品的监视,而且对LSASS的操作通常需要权限访问,于是我们自然就会考虑,有没有一种更容易的替代方案?

在本文中,我将描述我编写的一个工具,能使用API钩子从Microsoft RDP客户端提取明文凭据,而且如果是在已经受感染用户的权限下操作(比如网络钓鱼导致),并且该用户已打开RDP会话,则可以提取明文凭据而无需提权。

API钩子

简单来说,API钩子是通过将程序重定向到另一个函数来拦截程序中函数调用的过程。这是通过重新编写目标函数的内存代码来实现的。有几种API挂钩方法,技术都比较复杂,细述的话需要单独的篇章。

而就本文而言,我们将使用到的是Microsoft Detours库,该库是开源的,并且支持32位和64位进程。其他框架(如Frida)也能提供类似的功能,但是Detours是非常轻量级的。为了演示这个库有多么强大,我们将使用它为MessageBox函数创建一个钩子。

钩住函数之前,我们需要做两件事,一个是包含原始函数地址和被钩住函数地址的目标指针,为了使钩子正常工作,目标函数和被钩住的函数都应具有相同数量的参数、参数类型和调用约定。

在下面的示例中,我们钩住了MessageBox调用并修改了传递给原始函数的参数。

#include "pch.h"
#include <Windows.h>
#include <iostream>
#include <detours.h>
 
static int(WINAPI * TrueMessageBox)(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType) = MessageBox;
int WINAPI _MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType) {
     return TrueMessageBox(NULL, L"Hooked", L"Hooked", 0);
 }
int main()
{
// Hook MessageBox
DetourRestoreAfterWith();
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)TrueMessageBox, _MessageBox); // Two Arguments DetourTransactionCommit();
MessageBox(NULL, L"We can't be hooked", L"Hello", 0); // Detach Hooked Function
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourDetach(&(PVOID&)TrueMessageBox, _MessageBox); DetourTransactionCommit();
}

运行程序,第二个消息框应为Unhooked,但由于我们将其钩住并修改了参数,所以消息框如下图所示:
在这里插入图片描述

寻找要钩住的函数

在进行任何挂钩之前,我们需要确定感兴趣的函数。这些函数最好将我们感兴趣的数据作为参数;在本例中,是服务器主机名/IP、用户名和密码。对于这种情况,API监视器是一个非常强大的工具,它允许你附加到一个进程,记录所有API调用并浏览结果。

为此,我们将API监视器附加到mstsc.exe并启动一个示例连接:
在这里插入图片描述
现在,我们可以在所有API调用中搜索作为用户名提供的字符串。在本例中,几个API调用都包含此字符串,但是最值得注意的一个是CredIsMarshaledCredentialW。
在这里插入图片描述
通过MSDN,我们可以看到它只使用一个指向C Unicode字符串的long指针类型的参数。
在这里插入图片描述
为了确保通过挂钩此函数获得正确的数据,我们将Windbg附加到mstsc.exe,并在CredIsMarshaledCredentialW处设置一个断点。尝试登录时,我们可以看到传递给该函数的第一个参数是Unicode字符串的地址。
在这里插入图片描述
按照相同的方法搜索密码字符串,然后可以看到对CryptProtectMemory的调用,并带有指向密码字符串的指针。

在这里插入图片描述
根据API监视器,CryptProtectMemory位于Crypt32.dll中,由于该函数是在最新版本的Win10上由dpapi.dll导出的,因此位置不正确。为了确保我们在此API调用上也具有正确的数据,我们将Windbg附加到进程,并为CryptProtectMemory函数设置一个断点。
在这里插入图片描述
通过检查内存,我们可以假定传递的参数是指向结构的指针。由于我们所需要的信息只是结构的开始,因此不必完全解析它。与前面的示例相反,该函数有多个调用,其中不包含我们所需要的信息。我们可以观察到前4个字节中包含了密码字符串的大小,从内存中读取大小,并比较它是否大于0x2,如果条件为true,则意味着结构中包含密码并可提取。

SspiPrepareForCredRead遵循相同的过程,该过程接收IP地址作为第二个参数。

在这里插入图片描述

RdpThief演示

现在,我们清楚地了解了需要挂钩哪些函数以提取信息,这些信息可以作为实现类似于RdpThief的功能的基础。

RdpThief本身是一个独立的DLL,当注入mstsc.exe进程时,它将执行API钩子,提取明文凭据并将其保存到文件中。它附带一个攻击者脚本,负责管理状态、监视新进程并将shellcode注入mstsc.exe。DLL已使用sRDI项目转换为shellcode。启用后,RdpThief将每5秒获取一次进程列表,搜索mstsc.exe后注入其中。

当将攻击者脚本加载到Cobalt Strike上时,将提供三个新命令:

rdpthief_enable:启用对新的mstsc.exe进程的心跳检查并将其注入。

rdpthief_disable:禁用新mstsc.exe的心跳检查,但不会卸载已加载的DLL。

rdpthief_dump:打印提取的凭据(如果有的话)。

可以在此视频中找到RdpThief的简单演示。

RdpThief工具源代码在此。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/485741.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

elasticsearch 使用 RestAPI 操作索引库

1.mysql与elasticsearch 我们统一的把mysql与elasticsearch的概念做一下对比&#xff1a; MySQLElasticsearch说明TableIndex索引(index)&#xff0c;就是文档的集合&#xff0c;类似数据库的表(table)RowDocument文档&#xff08;Document&#xff09;&#xff0c;就是一条条…

如何从0到1落地自动化测试?何为成熟模型?测试老鸟的总结...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 过去十年&#xf…

离散数学_九章:关系(5)

&#x1f6a9;9.5 等价关系 1、等价关系&#xff08;Equivalence Relations&#xff09;等价关系等价的元素&#x1f4d8;例1&#xff1a;模m同余 &#x1f4d8;例2&#xff1a;字符串 &#x1f4d8;例3&#xff1a;整除 2、等价类&#xff08;Equivalence Classes&#xff09…

DP动态规划

1.背包问题 1.1 0/1背包 1.1.1经典做法 def solve(N,C): # 从左到右&#xff0c;从上到下 &#xff08;先种类&#xff0c;再体积&#xff09;for i in range(1,N1): # N种物品&#xff0c;先1种&#xff0c;再2种......for j in range(0,C1): # 当前背包体积if c[i]>j :…

武忠祥老师每日一题||定积分基础训练(四)

已知&#xff0c; ln ⁡ ( x 1 x 2 ) 为奇函数&#xff08;证明放在文章末尾&#xff09; \ln (x\sqrt{1x^2})为奇函数&#xff08;证明放在文章末尾&#xff09; ln(x1x2 ​)为奇函数&#xff08;证明放在文章末尾&#xff09; 所以&#xff0c; ∫ − 2 2 ln ⁡ ( x 1 …

13万字林业局信息化设计信息化及数据中心、森林防火平台建设方案

1.1.1 应用系统集成平台 集成平台起到“承下启上”的作用&#xff0c;“承下”是指其基于数据中心&#xff0c;提供数据关联、处理和转换等服务&#xff0c;“启上”是指其为上层应用系统提供数据和整合服务。此外&#xff0c;集成平台也为系统与外部系统、外部资源提供交换和…

基于micro-app+vue-element-admin实现微前端

简述 本文是在对之前搭建和学习micro-app的基础上的进一步研究学习。 因为我们目前项目使用的框架是vue-element-admin&#xff0c;所以还需要研究一下micro-app在vue-element-admin的使用方法。 关于micro-app在vue-element-admin的实现&#xff0c;百度什么也没找到&#xf…

二、Spring Cloud Alibaba环境搭建

一、依赖环境 SpringCloud Alibaba 依赖 Java 环境来运行。还需要为此配置 Maven环境&#xff0c;请确保是在以下版本环境中安装使用。 64 bit JDK 1.8;Maven 3.2.x。 spring-cloud-alibaba相关网址&#xff1a; 地址&#xff1a;https://github.com/alibaba/spring-cloud-…

常用HTML标签分享系列一

前言 HTML,超文本标记语言,由标签组成,分为单标签和双标签,每个标签的属性id唯一,但name不唯一,其基本结构为Dom(Document Object Mode 文档对象模型)树,如图: <html lang"en"> <head><!-- 头部内容 --> </head> <body><!-- 身体内…

Spark 任务执行流程

Driver启动&#xff0c;创建SparkContextSparkContext 向资源管理器注册&#xff0c;并向资源管理器申请运行 Executor资源管理器分配资源&#xff0c;然后资源管理器启动 ExecutorExecutor 发送心跳至资源管理器Executor 向 SparkContext 注册自己SparkContext 构建 DAG 有向无…

图神经网络:在自定义数据集上动手实现图神经网络

文章说明&#xff1a; 1)参考资料&#xff1a;PYG官方文档。超链。 2)博主水平不高&#xff0c;如有错误还望批评指正。 文章目录 自定义数据集动手实现图神经网络自定义数据集训验测集拆分&#xff0c;创建Data的数据结构&#xff0c;观察Data的基本信息&#xff0c;可视化图网…

【Golang项目实战】用Go写一个学生信息管理系统,真的太酷啦| 保姆级详解,附源码——建议收藏

博主简介&#xff1a;努力学习的大一在校计算机专业学生&#xff0c;热爱学习和创作。目前在学习和分享&#xff1a;数据结构、Go&#xff0c;Java等相关知识。博主主页&#xff1a; 是瑶瑶子啦所属专栏: Go语言核心编程近期目标&#xff1a;写好专栏的每一篇文章 学习了Go的基…

Java 基础进阶篇(十)—— Java集合详细总结

文章目录 一、集合类体系结构二、Collection系列集合2.1 Collection 集合体系2.2 Collection 集合体系特点2.3 Collection 常用API2.4 Collection 集合的遍历方式2.4.1 方式一&#xff1a;迭代器2.4.2 方式二&#xff1a;foreach&#xff08;增强for循环&#xff09;2.4.3 方式…

Python系列之Windows环境安装配置

目录 一、Python安装 1.1下载 1.2 安装 1.3增加环境变量 二、PyCharm安装 2.1 PyCharm简介 2.2 PyCharm下载安装 一、Python安装 1.1下载 python 官网The official home of the Python Programming Languagehttps://www.python.org/downloads/ 1.2 安装 要勾选选项 Ad…

校园兼职平台系统的设计与实现

技术栈&#xff1a; Spring、SpringMVC、MyBatis、HikariCP、fastjson、slf4j、EL和JSTL 系统功能&#xff1a; 前台&#xff1a; &#xff08;1&#xff09;用户注册&#xff1a;这里的用户分为职位发布者和职位应聘者&#xff0c;他们都需要注册本大学生兼职管理系统才能进…

为什么 OpenAI 团队采用 Python 开发他们的后端服务?

Python&#xff0c;年龄可能比很多读者都要大&#xff0c;但是它在更新快速的编程界却一直表现出色&#xff0c;甚至有人把它比作是编程界的《葵花宝典》&#xff0c;只是Python的速成之法相较《葵花宝典》有过之而无不及。 Python简洁&#xff0c;高效的特点&#xff0c;大大…

196页11万字智慧水务平台建设方案

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除。 业务需求分析 3.1 主要业务描述 &#xff08;1&#xff09;调度中心主要业务描述 配套工程调度中心为一级调度机构&#xff0c;同时也是水务集团原水供水的统一调度中心。…

python-pandas库

目录 目录 目录 1.pandas库简介&#xff08;https://www.gairuo.com/p/pandas-overview&#xff09; 2.pandas库read_csv方法&#xff08;https://zhuanlan.zhihu.com/p/340441922?utm_mediumsocial&utm_oi27819925045248&#xff09; 1.pandas库简介&#xff08;http…

第七章 使用ssh服务管理远程主机

第七章 使用ssh服务管理远程主机 一、配置网卡服务 1、配置网卡参数 &#xff08;1&#xff09;、执行nmtui命令运行网络配置工具 [rootcentos ~]# nmtui&#xff08;2&#xff09;、选择编辑连接并按回车 &#xff08;3&#xff09;、选择以太网中网卡名称并编辑 &#xf…

JavaWeb06(三层架构连接数据库)

目录 三层架构 1.什么是三层架构 三层架构 就是将整个业务划分为三层&#xff1a;表示层、业务逻辑层、数据访问层。 2. 层与层之间的关系 3.怎么理解三层架构 4.为什么需要三层架构 区分层次的目的是为了“高内聚&#xff0c;低耦合”的思想&#xff1b; 简单来说&…