一些与Docker安全相关的知识点总结与整理

  • A+
所属分类:安全闲碎

容器特征识别

.dockerenv文件

该文件在以往被 LCX 用于将环境变量加载入容器内,通过检测该文件是否存在,可识别当前环境是否在容器内。

ls -l /.dockerenv

在容器内的命令执行效果如下:

一些与Docker安全相关的知识点总结与整理

proc虚拟文件系统中的cgroup文件

为了限制容器对系统资源的使用,Docker 为每个容器创建了一个控制组以及一个名为 docker 的父控制组,如果某个进程在 Docker 容器中启动,则该进程将必须在该容器控制中,可以通过查看系统 init 进程的 cgroup 内容,验证是否为容器:

[email protected]:/# cat /proc/1/cgroup|grep docker

在容器内的命令执行效果如下所示:

一些与Docker安全相关的知识点总结与整理

系统进程

使用 ps 命令列出当前环境内所有运行的进程,并结合回显判定环境内进程是否少于5个?

ps aux

在容器内的命令执行效果如下所示:

一些与Docker安全相关的知识点总结与整理


使用 wc 命令,同样能够完成对进程数的计算和判定

ps aux|wc -l

一些与Docker安全相关的知识点总结与整理

利用一些缺失的系统程序识别

Docker 所提供的镜像通常经过精简和裁剪,只保留能够完成其基本服务的命令和库,以完成其基本的服务为目的,像有的容器就缺失了诸如 man 、 ifconfig 、 vim 等命令,执行样例如下:

一些与Docker安全相关的知识点总结与整理

不当的系统配置导致的未授权访问

2375端口信息泄露

1.登陆 Docker 所在的主机,编辑 docker.service 文件,并在 ExecStart 字段中添加 -H tcp://0.0.0.0:2375

gedit /usr/lib/systemd/system/docker.service

一些与Docker安全相关的知识点总结与整理

2.重新加载配置并重启服务

一些与Docker安全相关的知识点总结与整理

3.访问相关端口,对容器信息进行探测

curl 127.0.0.1:2375/version

通过上图可发现,能够成功获取到 Docker 容器的相关版本信息。

一些与Docker安全相关的知识点总结与整理

-v挂载宿主机路径到容器中的情况

通过如下指令运行一容器:

docker run -it -v /:/host ubuntu bash

随后在容器内执行如下命令:

cd /hostchroot ./ bash # 根目录切换为当前路径并执行bashcat /etc/shadow

这时候,可以基本通过容器访问宿主机的任何内容。

一些与Docker安全相关的知识点总结与整理

通过挂载Docker socket访问宿主机

如果在容器内能够访问 docker socket 时,可以通过 client 与 daemon 之间的通信,实施恶意操作完成逃逸。

1.首先运行一容器,并将 /var/run/ 挂载至容器内 /host/var/run/ 目录。

docker run -it -v /var/run/:/host/var/run/ ubuntu /bin/bash

    2.在容器内安装 docker.io 这一 Docker 客户端

apt-get update && apt-get install docker.io

安装效果如下图所示:

一些与Docker安全相关的知识点总结与整理

    3.查看宿主机信息

docker -H unix:///host/var/run/docker.sock info

相当于使用 client 访问宿主机 daemon 并获取相关信息,该命令执行效果如下所示:

一些与Docker安全相关的知识点总结与整理

    4.查看宿主机开启的 docker 容器:

docker -H unix:///host/var/run/docker.sock ps

一些与Docker安全相关的知识点总结与整理

socket访问原理分析

要理解 Docker Socket ,首先需要理解的是 Docker 实际上是 C-S 架构,在一台机器上运行的 Docker 由 client 和 server 构成,随便执行一个 docker ps 命令,实际上是通过:客户端将请求发送到同一台电脑上的Docker Daemon服务,由Docker Daemon解析执行并返回信息,客户端在收到相关信息后将数据展示在控制台上

-H 参数作用:客户端连接远程的 Host 所指定的参数,本例指定的参数为 unix:///host/var/run/docker.sock ,其中 unix:// 可以理解为协议字段(为通过unix进行本地访问);/host/var/run/docker.sock 指定的是连接的统一资源定位符。在容器里直接执行 docker ps 这类命令可以佐证这一情况,由于容器内本身只安装了 docker.io 客户端而未安装 Docker daemon ,所以访问不到 /var/run/docker.sock 。

一些与Docker安全相关的知识点总结与整理


喜欢就请关注我们吧!


一些与Docker安全相关的知识点总结与整理


本文始发于微信公众号(Pai Sec Team):一些与Docker安全相关的知识点总结与整理

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: