This post is also available in: English (英語)
エグゼクティブサマリー
2019年2月、パロアルトネットワークス脅威インテリジェンス調査チームUnit 42は、BabySharkマルウェアファミリと、それに関連する米国のシンクタンクを標的としたスピアフィッシングキャンペーンについてのブログを公開しました。それ以来、BabySharkを悪用した悪意のある攻撃は、2019年3月から4月まで継続しています。当該攻撃者は暗号通貨業界にもターゲットを拡大しており、これらの攻撃の背後にいる人々が金銭的利益についても関心を寄せていることが分かります。
脅威グループの最新の活動を追跡するなかで、Unit 42のリサーチャーは、BabySharkマルウェアのサーバーサイドおよびクライアントサイドのファイルと、2つのエンコードされたセカンダリPEペイロードファイルを収集できました。これらのPEペイロードファイルは、オペレータの命令を受信して、マルウェアが被害者のホストにインストールするものです。これらのファイルを分析することで、BabySharkマルウェアの全体的なマルチステージ構造と、運用上のセキュリティをどのようにして確保しているか、またサポートされているリモート管理コマンドの機能がどのようなものかをさらに理解することができました。私たちの調査によると、マルウェア作者はどのマルウェアファミリが配信されるかにかかわらず、エンコードされたセカンダリペイロードを「Cowboy」と呼んでいるようです。
また、BabySharkマルウェアが関与する最新の悪意のある活動は、2つの目的で行われているようです。
- 核安全保障と朝鮮半島の国家安全保障問題に関する諜報活動
- 暗号通貨業界に焦点を当てた経済的利益(サンプルで使用されているおとり文書の内容より。図1参照)。Xcryptocrashはオンラインの暗号通貨ギャンブルゲーム。
図1 暗号通貨に関連したBabySharkの悪意あるおとり文書
BabySharkマルウェアツールセットは同じスポンサーを持つ攻撃者同士で共有されているか、同一グループに追加のミッションが割り当てられているものと考えられます。
分析の結果、BabySharkの攻撃ではKimJongRATとPCRatをエンコードされたセカンダリペイロードとして使用していました。すなわちこれが「Cowboys」ということになります。
疑わしいアクセスログ
図2に示すように、BabySharkは各ステージでチェックを行う多段階の感染チェーンを持ちます。これにより、最終的に攻撃者へのビーコンが返される前段階で、標的とするホストのみが次のステージに進めるようになっています。
図2 BabySharkマルウェアの全体構造
このふるい分けは、無効なパラメータを使用したアクセスなど、疑わしいアクセスを試みたIPアドレスとコンピュータ名の一覧をサーバーのブラックリストに登録・保持することで行われています。おそらくこれは、解析を困難にすることを目的としているのでしょう。ブラックリストのIPアドレスとコンピュータ名は、[BASE_URI]/blackip.txtにbase64エンコード形式で書き込まれています(図3参照。一部伏せてあります)。
図3 blacktip.txtのブラックリストに載っているIPアドレスとコンピュータ名
ブラックリストと一致するデータを使用して新しいアクセスが試行されると、サーバーは次の段階に進まず、図4に示す別のログファイルを介してオペレータに警告します。
図4 不審な活動記録をオペレータに報告
BabySharkのC2サーバーは、ベースURIへのアクセスも記録し、http://go.microsoft[.]com/ にリダイレクトします。その目的は、ホスティングをしているWebサーバーの設定ミスでファイルが表示されることを防ぐためと思われます。
1 2 3 4 5 6 7 |
if($ff=fopen("resp_suspect","a")) { fwrite($ff, $date . " " . $ip . " suspected access " . $useragent ."\r\n"); fclose($ff); } header('Location: http://go.microsoft[.]com/'); exit; |
リモートコマンド
オペレータは、BabySharkに感染したシステムに対してVBSおよびPowerShellベースのコマンドを発行することができます。C2から見つけたリモートコマンドは以下の表のとおりですが、攻撃者はVBSやPowerShellによるコマンドファイルをさらに作成することもできるので、これらに限定されるわけではありません。
VBSベースのリモートコマンド:
コマンド名 | 説明 |
getfiles | BabySharkベースパス内のすべてのファイルをZIPアーカイブとしてアーカイブし、C2にアップロードする |
exe_down | セカンダリペイロード用のファイルをダウンロードする:
– Cowboy: カスタムエンコードしたPEペイロード – EXEタイプローダー: Cowboyをデコードしてメモリにロード – DLLタイプローダー: Cowboyをデコードしてメモリにロード |
redirect_vbs | キーファイルが存在しないためこのコマンドの目的は不明。C2パスを変更するためのものである可能性 |
表1BabyShark用のVBSベースのリモートコマンド
PowerShellベースのリモート管理コマンド:
コマンド名 | 説明 |
keyhook | PowerShellとC#を使って2種類のキーロガーを実装している
– PowerShellベースのキーロガーでGitHubから広く入手可能。結果は %APPDATA%\Microsoft\ttmp.log に保存される – C#ベースのキーロガーで結果は %APPDATA%\Microsoft\ttmp.log に保存される |
dir list | ホスト情報を収集して結果を%APPDATA%\Microsoft\ttmp.log.に保存。ホスト情報を収集するために発行されるコマンドは以下のとおり:
– whoami – hostname – ipconfig – net user – arp -a – dir "%appdata%\Microsoft" – dir "%systemroot%\SysWOW64\WindowsPowerShell\" – vol c: d: e: f: g: h: i: j: k: l: m: n: o: p: q: r: s: t: u: v: w: x: y: z: – dir "%userprofile%\Downloads" – dir "%userprofile%\Documents" – dir "%userprofile%\AppData\Local\Google\Chrome\User Data\Default" – tasklist このほかに、レジストリキー値からユーザーアカウント制御(UAC)へのアクセシビリティ、Microsoft Officeセキュリティ設定をテストした結果 |
power com | %APPDATA%\Microsoft\delemd.tmp0 to %APPDATA%\Microsoft\XXYYZZ.tmp をコピーしてDLLとしてロード |
exe del | セカンダリペイロードの実行に関連するすべてのファイルをクリーンアップする
– %APPDATA%\Microsoft\desktop.r3u: エンコードされたCowboyのペイロード ローダー– %APPDATA%\Microsoft\fstnur: これが初回の実行かどうかをチェックするためのファイル – %APPDATA%\Microsoft\*.tmp |
execute | %APPDATA%\Microsoft\deleme.tmp0 to %APPDATA%\Microsoft\deleme.tmpをコピーして実行 |
表2BabyShark用のPowerShellベースのリモートコマンド
KimJongRATとPCRatとでCowboys
二次マルウェアは、セットとして配信されます。
- EXEローダーが1つ
- DLLローダーが1つ
- エンコードされたペイロードが1つ
EXEとDLLローダーの機能は同じで、唯一の違いはファイルタイプです。これらのローダーは、実行コマンドを受け取った後で実行されます。EXEタイプローダーを起動する場合は"execute"コマンド、DLLタイプローダーを起動する場合は"power com"コマンドを受け取ります。私たちは、2つの異なるタイプのローダーを使用する理由を、ウイルス対策ソフトウェアに邪魔されてもペイロードをロードする冗長性を確保するためではないかと推察しています。どちらのローダーもカスタムエンコードされたセカンダリペイロードであるCowboyをメモリにロードし、デコードして実行します。
以前の調査で私たちは、BabySharkとKimJongRATマルウェアファミリ間の潜在的リンクについて説明しましたが、リンクがあるとした理由は、マルウェアのふるまいが似ていること、関心のあるターゲットが似ていること、作成されたばかりのKimJongRATマルウェアのサンプルが、同一脅威攻撃者において見られたことに基づいています。最新の分析では、BabySharkのC2サーバーから2つのセカンダリペイロードファイル、cow_pass.gifとcow.gifを収集しました。デコードしてみると、これらのサンプルはそれぞれKimJongRATとPCRatであることがわかりました。それらのメタデータを表3と表4にあげておきます。
SHA256値 | f86d05c1d7853c06fc5561f8df19b53506b724a83bb29c69b39f004a0f7f82d8 |
タイムスタンプ | 2010-07-14 08:47:40 |
サイズ | 124,928 |
インポートハッシュ値 | d742aa65c4880f85ae43feebb0781b67 |
C2 | 173.248.170[.]149:80 |
表3 デコードされたPCRatペイロードのメタデータ
SHA256値 | d50a0980da6297b8e4cec5db0a8773635cee74ac6f5c1ff18197dfba549f6712 |
タイムスタンプ | 2018-12-25 11:11:47 |
サイズ | 787,968 |
インポートハッシュ値 | daab894b81cc375f0684ae66981b357d |
表4 デコードされたKimJongRATペイロードのメタデータ
PCRatは悪名高いリモート管理型トロイの木馬で、そのソースコードは広くインターネット上に公開されています。このマルウェアはGh0st RATマルウェアファミリの亜種で、ネットワークビーコンの構造(図5を参照)などGh0stと多くの類似点があります。
図5 173.248.170[.]149:80のC2とのPCRat通信
当初、私たちはサンプルのタイムスタンプが古いことに関心を持ちました。長年公開されて利用可能になっているオリジナルのPCRatバイナリからほとんど修正されていないのです。ですが、分析時にマルウェアとC2サーバー間の通信を確認したところ、オペレータはマルウェアを積極的に操作しているようでした。
デコードされたKimJongRATサンプルは過去に報告された亜種のコードにいくらか変更を加えているようです。図5に示すように、このサンプルでは、API文字列を難読化するための置換暗号を追加してその意図を隠し、C2へのデータ抽出のためのネットワーク機能を削除してありました。
図6 KimJongRATの暗号化されたAPI文字列
オリジナルのファイル名 "cow_pass.fig"からも示唆されるとおり、KimJongRATは脅威攻撃者によるパスワード抽出、情報窃取ツールとして全面的に使用されているようです。また、収集されたデータはBabySharkやPCRatなどのほかのマルウェアのサポートによりC2に抽出されます。KimJongRATマルウェアが被害PCから盗む情報には、Microsoft OutlookとMozilla Thunderbirdからの電子メール用認証情報、Internet Explorer、Chrome、Mozilla Firefox、Yandex BrowserからのGoogle、Facebook、およびYahooアカウントのログイン用認証情報が含まれます。これらすべての情報が、被害PCのOSバージョンとともに、ファイル"%APPDATA%\Microsoft\ttmp.log"に保存されます。"ttmp.log"の内容は常に文字列 "AAAAFFFF0000CCCC"で始まり、その後にbase64エンコードされた盗まれた認証情報が追加されます。
CVE-2018-8174
これまでのところインターネット上での実例はまだ観測していませんが、CVE-2018-8174(Windows VBScript エンジンのリモートコード実行脆弱性)を悪用するPHPのサンプルをBabySharkのC2サーバー上で見つけました。この事実は、脅威攻撃者がこの脆弱性を利用して、水飲み場攻撃やスピアフィッシングメールに悪意のあるURLを仕掛けることにより、標的にBabySharkの第一段階のHTAをロードさせる可能性があることを示唆しています。
攻撃者のエクスプロイト用スクリプトは、被害者のリモートIPアドレスを記録しており、同じIPから複数回アクセスされるとhttp://google[.]comにリダイレクトするようになっています。これもまた、調査を妨害することを狙った戦術のようです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
if(file_exists($filename)) { if($ff=fopen("resp","a")) { fwrite($ff, $date . " " . $ip . " ".$useragent." reopen document." ."\r\n"); fclose($ff); } header("location: http://google[.]com"); exit; } if($ff=fopen("resp","a")) { fwrite($ff, $date . " " . $ip . " ".$useragent." open document." ."\r\n"); fclose($ff); } |
Cowboyコンバータ
調査中、BabySharkマルウェアの作者によって作成されたと思われるグラフィカルユーザーインターフェイス(GUI)ベースのプログラムが、パブリックなマルウェアリポジトリで見つかりました。このファイルは、PEファイルを前述のCowboy EXEおよびDLLローダーによってロード可能なペイロード形式に変換するためのファイルエンコーダツールとして使用されます。BabySharkの作者は、このツールを使って攻撃を仕掛けていると考えられます。Cowboyコンバータのメタデータは以下の表5のとおりです。
SHA256値 | bd6efb16527b025a5fd256bb357a91b4ff92aff599105252e50b87f1335db9e1 |
タイムスタンプ | 2019-01-30 18:22:51 |
サイズ | 24,576 |
インポートハッシュ値 | bde663d08d4e2e17940d890ccf2e6e74 |
表5 Cowboyコンバータのメタデータ
このツールは、カレントワーキングディレクトリで "cowboy"という名前のファイルを開き、Cowboyのエンコーディングフォーマット(後述)にエンコードします。"cowboy"という名前のファイルが見つからない場合は、「The file cowboy isn't there!(cowboyファイルが存在しない)」というメッセージボックスが表示されます(図7)。
図7 Cowboyコンバータと"cowboy"ファイルが見つからない場合のポップアップメッセージ
エンコードは次の3ステップで行われます。
- "cowboy"という名前のファイルから読み込まれたオリジナルのバイト内容をリバースする
- リバースしたバイトをBase64でエンコードする
- base64でエンコードされた文字列を10個のブロックに分けてブロックの順序を逆にする
私たちが作成したPythonによるデコーダスクリプトは本ブログの「付録」セクションから利用可能です。
結論
以前の調査発表以降もBabySharkマルウェアを利用した悪意のある攻撃は継続してきました。実際、彼らは暗号通貨業界をターゲットに業務を拡大しています。マルウェアのサーバーサイドの実装からは、マルウェアの作者が、マルウェアとC2インフラストラクチャを運用するため、運用上のセキュリティ確保に一定の努力を払っている様子が伺えます。また同攻撃者は、自身のキャンペーンに商用ツールやカスタムツールも活用しています。このケースではPCRatとKimJongRATが利用されていましたが、将来これらはほかのマルウェアファミリに置き換えられるかもしれません。観測するかぎり、BabySharkマルウェアを使用した悪意のある攻撃は継続しそうであり、新しい業界に拡大し続ける可能性があります。
パロアルトネットワークスのお客様は、次のようにしてこの脅威から保護されています。
- WildFireとTrapsは本ブログに記載したすべてのマルウェアファミリと脆弱性のエクスプロイトをMaliciousと判定します。
- 攻撃者が使用するC2ドメインはThreat Preventionにより遮断されます。
- BabySharkおよびPCRatマルウェアファミリによる感染前後のネットワーク通信は、IPSエンジンにより遮断されます。
- CVE-2018-8174のエクスプロイトはIPSエンジンにより遮断されます。
AutoFocusをお使いのお客様は、次のタグを見ることで、このレポートで説明されている脅威からの継続中の活動を監視できます。
パロアルトネットワークスは本稿で見つかったファイルサンプルや侵害の兆候などをふくむ調査結果をCyber Threat Alliance(CTA サイバー脅威アライアンス)のメンバーと共有しました。CTA のメンバーはこのインテリジェンスを使用して、お客様に保護を迅速に提供し、悪意のあるサイバー攻撃者を体系的に阻害することができます。Cyber Threat Allianceの詳細については、次のWebサイトをご覧ください: www.cyberthreatalliance.org
IOC
悪意のあるWordマクロ文書
75917cc1bd9ecd7ef57b7ef428107778b19f46e8c38c00f1c70efc118cb8aab5,
PCRat
f86d05c1d7853c06fc5561f8df19b53506b724a83bb29c69b39f004a0f7f82d8,
KimJongRAT
d50a0980da6297b8e4cec5db0a8773635cee74ac6f5c1ff18197dfba549f6712,
Cowboyローダー
4b3416fb6d1ed1f762772b4dd4f4f652e63ba41f7809b25c5fa0ee9010f7dae7
33ce9bcaeb0733a77ff0d85263ce03502ac20873bf58a118d1810861caced254
Cowboyコンバータ
bd6efb16527b025a5fd256bb357a91b4ff92aff599105252e50b87f1335db9e1,
付録 – CowboyをデコードするPython スクリプト
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import base64 import base64 with open('cowboy', 'r') as file_in, open('cowboy_clear.bin', 'wb') as file_out: EncStr = file_in.read() BlkSz = 10 len_EncStr = len(EncStr) NonBlk10_ptr = len_EncStr – (BlkSz -1) * (len_EncStr // BlkSz) NonBlk10 = EncStr [:NonBlk10_ptr] result = " EncStr = EncStr [NonBlk10_ptr::] #print EncStr x = range (-1,BlkSz-1) Blksize1 = len_EncStr // BlkSz for n in x: loop_buff1_ptr = n * (len_EncStr // BlkSz) loop_buff1 = EncStr [loop_buff1_ptr:loop_buff1_ptr+Blksize1] #print loop_buff1 result = loop_buff1 + result result = result + NonBlk10 clear = base64.b64decode(result)[::-1] print clear file_out.write(clear) |