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] (英語にて提供)

ASEC では最近、不適切に管理されている MS-SQL サーバーを対象に Hidden ルートキットをインストールする Gh0st RAT が拡散されていることを確認した。Hidden は Github に公開されているオープンソースのルートキットであり、自分自身を含めてファイルおよびレジストリを隠蔽する機能やプロセスの保護機能をサポートしている。[3](外部サイト、英語にて提供)これらの機能は、攻撃者がマルウェア感染状況をユーザーに認知されないよう隠蔽、またはマルウェアの削除を妨害する目的で悪用されることがある。
本ブログでは、Hidden ルートキットをインストールする Gh0st RAT の変種を HiddenGh0st と分類する。HiddenGh0st は少なくとも2022年頃から確認され始め、最近でも拡散が続いている。攻撃者が追加した複数機能のうち、中国語圏のユーザーが主に使用する QQ メッセンジャーの情報窃取機能が含まれていることからして、中国語圏ユーザーを主な攻撃対象としているものと推定される。

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

伝達される設定データは以下の通りであり、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 アドレス |
設定データの中には無効化されているものも多い。代表的なものとしてはダウンローダースレッドで使用する 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」引数と共に実行される。

設定データの中には追加するダミーデータのサイズも存在するが、設定値が 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」という文字列が使われる。

その後、コピーしたマルウェアに隠し属性を付与した後、設定に合わせてダミーデータを追加する。ここまでのプロセスが完了すると、コピーしたマルウェアを実行してオリジナルのマルウェアは自己削除する。
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) |
インストールされているセキュリティ製品情報は、現在実行中のプロセスの名前を取得して以下のようなキーワードを含んでいるかをスキャンする方式により求める。
“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 メッセンジャーのメインユーザー層は主に中国語を使用するユーザーであるため、攻撃者の主な攻撃対象が中国語圏のユーザーであるものと推定される。

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 | ハードコーディング |
データは最終的に暗号化のプロセスを経て 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 | プラグイン関連と推定:ファイルの照会、ダウンロード/アップロード、メモリ上でロードして実行 |
HiddenGh0st は様々な機能を提供するため、オリジナルの Gh0st RAT がサポートしている、または基本的な RAT マルウェアがサポートしている機能の他にも複数の特徴が存在する。
最初の実行時点で引数として渡された設定データにエンコードされた文字列は二つだった。一つは「1.0」文字列で、マルウェアのバージョン情報と推定される。もう一つは「Default」文字列で、以降感染システムの情報を C&C サーバーに伝達する時に同時に渡されることからして、マルウェアの識別子と推定される。攻撃者がキーロガーコマンドを有効化すると、収集したキーロガーデータは %SystemDirectory% パスに保存される。この時、「Default」文字列を復号化する前の文字列である「6gkIBfkS+qY=.key」という名前がファイル名として使用される。

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

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

この他にも 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

2. HiddenGh0st のルートキット解析
Hidden は Github に公開されているオープンソースのルートキットドライバーであり、最新の OS で提供するミニフィルタードライバーとカーネルコールバック関数を利用して、ファイルおよびレジストリを隠蔽し、プロセスを保護する。このような機能があるため、攻撃者はマルウェアを隠蔽し、不正なプロセスを終了できないように Hidden ドライバーを悪意を持った目的で使用することもある。実際にコインマイナーマルウェアである PurpleFox も Hidden をカスタマイズして攻撃に使用することにより、マルウェアを隠蔽して駆除を妨害していた。[4]
HiddenGh0st は内部に含まれた Hidden ルートキットを実行のプロセスでインストールし、バックドア機能を担うマルウェアを隠蔽して保護する目的で使用する。ここではまず Hidden ルートキットの基本的な機能を解析したあと、HiddenGh0st が Hidden を使用するプロセスを整理する。
2.1. Hidden ルートキットの解析
2.1.1. 基本動作
Hidden は、まずインストールレジストリに登録された Config を読み込む。当該レジストリの値はルートキットドライバーがロードされる時、自動で読み込み、適用する設定データである。例えば、以下のように設定されたレジストリの値は4つのコマンドを伝達するために作成された。

