This post is also available in: English (英語)
概要
2021年9月16日、米Cybersecurity and Infrastructure Security Agency(CISA)は、ManageEngine ADSelfService Plusとして知られるセルフサービス型のパスワード管理およびシングルサインオンソリューションにおいて、新たに確認された脆弱性をAPT攻撃者が積極的に利用しているという警告を発表しました。このアラートでは、悪意のあるアクターが特定のWebシェルを展開するなどして、被害者の環境での持続性を維持していることが確認されたと説明しています。私たちはその後の数日間で関連性のない2つ目のキャンペーンが同じ脆弱性に対する攻撃を成功させた様子を観測しました。
9月17日には、米国内のリースインフラを利用し、インターネット上の数百の脆弱な組織をスキャンしていました。その後、9月22日から10月上旬にかけてエクスプロイトの試行が行われたようです。この期間中、このアクターにより少なくとも9つのグローバル企業を標的とした侵害が行われました。その対象セクタにはテクノロジ、防衛、医療、エネルギー、教育などが含まれます。
最初のエクスプロイト後は、ペイロードが被害者のネットワークにアップロードされ、それがGodzillaWebシェルをインストールしていました。このアクティビティはすべての被害者に対して一貫して行われていましたが、侵害された組織の一部では、その後新たに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と呼ばれる認証情報収集ツールがアクターによって導入されていました。次のセクションでは、これらのツールの詳細な分析を行います。
Malware (マルウェア)
エクスプロイトの時点で、2つの異なる実行ファイルが侵害されたサーバーに保存されていました。ME_ADManager.exeとME_ADAudit.exeです。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シェルを解析したところ、これは中国語版のGodzillaWebシェルV3.00+であることが判明しました。Godzilla WebシェルはBeichenDreamというユーザーが開発したものです。BeichenDreamは、このWebシェルの開発理由として、当時利用されていたWebシェルがレッドチームの実施中にセキュリティ製品にしょっちゅう検出されていた点を挙げています。そのため、作者はネットワークトラフィックにAES暗号を利用することで検出を回避し、さまざまなセキュリティベンダ製品で非常に低い静的検出率を維持していると喧伝しています。
Godzilla Webシェルは、ChinaChopperなどの同じグループが使用している他のWebシェルよりも機能性が高くネットワーク回避性も優れているので、当該地域の脅威グループが侵入時に採用していることにとくに驚きはありません。
このJSP Webシェル自体は、機能的には非常にシンプルで、軽量な作りになっています。その主な機能は、HTTP POSTをパースし、コンテンツを秘密鍵で復号し、ペイロードを実行することです。これにより攻撃者は、動的にそれを実行する準備が整うまで、ターゲットシステムにより悪意のあるコードとしてフラグを立てられないようにしています。
下の図は、デフォルトのJSP Webシェルの最初の部分と復号機能を示したものです。
注目すべきは、図2のコードの1行目と2行目にある、変数xcとpassです。これらの変数が重要な要素で、これらはオペレータが新たなWebシェルを生成するたびに変更されていき、各Webシェル内でAES復号に使用する秘密鍵を表しています。
Webシェルを手動で生成する際は平文のパスとキーを指定します。デフォルトではこれはpassとkeyです。
これらの変数がWebシェル自体にどう提示されるのかを把握するには、GodzillaのJARファイルを確認するとよいでしょう。
下の図は、/shells/cryptions/JavaAES/GenerateShellLoder関数内に埋め込まれたWebシェルテンプレートの1つで、ここでコードが文字列を置換していることが確認できます。
したがって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文字であることがわかります。
このため、インシデントをまたがるアクティビティをトラッキング・マッピングするには、このxcとpassの2つの変数が主として使えることになります。本稿の作成にあたり、私たちはデフォルトのオプションでGodzilla Webシェルを生成し、それを解析に利用しました。なおデフォルトのWebシェルと攻撃で観測されたWebシェルとの違いは、xcとpassの値が異なる点のみです。
このWebシェルの重要な特徴は、作者が静的検知ができないことをアピールし、セキュリティ製品のシグネチャで認識される可能性のあるキーワードや共通の構造を避けることで、このファイルが目立たないようにしていることです。特に興味深い静的回避技術は、復号の指示にJavaの三項条件演算子を使用することです。
ここでの条件はm?1:2 です。mはこの関数に渡されるブーリアン値で、先に図2で示したものです。mがTrueの場合、最初の式の定数(1)が使われます。それ以外の場合は、2つ目の(2)が渡されます。Javaのドキュメントによると1はENCRYPT_MODE、2はDECRYPT_MODEとなっています。
Webシェルがこの関数xを実行した時点では、mの値を設定しないので、mは強制的にFalseになり、復号に設定されます。
response.getWriter().write(base64Encode(x(base64Decode(f.toString()), true)));
Godzillaの機能について理解するには/shells/payloads/java/JavaShell.classを確認するとよいでしょう。このクラスファイルには、オペレータに提供されるすべての関数が含まれています。以下は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クライアントの設定です。
このサンプルでは、まず30003/tcp経由でseed.nkn[.]orgにアクセスし、以下のような構造のHTTP POSTリクエストを送信します。
また以下のように、 monitor_03を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リクエストは以下に示すとおりですが、これらのシステムはアクターにコントロールされたものではなく、最終的にアクターのコンテンツを返すことになる一連のピアの直近のピアに過ぎない点に留意してください。
最終的にこのカスタム化された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. OpenProcessでlsass.exeプロセスをオープンする。
2. VirtualAllocExでリモートプロセス内でメモリを割り当てる。
3. WriteProcessMemoryにより文字列user64.dllを割り当てられたメモリに書き込む。
4. RtlCreateUserThreadによりlsass.exeプロセス内でuser64.dllを引数としてLoadLibraryAを呼び出す。
user64.dllがlsass.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関数(具体的にはKdcVerifyEncryptedTimeStamp、KerbHashPasswordEx3、KerbFreeKey)を探すために次の3つの方法を使います。
- Kerberosモジュールのバージョンを識別して、フック対象となるAPI関数へのハードコードされたオフセットを使用する。
- Microsoftのシンボルサーバーにアクセスし、Kerberosモジュール内のAPI関数のオフセットを見つけ、ハードコードされたバイトシーケンスと比較して、正しい関数を確認する。
- 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関連の関数(KdcVerifyEncryptedTimeStamp、KerbHashPasswordEx3、KerbFreeKey)の場所を探すためと考えられます。このサンプルはこれらの関数を主に次のライブラリ内で探します。
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が探している関数の場所を確認するために使用している文書化されていない関数とバイトシーケンス
KdcVerifyEncryptedTimeStamp、KerbHashPasswordEx3、KerbFreeKeyの各関数が見つかると、このサンプルはこれらの関数をフックし、認証情報を窃取するという意図で、これらの関数へのすべての呼び出しを監視しようとします。ドメインコントローラに認証のリクエストが来ると、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