CTF Docker 小记

简介

每次玩玩 CTF 时总是会因为 Docker 速度慢、忘记命令等等使自己非常抗拒启 Docker 环境,但是没有 Docker 环境实操题目就又成了纸上谈兵。

因此趁着 RealworldCTF 5th 来熟悉并记录一下 Docker 的使用,感兴趣的 pwn 手可以一起实操一下 docker。

Docker 管理命令

  • docker image list --all :查看各种 image

    1
    2
    3
    4
    5
    6
    7
    ➜ docker image list                        
    REPOSITORY TAG IMAGE ID CREATED SIZE
    <none> <none> cc3193e40804 8 minutes ago 121MB
    <none> <none> fd184cbecbe0 3 months ago 72.8MB
    ubuntu 20.04 a0ce5a295b63 4 months ago 72.8MB
    python 3.6-slim c1e40b69532f 12 months ago 119MB
    ubuntu 14.04 13b66b487594 21 months ago 197MB

    docker image rm <image-id> :删除特定 image

  • docker container list --all :查看当前所有容器。

    docker ps -a 等价。

    docker container rm <container-id> :删除容器

    docker rm <container-id> 等价。

  • docker build -t <name> .:构建当前目录下 Dockerfile 的 image,并将该 image 命名为 <name>

  • docker run <args...> <image-id> [cmd]:从 image 构建出新的容器,并执行 cmd (如果有)。

  • docker start -i <container-id>:在交互模式下启动容器。

  • docker stop <container-id>:停止当前正在运行的容器。

  • docker save -o <export_fspath> <image-id>:导出 image 至文件路径 <export_fspath>

  • docker load -i <import_fspath>:导入外部 image 文件至 docker 中。通常这两步导入导出和 docker tar 有关。

  • docker exec -it <container-id> <cmd>: 在某个正在运行的容器中执行命令

    在非运行状态下容器执行命令则需要先用 docker start 启动容器再去执行 docker exec

Dockerfile 相关

  • Docker 换源

    1. sudo nano /etc/docker/daemon.json

      写入以下内容

      1
      2
      3
      4
      5
      6
      7
      8
      9
      {
      "registry-mirrors": [
      "https://yxzrazem.mirror.aliyuncs.com",
      "http://hub-mirror.c.163.com",
      "https://registry.docker-cn.com",
      "http://hub-mirror.c.163.com",
      "https://docker.mirrors.ustc.edu.cn"
      ]
      }

      上面那个奇怪的阿里云镜像地址是 阿里云镜像加速器专属地址。这里我直接抄了别人的,反正还有其他几个源,这个不行其他还能继续用。

    2. 重启 docker 服务

      1
      sudo service docker restart

      注:如果宿主机能连接网络但是 docker 无法连接, 则重启docker服务就能解决该问题。

  • Dockerfile 替换 apt 源

    默认 apt 源的下载速度非常感人,因此需要额外添加几句来替换默认 apt 源。

    1
    2
    3
    4
    5
    6
    RUN cat /etc/apt/sources.list
    RUN sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list \
    && sed -i s@/deb.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list \
    && sed -i s@/security.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list \
    && sed -i s@/security.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list \
    && apt-get clean
  • Dockerfile 替换 pip 源

    在 Dockerfile 中添加以下代码:

    1
    2
    3
    RUN mkdir ~/.pip && \
    cd ~/.pip/ && \
    echo "[global] \ntrusted-host = pypi.douban.com \nindex-url = http://pypi.douban.com/simple" > pip.conf
  • Dockerfile 网络加速

  • Dockerfile 构建 image

    在 Dockerfile 所在文件夹下,运行 docker build -t chal . 以构建 docker 实例。

    这里指定了构建好后的 image 名称为 chal,便于后面启动实例时指定名称,而不用再去查找 image id。

  • 构建 Docker 容器并启动

    1
    2
    3
    4
    5
    6
    7
    8
    # -i 交互模式
    # -t 分配伪终端
    # -name 指定所启动 container 的名称
    # -d 后台运行容器,通常这个选项我们几乎用不到(detach 分离模式)
    # –privileged=true 提升系统执行权限
    # -p 宿主机端口:容器端口 端口映射
    # -v 本地路径:容器路径 路径映射
    docker run -name <container-name> -it <image-name> [cmd]

    例如

    1
    docker run -it --name paddle_chal_container paddle_chal:latest

    如果 docker run 末尾不额外携带运行的命令,并且 Dockerfile 中带有 CMD 命令(例如 CMD ["python", "web_service.py"]),则 docker run 将会自动运行该命令。

    注意,最好不要通过在 Dockerfile 末尾添加 CMD ["/bin/bash"] 来启动终端,因为这样启动的终端退格键将被转义无法使用。

    当通过 docker run 成功构建并启动容器后,该命令将不可再被二次执行(因为该命令包含了构建容器这一步,而现在容器已经构建好了),后面想再启动所构建好的容器,则需要执行 docker start -i <container>

    可以参考 docker run - 菜鸟教程 查看更多参数信息。

Dockerfile 格式

如果有小小伙伴想自制 Dockerfile 则需要了解一下其中的各个命令。

这里直接参考这个 Dockerfile格式以及Dockerfile示例 - 阿里云开发者社区,非常全面,我就不再贴了。

CTF 调试

CTF 调试最重要的无非两步,调试器和编辑器。

先启动一下 docker 容器:

1
2
3
4
# 启动容器。这里没有指定 -i 交互模式,因此容器将进入后台运行
docker start <container-id>
# 在已运行容器中启动 bash
docker exec -i <container-id> /bin/bash

bash 执行成功后不会有任何提示,需要自行输入 whoami 等命令来测试是否已经成功。

不要使用 ls 来测试,因为可能当前文件夹下没有文件,误导人判断错误。

调试器配置

首先是调试器,这里直接在 docker 中执行安装 pwndbg 的过程即可,无需将这个安装过程写到 dockerfile 中:

1
2
3
4
5
6
7
8
9
10
11
# 此时是 root 权限,因此无需 sudo
apt-get update
apt-get install git

cd ~
git clone https://github.com/pwndbg/pwndbg
cd pwndbg
./setup.sh

# 安装 pwntools
pip3 install pwntools

编辑器配置

这里首选 VSCode,VSCode 中包含了丰富的 Docker 插件可用于管理与处理容器。

参照 VsCode在Docker中进行开发 - 知乎,在 VSCode 中安装 DockerDev Containers

安装好后即可直接通过宿主机的 VSCode 来附加至 Docker 容器中:

image-20230108121448976

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2020-2024 Kiprey
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~