マルウェア

XAgentOSX: SofacyのXAgentにmacOS版亜種

Clock Icon 2 min read

This post is also available in: English (英語)

概要

Palo Alto Networksの脅威インテリジェンスチーム「Unit 42」は、継続中のSofacyのKomplexトロイの木馬に関するリサーチにおいて、SofacyのWindows版トロイの木馬XAgentのmacOS版の新たな亜種を発見しました。このバックドア型トロイの木馬は、macOSシステムを使っている個人を標的にする際にSofacyグループが使用しているものと考えられます。作成者は、XAgentOSXと名前を付けました。これは、SofacyのWindows版トロイの木馬の1つとXAgentという名前を使い、さらにAppleのmacOSの従来の名称OS Xを組み合わせたものです。KomplexツールとXAgentOSXツールの内部にある以下のプロジェクト パスに類似点が見られることから、どちらのツールも同じ攻撃者が開発したと考えられます。

Komplex: /Users/kazak/Desktop/Project/komplex

XAgent OSX: /Users/kazak/Desktop/Project/XAgentOSX

SofacyがKomplexを使ってXAgentOSXツールをダウンロード、インストールし、侵入されたシステムでこのツールの拡張コマンド セットを使用していると考えられます。

XAgentのC2通信

XAgent のmacOS版亜種、XAgentはコマンド アンドコントロール (C2)チャネルを介して攻撃者からコマンドを受信する能力がありますが、自身のキーロガー機能を使ってキーストロークを記録することもできます。XAgentはHTTPリクエストを使って自身のC2サーバと通信を行います。これにより攻撃者は侵害を受けたシステムと繋がることができます。

このトロイの木馬は、HTTP POSTリクエストを使って図1のようにC2サーバにデータを送信し、GETリクエストを使って図2のようにサーバからコマンドを受信します。このトロイの木馬とC2サーバとの間でやり取りされるデータの特定を突き止めるため、私たちは今でもトロイの木馬の分析を続けていますが、HTTP POSTリクエスト内のC2サーバに送信されるデータを暗号化するのに、このトロイの木馬がRC4アルゴリズムを使っていることは明らかです。

図1 XAgent macOSのHTTP POSTリクエスト
図1 XAgent macOSのHTTP POSTリクエスト
図2 XAgent macOSのHTTP GETリクエスト
図2 XAgent macOSのHTTP GETリクエスト

XAgentOSXが生成するC2 URLは、Windows版が生成するものに極めて類似しています。C2サーバに対して発行されるHTTPリクエスト用にURLを生成する際、このトロイの木馬は下記の中からランダムにフォルダを1つ選んでURLパスに含めます。

watch/?
search/?
find/?
results/?
open/?
search/?
close/?

また、XAgentはC2 URLの構築が完了すると、下記リストの中からパラメータ名もいくつか選びます。

itwm=
text=
from=.
itwm=
ags=
oe=
aq=
btnG=
oprnd=
itwm=
utm=
channel=

XAgent OSXトロイの木馬は“agent_id”として参照するシステム特定の値を生成します。これは侵害を受けた各ホストに付けられた固有の識別子です。この値はIOPlatformUUIDプロパティにアクセスするためのIOServiceに由来しており、システム情報アプリケーション内でリストアップされる“Hardware UUID”に相当するものです。図3に示す分析システムのスクリーンショットでは、トロイの木馬は、このハードウェアIDの先頭4バイトを一意のシステム識別子として使っており、今回の場合は“0000”と表示されています。

図3 XAgentが侵害されたホストを一意的に識別するために使用するハードウェアID
図3 XAgentが侵害されたホストを一意的に識別するために使用するハードウェアID

HTTP POSTリクエストおよびGETリクエスト内のURLを生成する際、XAgentは、このagent_id値を含む特定のデータ構造体を使って、HTTPパラメータを1つ設定します。このパラメータにより、agent_idがC2サーバに送信されますが、その目的は攻撃者が侵入されたシステム上で実行したいコマンドを取得することです。このagent_idをC2に送信するのに使われるデータ構造体は次のようになります。

struct {
DWORD random_value_for_key;
CHAR[7] constant_value;
DWORD agent_id;
}

データ構造体に含まれる定数値は7バイトの文字列で、“\x56\x0E\x9F\xF0\xEB\x98\x43”にハードコード化されており、この後にagent_id値(今回の場合は“0000”)が続きます。データ内の最初のDWORDはランダムな値であり、これをトロイの木馬はXORキーとして使って、前記の定数値とagent_idを暗号化します。例えば、分析中、下記の15バイトはHTTPを生成するのに使われていました。

ランダム値 定数値 agent_id
0F EE C8 83 56 0E 9F F0 EB 98 43 30 30 30 30

そのあと、結果として得られた暗号化テキストは、XAgentのBase64エンコード処理ルーチンを使ってエンコードされます。このルーチンは、まず、次のエンコード用アルファベットの構築を行います。

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_

