サイト内の現在位置

RDPビットマップキャッシュについて

NECセキュリティブログ

2023年10月6日

NECサイバーセキュリティ戦略統括部セキュリティ技術センターの山﨑です。リモートデスクトッププロトコル(RDP)は、多くの方が活用していることからも分かるように、非常に便利な機能です。一方で、攻撃者によるシステム間の横展開の手法としても悪用されます。今回は、RDPの技術の一部である、RDPビットマップキャッシュについて書きます。

RDPビットマップキャッシュとは

RDPは、リモートコンピューターからクライアントに画面データ(大量の画像データ)を転送する必要があるため、通信量やレスポンスが問題となり得ます。RDPビットマップキャッシュは、同じ画像が再度転送されることを防ぎ、クライアント側でキャッシュされた画像を再利用する技術です。これにより、ネットワークトラフィックが削減され、RDPのレスポンスが向上します。

RDPビットマップキャッシュの基本

RDPビットマップキャッシュは、リモートデスクトップ接続クライアント(mstsc.exe)を起動後、エクスペリエンスタブ内の「ビットマップのキャッシュを保持(A)」にチェックを入れることで生成されます。生成先は、以下のフォルダです。
"%UserProfile%\AppData\Local\Microsoft\Terminal Server Client\Cache"

このフォルダ配下に、以下のような形式のファイルが生成されます(#は数値)。

  • bcache##.bmc
  • Cache####.bin

bcacheファイルの末尾(##の部分)には、2/22/24のいずれかの数字が付与されます。付与される数値が大きいほど、ビットマップ画像の質が高くなりますPDF[1]。このファイルは古いOSでは使用されていたようですが、最近のOSでは中身は空です。
Cacheファイルの末尾(####の部分)には、セッション毎に0000/0001/0002・・・のような数値が付与されます。このファイル内にキャッシュされた画像データが保持されています。多数のRDPセッションを確立したシステムの場合には、多数のCacheファイルが生成されます。

フォレンジック調査での活用

フォレンジック調査での活用という点において、RDPビットマップキャッシュは、以下のような特徴があると考えます。

  • 攻撃者がRDPセッション中にターゲットシステム上で行った行動を画像データで確認可能。
  • RDP接続元(クライアント側・横展開元)に痕跡が残る。

上記①については、攻撃者が実際に操作していた画面を確認できるため、各種操作がどのような手段で行われたのかを特定できる可能性があります(例:GUI or CUI)。私が過去に対応した事案では、ウイルス対策ソフトの設定をGUIで変更しようとしていた様子が確認できました。②について、攻撃の痕跡の多くは、その攻撃が行われたシステム上に残ります。一方で、RDPビットマップキャッシュはRDP接続元に残る痕跡であり、横展開先システムの調査では判明しなかった事象が明らかになる可能性もあります。同様の特徴を持つ痕跡が、Windowsイベントログにもあります(例:SecurityイベントログのイベントID4648)。

解析例

RDP接続元をWindows11、RDP接続先をWindows Server 2016 Essentialsとして、RDPビットマップキャッシュを解析してみます。本ブログでは、RDPビットマップキャッシュを解析するツールとして、BMC-Toolsnew window[2]とRdpCacheStitchernew window[3]を使います。

クライアントからサーバーにRDP接続を行い、数分間コマンドプロンプトやブラウザの操作を行ってセッションを切断しました。セッション切断後、Cacheフォルダには以下のファイルが生成されます。上述の通り、キャッシュされた画像データが保持されているのはCache0000.binファイルです。

BMC-Toolsを使って、Cache0000.binをパースします。使用したオプションは以下の通りです。

  • -sオプション:キャッシュファイルまたはフォルダを指定。フォルダを指定した場合は、そのフォルダ内にあるキャッシュファイル全てがパース対象。
  • -dオプション:パース結果の出力先。
  • -bオプション:パースされた全ビットマップ画像(タイル)を集約したビットマップ画像を生成。

> python .\bmc-tools.py -s "C:\Users\<username>\AppData\Local\Microsoft\Terminal Server Client\Cache\Cache0000.bin" -d .\output\ -b
[+++] Processing a single file: 'C:\Users\<username>\AppData\Local\Microsoft\Terminal Server Client\Cache\Cache0000.bin'.
[===] 2063 tiles successfully extracted in the end.
[===] Successfully exported 2063 files.
[===] Successfully exported collage file.

パース結果の出力先であるoutputフォルダには2063個のタイルが生成されました。下図は、その一部です。

-bオプションを付与することでタイルを集約したビットマップ画像も出力されます。このファイルを確認することで、全体像や雰囲気はつかめるものの、少し見にくいです。

そこで、RdpCacheStitcherを使ってみます。このツールは、BMC-Toolsなどでパースされたタイルを入力として各タイルをパズルのピースのように扱うツールです。
パズルをすることで、RDPセッション中にコマンドプロンプトで実行したコマンドや、ブラウザの操作を確認することができました。画像に隣接するブロックを押下すると、候補のタイルも表示されます。例えば、下図①部分のブロックを押下すると、②の領域に候補となり得るタイルが表示されます(今回の場合、黒色を含んだタイルが表示されました)。

まとめ

RDPビットマップキャッシュの概要と解析例を紹介しました。RDPビットマップキャッシュはRDP接続元に残る痕跡です。RDPビットマップキャッシュを調査することで、横展開先システムの調査では判明しなかった事象が明らかになる可能性もあります。本ブログを見て興味を持たれた方は、お試しとして自身のマシンのRDPビットマップキャッシュを解析してみるのはいかがでしょうか。

参考情報

執筆者プロフィール

山﨑 泉樹(やまざき せんじゅ)
セキュリティ技術センター リスクハンティング・システムグループ

ペネトレーションテスト、インシデント対応に関する業務に従事。
CISSP、RISS、GPEN、GCPN、SANS FOR508メダルを保持。

執筆者の他の記事を読む

アクセスランキング