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

有害性が際立つ偽装に長けた Jupyter インフォスティーラ:ステルス性と難読性の高い、モジュール化されたマルウェア

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

 

概要

偽装に長けた Jupyter インフォスティーラは、高度にモジュール化されたマルウェアであり、正規インストーラパッケージの奥深くに潜んでいます。実行されると、コマンドアンドコントロール(C2)サーバーからさらに悪意のあるコンポーネントを取得して、自身の機能を強化することが可能です。これらのコンポーネントには、実行可能ファイルや悪意のある PowerShell スクリプトを含めることができます。

ここでダウンロードされる機能として情報窃取モジュールがあります。このモジュールは、被害者のコンピューター名、ユーザー管理者権限、ワークグループ、ブラウザーのパスワードデータベースなどの認証情報を収集します。また、Google Chrome™、Microsoft Edge®、Opera、Brave、Mozilla Firefox といった広く使用されているブラウザーも標的とします。このようなブラウザーがインストールされていることを見出したインフォスティーラは、そのブラウザーに保存されている機密性の高いユーザーデータを収集して外部に持ち出します。このようなデータの例として、ログインデータ(ユーザー名とパスワード)、Cookie、ウェブデータ(ユーザーの名前、自宅住所、メールアドレスをはじめとする「自動入力」情報など)があります。

また、Atomic Wallet、MyMonero Wallet、Ethereum Wallet といった多数の暗号ウォレットも標的となります。さらに、OpenVPN やリモートデスクトッププロトコル(RDP)などのリモートアクセスアプリケーションも探索されます。

このマルウェアは、特定の企業や業種を標的にすることはなく、設定された目標や予定も持っていないことから有害性が際立っています。不注意でその策略にはまったすべての被害者が標的とされます。

 

発見と実行

Jupyter が初めて見つかったのは 2020 年末で、当初は正規の実行可能ファイルに自身をバンドルしていました。実行された Jupyter は、難読化状態で隠匿している PowerShell スクリプトを実行します。2021 年を通じ、このマルウェアの脅威グループはステルス性と難読性の強化に開発力を注ぎました。たとえば、Jupyter のダイナミックリンクライブラリ(.DLL)を、ディスクにファイルとして書き込むのではなく、メモリに反射型ロードするようにしています。

現在は、100 MB を超えるような Windows® 向け大型インストーラパッケージ(.MSI)に Jupyter がバンドルされる傾向があります。このようなパッケージには正規のアプリケーションがバンドル済みで、有効なデジタル証明書による署名もあるので、このマルウェアの意図が一層隠匿される結果になります。

このようなパッケージは、インストールの際、それがバンドルされている正規のアプリケーションをロードし、インストールしようとします。しかし、このようなトロイの木馬のインストーラでは、そのコードの奥深くに高度な難読化を施された比較的小型の暗号化 PowerShell スクリプトが潜んでいて、バックグラウンドで実行されます。

 

オペレーティングシステム

 

リスクと影響

 

技術的解析

さまざまな顔、さまざまな名前、さまざまな標識

わずかな期間で、Jupyter は多数のアプリケーションとインストーラを装うようになっています。また、そのコアファイルの拡張子を .MSI に変更して、その難読化した PowerShell スクリプトを実行するために多彩な操作を使用しています。

このような柔軟性があることから、多数のセキュリティ研究機関がそれぞれ異なる名前でこのマルウェアファミリを呼ぶようになっています。それらの名前は、Jupyter のコアモジュールの命名機能やダウンロードされるコンポーネントに基づいています。これまでは Polazert や Yellow Cockatoo などと呼ばれ、最近では SolarMarkerDeimos といった名前も見られます。このマルウェアは、その命名の根拠となっていた侵入の痕跡(IOC)を破棄することから、容易な特定が困難になっています。

 

感染経路

Jupyter の初期感染経路は多岐にわたります。多くの場合、正規ホストを装った偽のダウンロードウェブサイトで Jupyter がホストされています。このようなサイトでは、PDF 書籍や簡単なアプリケーションを無料でダウンロードできるようになっていることが普通です。意図せずにアクセスした被害者や悪意のあるメールからリンクをたどった被害者が、このようなサイトを訪れます。

図 1 :信用できるように見せかけるためにデジタル証明書で署名済みとした、多く見られる Jupyter のサンプル

多くの場合、Jupyter はフリーウェアアプリケーションにバンドルされ、無効になっていないデジタル証明書で図 1 のように署名されているので、正規のダウンロードのように見えます。

これまでの出現で、Jupyter の手口は Windows Portable Executable(.EXE ファイル)の使用から大型の Windows インストーラパッケージ(.MSI)へ移行してきています。この理由は、ウイルス対策(AV)プログラムによっては MSI がスキャンされないことが多いファイルタイプであること、自動化サンドボックスルーチンなどの自動化 AV スキャンソリューションでは、100 MB を超える大型のファイルが検査される可能性が低いことにあると考えられます。

 

インストール

Jupyter が実行されると、Windows 版のインストーラパッケージによって正規アプリケーションのインストーラポップアップが図 2 のように表示されますが、バックグラウンドでは Jupyter のデータがロードされ、気付かれることなく実行されています。

