普通用户借助docker容器提权思路分享

随着docker越来越流行,很多公司内部linux机器上docker成了标配。

免sudo使用docker

默认情况下使用docker必须要有sudo权限,对于一台机器多用户使用,往往很多用户只有普通权限,如何保证普通用户也能顺利使用Docker呢?

这一点想必难不到大家,只需要管理员将需要使用docker的用户添加到docker用户组(安装docker后默认会创建该组)中,用户重新登录机器即可免sudo使用docker了。

docker容器内用户权限不受限

我们知道,用户创建一个docker容器后,容器内默认是root账户,在不需要加sudo的情况下可以任意更改容器内的配置。

正常情况下,这种模式既可以保证一台机器被很多普通用户使用,通过docker容器的隔离,相互之前互不影响;也给用户在容器内开放了充足的权限保证用户可以正常安装软件,修改容器配置等操作。

docker文件映射方便容器内外文件共享

在我们创建容器的时候,docker提供了一个-v选项,提供用户将容器外的host目录映射进容器内,方便的进行容器内外的文件共享。

然而便利倒是有了,但潜在了风险也是可想而知。

结合上面的两点便利,笔者想到一种普通用户借助docker突破权限的限制,达到本地提权的目的。参见下图:

提权解读

初始情况下这里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上。

*本文作者:lxzh123,转载请注明来自FreeBuf.COM

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2018-05-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程坑太多

『中级篇』如何在mac上安装docker(五)

1532
来自专栏编程坑太多

『中级篇』容器的端口映射(28)

PS:这里不通过公网服务器演示了,基本用阿里云或者腾讯云都有公有IP的直接映射就可以了用了,通过这种方式我们知道很多的服务都是提供端口的,例如:tomcat80...

1656
来自专栏眯眯眼猫头鹰的小树杈

猫头鹰的深夜翻译:持久化容器存储

临时性存储是容器的一个很大的买点。“根据一个镜像启动容器,随意变更,然后停止变更重启一个容器。你看,一个全新的文件系统又诞生了。”

1535
来自专栏编程

Pentestbox更新MSF问题

{介绍} PentestBox是一款Windows平台下预配置的便携式开源渗透测试环境,其中更新MSF,是一个比较头痛的问题,这里就大概讲下是如何爬过这个坑的。...

1.7K9
来自专栏SDNLAB

容器有很多优势,但它们是否安全?

容器被誉为是将应用程序部署到服务器上的非常有效的手段。容器(例如基于Docker开源标准的容器)比虚拟机消耗更少的资源,并且容器的设计更容易,且实例化和提供更快...

894
来自专栏性能与架构

快速搭建Storm集群环境

前言 Storm 是一个分布式计算框架,适用于大规模数据的实时计算。 对于分布式技术的学习,可能首先让人头大的就是集群环境的搭建,如何快速的搭建集群环境,让我们...

39710
来自专栏编码前线

docker底层原理介绍

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。

2613
来自专栏云计算教程系列

如何在Ubuntu 18.04上安装Anaconda [快速入门]

Anaconda是专为数据科学和机器学习工作流程而设计的,是一个开源包管理器,环境管理器,以及负责Python和R编程语言的分发。

6.5K0
来自专栏EAWorld

DevOps的支撑服务:K8s容器管理与应用部署

? 大家好,本期微课堂介绍在新一代数字化企业云平台中对于Kubernetes的学习以及使用的总结。 ? 本次分享分为两部分: 1.介绍Kubernetes是什...

5207
来自专栏杂文共赏

使用DCHQ自动部署和管理Docker Cloud /虚拟Java微服务

本文演示了一个在云或虚拟平台上,用于自动化部署和管理Docker Java微服务应用程序的解决方案。我们通过扩展现有项目Chris Richardson的示例—...

1954

扫码关注云+社区

领取腾讯云代金券