ナビゲーションをスキップする
BlackBerry ブログ

二重脅迫の手口で知られるランサムウェアグループREvil の最新の戦術、技法、手順について詳細調査

本ブログ記事は、2021年11月10日に米国で公開されたBlackBerryのブログ記事の抄訳版です。原文はこちらからご覧頂けます。

 

概要

2021年11 月第 2 週、米国および欧州の法執行機関が REvil ランサムウェアグループに関する新たな差し押え逮捕を発表しました。そこでは、このような悪意のあるキャンペーンに対する強い関心と怒りが明確に示されていました。また、こうした動きは、セキュリティの専門家がこのグループとそれに関連するマルウェアファミリーの内情を十分に理解し、組織と利害関係者をより適切に保護する必要性が差し迫っていることを浮き彫りにしています。この記事では BlackBerry のインシデント対応チームによる最近のインシデント対応から得られた洞察を紹介しながら、REvil の最新の戦術、技法、手順(TTP)を詳しく解説します。

 

Gootkit

REvil はネットワークへの初期アクセスを獲得するために「水飲み場攻撃」を行うことで知られています。この攻撃は、標的とするユーザーがアクセスする可能性が高いと考えられるサイトを侵害することによって行われます。今回の事例では、REvil のグループは Gootkit ローダーを含んだ ZIP アーカイブを侵害されたサイトに掲載していました。このサイトは、狙われた被害者がよく検索する用語について説明する情報ページを装っています。ユーザーが侵害されたサイトにアクセスした際には、ページが hxxps://fibarokrakow[.]com/about[.]php にリダイレクトされ、Gootkit ローダーの ZIP ファイルがダウンロードされていました。そして ZIP ファイルが開かれると、wscript.exe 経由で JavaScript のペイロードが実行されていました。

Gootkit ローダーの実行後は、難読化が解除された最終的なコードスニペットが以下の処理を実行します。

  1. 3 つのドメインを格納した配列を繰り返し処理する。
  2. 各ドメインに対し、ダウンロード URL の一部として使用する乱数を生成する。
  3. 各ドメインに対し、エンドポイント「search.php」、ある固定の値(詳細略)、および生成した乱数を含むフォーマット文字列を使用して HTTP GET リクエストを実行する。
  4. GET リクエストに対する応答が値 200(「OK」)かどうかを確認する。
  5. GET リクエストに成功した場合、ダウンロードしたコンテンツを追加のコードとして実行する。

ではここから、Gootkit ローダーの詳細な解析と、その実行後に続けて行われる活動について説明していきます。

初期状態の JavaScript ファイルには、「knew」という変数の中に難読化されたコードが埋め込まれていました。

図 1:Gootkit ローダーの難読化された JavaScript
 
JSTool や js-beautify などの JavaScript 整形ツールを使用すると、以下のようにコードが読みやすくなります。
図 2:Gootkit ローダーの整形済みコード
 
このコードは summer(9754) の呼び出しで始まります。ここで summer() 関数に渡された整数が使われることはなく、この関数は単に round([9102]) を呼び出しています。:
round() 関数は 65 秒弱スリープした後、コード内の他の関数を呼び出すための while ループを実行します。具体的には、最初に変数 race に 5647 が代入され、ループ内にある try/catch ブロックの中でこの変数が使用されています。このループは実行に時間をかけるためだけでなく、配列 electric[] に新たに代入された値を処理して次の関数を実行するためにも使われています。
 
図 4:Gootkit ローダーの round() 関数
 
round() 関数の実行中には配列 electric[] がチェックされ、現在の配列位置(変数 race の値)に格納された値が実行可能な関数であるかどうかが確認されます。そうでない場合は catch 文に処理が移り、配列 electric[] のかなり大きな整数位置に indicate() という別の関数が代入されます。この結果、ループが 2842404 - 5647 = 2,836,757 回実行された後でようやく、以下に示す indicate() 関数が呼び出されます。
 
図 5:Gootkit ローダーの indicate() 関数
 

注目すべきは electric[4438089] = third です。これにより、呼び出し元の while ループに戻ってから次に実行する関数がセットされています。このようにして、複数の関数が配列 electric[] の異なる配列位置に代入される仕組みとなっています。sleep() 関数(上図ではコメントアウト済み)をもう一度実行した後、indicate() 関数は後にデコードされる文字列を変数 knew に代入しています。

