这篇文章整理自一场网络安全会议的演讲,主要内容是关于如何发现并利用macOS设备管理平台Jamf Pro的安全弱点。两位研究员分享了他们作为“红队”在渗透测试中,如何通过泄露的凭证操控Jamf,从而提升权限、执行代码,甚至横向移动控制大量苹果设备。他们同时发布了两款开源工具,帮助企业和安全人员发现自身风险,并给出了实用的防御建议。
从一次真实的入侵开始
大概在去年九月或十月,一次安全评估中,我们发现了一个被入侵的macOS用户账号。查看他的命令行历史记录时,我们注意到他开始用curl命令和Jamf的API交互。很好,历史记录里发现了凭证。

我们当时就想,用这些凭证能搞出什么名堂?答案是有很多。就凭最初的访问权限和这些凭证,我们就能横向移动,渗透他们所有的苹果设备,还能绕过那些主流的企业安全软件(EDR)。那次评估有六七周,我们一直这么干,没被发现。
后来,我们又把这个方法用在了其他客户身上。我们开始在各种地方找Jamf的凭证,比如Git的提交记录、云存储(像S3桶),凡是开发者可能不小心留下痕迹的地方都找。这招一直好使。我们曾经在客户跑着知名EDR的苹果设备环境里,潜伏了好几个月。
Jamf Pro:苹果设备的大管家
当我们聊Jamf的时候,通常指的是Jamf Pro,这是企业里管理苹果电脑和手机最主要的东西。它负责新设备注册、权限设置、分组管理等等所有杂事。

理解Jamf Pro的权限模型很关键。简单说,就是你能对JSS对象(比如设备、用户、配置策略)做什么。最基本的权限是CRUD:创建、读取、更新、删除。另外还有些功能性的权限,比如能不能清空日志,或者重置本地用户密码。这些权限通过标准的HTTPS API(GET、POST、PUT这些方法)来操作,数据通常是JSON或XML格式。
我们的流程通常是:先拿到凭证(从各种渠道),然后用这些凭证和Jamf的API交互,看看能干什么。接着就是提升权限,侦察环境,找那些有价值的目标设备,最后实现横向移动和代码执行。

攻击路径:如何从一点渗透到一片
管理员眼里看到的网络结构可能很简单,就像一张干净的图。但我们通常发现实际情况要乱得多,可能增加了新的组、测试用的API客户端,引入了新的规则和关联——图就变得复杂了。

我们特别喜欢的一条攻击路径是:一旦我们控制了某个组或者一个API客户端,我们就能去枚举,看看还有哪些有特权的人登录了哪些苹果电脑。如果我们匹配上了邮箱,可能就顺藤摸瓜找到了一个全局管理员。这样,任何能在那些设备上执行代码的人,都可能拿到Jamf的管理权限。

利用Jamf,好处坏处都有什么?
从攻击者角度看,用Jamf来搞事情有几个明显的“好处”。
能混在正常管理流量里。Jamf本身就要经常运行脚本、拉策略,这些行为在EDR看来很“吵”。我们模仿这些操作,正好隐藏自己。 有些公司用Jamf部署自家软件,会配置自签名。如果我们控制了权限,就能让我们的恶意软件也获得同样的代码签名,看起来就像合法软件。 最关键的一点,很多公司根本不监控他们的Jamf租户。没人盯着看谁改了啥、加了啥新策略。就像我们同事说 的,“任何事在被发现之前都是隐形的”。
那“坏处”呢?就是一旦防御方意识到问题并开始调查,他们就能利用日志和痕迹,一步步回溯,画出攻击路径,找到我们是怎么开始的。

介绍两个刚刚发布的工具
所以,我们这次演讲也发布了两款工具,都是开源的。
第一个叫EVE,是个Python工具。它能让你用泄露的凭证、令牌去连接一个被攻破的Jamf服务器(不管在本地还是云端),然后发起我们今天讨论的各种攻击。
第二个叫Jamf Hound,更偏向审计。它能帮你收集Jamf租户里的数据,生成JSON文件,然后可以导入BloodHound这类工具。这样你就能清晰地看到,如果某个账户被黑,攻击者在你企业内部能拿到哪些权限,攻击路径是啥样的。

权限提升:从普通用户变管理员
我们很少一开始就在理想的环境里。所以总得想办法在Jamf租户里弄到更多权限。通常有两种主要方法。
方法一:折腾用户账户
如果你有权限去“创建账户”或者“更新账户”,那就好办了。“创建账户”顾名思义,可以造出新的本地Jamf账户,还能给它分配权限。“更新账户”这个权限,可以用来重置其他本地Jamf账户的密码,然后你就能用那个账户了。或者,如果你已经入侵了一个账户,可以直接更新这个账户的权限,给自己加料。
这些权限通常是全局的,不用担心被限定在某个站点。

我们经常看到,有些第三方应用集成就用了具备这些权限的Jamf账户。在Jamf界面里,“创建账户”和“更新账户”这两项基本上是绑定的,开了就都有。



方法二:折腾API客户端和角色
如果动不了用户账户,可以看看API集成。这稍微复杂点,需要“创建/更新API客户端”和“创建/更新API角色”的权限。角色就是一堆权限的集合,你可以给这个角色对象分配任意权限,然后创建一个API客户端来认领这个角色。


