Kazuar (ヒクイドリ) の巣の上で: 孵ったばかりの Pensive Ursa (Turla) のバックドアを取り締まる

A purple illustrated bear against a night sky with stars. Its head is inset in a red circle. The constellation ursa.

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

概要

Pensive Ursa (別名 Turla、Uroburos) の進化を追跡するなかで、Unit 42 のリサーチャーは Kazuar の新しくアップグレードされた亜種を発見しました。Kazuar は大きくて危険なヒクイドリという鳥の別名でもありますが、これはまた、Pensive Ursa が通常第 2 段階のペイロードとして使う高度でステルス性の高い .NET バックドアでもあります。

Pensive Ursa は、少なくとも 2004 年から活動しているロシアを拠点とする脅威グループで、ロシア連邦保安庁 (FSB) と関係があります。

ウクライナ CERT は 2023 年 7 月にこのバージョンの Kazuar がウクライナの防衛セクターを標的にしていることを報告しています。この亜種の背後にいる脅威グループは、Signal のメッセージ、ソース管理、クラウド プラットフォーム データに含まれる機微な資産を狙っていました。

Unit 42 が 2017 年に Kazuar を発見して以来、私たちが実際に Kazuar を目撃したのは数回だけで、その標的は主にヨーロッパの政府や軍事のセクターの組織でした。Sunburst バックドアはそのコードの類似性により Kazuar とリンクされましたが、このバックドアは非常に手の込んだものであることがわかっています。2020 年後半以来、私たちは新たな Kazuar のサンプルを野生では確認していませんでしたが、数々の報告から、Kazuar は継続的に開発中であることが示唆されていました。

Kazuar のアップグレード版のコードからは、この作者らが、Kazuar の動作に高いステルス性、検出回避性、解析耐性をもたせることに、とくに注力していたことがうかがい知れます。この作者らは、高度な分析防止技術の数々と、効果の高い暗号化・難読化手法によるマルウェア コードの保護により、これらの性能を実現していました。

本稿では、Kazuar の機能について詳細な技術分析を提供します。私たちは、この調査を共有し、検出・防止・ハントに関する推奨事項を提供することで、組織の全般的なセキュリティ態勢の強化に貢献できればと考えています。追加のアーティファクト リストは、GitHub ページにリンクされた付録セクションで提供しています。

パロアルトネットワークスのお客様は、次の方法で本稿で解説した脅威からの保護と緩和を受けています。

  • Advanced Threat Prevention セキュリティ サブスクリプションを有効にした次世代ファイアウォールは、マルウェアの C2 トラフィック防止に役立ちます。
  • Unit 42 インシデント レスポンス チームは、本稿で取り上げた脅威をはじめ、さまざまな脅威への個別対応を提供しています。
  • Cortex XDR および XSIAM プラットフォームは、本稿で解説した脅威を検出・防止します。
  • Advanced WildFire はこの新たな Kazuar の亜種の発見を受けて機械学習モデルと分析手法の見直しと更新を行いました。
関連する Unit 42 のトピック Backdoors, Pensive Ursa

目次

Kazuar の概要
最新の Kazuar 亜種の詳細な技術分析
メタデータ
初期化
アーキテクチャ
コアとなる機能
コマンド & コントロールとの通信
解析対策のチェック
ダンプ対策
ハニーポットのチェック
Kazuar と Pensive Ursa とのつながりの強化
結論
Cortex XDR の検出と防止
保護と緩和
IoC (侵害指標)
追加リソース

Kazuar の概要

Kazuar は高度でステルス性の高い既知の .NET バックドアです。Pensive Ursa は通常、このバックドアを第 2 段階のペイロードとして使い、ほかに同グループがよく使っているツールとともに配信します。

ウクライナ CERT が報告した最近の攻撃キャンペーンでは、ほかの新たなツール (Capibar という第 1 段階用のバックドアなど) にくわえ、Kazuar の多段階配信メカニズムが明らかになりました。この最近の亜種(数年間の休止期間を経て野生で出現)を技術分析したところ、コードの構造や機能が大幅に改善されていることがわかりました。

本稿では、これまで文書化されていなかった以下の機能について詳しく説明します。

少なくとも 2018 年以降、Kazuar の亜種は難読化手法を変更し、コンパイルのタイムスタンプを系統的に変更していました。一部の亜種は ConfuserEx 難読化ツールを使って文字列を暗号化し、そのほかの亜種はカスタム メソッドを使っていました。本稿で分析した Kazuar の亜種では、作成者はさらに一歩進んで、文字列暗号化のための複数のカスタム メソッドを実装していました。

以前の亜種とは異なり、作成者は Windows オペレーティング システムをターゲットにすることだけに重点を置いていました。

注: 私たちの Kazuar のコード分析では dnSpy を使ってコードを統合開発環境 (IDE) にエクスポートし、カスタム スクリプトで文字列を復号しました。このツールで個別の .cs ファイルを編集し、一部のメソッド名を意味のある名前に編集してあります。スクリーンショットに登場するメソッド名はその編集後のものです。

最新の Kazuar 亜種の詳細な技術分析

メタデータ

ほかの研究機関からの報告によると、Kazuar の作者は少なくとも 2018 年以降、サンプルのタイムスタンプを操作していることがわかりました。この新たな亜種のコンパイルのタイムスタンプは Thursday, November 20, 2008 10:11:18 AM GMT (2008 年 11 月 20 日木曜日 午前 10 時 11 分 18 秒 (グリニッジ標準時)) です。ほかの公開されている亜種と異なり、この作者がタイムスタンプ偽造のさい 2008 年まで遡ったのはこれが初めてです。

Kazuar はまた、Agent versionBuildIDAgent label 用に、ハードコードされてハッシュ化された識別子を含んでいます。図 1 に示すように、これらは亜種の識別子として使えます。