図 2 :想定どおりに目的のアプリケーションをインストールするように見える偽装 MSI ファイル

これまでのキャンペーンでは、多岐にわたる手口で Jupyter が展開されてきました。多くの場合、このマルウェアは、2 つのコアファイルである実行可能ファイルおよび悪意のあるコードを書き込んだ Windows PowerShell で構成されていますが、例外もあります。

Jupyter の亜種の中には、被害者の %AppData%\Roaming\Temp\ ディレクトリに一時ファイル(.TMP)もデプロイするものがあります。このような亜種は、図 3 のように別の Microsoft PowerShell (.PS1)ファイルをこのディレクトリに置き、Jupyter でコアとなる悪意のある PowerShell スクリプトのコンテンツを生成します。

図 3 :Jupyter MSI インストーラのコンテンツ

 

PowerShell

Aこれまでに見られた Jupyter ではすべて PowerShell が重用されてきました。このマルウェアでは、悪意のあるコードの難読化と、そのコードを被害者のマシンのディスクに書き込まずに実行する操作の両方に PowerShell が使用されています。

Jupyter の DLL をメモリに反射型ロードすることで、ディスクへのコードの書き込みを回避しています。通常は、ディスクに書き込まれたファイルから DLL がプロセスに注入されます。DLL の反射型注入は、ディスクからではなくメモリからコードを強制的に被害者のプロセスに注入する技法です。

脅威アクターから見ると、まったく難読化していないマルウェアをディスクに置くわけにはいかないので、被害者のマシンが起動するときにマルウェアを再ロードするレジストリキーなどの永続化メカニズムを作成する必要があります。これにより、メモリからダンプしない限り、Jupyter の DLL は検知も解析も困難になります。

図 4 :Jupyter の PowerShell の詳細

図 4 とそれに続く表に示すように、多くの Jupyter の PowerShell は、6 つのステップ(コンポーネント)に分けて考えることができます。各ステップは、固有の目的、機能、能力に特化されています。Jupyter のサンプルの多くはこの同じステップに従っていますが、Jupyter の PowerShell コードには変種も見られ、結果は同じでも、これとは若干異なる動作を経るサンプルもあります。

ステップ

説明/機能

難読化した DLL

Jupyter の DLL のコアコードを記述した難読化変数。

難読化を解除するルーチン

「難読化した DLL」のコードを受け取り、Jupyter の悪意のあるコアコードの難読化を解除するルーチン。多くの場合、Jupyter は Base64 でエンコードされ、XOR で難読化されています。

スタートアップへの追加

永続化メカニズムとして Jupyter がスタートアップに追加され、マルウェアが強制的に再実行されるようになります。

おとりファイルの作成

このマルウェアは、被害者の %AppData%\Roaming\ フォルダに普通に存在するディレクトリに自身を隠匿します。ランダムな個数の「ジャンクファイル」を配置して、唯一の機能する悪意のあるファイルが見つからないようにしています。PowerShell コードの大半の変種では、作成されるジャンクファイルの個数が 100 から 300 の範囲でランダムに変化することが普通です。

DLL 反射

このマルウェアは反射型で実行され、ユーザーのデバイスに DLL が置かれないようにしています。

レジストリへの追加

永続性を高くするために、被害者のマシンにレジストリキーが追加されます。


最近のキャンペーンで確認された Jupyter のすべてのサンプルが同じ挙動を示すわけではありません。さまざまなディレクトリにおとりファイルをデプロイするものもあります。DLL のコードを XOR で難読化しないものもあれば、Base64 で自身をエンコードするものもあります。

 

おとり

解析を妨害するために Jupyter の PowerShell が最初にとるアクションとして、図 5 のようにランダム化した数百個の「ジャンクファイル」が作成されます。同時に、1 つのファイルがマルウェアのコアコンポーネントとして保持されます。これらのおとりファイルは、悪意のある 1 つのファイルを紛れ込ませる目的でのみ作成され、それ以外の悪意や目的には使用されません。

図 5 :Jupyter によって置かれたおとりファイル

以前に確認された Jupyter では、そのコアとなる .DLL がディスクに置かれていました。この手口は今でも使用されていますが、DLL が直接ディスクにデプロイされることはなくなっています。現在では、難読化を解除したマルウェアがメモリにのみロードされます。

PowerShell スクリプトが実行されるたびに、おとりファイルのランダム化した一群とマルウェアのコアコンポーネントを収めた新しいディレクトリが作成されます。最近のキャンペーンでは、被害者のデバイスにある次の 3 つの場所に Jupyter がデプロイされています。

  • %AppData%\Roaming\Adobe\ [Random 15 Char directory]\
  • %AppData%\Roaming\Microsoft\ [Random 15 Char directory]\
  • %AppData%\Roaming\Nvidia\ [Random 15 Char directory]\

 

永続性

実行中の Jupyter によって、その PowerShell スクリプトが気付かれずに実行されます。次の図のように、このスクリプトはその真の意図を表示して解析できるように変更できます。

