OceanLotus:macOSのMalvariアップデート

2019年3月、人気のあるオンラインスキャンサービスであるVirusTotalが、OceanLotusサイバーグループのmacOS用の新しいマルウェアサンプルをアップロードしました。 バックドア実行可能ファイルは、macOSで調査した以前のバージョンのmalvariと同じ機能を備えていますが、その構造が変更され、検出がより困難になりました。 残念ながら、このサンプルに関連付けられたドロッパーが見つからなかったため、感染ベクトルはまだわかりません。



最近、 OceanLotusと、オペレーターが永続性を維持し、コード実行を高速化し、Windowsシステムでの存在の痕跡を最小限に抑える方法について投稿を公​​開しました。 このサイバーグループにはmacOSのコンポーネントがあることも知られています。 この投稿では、以前のバージョン( Trend Microによる説明 )と比較したmacOS用Malwareの最新バージョンの変更点と、分析がIDA Hex-Rays APIを使用して文字列復号化を自動化する方法について詳しく説明します。









分析



次の3つの部分では、SHA-1 E615632C9998E4D3E5ACD8851864ED09B02C77D2



したサンプル分析について説明します。 このファイルはflashlightdと呼ばれ、ESETアンチウイルス製品はOSX / OceanLotus.Dとして検出します。



アンチデバッグおよびサンドボックス保護



すべてのOceanLotus macOSバイナリと同様に、サンプルはUPXでパッケージ化されていますが、ほとんどのパッカー識別ツールはそれをそのように認識しません。 おそらく、主に署名が含まれているため、「UPX」行の存在に応じて、さらに、Mach-O署名はあまり一般的ではなく、頻繁に更新されません。 この機能により、静的検出が困難になります。 興味深いことに、解凍後、エントリポイントは.TEXT



セグメントの__cfstring



セクションの.TEXT



ます。 以下の画像に示すように、このセクションにはフラグ属性があります。





図1. MACH-O __cfstringセクションの属性



図2に示すように、 __cfstring



セクションのコードの場所を使用すると、コードを文字列として表示することにより、一部の逆アセンブリツールをだますことができ__cfstring









図2.バックドアコードはIDAによってデータとして定義されています



バイナリファイルを起動すると、デバッグに対する保護手段としてストリームが作成されます。その唯一の目的は、デバッガの存在を常にチェックすることです。 このスレッドの場合:







図3. sysctl関数を使用したデバッガー接続の確認



ウォッチドッグがデバッガーの存在を検出すると、 exit



関数が呼び出されます。 さらに、サンプルは次の2つのコマンドを実行して環境をチェックします。



ioreg -l | grep -e "Manufacturer" sysctl hw.model







その後、サンプルは、既知の仮想化システムの文字列のハードコードされたリストに対して戻り値をチェックします: aclevmwarevirtualboxまたはparallels 。 最後に、次のコマンドは、マシンが次の「MBP」、「MBA」、「MB」、「MM」、「IM」、「MP」および「XS」のいずれかであるかどうかを確認します。 これらはシステムモデルコードです。たとえば、「MBP」はMacBook Pro、「MBA」はMacBook Airなどを意味します。



system_profiler SPHardwareDataType 2>/dev/null | awk '/Boot ROM Version/ {split($0, line, ":");printf("%s", line[2]);}







キーの追加



トレンドマイクロの調査以降、バックドアコマンドが変更されていないという事実にもかかわらず、他のいくつかの変更に気づきました。 このサンプルで使用されるC&Cサーバーは非常に新しく、作成日は2018年10月22日です。





リソースURLが/dp/B074WC4NHW/ref=gbps_img_m-9_62c3_750e6b35



変更され/dp/B074WC4NHW/ref=gbps_img_m-9_62c3_750e6b35





C&Cサーバーに送信される最初のパケットには、次の表のコマンドで収集されたすべてのデータを含む、ホストマシンに関する詳細情報が含まれています。







この構成の変更に加えて、サンプルはネットワークフィルタリングにlibcurlライブラリを使用せず、外部ライブラリを使用します。 それを見つけるために、バックドアは、ゼロが埋め込まれたキーgFjMXBgyXWULmVVVzyxy



を使用して、AES-256-CBCを使用して現在のディレクトリ内の各ファイルを復号化しようとします。 各ファイルは復号化されて/tmp/store



として保存され、 dlopen関数を使用してライブラリとしてロードしようとしました。 復号化の試行によりdlopen



呼び出しが成功すると、バックドアはエクスポートされたBoriry



およびChadylonV



取得します。 ChadylonV



