当前位置: 首页 > 技术干货 > Windows 取证之BMChache

Windows 取证之BMChache

发表于:2021-07-13 14:36 作者: mtr 阅读数(662人)

0x0、概述

BMChache全称RDP Bitmap Chache,即RDP(远程桌面协议)位图缓存。是Windows为了加速RDP连接时的显示,减少数据量的传输,改善RDP连接体验的一种缓存机制。


0x1、什么是RDP Bitmap Chache

Remote Desktop Protocol(RDP)是微软从Windows NT 4.0开始为了用户能使用图形界面通过网络远程方式连接到另外一台计算机而开发的专有协议。


当年因为是拨号上网,网络带宽很低,便开发了Bitmap Chache这种技术,为了增强用户体验,降低带宽延迟,RDP连接后,会将显示的图像在客户端以位图的形式缓存下来,RDP会话会重用这些图像进行显示,而不是时刻都使用网络进行完整图像传输,而是只传输改变的部分,从而减少了延迟。虽然现在网络带宽已经得到很大的提升,但这一技术特性依然还是被保留了下来。


BMChache分为两种类型,一种是Bitmap Chaces(位图缓存),一种是Persisten Bitmap Chaches(持久位图缓存)。Persistent Bitmap Chaches是从Windows 2000的RDP 5.0版本开始引入的技术。区别在于,前一种是临时缓存,与RDP会话生命周期绑定,后一种是持久化的缓存,不受到RDP会话生命周期的限制,即使会话结束后,内容依然会持久化的存在于文件中。


位图缓存选项可以由用户配置是否开启,可以打开远程桌面连接程序查看:

image-20210708143007579.png


需要注意的是,位图缓存只存在与远程连接的客户端系统中,而不是服务端系统中。

在Windows xp中的存储位置位于:%USERPROFILE%\Local Settings\Application Data\Microsoft\Terminal Server Client\Cache\路径中:

image-20210708145417701.png

其文件名组成是“bchache + 图像位深度 + .bmc后缀”,其中的数字表示位图的质量,如果是bchache2.bmc表示是图像的位深度是8bit,bcache22.bmc表示图像的位深度是16bit,bcache24.bmc表示存储的图像位深度是32bit,单位是bpp(bits per pixel)。在Windows XP等老系统中,bchache**.bmc文件的最大大小是20MB。


在Windows 7及更高版本系统中,其文件存储在 :%USERPROFILE%\AppData\Local\Microsoft\Terminal Server Client\Cache\路径中:


image-20210708153250489.png

包括两种类型,一种是bcache**.bmc,一种是Cache****.bin。bchache**.bmc用于老旧的系统,而Cache****.bin文件用于Windows 7及更高版本的系统。Cache****.bin文件大小最高可以达到100MB,当超过100MB,会新增一个文件,文件名中的数值从0000开始递增。(如:Cache0001.bin、Cache0002.bin),与.bmc文件支持8bpp到32bpp位深度图像不同,.bin文件的图像位深度是固定的32bpp。


0x2、Bitmap Chache文件结构


.bmc文件结构:


.bmc文件并没有固定的头部标识,但它是由一张张BMP图像组成的文件,每个单独的区块文件头信息组成如下:

image-20210709094754603.png


前八个字节(83 8F 42 86 6E C8 EF B3)是图像的哈希值,接下来的两个字节(40 00)是图像的宽度,然后两个字节(40 00)是图像的高度,然后四个字节(00 20 00 00)表示图像的大小(单位是字节),接下来的四个字节(11 00 00 00)表示图像的特定参数(是否压缩)。总共占用20个字节。


以这里的bchache22.bmc为例,每个区块的图像宽高都是0x40,也就是64x64大小的图像,其图像的位深度是16 bit,说明每个像素需要2个字节来存储。那一个区块的图像总大小为 :64x64x2=8192 bytes,如果是24bpp则占用12288 bytes,32bpp占用16384 bytes。


.bin文件结构:


.bin文件有固定的文件头标识,以字符串RDP8bmp开头,占用8个字节,后面四个字节为版本号,共十二个字节。

image-20210709103314266.png


然后是每个区块图像的文件头:


image-20210709103948333.png


其中前八个字节(35 CE 5E 97 15 DA 7E E9)是区块图像的哈希值,然后两个字节(40 00)是图像的宽度,然后两个字节是图像的高度(40 00)。与之前的.bmc存储不同,.bin中的每个区块图像的位深度都是32bpp,每个区块图像占用16384 bytes。


我们可以参考bmp的文件结构组成,添加其文件头信息,手动构建bmp文件,把文件导出来:


image-20210709150930150.png

image-20210709151019544.png

image-20210709151105437.png

关于bmp文件的格式可以参考 https://en.wikipedia.org/wiki/BMP_file_format#Pixel_storage


0x3、RDP BitMap Chache在取证中的意义


在前面,我们已经说明了,RDP BMChache只存在于客户端,如果攻击者在横行移动攻击中,使用了跳板机RDP远程连接了目标机器进行了某些操作,取证人员就可以在跳板机上分析BMChache文件进行取证。


我们做一个简单的演示,这里使用远程桌面连接一台远程机器,执行一些操作:

image-20210712120805348.png


然后我们使用工具BMC Viewer查看一下BMC文件的内容:

image-20210712121144554.png

可以看到缓存的位图图像中,有我们执行操作的部分内容的图像。点击每个区块的内容,会显示区块的文件头内容,可以根据这个导出图像.


0x4、取证实践


攻击者通过某些手段已经入侵并拿到了GOT公司职员Little Finger的电脑控制权,攻击者在这台电脑上使用了GOT\varys-adm域管理员凭证连接到了域控服务器,攻击者利用这台电脑作为入口点对组织进行横向渗透。


提供给我们的取证资料包括Little Finger计算机的Windows日志和littlefinger用户配置文件。我们需要找出Varys-adm的密码。

image-20210712123943510.png


通过获取的日志可以发现登录的记录:

image-20210712142138351.png


在littlefinger用户的配置相关文件中找到了RDP Bitmap Chache文件:


image-20210712143501159.png

我们使用工具对Cache0000.bin进行解析,这里使用bmc-tools.py工具(下载地址:https://github.com/ANSSI-FR/bmc-tools)。



image-20210712143928424.png


查看解析出来的图像:


image-20210712144007677.png

通过查看这些图像,发现了保存GOT\varys-adm密码的信息:


image-20210712144223638.png

从解析的缓存图像分析,域管理员可能是使用了Windows 10的便签功能把密码贴在桌面上了。


至此我们通过BMChache找出了密码信息,用户名:GOT\varys-adm,密码:Uncutedition1@#


参考资料:


[MS-RDPEGDI]: Bitmap Caches | Microsoft Docs:https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-rdpegdi/2bf92588-42bd-4527-8b3e-b90c56e292d2


BMP file format - Wikipedia https://en.wikipedia.org/wiki/BMP_file_format


管理工具和登录类型参考 - Windows Server | Microsoft Docs https://docs.microsoft.com/zh-cn/windows-server/identity/securing-privileged-access/reference-tools-logon-types