脅威リサーチ

Diavol - Wizard Spiderが使用する新しいランサムウェア?

投稿者 Dor Neeamni および Asaf Rubinfeld | 2021年7月14日

FortiGuard Labs Threat Research Report

影響を受けるプラットフォーム:Windows
影響:データの暗号化、データの破壊
深刻度:クリティカル

Diavol

6月初旬、FortiEDRはあるお客様を狙ったランサムウェアの攻撃を阻止しました。攻撃の阻止に成功した後、当時VirusTotalでは見つからなかった2つの不審なファイル、locker.exeとlocker64.dllを分離することができました。攻撃のタイムラインでは、locker.exeはlocker64.dllの1日前に展開されていました。

locker64.dllはConti (v3)ランサムウェアであることを確認できましたが、locker.exeは全く別物のようです。それでは、新しいランサムウェア・ファミリーにご挨拶しましょう。

このブログでは、Diavolの内部構造と、Wizard Spiderと呼ばれる犯罪グループに起因する可能性について解説します。

Diavolとの初遭遇

このランサムウェアは、図1に見られるように、通過するすべてのフォルダにテキスト形式のランサムノートを作成します。

図1:ドロップした「README_FOR_DECRYPT.txt」というランサムノート

このノートによると、作者は被害者のマシンからデータを盗んだと主張していますが、それを実行できるサンプルは見つかりませんでした。これは、ハッタリか、将来の機能のためのプレースホルダのどちらかです。このURLにアクセスすると、図2と図3に示すようなウェブサイトが表示され、そこからランサムウェアの名前を導き出しました。

図2および図3:Torブラウザを使用したDiavolのウェブサイト

かなりユニークな暗号化手順の一環として、Diavolは対称暗号化アルゴリズムを使用せず、ユーザーモードの非同期プロシージャーコール(APC)を使用して動作します。通常、ランサムウェアの作者は、暗号化操作を最短時間で完了させることを目指します。非対称暗号化アルゴリズムは対称アルゴリズムに比べて大幅に時間がかかるため、当然の選択ではありません。

技術的分析

locker.exeは、Microsoft Visual C/C++ Compilerでコンパイルされた32ビットの実行ファイルです。ファイル上のタイムスタンプ2021-04-30 15:58:15は、このランサムウェアが比較的新しいものであるという仮説を裏付けています。

実行すると、Diavolはコマンドライン引数の確認から始まります。

"-p": 最初にファイルをスキャンするパスのリストを記述したファイルへのパス。
"-log": ログファイルへのパスを指定します。
"-m": モード: net または local。
             net - ネットワーク共有のみを暗号化します。
             local - ローカルドライブのみを暗号化し、ネットワーク共有は無視します。
"-h": 共有のために列挙する特定のホスト(名前とIP)を含むファイルへのパス。
"-s": 初期登録メッセージの送信先となるIPアドレス。ハードコードされたアドレスを上書きします。

今回のインシデントでは、以下のようなコマンドラインパラメーターが確認されました。

-p "C:\b.txt" -m local -log "C:\programdata\log.txt"

ログファイルには、暗号化されたファイルがリストアップされています。

デバッグ情報ファイルのパスは削除されていませんが、残念ながらランサムウェアの作者に関する機密情報や証拠となるような情報は含まれていません。

D:\Development\Master\onion\locker.divided\LockMainDIB\Release\LockMainDIB.pdb

Diavolはパックされておらず、逆アセンブル対策も施されていませんが、コードを難読化するために興味深い解析対策技術を使用しています。Diavolのメインルーチンは、PEリソースセクションに格納されているビットマップイメージに格納されています。各ルーチンを呼び出す前に、ビットマップからのバイトを、実行権限のあるグローバルバッファにコピーします。

 

図4:ビットマップとして格納されているDiavolのインターナルルーチン

各ルーチンで使用されるインポートも、リソースセクションの「OFFSET」にビットマップと同じ名前で格納されています。

図5:Diavol の REGISTER ルーチンのインポートデータ

Diavolには14種類のルーチンがビットマップとして保存されています。それらは次のような順序で呼び出されます。

