【压力测试】支持TCP,UDP,SYN,ACK,ICMP流量!QQ:158800906【压力测试】支持TCP,UDP,SYN,ACK,ICMP流量!QQ:158800906 【网站解密】最专业的网站解密,渗透,透视牌,逆向技术,实力效果有保障QQ:158800906【网站解密】最专业的网站解密,渗透,透视牌,逆向技术,实力效果有保障QQ:158800906 【数据解密】网站解密,数据库解密,MD5值解密,大数据分析,实力做事,无聊人士勿扰!业务QQ:158800906【数据解密】网站解密,数据库解密,MD5值解密,大数据分析,实力做事,无聊人士勿扰!业务QQ:158800906 【软件免杀】软件封装,防误杀处理,定制专业版软件,请联系QQ:158800906【软件免杀】软件封装,防误杀处理,定制专业版软件,请联系QQ:158800906 【游戏辅助】,手游破解,外挂,补丁,透视,游戏辅助,实力保证!QQ:158800906【游戏辅助】,手游破解,外挂,补丁,透视,游戏辅助,实力保证!QQ:158800906
【服务器入侵】 爆破服务器 破解后台 逆向拿游戏版本 源码 程序 支持担保交易 QQ:158800906【服务器入侵】 爆破服务器 破解后台 逆向拿游戏版本 源码 程序 支持担保交易 QQ:158800906 【MD5破解】手机业务,软件定制,解密,查询记录,密码业务等请联系QQ:158800906【MD5破解】手机业务,软件定制,解密,查询记录,密码业务等请联系QQ:158800906 【收徒教学】黑客技术,终身制,包教会,解密,渗透,找人,攻防技术,QQ技术,数据分析及解密等QQ:158800906【收徒教学】黑客技术,终身制,包教会,解密,渗透,找人,攻防技术,QQ技术,数据分析及解密等QQ:158800906 【网站渗透】成绩分数|学籍档案修改,密码破解,软件制作,实力保证!QQ:158800906【网站渗透】成绩分数|学籍档案修改,密码破解,软件制作,实力保证!QQ:158800906 【密码专家】找回QQ密码,微信密码,邮箱密码,博客密码,恢复聊天记录,联系QQ:158800906【密码专家】找回QQ密码,微信密码,邮箱密码,博客密码,恢复聊天记录,联系QQ:158800906
【手机软件】短信,通话,记录,找人,录音,拍照,图片上传等QQ:158800906【手机软件】短信,通话,记录,找人,录音,拍照,图片上传等QQ:158800906 【网络公关】负面信息清除,敏感信息删除,快照删除,在线处理贴吧,博客,论坛!QQ:158800906【网络公关】负面信息清除,敏感信息删除,快照删除,在线处理贴吧,博客,论坛!QQ:158800906 【源码出售】时时彩源码|娱乐城|棋牌|私服搭建一条龙服务联系QQ:158800906【源码出售】时时彩源码|娱乐城|棋牌|私服搭建一条龙服务联系QQ:158800906 【网站排名】快照劫持跳转,泛目录,轮链,长尾关键字排名,多类灰色产业网站快排实力保证!QQ:158800906【网站排名】快照劫持跳转,泛目录,轮链,长尾关键字排名,多类灰色产业网站快排实力保证!QQ:158800906 【四大件出售】四大件,银行卡,身份证,手机卡,U盾全套联系QQ:158800906【四大件出售】四大件,银行卡,身份证,手机卡,U盾全套联系QQ:158800906
查看: 986|回复: 0

macOS内核提权:利用CVE-2016-1758获取kernel slide(Part1)

[复制链接]

超级版主

Rank: 8Rank: 8

UID
1703
威望
0
贡献
0
在线时间
2 小时
注册时间
2019-1-9
发表于 2019-1-9 12:27:03 | 显示全部楼层 |阅读模式
0x001 前言
本文是基于CVE-2016-1758、CVE-2016-1828来讨论一下macOS下的内核提权技术。CVE-2016-1758是一个内核信息泄漏的洞,由于没有严格控制好内核栈数据copy的size,导致可以将额外8个bytes的内核地址泄漏出来,计算得到kernel_slide。CVE-2016-1828则是内核uaf的洞,存在于OSUnserializeBinary函数内,通过一个可控的虚表指针,将执行流劫持到NULL页上作ROP完成提权。