画像 1 は、Kazuar サンプルの構成情報です。Agent の構成情報が 2 つの異なる列に含まれています。Configuration という列と Value という列があります。情報の一部は割愛してあります。
図 1. Kazuar のサンプルの基本構成情報

初期化

アセンブリー チェックの実行

Kazuar は実行のさい、Assembly.Location プロパティを使って、自身のファイル パスを受け取り、その名前を確認します。図 2 に示すように、Kazuar はこの戻り値が空文字列の場合にのみ、実行を継続します。Assembly.Location プロパティは、バイト配列からファイルをロードする場合は空文字列を返します。

このチェックは、マルウェアの実行がほかの手段やソフトウェアではなく、意図されたローダーによって実行されたことを確認するための、単純な形式の解析防止メカニズムであると思われます。

ファイル名が特定のハードコードされたハッシュ名と一致すれば Kazuar は実行されます (これには FNV アルゴリズムが使われます) 。この動作はおそらくデバッグが目的で、作成者がマルウェアのデバッグのたびにローダーを使わずにすむようにしていると思われます。

画像 2 は、Kazuar 亜種のアセンブリー名がチェックされるコードの数行のスクリーンショットです。
図 2. Kazuar 亜種がアセンブリー名を確認しているところ

オペレーション ルート ディレクトリーの作成

Kazuar は、自身の構成とログ データを保存するディレクトリーを新規作成します。Kazuar は %localappdata% をメイン ストレージ パスとして使い、ハードコードされたパスのリストからルート ディレクトリーを決定します (付録参照)。

Kazuar は、マシンの GUID (Globally Unique Identifier: グローバルに一意な識別子) を使って、使うルート ディレクトリー、フォルダー名、ファイル名、ファイル拡張子を決定します (図 3)。これらの名前は一見するとランダムに生成されているように見えますが、GUID を使うと、同一感染マシン上でマルウェアが実行されるつど、同一の名前が維持されることになります。

画像 3 は、数行のコードのスクリーンショットです。GUID を使うと、Kazuar は使うルート ディレクトリーなどを選択できます。
図 3. パス配列のインデックスを返す役割を担うメソッド

以前の亜種と同様に、Kazuar は構造化されたディレクトリー スキームを使って、ログ ファイルや個々の構成ファイル、キーロガー データなどのデータを保存しています。ディレクトリーの命名は擬似乱数で、ハッシュに基づいて選択されます。たとえば、以前の亜種で見られた FNV ハッシュ アルゴリズムのカスタム実装や、GUID 値に対するそのほかの操作などです。これらの平文でのディレクトリー名リストは、付録から確認してください。

また、このコード内には wordlist というファイル作成オプション (現時点では参照されていない) があることも特筆に値するでしょう。このファイルは、(おそらくディレクトリーやファイル名、パスワードのブルート フォース用に wordlist を使って) 今後実装されることになる機能に関する手がかりを提供してくれる可能性があります。

構成ファイル

このマルウェアは、以下のようなデータを含む別のメイン構成ファイルを作成します。

  • C2 サーバー
  • インジェクション モード
  • そのほかのオペレーション用の構成データ

下の図 4 はこのファイルからの一部抜粋です。Kazuar の設定ファイルの暗号化手法は付録から確認できます。

画像 4 は、Kazuar サンプルの構成ファイルです。情報の一部は割愛してあります。この情報には、エージェント情報、最後のコンタクト、トランスポート情報、ログ情報などが含まれています。
図 4. 構成ファイルのスニペット

ミューテックス名の生成

Kazuar は、別プロセスへのインジェクションのチェックにミューテックスを使っています。Kazuar は、現在のプロセス ID とハードコードされた値 0x4ac882d887106b7d とを XOR 演算してミューテックス名を生成します。次に、それをマシンの GUID と XOR 演算します (図 5)。このことは、同一プロセスにはインジェクトされないものの、複数の Kazuar が同一デバイス上で並行して動作できることを意味します。

画像 5 は、ミューテックス名ジェネレーターのスクリーンショットです。
図 5. ミューテックス名の生成

アーキテクチャ

Kazuar のインジェクション モードの設定

新バージョンの Kazuar は、構成で「インジェクション モード」と記述されている内容を使います (表 1)。デフォルト モードは inject です。

構成ファイルのモード名 説明 インバウンド トラフィック アウトバウンド トラフィック 追加の機能スレッド
inject
  • デフォルトモード。explorer.exe にインジェクトする
  • パイプ通信チャネルを作成し、ほかの Kazuar インスタンスのプロキシーとして機能する
名前付きパイプ 名前付きパイプ
  • イベント ログ モニター
  • キーロギング
  • 窃視
  • 自動化されたタスク
  • ダンプ対策
zombify
  • ユーザーのデフォルト ブラウザーないし svchost.exe へインジェクトする
  • 名前付きパイプ通信チャネルを作成し、ほかの Kazuar インスタンスのプロキシーとして機能する
名前付きパイプ HTTP
  • ダンプ対策
combined デフォルトの inject メソッドが失敗した場合、zombify と同じメソッド経由で実行する (該当なし) (該当なし) (該当なし)
remote 名前付きパイプ通信チャネルを作成し、ほかの Kazuar インスタンスのプロキシーとして機能する。C2 通信なし 名前付きパイプ 名前付きパイプ
  • イベント ログ モニター
  • 自動化されたタスク
single
  • 名前付きパイプ通信チャネルを作成し、ほかの Kazuar インスタンスのプロキシーとして機能する
  • このモードでは C2 通信を有効化して HTTP 経由でコマンドを受信できる
