2022 年 9 月 12 日更新:このブログの初期アクセスとペイロード分析のセクションに新しい情報が追加されました。これには、2022 年 6 月に確認された XorDdos サンプルの調査中に見つかったルートキット コンポーネントの詳細が含まれます。
過去 6 か月間で、XorDdos と呼ばれる Linux トロイの木馬の活動が 254% 増加したことを確認しました。 2014 年に研究グループ MalwareMustDie によって最初に発見された XorDdos は、Linux エンドポイントとサーバーでのサービス拒否関連の活動と、通信に XOR ベースの暗号化を使用していることにちなんで名付けられました。
XorDdos は、クラウド インフラストラクチャやモノのインターネット (IoT) デバイスに一般的に展開されている Linux ベースのオペレーティング システムを標的とするマルウェアが増加している傾向を示しています。 XorDdos は、IoT やその他のインターネットに接続されたデバイスを侵害することで、分散型サービス妨害 (DDoS) 攻撃の実行に使用できるボットネットを蓄積します。ボットネットを使用して DDoS 攻撃を実行すると、 Microsoft が 2021 年 8 月に軽減した 2.4 Tbps の DDoS 攻撃のように、重大な混乱を引き起こす可能性があります。マルウェアの展開やターゲット システムへの侵入など、さらなる悪意のある活動を隠します。
ボットネットを使用して他のデバイスを侵害することもできます。XorDdos は、セキュア シェル (SSH) ブルート フォース攻撃を使用してターゲット デバイスのリモート コントロールを取得することで知られています。 SSH は、IT インフラストラクチャで最も一般的なプロトコルの 1 つであり、リモート システム管理の目的で安全でないネットワーク上で暗号化された通信を可能にするため、攻撃者にとって魅力的なベクトルになっています。 XorDdos が有効な SSH クレデンシャルを識別すると、root 権限を使用してスクリプトを実行し、XorDdos をダウンロードしてターゲット デバイスにインストールします。
XorDdos は、回避と永続化のメカニズムを使用して、その操作を堅牢でステルスに保つことができます。その回避機能には、マルウェアのアクティビティの難読化、ルールベースの検出メカニズムとハッシュベースの悪意のあるファイル ルックアップの回避、プロセス ツリーベースの分析を破るためのアンチ フォレンジック技術の使用が含まれます。最近のキャンペーンでは、XorDdos が機密ファイルを null バイトで上書きすることにより、悪意のあるアクティビティを分析から隠していることがわかりました。また、さまざまな Linux ディストリビューションをサポートするためのさまざまな永続化メカニズムも含まれています。
XorDdos は、マルウェアが他の危険な脅威を配信するために使用される、さまざまなプラットフォームで観察された別の傾向をさらに示している可能性があります。最初に XorDdos に感染したデバイスが、後に XMRig コイン マイナーをさらに展開する Tsunami バックドアなどの追加のマルウェアに感染したことがわかりました。 XorDdos が Tsunami のような二次ペイロードを直接インストールして配布することは確認されていませんが、このトロイの木馬が後続の活動のベクトルとして利用されている可能性があります。
Microsoft Defender for Endpointは、攻撃チェーン全体と、エンドポイントでの潜在的な後続のアクティビティを通じて、トロイの木馬の多段階のモジュール型攻撃を検出して修復することにより、XorDdos から保護します。このブログ投稿では、XorDdos の詳細な分析について詳しく説明し、防御側がその手法を理解し、このステルス マルウェアからネットワークを保護するのに役立てます。
このブログ投稿では、次のトピックについて説明します。
初期アクセス
XorDdos は、主に SSH ブルート フォース経由で拡散します。悪意のあるシェル スクリプトを使用して、ターゲットの Linux デバイスで一致するものが見つかるまで、何千ものサーバーでさまざまなルート資格情報の組み合わせを試します。その結果、マルウェアの感染に成功したデバイスで多くのサインイン試行の失敗が確認されています。
私たちの分析により、初期アクセスのための XorDdos の 2 つの方法が特定されました。最初の方法では、悪意のある ELF ファイルを一時ファイル ストレージ/dev/shmにコピーして実行します。 /dev/shmに書き込まれたファイルはシステムの再起動時に削除されるため、フォレンジック分析中に感染源が隠蔽されます。
2 番目の方法では、コマンド ラインから次のアクティビティを実行する bash スクリプトを実行します。
- 書き込み可能なディレクトリを見つけるために、次のフォルダーを繰り返します。
- /ビン
- /ホーム
- /ルート
- / tmp
- /ユーザー
- /など
- 書き込み可能なディレクトリが見つかった場合、作業ディレクトリを検出された書き込み可能なディレクトリに変更します。
- curlコマンドを使用して、リモート ロケーションhxxp://Ipv4PII_777789ffaa5b68638cdaea8ecfa10b24b326ed7d/1[.]txtから ELF ファイル ペイロードをダウンロードし、ファイルをygljglkjgfg0 として保存します。
- ファイルモードを「実行可能」に変更します。
- ELF ファイルのペイロードを実行します。
- Wget バイナリを移動して名前を変更し、Wget バイナリの悪意のある使用によって引き起こされるルールベースの検出を回避します。この場合、Wget バイナリの名前をgoodに変更し、ファイルを次の場所に移動します。
- mv /usr/bin/wget /usr/bin/good
- mv /bin/wget /bin/good
- ELF ファイル ペイロードのダウンロードを 2 度目に試みます。今度は、適切なファイルのみを使用し、Wget バイナリは使用しません。
- ELF ファイルを実行した後、次の機密ファイルの内容を改行文字で上書きすることにより、過去の活動を隠すアンチフォレンジック手法を使用します。
機密ファイル | 説明 |
/root/.bash_history | 以前に実行されたコマンドが含まれています |
/var/log/wtmp | ユーザーのログイン関連レコードが含まれています |
/var/log/btmp | 失敗したログイン試行の記録が含まれています |
/var/log/lastlog | ユーザーの最近のログイン情報が含まれています |
/var/log/セキュア | 認証失敗、sudo ログイン、認可権限のログなど、セキュリティに関連する情報が含まれます。 |
/var/log/boot.log | システム起動プロセスを介してログに記録されたシステム起動およびメッセージに関連する情報が含まれます |
/var/log/cron | cron ジョブの起動、成功および失敗のエラー ログに関連する情報が含まれます |
/var/log/dmesg | カーネル リング バッファ メッセージ、ハードウェア デバイス、ドライバなどに関連する情報が含まれています。 |
/var/log/firewalld | ファイアウォール アクティビティに関連するログが含まれます |
/var/ログ/メールログ | システムで実行されているメールサーバーに関連する情報が含まれています |
/var/ログ/メッセージ | 一般的なシステム アクティビティ メッセージが含まれています |
/var/ログ/スプーラー | usenet からのメッセージが含まれています |
/var/log/syslog | 一般的なシステム アクティビティ メッセージが含まれています |
/var/log/yum.log | yum ユーティリティを介して実行されたインストール削除更新アクティビティに関連するパッケージ ログが含まれます |
どちらの初期アクセス方法が使用されても、結果は同じです。XorDdos マルウェアである悪意のある ELF ファイルが実行されます。次のセクションでは、XorDdos ペイロードについて詳しく説明します。
最近の調査で確認された他の XorDdos 亜種は、この bash スクリプト インストール方法を使用して、ルートキットをリモートでダウンロードまたは構築します。このインストール方法は、ターゲット デバイスのカーネル ビルドを、攻撃者のコマンド アンド コントロール (C2) サーバーで利用可能なルートキットと一致させることによって差別化されます。
ターゲット デバイスを列挙した後、スクリプトは攻撃者の C2 サーバーと通信し、ターゲット デバイスのカーネル ビルドと一致するルートキットがサーバー上に存在するかどうかを確認します。ターゲット デバイスと一致する既存のルートキットが見つかった場合、スクリプトはルートキットをダウンロードします。次の手順では、XorDdos マルウェアとルートキットの照合とダウンロードを開始します。
- bash スクリプトは、次の一連のコマンドを使用してターゲット デバイスのカーネル関連情報を取得し、それを攻撃者のサーバーに送信します。
- 読み込まれた Linux カーネル モジュールのリストを取得するためのtail付きのlsmod
- Modinfoは、カーネル モジュールがカーネル空間にロードするために使用するカーネル バージョン番号や CPU タイプなどの情報を含む文字列であるvermagic番号を抽出します。 vermagic番号は、リストされているカーネル モジュールから収集されます。
- vermagic文字列は、エンコードされた形式で攻撃者のサーバーに送信されます。
- カーネル ビルドに固有のルートキット バイナリがサーバー上に存在する場合、XorDdos ELF と共に圧縮された.tarファイルとしてダウンロードされます。
- .tarファイルは、 vermagic文字列の MD5 ハッシュをエンコードして取得した文字列にちなんで名付けられた新しいディレクトリでさらに圧縮解除され、ターゲット デバイスの場所/tmpの下に作成されます。 .tarファイルが解凍されると、XorDdos ELF マルウェアは XorDdos ルートキットをインストールします。
ターゲット デバイスのカーネル ビルドが攻撃者のサーバー上のどのルートキットとも一致しない場合、bash スクリプトは次の手順を開始して、ルートキットをリモートでビルドおよびコンパイルします。
- bash スクリプトは、アーカイブされた Linux カーネル ヘッダーを/tmpディレクトリに準備します。 Linux カーネル ヘッダーは、C 言語の公開カーネル API とデータ構造を定義して、サード パーティのカーネル モジュールをコンパイルできるようにします。
- bash スクリプトは、ELF バイナリ アップローダを/tmpにダウンロードして起動します。このバイナリは、HTTP POSTリクエストを使用して、アーカイブされたカーネル ヘッダーを攻撃者のサーバーにアップロードします。
- ELF バイナリは、 /tmpからアップローダ コンポーネントを削除して、XorDdos のフットプリントを最小限に抑えます。
- アップロードされたアーカイブされたカーネル ヘッダーは、ルートキット コンポーネントを構築およびコンパイルするために C2 サーバーで使用されます。したがって、新しく構築されたルートキット コンポーネントは C2 サーバーからダウンロードできるようになり、将来の他の感染にも利用できるようになります。
- 次に、bash スクリプトは、XorDdos ELF マルウェアをダウンロードしてインストールする一連の手順を開始します。これにより、ルートキットがターゲット デバイスにインストールされます。
XorDdos ペイロード分析
この調査のために分析した XorDdos ペイロードは、削除されていない 32 ビットの ELF ファイルです。つまり、マルウェアの各アクティビティの専用コードを詳述するデバッグ シンボルが含まれていました。デバッグ シンボルを含めると、これらのシンボルを破棄するストリップされたバイナリと比較して、ストリップされていないバイナリのデバッグとリバース エンジニアリングが容易になります。この場合、ストリップされていないバイナリには、ELF ファイルの.strtabセクションの一部として、シンボル テーブル エントリに関連付けられた次のソース コード ファイル名が含まれます。
- crtstuff.c
- autorun.c
- crc32.c
- 暗号化.c
- execpacket.c
- buildnet.c
- hide.c
- http.c
- kill.c
- main.c
- proc.c
- socket.c
- tcp.c
- スレッド.c
- findip.c
- dns.c
上記のソース コード ファイル名のリストは、バイナリが C/C++ でプログラムされており、そのコードがモジュラーであることを示しています。
検出回避機能
XorDdos には、以下に詳述するように、検出を回避するための特定の機能を備えたモジュールが含まれています。
デーモンプロセス
デーモン プロセスは、ユーザーの制御下ではなくバックグラウンドで実行され、制御端末から切り離され、システムがシャットダウンされたときにのみ終了するプロセスです。一部の Linux マルウェア ファミリと同様に、XorDdos トロイの木馬は、以下に詳述するデーモン プロセスを使用して、プロセス ツリーベースの分析を破ります。
- マルウェアは、サブルーチンデーモン (__nochdir、__noclose)を呼び出して、自分自身をバックグラウンド デーモン プロセスとして設定し、内部でfork()およびsetsid( ) を呼び出します。 fork() API は、呼び出しプロセスと同じプロセス グループ ID を持つ新しい子プロセスを作成します。
- fork() API の呼び出しが成功した後、親は「 EXIT_SUCCESS (0)」を返すことで停止します。目的は、子プロセスがグループ プロセス リーダーではないことを確認することです。これは、 setsid() API 呼び出しが成功するための前提条件です。次に、 setsid()を呼び出して、制御端末から自分自身を切り離します。
- デーモン サブルーチンには、最初のパラメーター__nochdirが “0” に等しい値で呼び出された場合、ディレクトリをルート ディレクトリ (” / “) に変更する機能もあります。デーモン プロセスがディレクトリをルート パーティション (「 / 」) に変更する理由の 1 つは、マウントされたファイル システムからプロセスを実行すると、プロセスが停止しない限りアンマウントできないためです。
- 2 番目のパラメーター__nocloseを「0」として渡し、標準入力、標準出力、および標準エラーを/dev/nullにリダイレクトします。これは、 /dev/nullのファイル記述子でdup2を呼び出すことによって行われます。
- マルウェアは複数のシグナル API を呼び出して、制御端末からの可能性のあるシグナルを無視し、現在のプロセスを標準ストリームから切り離し、端末セッションが切断されたときに HangUp シグナル (SIGHUP) を送信します。この回避的なシグナル抑制を実行すると、標準ライブラリが標準出力または標準エラーに書き込もうとしたり、標準入力から読み込もうとしたりして、マルウェアの子プロセスを停止させようとする影響を防ぐことができます。 API signal()は、シグナル signum の処理をハンドラに設定します。これは、 SIG_IGN 、 SIG_DFL 、またはプログラマ定義のシグナル ハンドラのアドレスです。この場合、2 番目のパラメーターは「SIG_IGN=1」に設定されます。これは、signum に対応するシグナルを無視します。
XOR ベースの暗号化
その名前が示すように、XorDdos は XOR ベースの暗号化を使用してデータを難読化します。 dec_conf関数を呼び出して、XOR キー「BB2FA36AAA9541F0」を使用してエンコードされた文字列をデコードします。以下の表は、マルウェアのさまざまなモジュールでアクティビティを実行するために使用される、難読化されたデータのデコードされた値を示しています。
暗号化された文字列 | デコード値 |
m7A4nQ_/nA | /usr/bin/ |
m [(n3 | /置き場/ |
m6_6n3 | /tmp/ |
m4S4nAC/n&ZVx1aA/TB | /var/run/gcc.pid |
m.[$n__#4%Cx1aB]0 | /lib/libudev.so |
m.[$n3 | /lib/ |
m4S4nAC/nA | /var/run/ |
!#Ff3VE.-7x17V[_ | 猫resolv.conf |
<暗号化された_リモート_URL> | hxxp://aa.hostasa[.]org/config.rar |
プロセス名のなりすまし
プロセスが起動されると、引数は null で終わる文字列としてメイン関数に提供されます。最初の引数は常にプロセス イメージ パスです。プロセス名を偽装するために、XorDdos は実行中にすべての引数バッファーをゼロにし、イメージ パスを含む最初の引数バッファーをcat resolv.confなどの偽のコマンド ラインで上書きします。
カーネルルートキット
一部の XorDdos サンプルはカーネル ルートキットをインストールしますが、他のサンプルはルートキットを XorDdos バイナリに埋め込みます。 XorDdos バイナリが実行されると、埋め込まれたルートキット コンポーネントがディスクにドロップされます。
ルートキットは、カーネル データ構造を変更することで悪意のあるコードの存在を隠すカーネル モジュールです。 XorDdos カーネル ルートキットには、通常、次の機能があります。
- root アクセスを提供する
- カーネルモジュールを隠す
- マルウェアのプロセスを隠す
- マルウェアのネットワーク接続とポートを隠す
ルートキットで見つかったデバッグ シンボルに基づくと、XorDdos のルートキット コードは、 SuterusuやRootyなどのオープンソース プロジェクトに触発された可能性があります。
XorDdos は、ルートキットを呼び出して自分自身を隠そうとします。ユーザー モード マルウェアは関数getself () を呼び出します。この関数は readlink( )を呼び出して、ディスク上のマルウェア ファイル イメージの場所をフェッチします。
このステップの後、マルウェアはイメージ ファイルの内容を読み取ってメモリ バッファにロードしようとし、プロセスにunhide()リクエストを送信して、ディスク上のイメージを削除します。この手法により、XorDdos は検出を回避したり、悪意のあるフットプリントを最小限に抑えたりすることができます。
XorDdos ルートキットは、ロードされたモジュールのカーネル内リストを解析して、自身と保護対象のマルウェアをリストから削除します。このアプローチにより、 Ismodなどのツールがカーネルで読み込まれたモジュールを一覧表示できなくなります。
次の表に、ルートキットに含まれるシンボルとそれに対応する機能を示します。
関数名 | 説明 |
Give_root | 新しい資格情報のセットを設定し、その UID、GID を「0」に割り当てることにより、root 権限を提供します |
module_hide | ルートキット カーネル モジュールを非表示にします |
module_show | ルートキット カーネル モジュールを表示します |
get_udp_seq_show | /proc/net/udpをフックして UDP4 接続を隠します/proc/net/udp6をフックして UDP6 接続を隠します |
get_tcp_seq_show | /proc/net/tcpをフックして TCP4 接続を隠します/proc/net/tcp6をフックして TCP6 接続を隠します |
hide_udp4_port | 提供されたポートを非表示の UDP4 ポートのリストに追加します |
unhide_udp4_port | 非表示の UDP4 ポートのリストから提供されたポートを削除します |
hide_udp6_port | 提供されたポートを非表示の UDP6 ポートのリストに追加します |
unhide_udp6_port | 非表示の UDP6 ポートのリストから提供されたポートを削除します |
hide_tcp4_port | 提供されたポートを非表示の TCP4 ポートのリストに追加します |
unhide_tcp4_port | 非表示の TCP4 ポートのリストから提供されたポートを削除します |
hide_tcp6_port | 提供されたポートを非表示の TCP6 ポートのリストに追加します |
unhide_tcp6_port | 非表示の TCP6 ポートのリストから提供されたポートを削除します |
unhide_allz | すべての隠しポートのリストを繰り返し、すべてのエントリを削除します |
firewall_acceptip | 提供された IP アドレスをaccept_ipsリストに追加します |
unfirewall_acceptip | 指定されたエントリをaccept_ipsリストから削除します |
firewall_dropip | 指定された IP アドレスをdrop_ipsリストに追加します |
unfirewall_dropip | 指定された IP アドレスをdrop_ipsリストから削除します |
hide_proc | 指定されたエントリをhidden_procsリストに追加します |
unhide_proc | 提供されたエントリをhidden_procsリストから削除します |
プロセスとポートの隠蔽
マルウェアは、カーネル ルートキット コンポーネントを使用してプロセスとポートを隠そうとします。プロセスを非表示にすると、マルウェアはルールベースの検出を回避できます。
/procファイルシステムには、実行中のすべてのプロセスに関する情報が含まれています。ユーザー モード プロセスは、システムで実行中の各プロセスのサブディレクトリを含む/procディレクトリを読み取ることで、プロセス固有の情報を取得できます。
- /proc/7728 – プロセス ID (PID) 7728 関連の情報が含まれています
- /proc/698 – PID 698 関連の情報が含まれています
strace -e open psコマンドを実行すると、 /proc/$pidでの open 呼び出しのトレースがチェックされ、 psコマンドの一部として実行中のプロセスに関する情報が取得されます。
> strace -e オープン ps open(“/proc/3922/status”, O_RDONLY) = 6 open(“/proc/4324/stat”, O_RDONLY) = 6 open(“/proc/4324/status”, O_RDONLY) = 6 open(“/proc/5559/stat”, O_RDONLY) = 6 open(“/proc/5559/status”, O_RDONLY) = 6 open(“/proc/5960/stat”, O_RDONLY) = 6 open(“/proc/5960/status”, O_RDONLY) = 6 open(“/proc/5978/stat”, O_RDONLY) = 6 open(“/proc/5978/status”, O_RDONLY) = 6
マルウェアが$pid固有のディレクトリを隠すと、ユーザー モードからの対応するプロセスの取得を隠すことができます。
この場合、マルウェアには、適切なアクションを実行するための追加情報を含む入出力制御 (IOCTL) 呼び出しを送信することで、ルートキット コンポーネント/proc/rs_devと通信するための準備が整っています。 IOCTL は、ユーザー モード サービスとカーネル デバイス ドライバーの間で通信するための 1 つの方法です。マルウェアは、番号「0x9748712」を使用して、システム内の他の IOCTL 呼び出しからその IOCTL 呼び出しを一意に識別します。
この数値とともに、整数配列も渡します。配列の最初のエントリはコマンドに対応し、2 番目のエントリは$pidなどの操作対象の値を格納します。
指示 | 使用法 |
0 | ルートキット ドライバーが存在するかどうかを確認する |
1、2 | <PID> を非表示または再表示する |
3 | <ポート> を隠す |
ネットワーク接続を隠す
また、ルートキットはカーネル フックを利用して、 sys_call_table内の元のシステム コール ハンドラを独自のハンドラに置き換えることで、さまざまなカーネル システム コールの通常の呼び出しを妨害します。フック機能により、XorDdos の悪意のあるアクティビティに関連するイベントが除外され、検出が回避されます。
/proc/netインターフェースは、現在アクティブな TCP 接続に関する情報を提供し、カーネル API tcp4_seq_show() および tcp6_seq_show() によって実装されます。
netstat などのユーティリティは、 /proc/net/tcpおよび/proc/net/udpという名前のファイルから TCP/UDP 接続情報を取得します。これらのファイルには、1 行に 1 つのエントリが含まれており、それぞれが送信元ポートと宛先ポート、送信元 IP アドレスと宛先 IP アドレス、およびアクティブな接続に関するその他の関連情報を示しています。
ルートキットは、デフォルトのread()システム コールをフック関数に置き換え、ファイルの読み取りエントリをフィルタリングし、非表示にする予定のポートをスキップして、C2 通信をさらに難読化します。
次の表に、ルートキットが使用するカーネル API とそのフック名を示します。
カーネル API | ルートキットによるフック機能 | 機能説明 |
tcp4_seq_show() | n_tcp4_seq_show() | /proc/net/tcp 、TCPv4 接続を隠す |
tcp6_seq_show() | n_tcp6_seq_show() | /proc/net/tcp6 、TCPv6 接続を隠す |
udp4_seq_show() | n_udp4_seq_show() | /proc/net/udp 、UDPv4 接続を非表示にする |
Udp6_seq_show() | n_udp6_seq_show() | /proc/net/udp6 、UDPv4接続を隠す |
持続メカニズム
XorDdos は、さまざまな永続化メカニズムを使用して、システムの起動時に自動的に起動するさまざまな Linux ディストリビューションをサポートします。詳細については、以下で説明します。
初期化スクリプト
マルウェアは、場所/etc/init.dにinitスクリプトをドロップします。 Initスクリプトは、システムの起動時に任意のプログラムを実行するために使用される起動スクリプトです。 Linux Standard Base (LSB) スタイルのヘッダー セクションに従って、デフォルトのランレベル、説明、および依存関係を含めます。
クロンスクリプト
マルウェアは、 / etc/cron.hourly/gcc.shという場所にcronスクリプトを作成します。このcronスクリプトは、次の内容のパラメーターを渡します。
次に、 /etc/crontabファイルを作成して、3 分ごとに/etc/cron.hourly/gcc.shを実行します。
System V ランレベル
ランレベルはinitのモードであり、Unix System V-Style オペレーティング システムで動作するシステム サービスを指定するシステムです。ランレベルには、通常は 0 から 6 までの番号が付けられた値が含まれており、それぞれが異なるシステム構成を指定し、プロセスの異なる組み合わせへのアクセスを許可します。一部のシステム管理者は、必要に応じてシステムのデフォルトランレベルを設定したり、ランレベルを使用して、ネットワークが動作しているかどうかなど、動作しているサブシステムを特定したりします。 /etc/rc<run_level>ディレクトリには、元のファイルを指すソフト リンクであるシンボリック リンク ( symlinks ) が含まれています。これらのシンボリック リンクは、指定されたランレベルで実行する必要があるスクリプトを指します。
マルウェアは、場所/etc/init.d/<base_file_name>にドロップされたinitスクリプトのシンボリック リンクを作成し、/ etc/rc<run_level>.d/S90<base_file_name>および/etcのランレベル1 ~ 5 に関連付けられたディレクトリを作成します。 /rc.d/rc<run_level>.d/S90<base_file_name>.
自動開始サービス
マルウェアはコマンドを実行して、起動時に XorDdos を自動的に実行するスタートアップ サービスをインストールします。マルウェアのLinuxExec_Argv2サブルーチンは、提供された引数を使用してシステム API を実行します。
コマンドchkconfig –add <service_name>およびupdate-rc.dは、起動時にデーモン プロセスを開始するサービスを追加します。
引数ベースのコードフロー
XorDdos には、プログラムに提供される引数の数に対応する特定のコード パスがあります。この柔軟性により、操作がより堅牢でステルスになります。マルウェアは、最初は引数なしで実行され、その後、PID や偽のコマンドなどのさまざまな引数を使用して別のインスタンスを実行し、クリーンアップ、スプーフィング、永続化などの機能を実行します。
引数ベースの制御を処理する前に、最初のパラメーターを/proc/self/exeとしてreadlink API を呼び出し、完全なプロセス パスをフェッチします。フル パスは、後で自動開始サービス エントリを作成し、ファイルの内容を読み取るために使用されます。
このセクションでは、提供されるさまざまな引数の一部として実行される主なタスクについて説明します。
1: 引数が指定されていない標準コード パス
このコード パスは、マルウェアの標準的なワークフローを示しています。これは、システムの起動場所で作成されたエントリの一部として XorDdos が実行される典型的なワークフローでもあります。
マルウェアは、最初に/usr/bin/ 、 /bin/ 、または/tmp/の場所から実行されているかどうかを確認します。これらの場所から実行されていない場合は、それらの場所にある 10 文字の文字列名と/lib/および/var/run/を使用して自身を作成およびコピーします。
また、 /lib/libudev.soという場所に自身のコピーを作成します。ハッシュベースの悪意のあるファイル ルックアップを回避するために、次の手順を実行します。この手順では、ファイル ハッシュを変更してすべてのファイルを一意にします。
- 書き込み専用にファイルを開きます
- lseek (fd, 0, SEEK_END)を呼び出して、ファイルの最後の位置を指す
- ランダムな 10 文字の文字列を作成します
- ヌル バイトを追加して、ファイルの末尾に文字列を書き込みます。
ファイルを変更した後、バイナリを実行し、二重のfork()を実行して、そのファイルをディスクから削除します。
2: コード パスのクリーンアップ
このコード パスでは、マルウェアは PID として提供される別の引数を使用して実行されます。次に例を示します。
- /usr/bin/jwvwvxoupv 4849
上記の例を使用すると、マルウェアは 64 バイト サイズのメモリ セグメントを IPC キー「0xDA718716」と共有して、引数として提供された別のマルウェア プロセスをチェックします。見つからない場合は、引数なしで独自のバイナリを実行し、 fork() API を 2 回呼び出して、孫プロセスに親プロセスがないことを確認します。その結果、孫プロセスがinitプロセスによって採用され、プロセス ツリーから孫プロセスが切り離され、アンチ フォレンジック手法として機能します。
さらに、提供された$pidで次のタスクを実行します。
- 指定された$pidに対応するプロセス ファイル名を取得します
- 指定された$pidのファイルを削除します
- インストールされているinitサービスを削除します。
- /etc/init.d/<file_name> を削除します
- ランレベル1 ~ 5 の場合、 /etc/rc<runlevel>.d/S90<file_name>をリンク解除して削除します
- コマンドchkconfig –del <file_name>を実行します
- コマンドupdate-rc.d <file_name> remove を実行します
- 引数として渡されたプロセスを終了します。
3: プロセス名スプーフィング コード パス
マルウェアは、追加の 2 つの引数 (偽のコマンド ラインとその PID) を使用して、ドロップされた新しいバイナリを生成します。次に例を示します。
- /usr/bin/jwvwvxoupv “cat resolv.conf” 4849
- /usr/bin/jwvwvxoupv gnome ターミナル 4849
- /usr/bin/jwvwvxoupv トップ 4849
- /usr/bin/jwvwvxoupv pwd 4849
- /usr/bin/kagbjahdic ID 4849
偽のコマンドには次のものがあります。
- 猫resolv.conf
- netstat -an
- バッシュ
- 私は誰
- ID
- CD/etc
- ifconfig eth0
- ifconfig
- エコー「検索」
- 稼働時間
- し
- 上
- GNOME ターミナル
- す
- netstat-antop
- grep「A」
- 誰
- ls-la
- pwd
- ルート-n
- ps-ef
- ls
- 睡眠 1
このコード パスでは、マルウェアはプロセス名のスプーフィングを使用して、実行時に偽のコマンド ラインを変更することでプロセス ツリーから隠れます。次に、コマンド「1」でHidePidPortを呼び出してプロセスを非表示にし、現在のプロセスに関連するディスク上のファイルの内容を読み取ります。
次に、5 秒間のループに入り、次のチェックを実行します。
- /proc/$pid/exeでreadlink API を呼び出して、3 番目の引数の一部として提供された$pidに固有のファイル名を取得します。
- readlink呼び出しが失敗した場合は、ディスク上のファイルが存在しないことを示している可能性があります。この場合、次のようになります。
- $pidのすべてのサービス関連エントリを削除しようとしますが、失敗します。これは、正常な readlink API 呼び出しによってバッファーが満たされるはずのときに、ゼロ化されたバッファーがサービス名として渡されることを可能にするコードの欠陥によるものと思われます。
- 標準のコード パス シナリオと同様のディレクトリを作成します。
- ファイル/lib/libudev.soのstat API を呼び出します。 stat API がゼロ以外の値を返す場合、以前に取得した現在のプロセスのイメージ ファイルの内容を、次の場所にランダムな名前でコピーしようとします。
- /usr/bin/
- /置き場/
- /tmp/
- /lib/libudev.soでstat API 呼び出しが成功した場合、 /lib/libudev.soファイルを上記と同じ 3 つのディレクトリにコピーします。
- 書き込まれたファイルまたはコピーされたファイルのハッシュを変更し、パラメーターを渡さずに実行します。
- readlink呼び出しが成功し、コピーされたバイト数が返された場合、1 秒間スリープし、残りの 5 秒間ループします。
- 現在のプロセスと、3 番目の引数の一部として提供された$pidを再表示します。
- 現在のプロセスのディスク上のファイルを削除します。
4: 引数が指定されていない既知の場所のコード パス
このコード パスは標準のコード パスに似ていますが、主な違いはマルウェアが次のいずれかの場所から実行されることです。
- /usr/bin/
- /置き場/
- /tmp/
これらの場所のいずれかから実行されると、マルウェアは次の関数を呼び出してさまざまなタスクを実行します。
- インストールSYS – この関数は、ランダムな名前を使用して/usr/binフォルダーの下にルートキットを抽出し、カーネルにロードすることで、ルートキットをセットアップします。
XOR ベースの暗号化セクションで説明したように、エンコードされた文字列m7A4nQ_/nAは、マルチバイト キー 0x BB2FA36AAA9541F0でデコードされると、フォルダー パス/usr/binに変換されます。 /usr/binフォルダー パスは、ルートキットがドロップされる場所です。
ドロップされたルートキットは、 insmodコマンドを使用して Linux カーネル モジュールにさらに挿入されます。これに続いて、ドロップされたルートキットがディスクから削除されます。
XorDdos は/proc/rs_devキャラクター デバイスを使用してルートキットと通信します。これは、 CheckLKM()関数を呼び出して、ルートキットがインストール要件を満たしているかどうかを確認します。たとえば、カーネル ヘッダーが正確に一致し、ルートキットのインストールをブロックする可能性のあるテクノロジが存在しないかどうか (セキュア ブートや強制的な署名付きローダブル カーネル モジュール (LKM) の読み込みなど) です。
XorDdos は/proc/rs_devを開こうとします。 Linux カーネル モジュール インターフェイスが起動している場合、XorDdos は一意の識別子 0x9748712 と引数「0」を含む IOCTL 要求を送信して、XorDdos バイナリとそのルートキット間の双方向通信を開始します。
- AddService – システムの起動時にマルウェアが実行されるように、前述の永続的な自動起動エントリを作成します。
- HidePidPort – マルウェアのポートとプロセスを隠します。
- CheckLKM – ルートキット デバイスがアクティブかどうかをチェックし、ルートキットがインストール要件 (カーネル ヘッダーが正確に一致すること、セキュア ブートがないこと、ルートキットのインストールをブロックする可能性のあるその他のテクノロジなど) を満たしているかどうかを確認します。番号「0x9748712」とコマンド「0」を使用した同様の IOCTL 呼び出しを使用して、ルートキットがアクティブかどうかを検出します。ルートキットがアクティブな場合、所有者の値「0xAD1473B8」とグループの値「0xAD1473B8」を使用して、関数lchown(<filename>, 0xAD1473B8, 0xAD1473B8)でドロップされたファイルの所有権を変更します。
- 復号化_リモート文字列 – 同じ XOR キー「BB2FA36AAA9541F0」を使用してリモート URL をデコードし、 config.rarおよびその他のディレクトリをデコードします。 URL をデコードした後、それらをリモート リストに追加します。このリストは、コマンド アンド コントロール (C2) サーバーからのコマンドの通信とフェッチに後で使用されます。
- www[.]enoan2107[.]com:3306
- www[.]gzcfr5axf6[.]com:3306
悪意のあるアクティビティ スレッド
永続的なエントリを作成し、その活動の証拠を削除し、 config.rarをデコードした後、マルウェアは巡回冗長検査 (CRC) テーブルを初期化し、続いてsem_init API を使用して名前のないセマフォを初期化します。このセマフォはpshared値を「0」に設定して初期化され、結果のセマフォがすべてのスレッド間で共有されます。セマフォは、 kill_cfgデータなどの共有オブジェクトにアクセスするスレッド間の並行性を維持するために使用されます。
その後、マルウェアは 3 つのスレッドを初期化して、プロセスの停止、TCP 接続の作成、 kill_cfgデータの取得などの悪意のあるアクティビティを実行します。
kill_process
kill_processスレッドは、次のタスクを実行します。
- 暗号化された文字列をデコードします
- /var/run/gcc.pidのファイル統計をフェッチするか、存在しない場合はファイルを作成します
- /lib/libudev.soのファイル統計を取得するか、存在しない場合はディレクトリ/libを作成し、/lib/ libudev.soの場所に自身のコピーを作成します
- 現在のプロセスに関連付けられているディスク上のファイル情報を取得します。失敗した場合、ループを終了し、現在のプロセスを停止します
- kill_cfgからコンテンツを読み取り、次のような構成ファイル内の一致する指定されたキーに基づいて、プロセスの停止やファイルの削除などの対応するアクションを実行します。
- md5=
- ファイル名=
- rmfile=
- denyip=
tcp_thread
tcp_threadは、 decrypt_remotestr()を使用して以前にデコードされた C2 サーバーとの接続をトリガーします。次のタスクを実行します。
- ファイル/var/run/gcc.pidの内容を読み取り、C2 サーバーとの接続中にデバイスを識別する一意の 32 バイトのマジック ストリングを取得します。ファイルが存在しない場合は、ファイルを作成し、ランダムな 32 バイト文字列で更新します。
- マジック ストリング、OS リリース バージョン、マルウェア バージョン、ルートキットの存在、メモリ統計、CPU 情報、LAN 速度などのデバイスの詳細を含む CRC ヘッダーを計算します。
- データを暗号化し、C2 サーバーに送信します。
- C2 サーバーから次のコマンドのいずれかを受信するまで待機し、 exec_packetサブルーチンを使用してコマンドを処理します。
指示 | 仕事 |
2 | 止まる |
3 | DDoS 攻撃を開始するためのスレッド プールを作成する |
6 | ダウンロードファイル |
7 | ファイルを更新する |
8 | システム情報を C2 サーバーに送信する |
9 | プロセスを停止するための構成ファイルを取得する |
daemon_get_killed_process
daemon_get_killed_processスレッドは、以前にデコードされたリモート URL (hxxp://aa[.]hostasa[.]org/config[.]rar) からkill_cfgデータをダウンロードし、前述と同じ XOR キーを使用して復号化します。その後、30 分間スリープします。
DDoS 攻撃のスレッド プール
マルウェアは、 sysconf(_SC_NPROCESSORS_CONF)を呼び出して、デバイス内のプロセッサの数を取得します。次に、デバイスで見つかったプロセッサの数の 2 倍のスレッドを作成します。
各スレッドを呼び出すと、スレッド ルーチンthreadworkが内部的に呼び出されます。グローバル変数「 g_stop 」と C2 サーバーから受信したコマンドを使用して、スレッドワークは細工されたパケットを 65,535 回送信し、DDoS 攻撃を実行します。
指示 | 関数 | 仕事 |
0x4 | fix_syn | SYN フラッド攻撃 |
0x5 | fix_dns | DNS 攻撃 |
0xA | fix_ack | ACK フラッド攻撃 |
Linux プラットフォームの脅威に対する防御
XorDdos のモジュール性により、攻撃者は、さまざまな Linux システム アーキテクチャに感染できる汎用性の高いトロイの木馬を手に入れることができます。その SSH ブルート フォース攻撃は、多数の潜在的なターゲットに対してルート アクセス権を取得するための、比較的単純ですが効果的な手法です。
XorDdos は、機密データの窃盗、ルートキット デバイスのインストール、さまざまな回避および持続メカニズムの使用、DDoS 攻撃の実行に長けており、敵対者がターゲット システムに潜在的に重大な混乱を引き起こすことを可能にします。さらに、XorDdos は、他の危険な脅威を持ち込んだり、後続の活動のベクトルを提供したりするために使用される可能性があります。
Linux デバイスを標的とする XorDdos やその他の脅威は、Linux オペレーティング システムの多数のディストリビューションにまたがる包括的な機能と完全な可視性を備えたセキュリティ ソリューションの重要性を強調しています。 Microsoft Defender for Endpointは、 次世代のマルウェア対策とエンドポイントの検出と応答 (EDR)機能を使用して、これらの新たな脅威をキャッチするための可視性と保護を提供します。 Microsoft Defender for Endpoint は、クライアントとクラウドのヒューリスティック、機械学習モデル、メモリ スキャン、動作監視など、統合された脅威データからの脅威インテリジェンスを活用して、XorDdos とその多段階のモジュール型攻撃を検出して修復できます。これには、初期アクセスのための悪意のあるシェル スクリプトの使用、誰でも書き込み可能な場所からのバイナリのドロップ アンド 実行、およびエンドポイントでの潜在的な後続アクティビティの検出と保護が含まれます。
防御側は、次の緩和策を適用して、この脅威の影響を軽減できます。
- Microsoft Edge (Linux およびさまざまなプラットフォームで利用可能)、またはMicrosoft Defender SmartScreenをサポートするその他の Web ブラウザーの使用を奨励します。これは、フィッシング サイト、詐欺サイト、エクスプロイトを含み、マルウェアをホストするサイトなど、悪意のある Web サイトを識別してブロックします。
- デバイス検出を使用して、ネットワーク上の管理されていない Linux デバイスを見つけ、Microsoft Defender for Endpoint にオンボードします。
- Microsoft Defender ウイルス対策またはウイルス対策製品の同等のクラウド配信保護を有効にして、新しい未知の亜種の大部分をブロックできるクラウドベースの機械学習保護を使用します。
- Microsoft 以外のウイルス対策が脅威を検出しない場合や、Microsoft Defender ウイルス対策がパッシブ モードで実行されている場合でも、Microsoft Defender for Endpoint が悪意のあるアーティファクトをブロックできるように、ブロック モードで EDR を実行します。
- ネットワーク保護を有効にして、アプリケーションやユーザーがインターネット上の悪意のあるドメインやその他の悪意のあるコンテンツにアクセスするのを防ぎます。
- 完全に自動化されたモードで調査と修復を有効にして、Microsoft Defender for Endpoint がアラートに対して即座にアクションを実行して違反を解決し、アラートの量を大幅に削減できるようにします。
すべてのプラットフォームにわたる脅威の数と巧妙さが増し続けているため、セキュリティ ソリューションは、使用しているオペレーティング システムに関係なく、幅広いデバイスに対して高度な保護を提供できる必要があります。組織はデバイス全体のさまざまなエントリ ポイントからの脅威に直面し続けるため、Microsoft はすべての主要なプラットフォームを保護し、組織がネットワークとシステムを保護するために必要な広範な機能を提供するために多額の投資を続けています。
検出の詳細
Microsoft Defender for Endpoint は、XorDdos のインストーラー スクリプトとルートキット バイナリを次のマルウェアとして検出し、ブロックします。
- DoS:Linux/Xorddos.A
- DoS:Linux/Xorddos!rfn
- トロイの木馬:Linux/Xorddos
- トロイの木馬:Linux/Xorddos.AA
- トロイの木馬:Linux/Xorddos!rfn
- 動作:Linux/Xorddos.A
- バックドア:Linux/XorDDoSRootkit.A
- Trojan:SH/XorDDoSinstaller.A
デバイスで XorDdos が検出されると、Microsoft 365 Defender はアラートを生成し、プロセス ツリー、ファイル情報、ユーザー情報、防止の詳細を含む完全な攻撃チェーンを示します。
タイムライン ビューには、XorDdos に関連するすべての検出および防止イベントが表示され、MITRE ATT&CK の手法と戦術、修復ステータス、イベント エンティティ グラフなどの詳細が提供されます。
次のタイトルのイベントは、XorDdos に関連する脅威活動を示しています。
- libudev.so の内容を libudev.so.6 にまとめました。
- bash プロセスは、ifconfig を呼び出してシステム情報検出を実行しました
- HFLgGwYfSC.elf によってドロップされた後に gcc.sh が実行された
- crond によってシェル コマンドが実行されました
- SUID/SGID プロセス unix_chkpwd が実行されました
ハンティング クエリ
XorDdos アクティビティに関連する悪意のあるアクティビティを見つけるには、Microsoft 365 Defender または Microsoft Defender セキュリティ センターで次の高度な検索クエリを実行します。
サインインの失敗
DeviceLogonEvents | |どこで InitiatingProcessFileName == "sshd" および ActionType == "LogonFailed" | | count() by dayOfYear = datetime_part("dayOfYear", Timestamp) を要約します。 | | dayOfYear で並べ替え | |折れ線グラフをレンダリングする
XorDdos 固有のドロップされたファイルの作成
DeviceFileEvents | | extends FullPath=strcat(FolderPath, FileName) | |フルパス ("/etc/cron.hourly/gcc.sh", "/lib/libudev.so.6", "/lib/libudev.so", "/var/run/gcc.pid")
悪意のあるプロセスのコマンドライン
DeviceProcessEvents | |ここで、ProcessCommandLine には「cat resolv.conf」が含まれています
指標
ファイル情報
ファイル名: | HFLgGwYfSC.elf |
ファイルサイズ: | 611.22KB(625889バイト) |
分類: | DoS:Linux/Xorddos.A |
MD5: | 2DC6225A9D104A950FB33A74DA262B93 |
社1: | F05194FB2B3978611B99CFBF5E5F1DD44CD5E04B |
Sha256: | F2DF54EB827F3C733D481EBB167A5BC77C5AE39A6BDA7F340BB23B24DC9A4432 |
ファイルの種類: | ELF 32 ビット LSB 実行可能ファイル、Intel 80386、バージョン 1 (SYSV)、静的にリンク、GNU/Linux 2.6.9 用、削除されていない |
VT での最初の提出: | 2022-01-25 05:32:10 UTC |
ドロップされたファイル
ドロップされたファイル パス | ファイルの種類 | SHA-256 |
/etc/init.d/HFLgGwYfSC.elf | シェルスクリプト | 6E506F32C6FB7B5D342D1382989AB191C6F21C2D311251D8F623814F468952CF |
/etc/cron.hourly/gcc.sh | シェルスクリプト | CBB72E542E8F19240130FC9381C2351730D437D42926C6E68E056907C8456459 |
/lib/libudev.so | 妖精 | F2DF54EB827F3C733D481EBB167A5BC77C5AE39A6BDA7F340BB23B24DC9A4432 |
/run/gcc.pid | 文章 | 932FEEF3AB6FCCB3502F900619B1F87E1CB44A7ADAB48F2C927ECDD67FF6830A |
/usr/bin/djtctpzfdq | 妖精 | 53F062A93CF19AEAA2F8481B32118A31B658A126624ABB8A7D82237884F0A394 |
/usr/bin/dmpyuitfoq | 妖精 | 798577202477C0C233D4AF51C4D8FB2F574DDB3C9D1D90325D359A84CB1BD51C |
/usr/bin/fdinprytpq | 妖精 | 2B4500987D50A24BA5C118F506F2507362D6B5C63C80B1984B4AE86641779FF3 |
/usr/bin/jwvwvxoupv | 妖精 | 359C41DA1CBAE573D2C99F7DA9EEB03DF135F018F6C660B4E44FBD2B4DDECD39 |
/usr/bin/kagbjahdic | 妖精 | E6C7EEE304DFC29B19012EF6D31848C0B5BB07362691E4E9633C8581F1C2D65B |
/usr/bin/kkldnszwvq | 妖精 | EF0A4C12D98DC0AD4DB86AADD641389C7219F57F15642ED35B4443DAF3FF8C1E |
/usr/bin/kndmhuqmah | 妖精 | B5FBA27A8E457C1AB6573C378171F057D151DC615D6A8D339195716FA9AC277A |
/usr/bin/qkxqoelrfa | 妖精 | D71EA3B98286D39A711B626F687F0D3FC852C3E3A05DE3F51450FB8F7BD2B0D7 |
/usr/bin/sykhrxsazz | 妖精 | 9D6F115F31EE71089CC85B18852974E349C68FAD3276145DAFD0076951F32489 |
/usr/bin/tcnszvmpqn | 妖精 | 360A6258DD66A3BA595A93896D9B55D22406D02E5C02100E5A18382C54E7D5CD |
/usr/bin/zalkpggsgh | 妖精 | DC2B1CEE161EBE90BE68561755D99E66F454AD80B27CEBE3D4773518AC45CBB7 |
/usr/bin/zvcarxfquk | 妖精 | 175667933088FBEBCB62C8450993422CCC876495299173C646779A9E67501FF4 |
/tmp/bin/3200 | ELF (ルートキット) | C8F761D3EF7CD16EBE41042A0DAF901C2FDFFCE96C8E9E1FA0D422C6E31332EA |
インストーラー スクリプト | バッシュスクリプト | 8be8c950d8701ef1149c547ea3f949ea78394787ad1e19fc0eaa7bd7aeb863c2 |
/usr/bin/djtctpzfdq | 妖精 | 53f062a93cf19aeaa2f8481b32118a31b658a126624abb8a7d82237884f0a394 |
/usr/bin/jwvwvxoupv | 妖精 | 359c41da1cbae573d2c99f7da9eeb03df135f018f6c660b4e44fbd2b4ddecd39 |
/usr/bin/kkldnszwvq | 妖精 | ef0a4c12d98dc0ad4db86aadd641389c7219f57f15642ed35b4443daf3ff8c1e |
/usr/bin/zvcarxfqul | ELF (ルートキット) | 483451dcda78a381cc73474711bf3fcae97bd088f67b5a7e92639df52ef5ef25 |
/usr/bin/zvzvmpqnv | ELF (ルートキット) | c8f761d3ef7cd16ebe41042a0daf901c2fdffce96c8e9e1fa0d422c6e31332ea |
ダウンロード URL
- www[.]enoan2107[.]com:3306
- www[.]gzcfr5axf6[.]com:3306
- hxxp://aa[.]hostasa[.]org/config.rar
Ratnesh Pandey 、 Yevgeny Kulakov 、 Jonathan Bar Or
サウラブ・スワループと
Microsoft 365 Defender 研究チーム
Comments