C# バックドアである Dark Crystal RAT の分析

FireEye Mandiant 脅威インテリジェンス チームは、サイバー攻撃者と彼らが使用するマルウェアを追跡することで、お客様を保護します。 FLARE チームは、マルウェア サンプルをリバース エンジニアリングすることで、脅威インテリジェンスを強化します。最近、FLARE は、脅威インテリジェンス チームから渡された Dark Crystal RAT (DCRat) の新しい C# バリアントに取り組みました。オープン ソース インテリジェンスと以前の作業を確認し、サンドボックス テストを実行し、Dark Crystal RAT をリバース エンジニアリングして、その機能と通信プロトコルを確認しました。このブログ投稿を公開することで、防御者が侵害の兆候やその他の Dark Crystal RAT の明らかな兆候を探すのを支援し、.NET マルウェアを初めて使用するマルウェア研究者や、このサンプルの将来の亜種に遭遇するマルウェア研究者を支援することを目的としています。

Dark Crystal RAT の発見

脅威インテリジェンス チームは FLARE に、Dark Crystal RAT を含み、MD5 ハッシュ b478d340a787b85e086cc951d0696cb1 を持つと考えられる EXE サンプルを提供しました。サンドボックス テストを使用して、このサンプルが 2 つの実行可能ファイルを生成し、それらの 2 つの実行可能ファイルの 1 つがさらに 3 つの実行可能ファイルを生成することがわかりました。図 1 は、サンドボックス テストで発見された悪意のある実行可能ファイル間の関係を示しています。

The first sample we began analyzing ultimately produced five executables
図 1: 分析を開始した最初のサンプルは、最終的に 5 つの実行可能ファイルを生成しました

サンドボックスの結果を利用して、次のステップは各実行可能ファイルのトリアージ分析を実行することでした。元のサンプルと mnb.exe はドロッパーであり、dal.exe はドロップされたファイルを削除するためのクリーンアップ ユーティリティであり、daaca.exe と fsdffc.exe は、既存のレポートを持つファミリーである Plurox の亜種であることがわかりました。次に、最終的にドロップされたサンプルである dfsds.exe の分析に移りました。 @James_inthe_boxによる同じサンプルに関する簡単な公開レポートを見つけ、それが DCRat であり、RAT およびクレデンシャル スティーラーであると特定しました。また、同じサンプルを含むパブリック サンドボックスの実行も見つかりました。他の公開レポートでは DCRat について説明されていましたが、実際には最初のサンプルで DCRat にバンドルされている daaca.exe Plurox コンポーネントを分析しました。

dfsds.exe が詳細な公開レポートを欠いている RAT であることに満足したため、より詳細な分析を実行することにしました。

Dark Crystal RAT の分析

初期分析

サンドボックスから少し離れて、dfsds.exe の静的分析を実行しました。 CFF Explorer を使用して静的分析を開始することにしました。これは、PE ファイルを開き、そのセクションを表示しやすい形式に分解するための優れたツールです。図 2 に示すように、CFF Explorer で dfsds.exe を表示すると、ユーティリティは、それが .NET 実行可能ファイルであることを示しました。これは、ネイティブの C または C++ サンプルの場合とは大きく異なる方法で分析できることを意味していました。インポートする DLL や使用する DLL の機能を確認するなど、ネイティブ サンプルの機能の絞り込みを開始するために他の方法で使用した可能性のある手法では、この .NET サンプルでは有用な結果が得られませんでした。図 3 に示すように、dfsds.exe は mscoree.dll から関数_CorExeMainのみをインポートします。 IDA Pro で dfsds.exe を開くこともできましたが、IDA Pro は通常、.NET サンプルを分析する最も効果的な方法ではありません。実際、無料バージョンの IDA Pro は .NET Common Language Infrastructure (CLI) 中間コードを処理できません。

CFF Explorer は、dfsds.exe が .NET 実行可能ファイルであることを示しています
図 2: dfsds.exe が .NET 実行可能ファイルであることを示す CFF エクスプローラー
dfsds.exe のインポート テーブルは、関数が 1 つしか含まれていないため、役に立ちません。
図 3: dfsds.exe のインポート テーブルは機能が 1 つしかないため役に立たない

dfsds.exe で IDA Pro のような逆アセンブラーを使用する代わりに、.NET 逆コンパイラーを使用しました。リバース エンジニアにとって幸いなことに、逆コンパイラはより高いレベルで動作し、多くの場合、元の C# コードに近いものを生成します。 dnSpy は、優れた .NET 逆コンパイラです。 dnSpy のインターフェイスは、サンプルの名前空間とクラスの階層をアセンブリ エクスプローラーに表示し、選択したクラスのコードを右側に表示します。 dfsds.exe を開くと、dnSpy は、リンク時のサンプルの元の名前が DCRatBuild.exe であり、そのエントリ ポイントが<PrivateImplementationDetails>{63E52738-38EE-4EC2-999E-1DC99F74E08C}.Mainにあることを示しました (図 4 参照)。アセンブリ エクスプローラーを使用して Main メソッドを参照すると、そのメソッドを表す C# に似たコードが図 5 にあることがわかりました。それにアクセスして、そのコードを表示します。コード内の識別子を右クリックし、コンテキスト メニューの [分析] をクリックすると、IDA Pro で相互参照を使用するのと同様に、dnSpy が識別子が使用されているすべての出現箇所を検索するようになりました。