名前付きパイプまたは HTTP 名前付きパイプまたは HTTP
  • イベント ログ モニター
  • キーロギング
  • 窃視
  • 自動化されたタスク
Not in User Interactive Mode Kazuar の実行がユーザー対話モードの場合。Kazuar をサービスとして実行している場合やサーバーなどの GUI を持たないマシン上で実行する場合にこのモードになりうる 名前付きパイプ 名前付きパイプ
  • 自動化されたタスク
  • WMI コンシューマー
  • ダンプ対策

表 1. Kazuar のインジェクション モードとその説明

zombify モードでは、Kazuar はユーザーのデフォルト ブラウザーにインジェクトされます。このモードには、デフォルトのブラウザーのクエリーが失敗した場合に備え、自分自身を svchost.exe にインジェクトするフォールバック機構があります。図 6 は、 zombify (ゾンビ化する) が、Kazuar の作者によるプロセス インジェクション全般を指す用語であることを示しています。

画像 6 は多数のコード行からなるスクリーンショットです。zombify モードを使って、Kazuar はコード インジェクションを実行します。
図 6. zombify (ゾンビ化) モードの Kazuar のコード インジェクション スニペット

マルチスレッド モデル

Kazuar はマルチスレッド モデルで動作しますが、Kazuar の主要機能はそれぞれ独自スレッドで動作します。つまり、1 本のスレッドが C2 からのコマンドや tasks の受信を処理し、solver スレッドがこれらのコマンドの実行を処理します。このマルチスレッド モデルにより、Kazuar の作者は非同期のモジュール式フロー制御を確立できます。図 7 は、task solver のフローを示す図です。

画像 7 は、Kazuar のタスク解決メカニズムの図です。暗号化された結果ファイルには、区切り文字、結果識別子、暗号化された GUID 長さ、RSA 暗号化された HMACMD5 ハッシュ、IV、AES キー、および AES 暗号化されたタスク BLOB が含まれます。結果ファイルが読み取られて C2 に送信されます。送信スレッドはタスク ファイルにタスクを書き込み、タスク ファイルはタスク ソルバー スレッドによって読み取られます。
図 7. Kazuar の task solver のメカニズム

タスク ソルバー コンポーネント - Kazuar の黒幕

Kazuar は新しい tasks を受け取ると、それを解決して、結果を result ファイルに書き出します。solver スレッドは、C2サーバーまたはべつの Kazuar ノードから受信した新しい tasks を処理します。task の内容はその後暗号化されて task ファイルとしてディスクに書き込まれます。

それぞれの task ファイルはハイブリッドな暗号化スキームを実装しています。

  1. RNGCryptoServiceProvider を使って 2 つのバイト配列を生成します。これらのバイト配列にはそれぞれ 16 バイトと 32 バイトの長さの乱数が含まれます。
    • 最初のバイト配列は、AES (Rijndael) の初期化ベクトル (IV) として使います。
    • 2 つめのバイト配列は AES キーとして使います。
  2. メモリーからの result の内容に基づいて、HMACMD5 ハッシュを生成した後、それを暗号化してディスクに書き込みます。このさいは上記の最初の箇条書きで説明したバイト配列をキーとして使います。
  3. HMACMD5 ハッシュ、AES キー、IV をハードコードされた RSA キーで暗号化し、暗号化した BLOB をファイル先頭に書き込みます。高速な AES アルゴリズムを使って resultの内容のような大きなオブジェクトを暗号化し、低速の RSA 暗号化を使って AES キーと IV を隠すことにより、Kazuar のパフォーマンスをあげています。また、対称キーが非対称キーで暗号化されてしまうので、感染ファイルをディスクだけを元に復旧するという選択肢は封じられます。
  4. AES 暗号を使って result ファイルの内容を暗号化します。

図 8 に示すように、タスクが完了すると、生成された result ファイルはディスクに保存されます。

画像 8 は、多くの行からなるコードのスクリーンショットです。Kazuar はこのコードを使って暗号化を行い、result ファイルに書き込みます。
図 8. 暗号化して result ファイルを書き込む Kazuar のメソッドのスニペット

Kazuar は前述の暗号化したデータに加え、以下のフィールドを result ファイルの先頭に書き込みます。

  1. 4 つのゼロバイト (これは一種の区切り文字として機能すると考えられます)
  2. 生成された結果の識別子
  3. 暗号化された GUID の長さ。これには初期化のときと同じ XOR アルゴリズムを使用する (ここでの暗号化されたメッセージは「System info at [datetime] (-07)」)
  4. 暗号化された GUID そのもの
  5. RSA で暗号化した HMACMD5 ハッシュ + IV + AES キー
  6. AES で暗号化したタスクの内容

図 9 はディスクからの暗号化された result ファイルの内容を示しています。

画像 9 は、暗号化された result ファイルのスクリーンショットです。赤で強調表示されているのは、区切り文字、生成された結果の識別子、暗号化された UUID の長さ、暗号化された GUID の内容、RSA で暗号化された HMACDM5 ハッシュ + IV _ AES キー、AES で暗号化されたタスクの内容です。
図 9. ディスクからの暗号化された result ファイルの内容

文字列の暗号化

Kazuar のコードには、その機能とデバッグに関連する大量の文字列が含まれています。平文で表示すれば Kazuar の内部機構や機能が明らかになります。リサーチャーが文字列ベースの指標となる YARA やハンティング ルールを作成するというシナリオを回避するために、Kazuar の文字列は暗号化されています。Kazuar は実行時に各文字列を復号します。

Kazuar は文字列の暗号化/復号アルゴリズムにシーザー暗号の一種を使います。このアルゴリズムでは、Kazuar は各メンバーのキーと値を単純に交換する辞書を実装しています。最近の Kazuar の亜種は、辞書を 1 つだけ実装していましたが、この新しい亜種は複数の辞書を実装しており、それぞれに 80 組の文字が含まれています(図10)。