初期設定データを読み込んだ後は、プロセスモニター、ミニフィルター、レジストリフィルターなどの初期化プロセスを経る。それぞれの初期化プロセスが終了すると、読み込んだ設定データに従って保護および隠蔽機能を実行する。最後に隠蔽設定、すなわち上記のレジストリで設定可能な「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 | プロセス隠蔽 |
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 | すべての例外/保護プロセス削除 |
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 をモニタリングしながら隠蔽対象リストに該当する場合、リクエストの結果として受け取った情報から隠蔽対象ファイルおよびディレクトリを削除することにより、ユーザーが認知できないようにする。

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

2.1.3. プロセスの保護および隠蔽
Hidden はプロセスの保護機能を提供し、この動作のために ObRegisterCallbacks() 関数を利用する。この関数はプロセスおよびスレッドオブジェクトに対する特定の事前/事後動作に関する通知を受け取るコールバックルーチンを登録する。すなわち、各オブジェクトに対するハンドルの作成およびコピーなどの動作に対してコールバックルーチンを登録し、関連する動作が行われるたびに登録されたコールバックルーチンが先に呼び出される方式によって制御を提供する。ObRegisterCallbacks() 関数はミニフィルタードライバーと同じく Altitude を割り当てる必要があり、1000を指定することが特徴である。
ObRegisterCallbacks() 関数の呼び出し時に指定する OB_OPERATION_REGISTRATION の構造体を見ると、プロセスとスレッドに対するハンドルの作成およびコピーに関連する(OB_OPERATION_HANDLE_CREATE | OB_OPERATION_HANDLE_DUPLICATE)の事前動作に対する(ProcessPreCallback、ThreadPreCallback)コールバック関数を登録することが確認できる。このコールバック関数では、以下のように保護対象のプロセスのハンドルを取得する際に設定したアクセス権限を最小権限に変更することによって、メモリの読み取り/書き込みおよびプロセスの終了のようなタスクを実行できないようにする。

Hidden がサポートするコマンドの中には指定した特定のプロセスを隠蔽対象から除外する機能も存在するが、これらの例外プロセスを管理するために別途プロセステーブルを管理する。このテーブルは PsSetCreateProcessNotifyRoutineEx() 関数を利用してプロセスの作成と終了をモニタリングする方法により実装する。
HiddenGh0st が使用するルートキットには含まれていないが、ソースコードは DKOM(Direct Kernel Object Manipulation)を利用したプロセス隠蔽機能をサポートしている。Windows カーネルはプロセスを管理するために「EPROCESS」という構造体を使用する。EPROCESS は双方向リスト構造で、異なるプロセス同士が接続されているが、ルートキットは隠蔽対象のプロセス PID を引数として受け取り、そのプロセスの EPROCESS にアクセスして Flink と Blink に接続されたプロセスを確認する。続いて、自身に接続された前後のプロセスを互いにリンクさせ、自身の Flink と Blink は自身を指すようにし、EPROCESS の二重接続リストに含まれないようにする方式である。

2.1.4. レジストリの隠蔽
Hidden はレジストリキーと値の隠蔽機能を提供し、この動作のために CmRegisterCallbackEx() 関数を利用する。この関数はレジストリコールバックルーチンを登録する関数であり、レジストリ関連の動作が行われるたびに登録されたコールバックルーチンが先に呼び出される方式によって制御を提供する。CmRegisterCallbackEx() 関数もミニフィルタードライバーのように Altitude を割り当てる必要があり、Hidden では任意の値である320000を指定する。
Hidden はコールバック関数の内部で以下のように10個のレジストリの動作をモニタリングする。各関数において、それぞれの動作の対象となるレジストリキーおよび値が隠蔽コマンドによって保護されているかどうか、呼び出す主体が例外プロセスかどうかによって STATUS_ACCESS_DENIED、STATUS_NOT_FOUND のような値を返して、照会時にエラーを発生させたり、変更を不可能にする。

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

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

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

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」サブスクリプションサービスを通して確認できる。
Categories:マルウェアの情報