MS-SQL サーバーを攻撃する HiddenGh0st マルウェア

Gh0st RAT は中国の C. Rufus Security Team が開発した遠隔操作マルウェアである。ソースコードが公開されているため、マルウェアの開発者たちがこれを参考にして様々な変種を開発しており、最近までも攻撃に使用され続けている。ソースコードが公開されているといっても、Gh0st RAT は主に中国を拠点とする攻撃者たちが使用することが特徴である。過去のブログでもデータベースサーバー(MS-SQL、MySQL サーバー)を対象に Gh0st RAT の変種である Gh0stCringe RAT が配布された事例を公開したことがある。[1]

様々な Gh0st RAT の変種は MS-SQL サーバーを対象とする攻撃にもよく使用される。AhnLab Security Emergency response Center(ASEC)では、不適切に管理されている MS-SQL サーバーを対象とする攻撃をモニタリングしており、ASEC Report を通じて四半期別統計を公開している。統計では Backdoor、Trojan、HackTool、CoinMiner などの大分類に合わせてマルウェアを分類し、各分類内においても攻撃に使用された具体的なマルウェアを取り上げている。2023年第2四半期の統計によれば、29.0%を占めした Gh0st RAT の変種は Remcos RAT に次いで攻撃事例が多いことが確認された。[2] (英語にて提供)

図1. MS-SQL サーバーの攻撃に使用されたバックドア型マルウェアの統計(2023年第2四半期)

ASEC では最近、不適切に管理されている MS-SQL サーバーを対象に Hidden ルートキットをインストールする Gh0st RAT が拡散されていることを確認した。Hidden は Github に公開されているオープンソースのルートキットであり、自分自身を含めてファイルおよびレジストリを隠蔽する機能やプロセスの保護機能をサポートしている。[3](外部サイト、英語にて提供)これらの機能は、攻撃者がマルウェア感染状況をユーザーに認知されないよう隠蔽、またはマルウェアの削除を妨害する目的で悪用されることがある。

本ブログでは、Hidden ルートキットをインストールする Gh0st RAT の変種を HiddenGh0st と分類する。HiddenGh0st は少なくとも2022年頃から確認され始め、最近でも拡散が続いている。攻撃者が追加した複数機能のうち、中国語圏のユーザーが主に使用する QQ メッセンジャーの情報窃取機能が含まれていることからして、中国語圏ユーザーを主な攻撃対象としているものと推定される。

図2. MS-SQL サーバープロセスにより生成される HiddenGh0st

1. HiddenGh0st 解析

1.1. 初期設定

HiddenGh0st はファイル検知を回避するため、パックされた状態で配布される。DATA セクションに暗号化されている実際の PE を復号化したあとメモリ上で実行するが、この時、0x848 サイズの設定データも同時に伝達する。

図3. 復号化されたシェルコードを実行する時に伝達する設定データ

伝達される設定データは以下の通りであり、C&C アドレスだけでなくインストール方式、インストール先/ファイル名、ルートキット有効化の有無など、様々な設定がサポートされる。

オフセット データ 説明
0x0000 “leifenghackyuankong.e3.luyouxia[.]net” C&C サーバーアドレス
0x012C NULL 使用しない
0x0258 0x3960 (14688) C&C サーバーのポート番号
0x025C 0x0EE0 使用しない
0x0260 “6gkIBfkS+qY=” キーロガーのファイル名(復号化時、「Default」)
0x0292 “tdC2pg==” バージョン情報(復号化時、「1.0」)
0x02b2 “QQ进程保护程序” サービス名(サービスモード)
0x0316 “TX QQ” サービス Display 名(サービスモード)
0x0396 SERVICE_DESCRIPTION サービス設定データ(サービスモード)
0x0496 “5750b8de793d50a8f9eaa777adbf58d4” BITS のレジストリ設定データ
0x0598 0x0000 External IP 照会の有無
0x059C 0x0001 インストールモード #1:サービス
0x05A0 0x0000 インストールモード #2:スタートアップフォルダ
0x05A4 0x0000 without Rootkit
0x05A8 “%SystemRoot%\System32\” インストールパス名(サービスモード)
0x060C “QQ进程保护程序.exe” インストールファイル名
0x063E 0x0008 追加するダミーデータのサイズ
0x0640 0x0007 マルウェアの付与属性(サービスモード)
FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM
0x0648 NULL ダウンロード URL アドレス
表1. 初期設定データ

