普通用户执行这条命令就可以获得root权限
docker run -v /:/hostOS -i -t chrisfosterelli/rootplease
方法二
初始情况下这里host上的test用户是非sudo组用户,只拥有普通权限。为了使用docker,已提前通过管理员将test用户加入docker用户组。
首先我们借助任意一个docker镜像创建一个容器:
docker run -it --rm xxx /bin/bash #常规使用
docker run -it --rm -v /etc:/etc xxx /bin/bash #异常使用
这里最关键的一点就是-v选项的参数/etc:/etc。
我们知道linux机器上的本地用户信息主要记录在/etc/目录下,比如两个常见文件/etc/passwd和/etc/group两个文件分别记录了用户基本属性与用户分组信息。
正常情况下创建的容器,内部也会有/etc目录,容器内部的用户信息也是记录在该目录。
然而我这里巧妙的将host上的/etc目录直接映射进容器,从而覆盖了容器内的/etc目录。再加上容器内用户默认是root,拥有超级管理员权限,如上图中,通过容器内的root用户在容器内新加了一个用户test1:adduser test1,并赋予该用户sudo权限:usermod -aG sudo test1。
至此,docker容器的作用已结束,Ctrl+D退出容器回到host,通过cat /etc/passwd查看一下本地用户基本属性,想必大家也能猜出这么做会出现什么有趣的现象。图中我没有查看,而是直接su test1,顺利切换到在容器内添加的用户,也就是说在容器内添加的用户实际上也添加到了host上。通过id命令查看该用户也被同步加入到了sudo用户组。
其实到了这一步已经达到了提权的目的,通过普通的test用户借助docker容器成功创建了一个具有sudo权限的用户test1。图中只是增加了一步,借助test1将test也加入sudo用户组,其实效果一样。
当然这里也可以不用增加test1用户,直接在容器内将test用户加入sudo用户组,因为此时test用户对于容器也是可见,也是可以直接操作其所属群组,如下图所示:
最后在host上也可以看到test已经被加入sudo用户组了。此时我没有用id命令查看的一个原因是,linux的shell并没有自动更新当前用户信息,可以退出Terminal重新进入。
注:此时如果没有重新连接,test用户还是无法使用sudo命令。
问题影响
在这种多用户借助docker共用一台机器的情况下,普通用户可以轻松的借助docker提升为sudo用户,从而可以进行任意修改系统配置等各种恶意操作。
以上是本地用户的破坏还不是很明显,毕竟是公司内部用户大多不会进行恶意操作。然而,很多情况下普通用户为了方便,用户密码往往设置得很简单,如果攻击者通过其他途径暴力破解普通用户弱口令,就可以很轻松得提示为管理员从事不可限制的恶意操作,这也大大降低了攻击者的攻击难度。
规避措施
docker创建容器默认是以root身份来创建的,普通用户之所以能够创建容器的原因就是这个docker用户组,所以我们应该规避使用这种做法。对于多个用户想使用容器,可以通过管理员集中创建开启了ssh服务的容器,并提供端口映射到host上,让普通用户通过ssh链接进入容器,这样就可以限制普通用户的活动范围在容器内,用户的任意操作也不会扩散到host上。