while ループの繰り返しを省略して解析を加速するために、関数を直接呼び出すように round() 関数を修正することができます。こうすれば、ループが変数 race の値を 1 ずつ加算し続けるのを待つ必要はありません。

図 6:Gootkit ローダーの round() 関数(修正済み)
 
変数 knew のデコード処理は、上図で 3 番目に呼ばれている million() 関数の中で行われます。
 
図 7:Gootkit ローダーによる変数 knew のデコード
 
ここでは play() 関数が 2 つの引数とともに呼び出されています。図 7 に示したように、1 つは multiply(knew) を呼び出した戻り値で、もう 1 つは変数 above に格納された固定の文字列です。呼び出しから戻った時点で、変数 stead は 0 番目の要素に文字列「constructor」、1 番目の要素に以下のコード(レビュー目的で整形済み)を持つ配列になっています。br>  
図 8:Gootkit ローダーの配列 stead[]
 

上図では、ローダーがホスト上に残す重要な侵入の痕跡(IOC)である以下のレジストリキーが確認できます。

  • HKCU\\Oifmb

また、キーの存在が確認され、なければ新規作成されています。その次にあるのは別の難読化されたコードで、multiply() 関数を呼び出してデコードされています。multiply() 関数が戻る地点にブレークポイントを設定すると、難読化が解除された最終的なコードが確認できます。

図 9:Gootkit ローダーの難読化が解除されたコード
 

ローダーの全体的な構成は解析できたものの、この事例の最終段階でダウンロードされていたと思われる JavaScript の完全なコピーは取得できませんでした。脅威インテリジェンスの活用により類似のコードは見つかっていますが、完全には一致していません。

 

BloodHound と Kerberoasting 攻撃

Gootkit のインストールを終えた REvil は、システムへの永続的アクセスをすぐには利用せず、システムに接続して攻撃経路の列挙を開始するまでに 3 日間待機していました。脅威アクターによる最初の「ハンズオンキーボード」活動の痕跡は、感染したユーザーのプロファイルディレクトリ内に残された _BloodHound[.]zip という BloodHound の出力ファイルでした。なお、 はデータが取得された時刻です。

BlackBerry がこの BloodHound 出力ファイルのコピーを取得し、脅威アクターが悪用していた可能性のある攻撃経路を列挙したところ、「Kerberoastable」が可能な 3 つのアカウント経由でドメイン管理者(Domain Admins)に至る経路が見つかりました。この攻撃経路は以下のようなものでした。

図 10:BloodHound から得られた Kerberoasting 攻撃の経路
 
REvil のグループがこの攻撃経路を認識していたことは明らかで、Kerberoasting 攻撃によって 3 つのアカウントから平文の認証情報が取得されていました。Windows イベントログからは、今回のインシデント期間中にこの攻撃活動があったことを特定できるようなログは取得できませんでした。しかし、REvil のグループは 1 つのテキストファイルをディスク上に残しており、この中にサービスプリンシパル名(SPN:Service Principal Name)が割り当てられた 3 つのアカウントに対する Kerberos チケット付与サービス(TGS:Ticket Granting Service)のチケットが含まれていました。このファイルの内容は以下のようなものでした。
 
図 11:Kerberos の TGS チケット
 
BlackBerry では、この TGS チケットはパスワードクラッキングツール John the Ripper で容易にクラッキングされ、平文のパスワードが取得される可能性があると判断しています。これらのアカウントは後に、脅威アクターが横展開してさらなる永続化メカニズムをインストールするために利用されていました。
 
図 12:TGS チケットのクラッキング
 

横展開と列挙

複数の高特権アカウントへのアクセスを獲得した後、脅威アクターはリモートデスクトッププロトコル(RDP)経由でネットワーク内の他のホストへのピボットを開始していました。さらにそこから、他のホストで動作する Windows Defender のサービスを停止するために PsExec ツールも使用していました。

