KASLR绕过及提权利用(CVE-2023-35001)

王柳  金牌会员 | 2024-5-17 01:26:57 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 891|帖子 891|积分 2673

前言

本文将介绍如何绕过KASLR以及如何提权利用。
KASLR绕过

可以利用byteorder操作加上netlink组订阅可以泄露rule中的handle字段。该方法应该是可以用来泄露kernel基地址的,但是作者还提出另一种方法进行泄露。应该是为了提权利用做铺垫。
由于发现已经泄露的模块的基地址,因此可以利用模块地址伪造表达式。
作者找到了range表达式,用于伪造其余表达式。总大小为0x23。而且表达式是八字节对齐的,因此该布局体会占用0x28字节。
  1. struct nft_range_expr {
  2.     struct nft_data     data_from;
  3.     struct nft_data     data_to;
  4.     u8          sreg;
  5.     u8          len;
  6.     enum nft_range_ops  op:8;
  7. };
复制代码
详细的布局如下

可以看到data_from与data_to都是从用户态中转达已往的数据,因此我们可以在这些区域内伪造表达式,这有点像在CTF中,我们泄露了堆块基址后,随意伪造堆块。
由于我们有0x28字节的空间,但是实际可以或许操作的空间是data_from与data_to两段,即0x20的空间大小。因此我们需要挑选小于0x20的规则表达式进行伪造,而且可以或许实行泄露功能的。
这里作者选用了byteorder表达式,可以看到该表达式在对齐后只占用八字节。
  1. struct nft_byteorder {
  2.     u8          sreg;
  3.     u8          dreg;
  4.     enum nft_byteorder_ops  op:8;
  5.     u8          len;
  6.     u8          size;
  7. };
复制代码
构造后,可以发现还有八字节的data_to没有用,但是并不能直接丢弃不适用,因为在调用完byteorder操作后还需要继承实行其他规则表达式。
[img=720,197.80782918149467]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202404101509182.png[/img]

但是其他表达式都是需要大于0x8的,毕竟一个操作指针就占用八字节了,此时作者选用了meta表达式。可以看到meta表达式也只用到了三个字节,刚好对应range表达式的sreg、len以及op。
  1. struct nft_meta {
  2.     enum nft_meta_keys  key:8;
  3.     u8          len;
  4.     union {
  5.         u8      dreg;
  6.         u8      sreg;
  7.     };
  8. };
复制代码
meta表达式的操作如下,在meta表达式中meta->key实行详细的操作,如[1],但是若该值是非法值则会实行[2],可以看到该meta表达式仅会抛出异常,但是不会终止运行,这就阐明即使meta->key是非法值也不会影响后续规则表达式的正常实行。
  1. File: linux-5.19\net\netfilter\nft_meta.c
  2. 418: void nft_meta_set_eval(const struct nft_expr *expr,
  3. 419:               struct nft_regs *regs,
  4. 420:               const struct nft_pktinfo *pkt)
  5. 421: {
  6. 422:    const struct nft_meta *meta = nft_expr_priv(expr);
  7. 423:    struct sk_buff *skb = pkt->skb;
  8. 424:    u32 *sreg = &regs->data[meta->sreg];
  9. 425:    u32 value = *sreg;
  10. 426:    u8 value8;
  11. 427:
  12. 428:    switch (meta->key) { ----> [1]
  13. 429:    case NFT_META_MARK:
  14. 430:        skb->mark = value;
  15. 431:        break;
  16. 432:    case NFT_META_PRIORITY:
  17. 433:        skb->priority = value;
  18. 434:        break;
  19. 435:    case NFT_META_PKTTYPE:
  20. 436:        value8 = nft_reg_load8(sreg);
  21. 437:
  22. 438:        if (skb->pkt_type != value8 &&
  23. 439:            skb_pkt_type_ok(value8) &&
  24. 440:            skb_pkt_type_ok(skb->pkt_type))
  25. 441:            skb->pkt_type = value8;
  26. 442:        break;
  27. 443:    case NFT_META_NFTRACE:
  28. 444:        value8 = nft_reg_load8(sreg);
  29. 445:
  30. 446:        skb->nf_trace = !!value8;
  31. 447:        break;
  32. 448: #ifdef CONFIG_NETWORK_SECMARK
  33. 449:    case NFT_META_SECMARK:
  34. 450:        skb->secmark = value;
  35. 451:        break;
  36. 452: #endif
  37. 453:    default:
  38. 454:        WARN_ON(1); ---->[2]
  39. 455:    }
  40. 456: }
复制代码
因此第二个伪造的表达式也找到了,就是meta表达式。由于我们直接伪造了规则表达式,因此不会进行寄存器参数的校验,只要选择内核地址选择泄露即可。
[img=720,117.15481171548117]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202404101509183.png[/img]

这里简朴说一下伪造的规则头,此时的len需要设置为0x20以及islast需要设置为0。
末了泄露的效果如下,即使内核已经抛出了异常,但是不会影响后续表达式的正常实行。
[img=720,433.9834710743802]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202404101509184.png[/img]

【----资助网安学习,以下所有学习资料免费领!加vx:dctintin,备注 “博客园” 获取!】
 ① 网安学习成长路径思维导图
 ② 60+网安经典常用工具包
 ③ 100+SRC漏洞分析陈诉
 ④ 150+网安攻防实战技术电子书
 ⑤ 最权威CISSP 认证考试指南+题库
 ⑥ 超1800页CTF实战本领手册
 ⑦ 最新网安大厂面试题合集(含答案)
 ⑧ APP客户端安全检测指南(安卓+IOS)
提权利用

既然可以随意伪造表达式,因此我们可以伪造payload表达式。
  1. struct nft_payload {
  2.     enum nft_payload_bases  base:8;
  3.     u8          offset;
  4.     u8          len;
  5.     u8          dreg;
  6. };
复制代码
[img=720,187.48466257668713]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202404101509185.png[/img]

在regs下方存在着nft_do_chain函数返回地址,因此可以直接通过payload表达式将提权payload注入进来。
[img=720,272.1951219512195]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202404101509186.png[/img]

由于我们可以伪造payload表达式,因此注入的payload长度不受限,因此采用

  • commit_creds(prepare_kernel_cred(0)),构造root凭证
  • 接着利用find_task_by_vpid、init_nsproxy以及switch_task_namespaces切换定名空间。
  • 末了利用蹦床swapgs_restore_regs_and_retrun_to_usermode返回到用户空间完成提权利用。
[img=720,259.71090670170827]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202404101509187.png[/img]

完整exp:https://github.com/h0pe-ay/Vulnerability-Reproduction/tree/master/CVE-2023-35001(nftables)
更多网安技能的在线实操训练,请点击这里>>
  

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

王柳

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表