AkamaiはLayerXを買収し、あらゆるブラウザにエンドツーエンドのセキュリティとリアルタイムのAI利用制御を提供します。 詳細を見る

「Hi」が見えたときには手遅れ - MiraiベースのNoaBot

Stiv Kupchik

執筆者

Stiv Kupchik

January 10, 2024

Stiv Kupchik

執筆者

Stiv Kupchik

Stiv Kupchik is a Security Researcher Team Lead at Akamai. His research projects revolve around OS internals, vulnerability research, and malware analysis. He has presented his research at conferences such as Black Hat, Hexacon, and 44CON. In addition to being a cybersecurity professional, Stiv also has a BSc in physics.

NoaBot は、Mirai ベースのボットネットの 1 つです。Mirai ボットネットは、Linux ベースのモノのインターネット(IoT)デバイスを標的とする、ワーム可能なボットネットです。

エグゼクティブサマリー

  • Akamaiのセキュリティ研究者は、2023年の初めから活動している新しい暗号マイニングキャンペーンを発見しました。

  • このマルウェアは、脅威アクターが変更を加えたカスタムMiraiボットネットを使用してSSHプロトコルで拡散されます。

  • この新しいボットネットNoaBotの機能には、追加のバイナリーをダウンロードして実行したり、新たな被害者に拡散したりするための、ワーム化可能なセルフスプレッダーとSSHキーバックドアが含まれています。

  • 攻撃の一環として、XMRigマイナーの修正バージョンがドロップされます。マイナーは設定を難読化し、さらにはカスタム・マイニング・プールを使用して、マイナーが使用するウォレットアドレスを公開しないようにします。

  • Akamaiは、このボットネットとP2PInfectワームの関連を示す証拠を確認しました。P2PInfectワームは2023年7月にUnit 42によって発見されました

  • このマルウェアの難読化とカスタムコードは、運用セキュリティが高度であることを表します。これは通常、成熟した脅威アクターであることを意味しますが、マルウェアのバイナリーとそれに含まれる一部の文字列の命名はかなり幼稚です。これにより、アトリビューションが困難になります。

  • 2023年には800を超える攻撃IPが確認されており、それらは世界中に均一に分散していました。

  • Akamaiは、感染していないかテストする場合に使用できる痕跡情報(IOC)、クエリー、シグネチャー、スクリプトを公開しています。

はじめに

NoaBotは、Miraiベースのボットネットの1つです。Miraiボットネットは、Linuxベースのモノのインターネット(IoT)デバイスを標的とする、ワーム可能なボットネットです。分散型サービス妨害(DDoS)攻撃に使用されます。最初のMiraiボットネットは2016年に特定されましたが、ソースコードが公開されており、現在は多くのバリアントが見られます。

Akamaiが初めてNoaBotキャンペーンを検知したのは、2023年初めのことです。それ以降、難読化が追加されたり、コマンド&コントロール(C2)やマイニング・プール・ドメインが変更されたりしたことにより、このマルウェアには2度の進化が見られました(図1)。また、P2PInfectワームのサンプルをドロップするインシデントもいくつか見られており、これは2つのキャンペーンが関連していることを示唆しています。

マルウェアのアクティビティの経時的な推移を表すグラフ。2023 年 1 月の少し前から 2023 年 11 月の少し後までのグラフです。 図 1:NoaBot マルウェアのアクティビティの経時的推移

ボットネット

NoaBotボットネットには元のMiraiボットネットのほとんどの機能(スキャナーモジュールや攻撃者モジュール、プロセス名を隠すなど)がありますが、Miraiの元のソースコードとの違いも多数見られます。まず、このマルウェアのスプレッダーは、MiraiのようにTelnetをベースとするのではなく、SSHをベースにしています。

SSHスキャナーはカスタムメイドのようであり、非常に特殊です。接続が確立されると、このボットネットは単に文字列「hi」を送信し、接続を終了します(図2)。接続を開いたままにする必要がなく、存在を確認する必要があるだけであるため、スキャナーのコンテキストにおいては接続を即座に終了することは理に適っています。しかし、なぜ「hi」を送信する必要があるのでしょうか。これは謎です。

SSH hi パケットの Wireshark パケット画面のスクリーンショット。 図 2:「hi」文字列を含む SSH パケット。有効な SSH パケットではないため、Wireshark は不正としてマークします。

このマルウェアのもう1つの奇抜な点は、歌詞が埋め込まれていることです。このボットネットの初期のサンプルには、Rat BoyとIBDYの楽曲「Who's Ready for Tomorrow」の歌詞が使用されていました(図3)。私たちの知る限りでは、このような歌詞には目的がなく、やがてサンプルに歌詞は見られなくなります。