見て分かるとおり、これは標準のBase64アルファベットではなく、RFC 4648の“URL and Filename safe”のBase 64アルファベットであり、標準アルファベットの“+”が“-”で、さらには“/”が“_”で置き換えられています。このアルファベットによりBase64エンコード処理関数を使ってデータをエンコードすると、上記の例の場合、次の結果を得ます。

D-7Ig1ngV3PkdouzP974

次に、トロイの木馬は9個のランダムなシンボルから構成される文字列を作成し、このランダム文字列の後に前記エンコード済み暗号化テキストを付加します。例えば、下記文字列は、C2サーバに送信されるHTTPパラメータの1つの中に含まれることになるでしょう。

eRmaVsr90D-7Ig1ngV3PkdouzP974

本件の場合、攻撃者はこのXAgentサンプルのC2位置に関する設定を行う際にミスをしました。サンプルは配列を作成し、その中にトロイの木馬がC2位置として使う、以下の文字列を入れます。

http://23.227.196[.]215/
http://apple-iclods[.]org/
http://apple-checker[.]org/
http://apple-uptoday[.]org/
http://apple-search[.]info

最後の文字列に末尾に置かれる“/”がないことで、トロイの木馬がこの文字列を使ってC2のURLの残りの部分を構築する際、問題が生じます。トロイの木馬がこの文字列の直後に、URL内にある後続文字列を付加するからです。例えば、この字列を使っている場合、“apple-search.infoclose”を探すDNSクエリを確認しました。これは、文字列“close”がC2のURLの後続部分であると想定されていたためです。

提供コマンド

XAgentのC2サーバは、侵害されたシステム上でトロイの木馬が実行するためのコマンドを、インバウンドのHTTPリクエストに対する応答の中に含めて提供します。XAgentOSXトロイの木馬は、コマンドに対する応答をHTMLタグで挟みます。これによりC2サーバが閲覧目的でログを成形することができるものと考えられます。

ほとんどの場合、C2サーバに送信されるレスポンスは“<font size=4 color=000066><pre>”および“</pre></font>”というHTMLタグの間に置かれます。このコマンド ハンドラを分析したところ、完全に機能するバックドアに必要なコマンド(表1)を提供していました。コマンド ハンドラはコマンド識別子をC2サーバから取得し、0xFFFFFF9Bをこの値に可算します。次に、switch文を使って適切なコマンドを求め、実行します。このswitch文によるチェックが19個の場合分けをしているため、コマンド識別子の値は100から118までであることが伺えます。

コマンドID 機能  説明
100 getInfoOSX ユーザー名およびOSXのバージョンを収集し、次の文字列を暗号化した形で使って応答します。“Mac OS X – [OSXのバージョン] x64<br>\nUser name – [ユーザー名]”
101 getProcessList “ps aux”を実行して起動中のプロセスの一覧を取得します。
102 remoteShell 与えられたコマンド、“/bin/sh”を実行します。
103 getInstalledAPP インストール済みアプリケーションの一覧をコマンド“ls -la /Applications”の実行により取得します。
104 showBackupIosFolder IOSデバイスのバックアップがシステムに置かれたか否か、コマンド“ls -la ~/Library/Application\ Support/MobileSync/Backup/”を実行することで判断します。
105 downloadFileFromPath 指定されたパスからファイルをアップロードします。
106 createFileInSystem C2サーバのHTTP応答内の特定ファイルをダウンロードし、提供します。
107 execFile NSTask:launchメソッドを使って、システム上の指定されたファイルを実行します。
108 deletFileFromPath NSFileManager:removeFileAtPathメソッドを使って、指定されたファイルを削除します。
109 takeScreenShot CGGetActiveDisplayListメソッド、CGDisplayCreateImageメソッド、NSImage:initWithCGImageメソッドを使って、スクリーンショットを撮ります。次のコードを使ってC2にスクリーンショットを返します。 <img src=’data:image/jpeg;base64,[base64 of screenshot]’ width=800 height=500 /><br>
110 startTakeScreenShot スレッドを生成し、設定済みの間隔(デフォルトは10秒ごと)でスクリーンショットを撮ります。“takeScreenShot”関数内の同じメソッドを使います。
111 stopTakeScreenShot “startTakeScreenShot”関数内で生成されたスレッドを終了します。
115 getFirefoxPassword パス内の“/Firefox/Profiles”というフォルダを探し、“logins.json”ファイルの内容を読み、“hostname”、“encryptedUsername”、および“encryptedPassword”のエントリを探します。また、“signons.sqlite”ファイルに関する次のSQLクエリの発行も試みます。“SELECT hostname, encryptedUsername, encryptedPassword FROM moz_logins WHERE timePasswordChanged/1000 BETWEEN ? AND ?”
116 ftpUpload FTPManager:uploadFileメソッドおよび与えられたサーバ名、ユーザー名、およびパスワードを使います。
117 ftpStop “stopOperation”メソッドを呼び出しますが、FTPアップロードは停止させないようです。
118 readFiles ファイルまたはフォルダに関するファイル情報を取得します。また、“*”ワイルドカードおよび再帰的なファイル一覧に対応しています。コードは、情報を収集し、表作成用の以下のHTMLを使って一覧を整形します。