図 6 :レジストリキーを使用して永続化されたメカニズム

Jupyter の解析に使用したこのサンプルでは、 C:\Users\%Admin%\AppData\Roaming\Microsoft フォルダに新しいディレクトリが作成されています。この例では、このディレクトリの名前が図 6 のように kNPqHZeEjTuJAXRY になっています。この場所はマルウェアによってランダムに選択され、実行のたびに新しいディレクトリが生成されます。

%AppData%\Roaming\Microsoft\Windows\スタートメニュー\プログラム\スタートアップにはショートカットファイルが作成されます。このファイルにも、PowerShell コードに記述された変数に基づくランダムな名前が割り当てられます。このショートカットは、Windows が起動するときに実行されるように、図 7 のように永続化メカニズムとしてデプロイされます。

図 7 :Jupyter サンプルのスタートアップショートカットの例

Jupyter の PowerShell コードが実行されると 2 種類のレジストリキーも生成されます。第 1 のキーは、図 8 のように被害者のマシンの Computer\HKEY_CURRENT_USER\SOFTWARE\Classes\%.cwvynlbszymn% に追加されます。

このレジストリキーの最後の部分も、マルウェアが実行されるたびにランダムに設定され、ランダムな新しいシーケンスとなります。このキーは、このマルウェアによって生成される、図 9 の第 2 のキーを指します。

図 8 :Jupyter によって追加されるレジストリキー

Jupyter によって図 9 のように追加される第 2 のキーには、このマルウェアを再実行する PowerShell コマンドがデータとして記述されています。このキーは、別の永続化メカニズムとしてマルウェアで使用されます。

図 9 :Jupyter を再実行するコアレジストリキー

このレジストリキーが見つかれば、その内容を解析して検査できます。当初の PowerShell スクリプト同様、このコマンドの意図は、マルウェアの本体 DLL の難読化を解除してメモリに反射型ロードすることにあります。

図 10 に示すこの PowerShell コマンドは、元の PowerShell コードの省略型です。その目的は、このマルウェアをシステムの起動時に再実行することです。このコードは、おとりファイルのデプロイやレジストリキーの追加といった実行済みのステップと機能が省略されているので、サイズがきわめて小さくなっています。

図 10 :レジストリキーの PowerShell の内容

 

コア DLL

Jupyter のコア DLL は .NET でコンパイルされています。これまでのこの DLL にはラベル表記された関数が使用され、DLL が難読化されていなかったので、このマルウェアの目的が明確に判明していました。2021 年の後半、このマルウェアの新しいバージョンは洗練の度を深めています。その関数には特定可能なラベルが使用されなくなり、コードの内容の難読化が進んでいます。このような進歩の反面、この「コアモジュール」の機能はこれまでとほとんど同様です。

図 11 :Jupyter のバージョンによる相違点

このモジュールの最初の機能は、このマルウェアの C2 インフラストラクチャとの接続を確立することです。そのためには、.NET WebRequest プロバイダを使用して、Jupyter の各サンプルにあるハードコーディングされた IP アドレスに POST 要求が送信されます。

この解析では、Jupyter の C2 インフラストラクチャが、必要とされないときはオフラインの状態にあることがわかりました。マルウェアはバックグラウンドで実行を続け、そのインフラストラクチャがオンラインになるのを待機しています。接続が確立するまで、C2 を利用できるかどうかを定期的に確認しています。

C2 に対する要求には、ハードコーディングされた RSA 鍵などの RSA 暗号化データが図 12 のように記述されています。このデータは今後の通信で使用されます。Jupyter では、その通信に AES(Advance Encryption Standard)暗号化も使用されます。

AES は広く使用されている対称ブロック暗号化です。この暗号化標準が Jupyter で使用されている理由は、マルウェアのコアモジュールと C2 との間で通信、モジュールのデプロイ、データの持ち出しが発生したときに、パケットが捕捉されて検査されないようにするためです。

図 12 :Jupyter の「構成」機能の内容

接続が確立すると、被害者のデバイスに次の情報がないか確認するためにコアモジュールによる偵察が始まります。

  • マシン名
  • Windows のバージョン
  • CPU のアーキテクチャ(x86 または x64)
  • ユーザーの管理者権限
  • ワークグループ
  • DNS
  • プロトコルのバージョン
  • マシンのステータス(アイドルまたはアクティブ)

Jupyter には、これらの情報を次の情報とともに送信しようとする「ping」機能があります。

  • マルウェアのバージョン ID(version)
  • 被害者のデバイスハードウェアから得られた固有のハッシュ(hwid)
  • 通信ごとに固有な Base64 識別子のハッシュ(uniq_hash)

C2 との接続を確立した Jupyter では、そのモジュール設計によって、悪意のあるさまざまなコンポーネントを図 13 のように脅威へ取り込み、その機能を強化できます。これらのコンポーネントには、実行可能ファイルと悪意のあるさまざまな PowerShell スクリプトを収めることができます。

図 13 :C2 の活動と追加コンポーネントのダウンロード

 

バージョン

Jupyter の各サンプルには、C2 との通信に使用する「バージョン ID」(図 12)があります。多くの場合、新たに発見されたバージョン ID は、マルウェアのコアモジュールの機能に変更、更新、追加があったことを示しています。Jupyter のさまざまな変化の多くは、このようなバージョン ID の特性から特定できます。

OC-1:

MSI サンプルに .txt ファイルとして PowerShell ペイロードを埋め込み

.txt ファイルを AppData フォルダに配置

MSI に埋め込まれたペイロードの起動に使用するコマンド

AppData から .txt ファイルをコマンドで読み取り、別のコマンドをデコード

XOR 演算

OC-8:

最初に Base64 エンコード

Wscript

AppData\Adobe フォルダ

user32.dll をインポート

Get-Process

2 つの関数を定義

Base64 の DLL を反射型ロード

XOR 演算なし

OC-9:

最初に Base64 エンコード

 WScript

AppData\Adobe フォルダ

user32.dll をインポート

Get-Process

2 つの関数を定義

Base64 の DLL を反射型ロード

XOR 演算

3d8:

最初に Base64 エンコード

Wscript

AppData\Adobe フォルダ

user32.dll をインポートし、半難読化した PowerShell コマンドに隠匿

Get-Process

2 つの関数を定義

Base64 の DLL を反射型ロード

XOR 演算

表 1 :Jupyter の各バージョン

 

モジュール

永続化を達成した Jupyter では、ダウンロードする次のモジュールがないか、ハードコーディングされた C2 の確認を開始します。当社の調査では、C2 からさまざまなモジュールが提供されていることを確認しています。この Jupyter の本体モジュールとコードの機能の調査では、難読化された関数の名前を変更することで、難読化前の名前を推定できます。

図 14 :元の関数名と機能に基づいて変更した関数名

ダウンロードされるコンポーネントとして、PowerShell のスクリプトとペイロードを備えた情報窃取モジュールがあります。このペイロードは、PowerShell スクリプトでデコードされたうえでメモリに反射型ロードされます。

 

インフォスティーラモジュール:

このモジュールは、いくつかの機能を使用して、被害者のコンピューターにあるさまざまなソースから情報を抽出します。このように使用される機能としてデータ保護 API(DPAPI)があります。この API では、ProtectedData クラスに 2 つのラッパーとして「Protect」と「Unprotect」があります。インフォスティーラモジュールでは「Unprotect」ラッパーが使用されます。このラッパーは暗号化されたデータのバイト配列を受け取り、復号したデータのバイト配列を返します。

図 15 のように、Unprotect ラッパーが「a01e73a94eb4d2952c37caa645a74」メソッドから呼び出されます。

図 15 :Chrome のパスワードデータベースとデータベースの暗号鍵の抽出

Chrome の JSON 構成は、AppData ディレクトリの「Local State」ファイルに保存されています。このファイルは、「a5f8」で始まる名前のクラスを使用して解析されます。この JSON 構成には「os_crypt」エントリがあり、このエントリには別のエントリとして「encrypted_key」があります。保存されているログインデータの暗号化に「encrypted_key」が使用されます。

このインフォスティーラモジュールでは、ユーティリティクラス「a01e...」を使用してこの暗号化された鍵が読み取られ、「a671」で始まる名前の静的クラス関数を使用して DPAPI の Unprotect が呼び出されます。この鍵にはプレフィックスとして DPAPI の署名バイトが付加されているので、5 回のループ処理によってこのプレフィックスが除去されます。書式を整えた「encrypted_key」は、クラスフィールドの「aes_key」に保存されます。このほか、Chrome の「Login Data」ファイルのコピーがランダムな名前で作成され、Windows の一時ディレクトリに書き込まれます。このファイルは、さらにクラスフィールドの「pwds_db」に保存されて一時ディレクトリからは削除されます。

図 15 の関数では、保存されている Chrome のログインデータは復号されません。その関連データが読み取られ、クラスメンバーフィールドである「aes_key」と「pwds_db」に保存されます。「pwds_db」と「aes_key」の値が収集され、Base64 エンコードされます。これは、このマルウェアの作者が、データを持ち出した後、認証情報の復号を意図していることを示しています。この操作は効率の面から意味があります。Chrome の情報を窃取した後でログインデータを復号するために必要なツールを、この作者がすべて用意しているからです。

インフォスティーラモジュールが標的とするブラウザー:

  • Google Chrome
  • Microsoft Edge
  • Opera
  • Brave
  • Mozilla Firefox

次のブラウザーデータも収集されます。

  • ログインデータ(ユーザー名とパスワード)
  • Cookie
  • ウェブデータ(名前、住所、メールアドレスなどの自動入力された情報)
図 16 :Firefox のデータの復号
 

図 17 :Chrome のデータの復号

Jupyter が標的とする暗号ウォレット:

  • Atomic Wallet
  • Guarda Wallet
  • SimplEOS Wallet
  • NEON Wallet
  • Wasabi Wallet
  • MyMonero Wallet
  • Jaxx Wallet
  • Electrum Wallet
  • Ethereum Wallet
  • Exodus Wallet
  • GreenAddress Wallet
  • Coin Wallet
  • Bither Wallet
  • Coinomi Wallet
  • Ledger Live ハードウェアウォレット
  • Trinity ハードウェアウォレット
  • Scatter ハードウェアウォレット
  • ワイルドカード:*wallet*.dat に一致するすべてのファイル
  • ワイルドカード:*.wallet に一致するすべてのファイル

標的となるリモートアクセスアプリケーション:

  • OpenVPN
  • リモートデスクトッププロトコル(RDP)

 

まとめ

2021 年の暮れに Jupyter は前回の出現よりも急速に進化を遂げました。これによって、検知、スキャン、予防がさらに困難な新たなマルウェアになり、その被害を受けるデバイスが急増しています。

現在の Jupyter は正規の署名済みソフトウェアにバンドルされているので、被害者のシステムにデプロイされていない時点で脅威として検知することが困難です。このマルウェアは DLL の反射を通じて実行されるので、バックグラウンドで気付かれずに実行されていることを示す兆候がほとんどありません。被害者のシステムに侵入した Jupyter は、いくつかの永続化メカニズムを使用しますが、バンドル元の正規ソフトウェアもインストールするので被害者が欺かれる程度が強くなります。

Jupyter の活動の隠匿性を高くするために、その C2 インフラストラクチャは、ほとんどの期間でオフラインになっています。その動作は恒常的な通信ではなく、ごく短時間の活動にとどめられています。

モジュール設計であることから、このマルウェアのコアモジュールは小型です。Jupyter の重点的な活動は情報の窃取なので、パスワードや認証情報などを入手するためにさまざまなモジュールがデプロイされます。しかし、このマルウェアの活動はこれらに限られません。システムに足がかりを得た Jupyter は多彩なコンポーネントをダウンロードできるので、きわめて危険な種類のマルウェアといえます。

 

YARA ルール

以下の YARA ルールは、この記事で説明した脅威を捕捉するために BlackBerry の Research & Intelligence Team が作成しました。

import "pe"
import "dotnet"

rule Mal_Infostealer_EXE_Jupyter_Cert_36ff
{
    meta:
        description = "Detects Jupter executables by certificate OOO Sistema (36ff)"
        author = "BlackBerry Research & Intelligence Team"
        date = "2021-10-14"
        license = "This Yara rule is provided under the Apache License 2.0 (https://www.apache.org/licenses/LICENSE-2.0) and open to any user or organization, as long as you use it under this license and ensure originator credit in any derivative to The BlackBerry Research & Intelligence Team"       

    condition:
        uint16(0) == 0x5a4d and
        for any i in (0 .. pe.number_of_signatures) : (
            pe.signatures[i].issuer contains "Certum Extended Validation Code Signing CA SHA2" and
            pe.signatures[i].serial == "36:ff:67:4e:b3:05:e9:9c:35:56:5f:a3:01:d5:c4:b0" // Serial variable must be lowercase
            )
}

rule Mal_Infostealer_MSI_EXE_Jupyter_Certificate
{
    meta:
        description = "Detects Jupter by certificate"
        author = "BlackBerry Threat Research Team"
        date = "2021-11-04"
        license = "This Yara rule is provided under the Apache License 2.0 (https://www.apache.org/licenses/LICENSE-2.0) and open to any user or organization, as long as you use it under this license and ensure originator credit in any derivative to The BlackBerry Research & Intelligence Team"

    strings:
        // MSI Installer
        $msi = { D0 CF 11 E0 A1 B1 1A E1 }

        // MSI Strings
        $a1 = "EMCO MSI Package Builder"

        // PowerShell execution strings
        $b1 = "powershell-ExecutionPolicy bypass -command \"iex([\\[]IO.File[\\]]::ReadAllText('[CurrentUserProfileFolder]" nocase
        $b2 = "powershell-ep bypass -file \"[AppDataFolder]" nocase
        $b3 = /powershell-ep bypass -windowstyle hidden -command \"\$xp=\'\[AppDataFolder\].{0,256}\.{0,256}\'/ nocase
        $b4 = /powershell-ep bypass -windowstyle hidden -command \"\$p=\'\[AppDataFolder\].{0,256}\.{0,256}\'/ nocase
        $b5 = /powershell-ExecutionPolicy bypass -command \"iex\(\[\\\[\]IO.File\[\\\]\]::ReadAllText\(\'\[CurrentUserProfileFolder\].{1,256}\..{1,256}\'\)\)/ nocase

        // Certificate Name
        $c1 = "OOO ENDI"
        $c2 = "OOO MVS"
        $c3 = "OOO LEVELAP"
        $c4 = "Soto Manufacturing SRL"
        $c5 = "Decapolis Consulting Inc."

        // Co-signers
        $f1 = "SSL.com EV Root Certification Authority RSA R2"
        $f2 = "SSL.com EV Code Signing Intermediate CA RSA R3"
        $f3 = "DigiCert Trusted G4 Code Signing RSA4096 SHA384 2021 CA1"
        $f4 = "DigiCert Trusted Root G40"

    condition:
        ($msi at 0 or uint16(0) == 0x5a4d) and
        all of ($a*) and
        1 of ($b*) and
        1 of ($c*) and
        2 of ($f*)
}

