攻撃グループAPT-C-60による攻撃のアップデート
以前のJPCERT/CC Eyesで、正規サービスを悪用した攻撃グループAPT-C-60による攻撃について紹介しましたが、JPCERT/CCでは引き続き同様の攻撃活動を国内で確認しています。今回は、2025年6月から8月にかけて確認した攻撃について、前回からのアップデートを中心に以下の項目について解説します。
- 攻撃の流れ
- ダウンローダーおよびSpyGlaceのアップデート
- SpyGlaceのエンコード関数、通信方式
- 使用されたデコイ文章
- GitHubリポジトリの分析
攻撃の流れ
JPCERT/CCが確認した攻撃は、2024年8月ごろに発生した攻撃と同様に、求職者を装い組織の採用担当に宛てた標的型攻撃メールでした。攻撃の流れを図1に示します。昨年の攻撃ではGoogle DriveからVHDXファイルをダウンロードさせる方式が使用されていましたが、今回の攻撃では悪性のVHDXファイルが直接添付ファイルとして送られていました。メールの受信者がVHDXファイル内に含まれているLNKファイルをクリックすることで、正規ファイルであるGit経由で悪性のスクリプトが動作します。
![]()
LNKファイルによって次に示すgcmd.exe(Gitの正規ファイル)が実行され、VHDXファイル内に格納されているスクリプトのglog.txtが動作します。
P:\LICENSES.LOG\mingw64\bin\gcmd.exe "cd .\LICENSES.LOG\mingw64\bin && type glog.txt | gcmd.exe" && exit
Gitによって実行されるスクリプトはデコイ文書の表示、ファイルの作成、実行を担い、作成されたWebClassUser.dat(以降Downloader1と表示)は次に示すレジストリへ登録され、COMハイジャッキングによって永続化および実行されます。
HKCU\Software\Classes\CLSID\{566296fe-e0e8-475f-ba9c-a31ad31620b1}\InProcServer32
DownLoader1およびDownLoader2のアップデート
攻撃者による被害端末の把握を目的として、Downloader1はstatcounterという正規の統計サービスに対して一定間隔で通信を行います。そのリクエストヘッダーは次のフォーマットで作成されます。以前のバージョンと比較し、ボリュームシリアル番号とコンピュータ名を使用して被害端末を識別している点が異なります。
Referer: ONLINE=>[Number1],[Number2] >> [%userprofile%] / [VolumeSerialNumber + ComputerName]
また、Downloader1はボリュームシリアル番号とコンピュータ名によるファイル名と検体内に含まれているURLを組み合わせ、次のフォーマットのパスを作成し、通信を行います。
https://raw.githubusercontent.com/carolab989/class2025/refs/heads/main/[VolumeSerialNumber + ComputerName].txt
攻撃者がstatcounterへ通信されたリファラの値を確認し、その被害端末に対応した"[VolumeSerialNumber + ComputerName].txt"をGitHubへアップロードするとDownLoader1がそのファイルを取得します。その取得したファイルに記載されているURLを元に次のDownloader2のダウンロードおよび実行が行われます。 さらに、"[VolumeSerialNumber + ComputerName].txt"にはダウンロード先URLを指定するだけでなく、表1のコマンドを実行することが可能です。例えば、"1*"の場合、statcounter.comへGETリクエストを送る間隔をデフォルトの1時間から6時間へ変更することが可能になり、攻撃者による被害者環境のチェックをより慎重に行う意図がうかがえます。
| Command | Contents |
|---|---|
| "1*" | Change the interval settings |
| "0" or "40" | Reset the interval settings |
| "http*" | Download DLL |
なお、以前のバージョンと同様に取得したファイルは"sgznqhtgnghvmzxponum"を鍵としたXORデコード後に実行されます。
DownLoader2はSpyGlaceおよびそのローダーをダウンロードし、実行する機能を持っています。APIの動的解決手法にはADDとXORをベースとしたエンコード方式が使用されていますが、以前のバージョンから値が変更されており、add 0x04した後、XOR 0x05する方式となっています。なお、SpyGlaceのLoaderについても同様のエンコード方式となっています。以前のバージョンと同様にDownLoader2が取得したファイルは"AadDDRTaSPtyAG57er#$ad!lDKTOPLTEL78pE"を鍵としたXORデコード後にCOMハイジャッキングによって実行されます。
SpyGlaceのアップデート
JPCERT/CCではVersion 3.1.12、3.1.13、3.1.14の3つのバージョンのSpyGlaceを確認しています。2024年に確認したVersion 3.1.6と比較すると、コマンドprockillとproclistは何もしないよう変更されており、また、新しいコマンドuldが追加されています。コマンドuldはロードしたモジュールの特定の関数を呼び出した後、2秒後にアンロードする機能となっています。モジュールをアンロードする際、特定の関数を実行する必要があるモジュールの場合に本コマンドの機能が必要と考えられます。また、screenuploadコマンドでは、スクリーンショット関連モジュールと思われるファイルパスおよびExport関数名が次のパスへと変更されていることを確認しています。本モジュールClouds.db自体は未確認のためどのような機能かはわかりませんが、スクリーンショットコマンド関連のモジュールと考えられます。なお、実装されているコマンドの一覧はAppendix Dを参照ください。
File path: %LocalAppData%\Microsoft\Windows\Clouds\Clouds.db Export Function: mssc1
確認したVersion 3.1.12、3.1.12、3.1.14における差分はほとんどありませんが、それぞれMutexの値が異なる点や、これまで%public%\AccountPictures\Default\だった自動実行パスがVerison 3.1.14からは%appdata%\Microsoft\SystemCertificates\My\CPLsと変更されている点を確認しています。
なお、2025年9月にVersion3.1.14を使ったキャンペーンについて解説した記事[1]が公開されていますが、使用されたGitHubリポジトリなどは重複していないため、国外などで確認された別の攻撃キャンペーンと考えられます。
SpyGlaceのエンコード関数と通信方式の詳細
SpyGlaceの特徴であるエンコード方式は1バイトのXORとSUB命令を組み合わせたものが使用されており、マルウェアが使用する文字列や動的なAPIの解決などに多用されています。また、SpyGlaceのコマンドの一つである"Download"コマンドでは暗号化されたファイルがダウンロードされますが、復号には次のKEYとIVを使用したAES128-CBCにて復号され、%temp%\wcts66889.tmpのファイルパスに作成されることを確認しています。ダウンロードコマンドのコードの一部を図2に示します。
KEY: B0747C82C23359D1342B47A669796989 IV: 21A44712685A8BA42985783B67883999
![]()
SpyGlaceはC2サーバーとの通信にBASE64とRC4を使用しますが、その初期通信におけるリクエストヘッダーのフォーマットを次に示します。なお、a001の値に使用されるuseridである"GOLDBAR"という文字列はPositive Technologiesによる報告[2]や昨年の日本における攻撃の際に使用された文字列と同一であり、ターゲット地域やキャンペーンを指している可能性があります。また、エンコード方式について、少なくともVersion 3.1.6以降のSpyGlaceでは改変されたRC4が使用されています。
a001=[md5("GOLDBAR")]&a002=[md5(systeminfo)]&a003=["uid" or "info"]&a004=[BASE64(CustomRC4([ComputerName;UserName;CpuInfo;OS Version;SpyGlace Version]))]
改変されたRC4はKSAのサイクルを増やす点やXORする値に加算を行うなどの点が通常のRC4とは異なり、次に示すPythonスクリプトでデコードすることが可能です。
import base64
def CustomRC4(key: bytes, data: bytes) -> bytes:
# --- KSA ---
S = list(range(256))
n = 3
for round in range(n):
j = 0
keylen = len(key)
if keylen == 0:
raise ValueError("key must be non-empty")
for i in range(256):
j = (j + S[i] + key[i % keylen]) & 0xFF
S[i], S[j] = S[j], S[i]
# --- PRGA ---
i = j = 0
out = []
for b in data:
i = (i + 1) & 0xFF
j = (j + S[i]) & 0xFF
k = S[(S[i] + j) & 0xFF]
S[i], S[j] = S[j], S[i]
k2 = S[((S[((i >> 3) ^ (0x20 * j)) & 0xFF] + S[((0x20 * i) ^ (j >> 3)) & 0xFF]) ^ 0xAA) & 0xFF] + S[(S[j] + S[i]) & 0xFF]
out.append( (b ^ k ^ k2) & 0xFF )
return bytes(out)
def decode(base64in):
key = b"90b149c69b149c4b99c04d1dc9b940b9"
decoded = CustomRC4(key, base64.b64decode(base64in))
print("Result: ", decoded)
使用されたデコイ文章
今回の攻撃で使用されたデコイ文章の一部を図3に示します。採用担当者をターゲットとしているため、作成された履歴書には研究者を装った経歴を載せており、経歴に複数の論文が記載されていますが、それら論文の著者にはメール送付者の名前は記載されていません。なお、その履歴書の本人の名前はメールの差出人のGmailのアカウント名とある程度一致しており、攻撃者は本攻撃のためにアカウントを取得した可能性があります。
![]()
GitHubリポジトリの分析
攻撃者はペイロードの配布にGitHubを使用している関係で、リポジトリが削除されない限り、過去に配布されたペイロードをすべて取得することが可能です。表2にアップロードしたSpyGlaceとアップロードされていた期間の対応関係を示します。
| SpyGlace Version | Upload Date & Time |
|---|---|
| Version 3.1.12 | Fri Jun 27 14:33:28 2025 +0900 |
| Version 3.1.13 | Thu Jul 3 18:25:18 2025 +0900 |
| Version 3.1.14 | Wed Jul 16 15:03:52 2025 +0900 |
| Content | Filename | Hash(SHA256) |
|---|---|---|
| Malicious VHDX | CV & Professional Experience.vhdx | f42d0fa77e5101f0f793e055cb963b45b36536b1835b9ea8864b4283b21bb68f |
| Malicious LNK | Resume.rtf.lnk | 25f81709d914a0981716e1afba6b8b5b3163602037d466a02bc1ec97cdc2063b |
| Part of Downloader1 | wic60.ds | ea37dfa94a63689c1195566aab3d626794adaab4d040d473d4dfbd36f1e5f237 |
| Part of Downloader1 | wic400.ds | a80848cf7d42e444b7ec1161c479b1d51167893f47d202b05f590ad24bf47942 |
| Part of Downloader1 | wic900.ds | 1e931c8aa00b7f2b3adedc5260a3b69d1ac914fe1c022db072ed45d7b2dddf6c |
| Dropper Script | glog.txt | c9c6960a5e6f44afda4cc01ff192d84d59c4b31f304d2aeba0ef01ae04ca7df3 |
| Downloader1 | WebClassUser.dat | f102d490ad02b1588b9b76664cd715c315eaab33ac22b5d0812c092676242b15 |
| DownLoader2 | WebCacheR.tmp.dat | 57a77d8d21ef6a3458763293dbe3130dae2615a5de75cbbdf17bc61785ee79da |
| DownLoader2 | WebCacheR.tmp.dat | 9e30df1844300032931e569b256f1a8a906a46c6a7efa960d95142d6bea05941 |
| git.exe(Legitimate) | gcmd.exe | 96312254d33241ce276afc7d7e0c7da648ffe33f3b91b6e4a1810f0086df3dba |
| SpyGlace version 1.3.12 | datautils.txt | 669c268e4e1ced22113e5561a7d414a76fcd247189ed87a8f89fbbd61520966a |
| SpyGlace version 1.3.13 | datautils.txt | f96557e8d714aa9bac8c3f112294bac28ebc81ea52775c4b8604352bbb8986b8 |
| SpyGlace version 1.3.14 | datautils.txt | 8b51939700c65f3cb7ccdc5ef63dba6ca5953ab5d3c255ce3ceb657e7f5bfae8 |
| SpyGlace Loader | datapages.txt | d535837fe4e5302f73b781173346fc9031d60019ea65a0e1e92e20e399a2f387 |
| SpyGlace Loader | datapages.txt | 6d8a935f11665850c45f53dc1a3fc0b4ac9629211bd4281a4ec4343f8fa02004 |
| Downloader2 | coninst3110.dat | d287dc5264fd504b016ec7e424650e2b353946cbf14d3b285ca37d78a6fda6f4 |
| Loader | constart3110.dat | 10278a46b13797269fd79a5f8f0bc14ff1cc5bc0ea87cdd1bbc8670c464a3cf1 |
| Downloader1 | ingredient.txt | 156df8c8bea005bd7dc49eb7aca230ef85ada1c092e45bb3d69913d78c4fa1f9 |
| Loader Scrpt | UsrClass.sct | 7ae86f2cb0bbe344b3102d22ecfcdda889608e103e69ec92932b437674ad5d2f |
| Loader Scrpt | UsrClass.sct | e8b3b14a998ce3640a985b4559c90c31a5d7465bc5be5c6962e487172d3c9094 |
| Loader | intersection.txt | 09fcc1dfe973a4dc91582d7a23265c0fd8fc2a011adb2528887c1e1d3a89075a |
| Downloader | opinsfile.dat | 048b69386410b8b7ddb7835721de0cba5945ee026a9134d425e0ba0662d9aee4 |
| Loader | constafile.dat | f495171e7a10fb0b45d28a5260782a8c1f7080bd1173af405476e8d3b11b21b6 |
| Downloader | coninsfile.dat | 8ea32792c1624a928e60334b715d11262ed2975fe921c5de7f4fac89f8bb2de5 |
| Malicious VHDX | CV & Professional Experience.vhdx | 94ccdaf238a42fcc3af9ed1cae1358c05c04a8fa77011331d75825c8ac16ffd8 |
| Dropper Script | volumelog.txt | 299d792c8d0d38d13af68a2467186b2f47a1834c6f2041666adafc626149edaf |
| Part of Downloader1 | vol60.dot | ea37dfa94a63689c1195566aab3d626794adaab4d040d473d4dfbd36f1e5f237 |
| Part of Downloader1 | vol400.dot | 94f6406a0f40fb8d84ceafaf831f20482700ee1a92f6bca1f769dff98896245c |
| Part of Downloader1 | vol900.dot | 45c1c79064cef01b85f0a62dac368e870e8ac3023bfbb772ec6d226993dc0f87 |
| Downloader1 | UsrClassCache.dat | 50b40556aa7461566661d6a8b9486e5829680951b5df5b7584e0ab58f8a7e92f |
| Malicious LNK | Resume.rtf.lnk | 5da82fa87b0073de56f2b20169fa4d6ea610ed9c079def6990f4878d020c9d95 |
Appendix C:IoC Other
| Content | Value |
|---|---|
| Mutex | K31610KIO9834PG79A90B |
| Mutex | K31610KIO9834PG79AD7B |
| Mutex | K31610KIO9834PG79A44A |
| CLASSID | {566296fe-e0e8-475f-ba9c-a31ad31620b1} |
| CLASSID | {64B8F404-A4AE-11D1-B7B6-00C04FB926AF} |
| File path | %userprofile%\AppData\Local\Microsoft\Windows\WebClassUser.dat |
| File path | %localappdata%\Microsoft\Windows\WebCache\WebCacheR.tmp.dat |
| File path | %userprofile%ppdata\local\Microsoft\GameDVR\data\GameList.dat |
| File path | %userprofile%ppdata\local\Microsoft\GameDVR\data\DataCache.dat |
| File path | %temp%\wcts66889.tmp |
| File path | %localappdata%\Microsoft\Windows\UsrClassCache.dat |
| File path | %localappdata%\Microsoft\Windows\UsrClassLib.dat |
| File path | %userprofile%ppdata\local\Microsoft\Edge\cache\Config.dat |
| File path | %userprofile%ppdata\Local\Microsoft\Windows\UsrClassCache.dat |
| File path | %userprofile%ppdata\local\Microsoft\Edge\cache\Cache.dat |
Appendix D:Commands
| Command | Contents |
|---|---|
| turn on | Change the interval settings |
| turn off | Reset the interval settings |
| cd | Change directory |
| ddir | List of the files in the directory |
| ddel | Delete file and directory |
| ld | Load module |
| uld | unload module |
| attach | Start module |
| detach | Stop module |
| procspawn | Start process |
| prockill | None |
| proclist | None |
| diskinfo | Get disk information |
| download | Download encrypted file |
| downfree | Download file |
| cancel | Remote shell |
| screenupload | Upload screenshot |
| screenauto | Upload screenshot automatically |
| upload | Upload file |
Appendix E:Email address used for the commit
kithatart@outlook.com magnolia099@163.com carolab989@proton.me fenchiuwu@proton.me Ridgley223870@proton.me
Appendix F:Victimized devices identified from the GitHub repository
1014988494f04da28046ba 1020301627MBE4OSU 2096821130DESKTOP-BN9A2SA 2958455713DESKTOP-NKVAKV1 4205732935******(個人名が含まれている可能性があるためマスクしています) 3761538073DESKTOP-PVKDUAM 3537034124JKS 3472318429******(個人名が含まれている可能性があるためマスクしています) 1620260207DESKTOP-6LO36DE 1347261043DESKTOP-0V7K7HA 2352730816DESKTOP-4QC5J5Q 3362573326DESKTOP-43R2GH0