TypechoJoeTheme

霍雅的博客

登录
用户名
密码
/
注册
用户名
邮箱

霍雅

追求源于热爱,极致源于梦想!
网站页面

gzctf 出题docker环境

2025-11-12
/
1 评论
/
190 阅读
/
正在检测是否收录...
11/12

记录一下gzctf docker的搭建过程
gzctf docker模板:https://github.com/dr0n1/CTF_Docker_Template

pwn

目录如下所示,把需要的题目换成bin/test

然后推荐是先把镜像给拉下来
docker pull ubuntu:22.04
拉去完成之后
docker save -o ubuntu_18.04.tar ubuntu:22.04
然后加载
docker load -i ubuntu_18.04.tar
这样就不用重复拉docker了

Dockerfile所在的目录运行docker build -t <镜像名> .
这里我镜像名是pwntest2

然后本地测试docker run -itd -p <对外暴露端口>:9999 <镜像名> /start.sh

连上去正常

稍微有点不一样,不影响打

能打通拉flag了

在gzctf上题就行了


问题1

centos无法映射出nc端口

问题2

阿里云服务器拿了shell读不了flag
但是本地127.0.0.1可以拿

能拿shell执行命令

也能读本身的二进制文件

无法读其他文件和flag
权限都是一样的

web

web做一个简单实例

也是同样的先把镜像拉下来保存
dockerfile

FROM ctftraining/base_image_nginx_mysql_php_56 

COPY src /var/www/html    
RUN mv /var/www/html/flag.sh / \    
    && chmod +x /flag.sh    

flag.sh

#!/bin/sh    
sed -i "s/flag{testflag}/$GZCTF_FLAG/" /var/www/html/index.php 
export GZCTF_FLAG=""    

index.php

<!DOCTYPE html>
<html>
<head>
  <title>签到</title>
</head>
<body>
<?php
echo "flag{testflag}";
?>
</body>
</html>

原理就是预留一个flag,然后通过binsh脚本替换成动态flag
动态flag在环境变量里
然后docker build -t <镜像名> .

在gz里面启动

问题1

flag.sh必须给可执行权限
其他也最好给权限,不知道有什么问题,不给权限就是有问题

flag管理

gzctf搭建

docker-compose.yml

services:
  gzctf:
    image: gztime/gzctf:latest
    restart: always
    environment:
      # 管理员密码:必须满足最低复杂度(示例)
      GZCTF_ADMIN_PASSWORD: HuoyaHuo123
      # 与 db.POSTGRES_PASSWORD 保持一致
      POSTGRES_PASSWORD: GZCTFpgPass2025
      LANG: zh_CN.UTF-8
    ports:
      - "80:8080"
    volumes:
      - "./data/files:/app/files"
      - "./appsettings.json:/app/appsettings.json:ro"
      # 下面挂载宿主机 Docker Socket,允许 GZCTF 管理 Docker 容器
      - "/var/run/docker.sock:/var/run/docker.sock"
    depends_on:
      - db
      - cache
    entrypoint: >
      /bin/sh -c "
      echo '等待数据库启动...';
      until nc -z db 5432; do sleep 1; done;
      echo '数据库已启动,启动 GZCTF';
      exec dotnet GZCTF.dll
      "

  cache:
    image: redis:alpine
    restart: always

  db:
    image: postgres:alpine
    restart: always
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: GZCTFpgPass2025
      POSTGRES_DB: gzctf
    volumes:
      - "./data/db:/var/lib/postgresql/data"
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres -d gzctf"]
      interval: 5s
      timeout: 5s
      retries: 12
      start_period: 5s

appsettings.json

{
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "Database": "Host=db:5432;Database=gzctf;Username=postgres;Password=GZCTFpgPass2025"
  },
  "EmailConfig": {
    "SendMailAddress": "a@a.com",
    "UserName": "",
    "Password": "",
    "Smtp": {
      "Host": "localhost",
      "Port": 587
    }
  },
  "XorKey": "huoya",    
  "ContainerProvider": {
    "Type": "Docker",
    "PortMappingType": "Default",
    "EnableTrafficCapture": false,
    "PublicEntry": "0.0.0.0", 
    "DockerConfig": {
      "SwarmMode": false,
      "Uri": "unix:///var/run/docker.sock"
    }
  },
  "RequestLogging": false,
  "DisableRateLimit": true,
  "RegistryConfig": {
    "UserName": "",
    "Password": "",
    "ServerAddress": ""
  },
  "CaptchaConfig": {
    "Provider": "None",
    "SiteKey": "huoya",
    "SecretKey": "huoya",
    "GoogleRecaptcha": {
      "VerifyAPIAddress": "https://www.recaptcha.net/recaptcha/api/siteverify",
      "RecaptchaThreshold": "0.5"
    }
  },
  "ForwardedOptions": {
    "ForwardedHeaders": 5,
    "ForwardLimit": 1,
    "TrustedNetworks": ["0.0.0.0/0"]
  }
}

放在同一路径下
先删除所有旧容器
docker compose down -v
启动
docker compose up -d
查看日志是否正常
docker compose logs -f gzctf
然后访问80端口

问题1

docker无法访问官方源
登录华为云,容器镜像服务 SWR->镜像中心->镜像加速器
vim /etc/docker/daemon.json

配好后重启docker
systemctl daemon-reload
systemctl restart docker.service

即可成功拉取

朗读
赞(0)
版权属于:

霍雅的博客

本文链接:

https://6666345.xyz/bk/index.php/archives/552/(转载时请注明本文出处及文章链接)

评论 (1)
  1. ha 作者
    Windows 10 · Google Chrome

    霍雅牛逼

    2025-11-18 回复

人生倒计时

今日已经过去小时
这周已经过去
本月已经过去
今年已经过去个月