博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CVE-2018-18955user_name_space空间越权漏洞
阅读量:2344 次
发布时间:2019-05-10

本文共 2890 字,大约阅读时间需要 9 分钟。

https://www.exploit-db.com/exploits/45886

漏洞原理

大概是在用户命名空间中NS1创建root用户,然后创建嵌套命名空间NS2。

在NS2中映射大于5个id

两个原因造成越权。

1.sort_idmaps会复制forward map的映射队列到reverse map中。4.15-4.19之间的某些内核代码。会在sort_idmaps排序之后进行内核id和用户id的转换。但是只转换了forward map 。 reverse map 没有变化。
2. from_kuid在查询id的过程中,会寻找map->reverse的map映射关系。如果,uid_gid_extent中first成员等于lower_first。那么返回的id将会是原本传进来的id. 没有修改的reverse map 中的值还是用户态传递来的0 到0 的映射,所以发生了越权。

nobody@lier-virtual-machine:~/work/exploit/45886/45886$ iduid=65534(nobody) gid=65534(nogroup) 组=65534(nogroup),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),113(lpadmin),128(sambashare),129(libvirtd)nobody@lier-virtual-machine:~/work/exploit/45886/45886$ head -n1 /etc/shadowroot:$6$doAc1Cla$O3pPRDFioQj3DKOMr/6djJFI63WZ7KnEpxvC8JWaKLcrPV30RPWfFMwuDdeH/Gn0wuZ/gS9qsqtemBF8Ry6Yf1:18180:0:99999:7:::nobody@lier-virtual-machine:~/work/exploit/45886/45886$ iduid=65534(nobody) gid=65534(nogroup) 组=65534(nogroup),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),113(lpadmin),128(sambashare),129(libvirtd)

理论上密码只要不强,可以通过工具碰撞出root账户的密码。其实获得的账号的权限并不完整,没有完全的root权限。

我用john工具试了下

n-1.9.0/run$ ./john password.txtLoaded 1 password hash (crypt, generic crypt(3) [?/64])Press 'q' or Ctrl-C to abort, almost any other key for statusbme314           (root)1g 0:00:00:15 100% 2/3 0.06578g/s 426.9p/s 426.9c/s 426.9C/s !@#$%..andrewUse the "--show" option to display all of the cracked passwords reliablySession completed
/run$ cat john.pot $6$doAc1Cla$O3pPRDFioQj3DKOMr/6djJFI63WZ7KnEpxvC8JWaKLcrPV30RPWfFMwuDdeH/Gn0wuZ/gS9qsqtemBF8Ry6Yf1:xxxxxxrun$

跑是跑出来了,不过一般情况下需要一个强大的字典,不然没啥用。

突然想到另一种利用方式,这里可能有写 /etc/shawdom的权限,试了下,果然可以。

原来的密码hash

45886$ sudo cat /etc/shadowroot:$6$Qk2IaudC$3Aj3MJ0s22dfxc4cXMI6AOGhXa639.flIwZNXITnqbQSiZ6B9Dc6LWIFB3f3Pd6EUvW/CBMyGzDjGgtHfPMCB1:18372:0:99999:7:::

nest ns

nobody@lier-virtual-machine:~/work/exploit/45886/45886$ vim /etc/shadowroot:$6$vbeZpmCt$4AO8Tg2HRZEYI3aZKuyi4qjVoZwCZ5HsBPPd1/B.ykxnBG3el1JladH1/KMPJjd.dwCK6y7bD8hVCENGXCQJg1:18372:0:99999:7:::

返回普通用户

lier@lier-virtual-machine:~/work/exploit/45886/45886$ sudo cat /etc/shadowroot:$6$vbeZpmCt$4AO8Tg2HRZEYI3aZKuyi4qjVoZwCZ5HsBPPd1/B.ykxnBG3el1JladH1/KMPJjd.dwCK6y7bD8hVCENGXCQJg1:18372:0:99999:7:::daemon:*:16911:0:99999:7:::bin:*:16911:0:99999:7:::sys:*:16911:0:99999:7:::sync:*:16911:0:99999:7:::

可以看到修改成功。

su root
切换用户,发现只要知道对应的密码,我们可以任意修改root用户的密码。成功执行root账号切换。

root@lier-virtual-machine:/home/lier/work/exploit/45886/45886#

关于user namespace

在这里插入图片描述

从整个漏洞的过程,我们可以猜测到整个user namespce权限管理过程。
嵌套名字空间,由于逆向追溯的过程和查询过程出现的缺陷,造成了权限突破。
我们清楚的看到uns通过vfs, 映射父进程uid到子uns的过程。并且对于文件权限的查询,是通过映射过程的逆过程反向查父usn的相应uid。对于理解user namespace帮助很大。

其实这里映射了很大的docker漏洞,因为dockers利用的就是user namespace. 如果我们在内核为4.15–4.19的中使用docker, 那么很可能通过嵌套构造user namespace直接进行权限提升。不过因为其他namespace空间的限制,不一定会有很大的作用。

补丁:

把追溯id的逻辑放在了复制排序前,这样forward和reverse就都经过了id追溯,可以找到正确的父命名空间id。

参考:

https://www.freebuf.com/vuls/197122.html
https://www.cnblogs.com/likaiming/p/10816529.html

你可能感兴趣的文章
4--网关
查看>>
4.内存非连续分配管理方式
查看>>
5.虚拟内存的概念、特征以及虚拟内存的实现
查看>>
mmap()函数:建立内存映射
查看>>
munmap()函数:解除内存映射
查看>>
三层交换机是否会代替路由器?
查看>>
5--TCP的状态
查看>>
6--企业常用防火墙iptables相关原理详解
查看>>
7--企业常用防火墙iptables核心配置讲解
查看>>
1.block_inode
查看>>
2.Linux文件和目录之间对应关系
查看>>
4.硬链接和软链接
查看>>
线性表的长度为10,在最坏情况下,冒泡排序需要比较次数为()----腾讯2016研发工程师在线模拟笔试题
查看>>
22个顶点的连通图中边的条数至少为()----腾讯2016研发工程师在线模拟笔试题
查看>>
有36辆自动赛车和6条跑道,没有计时器的前提下,最少用几次比赛可以筛选出最快的三辆赛车?----腾讯2016研发工程师在线模拟笔试题
查看>>
下列哪些http方法对于服务端和用户端一定是安全的?----腾讯2016研发工程师在线模拟笔试题
查看>>
对于定义"int *p",下列哪些说明可能是正确的?----腾讯2016研发工程师在线模拟笔试题
查看>>
华为研发工程师编程题----明明的随机数(快排)
查看>>
华为研发工程师编程题----进制转换(pow函数,string.find())
查看>>
华为研发工程师编程题----汽水瓶
查看>>