は、サーバーとのネットワーク通信を担当している可能性があります。 サンプルのソースの場所からのドロッパーまたは他のファイルがないため、このライブラリを分析できません。 さらに、コンポーネントは暗号化されているため、これらの行に基づくYARAルールはディスク上で見つかったファイルと一致しません。



上記の記事で説明したように、 cliendIDが作成されます。 この識別子は、次のコマンドのいずれかの戻り値のMD5ハッシュです。



ioreg -rd1 -c IOPlatformExpertDevice | awk '/IOPlatformSerialNumber/ { split($0, line, "\""); printf("%s", line[4]); }'



ioreg -rd1 -c IOPlatformExpertDevice | awk '/IOPlatformSerialNumber/ { split($0, line, "\""); printf("%s", line[4]); }'





ioreg -rd1 -c IOPlatformExpertDevice | awk '/IOPlatformUUID/ { split($0, line, "\""); printf("%s", line[4]); }'



ioreg -rd1 -c IOPlatformExpertDevice | awk '/IOPlatformUUID/ { split($0, line, "\""); printf("%s", line[4]); }'





ifconfig en0 | awk \'/ether /{print $2}\'



ifconfig en0 | awk \'/ether /{print $2}\'



(MACアドレスを取得)

-未知のコマンド( " \x1e\x72\x0a



")、以前のサンプルで使用されています



ハッシュする前に、戻り値に文字「0」または「1」が追加され、ルート権限の存在が示されます。 このclientIDは、 /Library/Storage/File System/HFS/25cf5d02-e50b-4288-870a-528d56c3cf6e/pivtoken.appex



/HFS/25cf5d02-e50b-4288-870a-528d56c3cf6e/pivtoken.appexに保存されます。コードがルートまたは〜/ Library / SmartCardsServices / Technology / PlugIns / drivers / snippets.ecgMLとして実行されている場合他のすべての場合。 ファイルは通常、 _chflags関数を使用して非表示にされ、そのタイムスタンプはtouch –t



コマンドを使用してランダムな値で変更されます。



文字列のデコード



以前のバージョンと同様に、 CCCrypt関数を使用して、AES-256-CBC(16進キー: 9D7274AD7BCEF0DED29BDBB428C251DF8B350B92



ゼロ9D7274AD7BCEF0DED29BDBB428C251DF8B350B92



、IVにゼロ9D7274AD7BCEF0DED29BDBB428C251DF8B350B92



ます)を使用して文字列が暗号化されます。 キーは以前のバージョンから変更されましたが、グループは引き続き同じ文字列暗号化アルゴリズムを使用しているため、復号化を自動化できます。 この投稿に加えて、Hex-Rays APIを使用してバイナリファイルに存在する文字列を解読するIDAスクリプトをリリースしています。 このスクリプトは、OceanLotusの将来の分析と、まだ取得できていない既存のサンプルの分析に役立つ場合があります。 このスクリプトは、関数に渡される引数を取得するための普遍的な方法に基づいています。 彼は目的地の設定も探しています。 メソッドを再利用して関数の引数のリストを取得し、コールバックに渡すことができます。



復号化関数のプロトタイプを知っているスクリプトは、この関数へのすべての相互参照、すべての引数を見つけ、データを復号化し、相互参照のアドレスでコメント内にプレーンテキストを配置します。 スクリプトが正しく機能するには、base64デコード機能で使用されるユーザーアルファベットが必要であり、キーの長さを含むグローバル変数を定義する必要があります(この場合、DWORD、図4を参照)。





図4. key_lenグローバル変数の定義



[関数]ウィンドウで、復号化関数を右クリックし、[引数の抽出と復号化]をクリックします。 スクリプトは、図5に示すように、コメントに解読された行を挿入する必要があります。





図5.復号化されたテキストはコメントに配置されます



したがって、復号化された行は、図6に示すように、この関数のIDA 外部参照ウィンドウに一緒に配置されるのが便利です。





図6. f_decrypt関数への外部参照



最終スクリプトはGithubリポジトリにあります



おわりに



既に述べたように、OceanLotusはそのツールセットを常に改善および更新しています。 今回、サイバーグループはMacユーザーと連携するためのマルウェアを改善しました。 コードはあまり変更されていませんが、多くのMacユーザーはセキュリティ製品を無視しているため、マルウェアを検出から保護することは二番目に重要です。



ESET製品は、調査時点でこのファイルをすでに検出しています。 C&C通信に使用されるネットワークライブラリはディスク上で暗号化されるため、攻撃者が使用する正確なネットワークプロトコルはまだ不明です。



侵害インジケータ



GitHubでは 、侵害インジケータとMITER ATT&CK属性も利用できます



All Articles