rule Mal_Infostealer_MSI_Jupyter_Embedded_PowerShell
{
    meta:
        description = "Detects Jupter by a specific PowerShell command present in the MSI Installer"
        author = "BlackBerry Threat Research Team"
        date = "2021-10-14"
        license = "This Yara rule is provided under the Apache License 2.0 (https://www.apache.org/licenses/LICENSE-2.0) and open to any user or organization, as long as you use it under this license and ensure originator credit in any derivative to The BlackBerry Research & Intelligence Team"

    strings:
        // MSI Installer
        $msi = { D0 CF 11 E0 A1 B1 1A E1 }

        // Embedded PowerShell Command
        $x1 = /powershell-ep bypass -windowstyle hidden -command \"\$xp=\'\[AppDataFolder\]pd\w*\.(log|txt)\';\$xk=\'[a-zA-Z]{52}\';\$xb=\[\\\[\]System\.Convert\[\\\]\]::FromBase64String\(\[\\\[\]System\.IO\.File\[\\\]\]::ReadAllText\(\$xp\)\);remove-item \$xp;for\(\$i=0;\$i -lt \$xb.count;\)\[\\\{\]for\(\$j=0;\$j -lt \$xk\.length;\$j\+\+\)\[\\\{\]\$xb\[\\\[\]\$i\[\\\]\]=\$xb\[\\\[\]\$i\[\\\]\] -bxor \$xk\[\\\[\]\$j\[\\\]\];\$i\+\+;if\(\$i -ge \$xb.count\)\[\\\{\]\$j=\$xk\.length;\[\\\}\]\[\\\}\]\[\\\}\];\$xb=\[\\\[\]System.Text.Encoding\[\\\]\]::UTF8\.GetString\(\$xb\);iex \$xb;/ nocase

    condition:
        $msi at 0 and
        all of ($x*)
}

rule Mal_Infostealer_PowerShell_Jupyter_Updated_Samples
{
    meta:
        description = "Detects Jupter powershell via common strings"
        author = "BlackBerry Threat Research Team"
        date = "2021-11-04"
        license = "This Yara rule is provided under the Apache License 2.0 (https://www.apache.org/licenses/LICENSE-2.0) and open to any user or organization, as long as you use it under this license and ensure originator credit in any derivative to The BlackBerry Research & Intelligence Team"

    strings:
        $c1 = /\.[T|t][O|o][L|l][O|o][W|w][E|e][R|r]\(\)\)?;[I|i][E|e][X|x]/
        $c2 = "get-random -minimum 50000 -maximum 200000" nocase
        $c3 = "ReaDALlBYTES" nocase
        $c4 = /createshortcut\(\$env\:appdata\+'\\m\'\+\'icr\'\+\'oso\'\+\'ft\'\+\'\\w\'\+\'ind\'\+\'ow\'\+\'s\\\'\+\'st\'\+\'art\'\+\' me\'\+\'nu\'\+\'\\pr\'\+\'ogr\'\+\'ams\\\'\+\'st\'\+\'art\'\+\'up\'\+\'\\.{29}\.lnk\'\)/ nocase

    condition:
        all of ($c*)
}

rule Mal_Infostealer_Win32_Jupyter_Main_Module
{
    meta:
        description = "Detects Jupter main module"
        author = "BlackBerry Threat Research Team"
        date = "2021-11-23"
        license = "This Yara rule is provided under the Apache License 2.0 (https://www.apache.org/licenses/LICENSE-2.0) and open to any user or organization, as long as you use it under this license and ensure originator credit in any derivative to The BlackBerry Research & Intelligence Team"

    strings:
        $g1 = { 68 00 74 00 74 00 70 00 3A 00 2F 00 2F 00 } // h.t.t.p.:././.
        $g2 = { 5C 00 41 00 50 00 50 00 44 00 41 00 54 00 41 00 5C 00 52 00 4F 00 41 00 4D 00 49 00 4E 00 47 } // \.A.P.P.D.A.T.A.\.R.O.A.M.I.N.G
        $g3 = { 63 00 68 00 61 00 6E 00 67 00 65 00 5F 00 73 00 74 00 61 00 74 00 75 00 73 } // c.h.a.n.g.e._.s.t.a.t.u.s
        $g4 = { 50 00 4F 00 53 00 54 } // P.O.S.T
        $g5 = { 69 00 73 00 5F 00 73 00 75 00 63 00 63 00 65 00 73 00 73 } // i.s._.s.u.c.c.e.s.s
        $g6 = { 75 00 73 00 65 00 72 00 70 00 72 00 6F 00 66 00 69 00 6C 00 65 } // u.s.e.r.p.r.o.f.i.l.e
        $g7 = { 44 00 45 00 53 00 4B 00 54 00 4F 00 50 00 2D } // D.E.S.K.T.O.P.-
        $g8 = { 4C 00 41 00 50 00 54 00 4F 00 50 00 2D } // L.A.P.T.O.P.-
        $g9 = { 78 00 38 00 36} // x.8.6
        $g10 = { 78 00 36 00 34 } // x.6.4
        $g11 = { 41 00 64 00 6D 00 69 00 6E } // A.d.m.i.n
        $g12 = { 56 00 69 00 73 00 74 00 61 } // V.i.s.t.a
        $g13 = { 64 00 6E 00 73 } // d.n.s
        $g14 = { 64 00 7A 00 6B 00 61 00 62 72 } // d.z.k.a.b.r
        $g15 = { 78 00 7A 00 6B 00 61 00 62 00 73 00 72 } // x.z.k.a.b.s.r
        $g16 = { 64 00 7A 00 6B 00 61 00 62 00 73 00 72 } // d.z.k.a.b.s.r

        // Version Strings
        $h1 = { 4F 00 43 00 2D } // O.C.-
        $h2 = { 4E 00 56 00 2D } // N.V.-
        $h3 = { 53 00 50 00 2D } // S.P.-
        $h4 = { 49 00 4E 00 2D } // I.N.-

        $i = "System.Net"

    condition:
        10 of ($g*) and
        1 of ($h*) and
        (pe.imports("mscoree.dll", "_CorDllMain") or $i) // DotNet
}

