本サイトは、快適にご利用いただくためにクッキー(Cookie)を使用しております。
Cookieの使用に同意いただける場合は「同意する」ボタンを押してください。
なお本サイトのCookie使用については、「個人情報保護方針」をご覧ください。
11月に入り、海外のメディアを中心にCAPCOMのサイバー攻撃に関する情報が広がっています。
該当のサイバー攻撃には「Ragnar Locker」と呼ばれるランサムウェアが関与しているという報道がされており、実際に「Ragnar Locker」の攻撃グループは11月9日犯行声明を公開しました。
それらの公開情報を元に調査を進めたところ、関与していると推測される検体の存在をVirusTotal上で確認しました。
本記事では該当の検体に関する解析結果を共有します。
なお、本記事で言及する検体については、弊社がVirusTotalにアップされていることを発見した後に、BleepingComputerなどの各記事の元となった検体と同一であることを、それらの海外メディアが情報源とした人物に確認済みです。ただし、弊社ではCAPCOMのサイバー攻撃で実際に使用された検体であるという事実確認は取れていません。そのため本記事の内容は、あくまでそれらのメディアが公開情報の中で言及しているRagnar Lockerと同一の検体に関する解析結果である点をご了承ください。
ハッシュ値:6f559fd57304197443b71d8bf553cce3c9de8d53
検体解析
該当検体は、2020年11月4日に日本国内からVirusTotalへサブミットされており、サブミット数は解析時点で一件のみです。
図 1 日本からサブミットされたRagnar Lockerの検体
ファイルの元ファイル名は「3.vmp.exe」という名前でアップロードされており、以下の図の通りファイルアイコンは存在しません。
図 2 アイコンを持たないRagnar Lockerの実行ファイル
本検体におけるRagnar Lockerの実行ファイルには、以下の図の通り、有効なデジタル署名が付与されており、デジタル署名のタイムスタンプは2020年11月1日となっています。CAPCOMの公式発表では11月2日未明より障害が発生したという情報があり、本検体が該当のサイバー攻撃に使用されたものであった場合、攻撃直前に署名された可能性があります。
図 3 Ragnar Lockerの実行ファイルに付与された有効なデジタル署名
また、実行ファイルのコンパイル日時を示すPEヘッダ 内のTime Date Stampは2020年10月20日となっており、デジタル署名と同様にランサムウェア本体の作成も攻撃の直前に行われた可能性があります。
図 4 Ragnar Lockerの実行ファイルのコンパイル日時
多数のアンチデバッグ(耐解析機能)
Ragnar LockerのEXEファイルは多数の解析妨害が施されており、容易に解析できないようにされています。
まず以下の通り、非常に頑丈な商用プロテクターであるVMProtectによってパッキングされています。
デバッガを使用し単純に解析を行おうとすると、パッカーによるエラーメッセージが表示され、Ragnar Lockerの実行ファイルはすぐに強制終了し、解析を進めることができません(下図参照)。
また、Ragnar Lockerの本体コードがメモリ上にアンパックされた後も、APIフックによるアタッチ妨害が実装されており、アンパック後のRagnar Lockerのプロセスに対するアタッチを妨害します。
具体的には、システムDLLであるntdll.dllのDbgUiRemoteBreakinの先頭5バイトを自身のオリジナルのフック関数へジャンプするようにメモリを書き換えます(下図参照)。
図 7 Ragnar LockerがシステムDLLのAPIを書き換える様子
以下の図は、Ragnar Lockerに書き換えられる前後のntdll.dllのDbgUiRemoteBreakin関数の先頭を比較した様子ですが、通常は「6A 08 68 50 BB」という5バイトが、「E9 94 0D 1B 89」というjmp命令を含む5バイトに変更されてしまっています。後述しますが、jmp先である「0x002D0013」のアドレスにはRagnar Lockerのフック関数が用意されています。
Ragnar LockerがDbgUiRemoteBreakin関数を改ざんしAPIフックを行う理由ですが、通常解析で使用するデバッガで解析対象のプロセスにアタッチする際、デバッグされる側のプロセス内部ではその直後にDbgUiRemoteBreakin関数が呼び出されます。
そのため、DbgUiRemoteBreakinの処理をあらかじめ書き換えておくことで、解析者がデバッガでアタッチしたことをトリガーにして、自動的に攻撃者の用意したフック関数へジャンプさせることができるようになります。
図 8 APIフックにより改ざんされる前後のAPIの先頭アドレスの比較
フックで書き換えられたジャンプ先は以下の図のようになっており、多数のジャンプを繰り返したのち、最終的に自身のプロセスを強制終了させるコードに遷移します(下図参照)。
つまり、解析者がデバッガでアタッチすると、その瞬間にRagnar Lockerは強制終了し、解析が継続できないようになっていることがわかります。
図 9 DbgUiRemoteBreakinのフック先の処理の様子
Mazeランサムウェアも同様にDbgUiRemoteBreakin関数に着目し、先頭1バイトをret命令に書き換え無効にする手口を使用していましたが、強制終了させるフック関数に書き換えるという点において、Ragnar Locker のテクニックはMazeランサムウェアよりも手が混んでいるといえるでしょう。
同様に、NtProtectVirtualMemory関数もフックし、自身のコードへ転送させるようにAPIフックを行っています。
図 10 NtProtectVirualMemory関数のAPIフックの様子
感染端末の言語チェック
Ragnar Lockerは、実行された環境がロシア語など特定の言語情報が設定された端末であった場合、感染を行いません。
具体的には、GetLocaleInfoにより感染端末の言語設定情報を取得し、特定の国リストと比較した結果、同じであった場合、最終的に自身のプロセスを強制終了させます。
実際に、チェックする言語は以下となります。
以下の言語が設定された端末ではRagnar Lockerは感染せずすぐに終了します。
- Azerbaijani
- Armenian
- Belorussian
- Kazakh
- Kyrgyz
- Moldavian
- Tajik
- Russian
- Turkmen
- Uzbek
- Ukrainian
- Georgian
システムの復旧妨害
続いてRagnar Lockerは、システムの復旧を妨害する挙動を行っていきます。
まず、Windowsの正規プロセスであるwmicを使用し、ボリュームシャドウコピーを削除するコマンドを実行することでシステムの復元を無効化します。
続いて、Windowsの正規プロセスであるBcdeditを使用し、「recoveryenabled No」の引数を渡すことで、Windowsの起動が失敗した際に自動修復する機能をオフに設定します。
同様に、Bcdeditに対し「bootstatuspolicy IgnoreAllFailures」の引数を渡すことで、Windowsのスタートアップにエラーがあっても修復を行わず通常起動を試みるように設定します。
さらに、Bcdeditに対し「advancedoptions false」の引数を渡すことで、Windows起動時にF8キーから「スタートアップオプションの詳細設定」メニューにアクセスできないように設定します。
以上の通り、端末の起動時の修復を行わせないような動きがいくつか見られますが、実際のところRagnar Lockerには端末の起動を妨げることにつながる明確な破壊の挙動は確認されていません。そのため、万一起動に関連するファイルを暗号化してしまった際に自動修復により攻撃者の意図しないファイル状態にならないようにしているのかもしれませんが、ここは推測の域を出ません。
プロセスおよびサービスの停止
続いて、Ragnar Lockerは特定のプロセスが起動しているかどうかをチェックします。
端末で起動しているプロセスの一覧を取得したあと、自身にハードコーディングされている強制終了リストと比較します。以下の図の通り、データベースや文書系ソフト、メールソフトなど、攻撃者が暗号化したい種類のファイルを開いている(掴んでいる)と想定されるプログラムが並んでいることがわかります。
図 16 特定のプロセスが起動しているかチェックしている様子
一致するプロセスが起動していると判断した場合、該当プロセスを強制終了させます(下図参照)。
これは、ファイルを開いているプログラムをあらかじめ終了させることで、Ragnar Lockerがファイルを暗号化できるようにする意図が考えられます。
図 17 特定のプロセスが起動している場合に強制終了させる流れ
Ragnar Lockerが強制終了させるプロセスのリストは以下となります。
sql | msaccess | wsstracing |
mysql | mspub | OWSTIMER |
veeam | onenote | dfssvc.exe |
oracle | outlook | dfsrs.exe |
ocssd | powerpnt | swc_service.exe |
dbsnmp | steam | sophos |
synctime | thebat | SAVAdminService |
agntsvc | thunderbird | SavService.exe |
isqlplussvc | visio | Hyper-v |
xfssvccon | winword | TeamViewer |
mydesktopservice | wordpad | Teamviwer |
ocautoupds | EduLink2SIMS | Vmware |
encsvc | bengine | vss |
firefox | benetns | memtas |
tbirdconfig | beserver | mepocs |
mydesktopqos | pvlsvr | backup |
ocomm | beremote | pulseway |
dbeng50 | VxLockdownServer | logme |
sqbcoreservice | postgres | logmein |
excel | fdhost | connectwise |
infopath | WSSADMIN | splashtop |
wuauserv |
また、同様に特定のサービスを強制停止させます。
特定のサービス名と一致するサービスが起動していると判断した場合、ControlService関数を使用し、SERVICE_CONTROL_STOPを渡すことで、該当サービスに停止要求を行います。
図 18 特定のサービスが起動している場合に強制停止させる様子
実際に停止させるサービスのリストは以下となります。
vss | pulseway |
sql | logme |
memtas | logmein |
mepocs | connectwise |
sophos | splashtop |
veeam | wuauserv |
backup |
ファイルの暗号化
続いてファイルの暗号化の挙動に入りますが、Ragnar Lockerの特徴的な挙動の一つに以下のドライブマッピングの動きが挙げられます。
Ragnar Lockerは他のランサムウェアのように単純にドライブを列挙するのではなく、ローカルドライブとしてマッピングされていないボリュームを発見した場合、強制的にローカルドライブとしてマッピングした上で、暗号化を行います。
これはドライブとしてマッピングしていない隠しボリュームなどを強制的にマッピング状態にされ暗号化されることを意味します。
具体的には、以下のロジックでドライブマッピングを行います。
図 19 Ragnar Lockerのドライブマッピングロジック
マッピングされたドライブを含む、全てのドライブに対してファイルを検索し、見つかったファイルを暗号化していきます。
その際に、以下に表示される特定のファイル名や拡張子、フォルダ内のファイルを暗号化の対象から除外します。
図 20 Ragnar Lockerが暗号化から除外するリスト
Ragnar Lockerが暗号化を行う際のファイル操作におけるロジックは以下となります。一般的なランサムウェアと同じくReadFile/WriteFileの組み合わせで行っていることがわかります。
図 21 Ragnar Lockerのファイル暗号化時のファイル操作ロジック
上記のフッターに関する書き込みのうち、常に固定値となる47バイトのデータは以下となります。今回のRagnar Lockerに暗号化された全てのファイルは同一のフッター部分を末尾に持つため、この領域をチェックすることでRagnar Lockerに暗号化されたファイルであるかの判別が可能となります。
暗号化ファイルの拡張子変更は、以下のようにMoveFileExを使用し、ファイル移動させることでリネームします。
これにより、暗号化されたファイルは以下のような拡張子が付与されます。
以下のRSA公開鍵が暗号化の処理の一部で使用されます。
脅迫文の作成と表示
Ragnar Lockerは、全てのフォルダ内に脅迫文が記載されたテキストファイルを作成していきます(下図参照)。
図 26 脅迫文が記載されたテキストファイルを全てのフォルダ内に作成
脅迫文に使用する文章は一部の固定テキストがRagnar Lockerのバイナリにハードコーディングされています。
Ragnar Lockerは、メモリ上に展開された脅迫文をWriteFileを使用し作成したテキストファイルに書き込んでいきます(下図参照)。
図 28 メモリ上に展開した脅迫文をテキストファイルに書き込む様子
脅迫文は固定文と動的に生成されたテキストが存在し、それぞれ二回に分けて書き込みます。
以下は、二回目の書き込みで、動的に生成されたテキストとなるBase64でエンコードされた暗号化文字列を書き込む様子です。
なお、Ragnar Lockerは、一般に公開するリークサイトとは別にアクセス制限された一時的でプライベートなリークページ(TEMPORARY LEAK PASE)を用意しており、プライベートなリークページはターゲットだけに提示しますが(ターゲットが身代金を支払わなかった場合、一般の公開側のリークサイトに公開される流れ)、作成される脅迫文内には、感染端末にだけに提示するプライベートなリークページのURLとパスワードが掲載されており、それらのURLやパスワードについても、Ragnar Lockerのバイナリにハードコーディングされています(下図参照)。
図 30 TEMPORARY LEAK PASEのURLとパスワード
全ての暗号化が完了すると、Ragnar Lockerはドキュメントフォルダ内に作成した脅迫文を、KernelBase.dllのCreateProcessAsUserWを使用してログインしたユーザーの権限で起動させたNotepad.exeのプロセスの引数に渡すことで画面に表示させます。
以下はそれによって感染端末で最後に表示される脅迫文となります。
上記のように、「HELLO CAPCOM」という文字から脅迫文が始まる通り、攻撃者はランサムウェアのバイナリをターゲットごとに個別にあらかじめ用意した上で送り込んでいることがわかります。
なお、本検体以外のRagnar Lockerにおいても、それぞれターゲット企業と思われる企業名が「HELLO <企業名>」のフォーマットで脅迫文に記載されていることを確認しています。
(補足情報)実行引数のチェック挙動
ここまでに記載した解析結果はRagnar Lockerの実行ファイルに実行引数を付与せずに実行した場合の挙動を記載してきましたが、Ragnar Lockerの実行ファイルは以下の複数の実行引数を認識するように作成されています。
-backup
-list
-force
-vm
-vmback
-share_network
なお、これらの実行引数を付与すると、ファイルの暗号化や脅迫文の作成が行われずにプロセスキルのみの挙動や、実行引数を付与していない場合と同様の挙動を行うなど、細かな違いがありますが、主となる挙動はここまでに記載した動きが基本となります。
これまでに発見されている他のRagnar Locker は侵入後の展開時にVMイメージと共に配布され仮想環境を悪用した攻撃手口なども確認されており、こうした-vmや-vmbackなどの引数がそれらの手口に関連する可能性も考えられます。しかし、本解析においては検体解析に終始していることから侵入経路の攻撃手口は不明であり、実際にどのように実行されたのかは明らかではありません。
Ragnar Lockerのリークサイト
Ragnar Lockerは他の標的型ランサムウェアと同様に以下のような公開リークサイトを持っており、リークサイト上ではターゲットとなった多数の企業の情報が掲載されています。
ターゲットとなった一部の企業は摂取されたデータをダウンロード可能な状態で公開されています。
図 34 一部のターゲットページでダウンロードボタンが用意されている様子
リークサイト上にはCAPCOMに関する攻撃声明が掲載されていますが、現時点では警告文のみであり、本調査時点では公開リークサイト上ではデータ公開はされていません。
図 35 Ragnar Lockerのリークサイト上にあるCAPCOMに関する公開ページ
まとめ
SNAKE(EKANS)ランサムウェアの解析記事でも言及しましたが、近年の標的型ランサムウェアは攻撃対象にターゲットを絞りあらかじめチューニングした上で送り込んでくる傾向が見受けられます。そのため、同じ種類のランサムウェアであっても、攻撃されたターゲットによって挙動が異なってくる可能性が高く、一概に同種のランサムウェアだからといえ検体の挙動を明確に一律で語ることはできなくなってきています。そのため、検体そのものの挙動を把握するにはこうした検体個別の詳細解析が必須と言えるでしょう。
※11/11更新
その後、リークサイトへ窃取データが公開されたことを確認しました。
おすすめ記事