
作者:任子行攻防实验室
预估稿费:300
投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿
0x01 漏洞概述
开发者 Lemi Orhan Ergin 发现 MacOS High Sierra系统重大安全漏洞。
攻击者可以在普通用户权限下获得管理员权限。
objective-see 网站上
Why <blank> Gets You Root 文章从代码层面对漏洞细节做了详细刨析。该漏洞出现在PlistFile 二进制文件的
od_verify_crypt_password 函数中,因为该函数使用攻击者指定的密码更新原账户的密码,并没有检查账户是否启用,导致凭据校验失败。在补丁中Apple 增加了对strcmp函数校验密码的安全性,并且对
od_verify_crypt_password函数的参数做了进一步校验,后文会详细介绍漏洞原理。
0x02 漏洞细节
CVE
|
CVE-2017-13872
|
漏洞描述
|
MacOS High Sierra 系统无密码登录管理员账户
|
影响范围
|
macOS High Sierra 10.13、 10.13.1、10.13.2 beta
|
危害
|
本地提权,获取root权限
|
补丁
|
https://support.apple.com/en-us/HT208315
|
模块
|
opendirectoryd加载的PlistFile 二进制文件
|
类型
|
登陆凭据验证逻辑漏洞
|
0x03 漏洞验证
第一种利用:
- 打开系统偏好设置
- 进入用户&群组
- 在用户名中输入 root
- 点击密码输入框,并不需要输入任何内容
- 点击解锁,这样就可以获得添加新管理员账户的权限了。

第二种利用:
- 在登录界面选择 其他用户
- 在用户名处输入’root’
- 密码留空,直接登录
此方法登录会给root用户创建一个图形化账户。

0x04 漏洞修复
如果您需要使用root账户,您需要修改root用户密码,修改root用户密码可以阻止攻击者利用此漏洞。
- 通过命令: sudo passwd root
- 通过 目录实用工具 app ->编辑->更改root 密码,也可以重新设置root密码

更多信息参考Apple:
https://support.apple.com/zh-cn/HT204012。
值得注意的是即使停用root用户该漏洞还是可以被利用。
Apple 对该漏洞的公告:
0x05%20漏洞原理分析
关于该漏洞的新闻已经在网络上炸开了锅,但是还一直没看到比较好的中文版的基于代码的分析报告,这里会介绍
%20Why<blank>Gets%20You%20Root%20这篇文章中关于漏洞代码的分析,再加上自己的理解。
从上层来分析攻击的过程。当一个用户(或是攻击者)试图登录进一个未启用的账户时,系统会创建该账户使用用户输入的任意密码,哪怕是空密码也行。这就是我们在UI界面上可以攻击成功的原因,你必须要点击2次%20unlock。
当一个用户(或者攻击者)尝试认证一个帐号时,opendirectory%20守护进程(opendirectoryd)会进行处理。跳过分析过程,直接查看调用栈:
![]()
opendirectoryd 进程收到一个XPC 消息,就会调用
odm_RecordVerifyPassword函数,该函数再调用
od_verify_crypt_password函数。这两个函数都在PlistFile 二进制文件中,该文件通过
/System/Library/OpenDirectory/Modules/PlistFile.bundle 包加载到opendirectoryd进程中。
开始分析
odm_RecordVerifyPassword函数,该函数内部会调用sub_4f73函数,sub_4f73负责读取准备登录的用户的 shadowhash 数据,如果目标用户启用了,那么sub_4f73函数可以读取成功。
shadowhash 数据可以通过
dscl . -read /Users/<user> 命令读取,也可以直接从
/private/var/db/dslocal/nodes/Default/users/<user>文件读取。

如果目标账户没有启用,比如root账户作为目标, shadowhash 信息不存在, 读取会失败 (没有AuthenticationAuthority 字段)。

当shadow hash 信息没有找到,会调用
od_verify_crypt_password函数。
od_verify_crypt_password 函数会验证用户(攻击者)输入的密码,第三个参数传入用户输入(假设是“hunter2”)的密码, 第二个参数是root 账户(未启用)的密码”*” 。
od_verify_crypt_password 最后返回0x1。 这就有趣了,因为返回非0值,继续执行调用_os_log_impl 函数打印日志,从日志可以看出user-record 加密密钥会被更新为shadowhash 或者 securetoken。
“found crypt password in user-record – upgrading to shadowhash or securetoken”
然而,我们跟踪更新操作的输入发现正是使用我们提供的hunter2来更新加密密钥。

![]()
这个新密码(实际是
shadow/securetoken)被保存到账户(root账户)中,因此,用户(攻击者)可以登录成功。
总结:
- 目标账户是 未启用状态,MacOS 系统回尝试做一次更新密钥
- 更新过程中od_verify_crypt_password 返回非0值,并且错误代码没有被检查
- 攻击者指定的密码会用来更新原账户的密码
Apple 已经修复了漏洞,该漏洞类型是
登录凭据验证存在逻辑错误。
patch 代码升级了凭据验证流程,
od_verify_crypt_password 函数内使用strcmp 检查密码, 如果一样会将第四个参数 (var_54)设置为0,在
od_verify_crypt_password 上层不仅会检查返回值,而且增加了对参数var_54 的检查。

更多相关咨询:
https://objective-see.com/blog/blog_0x24.html
0x06 远程利用此漏洞
如果有漏洞的MacOS High Sierra系统开启了“屏幕共享”功能,那么攻击者就可以通过屏幕共享功能利用此漏洞达到远程代码执行的能力。
攻击环境:
- 一台Mac电脑
- 在VMWare 虚拟机中安装MacOS High Sierra 10.13 以上版本系统
- MacOS High Sierra 10.13 系统开启屏幕共享功能

借助漏洞使用root 用户免密码登录, 输入root用户名,直接点击连接即可成功登录。

![]()
登录成功以后,可以看到2种登录模式:
- 请求权限模式,会提醒受害者有人远程连接
- 以本人身份模式,不会提醒受害者

使用第一种模式:请求权限模式登录,会给用户弹窗提示“共享屏幕请求”。

使用第二种模式:本人身份模式登录,攻击者远程监控受害者屏幕。

![]()
以上攻击过程可以稳定利用,并且攻击成本非常低,但是再精心设计的攻击过程也会露出马脚,下面介绍利用 屏幕共享攻击的缺点。
屏幕共享软件是Mac 系统预装的应用,并且和Mac系统使用同一套账户系统,所以上述远程攻击中使用的root用户在屏幕共享软件中也存在。当远程用户(攻击者)通过了验证以后,在受害者系统的菜单栏会多出一个提示图标,当受害人发现菜单栏 右上角桌面共享提示,可以主动断开远程连接阻断攻击者的连接。

攻击者一侧会自动断开屏幕共享。
![]()
![]()
以上我们介绍了攻击者该如何利用此漏洞远程攻击Mac电脑,并且介绍了 受害人该如何发现自己是否被攻击的方法。以上都是演示环境可能并不能满足攻击者的欲望,假想经验丰富的攻击者可能会用更高级的手法达到长期监控的目的,比如:先通过屏幕共享以“本人身份root”登录,进入目标系统以后快速修改root密码,然后可以植入后门程序或者开启ssh 服务达到长期隐秘监控的目的。我们再次建议受影响的用户赶快在App Store中升级最新的系统安全更新。
参考:
https://objective-see.com/blog/blog_0x24.html
https://support.apple.com/en-us/HT208315
评论