0x002 调试环境
虚拟机: OS X Yosemite 10.10.5 14F27主机: macOS Mojave 10.14.2 18C54
这里简单说一下环境搭建,在Parallel Desktop虚拟机安装OS X 10.10.5,主机安装KDK 10.10.5 14F27,安装目录是/Library/Developer/KDKs,提供的内核版本、符号、内核扩展都有release、development、debug三种版本。
启动虚拟机,看一下ip
设置启动参数
sudo nvram boot-args="debug=0x141 kext-dev-mode=1 pmuflags=1 -v"
我们这里直接调试realease版本的内核,所以不需要加kcsuffix=development这条参数。要是需要调试development或debug版本的内核,可以从主机安装的KDK包拷贝对应的内核到虚拟机的/System/Library/Kernels目录,再设置kcsuffix参数。
令内核缓存无效,重启
sudo kextcache -invalidate /
sudo reboot
主机打开lldb,引入调试符号
target create /Library/Developer/KDKs/KDK_10.10.5_14F27.kdk/System/Library/Kernels/kernel
虚拟机启动起来卡在开机,并等待调试器接入
0x003 内核源码分析
获取xnu内核代码
xnu-2782.40.9
找到/bsd/net/if.c里的if_clone_list方法
/*
* Provide list of interface cloners to userspace.
*/
static int
if_clone_list(int count, int *ret_total, user_addr_t dst)
{
  char outbuf[IFNAMSIZ];
  struct if_clone *ifc;
  int error = 0;
  *ret_total = if_cloners_count;
  if (dst == USER_ADDR_NULL) {
    /* Just asking how many there are. */
    return (0);
  }
  if (count 0)
    return (EINVAL);
  count = (if_cloners_count for (ifc = LIST_FIRST(&if_cloners); ifc != NULL && count != 0;
       ifc = LIST_NEXT(ifc, ifc_list), count--, dst += IFNAMSIZ) {
    strlcpy(outbuf, ifc->ifc_name, IFNAMSIZ);
    error = copyout(outbuf, dst, IFNAMSIZ);
    if (error)
      break;
  }
  return (error);
}
IFNAMSIZ长度为16,由于ifc是定义在内核栈上的局部数据,当ifc_name小于outbuf的长度,所以会将未初始化的内核地址拷贝到用户空间,计算得到kernel slide。
ifc_name存放着6个bytes的数据bridge,剩余9个bytes为初始化的数据存在outbuf上。
下面是if_clone_list方法的调用链
soo_ioctl -> soioctl -> ifioctllocked -> ifioctl -> ifioctl_ifclone -> if_clone_list
soo_ioctl方法在socketops结构体中被引用
const struct fileops socketops = {
  DTYPE_SOCKET,
  soo_read,
  soo_write,
  soo_ioctl,
  soo_select,
  soo_close,
  soo_kqfilter,
  soo_drain
};
要使得ifioctl调用ifioctl_ifclone,要传进cmd参数SIOCIFGCLONERS,类似这样ioctl(sockfd,SIOCIFGCLONERS,&ifcr)
int
ifioctl(struct socket *so, u_long cmd, caddr_t data, struct proc *p)
{
  char ifname[IFNAMSIZ + 1];
  struct ifnet *ifp = NULL;
  struct ifstat *ifs = NULL;
  int error = 0;
  bzero(ifname, sizeof (ifname));
  /*
   * ioctls which don't require ifp, or ifreq ioctls
   */
  switch (cmd) {
  case OSIOCGIFCONF32:      /* struct ifconf32 */
  case SIOCGIFCONF32:     /* struct ifconf32 */
  case SIOCGIFCONF64:     /* struct ifconf64 */
  case OSIOCGIFCONF64:      /* struct ifconf64 */
    error = ifioctl_ifconf(cmd, data);
    goto done;
  case SIOCIFGCLONERS32:      /* struct if_clonereq32 */
  case SIOCIFGCLONERS64:      /* struct if_clonereq64 */
    error = ifioctl_ifclone(cmd, data);
    goto done;
  case SIOCGIFAGENTDATA32:    /* struct netagent_req32 */
  case SIOCGIFAGENTDATA64:    /* struct netagent_req64 */
    error = netagent_ioctl(cmd, data);
    goto done;
查看ifioctl_ifclone方法,要使用if_clonereq结构作为if_clone_list的调用参数


222.png
111.png



上一篇:韩国800余万手机用户信息遭黑客窃取
下一篇:Coinbase因黑客攻击暂停ETC交易
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表