资讯详情

资讯详情

捕获iMessage附件后门:从零点击攻击链到样本还原的关键技术

1. 附件后门为什么难抓攻击链的三个特征1.1 零点击不代表零痕迹三角测量系列聊到现在很多人最关心的已经不是“这个漏洞链用了什么技术”而是一个更实际的问题那段藏在 iMessage 附件里的恶意样本到底是怎么被安全人员接住的毕竟它号称零点击不需要用户点击任何链接也不需要安装任何描述文件表面上看起来就像一条普通的、带着图片或表情的消息。先说结论零点击不等于零痕迹。攻击者为了让样本在设备上执行必须让它经过系统框架的解析、内存分配、进程间通信、网络回连这几个环节。每一个环节都会留下不同类型的指纹只不过普通用户看不到而安全分析人员会刻意地盯着这些位置。以 iMessage 附件为入口的攻击链一般长这样恶意构造的消息附件到达设备后系统会对附件做一次自动化处理比如解档、生成缩略图、提取元数据。这个过程发生在系统进程内部攻击者利用的是某个反序列化或内存处理漏洞。一旦代码执行成功真正的后门样本才会被加载进内存。也就是说我们想抓的不是那条消息本身而是消息被解析之后落地的二进制。难点就在这里附件自毁逻辑通常写得很干净执行完利用步骤后会把原始文件删掉甚至把文件内容在磁盘上覆盖一遍。如果你盯着“拉到样本”这个目标去抓很容易颗粒无收。1.2 附件本质上是“快递箱”辅助模块才是“内容”我拆过很多类似的样本一个很大的感悟是不要把附件后门和辅助模块混为一谈。附件后门可以做得非常小越小越不容易被网络层发现也越方便塞进一条消息里。它的任务是完成初始代码执行然后把自己“安装”到设备上再通过网络拉取后续模块。辅助模块则是另一回事。它体积往往更大、功能也更明确比如采集设备信息、监控用户行为、维持持久化、定时上传数据。这些模块不会直接出现在 iMessage 附件里而是由主后门在内存中解密后加载。攻击者这么做是为了把恶意行为的痕迹切分成两段即使你抓到附件后门它看起来可能只是一个加载器真正的敏感行为全在辅助模块里。所以在捕获阶段就要有意识地分成两条线一条盯网络流量看设备连了哪些可疑端点另一条盯文件系统看附件缓存目录里有没有出现不该出现的二进制。两条线对上了才算真正捕捉到一次完整的样本投递。2. 捕获环境搭建废旧设备、透明网关、实时取证2.1 用“废旧设备一次性账号”搭隔离捕获台很多朋友问能不能直接在自己主力机上装监控工具然后等一条恶意消息过来。我的答案很明确不要。任何解析都有可能直接触发利用你不是在“观察”样本你是在把自己的真实数据送进攻击者的手里。正确的做法是搭一个隔离的捕获环境。我通常的做法是这样找一台可以刷机的废旧 iOS 设备专门用来收消息不插 SIM 卡不登录真实账号。注册一个一次性账号只在这台设备上使用避免暴露真实身份。系统保持在一个攻击者可能会针对的版本但不能是最老的那种否则有些系统组件无法正常工作。设备接入一个可以镜像流量的网关而不是直接扔进普通家庭 Wi-Fi。这里的逻辑很简单我们要给攻击者一个“看起来正常”的目标同时把目标周围的一切都变成记录仪。设备本身是饵网关是录音机文件系统监控是摄像头。2.2 同时在三个层级开记录只靠单一工具很难抓到完整链路我习惯至少同时开三层记录。第一层是网络层。在透明网关上记录 DNS 查询、TLS 握手信息、连接目标 IP 和端口、流量时间戳。不需要一上来就尝试解密流量先拿到“它连了谁、什么时候连、连了多久”这些元数据。第二层是进程层。用日志工具过滤系统进程重点关注消息解析和附件处理相关的进程名。如果你看到某个消息进程在收到一条带附件消息后调起了一个完全没有 UI 的二进制这本身就是强烈的恶意信号。第三层是文件层。iOS 的消息附件默认存放在程序沙盒目录下文件系统层面可以通过备份文件或取证镜像来做快照对比。如果一份快照里多了一个不在消息列表里的文件或者某个已知文件在几秒内被读取后又被删除基本可以判定有问题。三层数据配合后面还原样本时才有依据。2.3 样本会在几秒内自毁怎么抢这是捕获环节里最头疼的事。很多附件后门执行完会立即删除附件原文件有些还会把数据区覆盖一遍。也就是说你慢一步看到的只是一条“已删除”的占位记录。我的经验是不要追求从原文件直接拿到样本而是从两个侧面下手。一个侧面是内存。利用链执行的那几秒里样本一定存在于内存中。如果设备做过越狱或者开启了开发者模式可以用进程转储工具把目标进程的内存映像拉下来。没有越狱条件时可以靠崩溃报告和系统诊断日志里保存的部分内存片段做还原成功率会低一些但值得尝试。另一个侧面是文件系统快照。现代 iOS 使用快照式文件系统被删除的文件如果还没被垃圾回收覆盖仍然可能从快照里恢复。拿到设备后第一时间做完整取证镜像别在设备上做太多操作操作越多覆盖概率越大。说白了捕获样本就是和时间赛跑所有准备工作要在恶意消息到达之前做好。3. 从捕获到还原主样本和辅助模块怎么区分3.1 先看文件身份再看加载方式等到我们终于拿到一个疑似样本的二进制第一步不是急着跑而是先做静态检查。我一般会看这几个东西文件头类型、架构信息、导出符号、字符串密度、代码签名信息。附件后门和辅助模块在文件特征上有明显差异。附件后门为了能塞进消息里体积通常会压缩得很小代码做了大量混淆甚至会把可执行代码拆成碎片藏在多个消息字段里。导出符号也很少很多只保留一个入口函数。辅助模块不一样它往往是一个完整可识别的动态库文件有清晰的模块入口、配置加载函数、数据处理函数。有些模块甚至会暴露类似于“开始采集”“停止采集”“上传数据”这样能直接看懂的符号。看到这种结构基本可以断定它不是第一阶段的载荷而是第二阶段的功能模块。区分主样本和辅助模块还有一个硬指标加载方式。附件后门是通过漏洞利用代码在目标进程里手动映射进内存的没有正常的加载记录。辅助模块则通常由主后门调用系统动态加载接口从一个临时文件或内存缓冲区中装载。3.2 行为画像对比静态特征看完了还要做动态行为画像。我把两类样本放到隔离的虚拟化 iOS 环境里跑同时监控文件写入、进程创建、网络连接和数据上传行为。下面这个表是我常用的对照维度对比项附件后门辅助模块目标进程消息解析相关进程主后门选择的常驻进程体积很小通常只有几十到几百 KB较大几百 KB 到数 MB来源消息附件直接携带由主后门解密后落地主要行为漏洞利用、权限提升、持久化采集、通信、数据上传、自毁网络行为首次回连拉取模块长期心跳、定时上报生命周期完成使命后自删可长期驻留直到被清除表格只是一个参考。现实中还会出现第四种、第五种模块比如只负责清理日志的模块、只负责给 C2 服务器做保活的模块。所以不要死板地判断“这是后门那是辅助模块”更准确的说法是“这是第一阶段载荷那是第二阶段功能包”。3.3 模块注册表主后门如何管理辅助模块我见过不少样本会在临时目录写一个“模块注册表”本质上是一个属性列表文件里面记录着模块标识、模块路径、配置参数。主后门每隔一段时间扫描这个文件发现新模块就加载发现删除标记就卸载。这个设计和我们平时写插件系统很相似主程序不做具体业务只负责加载和调度每个模块负责一块独立功能。攻击者这样做的原因也很实际——把功能拆开即使某个模块被安全软件识别了其他模块还能继续工作主后门也可以重新拉取一个新的变种来替换被识别的模块。分析时这个注册表文件反而是宝贝。它会告诉我们攻击者一共下了几个模块、每个模块的版本、配置参数长什么样甚至能还原出完整的攻击意图。很多辅助模块被“捕捉到”不是因为在网络上被直接抓到而是因为主后门的注册表里留下了它的名字和路径。4. 三个最容易被忽略的捕获入口4.1 入口一无人访问却持续回连的端点流量侧最容易发现异常的地方不是那些被标记过的恶意域名而是一些看起来非常普通、没有任何页面内容的端点。比如一个只有空响应头的 Web 服务每天固定几个时间点被访问访问来源都是一台 iOS 设备UA 字符串非常规浏览器的 UA。如果这个端点没有被搜索引擎收录、没有任何真实用户访问却在特定时间窗口内收到规律性的心跳请求那它大概率就是 C2 地址。顺着这个端点往前回溯再查设备上哪条消息触发了首次访问就能把恶意附件、回连域名、辅助模块下载路径串成一条完整的证据链。4.2 入口二崩溃日志里多了一条“不该存在的进程”攻击代码不一定永远稳定。利用链里只要一个内存布局判断错误进程就可能崩溃系统会把崩溃线程的调用栈写进日志。很多捕获机会就是这么来的——某个进程莫名其妙地崩溃而且崩溃线程里出现了一个没有符号的模块调用栈顶层还是内存中的动态映射区域。遇到这种情况不要只把它当成普通崩溃处理。去查崩溃时间点前后有没有收到过带附件的消息去查崩溃进程的完整内存布局甚至把同一时间的系统诊断日志拉出来比对。不少辅助模块样本就是在这样的崩溃现场里被发现的。4.3 入口三附件缓存里的“幽灵记录”有时候攻击者删除了附件本体却忽略了数据库里的关联记录。消息数据库里会保留一条附件索引指向一个已经不存在的文件路径。这种“孤儿记录”看起来没什么用但它能告诉我们两个关键信息附件到达的精确时间以及附件原始文件名。拿到时间和文件名之后再去文件系统的空闲区域做数据恢复有时候能找回被删除的样本原始内容。这里有一个很实用的技巧不要只搜索文件的完整内容还要搜索文件头特征和加密魔数。很多样本在落地时做过整体加密文件头不是标准的二进制格式但如果加密算法较弱文件尾部仍可能残留明文特征。5. 常见问题与排查技巧实录5.1 样本抓到了但一运行就退出这是最常遇到的问题。样本之所以秒退通常不是因为分析环境有问题而是样本本身带反调试或者环境校验。攻击者会在样本里检测当前进程是否被调试、是否存在虚拟化特征、是否缺少系统证书。一旦发现异常就直接退出不给分析人员留机会。我的建议是不要硬碰硬去绕反调试先观察它退出的方式和位置。如果退出发生在加载阶段重点检查缺少的依赖库如果退出发生在网络初始化阶段重点检查它连的地址能不能通。很多时候攻击者只是连不上 C2 服务器程序就主动退出了反而更方便我们拿到完整的网络行为清单。5.2 流量抓到了但看不到内容主后门和辅助模块之间的通信几乎都是加密的而且会做额外校验普通的流量镜像只能看到密文。想看到明文需要从输入端入手在样本运行时动态替换它依赖的加密函数或者修改它的配置数据让它把上传内容写入本地文件。这里不建议一上来就尝试动态调试 iOS 系统进程难度很高。先把静态分析做扎实找出样本里负责网络发送的类和方法理解它的数据格式再用条件断点或日志打印的方式把数据传输前后的明文状态记录下来。多试几次总能拼出通信协议的全貌。5.3 丢了几条关键日志导致链路不完整捕获三角测量这类样本完全靠运气一定不行。最稳妥的做法是把监控时间拉长到以“周”为单位而不是以“小时”为单位。有些攻击者会先潜伏观察几天再决定是否下发辅助模块。如果你只在收到消息后的几个小时内盯着设备很可能只看到第一阶段的附件后门完全抓不到后续的辅助模块。5.4 快速自查清单收到可疑消息后是否立刻备份了设备镜像是否记录了消息到达前后 15 分钟内的所有网络连接是否保存了目标进程的完整日志是否把附件数据库里的记录和文件系统里的实际文件做过比对是否在设备上保留了一个“干净基线”用于后续快照对比这五条只要有一条没做后面还原样本时就会缺一块拼图。宁可前期多花几个小时建基线也不要等样本落地后手忙脚乱。6. 这期内容背后的一点实在体会把第 7 篇写到这里我最想强调的其实不是某个具体技术而是一个思路上的转变不要指望直接收到一个“完整的样本包”攻击者设计这套东西的时候已经把样本拆成了很多碎片分散在内存、网络、文件系统、日志和数据库里。我们能做的是把这些碎片按照时间线和调用关系重新拼起来。我个人的习惯是每分析完一个样本就把它的加载链画成一张状态表记录每一步涉及的进程、文件、内存地址和网络行为。下次再遇到新样本先拿这张表做参照很多异常点一眼就能看出来。三角测量这类攻击之所以难抓恰恰是因为它每一步都做得足够干净但只要它在真实设备上运行过一次就一定会在某个角落里留下痕迹。捕获的本质是把这些痕迹放在正确的位置去等待。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →