docker -v 覆盖了容器中的文件_通过暴露的docker.sock文件接管容器

默认情况下,当在主机上执行docker命令时,对docker daemon的API调用是通过位于/var/run/docker.sock的非联网UNIX套接字进行的。此套接字文件是控制在该主机上运行的任何docker容器的主API。但是,许多容器和指南会要求你将该套接字文件作为容器中的一个卷公开 ,或在某些情况下,将其暴露在TCP端口上。这样做是非常危险的,本地或远程暴露/var/run/docker.sock的Docker容器很有可能会被恶意攻击者完全的接管。

c907bb7d262a0a73e34ebeb64527d047.png

截至目前,我已发现了大量将docker.sock暴露在互联网中的服务器。

其实这并不是一个新鲜的漏洞,在此之前早已有文章讨论过关于暴露docker.sock文件所带来的危险性的文章。而本文我将扩展这个问题【https://www.lvh.io/posts/dont-expose-the-docker-socket-not-even-to-a-container.html】,解释如何利用它,以及如何采取措施应对这个问题。如果你在Twitter【https://twitter.com/dejandayoff】上关注了我,你将会在不久后获取到我分享的一个脚本,它可以帮助你更轻松地进行利用。

你能做什么?

利用暴露的docker.sock文件,你可以在主机上运行的任意容器中执行你想要的任何操作。通过本地或远程访问docker.sock文件,你可以像在主机上运行docker命令一样控制docker。

最简单的例子是利用官方docker客户端访问docker.sock文件(例如你碰巧访问到了已安装docker客户端的容器,或是你可以安装docker客户端)。要利用它很简单,你可以运行常规的docker命令,包括exec来获取shell:

:/

然而,想要运行它,你必须已在容器上安装RCE。即使使用RCE,大多数情况下你也可能无法访问docker客户端,以及安装docker客户端。如果是这种情况,你可以对/var/run/docker.sock进行原始http请求。

虽然可以通过向docker.sock文件发出HTTP请求来在docker容器上利用RCE利用docker环境,但这种情况不太可能发生。更大的几率是找到通过TCP端口远程暴露的docker.sock文件。

如果你需要运行未在以下列出的任何其他命令,docker API【https://docs.docker.com/engine/api/v1.37/】将可以很好的帮到你。

这里有一个CloudFormation【https://console.aws.amazon.com/cloudformation/home?region=us-west-2#/stacks/new?stackName=DockerSock&templateURL=https://s3-us-west-2.amazonaws.com/cf-templates-1hvupoi2etj4x-us-west-2/2019101XTh-docker.sock.template3tlnn4nypxg】脚本。你需要拥有一个具有启动新EC2实例权限的AWS账户。完成后别忘了删除stack!

在容器上获取 RCE

1)列出所有容器

第一步是获取主机上所有容器的列表。为此,你需要执行以下http请求:

GET 

Curl 命令:

//:PORT/containers/json

响应:

200 OK

注意响应中的“Id”字段,因为下一个命令将会用到它。

2) 创建一个 exec

接下来,我们需要创建一个将在容器上执行的“exec”实例。你可以在此处输入要运行的命令。

请求中的以下项目需要在请求中进行更改:

Container ID Docker Host Port Cmd(我的示例中将 cat /etc/passwd)

POST 

Curl 命令:

-s -X POST \

响应:

201 Created

注意响应中的“Id”字段,因为下一个命令将会用到它。

3)启动 exec

现在创建了“exec”,我们需要运行它。

你需要更改请求中的以下项目:

Exec ID Docker Host Port

POST 

Curl 命令:

-s -X POST \

响应:

200 OK

接管主机

启动一个docker容器,主机的根目录安装到容器的一个卷上,这样就可以对主机的文件系统执行命令。由于本文中所讨论的漏洞允许你完全的控制API,因此可以控制docker主机。

注意:不要忘记更改dockerhost,port和containerID 

1)下载 ubuntu 镜像

'POST' \

2)使用已安装的卷创建容器

'POST' \

3)启动容器

'POST' \

至此,你可以利用代码执行漏洞对新容器运行命令。如果要对Host OS运行命令,请不要忘记添加chroot/hostos。

如何修复?

避免远程或在容器级别暴露docker.sock文件(如果可能)

如果你需要远程提供套接字文件,请执行此处的操作

设置适当的安全组和防火墙规则,以阻止非法IP的访问

附录

本地命令

下面是一个CURL命令列表,如果API不能远程使用,但可以在本地使用,则可以运行这些命令。

1) 列出所有的容器

/var/run/docker.sock -X GET \

2) 创建一个 exec

var/run/docker.sock -X POST \

3) 启动 exec

-s --unix-socket /var/run/docker.sock -X POST \

*参考来源:

https://dejandayoff.com/the-danger-of-exposing-docker.sock/

FB小编secist编译,转载请注明来自FreeBuf.COM


34f6e8d81c193f50d4fbcc72a40e6a5e.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值