ManageEngine ADSelfService Plusに対する標的型攻撃キャンペーンで防衛関連企業など機密情報を扱う産業分野が被害を受けたことが判明

A conceptual image representing cybercrime, such as the use of the NGLite backdoor described here and the KdcSponge credential-stealing tool.

This post is also available in: English (英語)

概要

2021年9月16日、米国のサイバーセキュリティ・インフラストラクチャセキュリティ庁(Cybersecurity Infrastructure Security Agency, CISA)は、ZohoのManageEngine ADSelfService Plusとして知られるセルフサービス型のパスワード管理およびシングルサインオンソリューションにおいて、新たに確認された脆弱性をAPT攻撃者が積極的に利用しているという警告を発表しました。この警告では、悪意のあるアクターが特定のWebシェルを展開するなどにより被害環境での持続性を維持していることが確認されたと説明しています。パロアルトネットワークスの脅威インテリジェンスチームUnit 42はその後の数日間で、関連のない2つ目のキャンペーンが同じ脆弱性に対する攻撃を成功させた様子を観測しました。

9月17日には、米国内のリースインフラを利用してインターネット上の数百の脆弱な組織がスキャンされていました。その後、9月22日から10月上旬にかけてエクスプロイトの試行が行われたようです。この期間中、同アクターにより少なくとも9つのグローバル企業を標的とした侵害が行われ、となる産業セクターにはテクノロジ、防衛、医療、エネルギー、教育などが含まれていました。

Unit 42は、今回の戦術とツールが脅威グループ 「Emissary Panda」 と類似点があると考えています。このサイバー攻撃者たちの目的は、スパイ活動を促進するために長期的なアクセスを維持することにあるようです。

最初のエクスプロイト後、ペイロードが被害ネットワークにアップロードされ、それがGodzilla Webシェルをインストールしていました。このアクティビティはすべての被害者に対して一貫して行われていましたが、侵害された組織の一部では、その後新たにNGLiteと呼ばれるバックドアを改変したものを受け取っていることも確認されました。その後アクターはWebシェルまたはNGLiteのペイロードを使用してコマンドを実行し、ネットワーク上の他のシステムに横展開しつつ、単純にWebサーバーからファイルをダウンロードするという方法で目的のファイルを漏出させていました。またアクターはドメインコントローラに移動後は新たな認証情報窃取ツール(弊社での追跡名は「KdcSponge」)をインストールしていました。

GodzillaもNGLiteも中国語の指示説明付きで開発されており、GitHubで公開され、ダウンロードできる状態になっています。脅威アクターは、関心を持ったネットワークへのアクセスを維持するため、これらのツールを組み合わせて冗長性を持たせていると考えられます。Godzillaは機能豊富なWebシェルで、インバウンドのHTTP POSTリクエストを解析し、そのデータを秘密鍵で復号し、復号されたコンテンツを実行して追加機能を実行し、その結果をHTTPレスポンスで返します。これにより攻撃者は、動的にそれらを実行する準備が整うまで、ターゲットシステムによって悪意のあるコードとしてのフラグが立てられないようにしています。

NGLiteについて作者は「ブロックチェーン技術に基づいた匿名クロスプラットフォーム遠隔操作プログラム」とその特徴を説明しています。このプログラムは、コマンド&コントロール(C2)通信にNew Kind of Network(NKN)インフラを活用しており、それにより理論的にはユーザーの匿名性を実現しています。ここで重要なのは、NKNがブロックチェーン技術を用いて分散型ピアネットワークをサポートする正当なネットワークサービスであるということです。C2チャンネルとしてNKNを使用するのは非常に珍しく、私たちがこれまで確認したなかでNKNを使って通信しているサンプルは13個しかありません。この9個のNGLiteサンプルと、NKNを使ってファイル共有を行うオープンソースの正当なユーティリティSurgeに関連する4つのサンプルのみです。

最後にKdcSpongeは、ドメインコントローラに展開して認証情報を窃取するための新たな認証情報窃取ツールです。KdcSpongeは、LSASS(Local Security Authority Subsystem Service)プロセスに自分自身を注入し、特定の関数をフックして、Kerberosを介してドメインに認証しようとするアカウントからユーザー名とパスワードを収集します。この悪意のあるコードは、窃取した認証情報をファイルに書き込みますが、漏出には他の機能を使います。

パロアルトネットワークスのお客様は、次の方法でこのキャンペーンから保護されています。

  • Cortex XDRのローカル解析はNGLiteのバックドアをブロックします。
  • 既知のサンプル(Dropper、NGLite、KdcSponge)はすべてWildFireがマルウェアに分類します。
  • Cortex Xpanseは、お客様のネットワーク上にあるZoho ManageEngine ADSelfServicePlus、ManageEngine Desktop Central、またはManageEngine ServiceDeskPlus サーバーを正確に識別します。

初期アクセス

9月17日から10月初旬にかけ、ManageEngine ADSelfService Plus サーバーに対するスキャンが確認されました。グローバルテレメトリからは、このアクターが米国だけでも少なくとも370台のZoho ManageEngineサーバーをターゲットにしていたものと考えられます。その規模からして、これらのスキャンは教育機関から国防総省組織におよぶ幅広いターゲットを対象とした無差別的な性質のものであったと評価できます。

スキャン結果を得たアクターは9月22日にエクスプロイト試行に移りました。これらの試行は、脆弱なデバイスでREST APIの認証をバイパスし、その結果リモートコード実行を可能としてしまうCVE-2021-40539にフォーカスしていました。この目的でアクターはカスタムで作成したPOST文をREST APIのLicenseMgrに配信していました。

このキャンペーンでエクスプロイト対象となった組織の全体像は把握できませんでしたが、世界全体では、テクノロジ、防衛、医療、エネルギー、教育などの分野で少なくとも9つの組織が侵害されたと考えられます。エクスプロイトが成功すると、次にアクターはGodzillaのWebシェルを展開するペイロードをアップロードし、被害ネットワークへの追加でのアクセスを可能にしていました。米国内の以下のリースIPアドレスが侵害されたサーバーとやり取りしていることが確認されています。

24.64.36[.]238
45.63.62[.]109
45.76.173[.]103
45.77.121[.]232
66.42.98[.]156
140.82.17[.]161
149.28.93[.]184
149.248.11[.]205
199.188.59[.]192

全被害者に共通しているように見うけられるWebシェルの展開に続き、侵害されたネットワークの一部では、追加のツールが展開され、使用された様子も確認しています。具体的には、NGLiteと呼ばれるオープンソースのバックドアを改変したものと、KdcSpongeと呼ばれる認証情報収集ツールが、このアクターによって導入されていました。次のセクションでは、これらのツールの詳細な分析を行います。

マルウェア

エクスプロイトの時点で、侵害されたサーバーにはME_ADManager.exeME_ADAudit.exeという2つの異なる実行ファイルが保存されていました。ME_ADManager.exeファイルは、GodzillaのWebシェルをシステムに保存するほか、システムに保存された他の実行ファイル(ME_ADAudit.exe)をインストール・実行するドロッパ型のトロイの木馬として機能するものです。実行ファイルME_ADAudit.exeはNGLiteをベースにしており、脅威アクターはこれをペイロードとして使用してシステム上でコマンドを実行します。

ドロッパ ME_ADManager.exe

最初のエクスプロイト後、ドロッパは以下のパスに保存されます。

c:\Users\[username]\AppData\Roaming\ADManager\ME_ADManager.exe

このファイルを解析すると、このペイロードの作者がサンプルのビルドの際、デバッグシンボルを削除していないことがわかりました。そのためサンプル内には次のデバッグパスが存在しており、このペイロードの作成にユーザー名としてpwnが使用されたことが示唆されています。

c:\Users\pwn\documents\visual studio 2015\Projects\payloaddll\Release\cmd.pdb

このサンプルを実行すると、インターネットに公開されている多くのコードサンプルでよく見られる、次のようなジェネリックなミューテックスが作成され、これによりドロッパのインスタンスを複数実行しないようにしています。

cplusplus_me

続いてドロッパはハードコードされたGodzilla Webシェルを以下の場所に書き込もうとしますが、これについては本レポートの後半で詳細な分析を行います。

../webapps/adssp/help/admin-guide/reports.jsp
c:/ManageEngine/ADSelfService Plus/webapps/adssp/help/admin-guide/reports.jsp
../webapps/adssp/selfservice/assets/fonts/lato/lato-regular.jsp
c:/ManageEngine/ADSelfService Plus/webapps/adssp/selfservice/assets/fonts/lato/lato-regular.jsp

その後ドロッパは、%APPDATA%\ADManagerフォルダを作成し、自身を%APPDATA%\ADManager\ME_ADManager.exeとしてコピーしてから、以下のレジストリキーを作成し、再起動後にも実行を持続できるようにします。

Software\Microsoft\Windows\CurrentVersion\Run\ME_ADManager.exe : %APPDATA%\ADManager\ME_ADManager.exe
Software\Microsoft\Windows\CurrentVersion\Run\ME_ADAudit.exe : %SYSTEM32%\ME_ADAudit.exe

その後、ドロッパはADAudit.exeをカレントディレクトリから以下のパスにコピーしてWinExecで同ファイルを実行します。

%SYSTEM32%\ME_ADAudit.exe

このドロッパはME_ADAudit.exeファイルをディスクに書き込まないので、脅威アクターは(おそらくCVE-2021-40539脆弱性の初期エクスプロイトのなかで)ドロッパ実行前にこのファイルをサーバーにアップロードする必要がありました。複数のインシデントを分析した結果、ME_ADAudit.exeサンプルのSHA256ハッシュは805b92787ca7833eef5e61e2df1310e4b6544955e812e60b5f834f904623fd9fと一貫していたことから、アクターは複数のターゲットに対して同じカスタマイズ版のNGLiteバックドアを展開していたと考えられます。

Godzilla Webシェル

前述のとおり、初期ドロッパには、JSP(Java Server Page)のWebシェルがハードコードされています。Webシェルを解析したところ、これは中国語版のGodzilla WebシェルV3.00+であることが判明しました。Godzilla WebシェルはBeichenDreamというユーザーが開発したもので、同氏はこのWebシェルの開発理由として、当時利用されていたWebシェルがレッドチームの実施中にセキュリティ製品にしじゅう検出されていた点を挙げています。そのため、この作者はネットワークトラフィックにAES暗号を利用することで検出を回避し、さまざまなセキュリティベンダ製品で非常に低い静的検出率を維持していると喧伝しています。

このグラフは、VirusTotalに掲載されたGodzilla Webシェルの検出数を示しています。列は、検出数、サイズ、初認日時、終認日時です。
図1 VirusTotalに掲載されているGodzilla Webシェルの検出結果