設定データの中には無効化されているものも多い。代表的なものとしてはダウンローダースレッドで使用する URL アドレスがある。攻撃者がダウンロード URL アドレスを設定した場合、この HiddenGh0st 実行時に外部からさらなるマルウェアをインストールするプロセスも同時に実行されたものと思われる。

この他にも、無効化されている設定データの中には感染システムのパブリック IP アドレスを取得する機能を有効化する設定も存在する。もし有効化されている場合は、「http://www.taobao.com/help/getip.php」のアドレスからパブリック IP アドレスを取得して C&C サーバーに伝達するデータに含める。

1.2. インストールプロセス

1.2.1. インストールモード #1 – サービス

設定データに指定されたインストールモードがサービス方式である場合、まず HKLM\SYSTEM\Select キーの MarkTime の値に現在のマルウェアがインストールされた時間を保存する。その後、設定データを参考にしてマルウェアをコピーし、サービスに登録する。サービス登録時に「-auto」引数を指定するため、以降サービスとして動作するマルウェアは「-auto」引数と共に実行される。

図4. インストール時間が保存された MarkTime の値

設定データの中には追加するダミーデータのサイズも存在するが、設定値が 0x0008 の場合、マルウェアの末尾に 0x00800000 サイズのダミーデータを付け加える。ここまでのプロセスが完了するとサービスを実行し、以下のようなコマンドを利用してオリジナルファイルを削除する。サービスとして実行された後は「-acsi」引数と共に再び実行され、それ以降は実際のメインルーチンが実行される。

> C:\Windows\system32\cmd.exe /c ping -n 2 127.0.0.1 > nul && del [マルウェアのパス] > nul
1.2.2. インストールモード #2 – スタートアップフォルダ

マルウェアの実行時に渡される設定データにおいて、インストール方式がスタートアップフォルダに設定されている場合は、サービス登録の代わりにスタートアップフォルダにコピーする方式で持続性を維持させる。まず HKLM\SYSTEM\Select キーの MarkTime の値にインストール時間を保存する点は同様である。その後、現在実行中のマルウェアをスタートアップフォルダにコピーするが、DefineDosDeviceA() API を利用し、コピー先のパスのシンボリックリンクを作成、コピーするプロセスで使用することが特徴である。シンボリックリンクの名前には「\.\agmkis2」という文字列が使われる。

図5. シンボリックリンクを利用したファイルのコピー

その後、コピーしたマルウェアに隠し属性を付与した後、設定に合わせてダミーデータを追加する。ここまでのプロセスが完了すると、コピーしたマルウェアを実行してオリジナルのマルウェアは自己削除する。

1.3. 感染システムの情報伝達

HiddenGh0st は一般的な Gh0st RAT と同様、C&C サーバーとの通信が確立した後で感染システムの基本的な情報を収集して転送する。

オフセット 収集データ
0x0000 0x66
0x0004 Windows のバージョン情報
0x00A0 CPU 速度
0x00A4 CPU 個数
0x00A8 パブリック IP アドレス
0x00AC プライベート IP アドレス
0x00B0 感染システムのホスト名
0x01B0 Web カメラ個数
0x01B4 インターネット接続の遅延時間
0x01B8 ネットワークインターフェイス速度
0x01BC メモリ容量
0x01C0 ローカルディスク容量
0x01C4 「Default」文字列(設定データで復号化)または BITS レジストリの「5750b8de793d50a8f9eaa777adbf58d4」の値
0x01F6 システムのブート時間
0x0216 「1.0」(バージョン)
0x0236 インストールされているセキュリティ製品リスト
0x0268 Wow64 の有無
0x026C マルウェアのインストール時間(MarkTime)
0x029E ログインした QQ メッセンジャー番号
0x03A0 直近のキー入力時間が3分以上経過しているかどうか
0x03A4 インターネット接続状態(MODEM、LAN、PROXY)
表2. C&C サーバーに伝達する情報リスト

インストールされているセキュリティ製品情報は、現在実行中のプロセスの名前を取得して以下のようなキーワードを含んでいるかをスキャンする方式により求める。