dnSpy は、サンプルのエントリ ポイントを特定するのに役立ちます
図 4: dnSpy は、サンプルのエントリ ポイントを特定するのに役立ちます
dnSpy は Main メソッドを C# のようなコードに逆コンパイルします。
図 5: dnSpy は Main メソッドを C# のようなコードに逆コンパイルします

エントリ ポイント メソッドから呼び出されるSchemaServerManager.Mainメソッドに移動すると、図 6 に示すように、さまざまな整数引数を使用してExporterServerManager.InstantiateIndexerを多数呼び出すことがわかりました。ExporterServerManager.InstantiateIndexerメソッドを参照したところ、多くの goto ステートメントとラベルを持つ巨大な switch ステートメントとして構造化されていること。図 7 に抜粋を示します。 dnSpy は多くの場合、コメントとローカル変数名が失われていますが、元の C# コードの近似値を再構築するため、これは典型的な dnSpy 出力のようには見えません。このコード構造は、コードがCipherMode.CBC定数を参照しているという事実と相まって、 ExporterServerManager.InstantiateIndexerが復号化または難読化解除ルーチンである可能性があると考えさせられました。したがって、dfsds.exe は難読化されている可能性があります。幸いなことに、.NET 開発者は、自動化された手段によってある程度元に戻すことができる難読化ツールをよく使用します。

SchemaServerManager.Main は、ExporterServerManager.InstantiateIndexer に対して多くの呼び出しを行います
図 6: SchemaServerManager.Main は ExporterServerManager.InstantiateIndexer に対して多くの呼び出しを行います
ExporterServerManager.InstantiateIndexer は難読化解除ルーチンである可能性があります
図 7: 難読化解除ルーチンのように見える ExporterServerManager.InstantiateIndexer
難読化解除

De4dot は、多くの種類の難読化を元に戻す方法を知っている .NET 難読化解除ツールです。 dfsds.exe で de4dot -d (検出用) を実行すると (図 8)、難読化に .NET Reactor が使用されたことがわかりました。

> de4dot -d dfsds.exe

de4dot v3.1.41592.3405 Copyright (C) 2011-2015 de4dot@gmail.com
最新バージョンとソースコード: https://github.com/0xd4d/de4dot

検出された .NET Reactor (C:…dfsds.exe)

図 8: .NET Reactor で難読化された dfsds.exe

de4dot が dfsds.exe の難読化を解除できることを確認した後、de4dot を再度実行して、サンプルを dfsds_deob.exe ファイルに難読化解除しました (図 9)。

> de4dot -f dfsds.exe -o dfsds_deob.exe

de4dot v3.1.41592.3405 Copyright (C) 2011-2015 de4dot@gmail.com
最新バージョンとソースコード: https://github.com/0xd4d/de4dot

検出された .NET Reactor (C:UsersuserDesktopintelfirstdfsds.exe)
C:UsersuserDesktopintelfirstdfsds.exe のクリーニング
難読化されたすべてのシンボルの名前を変更する
C:UsersuserDesktopintelfirstdfsds_deob.exe を保存しています

図 9: de4dot が dfsds.exe の難読化解除に成功

dfsds.exe の難読化を解除した後、結果の dfsds_deob.exe に対して dnSpy を再度実行しました。 SchemaServerManager.Mainを再度逆コンパイルすると、図 10 に示すように、結果は大きく異なります。新しい出力を、前に図 6 に示した難読化されたバージョンと比較すると、難読化が解除されたコードの方がはるかに読みやすいことがわかりました。難読化が解除されたバージョンでは、 ExporterServerManager.InstantiateIndexerへのすべての呼び出しが削除されました。どうやら文字列のデコード ルーチンだったようです。対照的に、アセンブリ エクスプローラーに表示されるクラス名は変更されていません。難読化ツールは、元のクラス名を標準リストから取得した意味のない名前に取り返しのつかないほど置き換えたに違いありません。次に、図 10 の 10 行が base64 でエンコードされたデータを保持していることに注目しました。サンプルの難読化が正常に解除されたら、その構成の抽出に進み、永続化機能と初期ビーコンへのサンプルのコード パスをたどります。

dfsds.exe の難読化を解除すると、メソッドが何らかのパス操作で始まり、Base64 でエンコードされたデータにアクセスすることが示されます
図 10: dfsds.exe の難読化を解除すると、メソッドが何らかのパス操作で始まり、Base64 でエンコードされたデータにアクセスすることが示されます
構成、永続性、初期ビーコン

図 10 を思い出してください。メソッドSchemaServerManager.Mainには、Base64 でエンコードされたデータを含むローカル変数があります。そのデータを解読すると、その内容が明らかになりました。図 11 は、デコードされた構成を示しています (C2 エンドポイント URL のファンクが解除されています)。