また、より多くのアカウントを侵害する目的で、Mimikatz ユーティリティを使用した「Pass-the-Hash 攻撃」も行われていました。この手法はリモートホストへの RDP セッションを獲得するために行われており、侵害されたユーザーアカウントの NTLM ハッシュを悪用していました。従来、Windows の RDP 認証では NTLM ハッシュは使用されませんが、引数に「restrictedadmin」がある場合は NTLM ハッシュによる事前認証が RDP に強制され、これにより Pass-the-Hash 攻撃に対する脆弱性が顕在化します。
RDP に対する Pass-the-Hash 攻撃を行うにあたり、脅威アクターは PsExec でレジストリを編集して「restrictedadmin」機能を有効化し、リモートシステムを細工していました。
最後には Advanced IP Scanner ユーティリティが複数のシステム上で実行され、脅威アクターがアクセス可能なネットワークシステムがマッピングされていました。このユーティリティはランサムウェアグループにしばしば悪用されていますが、ツールが環境内で不正に利用された場合は有効な侵入の痕跡を残す可能性があります。

 

コマンドアンドコントロール

脅威アクターは、Cobalt Strike のコマンドアンドコントロール(C2)機能をメモリ上にインストールする手法を 2 種類用いていました。1 つ目の単純な手法では、簡易にエンコードされた PowerShell コマンドによって Cobalt Strike ステージャが実行されていました。確認された Cobalt Strike ステージャの抜粋を以下に示します。

図 13:エンコードされた Cobalt Strike ステージャ
 
ここで、メモリイメージを取得してプロセスインジェクションの対象を特定すべくVolatility Framework の「malfind」機能を使用したところ、以下の図に示すように、2 つの「rundll32.exe」プロセスに Windows PE ファイルが注入されていることがわかりました。
図 14:Rundll32 へのプロセスインジェクション - PID 2884
 

この 2 つの実行可能ファイルを抽出すると、これらは Cobalt Strike Beacon であり、以下の 2 つの IP アドレスに到達するように構成されていることが判明しました。

  • 139.180.172[.]42
  • 155.138.216[.]60

 

コマンドアンドコントロール – レジストリへの PowerShell 格納

BlackBerry のインシデント対応チームは、Cobalt Strike をステージングするための PowerShell コマンドがレジストリキー「HKLM:\SOFTWARE\Microsoft\PowerShell\info」に格納されていることも発見しました。これが C2 機能をインストールする 2 つ目の手法です。脅威アクターは、以下の処理を実行するリモートサービス経由でこの PowerShell を実行していました。

PowerShell スクリプトブロックのログ記録(イベント ID 4104)を有効化することで、上記の WMI 経由で実行される PS1 スクリプトの一部を取得することができました。その内容を以下の図に示します。
図 16:エンコードされた PowerShell スクリプト
 

さらなる解析のためにレジストリキーの内容を抽出しましたが、残念ながらシステム上で実行した PowerShell コードでは変数 pdqnas などが未定義となっており、そのままではデコードできないようでした。

しかし、REvil のグループによる別の VBScript や JavaScript の実装で、同様の手法と実行手段を用いているものが入手可能でした。同等の機能を持つ以下の JavaScript ローダーを用いたところ、このレジストリキーをデコードすることができました。

上記の JavaScript ローダーでレジストリキーをデコードすると、Cobalt Strike Beacon の詳細がわかりました。この Beacon はコードインジェクション済みの正規 Windows コマンド gpupdate.exe のバイナリを実行時に生成するように構成されており、またその注入コードはポート 443 を介して以下の IP アドレスに到達するように構成されていました。

  • 216.128.128[.]98

 

データの持ち出し

REvil のグループはランサムウェアの展開前にデータを持ち出すことで知られています。潜在的な持ち出し活動を特定するため、BlackBerry のインシデント対応チームは複数のフォレンジックアーティファクトを調査し、よく使われる持ち出しツールの使用や、機密性の高いフォルダーまたはファイル共有の列挙を特定しようと試みました。脅威アクターは PowerSploit の PowerShell モジュールを使用してネットワークを探索し、持ち出し対象となる機密データを含んでいる可能性のあるファイルサーバーを探していました。

