作者:Zero
介绍:有没有一种方法,可以重现曾经连过的远程画面呢?
0x00 前言
突发奇想,有没有一种方法,能够重现曾经连过的远程桌面的画面呢?
本文假定一种场景,心地善良的运维人员,往往都喜欢把密码写在 txt 中,然后把密码.txt
放置在运维机桌面上,通过办公电脑使用RDP
远程桌面连接到运维机,期间势必会打开桌面上的密码.txt
,众所周知,RDP 会话劫持
可以在会话建立状态下无需密码切换过去,但是对付不了已经彻底断开的,如果可以重现过去远程连接的画面,那岂不是可以在不拿到运维机权限的情况下就获得好东西呢?
当然,以上只是一种假设,如果可以重现画面,能获得的信息肯定不止局限在密码这一部分,说不定还会有资产表、拓扑图等等等等。
0x01 原理 and 手工实践
远程桌面大伙肯定不陌生,我们经常使用的mstsc
命令便是Windows
系统中的内置的远程桌面客户端,使用的是远程桌面协议(Remote Desktop Protocol
,简称RDP
)。
现在我们使用远程桌面客户端的时候,体验非常流程,使用过程就非常的舒适,但是从前车马很慢,书信很远,一秒只够传一张图,如果画面更新慢、操作不流畅会直接影响使用体验,于是聪明的开发者想到了对策进行优化,比如只传输屏幕中发生变化的图像、对传输的图像进行压缩、接收到的图像进行缓存等等。
在使用远程桌面连接服务器时,客户端会将缓存保存在当前用户的应用程序数据目录中,这部分数据在会话结束后也不会清除。
不过在旧版本系统中缓存的路径不一样,*.bmc
、*.bin
文件都是缓存文件。
新版本系统的缓存路径:
%USERPROFILE%\AppData\Local\Microsoft\Terminal Server Client\Cache\
旧系统缓存路径 :
%USERPROFILE%\Local Settings\Application Data\Microsoft\Terminal Server Client\Cache\
那么如果我们把缓存的图像全部提取出来,是不是可以看到画面了呢,答案当然是 Yes!
接下来开始解析缓存文件,以bcache24.bmc
为例,首先十六进制编辑器打开缓存文件,就可以看到缓存画面出现了!(!¥@……#*%@¥)
说正经的,RDP
的图像传输单位是图块,每个图块大小会存在差异,最常见的是64px * 64px
的矩形位图,也就是说缓存文件是由大量矩形位图数据组成。
bcache24.bmc
没有复杂的文件结构,每个缓存块的头部有 20 字节的信息,重要的信息是宽度
、高度
、字节数
。
该例子缓存文件的每像素比特数为32
,也就是表示一个像素需要4
个字节,那为了表示64px * 64px
图像的所有像素点,需要64 * 64 * 4 = 16384
个字节,而这也与缓存块头部信息中记录的的大小相符,按照这个数量手工恢复一张图片试试。
首先将16384
字节的图像信息提取出来,保存至新文件test.bmp
。
然后根据缓存文件中的20
字节头部信息,提取宽度
、高度
、字节数
,对构造的 BMP 图像的BMP Header
、DIB Header
进行调整,构造好的文件头如下。
现在把构造好的文件头与先前提取出来的数据进行合并。
将合并后文件保存预览下,打开合并后的test.bmp
。
OK,可以看到画面,虽然这张缓存图中的信息量少是少了点,但是不要紧,我们已经从原理出发,并且达成阶段性目的,学到了才是最重要的!
0x02 加固方式 or 缓解措施
这个功能点官方叫法是持久位图缓存
, 只要关闭这个功能就不会生成缓存文件,可以在每个.rdp
文件中配置,也可以在连接前修改连接选项,具体位置如下。
0x03 造轮子 or 找轮子
目前已经可以通过手工的方式从缓存中提取图片,但是效率极低,需要写个脚本进行自动提取,但是在写了一些代码后,发现已经有前辈做了这件事,考虑了一下,轮子还是要造,不过是自己学习的产物,代码很拙劣就不拿出来献丑了,这里就直接介绍现有的轮子,一起来看下批量提取出来的图片效果吧
先说结论,就目前情况来说,结果不是很理想,但是也不至于很差,是否具有实战意义还需要大伙结合实际情况进行评判。
批量提取后会生成出来很多很多的图片文件,这些图片文件的排列基本没有什么固定顺序,是按照屏幕画面变化的先后顺序来的,需要自行寻找有用的信息,比如前言提到的密码.txt
。
可以看到文件还是很乱的,不过耐心点继续找,是可以找到密码.txt
内容部分的缓存图像的。
虽然画面被分割成了很多小块,但是一瞬间进行的选中操作造成了区域性的连续画面变更,会导致缓存按照画面更新顺序进行排列,像这种情况很容易整理出这一大区块的屏幕内容,在本文假设的场景下,就可以获得密码.txt
中的文件内容。
其实把图片进行简易拼合,看起来的效果会更直观一点。
0x04 结语
本文并不复杂,个人认为,知其然知其所以然才是最重要的,工具始终是工具,不过话虽如此,工具还是要有的,需要的朋友可以在公众号回复0705-RDP
获取。
最后,虽然技术上可行,但是目前也存在缺陷,会影响实际信息收集体验,还需要向聪明的开发者进行学习,对其进行优化(目前的思路是对图像边缘进行相似度匹配,相似度高的组合在一起),当然,如果有成效,也会及时在这里分享给大家~~~