> エコー TUhvc3Q6aHR0cDovL2RvbWFsby5vbmxpbmUva3NlemJseGx2b3Uza2NtYnE4bDdoZjNmNGN5NXhnZW
80dWRsYTkxZHVldTNxYTU0LzQ2a3FianZ5a2x1bnAxejU2dHh6a2hlbjdnamNpM2N5eDhnZ2twdHgy
NWk3NG1vNm15cXB4OWtsdnYzL2FrY2lpMjM5bXl6b24weHdqbHhxbm4zYjM0dyxCSG9zdDpodHRwOi
8vZG9tYWxvLm9ubGluZS9rc2V6Ymx4bHZvdTNrY21icThsN2hmM2Y0Y3k1eGdlbzR1ZGxhOTFkdWV1
M3FhNTQvNDZrcWJqdnlrbHVucDF6NTZ0eHpraGVuN2dqY2kzY3l4OGdna3B0eDI1aTc0bW82bXlxcH
g5a2x2djMvYWtjaWkyMzlteXpvbjB4d2pseHFubjNiMzR3LE1YOkRDUl9NVVRFWC13TGNzOG8xTlZF
VXRYeEo5bjl5ZixUQUc6VU5ERUY= | base64 -d

MHost:hxxp://domalo[.]online/ksezblxlvou3kcmbq8l7hf3f4cy5xgeo4udla91dueu3qa54/
46kqbjvyklunp1z56txzkhen7gjci3cyx8ggkptx25i74mo6myqpx9klvv3/akcii239myzon0xwjl
xqnn3b34w,BHost:hxxp://domalo[.]online/ksezblxlvou3kcmbq8l7hf3f4cy5xgeo4udla91
dueu3qa54/46kqbjvyklunp1z56txzkhen7gjci3cyx8ggkptx25i74mo6myqpx9klvv3/akcii2
myzon0xwjlxqnn3b34w,MX:DCR_MUTEX-wLcs8o1NVEUtXxJ9n9yf,TAG:UNDEF

図 11: SchemaServerManager.Main の base64 データをデコードすると、構成文字列が明らかになります

図 11 は、MHost、BHost、MX、および TAG の 4 つの値を含む構成文字列にデコードされたデータを示しています。この文字列を解析するコードを分析したところ、MHost と BHost がメインおよびバックアップのコマンド アンド コントロール (C2) エンドポイントとして使用されていることがわかりました。図 11 の MHost と BHost の値は同じであるため、このサンプルにはバックアップ C2 エンドポイントがありませんでした。

dnSpy では、IDA Pro で識別子に名前を付けることができるのと同様に、クラスとメソッドに意味のある名前を付けることができます。たとえば、メソッドSchemaServerManager.StopCustomerは、ランダムに実行中のプロセスの名前を選択します。図 12 に示すように、 StopCustomer識別子を右クリックして [メソッドの編集] を選択すると、メソッド名をPickRandomProcessNameに変更できます。

メソッドに意味のある名前を割り当てると、プログラムの分析を続けやすくなります
図 12: メソッドに意味のある名前を割り当てると、プログラムの分析を続けやすくなります

SchemaServerManager.Mainメソッドの分析を続けると、再起動後もサンプルが持続することが明らかになりました。永続化アルゴリズムは、次のように要約できます。

  1. マルウェアは、実行中のプロセスの名前をランダムに選択し、自分自身を%APPDATA%C:にコピーします。たとえば、svchost.exe が選択されている場合、マルウェアは自身を%APPDATA%svchost.exeおよびC:svchost.exeにコピーします。
  2. マルウェアは、 %APPDATA %の下にあるマルウェアのコピーを指すショートカット%APPDATA%dotNET.lnkを作成します。
  3. マルウェアは、ログオンしたユーザーの Startup フォルダーに%APPDATA%dotNET.lnkを指す dotNET.lnk という名前のショートカットを作成します。
  4. このマルウェアは、C: の下にあるマルウェアのコピーを指すショートカットC:Sysdll32.lnkを作成します。
  5. マルウェアは、ログオンしたユーザーの Startup フォルダーに Sysdll32.lnk という名前のショートカットを作成し、 C:Sysdll32.lnkをポイントします。
  6. マルウェアは、 %APPDATA%dotNET.lnkを指すレジストリ値HKCUSoftwareMicrosoftWindowsCurrentVersionRunscrssを作成します。
  7. マルウェアは、 C: Sysdll32.lnk を指すレジストリ値HKCUSoftwareMicrosoftWindowsCurrentVersionRunWininitを作成します。

永続化手順の後、マルウェアはマルウェアの複数のインスタンスをチェックします。

  1. マルウェアは、5 秒から 7 秒の間のランダムな間隔でスリープします。
  2. マルウェアは、まだ base64 でエンコードされている構成文字列の MD5 ハッシュを取得し、そのハッシュを 16 進数で表現した名前のミューテックスを作成します。このサンプルでは、マルウェアはミューテックスbc2dc004028c4f0303f5e49984983352を作成します。別のインスタンスが実行されているためにこれが失敗した場合、マルウェアは終了します。

