本サイトは、快適にご利用いただくためにクッキー(Cookie)を使用しております。
Cookieの使用に同意いただける場合は「同意する」ボタンを押してください。
なお本サイトのCookie使用については、「個人情報保護方針」をご覧ください。
普段我々がWindows PCを操作するときに必ず目にする領域、いわゆる、ファイルやフォルダのアイコンが並んでいる「デスクトップ」という領域があります。
実はそのデスクトップの裏側に、通常では見ることのできない「隠されたデスクトップ」が存在し悪用されている可能性があります。本記事では、その脅威と仕組みを掘り下げて解説します。
結論から述べると、Windows OSでは通常のデスクトップ(”Default”という名称のデスクトップ)の他に新たな別のデスクトップを任意に作成することができる仕組みが存在します。ただし、一般のユーザーが簡単に作成できるような方法や手段は用意されていません。あくまでプログラムからデスクトップを新たに作成するコード(Win32API)を呼び出して明示的に作成する必要があります。
そして、この仕組みを利用してユーザーには見ることのできない隠されたデスクトップを作成し悪用する脅威が存在します。
新しく作成されたデスクトップの世界では、通常通りファイルやフォルダを開いたりアプリケーションを実行したりすることができますが、我々が通常目にしているデフォルトのデスクトップの世界からはその様子を見ることができません。つまり攻撃者がマルウェアをユーザーのPCに感染させ、そのマルウェアを利用してそのユーザーのPCに新しいデスクトップを作成し、そのデスクトップの上で悪事を働いても、その間ユーザーに気づく術はありません。
本記事でははじめに、Windows OSにおけるデスクトップの仕組みを解説し、その後、隠されたデスクトップを悪用する脅威の事例として、ランサムウェア(スクリーンロッカー)と、オンラインバンキングマルウェア(gozi/dreambot /ursnif /ramnit/carberp等)が利用するHidden VNC(hVNC)について取り上げます。
なお、セキュリティ事業者・関係者の方々であっても「オンラインバンキングマルウェアがHidden VNC(hVNC)を利用する」ということまではなんとなく把握していても、では具体的にどういう仕組みで、どのように?という点までは理解されていない方も多いのではないでしょうか。本記事ではそうしたポイントも把握できるよう情報を盛り込みました。
また記事の最後には、筆者が今回新たに作成した隠しデスクトップを悪用する脅威を炙り出せる調査ツール「HiddenDesktopViewer」をダウンロードできるGitHubのリンクを掲載しました。是非セキュリティ調査等で活用していただければと思います。
■Windows OSにおけるデスクトップとその構造
Windows OSを利用する上であまり意識せずに日々利用しているものに「デスクトップ」という仕組みが存在します。いわゆるPCが起動した際にアイコンや壁紙が表示されているおなじみのデスクトップを指します。
実はこのデスクトップの構造は意外と奥が深く、以下のような全体構造(概略)を持ちます。
図 1 Windows OSとその周辺の構造
普段我々が目にしているデスクトップは「Session1」(正確には1以上の番号が割当てられる)という構造の中の「WinSta0」というWindowStation名の構造の中の「Default」という名前のデスクトップです。
そして上の図を見ると分かる通り、デスクトップは一つだけではありません。ログイン画面やスクリーンセーバー用のデスクトップ等デフォルトで存在する特殊なデスクトップや、意図的に新しいデスクトップを作成することも可能です。例えば、普段我々が管理者権限の必要なプログラムを実行しようとした場合に暗転して表示されるおなじみの「UAC」画面がありますが、実は「Winlogon」という特殊なデスクトップが利用されています。
なお、通常のデスクトップとは別に新しく作られたばかりのデスクトップは、アイコンやタスクバーがなく壁紙だけが表示された、まっさらなデスクトップ画面となります。何も表示されていない理由はエクスプローラー(Explorer.exe)が起動していないためであり、「Explorer.exe」を起動すると、通常のデスクトップと同じようにアイコンやタスクバーが表示されるようになります。
また、エクスプローラーが起動すれば、後は通常のデスクトップと同じようにファイルやフォルダを開いたりウインドウを表示したりと、普段のデスクトップと同じ使い勝手で利用することができます。
図 2 新しく作成されたデスクトップの様子
では具体的にどのように新しいデスクトップを作成できるのでしょうか。
実はユーザーが容易に作成できる手段はデフォルトで用意されていません。
Win32API(Windowsの関数)を利用するコードでプログラムを作成するか、外部のフリーツールなどを利用する必要があります。
プログラムでデスクトップを操作する場合に主に利用するWin32APIは以下となります。
- デスクトップを作成:CreateDesktop
- 自身のスレッドにデスクトップを紐づけ:SetThreadDesktop
- デスクトップを切り替え(指定したデスクトップに移動):SwitchDesktop
- デスクトップのハンドルを取得:OpenDesktop
要点を述べると、CreateDesktopという関数を使うことで新しいデスクトップを作成することができ、SwitchDesktopという関数を呼び出せばアクティブなデスクトップの切り替えがプログラムで可能になるということです。
フリーツールなどを利用せずに新しいデスクトップを作成・利用したい場合、これらのWin32APIを使用してプログラムを作成する必要がありますが、新しいデスクトップに移動したあと、うっかり元のデスクトップに戻るコードをつけるのを忘れてしまうと、PCを再起動またはログオフするまで2度と元のデスクトップに戻ることができなくなる等、なかなか慎重な処理が要求されます。
なお、個々のデスクトップ間には、それぞれのデスクトップ内に作成されているウインドウの列挙(閲覧)ができないという制限があります(下図参照)。
図 3 異なるデスクトップ間ではウインドウの列挙ができないという制限が存在
これを悪用した脅威も存在します。詳しくは後述しますが、例えば、オンラインバンキングマルウェア等が利用するHiddenVNC(hVNC)を通して攻撃者がユーザーの隠しデスクトップ上で様々なウインドウを開いていても、元のデスクトップ側から(ツールなどを利用して)それらを列挙することは基本的にできません(ただしプロセスへの干渉は可能)。
また、一般的に分類するとWindowStationはプロセスに紐付き、Desktopはスレッドに紐付いています。
つまり、一般的なアプリケーションにおいて新しく作成するウインドウ(モードレスウインドウ:トップに表示されているウインドウを閉じなくても同じアプリケーションの他のウインドウ操作ができるウインドウ)は別スレッドとして生成されるため、「デスクトップ1」で起動したプロセスが「デスクトップ2」側に新しいウインドウ(スレッド)を作成するといった操作も可能となります。
これを悪用した脅威の一つがランサムウェア「Tyrant」であり、後述で詳しく触れます。
なお、なぜWindowsではこのデスクトップの拡張機能に関して、一般ユーザーが簡単に扱えるような仕組みが用意されておらず、一方で新しいデスクトップ(拡張デスクトップ)を作成するための一連のWin32APIがMSDNで公開されているのかという点に関しては、推測となりますが、例えば、店頭に置くPC等で特定のアプリケーションだけを触れるようにしたいケースや、通常のデスクトップから隔離させてウインドウを表示するゲームを作成できるように、どちらかというと開発者が様々な用途に併せたアプリケーションを開発できるようにしているのかもしれません。(詳しくは後述しますが、Windows10ではユーザーが簡単に利用できる仮想デスクトップという類似する別の機能が付与されています。)
以上、Windows OSにおけるデスクトップの構造とその仕組みを解説しました。
以降では、こうした仕組みを悪用する具体的な脅威について紹介し解説します。
■デスクトップに潜む脅威①―ランサムウェアの事例―
「ランサムウェア」や「スクリーンロッカー」(参考:https://www.mbsd.jp/research/20171018/shinigamilocker/)の類は、様々な方法を用いて脅迫メッセージをユーザーの目に晒そうと必死です。ユーザーに脅迫メッセージをしっかりと見てもらわない限り、金銭搾取の目的は達成できず、攻撃者は攻撃をした意味がなくなるからです。(もちろん、破壊すること自体に目的を持つ「ワイパー」などその限りではないタイプも中には存在します)
ランサムウェアやスクリーンロッカーがどのような方法で脅迫メッセージを表示させようとするのか、その脅迫メッセージの提示手段について簡単にまとめてみました。
様々な脅迫画面の提示方法
ランサムウェアやスクリーンロッカーが利用する数々の脅迫画面の提示方法を大きく6つに分類し紹介します。
1)テキストファイルや画像ファイルを用いた方法
これはよくある手法のひとつです。感染するとファイルの暗号化とともに脅迫メッセージを記載したテキストファイルや画像ファイルを作成し、既定のアプリケーションで表示させるタイプです。
2)壁紙を用いた方法
感染すると、PCの壁紙の設定を脅迫メッセージの画像に変更します。上に挙げた1)の手法ではテキストや画像の表示に関連付けられた一般のアプリケーションが利用されるためユーザーは簡単に終了させることができ、それにより脅迫メッセージが閉じられてしまった場合ユーザーが脅迫メッセージを再度確認することを少々困難にさせますが、それに引き換え、この手法では壁紙全体に脅迫メッセージを表示させることで、どのような状況でもPCを操作している間であれば脅迫メッセージをユーザーの目に晒すことが可能です。
3)ウインドウを用いた方法
感染すると、ウインドウを表示させ、そのウインドウ内に脅迫メッセージを記述する方法です。その場合、ウインドウは以下の属性を持つケースが多くなります。
- タイトルバーがない
- タスクバーに表示されない
- 動かせない(マウスの移動やクリック処理が無効化されている)
- 最大化状態(フルスクリーンで画面を占拠)
これらの要素をすべて持つウインドウを作成された場合は一見画面に画像(脅迫画像)が張り付いたように見えます。ウインドウを使うメリットとしては、ユーザーに情報を入力させたりボタンを押させたりとインタラクティブなやり取りが出来るようになる点、また、アニメーション(支払い期限までの制限時間のカウントダウン表示等)や派手な演出を行うことが可能となり、ユーザーにより緊迫した状況であると伝えることが可能となる、などが挙げられます。
4)ブラウザを利用した方法
感染すると、あらかじめ用意していた脅迫メッセージが記載されたHTMLファイルまたは脅迫メッセージが掲載されたURLを既存のブラウザで開かせる方法です。
この際、以下の属性をブラウザに付与されているケースがあります。
- 最大画面での表示
- タイトルバーがない
- タスクバーに表示されない
また、正規プロセスである「MShta.exe」およびHTAファイルを利用するケースもこれに含みます。HTAファイルの方がより自由度が高いウインドウ制御ができる点で攻撃者にとって利便性は高いかもしれません。
ブラウザを利用するメリットとしては、身代金の送付先や連絡先等を動的に変更することが容易である点などが挙げられます。
5)ブート領域を用いた方法
感染すると、システムディスク(ハードディスク)のブート領域を書き換えるタイプのもので、感染しブート領域が書き換えられたPCを再起動させると、ブート領域に書き込まれた脅迫文が表示されます。Windows OSが起動する前の段階で脅迫文面が表示されるため、より一層PCを乗っ取られたかのように感じインパクトの面ではより大きいといえます。ただし感染PCが使用できなくなるため、他の方法と比較するとユーザー側のPCを使った支払い操作や連絡が困難となる点は、攻撃者側にとってデメリットにもなりうるといえるでしょう。
6)新しく作成したデスクトップを用いる方法
最後にご紹介するこのテクニックが本記事の本題となります。
既存のデスクトップとは異なる別のデスクトップを作成し、新しいデスクトップ側に脅迫画面を表示させる方法です。様々な観点から見ても効果的な脅迫メッセージの提示手法であり、以降では、この6つ目のテクニックについてピックアップし解説します。
新しいデスクトップを作成し利用する脅迫文面の提示方法
ではこの方法を少し深掘りして見ていきましょう。
ここでは「Tyrant」と呼ばれるランサムウェアを例にし、その仕組みを解説します。
「Tyrant」は感染すると、新しいデスクトップを作成する以下の操作を行います。
まず、GetThreadDesktopというWin32APIを用いて、現在のデスクトップに関する設定情報を一時的に保存(バックアップ)します。つぎに、CreateDesktopを用いて、新しいデスクトップを作成します。これだけではまだ既存のデスクトップの裏で新しいデスクトップが作成されただけなので、SwitchDesktopで新しく作成したデスクトップをアクティブにし、SetThreadDesktopで現在のプログラムのスレッドと新規作成したデスクトップを関連付けします。
図 4 新しいデスクトップを利用するTyrantのコード
これらの一連の操作により、「Tyrant」の操作配下となる新しいデスクトップがアクティブになります。
そして、「Tyrant」は脅迫文面を表示させたウインドウを作成し表示します。
以下がわかりやすく表したイメージとなります。
図 5 Tyrantが新しいデスクトップを作成して切り替えるイメージ図
以上の結果、ユーザーが目にするデスクトップ(以下、アクティブデスクトップ)は以下のようになります。
図 6 ユーザー側に表示される「Tyrant」の作成した新しいデスクトップ
この時点で「Tyrant」の脅迫ウインドウが表示された新しいデスクトップが表示され、ユーザーは元のデスクトップにアクセスすることができなくなります。(上で触れたとおり新しく作成されたデスクトップには「Explorer.exe」が起動していないため、アイコンやタスクバーは表示されません。)
なおこの際、「Tyrant」の本体プロセスは元のデフォルトデスクトップ側に存在し、上図の脅迫画面は「Tyrant」の本体プロセスから作成された「ウインドウ」となります。
これはつまり以下のような概念となります。
図 7 「Tyrant」の脅迫画面表示における仕組みの概念図
上図で分かる通り、「Tyrant」が作成したウインドウは異なるデスクトップ間をまたがっており、上の方で解説したデスクトップ間に存在する制限のとおり、デフォルトのデスクトップからは「Tyrant」の脅迫画面のウインドウ情報を列挙することができません。つまり例えばウインドウ情報で不正検知を行うようなセキュリティ製品があった場合、その検知を迂回することが可能となります。
「Tyrant」によるこの拡張デスクトップを利用した脅迫テクニックには、次にあげるような攻撃側のメリット(=ユーザー側のデメリット)があります。
まず、新しいデスクトップでは何も表示されないため調査ツールやアプリケーションが起動できません。(Explorerが起動していないためファイルやフォルダ等が開けない)。そのため、ユーザーが行える操作を最大限抑えつつ、脅迫画面に対するマウス操作やキー入力等は自由にし、逆に攻撃者にとって必要な支払い連絡等ユーザー操作を許可させることができます。
また、セキュリティソフトがランサムウェアを駆除できたとしてもPCを再起動するまで元のデスクトップに戻りません。あるプログラムが作成したデスクトップはそのプログラムが終了しても消えないため、明示的にデフォルトデスクトップに戻る処理が呼ばれない限り元のデスクトップに戻れず、ユーザー側に混乱を招く可能性があります。
なお繰り返しとなりますが、調査者の観点においても、例えばデフォルトのデスクトップにウインドウ列挙をするようなツールがあったとして、そのツールではこのランサムウェア(スクリーンロッカー)のウインドウを列挙(把握)することはできません。これは上でも述べたとおり、異なるデスクトップ間ではそれぞれ互いのデスクトップ内のウインドウ情報にアクセスできないという制限があるためです。
以上のことより、新しいデスクトップを作成するこの手法は、ランサムウェア(スクリーンロッカー)の脅迫テクニックの中でも色々な観点で鑑みると効果的であるといえるでしょう。
■デスクトップに潜む脅威②―オンラインバンキングマルウェア(Hidden VNC)の事例―
新しく作成したデスクトップを悪用するもう一つの主な脅威としてオンラインバンキングマルウェアが挙げられます。オンラインバンキングマルウェアは感染したPCで潜伏を続け、ユーザーがオンラインバンキングを利用するタイミングを見計らいパスワードやIDなどのログイン情報を盗むといった不正操作を行うマルウェアですが、それらの中にHiddenVNC(hVNC)という不正なモジュール(部品)を利用して感染PCを遠隔操作するタイプも多く存在します。(※HiddenVNCとは、オープンソースの遠隔操作ソフトである正規の「VNC」が改造された不正なモジュールであり、一般的なVNCとは異なります)
通常のVNC(遠隔操作ソフト)ではマウスやウインドウの動きが、操作される側と操作する側で連動するため、遠隔操作されていることが一目瞭然ですが、HiddenVNC(hVNC)というモジュールを利用すると、遠隔操作する側がウインドウを開いたりプログラムを起動したりといった操作をしても、遠隔操作される側の画面には一切変化が現れません。つまり感染PCの前にいるユーザーにばれることなく堂々と感染PCを遠隔操作することができるのです。実はここに本記事で焦点を当てている隠しデスクトップの仕組みが利用されています。
図 8 一般的な遠隔操作だと不正操作がすぐばれてしまうため攻撃には不向き
HiddenVNC(hVNC)を利用した基本的な攻撃の流れは次のようになります。まず攻撃者は、オンラインバンキングマルウェアに感染させると、併せてHiddenVNC(hVNC)に感染させます。それにより、HiddenVNC(hVNC)が感染PC上に新しいデスクトップ(=隠しデスクトップ)を作成します。そして、HiddenVNC(hVNC)は攻撃者側(操作ツール側)への接続を試行します。接続が確立したらあとは攻撃者の思うままであり、隠しデスクトップ上でいくらファイルを開いても、プログラムを開いても、デフォルトデスクトップ上には影響を及ぼさないため、ユーザーにばれることはありません。
図 9 HiddenVNCを使えば隠しデスクトップを利用して遠隔操作を隠蔽することが可能
なおHiddenVNCを用いられた場合、最も脅威となる状況の一つはユーザーがブラウザを使用しているケースです。なぜなら、異なるデスクトップであっても同一ブラウザ間ではログインセッションが共有化されてしまうケースがあるからです。例えば、ユーザーがデフォルトデスクトップ上のブラウザでいつも通りログインが必要なサイトにアクセスしたとします。この際(既にHiddenVNCに感染しているとします)、同時に攻撃者は隠しデスクトップ側で同じ種類のブラウザ(例えばIEであればIE)を起動させ、同じサイトへアクセスします。すると攻撃者はログインIDやパスワードを一切知ることなく(入力することなく)、該当サイトへログインすることができるのです。
筆者が実施した検証の結果、2013年前後の古いHiddenVNCを利用した場合は現在最新のほとんどのブラウザでは何らかの対策が採られており、2つのデスクトップ間でそれぞれ同じブラウザを起動することはできませんでしたが、2016年以降に開発された比較的新しいHiddenVNCを利用すると、Edgeを除く主要なブラウザではデフォルトデスクトップおよび隠しデスクトップ側で同時に同じブラウザを起動することに成功し、さらに、利用者の多い国内メジャーなWebサイトにおいてログインセッションが共有化されていることを実際に確認しました。
図 10 ログインセッションが共有化される概念図
この方法を利用されると、(ブラウザに不正コードをインジェクションするMITBのように)マルウェアがトランザクションの間に介入するようなある意味違いがわかりやすい不正活動ではなく、もはやユーザーのブラウザを他人の手で手動操作されているに等しく、一見してユーザーと攻撃者の差異を見出す術はほとんどなく的確に見分けるには困難を極めます。
以下はオンラインバンキングマルウェア等が使用するHiddenVNC(hVNC)のコードの一部ですが、このコードはまさにHiddenVNC(hVNC)が感染PC(つまりユーザー側)に隠しデスクトップを作成する心臓部となるコードです。
HiddenVNC(hVNC)の以下のコードでは、感染PC側に新しいデスクトップを作成し、作成した新しいデスクトップ上にExplorer.exeのプロセスを起動しています。デスクトップにExplorerが起動していない限り遠隔操作によるファイル操作ができないため明示的にエクスプローラーのプロセスを起動させていると考えられ、HiddenVNC(hVNC)の開発者がエクスプローラーの遠隔操作によりファイル操作を実現させようとする意図がここから読み取れます。
なお、CreateDesktop関数により新しいデスクトップを作成したのちもSwitchDesktop関数を一切呼び出していないため、アクティブなデスクトップは変化せず、ユーザーに気づかれることはありません。つまり逆に言えば、これらの操作をされている最中もユーザーがそれに気づくすべはありません。
図 11 HiddenVNC(hVNC)の隠しデスクトップを作成する部分のソースコード
なお、HiddenVNC(hVNC)でPCを遠隔操作されている場合、隠しデスクトップを利用されていることから操作されている画面がユーザーに見えない仕組みはわかりました。
では、HiddenVNC(hVNC)の感染PCに接続されているデバイスであるマウスやキーボードの操作に影響がないのはなぜでしょうか。たとえウインドウの動きなどは隠しデスクトップを利用して隠せたとしても、マウスカーソルなどは共有化され遠隔操作時は攻撃者の操作に合わせ同時に移動するはずです。
実はここにHiddenVNC(hVNC)のあまり知られていない複雑な技術が利用されています。
HiddenVNC(hVNC)はなぜマウスを動かさずに遠隔操作が出来るのか
結論を述べると、HiddenVNC(hVNC)は感染PC側のマウスカーソルを一切動かさずに、感染PC上でマウスカーソルの操作の結果をエミュレートすることが可能なテクニックを使用しています。
例えば、攻撃者がVNCビューワ上でマウスを移動させ、どこかをクリックしたとします。
すると、HiddenVNC(hVNC)はまず攻撃者側から送られてくるマウスのクリック座標(aX,aY)を取得し、感染端末上の画面サイズ等を考慮したユーザーPCの隠しデスクトップ側の座標(bX,bY)に座標変換します。そしてPostMessage関数を利用してクリックイベント(クリックしたという命令)をその座標に送信します。これによりWindows OSは実際にマウスでその座標をクリックされた場合と同様の状態と受け止め処理を進めます。
図 12 HiddenVNC(hVNC)がマウス操作をユーザーに気づかれずに遠隔操作するイメージ図
より具体的にHiddenVNCにおける該当箇所のソースコードで実際の仕組みを確認してみましょう。
以下は攻撃者が攻撃者側のPCで操作したマウスの左ボタンまたは右ホタンのクリックを、感染PC側のHiddenVNC(hVNC)へクリックイベントとして送信する部分に関連したHiddenVNCのソースコードの抜粋です。
図 13 隠しデスクトップのマウスエミュレートに関するHiddenVNC(hVNC)のソースコード(抜粋)
上記以外にも、ダブルクリックやドラッグアンドドロップなど複数のクリックイベントをエミュレートする処理を行っています。
HiddenVNCにはその他にも多くの非常に考えられた仕組みが存在します。
もう一つ特徴的な仕組みをご紹介しましょう。
隠しデスクトップを使った不正操作は一見完璧な隠蔽のように見えますが、実は画面転送における制限があります。どういうことかというと、Windows OSでは可視状態ではない画面領域(ユーザーに見えていない領域)は描画しないという仕組みがあり、例えばある二つの重なったウインドウがあった場合、実は重なって隠れた部分のウインドウ領域は裏では描画されていません。これと同じことが隠しデスクトップにも適用され、隠されたデスクトップ(=つまりユーザーに見えていない領域)のスクリーンショット(キャプチャ)を撮ることや画面転送は不可能なのです(実際にスクリーンショットを取得しようとすると真っ黒な画面になります)。そのため、通常のVNCを利用し隠しデスクトップを遠隔操作しようとしても画面が取得できず結果的に処理を継続できません。
図 14 通常のVNCでは隠しデスクトップの画面取得が不可能
相手の画面が見られないままでは遠隔操作を継続できるような状態ではありません。そのため、HiddenVNCの開発者が考えた策は、隠しデスクトップ上に作成されている全てのウインドウ個々に対しPrintWindow(ウインドウを描画するための情報を取得する関数)を呼び出し、デスクトップのZ軸を基準に個別取得したそれらのウインドウ画像(描画情報)を順に重ねていくことでスクリーン全体のイメージを再現させ、通常では不可能だったスクリーン画面の転送を実現させています。そのため、HiddenVNCの実際の転送画面ではウインドウごとに描画している為、それぞれのウインドウがチカチカと微妙に再描画されているような様子が見てとれます。
図 15 HiddenVNCが実現している画面描画のテクニック
もはや、OSによるデスクトップの描画処理を一から作成しているような複雑な処理を実現させている点からも開発者の執念が感じられます。
オンラインバンキングマルウェアはもちろんのこと、RAT(RemoteAdminTool)などの遠隔操作ツールにも搭載されているHiddenVNC(hVNC)がいかに巧妙なテクニックを利用した脅威なのか、その一部をピックアップしてご紹介しました。
■最後に
以上で、Windowsにおけるデスクトップの構造と、それを利用するいくらかの脅威について解説しました。
想像されているよりも奥深いデスクトップの世界が垣間見られたかと思います。
ところで現在のところ、今回のような脅威、つまり、攻撃者やマルウェアに「隠しデスクトップ」が作られていても、現時点でユーザーがそれを把握する手段はありません。
また、調査者側の観点においても今回ご紹介した脅威をわかりやすくあぶり出すセキュリティアプリケーションや調査ツールがこれといって存在するわけでもありません。
図 16 WindowStationとDesktopをまたぐ脅威を容易に把握する手段がない現状
プロセスとそのプロセスが所属するデスクトップ情報周辺が一覧で表示できればよいのですが、そうしたツールがどこかにないものか筆者が調べた限り見当たらなかったため、今回新たにツールを作成することにしました。
作成したツールはソースコードと共にGitHubに公開しています。
このツールが、またはこのツールの知見が、ユーザーを脅威から守る何らかのきっかけになれば幸いです。
■HiddenDesktopViewer
https://github.com/AgigoNoTana/HiddenDesktopViewer
※なお、本ツールを利用した際に発生したいかなる問題についても一切の責任を負いかねますのでその点ご理解いただける方のみご自由にご利用ください。
ツールの利用方法を本記事の末尾に記載しましたので適宜ご覧ください。
■その他の補足情報
【補足情報その1】Windows 10における「仮想デスクトップ」について
本記事をご覧いただいた方の中には「新しく作成できるデスクトップ」ときいて、Windows10から標準で搭載された「仮想デスクトップ」を想定された方も少なくないかと思います。
しかし、本記事でご紹介した隠しデスクトップはあくまで拡張されたデスクトップでありWindows10の「仮想デスクトップ」とは関連がありません。
図 17 Windows10(上図はバージョン1709)においてデフォルトで利用できる「仮想デスクトップ」
このWindows10の仮想デスクトップはIVirtualDesktopManagerインターフェイスを中心とした非公開の関数を利用して実現されており、CreateDesktopなどのWin32APIで作成できるデスクトップとは異なります。
そのため、Windows10の機能を利用して作成した「仮想デスクトップ」はユーザーにより容易に作成・削除・列挙が可能ですが、今回ご紹介したHiddenVNCなどの脅威が作成した隠しデスクトップはそれらの一覧には表示されません。つまり、Windows10においても今回ご紹介した「隠されたデスクトップ」の存在はセキュリティ上継続して注目すべき対象であることに違いはありません。
なお、筆者の検証の結果、Windows10におけるデフォルトデスクトップ(デスクトップ1)以外の仮想デスクトップからはCreateDesktopによるデスクトップは作成できないことがわかりました。
図 18 Windows10の仮想デスクトップとCreateDesktopによるデスクトップの制限
Windows10の仮想デスクトップが利用できるようになったことで、CreateDesktopと組み合わされた階層構造のより深い隠蔽が可能になる可能性を懸念していましたが、検証の結果、CreateDesktopによるデスクトップ作成が可能なのはあくまでデフォルトデスクトップのみであり、Windows10の仮想デスクトップとCreateDesktopを組み合わせた複雑な階層による隠蔽の脅威の心配はなさそうです。
【補足情報その2】既存調査ツールでの確認方法について
なお、特定プロセスのWindowStation名やDesktop名は「ProcessExplorer」や「ProcessHacker」などの既存調査ツールでも確認することは可能です。ただし、プロセスをひとつずつ確認していく必要があり、あまり実用的ではありません。
以下それぞれの確認方法となります。
・Process Explorerでの確認方法
Lower Pane Viewの設定をHandlesにし、確認したいプロセスを選択したのち、Lower Pane ViewのTypeを確認します。それぞれTypeが「WindowStation」「Desktop」の項目に表示されています。
図 19 ProcessExplorerを利用したWindowStation名とDesktop名の確認方法
・Process Hackerでの確認方法
各プロセスを右クリックしプロパティを表示、Handlesのタブ内の「WindowStation」「Desktop」の欄で確認することができます。
図 20 ProcessHackerを利用したWindowStation名とDesktop名の確認方法
他にもメモリ調査ツールである「Volatility Framework」にも「deskScan」というコマンドがありますが、メモリダンプが必要であり、今動いている環境で迅速にさっと結果を知るにはいささか敷居が高いでしょう。
■付録:「HiddenDesktopViewer」の使い方と概要
ここからは「HiddenDesktopViewer」の使い方と概要を2つの実際の脅威を例にご紹介します。
必要な方のみご覧ください。
■HiddenDesktopViewer
https://github.com/AgigoNoTana/HiddenDesktopViewer
「HiddenDesktopViewer」の使い方
(※「HiddenDesktopViewer」の正常動作にはMicrosoft . NET Framework 4.5以上が必要です。(4.0で起動はできますが動作中にエラーが出ます))
「HiddenDesktopViewer」は起動すると以下のようなウインドウが表示されます。
「Process List」タブの状態で「Refresh」ボタンを押すと、現在起動中のプロセス一覧と各プロセスに紐づくデスクトップ情報等の分析結果が一覧で表示されます。
図 21 「HiddenDesktopViewer」の画面説明(「Process List」タブ)
このタブ画面では、プロセスとデスクトップ情報を一覧表示で確認できるため、一般的ではない(イレギュラーな)デスクトップを持つプロセスをあぶり出すことができます。(具体例は以降で解説します)
続いて「Desktop List」タブの説明です。
「Desktop List」タブをクリックし「Refresh」ボタンを押すと以下のような状態となります。
図 22 「HiddenDesktopViewer」の画面説明(「Desktop List」タブ)
この画面では、現在お使いのPCで確認できるWindowStationの一覧と、各WindowStationに紐付けられたデスクトップの一覧を表示することができます。
デフォルトのWindowStation名は「WinSta0」、デフォルトのデスクトップ名は「Default」であることを把握しておくと良いでしょう。(「Winlogon」はWindowsシステムがログイン画面等で利用するデスクトップ名ですので問題ありません)
2つのタブの機能の使い分けとしては、隠しデスクトップのチェックを「Desktop List」タブでサッと確認し、隠しデスクトップの関連プロセスを特定したい場合「Process List」タブの一覧機能を利用して調査するなどの使い方が想定できます。
特筆すべきポイントとして、以下の色分け機能があります。
それぞれ以下に該当するプロセス(またはスレッド)を各色で強調表示するようにしています。
- ピンク:デフォルトデスクトップではないデスクトップで動作している(ハンドルを持っている)
- オレンジ:現在アクティブではない別のデスクトップから作成・生成されたウインドウを持っている
- ブルー:起動時点でデフォルトではないデスクトップを指定されている
- グレー:セッション0で動作している(サービス等)
以上がツールの簡単な説明となります。
それではこのツールにより現実の脅威がどのように炙り出せるのか、見ていきましょう。
「HiddenDesktopViewer」を利用した場合の脅威の見え方
【サンプルケース①:ランサムウェア「Tyrant」感染PCでの見え方】
ではランサムウェア「Tyrant」に感染したPCでこのツール「HiddenDesktopViewer」がどう使えるのか実際に検証してみます。
「Tyrant」は実行されるとすぐに新しいデスクトップを作成してそちら側にデスクトップを切り替え、脅迫ウインドウを表示させます。
この実験においてはあらかじめ、「HiddenDesktopViewer」を起動しGUI上の「Always execute this App when the new desktop become active.」のチェックボックスをオンにしておきます。この機能をオンにすると、アクティブデスクトップ(ユーザーの目の前に表示されるデスクトップ)が切り替わると、すぐにそちら側のデスクトップにツール自身を起動し表示するようになります。
つまり、ランサムウェアによりデスクトップを切り替えられても、ランサムウェアの制御するデスクトップ側にもツールが追従するかのように起動するようになります。また、「Always on Top」(常に手前に表示する)の機能がデフォルトで有効なため、ランサムウェア「Tyrant」の脅迫画面より手前に表示することができています。(下図)
ここで「Desktop List」タブに切り替え、「Refresh」ボタンを押した状態が以下の図となります。
図 23 「HiddenDesktopViewer」でTyrantが作成した新しいデスクトップを把握する様子
ツールの表示結果を見ると、普段見慣れない「DUMB」という名前のデスクトップが存在することがわかります。これが「Tyrant」の作成した脅迫画面のデスクトップ、つまり現在目の前に見えるアクティブデスクトップとなります。
なお、現在のアクティブデスクトップの名前が何であるかを把握するにはツールのタイトルバーを見ることでも確認することができます。上記の例ではツールのタイトルバーの文字列に「The owner desktop of this process is [DUMB]」と表示されています。ツールは常にアクティブデスクトップに表示されますのでここから判別することが可能です。
次に、ツールの「Process List」のタブを見てみましょう。
「Process List」のタブに切り替え「Refresh」ボタンを押します。
すると、通常はほぼ表示されることのないオレンジやピンクの列を持つプロセスが列挙されました。
これは上でも説明したとおり以下の意味を持つプロセス(またはスレッド)を表します。
(※両方に該当した場合表示上オレンジが優先されます)
- ピンク:デフォルトデスクトップではないデスクトップで動作している(ハンドルを持っている)
- オレンジ:現在アクティブではない別のデスクトップから作成・生成されたウインドウを持っている
図 24 「HiddenDesktopViewer」でTyrantのプロセスをあぶり出す様子
Tyrantは一つのプロセスなのにも関わらず、ピンク色とオレンジ色の2色で表示されているのは以下の違いからです。
- ピンク:「Default」とは異なるデスクトップのハンドルを持っている
- オレンジ:感染後に起動したTyrantの脅迫ウインドウ・スレッド(強調理由: PEB(プロセス生成時の情報)がDefaultのデスクトップになっているにもかかわらず、別のデスクトップ「DUMB」側で起動しているHiddenDesktopViewerツールでWindow Titleが取得できている=つまりウインドウを異なるデスクトップをまたいで作成している)
つまり、本ツールを利用することで「異なるデスクトップをまたぐプロセス(スレッド)」をあぶり出すことができました。
※ただし、異なるデスクトップを利用するプロセス=一般的ではなく不審ではあるものの、ピンクやオレンジで表示された項目があったとしてもそれが不正なプロセスとは限りません。中には当然正規アプリケーションも存在します。このツールは不正の有無を判断するツールではない点にご留意ください。また、当然となりますがランサムウェアの場合は並行してファイルを暗号化されてしまうので別途対策が必要です。本ツールはどちらかというとスクリーンロッカーなどの調査でより現実的に有用となるかもしれません。
続いて、別の脅威「Hidden VNC」(hVNC)の場合の検証となります。
【サンプルケース②:HiddenVNC ( hVNC )が利用されているPCでの見え方】
以下は、オンラインバンキングマルウェアが利用する「HiddenVNC(hVNC)」に感染している環境で、本ツール「HiddenDesktopViewer」がどう有用なのかを確認した様子です。
下図左の画面はHiddenVNC(hVNC)に感染したユーザー側のデフォルトのデスクトップ、下図右の画面は攻撃者側のPC画面であり、VNCを利用してユーザーPCにリモート接続している様子です。少しややこしいですが、つまり、下図右画面は攻撃者(HiddenVNC(hVNC))が作成した(ユーザーPCの)隠しデスクトップ(壁紙が黒いデスクトップ)を、VNCビューワを通して遠隔から閲覧している様子となります。
図 25 「HiddenDesktopViewer」でHiddenVNC(hVNC)の隠しデスクトップをあぶり出す様子
まず、HiddenDesktopViewer」ツールの「Desktop List」で確認すると、早速通常ではない謎のデスクトップがリストに存在することがわかりました。この時点で何らかの隠しデスクトップが作成されている可能性が想定できます。
次に攻撃者がHiddenVNC(hVNC)を利用し隠しデスクトップ側で、特定のプログラムを起動したとします(下図)。(ここではバイナリエディタ「Stirling.exe」を例として起動しています)
図 26 「HiddenDesktopViewer」で隠しデスクトップ側で作成されたプロセスをあぶり出す様子
ツール「HiddenDesktopViewer」ではどう見えるでしょうか。
上図をご覧いただくとわかるとおり「Process List」タブで「Refresh」ボタンを押すと「Stirling.exe」がピンクで表示されました。
Desktop Name(From Handle)の項目にDefaultではないデスクトップ名が表示されており、通常ではないデスクトップでプロセスが起動していることをあぶり出すことができました。(リストの項目をダブルクリックすると指定した異なるデスクトップで動作しているプロセスを強制終了させることも可能です)
なお、HiddenVNCにより隠しデスクトップ上で起動されたExplorer.exeのプロセスもツールで調査するとしっかりとピンクで表示されていることがわかります。
図 27 HiddenVNC(hVNC)が隠しデスクトップ側で起動した不審なExplorer.exeをあぶり出す様子
つまり、オンラインバンキングマルウェアが利用するHiddenVNC(hVNC)が潜む環境においても、本ツールを利用すれば様々な不審点をあぶり出すことが可能であることが実証されました。
※なお、「HiddenDesktopViewer」はあくまで「調査ツール」の位置付けとして開発したため、自動で検知したりアラートを上げたりする機能をあえてつけていません。分析調査の一環での利用を想定しています。上記に上げた利用方法以外にも色々と他の有用な使い方ができるかもしれません。
また、上記の内容と重なりますがより具体的にイメージがつきやすいよう使用例の動画を用意しましたので御覧ください。
動画1:ランサムウェア「Tyrant」感染環境におけるツールの使用例
動画2:HiddenVNC観戦環境におけるツールの使用例
※なお、動画中のHiddenVNCは攻撃者側からサーバ(感染PC)側へ接続を行っていますが、リバースコネクションを行うことで接続方向を逆にすることも可能です。
なお、弊社ではこのような内容を(ブログでは記載していない、または、記載できないような更に深掘りした内容などを含め)全社員が自由参加できる社内勉強会として定期的に開催しています。弊社では技術者を積極的に採用しておりますので、ご興味のある方はこちらへ。
おすすめ記事