灰鼠失联不到二十四小时,暗网上就有人把他的坑占了。
不是一个,是一个Id叫“制药师”的卖家。他同时在几个暗网论坛挂了广告帖,标题短得像黑市菜单——“免杀加密器,最新版,过主流杀软百分百。支持定制,三天交付。”
叶诤在暗链观测者上扫了一眼帖子的元数据。发帖Ip套了四层代理,但追到最后一跳,他看到了一个熟悉的参数——样本下载链接绑定的dNS,和灰鼠那三台还没咽气的服务器用的是同一组配置。
灰鼠跑了。他的基础设施被人捡起来接着用,像换个司机开同一辆车。
叶诤用“数据猎手”的身份给制药师发了条私信,语气故意装得毛躁,像个刚摸到门道的脚本小子。
“哥们,加密器怎么卖?我要过360和火绒,最好能顺便过windows defender。上次买那个被秒了,亏得肉疼。”
制药师回得很快。这种人喜欢跟菜鸟做生意——菜鸟不问技术细节,不磨价,付钱也痛快。
“基础版0.08个btc,过三十款主流杀软。高级版0.3,加自解壳和反虚拟机检测。至尊版0.8,带自签名数字证书,微软白名单都不杀你。”
“至尊版。先给个样本我测一下。”
制药师扔过来一个压缩包,密码是“pharma2024”。叶诤在沙箱里解了压,里面躺着一个不到两兆的可执行文件,图标是个pdF缩略图,文件名写着“市一院_体检报告_2024.pdf.exe”。windows默认隐藏扩展名,用户看到的只是一个pdF,后面缀着的.exe根本不会显示。
叶诤在隔离沙箱里双击了它。
沙箱是物理隔离的,不联网,专门用来拆恶意软件的封闭环境。样本启动之后干的第一件事,是在沙箱的模拟文件系统里释放了一份真实的pdF——不是空白页,是一份排版工整的体检报告,姓名、性别、年龄、检查项目、异常指标标记,一应俱全。报告内容是伪造的,但格式跟真的一模一样,连页脚的医院公章都是用矢量图渲染的。受害者打开只会以为自己点开了体检报告,完全不会察觉后台有东西在跑。
第二件事,它检测了运行环境。不到零点三秒,样本扫完了沙箱里的进程列表、内存大小、硬盘序列号,连cpU温度都读了一下。沙箱模拟不出真实的cpU温度——物理芯片通电总会有热量,样本读到的温度是零,它立刻判断出自己在沙箱里。然后它做了一件叶诤没料到的事:不自杀。它装死。假装什么都没发生,继续保持休眠状态,连恶意行为检测器都让它骗过去了。
“会装死。”叶诤自言自语。
第三件事最让他警觉。样本在休眠状态下用一种极隐蔽的方式扫描了沙箱里所有pdF的文件头。它在找东西。叶诤查了匹配规则,发现样本找的不是文件名,是pdF的创建时间戳——精确到秒。它要找某个特定时刻生成的pdF,一个时间指纹。
“不是通用病毒。”叶诤关掉沙箱,转头对周武说,“通用病毒不会在受害者机器上找特定时间戳。这是定向攻击。他们的目标是知道某个文件精确生成时间的人。”
“医院里的人?”
“或者是给医院做数据归档的第三方。这种体检报告的时间精度,只有原始生成机器才留得下来。”
他把样本传给技术小哥做深入分析,同时在AR界面调出系统的恶意代码分析模块。系统对样本做了全量反编译,不到三秒钟就把加密器的壳一层一层全剥开了。
一层?不是。是七层。
俄罗斯套娃。最外层是pdF伪装。第二层反沙箱检测。第三层环境探测。第四层权限提升——用了一个叶诤没见过的漏洞。系统标出了漏洞编号,后面跟着说明:windows字体渲染引擎的0day,影响范围覆盖windows 10和11所有版本,微软还没发补丁。
0day。不是从漏洞市场淘的二手货。是制药师自己挖的,或者他背后的人挖的。
第五层是下载器,体积极小,只干一件事:从指定URL拉取加密载荷。第六层解密器。第七层才是核心——不到六十Kb的勒索模块。代码风格和叶诤之前在灰鼠服务器上发现的输液泵勒索病毒几乎同源,但更精致,更成熟。
灰鼠那个版本有缺陷,设备会在加密过程中直接死机。制药师的版本把缺陷修了,加密逻辑改成渐进式——先把设备部分功能降到“安全模式”,病人暂时不会有生命危险,同时弹出勒索提示,给医院留出七十二小时的反应窗口。这个设计极其阴险:医院不会被逼到立刻应急的墙角,但七十二小时的倒计时制造了一种缓慢收紧的心理窒息感——你还有时间,但不多,你必须在病人出事之前做决定。
“灰鼠那个是原型机。”叶诤说,“制药师这个是量产版。同一个病毒,不同迭代。”
“有产品经理的那种迭代?”周武问。
“不止。有qA测试的那种。”
系统从第七层核心模块里提取出了控制服务器地址。不是Ip,是域名。叶诤点开一看——解析目标让他愣了一拍。
一个墨西哥玉米卷的在线订购网站。界面做得有模有样,菜单、购物车、信用卡支付接口一应俱全,首页滚动着每日特价,玉米卷配鳄梨酱套餐,打折到四块九毛九。
但网站后台藏着一个管理面板,登录进去是一个功能完整的病毒控制台。感染者列表、加密状态、赎金支付记录、自动催缴脚本——全嵌在一个外卖系统里,像寄居蟹钻进了一只空螺壳。
“拿玉米卷网站当c2。”叶诤摇了摇头,“域名注册商在巴拿马,服务器在墨西哥城一家共享主机商,主机商大概率到现在还以为上面跑的是个外卖站。”
他顺着控制台日志往下翻,翻到一条奇怪的记录。制药师在控制台设了一个定时任务,每周自动向一个外部地址发送加密备份。不是备份病毒数据,是备份解密密钥。收件地址是个Gmail邮箱,用户名一串无意义的字母。
叶诤让系统对这个邮箱做了关联分析。邮箱的注册恢复手机号绑的是一张菲律宾预付费SIm卡,激活地点在菲律宾某城市的便利店,时间是一年前。这条线索本身没什么——地下黑产用预付费卡太正常了。
但系统顺藤摸瓜翻出了更深的东西。那张SIm卡激活之后,第一个连上的wiFi热点,不是便利店的热点,是一街之隔的一座天主教堂。教堂的wiFi没设密码,访客网络完全开放。制药师——或者他团队里的某个人——在激活SIm卡之后,用教堂的公共wiFi登录了Gmail,做了一次密钥验证。
解密密钥藏在菲律宾某教堂的wiFi路由器日志里。不是硬盘,不是云盘,不是加密U盘。是路由器日志——那种每三十天自动滚动覆盖的临时文件。制药师把密钥塞进了一个随时会被系统自动清理的角落,像个把保险柜钥匙寄存到公共储物柜里的人,每天都要回去确认钥匙还在不在。
周武听完沉默了好一会儿。
“所以他的密钥,理论上只要有人走进教堂连上那个wiFi,就能从路由器日志里翻出来。”
“对。但不会有人去翻教堂的wiFi日志。”叶诤说,“这就是他选这个地方的原因。越离谱的地方越安全。”
他让系统远程登了那个教堂路由器的管理后台——密码是默认的admin/admin,没人改过。日志文件里躺着加密密钥,夹在一堆普通的网络连接记录中间,看起来就像一条普通的http请求。
拿到密钥,叶诤回到制药师的控制台,用管理权限把感染者列表调了出来。一共一百三十多个被加密的设备,分散在十七个国家、四十多家医疗机构。最早感染时间是一周前。大部分受害者已经付了赎金——控制台的支付记录显示,制药师过去七天收了折合人民币四百多万的比特币。
但有一个细节让叶诤悬在键盘上的手指僵住了。
感染者列表里有一台设备的状态,不是“已支付”,也不是“待支付”。是“已解锁”。解锁时间在四天前,解锁方式——控制台日志显示,有人用管理员账号手动输入了解密命令。
不是受害者付了钱。是制药师自己,主动解开了加密。
叶诤追查了那条手动解锁记录对应的设备。设备类型:心脏起搏器程控仪。所在机构:海市第一人民医院心内科。
他脑子里闪过观测者之前提到的四封威胁邮件——收件人全是他,从二〇一九年到上个月,每隔一两年一封,内容一模一样:“我们会找到你的。不是现在,但在某个时候。”
海市第一人民医院。他小时候在那家社区医院做的体检,而社区医院的数据系统后来并入了市一院的医疗信息平台。制药师的病毒打进了市一院的设备,不是巧合。是有人选了这个目标。
叶诤把这个发现告诉周武。周武听完问了一句:“制药师的代码里还有没有别的痕迹?”
叶诤重新打开了那七层套娃的源代码。一层一层往下翻,翻到第五层下载器的时候,注意到一段被注释掉的代码。代码本身没有功能,但注释文字不是技术说明,而是一句奇怪的台词。
是日文。
叶诤不认识日文,系统自动翻译了。翻译结果跳出来之后,他整个人静了大约五秒。
“你觉得人什么时候会死?心脏被子弹打穿的时候?不对。是被世人遗忘的时候。”
周武看他神色不对,走过来了眼屏幕。“这话怎么听着这么耳熟?”
“《海贼王》里的。希鲁鲁克医生的台词。”叶诤把那行注释单独复制出来存了档,“灰鼠的输液泵病毒、制药师的心脏起搏器病毒、目标锁定海市第一人民医院——这些病毒从一开头就不是图钱。图的是医疗设备。是心脏。”
他停了一拍。
“有人在用医疗勒索病毒测试什么。心脏起搏器被手动解锁,说明测试做完了。做成了。那台设备的加密和解锁,从头到尾是一场实验。”
AR界面上,暗链观测者的图谱里亮起一个新节点。物理位置在墨西哥城,制药师的玉米卷c2服务器。但叶诤注意到,这个节点拖着一条隐隐约约的暗线,连向更远的地方——极地站那台还在运转的服务器。
同一种加密。同一个源头。
制药师病毒代码里,那句日文台词的下方,还有一行被删除的注释。系统把它恢复了。只有四个字。
“实验体07。”
叶诤关掉沙箱,把密钥和所有证据打包加密。站起来的时候,手碰倒了键盘旁边那杯早已凉透的咖啡。杯子晃了一下,没翻。
“制药师要抓。”他说,“但不是现在。先把控制台里所有被加密的医疗设备解锁。”
他打开控制台管理界面,把解密密钥输入批量解锁命令。感染者列表上,一百三十多台设备一个接一个跳成绿色。
但解锁到最后一台的时候,控制台弹出一条自动消息。不是发给受害者的,是发给制药师的。叶诤在管理后台看到了全文。
“07号实验体数据已回收。第二阶段准备启动。”
叶诤盯着这行字,手指悬在回车键上方,很久没落下。