BlackMatterは、2021年7月末に発見された新しいランサムウェアの脅威です。
このマルウェアは、強力な攻撃グループと、GandCrab、LockBit、DarkSideなどの他のマルウェアの一部を利用しているとされる開発者からの宣伝で認知されましたが、新たな開発者グループであるとも言われています。McAfee Enterprise Advanced Threat Research(ATR)で分析したところ、このマルウェアは、米国政府および世界中の法執行機関の注目を集めたコロニアルパイプラインへの攻撃に関連するマルウェアであるDarkSideと多くの共通点があることが判明しました。
BlackMatterの主な目的は、感染したコンピューター内のファイルを暗号化し、それらを復号化するための身代金を要求することです。以前のランサムウェアと同様に、オペレーターは侵害されたサーバーからファイルと個人情報を盗み、インターネット上で公開すると脅し追加の身代金を要求します。
カバレッジと保護のアドバイス
マカフィーのEPPソリューションは、一連の予防および検出技術を備えたBlackMatterランサムウェアをカバーしています。
ENS ATPは、脅威をプロアクティブに検出することに焦点を当てた行動コンテンツを提供すると同時に、オンラインとオフラインの両方の検出に既知のIoCを提供します。DATベースの検出の場合、ファミリはRansom-BlackMatter!<hash>として報告されます。ENS ATPは、一般的なランサムウェアの動作に対する攻撃対象領域の削減と、ランサムウェアの脅威を対象とするMLモデルを使用したRealProtect(静的および動的)を提供するJTIルールのおかげで、2つの保護レイヤーを追加します。
指標の更新はGTIを介してプッシュされ、Insightsの顧客は、このランサムウェアファミリの脅威プロファイルを見つけます。このプロファイルは、新しい関連情報が利用可能になったときに更新されます。
技術的な詳細
BlackMatterは通常、EXEプログラムと見なされ、特別な場合には、Windows用のDLL(ダイナミックライブラリ)と見なされます。Linuxマシンは、その特別なバージョンでも影響を受ける可能性がありますが、このレポートでは、Windowsバージョンのみを取り上げます。
このレポートでは、BlackMatterのバージョン1.2に焦点を当てると同時に、現在のバージョン2.0での重要な変更点にも注目します。
BlackMatterはC ++でプログラムされており、サイズは67Kbです。
このサンプルのコンパイル日は2021年7月23日です。これらの日付は変更できますが、正しいと思います。バージョン1.9のコンパイル時間は2021年8月12日で、最新バージョンの2.0の日付は4日後の2021年8月16日です。マルウェア開発者がコードを積極的に改善し、検出と分析を困難にしていることは明らかです。
BlackMatterによって実行される最初のアクションは、Windowsの必要な機能を取得するために後で必要になるいくつかのモジュールの準備です。
図2.関数を検索するBlackMatter
BlackMatterは、いくつかのトリックを使用して、分析を困難にし、デバッガーを回避しようとします。モジュール名を検索する代わりに、ROT13アルゴリズムで事前に計算されたハッシュをチェックします。必要なモジュールは「kernel32.dll」と「ntdll.dll」です。両方のモジュールは、プロセスヒープ内のメモリを予約する関数を取得しようとします。APIは、モジュールのPEB(プロセス環境ブロック)とEAT(エクスポートテーブルアドレス)の組み合わせを使用して検索され、すべての関数名が列挙されます。これらの名前を使用して、カスタムハッシュを計算し、ターゲットハッシュと照合します。
この時点で、BlackMatterはデバッガーを検出するための特別なコードを作成し、メモリが予約された後の最後の2つの「DWORDS」をチェックして、バイト「0xABABABAB」を検索します。これらのバイトは、プロセスがヒープ内のメモリを予約するときに常に存在し、ヒープに1つの特別なフラグ(プロセスがデバッガー内にあるときにデフォルトで設定される)がある場合、マルウェアは予約されたメモリへのポインターを保存しないようにします。この場合、変数はnullポインターを保持します。
Windowsオペレーティングシステムでは、プログラムが通常モード(通常どおり)で実行されているか、デバッグモード(プログラマーが使用するモードなど)で実行されているかに基づいて、メモリの状態が異なります。この場合、メモリが情報を保持するために予約されているときに、デバッグモードの場合、Windowsはこのメモリの終わりを特別な値「0xABABABAB」でマークします。BlackMatterはこの値をチェックし、見つかった場合はデバッガーを検出します。正常に実行されないようにするには、以前に取得した関数アドレスを破棄します。つまり、クラッシュして実行を回避します。
このチェックの後、予約済みメモリに特別なスタブが作成されます。これは非常に単純ですが、どの関数が呼び出されて実行されるかを確認するためにスタブを実行する必要があるため、分析を困難にするのに効果的です。
この手順は、必要となるすべての機能を使用して実行されます。ハッシュは、データとして小さな構造体の「.text」セクションの中央にハードコードされて保存されます。各構造体の終わりは、「0xCCCCCCCC」値に対するチェックによって認識されます。
この動作は、BlackMatter開発者が分析を困難にするためのいくつかのトリックを知っていることを強調していますが、バイナリにパッチを適用することで両方を無効にするのは簡単です。
この後、ランサムウェアはデバッガーの使用を回避するために別のトリックを使用します。BlackMatterは、クラス引数0x11を使用して関数「ZwSetInformationThread」を呼び出します。これにより、呼び出し元のスレッドがデバッガーから非表示になります。
マルウェアがそれを正しく実行し、デバッガーが接続されている場合、デバッグセッションはすぐに終了します。このコードは、ファイルの暗号化に使用されるスレッドで後で実行されます。
次のアクションは、関数「SHTestTokenMembership」を使用して、プロセスを起動したユーザーがマシンの管理者のローカルグループに属しているかどうかを確認することです。ユーザーが管理者グループに属している場合、コードは通常どおり続行されますが、それ以外の場合は、PEBを使用してオペレーティングシステムのバージョンを取得し(バージョンを変更する可能性のあるAPI関数の使用を回避するため)、利用可能な場合はプロセスを開き、トークンをチェックして、それがAdministratorsグループに属しているかどうかを確認します。
ユーザーが管理者グループに属していない場合、プロセストークンは巧妙なトリックを使用して特権を昇格させます。
最初のアクションは、文字列「dllhost.exe」を準備し、ロードされたすべてのモジュールを列挙することです。モジュールごとに、すべての実行可能ファイルが持つ初期構造の1つのフィールドをチェックし、ロードされるベースメモリアドレス(たとえば、0x7fff0000のkernel32.dll)を保持し、独自のベースアドレスと比較します。等しい場合は、PEBフィールドの名前と、パスと引数のパスを「dllhost.exe」に変更します(正規の「dllhost.exe」が存在するSYSTEM32フォルダーへのパスと引数のパスの場合 )。このトリックは、ユーザーを誤解させるために使用されます。見つかったモジュールごとに、モジュールのベースアドレスを独自のベースアドレスでチェックし、その時点で、ロードされたモジュールの名前、パス、および引数を変更して、ユーザーを誤解させます。
プロセス名は「dllhost.exe」になり、パスは被害者のマシンのシステムディレクトリになります。このトリックは、TaskManagerでプロセスの名前を変更しないことに加えて、デバッガーに別のバイナリがロードされていると「考え」させ、すべてのブレークポイントを削除することができます(使用するデバッガーによって異なります)。
2番目のアクションは、COM(コンポーネントオブジェクトモデル)オブジェクトを使用する1つのエクスプロイトを使用して、「プロセスの終了」機能を使用して独自のインスタンスを終了する前に、特権を昇格させようとすることです。
検出のために、モジュールはNTDLL.DLLの文書化されていない関数「LoadedModulesLdrCallback」を使用します。これにより、プログラマーは関数をコールバックとして設定し、引数を取得してPEBを確認できます。このコールバックでは、マルウェアは「RtlInitUnicodeString」を使用して新しいUnicode文字列を設定します。文字列は、システムフォルダ内の「dllhost.exe」へのパスであり、イメージ名として「dllhost.exe」です。
パブリックであるUAC(ユーザーアクセス制御)をバイパスするために使用されるエクスプロイトは、CMSTPLUAのCOMインターフェイスとCOM ElevationMonikerを使用します。
管理者権限を持っているか、エクスプロイトの使用に成功した場合、暗号化されたファイルで使用される新しい拡張機能を引き続き作成します。このタスクでは、暗号化キー(HKEY LOCAL MACHINE)の「MachineGuid」のレジストリキーを読み取ります。
このエントリと値は、Windowsのすべてのバージョンに存在し、マシンに固有です。この値を使用して、カスタムハッシュを作成し、9文字の最終文字列を取得します。
次に、マルウェアは身代金メモの名前を作成し、その整合性ハッシュを計算します。身代金メモのテキストは、マルウェアデータに暗号化されて保存されます。通常、身代金メモの名前は「%s.README.txt」で、ワイルドカードには以前に生成された新しい拡張子が入力されます。
次のステップは、後で必要になる特権を取得することです。BlackMatterは、多くの特権を取得しようとします。
・ SE_BACKUP_PRIVILEGE
・ SE_DEBUG_PRIVILEGE、SE_IMPERSONATE_PRIVILEGE ・ SE_INC_BASE_PRIORITY_PRIVILEGE ・ IF_INCREASE_QUOTA_PRIVILEGE ・ SE_INC_WORKING_SET_PRIVILEGE ・ SE_MANAGE_VOLUME_PRIVILEGE ・ SE_PROF_SINGLE_PROCESS_PRIVILEGE ・ SE_RESTORE_PRIVILEGE ・ SE_SECURITY_PRIVILEGE ・ SE_SYSTEM_PROFILE_PRIVILEGE ・ SE_TAKE_OWNERSHIP_PRIVILEGE ・ SE_SHUTDOWN_PRIVILEGE |
権限を取得した後、SYSTEM権限があるかどうかを確認し、独自のプロセスのトークンを確認します。SYSTEMの場合、関数「WTSQueryUserToken」を使用してログオンするための適切なユーザーを取得します。この関数は、呼び出し元がデフォルトでSYSTEMのみが持つ「SeTcbPrivilege」を持っている場合にのみ使用できます。
ログオンしたユーザーのトークンを取得した後、マルウェアはWindowsステーションとデスクトップを開きます。
SYSTEM権限がない場合は、システム内のすべてのプロセスを列挙し、「explorer.exe」からトークンを複製しようとします(名前はハードコードされたハッシュを使用してチェックされます)。権限がある場合は、通常どおり続行されます。それ以外の場合は、複製されたトークンに管理者権限があるかどうかを再度確認します。
この場合、通常どおり続行されますが、それ以外の場合は、オペレーティングシステムのバージョンとCPU(中央処理装置)モード(32ビットまたは64ビット)がチェックされます。このチェックは、クラス0x1A(ProcessWow64Information)の関数「ZwQueryInformationProcess」を使用して実行されます。
システムが32ビットの場合、通常の「CreateRemoteThread」関数を使用して列挙する1つのプロセスに挿入される1つの小さなシェルコードを復号化します。このシェルコードは、プロセスのトークンを取得し、特権を昇格させるために使用されます。
システムが64ビットの場合、2つの異なるシェルコードを復号化し、最初のシェルコードを実行して、2番目のシェルコードを引数として取得します。
これらのシェルコードにより、BlackMatterはクリーンな方法で特権を昇格させることができます。
SYSTEMトークンを取得するために、BlackMatterはプロセスを列挙して「svchost.exe」を取得するだけでなく、プロセスの名前をチェックするだけでなく、プロセスが特権「SeTcbPrivilege」を持っていることもチェックすることを理解することが重要です。デフォルトではSYSTEMだけがそれを持っているので(そしてこの「ユーザー」から削除できないのは1つの権限です)、このプロセスはSYSTEMの下で実行されているため、シェルコードで攻撃してトークンを盗むのに最適なターゲットになります。複製され、BlackMatterに設定されます。
この後、1つのセクションに埋め込まれた構成を復号化します。BlackMatterには、base64で暗号化およびエンコードされたこの構成があります。
この構成はDarksideと非常によく似た構造を持っており、反対の主張にもかかわらず、開発者が同一であるという別の明確なヒントを提供します。
復号化後、構成は次の情報を取得できます。
|
構成を取得して解析した後、BlackMatterは、構成内のユーザーでログインする必要があるかどうかのチェックを開始します。この場合、構成に保持されているユーザーの情報とともに関数「LogonUser」を使用します。この情報には、1人のユーザーと1つのパスワードがあります。「test@enterprise.com:12345」。「test」はユーザー、「@ enterprise.com」はドメイン、「12345」はパスワードです。
次のアクションは、フラグをチェックして、複数のインスタンスが発生しないようにミューテックスを作成する必要があるかどうかを確認することです。
このミューテックスはマシンごとに一意であり、キー「Cryptography」のレジストリエントリ「MachineGuid」に基づいています。システムにこのミューテックスがすでにある場合、マルウェアは自動的に終了します。
ミューテックスを使用してワクチンを作成すると便利な場合がありますが、開発者がアルゴリズムを変更し、フラグをfalseに設定するだけで作成を回避できるため、この場合はそうではありません。
その後、C2に情報を送信する必要があるかどうかを確認します。感染した場合(通常、常にではありませんが)、ユーザー名、コンピューター名、ハードディスクのサイズなどの被害者のマシンの情報、およびマルウェア開発者が感染したマシンの数を知るのに役立つその他の情報を取得します。
この情報はbase64でエンコードされ、構成のキーを使用してAESで暗号化されます。
C2アドレスは構成に含まれています(ただし、すべてのサンプルにC2アドレスがあるわけではありません。この場合、送信するフラグはfalseです)。マルウェアは、通常のプロトコルを使用してC2に接続しようとするか、SSLを使用して文字列の最初の「http」をチェックします。
情報はマルウェアから復号化されたいくつかの文字列で準備され、POSTメッセージで送信されます。
このメッセージには、チェックを誤解させ、真の情報をゴミとして隠そうとする値があります。この「偽の」データはランダムに計算されます。
C2はガベージデータを返しますが、マルウェアはそれが文字「{」および「}」で開始および終了するかどうかをチェックします。その場合、マルウェアは別のC2への情報の送信を無視します。
BlackMatterはマルチスレッドアプリケーションであり、C2にデータを送信する手順はセカンダリスレッドによって実行されます。
その後、BlackMatterは、ごみ箱の内容を破棄するために修正および削除可能なすべてのユニットを列挙します。マルウェアは、それを持っていて正しいタイプのユニットごとにそれを作成します。DarkSideとの1つの違いは、BlackMatterにはないのに対し、この動作のフラグがあることです。
次のアクションは、COMを使用してシャドウボリュームを削除し、シャドウボリュームを管理する通常のプログラムを使用した検出を回避することです。これは、この目的のためのフラグを持つDarkSideとは異なります。
BlackMatterは別のフラグをチェックし、構成内の1つのリストに基づいてすべてのサービスを列挙し、ターゲットサービスを停止して削除します。
この動作はDarkSideと同じです。
プロセスは、他の構成フラグに基づいて、DarkSideと同様にチェックされ、終了します。
プロセスを終了した後、BlackMatterは、誰かがコンピューターを使用している場合、スレッドが一時停止または休止状態になるのを防ぎ、ファイルの暗号化中にこれらの結果のいずれかが発生するのを防ぎます。これは、関数「ZwSetThreadExecutionState」を使用して実行されます。
次のアクションは、固定およびネットワーク上のすべてのユニットを列挙し、ファイルを暗号化するためのスレッドを作成することです。BlackMatterは、Salsa20を使用してファイルの一部を暗号化し、ファイルの最後に新しいブロックを保存します。このブロックは、暗号化に使用されるSalsa20キーを使用して構成に埋め込まれたRSAキーで保護されます。これにより、BlackMatterは他の多くのランサムウェアよりも遅くなります。
暗号化後、暗号化プロセス、暗号化されたファイルの数、失敗したファイルの数などに関するすべての情報がC2に送信されます。この情報は前述の方法で送信されますが、構成がtrueに設定されている場合に限ります。
この瞬間に1つのミューテックスが作成された場合、それは解放されます。後で、関数「GetSystemMetrics」を使用してマシンが起動する方法を確認します。セーフモードで起動が行われた場合、BlackMatterは、次回の再起動のためにレジストリに永続性を持たせるためのいくつかのキーを設定し、システムを攻撃して、デスクトップの壁紙を変更します。
そして、マシンのセーフブートオプションを無効にして再起動します(シャットダウンの特権が必要な理由の1つです)。
セーフモードで起動できるようにするために、マルウェアのパスを含む永続キー値は「*」で始まります。
マシンが通常の方法で起動すると、実行時に生成された代替手段でデスクトップの壁紙が変更され、身代金メモに関するテキストが表示されます。
バージョン1.9および2.0
新しいバージョンには、バージョン1.2から1.6と比較していくつかの違いがあります。
- スタブ生成コードの変更。以前は1種類のスタブのみが使用されていましたが、最近のバージョンでは、機能ごとにランダムに1つが選択され、複数の種類のスタブが使用されています。そして、バイナリにパッチを適用することで、問題なくスタブを削除できます。
- システムで使用可能なプリンターを使用して身代金メモを印刷する必要があるかどうかを示す、構成内の新しいバイトフラグ。Ryukと非常に似ていますが、代わりにBlackMatterは「winspool.drv」のAPIを使用します。
- プロバイダーによってシャットダウンされた1つのC2ドメインを削除
バージョン2.0での追加の変更:
- このバージョンでは、暗号化アルゴリズムが変更されて構成が保護され、復号化がより複雑に
- プロバイダーによってシャットダウンされた最後のC2を削除
- 新しいC2ドメインを追加
これらの変更は、開発者がマルウェアやセキュリティ研究者に関心を持ってソーシャルメディアに積極的に取り組んでいることを示唆しています。
ワクチン
GandCrabなど、過去に見た一部のランサムウェアとは異なり、BlackMatterには優れたコードがありますが、マルウェアによるファイルの暗号化を回避するために使用できる設計上の欠陥がいくつかあります。
このワクチンは通常の方法で使用することを意図したものではなく、機能している間は他のプログラムが影響を受ける可能性があるため、特別な場合にのみ使用することを目的としています(明らかにすべてのサードパーティプログラムをテストすることはできませんが、潜在的な問題にはデータの破損や予測できない動作が含まれる可能性があります)、および修正は永続的ではありません。
ワクチンを作る手順(自己責任で進めてください):
- regedit(または別のレジストリエディタ)を開き、HKEY_LOCAL_MACHINE> Cryptographyのキーに移動します。
- このキーには、特別な値を持つ「MachineGuid」という名前の文字列値が表示されます。この値はマシンに固有であり、一部のアプリケーションでマシンを識別するために使用されます。BlackMatterはこれを使用してミューテックスを作成し、非常に重要なことに、暗号化されたファイルの新しい拡張子を作成します。
- ランダムな名前で文字列型の新しい値を作成し、「MachineGuid」に表示されているのと同じ値を入力してバックアップします。
- 「MachineGuid」値を削除してから、もう一度作成しますが、文字列型ではなく、同じ名前の「MachineGuid」のバイナリ型を使用します。
- レジストリエディタを閉じます。
現時点では、BlackMatterは身代金の拡張を行うためにレジストリキーが必要なため、マシンに影響を与えることはできません。最も重要なことは、BlackMatterがそれを作成できない場合、必要な構成を復号化せずに関数を返すことです。この場合、とにかくごみ箱とシャドウボリュームを破棄しますが、実行する動作、ファイルを保護するためのRSAキー、またはフラグがconfigから読み取られなかったためにC2に送信するものがないため、後で終了します。(およびデフォルト値はすべてfalseです)。
他のプログラムの動作は予測できないかもしれませんが、ワクチンは簡単に作成でき、システムが起動します。これは、BlackMatterプログラマーがコードの設計に誤りを犯したことを示しています。
このワクチンは、2.0を含むすべてのバージョンで機能します。
MITER ATT&CK
このサンプルでは、次のMITREATT&CK手法を使用しています。
Technique ID | テクニックの説明 | 概要 |
T1134 | アクセストークンの操作 | BlackMatterは、さまざまなプロセストークンにアクセスして操作します。 |
T1486 | 影響を与えるために暗号化されたデータ | BlackMatterは、カスタムSalsa20アルゴリズムとRSAを使用してファイルを暗号化します。 |
T1083 | ファイルとディレクトリの検出
|
BlackMatterは、ネイティブ関数を使用して、暗号化するターゲットを検索するファイルとディレクトリを列挙します。 |
T122.001 | Windowsのファイルとディレクトリのアクセス許可の変更 | BlackMatterは、コマンドicacls“ <DriveLetter>:\ *” / grant Everyone:F / T / C / Qを実行して、ドライブへのフルアクセスを許可します。 |
T1562.001 | ツールを無効化または変更 | BlackMatterは、エンドポイントセキュリティソフトウェアに関連するサービスを停止します。 |
T1106 | ネイティブAPI | BlackMatterは、すべてのコードでネイティブAPI関数を使用します。 |
T1057 | プロセスディスカバリー | BlackMatterは、すべてのプロセスを列挙して、セキュリティプログラムの検出と終了を試みます。 |
T1489 | サービス停止 | BlackMatterはサービスを停止します。 |
T1497.001 | システムチェック | BlackMatterは、ヒープに予約されているメモリをチェックして、デバッガを検出しようとします。 |
T1135 | ネットワーク共有の発見 | BlackMatterは、AからZまでの各ドライバー文字に対して次の形式でUNCパスを構築することにより、ネットワーク共有の検出を試みます。\\ <IP> \ <ドライブ文字> $ |
T1082 | システム情報の発見 | BlackMatterは、関数を使用してターゲットシステムに関する情報を取得します。 |
T1592 | 被害者のホスト情報を収集 | BlackMatterは、ユーザーとマシンに関する情報を取得します。 |
T1070 | 有効なアカウント | BlackMatterは、有効なアカウントを使用して被害者のネットワークにログオンします。 |
T1547 | ブートまたはログオンの自動開始実行 | BlackMatterは、レジストリに永続性をインストールします。 |
T1102 | クエリレジストリ | BlackMatterは、レジストリに情報を照会します。 |
T1018 | リモートシステム検出 | BlackMatterは、ドメイン内のリモートマシンを列挙します。 |
T1112 | レジストリを変更 | BlackMatterは、レジストリキーと値を変更し、新しいものを設定します。 |
結論
BlackMatterはランサムウェア分野の新しい脅威であり、その開発者はそれを使用してターゲットを攻撃する方法を十分に理解しています。コーディングスタイルはDarkSideと非常に似ており、私たちの意見では、その背後にいる人々は同じであるか、非常に密接な関係にあります。
BlackMatterは、DarkSideと多くのアイデアを共有し、ある程度のコードを共有しています。
- 構成は、特にDarksideの最後のバージョンと非常に似ていますが、それを保護するためのアルゴリズムが変更されており、オプションは少なくなっていますが、同じ構造のままです。BlackMatterの開発者は、DarkSideを逆にすることでこの類似性を達成したとは考えていません。そのレベルのコーディングスキルにより、まったく新しいランサムウェアをゼロから作成できたからです。また、DarkSideの開発者が元のコードを提供または販売したという考えは、古い製品であるため意味がありません。
- 動的関数は、DarkSideと同様の方法で使用されます。
- 構成に同じ圧縮アルゴリズムを使用します。
- 被害者IDはDarkSideと同じ方法で保持されます。
McAfee Enterprise製品を最新の状態に更新し、安全でないリモートデスクトップ接続を回避し、定期的に変更される安全なパスワードを維持し、フィッシングメールに対する予防措置を講じ、不要なデバイスをエンタープライズネットワークに接続しないことが重要です。
いくつかの効果的なコーディングにもかかわらず、開発者によってミスがあり、プログラムを読み取ってワクチンを作成することができましたが、他のプログラムに影響を与える可能性があり、永続的な解決策ではなく、関連するリスクを受け入れられる場合のみ、使用していただくことを改めて強調します。
※本ページの内容は2021年9月22日(US時間)更新の以下のMcAfee Enterprise Blogの内容です。
原文: BlackMatter Ransomware Analysis; The Dark Side Returns
著者: Alexandre Mundo and Marc Elias