
Part1 前言
大家好,我是ABC_123。这两天ABC_123满怀着对美国NSA发起的苹果手机"三角测量"行动的极大兴趣、对该后门极其复杂的攻击链、以及超过认知的苹果设备底层漏洞分析的探索,而连续更新了多篇技术文章。今天ABC_123着重给大家讲解一下,国外安全公司是如何捕捉到所有阶段的"三角测量"后门样本的。让人惊叹的是,历经很多波折,耗时长达数月!最终获得了4个0day漏洞、2个验证器后门、1个TriangleDB植入后门及其后门的多个辅助模块(文末有技术交流群的加群方式)。
《第135篇:美国APT的苹果手机"三角测量"行动是如何被溯源发现的》
《第136篇:美国NSA的苹果手机"三角测量"后门的窃密模块分析 | 机器学习引擎识别照片信息》
《第137篇:揭秘美国NSA的苹果手机"三角测量"后门的隐匿手段》
《第138篇:俄罗斯卡巴斯基是如何发现美国iPhone手机"三角测量"攻击的 | "三角测量"系列第4篇》

Part2 溯源分析过程
在上一篇中,ABC_123给大家分享了iPhone手机通信及存储方面存在的异常行为,接下来要想办法抓到三角测量行动使用的后门及0day漏洞样本。但这极其困难,因为所有的通信都是通过 HTTPS 加密的,甚至嵌套多层加密,因此我们无法从流量中抓到任何明文的攻击流量。

接下来决定使用 iTunes 备份来替代完整的设备镜像。这个过程必须做好保密工作,以被攻击者发现导致不再发起攻击。由于我们不了解攻击者使用后门对iPhone手机做了什么操作,可能监听iPhone的麦克风、可能是读取电子邮件内容、可能是分析即时通讯对话。因此,卡巴斯基工作人员安排了面对面会议,并将iPhone手机设置为飞行模式,有时还放入法拉第屏蔽袋中。

后续使用了libimobiledevice来获取iPhone手机的备份,并通过构建事件时间线,利用 MVT工具包对其进行分析检查。

尝试用 Frida 截获 iMessage失败
实施三角测量的攻击者非常谨慎,会从受害者iPhone手机中移除恶意的iMessage附件,我们决定尝试在 iMessage 传递过程中捕获传入的消息内容。在寻找拦截 iMessage 的方法时,发现了这段由 Google Project Zero 团队编写的 Frida 脚本 。该脚本设计用于 Mac 上运行,因此我们拿出一台备用的 Mac mini 并安装了 Frida。

随后,让被攻击iPhone的同事们使用他们的 Apple ID 登录这台 Mac mini,接下来就是等待攻击者再次感染我们某位同事的设备。与此同时,我们积极监控 SIEM 日志,寻找可疑活动的痕迹。不久,我们检测到了熟悉的网络连接,表明一部手机成功被攻破,并且使用了“克隆”的 iMessage 账户。然而,当我们检查 Mac mini 上的 iMessage 拦截日志时,发现感染时并无消息痕迹。因此,我们的系统未能捕获可能包含漏洞利用的消息(我们仍然不知道为何未能成功),于是开始寻找捕获恶意软件的其他方法。
mitmproxy中间人抓包捕捉样本
在通过 Mac 设备拦截 iMessage 的计划失败后,接下来尝试解密之前通过流量分析识别出的与 C2 服务器的 HTTPS 通信数据包。具体操作步骤如下:
1. 搭建了一台 Linux 服务器并安装了 mitmproxy,这是一款老牌的 HTTPS 拦截工具;

2. 在几台已知被三角测量后门感染的 iOS 设备上安装了一个根 SSL 证书,该证书是 mitmproxy 生成的;
3. 在这些苹果设备上安装了 Wireguard VPN 客户端,并我们搭建的mitmproxy 实例写入配置。
4. 为了能够第一时间发现被感染的痕迹,开发了一个 Telegram 机器人,只要被监控的iPhone、iPad设备被感染,就会收到消息:

