概要
- SharpRhino は、オープンソースプロジェクトThunderShell がベースになっています
- PowerShell スクリプトをドロップする NSIS インストーラとして、被害者にデリバリーされます
- PowerShell スクリプトはエンコードされた .NET アセンブリを含みます
- C2 サーバーとの通信には.NETペイロードを使います
- コマンドをリモートで実行することが可能です
- ネットワークトラフィックは RC4 で暗号化され、Base64 形式でエンコードされます
はじめに
ransomware-as-a-service を展開していることで知られている脅威グループの Hunters International が、新しい RAT マルウェアを使い始めています。このソフトウェアを利用した最初のインシデントは、2024 年 8 月初旬に確認され、C# 言語によるものであることから、SharpRhino と名付けられました。トロイの木馬が、合法的なソフトウェアとして被害者に配信され、被害者のコンピューターへのリモートアクセスを可能にします。このソフトウェアを使用することにより、攻撃者はさまざまなコマンドを実行し、他のマルウェアを伝播させることができます。
技術情報
概要
解析されたサンプルは、Nullsoft Scriptable Install System で構築されたインストーラとして、被害者に配信されています。このファイルは、説明に「Angryip.org」と書かれており、有効なデジタル証明書を有していますが、会社名は偽のものであり、その会社は存在していません。

このインストーラには、マルウェアの実行時に使用される、追加のインストーラ、パスワードで保護されたアーカイブ、および追加のファイルが含まれています。

インストール
実行されると、サンプルは、すべての埋め込みファイルを「C:\ProgramData\Microsoft\WindowsUpdate24」フォルダにドロップし、正規のソフトウェアである Angry IP Scanner のインストーラである、「ipscan-3.9.1-setup.exe」ファイルが実行されます。

ユーザーがこのインストーラに気を取られているあいだに、マルウェアが、パスワードで保護されたアーカイブである UpdateFull.zip からファイルを抽出します。そのあと、SharpRhino はアーカイブを展開するために、埋め込まれていた 7za.exe プログラムを使用します。コマンドラインに、以下のようなアーカイブのパスワードが表示されます。
C:\ProgramData\Microsoft\WindowsUpdate24\7za.exe x C:\ProgramData\Microsoft\WindowsUpdate24\UpdateFull.7z -pTG98HJerxsdqWE45 -oC:\ProgramData\Microsoft\WindowsUpdate24
アーカイブの中身は、以下のとおりです。

ファイルの抽出後に、サンプルは新しいフォルダ「C:\ProgramData\Microsoft\LogUpdateWindows」を作成し、アーカイブから抽出したファイルを新しいフォルダにコピーします。2 つの異なるインストールフォルダを使用することにより、フォルダの 1 つが削除された場合でも、これら 2 つのフォルダにあるファイルの実行プロセスが類似しているため、攻撃者はもう 1 つシステムに長く存続できるようになります。次に、SharpRhino は、「Microsoft.AnyKey.lnk」ファイルにつながる「HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run」パスに、新しいレジストリキーを追加します。このファイルはショートカットであり、以下のターゲットを含んでいます。
C:\ProgramData\Microsoft\LogUpdateWindows\Microsoft.AnyKey.exe abnormal c:\programdata\%username%0 cmd /c C:\ProgramData\Microsoft\LogUpdateWindows\LogUpdate.bat
「Microsoft.AnyKey.exe」も、アーカイブからドロップされた実行ファイルです。Visual Studio 用 Node.js ツールに含まれている真正なプログラムでもあり、「Microsoft.NodejsTools.PressAnyKey.exe」という名前が付けられています。
実行
「LogUpdate.bat」および「WindowsUpdate.bat」ファイルは同じ機能を持っていますが、異なったファイルをロードします。

「Wiaphoh7um.t」および 「kautix2aeX.t」ファイルの両方には、難読化されたデータが含まれています。これらのファイルは生データとキーが異なっていますが、結果として生成されるデータは同じになります。デコード処理後、サンプルはこのデータを .NET アセンブリとして定義し、いくつかのパラメータを使って、1 つの方法を呼び出します。

スクリプトからすべてのデータをダンプした後には、次の変数が確認できます。
$var1、$var2、$var3 変数は、参照アセンブリを決定するもので、連結すると次の文字列を形成します。
System.Drawing.dllSystem.Web.Extensions.dllSystem.Windows.Forms.dll
$var4 はファイルごとに異なっており、C2 サーバーアドレスを含んでいます。以下の表は、各ファイルにおいて .NET アセンブリ呼び出して使用される引数を示しています。

「$fjwZrHB1k2RF」は、メモリにロードされる .NET アセンブリを表します。データのダンプ後には、C# コードを観察できます。PowerShell スクリプトは、「Bzxmlpi」ネームスペースおよび「OyrWkb」クラスから関数を呼び出します。このクラスの開始時には、いくつかの追加のインポートのロードと読み取り不能な変数名を観察することができます。

実際には、このファイルはオープンソースプロジェクト「ThunderShell」の改変バージョンです。このソースプロジェクトには、以下のような変更が加えられています。
- キーロガー、スクリーンショットおよび .NET アセンブリのロード機能、ならびにこれらの機能を表すサーバーコマンドが削除されています
- すべてのクラス、関数、および変数の名前が変更されています
- 引数なしでペイロードが実行ファイルとして実行された場合に使用される、デフォルト値が追加されています

この関数は最初に 16 バイトのランダムな文字列を生成します。Random クラスを初期化するとき、サンプルは現在の日付、時刻および処理 ID をシードとして使用します。次に、COMPUTERNAME、USERDOMAIN および USERNAME などの環境変数を取得します。これらのデータは、以下のようにすべてフォーマットされます。

その結果、次の文字列が生成されます。

次に、サンプルはこの文字列を関数に送り、文字列はサーバーに送信されます。このとき、サンプルは 2 番目の引数として渡されたキーを持つ、RC4 暗号を使用してデータを暗号化します。

暗号化処理後、サンプルは要求にいくつかのデータを追加し、暗号化された文字列も Base64 形式でエンコードします。その後、すべてのデータがサーバーに送られます。

最初の接続では、サーバーからの応答は無視されます。ループに入ると、サンプルは再びサーバーに接続されますが、どちらの引数も「null」となります。次に、応答が保存され、保存されている値と比較されます。「delay」コマンドが受信されると、サンプルは追加の引数を取り、スリープ関数に渡される値が変更されます。「exit」コマンドが取得された場合、ループが中断され、実行が終了します。「delay」 または 「exit」 以外のコマンドを取得した場合、サンプルは、取得したデータを引数として取る関数を使って、新しいスレッドを作成します。これらのアクションは、ループのイテレーションから 95 秒遅れで繰り返されます。

サーバーからの応答は、「UUID」、「ID」、「Data」などのデータを取得および保管している、「zWxFlnVASjHYb」クラスにある、逆シリアル化関数に渡されます。

C2 サーバー
サンプルにあるリンクはすでにオフラインになっていましたが、ソースプロジェクトのサーバーを使用することで、通信がどのように行われているのかは見ることができます。最初に、サーバーの構成を変更する必要があります。これには、サーバーの IP アドレス、暗号化キー、GUI 設定、HTTP および HTTPS の設定などの、いくつかのフィールドが含まれています。次に、「callback-url」、「gui-host」および「encryption-key」パラメータを変更する必要があります。SharpRhino サンプルから、暗号化キーのパラメータを取得します。

サーバーは Python アプリケーションであり、実行中の Redis サーバーが必要となります。起動後、サンプルはサーバーについての情報を出力します。

これには Web GUI アドレスが含まれています。サンプルを開くとき、ユーザーは最初にログインしなければなりません。インプットするユーザー名はどのようなものでもかまいませんが、パスワードは構成ファイルのものを使用しなければなりません。ログインすると、ダッシュボードセクションが表示されます。これには、セッションとログについての情報が含まれています。

ペイロードは、Web GUI で構築することができます。サーバーの IP アドレスとともに、ペイロードのタイプを指定しなければなりません。

セッションを選択すると、攻撃者はそのセッションとインタラクトすることができます。「help」と入力すると、セッション内で使用できる、すべての対応コマンドが表示されます。

C2 コミュニケーション
これらのコマンドには、攻撃者が引数として入力するデータに追加される、事前定義済みの文字列が含まれています。たとえば、「shell [command]」を使用すると、送信される文字列の先頭に「cmd.exe /c」が追加されます。別の例としては、PowerShell スクリプトをクライアントに送信する、「ps」コマンドがあります。

このコマンドは、RC4 で暗号化され、Base64 形式でエンコードされたクライアントに適用されます。これには、ID と UUID という 2 つのパラメータが含まれており、ID はクライアント ID、UUID はコマンド ID となります。

このデータはすべて、新しいスレッドに渡されます。このスレッドの関数は PowerShell モジュールを使って、所定のコマンドを実行します。

パイプラインを使用することにより、サンプルは実行されたコマンドのアウトプットを利用できるようになります。その後、データは暗号化され、サーバーに送り返されます。

結論
最後にアップデートされたのが約4年前という古いオープンソースプロジェクトである ThunderShell を Hunters International が使用して、被害者にマルウェアを配信しました。ThunderShell は、Angry IP Scanner ユーティリティのインストーラとして配信され、悪意のある PowerShell スクリプトをドロップし、実行します。これらのスクリプトは、PowerShell の機能を使ってエンコードされた .NET アセンブリを実行するためコンパイルされた、追加の実行ファイルを配信する必要はなく、悪意のあるコードがメモリ内に呼び出され、実行されます。
オリジナルコードは変更されていますが、ターゲットのシステムでコマンドをリモートで実行するという、その主な機能は維持されています。これが、オープンソースプロジェクトが危険である理由です。これらは通常、教育やペンテストのために開発されているものですが、実際の攻撃にも使用されています。
Acronis による検出