ボットネットサンプルに埋め込まれた歌詞の IDA からの逆コンパイル。 図 3:目的はないと思われる歌詞の埋め込み。

Miraiからのその他の変更点として、このボットネットはSSHスキャナー用の異なる認証情報辞書を使用することや、侵害後の機能(新しいSSH認証キーをバックドアとしてインストールし、追加のバイナリーをダウンロードして実行したり新たな被害者に拡散したりするなど)を多数備えていることが挙げられます(図4)。

ボットネットがサポートするさまざまな感染後コマンドのスイッチケースの逆コンパイル。 図 4:ボットネットのコマンド・スイッチ・ケース

また、Miraiは通常GCCでコンパイルされますが(少なくともソースコードと作成者のガイドによると)、NoaBotはuClibcでコンパイルされます。これにより、ウイルス対策エンジンがこのマルウェアを検知する方法が変化するようです。他のMiraiのバリアントは通常、Miraiシグネチャーで検知されますが、NoaBotのウイルス対策シグネチャーはSSHスキャナーまたは汎用的なトロイの木馬のシグネチャーです(図5)。

さらに、このマルウェアは静的にコンパイルされ、すべてのシンボルが取り除かれています。この非標準的なコンパイルにより、このマルウェアに対するリバースエンジニアリングが極めて困難になっています。

このボットネットの比較的新しいサンプルでは、文字列がプレーンテキストとして保存されるのではなく難読化もされていました。これにより、バイナリーから詳細を抽出したり、分解した一部を調べたりすることが困難になりましたが、エンコーディング自体は高度ではなく、リバースエンジニアリングを行いやすくなりました。 

また、しばらくするとコマンドライン引数が追加されたことがわかりました。最も興味深いのは「noa」フラグです。このフラグにより、このボットネットのインストールは、再起動後に実行されるcrontabエントリー形式の永続的な方法になりました。

ちなみに、ボットネットサンプルのウイルス対策検知の一部に「Noa-」というプレフィックスが付いていたことから、このフラグは出回っており、頻繁に使用されていると思われます。

もう1つの進化は、図4に示すとおり、侵害後の運用に見られます。これはAkamaiが調査した初期のサンプルでは見られませんでした。

左側:VirusTotal からの NoaBot 検知。ほとんどの検知は、「Trojan.Linux.Generic」または「SSHScan」のようなものです。右側:VirusTotal からの Mirai バリアントサンプル検知。ほとんどの検知は明確に Mirai であることを示しています。 図 5:NoaBot 検知(左)と別の Mirai バリアント(右)

マイナー — ウォレットアドレスを見つけられなかった理由

マイナー自体はそれほど複雑ではありません。これは標準的なXMRigマイナーですが、セルフコンパイルされています。また、攻撃者は、マイニング設定の抽出のためのコードをコマンドラインによって供給したり、バイナリー内にプレーンテキストとして保存したりするのではなく、マイナーの実行の前に追加しました(図6)。

マイナーの主な関数の逆コンパイル。一連の関数呼び出しから始まり、さまざまな信号が続きます。 図 6:マイナーの主な関数

XMRig設定を構築するための関数呼び出しの前に、他の関数呼び出しがいくつかあります。失敗した場合、マイナーは終了しますが、そうでなければ標準的なXMRigマイナーロジックに進みます。(上記の逆コンパイルと実際のXMRigソースコードを比較できます。)研究者はなぜXMRig設定を気にするのでしょうか?通常は、接続先のマイニングプールの詳細と、マイニング費用の支払いを受け取るウォレットアドレスが含まれています。ウォレットアドレスを取得して支払いを追跡することで(通常はパブリックプールで追跡されます)、クリプトマイニングギグの収益性を推定できます。

しかし今回は、攻撃者が私たちの一歩先を行っていました。それでは、設定の構築について詳しく見てみましょう。XMRigオープン・ソース・コードでは、マイナーはコマンドラインまたは環境変数のいずれかの方法で設定を受け入れることができます。私たちのケースでは、攻撃者はXMRigのオリジナルコードを変更せずに、メイン関数の前にパーツを追加しました。コマンドライン引数の必要性を回避するために(痕跡情報(IOC)やアラートデフェンダーになる可能性があります)、攻撃者はXMRigコードに制御を渡す前に独自のコマンドラインをより「意味のある」引数に置き換えました(技術用語で言うと、argvを置き換えました)。このボットネットは、ログを印刷するように指示する(たかだか)1つの引数によってマイナーを実行します。