但是结果是失败的,这种方法无法拦截苹果服务(包括 iMessage)的 HTTPS 流量,因为 iOS 有SSL Pinning证书绑定。因此,我们无法解密传输过程的 iMessage 流量。
捕获并利用 JavaScript 验证器后门
虽然没有iMessage的流量,mitmproxy 日志中仍然有抓到一部分有价值的通信;当三角测量攻击再次开始的时候,它成功解密了 C2 服务器的一部分通信流量。如下图所示,非常遗憾,这些流量中并没有针对 iOS 的漏洞利用代码。然而经过分析发现,它是 JavaScript 验证器后门 ,它的作用是收集受害者iPhone浏览器的信息并发送到 C2 服务器。第1条GET请求的url,推测就是加载JavaScript验证器后门代码,POST请求就是将收集到的受害者的信息发送给服务器。

继续分析解密出来的部分通信流量发现,受感染iPhone设备在向 C2 服务器发送验证信息后,接收到了一个样本文件。然而,尽管我们能够拦截 HTTPS 流量,但无法解密它。这是因为 JavaScript 验证器后门为 C2 通信实现了自己的加密层,使用了 NaCl 库 ,所使用的加密算法基于公钥密码学。
具体流程如下,JavaScript验证器后门首先生成一对随机密钥(包括私钥和公钥);从生成的私钥和 C2 服务器的公钥中派生共享密钥;使用此共享密钥加密发送到 C2 服务器的消息,并解密从其接收的消息。在这一刻,数学的美妙产生了,大致意思是这个情况,(客户端私钥 × 服务端公钥) = (服务端私钥 × 客户端公钥)。
var o = function (t) { function u(t) { this.D = nacl.box.keyPair(); this.L = nacl.box.before(t, this.D.secretKey); } u.prototype.encrypt = function (t, nonce) { return nacl.box.after(t, nonce, this.L); }; u.prototype.decrypt = function (ciphertext, nonce) { return nacl.box.open.after(ciphertext, nonce, this.L); }; u.prototype.N = function () { return nacl.randomBytes(nacl.box.nonceLength); }; u.prototype.k = function () { return this.D.publicKey; }; return new u(t);}(h.values.R)
为了破解 C2 服务器的通信,需要知道由 JavaScript验证器后门随机生成的私钥。然而,这个密钥保存在内存中,并未发送到 C2 服务器。接下来分析一下代码,JavaScript验证器后门通过调用 nacl.box.keyPair() 方法生成一对随机密钥。为了破解加密流量,要想办法攻破生成该密钥对的过程。
接下来编写一个mitmproxy 插件,用于监控 nacl.box.keyPair() 方法的调用,同时,将其替换为另一个方法 nacl.box.keyPair.fromSecretKey(),该方法通过提供的我们定义好的私钥去初始化密钥对。如下图所示,将一个私钥硬编码到了该方法的参数中。这样一旦带有后门的验证器在被感染的设备上执行,就可以解密 JS 验证器的所有通信

捕捉到两个0day漏洞及二进制验证器后门
接下来三角测量攻击又重新感染了其中一个iPhone手机,由于先前的工作,我们成功捕获到JavaScript验证器后门执行的一个Payload。它包含两个漏洞利用代码组成:一个针对 WebKit,另一个针对 iOS 内核,这两个漏洞组合利用的目标是在iPhone设备上启动二进制验证器后门。
在之前的文章中,我们讲过,二进制验证器后门包含一个清除恶意 iMessage 痕迹的功能,发现该功能对 SMS.db 数据库发出了以下 SQL 请求:
SELECT guid FROM attachment WHERE uti == "com.apple.watchface" AND LENGTH(transfer_name) > 32 AND INSTR(transfer_name, CHAR(0x2013)) == 9;
条件 uti =="com.apple.watchface" 给了我们另一个线索,恶意附件是一个 .watchface 文件。
未完待续,下一篇讲解iMessage插件及后门的模块是如何被捕获到并解密的。
Part3 总结
1. 在研究"三角测量"攻击链过程中遇到的主要难题是如何处理每个阶段都使用的公私钥加密。为了绕过加密,我们不得不开发一个又一个 mitmproxy 插件,能够动态修补恶意阶段并破解原始算法。最初,插件的代码有 30 行,当完成后门的模块提取时,代码已经增长到大约 400 行!
2. 为了便于技术交流,现已建立微信群"希水涵-信安技术交流群",欢迎您的加入。


公众号专注于网络安全技术分享,包括APT事件分析、红队攻防、蓝队分析、渗透测试、代码审计等,每周一篇,99%原创,敬请关注。
Contact me: 0day123abc#gmail.com
OR 2332887682#qq.com
(replace # with @)
1万+

被折叠的 条评论
为什么被折叠?