次に、マルウェアはビーコンを送信します。これにより、メイン ホスト (MHost) とバックアップ ホスト (BHost) のどちらを使用するかを決定することもできます。そのために、マルウェアは MHost URL に基づいてビーコン URL を作成し、ビーコン URL にリクエストを送信してから、サーバーが HTTP レスポンス ボディ「ok」で応答するかどうかを確認します。サーバーがこの応答を送信しない場合、マルウェアは無条件に BHost を使用します。このコードを図 13 に示します。このサンプルでは MHost と BHost の値が同じであるため (図 11 から)、チェックの成功または失敗に関係なく、マルウェアは同じ C2 エンドポイントを使用することに注意してください。

マルウェアは、MHost URL に基づいて HTTP リクエストを作成し、MHost と BHost のどちらを使用するかを決定します。
図 13: マルウェアは、MHost URL に基づいて HTTP リクエストを作成し、MHost と BHost のどちらを使用するかを決定します。

ビーコン URL を取得する完全なアルゴリズムは次のとおりです。

  1. MHost URL を取得します。つまり、 hxxp://domalo[.]online/ksezblxlvou3kcmbq8l7hf3f4cy5xgeo4udla91dueu3qa54 です。
    /46kqbjvyklunp1z56txzkhen7gjci3cyx8ggkptx25i74mo6myqpx9klvv3/akcii239my
    zon0xwjlxqnn3b34w
    .
  2. 完全な MHost URL の SHA1 ハッシュ、つまり 56743785cf97084d3a49a8bf0956f2c744a4a3e0 を計算します。
  3. MHost URL から最後のパス コンポーネントを削除し、上記の SHA1 ハッシュと ?data=active を追加します。したがって、完全なビーコン URL はhxxp://domalo[.]online/ksezblxlvou3kcmbq8l7hf3f4cy5xgeo4udla91dueu3qa54 です。
    /46kqbjvyklunp1z56txzkhen7gjci3cyx8ggkptx25i74mo6myqpx9klvv3/56743785cf
    97084d3a49a8bf0956f2c744a4a3e0.php?data=active
    .

ビーコンの後、マルウェアは構成された C2 でメッセージの送受信を開始します。

メッセージと機能

dfsds.exe の静的解析を実行して C2 エンドポイントを選択する方法を特定し、C2 エンドポイントの URL を確認した後、サンプルの C2 トラフィックを収集し、C2 メッセージを生成して受け入れるコードを理解しやすくするために、動的解析に移行しました。幸運なことに、サーバーが有効な応答を送信しなくても、マルウェアは C2 エンドポイントへの要求を生成し続けます。マルウェアのインターネット アクセスを許可せずに、C2 エンドポイント (domalo[.]online) へのリクエストをリッスンして傍受するために、 FLARE の FakeNet-NG ツールを使用しました。図 14 は、マルウェアが作成した C2 リクエストの一部が FakeNet-NG によってキャプチャされたことを示しています。

FakeNet-NG は、C2 エンドポイントへのマルウェアの HTTP リクエストをキャプチャできます
図 14: FakeNet-NG は、C2 エンドポイントへのマルウェアの HTTP リクエストをキャプチャできます

マルウェアによって生成され、FakeNet-NG でキャプチャされたメッセージをマルウェアの逆コンパイルされたコードと比較することで、メッセージの形式と種類を特定しました。図 14 に表示されている最後の HTTP 要求に、実行中のプロセスのリストが含まれていることに注意してください。逆コンパイルされたコードをトレースすると、メソッドSchemaServerManager.ObserverWatcher.NewMerchantがこのメッセージを生成したことがわかりました。このメソッドの名前を taskThread に変更し、それが呼び出す他のメソッドに意味のある名前を割り当てました。このメソッドの結果のコードを図 15 に示します。

実行中のプロセスのリストを生成して C2 エンドポイントに送信するメソッド
図 15: 実行中のプロセスのリストを生成して C2 エンドポイントに送信するメソッド

コードをさらに分析することで、マルウェアがデータを C2 エンドポイントに送信するために使用した URL のコンポーネントと、その構成方法を特定しました。

ビーコン

最初のタイプの URL はビーコンで、マルウェアの起動時に 1 回だけ送信されます。このサンプルでは、ビーコン URL は常に hxxp://domalo[.]online/ksezblxlvou3kcmbq8l7hf3f4cy5xgeo4udla91dueu3qa54/46kqbjvyklunp1z56txzk でした。
hen7gjci3cyx8ggkptx25i74mo6myqpx9klvv3/<hash>.php?data=active、ここで <hash> は、前述のように MHost URL の SHA1 ハッシュです。

GET 要求、形式 1

