1. 313MB加密包是怎么进入视野的
先说结论:这不是一起偶发的个人电脑中毒事件,而是一次针对企业内网的分发式攻击。整个事情的起点,是某制造企业的一台研发服务器上出现了异常的上行流量。运维同事最初以为是后台同步任务,调了流量报表才发现,这台服务器几乎每天凌晨都会向外网某个陌生IP方向发送约几十MB的加密数据,时间点非常固定。
顺着进程排查下去,定位到一个运行了一周多的“软件安装包”相关服务。这个安装包是研发部门从第三方技术论坛下载的,文件名带着官方软件的名称和版本号,压缩包体积313MB,外层套着密码保护。研发同事说当时下载页面上给了“解压密码”,解压后是一个正经的安装程序,装完也能正常用,就没多想。但安全团队用工具一查,安装程序的文件哈希在国内外主流引擎里几乎是零检出。这就很说明问题了——加密包绕过了文件上传检测,安装程序绕过了静态查杀,整个过程没有任何一个环节触发告警。
我当时判断,这大概率是有人故意把恶意程序“包”进了合法的加密压缩包里。313MB的体积也不是随手凑出来的,密码保护加超大体积,目标很明确:让自动化检测工具在扫描阶段就失去耐心,或者因为体积超出上传限制而放弃分析。这类手法在定向攻击里并不罕见,但能把“加密压缩包”当成投递层的攻击,说明攻击者对目标企业的防御体系做过功课——知道他们有邮件网关、有沙箱、有终端杀软,所以干脆在第一步就把文件拦在检测范围之外。
这个案例完整走了一遍从发现到取证再到加固的流程。给正在做企业安全、或者管着服务器和终端的朋友一个参考:当你看到加密包、大体积安装包、静默外联这三个词同时出现时,大概率已经是攻击链的中后段了。下面把这套分析过程拆开讲清楚。
2. 拆包与静态分析:313MB里藏了什么
2.1 解密的思路:密码本身就是线索
拿到加密包的第一步,是确认压缩包的加密方式。工具上看是ZipCrypto还是AES-256,这个无所谓,关键是密码怎么来。攻击者不会平白无故设一个高强度密码然后自己都记不住,常见套路是把密码放在下载页、附件说明、或者包内一个偷偷改过的txt里。
这个案例里,研发同事保留了下载页的截图,页面上写着“解压密码:2024@Tech#”。看起来很正常,论坛分享软件都会这么做。但注意一个细节:这类下载页的密码通常是为了防爬虫、防批量下载,一般会定期更换。而这313MB的包是三个月前发布的,密码却一直有效,说明下载页和压缩包是捆绑运营的——页面存活多久,密码就有效多久,这正是攻击者可控基础设施的特征。
解压之后,包内结构是这样的:
software_v3.2.1.zip ├── setup.exe # 伪装主安装程序,约35MB ├── data/ │ ├── config.json # 带注释的配置,里面藏着更新地址 │ ├── libcrypto_impl.dll # 名义上的加密库,实际是代理DLL │ ├── updater_service.exe # 名义上的更新服务 │ └── license.dat # 名义上的授权文件,实际是加密数据容器 ├── 安装说明.txt # 正常说明文档 └── 授权证书.pdf # 正常文档,内含误导性指引解压出来之后不要急着点setup.exe。先看静态特征,这一步做扎实了,后面动态分析的效率能高一倍。
2.2 静态特征扫描:哪些字段不正常
拿PEStudio、火眼或exeinfo这类工具过一遍,重点看几个维度。
- 数字签名:setup.exe有签名,但签名主体和软件官方厂商完全是两家公司。更巧的是,签名证书是半年前签发给一家已经注销的贸易公司的。这种“挂名证书”是攻击者批量采购或自己注册的,翻车成本极低。
- 编译时间戳:PE头里显示编译时间是2022年,但包内文件属性里的创建时间是2024年。时间戳可以伪造,但攻击者往往只改PE头,忘了统一文件属性,这种不一致本身就是线索。
- 导入表:setup.exe导入了WinHttp、CryptEncrypt、GetAdaptersInfo这几个API。安装程序用WinHttp不奇怪,但GetAdaptersInfo(获取网卡信息)一般安装包用不到,这个组合值得怀疑。
- 资源段:资源段里没有正常的图标和版本信息,反而多了一个名称为“DATA”的目录,里面有多个大尺寸的资源块。直接用7-Zip把资源段抽出来,发现里面是压缩过的DLL,壳子藏得相当深。
静态阶段基本可以确认:这不是一个单纯的流氓软件,而是带有隐蔽信息收集和内网穿透能力的工具。继续往下挖。
2.3 字符串与配置提取:找到第一次外联地址
在二进制里搜字符串,不用太精细,先看有没有网址、IP、路径特征。这个包给了一个很友好的开局——config.json是以明文存储的,虽然外层数据段被加密过,但解析之后能看到一个带注释的“update_url”:
{ "app_name": "Software Updater", "update_url": "https://cdn.tech-update-service.com/check", "check_interval_sec": 3600, "report_channel": "http://192.168.203.18:8081/collect", "upload_threshold_mb": 50, "sleep_time_after_install": 120 }看到upload_threshold_mb: 50这条,我基本就明白了。攻击者设定了单次上传不超过50MB的阈值,配合每小时检查一次的间隔,把大流量拆成了小块,降低被流量审计发现的概率。这也解释了为什么运维看到的流量是“每天几十MB”——一个小时内拆成几批,峰值不突出,上下行比例也不会太离谱。
192.168.203.18是内网IP,说明包里的配置是针对内网环境定制的。攻击者不是广撒网,而是精确定点投放。这一步把定性从“恶意软件分析”提升到了“针对性攻击复盘”。
2.4 加壳与伪装:为什么杀软零检出
零检出不是因为病毒库落后,而是攻击者做了三层伪装。
第一层是外壳:整个安装包是合法的安装框架(Inno Setup或类似工具)打包的,签名有效,文件结构完整。杀软扫描时看到“签名有效+安装框架正常”,很容易直接放行。
第二层是载荷分离:真正的恶意载荷不在setup.exe本体里,而是藏在前面说的资源段压缩DLL中。安装时由安装脚本解压并释放到系统目录,释放行为本身是安装框架的正常操作,不在常见恶意行为模型里。
第三层是运行时解密:DLL释放出来后还是加密状态,由主程序在内存中动态解密,然后通过进程注入方式把代码写进合法进程。这样连EDR的行为监控看到的也只是“一个程序向另一个程序写内存”,如果没有对应的规则,基本不会拦。
这三层叠加,就是“313MB加密包+杀软零检出”的原因。体积大是给自动化分析设的障碍,加密是给内容识别设的障碍,运行时解密是给行为检测设的障碍——层层都冲着检测链路的盲区去。
3. 静默上传的完整链路:从收集到外发用了哪些手段
3.1 “静默”是怎么实现的
所谓静默上传,核心就两个字:无感。用户装了软件后一切功能正常,看不出任何异样,但后台在按计划干活。这个案例里能做到“静默”,靠的是三个设计:
- 延时启动:安装完成后sleep 120秒再开始动作,避开安装过程的安全监控窗口期。
- 低优先级运行:计划任务以空闲状态触发,只在系统空闲时跑,用户操作电脑时进程基本不活动,卡顿感知降到最低。
- 流量伪装:外联统一走443端口,用HTTPS承载数据。中间再加一层自定义加密,即使被抓到流量包,看到的也是无法解析的密文,无法直接提取内容。
这三点的组合效果是:用户无感、监控无告警、流量审计无法还原内容。很多企业采购了流量探针,但只看IP和域名告警,不关注连接频率和传输字节数,结果就是这类“低慢型”外联逃过一劫。
3.2 到底采集了哪些数据
从配置项和行为日志推算,这个上传通道至少采集了以下几类信息:
| 数据类别 | 具体内容 | 外发方式 |
|---|---|---|
| 主机指纹 | 网卡MAC、主机名、系统版本、已安装补丁列表 | 安装完成后立即上报 |
| 网络环境信息 | 本机IP、网关、DNS、可访问的内网网段探测结果 | 每隔6小时上报一次 |
| 文件索引 | 磁盘分区列表、用户目录下的文档文件名和大小 | 每日扫描一次 |
| 浏览器数据 | 常见浏览器的Cookies、保存的密码文件路径 | 仅统计路径和文件是否存在,不直接读取内容 |
| 企业通讯录信息 | 邮件客户端本地缓存的联系人信息 | 触发条件:检测到邮件客户端活动时 |
这里有一个值得注意的细节:它没有一上来就打包上传所有文件,而是先发“索引”。文件名、大小、路径——这些数据量很小,但信息密度极高。攻击者拿到索引后就能判断哪台机器有价值,再定向下发指令去拉具体文件。这种“小步快跑”的节奏,就是为了在早期尽量不暴露自己。
3.3 上传通道的技术实现:套了三层的“信封”
从抓包结果和内存dump还原来看,上传流程大致是:
原始数据 → 按字段拼接为JSON → AES-128-CBC加密(密钥硬编码在DLL中) → Base64编码 → 拼接伪装Header(模拟正常JSON结构) → 通过HTTPS POST到报告通道AES密钥不是随机生成的,而是DLL里一个固定字符串派生出来的。这在外行人看来是“加密了”,但对分析者来说反而省事——拿到DLL就能解密流量。攻击者真正的加密意图不在AES本身,而在于让流量探针“看到密文就放弃解析”,从而保护C2通信不被迅速识别。
那个/collect路径也很有讲究。它不是挂在某个随机域名下,而是挂在看起来像“收集反馈”的正常路径下。即使有人看到这个URL,第一反应也是“业务系统的数据收集接口”。这就是典型的“看着像好人,干着坏事”。
3.4 持久化:重启之后它还在不在
安装包释放出来的不只是主程序,还有一个“更新服务”。这个服务注册成Windows服务,启动类型是“自动(延迟启动)”。每次开机后一两分钟才开始运行,检查配置里的update_url,返回200就静默拉取“更新包”。所谓更新包,实际就是攻击者下发的指令或新模块。
另外,它还做了一件事:在用户启动目录放了一个快捷方式,指向伪装成日志查看器的程序。即使Windows服务被禁用,用户下次登录时依然会被触发。这个双通道持久化设计,让清理工作必须同时处理“服务”和“启动项”两个点,只杀其中一个,另一个会在下次重启或登录时把前一个拉起来。
4. 受害侧视角:如何发现、取证与止血
4.1 复盘触发点:流量分析为什么“后知后觉”
前面说运维发现了异常上行流量,但其实是事发一周后才看到的。为什么没有第一时间发现?两个原因。
一是流量基线的颗粒度太粗。公司只对机房的出入流量做了整体监控,没有精确到单台服务器的外连告警。也就是说,只要总带宽没跑满,几十MB的上传根本不会触达告警线。
二是DNS缓存掩盖了痕迹。配置里的域名解析结果被缓存了,流量日志里只看到域名查询记录过一次,后续全是IP直连。如果只盯着“域名黑名单”监控,第二个请求开始就已经盲区了。
这里分享一个实操建议:无条件部署全量DNS日志留存,最少90天。DNS日志是溯源最重要的第一手数据,很多“找不到线索”的案例,其实就是DNS日志没留存导致的。别等到事件发生了再去找日志策略,那时候已经晚了。
4.2 排查链路:从外到内一步步锁定
拿到线索之后,我建议按下面的顺序排查,效率和准确性都有保证:
- 先查计划任务和服务:用
schtasks /query /fo LIST /v导出所有计划任务,过滤隐藏的、名称和描述不匹配的。这个案例里服务名是“Software Update Service”,和官方更新服务只差几个字母,很容易看漏,要重点筛查名称里带“update”“help”“system”的。 - 再看进程外联:用Sysmon或系统自带
netstat -ano找到所有对外连接,重点看443端口的长连接。正常业务的外联频率是有规律的,如果某个进程的SYN包数量异常,记录PID,反查启动路径。 - 提内存再谈分析:先做一个全内存转储(DumpIt或类似工具),再结束可疑进程。进程一旦杀掉,很多运行时解密的数据就没了。这个顺序千万别颠倒。
- 查文件系统改动:按时间线反查可疑文件释放位置,重点关注
%TEMP%、%APPDATA%、ProgramData三个目录下是否有新出现的EXE或DLL。 - 最后看日志:汇总Windows事件日志中的4688(进程创建)、4697(服务安装)、7045(服务安装成功),交叉比对时间线,确定安装时间和触发的动作序列。
这一套下来,基本能把“谁、什么时候、做了什么、往哪传了什么”这条链拼出来。
4.3 止血动作:别急着删文件
很多IT同事拿到线索后的第一反应是“把它删了”。我的建议是:先控制,再隔离,最后分析。删删得早,等于把证据和情报一起销毁了。
正确的止血顺序是:
- 在防火墙上阻止C2域名和IP的出站连接,注意是“阻止”不是“断网”,保留其他业务能力,避免引发业务中断。
- 将受害机器从内网逻辑隔离,但保留远程取证通道(需要单独开通白名单)。
- 重置所有涉事账号的密码,重点排查管理员账号是否被用于横向移动。
- 清理持久化之前,先完整提取注册表项、计划任务定义、文件样本,并计算哈希、留存样本。
- 确认没有其他机器中招后,再批量清理恶意服务、启动项、文件。
另外提醒一句:清理之后要验证。用Sysmon或EDR对同一台机器做48小时行为监测,确认没有“回跳”行为。攻击者留下的模块经常会互相拉起,只清主程序不清辅助模块,过两天又活过来了。这个案例里我特意等了三天再复查,确认无外联后才把机器交回业务侧。
4.4 IOC提取:把情报固化下来
取证结束,把IOC(失陷指标)提取出来,用于内部检测规则的下发和外部情报共享。至少包括以下条目:
- 文件哈希:setup.exe、libcrypto_impl.dll、updater_service.exe的SHA256
- 域名:cdn.tech-update-service.com及其子域
- IP:192.168.203.18(内网C2,后续可能变更为外网IP)
- URL路径:/check、/collect
- 注册表路径:服务键值、启动项路径
- 计划任务名称:伪装后的任务名称
把这些IOC直接写成YARA规则和Suricata规则,放进检测体系里。就算攻击者换了样本,只要通信特征(比如User-Agent、证书指纹)没改,依然能命中。
5. 从这次事件看边界:加固方案与检测盲区
5.1 供应链入口要怎么管控才有效
这次中招的根源不是系统漏洞,而是“研发同事从第三方论坛下载了一个软件包”。技术防线做得再好,人类行为这条口子永远存在。与其寄希望于员工不乱下载,不如把供应链入口管起来:
- 建立内部软件源镜像,常用软件从镜像站统一分发,限制个人直接访问外网下载。研发需要特殊工具的,走申请审批流程,由安全团队先沙箱跑一遍再放行。
- 校验数字签名的信任链。企业内部CA签发的证书和受信任的公共证书可以放行,但“第三方签发给无关公司的证书”要直接拦。
- 对压缩包强制执行内容检查。很多网关能解压检查,但遇到带密码的包就无能为力了。可以加一条策略:带密码的压缩包一律阻断,有需求走内部审批。这个规则有些一刀切,但确实能挡住大多数投递攻击。
5.2 终端层检测怎么补
这里针对“静默上传”这类行为,给几个具体可落地的检测思路。
- Sysmon事件采集:重点开启EventID 1(进程创建)、3(网络连接)、11(文件创建)、12/13(注册表改动)。配合规则,凡是
setup.exe这些安装器进程出现网络连接行为,直接告警。 - 进程注入检测:开启Sysmon EventID 8(CreateRemoteThread),检测跨进程写入行为。很多运行时解密载荷就靠这一步加载,抓到这个信号基本就是抓到了关键动作。
- 大文件传输基线:在EDR或流量设备上建立“进程上行流量基线”,某个进程每小时上传超过50MB就触发告警。这个阈值要根据业务情况调,但思路是:不是只看域名和IP,还要看“传输量异常”。
- 计划任务和服务完整性监控:每天对计划任务列表做快照对比,新增的、变更的都要走确认流程。攻击者喜欢用计划任务做持久化,但改计划任务一定会留下痕迹。
5.3 网络层检测怎么补
网络层面的建设,有时候比终端更高效,因为恶意程序再狡猾也要在网络上暴露通信特征。
- TLS SNI检测:即使流量是加密的,TLS握手阶段的SNI(服务器名称指示)是明文的。把已知恶意域名和“可疑新域名”匹配,就能在不解密的情况下发现异常连接。
- 证书指纹检测:攻击者经常自签证书或使用同一批证书。把这些证书的JA3/JA3S指纹加入检测库,换IP不换证书的情况下依然能识别。
- 上行流量比例监控:大部分业务服务器是“下行多、上行少”,上行流量突然增加的进程值得警惕。建立网络设备的NetFlow采样,按进程维度统计上行流量,这个数据对日常运维和应急响应都有价值。
5.4 加密包这类手法的共性:为什么体积和密码能挡住自动化检测
最后聊聊这类攻击在投递层的通用逻辑。攻击者为什么要用“313MB+加密”这个组合?核心原因是自动化检测工具的两个硬限制:一是文件上传大小限制,很多沙箱只处理50MB或100MB以下的文件,超过就跳过;二是压缩包无法解密的场景下,直接放弃深度扫描。
也就是说,威胁检测系统在面对“超大型加密文件”时,普遍存在能力缺口。这不只是某一个产品的问题,而是整个自动化扫描链路的适配问题。应对思路有两个方向:
- 对自动化链路做“断点续传”和“大文件分片”支持,让超大文件也能被分段扫描,而不是直接跳过。
- 对超大加密文件设置“引流人工分析”的规则,不自动放行,而是进队列由人工抽查。只要人工看一遍,这种藏在资源段里的猫腻基本藏不住。
说到底,没有哪个单点防护是绝对可靠的。这次事件里,加密包绕过了上传检测,安装程序绕过了静态查杀,运行时注入绕过了行为告警——但最后依然输在流量异常上。所以我的一个核心观点是:安全建设不要赌任何单层防线,要赌的是“多层防线之间的盲区是否足够小”。把网络、终端、日志三层的检测能力补起来,慢一点也能拦住大多数攻击。
根据我自己的经验,这种“低慢型”的静默上传,最难防的不是技术,而是耐心。攻击者可以潜伏几个月只做数据收集,但防守侧往往在几天后就放松了警惕,复查频率一降,下一轮攻击就进来了。把检测规则留在系统里常年生效,比任何一次性的应急响应都更有价值。