This post is also available in: English (英語)
概要
Unit 42は最近、ポルトガル語話者を標的とするマルウェア キャンペーンを発見しました。このキャンペーンは正規ユーザーのウォレットから脅威アクターの管理するウォレットに暗号通貨をリダイレクトしようとします。このキャンペーンではリダイレクトの実現に「暗号通貨クリッパー」と呼ばれる種類のマルウェアを使います。暗号通貨クリッパーは、暗号通貨ウォレットのアドレスがコピーされた兆候がないかどうか、被害者のクリップボードを監視します。
私たちがCryptoClippyと呼ぶこのマルウェアは、ユーザーの実際のウォレット アドレスを脅威アクターのものに置き換えることで、ユーザーが意図せず脅威アクターに暗号通貨を送るようしむけます。Unit 42 Managed Threat Huntingチームは、製造業・ITサービス業・不動産業などのセクターで被害者を確認していますが、おそらくは仕事用マシンで個人用ウォレットを使った人々に影響したものと考えられます。
このキャンペーンで脅威アクターはGoogle広告(Google Ads)とトラフィック配信システム(TDS)の両方を使ってマルウェアをユーザーのコンピューターに配信し、被害者を正規WhatsAppのWebアプリケーションに偽装した悪性ドメインにリダイレクトしていました。被害者が生身の人間であること、ポルトガル語の話者であることを確かめるためです。脅威アクターは悪性ドメインにリダイレクトされたユーザーをだまし、最終ペイロードにつながる.zipファイルないし.exeファイルを含めた悪質なファイルをダウンロードさせようとします。
パロアルトネットワークスのお客様はCortex XDRを通じてこのキャンペーンからの保護を受けています。次世代ファイアウォールのクラウド型セキュリティサービス、高度なURLフィルタリングとDNSセキュリティは、CryptoClippyのキャンペーンに関連するドメインを「malicious (悪意あるもの)」として識別します。
関連するUnit 42のトピック | Cryptocurrency, Bitcoin |
暗号通貨クリッパーとは
暗号通貨マルウェアは暗号通貨資金を正規ユーザーのウォレットから脅威アクターの管理するウォレットにリダイレクトしようとします。コンピューターが暗号通貨クリッパーに感染すると、クリップボードが継続的に監視され、暗号通貨のウォレット アドレスをコピーしたかどうかがチェックされます。この背後にあるのは「ウォレットのアドレスをクリップボードにコピーしているということは、あるウォレットから別のウォレットへ暗号通貨を転送しようとしているところかもしれない」という考えです。
このクリッパー マルウェアは、そのアドレスがどのような種類の暗号通貨に関係するものかを正規表現(regex)で特定した後、一見似てはいるけれども攻撃者の管理下に置かれた同じ種類の暗号通貨ウォレット アドレスにクリップボードの項目を置き換えます。この後被害者がクリップボードからアドレスを貼り付けて取引すると、実際には脅威アクターに暗号通貨を直接送ることになります。
ウォレット アドレスは通常、英数字で40文字以上と非常に長いため、たいていのひとはこのアドレス変更に気づかないでしょう。これがクリッパー マルウェアがうまく機能する原因になっています。
CryptoClippyの概要
Unit 42 Managed Threat Huntingチームは、製造業・ITサービス業・不動産業など、さまざまなセクターの被害者を確認しています。この脅威は特定の業界を標的にしておらず、影響を受けたデバイスは日和見的に攻撃されたものです。
CryptoClippy感染はSEOポイズニングに始まります。このSEOポイズニングでは、「WhatsApp Web」と検索することで、脅威アクターの管理するドメインに誘導されます。このドメインにたどり着いた被害者は悪意のあるスクリプトで構成された.lnkファイルを含む.zipファイルをダウンロードするよう促されます。これらのスクリプトが、クリッパー マルウェアをインストールするイベント チェーンを引き起こします。この脅威はその後、被害者のクリップボードでのBitcoin取引操作を監視し、被害者の有効な暗号化ウォレットのアドレスを脅威アクター管理下のものに置き換えられるようにします。
今回私たちが調査したCryptoClippy亜種はさまざまな追加機能を備えており、それらの機能で脅威アクターの暗号通貨窃取を成功に導きます。これには、RC4で暗号化したPowerShellスクリプトを実行することによってリモート デスクトップ プロトコル(RDP)のバックドアを確立することも含みます。
このスクリプトには、Windows Management Instrumentation (WMI)、ターミナル サービスのレジストリー操作、icacls、netコマンド、ログ消去などの要素が含まれています。これらにより、攻撃者はメモリー内ペイロードの外部アクセスを維持できます。
さらにこの亜種は、EthereumとBitcoinの暗号通貨ウォレットを標的にした機能も備えています。ラテン アメリカでのデジタル通貨人気を考えれば、これはとくに驚くべきことではないでしょう。
本稿執筆時点で、脅威アクターが管理するウォレットには最近のアクティビティが見られます。Bitcoinアドレスには0.039954 BTCを受け取った形跡があり、これはおよそ982.83ドルに相当します。このBitcoin (BTC)残高は4つの異なるBTC取引からのものです。Ethereum (ETH)アドレスにも資金を受け取った形跡があり、3つの異なるETHアドレスから0.110915556631181819 ETH(およそ186.32ドル)が送金されていました。
このキャンペーンの脅威アクターは、シグネチャ ベースとヒューリスティック ベースのセキュリティ エンジンを回避するため、多段アプローチを採用していました。このアプローチには、難読化されたPowerShellスクリプトや暗号化されたペイロードを使うなど、検出回避のための難読化技術が含まれていました。
VirusTotalでこのマルウェアを検出しているベンダーはほんの一握りのようで、同マルウェアの現在の検出率の低さはこのアプローチの有効性を物語っています。なお検出したベンダーは同マルウェアにジェネリックな名称を割り当てています。
CryptoClippyの感染チェーン
CryptoClippyの感染チェーンは初期.zipファイルの配信から始まります。この.zipファイルには.lnkファイルが含まれていて、この.lnkファイルは難読化されたPowerShellコマンドライン スクリプトで構成されています。被害者が.lnkファイルをダブルクリックすると、PowerShellスクリプトが実行され、第2ステージと難読化・暗号化されたいくつかのペイロード(ステージ1 - ローダーで後述)をダウンロードします。
第2ステージのPowerShellスクリプトが実行されると、CryptoClippyローダーの難読化が解除され、復号され、実行されます。その後、このローダーは窃取を行うスティーラーのコンポーネントをsvchost.exeにインジェクトします。
CryptoClippyは、ユーザーモードのイベント フックとコールバック関数をクリップボードAPIにセットアップしておき、被害者のEthereum/Bitcoinの暗号通貨ウォレットがクリップボードにコピーされると、それをアクターの暗号通貨ウォレットに置き換えます。CryptoClippyにはC2サーバーとの通信機能も含まれています。
図1はCryptoClippyの感染チェーンです。
![画像1はCryptoClippyの感染チェーンを示した図です。初期配信からC2(図中ではC&Cと表記)通信までのフローを示しています。](https://unit42.paloaltonetworks.jp/wp-content/uploads/2023/04/F1-CC-ja-2.png)
マルバタイジングによる配信
このマルウェア キャンペーンではGoogle広告とトラフィック配信システム(TDS)の利用が確認されています。まず脅威アクターは、ユーザーが「WhatsApp Web」を検索したさいに検索結果に表示されるGoogle検索広告を使いました。これで被害者をだまし、悪意のある.zip圧縮ファイルをダウンロードさせて開かせます。2022年のはじめ、この問題について警告を受けたGoogleは、追加の保護を実装し、新規の攻撃試行を検出・防止するようにシステムを改善したと説明しています。
さらに、脅威アクターはTDSを使って悪意のあるランディング ページで被害者かボットかをフィルタリングしていました。このTDSのフィルターは、クライアントのデバイスが生身の人間か、またポルトガル語話者かをさまざまな基準で判断し、ボットやインターネット クローラーを排除します。
最初にTDSは接続元デバイスがVPN (仮想プライベート ネットワーク)のIPアドレスから来ているかどうかをチェックします。VPNが使われていると攻撃者は被害者のデバイス位置や特徴を把握しづらくなり、悪意のあるコンテンツを配信しにくくなります。
次にTDSはUser-Agentをチェックします。User-AgentはWebブラウザーが自分自身とその機能を識別するためにWebサイトに送信するテキスト文字列です。TDSはクライアント デバイスのUser-Agentを確認することで、Accept-Languageヘッダーを確認し、ブラウザーの優先言語がポルトガル語かどうかを判断します。TDSはデバイスの種類、オペレーティング システム、ブラウザーのバージョン、ジオロケーションなどのほかの情報も確認できます。
最後にTDSはHTTP (Hypertext Transfer Protocol)のGETヘッダーにおける条件を確認します。HTTP GETヘッダーは、リソース取得のためにWebブラウザーからサーバーに送信されるリクエスト メッセージで、ここには要求されたURL、User-Agent、Accept-Language、Refererなどのさまざまな情報を含められます。HTTP GETヘッダーの条件チェックも、TDSがブラウザーの優先言語がポルトガル語であるかどうかを判断する方法のひとつです。
TDSは、上記の条件を満たさない接続と判断すると被害者を別のランディング ページ(図2)にリダイレクトし、「Continuar para o WhatsApp Web」(ポルトガル語で「WhatsApp Webへ進む」)をクリックするよう促します。こうして悪意あるアクティビティをそれ以上は行わず、正規のWhatsApp Webドメインにリダイレクトすることで、被害者やセキュリティ ソフトウェアによる検出をかいくぐります。
![](https://unit42.paloaltonetworks.jp/wp-content/uploads/2023/04/word-image-127548-2.png)
ただし、接続元が上記の条件を満たすと判断された場合、被害者は悪性ランディング ページにリダイレクトされ、悪意のある.zipファイルをダウンロードするよう促されます(図3、図4)。
![画像3は被害者の閲覧履歴のスクリーンショットです。「whatsapp web」で検索したようすを示しています。](https://unit42.paloaltonetworks.jp/wp-content/uploads/2023/04/word-image-127548-3.png)
このサイトはWhatsAppの公式Webサイトを装ってWhatsApp Desktopを提供しています。このWhatsApp.zipというファイルをmydigitalrevival[.]comからダウンロードすると初期感染につながります(図4)。
被害者が悪意のあるWebページを読み込んで、そこでホストされている.zipファイルをダウンロードすると、その中にはある.lnkファイルが入っています(図5)。
![画像5は、.lnkファイルを含む.zipファイルのコンテンツのスクリーンショットです。ファイル名は「WhatsApp-RKQT.lnk」です。](https://unit42.paloaltonetworks.jp/wp-content/uploads/2023/04/word-image-127548-5.png)
この.lnkファイルの技術的詳細は「.lnkファイルによる感染」を参照してください。
.lnkファイルの実行後、次のファイルがC:\Users\<USERNAME>\AppData\Roaming\RicolyにダウンロードされることをUnit 42のリサーチャーは確認しています。
- Ricoly.bat
- Ricoly.ps1
- 難読化・暗号化されたファイル2つ(ps、sc)
- 難読化・暗号化された補助configファイル1つ(pf)
Ricoly.batというバッチファイルが、1つめのPowerShellスクリプト ローダーであるRicoly.ps1を起動して実行します。Ricoly.ps1スクリプトの目的は、第2ステージの難読化・暗号化されたスクリプト(ps)の復号です。これらローダー ファイルについては「ステージ1 - ローダー」と「ステージ2 - ローダー」で詳述します。
第2ステージのPowerShellスクリプトのpsは、反射型PEローダーとして機能します。このpsファイルは、ファイル システムに書き込まれるscという名前の暗号化されたEXEファイルを対象にします。このscファイルに対して反射型ロードが行われ、これが最終的にCryptoClippyのメイン ローダーとして機能します。
メインのCryptoClippy実行ファイル
.lnkファイルとそれに続く2つのPowerShellスクリプトの実行後のCryptoClippyのオペレーションは、実行ファイル形式のローダーと、メインのCryptoClippyの実行ファイルから構成されています。CryptoClippyのローダーは64ビットの実行可能形式(EXE)ファイルです。このローダーの.dataセクション内に、メインのスティーラー用EXEファイルが組み込まれています。このローダーはsyscallを使っていて、実行の実装はSysWhispers2と重複しているようです。
SysWhispers2はステルス性を高めてコードを実行するための実装で、ユーザーモードAPIの検査回避に使われています。こうした回避を実現できるのは、アプリケーションは一般にユーザーモードフック経由でユーザーモードAPIを使っており、AV/EDR製品によるイントロスペクションもこの方法で行われているためです。
メインのCryptoClippyの実行ファイルはC言語で書かれており、TLS (Transport Layer Security)ライブラリーのMbed-TLSを静的にリンクしてコンパイルされています。この実行ファイルの主な機能には、名前生成用の独自アルゴリズムが含まれます。たとえばファイル パスやミューテックス、イベント オブジェクトなどの名前は、この独自アルゴリズムで生成されます。このアルゴリズムの詳細については「フォルダー名とミューテックス文字列生成関数」を参照してください。
このメインの実行ファイルはほかに、暗号化された証明書を含むpfというローカルの補助ファイルを多用します。CryptoClippyは、独自アルゴリズムで補助ファイルの文字ルックアップ テーブルの難読化を解除し、ポインターからルックアップテーブル内の値に変換して平文の証明書を組み立てます。
このほか、さまざまな文字列復号機能に2つの異なるRC4鍵を使います。この文字列復号ルーチンはメモリー内に組み立てた構造体を使ってインデックス位置から構造体、文字列オフセット、文字列サイズを得ます。これらの文字列は、オブジェクト名、ドメイン、暗号通貨ウォレット、永続化スクリプトに関連するものです。
- RC4鍵: 1b43233d5a054808061c190336320e46
- RC4鍵: 4646070B47445451604F291809444703
暗号通貨窃取オペレーション
CryptoClippyの主目的は、クリップボードにコピーされる暗号通貨ウォレット文字列の識別です。CryptoClippyはユーザーモードのイベント フックをセットアップしておき、WindowsのクリップボードにコピーされたEthereumまたはBitcoinベースのウォレットを脅威アクターが所有するハードコードされたウォレットの値にコールバック関数を使って置き換えます。この技術的詳細は「ユーザーモード イベント フックのセットアップ」を参照してください。
図6はクリップボード入力を捕捉しているウィンドウを示したものですが通常のローダーの実行フローでこの特定アプリケーションが見えることはありません。
![画像6はクリップボード入力のスクリーンショットです。クリップボードへの入力内容が順次表示されています。](https://unit42.paloaltonetworks.jp/wp-content/uploads/2023/04/word-image-127548-6.png)
図7はCryptoClippyのクリップボード処理機能を逆コンパイルしたものです。この図からは、脅威アクターが使うウォレット アドレスがRC4で復号され、この後で暗号通貨ウォレットの置換が生じると、復号されたアドレスが使われることがわかります。
CryptoClippyはクリップボードに入ってきたデータの文字列をチェックします。ここではEthereumやBitcoinベースのウォレットで一般に見られる先頭文字があるかどうかをチェックしています。クリップボードにコピーされた文字列はループ処理されて文字数が判定されます。図7の27行目では、合計文字数から25を引いた結果が9以下かどうかを比較しています。
![画像7はCryptoClippyのクリップボード処理機能を逆コンパイルして表示しているスクリーンショットです。27行目がハイライト表示されています。また文字列チェックオプションがBitcoinやEthereumであるかをチェックしている0xとbc1がハイライトされています。](https://unit42.paloaltonetworks.jp/wp-content/uploads/2023/04/word-image-127548-7.png)
この文字列チェック処理は1から始まるBitcoinアドレスに対して機能します。そうでない場合はコード パスがスキップされ、クリップボード内の文字列がbc1(Bitcoin関連)または0x(Ethereum関連)で始まるかどうかがチェックされます。
図8に示したデバッグ ビューは、GetClipboardData APIと、このAPIからの戻り値を示しています。この戻り値にはコピーされたEthereumウォレットの例が表示されています。
![画像8はEthereumウォレットのスクリーンショットです。ユーザーのEthereumウォレットを示す部分がハイライト表示されています。](https://unit42.paloaltonetworks.jp/wp-content/uploads/2023/04/word-image-127548-8-ja.png)
クリップボードのデータを取得すると、前記の逆コンパイル図で説明した文字列チェックが行われ、特定の暗号通貨ウォレットらしき文字が使われているかどうかが確認されます。図9では、入力としてEthereumウォレットが渡された後、開始文字の値が0xであるかどうかが確認されています。
![画像9はEthereumウォレットのスクリーンショットです。脅威アクターのEthereumウォレットを示す部分がハイライト表示されています。](https://unit42.paloaltonetworks.jp/wp-content/uploads/2023/04/word-image-127548-9-ja.png)
クリップボードの操作を担当している関数は、ユーザーがコピーしたEthereumのウォレット アドレスを0xB49aeae711FBa241f657dA46A998833A6591848bというEthereumウォレット アドレスにSetClipboardData APIを使って入れ替えます。
ウォレット アドレスのサンプルを一部テストしました。表1は、ユーザーが渡した値がコピーされた後、暗号通貨のクリッパー関数が置き換えた結果です。
通貨 | サンプルのウォレット | 置換されたウォレットの値 |
ETH | 0xdB055877e6c13b6A6B25aBcAA29B393777dD0a73 | 0xB49aeae711FBa241f657dA46A998833A6591848b |
BTC | bc1qa5wkgaew2dkv56kfvj49j0av5nml45x9ek9hz6 | 1MVUhqKLr8eEDazESmxxc4mvu6YTaMudMF |
BTC | 17VZNX1SN5NtKa8UQFxwQbFeFc3iqRYhem | 1MVUhqKLr8eEDazESmxxc4mvu6YTaMudMF |
BTC | 1JqDybm2nWTENrHvMyafbSXXtTk5Uv5QAn | 1MVUhqKLr8eEDazESmxxc4mvu6YTaMudMF |
BTC | 3EktnHQD7RiAE6uzMj2ZifT9YgRrkSgzQX | 1MVUhqKLr8eEDazESmxxc4mvu6YTaMudMF |
BTC | 3279PyBGjZTnu1GNSXamReTj98kiYgZdtW | 1MVUhqKLr8eEDazESmxxc4mvu6YTaMudMF |
BTC | bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4 | 1MVUhqKLr8eEDazESmxxc4mvu6YTaMudMF |
BTC | bc1qa5wkgaew2dkv56kfvj49j0av5nml45x9ek9hz6 | 1MVUhqKLr8eEDazESmxxc4mvu6YTaMudMF |
表1. コピーされたウォレットと置換されたウォレットのサンプル
被害コンピューターへのアクセス維持のため、CryptoClippyはRicoly.lnkをスタートアップ フォルダー(\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\Ricoly.lnk)に追加して永続性を確保します。ユーザーがログインするとRicoly.lnkが起動し、次にRicoly.batスクリプトが実行され、Ricoly.ps1が実行されます。
このほかTozzia.ps1というRC4で暗号化されたPowerShellスクリプトにもアクセス維持のためのしくみが含まれています。svchost.exeにインジェクトされたCryptoClippyペイロードは、Tozzia.batファイルとTozzia.ps1ファイルを抽出します。
ほかの2つのスクリプトとともに、Tozzia.ps1スクリプトにも、ターミナル サービスのレジストリー操作やローカル アカウントの作成、netコマンド、イベント ログ消去などに関連するさまざまな機能が含まれています。これら3つのスクリプトについては「バックドア」でさらに掘り下げて解説します。
結論
暗号通貨に特化したマルウェアの蔓延がここ数年勢いを増しています。この特定の事例の脅威アクターは自身のキャンペーンに以下のアクティビティを取り入れていました。
- マルバタイジングの組み込み
- TDSの利用
- 標的の範囲の絞り込み
- ペイロードの環境キーイング(keying: ローカルやリモートの環境内にある情報からペイロードを組み立てることで検出を避ける手口)
- ローダーとクリッパーの機能全般を隠蔽する複雑でステルス性の高い技術の採用
- データ操作のためのカスタム アルゴリズム作成
これらの手口からは暗号通貨を狙うマルウェアの興味深い変化が浮かんできます。この手のマルウェア配信方法では、とくに2つの方法が目につきます。1つめはLaplas ClipperやSmokeloaderのようにボットネットを利用する方法、2つめはEternity Clipperのようにマルウェア・アズ・ア・サービス(MaaS)系の要素を下敷きにする方法です。
保護と緩和策
Cortex XDRをお使いのパロアルトネットワークスのお客様は、本稿で取り上げたマルウェアの技術からエンドポイント上で保護を受けています。高度なURLフィルタリングとDNSセキュリティを有効化したパロアルトネットワークスの次世代ファイアウォールをお使いの場合、CryptoClippy攻撃キャンペーンに関連するドメインは「malicious (悪意があるもの)」として識別されます。
侵害の懸念があり弊社にインシデントレスポンスに関するご相談をなさりたい場合は、こちらのフォームからご連絡いただくか、infojapan@paloaltonetworks.comまでメールにてご連絡いただくか、下記の電話番号までお問い合わせください(ご相談は弊社製品のお客様には限定されません)。
- 北米フリーダイヤル: 866.486.4842 (866.4.UNIT42)
- 欧州: +31.20.299.3130
- アジア太平洋: +65.6983.8730
- 日本: +81.50.1790.0200
パロアルトネットワークスはファイルサンプルや侵害の兆候などをふくむこれらの調査結果をCyber Threat Alliance (CTA) のメンバーと共有しました。CTA のメンバーはこのインテリジェンスを使って、お客様に保護を迅速に提供し、悪意のあるサイバー攻撃者を体系的に阻害できます。詳細についてはCyber Threat Allianceにてご確認ください。
付録
この付録ではCryptoClippyマルウェアのアクティビティ関連の詳細を説明します。このセクションは、おおよそ図1の感染チェーン図に記載したアクティビティの順序に沿って解説します。
LNKファイルによる感染
被害者が最初にダウンロードする.zipファイルには.lnkファイルが入っており、このなかにコマンドが不完全な状態で入っています(図A1参照)。このファイルをダブルクリックすると、[Shortcut]タブの[Target]フィールドに入力されている難読化済みコマンドが実行されます。このコマンドは、アクターが管理するドメインへのチェック インを担っています(図A3)。
- ^
- !!
- :~
図A2はこのパディングが.lnkファイルでどのように使われているかを示したものです。
![画像11は.lnkファイルを難読化する文字パディング方法を示している多数のコード行のスクリーンショットです。](https://unit42.paloaltonetworks.jp/wp-content/uploads/2023/04/word-image-127548-11.png)
このLNKの難読化が解除されると、図A3のPowerShellコマンドになります。このコマンドは「uiPX」という文字列をHTTPプロトコル経由で攻撃者が管理するドメインtunneldrive[.]comにアップロードします。
![画像12は.lnkの実行によって実行されるPowerShellコマンドのスクリーンショットです。これは脅威アクターの管理するドメインに文字列をアップロードしています。](https://unit42.paloaltonetworks.jp/wp-content/uploads/2023/04/word-image-127548-12.png)
Unit 42のリサーチャーが観測したケースでは、この感染チェーンの元をたどると拡張子.lnkを持つファイルに行き着いた点にふれておくべきでしょう。これらのファイルは通常.zipアーカイブに含まれています。ただしこのキャンペーンの探索範囲を広げていくなかで、これとは異なる感染チェーンも観測されました。こちらの場合は初期ペイロードが.exeファイル(VirusTotalに報告あり)で、このファイルは前述のドメインmydigitalrevival[.]comとリンクしています。
WhatsApp Webを偽装したこの.exeファイルを調べたところ、このファイルは実行時に前述のtunneldrive[.]comドメインにアクセスすることがわかりました。その後、.batファイルをドロップし、実行してから自身を削除します。
この.batファイル(図A4)はこちらのブログで詳述されているように徐々にペイロードを構築していく難読化を採用していますが、難読化のレベルがより高度になっています。またこの難読化手法はDaniel Bohannon氏のInvoke-Obfuscationプロジェクトから採用したようで、これはブラジルの脅威アクターが広く採用しています。
![画像13は第1ステージでドロップされたBATファイルに難読化が含まれていることを示す何行にもわたるコードのスクリーンショットです。](https://unit42.paloaltonetworks.jp/wp-content/uploads/2023/04/word-image-127548-13.png)
ステージ1 - ローダー
Ricoly.batというバッチファイルが、1つめのPowerShellスクリプト ローダーであるRicoly.ps1を起動して実行します。Ricoly.ps1スクリプトの目的は、同じくC:\Users\<USERNAME>\AppData\Roaming\Ricolyに存在しているドロップ済みの第2ステージ用難読化・暗号化済みスクリプト、psを復号することです。
このRicoly.ps1スクリプトはほぼハードコード(静的に設定)されているXOR鍵を使いますが、このXOR鍵の一部を被害者のコンピューターのプロセッサIDから動的に導出します。こうしてペイロードをキーイング(keying: 環境内の情報からペイロードを組み立てる検出回避手法)することで解析対策レイヤーを追加しています(図A5)。
![画像14は何行もあるコードのスクリーンショットです。XOR復号を担うのはPowerShellスクリプトです。XOR鍵が赤で強調表示されています。起動する.psファイルは紫色で強調表示されています。](https://unit42.paloaltonetworks.jp/wp-content/uploads/2023/04/word-image-127548-14-ja.png)
ステージ2 - ローダー
私たちは以下のCyberChefのXOR Recipe (図A6)を使って第2ステージのペイロードを復号しました。
- XOR鍵: b8 55 2e 7c 48 f6 44 ea c1 7c 9e 09 eb b0 f5 f1 23 f4 22 42 02 15 a1 cb ed 69 50 c1 1b 46 bf eb fb ff 00 08 06 ec bc c5 55 c1 de 96 14 3b bb a8 85 59 13 70 0b 28
![画像15はCyberChefでRecipeを実行後デコードされた第2ステージのPowerShell .psファイルを示す多くの行のスクリーンショットです。](https://unit42.paloaltonetworks.jp/wp-content/uploads/2023/04/word-image-127548-15.png)
前述の第1ステージでダウンロードされたscという名前の暗号化済みEXEファイルがファイル システムに書き込まれます。第2ステージのpsスクリプトは、このEXEファイルを対象とします。
第2ステージのPowerShellスクリプトpsは反射型PEローダーとして機能します。このスクリプトは.NETメソッドとD/invokeを.NETデリゲートと連携させることで検出の回避と動的な名前解決を実現しています。
このpsスクリプトは、オペレーティング システムが32ビットか64ビットかを判定するほか、kernel32.dllからどのようなAPIの機能が必要かを判定することにより反射型ローダーとして機能します。VirtualAllocやCreateThreadなどの必要なAPIは、GetDelegateForFunctionPointerを使って名前解決しています。
その後、このpsスクリプトはペイロードをXOR復号してEXEファイルscを呼び出します(図A7)。
![画像16は何行もあるコードのスクリーンショットです。赤でハイライトしたコードはAPIを示しており、紫でハイライトしたコードはXOR鍵です。](https://unit42.paloaltonetworks.jp/wp-content/uploads/2023/04/word-image-127548-16-ja.png)
反射型ロードによってメモリーに読み込まれたEXEファイルscは、メインのローダーとして動作し、新たに作成された別のプロセスに対し、syscallを使ってコードをインジェクトします。この新たに作成されたsvchost.exeプロセスにCryptoClippyが含まれています。
フォルダー名とミューテックス文字列生成関数
このスティーラーのはじめのいくつかの関数は、最初にファイル システムをマッピングして使用するフォルダーを作成します。これはGetWindowsDirectoryA、GetVolumeInformationA、SHGetFolderPathA APIを使って実現しています。
スティーラーには、ユニークな英数字の文字列を作成する関数が含まれています。この文字列生成関数はメイン プログラム内の複数箇所で使われています。この関数はまず、AppDataのパスの下にユニークなフォルダー名を作成するのに使われます。このとき、文字列生成関数へのパラメーターとして、ある定数値が使われます(図A8)。
この事例でこの定数は0x79FE6Dでした。この定数は文字列生成関数で使われ、書式指定文字列の%08x-%08xにマッピングされます。
![画像17は2つのペインのスクリーンショットです。左側で赤くハイライトされているのがフォルダー作成に使われた定数です。右側で紫でハイライトされているがこの文字列生成関数に対する11箇所の参照です。](https://unit42.paloaltonetworks.jp/wp-content/uploads/2023/04/word-image-127548-17-ja.png)
この文字列生成関数は、関数に渡された定数の値と、被害者のシステムを照会して得たボリューム シリアル番号を使います。たとえば079fe6d-de786dd1(図A9)という文字列が生成されます。
![画像18は、何行もあるコードのスクリーンショットです。赤で強調されているのが定数の値です。黄色でハイライトされているのはボリューム シリアル番号です。](https://unit42.paloaltonetworks.jp/wp-content/uploads/2023/04/word-image-127548-18-ja.png)
このアルゴリズムは、文字列079fe6d-de786dd1を各文字ごとに分割してシャッフルします。最初の演算は文字列1文字目と値FFFFFFFFとのXORです。
次にその演算結果が右に1シフトされてから、定数0x82F63B78とXORされます。このXOR演算の後、さらに同様の演算処理を計8回行って、16文字ある文字列079fe6d-de786dd1を1文字ずつ処理します。
このアルゴリズムが完了すると、AppDataディレクトリに追加されるフォルダー名が返されます(図A10)。この例ではフォルダー名が55abf82dで、完全なパスは C:\Users\xxx\AppData\Roaming\55abf82dとなりました。演算結果は、ユニークな英数字の文字列を作成するために入力として渡す定数とボリューム シリアル番号しだいで変わります。
![画像19は2つのペインに何行ものコードが並んでいるスクリーンショットです。左のペインで赤くハイライトされているのがアルゴリズムです。右のペインに紫でハイライトされているのが演算結果で、ここでは94ee4d61となっています。](https://unit42.paloaltonetworks.jp/wp-content/uploads/2023/04/word-image-127548-19-ja-1.png)
ミューテックス
スティーラーはミューテックスの作成でもこの文字列生成関数を使いますが、ミューテックスの場合はべつの定数値(図A11に示す)がパラメーターとして渡されます。この事例ではその値は0x24F2D5です。
![画像20は、ミューテックス作成に使用する定数値とボリューム シリアル番号とのスクリーンショットです。赤枠でハイライトされているのが定数です。](https://unit42.paloaltonetworks.jp/wp-content/uploads/2023/04/word-image-127548-20-ja-1.png)
ユーザーモード イベント フックのセットアップ
クリップボードにコピーされた暗号通貨ウォレットを切り抜いてバイナリ内にハードコードされたウォレットと置き換えるため、スティーラーはまずSetWinEventHookというAPIを呼び出してイベント フックをセットアップします。これによって特定のイベントがトリガーされたさい、クリップボード データとのやりとりを行う関数を呼び出します。
- EVENT_OBJECT_FOCUS
- EVENT_OBJECT_VALUECHANGE
- EVENT_SYSTEM_FOREGROUND
このイベント フックのセットアップは、全プロセス、全既存スレッドからのイベントを受けとるプロセス スコープを持ちます。この後フック作成を担う所有プロセスへのフックはスキップされます。イベント フックをセットアップしたら、ウィンドウ イベント オブジェクトを作成します(図A12)。このイベント オブジェクトの作成は、同期に使われるWindows APIのCreateEventAを呼び出すことで行います。このAPIは、特定イベントが発生し、それが完了したさい、スレッドにシグナルを送ります。
![画像21は、ウィンドウのイベント フックとクラスの登録を逆コンパイルしたスクリーンショットです。](https://unit42.paloaltonetworks.jp/wp-content/uploads/2023/04/word-image-127548-21.png)
ウィンドウ オブジェクトのイベントを作成した後、スティーラーはRegisterClassExA APIを使います。このAPIには、wcbClassとさまざまな構造体フィールドを含むWNDCLASSEX構造体へのポインターが渡されます。
その後CreateWindowExAが呼び出され、前述のAPIが指す構造体を持つウィンドウが作成されます。ここで分析上重要となる構造体内のフィールドはlpfnWndProcで、このフィールドがマルウェア作者のクリップボード関数を指しています。
バックドア
実行の過程でCryptoClippyは自身に埋め込まれたファイルのTozzia.batとTozzia.ps1を復号してファイル システムに書き込みます。バッチファイルTozzia.batが実行され、これが次にTozzia.ps1を実行します(図A13)。
![画像22はTozzia.batファイルの内容(一部削除済み)のスクリーンショットです。](https://unit42.paloaltonetworks.jp/wp-content/uploads/2023/04/word-image-127548-22.png)
図A14は、Tozzia.ps1がファイル システムに書き込まれて実行され、永続性を確保するようすを示すものです。
![画像23は何行もあるコードのスクリーンショットです。これはTozzia.ps1ファイルの内容です。](https://unit42.paloaltonetworks.jp/wp-content/uploads/2023/04/word-image-127548-23.png)
図A15はTozzia.ps1がスケジュール タスクの作成によって永続性を確保するようすを示しています。
![画像24はTozzia.batファイルが作成したスケジュール タスクのスクリーンショットです。](https://unit42.paloaltonetworks.jp/wp-content/uploads/2023/04/word-image-127548-24.png)
Tozziaの復号に続いて、Giddia、Knowledgeprojectsというさらに2つのスクリプトが復号されましたが、これらは実行されず、ファイル システムにも書き込まれませんでした。これら2つのスクリプトをメモリーから切り出してみると、中には数百行の追加スクリプト コードがあることがわかります。
Giddiaというスクリプト(図A16、A17)には、ターミナル サービス関連のレジストリー プロパティ値を操作する機能があります。その目的はターミナル サービスの脆弱化です。このほか、netコマンドやローカル アカウント関連の処理を行う機能も含まれています。
![画像25はGiddiaスクリプトのスクリーンショットで、赤枠のハイライト部分に「Giddia」の名前が表示されています。](https://unit42.paloaltonetworks.jp/wp-content/uploads/2023/04/word-image-127548-25.png)
![画像26はGiddiaスクリプトの機能をより詳しく示したスクリーンショットです。紫でハイライトされているのが、ローカル アカウントです。赤色の矢印で「Log Clearing(ログの消去)」がハイライトされています。](https://unit42.paloaltonetworks.jp/wp-content/uploads/2023/04/word-image-127548-26.png)
![画像27は、Knowledgeprojectsスクリプトの名前を赤くハイライトしてあるスクリーンショットです。](https://unit42.paloaltonetworks.jp/wp-content/uploads/2023/04/word-image-127548-27.png)
Knowledgeprojectsスクリプト(図A18、図A19)には、PowerShellでログを消去する機能があります。
![画像28はKnowledgeprojectsスクリプトの機能をより詳しく示したスクリーンショットです。赤色の矢印で「Log Clearing(ログの消去)」がハイライトされています。](https://unit42.paloaltonetworks.jp/wp-content/uploads/2023/04/word-image-127548-28-ja-1.png)
ハント用クエリ
以下のXQLクエリーを使うと、感染のさまざまなステージをハントできます。
svchost.exeに対するインジェクション
1 2 3 4 5 |
config case_sensitive = false timeframe = 30d | dataset = xdr_data | filter event_type = ENUM.INJECTION and event_sub_type = ENUM.INJECTION_CREATE_REMOTE_THREAD | filter action_remote_process_image_command_line = "C:\WINDOWS\System32\svchost.exe" and actor_process_image_name = "powershell.exe" | fields _time, agent_hostname, agent_ip_addresses, causality_actor_process_command_line, actor_process_command_line, action_remote_process_image_command_line |
IoC
7db350f9ec3adb2b7f9a3e9e58c69112b5a7e2ed0337a1c4ac55c9a993116f5c | WhatsApp-RKQT.lnk |
15f9645e5621e87c96aa6c3497dde36ba83ec80d5f8f43c7cd809e8a636444e5 | WhatsApp.Zip |
096983764a75f1c0bab73dd2dea8b1e035ec1a03399fab97c71349a26856b759 | Ricoly.bat |
f22683e9d2a6e72b3149ef1f26392a1e080ae5f2f004543f2a45732eb78d1e98 | Ricoly.ps1 |
c6c486800bcc9d935931c2c6fbde031942d288a124a60beb1e5d38949105b2ad | ps.ps1 |
b6ab39b49d7d5752dbdade697a76e96d518b1b2df00c344772782c8f5950361e | sc |
766d25d37210ddc3f1afa84e597b3acdbf6dfb0917451f4a344ca5e570adb063 | pf |
7c3e9b05dcd5588c26e07d149af3c897c8879804eff1c3e2616c3dd1fcad65fe | sc_deobfuscated |
c88c98930181b6038a0565d9bc08ece16995ecbb01821eee6c5dd3772db694f8 | sc_embedded_payload |
32c9ddcc694ee6c5a38456c4c3e1b433840a18e384e59d63a5d825428abf036b | Tozzia.bat |
9e19b108f786bf33b58a9efb823619c2aab23107780ceae0baa2d8da19475eb2 | Tozzia.ps1 |
2cff03f9efdaf52626bd1b451d700605dc1ea000c5da56bd0fc59f8f43071040 | cacert.pem |
f00ac1a50c39a4781f8f614205672bc72d55823b39c20bccffa3ba244fa74693 | DSC_IMG0003.exe (公開) |
5a1ce64e4fa19531a3222554bbe99aa6aeadb639d51b2a308648cb6e0fa55c05 | DSCIM100001.exe (公開) |
89d7c8c7846068c4f618f80d18944f2fcf47cbebe7390d73c1f16ef0ed48d90b | 89d7c8c7846068c4f618f80d18944f2fcf47cbebe7390d73c1f16ef0ed48d90b.sample (公開) |
498b55ff3967cabdd175c5ec11ef39a060ebded0f104575f2ef7ecb88fa9e9f1 | 75aa93e997427c55cc1cbe44d271da1971b7fdafcf85dc6cf69491c2e5931f1d.sample (公開) |
インフラ
- tunneldrive[.]com - 104[.]21.7.130:80
- mydigitalrevival[.]com - 172[.]67.160.80:80
- hollygap[.]com - 172[.]67.134.21:443, 104[.]21.5.250:443
- yogasmob[.]com
- preflightdesign[.]com
- pickconferences[.]com
追加リソース
- Pervasive Brazilian Financial Malware Targets Bank Customers in Latin America and Europe – Cybereason
- Weird Ways to Run Unmanaged Code in .NET - xpnsec
- Emulating Covert Operations - Dynamic Invocation (Avoiding PInvoke & API Hooks) - The Wover
- Migrating from P/Invoke to D/Invoke - klezvirus
- Offensive P/Invoke: Leveraging the Win32 API from Managed Code - SpecterOps
- SysWhispers2 - Github
- Investigating a Monero Coin Miner - Triskele Labs
2023-04-06 14:30 JST 英語版更新日 2023-04-05 05:34 PST の内容を反映