画像 10 は、多数のコード行からなるスクリーンショットです。文字列の復号に使用される辞書情報が含まれています。
図 10. 文字列の復号に使用される辞書を含むクラスの 1 つ

図 11 は、指定された文字列を反復処理し、指定された文字の序数値が関連クラスの辞書キーにあるかどうかをチェックするループを示しています。あれば Kazuar はキーと値を交換し、それを作成された文字列に追加します。なければ、元の文字が維持されます。

こうした文字列の難読化に加えて、コード内のクラスやメソッドに意味のない名前を付けることで、作者は分析をより困難にしています。

画像 11 は多数のコード行からなるスクリーンショットです。このループにより、難読化を解除した文字列が作成されます。
図 11. 難読化を解除した文字列を作成するループ

Kazuar が復号した文字列のひとつは、「Invalid pong responce」という値を返します (図 12)。マルウェア開発者の 1 人が、ロシア語の C を英語の S に切り替えるのを忘れたようです。

画像 12 はある表のスクリーンショットです。Name と Value という 2 つの列があります。Name の列には、JJ、stringBuilder、i があります。対応する値がその横にリストされています。
図 12. 「response」の文字列にタイプ ミス (responce)

コアとなる機能

テイクダウンを避けるため、Kazuar はハイジャックした正規 Web サイトを C2 インフラに使っています。これは Pensive Ursa にはよく見られる手口です。さらに、インジェクション モードのセクションでも述べたように、Kazuar は名前付きパイプを使った通信もサポートしています。Kazuar は (コードが説明しているように) これら両方のメカニズムでリモート コマンドやタスクを受信します。

サポートされている C2 コマンド

表 2 に示すように、Kazuar は C2 から受信可能な 45 種類の異なるタスクをサポートしています。以前のリサーチではこれらのタスクの一部は文書化されていないので、これは Kazuar のコードの開発がさらに進んだということを意味します。比べてみると、2017 年に分析された Kazuar の最初の亜種は、26 個の C2 コマンドだけをサポートしていました。

私たちは、Kazuar のコマンドを次のカテゴリーにグループ化しました。

  • ホスト データの収集
  • 拡張されたフォレンジック データの収集
  • ファイルの操作
  • 任意のコマンドの実行
  • Kazuar の構成とのやりとり
  • レジストリーのクエリーと操作
  • スクリプトの実行 (VBS、PowerShell、JavaScript)
  • カスタム ネットワーク リクエスト
  • クレデンシャルと機微情報の窃取
コマンド 説明
sindex C:\Users\ のパス以下で、.txt, .ini, .config, .vbs, .js, .ps1, .doc, .docx, .xls, .xlsx, .ppt, .pptx の拡張子を持つファイルのプロパティを検索します。
scrshot 指定プロセスのウィンドウのスクリーンショットを撮ります。
move ファイルをソース パスから宛先パスに移動します。
info 1 つまたは複数のフィールドに関するシステム情報を取得します (付録参照)。
steal さまざまなブラウザーやアプリケーションからデータを盗みます (完全な ID 一覧は 付録 を参照)。
run 指定された引数を使って指定された実行可能ファイルを実行し、結果を一時ファイルに保存してからこのファイルを C2 サーバーにアップロードします。
schlist Schedule.Service COM オブジェクトを使ってスケジュールされたタスクに関するデータを取得します。
config Kazuar の構成ファイルを更新します
netuse WNetAddConnection2 WinAPI、WNetCancelConnection2 WinAPI を使って、マシンのネットワーク リソースの接続または削除を行います。
log カスタム ログをログ ファイルに追加します。
delegate PIPE を使ってリモート システム上の別の Kazuar インプラントにコマンドを送信します。
eventlog Windows のイベント ログ エントリーを取得します。
get 指定されたディレクトリーからファイルを Kazuar の C2 サーバーにアップロードします。対象ファイルは、変更、最終アクセス、作成のタイムスタンプに基づいて選びます。
autoruns 感染マシン内でソフトウェアを永続化させられるかどうか、さまざまな可能性をチェックします (チェックについては付録で説明)。
put 受信したデータをシステム上の指定されたファイルに書き込みます。
regwrite レジストリー キー/値を設定します。
autoslist Autos機能の下に作成されたファイル数をリストします。
vbs VBScript を実行します。
psh PowerShell スクリプトを実行します。
sleep Kazuar を指定した時間スリープするように設定します。
regdelete レジストリー キー/値を削除します。
timelimit サーバーからのタスクの時間制限を設定します。
dlllist 指定されたプロセスのロードされたすべてのモジュールを取得します。
autosget Autos の機能で生成されたファイルを C2 に送信します。
wmiquery WMI クエリーを実行します。
dotnet C2 から受信した .NET メソッドを実行します。
tasklist 実行中のプロセス リストを取得します。 
find 指定されたディレクトリーを検索し、中のファイルを一覧表示します。攻撃者は、変更、アクセス、作成されたタイムスタンプに基づいてリストするファイルを指定できるようです。
peep 窃視 (Peep) のセクションで解説した窃視機能に関連するコマンドを実行します。
forensic システムに複数のフォレンジック アーティファクトがないかチェックします (付録参照)。
kill 名前またはプロセス識別子 (PID) でプロセスを強制終了します。
regquery レジストリー キーについてのクエリーを実行します。
chakra ChakraCore を使って JavaScript を実行します。
http 細工した HTTP リクエストを作成します。
pipelist 特定マシンのオープン パイプ リストを取得します。
jsc JavaScript を実行します。
wmicall WMI メソッドを呼び出します。
autosdel Autos機能で作成したファイルを削除します。
del 指定したファイルまたはフォルダーを削除します。この削除ではフラグを 1 つ指定できるようになっています。このフラグにより、ランダム データでファイルを上書きしてからファイルを削除し、攻撃者がファイルを安全に削除できるようにしています。
nbts NetBIOS リクエストを作成します。
copy 指定されたファイルを指定された場所にコピーします。攻撃者は、宛先ファイルが既に存在する場合、それを上書きできます。
upgrade マルウェアのアップグレードをダウンロードします。
cmd cmd.exe 経由でコマンドを実行します。
unattend さまざまな Windows 構成またはクラウド アプリケーションのクレデンシャルに関連するファイルを盗みます (ファイルの全リストは付録を参照)。
autosclear Autos のファイルのログリストをクリアします

