Docker检测技术研究

0x00前言

随着Docker的广泛应用,获取一个云端服务器的控制权限之后,检测目标是一个真实机器还是在Docker容器环境中变得越来越重要

0x01Docker检测

Docker基于Linux的LXC提供虚拟化服务,为了对不同Docker容器(Container)进行有效的控制,需要在容器内初始化一些配置文件,因此,可以通过检测这类的配置文件检测是Docker容器内部还是在真实机器。

  • 基于/proc/self/cgroup内容是否包含”docker”的检测(左边Docker容器环境,右边真机环境)
    cgroup

  • 基于/proc/self/cpuset内容是否包含”docker”的检测(左边Docker容器环境,右边真机环境)
    cpuset

  • 基于是否包含存在”/.dockerenv”的检测(左边Docker容器环境,右边真机环境)
    dockerenv

0x02检测脚本

先看看检测效果(左边Docker容器环境,右边真机环境)

isdocker
源码如下,为了突出检测结果,增加了字体颜色修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
isDocker(){
if [ $(cat /proc/self/cgroup|grep -c "docker") -gt 1 ];
then
echo -e "\033[31mThis is a Docker container\033[0m";
elif [ $(cat /proc/self/cpuset|grep -c "docker") -gt 1 ];
then
echo -e "\033[31mThis is a Docker container\033[0m";
elif [ -f "/.dockerenv" ];
then
echo -e "\033[31mThis is a Docker container\033[0m";
else
echo -e "\033[34mThis is not a Docker container\033[0m";fi
}
isDocker

使用方法

1
wget http://blackwolfsec.cc/static/code/isDocker.sh -O isDocker.sh && chmod +x isDocker.sh&& ./isDocker.sh

如果不喜欢上面下载bash脚本的方式,也可以直接复制下面的命令到shell下执行检测

1
if [[ $(cat /proc/self/cgroup|grep -c "docker") -gt 1 || $(cat /proc/self/cpuset|grep -c "docker") -gt 1 || -f "/.dockerenv" ]];then echo -e "\033[31mThis is a Docker container\033[0m";else echo -e "\033[34mThis is not a Docker container\033[0m";fi

0x03参考链接

  1. http://tuhrig.de/how-to-know-you-are-inside-a-docker-container/

  2. https://github.com/sindresorhus/is-docker/blob/master/index.js

  3. https://forums.docker.com/t/how-can-a-process-detect-if-it-is-running-in-a-container/11123

  4. https://github.com/pipedrive/containerized