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 は、サンドボックス テストで発見された悪意のある実行可能ファイル間の関係を示しています。
サンドボックスの結果を利用して、次のステップは各実行可能ファイルのトリアージ分析を実行することでした。元のサンプルと 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) 中間コードを処理できません。
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 が識別子が使用されているすべての出現箇所を検索するようになりました。
エントリ ポイント メソッドから呼び出されるSchemaServerManager.Mainメソッドに移動すると、図 6 に示すように、さまざまな整数引数を使用してExporterServerManager.InstantiateIndexerを多数呼び出すことがわかりました。ExporterServerManager.InstantiateIndexerメソッドを参照したところ、多くの goto ステートメントとラベルを持つ巨大な switch ステートメントとして構造化されていること。図 7 に抜粋を示します。 dnSpy は多くの場合、コメントとローカル変数名が失われていますが、元の C# コードの近似値を再構築するため、これは典型的な dnSpy 出力のようには見えません。このコード構造は、コードがCipherMode.CBC定数を参照しているという事実と相まって、 ExporterServerManager.InstantiateIndexerが復号化または難読化解除ルーチンである可能性があると考えさせられました。したがって、dfsds.exe は難読化されている可能性があります。幸いなことに、.NET 開発者は、自動化された手段によってある程度元に戻すことができる難読化ツールをよく使用します。
難読化解除
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 検出された .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 検出された .NET Reactor (C:UsersuserDesktopintelfirstdfsds.exe) |
図 9: de4dot が dfsds.exe の難読化解除に成功
dfsds.exe の難読化を解除した後、結果の dfsds_deob.exe に対して dnSpy を再度実行しました。 SchemaServerManager.Mainを再度逆コンパイルすると、図 10 に示すように、結果は大きく異なります。新しい出力を、前に図 6 に示した難読化されたバージョンと比較すると、難読化が解除されたコードの方がはるかに読みやすいことがわかりました。難読化が解除されたバージョンでは、 ExporterServerManager.InstantiateIndexerへのすべての呼び出しが削除されました。どうやら文字列のデコード ルーチンだったようです。対照的に、アセンブリ エクスプローラーに表示されるクラス名は変更されていません。難読化ツールは、元のクラス名を標準リストから取得した意味のない名前に取り返しのつかないほど置き換えたに違いありません。次に、図 10 の 10 行が base64 でエンコードされたデータを保持していることに注目しました。サンプルの難読化が正常に解除されたら、その構成の抽出に進み、永続化機能と初期ビーコンへのサンプルのコード パスをたどります。
構成、永続性、初期ビーコン
図 10 を思い出してください。メソッドSchemaServerManager.Mainには、Base64 でエンコードされたデータを含むローカル変数があります。そのデータを解読すると、その内容が明らかになりました。図 11 は、デコードされた構成を示しています (C2 エンドポイント URL のファンクが解除されています)。
> エコー TUhvc3Q6aHR0cDovL2RvbWFsby5vbmxpbmUva3NlemJseGx2b3Uza2NtYnE4bDdoZjNmNGN5NXhnZW MHost:hxxp://domalo[.]online/ksezblxlvou3kcmbq8l7hf3f4cy5xgeo4udla91dueu3qa54/ |
図 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に変更できます。
SchemaServerManager.Mainメソッドの分析を続けると、再起動後もサンプルが持続することが明らかになりました。永続化アルゴリズムは、次のように要約できます。
- マルウェアは、実行中のプロセスの名前をランダムに選択し、自分自身を%APPDATA%とC:にコピーします。たとえば、svchost.exe が選択されている場合、マルウェアは自身を%APPDATA%svchost.exeおよびC:svchost.exeにコピーします。
- マルウェアは、 %APPDATA %の下にあるマルウェアのコピーを指すショートカット%APPDATA%dotNET.lnkを作成します。
- マルウェアは、ログオンしたユーザーの Startup フォルダーに%APPDATA%dotNET.lnkを指す dotNET.lnk という名前のショートカットを作成します。
- このマルウェアは、C: の下にあるマルウェアのコピーを指すショートカットC:Sysdll32.lnkを作成します。
- マルウェアは、ログオンしたユーザーの Startup フォルダーに Sysdll32.lnk という名前のショートカットを作成し、 C:Sysdll32.lnkをポイントします。
- マルウェアは、 %APPDATA%dotNET.lnkを指すレジストリ値HKCUSoftwareMicrosoftWindowsCurrentVersionRunscrssを作成します。
- マルウェアは、 C: Sysdll32.lnk を指すレジストリ値HKCUSoftwareMicrosoftWindowsCurrentVersionRunWininitを作成します。
永続化手順の後、マルウェアはマルウェアの複数のインスタンスをチェックします。
- マルウェアは、5 秒から 7 秒の間のランダムな間隔でスリープします。
- マルウェアは、まだ base64 でエンコードされている構成文字列の MD5 ハッシュを取得し、そのハッシュを 16 進数で表現した名前のミューテックスを作成します。このサンプルでは、マルウェアはミューテックスbc2dc004028c4f0303f5e49984983352を作成します。別のインスタンスが実行されているためにこれが失敗した場合、マルウェアは終了します。
次に、マルウェアはビーコンを送信します。これにより、メイン ホスト (MHost) とバックアップ ホスト (BHost) のどちらを使用するかを決定することもできます。そのために、マルウェアは MHost URL に基づいてビーコン URL を作成し、ビーコン URL にリクエストを送信してから、サーバーが HTTP レスポンス ボディ「ok」で応答するかどうかを確認します。サーバーがこの応答を送信しない場合、マルウェアは無条件に BHost を使用します。このコードを図 13 に示します。このサンプルでは MHost と BHost の値が同じであるため (図 11 から)、チェックの成功または失敗に関係なく、マルウェアは同じ C2 エンドポイントを使用することに注意してください。
ビーコン URL を取得する完全なアルゴリズムは次のとおりです。
- MHost URL を取得します。つまり、 hxxp://domalo[.]online/ksezblxlvou3kcmbq8l7hf3f4cy5xgeo4udla91dueu3qa54 です。
/46kqbjvyklunp1z56txzkhen7gjci3cyx8ggkptx25i74mo6myqpx9klvv3/akcii239my
zon0xwjlxqnn3b34w . - 完全な MHost URL の SHA1 ハッシュ、つまり 56743785cf97084d3a49a8bf0956f2c744a4a3e0 を計算します。
- 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 でキャプチャされたメッセージをマルウェアの逆コンパイルされたコードと比較することで、メッセージの形式と種類を特定しました。図 14 に表示されている最後の HTTP 要求に、実行中のプロセスのリストが含まれていることに注意してください。逆コンパイルされたコードをトレースすると、メソッドSchemaServerManager.ObserverWatcher.NewMerchantがこのメッセージを生成したことがわかりました。このメソッドの名前を taskThread に変更し、それが呼び出す他のメソッドに意味のある名前を割り当てました。このメソッドの結果のコードを図 15 に示します。
コードをさらに分析することで、マルウェアがデータを 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 のリバース エンジニアリングを行った後、さらに偵察を続けて、どのような追加情報を見つけられるかを確認しました。私たちの分析の制限の 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 で見つかったプラグイン読み込みコードと一致しています。
図 18 は、仮想マシンでの実行を阻止し、Windows Defender を無効にし、特定のモデルで Web カメラ ライトを無効にする機能を備えたプラグインを含む、いくつかの追加のプラグインを示しています。調査したサンプルには、プラグインはバンドルされていませんでした。
図 19 に、RAT ページのソフトウェア ダウンロードを示します。これらのファイルを確認するのに時間がかかりました。ここに私たちが発見したいくつかの興味深いものがあります:
- Web サイトにリストされている DCRat は、実際には、RAT のビルドと、攻撃者が展開する構成をパッケージ化する「ビルダー」です。これは、図 4 に示した DCRatBuild.exe という名前と一致しています。ビルダーの簡単なテストでは、ライセンス チェックが行われていることがわかりました。後で示すように、運用中の DCRat ビルダーの公開 YouTube ビデオを見つけた後は、バイパスを追求しませんでした。
- DarkCrystalServer は自己完結型ではなく、ユーザーがユーザー名とパスワードを入力できるようにする単なる PHP ファイルであり、サーバー ソフトウェアをダウンロードしてインストールします。認証情報を提供し、dcrat[.]ru と通信する必要があるため (図 20)、DarkCrystalServer の詳細な分析は行いませんでした。
ユーチューブの動画
リバース エンジニアリングによって取得した 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# のバージョンは比較的新しいものです。これは、それに関する詳細な事前報告が見つからなかった理由を説明しています.
図 22 は、ビデオの 6:28 からの別のキャプチャを示しています。画面に表示される機能は、「msgbox」、「browseurl」、「clipboard」、「speak」、「opencd」、「closecd」、および表 6 で発見および列挙したその他の機能とうまく一致しています。
結論
この投稿では、脅威インテリジェンス チームから提供されたサンプルとそのすべてのコンポーネントの分析について説明しました。最初のトリアージで、その「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 |
HTTP リクエスト |
hxxp://domalo[.]online/ksezblxlvou3kcmbq8l7hf3f4cy5xgeo4udla91due |
HTTP リクエスト |
hxxp://domalo[.]オンライン/ksezblxlvou3kcmbq8l7hf3f4cy5xgeo4udla91dueu3qa54/46kqbjvyklunp |
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
Comments