表 2. Kazuar がサポートする C2 コマンド

クラウド、ソース管理、メッセージング アプリのクレデンシャル窃取

Kazuarは、C2 から stealunattend といったコマンドを受け取ることにより、感染コンピュータ内のさまざまなアーティファクトからのクレデンシャル窃取試行機能を持っています。

これらのアーティファクトには、よく知られたクラウド アプリケーションが複数含まれています。

Kazuar は、これらのアプリケーションのクレデンシャルを含む機微ファイルの窃取を試みる可能性があります。Kazuar が狙うアーティファクトには、図 13 に示す Git SCM (開発者の間で人気のあるソース管理システム) や Signal (プライベート インスタント メッセージング用の暗号化メッセージング サービス) などが含まれます。アーティファクトの完全な説明は付録を参照してください。

画像 13 は、多数のコード行からなるスクリーンショットです。これは、Kazuar が盗む可能性のある Git SCM クレデンシャルの例です。
図 13. Kazuar が窃取を試みる可能性のある Git SCM クレデンシャルのコード スニペット

包括的なシステム プロファイリング

Kazuar が最初に一意な solver スレッドを生成するさい、これが最初に自動実行するタスクは、対象システムの広範な情報収集とプロファイリングです。Kazuar の作者はこれを first_systeminfo_do と命名していました。このタスクのなかで Kazuar は感染マシンに関する広範な情報を収集して C2 に送ります。この情報には、オペレーティング システム、ハードウェア、ネットワークに関する情報が含まれます。こちらの付録に攻撃者が収集した全内容を含めてあります。

Kazuar はこのデータを info.txt ファイルに保存し、実行ログを logs.txt ファイルに保存します。Task Solver のセクションで述べたように、この結果はメモリー上から確認することができます。このケースではこれはアーカイブです (図 14)。

画像 14 は、メモリー内の first_systeminfo_do アーカイブの結果のスクリーンショットです。赤で強調表示されているのは、zip ヘッダー 0x50、0x4B、0x03、0x04 です。
図 14. メモリー内の first_systeminfo_do アーカイブの結果

前述の 2 つのテキスト ファイルに加えて、このタスクの一環として、このマルウェアはユーザーの画面のスクリーンショットを取得します。図 15 は、これらすべてのファイルが 1 つのアーカイブに zip 圧縮されるようすを示したものです。この後で暗号化されて C2 に送信されます。

画像 15 は 7zip フォルダーです。パスは編集されています。フォルダーの内容は、scrshot000.jpg、info.txt、logs.txt です。このフォルダーには、サイズ、圧縮後のサイズ、属性、暗号化、およびコメントの情報も含まれています。
図 15. first_systeminfo_do アーカイブの結果をメモリーから抽出。この後暗号化される

自動化されたタスク (Autos) の作成

Kazuar には、感染マシンからの情報収集のため、指定間隔で実行される自動タスクを設定する機能があります。図 16 は、Kazuar の構成に記載されているこの機能の例を示したものです。

これらの自動化されたタスクには次のものが含まれています。

  • システム情報の収集 (包括的なシステム プロファイリングのセクションで説明)
  • スクリーンショットの撮影
  • クレデンシャルの窃取 (詳細は付録を参照)
  • フォレンジック データの取得 (付録参照)
  • autorun (自動実行) データの取得 (付録参照)
  • 特定フォルダーからのファイルの取得
  • 指定フォルダーからのLNKファイルの一覧取得
  • MAPI を利用した電子メールの窃取
画像 16 は、Kazuar による Autos 機能構成のスクリーンショットです。この構成には、maximal storage count、result size、collect with system、do deleted files などのコマンド情報が含まれています。
図 16. Kazuar の Autos 機能の構成のスニペット

アクティブ ウィンドウの監視 (Peeps: 窃視)

Kazuar では攻撃者が「窃視 (peep) ルール」と呼ぶルールを構成内に設定可能です。デフォルトの Kazuar にはこれらのルールは設定されていませんが、マルウェアのコードによれば、この機能により、攻撃者は指定したプロセスのウィンドウを監視できるようです。これにより、攻撃者は侵害したマシン上で関心の対象となるユーザーのアクティビティを追跡できるようになります。

コマンド & コントロールとの通信

HTTP

Kazuar は、前述の分析対策チェックに加え、C2 サーバーとの通信チャネル確立前に構成データの送信時間間隔をチェックしています。このチェックには、週末にデータを送信する必要があるかどうかの決定が含まれます。

最初の通信時に、Kazuar は収集したデータ (「包括的なシステム プロファイリング」のセクションで説明) を XML 形式で送信し、新たなタスクとともに XML で構造化された応答が返されることを期待しています。図 17 にその HTTP リクエストを示します。

Kazuar はハードコードされた値 169739e7-2112-9514-6a61-d300c0fef02d を文字列に型キャストし、Base64 でエンコードしたものをクッキーとして使用します。