ただし、コマンドラインを置き換える前に、マイナーはその設定を構築する必要があります。まず、プレーンテキストとして保存されている基本的な引数、つまり、3つのランダムな文字、スレッドフラグ、およびプールのIPアドレスのプレースホルダーを持つマイナーを識別するfig-idフラグをコピーします(図7)。

しかし、xmmレジスターを介して設定がロードされるため、IDAは実際には最初の2つのロードされた引数(バイナリー名とプールIPプレースホルダー)を見逃してしまいます。

マイナーのための新しい argv の構築の逆コンパイル。設定文字列のオフセットをロードし、新しい文字列の配列を割り当てて、ループ内でコピーします。 図 7:基本的なマイナー設定のコピー

次に、マイナーはプールのドメイン名を復号します。ドメイン名は、XOR演算によって復号されたいくつかのデータブロックに保存され、暗号化されます。XMRigはドメイン名で動作する可能性がありますが、攻撃者は手順を追加することにし、独自のDNS解決関数を実装しました。GoogleのDNSサーバー(8.8.8.8)と直接通信し、応答を解析してドメイン名をIPアドレスに変換します。

設定の最後の部分も同様に暗号化されます。これは、マイナーがプールに接続するためのパスキーです。結果として、マイナーの設定全体は次のようになります。

<miner_binary_name> -o <pool_ip> --rig-id <random_id> --threads <cpus> –pass espana*tea

何かが不足していることに気付きましたか?そうです、ウォレットアドレスがありません。

私たちは、攻撃者はパブリックプールではなく独自のプライベートプールを実行することを選択したため、ウォレット(プールやルール)を指定する必要がなくなったのだと考えています。しかしサンプルでは、GoogleのDNSでマイナーのドメインが解決されていないことがわかりました。ドメインが解決できなくなったため、私たちの見解を立証することも、プールからより多くのデータを収集することもできません。最近はマイナーをドロップするインシデントが見られないため、攻撃者はより良い環境を求めてどこかに行ってしまった可能性もあります。

Miraiは古すぎて、Rustで作成されたものが登場している

最近のインシデントにはP2PInfectのサンプルもありました。P2PInfectは、Rustで記述されたピアツーピア自己複製ワームです。P2PInfectは2023年7月に初めて見られましたが、NoaBotの活動は2023年1月以降に見られています。つまり、NoaBotがP2PInfectに少しだけ先行しています。なぜMiraiから他のものに切り替えるのでしょうか?カスタム仕様のものもあります。明確な答えはありませんが、いくつか思い当たることがあります。

まず、カスタムコードは変更されているため、再利用されたコードよりもリバースエンジニアリングが困難です。次に、攻撃者はテクノロジーに精通していると思われ、好奇心や退屈(あるいはその両方)を理由にマルウェア開発に挑戦している可能性があります。最後に、P2PInfectがRedisサーバーをターゲットにしていることを考えると、単に異なる目的のための異なるツールである可能性があります。

単なるコラボレーションではなく同じ脅威アクターであると思われるのはなぜでしょうか?100%確実ではありませんが、私たちはほぼ確信しています。すべては、このマルウェアの技術的な専門性と、10代の若者レベルの幼稚なジョークが含まれていること(マイナーの名前に下品な表現が挿入されていること、ゲームのポップ音楽の歌詞がマルウェアバイナリーに埋め込まれていること、オープンポートのスキャン中に「hi」と送信することなど)に行き着きます。 

P2PInfectはその伝統を継承しています。洗練されたツールのように見えますが、Unixソケットを使用しており、「NunzombiE」という名前を付けています(図8)。また、NunzombiEは難読化されており、実行時にデコードされますが、このワームには「fast_vuln_file」と「slow_vuln_file」の文字列も埋め込まれています。これは実行可能ファイルに含まれる完全に合法な文字列であり、ここにはレッドフラグはありません。

13904 socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC, 0) = 3 13904 bind(3, {sa_family=AF_UNIX, sun_path=@"NunzombiE"}, 12) = 0 図 8:NunzombiE という Unix ソケットを作成する P2PInfect ワームの strace

被害

2023年に私たちのハニーポットを攻撃したソースIPは849種類あります。ジオロケーションを見ると、アクティビティは世界中にかなり均一に分散していることがわかります。このマルウェアはワーム化可能であり、新たな被害者が攻撃者になることを考えれば、これは当然のことです。しかし、顕著なホットスポットが1つだけあります。それは中国です。2023年に見られたすべての攻撃の約10%が中国で発生しており、図9ではこのホットスポットが最も明るい色の点で示されています。

NoaBot の攻撃元の地理的なヒートマップ。欧州、米国、南米、アジアでアクティビティレベルは均一です。アクティビティレベルの高い唯一の地域は中国です。 図 9:NoaBot の攻撃元のグローバルなジオロケーションヒートマップ

緩和、検知、エミュレーション

このマルウェアのラテラルムーブメント(横方向の移動)は、単純な古いSSH認証情報辞書攻撃によって行われます。

ネットワークへの任意のインターネットSSHアクセスを制限すると、感染のリスクが大幅に減少します。また、このマルウェアは推測可能なパスワードの基本的なリストを使用するため、強力な(デフォルトまたはランダム生成ではない)パスワードを使用するとネットワークのセキュリティが向上します。Akamaiはこのマルウェアが使用する認証情報セットを、GitHubリポジトリで共有しています。

このマルウェアの検知については、バイナリー名を探すこと以外に言えることはそれほどありません。これは/libの下にあるランダム生成フォルダーから実行されるため、プロセス名はおそらく実行方法になります。また、cronジョブがインストールされている場合は、それを検知できるはずです。AkamaiのリポジトリにはIOC CSVファイルのほか、このマインのYARAシグネチャーもいくつかあります。

このボットネットのSSHスプレッダーに対して環境をテストする場合のために、Infection Monkeyの設定ファイルを作成しました。Infection Monkeyとは、Akamaiのオープンソースのアドバーサリー・エミュレーション・プラットフォームです(付録でInfection Monkeyの使用方法を簡単に説明しています)。このマルウェアは非常に大きな認証情報セットを使用するため、すべてをテストするのは現実的ではないことに注意してください(マルウェアは計算や時間のコストを気にしませんが、私たちは気にします)。その代わりに、私たちはより一般的な認証情報のみを設定に含めることを選択しました。より多くの認証情報(または異なる認証情報)を含めたい場合は、この設定に基づいて自由に作成し、独自の修正を加えてください。

また、このInfection Monkeyの設定では、YARAシグネチャーがMonkeyエージェントペイロードでトリガーされるようにする見せかけの文字列が追加されるため、それを使用して検知をテストすることもできます。

Infection Monkeyによる環境のテストが完了すると、侵害することができたすべてのマシンに関するレポートが作成されます。さらに高度な攻撃シミュレーションを行い、より強力な認証情報をテストしたい場合は、クリプトジャッキングプラグインを使用することもできます。 

まとめ

表面上は、NoaBotはそれほど洗練されたキャンペーンではありません。単なるMiraiのバリエーションであり、XMRigクリプトマイナーであり、現時点では大したものではありません。しかし、このマルウェアに難読化が追加されたことと、オリジナルのソースコードへの追加があったことにより、脅威アクターの能力が大きく異なるものになります。脅威アクターはこれほどの技術的なスキルを備えているにも関わらず、このマルウェアのさまざまなサンプルやバイナリーに幼稚な命名規則(「NunzombiE」というUnixソケットなど)が使用され続けています。この特徴により、私たちはNoaBotとP2PInfectを関連付けました。この検知のヒントは、今後のマルウェアキャンペーンにも当てはまると思われます。

付録:Infection Monkeyを使用して環境をテスト

  1. 使用しているオペレーティングシステムに応じて、Infection Monkeyをインストールします。

    1. Windows

    2. Linux

    3. Docker

  2. 設定手順に従います。

  3. Infection Monkey UIのプラグインページからSSHエクスプロイタープラグインをダウンロードします。

Infection Monkey のプラグイン画面。利用可能なプラグイン、インストール済みのプラグイン、新しいプラグインのアップロードの 3 つの切り替えタブがあります。このページは利用可能なプラグインタブです。 図 10:Infection Monkey のプラグイン画面。検索バーを使用して SSH エクスプロイタープラグインを検索し、ダウンロードします。
  1. NoaBotをエミュレートするための設定ファイルをインポートします。

Infection Monkey Island の設定画面。エクスプロイターのセクションと有効なエクスプロイターのリストがあり、空になっています。 図 11:Infection Monkey の設定画面。[Import config]ボタンを押すと、Akamai が提供する設定をインポートできます。
  1. 設定ページの[Network Analysis]タブで、攻撃試行のターゲットを設定します。

  2. Monkeyを実行します。

  3. マップページに移動し、攻撃を観察します。 

  4. [Kill All Monkeys]ボタンを押すだけで、攻撃を終了し、いつでもシミュレーションを停止できます。



Stiv Kupchik

執筆者

Stiv Kupchik

January 10, 2024

Stiv Kupchik

執筆者

Stiv Kupchik

Stiv Kupchik is a Security Researcher Team Lead at Akamai. His research projects revolve around OS internals, vulnerability research, and malware analysis. He has presented his research at conferences such as Black Hat, Hexacon, and 44CON. In addition to being a cybersecurity professional, Stiv also has a BSc in physics.