“360tray.exe”, “360sd.exe”, “kxetray.exe”, “KSafeTray.exe”, “QQPCRTP.exe” ,”HipsTray.exe” ,”BaiduSd.exe” ,”baiduSafeTray.exe” ,”KvMonXP.exe” ,”RavMonD.exe” ,”QUHLPSVC.EXE” ,”QuickHeal” ,”mssecess.exe” ,”cfp.exe”, “SPIDer.exe”, “DR.WEB”, “acs.exe”, “Outpost”, “V3Svc.exe” ,”AYAgent.aye” ,”avgwdsvc.exe” ,”AVG” ,”f-secure.exe” ,”F-Secure” ,”avp.exe” ,”Mcshield.exe”, “NOD32”, “knsdtray.exe”, “TMBMSRV.exe”, “avcenter.exe”, “ashDisp.exe” ,”rtvscan.exe” ,”remupd.exe” ,”vsserv.exe”, “BitDefender”, “PSafeSysTray.exe”, “ad-watch.exe”, “K7TSecurity.exe”, “UnThreat.exe”, “UnThreat”

HiddenGh0st が C&C サーバーに転送するデータには、この他にも現在実行中の QQ メッセンジャーの QQ 番号がある。QQ メッセンジャーのメインユーザー層は主に中国語を使用するユーザーであるため、攻撃者の主な攻撃対象が中国語圏のユーザーであるものと推定される。

図6. QQ メッセンジャーから QQ 番号を取得するルーチン

HiddenGh0st はこのようにして求めた 0x3BC サイズのデータを圧縮し、その後 0x0F サイズのデータを前に追加する。追加するデータには、シグネチャ文字列「hx」、送信するデータのサイズ、オリジナルデータのサイズなどの情報がある。オリジナルの Gh0st RAT は、その名前のように C&C サーバーとの通信に「Gh0st」というシグネチャ文字列を使用していた。しかし、ソースコードが公開されている Gh0st RAT には複数の変種が存在しており、過去には Gh0stCringe RAT も「xy」をシグネチャ文字列として使用していた。

オフセット サイズ データ 説明
0x00 0x03 “hx “ シグネチャ文字列
0x03 0x04 0x000000AB 送信するデータのサイズ(圧縮ファイルのサイズである 0x9C + 0x0F)
0x07 0x04 0x000003BC オリジナルデータのサイズ
0x0B 0x04 0x00000002 ハードコーディング
表3. 伝達されるデータ(暗号化前)

データは最終的に暗号化のプロセスを経て C&C サーバーに送られる。

図7. パケットの暗号化ルーチン
図8. C&C サーバーとの通信パケット

1.4. コマンド実行

攻撃者は HiddenGh0st の制作時、従来の Gh0st RAT をベースに制作しているため、FileManager、ScreenManager、KeyboardManager、SystemManager、ShellManager など、従来の Gh0st RAT がサポートしている基本的なコマンドをサポートする。もちろん、HiddenGh0st のほうがサポートするコマンドが多い。以下は C&C サーバーから渡されて実行できるコマンドのリストであるが、大分類のみをリストアップしているため実際の各コマンドが担う機能はこれよりもはるかに多い。コマンドのうち、スレッドとして動作し C&C サーバーにデータを伝達し続けるコマンドは C&C サーバーの80番ポートを利用する。