画像 17 は HTTP POST コマンドのスクリーンショットです。赤くハイライトされているのは、Base64 でハードコードされたクッキーの値と、生成された XML タグです。
図 17. ボディに XML を含む HTTP POST コマンドが C2 に送信される

Kazuar は XML 用のキー名を生成し、Base64 でコンテンツをエンコードしてから C2 に送ります。この XML の内容には次のものが含まれます。

  • result ファイルの内容を暗号化したもの
  • 結果の識別子
  • 擬似乱数による 4 バイトの数値。おそらくは別の種類の識別子か
  • マシンの GUID に基づいて擬似乱数で生成した値を含む配列
  • ハードコードされた GUID の接続文字列 169739e7-2112-9514-6a61-d300c0fef02d
  • そのマシンの一意な GUID

名前付きパイプを使用した通信

C2 との直接 HTTP 通信に加え、Kazuar はプロキシーとして機能し、感染ネットワーク内にある Kazuar エージェント間でコマンドを送受信する機能を備えています。このプロキシー通信は名前付きパイプ経由で行われています。そのさいは、マシンの GUID に基づいて名前を生成します。

Kazuar はこれらのパイプを使って、さまざまな Kazuar インスタンス間のピア・ツー・ピア通信を確立し、それぞれをサーバーまたはクライアントとして構成します。この名前付きパイプ通信は、表 3 に示すリモート リクエストをサポートしています。

リモート リクエスト Kazuar のレスポンス 説明
PING PONG 現在のインスタンスのプロセス情報を含むメッセージを返す
TASK RESULT 受信したタスクを開始し、結果を返す
LOGS ERROR エラー ログを取得する

表 3. 名前付きパイプを使う Kazuar のリクエストとレスポンス

解析対策のチェック

Kazuar は一連の入念なチェックに基づく複数の解析対策技術を使い、自身が解析対象になっていないかどうかを確認しています。この作者らは監視の目がなければ続行し、デバッグや解析の対象となっている場合はアイドル状態のまま、全 C2 通信を停止するように Kazaur をプログラムしています。これらのチェックは、3 つの主要カテゴリー、ハニーポット、分析ツール、サンドボックスに分類できます。

ダンプ対策

Kazuar はスタンドアロン プロセスとしての実行を想定せず、別のプロセス内にインジェクトされて動作するようにできています。したがって、インジェクト対象のプロセスのメモリーからはコードをダンプできることになります。これを防ぐため、Kazuar は .NET の強力な機能である System.Reflection 名前空間 を使っています。これにより、Kazuar はアセンブリーやメソッドなどに関するリアルタイムのメタデータを収集できるようになります。

Kazuar は antidump_methods の設定が true に設定されているかどうかをチェックした後、ジェネリックな .NET メソッドを無視してカスタム メソッドへのポインターをオーバーライドすることで、(Kazuar が残すログ メッセージの通り) これらのメソッドを事実上メモリーから消してしまいます。これが最終的にリサーチャーによる完全版マルウェアのダンプを防ぎます。

ハニーポットのチェック

Kazuar がまっさきにすることの 1 つが、マシン上で Kaspersky ハニーポットのアーティファクトの存在を探すことです。これを行うさいは、ハードコードされた特定プロセス名とファイル名のリストが使われます。

Kazuar がこれらのファイルやプロセスを 5 つ以上見つけた場合、Kaspersky ハニーポットを見つけたとログに記録します。図 18 はこれらのファイル名を示しています。

画像 18 は、何行もあるコードのスクリーンショットです。これらの辞書項目を使って、Kazuar はファイル名をチェックし、Kaspersky ハニーポットを見つけます。
図 18. Kaspersky ハニーポットを見つけるために Kazuar がチェックするファイル名

解析ツールのチェック

Kazuar はよく使われるさまざまな解析ツール名をハードコードしたリストを持っています。

  • Process Monitor
  • X32dbg
  • DnSpy
  • Wireshark

Kazuar は実行中のプロセス リストを調べ、これらのツールのいずれかが実行されている場合、解析ツールを見つけたとログに記録します (付録参照)。

サンドボックスのチェック

Kazuar は既知のサンドボックス ライブラリー名をハードコードしたリストを持っています。これにより、さまざまなサンドボックス サービスに属する特定 DLL の存在をチェックしています。これらのファイルが見つかった場合、Kazuar は自身がラボで実行されているものと判断します (付録参照)。

イベント ログ モニター

Kazuar は Windows のイベント ログからイベントを収集してパースします。図 19 は、Kazuar が次のウイルス対策/セキュリティ ベンダーからのイベントをとくに検索していることを示しています。

  • Kaspersky Endpoint Security
  • Symantec Endpoint Protection Client
  • Microsoft Windows Defender
  • Doctor Web

Kaspersky のハニーポット チェックのときと同じで、これらのセキュリティ製品が被害組織に人気がある、ということで説明がつきそうです。

画像 19 は、多数のコード行のスクリーンショットです。これらの辞書項目を使って、Kazuar は、Kaspersky、Symantec、Defender などの特定のセキュリティ製品からイベント ログを収集します。
図 19. Kazuar が特定のセキュリティ製品から収集するイベント ログ

Kazuar と Pensive Ursa とのつながりの強化

前記の通り、C2 へ最初の HTTP POST リクエストを作成するさい、Kazuar はそのマシンの GUID かハードコードされた GUID の 169739e7-2112-9514-6a61-d300c0fef02d をクッキーとして使い、そのクッキーを文字列に型キャストして Base64 でエンコードしています。

後者の値を文字列の形式 (169739e7211295146a61d300c0fef02d) で検索すると、スイス CERT によるレポート [PDF] がヒットします。このレポートは、Pensive Ursa によって実行された RUAG に対する攻撃を分析したものです。RUAG Holding は、航空宇宙・防衛セクターのスイス企業です。