rule Mal_Infostealer_Win32_Jupyter_InfoStealer_Module
{
    meta:
        description = "Detects Jupter infostealer module"
        author = "BlackBerry Threat Research Team"
        date = "2021-11-08"
        license = "This Yara rule is provided under the Apache License 2.0 (https://www.apache.org/licenses/LICENSE-2.0) and open to any user or organization, as long as you use it under this license and ensure originator credit in any derivative to The BlackBerry Research & Intelligence Team"

    strings:
        $d1 = "WebRequest" nocase
        $d2 = "HttpWebRequest" nocase
        $d3 = "WebResponse" nocase
        $d4 = "GetResponseStream" nocase
        $d5 = "GetResponse" nocase
        $d6 = "IsInRole" nocase
        $d7 = "get_UTF8" nocase
        $d8 = "FromBase64String" nocase
        $d9 = "get_OSVersion" nocase
        $d10 = "GetFiles" nocase
        $d11 = "GetExtension" nocase
        $d12 = "get_Current" nocase
        $d13 = "GetEnumerator" nocase

        $j1 = { 6C 6F 67 69 6E 73 } // logins
        $j2 = { 43 00 6F 00 6F 00 6B 00 69 00 65 00 73 } // C.o.o.k.i.e.s
        $j3 = { 00 6C 00 6F 00 67 00 69 00 6E 00 73 00 2E 00 6A 00 73 00 6F 00 6E 00 } // .l.o.g.i.n.s...j.s.o.n.
        $j4 = { 00 63 00 6F 00 6F 00 6B 00 69 00 65 00 73 00 2E 00 73 00 71 00 6C 00 69 00 74 00 65 00 } // .c.o.o.k.i.e.s...s.q.l.i.t.e.

    condition:
        // DotNet
        pe.imports("mscoree.dll", "_CorDllMain") and
        12 of ($d*) and
        2 of ($j*)
}

rule Mal_Infostealer_Win32_Jupyter_Download_and_Execute_Module
{
    meta:
        description = "Detects Jupter download and execute module. Research has shown it downloading SolarDelphi / JupyterStealer."
        author = "BlackBerry Threat Research Team"
        date = "2021-11-09"
        license = "This Yara rule is provided under the Apache License 2.0 (https://www.apache.org/licenses/LICENSE-2.0) and open to any user or organization, as long as you use it under this license and ensure originator credit in any derivative to The BlackBerry Research & Intelligence Team"

    strings:
        $e1 = { 68 00 74 00 74 00 70 00 3A 00 2F 00 2F 00 }
        $e2 = { 47 00 45 00 54 00 00 3D 63 00 3A 00 5C 00 77 00 69 00 6E 00 64 00 6F 00 77 00 73 00 5C 00 73 00 79 00 73 00 74 00 65 00 6D 00 33 00 32 00 5C 00 77 00 69 00 6E 00 76 00 65 00 72 00 2E 00 65 00 78 00 65 }
        $e3 = { 00 2F 00 67 00 65 00 74 00 2F 00 }
        $e4 = "FromBase64String"
        $e5 = "get_UTF8"
        $e6 = "WebResponse"
        $e7 = "GetResponse"
        $e8 = "Invoke"

    condition:
        // DotNet
        pe.imports("mscoree.dll", "_CorDllMain") and
        dotnet.version == "v4.0.30319" and
        dotnet.assembly.version.major == 0 and
        dotnet.assembly.version.minor == 0 and
        all of ($e*)
}


侵入の痕跡(IOC)

