Pwntools Docker 容器使用指南:快速搭建 CTF 攻防与漏洞利用开发环境

  • 网络安全
  • 渗透测试
  • 逆向工程

【免费下载链接】pwntools

CTF framework and exploit development library

项目地址: https://gitcode.com/gh_mirrors/pw/pwntools
点击查看 免费下载

本篇技术指南以仓库根目录的 DOCKER.md 为核心,系统讲解如何通过官方 Docker 镜像快速获得开箱即用的 Pwntools 开发环境:从一条命令拉取运行 stable 镜像、配置调试所需的特权与网络参数,到通过 bind mount 在宿主机与容器之间共享代码目录,并进一步结合 extra/docker 目录下的源码,说明 base/stable/beta/dev/develop 镜像家族的构建层次与原理。读完本文,你将掌握用 Docker 在任意 Linux/macOS/Windows 主机上搭建、运行和调试 Pwntools 的完整实战方案。

为什么用 Docker 运行 Pwntools

在本地工作站上安装 Pwntools 经常是一件麻烦事:需要处理 pip 依赖、交叉编译工具链(binutils)、QEMU 用户态模拟、GDB 调试器等一堆系统级组件,还要保证它们之间的版本兼容。正如 DOCKER.md 开篇所述,你想要的是一套"开箱即用"(Just Works)的环境。

Docker 恰好解决了这个问题:镜像内部是一个标准化的 Linux 环境,Pwntools 及其全部依赖已被预先安装完毕,你不需要操心 pip 或安装依赖,拉取镜像即可开始工作。对于 CTF 比赛、漏洞利用脚本编写、二进制分析等场景,这意味着从"配置环境"到"写 exploit"的启动时间被压缩到一条命令。

快速开始:拉取并运行 stable 镜像

首先,请为你的操作系统安装 Docker,官方提供各平台的 Getting Started 指引。

安装完成后,下载并运行 Pwntools 的稳定版(stable)镜像:

$ docker run -it pwntools/pwntools:stable

-it 表示以交互模式启动并分配伪终端,命令执行后你会直接进入容器内的 shell。此时 pwn 命令行工具与 python3 环境都已就绪,可以立即开始使用:

$ pwn version
$ python3 -c "from pwn import *; print(ELF('/bin/ls'))"

从 extra/docker/README.md 可以看到,镜像同样可以从 Docker Hub 显式拉取:

$ docker pull pwntools/pwntools:stable

将标签 stable 替换为 beta 或 dev 即可拉取对应版本(各标签的含义见下文"镜像家族与标签体系"一节)。

推荐运行参数:让调试与网络真正可用

仅仅 docker run -it 启动的容器对二进制调试来说还不够——默认情况下容器内进程受到隔离限制,无法使用 GDB 跟踪调试(ptrace 受限),也无法生成 core dump 文件。为了让镜像发挥最大能力,我们需要启用进程调试(--privileged)、把宿主机的网络端口暴露给容器(--net=host),并放宽资源限制:

$ docker run -it \
    --privileged \
    --net=host \
    --hostname localhost \
    --ulimit core=-1:-1 \
    pwntools/pwntools:stable

各参数的作用如下:

参数作用
--privileged赋予容器特权模式,允许对进程进行 GDB 级别的调试(ptrace 等操作)
--net=host容器直接复用宿主机网络栈,方便从容器外连接容器内监听的端口,也便于容器内连接宿主机上的服务
--hostname localhost将容器主机名设为 localhost,避免某些工具因主机名解析产生干扰
--ulimit core=-1:-1放开 core dump 的大小限制(无限),使程序崩溃时能正常生成 core 文件,配合 Corefile 类做崩溃分析

其中 --privileged 与 --ulimit 的用途在 extra/docker/README.md 中有明确说明:特权模式是使用 GDB 调试所必需的,而放开 ulimit 是为了让程序崩溃时能成功落盘 core 文件;--net=host 则让你能方便地在容器内外互相连接服务。

与宿主机共享目录:bind mount 绑定挂载