くわえてハイブリッド AES + RSA 暗号化スキームや、そのほかの機能面での明らかな類似点を含め、Kazuar の tasksresults といったアーキテクチャは、まさに Carbon の手口のイメージそのものです。これはこのスイス CERT のレポートでも別の ESET によるレポートでも言及されています。Carbon もはやり第 2 段階のバックドアで、これまで Pensive Ursa によるものであると何度も指摘されています。そのコードが Snake からのフォークであることは CISA も言及しています。

これらの調査結果は、複数の CERT による報告とともに、Kazuar は Carbon の後継ではないかという以前の Unit 42 の推測をさらに裏付けるものとなっています。最も重要なのはこれらの発見が Kazuar の Pensive Ursa への帰属を強化するものだということです。

結論

私たちは野生で検出された最新の Kazuar マルウェア亜種を調査しました。注目すべき機能は次のとおりです。

  • 堅牢なコードと文字列難読化技術
  • パフォーマンス向上のためのマルチスレッド モデル
  • メモリー内、送信中、ディスク上を問わず、Kazuar コードを解析から保護し、そのデータを隠すために実装された一連の暗号化スキーム

前述の機能はすべて、Kazuar バックドアに高レベルのステルス性を提供するように設計されています。このマルウェアのそのほかの注目すべき特徴は次のとおりです。

  • 解析対策機能
  • 広範なシステム プロファイリング機能
  • クラウド アプリケーションに的を絞ったターゲット設定

このバージョンの Kazuar は 40 を超える一連の個別コマンドもサポートしていましたが、そのうち半分はこれまで文書化されたことがありませんでした。

セキュリティ担当者と防御担当者の皆さまには、本稿をお読みいただき、本稿で提供した情報を利用して現在の検出・防止・ハントの実践を強化し、組織の全般的なセキュリティ態勢強化に努めていただければと思います。

Cortex XDR の検出と防止

図 20 は、Cortex XDR が Kazuar を検出して実行を阻止したようすを示したものです。技術分析セクションで詳細に解説したとおり、Kazuar はデフォルトではコードを explorer.exe に挿入します。検出モードで動作するように構成した場合、Cortex XDR はインジェクトされた explorer.exe からの悪意のあるアクティビティを検出します (図 20)。

画像 20 は Cortex XDR による explorer.exe からの悪意のあるアクティビティの検出の示すスクリーンショットです。Severity (深刻度) は「High (高)」と評価されており、説明には「Suspicious execution of native code (ネイティブ コードの不審な実行)」とあります。
図 20. 検出モードの Cortex XDR で Kazuar を検出したようす

Kazuar がプロセス インジェクションや WMI 実行のために行ったネイティブ コードの実行や、explorer.exe が実行したおよそ explorer.exe らしからぬ不審な活動の両方が、複数の警告をトリガーしています。図 20 に示すアラートを含むアラートの詳細を以下の図 21 に示します。

画像 21 は、Cortex XDR のアラート テーブルのスクリーンショットです。合計 3 つのアラートがリストされています。アラートの説明も含まれます。一部の情報は伏せられています。
図 21. 検出モードの Cortex XDR で Kazuar の実行アラートを表示したところ

また、図 22 は、Kazuar が設定やログを保存するために作成したディレクトリーやファイルの詳細を示しています。

画像 22 は、Cortex XDR のアラート テーブルのスクリーンショットです。合計 6 つのアラートがリストされています。5 つは File Write (ファイル書き込み)、6 番目は Create Directory Event (ディレクトリー作成イベント) です。ファイル パスもリストされていて、各行の一部の情報は伏せられています。
図 22. 検出モードの Cortex XDR で Kazuar の実行アラートを表示したところ

最後に図 23 は、防止モードにした Cortex XDR が Kazuar マルウェアの実行可能ファイルを防止し、それに応じたアラート ポップアップをトリガーするようすを示したものです。

画像 23 は、Cortex XDR のアラート ウィンドウです。Cortex XDR has blocked a malicious activity!Application name: Senatorial.exe. Application publisher: UnknownPrevention description: Suspicious executable detected
図 23. 防止モードの Cortex XDR が Kazuar の実行防止アラートを表示したところ

保護と緩和策

Cortex XDR プラットフォームは、前セクションのスクリーンショットで説明した実行フローを検出・防止します。

従来の検出に加え、独自の SmartScore エンジンが、セキュリティ調査方法や関連データを機械学習によるハイブリッド リスク スコアリング システムへと変換します。図 24 は、Kazuar の亜種と、本稿で詳しく解説した関連インシデントが SmartScore で 100 点中 97 点を獲得したようすを示したものです。

画像 24 は、Kazuar の SmartScore のスクリーンショットです。スコアは 97 です。スコアの理由のリストとインサイトのリストがあります。
図 24. SmartScore が Kazuar に与えたスコア

パロアルトネットワークス製品をご利用のお客様は、弊社の製品・サービスにより、本グループに関連する以下の対策が提供されています。

Cortex XDRXSIAM は以下を含む複数のデータ ソースからユーザー アクティビティを分析することで、ユーザーやクレデンシャルに基づく脅威を検出します。

  • エンドポイント
  • ネットワーク ファイアウォール
  • Active Directory
  • ID およびアクセス管理 (IAM) ソリューション
  • クラウド ワークロード

Cortex XDR と XSIAM は機械学習を使って長期にわたるユーザー アクティビティ行動プロファイルを構築します。Cortex XDR と XSIAM は、過去のアクティビティやピアー アクティビティ、期待される同者の行動と新しいアクティビティとを比較することにより、クレデンシャル ベースの攻撃を示唆する異常なアクティビティを検出します。

