原文始发于石川 芳浩:日本組織を狙った新たな標的型攻撃(Operation MINAZUKI)
ラックの石川と松本です。
2022年6月、新たな攻撃者グループによる日本組織を狙ったサプライチェーン攻撃(Operation MINAZUKI)を確認しました。攻撃者は、2019年ごろから水面下で日本組織の子会社または関連会社の取引先ネットワークを経由して、標的となる日本組織へ継続的に攻撃を行っていました。そこで今回は、Operation MINAZUKIで利用された、4つの新しいマルウェアにスポットを当て、その機能や背後に潜む攻撃者像などを紹介します。
図1は、Operation MINAZUKIの流れを簡単に図示したものです。攻撃者は、機密情報を窃取するために複数のマルウェアやトンネリングツールなどを使い攻撃を行っていることが確認できます。攻撃者が使用したマルウェアは、時期によって少し異なり、マルウェア内に含まれる文字列、コンパイルタイムやタイムスタンプなどの痕跡から、2019年から2020年(青矢印)と2020年以降(赤矢印)の2パターンありました。なお、詳細な攻撃の手口については、文末の表3にMITRE ATT&CK Techniquesとしてまとめてありますので、そちらをご参照ください。
InetDownLoader
InetDownLoaderは、Microsoft Visual C/C++で書かれた32bitマルウェアであり、コンパイルタイムやタイムスタンプなどから2019年8月頃から使用されている可能性が考えられます。このマルウェアには、図2に示すPDBファイルパスが含まれており、一部ファイルパスに簡体字が含まれています。
主な機能は、次のマルウェアをダウンロードするダウンローダであり、通信先は、改ざんされた国内の正規サイトが含まれていました。InetDownLoaderは、通信先の改ざんされたコンテンツにアクセス後、レスポンスに含まれる特定の文字列を取得し、当該文字列をデコードすることで、被害端末に次のマルウェアをダウンロードします。今回確認した改ざんされたコンテンツの1つは、図3に示すように、WordPressをインストールした際に含まれる”readme.html”でした。コンテンツの末尾に本来は存在しないBase64でエンコードされたような文字列が挿入されていることが確認できます。InetDownLoaderは、赤線枠で囲った32バイトの文字列を目印※1として探し、それ以降に含まれた文字列をペイロードとして扱うように設計されています。
※1 InetDownLoaderが通信先のコンテンツから取得する32バイトの文字列は検体ごとに異なる可能性があります。
図4は、このペイロードをデコードする関数です。ペイロードは、Base64+XOR+AES(128-ECB)によって暗号化されており、それぞれの暗号化鍵は、マルウェア自体にハードコードされています。具体的には、XOR演算の鍵は、
“0xBD2A44CE4ED874793AEE7D0BC6CA9E812A1E8F7146A1262A0751FD158ACBE2D9” でAESの鍵は、”0x695F98433F1423EA97AD9BAC655A1136″です。InetDownLoaderは、デコードしたペイロードを図4の橙枠線に示す通り、0x21Cバイト以降のデータから”%TEMP%”ディレクトリにファイルとして書き出し、実行します。
また、デコードしたペイロードは図5に示す通りです。オフセット0x21Cにマジックナンバー0x4D5A(MZ)が確認でき、実行ファイルが存在することがわかります。この実行ファイルは、次項で紹介するセカンドステージのダウンローダ”CMTDownLoader”です。青線枠に示すオフセット0x110に”vstnk.exe”という文字列がありますが、この文字列は、CMTDownLoaderを作成する際のファイル名として利用されます。なお、通信した時期によっては、後述する” CmdPipeRAT”がダウンロードされる可能性があります。
CMTDownLoader
CMTDownLoaderは、Microsoft Visual C/C++で書かれた64bitマルウェアであり、InetDownLoaderよりダウンロードされ、コンパイルタイムやタイムスタンプなどから2021年12月ごろから使用されている可能性が考えられます。
主な機能はダウンローダですが、ハードコードされた特定のファイルを外部に送信する機能も有します。ファイル送信機能については、通信先から取得するコンテンツによって実行の可否を動的に変更させる特徴があります。このダウンローダには、InetDownLoaderにあったような、特徴的なPDBパス情報は含まれていませんが、標的組織のものと考えられるプロキシ情報が含まれていました。攻撃者は、標的組織において情報収集をおこなった上で、CMTDownLoaderを、二次的または補助的な役割として侵害拡大に利用していることが考えられます。
1. ダウンロード機能
InetDownLoaderは、ハードコードされた通信先にアクセス後、レスポンスに含まれた図6の赤線枠に示すような、HTMLコメントタグを含む文字列”<!– DVBUGU”(0x3C212D2D0D0A445642554755)を目印として探し、それ以降に含まれた”–>”までの文字列をペイロードとして扱うように設計されています。
ペイロードは、Base64エンコードされており、デコード後、被害端末の”%TEMP%”ディレクトリにデコード後の文字列長(0x1388バイト)に応じて、バッチファイル(.bat)または実行ファイル(.exe)として作成されます。図7は、文字列長に応じて、作成するファイルの拡張子を判定し付与するコードです。
その後、CMTDownLoaderは、デコードした文字列のCRC32チェックサムを算出し、図6の青線枠で示すBacterialのパラメータ値(0x5d11d23f)と比較後、二つの値が一致した場合に、作成したファイルを実行します。このケースで作成されたファイルは、標的端末上のネットワーク情報やプロセス情報を取得するWindowsコマンドを実行するバッチファイルでした(図8)。攻撃者は、時期によって様々なペイロードを指定しており、バッチファイルではなく、後述するTinyCmdPipeRATといったマルウェアがダウンロードされる可能性もあります。
2. ファイル送信機能
CMTDownLoaderは、ダウンローダとして機能だけではなく、ハードコードされた特定のファイル(例:xxx.txt)を外部へ送信する機能を持ちます。当該機能は、通信先コンテンツのパラメータの有無によって、有効無効の判断が行われており、このケースでは、図6の橙線枠の”CSSModule”パラメータを取得できた場合に有効となります。通信先とのやり取りは、HTTP GET通信※2を利用し、GETリクエストのクエリ文字列を利用して”xxx.txt”の中身を圧縮および暗号化して送信します。
※2 CMTDownLoaderは、POSTメソッドも利用可能な実装となっていますが、確認できた検体では当該メソッドを意図的に呼び出さないように設計されていました。
まず、CMTDownLoaderは、通信先から”CSSModule”パラメータが含まれたコンテンツを取得すると、被害端末上に”xxx.txt”が存在するか確認します。当該ファイルが存在する場合は、ファイルデータをgzipで圧縮後、図9に示すようなXORテーブル(0x200バイト)を用いて、XOR演算し、gzipで圧縮したデータを暗号化します。
最後に、暗号化したデータをパーセントエンコード(URLエンコード)で整形し、GET通信で送信可能なフォーマットにします。図10は、暗号化したデータのパーセントエンコード前後を比較したものです。
下記は、通信先への送信リクエスト例です。一度にデータが送信できない場合は、複数回に分けてデータを分割して送信します。
CmdPipeRAT
CmdPipeRATは、Microsoft Visual C/C++で書かれた32bitマルウェアです。任意コマンド実行やファイルのアップロード・ダウンロードなどの機能を有しており、永続化機能はありません。
当該RATは、コンパイルタイムが2020年2月19日であるものの、ミューテックスが”20190923#”となっており、2019年から使用されている可能性が考えられます。
CmdPipeRATが実行されると、使用する関数の動的なアドレス解決を行なった後、コマンドプロンプトを”%APPDATA%”配下にコピーします。また、多言語対応のためのリソースファイル”cmd.exe.mui”についても”%APPDATA%¥en-US¥”配下へコピーします。これらのファイルは、C2サーバから任意コマンド実行の命令を受けた際に使用されます。
その後、CmdPipeRATはコンピュータ名やOS、IPアドレスなどの感染端末の情報をHTTPのPOSTメソッドで送信します。このとき、感染端末においてプロキシサーバの設定が有効な場合は、その設定に則って通信を行います。
通信先は0x55とXOR演算された状態でマルウェアにハードコードされており、二段階目のダウンローダ CMTDownLoader と同一のドメイン名が設定されていました。
図12のContent-Typeにセットされている特徴的な文字列は、当該RATが起動した際に疑似乱数に基づいて生成されるもので、C2サーバからのレスポンスが自身に宛てられたものかを確認するために使用されます。
また、C2通信で送受信されるデータは、図13のように平文がRC4で暗号化された後にBase64でエンコードされています。なお、CmdPipeRATに実装されているRC4は、鍵スケジューリングアルゴリズム(KSA)における配列Sの初期化が通常(0〜255)とは異なり1〜256の範囲で行われるため、一般的なライブラリでは復号できません。
最初のリクエスト以降、CmdPipeRATは、不定期にPOSTメソッドのHTTP通信を発生させてC2サーバからコマンドを受け付けます。この際にC2サーバからレスポンスがあった場合は、インターネット一時ファイルとして、”yeah.htm”、”yeah.html.tmp”、”yeah.tmp1″という名前のファイルを3つ生成し、処理過程のデータを書き込みながらデコードと復号を行います。そしてコマンドに応じて処理を行い、コマンドの処理結果を暗号化およびエンコード処理した上で、POSTメソッドを使用してC2サーバに送信します。
CmdPipeRATに実装されているコマンドを表1に示します。当該RATには、任意コマンド実行やファイルの送受信、ファイル操作の機能があることから、感染した場合には端末が攻撃者によってリモートからコントロールされてしまうことがわかります。
コマンド | 処理内容 |
---|---|
0x01 | スリープ時間を2秒に設定する |
0x02 | スリープ時間をデフォルト(20秒)に設定する |
0x08 | 匿名パイプで操作可能なコマンドプロンプトを起動する |
0x09 | 任意のコマンドを実行する (当該コマンドの実行前にコマンド0x08を行う必要あり) |
0x0A | コマンドプロンプトを終了する |
0x0F | 任意のファイルを削除する |
0x10 | ドライブ名、ドライブの種類、容量などを取得する |
0x11 | ファイルを検索し、ファイル名とファイルサイズ、最終更新日時を取得する |
0x12 | 送信データをファイルとして書き込む |
0x13 | 任意のファイルの内容を取得する |
0x14 | スリープ時間を任意の値に設定する |
0x7F | スリープ時間をデフォルト(20秒)に設定後、端末情報を再取得する |
これらのコマンドのうち、任意コマンド実行に関しては少し特徴的なコードであるため、実装内容に触れておきます。CmdPipeRATは、任意コマンドの実行するにあたって、匿名パイプを使用した親子プロセス間通信を行います。匿名パイプとは、親プロセスと子プロセスの間でデータを転送する一方向の名前なしパイプのことで、当該RATはこれをコマンドプロンプトのプロセスの操作に使用してリモートシェルとして機能させています。
コマンド0x08(コマンドプロセスの起動)のコードの一部を図14に示します。コードの冒頭でCreatePipe関数を2回呼び出して2つの匿名パイプを生成した後、赤枠の箇所で新たに生成するプロセスの標準入力、標準エラー、標準出力に匿名パイプのハンドルを指定しています。
このように、匿名パイプを子プロセスの入出力に接続することで、親プロセスからパイプを通して子プロセスのコマンドプロンプトを操作することができます。
上記の実装は他のマルウェアでもみられるため攻撃者像の推測までには至りませんが、後述のTinyCmdPipeRATにおいてもコマンドプロンプトのコピー処理と合わせて使用していることから、この攻撃者グループの特徴のひとつといえます。
TinyCmdPipeRAT
TinyCmdPipeRATは、Microsoft Visual C/C++で書かれた64bitのマルウェア(RAT)です。このマルウェアには、リモートシェル機能のみが実装されており、攻撃者がC2通信経由で感染端末上のコマンドプロンプトを直接操作できるようになっています。
当該RATは、前述のCmdPipeRATと比べると、コマンドプロンプトのコピーや匿名パイプを使用する手法が類似する一方で、コマンド体系や通信方式が大きく異なります。また、TinyCmdPipeRATには、感染端末を識別する情報を送信する機能はなく、被害者環境のプロキシサーバの情報がハードコードされていることから、標的の端末でのコマンド操作のみを目的としてコンパイルされたものと推察されます。なお、TinyCmdPipeRATのコンパイルタイムは2022年4月18日となっており、前述のRATよりも新しく開発されたマルウェアである可能性があります。
CmdPipeRAT | TinyCmdPipeRAT | |
---|---|---|
ファイルタイプ | 32bit EXE | 64bit EXE |
コンパイルタイム | 2020/2/19 | 2022/4/18 |
ミューテックス | 20190923# | なし |
PDB | なし | なし |
通信方式 | HTTP(POSTメソッド) | TLS |
通信データの暗号化 | RC4+base64 | なし |
プロキシサーバへの対応 | あり (レジストリから取得) |
あり (被害者環境情報をハードコード) |
C2コマンド | あり | なし(リモートシェル機能のみ) |
TinyCmdPipeRATが実行されると、コマンドプロンプトをファイル名”CfgMgr.exe”としてカレントディレクトリにコピーします。また、多言語対応のためのリソースファイルについてもカレントディレクトリの”¥ja-JP¥”配下へコピーします。
なお、前述のRATはen-USのリソースファイルを取得していましたが、当該RATはja-JPのリソースを取得します。
その後TinyCmdPipeRATは、C2サーバとTLS通信を行うためにInitSecurityInterfaceW関数を呼び出してSecurityFunctionテーブルを取得します。このテーブルからAquireCredentialsW関数やEncryptMessage関数などを使用することで、Schannel SSPによるTLS通信が可能になります。
TinyCmdPipeRATには、プロキシサーバのアドレスとポート番号がハードコードされており、CONNECTメソッドでプロキシサーバを経由して外部に通信が発生します。その後、C2サーバとの通信が始まると、TinyCmdPipeRATはサーバの公開鍵を取得します。TinyCmdPipeRATにはサーバの公開鍵の末尾16バイトがハードコードされており、これとサーバの公開鍵を比較してC2サーバを確認します。そして公開鍵が一致した場合に、サーバとの間でTLSによるセキュアな通信路を確立し、その通信路上でRATの対話的な操作を受け付けます。
図17は、検証環境でクライアントとサーバ間でコマンド操作を行なった際のトラフィックです。赤色の箇所はRATがサーバへ送信した内容、青色はRATがサーバから受信した内容を表しています。
図からは、最初にコマンドプロンプトの標準出力のメッセージがサーバへ送られ、サーバからwhoamiやnetコマンドを受け取ると、RATがその結果を順に返していることがわかります。そして最後に”endshell”をサーバから受け取ると、通信が終了し、TinyCmdPipeRATのプロセスが終了します。
以上のようにTinyCmdPipeRATは、プロキシサーバを経由したTLSによるセキュアな通信路上でリモートシェル機能を提供します。
背後に潜む攻撃者グループ
この攻撃者グループは、前述するような新しいマルウェアの他に、侵入拡大を行うためにいくつかツールの利用を確認しています。その中の1つにオープンソースで公開されるポート転送/トンネリングツール”frp”※3の使用を確認しました。
攻撃者は、被害者のfrpが動作する端末を経由して、標的とする日本組織の端末やサーバなどに接続し、機密情報の窃取を行なったと考えられます。今回の攻撃で利用されたfrp(frpc_381.exe)は、図18の赤線枠に示すように、実行時に表示されるべきヘルプメッセージが、表示されないようコードが改変されていました。また、frpのバージョンも公式サイトでは、公開されていないと考えられる、v0.38.1となっていました(図19)。
frpは、過去にTaidoor、BlackTechやIron Tigerと呼ばれる攻撃者グループなどが攻撃で悪用していることも確認しています。frpを利用した攻撃事例については「オープンソースのポート転送/トンネリングツールを悪用する標的型攻撃に注意」のLAC WATCHをご参照ください。
視点を攻撃者グループが利用するインフラ周りに移してみると、攻撃者は、C2サーバまたはマルウェア置き場に”.jp”ドメインを利用したサイトや正規サイトを改ざんしたサイトなどを利用します。利用された不正通信先の”.jp”ドメインに紐づくIPアドレスは、いずれもホスティング事業者である”vultr.com”が所有するIPアドレスでした。
最後に、攻撃者グループについては、利用されているマルウェアやC2インフラ、端末に残された痕跡などからでは、既存の攻撃者グループとの関連性を紐づけることはできませんでしたが、中国圏を拠点とする、いずれかの攻撃者グループに帰属するのではないかと考えています。
まとめ
近年、海外拠点や関連会社などのサプライチェーンを狙った侵入経路から他組織を踏み台にして本来のターゲット組織に侵入する攻撃が散見されています。今回紹介した攻撃キャンペーンも少なくとも2019年夏頃から行われていたものであり、攻撃者は、セキュリティ製品による検出を迂回しながら慎重に活動していたことが窺えます。攻撃者は、相対的にセキュリティレベルが低いと考えられる海外拠点や関連会社を侵入口として狙ってきます。複数の海外拠点や関連会社を持つ組織においては、自社だけでなくこれら拠点の利用しているネットワーク機器やサーバなどの情報資産の棚卸しを行い、脆弱性へのパッチ管理や設定不備、必要のないサービスの停止といった、見直しの実施を推奨します。
ラックの脅威分析チームでは、今後もこの攻撃者グループおよび利用されたマルウェアについて、継続的に調査し、広く情報を提供していきますので、ご活用いただければ幸いです。
最後に、攻撃者がOperation MINAZUKIで利用した攻撃手口をMITRE ATT&CK Techniquesとして表3としてまとめます。また、この攻撃者グループが利用するマルウェアを検出するための、Yaraルールを記載します。
Tactic | ID | Name | 概要 |
---|---|---|---|
Execution | T1059.001 | Command and Scripting Interpreter: PowerShell | マルウェアのダウンロード |
T1059.003 | Command and scripting interpreter: Windows command shell | バッチファイルを利用してマルウェアやWindowsコマンドを実行 | |
Persistence | T1547 | Boot or Logon Autostart Execution | Runキー及びスタートアップフォルダを利用したマルウェアの実行 |
T1133 | External Remote Services | VPNを使用した侵害された正規アカウントによる不正アクセス | |
Privilege Escalation | T1057 | Process discovery | プロセス終了のための特定のプロセスを発見 |
T1082 | System information discovery | システムに関する情報をログに記録 | |
Defense Evasion | T1070.004 | Indicator Removal on Host: File Deletion | 検出回避のためにマルウェア、バッチファイルや圧縮ファイルの削除 |
Discovery | T1135 | Network Share Discovery | net share, net viewコマンドを利用したネットワークの探索 |
T1082 | System Information Discovery | dirコマンドによるファイル検索 | |
T1049 | System Network Connection Discovery | netstatコマンドによる通信しているIPアドレス・ポート番号や解放ポートを表示 | |
T1057 | Process Discovery | tasklistコマンドによるプロセス一覧情報を取得 | |
T1087 | Account Discovery | net user コマンドでユーザを探索 | |
Lateral Movement | T1021.001 | Remote Services: Remote Desktop Protocol | frpを利用した外部からのRDP接続 |
T1021.002 | Remote Services: SMB/Windows Admin Shares | SMB接続を利用して組織上の端末にマルウェアを配布 | |
Collection | T1005 | Data from Local System | cmdを使い感染機器の情報を収集 |
T1560 | Archive Collected Data | 7z, gzipでデータを圧縮 | |
Command And Control | T1132 | Data Encoding | Base64を使い通信をエンコード |
T1071 | Application Layer Protocol | HTTP, HTTPSでC2サーバと通信 | |
T1001 | Data Obfuscation | RC4, AES, XORで送信データを暗号化 | |
T1102 | Web Service | 正規サイトを改ざんし、C2サーバまたは攻撃ツール置き場として使用 | |
T1090.001 | Proxy: Internal Proxy | 被害者環境のProxy設定情報を悪用してC2サーバと通信 | |
T1572 | Protocol Tunneling | frpを利用したトンネリング接続 | |
Exfiltration | T1041 | Exfiltration Over C2 Channel | C2サーバに窃取した機密情報を送信 |
Yaraルール
rule InetDownLoader { meta: description = "InetDownLoader" author = "LAC Co., Ltd." strings: $str1 = "\\Release\\InetDownLoader.pdb" ascii $str2 = "hello.exe" ascii condition: uint16(0) == 0x5A4D and all of them } rule CMTDownLoader { meta: description = "CMTDownLoader" author = "LAC Co., Ltd." strings: $code1 = {00 3C 21 2D 2D} // $str2 = "cmd /c echo" ascii $str3 = "a.exe" ascii $str4 = ".bat" ascii condition: uint16(0) == 0x5A4D and all of them } rule CmdPipeRAT { meta: description = "CmdPipeRAT" author = "LAC Co., Ltd." strings: $str1 = "%s\\yeah.htm" ascii wide $str2 = "Mozilla/5.0 (Windows NT 6.1; WOW64)" $str3 = "Content-Type: %02x%02x%02x%02x%02x%02x" $rc4_key = { 20 4E 00 00 1E 2D 33 44 54 62 71 8E 9F AC BF CD D8 E3 F0 04 EE FD 03 54 44 22 11 EE DF 1C 0F 3D 98 73 00 34 32 30 31 39 30 39 32 33 23 } $mov_str1 = { C7 85 ?? FB FF FF 5C 63 6F 6E C7 85 ?? FB FF FF 73 6F 6C 65 C7 85 ?? FB FF FF 33 32 2E 65 66 C7 85 ?? FB FF FF 78 65 } // "\\console32.exe" $mov_str2 = { C7 85 ?? FB FF FF 5C 63 6D 64 C7 85 ?? FB FF FF 2E 65 78 65 } // "\\cmd.exe" $mov_str3 = { C7 85 ?? FB FF FF 5C 65 6E 2D C7 85 ?? FB FF FF 55 53 5C 63 C7 85 ?? FB FF FF 6D 64 2E 65 C7 85 ?? FB FF FF 78 65 2E 6D C7 85 ?? FB FF FF 75 69 00 00 C7 85 ?? FB FF FF 5C 65 6E 2D 66 C7 85 ?? FB FF FF 55 53 } // "\\en-US\\cmd.exe.mui" $mov_str4 = { C7 85 ?? FB FF FF 5C 63 6F 6E C7 85 ?? FB FF FF 73 6F 6C 65 C7 85 ?? FB FF FF 33 32 2E 65 C7 85 ?? FB FF FF 78 65 2E 6D C7 85 ?? FB FF FF 75 69 00 00 } // "\\console32.exe.mui" condition: uint16(0) == 0x5A4D and (all of them) } rule TinyCmdPipeRAT { meta: description = "TinyCmdPipeRAT" author = "LAC Co., Ltd." strings: $str1 = "%s\\%s.mui" $str2 = "endshell" $str3 = "InitSecurityInte" $mov_str1 = { 6D 33 32 5C C7 44 ?? ?? 63 6D 64 2E C7 44 ?? ?? 65 78 65 00 } // m32\\cmd.exe $mov_str2 = { 63 6D 64 2E C7 45 ?? ?? 78 65 2E C7 45 ?? ?? 75 69 00 } // cmd.exe.mui $mov_str3 = { C7 85 ?? 00 00 00 43 66 67 4D C7 85 ?? 00 00 00 67 72 2E 65 66 C7 85 ?? 00 00 00 78 65 } // CfgMgr.exe condition: uint16(0) == 0x5A4D and (all of them) }