図6:リソースセクションからルーチンを呼び出すためのDiavolの実行フロー

· 犠牲者の識別子を作成

GENBOTIDルーチンは、感染したマシンのユニークな識別子を作成します。それは以下のように構成されています。

<NetBIOS_computer_name> + <username> + “_W” + <OS major version in hex> + <OS minor version in hex> + <OS build number in hex> + “.” + <random_GUID_bytes in hex>

· 設定の初期化

SHAPELISTSルーチンは、PEの.dataセクションからハードコードされたコンフィギュレーションをコピーします。コンフィギュレーションは、"STATIC_DATA "文字列で始まり、多くのユニコード文字列を保持します。

- Base64エンコードされたRSA公開鍵
- 初回登録時のサーバーアドレス
- 初期登録時のグループID
- 除外するファイルの拡張子、ファイル名、パスの一覧
- 終了させるプロセス名の一覧
- 停止するサービス名の一覧
- ファイルを列挙するパスの一覧
- 削除するファイル名のリスト
- ランサムノート(逆さ)

· C&Cサーバーへの登録と設定の更新

REGISTERペイロードは、WinINet APIを使用してサーバーにリクエストを送信し、応答ステータスコードを返します。Diavolは、C&Cサーバーに対して、以下のヘッダーを持つhxxp://<server_address>/BnpOnspQwtjCA/register URL へのPOSTリクエストを発行します。

User-Agent: "Agent"
Content-Type: application/x-www-form-urlencoded; charset=UTF-8

リクエストのボディは、

cid=<unique_victim_id>&group=<group_id_from_config>ip_local1=111.111.111.111&ip_local2=222.222.222.222&ip_external=2.16.7.12

サーバーがステータス成功を返すと、ランサムウェアはC&Cサーバーから更新された設定を取得しようとします。“-s” コマンドラインパラメータが提供されておらず、設定されているアドレスが127.0.0.1(localhost)であるため、ランサムウェアは自分自身を登録せず、設定の更新を取得しませんでした。

FROMNETルーチンは、同様にWinINet APIを使用してサーバーにリクエストを送信し、レスポンスからデータを返します。更新された構成を取得し、ハードコードされた値を上書きするために、ランサムウェアは以前と同じヘッダーを使用してHTTP GETリクエストを以下のように送信します。

hxxp://173[.]232[.]146[.]118/Bnyar8RsK04ug/<unique_victim_id>/qqq123/<object_name>

以下のオブジェクトがサポートされています。

/key - base64エンコードされたRSA公開鍵
/services - 停止するサービスのリスト
- /priority - ファイルを最初にスキャンするパスのリスト
/ignore - 除外するファイルの拡張子、ファイル名、パスのリスト
/ext - 含めるファイルの拡張子のリスト
/wipe - ファイルシステムの列挙中に発見された場合に削除するファイル名のリスト
- /landing - ランサムウェアノート

173.232.146.118へのネットワークトラフィックを検査すると、HTTP Cookieヘッダーに 「diavol_session 」という文字列が含まれていることがわかりました。

 

図7:DiavolのC&Cサーバーへのネットワークトラフィック

· サービスとプロセスの停止

ランサムウェアは、ターゲットマシンへの影響を最大化し、できるだけ多くのファイルを暗号化するために、データベース、オフィスアプリケーション、財務会計ソフトウェア、Webサーバー、仮想マシンなど、重要なファイルへのアクセスをロックすることができる実行中のプロセスを停止します。

SERVPROCは、Service Control Manager (SCM) APIを使用してサービスを終了させます。このAPIには管理者権限が必要であることから、攻撃者はこの要件を認識し、事前に適切な手段を講じていると考えられます。

このサンプルでは、以下のサービスの停止を試みています。

sqlservr.exesqlmangr.exeRAgui.exeQBCFMonitorService.exesupervise.exefdhost.exeCulture.exeRTVscan.exeDefwatch.exewxServerView.exesqlbrowser.exewinword.exe
GDscan.exeQBW32.exeQBDBMgr.exeqbupdate.exe,axlbridge.exe360se.exe360doctor.exeQBIDPService.exewxServer.exehttpd.exefdlauncher.exeMsDtSrvr.exetomcat6.exe
java.exewdswfsafe.exe.