マルウェアが C2 との間でデータを送受信する必要がある場合、メッセージを送信します。 「フォーマット 1」と呼ぶ最初のタイプのメッセージは、 hxxp://domalo[.]online/ksezblxlvou3kcmbq8l7hf3f4cy5xgeo4udla91dueu3qa54/46kqbの形式の URL への GET リクエストです。
jvyklunp1z56txzkhen7gjci3cyx8ggkptx25i74mo6myqpx9klvv3/akcii239myzon0xwjlxqnn
3b34w/ <ハッシュ> .php? type=__ds_setdata&__ds_setdata_user= <user_hash> &__ds_setdata_ext= <message_hash> &__ds_setdata_data= <message>
、ここで:

  • <hash>MD5(SHA1(MHost))で、このサンプルでは212bad81b4208a2b412dfca05f1d9fa7です。
  • <user_hash>は、マルウェアが実行されているマシンの一意の識別子です。 .NET System.Environment クラスによって提供されるように、常にSHA1(OS_version + machine_name + user_name)として計算されます。
  • <message_hash>は、マルウェアが C2 エンドポイントに送信しているメッセージの種類を識別します。 <message_hash>MD5(<message_type> + <user_hash>)として計算されます。ここで、 <message_type>はメッセージのタイプを識別する短いキーワードで、 <user_hash>は上記で計算されたとおりです。
    • <message_type> の値は、マルウェアがサポートするコマンドごとに存在します。可能な値については、図 19 に示すコード サンプルの「msgs」変数を参照してください。
    • <user_hash>が含まれているためマシンごとに異なるため、ログ トラフィックからメッセージ タイプを視覚的に観察したり、メッセージ タイプの静的ネットワーク署名を記述したりすることが困難になることに注意してください。
    • メッセージの 1 つのタイプは、 <message_hash>のハッシュの代わりに値 u を使用します。
  • <message>はメッセージ データであり、決して隠蔽されていません。

もう 1 つのタイプの通常のメッセージはgetdataメッセージです。これらは、 hxxp://domalo[.]online/ksezblxlvou3kcmbq8l7hf3f4cy5xgeo4udla91dueu3qa54/46kqbの形式の URL への GET リクエストです。
jvyklunp1z56txzkhen7gjci3cyx8ggkptx25i74mo6myqpx9klvv3/akcii239myzon0xwjlxqnn
3b34w/ <ハッシュ> .php? type=__ds_getdata&__ds_getdata_user= <user_hash> &__ds_getdata_ext= <message_hash> &__ds_getdata_key= <key>
、ここで:

  • <hash><user_hash>は、上記の getdata メッセージの説明に従って計算されます。
  • <message_hash>も getdata メッセージについて上記で説明したように計算されますが、サーバーの応答でマルウェアが受信することを期待しているメッセージのタイプを記述します。
  • <key>MD5(<user_hash>)です。

サーバーは、 <message_hash>で指定されたメッセージのタイプに適した応答でgetdataメッセージに応答することが期待されています。

GET 要求、形式 2

マルウェアから C2 へのいくつかのタイプのメッセージは、「フォーマット 2」と呼ばれる別のフォーマットを使用します。これらのメッセージは、 hxxp://domalo[.]online /ksezblxlvou3kcmbq8l7hf3f4cy5xgeo4udla91dueu3qa54/46kqbjvyklunp1z56txzkhen7gjの形式の GET リクエストです。
ci3cyx8ggkptx25i74mo6myqpx9klvv3/akcii239myzon0xwjlxqnn3b34w/ <user_hash> . <メス
sage_hash>
、ここで:

  • <user_hash>は、上記の getdata メッセージの説明に従って計算されます。
  • <message_hash>も getdata メッセージについて上記で説明したように計算されますが、サーバーの応答でマルウェアが受信することを期待しているメッセージのタイプを記述します。 <message_hash>は文字列commの場合もあります。

表 1 は、形式 2 メッセージの一部として<message_hash>に組み込まれる可能性のある<message_types>を示しており、どのタイプの応答が必要かをサーバーに指示します。フォーマット 1 のメッセージとは対照的に、フォーマット 2 のメッセージは少数の<message_type>値にのみ使用されます。

<メッセージの種類>

回答希望

s_comm

スクリーンショットのリクエストが保留中の場合、サーバーは空でないレスポンスを送信します

m_comm

マイクのリクエストが保留中の場合、サーバーは空でないレスポンスを送信します

RDK

サーバーはキーストロークで直接応答して再生します

通信

サーバーは他のタイプのタスクで直接応答します

表 1: マルウェアが特別なメッセージを使用してサーバーにタスクを要求するときのメッセージの種類

POST リクエスト

マルウェアが大きなファイルをアップロードする必要がある場合、POST 要求を行います。これらの POST リクエストはhxxp://domalo[.]online/ksezblxlvou3kcmbq8l7hf3f4cy5xgeo4udla91dueu3qa54/46kqbに送信されます
jvyklunp1z56txzkhen7gjci3cyx8ggkptx25i74mo6myqpx9klvv3/akcii239myzon0xwjlxqnn
3b34w/<hash>.php
、POST データに次のパラメーターを使用:

  • 名前<user_hash> + “.” です。 + <message_type><user_hash>は上記のように計算され、 <message_type>はアップロードされるデータのタイプです。
  • アップロードは、サーバーに送信されるデータを含むファイルです。

表 2 は、可能な<message_type>値と、アップロードされるファイルのタイプを示しています。

<メッセージの種類>

ファイルの種類

jpg

スクリーンショット

zipstealerログ

Cookie スティーラーのログ

wav

マイク録音

ファイル

アップロードされたファイル

bmp

ウェブカメラ画像

RD.jpg

リモコンのスクリーンショット

表 2: ファイルがサーバーにアップロードされるときのメッセージの種類

機能

