霍雅
gzctf 出题docker环境
记录一下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
问题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
即可成功拉取
霍雅牛逼