コマンド 機能
0x00 待機
0x01 [FileManager] ファイルの管理:ファイル照会、アップロード、ダウンロード、削除、名前変更、実行、WinRAR を利用した圧縮解除など
0x08 チャット
0x0A サービスの管理:サービス照会、開始、削除、設定変更など
0x0B プロセススキャン:現在実行中かどうか
0x0C Windows スキャン:現在実行中かどうか
0x10 [ScreenManager] スクリーンキャプチャ、クリップボードの窃取および変更
0x1C ファイル実行
0x1D エクスプローラー(explorer.exe)の終了
0x1E Internet Explorer のキャッシュ削除
0x1F ポートフォワーディング
0x2D [KeyboardManager] キーロガー
0x33 オーディオ出力
0x34 QQ メッセンジャー情報の窃取
0x36 [SystemManager] システムの管理:Gh0st RAT がサポートするプロセス/Windows リストの収集、Dialup アカウント情報の窃取、プロセス終了機能。そしてコマンド実行、スレッド制御、ホストファイルの収集/改ざんなど
0x48 メッセージポップアップ
0x49 HKLM\SYSTEM\CurrentControlSet\Services\BITS / 5750b8de793d50a8f9eaa777adbf58d4 の値の設定
0x4A [ShellManager] リモートシェル:Gh0st RAT がサポートするリモートシェル機能。そして Mimikatz を利用したアカウント情報の窃取
0x4B コンピューターの終了
0x4C 再実行
0x4D アンインストール
0x4E イベントのクリーンアップ
0x52 Etc:CD-ROM の開閉、タスクバーの非表示/表示、マウスの左右ボタンの入れ替えなど
0x60 外部からファイルをダウンロードおよび実行
0x62 マルウェアをスタートアップフォルダにコピー
0x63 解像度設定
0x64 ファイルの作成および実行(HIDE)
0x65 ファイルの作成および実行(SHOW)
0x66 プラグインのインストール:plugin.dll ファイルをダウンロードして実行
0x67 URL 接続:Internet Explorer を利用して特定のサイトに接続(HIDE)
0x68 URL 接続:Internet Explorer を利用して特定のサイトに接続(SHOW)
0x69 HKLM\SYSTEM\Setup / Host の値の設定
0x6A 待機
0x6D 遠隔操作関連:リモートデスクトップの有効化/無効化、リモートデスクトップのポート番号変更、ゲストアカウントの有効化、インターネット共有の有効化、ユーザーアカウントの設定/削除など
0x82 レジストリの管理
0x8A プラグイン関連と推定:ファイルの照会、ダウンロード/アップロード、メモリ上でロードして実行
表4. HiddenGh0st がサポートするコマンドのリスト

HiddenGh0st は様々な機能を提供するため、オリジナルの Gh0st RAT がサポートしている、または基本的な RAT マルウェアがサポートしている機能の他にも複数の特徴が存在する。

最初の実行時点で引数として渡された設定データにエンコードされた文字列は二つだった。一つは「1.0」文字列で、マルウェアのバージョン情報と推定される。もう一つは「Default」文字列で、以降感染システムの情報を C&C サーバーに伝達する時に同時に渡されることからして、マルウェアの識別子と推定される。攻撃者がキーロガーコマンドを有効化すると、収集したキーロガーデータは %SystemDirectory% パスに保存される。この時、「Default」文字列を復号化する前の文字列である「6gkIBfkS+qY=.key」という名前がファイル名として使用される。

図9. キーロガーデータが保存される位置

HiddenGh0st は Mimikatz をインストールして感染システムのアカウント情報を窃取できる機能を持っている。オリジナルの Gh0st RAT でリモートシェル機能を担う ShellManager クラスには、リモートシェルの他に「GetMP.exe」という名前で Mimikatz をインストールした後、以下のような命令を実行するコマンドが一緒に含まれている。マルウェアは、このようなプロセスによって収集した感染システムのアカウント情報を C&C サーバーに転送する。

> GetMP privilege::debug sekurlsa::logonpasswords exit\r\n
図10. Mimikatz の実行ルーチン

新たに追加されたコマンドの中には、RDP を利用した遠隔操作に関連する機能が多い。感染システムにおいてリモートデスクトップやインターネット共有を有効化する、またはリモートデスクトップのポート番号を変更することができる。また、以下のようなコマンドを利用することでゲストアカウントを有効化し、管理者グループに登録する機能も存在する。

> net user guest /active:yes && net user guest 123456 && net localgroup administrators guest /add
図11. リモートデスクトップを有効化してポート番号を変更するルーチン

この他にも Internet Explorer のキャッシュを削除するコマンドやCD-ROM を開閉するコマンド、タスクバーを非表示にしてマウスの左右ボタンを入れ替えるなど、過去の RAT マルウェアがサポートするような機能も含まれている。

> cmd.exe /c RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 255

具体的な目的は確認されていないが、コマンドの中には以下のようなレジストリキーの値を設定する機能が存在する。もし攻撃者のコマンドによって「5750b8de793d50a8f9eaa777adbf58d4」の値が設定されている場合は、HiddenGh0st が C&C サーバーに伝達する基本情報に含まれて一緒に転送される。

  • HKLM\SYSTEM\CurrentControlSet\Services\BITS / 5750b8de793d50a8f9eaa777adbf58d4
  • HKLM\SYSTEM\Setup / Host
図12. 攻撃者から渡されたデータが書き込まれるレジストリキー

2. HiddenGh0st のルートキット解析