<table>
<tr><td><table>
<tr><td>Type</td><td>Owner</td><td>Permissions</td><td>Created</td><td>Modificated</td><td>Size</td><td>Path</td></tr>
<tr><td>[fileType]</td><td>[fileOwnerAccountName]</td><td>[number filePosixPermissions]</td><td>[fileCreationDate]</td><td>[fileModificationDate]</td><td>[fileSize]</td><td>[file path?]</td></tr></td></tr>

</table>
</table>

表1 XAgent OSX内で利用可能なコマンド

上記‘showBackupIosFolder’は興味深いコマンドです。このコマンドにより、攻撃者は侵入されたシステムがiPhoneまたはiPadなどのIOSデバイスをバックアップするのに使われていたか否か、判断することができるからです。モバイルデバイスがバックアップされていたか否かの判断に、このコマンドが使われているものと考えられます。また、攻撃者がXAgent内の別のコマンドを使ってこうしたファイルを抜き取ろうとすることもあると思われます。

キーロギング機能

XAgentにはキーロガー機能も備えており、この機能により、攻撃者は、ユーザーがキー入力をするときに認証情報を盗み出します。XAgentは、キー押下を検出したときに、CGEventTapCreate関数を呼び出すことでキーストロークをロギングします。この関数は、_myCGEventTapCallBackという名前のコールバック関数を呼び出すためのイベント フックを設定します。このコールバック関数は、キーストロークをロギングする役目を担っているpressedKeyWithKeyCodeという名前の関数を呼び出します。このキーロガーはアクティブなアプリケーション ウィンドウを監視し、次の形式でログに書き込みます。

<span class=’keylog_process’>[アプリケーション名]</span>

キーロガーは、設定可能な数のキーストローク(デフォルトは50)をロギングした後、このログを次の形式でC2サーバに送信します。

<span class=’keylog_user_keys’>[ロギングされたキーストローク]</span>

キーロガーは、リターン キーやファンクション キーなどの特殊キーのロギングを処理することができ、これらを次の形式でログ内に記録します。

<span class=’keylog_spec_key’>[特殊文字]</span>

インフラストラクチャ

Unit 42が分析したXAgentOSXサンプルは、以下のIPアドレスおよびドメイン名をC2サーバとして使うよう設定されていました。:

23.227.196[.]215
apple-iclods[.]org
apple-checker[.]org
apple-uptoday[.]org
apple-search[.]info

このサンプルを分析した際、予備のC2位置として使われていたドメイン名は登録されていませんでした。したがって、これらのドメインは、別のインフラストラクチャへのリンクがありませんでした。また、主要のC2位置である23.227.196[.]215に基づく、別のインフラストラクチャは何も見つかりませんでした。しかし、CrowdStrikeによれば、近接するIPアドレス23.227.196[.]217はSofacyグループが米国の民主党全国委員会への攻撃に使ったXTunnelペイロード用のC2位置だと判明しました。これらのIPアドレスは直接的に重複してはいませんが、Sofacyグループが自分たちのインフラストラクチャをホスティングするため、同じホスティングサービスを利用し続けていることは明らかです。

結論

Sofacyグループは、複数のプラットフォームで攻撃活動を成し遂げるため、自分たちのツールの強化をし続けています。本件の場合、この脅威グループは、Windows版のツールの1つと同じ名前のXAgentをこのmacOS版のツール向けに使いました。また、このツールのmacOS版亜種は、Windows版と類似のネットワーク通信方法を使っているため、Unit 42がKomplexとSeduploader (以前の呼称はSofacy Carberp)ツールの比較をしている中で、このグループが侵害されたホストを制御するために、統合化されたC2サービスを利用し続けていることが分かりました。また、攻撃テレメトリを欠いているものの、私たちはSofacyによって仕掛けられた米国民主党全国委員会への攻撃活動との緩やかな繋がりが2つの攻撃におけるホスティング データを見て判断できました。

Palo Alto Networksのお客様は、以下の通り、XAgentOSX の攻撃から保護されています。

  • 既知のサンプルが、WildFireにより悪意のあるものとして検出されます。
  • すべての既知のC2位置が、PAN-DBで悪意があるものとしてマークされます。
  • お客様はAutoFocusのタグXAgentを使ってこの脅威を追跡できます。

セキュリティ侵害の兆候

SHA256

2a854997a44f4ba7e307d408ea2d9c1d84dde035c5dab830689aa45c5b5746ea

コマンド&コントロール

23.227.196[.]215
apple-iclods[.]org
apple-checker[.]org
apple-uptoday[.]org
apple-search[.]info

Enlarged Image