通信メッセージ (形式 2) への応答を処理するコードを分析することで、マルウェアの機能を一覧表示することができました。表 3 に、応答で使用されるキーワードと、各機能の説明を示します。

キーワード

説明

シェル

シェルコマンドを実行する

すべて削除

C:、D:、F:、および G: からすべてのファイルを再帰的に削除します。

閉じる

CD-ROM ドライブのドアを閉じます

設定壁紙

背景の壁紙を変更する

ddos

特定のホストまたは IP アドレスに TCP および UDP パケットを送信する

ログオフ

現在のユーザーをログオフする

キーボードレコーダー

ユーザーが入力したかのようにキーストロークを再生する

fm_newfolder

新しいフォルダを作成する

fm_rename

ファイルの名前変更または移動

デスクトップ非表示

デスクトップ アイコンを非表示にする

キーロガー開始

キーストロークの記録を開始する

exec_cs_code

C# コードをコンパイルして実行する

メッセージボックス

Windows メッセージ ボックスを開く

fm_upload

C2 からクライアントにファイルを転送する

rdp

管理者として実行しているマルウェアを再生成する

fm_zip

ディレクトリ ツリーから ZIP ファイルを作成し、クライアントから C2 に転送します。

ウェブカメラ

ウェブカメラの写真を撮る

fm_unzip

クライアント上の指定されたパスに ZIP ファイルを解凍します

キーロガーストップ

キーストロークのログ記録を停止する

fm_drives

ドライブ文字を列挙する

クッキースティーラー

Cookie とブラウザ/FileZilla に保存された資格情報を C2 に転送する

fm_delete

特定のディレクトリを再帰的に削除する

ディモン

デスクトップ アイコンとタスクバーを非表示にする

fm_uploadu

C2 からクライアントにファイルを転送する

タスク開始

プロセスを開始する

クリアデスクトップ

画面を回転

液晶

シェル コマンドを実行し、標準出力を C2 に送り返します

タスクバー表示

タスクバーを表示

クリップボード

クリップボードの内容を設定する

cookietealer_file

Cookie と資格情報をローカル ファイルに保存する

新しいユーザーパス

新しいローカル ユーザー アカウントを作成する

ビープ

設定された頻度と持続時間のビープ音

話す

音声合成を使用してテキストを読み上げます

オープンチャット

チャットウィンドウを開く

タスクバー非表示

タスクバーを隠す

RDStart

ユーザーのデスクトップでリモート コントロールを開始する

密談

チャット ウィンドウを閉じる

RDストップ

ユーザーのデスクトップに対するリモート コントロールを停止する

fm_opendir

ディレクトリの内容を一覧表示する

アンインストール

クライアントからマルウェアを削除する

タスクキル

プロセスを強制終了する

フォークボム

cmd.exe のインスタンスを際限なく生成する

fm_get

クライアントから C2 にファイルを転送する

デスクトップ表示

デスクトップ アイコンを表示する

クリップボードget

クリップボードの内容を C2 に転送する

playaudiourl

サウンドファイルを再生する

opencd

CD-ROM ドライブのドアを開けます

シャットダウン

マシンをシャットダウンします

再起動

マシンを再起動します

ブラウズ URL

デフォルトのブラウザーで Web URL を開く

表 3: DCRat の機能

概念実証の Dark Crystal RAT サーバー

Dark Crystal RAT からその機能と C2 メッセージ形式に関する情報を収集した後、機能を説明し、メッセージの理解をテストするもう 1 つの方法は、概念実証サーバーを作成することでした。以下は、 Python で記述されたベアボーン DCRat サーバーを含むコード スニペットです。実際の RAT サーバーとは異なり、このサーバーには、攻撃者がコマンドを選択して起動できるようにするためのユーザー インターフェイスがありません。代わりに、RAT に送信する事前にスクリプト化されたコマンド リストがあります。

サーバーが起動すると、Python BaseHTTPServer を使用して着信 Web 要求のリッスンを開始します (166 ~ 174 行目)。着信 POST 要求は、RAT がサーバーにアップロードしているファイルを保持していると見なされます。このサーバーは、すべてのファイルのアップロードがスクリーンショットであると想定し、それらを「screen.png」に保存します (140 ~ 155 行目)。 GET 要求の場合、サーバーはビーコン、通常のメッセージ、特別なメッセージを区別する必要があります (123 ~ 138 行目)。通常のメッセージの場合、 __ds_setdataメッセージは単純に標準出力に出力されますが、サポートされている唯一の__ds_getdataメッセージ タイプはs_comm (スクリーンショット通信) であり、サーバーは必要なスクリーンショットのサイズ (63 ~ 84 行目) で応答します。 comm タイプのメッセージの場合、サーバーは 4 種類のコマンドを順番に送信します。まず、デスクトップ アイコンを非表示にします。次に、「こんにちは、テクニカル サポートです」という文字列が読み上げられます。次に、パスワードを要求するメッセージ ボックスを表示します。最後に、Windows Calculator を起動します (86 ~ 121 行目)。

図 16 は、すべてのトラフィックを domalo[.]online から作成した概念実証サーバーにリダイレクトするように構成されたシステムで Dark Crystal RAT を実行した場合の結果を示しています。