Hidden は Github に公開されているオープンソースのルートキットドライバーであり、最新の OS で提供するミニフィルタードライバーとカーネルコールバック関数を利用して、ファイルおよびレジストリを隠蔽し、プロセスを保護する。このような機能があるため、攻撃者はマルウェアを隠蔽し、不正なプロセスを終了できないように Hidden ドライバーを悪意を持った目的で使用することもある。実際にコインマイナーマルウェアである PurpleFox も Hidden をカスタマイズして攻撃に使用することにより、マルウェアを隠蔽して駆除を妨害していた。[4]

HiddenGh0st は内部に含まれた Hidden ルートキットを実行のプロセスでインストールし、バックドア機能を担うマルウェアを隠蔽して保護する目的で使用する。ここではまず Hidden ルートキットの基本的な機能を解析したあと、HiddenGh0st が Hidden を使用するプロセスを整理する。

2.1. Hidden ルートキットの解析

2.1.1. 基本動作

Hidden は、まずインストールレジストリに登録された Config を読み込む。当該レジストリの値はルートキットドライバーがロードされる時、自動で読み込み、適用する設定データである。例えば、以下のように設定されたレジストリの値は4つのコマンドを伝達するために作成された。

図13. コマンドが含まれた設定データ

初期設定データを読み込んだ後は、プロセスモニター、ミニフィルター、レジストリフィルターなどの初期化プロセスを経る。それぞれの初期化プロセスが終了すると、読み込んだ設定データに従って保護および隠蔽機能を実行する。最後に隠蔽設定、すなわち上記のレジストリで設定可能な「Hid_StealthMode」の値を参照して Stealth Mode を実行できるが、これはドライバー自体に対する隠蔽を担う。Stealth Mode は Hidden のファイルおよびレジストリキーを隠蔽し、それによって当該サービスを停止させることも不可能である。代わりに HiddenCLI.exe というツールを利用してコマンドを伝達し、ドライバーを無効化したあと修復させることができる。

レジストリ 機能
Hid_State ドライバー有効化
Hid_StealthMode 自己隠蔽モード
Hid_HideFsDirs ディレクトリ隠蔽
Hid_HideFsFiles ファイル隠蔽
Hid_HideRegKeys レジストリキー隠蔽
Hid_HideRegValues レジストリの値隠蔽
Hid_IgnoredImages 例外プロセス指定
Hid_ProtectedImages 保護プロセス指定
Hid_HideImages プロセス隠蔽
図5. Hidden が参照するレジストリのコマンド

HiddenCLI.exe は Hidden ドライバーにコマンドを渡す際に以下のような IOCTL を使用する。

IOCTL Number 機能
HID_IOCTL_SET_DRIVER_STATE 0x800 ドライバーの状態設定(有効化/無効化)
HID_IOCTL_GET_DRIVER_STATE 0x801 現在のドライバーの状態を返す
HID_IOCTL_SET_STEALTH_MODE 0x802 ステルスモード設定
HID_IOCTL_ADD_HIDDEN_OBJECT 0x83C 隠蔽対象追加
HID_IOCTL_REMOVE_HIDDEN_OBJECT 0x83D 隠蔽対象削除
HID_IOCTL_REMOVE_ALL_HIDDEN_OBJECT 0x83E すべての隠蔽対象削除
HID_IOCTL_ADD_OBJECT 0x846 例外/保護プロセス追加
HID_IOCTL_GET_OBJECT_STATE 0x847 例外/保護プロセスの状態を返す
HID_IOCTL_SET_OBJECT_STATE 0x848 例外/保護プロセスの状態設定
HID_IOCTL_REMOVE_OBJECT 0x849 例外/保護プロセス削除
HID_IOCTL_REMOVE_ALL_OBJECT 0x84A すべての例外/保護プロセス削除
表6. Hidden がコマンド伝達に使用する IOCTL 番号のリスト
2.1.2. ファイル隠蔽

Hidden はファイルの隠蔽のためにファイルシステムミニフィルタードライバーを使用する。ファイルシステムフィルタードライバーは、Windows が提供するカーネルモードのコンポーネントであり、ファイルシステムのリクエストに対するモニタリングおよび修正のような制御を提供する。ファイルシステムのリクエストにはファイルおよびディレクトリに対するオープン、読み取り、変更のような振る舞いがある。ミニフィルタードライバーは Windows のフィルターマネージャーを利用してファイルシステムを制御できるモデルであり、これを利用して上記で述べたようにカーネルモードのフック方式を使用せずにファイルに関する振る舞いをモニタリングおよび制御できる。