Godzilla Webシェルは、ChinaChopperなどの同じグループが使用している他のWebシェルよりも機能性が高く、ネットワーク回避性も優れているので、当該地域の脅威グループが侵入時に採用していることはとくに驚くにはあたりません。

このJSP Webシェル自体は、機能的に非常にシンプルで軽量な作りになっています。その主たる機能はHTTP POSTをパースし、コンテンツを秘密鍵で復号し、ペイロードを実行することです。これにより攻撃者は、動的にそれを実行する準備が整うまで、ターゲットシステムによって悪意のあるコードとしてのフラグを立てられないようにしています。

下の図は、デフォルトのJSP Webシェルの最初の部分と復号機能を示したものです。

デフォルトのJSP Webシェルの最初の部分と復号機能を示したもの。注目すべきはコードの1行目と2行目にある変数xcとpass。
図2 デフォルト Godzilla JSP Webシェルのヘッダ

注目すべきは、図2のコードの1行目と2行目にある、変数xcpassです。これらの変数が重要になる要素で、これらはオペレータが新たなWebシェルを生成するたびに変更されていき、各Webシェル内でAES復号に使用する秘密鍵を表します。

Webシェルを手動で生成する際は、平文のパスとキーを指定します。デフォルトではそれぞれpasskeyです。

このスクリーンショットには中国語のGodzillaインターフェースが表示され、Webシェルのデフォルト値であるpassとkeyが表示されている。
図3 GodzillaのデフォルトのWebシェルの値

これらの変数がWebシェル自体にどう提示されるのかを把握するには、GodzillaのJARファイルを確認するとよいでしょう。

下の図は、/shells/cryptions/JavaAES/GenerateShellLoder関数内に埋め込まれたWebシェルテンプレートの1つで、ここでコードが文字列を置換していることが確認できます。

下の図は、/shells/cryptions/JavaAES/GenerateShellLoder関数内に埋め込まれたWebシェルテンプレートの1つで、ここでコードが文字列を置換していることが確認できる
図4 Generate.classファイル内のGenerateShellLoder関数

したがってWebシェルのxc変数には、テンプレートが示しているようにAESの秘密鍵が入ることがわかります。

String xc="{secretKey}"; String pass="{pass}"; String md5=md5(pass+xc);

私たちは、xcの値がハッシュのように見えることと、/core/shell/ShellEntity.classファイル内でコードがMD5ハッシュの最初の16文字を平文の秘密鍵として受け取っていることを確認しました。

public String getSecretKeyX()
{

return functions.md5(getSecretKey()).substring(0, 16);

}

以上のことからxcの値3c6e0b8a9c15224aは、keyという言葉のMD5ハッシュの最初の16文字であることがわかります。

このことから、インシデントをまたがるアクティビティをトラッキング・マッピングするには、このxcpassの2つの変数が主として使えることになります。本稿執筆にあたり、私たちはデフォルトオプションでGodzilla Webシェルを生成して解析に利用しました。なお、デフォルトのWebシェルと攻撃で観測されたWebシェルとの違いはxcpassの値が異なる点のみです。

このWebシェルの重要な特徴は、作者が静的検知ができないことをアピールし、セキュリティ製品のシグネチャで認識される可能性のあるキーワードや共通の構造体を避けることで、このファイルを目立たないようにしていることです。とくに興味深い静的回避技術は、復号の指示にJavaの三項条件演算子を使用していることです。

ここでの条件はm?1:2 です。mはこの関数に渡されるブーリアン値で、先に図2で示したものです。mがTrueの場合、最初の式の定数(1)が使われます。それ以外の場合は、2つ目の(2)が渡されます。Javaのドキュメントによると1ENCRYPT_MODE2DECRYPT_MODEとなっています。

crypto定数の意味を示したJavaのドキュメント1はENCRYPT_MODE、2はDECRYPT_MODE。
図5 JavaX cryptoの定数の意味

Webシェルがこの関数xを実行した時点では、mの値を設定しないので、mは強制的にFalseになり、復号に設定されます。

response.getWriter().write(base64Encode(x(base64Decode(f.toString()), true)));

Godzillaの機能について理解するには/shells/payloads/java/JavaShell.classを確認するとよいでしょう。このクラスファイルには、オペレータに提供されるすべての関数が含まれています。以下はgetFile関数の例です。

Godzillaの機能について理解するには/shells/payloads/java/JavaShell.classを確認するとよいでしょう。このクラスファイルには、オペレータに提供されるすべての関数が含まれています。ここで示したのはgetFile関数の例です。
図6 GodzillaのgetFile関数のペイロード

ペイロードの関数

getFile
downloadFile
getBasicsInfo
uploadFile
copyFile
deleteFile
newFile
newDir
currentDir
currentUserName
bigFileUpload
bigFileDownload
getFileSize
execCommand
getOsInfo
moveFile
getPayload
fileRemoteDown
setFileAttr

関数名からわかるとおり、Godzilla Webシェルは、リモートシステムのナビゲート、データ転送、リモートコマンド実行、列挙など、数多くのペイロードを提供します。

これらのペイロードは前述の秘密鍵で暗号化され、オペレーティング中のソフトウェアがデータを含むHTTP POSTを侵害されたシステムに送信します。