Dark Crystal RAT インスタンスが概念実証サーバーと通信したときの結果
図 16: Dark Crystal RAT インスタンスが概念実証サーバーと通信したときの結果

その他の作業と偵察

Dark Crystal RAT のリバース エンジニアリングを行った後、さらに偵察を続けて、どのような追加情報を見つけられるかを確認しました。私たちの分析の制限の 1 つは、サンプルが実際の C2 と通信できないようにしたかったため、インターネットから分離したままにしたことです。 Dark Crystal RAT について詳しく知るために、私たちは 2 つの方法を試しました。1 つ目は、Tor を使用して Dark Crystal RAT の Web サイト (files.dcrat[.]ru) を閲覧することでした。 「本物の」Dark Crystal RAT サーバー。

Dark Crystal RAT Web サイト

図 17 に示すように、Dark Crystal RAT の Web サイトが files.dcrat[.]ru にあることがわかりました。RAT 自体といくつかのプラグインをダウンロードするオプションがあることに注意してください。 DCLIB 拡張機能は、RAT で見つかったプラグイン読み込みコードと一致しています。

files.dcrat[.]ru という Web サイトでは、ユーザーが Dark Crystal RAT とそのプラグインの一部をダウンロードできます。
図 17: Web サイト files.dcrat[.]ru では、ユーザーは Dark Crystal RAT とそのプラグインの一部をダウンロードできます

図 18 は、仮想マシンでの実行を阻止し、Windows Defender を無効にし、特定のモデルで Web カメラ ライトを無効にする機能を備えたプラグインを含む、いくつかの追加のプラグインを示しています。調査したサンプルには、プラグインはバンドルされていませんでした。

Dark Crystal RAT Web サイトにリストされている追加のプラグイン
図 18: Dark Crystal RAT Web サイトにリストされている追加のプラグイン

図 19 に、RAT ページのソフトウェア ダウンロードを示します。これらのファイルを確認するのに時間がかかりました。ここに私たちが発見したいくつかの興味深いものがあります:

  • Web サイトにリストされている DCRat は、実際には、RAT のビルドと、攻撃者が展開する構成をパッケージ化する「ビルダー」です。これは、図 4 に示した DCRatBuild.exe という名前と一致しています。ビルダーの簡単なテストでは、ライセンス チェックが行われていることがわかりました。後で示すように、運用中の DCRat ビルダーの公開 YouTube ビデオを見つけた後は、バイパスを追求しませんでした。
  • DarkCrystalServer は自己完結型ではなく、ユーザーがユーザー名とパスワードを入力できるようにする単なる PHP ファイルであり、サーバー ソフトウェアをダウンロードしてインストールします。認証情報を提供し、dcrat[.]ru と通信する必要があるため (図 20)、DarkCrystalServer の詳細な分析は行いませんでした。
RAT ページには、RAT、サーバー、API、およびプラグイン開発用のソフトウェアがリストされています。
図 19: RAT ページには、RAT、サーバー、API、およびプラグイン開発用のソフトウェアが一覧表示されます
DarkCrystalServer はユーザー名とパスワードを要求し、dcrat[.]ru にコールバックしてソフトウェアをダウンロードするため、それ以上は追求しませんでした。
図 20: DarkCrystalServer はユーザー名とパスワードを要求し、dcrat[.]ru にコールバックしてソフトウェアをダウンロードするため、それ以上は追求しませんでした
ユーチューブの動画

リバース エンジニアリングによって取得した Dark Crystal RAT 機能に関する調査結果を確認する一環として、DCRat ビルダーとサーバーの YouTube デモをいくつか見つけました。

YouTube ユーザーのLIKARは、 Dark Crystal RAT の YouTube デモを行っています。著者は、2 つのアクティブな RAT インスタンスを持つサーバーで Dark Crystal RAT ソフトウェアを使用する方法を示します。ビデオの間、作成者はソフトウェアのさまざまな画面をブラウズします。これにより、サイバー脅威が RAT をどのように使用するかを容易に想像し、RAT がどのように機能するかについての疑惑を確認することが容易になりました。

図 21 は、ビデオの3:27のキャプチャを示しています。 Dark Crystal RAT ビルダー ソフトウェアは、DCRatBuild パッケージをクライアントではなく「サーバー」と呼ぶことに注意してください。それにもかかわらず、オプションの 1 つが Java または C# (ベータ) のタイプであることに注意してください。この YouTube ビデオを見て、追加の背景調査を行った結果、Dark Crystal RAT が以前から Java バージョンに存在していたことがわかりました。 C# のバージョンは比較的新しいものです。これは、それに関する詳細な事前報告が見つからなかった理由を説明しています.

YouTube のデモンストレーションにより、Dark Crystal RAT は以前は Java バージョンに存在し、分析した C# バージョンはベータ版であることが明らかになりました
図 21: YouTube のデモンストレーションにより、Dark Crystal RAT は以前は Java バージョンに存在し、分析した C# バージョンはベータ版であることが明らかになりました

図 22 は、ビデオの 6:28 からの別のキャプチャを示しています。画面に表示される機能は、「msgbox」、「browseurl」、「clipboard」、「speak」、「opencd」、「closecd」、および表 6 で発見および列挙したその他の機能とうまく一致しています。