Hidden でモニタリングの対象となる I/O 動作は IRP_MJ_CREATE と IRP_MJ_DIRECTORY_CONTROL である。IRP_MJ_CREATE はファイルやデバイスオブジェクトのハンドルをオープンする際に発生し、Hidden はこのリクエストに対する Pre Operation コールバックを登録する。IRP_MJ_DIRECTORY_CONTROL はディレクトリを照会する際に発生し、Pre Operation および Post Operation のコールバックを登録する。

IRP_MJ_CREATE をモニタリングしながらハンドルオープン対象のファイルおよびディレクトリの名前が隠蔽対象リストに存在する場合は、STATUS_NO_SUCH_FILE を返す方式によりアクセスを妨害する。ディレクトリ照会の場合 IRP_MJ_DIRECTORY_CONTROL をモニタリングしながら隠蔽対象リストに該当する場合、リクエストの結果として受け取った情報から隠蔽対象ファイルおよびディレクトリを削除することにより、ユーザーが認知できないようにする。

図14. 隠蔽対象の場合 STATUS_NO_SUCH_FILE を返す

フィルターマネージャーはミニフィルタードライバーを登録する際に各ミニフィルタードライバーごとに固有の高度(Altitude)にロードする。ミニフィルタードライバーは重複する値を持つ場合はロードすることができず、Microsoft はドライバーファイルに対しこれらの高度を管理している。参考に、Hidden は公式的に署名され登録されたドライバーではないが、オープンソースでは370030を高度として割り当てている。(passThrough.sys という Microsoft のサンプルミニフィルタードライバーの高度と同じ値)

図15. Hidden.inf ファイルで確認できる Altitude
2.1.3. プロセスの保護および隠蔽

Hidden はプロセスの保護機能を提供し、この動作のために ObRegisterCallbacks() 関数を利用する。この関数はプロセスおよびスレッドオブジェクトに対する特定の事前/事後動作に関する通知を受け取るコールバックルーチンを登録する。すなわち、各オブジェクトに対するハンドルの作成およびコピーなどの動作に対してコールバックルーチンを登録し、関連する動作が行われるたびに登録されたコールバックルーチンが先に呼び出される方式によって制御を提供する。ObRegisterCallbacks() 関数はミニフィルタードライバーと同じく Altitude を割り当てる必要があり、1000を指定することが特徴である。

ObRegisterCallbacks() 関数の呼び出し時に指定する OB_OPERATION_REGISTRATION の構造体を見ると、プロセスとスレッドに対するハンドルの作成およびコピーに関連する(OB_OPERATION_HANDLE_CREATE | OB_OPERATION_HANDLE_DUPLICATE)の事前動作に対する(ProcessPreCallback、ThreadPreCallback)コールバック関数を登録することが確認できる。このコールバック関数では、以下のように保護対象のプロセスのハンドルを取得する際に設定したアクセス権限を最小権限に変更することによって、メモリの読み取り/書き込みおよびプロセスの終了のようなタスクを実行できないようにする。

図16. 権限変更ルーチン

Hidden がサポートするコマンドの中には指定した特定のプロセスを隠蔽対象から除外する機能も存在するが、これらの例外プロセスを管理するために別途プロセステーブルを管理する。このテーブルは PsSetCreateProcessNotifyRoutineEx() 関数を利用してプロセスの作成と終了をモニタリングする方法により実装する。

HiddenGh0st が使用するルートキットには含まれていないが、ソースコードは DKOM(Direct Kernel Object Manipulation)を利用したプロセス隠蔽機能をサポートしている。Windows カーネルはプロセスを管理するために「EPROCESS」という構造体を使用する。EPROCESS は双方向リスト構造で、異なるプロセス同士が接続されているが、ルートキットは隠蔽対象のプロセス PID を引数として受け取り、そのプロセスの EPROCESS にアクセスして Flink と Blink に接続されたプロセスを確認する。続いて、自身に接続された前後のプロセスを互いにリンクさせ、自身の Flink と Blink は自身を指すようにし、EPROCESS の二重接続リストに含まれないようにする方式である。

図17. Hidden ソースコードがサポートするプロセス隠蔽機能
2.1.4. レジストリの隠蔽

