CISP-PTE 靶场环境复现:基于Docker快速搭建5类漏洞实战平台
在网络安全领域,渗透测试能力的提升离不开高质量的实战环境。传统搭建漏洞靶场往往面临环境配置复杂、资源占用高、难以复现等问题。本文将介绍如何利用Docker技术,快速构建一个包含SQL注入、文件上传、文件包含、命令执行、日志分析等5类经典漏洞的CISP-PTE模拟靶场环境。
1. 环境准备与基础架构设计
1.1 系统要求与依赖安装
在开始之前,请确保您的系统满足以下最低要求:
- 操作系统:Ubuntu 20.04+/CentOS 7+(推荐使用Linux环境)
- Docker版本:20.10.0+
- Docker Compose版本:1.29.0+
- 硬件配置:4GB内存,20GB磁盘空间
安装必要的依赖组件:
# 更新系统包 sudo apt-get update && sudo apt-get upgrade -y # 安装Docker curl -fsSL https://get.docker.com | sh sudo systemctl enable --now docker # 安装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-compose1.2 靶场架构设计
我们的靶场采用模块化设计,每个漏洞场景独立运行在隔离的容器中:
靶场架构图(文字描述): 1. 前端负载均衡:Nginx反向代理 2. SQL注入靶机:MySQL+PHP应用 3. 文件上传靶机:PHP+自定义过滤机制 4. 文件包含靶机:PHP多版本环境 5. 命令执行靶机:Python Flask应用 6. 日志分析靶机:Apache+自定义日志生成器2. Docker Compose配置详解
2.1 基础服务配置
创建docker-compose.yml文件,定义共享网络和数据库服务:
version: '3.8' services: # 共享MySQL服务 db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: insecure_password MYSQL_DATABASE: vulndb volumes: - ./mysql-init:/docker-entrypoint-initdb.d networks: - vuln-net # 管理界面 adminer: image: adminer ports: - "8080:8080" networks: - vuln-net networks: vuln-net: driver: bridge2.2 SQL注入靶机配置
添加SQL注入靶机服务配置:
sqli-target: build: ./sqli ports: - "8001:80" environment: DB_HOST: db DB_USER: root DB_PASS: insecure_password depends_on: - db networks: - vuln-net对应的sqli/Dockerfile内容:
FROM php:7.4-apache COPY src/ /var/www/html/ RUN docker-php-ext-install mysqli && a2enmod rewrite3. 漏洞场景实现细节
3.1 SQL注入场景构建
在sqli/src目录下创建漏洞页面login.php:
<?php $conn = new mysqli($_ENV['DB_HOST'], $_ENV['DB_USER'], $_ENV['DB_PASS'], 'vulndb'); if(isset($_POST['username'])){ $query = "SELECT * FROM users WHERE username='".$_POST['username']."' AND password='".$_POST['password']."'"; $result = $conn->query($query); if($result->num_rows > 0){ echo "Login successful! Flag: FLAG_SQLI_1"; } else { echo "Invalid credentials"; } } ?>初始化SQL脚本mysql-init/01-init.sql:
CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50), password VARCHAR(50), is_admin BOOLEAN ); INSERT INTO users VALUES (1, 'admin', '7b24afc8bc80e548d66c4e7ff72171c5', 1), (2, 'guest', '084e0343a0486ff05530df6c705c8bb4', 0);3.2 文件上传漏洞实现
创建文件上传靶机服务:
upload-target: build: ./upload ports: - "8002:80" networks: - vuln-net对应的upload/Dockerfile:
FROM php:7.4-apache COPY src/ /var/www/html/ RUN chown -R www-data:www-data /var/www/html/uploads文件上传处理逻辑upload.php:
<?php $upload_dir = "uploads/"; if(isset($_FILES['file'])){ $file_name = basename($_FILES['file']['name']); $target = $upload_dir.$file_name; // 脆弱的过滤逻辑 $blacklist = array(".php", ".phtml", ".php3", ".php4"); foreach($blacklist as $ext){ if(strpos(strtolower($file_name), $ext) !== false){ die("危险文件类型!"); } } if(move_uploaded_file($_FILES['file']['tmp_name'], $target)){ echo "文件上传成功! 路径: ".$target; } else { echo "文件上传失败"; } } ?>4. 高级漏洞场景配置
4.1 命令执行漏洞
创建命令执行靶机服务:
rce-target: build: ./rce ports: - "8003:5000" networks: - vuln-net对应的Flask应用app.py:
from flask import Flask, request import subprocess app = Flask(__name__) @app.route('/ping') def ping(): host = request.args.get('host', '127.0.0.1') cmd = f"ping -c 1 {host}" try: output = subprocess.check_output(cmd, shell=True) return output.decode() except: return "Ping failed"4.2 日志分析挑战
配置Apache日志分析靶机:
log-analysis: image: httpd:2.4 ports: - "8004:80" volumes: - ./logs:/usr/local/apache2/logs - ./log-gen:/log-gen command: > sh -c "( /log-gen/gen-logs.sh & httpd-foreground )" networks: - vuln-net日志生成脚本log-gen/gen-logs.sh:
#!/bin/bash while true; do # 生成正常访问日志 curl -s http://localhost/ > /dev/null curl -s http://localhost/admin.php > /dev/null # 随机生成攻击尝试 if [ $((RANDOM%10)) -eq 0 ]; then curl -s "http://localhost/?cmd=ls" > /dev/null curl -s "http://localhost/admin.php?user=admin' OR 1=1--" > /dev/null fi sleep 5 done5. 环境部署与使用指南
5.1 一键启动与停止
启动所有服务:
docker-compose up -d --build停止并清理环境:
docker-compose down --volumes5.2 访问各靶场
服务启动后,可以通过以下URL访问不同漏洞场景:
| 漏洞类型 | 访问地址 | 默认端口 |
|---|---|---|
| SQL注入 | http://localhost:8001 | 8001 |
| 文件上传 | http://localhost:8002 | 8002 |
| 命令执行 | http://localhost:8003 | 8003 |
| 日志分析 | http://localhost:8004 | 8004 |
| 数据库管理 | http://localhost:8080 | 8080 |
5.3 教学使用建议
分阶段教学:
- 初级阶段:关闭容器间的网络隔离,便于理解漏洞原理
- 高级阶段:启用严格网络策略,模拟真实隔离环境
自定义难度调整:
- 修改Dockerfile中的安全配置
- 调整应用代码中的过滤规则
flag设置技巧:
# 在容器中设置flag echo "FLAG_$(date +%s)" > /var/www/html/flag.txt chmod 600 /var/www/html/flag.txt
6. 安全加固与扩展
6.1 靶场安全注意事项
虽然这是用于教学的漏洞环境,但仍需注意:
网络隔离:
networks: vuln-net: internal: true资源限制:
deploy: resources: limits: cpus: '0.5' memory: 512M
6.2 扩展更多漏洞场景
可以通过添加服务来扩展更多漏洞类型:
xss-target: build: ./xss ports: - "8005:80" networks: - vuln-net对应的XSS漏洞页面示例:
<!-- xss/index.html --> <script> // 脆弱的DOM XSS示例 const params = new URLSearchParams(window.location.search); document.write("Hello, "+params.get('name')); </script>7. 故障排查与维护
7.1 常见问题解决
问题1:容器启动失败
解决方案:
# 查看日志 docker-compose logs <service_name> # 重新构建单个服务 docker-compose up -d --no-deps --build <service_name>问题2:端口冲突
解决方案:
# 查看占用端口的进程 sudo lsof -i :8001 # 修改docker-compose.yml中的端口映射 ports: - "新的端口:容器端口"7.2 定期维护建议
更新基础镜像:
docker-compose pull备份重要数据:
docker run --rm --volumes-from <container_name> -v $(pwd):/backup busybox tar cvf /backup/backup.tar /path/in/container监控资源使用:
docker stats