また、マルウェアの開発者は、APIコールが成功したかどうかを確認しません。

図8: サービスを停止するためのSCM APIコールの逆アセンブル

KILLPRは、CreateToolhelp32Snapshot、Process32First、Process32Nextの各APIを使用して、システム内の実行中のプロセスを列挙します。

サンプルでは、以下のリストのプロセスの終了を試みています。

DefWatchccEvtMgrccSetMgrSavRoamdbsrv12sqlservrsqlagentIntuit.QuickBooks.FCSdbeng8sqladhlpQBIDPServiceCulserverRTVscan
vmware-usbarbitator64vmware-converterVMAuthdServiceVMnetDHCPVMUSBArbServiceVMwareHostdsqlbrowserSQLADHLPsqlwritermsmdsrv,
tomcat6QBCFMonitorServicechrome.exeoutlook.exechrome.exe.

Diavolの作者は、ハードコードされた設定にいくつかの間違いを犯しました。まず、SERVPROCは停止するサービス名ではなく、終了するプロセス名のリストを取得し、その逆も同様です。サービスのリストには、「winword.exe」のようなサービスとは関係のないものが含まれているようです。プロセスリストでは、最後の3つの項目だけが実際のプロセス名のように見えますが、そのうちの1つでも間違っています(「QBCFMonitorServicechrome.exe」は、「QBCFMonitorService」と「chrome.exe」を連結したもののように見えます)。

· 暗号化キーの初期化

RSAINITは、暗号化に使用するRSA公開鍵をWinCryptの標準APIで初期化します。

· 暗号化するすべてのドライブを見つける

ENMDSKSは、GetLogicalDriveStrings API を使用してシステム内のすべてのローカルドライブを取得し、それらが除外リストに含まれていないことを確認します。このルーチンは、modeコマンドラインパラメータ("-m")が "net "に設定されている場合はスキップされます。

除外されるファイルの拡張子、ファイル名、パスのデフォルトリストは以下の通りです。

*.exe*.sys*.dll*.lock64*readme_for_decrypt.txt*locker.txt*unlocker.txt%WINDIR%\%PROGRAMFILES%\%PROGRAMW6432%\%TEMP%\

SMBFASTとSMBルーチンは、アクセス可能なネットワーク共有を列挙します。

SMBFAST は、"-h"パラメータが存在する場合にのみ呼び出されます。このルーチンは、特定のホスト上でアクセス可能なネットワーク共有をスキャンします。

SMB は ARP テーブルで見つかったホスト上のアクセス可能なネットワーク共有をスキャンする。このルーチンは、modeコマンドラインパラメータ("-m")が "local "に設定されている場合はスキップされることに注意してください。

· 暗号化するファイルの検索

FINDFILESは、与えられたパスの中のファイルとディレクトリを横断します。このルーチンは複数回起動されます。

- コマンドラインの"-p"やハードコードされた設定に応じる。
- ENMDSKSの結果に応じる。
- SMBFASTの結果に応じる。
- SMBの結果に応じる。

まず、このルーチンは、指定されたファイルまたはフォルダが除外リストにないかどうかを確認します。次に、ルーチンは、現在のアイテムが削除するファイルのリストにあるかどうかを判断します。ない場合は、引数としてアイテムへのパスを取得する現在のスレッド上のAPCをキューに入れます。

図9:ファイルシステムトラバーサルの逆アセンブル

· シャドーコピーの削除で復旧を阻止

VSSMODは、OSのバージョン(Windows Server 2003またはVista以降)とアーキテクチャ(32または64ビット)に応じて、現在の作業ディレクトリに wscpy.exeをドロップして実行します。シャドーコピーのスナップショットの削除は、IVssBackupComponents COMオブジェクトを使って DeleteSnapshotsメソッドを呼び出して実行します。

また、ドロップされたバイナリは、リソースセクションの「TEXT」に平文で保管されています。これらのバイナリには、マルウェアのバイナリをコンパイルするために使用されたPDB参照ソースファイルが含まれていました。

