乐于分享
好东西不私藏

伪装成卡巴斯基安装包银狐高对抗样本分析

伪装成卡巴斯基安装包银狐高对抗样本分析

点个蓝字关注我们

在吉宙实验室例行威胁样本追踪过程中,发现一个伪装成卡巴斯基官网的钓鱼网站
下载文件并将其上传至吉星云诱捕分析平台 (https://decoymini.com) 进行检测,检测结果如下:
检测结果
进程详情
网络行为
释放的文件
ATT&CK

分 析

下载下来是一个 zip 压缩包文件,解压后是一个大小为 61.69MB 的 64 位程序
在查看节数据时,发现 .data 段占到了总体积的 99%
.text 段不足 1%,从中可察觉出 "异常"
样本运行后首先会进行反沙箱操作
通过三次无意义操作,单纯消耗 CPU 时间从而实现延迟

payload自我修复

在上图中的 sub_1400029b9 中会将 .data 段偏移 0x86f39 处的数据复制到新分配的可执行内存中去
大小为 0xcc4e,最后跳过去执行
1BCE2F 会对 0x1B0009 ~ 0x1B001A 处指令修复

第一阶段shellcode解密

指令修复之后进行自身异或解密后半部分 shellcode,算法 IL 形式如下
将 0xd2 作为首次异或 key,后续 key 每次发生变化,旧 key 加上异或后的值成新 key 再继续异或,如此往复,在 Binary Ninja 中使用 Python 进行手动还原
from binaryninja import *"""00000000001BCE2F | 49:C1EA 00               | shr r10,0                               |00000000001BCE33 | 5B                       | pop rbx                                 |00000000001BCE34 | EB 04                    | jmp 1BCE3A                              |00000000001BCE36 | 48:C1EF 00               | shr rdi,0                               |00000000001BCE3A | C143 04 D5               | rol dword ptr ds:[rbx+4],D5             |00000000001BCE3E | F753 08                  | not dword ptr ds:[rbx+8]                |00000000001BCE41 | F753 0C                  | not dword ptr ds:[rbx+C]                |00000000001BCE44 | 4D:0F4BFF                | cmovnp r15,r15                          |00000000001BCE48 | C143 10 0C               | rol dword ptr ds:[rbx+10],C             | rbx+10:"-\v"00000000001BCE4C | FFE3                     | jmp rbx                                 |"""def rol(x, n):    n %= 32    return ((x << n) | (x >> (32 - n))) & 0xFFFFFFFFdef decrypt():    bv = current_view    TARGET_VA = 0x140086f39    DATA_SIZE = 0xCE4E    data = bytearray(bv.read(TARGET_VA, DATA_SIZE))    print(f"[*] Read {len(data)} bytes from 0x{TARGET_VA:x}")    with open("decrypted_before.bin""wb"as f:        f.write(data)    # 指令修复    d0 = int.from_bytes(data[0x05:0x09], 'little')    d1 = int.from_bytes(data[0x09:0x0D], 'little')    d2 = int.from_bytes(data[0x0D:0x11], 'little')    d3 = int.from_bytes(data[0x11:0x15], 'little')    d4 = int.from_bytes(data[0x15:0x19], 'little')    d1 = rol(d1, 0xD5)    d2 = ~d2 & 0xFFFFFFFF    d3 = ~d3 & 0xFFFFFFFF    d4 = rol(d4, 0xC)    data[0x05:0x09] = d0.to_bytes(4'little')    data[0x09:0x0D] = d1.to_bytes(4'little')    data[0x0D:0x11] = d2.to_bytes(4'little')    data[0x11:0x15] = d3.to_bytes(4'little')    data[0x15:0x19] = d4.to_bytes(4'little')    # xor 解密    key = 0xD2    DECRYPT_SIZE = 0xCE09    DATA_OFFSET = 0x25    for i in range(DECRYPT_SIZE - 1, -1, -1):        idx = DATA_OFFSET + i        data[idx] ^= (key & 0xFF)        key = (key + data[idx]) & 0xFF    print(f"[+] Decrypted {DECRYPT_SIZE} bytes")    with open("decrypted_after.bin""wb"as f:        f.write(data)    print("[+] Done!")if __name__ == "__main__":    decrypt()
最后 jmp 到 shellcode 处执行

第一阶段shellcode分析

通过 PEB 结构和函数哈希方式获取 LoadLibraryA 和 GetProcAddress 地址
在开始处会判断自身是否为管理员权限运行,若不是则提权再调用 ShellExecuteExA 启动自身,接着通过时间差判断是否处于调试状态中,若是则 Sleep 10 秒,最后反沙箱操作,通过 NtDelayExecution 再次延迟 10 秒
在接下来的 sub_c90f 中进行大量重复性分配内存,写内存操作
总共分配 500 次,每次分配 0xAE05 个字节,重复 0xAE05 次写入 '#',整个过程相对来说非常耗 CPU 时间,再修改内存为可执行属性,最后释放,也许是在干扰沙箱的内存检测
接下来通过时间精度差计算来反调试,若成立则退出程序,PfxInitialize 是否初始化成功,初始化失败退出程序

第二阶段shellcode解密

将偏移 0x2f 处的数据复制到新分配到内存当中进行解密,大小 0xAE05
解密算法,arg1 为待解密内容,arg2 为大小 0xAE05,arg3 为异或 key
使用 Python 进行手动还原
def decrypt_data_2f():    bv = current_view    data = bv.read(0x2f0xAE05)    with open("data_2f.bin""wb"as f:        f.write(data)    key = b"4@e!c!bSL2AeimnwyD4x"    decrypted = bytearray(data)    for i in range(len(data)):        decrypted[i] = data[i] ^ key[i % len(key)]    with open("data_2f_decrypted.bin""wb"as f:        f.write(decrypted)    print(f"[+] Decrypted {len(decrypted)} bytes")    print("[+] Saved to data_2f_decrypted.bin")
最后转到解密后内容处开始执行

第二阶段shellcode分析

解密后的 shellcode
跳转后首先检测自身运行路径是否包含 :\\myapp.exe 从而来判断是否正在被模拟执行
上述代码来源于公开的 UACME 项目中 windefend.c 中代码
通过检测 Microsoft 安全引擎自身的虚拟文件系统痕迹来检测其模拟行为。接着对 NtTraceEvent 函数头进行 Patch,写入 c3 指令,从而使 AmsiScanBuffer 和 ETW 监控失效

下一步还是检测自身是否被模拟执行,遍历 ntdll.dll 中导出函数名哈希是否为下面三个其中之一

  • 0x70CE7692

  • 0xD4CE4554

  • 0x7A99CFAE

同样也来自 UACME 项目
判断互斥体,如果互斥体存在则退出程序,不存在则进入到主体
进入主体后有个多条件判断
  • sub_2c35

  • sub_27e5

  • sub_29b5

  • sub_2715

  • sub_23a5

  • sub_2d45

sub_2c35

先解密字串,获取 pid.dll 中 DllGetClassObject 地址并调用来检测是否被模拟执行,原理是为了加快分析速度、避免执行恶意代码或因为不完整的系统环境,一些沙箱或模拟器并不会完整实现复杂的 COM 查找和加载机制。它们可能会直接劫持对 DllGetClassObject 的调用,并总是返回错误码 CLASS_E_CLASSNOTAVAILABLE (即 0x80040111),表示这个类不可用

sub_27e5
不断地申请堆内存和执行无效循环来反模拟执行
sub_29b5
SxIn.dll 为 360 虚拟沙箱所加载的 dll 文件,通过加载此 DLL 来检测是否处于 360 虚拟沙箱环境中
sub_2715
通过调用 GetSystemInfo 获取 CPU 核心数,小于 2 则位于虚拟环境中
sub_23a5
通过 rdtsc 指令来检测代码执行速度异常从而判定是否位于虚拟环境中
sub_2d45
通过 QueryPerformanceCounter 检测时间流速来判断是否被调试和位于虚拟环境中
6 个条件判断完后再次检测是否为管理员权限运行
sub_1785 通过 GetTickCount64 检测时间流速来判断是否被调试和位于虚拟环境中

当虚拟环境检测完毕后,接着通过遍历进程的方式检测当前环境中是否运行以下进程

  • 360tray.exe

  • 360sd.exe

  • 360safe.exe

另通过查找 Q360SafeMonClass 类的窗口来判断是否有 360 监控组件,若存在则通过 PostMessage 发送消息关闭。if...else 需分两种情况讨论

sub_85f5

在此 sub 开始处,通过 SetProcessShutdownParameters 将自身设置为在关机时最后一个关闭,当进程卡住时,不会显示重试、等待对话框。另外还调用了 SetConsoleCtrlHandler,将 sub_85d5 作为该函数的回调函数,mov edx, 0x1 表示 TRUE,意为添加处理程序
然而,sub_85d5 处理程序并不做任何操作
设置完成后,便开始拼接一个域名,该域名被分成了四部分,第一部分 ykkgj://
第二部分通过读取自身 0x2a、0x2f、0x26 (*/&) 标志后 0esrp3 字符串
第三部分 .fjj-te-svzazex.rczpletj.tfd/,第四部分为 k、r、u,从而拼接成 ykkgj://0esrp3.fjj-te-svzazex.rczpletj.tfd/kru,经过解密后为 https[:]//0nbay3.oss-cn-beijing.aliyuncs.com/tad
连接域名获取该 tad 内容到新分配的堆内存中
对 tad 内容进行解密
解密算法 xor,key 为 0xa81cdb6f

从解开的数据可以获取以下信息

  • https[:]//0nbay3.oss-cn-beijing.aliyuncs.com/a.gif

  • https[:]//0nbay3.oss-cn-beijing.aliyuncs.com/b.gif

  • https[:]//0nbay3.oss-cn-beijing.aliyuncs.com/c.gif

  • https[:]//0nbay3.oss-cn-beijing.aliyuncs.com/d.gif

  • install.exe

  • UxEnhance64.dll

  • msadox.tb

  • adoresd.dat

在 Public 创建一个隐藏目录,目录文件名为随机生成 6 位字符串

继续拼接,其中三个文件名固定,另以 .exe 结尾的同样也是随机生成的 6 位字符串

完成后又开始检测是否存火绒杀毒软件

当检测不到火绒杀毒软件时,继续检测其它杀毒软件,其中涵盖了

  • Bka*:一家越南安全公司开发的安全杀毒产品 Bkav (看来也针对东南亚地区)

  • cefutil、QHSafeTray:360

  • k*:金山

当检测存在其中某一款,则设置一个标志,后面待会要用到
检查完毕后远程访问 *.gif 数据在内存中解密

以下为对应关系

  • a.gif -> YzhYCq.exe

  • b.gif -> UxEnhance64.dll

  • c.gif -> msadox.tb

  • d.gif -> adoresd.dat

以上都是从 gif 文件偏移 0x3A0 处开始,逐字节异或,异或起始 key 为 0x45,每次异或后 key 自增 1

当不存在企业微信时,读取自身数据,查找 0x2a、0x2f、0x26 (*/&) 标志,往前添加 32 字节的随机数据,然后写入到 HKLM\SOFTWARE\JDBCC\data 中
将 ykkgj://0esrp3.fjj-te-svzazex.rczpletj.tfd/ 与 j.urk 拼接,再解密,远程访问https[:]//0nbay3.oss-cn-beijing.aliyuncs.com/s.dat
对 s.dat 解密
解密算法 xor,key 为 0xa6c4f6b8
再将保存到 C:\Windows\Temp\ranchserv.jpg,并保持文件句柄处于打开状态。ranchserv.jpg 是一个带有有签名驱动程序,它是 Adlice 产品 RogueKiller 反 rootkit 驱动程序 的一部分,在过去,攻击者会使用它来结束任意进程。这里特意使用了 2.0.2 版本,规避了 VDL 及 LOLDriver 检测机制,并修改了数据,哈希值改变,但签名依然有效
CheckPoint 在 25 年发表报告称在野发现此版本 2500+ 变种[1],哈希值都不一样,但签名依然有效,官方 2.0.2 版本哈希值为
347acba74fdcbeac671521739f8a34ec0e378caf716c31f55616f9f843e4d0d3
在这里目的是强制结束杀软进程。后面判断 YzhYCq.exe 和 UxEnhance64.dll 两个文件是否存在,不存在则重启自身

第三阶段shllcode解密

若存在时,远程访问 https[:]//0nbay3.oss-cn-beijing.aliyuncs.com/s.jpg,解密 s.jpg,修改内存属性,跳转到解密后内容处开始执行

第三阶段shellcode分析

执行过程中反射加载 DLL,调用导出函数 VirtuOne
DLL 文件名 RPCScheduleTask.dll

VirtuOne 导出函数开始创建绑定字符串,包含

  • 任务调度器 RPC 接口 UUID (86D35949-83C9-4044-B424-DB363231FD0C)

  • 命名管道协议 ncacn_np

  • 连接到本机 localhost

  • 管道名 \pipe\atsvc

这是建立 RPC 绑定过程,接着构建任务 XML,将传递给 VirtuOne 的参数写入 XML 模板中

XML 中包含

  • 登录触发器 (任何用户登录系统时)

  • 时间触发器 (每隔 1 分钟执行一次)

  • 最终以管理员执行

  • 默认启用

  • 不允许硬终止

  • 执行文件 YzhYCq.exe

<?xml version="1.0" encoding="UTF-16"?><Taskversion="1.2"xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">  <RegistrationInfo>    <Description/>    <URI>\</URI>  </RegistrationInfo>  <Triggers>    <LogonTrigger>      <Enabled>true</Enabled>    </LogonTrigger>    <TimeTrigger>      <Repetition>        <Interval>PT1M</Interval>        <StopAtDurationEnd>false</StopAtDurationEnd>      </Repetition>      <StartBoundary>2009-04-23T00:00:00</StartBoundary>      <Enabled>true</Enabled>    </TimeTrigger>  </Triggers>  <Principals>    <Principalid="Author">      <GroupId>S-1-5-32-545</GroupId>      <RunLevel>HighestAvailable</RunLevel>    </Principal>  </Principals>  <Settings>    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>    <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>    <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>    <AllowHardTerminate>false</AllowHardTerminate>    <StartWhenAvailable>true</StartWhenAvailable>    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>    <IdleSettings>      <StopOnIdleEnd>true</StopOnIdleEnd>      <RestartOnIdle>false</RestartOnIdle>    </IdleSettings>    <AllowStartOnDemand>true</AllowStartOnDemand>    <Enabled>true</Enabled>    <Hidden>true</Hidden>    <RunOnlyIfIdle>false</RunOnlyIfIdle>    <WakeToRun>false</WakeToRun>    <ExecutionTimeLimit>PT0S</ExecutionTimeLimit>    <Priority>4</Priority>  </Settings>  <ActionsContext="Author">    <Exec>      <Command>C:\Users\Public\vZaBEp\YzhYCq.exe</Command>      <WorkingDirectory>C:\Users\Public\vZaBEp\</WorkingDirectory>      <Arguments />    </Exec>  </Actions></Task>

设置 QoS 标志,调用 RPC 方法 (NdrClientCall3 是 NDR 客户端 Stub 调用函数)

后续便是一顿清理操作,这就完了?不,以上这种情况是通过外在一个 arg1 参数控制,当为 0 时,才有以上这些行为,当不为 0 时,则会创建 vbs 脚本

sub_85f5 参数由 var_d0_1 控制,而这个变量一开始就为 0,当一开始检测到存在 360 相关软件时会将此值设为 1

假如一开始就检测到存在 360 相关进程,var_d0_1 被设置为 1,后续才会去创建这个 vbs 脚本,脚本名为 checktime.vbs

On Error Resume NextSet WShell = CreateObject("WScript.Shell")WShell.Run """arg2 = C:\Users\Public\vZaBEp\YzhYCq.exe""", 0FalseSet WShell = NothingWScript.Quit

那后面计划任务就不是直接执行 YzhYCq.exe,而是执行此 vbs 脚本,再由它去执行 YzhYCq.exe。

另一种情况

若一开始就检测到 360 相关程序时,会先去创建一个线程,线程函数 sub_3525

在接下一个 while 循环中,也会创建相同线程,创建 3 次

这些操作针对性较强 (360),线程函数

sub_2f95 是一个破坏性函数,它会获取系统所有的 TCP 连接,然后筛选属于 360safe.exe 的连接,强制将这些连接状态设置为 CLOSE_WAIT (0xC),从而终止 360 的网络通信,避免云查杀,无法上报可疑行为,无法更新病毒库

YzhYCq.exe

母体文件曲曲折折到头来就是为了将 YzhYCq.exe 执行,该文件带有有效的腾讯签名

UxEnhance64.dll

YzhYCq.exe 运行后会加载同目录下的 UxEnhance64.dll 文件

但该 DLL 文件受 VMProtect 保护
查看导出表,两个指向同一地址
待修复后,执行导出函数,读取同目录下的 msadox.tb 文件,该文件大小 9KB (0x20A1),有 SQLite 标记

msadox.tb解密

获取内容后,便开始从文件开始处以每 8 字节一组,每次向后平移 1 字节进行 "地毯式" 搜索
搜索标志,0xBB、0xE6、0x36、0x23、0x23、0x96、0x3B、0x89
将位于标志后的剩余内容复制到新分配后的堆内存中,随后初始化 RC4,密钥 0x3D、0xE2、0x3F、0x7A、0xD2、0x83、0xA1、0xF7,解密后的内容

msadox.tb分析

解密出来是一段 shellcode,后续将此 shellcode 写入到 YzhYCq.exe 入口处并跳转
获取 adoresd.dat 文件尾部 5 字节数据 (D0、05、00、00、E6)
从该文件偏移 0x5D0 起,与 0xE6 异或,0xE6 开始递增,依次异或
解密出来的数据

adoresd.dat

adoresd.dat -> adoresd.dll,最终反射加载此 DLL,执行导出函数 DelegateEnSerialization
同样也受 VMProtect 保护

执行后,在 C:\Program Files (x86) 目录下生成 LKeZ3k 的目录,并在其释放以下文件

  • LKeZ3k.exe

  • image.png

  • thumbs.db

  • XPSPLOG.dll

添加一项计划任务,用于启动 LKeZ3k.exe

LKeZ3k.exe

LKeZ3K 是一个带有有效签名的程序

XPSPLOG.DLL

LKeZ3k.exe 运行后会加载同目录下的 XPSPLOG.dll 文件,它是一个受 VMProtect 保护的 32 位 DLL 程序
DLL 中导出函数以序号导出
该 DLL 和 UxEhance64.dll 行为类似,数据修复后会读取同目录下 thums.db 文件,解密出 shellcode

thums.db解密

与解密 msadox.tb 方式不一样 (搜索特征 -> RC4),这里直接从尾部读取 5 字节数据,将解密出的内容复制到新分配的堆内存当中,偏移 0x990 起,与 0x45 异或,0x45 开始递增,依次异或
将解密后的 shellcode 复制到 LKeZ3k.exe 入口处并跳转

thums.db分析

shellcode 再去读取 image.png 并解密,解密出来的数据
与解密 adoresd.dat 一样也是从 image.png 尾部读取 5 字节数据,将解密出的内容复制到新分配的堆内存当中,偏移 0x5D0 起,与 0xA8 异或,0xA8 开始递增,依次异或

image.png

Image.png -> image.dll,反射加载,执行 PhilipsCoInitialize 导出函数
同样也受 VMProtect 保护
执行导出函数后,连接 https[:]//new2027.oss-cn-hongkong.aliyuncs.com/extra-task2.png,获取内容到内存中
文件偏移
将 0x40 处的内容复制到另一分配堆内存中,大小 0x2D0200
解密出 PE 数据,然后将其保存至 C:\ProgramData 下
设置隐藏属性
最后通过调用  COM 执行
创建任务计划

连接 

  • https[:]//new2027.oss-cn-hongkong.aliyuncs.com/dsb-hr1.png -> xxx.exe

  • https[:]//new2027.oss-cn-hongkong.aliyuncs.com/dsb-hr2.png -> xxx.dat

  • https[:]//new2027.oss-cn-hongkong.aliyuncs.com/dsb-hr3.png -> xxx.png

解密方式与 extra-task2.png 方式相同,最终保存至 C:\ProgramData 下,设置隐藏和系统属性
设置任务计划启动
连接 C2 (qcpcui[.]net -> 8[.]218.35.71)

9XWMuT53.exe

9XWMuT53.exe 经过了 UPX 标准加壳,运行后会加载同目录下的 9XWMuT53.dat

9XWMuT53.dat

9XWMuT53.dat 是一个带密码的压缩包,里面包含 4 个文件
解压密码 99B2328D3FDF4E9E98559B4414F7ACB9,将其中 3 个文件 (除了 _TUProj.dat) 解压至
C:\Users\[username]\AppData\Local\Temp\_ir_tu2_temp_x
解压完毕后,启动自我检测更新,在 temp 目录下创建 Xshell 6 Update Log.txt 文件夹,将日志写入其中
利用 XShell 的自我更新创建一个线程执行 Lua 脚本 (_TUProj.dat 是一个 Lua 脚本)

线程函数首先通过函数哈希方式获取以下 API

  • CreateFileW

  • GetFileSize

  • ReadFile

  • CloseHandle

  • VirtualAlloc

  • GetModuleFileNameW

读取同目录下 9XWMuT53.png

将 9XWMuT53.png 内容读到新分配后内存当中

9XWMuT53.png

RC4 初始化,密钥
50 40 73 73 77 30 33 64 00 DE 9C AB FE CC D0 12
将偏移 0x40 处数据进行 RC4 解密

接着通过函数哈希方式获取以下 API 地址

  • VirtualFree

  • VirtualProtect

  • LoadLibraryA

  • GetProcAddress

最后反射加载解密后的 PE (DLL) 数据,执行 PluginMe 导出函数 (这个名称有点熟悉)

PluginMe 首先判断是否为管理员权限运行,若不是直接退出
接着创建一个名为 E2D0491F7A75AE94FCCD983BDDFDOLED 互斥体
查看 TokenElevation 属性值确认权限并尝试关闭 UAC
接着创建三个线程
线程 sub_100033d0 用来监视本程序是否被删除,例如被安全软件删除,若被删除后续便可从内存中恢复
在线程 sub_10002c20 中
从 HKEY_LOCAL_MACHINE\SOFTWARE\TempUpdate 下读取 6f2619f5e261bebd 键的值,并将其解密为 cinskw.net
最终为 http[:]//cinskw.net:6090/license

远程连接并将数据保存为文件,但因失效,无法获取其内容,在这里猜测下应该是后门模块。在线程 sub_100024e0 中,会去连接一个 IP (104[.]224.159.87),目标失效,强行修改条件成立

将数据保存至 C:\ProgramData\UpdateStore.exe,最后通过 COM 来启动
在三个线程外的 sub_10001300 中
连接 https[:]//new2027.oss-cn-hongkong.aliyuncs.com/page-404.png
将数据解密后保存至 C:\ProgramData\7Ncpu234\sVG0NLPh.exe
最后启动该进程
随后向 HKEY_LOCAL_MACHINE\SOFTWARE\SnapRecords 写入 flag 值,这个值有什么用,还未知
设置任务计划启动
以下 FXWMYkGZ.exe 为 9XWMuT53.exe,因为它名称随机,建立的远程连接

sVG0NLPh.exe

sVG0NLPh.exe 是一个大小为 663KB 的 64 位程序,经过了 UPX 非标准 (魔改) 加壳
经脱壳后,程序首先创建一个名为 218650560-777617685-4287762684-137415000 的互斥体
获取启动程序中命令行参数,看是否为 0x6F0,即 1776,也就是在判断是否是从任务计划程序启动,若不是则直接退出程序
从 HKEY_LOCAL_MACHINE\SOFTWARE\Perfr 获取 Pool 的值
从中解密出 IP (118[.]107.32.216:8050)
后续连接用于下发疑似挖矿程序,CPU 占用居高不下

总 结

该样本是一个高度复杂 (攻击链路异常繁杂) 的多阶段恶意程序,以伪装卡巴斯基官网的钓鱼网站为初始攻击入口,通过层层解密和反射加载,最终释放出具备持久化、反杀软对抗及远程控制能力的后门模块,并兼具挖矿功能。样本在攻击链中大量使用反沙箱、反调试、反模拟执行技术,针对 360、火绒、金山等国产安全软件进行定向对抗,甚至利用篡改后签名依然有效的 RogueKiller 反 Rootkit 驱动强制终止杀软进程。其核心组件普遍采用 VMProtect 加壳,并借助带腾讯有效签名的程序进行 DLL 侧加载实现白利用,通过计划任务、注册表、VBS 脚本等多种手段建立持久化。样本基础设施大量依托阿里云 OSS 分发 Payload,C2。综合其攻击手法、代码特征、对抗目标、白利用方式及基础设施等维度,该样本与银狐黑产组织高度吻合。

参 考

[1] https://research.checkpoint.com/2025/large-scale-exploitation-of-legacy-driver/

IoCs

Hash:

  • d8e92d3ddab6bb66a96febfbe400255b

  • af87b4b30fc786c7eb4f0c7c01f86154

  • 9ec587911e501b73b7cf09f05d0ae17d

  • 2e8bf1a995fadc6c0f663f4cb76f174f

  • 817b1e5490fa19fb9f55d085109cfbe7

  • a827170abe2db4eb602b1dfe1c602b98

  • 9cf1b3962ab8b8707103c8d27a2ab3a2

  • db8510d6a45a657dd46e8cd31cabbb22

  • 9ba2c9ad95b35d9fe9ed7f2428aae19c

  • f12fac7501404eee0e6b630633f59d56

  • 6700e68521100873a339688902a5547f

  • 7e6a9f404d81ea85bbfd1f118211b680

URL:

  • https[:]//0nbay3.oss-cn-beijing.aliyuncs.com/a.gif

  • https[:]//0nbay3.oss-cn-beijing.aliyuncs.com/b.gif

  • https[:]//0nbay3.oss-cn-beijing.aliyuncs.com/c.gif

  • https[:]//0nbay3.oss-cn-beijing.aliyuncs.com/d.gif

  • https[:]//0nbay3.oss-cn-beijing.aliyuncs.com/s.dat

  • https[:]//0nbay3.oss-cn-beijing.aliyuncs.com/s.jpg

  • https[:]//2026mn.oss-cn-hongkong.aliyuncs.com/qd.dat

  • https[:]//new2027.oss-cn-hongkong.aliyuncs.com/extra-task2.png

  • https[:]//new2027.oss-cn-hongkong.aliyuncs.com/dsb-hr1.png

  • https[:]//new2027.oss-cn-hongkong.aliyuncs.com/dsb-hr2.png

  • https[:]//new2027.oss-cn-hongkong.aliyuncs.com/dsb-hr3.png

  • http[:]//new2027.oss-cn-hongkong.aliyuncs.com/page-404.png

  • http[:]//cinskw.net:6090/license

  • qcpcui[.]net

IP:

  • 104[.]224.159.87

  • 118[.]107.32.216:8050 (疑似挖矿)

C2:

  • 8[.]218.35.71

  • 8[.]218.125.215

  • 47[.]243.218.255

Mutex:

  • 26f3475fc22

  • 48c47662941

  • E2D0491F7A75AE94FCCD983BDDFDOLED

  • 218650560-777617685-4287762684-137415000