容器特征识别
.dockerenv文件
该文件在以往被 LCX
用于将环境变量加载入容器内,通过检测该文件是否存在,可识别当前环境是否在容器内。
ls -l /.dockerenv
在容器内的命令执行效果如下:
proc虚拟文件系统中的cgroup文件
为了限制容器对系统资源的使用,Docker
为每个容器创建了一个控制组以及一个名为 docker
的父控制组,如果某个进程在 Docker
容器中启动,则该进程将必须在该容器控制中,可以通过查看系统 init
进程的 cgroup
内容,验证是否为容器:
root@1d20f9911b89:/# cat /proc/1/cgroup|grep docker
在容器内的命令执行效果如下所示:
系统进程
使用 ps
命令列出当前环境内所有运行的进程,并结合回显判定环境内进程是否少于5个?
ps aux
在容器内的命令执行效果如下所示:
使用 wc
命令,同样能够完成对进程数的计算和判定
ps aux|wc -l
利用一些缺失的系统程序识别
Docker
所提供的镜像通常经过精简和裁剪,只保留能够完成其基本服务的命令和库,以完成其基本的服务为目的,像有的容器就缺失了诸如 man
、 ifconfig
、 vim
等命令,执行样例如下:
不当的系统配置导致的未授权访问
2375端口信息泄露
1.登陆 Docker
所在的主机,编辑 docker.service
文件,并在 ExecStart
字段中添加 -H tcp://0.0.0.0:2375
gedit /usr/lib/systemd/system/docker.service
2.重新加载配置并重启服务
3.访问相关端口,对容器信息进行探测
curl 127.0.0.1:2375/version
通过上图可发现,能够成功获取到 Docker
容器的相关版本信息。
-v挂载宿主机路径到容器中的情况
通过如下指令运行一容器:
docker run -it -v /:/host ubuntu bash
随后在容器内执行如下命令:
cd /host
chroot ./ bash # 根目录切换为当前路径并执行bash
cat /etc/shadow
这时候,可以基本通过容器访问宿主机的任何内容。
通过挂载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
安装效果如下图所示:
3.查看宿主机信息
docker -H unix:///host/var/run/docker.sock info
相当于使用 client
访问宿主机 daemon
并获取相关信息,该命令执行效果如下所示:
4.查看宿主机开启的 docker
容器:
docker -H unix:///host/var/run/docker.sock ps
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
。
喜欢就请关注我们吧!
本文始发于微信公众号(Pai Sec Team):一些与Docker安全相关的知识点总结与整理
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论