Hidden はレジストリキーと値の隠蔽機能を提供し、この動作のために CmRegisterCallbackEx() 関数を利用する。この関数はレジストリコールバックルーチンを登録する関数であり、レジストリ関連の動作が行われるたびに登録されたコールバックルーチンが先に呼び出される方式によって制御を提供する。CmRegisterCallbackEx() 関数もミニフィルタードライバーのように Altitude を割り当てる必要があり、Hidden では任意の値である320000を指定する。

Hidden はコールバック関数の内部で以下のように10個のレジストリの動作をモニタリングする。各関数において、それぞれの動作の対象となるレジストリキーおよび値が隠蔽コマンドによって保護されているかどうか、呼び出す主体が例外プロセスかどうかによって STATUS_ACCESS_DENIED、STATUS_NOT_FOUND のような値を返して、照会時にエラーを発生させたり、変更を不可能にする。

図18. モニタリング対象となるレジストリ動作のリスト

2.2. HiddenGh0st の Hidden ルートキット

HiddenGh0st は DATA セクションに含まれるルートキットファイルを「%SystemDirectory%\drivers\QAssist.sys」パスに生成するが、x86、x64 アーキテクチャによって異なるルートキットをインストールする。その後、生成したルートキットを QAssist サービスに登録して NtLoadDriver() 関数を利用してドライバーをロードする。

図19. 高度を370030に設定するルーチン

HiddenGh0st が生成した Hidden ルートキットとオリジナルのソースコードとの違いは二つある。一つは「Hid_StealthMode」を読み込んで隠蔽モードを設定するルーチンが変更され、当該値が設定されていなくともデフォルトでドライバーをロードする時に隠蔽機能を有効化するという点である。もう一つはプロセス隠蔽機能、すなわち「Hid_HideImages」設定が無効化されているという点である。これは Github にアップロードされた Hidden バイナリと同様だが、開発者がビルドしたバイナリをアップロードした後にプロセス隠蔽機能を追加したためである。

HiddenGh0st が設定するデータは IgnoredImages であり、サービスとして動作するため、例外プロセスとしてサービスプロセスを指定している。

図20. 登録された QAssis ルートキットサービス

 

デフォルトの設定は Hid_IgnoredImages だけであるが、以降は IOCTL コマンドを利用して隠蔽および例外対象を指定する。まず HiddenGh0st マルウェアファイルとレジストリに登録された HiddenGh0st サービスを隠蔽対象に追加する。そして HiddenGh0st プロセスとシステムプロセス「lsass.exe」、「lsm.exe」、「audiodg.exe」を例外プロセスに追加する。

図21. LSASS プロセスを例外プロセスに登録するコマンド

3. 結論

MS-SQL サーバーをターゲットとする攻撃の代表例としては、不適切にアカウント情報を管理しているシステムに対する総当たり攻撃(Brute Forcing)と辞書攻撃(Dictionary Attack)がある。管理者は、アカウントのパスワードを推測が困難な形式で設定し、定期的にパスワードを変更することで、総当たり攻撃や辞書攻撃からデータベースサーバーを保護する必要がある。

そして、V3 を最新バージョンにアップデートしてマルウェアへの感染を事前に遮断できるように注意しなければならない。また、外部に開放されていてアクセスが可能なデータベースサーバーに関してはファイアウォールのようなセキュリティ製品を利用し、外部の攻撃者からのアクセスを統制する必要がある。上記のような措置が先行しない場合、攻撃者やマルウェアによって感染が続く可能性がある。

ファイル検知
– Malware/Win32.RL_Generic.R356012 (2020.11.22.01)
– Trojan/Win.Generic.C4446276 (2021.04.30.03)
– Malware/Gen.Generic.C3228648 (2019.05.09.04)

振る舞い検知
– Malware/MDP.Behavior.M29
– DefenseEvasion/MDP.Event.M1423

IOC
MD5

– 69cafef1e25734dea3ade462fead3cc9 : HiddenGh0st
– 0d92b5f7a0f338472d59c5f2208475a3 : Hidden x86 Rootkit (QAssist.sys)
– 4e34c068e764ad0ff0cb58bc4f143197 : Hidden x64 Rootkit (QAssist.sys)

C&C
– leifenghackyuankong.e3.luyouxia[.]net:14688

関連 IOC および詳細な解析情報は、AhnLab の次世代脅威インテリジェンスプラットフォーム「AhnLab TIP」サブスクリプションサービスを通して確認できる。

0 0 votes
評価する
Subscribe
Notify of
guest

0 コメント
Inline Feedbacks
View all comments