D:\Projects\Repository\LockCry.divided\WipeShadowCopies64\RelNoCRT\WipeShadowCopies64.pdb

D:\Projects\Repository\LockCry.divided\WipeShadowCopies64\x64\RelNoCRT\WipeShadowCopies64.pdb

D:\Development\Master\onion\locker.divided\WipeShadowCopies64\RelNoCRT_Win2003\WipeShadowStorageWin2003_32.pdb

D:\Development\Master\onion\locker.divided\WipeShadowCopies64\x64\RelNoCRT_Win2003\WipeShadowStorageWin2003_64.pdb

· 暗号化

前述のとおり、FINDFILESは、ファイルまたはディレクトリのパスを持つAPCオブジェクトをキューに入れます。APCが実行されるために、メイン関数はその最後のステップで SleepEx APIを呼び出し、スレッドを警告可能な状態にします。

APCルーチンは、引数がディレクトリであるかどうかをチェックし、ディレクトリ内のファイルが暗号化されているかどうかに関わらず、「README_FOR_DECRYPT.txt」というランサムノートを作成します。引数がファイルの場合は、ENCDEFILE ルーチンが呼び出されます。

図10:パラメータの種類を確認するAPCルーチンの逆アセンブル

他の多くのランサムウェアとは異なり、Diavolは対称暗号を一切使用せず、RSAのみでファイルを暗号化します。

ENCDEFILEは、ファイルサイズをチェックします。2,000,000バイト以下であれば、最初の11,700バイトまでが暗号化されます。ファイルサイズが 2,000,000 バイト以上であれば、最初の 1,170,000 バイトだけが暗号化されます。

11,700 バイトの各ブロックは 117 バイトずつの 10 個のチャンクに分割され、各チャンクは CryptEncrypt API を使用して暗号化されます。117バイトの平文が128バイトの暗号文になります。したがって、11,700バイトは暗号化後に12,800バイトになります。Diavolはファイルを上書きし、チャンクの元のオフセットに11,700バイトの暗号化されたバイトを書き込み、残りの1,100バイトをファイルの最後に追加します。

最後に、ENCDEFILEはMoveFile APIを呼び出し、ファイル名に「.lock64」の拡張子を付加します。

すべてのAPCがデキューされて完了すると、SleepExの呼び出しに続いてスレッドが戻ります。

· デスクトップの壁紙を変更

プロセスが終了する前に、CHNGDESKが呼び出されます。

まず、デスクトップのウィンドウをキャプチャし、背景色を黒にします。そして、DrawText APIを使って、ビットマップ画像に「All your files are encrypted! For more information see “README-FOR-DECRYPT.txt”」と書き込み、public picturesフォルダに「encr.bmp」として保存します。最後に、SystemParametersInfoAPIのSPI_SETDESKWALLPAPERフラグを使って、デスクトップの壁紙を新しい画像に変更します。

図11:変更後のデスクトップの壁紙

ContiおよびEgregorとのつながり

今回の攻撃では、Diavolが異なるマシン上ではあるものの、ランサムウェア「Conti」と連携して展開されていたため、両者の間に何らかの相関関係があるかどうかを調べてみました。

まず、コマンドラインのパラメータから見てみると、Diavolで使用されているものはContiのものとほぼ同じで、ログファイル、ローカルドライブやネットワーク共有の暗号化、ネットワーク共有の特定ホストのスキャンなど、同じ機能に使用されています。さらに、DiavolとContiは、暗号化のためにファイルパスをキューイングする際、非同期I/O操作で同様に動作します。

また、DiavolとEgregorランサムウェアには関連性があるかもしれません。ランサムノートの一部の行は、図12に見られるように同一の内容となっていますが、これは単にDiavolの作者が仕込んだ偽装工作である可能性があるため、信頼性はありません。

Contiの背後にいる脅威アクターであるWizard Spiderと、Egregorの背後にいる脅威アクターであるTwisted Spiderとの間に関連性があるという報告もあります。これらのギャングは様々な活動で協力していると言われている。また、この2つのギャングは、被害者を二重に身代金を要求することでも知られています(データの窃盗と暗号化)。

図12:Egregorのランサムノートの上にあるDiavolのランサムノート

