红蓝对抗:曾经连过的RDP也能泄露信息? – 作者:宸极实验室Sec

作者:Zero

介绍:有没有一种方法,可以重现曾经连过的远程画面呢?

0x00 前言

突发奇想,有没有一种方法,能够重现曾经连过的远程桌面的画面呢?

本文假定一种场景,心地善良的运维人员,往往都喜欢把密码写在 txt 中,然后把密码.txt放置在运维机桌面上,通过办公电脑使用RDP远程桌面连接到运维机,期间势必会打开桌面上的密码.txt,众所周知,RDP 会话劫持可以在会话建立状态下无需密码切换过去,但是对付不了已经彻底断开的,如果可以重现过去远程连接的画面,那岂不是可以在不拿到运维机权限的情况下就获得好东西呢?

当然,以上只是一种假设,如果可以重现画面,能获得的信息肯定不止局限在密码这一部分,说不定还会有资产表、拓扑图等等等等。

0x01 原理 and 手工实践

远程桌面大伙肯定不陌生,我们经常使用的mstsc命令便是Windows系统中的内置的远程桌面客户端,使用的是远程桌面协议(Remote Desktop Protocol,简称RDP)。

image

现在我们使用远程桌面客户端的时候,体验非常流程,使用过程就非常的舒适,但是从前车马很慢,书信很远,一秒只够传一张图,如果画面更新慢、操作不流畅会直接影响使用体验,于是聪明的开发者想到了对策进行优化,比如只传输屏幕中发生变化的图像、对传输的图像进行压缩、接收到的图像进行缓存等等。

在使用远程桌面连接服务器时,客户端会将缓存保存在当前用户的应用程序数据目录中,这部分数据在会话结束后也不会清除。

image

不过在旧版本系统中缓存的路径不一样,*.bmc*.bin文件都是缓存文件。

新版本系统的缓存路径:
%USERPROFILE%\AppData\Local\Microsoft\Terminal Server Client\Cache\

旧系统缓存路径 :
%USERPROFILE%\Local Settings\Application Data\Microsoft\Terminal Server Client\Cache\

那么如果我们把缓存的图像全部提取出来,是不是可以看到画面了呢,答案当然是 Yes!

接下来开始解析缓存文件,以bcache24.bmc为例,首先十六进制编辑器打开缓存文件,就可以看到缓存画面出现了!(!¥@……#*%@¥)

image

说正经的,RDP的图像传输单位是图块,每个图块大小会存在差异,最常见的是64px * 64px的矩形位图,也就是说缓存文件是由大量矩形位图数据组成。

bcache24.bmc没有复杂的文件结构,每个缓存块的头部有 20 字节的信息,重要的信息是宽度高度字节数

image

该例子缓存文件的每像素比特数为32,也就是表示一个像素需要4个字节,那为了表示64px * 64px图像的所有像素点,需要64 * 64 * 4 = 16384个字节,而这也与缓存块头部信息中记录的的大小相符,按照这个数量手工恢复一张图片试试。

首先将16384字节的图像信息提取出来,保存至新文件test.bmp

image

然后根据缓存文件中的20字节头部信息,提取宽度高度字节数,对构造的 BMP 图像的BMP HeaderDIB Header进行调整,构造好的文件头如下。

image

现在把构造好的文件头与先前提取出来的数据进行合并。

image

将合并后文件保存预览下,打开合并后的test.bmp

image

OK,可以看到画面,虽然这张缓存图中的信息量少是少了点,但是不要紧,我们已经从原理出发,并且达成阶段性目的,学到了才是最重要的!

0x02 加固方式 or 缓解措施

这个功能点官方叫法是持久位图缓存, 只要关闭这个功能就不会生成缓存文件,可以在每个.rdp文件中配置,也可以在连接前修改连接选项,具体位置如下。

image

0x03 造轮子 or 找轮子

目前已经可以通过手工的方式从缓存中提取图片,但是效率极低,需要写个脚本进行自动提取,但是在写了一些代码后,发现已经有前辈做了这件事,考虑了一下,轮子还是要造,不过是自己学习的产物,代码很拙劣就不拿出来献丑了,这里就直接介绍现有的轮子,一起来看下批量提取出来的图片效果吧

先说结论,就目前情况来说,结果不是很理想,但是也不至于很差,是否具有实战意义还需要大伙结合实际情况进行评判。

批量提取后会生成出来很多很多的图片文件,这些图片文件的排列基本没有什么固定顺序,是按照屏幕画面变化的先后顺序来的,需要自行寻找有用的信息,比如前言提到的密码.txt

image

可以看到文件还是很乱的,不过耐心点继续找,是可以找到密码.txt内容部分的缓存图像的。

image

虽然画面被分割成了很多小块,但是一瞬间进行的选中操作造成了区域性的连续画面变更,会导致缓存按照画面更新顺序进行排列,像这种情况很容易整理出这一大区块的屏幕内容,在本文假设的场景下,就可以获得密码.txt中的文件内容。

其实把图片进行简易拼合,看起来的效果会更直观一点。

image

0x04 结语

本文并不复杂,个人认为,知其然知其所以然才是最重要的,工具始终是工具,不过话虽如此,工具还是要有的,需要的朋友可以在公众号回复0705-RDP获取。

最后,虽然技术上可行,但是目前也存在缺陷,会影响实际信息收集体验,还需要向聪明的开发者进行学习,对其进行优化(目前的思路是对图像边缘进行相似度匹配,相似度高的组合在一起),当然,如果有成效,也会及时在这里分享给大家~~~

image

来源:freebuf.com 2021-07-05 15:53:56 by: 宸极实验室Sec

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论