This post is also available in: English (英語)
概要
ランサムウェア攻撃グループ BlackCat のオペレーターは最近、同グループのツール更新についてアナウンスしました。このなかには、BlackCat のペイロードをリモート マシンや被害組織のネットワーク共有に拡散させるのに使える Munchkin というユーティリティが含まれていました。ここ 2 年ほど、BlackCat のオペレーターは、「サービスとしてのランサムウェア (RaaS)」ビジネス モデルの一部としてツールを継続的に進化させてきました。
同グループを調査をしていていたさい、Unit 42 のリサーチャーは、「カスタマイズされた Alpine 仮想マシン (VM) にロードされる」という点でユニークな Munchkin のインスタンスを取得しました。カスタマイズされた VM を使ってマルウェアを展開するこの新たな戦術はここ数カ月勢いを増しており、ランサムウェア脅威アクターらは VM を使うことでマルウェア ペイロードの展開時にセキュリティ ソリューションを回避できるようになっています。
本稿ではこの新たなユーティリティがどのように機能しているのかを詳しく説明し、BlackCat 脅威アクターが継続利用している戦術にさらに光を当てていきます。本稿が情報セキュリティ業界の皆さんのいっそうの取り組みを促し、この進化する脅威に対する防御強化の一助となれば幸いです。
パロアルトネットワークス製品をご利用のお客様は、本稿で取り上げたこの特定の脅威の指標を「悪意のあるもの」として適切に識別することによる保護を受けています。
関連する Unit 42 のトピック | BlackCat Ransomware, Cybercrime |
BlackCat の概要
BlackCat ランサムウェア脅威が初めて公けになったのは、2021 年 11 月にその存在が表面化したときでした。同グループはマルウェア内部の洗練度合いや Rust プログラミング言語の使用などの独自アプローチで悪名を馳せました。
BlackCat はほかのランサムウェア脅威アクターと同じ RaaS ビジネス モデルを採用しています。RaaS ビジネス モデルでは、アフィリエイトがアクター提供のツールを活用するかわりに、利益の一部をオペレーターに還元することができます。過去の報告に基づくと、アフィリエイトは身代金支払い額のおよそ 80 ~ 90% を保持し、残りをオペレーターに送金します。
BlackCat 攻撃グループはそのアフィリエイトも含め、歴史的に米国国内の被害者を重点的にターゲットにしてきました。ただしその人気の高まりと時間の経過につれ、被害対象は大きく広がり、最近では BlackCat が世界中のさまざまな業界や業種をまたがる被害者をターゲットにしているようすが観測されています。
BlackCat のツール セットは長年進化を続けています。オリジナル バージョンでは、難読化や暗号化のされていない埋め込みの JSON 構成が提供されていました。
時間経過とともにこの脅威オペレーターはこのマルウェア ファミリーを更新し、この基盤の構成も難読化されるようになりました。またマルウェア実行には、ユニークなコマンドライン パラメーターを要求するようになりました。そうすることで BlackCat は、コマンドライン パラメーターを知らないセキュリティ コミュニティの人々が基盤のペイロードについての洞察を得られないようにしています。
このマルウェア ファミリーは進化し続けており、脅威オペレーターはさらに機能と難読化メカニズムを拡充しています。ここ数カ月、BlackCat は「Munchkin」という名前の新しいツールをリリースしました。
このツールは、Sphynx (最新の BlackCat 亜種) を実行する Linux ベースのオペレーティング システム (OS) を提供します。脅威オペレーターはこのユーティリティを使い、リモート マシン上で BlackCat を実行したり、リモートにある SMB (Server Message Block) ファイル共有や CIFS (Common Internet File System) ファイル共有に BlackCat を展開して暗号化することができます。
仮想マシンを使うマルウェア実行は、ランサムウェア コミュニティで増加傾向にあります。ほかのランサムウェア組織も同じようにこの新たな戦術を活用していると報告されています。
このアプローチの利点として、ウイルス対策ソフトウェアなど、ホストの OS に設定されているセキュリティ対策や保護を回避できることが挙げられます。これらのソリューションは組み込みの仮想 OS に対するイントロスペクションを持たないことが多く、そこにあるチェック機能はマルウェアにバイパスされることが少なくありません。
最近行った調査のなかで、Unit 42 のリサーチャーはこの VM ユーティリティのコピーを入手でき、そのおかげでこれがどのように機能するかに関する洞察を提供できるようになりました。
Alpine Linux を採用
Munchkin ユーティリティは ISO ファイルとして提供され、これが仮想化製品 VirtualBox の新たにインストールされたインスタンスにロードされます。この ISO ファイルは、Alpine OS をカスタマイズした実装となっています。脅威オペレーターはそのフットプリントが小ささからこの OS を選択した可能性があります。オペレーティング システムを実行すると、ブート時に次のコマンドが実行されます。
1 2 3 |
echo -n "root:[password]" | chpasswd tmux new-session -A -s controller \; send -t controller "/app/controller && poweroff" ENTER \; detach -s controller eject |
ここで、このマルウェアは最初に VM の root パスワードを脅威アクターが選んだパスワードに変更しています。次に、組み込みの tmux ユーティリティを介し、新たなターミナル セッションを生成し、このターミナル セッションを controller という名前のマルウェア バイナリーを実行するのに使っています。マルウェアの実行が完了すると VM の電源はオフになります。
この controller というマルウェアは、/app ディレクトリー内にほかの関連ファイルといっしょにホストされます。さらに、ほかの関連ファイルや注目すべきファイルもこの VM OS 内には含まれています (以下表 1 参照)。
ファイル パス | 説明 |
/app/controller | Munchkin マルウェア ユーティリティ |
/app/config | Munchkin が使うシリアルライズされた構成ファイル |
/app/payload | テンプレートとなる BlackCat マルウェア サンプル。実行時に Munchkin がこれをカスタマイズする |
/scripts/smb_common.py | SMB 関連の操作用の Python ヘルパー ユーティリティ |
/scripts/smb_copy_and_exec.py | Python スクリプト。SMB 経由でファイルをコピーして実行するために使う |
/scripts/smb_exec.py | Python スクリプト。リモート ファイルの実行に使う |
表 1. VM OS 内に含まれるファイルのファイル パスとその説明
上記のファイルのほかにも多数の Python スクリプトが /usr/bin ディレクトリーには存在しています。BlackCat オペレーターはこれらのスクリプトをこのあと VM 内で行う更新処理で利用します。
- DumpNTLMInfo.py
- Get-GPPPassword.py
- GetADUsers.py
- GetNPUsers.py
- GetUserSPNs.py
- addcomputer.py
- atexec.py
- changepasswd.py
- dcomexec.py
- dpapi.py
- esentutl.py
- exchanger.py
- findDelegation.py
- flask
- futurize
- getArch.py
- getPac.py
- getST.py
- getTGT.py
- goldenPac.py
- karmaSMB.py
- keylistattack.py
- kintercept.py
- ldapdomaindump
- ldd2bloodhound
- ldd2pretty
- lookupsid.py
- machine_role.py
- mimikatz.py
- mqtt_check.py
- mssqlclient.py
- mssqlinstance.py
- net.py
- netview.py
- nmapAnswerMachine.py
- normalizer
- ntfs-read.py
- ntlmrelayx.py
- pasteurize
- ping.py
- ping6.py
- pip
- pip3
- pip3.11
- psexec.py
- raiseChild.py
- rbcd.py
- rdp_check.py
- reg.py
- registry-read.py
- rpcdump.py
- rpcmap.py
- sambaPipe.py
- samrdump.py
- secretsdump.py
- services.py
- smbclient.py
- smbexec.py
- smbpasswd.py
- smbrelayx.py
- smbserver.py
- sniff.py
- sniffer.py
- split.py
- ticketConverter.py
- ticketer.py
- tstool.py
- wmiexec.py
- wmipersist.py
- wmiquery.py
攻撃者は、上記の Python スクリプトを多数使い、被害ネットワーク上でのさらなるマルウェア実行、ラテラルムーブ、パスワード ダンプなどを行えます。
この controller というマルウェアは、BlackCat マルウェア ファミリーと非常によく似た方法で Rust プログラミング言語で書かれています。実行すると、controller はまず独自のシングルバイト XOR 演算で多数の文字列を復号します。
文字列の復号後、基本的なチェックを実行し、期待した構成ファイルやペイロード ファイルが /app ディレクトリー内に存在することを確認します。その後、/app/config ファイルをデシリアライズしてパースします。これらのファイルのいずれかが存在しない場合、またはファイルをパースできない場合、エラー メッセージを表示して終了します。
/app/config ファイルには以下のような情報が豊富に含まれていて、これらの情報を controller マルウェアのサンプルが後で使うことになります。
- アクセス トークン
- タスクの識別子
- 被害者のクレデンシャル (ユーザー名、パスワード、ドメインを含む)
- BlackCat 被害者の URL
- ブロックリストに登録されたファイルの種類とパス
- 暗号化の対象となるホストと共有
構成をパースした後、controller は /payloads/ ディレクトリーを作成してマウントし、これをその後作成する BlackCat インスタンスのホストに使います。controller はカスタマイズした BlackCat サンプルを作成するテンプレートとして前述の /app/payload を使います。このテンプレート ファイル内には、controller がこのファイルの変更時に検索・使用する特定のマーカーがあります。
作成されるファイルは提供された構成をもとにしています。ただし、ファイル名は値をインクリメントして付けられます (以下参照)。
- /payloads/0
- /payloads/1
ペイロードを作成し終わると、マルウェアは指定された SMB/CIFS ドライブに感染するため、指定された構成を繰り返し処理します。これらの試みは、標準出力 (STDOUT) に書き込まれるさまざまな出力内容から大まかに掴めます。その例を以下に示します。
(注: 以下の出力では、実際の IP アドレスと共有名を伏せてあります。)
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 |
05:21:40 [INFO] Loading Config 05:21:40 [INFO] Initializing System 05:21:40 [INFO] Initializing Array 05:21:40 [INFO] Pass #1 05:21:40 [INFO] Executing tasks 05:21:40 [INFO] Task [IP アドレス] 05:21:40 [INFO] Encode Shares [IP アドレス] -> [共有のパス] 05:21:40 [INFO] Scanning [IP アドレス] 05:21:40 [INFO] Task [IP アドレス] 05:21:40 [INFO] Encode Shares [IP アドレス] -> [共有のパス] 05:21:40 [INFO] Scanning [IP アドレス] 05:21:40 [INFO] Task [IP アドレス] 05:21:40 [INFO] Encode Shares [IP アドレス] -> [共有のパス] 05:21:40 [INFO] Scanning [IP アドレス] 05:21:40 [INFO] Task [IP アドレス] [省略] 05:21:40 [INFO] Pass #2 05:21:40 [INFO] Executing tasks 05:21:40 [INFO] Task [IP アドレス] 05:21:40 [INFO] Encode Shares [IP アドレス] -> [共有のパス] 05:21:40 [INFO] Scanning [IP アドレス] 05:21:40 [INFO] Task [IP アドレス] 05:21:40 [INFO] Encode Shares [IP アドレス] -> [共有のパス] 05:21:40 [INFO] Scanning [IP アドレス] 05:21:40 [INFO] Task [IP アドレス] 05:21:40 [INFO] Encode Shares [IP アドレス] -> [共有のパス] [省略] 05:21:40 [INFO] Done! |
マルウェアの実行が完全に行われた後で VM の電源はオフになり、それ以上のアクションは実行されません。
このマルウェア サンプルには次のメッセージが埋め込まれていることがわかりました。このメッセージは使われてはいませんが、おそらく開発の特定段階で組み込まれ、その後使われなくなったものと思われます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
ATTENTION: At the time there is NO CONFIG ENCRYPTION, meaning chat access token is NOT ENCRYPTED in the ISO. Leaking the ISO will result in chat access token leak! It's highly recommended to EJECT and DELETE the ISO right after system boot. DO NOT LEAVE THE ISO ON TARGET SYSTEMS! Usage: Controller is launched at boot time in tmux session named "controller". It will execute all the tasks and exit. If you've set "shutdown" option at config time it will also shutdown the machine after finishing tasks. If "shutdown" option is not set you can relaunch Controller by running "/app/controller". Monitoring: Monitor progress by running "tmux a" with either terminal or ssh connection. |
このメッセージは、BlackCat の作成者からそのアフィリエイトに向け、侵害した環境からこのファイルを削除するように促しているメッセージと思われます。ただ、くだんのアフィリエイトはこのアドバイスに耳を傾けなかったようです。
結論
マルウェア作成者、とくに BlackCat ランサムウェア脅威の背後にいるアクターは、その技術と戦術を繰り返し進化させ続けています。このことは、彼らが開発してアフィリエイトに提供した Munchkin の最近のリリースからも完全に明らかです。
このツールは、VM を活用してホスト上にあるセキュリティ対策を妨害し、この種の脅威に対するセキュリティ コミュニティの防御を出し抜く、というここのところのトレンドに倣うものです。
パロアルトネットワークスのお客様は、以下の製品を通じて、上記の脅威から保護されています。
- WildFireなどクラウド配信型セキュリティサービスを有効にした次世代ファイアウォールは本稿で解説したファイルを悪意のあるものとして検出します。
侵害の懸念があり弊社にインシデントレスポンスに関するご相談をなさりたい場合は、こちらのフォームからご連絡いただくか、infojapan@paloaltonetworks.comまでメールにてご連絡いただくか、下記の電話番号までお問い合わせください(ご相談は弊社製品のお客様には限定されません)。
- 北米フリーダイヤル:866.486.4842 (866.4.UNIT42)
- EMEA: +31.20.299.3130
- APAC: +65.6983.8730
- 日本: (+81) 50-1790-0200
パロアルトネットワークスは、ファイル サンプルや IoC (侵害指標) をふくむ調査結果を Cyber Threat Alliance (CTA: サイバー脅威アライアンス) のメンバーと共有しました。CTA のメンバーはこのインテリジェンスを使って、お客様に保護を迅速に提供し、悪意のあるサイバー攻撃者を体系的に阻害できます。詳細は Cyber Threat Alliance にてご確認ください。
IoC (侵害指標)
/app/controller - Munchkin バイナリー
- 1a4082c161eafde7e367e0ea2c98543c06dce667b547881455d1984037a90e7d
/app/payload - BlackCat スタブ
- b4dd6e689b80cfcdd74b0995250d63d76ab789f1315af7fe326122540cddfad2
/scripts/smb_common.py - Python の SMB クラス
- 41c0b2258c632ee122fb52bf2f644c7fb595a5beaec71527e2ebce7183644db2
/scripts/smb_copy_and_exec.py - Python の SMB コピー/実行 スクリプト
- 2e808fc1b2bd960909385575fa9227928ca25c8665d3ce5ad986b03679dace90
/app/payload - BlackCat スタブ
- b4dd6e689b80cfcdd74b0995250d63d76ab789f1315af7fe326122540cddfad2
YARA ルール
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 |
rule u42_crime_nix_munchkin { meta: author = "Unit 42 Threat Intelligence" date = "2023-10-12" description = "Identifies a scanning utility leveraged by the BlackCat operators that is used to propagate the malware payload to additional hosts via SMB." hash = "1a4082c161eafde7e367e0ea2c98543c06dce667b547881455d1984037a90e7d" reference = "https://unit42.paloaltonetworks.com/blackcat-ransomware/" strings: $str0 = "At the time there is NO CONFIG ENCRYPTION, meaning chat access token is NOT ENCRYPTED in the ISO." xor(1-255) $str1 = "Leaking the ISO will result in chat access token leak!" xor(1-255) $str2 = "It's highly recommended to EJECT and DELETE the ISO right after system boot." xor(1-255) $str3 = "DO NOT LEAVE THE ISO ON TARGET SYSTEMS!" xor(1-255) $str4 = "Controller is launched at boot time in tmux session named \"controller\"." xor(1-255) $str5 = "It will execute all the tasks and exit." xor(1-255) $str6 = "If you've set \"shutdown\" option at config time it will also shutdown the machine after finishing tasks." xor(1-255) $str7 = "If \"shutdown\" option is not set you can relaunch Controller by running \"/app/controller" xor(1-255) $str8 = "Monitor progress by running \"tmux a\" with either terminal or ssh connection" xor(1-255) $str9 = "controller::smb" xor(1-255) $str10 = ": Failed, either no credentials or no ADMIN$ share found" xor(1-255) $str11 = "bin/controller/src/program.rs" xor(1-255) $str12 = "/scripts/smb_exec.py" xor(1-255) $str13 = "No payload configs provided!" xor(1-255) $str14 = "Can't deserialize config" xor(1-255) $str15 = "controller::program" xor(1-255) condition: any of them } |
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 |
rule u42_crime_win_blackcat { meta: author = "Unit 42 Threat Intelligence" date = "2023-10-12" description = "Identifies the BlackCat ransomware malware family, which is written in the Rust programming language." hash = "b4dd6e689b80cfcdd74b0995250d63d76ab789f1315af7fe326122540cddfad2" reference = "https://unit42.paloaltonetworks.com/blackcat-ransomware/" strings: $str0 = "paths_file" xor(1-255) $str1 = "override_credentials" xor(1-255) $str2 = "disable_recursion" xor(1-255) $str3 = "disable_network" xor(1-255) $str4 = "disable_elevate_to_system" xor(1-255) $str5 = "disable_self_propagation" xor(1-255) $str6 = "self_destruct" xor(1-255) $str7 = "The following required argument was not provided: Path to resource to be processed." xor(1-255) $str8 = "Resource is one of:" xor(1-255) $str9 = "Path to local or remote File" xor(1-255) $str10 = "Path to local or remote Directory" xor(1-255) $str11 = "Path to remote server, i.e. \"\\10.0.0.1\"" xor(1-255) $str12 = "If no paths provided:" xor(1-255) $str13 = "A full scan in all available resources will be performed." xor(1-255) $str14 = "(you can provide multiple, single or no paths, i.e.: \"-p /home -p /opt\")" xor(1-255) $str15 = "Override config credentials:\n\nFormat:\n\nusername:password\n\n" xor(1-255) $str16 = "If Resource is a directory and this option is defined, only direct children of that directory will be processed" xor(1-255) $str17 = "disable-recursion" xor(1-255) $str18 = "DISABLE_NETWORK" xor(1-255) $str19 = "Disable automatic network discovery" xor(1-255) $str20 = "disable-network" xor(1-255) $str21 = "DISABLE_ELEVATE_TO_SYSTEM" xor(1-255) $str22 = "Do not attempt to elevalte access token to system" xor(1-255) $str23 = "disable-elevate-to-system" xor(1-255) $str24 = "DISABLE_SELF_PROPAGATION" xor(1-255) $str25 = "Disable network self propagation" xor(1-255) $str26 = "Network propagation is disabled by default in case you provided <" xor(1-255) $str27 = "Attach to parent console instead of allocating new one" xor(1-255) $str28 = "If no command provided an interactive client will be launched, otherwise client will send provided command and exit." xor(1-255) condition: 3 of them } |
追加リソース
- 脅威の評価: BlackCat ランサムウェア – パロアルトネットワークス Unit 42
- BlackCat (ALPHV) ransomware levels up for stealth, speed and exfiltration – IBM X-Force