まとめ

このブログでは、新しいランサムウェアファミリーである「Diavol」の分析結果について解説しました。

現在、このランサムウェアの侵入元は不明です。攻撃者が使用したパラメータとハードコードされた設定のエラーは、Diavolがそのオペレーターの武器の中で、まだ完全には慣れていない新しいツールであることを示唆しています。

攻撃が進むにつれ、ネットワーク上にlocker.exeという名前のContiのペイロードがさらに発見されたことから、脅威の主体がWizard Spiderである可能性が強まりました。Diavol、Conti、およびその他の関連するランサムウェアの間にはいくつかの類似点がありますが、しかしながら、これらの間に直接的なつながりがあるかどうかはまだ不明です。また、これまでWizard Spider & Co.の仕業とされてきた攻撃との大きな違いがいくつかあります。

- ロシアの被害者にペイロードが実行されないようにするためのチェックアンドバランスがないこと。
- 環境下での二重恐喝の明確な証拠が見当たらないこと。

フォーティネットのソリューション

FortiEDRは、予備知識や特別な設定なしに、DiavolとContiのランサムウェアによる攻撃を即座に検知し、ブロックします。これは、実行後の防止エンジンを使用して、ファイルの暗号化やシャドーコピーの消去などの悪意のある活動を特定し、図13と14に見られるように、リアルタイムでブロックします。

図13: DiavolランサムウェアをブロックするFortiEDR

図14:ContiランサムウェアをブロックするFortiEDR

FortiGuardアンチウイルスサービスはフォーティネットのFortiGate、FortiMail、FortiClientFortiEDR ソリューションでサポートされており、FortiGuardアンチウイルスエンジンはフォーティネットのFortiGate、FortiMail、FortiClient、FortiEDRソリューションに含まれています。FortiGuardアンチウイルスは、以下のサンプルに対応しています。

85ec7f5ec91adf7c104c7e116511ac5e7945bcf4a8fdecdcc581e97d8525c5ac (Diavol, locker.exe) W32/Malicious_Behavior.VEX

426ba2acf51641fb23c2efe686ad31d6398c3dd25c2c62f6ba0621455a3f7178 (Conti v3, locker64.dll) W64/BazarLoader.AD!tr

4bfd58d4e4a6fe5e91b408bc190a24d352124902085f9c2da948ad7d79b72618 (Conti, locker.exe) W32/Conti.F!tr.ransom

すべてのネットワークIOCは、FortiGuard Webフィルタリングのブロックリストに追加されました。

また、Cyber Threat Allianceのメンバーとして、今回の脅威の詳細を他のアライアンスメンバーとリアルタイムで共有し、お客様のためのより良い保護体制の構築に役立てています。

Appendix A: MITRE ATT&CK Techniques

ID

Description

T1027

Obfuscated Files or Information

T1082

System Information Discovery

T1071.001

Application Layer Protocol: Web Protocols

T1489

Service Stop

T1562.001

Impair Defenses: Disable or Modify Tools

T1135

Network Share Discovery

T1490

Inhibit System Recovery

T1559.001

Inter-Process Communication: Component Object Model

T1486

Data Encrypted for Impact

T1485

Data Destruction

Appendix B: IOCs

File Hashes (SHA256)

85ec7f5ec91adf7c104c7e116511ac5e7945bcf4a8fdecdcc581e97d8525c5ac (Diavol, locker.exe)
426ba2acf51641fb23c2efe686ad31d6398c3dd25c2c62f6ba0621455a3f7178 (Conti v3, locker64.dll)
4bfd58d4e4a6fe5e91b408bc190a24d352124902085f9c2da948ad7d79b72618 (Conti, locker.exe)

File Names

locker.exe
locker64.dll
wscpy.exe
encr.bmp
README_FOR_DECRYPT.txt

File Paths

%PUBLIC%\Pictures\encr.bmp

IPs

173[.]232[.]146[.]118

URLs

hxxp://<server_address>//BnpOnspQwtjCA/register 
hxxp://173[.]232[.]146[.]118/Bnyar8RsK04ug/

Domains

r2gttyb5vqu6swf5[.]onion