そのようなファイルサーバーが見つかると、脅威アクターは通常、利用可能な共有リソースを列挙し始めます。機密性の高いファイル共有またはフォルダーの列挙を特定するためには、UsrClass.dat のレジストリハイブ内にある Windows ShellBag のアーティファクトが最も役に立ちます。今回の事例では、脅威アクターはプライマリファイルサーバー上で多くのフォルダーにアクセスしており、組織の最重要資産(いわゆる「Crown Jewel」)を特定しようとしていたものと思われます。

こうした列挙活動に加えて、ShellBag に対する列挙が行われた直後に同じシステムから FreeFileSync ユーティリティが実行されていました。残念ながら、脅威アクターが FreeFileSync に関連するログを含むフォルダーを削除していたため、システム上でこのユーティリティが実行された時点からの Windows イベントログは取得できませんでした。しかし、ファイルカービングとメモリ解析を行うことで、インシデント期間中の Windows イベントログを(すべてではないにせよ)数多く抽出することができました。そして、Windows フィルタリングプラットフォームによって許可された接続を追跡するための Windows イベント ID 5156 から、FreeFileSync が Google 社所有の IP アドレスに接続していたことがわかりました。この様子を以下の図に示します。

図 17:FreeFileSync によるリモート接続
 

また、システムから Google 社所有の IP アドレスに向かう方向のファイアウォールアクティビティを解析したところ、数ギガバイト相当のネットワークトラフィックが FreeFileSync から送信されていたことが判明しました。BlackBerry では、REvil のグループが FreeFileSync を用いて Google Drive™ にデータを持ち出していた可能性が高いと判断しています。

 

ランサムウェアのインストール

環境にランサムウェアを展開する前に、脅威アクターは PowerShell とスケジュールタスク経由で再び Windows Defender の機能を無効化しようとしていました。グループはランサムウェアを環境全体に展開するのではなく的を絞っており、Hyper-V のホスト、より具体的には仮想マシン(VM)を含んだクラスタ共有ボリューム(CSV:Cluster Shared Volume)を標的としていました。CSV にランサムウェアが展開される直前には、PowerShell 経由で VM と Hyper-V のサービスが停止されていました。

そして、被害を受けたシステムに xyz[.]dll というファイルがダウンロードされ、CSV に展開されていました。

REvil/Sodinokibi ランサムウェアには各種パラメータを決める構成が含まれており、暗号化の対象とするファイル拡張子や、暗号化ルーチンの開始前に強制終了するプロセス、標的となる OS へのダメージを避けるために除外するディレクトリや拡張子などが決定されます。Sodinokibi ランサムウェアについては、BlackBerry の脅威リサーチチームによる以下の記事で詳しく解説しています。

 

ハンティング

今回のような侵入を検知して未然に防御するためには、徹底した防御策を適用することが重要です。BlackBerry では、攻撃チェーンの初期段階で脅威グループを検知して根絶できていたであろうタイミングをいくつか特定しています。侵入防止は重要な防御策ですが、この種のランサムウェアイベントの蔓延を未然に防ぐためには、堅牢な侵入検知体制も同様に、あるいはそれ以上に欠かせないものです。アンチウイルス/EDR ツール、エンドポイントのイベントログ、ネットワークアプライアンスを 24 時間 365 日体制で監視していれば、大規模侵害に至る前にこのイベントを検知し、未然に防ぐことができたはずです。

BlackBerry は今回のインシデントで複数の TTP を特定しました。これらを以下のように監視することで、脅威検知に役立てることが可能です。

  • エンコードされた PowerShell コマンドや潜在的な Web リクエストの監視
  • BloodHound が生成する出力ファイルの監視
  • FreeFileSync や PsExec といったデータ転送ツールとリモート管理ツールのベースライン策定、および基準外ソフトウェアの監視
  • Mimikatz、ProcDump、comsvcs.dll といった一般的なパスワードダンプ手法の使用状況の監視
  • Advanced IP Scanner や PowerSploit コマンドといった列挙ツールの使用状況の監視

 

・お問い合わせ:https://www.blackberry.com/ja/jp/forms/enterprise/contact-us

・イベント/セミナー情報:https://www.blackberry.com/ja/jp/events/jp-events-tradeshows

・BlackBerry Japan:https://www.blackberry.com/ja/jp

Codi Starks

About Codi Starks

Codi Starks は BlackBerry の Senior Professional Services Incident Response Consultant です。