SHA256:

  • dd8e1e321ce70472f9f0681c6e2dc078e7d066d89bc63ca4ae1ac53bee8daac2
  • a772d35e54bcd6790ea99f8723d56872891ef5691ed502a82babc618d2e8a452
  • 0adfbce8a09d9f977e5fe90ccefc9612d1d742d980fe8dc889e10a5778592e4d
  • 0e673eb418c87268aa3bcb262e8e03a3f719a95a8e118ba99515c57c9aa02d38
  • 10221ceffbc7d7e59b17b1968d0fa01c8124efa70d1d5a486e53211e4754a22d
  • 13d34fbf591c2cbf38e60ec3c6d185546e206be61dd58923edc23c4b125ff2f0
  • 161b6f4bc07567c0c6e2e394454a66b8aac2f73212a6cf6c0c82b9fdbdb3fcce
  • 1e7914f799371cbc8560bc52203d3531bb20cb4f6092158c76a4842dbf85dabc
  • 2a051324620943464749234c9b49def385b9f6dd7c30f4caa4d98b3af035bd8f
  • 3303926a6468dab25286a65bb9f3e5883a8938e6501031b3b85e21f182d1ed0d
  • 341881d11fd748a81c8cee584dc42392a564aeb839faf7afa136004701e656c1
  • 38c833c34998c9f4d9266f920c0f0862d986cb434740f99175e32f3f49275eb5

C2 IP:

  • 146.70.24[.]229
  • 23.29.115[.]175
  • 92.204.160[.]110
  • 146.70.41[.]157
  • 37.221.114[.]23
  • 188.241.83[.]61
  • 69.46.15[.]151

C2 の識別子/バージョン:

  • NV-5
  • OC-11
  • OC-1
  • OC-2
  • J13
  • J15
  • J16
  • IN-10
  • NV-1
  • NV-4
  • NV-6
  • OC-3
  • OC-7
  • OC-8
  • OC-9
  • OC-W1
  • SP-10
  • SP-13
  • SP-17
  • SP-18
  • SP-W2

証明書 #1:

  • シリアル番号: 36 FF 67 4E B3 05 E9 9C 35 56 5F A3 01 D5 C4 B0
  • 名前: OOO Sistema
  • 有効期間の開始日: 01:51 PM 12/02/2020
  • 有効期間の終了日: 01:51 PM 12/02/2021
  • サムプリント: C301843CA390AED52C4C6D59EF3D125400F186FB

証明書 #2:

  • シリアル番号: 5B A9 00 D7 A7 61 EE 27 C2 79 98 C8 B9 B4 FA 70
  • 名前: OOO LEVELAP
  • 有効期間の開始日: 11:53 AM 09/14/2021
  • 有効期間の終了日: 11:53 AM 09/14/2022
  • サムプリント: EDEBF26E6CAD49A8F48A11EFF6BFC13266FF6872

証明書 #3:

  • シリアル番号: 6F E7 21 C3 DD BD 27 74 D0 3D CE A4 4A 26 A7 8A
  • 名前: OOO ENDI
  • 有効期間の開始日: 08:17 PM 09/29/2021
  • 有効期間の終了日: 08:17 PM 09/29/2022
  • サムプリント: BC346A6BF6B6D53A69A742A4245A43320980B1C0

証明書 #4::

  • シリアル番号: 7B 44 65 51 DE 53 1A 37 D3 A0 EB FB 8F 0B 6E 01
  • 名前: OOO MVS
  • 有効期間の開始日: 08:19 PM 10/01/2021
  • 有効期間の終了日: 08:19 PM 10/01/2022
  • サムプリント: 691718CA7F85C0D5B89250D685EB52A808A321E5

証明書 #5:

  • シリアル番号: 06 48 7A 92 B1 D9 12 B7 9F 22 91 C0 D3 82 0F 2C
  • 名前: Soto Manufacturing SRL
  • 有効期間の開始日: 12:00 AM 10/04/2021
  • 有効期間の終了日: 11:59 PM 08/04/2023
  • サムプリント: AEE8241A17357D5713C451406BA4D3FBDCC1E25F

証明書 #6:

  • シリアル番号: 0A 54 C6 04 87 D8 38 4E DC E9 81 81 4B E7 67 CB
  • 名前: Decapolis Consulting Inc.
  • 有効期間の開始日: 12:00 AM 10/31/2021
  • 有効期間の終了日: 11:59 PM 10/24/2022
  • サムプリント: BB800B7DE9E457D670303AF12E1940C732CC5975


BlackBerry によるサポート

もしJupyter Infostealer のような脅威にさらされているなら、BlackBerry にお任せください。現在 BlackBerry 製品を利用していなくても問題ありません。

BlackBerry のインシデント対応チームは、世界的に活躍するコンサルタントから構成され、ランサムウェアや持続的標的型攻撃(APT)など、さまざまなインシデントへの対応と封じ込めのサービスを専門としています。

弊社はグローバルコンサルティングチームを常に待機させており、ご希望があれば、24 時間サポートと現地支援を提供できます。次の URL からご相談ください。 https://www.blackberry.com/ja/jp/forms/enterprise/contact-us
 

 

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

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

・サイバーセキュリティチームによるコンサルティング: https://www.blackberry.com/ja/jp/services/blackberry-cybersecurity-consulting/overview

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

The BlackBerry Research and Intelligence Team

About The BlackBerry Research and Intelligence Team

BlackBerry の Research and Intelligence Team は、新たに生じている脅威と持続的な脅威を検証し、セキュリティ担当者とその所属企業のために、インテリジェンス解析を提供しています。