实际开发中,你通常希望用宿主机上习惯的编辑器(VSCode、Vim 等)编写代码,同时让改动实时出现在容器内执行。借助 Docker 的 bind mount(--mount type=bind)可以轻松实现这一点。

下面的命令会把宿主机的 ~/exploits 目录挂载进容器,出现在 /home/pwntools/exploits,从而实现在容器外编辑、在容器内运行的开发流:

$ mkdir $HOME/exploits

$ vim $HOME/exploits/my_exploit.py

$ docker run -it \
    --privileged \
    --net=host \
    --hostname localhost \
    --ulimit core=-1:-1 \
    --mount type=bind,source="$HOME/exploits",target=/home/pwntools/exploits \
    pwntools/pwntools:stable

$ python3 exploits/my_exploit.py

注意挂载目标路径 /home/pwntools/exploits 位于镜像默认用户 pwntools 的主目录下。从 extra/docker/base/Dockerfile 的构建过程可以看到,基础镜像会创建名为 pwntools 的非 root 用户并以其身份运行,因此把共享目录挂载到该用户的 home 下可以避免权限问题。

Windows 用户绑定挂载

Windows 上不存在 $HOME 环境变量,对应的变量是 %UserProfile%。假设你在 Windows 上使用 Visual Studio Code 且 code.exe 已在 %PATH% 中,等价命令如下:

C:\Users\user> mkdir Desktop\exploits

C:\Users\user> code Desktop\exploits\my_exploit.py

C:\Users\user> docker run -it \
    --privileged \
    --net=host \
    --hostname localhost \
    --ulimit core=-1:-1 \
    --mount type=bind,source="%UserProfile%\Desktop\exploits",target=/home/pwntools/exploits \
    pwntools/pwntools:stable

$ python3 exploits/my_exploit.py

核心差异只有两点:source 使用 %UserProfile%\Desktop\exploits 而不是 $HOME/exploits;其余调试参数与挂载目标完全一致。

镜像家族与标签体系

仓库 extra/docker 目录下维护了多套 Dockerfile,它们通过 FROM 指令构成一条清晰的继承链:

ubuntu:noble (基础系统)
  └── pwntools/pwntools:base
        ├── pwntools/pwntools:stable   ──> beta ──> dev
        └── pwntools/pwntools:develop(开发专用,基于 base)

各标签对应源码如下:

dev 采用链式升级而非直接从 base 构建,这一点从 extra/docker/dev/Dockerfile 的 FROM pwntools/pwntools:stable 可以印证:dev 镜像基于 stable,再用 pip install git+...@dev 覆盖安装 dev 分支代码,最后执行 PWNLIB_NOTERM=1 pwn update 更新系统工具与数据。

base 镜像的构建内容

从源码看,extra/docker/base/Dockerfile 是理解整个镜像生态的关键,它主要完成以下工作:

  1. 系统层:基于 ubuntu:noble,安装 sudo、build-essential、git、python3/python3-pip、elfutils、libssl-dev、libffi-dev 等构建与运行依赖;
  2. 跨架构工具链:为 CTF 中常见的二进制架构一次性装齐 GNU binutils,包括 arm、aarch64、mips/mipsel、msp430、powerpc/powerpc64、s390x、sparc64、riscv64、loongarch64 等(这也是 Pwntools 汇编/反汇编支持多架构的基础);
  3. 仿真支持:安装 qemu-user-static,配合 binfmt 可在 x86 宿主机上直接运行其他架构的程序,这一点与 pwnlib/qemu.py 中的 QEMU 封装配合使用;
  4. 辅助工具:tmux(配合 gdb 调试会话)、patchelf(修改 ELF 动态链接器);
  5. 用户与权限:删除默认 ubuntu 用户,创建 pwntools 用户,删除其密码(passwd --delete --unlock)并配置免密 sudo(NOPASSWD),镜像默认以该用户身份运行;
  6. Pwntools 本体:通过 pip install --break-system-packages --upgrade pwntools 安装,随后执行 PWNLIB_NOTERM=1 pwn update 拉取最新的用户代理数据与常量定义。

