今天我们将探讨与 Docker 相关的一些安全风险, 尤其是我们会讨论到的将本地 Docker API 开放给外界的后果.
特别是我们将研究本地Docker API暴露于外部世界的后果.
默认情况下, 在主机上安装 Docker 时只能从loopback接口访问 Docker API. 这很好, 但显然出于某些原因, 你可能希望公开这些API, 以便使用一些外部工具, 比如 Portainer.
Portainer 是一个轻量级的 Docker 图形化管理UI, 您可以将其附加到 Docker 套接字上, 让它在本地运行, 或者也可以用它管理托管到远程主机上的容器.
为了解释这个攻击手段, 我搭建了一个非常简单的实验:
主机: Ubuntu 16.04 LTS
主机上安装有最新版本的Docker CE
拉入主机的 Debian 容器
实验环境的配置过程非常轻松, 我使用 Vagrant 来启动 Ubuntu 虚拟机. Docker 的命令也非常简单, 所以我不再过多解释.
要想复现此次攻击, 你需要开放 Docker API. 我按照 这篇教程 进行了相应操作.
而你唯一需要做的就是根据 https://success.docker.com/article/how-do-i-enable-the-remote-api-for-dockerd
这篇文章的内容创建一个文件并写入以下内容:
然后运行以下命令重载 Unit 文件(重启 systemctl 守护进程):
并重启 Docker 服务.
现在你可以看到 Docker 进程正监听着端口 2376:
现在假设我们是一名攻击者(这十分有趣)
我们对主机一无所知, 故我们先从端口扫描开始做起:
因为没有包含 Docker API 端口, 所以我得扫描更多默认前1000的端口. :(
好吧. 那服务检测结果怎么样呢?
这证实我们正在和 Docker 打交道, Nmap也发现了 Docker 的确切版本. 我们可以向http://<IP>:2376/version
端点发送 GET 请求进行确认.
注意: Claudio Criscione 写了一个 nmap 脚本来完成这事 (他的Github页面).
我们要做的最后一件事就是使用 Docker 命令测试公开的API
语法也相当简单:
Bingo, 我们可以用 Docker 命令来访问 Docker API 了.
我们来探讨后续的可能操作, 我们可以用这些 API 实现什么?
在攻击主机及其容器之前, 我们需要搜集一些信息:
当前主机上是否有一些正在运行的容器?
docker -H 192.168.1.7:2376 ps
当前主机上是否有一些已停止运行的容器?
docker -H 192.168.1.7:2376 ps -a
主机上已拉取的镜像有哪些?
docker -H 192.168.1.7:2376 images
检查那些镜像, 镜像可能含有丰富的信息, 你可以试着运行那些镜像并访问它们.
在这种情况下, 我们找到了一个运行着的 Debian 容器:
通过exec
命令在容器内打开一个 shell, 在这里我们生成一个 bash.
为什么我们已经是 root 用户了? 很简单, 因为容器内的默认用户就是 root 用户, 速赢!
一旦进入容器, 我们就可以开始挖掘一些有用的信息, 你需要考虑这些问题:
容器是否只有一个? 有其他的容器正在运行吗? 是否使用 Docker Compose 进行部署? 这个容器的用途是什么? 一个 Web应用? 后端? 数据库? 根据用途, 能找到具有数据库认证的配置文件吗, 依次类推.
系统管理员/DevOps工程师是否使用某些自动化配置管理工具, 比如ansible, salt?
如果有用, 那么就可以去找特定的配置文件(Google是你的好帮手).
要是足够幸运的话, 你只需点击几下就可拥有整个应用程序栈!
如果可以的话, 检查容器内应用程序的代码, 你能否确定是否还有其他有趣的服务, 比如KV存储, 缓存?
另一个你可以做的趣事就是, 你可以启动其他的容器, 虽然这不是十分隐秘, 但可能相当有用.
根据加密货币挖矿的趋势, 这篇博文解释了如何使用 Docker 挖取门罗币: https://getmonero.org/resources/user-guides/mining_with_xmrig_and_docker.html
你可以点击这个 DockerHub 的链接查看相应的 Dockerfile.
你可以使用以下命令轻松地启动挖矿容器:
瞧, 用 Docker 挖矿.
另一种选择可能是作为互联网上的廉价僵尸网络容器.
你可能会想, 谁会把 Docker API 暴露在互联网上呢?
首先, 你可以在内部渗透测试时遇到这种情况, 所以这仍然有帮助.
其次我们找来强大的 Shodan 来观察这是否构成安全问题:
共有760个开放的 Docker API. 我们可以利用此造成严重的问题.
本文我们研究了与 Docker 相关的一些威胁.
Docker 是一个非常强大的引擎, 节省了许多开发人员(包括我)的时间. 但是提供强大功能的同时也带来了厚重的责任.
让 Docker API 暴露在互联网上可能会导致数据丢失, 挖矿, 僵尸网络等问题.
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2019-1-30 14:02
被Vancir编辑
,原因: 修改一些语法问题