这是决定不打比赛之后的第一个CVE
分析, 感觉还行, 就是其中个别问题没有弄清楚, 基本流程清楚了, 最后我会提出我的问题, 有哪位大佬能回答的, 直接在下面留言就行了.
原因
没有对用户空间的输入信息进行拷贝处理, 直接将用户空间输入的timeout指针传递给__sys_recvmmsg函数进行处理.
漏洞代码
提权的思路: 首先我们先将commit_creds(prepare_kernel_cred (0));
代码复制到一段可以执行的用户空间代码. 利用内核的漏洞, 修改某一个内核指针为用户空间指针(这个指针指向的内容含有commit_creds(prepare_kernel_cred (0));
). 执行这个内核指针, 我们获取一个root cred
.最后执行system("/bin/sh")
, 获取一个root shell
.
1. 结构体
说明: 修改的内容是net_ctl_permissions
, 修改的指针net_sysctl_root + 96
, 这个指针指向net_ctl_permissions
.
2. 提权代码复制
总结: 基本上copy
提权代码这一块, 大多数exp
写的大同小异, 几乎形成了一个模板.
3.开启父进程的UDP服务
总结: 开启父进程的UDP服务,设定接收的信息的结构体msgs
.个人觉得这段没什么软用, 起辅助作用.
4.重头戏
总结: 通过设置父进程开启UDP
服务, 子进程故意睡眠0xff
秒, 然后向父进程发送一个UDP报文,从而触发漏洞. 将net_sysctl_root+96
处的后三个位清零, 清零后net_sysctl_root+96
就成了用户地址, 而这个地址我们已经copy
有提权代码.
三个字节覆盖过程截图:(从后往前覆盖的)
当时, 不明白为什么只有一个父进程和一个子进程存在, 现在明白了, 答案就在下面链接里.
一个问题
5.触发漏洞
结论: net_ctl_permissions
是一个权限检查函数. 当open
/proc/sys/net/core/somaxconn
, 这个设备时, 需要先使用net_ctl_permissions
进行权限检查, 其实这时的函数地址已经被修改为提权shellcode
. 先获取一个root
凭证, 然后执行system("/bin/sh")
,就乐意获取一个root shell
.
看雪帖
详细分析
提权入门必看
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)