この投稿の執筆者:Mariano Graziano および Paul Rascagneres
要約:
この数日間、特にイタリアにおいて、EyePyramid という名前のマルウェア サンプルに対する注目が高まっています。イタリア警察は 2 人の容疑者を逮捕し、調査の仮報告 を公表しました。このマルウェアは、イタリアの著名人や政治家たちを攻撃対象としたことで注目を集めています。
Talos では、EyePyramid の最初に公開されたサンプルに対して独自の分析を行いました。セキュリティ コミュニティのソースでは、このマルウェア攻撃は洗練されておらず、マルウェアのサンプルも特筆すべき点はないと説明されています。しかし Talos では、EyePyramid が長年の間捕捉を逃れてきた方法については調査に値するという結論を出しました。
事前分析:
このサンプルは .Net で記述され、周到に難読化されています。私たちは、サンプルを一見しただけで、すぐに興味深い文字列をいくつか抽出することができました。これらの文字列は、今後 ClamAV や Yara シグネチャで役立つ可能性があります。作成者は既知の .Net 難読化ツールまたは暗号化を利用して、URL、電子メール アドレス、クレデンシャルなどの重要な情報を隠すことにより、コアとなる機能を隠蔽することに注意を払っていました。
一般的に .Net アプリケーションのリバース エンジニアリングは、バイナリを逆コンパイルするだけで済むため、難しいタスクではありません。ILSpy、dotPeek など、使用できるツールは多数ありますが、私たちはまず ILSpy を使用してサンプルを逆コンパイルしました。しかし難読化は周到である上に、あらゆるところに対して行われていました。結果として、ILSpy の出力はあまり役には立ちませんでした。私たちはアプリケーションのエントリ ポイントを見つけることができなかったのです。このサンプルはデバッグできず、仮想マシンで実行することもできませんでした。その原因は、複数のデバッグ対策および VM 対策チェックでした。これらは平凡なものでしたが、効果的に作用していました。
詳細な分析:
EyePyramid の分析を成功させるには、この難読化を解除する必要がありました。難読化の解除のために最初に使用したのが de4dot です。このツールにより、「Dotfuscator」および「Skater .NET」という、既知のobfuscator(難読化ツール)が検出されました。ここからは、このサンプルの「クリーンになった」バージョンについて説明します。ただし、このマルウェアにはまだ難読化された部分が残っており、いくつかのルーチンに対してはデコンパイラも失敗していることに注意してください。
このサンプルは、ライセンス キーおよび証明書のための初期化コードで始まっています。次に、CurrentVersion\Run および CurrentVersion\RunOnce レジストリ キーを使用して永続化を実行するためのコードがあります。さらに、このマルウェアに管理者権限があることを確認し、LastBootUpTime への Windows Management Instrumentation(WMI)のクエリでシステムの稼働時間について確認します。
永続化については、以下のレジストリ キーに設定された操作で確認できます。
次のステップは、「cacls.exe」を使用して、多数のフォルダのセキュリティ記述子をチェックして、「fix」することです。具体的には、このコードは、Windows ファイアウォールや、現存する可能性があるアンチウイルス ソフトウェアの多く(それらの中には「ClamAV for Windows」もあります)を確認しています。これらのプログラムを見つけるために、このマルウェアは ProgramFiles、ProgramFiles (x86) など、一般的な場所を調べます。次の図に、「cacls.exe」とこのセキュリティ製品のリストの一部を示します。
次の図では、このマルウェアが自身を対象とした例外規則を作成し、ファイアウォール ポリシーのルール セットに複数の新規エントリを追加する方法を確認できます。
また、このプログラムはスレッドを生成し、ProcessStart または InteractionShell 関数などを使用してコマンドと実行可能ファイルを実行します。たとえば、このプログラムは「default.reg」という名前のレジストリ キーを作成します。このキーは、regedit コマンドを直接呼び出すことにより、当該のレジストリに追加されます。実行可能ファイルについては、代わりに実行される「ghk.exe」および「stkr.exe」と、Web からダウンロードされるその他のリソースがあります。
生成されたスレッドにはもう 1 つ興味深いものがあります。それは、レジストリ キー「EnableLUA」を使用してユーザ アカウント制御(UAC)をチェックし、コントロール パネルからこの制御を無効にするものです。UAC は、Microsoft が Windows Vista から導入した追加のセキュリティ レイヤで、コンピュータ内の変更をユーザに通知します。この場合や、その他の変更が行われた場合、すべての変更を有効にするにはシステムを再起動する必要があります。そしてこれが、「shutdown」コマンドを含む関数の最終目標です。次の図を参照してください。
さらに、「DisallowRun」に追加されるプログラムについても説明が必要です。ここで、私たちは Avast アンチウイルスに対して特に注意が払われていることに気付きました。このキーには、システム上で実行できないアプリケーションのリストが含まれています。
エージェントによって実行されるプログラムは、頻繁に、あるコマンド ライン パラメータ(「-w」)を使用して起動されます。全般的に、このサンプルでは考えられるあらゆるセキュリティ ソフトウェアおよびセキュリティ チェックを無効にすることに注意を払っていると言えます。さらに、このサンプルでは、可能な場合であれば必ず、実行をよりスムーズにするための規則が作成されます。
暗号化:
先ほど述べたように、このサンプルには難読化された部分が残っており、多数の暗号化が使用されています。他の情報源からの報告によると、この文字列は 3DES を使用して暗号化されています。ここでは、このキーが生成される方法と、暗号化フェーズの全体的な構造について報告します。このキーは 16 個のブール値の配列で構成され、初期値はすべて false に設定されています。このキーは、下記の表にリストされたステップで初期化されます。各ステップの結果はブール値(true/false)です。
(*)これらのチェックはさらに複雑です。さらに詳細な説明については、
このバイナリの逆コンパイルされたバージョンを参照してください。
結果として、このキーは、このサンプルが実行される環境によって異なります。このサンプルは、3 つの異なる環境で実行されるように設定されていました。これを可能にするために、復号関数は 3 つの文字列変数を使用して呼び出されます。これらの変数は、異なる 3 つのキーを使用して暗号化された、同じ文字列に対応します(可能性がある各環境に対して 1 つ)。この関数は、まず、最初の文字列を 16 ビット ベースの環境キー(14 番目および 15 番目のバイトが false に設定)を使用して復号しようとします。この復号プロセスで有効な文字列が返されなかった場合、同じキーを使用して 2 番目の文字列を復号しようとします。最終的に、どちらの復号化も失敗した場合、このプロセスは完全な 16 ビットのキーを使用して、最後の文字列を復号しようとします(最後の 2 つのチェックを含む)。
この暗号化は、以下の手順に従って実行されます。
array = init_key()
sarray = serializekey(array)
key = md5(sarray)
iv = sha256(sarray)
3des(data, key, iv)
ここで init_key() は 0 ~ 13 または 0 ~ 15 のチェックです。可能性があるキーが少ないと考えられることから、3 つの異なる実行環境に対する暗号化キーに対して総当たり方式を試すことができました。すべてのケースで、復号によってまったく同じ文字列セットが作成されました。
コード全体で、これらのチェックは他のチェックと組み合わせることにより VM 対策としても使用されています。
チェックの中で注目すべきなのは、ドライブの「Totalsize」のチェックです。ドライブが 46.5 GB 未満でオペレーティング システムが Windows XP の場合、これは妥当な環境ではありません。これはサンドボックス環境を検知するための巧妙な方法です。一般的に、サンドボックスでは小さいハード ドライブと、古いバージョンの Windows オペレーティング システムが使用されているためです。
ネットワークでの挙動:
VM でサンプルを実行し、ネットワーク トラフィックを傍受することで、私たちは一部のリクエストが既知の Web サイトに送信されていることに気付きました。最初、これは接続が利用可能であるかどうかをチェックするための手法のように思われました。しかし、以下に示すように、これには別の目的があったのです。
このコードは、1 つのドメインをランダムに選択して、そのドメインに接続します。次に、「Date」フィールドのヘッダーをチェックします。このフィールドは、現在の日付との差異を計算し、差分が 60 分未満であるかどうかを確認するのに使用されています。
次の興味深い点は、これらのドメインがローテーションされる方法です。これは実際にはドメイン生成アルゴリズム(DGA)ではありません。というのも、ドメインがその場で生成されていないためです。これは、単にエージェントが必要な情報を取得する方法であり、以下のように機能します。
switch((DateAndTime.Now.Month – 1) % 3):
0: geturl[0]
1: geturl[1]
2: geturl[2]
geturl の内容は次のとおりです。
geturl:
return new string{
way_0(),
way_1(),
way_2()}
この画像では、上記の動作を確認することができます。興味深いのは、URL と、電子メール アドレスやパスワードなどのその他の重要な情報に対しても同じアプローチが使用されていることです。このコード全体で、異なる種類の情報を取得するために、3 つの異なる実装が使用されています。ドメインがその場で生成されず、候補のリストから選択されるという点に注目してください。
漏洩:
漏洩は、主に電子メールを通じて行われますが、WebDAV や HTTP が使用される場合もあります。電子メールの場合は SMTP プロトコルを使用して送信され、データは添付ファイルとして漏洩します。メッセージは IMAP サーバの特定のフォルダにアップロードされます(3 番目の図の「inbox」)。このプロトコルの選択は、電子メール メッセージを処理する関数にパラメータとして渡されるフラグに応じて異なります。これらの添付ファイルは暗号化されている場合もあれば暗号化されていない場合もあります。この暗号も 3DES に基づいています。たとえば、1 番目は SMTP プロトコルに関連したコードの一部です。2 番目の画像には IMAP サーバが、3 番目の画像には IMAP コードが含まれています。
このコードでは WebDAV がサポートされており、データのアップロードとファイルの再取得に使用されます。私たちはさらに、この操作の間に使用される WebDAV クレデンシャルを復号しました。このコードは各種の WebDav メソッドを呼び出します。次の図では、「SEARCH」を実行するためのコードを確認できます。
このサンプルは、C&C サーバとやりとりを行って、追加のファイルをダウンロードすることができます。この C&C との通信はユーザ名とパスワードを使用して認証されます。認証後、このエージェントはリソースをダウンロードして、暗号化された形式でディスクに書き込みます。次に、このファイルの読み取りと復号が行われます。使用される復号化キーは一時ファイル名として使用されます。最後に、このファイルが削除されます。
このサンプルがイタリアの有名な Web ポータルである「libero.it」の IP アドレスを取得する方法も興味深い点です。
上記のコードの一部からわかるように、この IP アドレスは Cookie から直接抽出されます。この IP は使用可能な IP アドレスのリストに追加されて使用されます。また、この IP は、後で配列の値を選択するインデックスを生成するために使用されます。この IP を取得する目的は、このコードの分析からは完全には明らかになりませんでした。残念ながら、含まれている関数の一部にはリファレンスがないため、これらの関数が呼び出されることはないようです。
その他のサポート:
このコードには Active Directory および LDAP のサポートも含まれています。この Active Directory に関するコードはドメインの管理者メンバーをリストし、現在のユーザがリスト内に存在するかどうかをチェックします。別のメソッドにより、現在のユーザがドメインの管理者に追加されます。LDAP に関するコードは他の関数によって参照されることはなく、このエージェントのもっと新しいバージョンで使用されていると考えられます。ただし、理論上は Active Directory の場合と同様です。
関連サンプル:
実行された実行可能ファイルは他にもありますが(「stkr.exe」など)、このマルウェアに対する分析はこの投稿では取り扱いません。詳細な分析に興味がある方のために、「stkr.exe」の sha256 は、0af665d7d81871474039f08d96ba067d5a0bd5a95088009ea7344d23a27ca824 です。
今回の分析では、この攻撃に関係していることが公式に確認されていない別のサンプルは除外しました。このサンプルおよび可能性があるもう 1 つのサンプルは malwr.com に掲載されています。残念ながら、投稿時点で malwr.com はメンテナンスのために公開を停止しており、この 2 件の分析については Google のキャッシュもありません。https://www.google.com/search?q=%22uaccheckbox%22 [英語] を参照してください。
まとめ:
私たちは今回の投稿を通じて、小さいミスがいくつかあるものの、この攻撃が重要な情報を取得しようと試み、このエージェントによってオペレーション システム全体のセキュリティが侵害される可能性があることを確認しました。さらにこのサンプルは、すべての操作が隠蔽されているわけではないにも関わらず、何年にもわたって検出されず、大量のデータを漏洩させていると報告されています。私たちはこの投稿で、このエージェントの興味深い点をいくつか分析し、このエージェントが動的な分析環境をバイパスする方法や、オペレーティング システムのセキュリティを解除する方法について、詳細な情報を紹介しました。
リサーチ コミュニティがハッシュを共有してくれたこと、「hackbunny」のサポートと情報の共有にお礼を申し上げます。
対象:
お客様がこの脅威を検出してブロックできる別の方法を以下に記載します。
Advanced Malware Protection(AMP)は、これらの攻撃者によるマルウェアの実行の阻止に最適です。
CWS や WSA の Web スキャンは、悪意のある Web サイトへのアクセスを阻止し、それらの攻撃に使用されるマルウェアを検出します。
E メール セキュリティ は、攻撃の一環として攻撃者が送りつける、悪意のある電子メールをブロックします。
IPS のネットワーク セキュリティ保護や NGFW には、攻撃者による不正なネットワーク アクティビティを検出できる最新のシグネチャが備わっています。
AMP Threat Grid は、悪意のあるバイナリを特定し、すべてのシスコ セキュリティ製品に保護機能を組み込みます。
Umbrella は悪意のあるアクティビティに関連付けられているドメインの DNS 解決を防止します。
参考資料:
http://www.tribupress.it/_/wp-content/uploads/2017/01/ORDINANZA-DI-CUSTODIA-CAUTELARE-OCCHIONERO.pdf [英語]
https://securelist.com/blog/incidents/77098/the-eyepyramid-attacks/ [英語]
本稿は 2017年1月30日に Talos Group のブログに投稿された「EyePyramid: An Archaeological Journey」の抄訳です。