さらに Cortex XDR は本稿で取り上げた攻撃に関連し、以下の保護も提供しています。

  • 既知の悪意のあるマルウェアの実行を防止するほか、ローカル分析モジュールにもとづく機械学習と Behavioral Threat Protection によって未知のマルウェアの実行も防止します。
  • Cortex XDR 3.4 から利用可能になった新たな Credential Gathering Protection を使い、クレデンシャルを収集するツールや技術から保護します。
  • Anti-Exploitation モジュールと Behavioral Threat Protection を使い、 ProxyShell や ProxyLogon 含む、さまざまな脆弱性のエクスプロイトから保護します。
  • Cortex XDR Pro と XSIAM は振る舞い分析により、クレデンシャル ベース攻撃を含む、エクスプロイト後のアクティビティを検出します。
  • Advanced Threat Prevention セキュリティ サブスクリプションを有効にした次世代ファイアウォール (NGFW) は、Threat Prevention シグネチャー 86805 でマルウェアによる C2 トラフィックのブロックを支援します。
  • Advanced WildFire はこの新たな Kazuar の亜種の発見を受けて機械学習モデルと分析手法の見直しと更新を行いました。パロアルトネットワークスのポートフォリオにある複数の製品が、Advanced WildFire を活用して Kazuar の亜種やそのほかの脅威に対するカバレッジを提供します。

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

  • 北米フリーダイヤル: 866.486.4842 (866.4.UNIT42)
  • EMEA: +31.20.299.3130
  • APAC: +65.6983.8730
  • 日本: (+81) 50-1790-0200

パロアルトネットワークスは、これらの調査結果を Cyber Threat Alliance (CTA: サイバー脅威アライアンス) のメンバーと共有しました。CTA のメンバーはこのインテリジェンスを使って、お客様に保護を迅速に提供し、悪意のあるサイバー攻撃者を体系的に阻害できます。詳細は Cyber Threat Alliance にてご確認ください。

IoC (侵害指標)

Kazuar SHA256

  • 91dc8593ee573f3a07e9356e65e06aed58d8e74258313e3414a7de278b3b5233

コマンド & コントロール (C2) サーバー

  • hxxps://www.pierreagencement[.]fr/wp-content/languages/index.php
  • hxxps://sansaispa[.]com/wp-includes/images/gallery/
  • hxxps://octoberoctopus.co[.]za/wp-includes/sitemaps/web/

RSA キー

  • <RSAKeyValue><Modulus>7ondEZo8ZjYh+FP4h3PgJBU/yTlO+g8ZbCF0wx8eocnqxLS4YWI9hG3SI2hlEBz6J4vvxPCrs/jazekolaZLQnbyOCyH53I+We+x32d2lUlXrtZA/0oJa39tW2t2NsUG/xPqsY3rBCuhi28hl30XH8Arn2/u9Jxl1G9dNxFDdVxk9ePjlHecdAtWCa9vmC4HY0Wlqyhd0+hJfvKCoKLsHuCyl4b/c343VVVTFubYNSFJMQnpIKsYQDRKtRszQuS1Ls+obyOr+0cbAmnKb8twTsq862pA6MzxRr16/4/1nyrNKuDS+OvPfv3tgvssybtGwN8D8Qac7O1FM722Nft16iis9WaoFuXCwP/LCkaetQMjEKN07H6ESHMnUc+JDvINIspAAKK8fRwtTcWKrG2bh/Dwtneq/9L1Pv2cKtpQAUlxVfQX5I/mtATEHIMcPOvNWRUqmSssDHEJiZDFKS45SjoG4qXs536xwbZ4k6lmHUUOVzkmCc71HooxRdSYx1M7Vqvou1Mi39O6vJouL2aTO6ymbGdnerKavDsgBSa2HKRbP2Nym6Ud4WAhiaqnPCWGnJz7l+4Hs++OcG2p+Ct1oXRecLK6Zy/n9moTZeijLdqJwUh90Bht8V8STz/vNtrhz++Do6DsDssENkOHXeUeRCqCmDdS3sqkxQnGAG3tGvc=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>
  • <RSAKeyValue><Modulus>pyR0/srVS0gOZbNdK3iK+GvekQVkBq8brOVCuN/XcCz4WLJod9GhivDYrDtMXF6ZMGHKa2zAcQ+v2vltYW3X2BYCZ1sblEznfIk+oHs+lesblfHVyPPXDcTLLf5IUuGE/dzeSpLhlWiFT/4MyeMLzU8QexpRkBn0qJkk5xWU0D09DN0SaNzA8E4grU61aaul5iNRYMO+qLXmtIJhrjUrnHNu7ZnZ+AQtc19Dhne1hciH4aj00HRLXsofWGWsELEhZv92cnQ0Rf9n00EGB591zDR8gAt3T5sSTQvjMGWOBHusfGV4ytmchmQWZ8QY7Fp4EPgn8vM48OR2z13qo4YSediAt9Af+YKGoPu2PU3szx08UwBZRz4cyYZB3zcFB8NxCx7Gki2rS5bYx1Z1cG/kU+Ri2gXYoCHgOz8umr+PDB+21V1pnmStxzWAdR7mK0e663LMxxAcZWjEArbt/BcIiZAkFsyoq+NJbuKTR2RYAW+4DXbxFQeGKnFBgle3u9ktcYXWqgJ8/rvs920rGf9k3br3I+2MtzrWglhRi/WkAmTrEIL4i1id0M0askl0YBHlzU9+Bgv2y/VsLH2UKQlp+owxGm1jequxwGpZfwxmWAMATe8L2qctVdXEOfT7Ue67AsVjkP/VmhbhGDO8zt38trylUhWnpUeYdkigg9Nxs1k=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>

追加リソース