我们再用EVE演示一下。假设我们有一个账户有创建API集成和创建API角色的权限,我们先创建一个只赋予“创建/更新/读取账户”权限的新账户角色。然后再创建一个新的API客户端,让它关联上这个角色。接着,用它去Jamf租户登录取回客户端凭据,放进EVE里,就能拿到一个新的Bearer令牌,用这个客户端身份做事了,而且有我们设定的那些账户权限。这样一来,我们又能搞权限提升了。
侦查与代码执行:拿到权限后干啥
现在我们是Jamf管理员了,能干吗?在我们红队任务里,总想横向移动到特定目标主机。

Jamf对侦查也很有用。每个被管理的设备在Jamf里都有个“计算机对象”,里面存了好多有用信息:终端用户的真实姓名、电话、职位、装了啥软件、有啥安全软件……这些都能帮你了解目标,知道该怎么下手,也明白对方装了啥防御软件。

要执行这些侦查,你需要有读取这些计算机对象的权限。

在设备上运行代码的几种套路
现在讲怎么执行代码。Jamf有好几种方法能让代码在远程设备上跑起来。
套路一:脚本+策略
这是最常见的,也是真实Jamf管理员常推荐的。流程分两步:先在Jamf数据库里创建一个脚本对象,然后再创建一个策略去执行这个脚本。
脚本就是个解释型脚本,比如shell脚本。默认会以root权限运行,但Jamf很聪明地把登录用户名作为参数传进去,方便你模拟特定用户执行命令。
策略里需要设置触发时机(我们一般设为“下次检查策略时”,大概是15-20分钟后),填上脚本的ID,最后限定这个策略在哪些计算机上生效。


需要的权限是:创建或更新脚本,以及创建或更新策略。注意“更新”权限——很多时候,环境里已经有现成的脚本和策略了,你直接在已有的脚本后面加一段恶意代码就行,保留原有功能,偷偷干自己的事。

这是EVE工具的界面演示。登录后,可以浏览Jamf数据库、查看现有脚本、创建策略。我们可以用搜索栏按用户名定位目标设备,按脚本名选择脚本,然后创建策略。等设备拉取策略后,代码就执行了。






套路二:直接在策略里运行命令
这个和上面很像,但不用创建单独的脚本对象。策略里直接有个“运行命令”的标签,你把单行命令放进去就行。这样你就不需要脚本权限,只需要策略权限。

演示和前面类似,只是用了一个内置的“执行命令”模板,直接把单行命令放进去。EVE也能当数据库查看器,你可以看到任何对象的XML源码,甚至编辑它。






套路三:计算机扩展属性
这个功能比较隐蔽,知道的人不多。它是为了让管理员能收集Jamf默认不收集的信息。做法是创建一个扩展属性,里面包含一个脚本。当设备执行“Jamf Recon”命令(默认大约24小时一次)时,这个脚本就会在所有指定的设备上运行。
用这个的好处是,一旦创建,代码会在整个企业范围内运行。缺点是你没法在策略层面筛选目标,筛选逻辑得写在自己的脚本里。注意脚本里的XML字符需要转义。
需要的权限是:创建或更新扩展属性。


在EVE里,进入扩展属性页面,选用我们准备好的模板,改个名字,把脚本逻辑放进去,就能创建一个新的扩展属性。创建完后,等设备执行recon命令(或者你手动触发),脚本就会跑起来。




演讲里开玩笑说,如果你放个挖矿脚本,就能快速增加你的门罗币余额了。

防御建议:别让攻击者这么容易得手
最后讲点防御的东西。建议会有点不同,取决于你用Jamf Cloud(云端版)还是本地部署。
- 审计访问:
看看JSS访问日志和Tomcat访问日志,谁在调API一清二楚。 - 追踪变更:
关注“变更管理”日志。缺点是这些日志是文本,不好处理,而且只记录了对象的状态,没记录具体改了啥,得做对比才知道。 - 预防措施:
对于有特权的API凭证,设个短的有效期。在我们所有的红队测试里,发现这些凭证总出现在不该出现的地方,比如shell历史或云存储。如果凭证有时效性,等我们拿到可能就过期没用了。 - 网络隔离:
把关键API端点用防火墙隔离起来,只允许从特定的堡垒主机去访问。 - 使用云版本:
如果你用Jamf Cloud,自己碰不到底层服务器。但如果你觉得出问题了,可以联系Jamf支持,他们有内部的事件响应团队,能帮你查日志。他们还有付费的日志转发服务。你也可以让他们为API端点设置允许列表。
说实话,这些防御建议能出来,是因为Jamf团队在我们准备这次演讲时主动联系了我们。他们花时间跟我们聊,讨论能推荐些什么办法来防止这类事情发生。这点挺酷的,得谢谢他们。

致谢与结尾
Jamf Hound最初的验证是由我们同事完成的,后来这个想法也被采纳,整合进了新版BloodHound的Open Graph扩展里,可以给任何数据建模了。
也要感谢所有让我们在其真实环境里测试的客户们。
演讲最后是提问环节。有人问我们有没有测试过内核扩展之类的,我们说目前工具还不支持,但未来会探索更多集成方法。
这两个工具,EVE和Jamf Hound,都已经开源发布了。
夜雨聆风