さらにcore/ui/component/dialog/ShellSetting.classファイル(下図)を見てみると、 initAddShellValue()関数にはリモートネットワークアクセス用のデフォルト設定が含まれています。したがって、Webアクセスログ内で侵害の兆候がないかを検索するフォレンジック調査を行うさいは、静的なHTTPヘッダやUser-Agent文字列などの要素を特定すると役に立ちます。

private void initAddShellValue() {

this.shellContext = new ShellEntity();

this.urlTextField.setText("http://127.0.0.1/shell.jsp");
this.passwordTextField.setText("pass");
this.secretKeyTextField.setText("key");
this.proxyHostTextField.setText("127.0.0.1");
this.proxyPortTextField.setText("8888");
this.connTimeOutTextField.setText("60000");
this.readTimeOutTextField.setText("60000");
this.remarkTextField.setText("??");
this.headersTextArea.setText("User-Agent: Mozilla/5.0 (Windows NT
10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\nAccept-Language:
zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2\n");

this.leftTextArea.setText("");
this.rightTextArea.setText("");

}

以下は、curlアプリケーションを使用してカスタムURLペイロードを送信し、CVE-2021-40539の脆弱性をトリガーしている最初のエクスプロイトを示したWebサーバーアクセスログからのスニペットです。このスニペットでは、最初のドロッパによってハードコードされたパスに配置されたGodzilla Webシェルへのアクセスが続く様子が示されています。User-Agentを確認すると、脅威アクターは、エクスプロイトから初期Webシェルアクセスまでを4分強で行ったことがわかります。

- /./RestAPI/LicenseMgr "-" X.X.X.X Y.Y.Y.Y POST [00:00:00] - - 200 "curl/7.68.0"
- /help/admin-guide/reports.jsp "-" X.X.X.X Y.Y.Y.Y POST [+00:04:07] - - 200 "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0"

カスタムNGLite

NGLiteは、Go言語(具体的にはGoバージョン1.13)で書かれたオープンソースのバックドアで、公開GitHubリポジトリからダウンロードできます。NGLiteはバックドア型のトロイの木馬で、C2チャネル経由で受け取ったコマンドを実行することしかできません。機能はバックドアとしては標準的なものですが、NGLiteはバックドアとアクター間の通信に、正規のNKNをベースにした分散型ネットワークを使う斬新なC2チャネルを採用しています。

NKNは、その分散型ネットワークにパブリックなブロックチェーンを使い、数百万のピア間の通信をサポートし、各ピアはIPアドレスなどの典型的なネットワーク識別子の代わりに一意なNKNアドレスで識別されることを謳っています。したがって、NGLiteツールがC2チャネルで通信している直近のIPアドレスは、分散型ネットワーク内のピアの1つに過ぎず、脅威アクターのネットワークロケーションを表している可能性は低いと考えられます。こうした設計のため、NGLiteのC2通信チャネルの検出や防止は困難です。

幸い、C2チャネルとしてNKNを使用することは非常に稀です。私たちがこれまで確認したNKNを使って通信しているサンプルは13個しかなく、内訳はこの9個のNGLiteサンプルと、NKNを使ってファイル共有を行うオープンソースのユーティリティSurge に関連する4つのサンプルのみとなっています。既知の9つのNGLiteサンプルのうち8つがVirusTotalによってスキャンされましたが、4つは検出されず、3つは1つのアンチウイルス製品に検出され、残りのサンプルは5つのアンチウイルス製品に検出されました。この検出率の低さから、この攻撃キャンペーン中、NGLiteはほとんどのウイルス対策製品で対応していなかったものと考えられます。

前のセクションで述べたように、このドロッパはレジストリキーを作成し、以下のパスに保存されたNGLiteバックドアのカスタム化した亜種(SHA256:805b92787ca7833eef5e61e2df1310e4b6544955e812e60b5f834f904623fd9f)を実行します。

C:\Windows\system32\ME_ADAudit.exe

Goベースのバックドア内のデータ構造には以下のパスが含まれており、このパスは、このNGLiteのカスタム化した亜種のメインソースコードを開発者のシステムに保存するために使用されています。

/mnt/hgfs/CrossC2-2.2/src/ng.com/lprey/main.go

このパスからは「アクターはCrossC2を使ってクロスプラットフォームCobalt Strike C2ペイロードをビルドしたのではないか」と推測されることがあるかもしれません。ただしこのペイロードは一般公開されているNGLiteバックドアをカスタマイズしたものであるため、実際にCrossC2をベースにしたものであったと考える根拠にはなりません。

Cobalt Strikeのペイロードを配信していると分析側に勘違いさせることを狙い、脅威アクターがわざとパスにCrossC2の文字列を入れた可能性もあります。なお、同じソースコードパスを使用した以下のNGLiteサンプルが8月11日にさかのぼって確認されていることから、この脅威アクターは数ヶ月前からこのツールを使用していたと考えられます。

3da8d1bfb8192f43cf5d9247035aa4445381d2d26bed981662e3db34824c71fd
5b8c307c424e777972c0fa1322844d4d04e9eb200fe9532644888c4b6386d755
3f868ac52916ebb6f6186ac20b20903f63bc8e9c460e2418f2b032a207d8f21d

本キャンペーンで使用しているカスタムNGLiteサンプルでは、コマンドライン引数にgまたはgroupの値があるかどうかを確認しています。このスイッチがない場合、ペイロードにはデフォルトの文字列7aa7ad1bfa9da581a7a04489896279517eef9357b81e406e3aee1a66101fe824が使用され、NGLite はこれをシード識別子として参照します。

このペイロードは、システムのネットワークインターフェースカード(NIC)のMACアドレスとIPv4アドレスをハイフン(-)で区切ったものを連結し、ペイロードが「prey id(「獲物の識別子」の意)」と呼ぶところのものを作成します。このprey idがC2通信で使用されます。

NGLiteのペイロードは、C2通信にNKN分散ネットワークを使用します。次の図はサンプルのNKNクライアントの設定です。

NGLiteのペイロードは、C2通信にNKN分散ネットワークを使用します。この図はサンプルのNKNクライアントの設定です。
図7 埋め込まれたNKNクライアント設定

このサンプルでは、まず30003/tcp経由でseed.nkn[.]orgにアクセスし、以下のような構造のHTTP POSTリクエストを送信します。

このサンプルでは、まず30003/tcp経由でseed.nkn[.]orgにアクセスし、以下のような構造のHTTP POSTリクエストを送信します。
図8 最初のNKN HTTP POST
また以下のように、monitor_03をprey idに指定したHTTP POSTリクエストを送信します。

またこの図が示すように、monitor_03をprey idに指定したHTTP POSTリクエストを送信します。
図9 「獲物のID (prey id)」を含むHTTP POST

このリクエストに対し、seed.nkn[.]orgのサーバーは、以下のような構造のJSONに[prey id (MAC-IPv4)]を入れて応答します。

{"id":"nkn-sdk-go","jsonrpc":"2.0","result":{"addr":"66.115.12.89:30002","id":"223b4f7f4588af02badaa6a83e402b33dea0ba8908e4cd6008f84c2b98a6a7de","pubkey":"38ce48a2a3cffded7c2031514acaef29851ee39303795e4b3e7fce5a6619e6be","rpcAddr":"66.115.12.89:30003"}}

これは、ペイロードが30003/tcp経由で66.115.12.89のピアと通信していることを示しています。次に、seed.nkn[.]orgサーバーは、monitor_03のリクエストに以下のように応答しています。ここではペイロードが30003/tcp経由で54.204.73.156と通信している様子が示されています。

{"id":"nkn-sdk-go","jsonrpc":"2.0","result":{"addr":"54.204.73.156:30002","id":"517cb8112456e5d378b0de076e85e80afee3c483d18c30187730d15f18392ef9","pubkey":"99bb5d3b9b609a31c75fdeede38563b997136f30cb06933c9b43ab3f719369aa","rpcAddr":"54.204.73.156:30003"}}

seed.nkn[.]orgからの応答を取得後、ペイロードは、JSON内のaddrフィールドで指定されたIPアドレスとTCPポートに対し、HTTP GETリクエストを発行します。これらのHTTPリクエストは以下に示すとおりですが、これらのシステムはアクターにコントロールされたものではなく、最終的にアクターのコンテンツを返すことになる一連のピアの直近のピアに過ぎない点に留意してください。

seed.nkn[.]orgからの応答を取得後、ペイロードは、JSON内のaddrフィールドで指定されたIPアドレスとTCPポートに対し、HTTP GETリクエストを発行します。これらのHTTPリクエストは図に示すとおりですが、これらのシステムはアクターにコントロールされたものではなく、最終的にアクターのコンテンツを返すことになる一連のピアの直近のピアに過ぎない点に留意してください。
図10 NKNのピアリング
最終的にこのカスタム化されたNGLiteクライアントとサーバー間のネットワーク通信は、以下のキーを使ってAESで暗号化されます。

WHATswrongwithUu

カスタムNGLiteサンプルは、以下に示すように、whoamiコマンドの結果と文字列「#windows」を連結したものを含む初期ビーコンをC2に送信することから始まります。

[username]#windows

この初期ビーコンの送信後、NGLiteのサンプルはPreylistenerと呼ばれるサブファンクションを実行してインバウンドのリクエストをリッスンするサーバーを作成します。またこのサンプルは、インバウンドの通信をリッスンし、デフォルトのAESキー1234567890987654を使って復号を試みます。復号されたコンテンツは、Goメソッド os/exec.Command 経由でコマンドとして実行されます。その結果は、同じAESキーで暗号化され、リクエストした側に送り返されます。

エクスプロイト後のアクティビティ

ネットワークを侵害した脅威アクターは、最初の足場からただちに横展開を行い、NGLiteペイロードとGodzilla Webシェルを介してコマンドを実行することで標的のネットワーク上の他のシステムにアクセスしていました。最初のサーバーへのアクセス後は、Active Directoryデータベースファイル(ntds.dit)やレジストリのSYSTEMハイブなど、ローカルドメインコントローラから機微な情報を収集し、漏出させることに注力していました。その直後、脅威アクターはKdcSpongeという認証情報窃取用のツールをインストールしていることが確認されましたが、これについては次に詳しく説明します。最終的にアクターは認証情報を窃取し、アクセスを維持し、被害者のネットワークから機微なファイルを収集して漏出させることに興味を示していました。

クレデンシャルハーベスティング(認証情報収集)とKdcSponge

この分析中、Unit 42 は、脅威アクターが認証情報の窃取のために PwDump と組み込みのcomsvcs.dllを使って lsass.exe プロセスのミニダンプを作成していたことを示すログを確認しました。ただし、このアクターはドメインコントローラから認証情報を窃取したいときは私たちがKdcSpongeと呼ぶ独自ツールをインストールしていました。

KdcSpongeの目的は、LSASSプロセス内からAPI関数をフックし、Kerberosサービス(以下「KDCサービス」)を介して認証しようとするインバウンドの試行から認証情報を盗むことです。KdcSpongeは、ドメイン名、ユーザー名、パスワードをシステム上のファイルにキャプチャし、このファイルを脅威アクターがサーバーへの既存のアクセスを通じて手動で漏出させます。

私たちはKdcSpongeのサンプルを2つ確認していますが、いずれもuser64.dllという名前がついていました。これら2つのSHA256ハッシュは次のとおりです。

3c90df0e02cc9b1cf1a86f9d7e6f777366c5748bd3cf4070b49460b48b4d4090
​​b4162f039172dcb85ca4b85c99dd77beb70743ffd2e6f9e0ba78531945577665

KdcSpongeクレデンシャルスティーラーを起動するさい、脅威アクターは以下のコマンドを実行し、悪意のあるモジュールをロードして実行します。

regsvr32 /s user64.dll

初回実行時、regsvr32アプリケーションは、user64.dllによってエクスポートされたDllRegisterServer関数を実行します。DllRegisterServer関数は、sfc_os.dll内のSetSfcFileException関数を解決し、c:\windows\system32\kdcsvc.dllファイル上のWindowsファイル保護(WFP)を無効にしようとします。その後は実行中のlsass.exeプロセスへの自身の注入を試みます。その手順は以下の通りです。

1. OpenProcesslsass.exeプロセスをオープンする。
2. VirtualAllocExでリモートプロセス内でメモリを割り当てる。
3. WriteProcessMemoryにより文字列user64.dllを割り当てられたメモリに書き込む。
4. RtlCreateUserThreadによりlsass.exeプロセス内でuser64.dllを引数としてLoadLibraryAを呼び出す。

user64.dlllsass.exeプロセス内で実行されると、システムが再起動されても永続性を確立するための次のレジストリ キーを作成して起動する。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce\KDC Service : regsvr32 /s user64.dll

ここからこのサンプルは、以下のモジュールのいずれかのハンドルの取得を試みることにより、システムがKerberosサービスを実行していることを確認します。

kdcsvc.dll
kdccli.dll
Kdcsvs.dll

KdcSpongeは文書化されていない3つのAPI関数(具体的にはKdcVerifyEncryptedTimeStampKerbHashPasswordEx3KerbFreeKey)を探すために次の3つの方法を使います。

  1. Kerberosモジュールのバージョンを識別して、フック対象となるAPI関数へのハードコードされたオフセットを使用する。
  2. Microsoftのシンボルサーバーにアクセスし、Kerberosモジュール内のAPI関数のオフセットを見つけ、ハードコードされたバイトシーケンスと比較して、正しい関数を確認する。
  3. Kerberosモジュールを検索し、ハードコードされたバイトシーケンスを探す。

KdcSpongeがフック対象となるAPI関数を探す主な方法は、PEファイルのIMAGE_FILE_HEADERセクション内のTimeDateStamp値に基づいてKerberosモジュールのバージョンを判断することです。Kerberosモジュールのバージョンが判明すれば、KdcSpongeはそのバージョンのモジュール内の適切な関数をフックするために使えるハードコードされたオフセットを保持しています。KdcSpongeは以下のTimeDateStampの値を探します。

2005-12-14 01:24:41
2049-10-09 00:46:34
2021-04-08 07:30:26
2021-03-04 04:59:27
2020-03-13 03:20:15
2020-02-19 07:55:57
2019-12-19 04:15:06
2019-07-09 03:15:04
2019-05-31 06:02:30
2018-10-10 07:46:08
2018-02-12 21:47:29
2017-03-04 06:27:32
2016-10-15 03:52:20
2020-11-26 03:04:23
2020-06-05 16:15:22
2017-10-14 07:22:03
2017-03-30 19:53:59
2013-09-04 05:49:27
2012-07-26 00:01:13

KdcSpongeがKerberosモジュールのバージョンを判断できず、ドメインコントローラがWindows Server 2016またはServer 2019(メジャーバージョン10)を実行している場合、ペイロードはMicrosoftのシンボルサーバー(msdl.microsoft.com)にアクセスして、文書化されていない複数のAPI関数の場所を見つけようとします。このサンプルでは、以下のような構造をもつURLにHTTPS GETリクエストを発行します。そのさい、URLのGUID部分には、PEのIMAGE_DEBUG_TYPE_CODEVIEWセクションのRSDS構造体からのGUID値が指定されます。

/download/symbols/[library name].pdb/[GUID]/[library name].pdb

このサンプルでは、以下の場所のファイルに結果が保存されます。ここでもファイル名のGUIDには、RSDS構造体のIMAGE_DEBUG_TYPE_CODEVIEWセクションのGUID値が使用されます。

ALLUSERPROFILE\Microsoft\Windows\Caches\[GUID].db:

前述のとおり、このコードがシンボルサーバーにアクセスする理由は、文書化されていない3つのKerberos関連の関数(KdcVerifyEncryptedTimeStampKerbHashPasswordEx3KerbFreeKey)の場所を探すためと考えられます。このサンプルはこれらの関数を主に次のライブラリ内で探します。

kdcsvc.KdcVerifyEncryptedTimeStamp
kdcsvc.KerbHashPasswordEx3
kdcpw.KerbHashPasswordEx3
kdcsvc.KerbFreeKey
kdcpw.KerbFreeKey

これらの関数が見つかった場合、サンプルは表1のように特定のバイトシーケンスを検索し、関数が正しいかどうか、また変更されていないかどうかを確認します。

関数 16進数バイト
kdcsvc.KdcVerifyEncryptedTimeStamp 48 89 5c 24 20 55 56 57 41 54 41 55 41 56 41 57 48 8d 6c 24 f0 48 81 ec 10 01 00 00 48 8b 05 a5
kdcsvc.KerbHashPasswordEx3  48 89 5c 24 08 48 89 74 24 10 48 89 7c 24 18 55 41 56 41 57 48 8b ec 48 83 ec 50 48 8b da 48 8b
kdcpw.KerbHashPasswordEx3 48 89 5c 24 08 48 89 74 24 10 48 89 7c 24 18 55 41 56 41 57 48 8b ec 48 83 ec 50 48 8b da 48 8b
kdcpw.KerbFreeKey  48 89 5c 24 08 57 48 83 ec 20 48 8b d9 33 c0 8b 49 10 48 8b 7b 18 f3 aa 48 8b 4b 18 ff 15 72 19
kdcsvc.KerbFreeKey 48 89 5c 24 08 57 48 83 ec 20 48 8b 79 18 48 8b d9 48 85 ff 0f 85 00 c5 01 00 33 c0 48 89 03 48

表1 KdcSpongeがWindowsのメジャーバージョン10の正しい関数を確認するために使用している文書化されていない関数とバイトシーケンス

ドメインコントローラがWindows Server 2008またはServer 2012(メジャーバージョン6)を実行している場合、KdcSpongeはシンボルサーバーにアクセスせず、代わりにkdcsvc.dllモジュール全体を検索して表2に記載されているバイトシーケンスを検索してAPI関数を見つけます。

関数 16進数バイト
kdcsvc.KdcVerifyEncryptedTimeStamp 48 89 5C 24 20 55 56 57 41 54 41 55 41 56 41 57 48 8D 6C 24 F9 48 81 EC C0 00 00 00 48 8B
kdcsvc.KerbHashPasswordEx3 48 89 5C 24 08 48 89 74 24 10 48 89 7C 24 18 55 41 56 41 57 48 8B EC 48 83 EC 40 48 8B F1
kdcsvc.KerbFreeKey 40 53 48 83 EC 20 48 8B D9 48 8B 49 10 48 85 C9 0F 85 B4 B9 01 00 33 C0 48 89 03 48 89 43

表2 KdcSpongeが探している関数の場所を確認するために使用している文書化されていない関数とバイトシーケンス

KdcVerifyEncryptedTimeStampKerbHashPasswordEx3KerbFreeKeyの各関数が見つかると、このサンプルはこれらの関数をフックし、認証情報を窃取するという意図のもと、これらの関数へのすべての呼び出しを監視しようとします。ドメインコントローラに認証のリクエストが来ると、Kerberosサービス(KDCサービス)内でこれらの関数が呼び出され、サンプルはインバウンドの認証情報をキャプチャします。その後、認証情報はディスクの以下の場所に書き込まれます。

%ALLUSERPROFILE%\Microsoft\Windows\Caches\system.dat

窃取された認証情報は、0x55をキーとするシングルバイトのXORアルゴリズムで暗号化され、以下の構造で1行ごとにsystem.datファイルに書き込まれます。

[<timestamp>]<domain><username> <cleartext password>

アトリビューション

アトリビューション(攻撃の帰属先の特定)はまだ継続中で、キャンペーンの背後にいるアクターについての検証はできていませんが、今回分析したケースで使用された戦術やツールとThreat Group 3390(TG-3390、Emissary Panda、APT27)との間にはいくつかの相関が見られました。

具体的には、SecureWorksが以前TG-3390のアクティビティに関する記事で紹介しているように、TG-3390も今回のものと同様に、WebエクスプロイトやChinaChopperと呼ばれる中国で人気のWebシェルを最初の足場として利用した後、正規に取得した認証情報を利用してラテラルムーブやドメインコントローラへの攻撃を行っていたことがわかります。Webシェルとエクスプロイトは異なりますが、アクターが環境にアクセスできるようになると、漏出用ツールの一部に重複が見られるようになります。

SecureWorksによると、アクターはRecyclerディレクトリ内で別のアプリケーションを偽装したWinRarを使用してデータをRARアーカイブに分割していたとのことです。この処理のためにデプロイされたバッチファイルからは次のスニペットが提供されていました。

@echo off
c:\windows\temp\svchost.exe a -k -r -s -m5 -v1024000 -padmin-windows2014 "e:\recycler\REDACTED.rar" "e:\ProgramData\REDACTED\"
Exit

ManageEngine ADSelfService Plusに対する最近の攻撃を分析したところ、同じ手法が観測されました。名前を変更されたWinRarアプリケーションに渡されるパラメータの順序と配置が同じです。

@echo off
dir %~dp0>>%~dp0\log.txt
%~dp0\vmtools.exe a -k -r -s -m5 -v4096000 -pREDACTED "e:\$RECYCLE.BIN\REDACTED.rar" "E:\Programs\REDACTED\REDACTED"

ファイルがステージングされると、どちらの場合も外部のWebサーバー上でアクセス可能な状態にされていました。脅威アクターは直接HTTP GETリクエストでそれらのファイルをダウンロードするものと思われます。

結論

Unit 42は、2021年9月に、ZohoのManageEngine製品ADSelfService Plusに存在する最近修正された脆弱性(CVE-2021-40539)を利用し、標的となる組織への初期アクセスを奪取する攻撃キャンペーンを観測しました。今回の攻撃キャンペーンでは、テクノロジ、防衛、ヘルスケア、エネルギー、教育などの分野にまたがる少なくとも9つの企業が侵害されました。

エクスプロイト後、脅威アクターはネットワーク内ですばやく横展開し、エクスプロイト後のアクティビティ用のコマンドを実行する複数のツールを展開しました。このアクターはGodzilla Webシェルを多用しており、オペレーションの過程では、さまざまな種類のオープンソースWebシェルを侵害したサーバーにアップロードしていました。他にもいくつかのツールには、目新しい特徴や、過去の攻撃での使用がこれまで公には確認されていないものがありました。具体的には、NGLiteバックドアやKdcSpongeの認証情報窃取ツールなどが挙げられます。たとえばNGLiteバックドアは、NKNとして知られる分散ネットワークを含む新たなC2チャネルを使用しており、KdcSponge 認証情報窃取ツールは、文書化されていない関数をフックして、ドメインコントローラ宛のインバウンドのKerberos認証試行から認証情報を窃取します。

Unit 42は、このアクターの主な目的は、ネットワークへの持続的なアクセスと、侵害した組織からの機微な文書の収集・漏出だったと考えています。脅威アクターは、ステージングディレクトリに機微なファイルを集め、Recyclerフォルダにパスワードで保護されたマルチボリュームのRARアーカイブを作成していました。またこのアクターは、外部接続されたWebサーバーから個々のRARアーカイブを直接ダウンロードすることで、ファイルを漏出させていました。

本インシデント関連のパロアルトネットワークスプラットフォームの対応は以下の通りです。

  • 脅威防御シグネチャ「ZOHO corp ManageEngine Improper Authentication Vulnerability」が脅威ID 91676として9月20日にリリースされています。
  • NGLiteバックドアはCortex XDRのローカル解析でブロックされます。
  • 既知のサンプル(Dropper、NGLite、KdcSponge)はすべてWildFireがマルウェアに分類します。
  • Cortex Xpanseは、お客様のネットワーク上にあるZoho ManageEngine ADSelfServicePlus、ManageEngine Desktop Central、またはManageEngine ServiceDeskPlus サーバーを正確に識別します。

侵害の懸念があり弊社にインシデントレスポンスに関するご相談をなさりたい場合は、太平洋アジア地域の場合 (65) 6983-8730までお電話をいただくか、infojapan@paloaltonetworks.com まで電子メールにてご連絡ください。ご相談は弊社製品のお客様には限定されません。また、メールは日本語で記述可能です。お電話でのお問い合わせは英語での対応となります。Unit 42のインシデントレスポンスチームは24時間週7日365日対応を行っています。

今回の調査をサポートいただいたUnit 42 Consulting Servicesチーム、米国国家安全保障局(NSA)Cybersecurity Collaboration Centerのパートナーシップ、協力、洞察に感謝いたします。

パロアルトネットワークスは見つかったファイルサンプルや侵害の兆候などをふくむ調査結果をCyber Threat Alliance (CTA サイバー脅威アライアンス) のメンバーと共有しました。CTA のメンバーはこのインテリジェンスを使用して、お客様に保護を迅速に提供し、悪意のあるサイバー攻撃者を体系的に阻害することができます。詳細については Cyber Threat Alliance からご覧ください。

IoC

ドロッパのSHA256

b2a29d99a1657140f4e254221d8666a736160ce960d06557778318e0d1b7423b
5fcc9f3b514b853e8e9077ed4940538aba7b3044edbba28ca92ed37199292058

NGLiteのSHA256

805b92787ca7833eef5e61e2df1310e4b6544955e812e60b5f834f904623fd9f
3da8d1bfb8192f43cf5d9247035aa4445381d2d26bed981662e3db34824c71fd
5b8c307c424e777972c0fa1322844d4d04e9eb200fe9532644888c4b6386d755
3f868ac52916ebb6f6186ac20b20903f63bc8e9c460e2418f2b032a207d8f21d

Godzilla WebシェルのSHA256

a44a5e8e65266611d5845d88b43c9e4a9d84fe074fd18f48b50fb837fa6e429d
ce310ab611895db1767877bd1f635ee3c4350d6e17ea28f8d100313f62b87382
75574959bbdad4b4ac7b16906cd8f1fd855d2a7df8e63905ab18540e2d6f1600
5475aec3b9837b514367c89d8362a9d524bfa02e75b85b401025588839a40bcb

KdcSpongeのSHA256

3c90df0e02cc9b1cf1a86f9d7e6f777366c5748bd3cf4070b49460b48b4d4090
b4162f039172dcb85ca4b85c99dd77beb70743ffd2e6f9e0ba78531945577665

脅威アクターのIPアドレス

24.64.36[.]238
45.63.62[.]109
45.76.173[.]103
45.77.121[.]232
66.42.98[.]156
140.82.17[.]161
149.28.93[.]184
149.248.11[.]205
199.188.59[.]192

レジストリキー

Software\Microsoft\Windows\CurrentVersion\Run\ME_ADManager.exe
Software\Microsoft\Windows\CurrentVersion\Run\ME_ADAudit.exe
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce\KDC Service

追加資料