ニュースの概要
- 大規模なランサムウェア攻撃や巨額の身代金などが頻繁にニュースの見出しを飾る中、ランサムウェア以外の手口を利用して隠密に金銭的利益を得ようとする攻撃者も後を絶ちません。
- Cisco Talos は最近、「Xanthe」という暗号通貨マイニングボットによる攻撃キャンペーンを発見しました。Xanthe は、Docker 関連の脅威を追跡するためにシスコが設置したセキュリティハニーポットの 1 つを侵害しようとしていました。
- Xanthe は MITRE ATT&CK フレームワークのさまざまな手口を使用します。特に注目を引くのは、セキュリティツールの無効化(T1089)、外部リモートサービス(T1133)、一般向けアプリケーションのエクスプロイト(T1190)、リソースハイジャック(T1496)、タスクスケジューリング(T1053)、Bash 履歴(T1139)、SSH ハイジャック(T1184)、ルートキット(T1014)などです。
攻撃者は次々と新しい手口を生み出して、金銭的利益をもぎ取ろうとしています。Cisco Talos は最近、複数の方法で拡散するマルチモジュール型のボットネットと、オンライン通貨 Monero をマイニングして攻撃者に金銭的利益をもたらすペイロードを組み合わせた興味深いキャンペーンを発見しました。このキャンペーンは Linux システムに影響します。
攻撃者はさまざまな手口でネットワーク上での拡散を試みています。具体的には、クライアント側証明書を収集し、SSH を使用して既知のホストへの拡散を試みたり、Docker API が正しく設定されていないシステムへの拡散を試みたりしています。
最新情報
本稿は、Xanthe の活動に関する業界初の報告になると思われます。活動が確認されたのは今年 3 月で、あらゆるモジュールが繰り返し改良されてきました。
仕組み
感染プロセスは、ダウンローダモジュールによってメインのインストーラモジュールがダウンロードされるところから開始されます。インストーラモジュールには、ローカルおよびリモートネットワーク上の他のシステムに拡散する機能も含まれています。メインモジュールは、クライアント側証明書を盗み出し、パスワードなしで他のホストに接続することにより外部への拡散を試みます。
また、2 つの bash スクリプトを実行してセキュリティサービスを終了し、競合する他のボットネットを削除します。さらに、スケジュール設定された cron ジョブを作成し、システム起動スクリプトの 1 つを変更することにより永続性を確保します。
メインペイロードは XMRig Monero マイニングプログラムの亜種で、プロセスを列挙するさまざまなツールからマイナープロセスの存在を隠蔽する共有オブジェクトによって保護されています。
影響
防御側は警戒を怠らず、ネットワーク内のシステムの動作を常に監視する必要があります。攻撃者は水のようにわずかな亀裂を見つけ出し、ネットワークへの侵入を果たします。同様に、Xanthe も、Docker API が公開されたままになっているシステムに侵入して拡散する機能を備えています。最も貴重な資産の保護が何より重要ですが、インフラストラクチャに照準を当てていない脅威も無視してはなりません。
技術概要
背景
ハニーポットは、新しい脅威や脅威インテリジェンスを収集するために最も一般的に使用されるシステムの 1 つであり、オープンソースのものも数多く存在します。Cisco Talos およびシスコ セキュリティ & トラスト部門でも、各種のプラットフォーム、プロトコル、アプリケーションに対する攻撃を追跡するためのハニーポットを多数導入しています。
現在、Docker は最も一般的なコンテナ管理プラットフォームの 1 つです。最近では、Web アプリケーションやクラウドアプリケーションの開発と展開に使用されるデファクトスタンダードとなっています。ただし、使用経験がある人であれば誰でもすぐに気付くことですが、Docker を適切に運用するには長期間の学習が必要となります。そのため、Docker が不適切に設定されているケースは非常に多く、セキュリティ対策がほとんど適用されないまま Docker デーモンが外部ネットワークに公開されていることも珍しくありません。
Shodan によると、設定が不適切な Docker 実装はインターネット上で 6,000 以上も公開されています。攻撃者たちは、これらの無防備なサーバをエクスプロイトする方法を次々に見つけ出しています。
設定が不適切なために API が保護されず公開されたままになっている Docker 実装(Shodan 調べ)
Docker デーモンは数年前から攻撃の標的とされており、シスコセキュリティチームは Docker を標的とする攻撃者のアクティビティを追跡し続けています。
Docker ハニーポット
シスコ セキュリティ & トラスト部門は、Docker ハニーポットの実装を開発しました。Docker ハニーポットは、Docker HTTP API の一部をエミュレートするシンプルなサーバです。このサーバは以下のリクエストに応答します。
- HTTP GET version
- HTTP GET ping
- HTTP POST create image
- HTTP エラーコード 500(その他の大半のケース)
このサービスはクラウドプロバイダーで運用されることを前提として開発されており、現在はシェルで実行されるスクリプトとして実装されています。偵察イベントやコンテナの作成が検出されると、次のいずれかのサービスのログに記録されます。
- Webex Teams
- Slack
- MongoDB
- HTTP コレクタ
このハニーポットは、偵察の一環として、Docker 攻撃に関連する疑いがある不審なアクティビティをログに記録します。最近、Talos は次のイベントをハニーポットのログで発見しました。
Docker を標的とする暗号通貨マイナー Xanthe
このイベントは、まだあまり一般に知られていない暗号通貨マイニングボットネットに関連しています。Talos では、メインの拡散スクリプトのファイル名にちなんで、このマイニングボットを Xanthe と呼んでいます。オープンソースの情報を調査したところ、このボットが出現し始めた当初にいくつかのサンプルが少数のマルウェア対策エンジンによって検出されていたことが VirusTotal でわかりました。Xanthe は実際には 2020 年 3 月から継続的に活動していたにもかかわらず、検出されたスクリプトは 1 件のみでした。
古いバージョンの Xanthe と VirusTotal での検出件数
最初に実行される pop.sh スクリプトは、シンプルなダウンローダスクリプトです。pop.sh は、メインのボットモジュールである xanthe.sh をダウンロードして実行します。その後、xanthe.sh がすべての追加モジュールをダウンロードして実行します。また、メインモジュールは、ネットワークをスキャンし、公開されたままになっている Web API を使用して Docker デーモンをエクスプロイトすることにより、SSH 経由で他のシステムに拡散する役割も担っています。
ダウンロードされて実行されるモジュールには、次の 4 つがあります。
- プロセス隠蔽モジュールso
- 他のマイナーやセキュリティサービスを無効にするシェルスクリプト
- 競合する他の Docker 常駐型暗号通貨マイニングトロイの木馬の Docker コンテナを削除するシェルスクリプト
- XMRig バイナリと、同時にダウンロードされる JSON 設定ファイルjson
Xanthe のモジュールと拡散ベクトル
メインモジュール:xanthe.sh
xanthe.sh は、他の大部分の Xanthe モジュールと同様に、追加のモジュールをロードしてボットを他のシステムに拡散するシェルスクリプトです。
Xanthe メインモジュールの初期化段階では、xesa.txt と fczyo という 2 つの追加モジュールのダウンロードと実行が試みられます。これらの追加モジュールについては、次のセクションで詳しく説明します。
次に、メインモジュールは、XMRig マイナーの亜種をダウンロードして java_c という名前で保存します。また、JSON 設定ファイルと、メモリ内のマイナープロセス名を隠蔽するための libprocesshider 共有ライブラリもダウンロードします。ダウンロードされたすべてのファイルの整合性が、ハードコードされた MD5 チェックサム値を使用して確認されます。MD5 チェックサムに失敗した場合は、ダウンロードが再試行されます。
ダウンロード元の URL は、URL ごとに配列としてハードコードされています。ダウンロードに使用される URL は、ダイレクト IP アドレスの 139[.]162[.]124[.]27 および 34[.]92[.]166[.]158 です。本稿の執筆時点では、今年 8 月にリリースされた NginX バージョン 1.19.2 が IP アドレス 34[.]92[.]166[.]158 で稼働しています。また、アドレス 139[.]162[.]124[.]27 では Debian Linux ディストリビューションが稼働していて、ファイルの配信には古いバージョンの Apache (2.4.10)が使用されています。いずれのサーバでも、おそらく設定が不適切であるために /files/ ディレクトリが外部に公開されており、このディレクトリが悪意のあるファイルをホストするために利用されています。
Xanthe は、モジュールのダウンロードやロギング URL との通信に curl を使用します。コード全体を通じて Iplogger.org が頻繁に使用されていますが、通信先のロギング URL はプロシージャごとに異なります。Curl のユーザエージェント文字列は、その時点で実行されているフェーズと機能に応じて、要求ごとに手動で指定されます。
ユーザエージェント文字列と関連する機能
その後、メインモジュールは、/tmp ディレクトリがマウントされていて、/tmp ディレクトリ内のファイルが実行可能であることを確認します。
次に、ps コマンドを実行して、マイナーがすでにメモリ内で実行されているかどうかを確認します。まず libprocesshider のロードを無効化した後に、ps を使用して java_c プロセスが実行されているかどうかを確認します。
SSHD の設定と拡散
今回調査した Xanthe 亜種の主な感染ベクトルは SSH と考えられます。この亜種は、既知のホスト用に保存されているクライアント側証明書を指定することで SSH を利用します。
Xanthe は最初に SSH デーモンの設定を変更し、セキュリティレベルを下げることで、一部の機能を有効にします。SSH デーモンの設定は、root アカウントログイン、パスワード、クライアント公開キー、GSSAPI 認証(Kerberos 認証など)を有効にした状態で、ポート 22 および 33768 で稼働するように変更されます。設定ファイルが変更されると、SSH サービスが再起動されます。
最後に、localgo と名付けられた拡散機能について説明します。まず、localgo は、icanhazip.com に接続し、感染先ホストの外部からアクセス可能な IP アドレスを取得します。次に、find ユーティリティを使用して、クライアント側証明書のインスタンスを検索します。見つかった証明書は、リモートホストへの認証に使用されます。さらに、find を使用して、名前が「id_rsa」から始まるファイルと、拡張子が「.pem」になっているファイルを検索します。また「cat」と「grep」の組み合わせを使用して、SSH 構成ファイルと bash 履歴ファイルを解析し、その他のキーを検索します。
可能性のあるキーがすべて見つかると、既知のホストと TCP ポートを検索し、それらのホストへの接続に使用できるユーザ名も検索します。最後に、見つかったユーザ名、ホスト、キー、ポートの組み合わせをすべて使用して接続を試みるループ処理を開始します。接続に成功すると、リモートホストでの認証を完了し、コマンドラインを起動してリモートシステムにメインモジュールをダウンロードして実行します。
Xanthe ベースの SSH 拡散コマンド
利用可能な機能のコメントアウト
Talos は、このボットが Docker ハニーポットに侵入して拡散を試みていることを発見しましたが、分析の時点では Docker をスキャンして拡散するルーチンがコメントアウトされていました。作成者のプログラミングスタイルは、すべてのスクリプトに共通しています。まず最初に、関数を定義して実装してから、スクリプトの下部ですべてのフローを定義しています。そのため攻撃者は、不要な関数呼び出しをコメントアウトすることで、どの機能を有効にするかを選択することができます。
# 文字を使用して行をコメントアウトすることにより特定の機能を有効化/無効化
Docker 拡散機能は、「scangogo」関数に含まれています。この関数はまず、広範にポートスキャンを行うユーティリティ masscan をインストールして、ローカルネットワークをスキャンします。また、外部 IP アドレスの /24 サブネットをスキャンして、設定が不適切なために TCP ポート 2375 で Docker API が公開されているホストを探します。
外部に公開されている Docker API が見つかると、Xanthe はリモートホストを指定するパラメータを使用して Docker の実行を試みます。さらに、busybox イメージに基づいて新しいコンテナを作成し、コマンドを実行してダウンローダの bash スクリプト「pop.sh」を起動します。
補助シェルスクリプト
メインモジュールが起動されるとすぐに、2 つの補助モジュール(xesa.txt と fczyo)がダウンロードされて実行されます。
xesa.txt:キラーモジュール
Xesa はまずシステムログファイルを削除します。また、特定の IP アドレスを /etc/hosts ファイルに追加し、DNS リゾルバがそれらのアドレスをローカルで 0.0.0.0 に解決してブロックするように設定します。ブロックされる IP アドレスは、競合するボットネットや、Alibaba クラウド セキュリティ センター エージェントなどのセキュリティサービスに関連するアドレスです。また、Xesa は複数のアカウントの削除も試みます。これらのアカウントは、Kinsing などの競合ボットネットに関連しているものと考えられます。
続いて、感染先のシステム上で競合するマイナーが実行されていないかを確認するために、大量の ps コマンドを実行します。競合するマイナーが見つかった場合は、関連プロセスが終了され、関連ファイルがシステムから削除されます。
感染先システムから削除される競合マイナーの Docker イメージ
Xesa の主要機能の 1 つは、競合する Docker コンテナが稼働している場合は終了させて、ローカルの Docker リポジトリからイメージを削除することです。その後、java_c プロセスが実行されていることが確認されると、Xesa は終了します。
FCZYO:永続性とリモートアクセスの設定
2 つ目の補助モジュールである fczyo は、xesa.txt に似ていますが、やや異なるシステム機能を終了する役割を担っています。まず 2 つのパブリック DNS サーバ 1.1.1.1 と 8.8.8.8 を /etc/resolve.conf ファイルの先頭に追加し、DNS リゾルバを再起動して、それらのパブリックサーバを使用するように設定します。次に、競合する Docker コンテナが稼働している場合は、それらのコンテナを終了します。
その後、感染先のシステム上でセキュリティプロセスが実行されていないことを確認し、スケジュール設定されたジョブの実行に必要な crond が実行されていることを確認します。
Fczyo は、感染先のシステム上で次のユーザの追加を試みます。
- sysall
- system
- logger
- autoupdater
作成に成功すると、Fczyo は管理者権限でコマンドを実行できるように、これらのユーザを sudoer のリストに追加します。また、クライアント側秘密キーを使用してホストにアクセスできるように、公開キーを SSH 設定に追加します。その後、Iptables を使用して、IP アドレス 64[.]225[.]46[.]44 からの接続を許可し、ポート 2375 および 2376 への着信接続をすべて切断するようにファイアウォールを設定します。これは、他のボットが Docker API の誤設定をスキャンしてシステムに再感染できないようにするための対策と考えられます。
cron ジョブがすでに設定されているかどうかを Fczyo が確認
次のメイン機能ブロックには、スケジュール設定された cron ジョブを作成し、Xanthe モジュールを 30 分おきにダウンロードサーバからダウンロードして実行する機能が含まれています。また、システムが起動するたびに Xanthe をダウンロードして実行するように /etc/rc.d/rc.local ファイルを変更する機能も含まれています。
さらに、Fczyo は bash 履歴をクリアし、ufw や Sandfly Security 社製品のファイルを無効化して削除することを試みます。
プロセス隠蔽モジュール
Xanthe とその補助モジュールは共有オブジェクト libprocesshider を使用します。このオブジェクトは、/usr/local/lib/libprocesshider.so にダウンロードされてインストールされます。共有オブジェクトのロードは、ライブラリのパスを /etc/ld.so.preload ファイルに追加することで可能になります。ld.so.preload には、最初にロードする必要があるユーザ指定の ELF 共有ライブラリのリストが含まれています。このリストを使用することで、他の共有ライブラリの関数を選択的にオーバーライドすることができます。
ps などのプロセスツールは、/proc ファイルシステムと readdir 関数を使用して、実行中のすべてのプロセスを列挙します。readdir 関数の悪意のあるコピーの実装に悪意のある共有オブジェクトが使用される場合は、この関数が標準ライブラリ関数の前に呼び出されます。悪意のある readdir 関数のコピーには、readdir の結果を変更して一部のプロセスの詳細を省略する機能が含まれています。ライブラリのソースコードは Github で公開されています。そのため、攻撃者は隠蔽する必要があるプロセス実行可能ファイルの名前(今回分析した亜種では java_c)を含むハードコード済みの文字列を変更するだけで Github のソースコードをそのまま再利用しています。
まとめ
今回の記事では、これまで一般に公表されていなかった Monero マイニングボットネット Xanthe を取り上げました。このボットネットは、既存の秘密キーを使用して認証を完了し、SSH を使用して拡散を試みます。このボットネットは、Docker ハニーポットシステムで発見されました。メインモジュールには、不適切に設定された Docker API をエクスプロイトして拡散する機能があります。ただし、この機能は、今回調査した亜種では無効化されていました。
現在、Docker はアプリケーションの開発や展開に不可欠なツールですが、適切に運用できるようになるまでに長期間の学習が必要であることには注意が必要です。Docker のデフォルト設定は安全ではありません。そのため、API が公開されたままになっていることが珍しくありません。攻撃者は、そのような Docker 環境を見つけ出し、「自由」に使えるリソースとしてカスタムコンテナを実行することで、攻撃を仕掛けることができます。
管理者と DevOps エンジニアは、組織のセキュリティを検討する際、製品開発システムや展開システムのコンポーネントがすべて適切に設定され、安全性が確保されていることを確認する必要があります。
カバレッジ
お客様がこの脅威を検出してブロックするための方法を以下に記載します。
Advanced Malware Protection(AMP)は、これらの攻撃者によるマルウェアの実行の阻止に最適です。AMP 内に存在するエクスプロイト防止機能は、このような未知の攻撃からお客様を自動的に保護するように設計されています。
Cisco クラウド Web セキュリティ(CWS)または Web セキュリティアプライアンス(WSA)の Web スキャンは、悪意のある Web サイトへのアクセスを防止し、上述したような攻撃で使用されるマルウェアを検出します。
E メールセキュリティは、攻撃の一環として攻撃者が送りつける不正な電子メールをブロックします。
次世代ファイアウォール(NGFW)、次世代侵入防御システム(NGIPS)、Cisco ISR、Meraki MX などのネットワーク セキュリティ アプライアンスは、今回の脅威に関連する不正アクティビティを検出します。
AMP Threat Grid は、悪意のあるバイナリを特定し、すべてのシスコ セキュリティ製品に保護機能を埋め込みます。
Umbrella (シスコのセキュア インターネット ゲートウェイ(SIG))は、社内ネットワークの内外で悪意のあるドメイン、IP、URL への接続をブロックします。
オープンソースの Snort サブスクライバルールセットをお使いであれば、Snort.org で購入可能な最新のルールパックをダウンロードすると、最新状態を維持できます。
OSquery
Cisco AMP ユーザは、Orbital Advanced Search を使用して複雑な OSquery を実行し、エンドポイントが MedusaLocker などの脅威に感染しているかどうかを確認できます。この脅威に感染しているかどうかを確認するための OSquery については、以下をクリックしてください。
https://github.com/Cisco-Talos/osquery_queries/blob/master/packs/linux_malware.conf
IOC
IP アドレス
34[.]92[.]166[.]158
165[.]22[.]48[.]169
138[.]68[.]14[.]52
139[.]162[.]124[.]27
64[.]225[.]46[.]44:着信
ドメイン
xanthe[.]anondns[.]net
monero[.]gktimer[.]com
pool[.]supportxmr[.]com:マイニングプール(正規のアドレス)
ウォレットアドレス
47E4c2oGb92V2pzMZAivmNT2MJXVBj4TCJHad4QFs2KRjFhQ44Q81DPAjPCVc1KwoKQEp1YHdRMjGLUe6YdHPx5WEvAha1u+35000
URL
hxxp://165[.]22[.]48[.]169:8080/adnckil2
hxxp://138[.]68[.]14[.]52:8080/files/adnckil
hxxp://138[.]68[.]14[.]52:8080/files/iqmjlf.jpg
hxxp://iplogger[.]org/10xNq3
hxxps://iplogger[.]org/1Rfhy7
hxxps://iplogger[.]org/1iGce7
hxxps://iplogger[.]org/1mmup7
hxxp://34[.]92[.]166[.]158:8080/files/pop.sh
hxxp://34[.]92[.]166[.]158:8080/files/xesa.txt
hxxp://34[.]92[.]166[.]158:8080/files/fczyo
hxxp://34[.]92[.]166[.]158:8080/files/java_c
hxxp://34[.]92[.]166[.]158:8080/files/config.json
hxxp://34[.]92[.]166[.]158:8080/files/libprocesshider.so
古い亜種
43fba1c1d95a300a96a20890a1c768a5218b04516893744cff82097a52a51f7c
6cb730a34e0b3de1e927b1c137e1d1819a1550091c0d35de30f68dfacd554783
b16079a80bdd85cbb72a0fa5c956d43922a7518697eeb8a1638164418820390c
8f7c7f3248ba510ca06cbe62728f06703acedc8e54b3609a069c1090ab957224
6a5a0bcb60944597d61d5311a4590f1850c2ba7fc44bbcde4a81b2dd1effe57c
新しい亜種
10e1d73e8a894e5bf07e6779ac8085da09aa445e61072349310158b0276bb28d – config.json
071633c8ea4bac5d6acfe1cdc22b3a3f258d99ee8073dd2611eee9876ae40d64 – xanthe.sh
d4637a2efda1f8a96e7f3e31f2c618ce680d3816ba38f075fbefefec77a10f16 – pop.sh
73bfcf268a8481d55db0da34eaf3094f010ed5c0eb5acaf632d2f97ed7bab036 – fczyo
0e6d37099dd89c7eed44063420bd05a2d7b0865a0f690e12457fbec68f9b67a8 – libprocesshider.so
e1a3ff46a99f4fd93d99b0e61fe4ddef8f894c2a69490d71cb34ab10e4afc0d2 – xesa.txt
30a77ab582f0558829a78960929f657a7c3c03c2cf89cd5a0f6934b79a74b7a4 – java_c
本稿は 2020 年 12 月 01 日に Talos Group のブログに投稿された「Xanthe – Docker aware miner」の抄訳です。