最近、 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によってデータとして定義されています
バイナリファイルを起動すると、デバッグに対する保護手段としてストリームが作成されます。その唯一の目的は、デバッガの存在を常にチェックすることです。 このスレッドの場合:
- 要求パラメーターとして
PT_DENY_ATTACH
をPT_DENY_ATTACH
してptrace
を呼び出して、デバッガーのアンフックを試みます。 -
task_get_exception_ports
を呼び出して、いくつかの例外ポートが開いているかどうかをtask_get_exception_ports
- 次の図に示すように、現在のプロセスに
P_TRACED
フラグが存在するかどうかを確認することにより、デバッガーが接続されているかどうかを確認します
図3. sysctl関数を使用したデバッガー接続の確認
ウォッチドッグがデバッガーの存在を検出すると、
exit
関数が呼び出されます。 さらに、サンプルは次の2つのコマンドを実行して環境をチェックします。
ioreg -l | grep -e "Manufacturer" sysctl hw.model
その後、サンプルは、既知の仮想化システムの文字列のハードコードされたリストに対して戻り値をチェックします: acle 、 vmware 、 virtualboxまたは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日です。
- daff.faybilodeau [。] com
- sarc.onteagleroad [。] com
- au.charlineopkesston [。] com
リソース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属性も利用できます 。