别再手动改配置了!用Docker Compose一键部署Pikachu靶场,5分钟搞定渗透测试环境

渗透测试环境的搭建一直是安全从业者的必修课,但传统方式往往让人望而生畏。记得我第一次尝试用PHPStudy配置Pikachu靶场时,光是解决PHP版本兼容问题就耗费了大半天,更别提后续的各种依赖配置和环境变量设置。这种体验让我深刻意识到:安全研究者的时间应该花在漏洞挖掘上,而不是无休止的环境调试中。

直到接触了Docker技术,才发现原来环境搭建可以如此优雅。想象一下:只需一个命令就能启动完整的靶场环境,再一个命令就能彻底清理不留痕迹。这种"即用即抛"的工作方式,不仅完美解决了环境污染问题,还能确保每次测试都在完全一致的基础条件下进行——这正是科学实验的可重复性原则在安全领域的完美体现。

1. 为什么Docker是渗透测试的理想选择

在安全研究领域,环境的一致性往往决定着实验结果的可靠性。传统的手动搭建方式存在几个致命缺陷:

  • 版本依赖地狱:不同漏洞对运行环境有特定要求,手动配置极易出现兼容性问题
  • 环境不可复现:微小的配置差异可能导致漏洞表现不同,难以进行对比分析
  • 清理不彻底:测试产生的数据残留可能影响后续实验,甚至造成误判

Docker通过容器化技术完美解决了这些问题。以Pikachu靶场为例,我们可以将其所有组件(Web服务器、数据库、应用程序)打包成一个标准化的交付单元。这个单元具有以下优势:

特性对比表

特性 传统方式 Docker方式
部署时间 30+分钟 <5分钟
环境一致性 难以保证 完全一致
资源占用 需要完整系统 按需分配
清理难度 手动删除 一键清除
可移植性 依赖具体机器 全平台通用

提示:对于CTF选手来说,快速重建环境的能力尤为重要。比赛中经常需要在不同靶机间切换,Docker的轻量级特性让这种切换变得轻而易举。

2. 准备工作:Docker环境配置

在开始部署之前,我们需要确保基础环境就绪。以下是在Ubuntu 20.04 LTS上的配置示例,其他系统只需稍作调整:

# 卸载旧版本(如有)
sudo apt-get remove docker docker-engine docker.io containerd runc

# 安装依赖
sudo apt-get update
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 设置稳定版仓库
echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装Docker引擎
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

# 验证安装
sudo docker run hello-world

安装完成后,建议进行以下优化配置:

  1. 免sudo执行(安全考虑,生产环境慎用):

    sudo usermod -aG docker ${USER}
    su - ${USER}  # 重新登录生效
    
  2. 国内镜像加速(解决拉取镜像慢的问题):

    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://your-mirror.mirror.aliyuncs.com"]
    }
    EOF
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    
  3. Docker Compose安装

    sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    sudo chmod +x /usr/local/bin/docker-compose
    

3. Pikachu靶场的Docker化部署

Pikachu是一个集成了多种Web漏洞的综合性靶场,包含SQL注入、XSS、CSRF等常见漏洞类型。我们通过Docker Compose实现一键部署:

项目结构

pikachu-docker/
├── docker-compose.yml
├── config/
│   └── php.ini    # PHP自定义配置
├── db/            # 数据库数据持久化目录
└── www/           # 网站代码目录

核心配置文件docker-compose.yml内容如下:

version: '3.8'

services:
  web:
    image: php:7.4-apache
    ports:
      - "8080:80"
    volumes:
      - ./www:/var/www/html
      - ./config/php.ini:/usr/local/etc/php/conf.d/custom.ini
    depends_on:
      - db
    networks:
      - pikachu-net

  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: "pikachu@123"
      MYSQL_DATABASE: "pikachu"
      MYSQL_USER: "pikachu"
      MYSQL_PASSWORD: "pikachu@123"
    volumes:
      - ./db:/var/lib/mysql
    networks:
      - pikachu-net

networks:
  pikachu-net:
    driver: bridge

部署步骤详解:

  1. 初始化项目目录

    mkdir -p pikachu-docker/{config,db,www}
    cd pikachu-docker
    
  2. 下载Pikachu源码

    git clone https://github.com/zhuifengshaonianhanlu/pikachu.git www
    
  3. 配置PHP环境(config/php.ini):

    upload_max_filesize = 10M
    post_max_size = 12M
    display_errors = On
    error_reporting = E_ALL
    
  4. 启动服务

    docker-compose up -d
    
  5. 初始化数据库: 访问 http://localhost:8080/install.php 完成安装

注意:首次启动时MySQL容器需要初始化,建议等待30秒后再访问安装页面。如果安装失败,可以尝试重启web服务:docker-compose restart web

4. 高级配置与使用技巧

基础部署只是开始,下面这些技巧能让你的Pikachu靶场更加专业:

4.1 多版本并行运行

有时我们需要同时运行不同版本的靶场进行对比测试。通过指定不同的端口和环境变量即可实现:

# docker-compose.override.yml
version: '3.8'

services:
  web:
    ports:
      - "8081:80"
    environment:
      - SITE_NAME=Pikachu_v2
  db:
    ports:
      - "3307:3306"

启动时使用:

docker-compose -f docker-compose.yml -f docker-compose.override.yml up -d

4.2 数据持久化与快照

虽然Docker容器本身是无状态的,但通过volume我们可以实现:

  • 定期备份数据库

    docker exec -i pikachu-docker_db_1 mysqldump -upikachu -ppikachu@123 pikachu > pikachu_backup_$(date +%Y%m%d).sql
    
  • 快速恢复快照

    cat pikachu_backup_20230601.sql | docker exec -i pikachu-docker_db_1 mysql -upikachu -ppikachu@123 pikachu
    

4.3 集成到CI/CD流程

对于团队使用,可以将靶场部署自动化:

# .gitlab-ci.yml 示例
stages:
  - deploy

deploy_pikachu:
  stage: deploy
  script:
    - apt-get update && apt-get install -y docker.io docker-compose
    - git clone https://github.com/your-repo/pikachu-docker.git
    - cd pikachu-docker
    - docker-compose up -d
  only:
    - master

4.4 安全加固建议

虽然靶场本身用于漏洞演示,但若长期运行仍需注意:

  1. 修改默认凭证

    # docker-compose.yml
    environment:
      MYSQL_ROOT_PASSWORD: "your_strong_password"
    
  2. 限制网络访问

    networks:
      pikachu-net:
        internal: true
    
  3. 定期更新镜像

    docker-compose pull
    docker-compose up -d
    

5. 典型问题排查指南

即使有了Docker,偶尔也会遇到问题。以下是几个常见场景的解决方案:

问题1:访问页面出现502错误

可能原因:Web服务启动速度慢于数据库

解决方案

docker-compose restart web

问题2:MySQL连接失败

检查步骤

  1. 确认数据库服务运行状态:
    docker-compose logs db
    
  2. 测试网络连通性:
    docker-compose exec web ping db
    

问题3:文件权限问题

典型表现:安装页面无法写入配置文件

解决方案

docker-compose exec web chown -R www-data:www-data /var/www/html

问题4:端口冲突

处理方式

  1. 查看占用端口的进程:
    sudo lsof -i :8080
    
  2. 修改compose文件中的端口映射:
    ports:
      - "8081:80"
    

对于更复杂的问题,可以尝试以下诊断命令:

# 查看容器实时日志
docker-compose logs -f

# 进入容器内部排查
docker-compose exec web bash

# 检查服务状态
docker-compose ps
Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