本地构建与运行:一行 Makefile 搞定

除了从 Docker Hub 拉取,你也可以在本地从源码构建镜像。extra/docker/Makefile 提供了便捷入口:

$ make -C extra/docker dev

该命令会在 extra/docker/dev/ 目录下执行 docker build -t pwntools/pwntools:dev。Makefile 中定义了标签集合 tags=base stable beta dev,也支持逐个构建:

$ make -C extra/docker base
$ make -C extra/docker stable

运行任意镜像的推荐命令(以 dev 为例)与 DOCKER.md 中的推荐参数一致:

$ docker run -it \
    --privileged \
    --net=host \
    --ulimit core=-1:-1 \
    pwntools/pwntools:dev

Makefile 中还定义了一个特殊目标 develop,它会以 --mount type=bind 把当前 git 仓库根目录(ROOT,通过 git rev-parse --show-toplevel 获取)挂载到容器内的 /home/pwntools/pwntools,并进入默认的 zsh shell;如果设置了 HISTFILE 环境变量,还会额外挂载 shell 历史文件以支持跨容器共享历史记录:

$ make -C extra/docker develop

develop 镜像:在容器内开发 Pwntools 本身

对于想为 Pwntools 贡献代码的开发者,extra/docker/develop/Dockerfile 提供了一套完整的容器内开发环境,其关键设计如下:

  • 可编辑安装:克隆仓库后以 python3 -m pip install --editable pwntools 方式安装,配合宿主机目录的 bind mount,本地代码改动即时生效,无需重新构建镜像;
  • PATH 调整:由于 Pwntools 不再系统级安装,其 pwn 等命令行入口位于 ~/.local/bin,Dockerfile 通过 ENV PATH="/home/pwntools/.local/bin:${PATH}" 将其加入搜索路径;
  • 调试工具链:安装 gdb、gdbserver、gdb-multiarch、tmux,并克隆安装 pwndbg 中的对应 RUN 步骤);
  • zsh + prezto:默认 shell 切换为 zsh 并安装 prezto 框架,同时把仓库中的 extra/zsh_completion/_pwn 符号链接到 zsh 补全目录,获得 pwn 命令的自动补全;
  • IPython 自动导入:通过 extra/docker/develop/10-import.py(内容为 from pwn import * 及常用标准库导入)和 extra/docker/develop/ipython_config.py 配置 IPython 启动脚本,进入解释器即自动具备 pwn 命名空间;
  • qemu-binfmt 映射:建立 /etc/qemu-binfmt 下 arm/aarch64/mips/mipsel/powerpc/powerpc64/sparc64/riscv64/loongarch64 的符号链接,让容器可以跨架构运行并调试程序。

这套 develop 环境的测试延伸位于 travis/docker 目录:其 Makefile 通过拼接 develop Dockerfile 与 Dockerfile.travis 生成 CI 用镜像,并提供 doctest3 目标在容器内运行 Pwntools 的文档测试(doctest)。这也从侧面印证了 DOCKER.md 推荐参数中 --privileged、--net=host、--ulimit core=-1:-1 等选项在官方 CI/开发流程中的通用性。

小结

使用 Docker 运行 Pwntools 的最大价值在于"环境即镜像":依赖、工具链、调试器一次构建,处处复用。日常使用只需记住三条命令模式:

  1. 快速启动:docker run -it pwntools/pwntools:stable
  2. 完整调试能力:追加 --privileged --net=host --hostname localhost --ulimit core=-1:-1
  3. 共享代码目录:追加 --mount type=bind,source="$HOME/exploits",target=/home/pwntools/exploits(Windows 下把 $HOME 换成 %UserProfile%)

如需进一步研究镜像的构建细节、自行定制或参与开发,可以继续阅读仓库中的 extra/docker/README.md、extra/docker/Makefile 以及 extra/docker/base/Dockerfile 等源码文件。

  • 网络安全
  • 渗透测试
  • 逆向工程

【免费下载链接】pwntools

CTF framework and exploit development library

项目地址: https://gitcode.com/gh_mirrors/pw/pwntools
点击查看 免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值