YouTube のデモンストレーションでは、リバース エンジニアリングで見つかった多くの Dark Crystal RAT 機能が確認されました。
図 22: YouTube のデモンストレーションで、リバース エンジニアリングで見つかった多くの Dark Crystal RAT 機能が確認されました

結論

この投稿では、脅威インテリジェンス チームから提供されたサンプルとそのすべてのコンポーネントの分析について説明しました。最初のトリアージで、その「dfsds.exe」コンポーネントが Dark Crystal RAT であることがわかりました。 Dark Crystal RAT が .NET 実行可能ファイルであることを発見し、それをリバース エンジニアリングしました。マルウェアの構成を抽出し、動的分析により、その C2 通信の構文を発見しました。小規模な概念実証サーバーを実装して、マルウェアに送信できるコマンドの正しい形式と、アップロードされたスクリーンショットを解釈する方法をテストしました。最後に、実際の攻撃者が Dark Crystal RAT をダウンロードして使用する方法をもう一度調べました。

最後に、このバージョンの Dark Crystal RAT (MD5: 047af34af65efd5c6ee38eb7ad100a01) の侵害の指標を表 4 に示します。

侵害の痕跡

ダーク クリスタル RAT (dfsds.exe)

成果物を処理する

ミューテックス名

bc2dc004028c4f0303f5e49984983352

レジストリ アーティファクト

レジストリ値

HKCUSoftwareMicrosoftWindowsCurrentVersionRunscrss

レジストリ値

HKCUSoftwareMicrosoftWindowsCurrentVersionRunWininit

ファイル システムのアーティファクト

ファイル

C:Sysdll32.lnk

ファイル

%APPDATA%dotNET.lnk

ファイル

スタート メニュープログラムスタートアップSysdll32.lnk

ファイル

スタート メニュープログラムスタートアップdotNET.lnk

ファイル

%APPDATA%<ランダムなプロセス名>.exe

ファイル

C:<ランダムなプロセス名>.exe

ネットワーク アーティファクト

HTTP リクエスト

hxxp://domalo[.]online/ksezblxlvou3kcmbq8l7hf3f4cy5xgeo4udla91due
u3qa54/46kqbjvyklunp1z56txzkhen7gjci3cyx8ggkptx25i74mo6myqpx9kl
vv3/212bad81b4208a2b412dfca05f1d9fa7.php?data=active

HTTP リクエスト

hxxp://domalo[.]online/ksezblxlvou3kcmbq8l7hf3f4cy5xgeo4udla91due
u3qa54/46kqbjvyklunp1z56txzkhen7gjci3cyx8ggkptx25i74mo6myqpx9kl
vv3/akcii239myzon0xwjlxqnn3b34w212bad81b4208a2b412dfca05f1d9f
a7.php? type=__ds_getdata&__ds_getdata_user=<user_hash>&__ds_getdata_ex
t=<メッセージ_ハッシュ>&__ds_getdata_key=<キー>

HTTP リクエスト

hxxp://domalo[.]オンライン/ksezblxlvou3kcmbq8l7hf3f4cy5xgeo4udla91dueu3qa54/46kqbjvyklunp
1z56txzkhen7gjci3cyx8ggkptx25i74mo6myqpx9klvv3/akcii239myzon0xw
jlxqnn3b34w/<ユーザーのハッシュ>.<メッセージのハッシュ>

TCP 接続

ドマロ[.]オンライン:80

TCP 接続

ipinfo[.]ip

DNS ルックアップ

ドマロ[.]オンライン

DNS ルックアップ

ipinfo[.]ip

ストリングス

静的文字列

DCRatBuild

表 4: DCRat のこのインスタンスの IoC

Dark Crystal RAT の FireEye 製品サポート

表 5 に、FireEye 製品が初期サンプル (MD5: b478d340a787b85e086cc951d0696cb1) とその Dark Crystal RAT ペイロードにどのように反応するか、または Mandiant Security Validation の場合、関係者が Dark Crystal RAT を検出する独自の機能を検証できるようにする方法を示します。

ファイアアイ製品

Dark Crystal RAT のサポート

FireEye ネットワーク セキュリティ (NX)

Backdoor.Plurox の検出

FireEye メール セキュリティ (EX & ETP)

Backdoor.MSIL.DarkCrystal、Backdoor.Plurox、Malware.Binary.exe、Trojan.Vasal.FEC3、Win.Ransomware.Cerber-6267996-1、fe_ml_heuristic 検出

FireEye エンドポイント セキュリティ (HX)

Trojan.GenericKD.32546165、Backdoor.MSIL.DarkCrystal の検出

FireEye マルウェア分析 (AX)

Backdoor.Plurox.FEC2 検出

FireEye ディテクション オン デマンド (DoD)

Backdoor.Plurox.FEC2、FireEye.Malware 検出

Mandiant のセキュリティ検証

組み込みアクションは近日公開予定

表 5:Dark Crystal RAT の検出または検出機能の検証に対する FireEye 製品のサポート

参考: https ://www.mandiant.com/resources/blog/analyzing-dark-crystal-rat-backdoor

コメント

タイトルとURLをコピーしました